Bringing in Helium, imaker and cmaker
authorAlex Gilkes <alex.gilkes@nokia.com>
Wed, 28 Oct 2009 14:39:48 +0000
changeset 1 be27ed110b50
parent 0 044383f39525
child 2 86356a777616
child 3 e1eecf4d390d
child 179 d8ac696cc51f
Bringing in Helium, imaker and cmaker
buildframework/helium/build-jar.ant.xml
buildframework/helium/build.xml
buildframework/helium/config/antlint_config.xml
buildframework/helium/config/capabilities_config.xml
buildframework/helium/config/diamonds_config.xml.ftl
buildframework/helium/config/epydoc.conf
buildframework/helium/config/helium_data_model.xml
buildframework/helium/config/helium_data_model.xsl
buildframework/helium/config/helium_distribution_test.cfg.xml
buildframework/helium/config/helium_eclipse_java_profile.xml
buildframework/helium/config/ivy/install/build-cruisecontrol-bin.ant.xml
buildframework/helium/config/ivy/install/build-hccc.ant.xml
buildframework/helium/config/ivy/install/build-jep.ant.xml
buildframework/helium/config/ivy/install/build-logilab-common.ant.xml
buildframework/helium/config/ivy/install/build-xincluder.ant.xml
buildframework/helium/config/ivy/ivy.xml
buildframework/helium/config/ivy/modules/7zip-4.ivy.xml
buildframework/helium/config/ivy/modules/ant-1.7.ivy.xml
buildframework/helium/config/ivy/modules/ccm-6.5.ivy.xml
buildframework/helium/config/ivy/modules/codescanner-2.0.ivy.xml
buildframework/helium/config/ivy/modules/codescanner-2.1.ivy.xml
buildframework/helium/config/ivy/modules/cruisecontrol-2.7.1.ivy.xml
buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2-hc1.ivy.xml
buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2.ivy.xml
buildframework/helium/config/ivy/modules/cruisecontrol-2.7.3.rc1.ivy.xml
buildframework/helium/config/ivy/modules/cruisecontrol-2.8.1.ivy.xml
buildframework/helium/config/ivy/modules/cruisecontrol-2.8.2.ivy.xml
buildframework/helium/config/ivy/modules/eggs-1.0.ivy.xml
buildframework/helium/config/ivy/modules/eggs_subcon-1.0.ivy.xml
buildframework/helium/config/ivy/modules/hccc-1-2.7.2.ivy.xml
buildframework/helium/config/ivy/modules/jars-1.0.ivy.xml
buildframework/helium/config/ivy/modules/jars_subcon-1.0.ivy.xml
buildframework/helium/config/ivy/modules/java-1.6.ivy.xml
buildframework/helium/config/ivy/modules/java13-1.3.1.ivy.xml
buildframework/helium/config/ivy/modules/jep-2.3-java6.ivy.xml
buildframework/helium/config/ivy/modules/perl-5.6.1.ivy.xml
buildframework/helium/config/ivy/modules/python-2.5.ivy.xml
buildframework/helium/config/ivy/modules/sbs-2.4.ivy.xml
buildframework/helium/config/ivy/modules/symsee-7.2.ivy.xml
buildframework/helium/config/ivy/modules/unzip-5.40.ivy.xml
buildframework/helium/config/ivy/modules/xincluder-1.0d11.ivy.xml
buildframework/helium/config/ivy/tools_ivy_settings.xml
buildframework/helium/config/java_checkstyle_config.xml
buildframework/helium/config/logging.conf.ftl
buildframework/helium/config/metadata_filter_config_default.ant.xml
buildframework/helium/config/metadata_regex.csv
buildframework/helium/config/pylintrc.txt
buildframework/helium/config/signaling_config_default.ant.xml
buildframework/helium/config/version.txt
buildframework/helium/doc/images/bom.png
buildframework/helium/doc/images/dp.png
buildframework/helium/doc/index.html
buildframework/helium/doc/src/.templates/sidebar.html
buildframework/helium/doc/src/antdoclet/html/index.html
buildframework/helium/doc/src/antdoclet/html/libindex.vm
buildframework/helium/doc/src/antdoclet/html/main.vm
buildframework/helium/doc/src/antdoclet/html/overview.vm
buildframework/helium/doc/src/antdoclet/html/style.css
buildframework/helium/doc/src/antdoclet/html/task.vm
buildframework/helium/doc/src/antdoclet/html/taskindex.vm
buildframework/helium/doc/src/api/allmacros-frame.html.ftl
buildframework/helium/doc/src/api/allproperties-frame.html.ftl
buildframework/helium/doc/src/api/alltargets-frame.html.ftl
buildframework/helium/doc/src/api/api.ftllib
buildframework/helium/doc/src/api/apisearchindex.rst
buildframework/helium/doc/src/api/deprecated-list.html.ftl
buildframework/helium/doc/src/api/help.html.ftl
buildframework/helium/doc/src/api/index-1.html.ftl
buildframework/helium/doc/src/api/index.html.ftl
buildframework/helium/doc/src/api/macro.html.ftl
buildframework/helium/doc/src/api/overview-frame.html.ftl
buildframework/helium/doc/src/api/overview-summary.html.ftl
buildframework/helium/doc/src/api/project-frame.html.ftl
buildframework/helium/doc/src/api/project.html.ftl
buildframework/helium/doc/src/api/properties-table.html.ftl
buildframework/helium/doc/src/api/properties-table.js
buildframework/helium/doc/src/api/property.html.ftl
buildframework/helium/doc/src/api/propertygroup.html.ftl
buildframework/helium/doc/src/api/propertygroups-frame.html.ftl
buildframework/helium/doc/src/api/stylesheet.css
buildframework/helium/doc/src/api/target-dependencies.dot.ftl
buildframework/helium/doc/src/api/target-example.dot.ftl
buildframework/helium/doc/src/api/target.html.ftl
buildframework/helium/doc/src/api_changes.rst.ftl
buildframework/helium/doc/src/architecture.rst
buildframework/helium/doc/src/coding_conventions.rst
buildframework/helium/doc/src/conf.py
buildframework/helium/doc/src/default.css
buildframework/helium/doc/src/developer_guide.rst
buildframework/helium/doc/src/feature_list.rst
buildframework/helium/doc/src/helium_overview.html.ftl
buildframework/helium/doc/src/helium_overview.xml
buildframework/helium/doc/src/helium_pallot_small.jpg
buildframework/helium/doc/src/index.html
buildframework/helium/doc/src/index.rst.ftl
buildframework/helium/doc/src/introduction.rst
buildframework/helium/doc/src/junit_testing.rst
buildframework/helium/doc/src/manual/APIs.rst.ftl
buildframework/helium/doc/src/manual/ats.dot
buildframework/helium/doc/src/manual/configuring.rst
buildframework/helium/doc/src/manual/configuringdiamonds.rst
buildframework/helium/doc/src/manual/cruisecontrol.rst
buildframework/helium/doc/src/manual/debugging.rst
buildframework/helium/doc/src/manual/product_example.rst
buildframework/helium/doc/src/manual/running.rst
buildframework/helium/doc/src/manual/sbs.rst
buildframework/helium/doc/src/manual/signaling.rst
buildframework/helium/doc/src/manual/stages.rst.ftl
buildframework/helium/doc/src/manual/tool-dependencies.rst.ftl
buildframework/helium/doc/src/mc_tools_design.vsd
buildframework/helium/doc/src/metrics.rst
buildframework/helium/doc/src/minibuilds.rst.ftl
buildframework/helium/doc/src/quick_start_guide.rst.ftl
buildframework/helium/doc/src/sf.rst
buildframework/helium/doc/src/toc.html
buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst
buildframework/helium/doc/src/tutorials/configuration/SimplestConfiguration.rst
buildframework/helium/doc/src/tutorials/configuration/UseHlmTasksInConfiguration.rst
buildframework/helium/doc/src/tutorials/configuration/simple_config.zip
buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.rst
buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.zip
buildframework/helium/doc/src/tutorials/qt_build.rst
buildframework/helium/doc/src/tutorials/rom_image.rst
buildframework/helium/doc/src/tutorials/variant.rst
buildframework/helium/doc/src/user-graph.dot.ftl
buildframework/helium/doc/src/user-graph.rst
buildframework/helium/external/antlibs/ant-antunit-1.1.jar
buildframework/helium/external/antlibs/ant-contrib-1.0b2.jar
buildframework/helium/external/antlibs/antform.jar
buildframework/helium/external/antlibs/asm-2.2.1.jar
buildframework/helium/external/antlibs/bliki-3.0.7.jar
buildframework/helium/external/antlibs/bsf-2.4.0.jar
buildframework/helium/external/antlibs/bsh-2.1b0-1.0.jar
buildframework/helium/external/antlibs/com/kirkk/analyzer/framework/Filter.properties
buildframework/helium/external/antlibs/commons-codec-1.3.jar
buildframework/helium/external/antlibs/commons-collections-3.2.jar
buildframework/helium/external/antlibs/commons-configuration-1.5.jar
buildframework/helium/external/antlibs/commons-discovery-0.2.jar
buildframework/helium/external/antlibs/commons-httpclient-3.1.jar
buildframework/helium/external/antlibs/commons-io-1.4.jar
buildframework/helium/external/antlibs/commons-jxpath-1.2.jar
buildframework/helium/external/antlibs/commons-lang-2.4.jar
buildframework/helium/external/antlibs/commons-logging-1.1.1.jar
buildframework/helium/external/antlibs/dom4j-1.6.1.jar
buildframework/helium/external/antlibs/emma.jar
buildframework/helium/external/antlibs/emma_ant.jar
buildframework/helium/external/antlibs/fmpp-0.9.13.jar
buildframework/helium/external/antlibs/freemarker-2.3.13.jar
buildframework/helium/external/antlibs/ivy-helium-2.0.0-beta2.jar
buildframework/helium/external/antlibs/jakarta-oro-2.0.8.jar
buildframework/helium/external/antlibs/jaranalyzer-1.2.jar
buildframework/helium/external/antlibs/jaxen-1.1.1.jar
buildframework/helium/external/antlibs/jsch-0.1.39.jar
buildframework/helium/external/antlibs/junit-4.5.jar
buildframework/helium/external/antlibs/jython-2.5.jar
buildframework/helium/external/antlibs/log4j-1.2.9.jar
buildframework/helium/external/antlibs/mail-1.4.1.jar
buildframework/helium/external/antlibs/maven-scm-api-1.1.jar
buildframework/helium/external/antlibs/maven-scm-provider-hg-1.1.jar
buildframework/helium/external/antlibs/plexus-utils-1.5.6.jar
buildframework/helium/external/antlibs/readme.txt
buildframework/helium/external/antlibs/serializer.jar
buildframework/helium/external/antlibs/sqlitejdbc-v053.jar
buildframework/helium/external/antlibs/velocity-dep-1.3.1.jar
buildframework/helium/external/antlibs/wsdl4j-1.5.1.jar
buildframework/helium/external/antlibs/xalan.jar
buildframework/helium/external/antlibs/xia-1.0.jar
buildframework/helium/external/antlibs/xincluder.jar
buildframework/helium/external/antlibs/xmltask-v1.15.1.jar
buildframework/helium/external/antlibs/xmlunit-1.2.jar
buildframework/helium/external/cc-customizations/antlibs/bsf-2.4.0.jar
buildframework/helium/external/cc-customizations/antlibs/bsh-2.1b0-1.0.jar
buildframework/helium/external/cc-customizations/antlibs/commons-logging-1.1.1.jar
buildframework/helium/external/cc-customizations/antlibs/junit-4.5.jar
buildframework/helium/external/cc-customizations/bin/HELIUM-README.txt
buildframework/helium/external/cc-customizations/bin/cruisecontrol.bat
buildframework/helium/external/cc-customizations/bin/etc/jetty.xml
buildframework/helium/external/cc-customizations/bin/helium-dashboard-config.xml
buildframework/helium/external/cc-customizations/bin/lib/nokia_helium_cc.jar
buildframework/helium/external/cc-customizations/build.bat
buildframework/helium/external/cc-customizations/build.xml
buildframework/helium/external/cc-customizations/overlay/cruisecontrol.bat
buildframework/helium/external/cc-customizations/overlay/etc/jetty.xml
buildframework/helium/external/cc-customizations/overlay/helium-dashboard-config.xml
buildframework/helium/external/cc-customizations/readme.txt
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/ant/HeliumCCLogger.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/dashboard/widgets/HeliumSummary.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergy.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergyModification.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/ModificationCache.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/OperationFailedException.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/SynergyBaselineProjects.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMapper.java
buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMatcher.java
buildframework/helium/external/cc-customizations/src/com/nokia/jetty/deployer/WebAppDeployer.java
buildframework/helium/external/cc-customizations/templates/HELIUM-README.txt
buildframework/helium/external/cc-customizations/templates/ivy.xml
buildframework/helium/external/cc-customizations/tests/src/com/nokia/cruisecontrol/sourcecontrol/tests/TestModificationCache.java
buildframework/helium/external/filedisk/COPYING.TXT
buildframework/helium/external/filedisk/example.txt
buildframework/helium/external/filedisk/exe/MAKEFILE
buildframework/helium/external/filedisk/exe/filedisk.c
buildframework/helium/external/filedisk/exe/filedisk.rc
buildframework/helium/external/filedisk/exe/sources
buildframework/helium/external/filedisk/filedisk.exe
buildframework/helium/external/filedisk/filedisk.reg
buildframework/helium/external/filedisk/filedisk.sys
buildframework/helium/external/filedisk/install.txt
buildframework/helium/external/filedisk/readme.txt
buildframework/helium/external/filedisk/sys/inc/filedisk.h
buildframework/helium/external/filedisk/sys/obj/i386/checked/filedisk.sys
buildframework/helium/external/filedisk/sys/obj/i386/free/filedisk.sys
buildframework/helium/external/filedisk/sys/src/MAKEFILE
buildframework/helium/external/filedisk/sys/src/Sources
buildframework/helium/external/filedisk/sys/src/filedisk.c
buildframework/helium/external/filedisk/sys/src/filedisk.rc
buildframework/helium/external/helium-antlib/antlibs/ant-antunit-1.1.jar
buildframework/helium/external/helium-antlib/antlibs/ant-contrib-1.0b2.jar
buildframework/helium/external/helium-antlib/antlibs/emma.jar
buildframework/helium/external/helium-antlib/antlibs/emma_ant.jar
buildframework/helium/external/helium-antlib/antlibs/fmpp-0.9.13.jar
buildframework/helium/external/helium-antlib/antlibs/junit-4.5.jar
buildframework/helium/external/helium-antlib/antlibs/velocity-dep-1.3.1.jar
buildframework/helium/external/helium-antlib/antlibs/xmlunit-1.2.jar
buildframework/helium/external/helium-antlib/bin/helium-core.jar
buildframework/helium/external/helium-antlib/bin/helium-diamonds.jar
buildframework/helium/external/helium-antlib/bin/helium-metadata.jar
buildframework/helium/external/helium-antlib/bin/helium-quality.jar
buildframework/helium/external/helium-antlib/bin/helium-scm.jar
buildframework/helium/external/helium-antlib/bin/helium-signaling.jar
buildframework/helium/external/helium-antlib/bld.bat
buildframework/helium/external/helium-antlib/bld.sh
buildframework/helium/external/helium-antlib/build.xml
buildframework/helium/external/helium-antlib/core/bld.bat
buildframework/helium/external/helium-antlib/core/build.xml
buildframework/helium/external/helium-antlib/core/lib/jakarta-oro-2.0.8.jar
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/AbstractTemplateInputSource.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/HlmAntLibException.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/LogSource.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPHash.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPInputSource.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PropertiesSource.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateInputSource.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessorException.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/XMLTemplateSource.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmDefinition.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmExceptionHandler.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/AntCall.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/SerializePathTask.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/XMLLogCount.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ConditionType.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/FallbackReference.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmDefList.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPreDefImpl.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ReferenceType.java
buildframework/helium/external/helium-antlib/core/src/log4j.xml
buildframework/helium/external/helium-antlib/core/tests/bld.sh
buildframework/helium/external/helium-antlib/core/tests/build.bat
buildframework/helium/external/helium-antlib/core/tests/build.xml
buildframework/helium/external/helium-antlib/core/tests/core/executor/build.xml
buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml
buildframework/helium/external/helium-antlib/core/tests/core/serializepath/data/folder1/test.txt
buildframework/helium/external/helium-antlib/core/tests/core/serializepath/data/folder2/test.txt
buildframework/helium/external/helium-antlib/core/tests/core/serializepath/test_serializepath.ant.xml
buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/data/helium_minibuild_ido_compile.log.xml
buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_countseverity.ant.xml
buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_hasseverity.ant.xml
buildframework/helium/external/helium-antlib/core/tests/lib/ant-antunit-1.0.jar
buildframework/helium/external/helium-antlib/diamonds/bld.bat
buildframework/helium/external/helium-antlib/diamonds/build.xml
buildframework/helium/external/helium-antlib/diamonds/lib/commons-codec-1.3.jar
buildframework/helium/external/helium-antlib/diamonds/lib/commons-configuration-1.5.jar
buildframework/helium/external/helium-antlib/diamonds/lib/commons-httpclient-3.1.jar
buildframework/helium/external/helium-antlib/diamonds/lib/commons-lang-2.4.jar
buildframework/helium/external/helium-antlib/diamonds/lib/commons-logging-1.1.1.jar
buildframework/helium/external/helium-antlib/diamonds/lib/dom4j-1.6.1.jar
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsException.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListener.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsProperties.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Stage.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Target.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/helium.antlib.xml
buildframework/helium/external/helium-antlib/diamonds/tests/bld.sh
buildframework/helium/external/helium-antlib/diamonds/tests/build.bat
buildframework/helium/external/helium-antlib/diamonds/tests/build.xml
buildframework/helium/external/helium-antlib/diamonds/tests/config/diamonds_config.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/data/compile.log.xml
buildframework/helium/external/helium-antlib/diamonds/tests/data/create-bom-log.xml
buildframework/helium/external/helium-antlib/diamonds/tests/data/problemIndex.xml
buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java
buildframework/helium/external/helium-antlib/diamonds/tests/templates/apimetrics.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/build.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/codescanner.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_finish.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_signal.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_stage.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_start.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_status.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/faults.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/footer.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/header.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/locations.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/macro.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/tool.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/templates/validate-policy-log.xml.ftl
buildframework/helium/external/helium-antlib/diamonds/tests/test_diamonds.ant.xml
buildframework/helium/external/helium-antlib/doc/antdoclet/html/index.html
buildframework/helium/external/helium-antlib/doc/antdoclet/html/libindex.vm
buildframework/helium/external/helium-antlib/doc/antdoclet/html/main.vm
buildframework/helium/external/helium-antlib/doc/antdoclet/html/overview.vm
buildframework/helium/external/helium-antlib/doc/antdoclet/html/style.css
buildframework/helium/external/helium-antlib/doc/antdoclet/html/task.vm
buildframework/helium/external/helium-antlib/doc/antdoclet/html/taskindex.vm
buildframework/helium/external/helium-antlib/doc/src/build.rst
buildframework/helium/external/helium-antlib/doc/src/conf.py
buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_large.jpg
buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_small.jpg
buildframework/helium/external/helium-antlib/doc/src/index.rst
buildframework/helium/external/helium-antlib/doc/src/structure.rst
buildframework/helium/external/helium-antlib/doc/tools/Jinja-1.2-py2.5-win32.egg
buildframework/helium/external/helium-antlib/doc/tools/Pygments-0.10-py2.5.egg
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/application.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/config.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/search.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py
buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/core.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/examples.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/frontend.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/io.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/af.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/ca.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/cs.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/de.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/en.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/eo.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/es.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/fi.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/fr.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/he.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/it.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/ja.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/nl.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/ru.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/sk.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/sv.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/nodes.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/null.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/doctree.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/pep.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/standalone.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/statemachine.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/components.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/misc.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/parts.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/peps.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/references.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/universal.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/urischemes.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/utils.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/null.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css
buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/roman.py
buildframework/helium/external/helium-antlib/doc/tools/easy-install.pth
buildframework/helium/external/helium-antlib/doc/tools/setuptools-0.6c5-py2.5.egg
buildframework/helium/external/helium-antlib/doc/tools/setuptools.pth
buildframework/helium/external/helium-antlib/doc/tools/site.py
buildframework/helium/external/helium-antlib/doc/tools/sphinx-build.py
buildframework/helium/external/helium-antlib/lib/commons-io-1.4.jar
buildframework/helium/external/helium-antlib/lib/freemarker-2.3.13.jar
buildframework/helium/external/helium-antlib/lib/jaxen-1.1.1.jar
buildframework/helium/external/helium-antlib/lib/log4j-1.2.9.jar
buildframework/helium/external/helium-antlib/lib/mail-1.4.1.jar
buildframework/helium/external/helium-antlib/macros.ant.xml
buildframework/helium/external/helium-antlib/metadata/bld.bat
buildframework/helium/external/helium-antlib/metadata/build.xml
buildframework/helium/external/helium-antlib/metadata/lib/ant-contrib-1.0b2.jar
buildframework/helium/external/helium-antlib/metadata/lib/bsf-2.4.0.jar
buildframework/helium/external/helium-antlib/metadata/lib/bsh-2.1b0-1.0.jar
buildframework/helium/external/helium-antlib/metadata/lib/dom4j-1.6.1.jar
buildframework/helium/external/helium-antlib/metadata/lib/jakarta-oro-2.0.8.jar
buildframework/helium/external/helium-antlib/metadata/lib/sqlitejdbc-v053.jar
buildframework/helium/external/helium-antlib/metadata/src/build.xml
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/MetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/SQLFMPPLoader.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/antlib.xml
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/conditions/MetaDataLogCondition.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataLogCount.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataRecord.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AbldLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AntLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/LogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilter.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetadataSource.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/SBSLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/TextLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/XMLLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/db/MetadataDb.java
buildframework/helium/external/helium-antlib/metadata/src/log4j.xml
buildframework/helium/external/helium-antlib/metadata/src/templates/build_status.xml.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/cc_summary.html.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/cc_summary_metadata.html.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/diamonds_faults.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/diamonds_macro.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/email_new.html.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/macro/expand3.js
buildframework/helium/external/helium-antlib/metadata/src/templates/macro/log3.css
buildframework/helium/external/helium-antlib/metadata/src/templates/macro/logger.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/readdata.xml.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/summary.html.ftl
buildframework/helium/external/helium-antlib/metadata/tests/bld.sh
buildframework/helium/external/helium-antlib/metadata/tests/build.bat
buildframework/helium/external/helium-antlib/metadata/tests/build.xml
buildframework/helium/external/helium-antlib/metadata/tests/data/IDO_lcdo_tb92-ci_MCL.92.64_ant_build.log
buildframework/helium/external/helium-antlib/metadata/tests/data/all_regex_type.log
buildframework/helium/external/helium-antlib/metadata/tests/data/common.csv
buildframework/helium/external/helium-antlib/metadata/tests/data/dp.log
buildframework/helium/external/helium-antlib/metadata/tests/data/ido_abs_mcl_devlon70_robot_MCL.70.500_fixslashes_raptor.log
buildframework/helium/external/helium-antlib/metadata/tests/data/ido_abs_mcl_devlon70_robot_MCL.70.500_info.log
buildframework/helium/external/helium-antlib/metadata/tests/data/ido_abs_tb92-nightly_5.2.58_validate_policy.log
buildframework/helium/external/helium-antlib/metadata/tests/data/receipe_lengthy_warn.log
buildframework/helium/external/helium-antlib/metadata/tests/data/sample_abld.log
buildframework/helium/external/helium-antlib/metadata/tests/functionality/func_add_test.ant.xml
buildframework/helium/external/helium-antlib/metadata/tests/functionality/test_regex.ant.xml
buildframework/helium/external/helium-antlib/metadata/tests/output.txt
buildframework/helium/external/helium-antlib/metadata/tests/output/all_ido_logs.db
buildframework/helium/external/helium-antlib/metadata/tests/output1.txt
buildframework/helium/external/helium-antlib/metadata/tests/test_metadata.ant.xml
buildframework/helium/external/helium-antlib/metadata/tests/test_validity.ant.xml
buildframework/helium/external/helium-antlib/quality/bld.bat
buildframework/helium/external/helium-antlib/quality/build.xml
buildframework/helium/external/helium-antlib/quality/demo/build.bat
buildframework/helium/external/helium-antlib/quality/demo/build.xml
buildframework/helium/external/helium-antlib/quality/demo/codescanner_config.xml
buildframework/helium/external/helium-antlib/quality/src/com/nokia/helium/quality/ant/antlib.xml
buildframework/helium/external/helium-antlib/quality/src/com/nokia/helium/quality/ant/helium.antlib.xml
buildframework/helium/external/helium-antlib/quality/src/com/nokia/helium/quality/ant/taskdefs/CodeScanner.java
buildframework/helium/external/helium-antlib/quality/tests/bld.sh
buildframework/helium/external/helium-antlib/quality/tests/build.bat
buildframework/helium/external/helium-antlib/quality/tests/build.xml
buildframework/helium/external/helium-antlib/quality/tests/codescanner_config.xml
buildframework/helium/external/helium-antlib/quality/tests/data/src/exclude.txt
buildframework/helium/external/helium-antlib/quality/tests/data/src/helloworld.cpp
buildframework/helium/external/helium-antlib/quality/tests/data/src2/exclude.txt
buildframework/helium/external/helium-antlib/quality/tests/data/src2/helloworld.cpp
buildframework/helium/external/helium-antlib/quality/tests/test_codescanner.ant.xml
buildframework/helium/external/helium-antlib/scm/bld.bat
buildframework/helium/external/helium-antlib/scm/build.xml
buildframework/helium/external/helium-antlib/scm/demo/build.bat
buildframework/helium/external/helium-antlib/scm/demo/build.xml
buildframework/helium/external/helium-antlib/scm/demo/hg_test1.zip
buildframework/helium/external/helium-antlib/scm/demo/hg_test2.zip
buildframework/helium/external/helium-antlib/scm/demo/hg_test3.zip
buildframework/helium/external/helium-antlib/scm/lib/maven-scm-api-1.1.jar
buildframework/helium/external/helium-antlib/scm/lib/maven-scm-provider-hg-1.1.jar
buildframework/helium/external/helium-antlib/scm/lib/maven-scm-provider-svn-commons-1.1.jar
buildframework/helium/external/helium-antlib/scm/lib/maven-scm-provider-synergy-1.1.jar
buildframework/helium/external/helium-antlib/scm/lib/plexus-utils-1.5.6.jar
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/antlib.xml
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/helium.antlib.xml
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/AddAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/BaseDirectoryScmAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/BranchAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ChangelogAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/CheckinAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/CheckoutAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/DiffAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ExportAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InfoAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InitAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/PullAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/RemoveAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmTask.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/StatusAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagsAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/UpdateAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/LatestTag.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Revision.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Tag.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/TagSet.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/info/AbstractInfoCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/info/InfoScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/init/InitScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/AbstractPullCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/PullScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/AbstractTagsCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/TagsScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/BasicExtendedScmManager.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/ExtendedScmManager.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/ScmProviderExt.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/HgScmProviderExt.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/VersionChangeSet.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/branch/HgBranchCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/export/HgExportCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/info/HgInfoCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/info/HgInfoConsumer.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/init/HgInitCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/log/HgChangeLogCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/log/HgChangeLogConsumer.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/pull/HgPullCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/remove/HgRemoveCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/tag/HgTagCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/tags/HgTagsCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/tags/HgTagsConsumer.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/update/HgUpdateCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/repository/HgScmProviderRepository.java
buildframework/helium/external/helium-antlib/scm/tests/abstract_unittest_scmtask.ant.xml
buildframework/helium/external/helium-antlib/scm/tests/bld.sh
buildframework/helium/external/helium-antlib/scm/tests/build.bat
buildframework/helium/external/helium-antlib/scm/tests/build.xml
buildframework/helium/external/helium-antlib/scm/tests/data/hg_test1.zip
buildframework/helium/external/helium-antlib/scm/tests/data/hg_test2.zip
buildframework/helium/external/helium-antlib/scm/tests/data/hg_test3.zip
buildframework/helium/external/helium-antlib/scm/tests/data/svn_test1.zip
buildframework/helium/external/helium-antlib/scm/tests/test_hg_scmtask.ant.xml
buildframework/helium/external/helium-antlib/signaling/bld.bat
buildframework/helium/external/helium-antlib/signaling/build.xml
buildframework/helium/external/helium-antlib/signaling/demo/build.bat
buildframework/helium/external/helium-antlib/signaling/demo/build.xml
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/Notifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalExceptionMessage.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalNeverFailMessage.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatus.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatusList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalListener.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/antlib.xml
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/conditions/DeferredFailureCondition.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/helium.antlib.xml
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/taskdefs/ClearDeferredFailures.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/taskdefs/Signal.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/FailBuildEnum.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/LogSourceList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SMSNotifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalConfig.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionHandler.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalListenerConfig.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/TargetCondition.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/XmlSource.java
buildframework/helium/external/helium-antlib/signaling/src/templates/email.html.ftl
buildframework/helium/external/helium-antlib/signaling/src/templates/email_default.html.ftl
buildframework/helium/external/helium-antlib/signaling/src/templates/email_subject.txt.ftl
buildframework/helium/external/helium-antlib/signaling/tests/bld.sh
buildframework/helium/external/helium-antlib/signaling/tests/build.bat
buildframework/helium/external/helium-antlib/signaling/tests/build.xml
buildframework/helium/external/helium-antlib/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/data/test.log_status.html
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/email.html.ftl
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/example.html.ftl
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_hasdeferredfailure.ant.xml
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaling.ant.xml
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaling_config.ant.xml
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaltask.ant.xml
buildframework/helium/external/jep_1.6_2.5/README
buildframework/helium/external/jep_1.6_2.5/console.py
buildframework/helium/external/jep_1.6_2.5/jep.dll
buildframework/helium/external/jep_1.6_2.5/jep.jar
buildframework/helium/external/jep_1.6_2.5/libjep.so
buildframework/helium/external/jep_1.6_2.5/msvcr71.dll
buildframework/helium/external/jep_1.6_2.5/msvcrt.dll
buildframework/helium/external/python/bin/coverage.py
buildframework/helium/external/python/bin/epydoc
buildframework/helium/external/python/bin/nosetests-script.py
buildframework/helium/external/python/lib/2.5/4Suite_XML-1.0.2-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/Amara-1.2.0.1-py2.5.egg
buildframework/helium/external/python/lib/2.5/Jinja-1.2-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/Jinja2-2.0rc1-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/PyXML-0.8.4-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/Pygments-0.10-py2.5.egg
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/application.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/config.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/search.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py
buildframework/helium/external/python/lib/2.5/coverage-2.85-py2.5.egg
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/core.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/examples.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/frontend.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/io.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/af.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ca.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/cs.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/de.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/en.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/eo.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/es.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fi.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fr.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/he.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/it.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ja.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/nl.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ru.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sk.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sv.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/nodes.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/null.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/doctree.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/pep.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/standalone.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/statemachine.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/components.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/misc.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/parts.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/peps.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/references.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/universal.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/urischemes.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/utils.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/null.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/roman.py
buildframework/helium/external/python/lib/2.5/easy-install.pth
buildframework/helium/external/python/lib/2.5/epydoc-3.0beta1-py2.5.egg
buildframework/helium/external/python/lib/2.5/jython-2.5-py2.5.egg
buildframework/helium/external/python/lib/2.5/linux/4Suite_XML-1.0.2-py2.5-linux-i686.egg
buildframework/helium/external/python/lib/2.5/linux/PyXML-0.8.4-py2.5-linux-i686.egg
buildframework/helium/external/python/lib/2.5/linux/easy-install.pth
buildframework/helium/external/python/lib/2.5/linux/lxml-1.3.6-py2.5-linux-i686.egg
buildframework/helium/external/python/lib/2.5/linux/site.py
buildframework/helium/external/python/lib/2.5/lxml-1.3.5-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/mocker-0.10.1-py2.5.egg
buildframework/helium/external/python/lib/2.5/nose-0.10.4-py2.5.egg
buildframework/helium/external/python/lib/2.5/path-2.2-py2.5.egg
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/__init__.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/_psyco.pyd
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/classes.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/core.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/kdictproxy.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/logger.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/profiler.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/support.py
buildframework/helium/external/python/lib/2.5/setuptools-0.6c5-py2.5.egg
buildframework/helium/external/python/lib/2.5/setuptools.pth
buildframework/helium/external/python/lib/2.5/simplejson-1.9.1-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/site.py
buildframework/helium/external/python/lib/2.5/sphinx-build.py
buildframework/helium/external/python/lib/2.5/threadpool.py
buildframework/helium/external/python/lib/2.6/4Suite_XML-1.0.2-py2.6-win32.egg
buildframework/helium/external/python/lib/2.6/lxml-2.2.1-py2.6-win32.egg
buildframework/helium/external/sources/bsh-2.1b0_source-1.0.zip
buildframework/helium/external/sources/freemarker-2.3.13-sources-1.0.zip
buildframework/helium/external/sources/junit-4.5-src.zip
buildframework/helium/external/sources/mail-1.4.1-sources-1.0.zip
buildframework/helium/external/sources/wsdl4j-1.5.1-sources-1.0.zip
buildframework/helium/external/sources/xia_source-1.0.zip
buildframework/helium/external/sources/xincluder-1.0d11.tar.gz
buildframework/helium/helium.ant.xml
buildframework/helium/helium_preinclude.ant.xml
buildframework/helium/hlm-bootstrap.bat
buildframework/helium/hlm-jar.bat
buildframework/helium/hlm.bat
buildframework/helium/hlm.sh
buildframework/helium/licenses/4Suite-XML-1.0.2_required notices.txt
buildframework/helium/licenses/APACHE_LICENSE-2.0.txt
buildframework/helium/licenses/Amara-1.2.0.1-py2.5_required notices.txt
buildframework/helium/licenses/Apache Ant Contrib Tasks 1.0b2.txt
buildframework/helium/licenses/BSD license.txt
buildframework/helium/licenses/CDDL 1.0.1.txt
buildframework/helium/licenses/Common Public License Version 1.0.txt
buildframework/helium/licenses/Commons HTTPClient 3.1_NOTICE.txt
buildframework/helium/licenses/Jaxen 1.1.1_required_notices.txt
buildframework/helium/licenses/Jinja2-2.1.1_required notices.txt
buildframework/helium/licenses/MIT license.txt
buildframework/helium/licenses/Mozilla 1.1.txt
buildframework/helium/licenses/NOTICE
buildframework/helium/licenses/SUN PUBLIC LICENSE Version 1-1.txt
buildframework/helium/licenses/The Apache Software License, Version 1.1.txt
buildframework/helium/licenses/apache-ivy-2.0.0-beta2_required notices.txt
buildframework/helium/licenses/asm-2.2.1_required notices.txt
buildframework/helium/licenses/coverage-2.77_required notices.txt
buildframework/helium/licenses/dom4j.txt
buildframework/helium/licenses/fmpp 0.9.13 _required_notices.txt
buildframework/helium/licenses/freemarker-2.3.13_required notices.txt
buildframework/helium/licenses/jsch-0.1.39_required notices.txt
buildframework/helium/licenses/jython license 2.0, 2.1.txt
buildframework/helium/licenses/jython_src_2.2.1_required notices.txt
buildframework/helium/licenses/lgpl.txt
buildframework/helium/licenses/lxml-1.3.5_required notices.txt
buildframework/helium/licenses/mail_src_required notices.txt
buildframework/helium/licenses/plexus-utils-1.5.7_required notices.txt
buildframework/helium/licenses/psf_zpl_licenses_for_python_setuptools_0.6c5.txt
buildframework/helium/licenses/python 1,6 license.txt
buildframework/helium/licenses/xmlunit-1.2_required notices.txt
buildframework/helium/precompile_py.bat
buildframework/helium/pt.bat
buildframework/helium/tests/data/PythonTest.py
buildframework/helium/tests/data/ant_config_test.txt
buildframework/helium/tests/data/ant_config_test.xml
buildframework/helium/tests/data/archive_test_input.cfg.xml
buildframework/helium/tests/data/bom/bom_validate_101_bom.xml
buildframework/helium/tests/data/bom/bom_validate_101_bom_delta.xml
buildframework/helium/tests/data/bom/bom_validate_102_bom.xml
buildframework/helium/tests/data/bom/bom_validate_102_bom_delta.xml
buildframework/helium/tests/data/bom/bom_validate_103_bom.xml
buildframework/helium/tests/data/bom/bom_validate_103_bom_delta.xml
buildframework/helium/tests/data/bom/bom_validate_104_bom_delta.xml
buildframework/helium/tests/data/bom/build_model_bom.xml
buildframework/helium/tests/data/bsf/ARM11.bsf
buildframework/helium/tests/data/bsf/ARM11_arm.bsf
buildframework/helium/tests/data/bsf/ARM926_arm.bsf
buildframework/helium/tests/data/bsf/ARM9E.bsf
buildframework/helium/tests/data/bsf/armv6.bsf
buildframework/helium/tests/data/bsf/armv6_abiv1.bsf
buildframework/helium/tests/data/bsf/config.bsf
buildframework/helium/tests/data/bsf/product.bsf
buildframework/helium/tests/data/bsf/variant.bsf
buildframework/helium/tests/data/build/io/abld_what.log
buildframework/helium/tests/data/build/io/test_rofs.log
buildframework/helium/tests/data/build/io/test_rom.log
buildframework/helium/tests/data/build/metadata/abld_what_db_test.log
buildframework/helium/tests/data/comments_test.bat
buildframework/helium/tests/data/comments_test.cpp
buildframework/helium/tests/data/comments_test.h
buildframework/helium/tests/data/comments_test.hrh
buildframework/helium/tests/data/comments_test.iby
buildframework/helium/tests/data/comments_test.inf
buildframework/helium/tests/data/comments_test.java
buildframework/helium/tests/data/comments_test.mk
buildframework/helium/tests/data/comments_test.mmp
buildframework/helium/tests/data/comments_test.pl
buildframework/helium/tests/data/comments_test.py
buildframework/helium/tests/data/comments_test.txt
buildframework/helium/tests/data/comments_test.xml
buildframework/helium/tests/data/comments_test1.cmd
buildframework/helium/tests/data/comments_test2.cmd
buildframework/helium/tests/data/config_test.cfg.xml
buildframework/helium/tests/data/data_model_test.xml
buildframework/helium/tests/data/data_model_validation_group_test.xml
buildframework/helium/tests/data/data_model_validation_property_test.xml
buildframework/helium/tests/data/data_model_validation_test.xml
buildframework/helium/tests/data/distribution.policy.extended_for_sf.id_status.csv
buildframework/helium/tests/data/distribution.policy.id_status.csv
buildframework/helium/tests/data/flash_config/rom_image_config_test.xml
buildframework/helium/tests/data/help_delivery/Data/xhtml/01/subdir/03/test.txt
buildframework/helium/tests/data/help_delivery/Data/xhtml/01/subdir/sample.txt
buildframework/helium/tests/data/help_delivery/Data/xhtml/02/subdir/sample.txt
buildframework/helium/tests/data/help_delivery/Data/xhtml/03_2G/sample.txt
buildframework/helium/tests/data/help_delivery/Data/xhtml/03_3G/sample.txt
buildframework/helium/tests/data/help_delivery/Data/xhtml/theme/subdir/sample.txt
buildframework/helium/tests/data/ido/ido_project/ido_project/classicui/layers.sysdef.xml
buildframework/helium/tests/data/ido/ido_project/ido_project/myapp/layers.sysdef.xml
buildframework/helium/tests/data/ido/ido_project/ido_project/xmlui/layers.sysdef.xml
buildframework/helium/tests/data/iqrf/imaker_5250.xml
buildframework/helium/tests/data/log2xml_failure.log
buildframework/helium/tests/data/log2xml_test.log
buildframework/helium/tests/data/logs/test_log.log
buildframework/helium/tests/data/pythonTest2.py
buildframework/helium/tests/data/scanlog/all_regex_type.log
buildframework/helium/tests/data/scanlog/all_regex_type.log_sbs_info.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1/test2.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/release_metadata_1.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/sp1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/specialInstructions.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_002/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_002/sp2.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_002/specialInstructions.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_2/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_2/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_3/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_3/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_4/TICKLER
buildframework/helium/tests/data/symrec/GRACE/service/product/release_4/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_4/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_5/HYDRASTATUS.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_5/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_5/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_6/HYDRASTATUS.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_6/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_6/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_7/release_metadata.xml
buildframework/helium/tests/data/symrec/GRACE/service/product/release_7/test1.zip
buildframework/helium/tests/data/symrec/GRACE/service/product/release_7/test2.zip
buildframework/helium/tests/data/symrec/generated_release_metadata.xml
buildframework/helium/tests/data/symrec/merge/main_metadata_1.xml
buildframework/helium/tests/data/symrec/merge/main_metadata_2.xml
buildframework/helium/tests/data/symrec/merge/main_metadata_3.xml
buildframework/helium/tests/data/symrec/override/one/release_metadata.xml
buildframework/helium/tests/data/symrec/override/several/release_metadata.xml
buildframework/helium/tests/data/symrec/override/several/release_metadata_1.xml
buildframework/helium/tests/data/symrec/override/several/release_metadata_2.xml
buildframework/helium/tests/data/symrec/revision_release_metadata.xml
buildframework/helium/tests/data/sysdef2make/SDF.xml
buildframework/helium/tests/data/test_ccmwaid.inf
buildframework/helium/tests/data/test_database.xml
buildframework/helium/tests/data/test_delivery.xml
buildframework/helium/tests/data/test_prep.xml
buildframework/helium/tests/data/validate_overlay/delivery.xml.parsed
buildframework/helium/tests/data/validate_overlay/new_delivery/delivery.xml.parsed
buildframework/helium/tests/data/validate_overlay/new_delivery/prep.xml.parsed
buildframework/helium/tests/data/validate_overlay/prep.xml.parsed
buildframework/helium/tests/data/zip_archive_test.cfg.xml
buildframework/helium/tests/data/zip_checkDrive_test.cfg.xml
buildframework/helium/tests/data/zip_checkDrive_test.cfg.xml.parsed
buildframework/helium/tests/minibuilds/ats/archive.cfg.xml
buildframework/helium/tests/minibuilds/ats/build.xml
buildframework/helium/tests/minibuilds/ats/helium_minibuild_ats.sysdef.xml
buildframework/helium/tests/minibuilds/ats/hlm.bat
buildframework/helium/tests/minibuilds/ats/matti/archive.cfg.xml
buildframework/helium/tests/minibuilds/ats/matti/build.xml
buildframework/helium/tests/minibuilds/ats/matti/helium_minibuild_ats.sysdef.xml
buildframework/helium/tests/minibuilds/ats/matti/hlm.bat
buildframework/helium/tests/minibuilds/ats/matti/test.xml
buildframework/helium/tests/minibuilds/broom/build.xml
buildframework/helium/tests/minibuilds/broom/doc/index.rst
buildframework/helium/tests/minibuilds/broom/hlm.bat
buildframework/helium/tests/minibuilds/compile/archive.cfg.xml
buildframework/helium/tests/minibuilds/compile/build.xml
buildframework/helium/tests/minibuilds/compile/config/image_conf_naming.mk
buildframework/helium/tests/minibuilds/compile/distribution.policy.extended_for_sf.id_status.csv
buildframework/helium/tests/minibuilds/compile/doc/index.rst
buildframework/helium/tests/minibuilds/compile/hlm.bat
buildframework/helium/tests/minibuilds/compile/minibuild_compile.sysdef.xml
buildframework/helium/tests/minibuilds/compile/sysdef_1_4_0.dtd
buildframework/helium/tests/minibuilds/compile/template_release_metadata.xml
buildframework/helium/tests/minibuilds/diamonds/build.xml
buildframework/helium/tests/minibuilds/diamonds/hlm.bat
buildframework/helium/tests/minibuilds/ido-sbs/build.xml
buildframework/helium/tests/minibuilds/ido-sbs/hlm.bat
buildframework/helium/tests/minibuilds/ido/build.xml
buildframework/helium/tests/minibuilds/ido/config/delivery.xml
buildframework/helium/tests/minibuilds/ido/doc/index.rst
buildframework/helium/tests/minibuilds/ido/hack-test.ant.xml
buildframework/helium/tests/minibuilds/ido/hlm.bat
buildframework/helium/tests/minibuilds/ido/sysdefs/minibuild_ido.sysdef.xml
buildframework/helium/tests/minibuilds/imaker/build.xml
buildframework/helium/tests/minibuilds/imaker/config/image_conf_naming.mk
buildframework/helium/tests/minibuilds/imaker/doc/index.rst
buildframework/helium/tests/minibuilds/imaker/hlm.bat
buildframework/helium/tests/minibuilds/qt/build.xml
buildframework/helium/tests/minibuilds/qt/config/qmake_zip_cfg.xml
buildframework/helium/tests/minibuilds/qt/hlm.bat
buildframework/helium/tests/minibuilds/qt/minibuild_compile.sysdef.xml
buildframework/helium/tests/minibuilds/qt/sysdef_1_5_1.dtd
buildframework/helium/tools/common/bin/CheckTools.class
buildframework/helium/tools/common/bin/CheckTools.java
buildframework/helium/tools/common/bin/call_vcvars32.bat
buildframework/helium/tools/common/bin/check_home_drv.bat
buildframework/helium/tools/common/bin/get_gscm_info.pl
buildframework/helium/tools/common/bin/getppid.pl
buildframework/helium/tools/common/bsh/unique_filename.bsh
buildframework/helium/tools/common/common.ant.xml
buildframework/helium/tools/common/common.antlib.xml
buildframework/helium/tools/common/docs.ant.xml
buildframework/helium/tools/common/dtd/symbian_sysdef_options.xml
buildframework/helium/tools/common/dtd/sysdef_1_4_0.dtd
buildframework/helium/tools/common/dtd/sysdef_1_5_0.dtd
buildframework/helium/tools/common/dtd/sysdef_1_5_1.dtd
buildframework/helium/tools/common/dtd/sysdef_2_0_0.dtd
buildframework/helium/tools/common/dtd/sysdef_dtd_1_4_0.xml
buildframework/helium/tools/common/dtd/sysdef_dtd_1_5_0.xml
buildframework/helium/tools/common/dtd/sysdef_dtd_1_5_1.xml
buildframework/helium/tools/common/dtd/sysdef_dtd_2_0_0.xml
buildframework/helium/tools/common/java/lib/nokia_ant.jar
buildframework/helium/tools/common/java/src/com/nokia/ant/Antlib.java
buildframework/helium/tools/common/java/src/com/nokia/ant/BSFJepEngine.java
buildframework/helium/tools/common/java/src/com/nokia/ant/BuildStatusDef.java
buildframework/helium/tools/common/java/src/com/nokia/ant/Database.java
buildframework/helium/tools/common/java/src/com/nokia/ant/HeliumLogger.java
buildframework/helium/tools/common/java/src/com/nokia/ant/HelpDef.java
buildframework/helium/tools/common/java/src/com/nokia/ant/ModelPropertiesParser.java
buildframework/helium/tools/common/java/src/com/nokia/ant/TypedefURIFix.java
buildframework/helium/tools/common/java/src/com/nokia/ant/XmlLogger.java
buildframework/helium/tools/common/java/src/com/nokia/ant/antlib.xml
buildframework/helium/tools/common/java/src/com/nokia/ant/filters/PrettyPrintXmlFilter.java
buildframework/helium/tools/common/java/src/com/nokia/ant/helium.antlib.xml
buildframework/helium/tools/common/java/src/com/nokia/ant/ivy/ToolResolver.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/TracingLogger.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/AssertNode.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/BuildNode.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/DataNode.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EmailDataSender.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EndLessStack.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/Listener.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TargetNode.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TaskNode.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TreeDumper.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/XMLRenderer.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntConfigurationTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntDependencyTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntLintTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CcmTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CopyParallelTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderEntry.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DatabaseTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DeconfigureTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/GetValueFromVariableSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/HlmAssertMessage.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LDAP.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderEntry.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ModelPropertiesTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/PythonTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RebaselineTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RetryTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/Signal.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/StopLogToConsole.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/TextLogRecorderEntry.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/AddTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/CcmCommand.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/ChangeReleaseTag.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Checkout.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Close.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Reconcile.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Snapshot.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Synchronize.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Update.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Workarea.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/LogFilter.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/LogFilterSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/SBSMakeOptions.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/Variable.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/VariableSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/Session.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/SessionSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/Task.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/TaskSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Configuration.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/ConfigurationSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Variable.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/VariableSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/util/Helper.java
buildframework/helium/tools/common/java/src/com/nokia/ant/util/ToolsProcess.java
buildframework/helium/tools/common/java/src/com/nokia/config/SAXConfigParser.java
buildframework/helium/tools/common/java/src/com/nokia/fmpp/SqlDataLoader.java
buildframework/helium/tools/common/java/src/com/nokia/log4j.xml
buildframework/helium/tools/common/java/src/com/nokia/tools/Tool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/ToolsProcessException.java
buildframework/helium/tools/common/java/src/com/nokia/tools/cmt/CMTTool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/configuration/CONFIGURATIONTool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/sbs/SBSTool.java
buildframework/helium/tools/common/java/test/com/nokia/ant/HeliumLoggerTest.java
buildframework/helium/tools/common/jep/unique_filename.jep
buildframework/helium/tools/common/libs.ant.xml
buildframework/helium/tools/common/logging.ant.xml
buildframework/helium/tools/common/packages/BuildJob.pm
buildframework/helium/tools/common/packages/ISIS/Assertion.pm
buildframework/helium/tools/common/packages/ISIS/Build.pm
buildframework/helium/tools/common/packages/ISIS/BuildStat/Statistics.pm
buildframework/helium/tools/common/packages/ISIS/Cellmo.pm
buildframework/helium/tools/common/packages/ISIS/CppManip.pm
buildframework/helium/tools/common/packages/ISIS/ECloud.pm
buildframework/helium/tools/common/packages/ISIS/EmbeddedScanLog.pm
buildframework/helium/tools/common/packages/ISIS/EmbeddedXMLLog.pm
buildframework/helium/tools/common/packages/ISIS/ErrorDefs.pm
buildframework/helium/tools/common/packages/ISIS/FileManip.pm
buildframework/helium/tools/common/packages/ISIS/GenBuildTools.pm
buildframework/helium/tools/common/packages/ISIS/GenXML2.pm
buildframework/helium/tools/common/packages/ISIS/HtmlManip.pm
buildframework/helium/tools/common/packages/ISIS/HttpServer.pm
buildframework/helium/tools/common/packages/ISIS/IBUSAL.pm
buildframework/helium/tools/common/packages/ISIS/Logger2.pm
buildframework/helium/tools/common/packages/ISIS/Logger3.pm
buildframework/helium/tools/common/packages/ISIS/Mailer.pm
buildframework/helium/tools/common/packages/ISIS/Makefile.pm
buildframework/helium/tools/common/packages/ISIS/NAB.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Box1.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Debug.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Image.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/Document.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/Footer.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/Header.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/LogoHeader.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/MainContent.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/Summary.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Log/SummaryContent.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Node.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Outputer.pm
buildframework/helium/tools/common/packages/ISIS/OUT/RawText.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Separator.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Table2D.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Text.pm
buildframework/helium/tools/common/packages/ISIS/OUT/Title1.pm
buildframework/helium/tools/common/packages/ISIS/OutputParser.pm
buildframework/helium/tools/common/packages/ISIS/Registry.pm
buildframework/helium/tools/common/packages/ISIS/ScanLog.pm
buildframework/helium/tools/common/packages/ISIS/ScanLogTBS.pm
buildframework/helium/tools/common/packages/ISIS/XmlManip.pm
buildframework/helium/tools/common/packages/ISIS/genxml2.pl
buildframework/helium/tools/common/packages/ISIS/xml2mak.pl
buildframework/helium/tools/common/packages/Utils.pm
buildframework/helium/tools/common/packages/xml2tree.pm
buildframework/helium/tools/common/python/lib/CreateZipInput.py
buildframework/helium/tools/common/python/lib/ant.py
buildframework/helium/tools/common/python/lib/archive/__init__.py
buildframework/helium/tools/common/python/lib/archive/builders.py
buildframework/helium/tools/common/python/lib/archive/mappers.py
buildframework/helium/tools/common/python/lib/archive/scanners.py
buildframework/helium/tools/common/python/lib/archive/selectors.py
buildframework/helium/tools/common/python/lib/archive/tools.py
buildframework/helium/tools/common/python/lib/ats3/__init__.py
buildframework/helium/tools/common/python/lib/ats3/aste.py
buildframework/helium/tools/common/python/lib/ats3/atsconfigparser.py
buildframework/helium/tools/common/python/lib/ats3/dropgenerator.py
buildframework/helium/tools/common/python/lib/ats3/matti/MattiDrops.py
buildframework/helium/tools/common/python/lib/ats3/matti/template/matti_demo.xml
buildframework/helium/tools/common/python/lib/ats3/parsers.py
buildframework/helium/tools/common/python/lib/ats3/testconfigurator.py
buildframework/helium/tools/common/python/lib/bsf.py
buildframework/helium/tools/common/python/lib/build/__init__.py
buildframework/helium/tools/common/python/lib/build/ec/__init__.py
buildframework/helium/tools/common/python/lib/build/ec/history.py
buildframework/helium/tools/common/python/lib/build/io.py
buildframework/helium/tools/common/python/lib/build/model.py
buildframework/helium/tools/common/python/lib/buildmanagement.py
buildframework/helium/tools/common/python/lib/buildtools.py
buildframework/helium/tools/common/python/lib/ccm/__init__.py
buildframework/helium/tools/common/python/lib/ccm/conflict.py
buildframework/helium/tools/common/python/lib/ccm/extra.py
buildframework/helium/tools/common/python/lib/comments.py
buildframework/helium/tools/common/python/lib/configuration.py
buildframework/helium/tools/common/python/lib/configuration_model.py
buildframework/helium/tools/common/python/lib/ctc.py
buildframework/helium/tools/common/python/lib/dataurl.py
buildframework/helium/tools/common/python/lib/delta_zip.py
buildframework/helium/tools/common/python/lib/dependancygraph.py
buildframework/helium/tools/common/python/lib/escapeddict.py
buildframework/helium/tools/common/python/lib/fileutils.py
buildframework/helium/tools/common/python/lib/flash_config.py
buildframework/helium/tools/common/python/lib/helium/__init__.py
buildframework/helium/tools/common/python/lib/helium/documentation.py
buildframework/helium/tools/common/python/lib/helium/logger.py
buildframework/helium/tools/common/python/lib/helium/output/__init__.py
buildframework/helium/tools/common/python/lib/helium/output/widgets.py
buildframework/helium/tools/common/python/lib/helium/outputer.py
buildframework/helium/tools/common/python/lib/heliumlogging.py
buildframework/helium/tools/common/python/lib/ido.py
buildframework/helium/tools/common/python/lib/imaker/__init__.py
buildframework/helium/tools/common/python/lib/imaker/ant.py
buildframework/helium/tools/common/python/lib/imaker/api.py
buildframework/helium/tools/common/python/lib/imaker/ecore.py
buildframework/helium/tools/common/python/lib/imaker/iqrf.py
buildframework/helium/tools/common/python/lib/integration/__init__.py
buildframework/helium/tools/common/python/lib/integration/ant.py
buildframework/helium/tools/common/python/lib/integration/quality.py
buildframework/helium/tools/common/python/lib/integration/templatebuilder.py
buildframework/helium/tools/common/python/lib/localisation.py
buildframework/helium/tools/common/python/lib/log2xml.py
buildframework/helium/tools/common/python/lib/nokia/__init__.py
buildframework/helium/tools/common/python/lib/nokia/gscm.py
buildframework/helium/tools/common/python/lib/nokia/nokiaccm.py
buildframework/helium/tools/common/python/lib/parsedatalistening.py
buildframework/helium/tools/common/python/lib/pathaddition/__init__.py
buildframework/helium/tools/common/python/lib/pathaddition/match.py
buildframework/helium/tools/common/python/lib/pathaddition/relative.py
buildframework/helium/tools/common/python/lib/precompile.py
buildframework/helium/tools/common/python/lib/preparation.py
buildframework/helium/tools/common/python/lib/rom.py
buildframework/helium/tools/common/python/lib/rtfutils.py
buildframework/helium/tools/common/python/lib/sis.py
buildframework/helium/tools/common/python/lib/symbian/__init__.py
buildframework/helium/tools/common/python/lib/symbian/log.py
buildframework/helium/tools/common/python/lib/symrec.py
buildframework/helium/tools/common/python/lib/sysdef/__init__.py
buildframework/helium/tools/common/python/lib/sysdef/api.py
buildframework/helium/tools/common/python/lib/sysdef/io.py
buildframework/helium/tools/common/python/lib/test/__init__.py
buildframework/helium/tools/common/python/lib/test/test_ant.py
buildframework/helium/tools/common/python/lib/test/test_archive.py
buildframework/helium/tools/common/python/lib/test/test_ats3.py
buildframework/helium/tools/common/python/lib/test/test_ats3_aste.py
buildframework/helium/tools/common/python/lib/test/test_atsconfigparser.py
buildframework/helium/tools/common/python/lib/test/test_atsconfiguration.py
buildframework/helium/tools/common/python/lib/test/test_bsf.py
buildframework/helium/tools/common/python/lib/test/test_build_io.py
buildframework/helium/tools/common/python/lib/test/test_buildmodel.py
buildframework/helium/tools/common/python/lib/test/test_buildtools.py
buildframework/helium/tools/common/python/lib/test/test_ccm.py
buildframework/helium/tools/common/python/lib/test/test_ccm_4pn.py
buildframework/helium/tools/common/python/lib/test/test_ccm_object.py
buildframework/helium/tools/common/python/lib/test/test_ccm_results.py
buildframework/helium/tools/common/python/lib/test/test_comments.py
buildframework/helium/tools/common/python/lib/test/test_configuration.py
buildframework/helium/tools/common/python/lib/test/test_configuration_model.py
buildframework/helium/tools/common/python/lib/test/test_ctc.py
buildframework/helium/tools/common/python/lib/test/test_deltazip.py
buildframework/helium/tools/common/python/lib/test/test_escapeddict.py
buildframework/helium/tools/common/python/lib/test/test_fileutils.py
buildframework/helium/tools/common/python/lib/test/test_flash_config.py
buildframework/helium/tools/common/python/lib/test/test_freedisk.py
buildframework/helium/tools/common/python/lib/test/test_gscm.py
buildframework/helium/tools/common/python/lib/test/test_help32.py
buildframework/helium/tools/common/python/lib/test/test_iqrf.py
buildframework/helium/tools/common/python/lib/test/test_log2xml.py
buildframework/helium/tools/common/python/lib/test/test_logger.py
buildframework/helium/tools/common/python/lib/test/test_misc.py
buildframework/helium/tools/common/python/lib/test/test_parsers.py
buildframework/helium/tools/common/python/lib/test/test_path_match.py
buildframework/helium/tools/common/python/lib/test/test_pathaddition_relative.py
buildframework/helium/tools/common/python/lib/test/test_policy_validator.py
buildframework/helium/tools/common/python/lib/test/test_relnotes.py
buildframework/helium/tools/common/python/lib/test/test_rom.py
buildframework/helium/tools/common/python/lib/test/test_session_provider.py
buildframework/helium/tools/common/python/lib/test/test_symbian_log.py
buildframework/helium/tools/common/python/lib/test/test_symrec.py
buildframework/helium/tools/common/python/lib/test/test_sysdef.py
buildframework/helium/tools/common/python/lib/test/test_threadpool.py
buildframework/helium/tools/common/python/lib/test/test_vbaconf.py
buildframework/helium/tools/common/python/lib/validateoverlay.py
buildframework/helium/tools/common/python/lib/vbaconf/__init__.py
buildframework/helium/tools/common/python/lib/vbaconf/new_delivery.py
buildframework/helium/tools/common/python/lib/version.py
buildframework/helium/tools/common/python/lib/virtualbuildarea.py
buildframework/helium/tools/common/python/lib/xmlhelper.py
buildframework/helium/tools/common/python/scripts/filter_heliumlog.py
buildframework/helium/tools/common/python/scripts/filter_metadatalog.py
buildframework/helium/tools/common/python/scripts/sbslogscanner.py
buildframework/helium/tools/common/python/scripts/sbsscanlog.py
buildframework/helium/tools/common/python/scripts/sbsscanlogmetadata.py
buildframework/helium/tools/common/python/scripts/searchnextdrive.py
buildframework/helium/tools/common/python/scripts/test_scanlog.ant.xml
buildframework/helium/tools/common/python/scripts/timeout_launcher.py
buildframework/helium/tools/common/schema/ant.xsd
buildframework/helium/tools/common/schema/antunit.xsd
buildframework/helium/tools/common/schema/helium_ant.xsd
buildframework/helium/tools/common/schema/helium_config.xsd
buildframework/helium/tools/common/schema/helium_data_model.xsd
buildframework/helium/tools/common/schema/helium_internaldata.xsd
buildframework/helium/tools/common/svn-ccm-sync.bc.txt
buildframework/helium/tools/common/templates/clean_pc.ant.ftl
buildframework/helium/tools/common/templates/codescanner/codescanner.ant.xml.ftl
buildframework/helium/tools/common/templates/codescanner/codescanner.mk.ftl
buildframework/helium/tools/common/templates/coveragerecord.html.ftl
buildframework/helium/tools/common/templates/coveragerecord.txt.ftl
buildframework/helium/tools/common/templates/db2xml.xml.ftl
buildframework/helium/tools/common/templates/diamonds/apimetrics.xml.ftl
buildframework/helium/tools/common/templates/diamonds/codescanner.xml.ftl
buildframework/helium/tools/common/templates/diamonds/compile.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_build.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_faults.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_finish.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_footer.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_header.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_locations.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_macro.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_signal.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_stage.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_start.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_status.xml.ftl
buildframework/helium/tools/common/templates/diamonds/diamonds_tags.ftl
buildframework/helium/tools/common/templates/diamonds/faults_metadata.ftl
buildframework/helium/tools/common/templates/diamonds/tool.xml.ftl
buildframework/helium/tools/common/templates/diamonds/validate-policy-log.xml.ftl
buildframework/helium/tools/common/templates/help_text.txt.ftl
buildframework/helium/tools/common/templates/ido/ido-ant-copy.xml.ftl
buildframework/helium/tools/common/templates/ido/ido-ant-delete.xml.ftl
buildframework/helium/tools/common/templates/ido/ido-ant-fixslashes.xml.ftl
buildframework/helium/tools/common/templates/ido/ido-cmt-ant.xml.ftl
buildframework/helium/tools/common/templates/ido/ido-export.ant.xml.ftl
buildframework/helium/tools/common/templates/ido/ido-robot-zip.ant.xml.ftl
buildframework/helium/tools/common/templates/ido/ready.txt.ftl
buildframework/helium/tools/common/templates/ido/task-publish.ant.xml.ftl
buildframework/helium/tools/common/templates/ido/zip-ant-wa-copy.xml.ftl
buildframework/helium/tools/common/templates/imaker/build_imaker_roms.ant.xml.ftl
buildframework/helium/tools/common/templates/imaker/build_imaker_roms.mk.ftl
buildframework/helium/tools/common/templates/imaker/build_imaker_roms_signing.mk.ftl
buildframework/helium/tools/common/templates/imaker/image_conf_buildinfo.mk.ftl
buildframework/helium/tools/common/templates/integration/build-duplicates.html.ftl
buildframework/helium/tools/common/templates/integration/internal-exports.html.ftl
buildframework/helium/tools/common/templates/integration/validate-policy.log.ftl
buildframework/helium/tools/common/templates/integration/validate-policy.log.xml.ftl
buildframework/helium/tools/common/templates/log/bt_email.html.ftl
buildframework/helium/tools/common/templates/log/bt_email_subject.txt.ftl
buildframework/helium/tools/common/templates/log/bt_sms_content.txt.ftl
buildframework/helium/tools/common/templates/log/build_status.xml.ftl
buildframework/helium/tools/common/templates/log/cc_summary.html.ftl
buildframework/helium/tools/common/templates/log/cc_summary_metadata.html.ftl
buildframework/helium/tools/common/templates/log/email.html.ftl
buildframework/helium/tools/common/templates/log/email_default.html.ftl
buildframework/helium/tools/common/templates/log/email_new.html.ftl
buildframework/helium/tools/common/templates/log/email_status.html.ftl
buildframework/helium/tools/common/templates/log/email_subject.txt.ftl
buildframework/helium/tools/common/templates/log/email_warning.html.ftl
buildframework/helium/tools/common/templates/log/scan2.html.ftl
buildframework/helium/tools/common/templates/log/sms_content.txt.ftl
buildframework/helium/tools/common/templates/log/sms_content_new.txt.ftl
buildframework/helium/tools/common/templates/log/summary.html.ftl
buildframework/helium/tools/common/templates/log/summary_metadata.html.ftl
buildframework/helium/tools/common/templates/macro/logger/expand3.js
buildframework/helium/tools/common/templates/macro/logger/log3.css
buildframework/helium/tools/common/templates/macro/logger/logger.ftl
buildframework/helium/tools/common/templates/preparation/modificationset.log.xml.ftl
buildframework/helium/tools/common/test/echo.bat
buildframework/helium/tools/common/test/echo.sh
buildframework/helium/tools/common/test/test_common.ant.xml
buildframework/helium/tools/common/test/test_deconfigure_task.ant.xml
buildframework/helium/tools/common/test/test_getvariablevalue.ant.xml
buildframework/helium/tools/common/test/test_logging.ant.xml
buildframework/helium/tools/common/test/test_rebaseline_task.ant.xml
buildframework/helium/tools/common/testing.ant.xml
buildframework/helium/tools/compile/ImageCreation.pl
buildframework/helium/tools/compile/buildjob.pl
buildframework/helium/tools/compile/cmaker.ant.xml
buildframework/helium/tools/compile/compile.ant.xml
buildframework/helium/tools/compile/compile.antlib.xml
buildframework/helium/tools/compile/ebs/ebs.ant.xml
buildframework/helium/tools/compile/ec/ec.ant.xml
buildframework/helium/tools/compile/ec/ec_functions.mk
buildframework/helium/tools/compile/ec/ec_whatcheck.pl
buildframework/helium/tools/compile/ec/sysdef2make.pl
buildframework/helium/tools/compile/qt/qt.ant.xml
buildframework/helium/tools/compile/qt/templates/run-qmake.ant.xml.ftl
buildframework/helium/tools/compile/qt/templates/run-qmake.mk.ftl
buildframework/helium/tools/compile/sbs/sbs.ant.xml
buildframework/helium/tools/compile/sbs/sbs.settings.ant.xml
buildframework/helium/tools/compile/sbs/test/test_sbs.ant.xml
buildframework/helium/tools/compile/scanbuildlog.pl
buildframework/helium/tools/compile/sis.ant.xml
buildframework/helium/tools/compile/util/ini2sysdef.py
buildframework/helium/tools/compile/util/txt2sysdef.py
buildframework/helium/tools/iad/iad.ant.xml
buildframework/helium/tools/iad/iadinfo.py
buildframework/helium/tools/iad/packageiad.py
buildframework/helium/tools/integration/integration.ant.xml
buildframework/helium/tools/integration/patching.ant.xml
buildframework/helium/tools/integration/template-builder/template-builder.ant.xml
buildframework/helium/tools/integration/validate_overlay/generate_vo_conf_ccmgetinput-new.py
buildframework/helium/tools/integration/validate_overlay/generate_vo_conf_ccmgetinput.py
buildframework/helium/tools/integration/validate_overlay/validate_overlay.ant.xml
buildframework/helium/tools/localisation/create_language_pack.py
buildframework/helium/tools/localisation/create_variant_cenrep.py
buildframework/helium/tools/localisation/createlocales.py
buildframework/helium/tools/localisation/deprecated.txt
buildframework/helium/tools/localisation/get_product_path.py
buildframework/helium/tools/localisation/get_product_platform.py
buildframework/helium/tools/localisation/get_variant_dirs.py
buildframework/helium/tools/localisation/getalllanguages.py
buildframework/helium/tools/localisation/getallvariantion.py
buildframework/helium/tools/localisation/helps/generate_iby_32.mk
buildframework/helium/tools/localisation/helps/generate_iby_32.py
buildframework/helium/tools/localisation/helps/template/bld.inf
buildframework/helium/tools/localisation/helps/template/generate_iby.mk
buildframework/helium/tools/localisation/helps/template/readme.txt
buildframework/helium/tools/localisation/localisation-32.ant.xml
buildframework/helium/tools/localisation/localisation-50.ant.xml
buildframework/helium/tools/localisation/localisation.ant.xml
buildframework/helium/tools/localisation/localiser/ECLocaliser.pm
buildframework/helium/tools/localisation/localiser/isis_EClocaliser.pl
buildframework/helium/tools/localisation/templates/rom/mc_variant_imaker.oby
buildframework/helium/tools/metadata/metadata.ant.xml
buildframework/helium/tools/preparation/bom/bom.ant.xml
buildframework/helium/tools/preparation/bom/bom.html.ftl
buildframework/helium/tools/preparation/bom/bom.txt.ftl
buildframework/helium/tools/preparation/bom/bom_delta.html.ftl
buildframework/helium/tools/preparation/bom/bom_delta.txt.ftl
buildframework/helium/tools/preparation/ci.ant.xml
buildframework/helium/tools/preparation/freedisk.py
buildframework/helium/tools/preparation/getenv.pl
buildframework/helium/tools/preparation/ido-prep.ant.xml
buildframework/helium/tools/preparation/ivy/dependencies.ant.xml
buildframework/helium/tools/preparation/overlayLog_to_html.xslt
buildframework/helium/tools/preparation/overlays.ant.xml
buildframework/helium/tools/preparation/password.ant.xml
buildframework/helium/tools/preparation/prep_build_area.pl
buildframework/helium/tools/preparation/preparation.ant.xml
buildframework/helium/tools/preparation/synergy/buildmanagement.ant.xml
buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml
buildframework/helium/tools/preparation/synergy/ccmtask.jep
buildframework/helium/tools/preparation/test/test_ci.ant.xml
buildframework/helium/tools/preparation/test/test_preparation.ant.xml
buildframework/helium/tools/preparation/test/test_synergy.ant.xml
buildframework/helium/tools/publish/evalid_multiple.pl
buildframework/helium/tools/publish/evalidmd5.patch
buildframework/helium/tools/publish/get_loc_files.pl
buildframework/helium/tools/publish/internal-api/internal-api.ant.xml
buildframework/helium/tools/publish/nwiki.ant.xml
buildframework/helium/tools/publish/publish.ant.xml
buildframework/helium/tools/publish/publish_dir_files/bld.bat
buildframework/helium/tools/publish/publish_dir_files/build.xml
buildframework/helium/tools/publish/subcon.ant.xml
buildframework/helium/tools/publish/synergy.ant.xml
buildframework/helium/tools/publish/test/test2_publishing_to_diamonds.ant.xml
buildframework/helium/tools/publish/test/test_macro.ant.xml
buildframework/helium/tools/quality/conflict-checker.ant.xml
buildframework/helium/tools/quality/file-comparison/BCompare-config.txt
buildframework/helium/tools/quality/file-comparison/file-comparison.ant.xml
buildframework/helium/tools/quality/internal-exports.ant.xml
buildframework/helium/tools/quality/mmp-to-target.ant.xml
buildframework/helium/tools/quality/quality.ant.xml
buildframework/helium/tools/quality/validate-policy.ant.xml
buildframework/helium/tools/release/release.ant.xml
buildframework/helium/tools/relnotes/getVariantConfiguration.py
buildframework/helium/tools/relnotes/icf2txt.py
buildframework/helium/tools/relnotes/readHTML.py
buildframework/helium/tools/relnotes/relnotes.ant.xml
buildframework/helium/tools/rombuild/dryrun_parser.py
buildframework/helium/tools/rombuild/example/rom_image_config.xml
buildframework/helium/tools/rombuild/features/helium_auto_traces.mk
buildframework/helium/tools/rombuild/features/helium_config_builder.mk
buildframework/helium/tools/rombuild/features/helium_eval_variables.mk
buildframework/helium/tools/rombuild/features/helium_features.mk
buildframework/helium/tools/rombuild/features/helium_fwid.mk
buildframework/helium/tools/rombuild/features/helium_helpers.mk
buildframework/helium/tools/rombuild/features/helium_localisation.mk
buildframework/helium/tools/rombuild/features/helium_makeUPCT_core.mk
buildframework/helium/tools/rombuild/features/helium_sw_string.mk
buildframework/helium/tools/rombuild/features/helium_uda.mk
buildframework/helium/tools/rombuild/features/helium_upct.mk
buildframework/helium/tools/rombuild/features/unittest/test_helium_features.mk
buildframework/helium/tools/rombuild/features/unittest/test_helpers.mk
buildframework/helium/tools/rombuild/generic_templates/core.mk
buildframework/helium/tools/rombuild/generic_templates/customer.mk
buildframework/helium/tools/rombuild/generic_templates/eraseuda.mk
buildframework/helium/tools/rombuild/generic_templates/flash.mk
buildframework/helium/tools/rombuild/generic_templates/flash_config.mk
buildframework/helium/tools/rombuild/generic_templates/languagepack.mk
buildframework/helium/tools/rombuild/generic_templates/main.mk
buildframework/helium/tools/rombuild/generic_templates/makeupct_core.mk
buildframework/helium/tools/rombuild/generic_templates/template.config.xml
buildframework/helium/tools/rombuild/generic_templates/uda.mk
buildframework/helium/tools/rombuild/generic_templates/vt_uda.mk
buildframework/helium/tools/rombuild/imaker.ant.xml
buildframework/helium/tools/rombuild/rombuild.ant.xml
buildframework/helium/tools/rombuild/trace_images/mytraces_general.txt
buildframework/helium/tools/rombuild/trace_images/mytraces_phone.txt
buildframework/helium/tools/rombuild/trace_images/trace_image_creator.pl
buildframework/helium/tools/rombuild/trace_images/tracebuild.ant.xml
buildframework/helium/tools/startup/antserver/antserver.ant.xml
buildframework/helium/tools/startup/antserver/remote.ant.xml
buildframework/helium/tools/startup/antserver/remote_builds_to_ant_script.xslt
buildframework/helium/tools/startup/antserver/templates/remote_builds.conf.xml
buildframework/helium/tools/startup/bootstrap/bootstrap.ant.xml
buildframework/helium/tools/startup/bootstrap/easy-install.pth
buildframework/helium/tools/startup/bootstrap/site.py
buildframework/helium/tools/testing/ats/ats.ant.xml
buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl
buildframework/helium/tools/testing/ats/wshTestRunImport.vbs
buildframework/helium/tools/testing/ats/wshTestRunX.vbs
buildframework/helium/tools/testing/eunit/eunit.ant.xml
buildframework/helium/tools/testing/mobilecrash/mobilecrash.ant.xml
buildframework/helium/tools/testing/mobilecrash/selge.ini
buildframework/helium/tools/testing/testing.ant.xml
buildframework/helium/tools/uda/uda.ant.xml
imgtools/imaker/bin/gpl.licence.txt
imgtools/imaker/bin/mingw_make.exe
imgtools/imaker/buildrom_plugins/group/bld.inf
imgtools/imaker/buildrom_plugins/hide.pm
imgtools/imaker/buildrom_plugins/localise.pm
imgtools/imaker/buildrom_plugins/localise_all_resources.pm
imgtools/imaker/buildrom_plugins/obyparse.pm
imgtools/imaker/buildrom_plugins/override.pm
imgtools/imaker/buildrom_plugins/plugincommon.pm
imgtools/imaker/config/example_image_conf_buildinfo.mk
imgtools/imaker/config/example_image_conf_naming.mk
imgtools/imaker/config/example_image_conf_platform.mk
imgtools/imaker/config/example_image_conf_product.mk
imgtools/imaker/config/example_imaker_extension.mk
imgtools/imaker/config/example_language_variant.mk
imgtools/imaker/config/example_system_languages.mk
imgtools/imaker/config/group/bld.inf
imgtools/imaker/doc/iMaker_User_Guide.pdf
imgtools/imaker/group/bld.inf
imgtools/imaker/src/imaker.cmd
imgtools/imaker/src/imaker.mk
imgtools/imaker/src/imaker.pl
imgtools/imaker/src/imaker.pm
imgtools/imaker/src/imaker_core.mk
imgtools/imaker/src/imaker_help.mk
imgtools/imaker/src/imaker_image.mk
imgtools/imaker/src/imaker_minienv.mk
imgtools/imaker/src/imaker_odp.mk
imgtools/imaker/src/imaker_public.mk
imgtools/imaker/src/imaker_rofs2.mk
imgtools/imaker/src/imaker_rofs3.mk
imgtools/imaker/src/imaker_rofs4.mk
imgtools/imaker/src/imaker_tools.mk
imgtools/imaker/src/imaker_uda.mk
imgtools/imaker/src/imaker_variant.mk
imgtools/imaker/src/imaker_version.mk
srctools/cmaker/bin/gpl.licence.txt
srctools/cmaker/bin/mingw_make.exe
srctools/cmaker/cmaker_readme.txt
srctools/cmaker/cmaker_version.txt
srctools/cmaker/group/bld.inf
srctools/cmaker/makefile
srctools/cmaker/src/cmaker.cmd
srctools/cmaker/src/env.mk
srctools/cmaker/src/functions.mk
srctools/cmaker/src/include_template.mk
srctools/cmaker/src/settings.mk
srctools/cmaker/src/tools.mk
srctools/cmaker/src/utils.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/build-jar.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build-jar.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-build-jar" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Called by hlm-jar.bat to build helium java code
+    </description>
+
+    <property environment="env" />
+
+    <property name="build.temp.dir" location="${env.TEMP}/helium/java" />
+    <property name="src.dir" location="${helium.dir}/tools/common/java/src" />
+    <property name="ext.java.lib.dir" location="${helium.dir}/external/antlibs" />
+    <property name="helium.java.lib.dir" location="${helium.dir}/tools/common/java/lib" />
+
+
+    <!-- Builds the Java source code for our custom Ant stuff. -->
+    <target name="build-java-src" description="Builds the internal Ant custom tasks">
+        <delete dir="${build.temp.dir}" />
+        <mkdir dir="${build.temp.dir}" />
+        <copy todir="${build.temp.dir}/class">
+            <fileset dir="${src.dir}">
+                <include name="**/*.properties" />
+                <include name="**/*.xml" />
+            </fileset>
+        </copy>
+        <javac srcdir="${src.dir}" destdir="${build.temp.dir}/class" source="1.6" target="1.6" debug="true">
+            <classpath>
+                <fileset dir="${ext.java.lib.dir}" includes="**/*.jar" />
+                <fileset dir="${helium.dir}/external/helium-antlib" includes="**/*.jar" />
+            </classpath>
+            <exclude name="nokia/cruisecontrol/**" />
+        </javac>
+    </target>
+
+
+    <!-- Builds the .jar file with our custom Ant tasks and loggers in. -->
+    <target name="jar" depends="build-java-src" description="Builds jar for internal Ant custom tasks">
+        <property file="${helium.dir}/config/version.txt" />
+        <mkdir dir="${build.temp.dir}/lib" />
+        <delete file="${build.temp.dir}/lib/nokia_ant.jar" />
+        <copy file="${src.dir}/com/nokia/ant/antlib.xml" todir="${build.temp.dir}/class/com/nokia/ant" />
+
+        <jar basedir="${build.temp.dir}/class" destfile="${build.temp.dir}/lib/nokia_ant.jar" update="true">
+            <manifest>
+                <attribute name="Built-By" value="${user.name}" />
+                <section name="common">
+                    <attribute name="Implementation-Title" value="Helium" />
+                    <attribute name="Implementation-Version" value="${helium.version}" />
+                    <attribute name="Implementation-Vendor" value="Nokia" />
+                </section>
+            </manifest>
+        </jar>
+
+        <move file="${build.temp.dir}/lib/nokia_ant.jar" tofile="${helium.java.lib.dir}/nokia_ant.jar" />
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-build" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium"> 
+    <description>
+        Helium targets to build helium itself.
+    </description>
+    <property environment="env"/>
+    
+    <property name="build.drive" location="${env.TEMP}/helium/temp_drive"/>
+    <mkdir dir="${build.drive}/"/> 
+    
+    <property file="${helium.dir}/config/version.txt"/>
+    <property name="release.label" value="${helium.version}"/>
+    
+    <import file="build-jar.ant.xml"/>
+    <import file="helium.ant.xml"/>
+    <import file="tools/startup/antserver/antserver.ant.xml"/>
+         
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/antlint_config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlint_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlint>
+    <checks name="TabCharacter"/>
+    <checks name="PropertyName">([a-z0-9[\\d\\_\\.\\@\\{\\}\\$]]*)</checks>
+    <checks name="TargetName">([a-z0-9[\\d\\-]]*)</checks>
+    <checks name="Indentation"/>
+    <checks name="PresetDefMacroDefName">([a-z0-9][a-zA-Z0-9]*)</checks>
+    <checks name="ProjectName">([a-z0-9[\\d\\.\\_\\-]]*)</checks>
+    <checks name="Description"/>
+    <checks name="FileName">^build.xml$|ant.xml$|antlib.xml$</checks>
+    <checks name="RunTarget"/>
+    <checks name="AntCall"/>
+</antlint>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/capabilities_config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : capabilities_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<data>
+  <version>3.1.0.5</version>
+  <allowed>
+    <tcb>
+      <exe>e32strt.exe</exe>
+      <exe>efile.exe</exe>
+      <exe>ekern.exe</exe>
+      <exe>installserver.exe</exe>
+      <exe>IntegrityCheck.exe</exe>
+      <exe>nandloader.exe</exe>
+      <exe>nandloader_unistore2.exe</exe>
+      <exe>sisregistryserver.exe</exe>
+      <exe>sospmmhandler.exe</exe>
+      <exe>usbmsapp.exe</exe>
+    </tcb>
+    <allfiles>
+      <exe>AccServer.exe</exe>
+      <exe>akncapserver.exe</exe>
+      <exe>aknnfysrv.exe</exe>
+      <exe>appmngr.exe</exe>
+      <exe>CentRepToolServer.exe</exe>
+      <exe>cuimsg.exe</exe>
+      <exe>cuistartup.exe</exe>
+      <exe>cpfilehandler.exe</exe>
+      <exe>DcfRepSrv.exe</exe>
+      <exe>e32strt.exe</exe>
+      <exe>EasApplication.exe</exe>
+      <exe>efile.exe</exe>
+      <exe>einfoserver_00.exe</exe>
+      <exe>ekern.exe</exe>
+      <exe>ewsrv.exe</exe>
+      <exe>FileManager.exe</exe>
+      <exe>idle.exe</exe>
+      <exe>ImageEditor.exe</exe>
+      <exe>installserver.exe</exe>
+      <exe>IntegrityCheck.exe</exe>
+      <exe>integrityserver.exe</exe>
+      <exe>javadrmrlserver.exe</exe>
+      <exe>javahelperserver.exe</exe>
+      <exe>javasecurebackup.exe</exe>
+      <exe>mceserver.exe</exe>
+      <exe>MemScanServ.exe</exe>
+      <exe>Menu2.exe</exe>
+      <exe>mmcapp.exe</exe>
+      <exe>nandloader.exe</exe>
+      <exe>nandloader_unistore2.exe</exe>
+      <exe>ncpkickstart.exe</exe>
+      <exe>nsmldmhostserver1.exe</exe>
+      <exe>RfsServer.exe</exe>
+      <exe>SatServer.exe</exe>
+      <exe>sbengine.exe</exe>
+      <exe>sbenginenojava.exe</exe>
+      <exe>sisregistryserver.exe</exe>
+      <exe>Starter.exe</exe>
+      <exe>startup.exe</exe>
+      <exe>sysstart.exe</exe>
+      <exe>SWInstSvrUI.exe</exe>
+      <exe>SystemAMSCore.exe</exe>
+      <exe>TerminalControl.exe</exe>
+      <exe>usbmsapp.exe</exe>
+    </allfiles>
+    <drm>
+      <exe>ContentListingServer.exe</exe>
+      <exe>cuimusicplayer.exe</exe>
+      <exe>DRMPlayServer.exe</exe>
+      <exe>DRMRightsManager.exe</exe>
+      <exe>ekern.exe</exe>
+      <exe>hmidp92.exe</exe>
+      <exe>hmidp92_minimal.exe</exe>
+      <exe>ImageEditor.exe</exe>
+      <exe>LWPlayer.exe</exe>
+      <exe>MCServer.exe</exe>
+      <exe>MediaGallery2.exe</exe>
+      <exe>MediaPlayer.exe</exe>
+      <exe>MGLUtilityServer.exe</exe>
+      <exe>musicplayer.exe</exe>
+      <exe>MusicShopApp.exe</exe>
+      <exe>MusicStore.exe</exe>
+      <exe>nandloader.exe</exe>
+      <exe>nandloader_unistore2.exe</exe>
+      <exe>ncpkickstart.exe</exe>
+      <exe>Phone.exe</exe>
+      <exe>pwmdrmserv.exe</exe>
+      <exe>RightsServer.exe</exe>
+      <exe>WMDRMKeyServer.exe</exe>
+    </drm>
+  </allowed>
+  <forbidden>
+    <exe>AHDemoApp.exe</exe>
+    <exe>AknFSIDemo.exe</exe>
+    <exe>AknSoundTest.exe</exe>
+    <exe>AlignApp.exe</exe>
+    <exe>AnimApp.exe</exe>
+    <exe>ATSInterface.exe</exe>
+    <exe>Bappea.exe</exe>
+    <exe>BappeaProf.exe</exe>
+    <exe>bbcapslimited.exe</exe>
+    <exe>bbcapsmod.exe</exe>
+    <exe>bmpanapp.exe</exe>
+    <exe>btaudiotester.exe</exe>
+    <exe>BURTestServer.exe</exe>
+    <exe>cascade.exe</exe>
+    <exe>CbaApp.exe</exe>
+    <exe>ced.exe</exe>
+    <exe>ceddump.exe</exe>
+    <exe>centrepperftest.exe</exe>
+    <exe>closelogger.exe</exe>
+    <exe>Codetest.exe</exe>
+    <exe>ColorCard.exe</exe>
+    <exe>ColorTest.exe</exe>
+    <exe>ConnTest.exe</exe>
+    <exe>ConsoleUI.exe</exe>
+    <exe>crashread.exe</exe>
+    <exe>creator.exe</exe>
+    <exe>dlgapp.exe</exe>
+    <exe>disksuck.exe</exe>
+    <exe>dptester.exe</exe>
+    <exe>DRMEncryptor.exe</exe>
+    <exe>DRMUtilApp.exe</exe>
+    <exe>dtest.exe</exe>
+    <exe>EditConf.exe</exe>
+    <exe>epos_comasuplpostestermodulecfg.exe</exe>
+    <exe>eshell.exe</exe>
+    <exe>filebrowse.exe</exe>
+    <exe>filebrowser.exe</exe>
+    <exe>FileBrowserFileOpServer.exe</exe>
+    <exe>FtdGwcTest.exe</exe>
+    <exe>ftdbserver.exe</exe>
+    <exe>ftp.exe</exe>
+    <exe>Goofy.exe</exe>
+    <exe>gwstestexecute.exe</exe>
+    <exe>httpexampleclient.exe</exe>
+    <exe>htifilehlp.exe</exe>
+    <exe>htiipcommserver.exe</exe>
+    <exe>htiwatchdog.exe</exe>
+    <exe>htiframework.exe</exe>
+    <exe>layouttest.exe</exe>
+    <exe>Launcher.exe</exe>
+    <exe>MemFailAppStart.exe</exe>
+    <exe>memsuck.exe</exe>
+    <exe>MIDP2smstestrunner.exe</exe>
+    <exe>MIDP2Test.exe</exe>
+    <exe>mmctest.exe</exe>
+    <exe>OtaTestServer.exe</exe>
+    <exe>pipeconsumer.exe</exe>
+    <exe>pipeconsumer2.exe</exe>
+    <exe>pipeconsumer3.exe</exe>
+    <exe>pipeproducer.exe</exe>
+    <exe>pipeproducer2.exe</exe>
+    <exe>pipeproducer3.exe</exe>
+    <exe>PSYCRTester.exe</exe>
+    <exe>psytester.exe</exe>
+    <exe>ResFileDump.exe</exe>
+    <exe>resettest.exe</exe>
+    <exe>rfileloggerserver.exe</exe>
+    <exe>_rohid_ced.exe</exe>
+    <exe>_rohid_ceddump.exe</exe>
+    <exe>runtests.exe</exe>
+    <exe>rtautils.exe</exe>
+    <exe>rtaserver.exe</exe>
+    <exe>scheduletest.exe</exe>    
+    <exe>Sender.exe</exe>
+    <exe>setcap.exe</exe>
+    <exe>spdhelper.exe</exe>
+    <exe>spdcommserver_bluetooth.exe</exe>
+    <exe>ShutDownTest.exe</exe>
+    <exe>ScreenGrabber.exe</exe>
+    <exe>spdcommserver.exe</exe>
+    <exe>statapi.exe</exe>
+    <exe>statlite.exe</exe>
+    <exe>stifstarter.exe</exe>
+    <exe>stiftestframework.exe</exe>
+    <exe>suspender.exe</exe>
+    <exe>SVGPerfTest.exe</exe>
+    <exe>systemswtest.exe</exe>
+    <exe>tefutilityserver.exe</exe>
+    <exe>tefcleanup.exe</exe>
+    <exe>testcontrol.exe</exe>
+    <exe>testexecute.exe</exe>
+    <exe>testexecutelogengine.exe</exe>
+    <exe>testexecutelogengineext.exe</exe>
+    <exe>testinvalidipcargs.exe</exe>
+    <exe>TestServerStarter.exe</exe>
+    <exe>trkapp.exe</exe>
+    <exe>TrkConsole.exe</exe>
+    <exe>TrkTcbServer.exe</exe>
+    <exe>XnThemeManagerTestApp.exe</exe>
+    <exe>xtatestapp.exe</exe>
+    <exe>taskmgr.exe</exe>
+    <exe>THelper.exe</exe>
+    <exe>t_acc.exe</exe>
+    <exe>t_cenrep.exe</exe>
+    <exe>t_cenreptrans.exe</exe>
+    <exe>t_cenrep_back_rest.exe</exe>
+    <exe>t_cenrep_back_rest_defect.exe</exe>
+    <exe>t_cenrep_back_rest_delete.exe</exe>
+    <exe>t_cenrep_cache.exe</exe>
+    <exe>t_cenrep_defects.exe</exe>
+    <exe>t_cenrep_meta.exe</exe>
+    <exe>t_cenrep_platsec.exe</exe>
+    <exe>t_cenrep_preq752.exe</exe>
+    <exe>t_cenrep_rfs.exe</exe>
+    <exe>t_cenrep_transactions.exe</exe>
+    <exe>t_certstore.exe</exe>
+    <exe>t_crypto.exe</exe>
+    <exe>t_deletedirallfiles.exe</exe>
+    <exe>t_deletefileallfiles.exe</exe>
+    <exe>t_disp.exe</exe>
+    <exe>t_display.exe</exe>
+    <exe>t_fsysbm.exe</exe>
+    <exe>t_keystore.exe</exe>
+    <exe>t_keypad.exe</exe>
+    <exe>t_killprocess.exe</exe>
+    <exe>t_mmc.exe</exe>
+    <exe>t_mmcpw.exe</exe>
+    <exe>t_oeexport.exe</exe>
+    <exe>t_oeexport1.exe</exe>
+    <exe>t_oomcenrepsrv.exe</exe>
+    <exe>t_security.exe</exe>
+    <exe>t_se_api.exe</exe>
+    <exe>t_ssi.exe</exe>
+    <exe>t_usb.exe</exe>
+    <exe>t_wlandriver.exe</exe>
+    <exe>ucccontrolte.exe</exe>
+    <exe>xkon.exe</exe>
+    <exe>xtatestapp.exe</exe>
+  </forbidden>
+  <excluded>
+    <exe>crashread2.exe</exe>
+    <exe>d_exc.exe</exe>
+    <exe>d_exc_mc.norm.exe</exe>
+    <exe>d_exc_mc.sdram.exe</exe>
+    <exe>mobilecrashstarter.exe</exe>
+    <exe>selftestserver.exe</exe>
+    <exe>_aalto_e32strt.exe</exe>
+    <exe>_aalto_e32strt_minios.exe</exe>
+    <exe>_h2_e32strt.exe</exe>
+    <exe>_h2_ekern.exe</exe>
+    <exe>_h2_paging_ekern.exe</exe>
+    <exe>_h2_usbboot.exe</exe>
+    <exe>_h4hrp_bootldr.exe</exe>
+    <exe>_h4hrp_bootldr_me.exe</exe>
+    <exe>_h4hrp_e32strt.exe</exe>
+    <exe>_h4hrp_e32strt_me.exe</exe>
+    <exe>_h4hrp_ekern.exe</exe>
+    <exe>_h4hrp_paging_ekern.exe</exe>
+    <exe>_h4hrp_restartota.exe</exe>
+    <exe>_h4hrp_usbboot.exe</exe>
+    <exe>_h4hrp_usbmsapp.exe</exe>
+    <exe>_integrator_cm1136_e32strt.exe</exe>
+    <exe>_integrator_cm1136_ekern.exe</exe>
+    <exe>_lubbock_e32strt.exe</exe>
+    <exe>_lubbock_ekern.exe</exe>
+    <exe>_lubbock_paging_ekern.exe</exe>
+    <exe>_rapido_e32strt.exe</exe>
+    <exe>_rapido_e32strt_minios.exe</exe>
+    <exe>_rapido_ekern.exe</exe>
+    <exe>_reka2_ekern.exe</exe>
+    <exe>_teflon_e32strt.exe</exe>
+    <exe>_teflon_e32strt_minios.exe</exe>
+    <exe>_teflon_ekern.exe</exe>
+    <exe>_template_ekern.exe</exe>
+  </excluded>
+</data>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/diamonds_config.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : diamonds_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<configuration>
+<config>
+    <template-dir path="${ant['helium.dir']}/tools/common/templates/diamonds" />
+    <output-dir path="${ant['build.log.dir']}"/>
+    <property name="smtpserver" value="email.smtp.server" />
+    <property name="ldapserver" value="email.ldap.server" />
+    <property name="initialiser-target-name" value="diamonds" />
+    <server>
+        <property name="host" value="diamonds.host" />
+        <property name="port" value="diamonds.port" />
+        <property name="path" value="diamonds.path" />
+        <property name="tstampformat" value="yyyy-MM-dd'T'HH:mm:ss" />
+        <property name="mail" value="diamonds.mail" />
+        <property name="category-property" value="build.family" />
+        <property name="buildid-property" value="diamonds.build.id" />
+    </server>
+</config>
+<logger>
+    <stages>
+        <stage name="pre-build" start="prep" end="prebuild" />
+        <stage name="build" start="compile-main" end="compile-main" />
+        <stage name="post-build" start="postbuild" end="zip-localised" />
+        <stage name="release" start="publish-variants" end="final" />
+    </stages>
+    <targets>
+        <target name="diamonds" template-file="tool.xml.ftl" 
+            logfile="${ant['temp.build.dir']}/build/doc/ivy/tool-dependencies-${ant['build.type']}.xml" ant-properties="true"/>        
+        <#if (ant?keys?seq_contains('metadata.enable'))>
+            <target name="compile-main" />
+        <#else>
+            <target name="compile-main" template-file="compile.xml.ftl"
+                logfile="${ant['diamonds.compile.summary']}" ant-properties="true"/>
+        </#if>
+            
+        <target name="ido-codescanner" template-file="codescanner.xml.ftl"
+            logfile="${ant['ido.codescanner.output.dir']}/problemIndex.xml"/>
+
+        <!-- if no logfile provided, looks for xml file to send 
+            using <build.id_target_name.xml> file or<target_name.xml> file, 
+            if both doesn't exists does nothing. tries to pass ant properties
+            and sends it.-->
+            
+        <target name="create-bom"/>
+
+        <target name="rndsdk-create-api-descr-xml" template-file="apimetrics.xml.ftl"
+            logfile="${ant['build.drive']}/output/apidescr/apidescr.xml"/>
+            
+        <#if (ant?keys?seq_contains('validate.policy.log'))>
+        <target name="render-validate-policy" template-file="validate-policy-log.xml.ftl" 
+            logfile="${ant['validate.policy.log']}"/>
+        </#if>
+
+        <!-- defer will store all the converted output file and sends only if there any other
+            stage / target starts to send some data to diamonds -->
+        <target name="check-tool-dependencies" template-file="tool.xml.ftl" 
+            logfile="${ant['temp.build.dir']}/build/doc/ivy/tool-dependencies-${ant['build.type']}.xml" ant-properties="true"
+            defer="true"/>
+    </targets>
+</logger>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/epydoc.conf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+[epydoc]
+
+output: html
+
+target: doc/api/python/
+
+docformat: restructuredtext
+
+verbosity: 2
+
+parse: yes
+introspect: no
+
+imports: no
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/helium_data_model.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2694 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium_data_model.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!--
+
+This describes the allowed values for some of the fields:
+
+property:
+- editStatus: [must, recommended, allowed, discouraged, never] 
+  type: [string, boolean, integer]
+
+-->
+<heliumDataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\tools\common\schema\helium_data_model.xsd">
+    <property>
+        <name>archive.max.number.of.threads</name>
+        <editStatus>allowed</editStatus>
+        <type>integer</type>
+        <description>Set the maximum number of threads running for archiving (for a parallel job).</description>
+    </property>
+    <property>
+        <name>ats.ctc.host</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example "10.0.0.1". If not given, code coverage reports are not created</description>
+    </property>
+    <property>
+        <name>ats.testrun.name</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions</description>
+    </property>
+    <property>
+        <name>ats.plan.name</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan" </description>
+    </property>
+    <property>
+        <name>ats.trace.enabled</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Should be "True" if tracing is needed during the tests running on ATS3. Deafault value is "False", the values are case-sensitive. </description>
+    </property>
+    <property>
+        <name>ats.ctc.enabled</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Deafault value is "False", the values are case-sensitive. </description>
+    </property>
+    <property>
+        <name>ats.email.list</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses.</description>
+    </property>
+    <property>
+        <name>ats.aste.email.list</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses.</description>
+    </property>
+    <property>
+        <name>ats.flashfiles.minlimit</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files.</description>
+    </property>
+    <property>
+        <name>ats.sisfiles.minlimit</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Limit of minimum number of sis files to execute matti-test target, otherwise MATTI-drop.zip will not be generated. Default value is "1" files.</description>
+    </property>
+    <property>
+        <name>ats.target.platform</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Sets target platform for compiling test components. Default value is "armv5 urel".</description>
+    </property>
+    <property>
+        <name>ats.test.timeout</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>To set test commands execution time limit on ATS3 server, in seconds. Default value is "60".</description>
+    </property>
+    <property>
+        <name>ats.product.hwid</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set.</description>
+    </property>
+    <property>
+        <name>ats.obey.pkgfiles.rule</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>If the property is set to "True", then the only test components which will have PKG files, will be included into the test.xml as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is False.</description>
+    </property>
+    <property>
+        <name>tsrc.data.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The default value is "data" and refers to the 'data' directory under 'tsrc' directory.</description>
+    </property>
+    <property>
+        <name>tsrc.path.list</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te layers.sysdef.xml files to get compiled. 
+        Not recommended, but the property value can be set if there are no system definition file(s), and tsrc directories paths to set manually.</description>
+    </property>
+    <property>
+        <name>ats.flash.images</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>List of flash images (.fpsx files) to install on the phone. It is not recommended to set the value manually however, it is possible.</description>
+    </property>
+    <property>
+        <name>ats.report.location</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Sets ATS reports store location. Default location is "${publish.dir}/${publish.subdir}"</description>
+    </property>
+    <property>
+        <name>ats.drop.file</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Path for creation of the drop file during the build. Default is ATS3Drop.zip</description>
+    </property>
+    <property>
+        <name>ats.aste.drop.file</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Path for creation of the drop file during the build. Default is ATS3AsteDrop.zip</description>
+    </property>
+    <property>
+        <name>ats.product.name</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Name of the product to be tested. For example: "PRODUCT"</description>
+    </property>
+    <property>
+        <name>ats.script.type</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>There are two types of ats script files to send drop to ATS server, "runx" and "import"; 
+        only difference is that with "import" ATS doesn't have to have access rights to testdrop.zip file, 
+        as it is sent to the system over http and import doesn't need network shares. 
+        If that is not needed "import" should not be used. Default value is "runx" as "import" involves heavy processing on ATS server</description>
+    </property>
+    <property>
+        <name>ats.drop.location</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Server location (UNC path) to save the ATS3Drop file, before sending to the ATS. For example: \\trwsem00\some_folder\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location,  its value can be any local folder on build machine, for example c:\temp (no network share needed).</description>
+    </property>
+    <property>
+        <name>ats.aste.testrun.name</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions</description>
+    </property>
+    <property>
+        <name>ats.aste.plan.name</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan" </description>
+    </property>
+    <property>
+        <name>disable.analysis.tool</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Set this property to disable Analysis Tool. By default Analysis Tool will run with every build and send api metrics to diamonds but Analysis Tools takes time.</description>
+    </property>
+    <property>
+        <name>drop.file.counter</name>
+        <editStatus>never</editStatus>
+        <type>integer</type>
+        <description>Drop package file counter. Updates its value automatically when a new drop file is created for ATS.</description>
+    </property>
+    <property>
+        <name>ido.build.filter</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Property is used to define ido build filters in the configuration file.</description>
+    </property>
+    <property>
+        <name>ats.server</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>For example: "4fio00105" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product.</description>
+    </property>
+    <property>
+        <name>ats.password</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Password for ATS. This password might be different from NOE or HTTP/UNIX password.</description>
+    </property>
+    <property>
+        <name>ats.username</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Username for ATS server. This is NOT the NOE or HTTP/UNIX username.</description>
+    </property>
+    <property>
+        <name>eunit.test.package</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The EUnit package name to be unzipped on the environment, for executing EUnit tests."</description>
+    </property>
+    <property>
+        <name>eunitexerunner.flags</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off".</description>
+    </property>
+    <property>
+        <name>cache.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Root directory where Helium can store files on a temporary basis for a user.</description>
+    </property>
+    <property>
+        <name>log4j.cache.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Log directory for log4j.</description>
+    </property>
+    <property>
+        <name>build.cache.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Directory where Helium can store files on a temporary basis for a user per build.</description>
+    </property>
+    <property>
+        <name>build.cache.log.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Directory where Helium can store log files on a temporary basis for a user per build.</description>
+    </property>
+    <property>
+        <name>build.duplicates.log</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Default name of the build duplicates log file.</description>
+    </property>
+    <property>
+        <name>build.version</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Version of the build.</description>
+    </property>
+    <property>
+        <name>build.drive</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Substed drive where the build is performed. if not defined then helium should search next available build drive letter and subst autometically</description>
+    </property>
+    <property>
+        <name>unsubst.after.build</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Unsubsted drive after build finished. If not defined then helium should left the drive as subst. Set the value as "yes" if you want to unsubst after build finished. </description>
+    </property>
+    <property>
+        <name>build.id</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>A unique ID for the build.</description>
+    </property>
+    <property>
+        <name>zip.wa.file</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>A unique name for the WA Sources ZIP file.</description>
+    </property>
+    <property>
+        <name>binary.root</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines location of binaries created in build. Used in check-capability target while generating capability scan report.</description>
+    </property>
+    <property>
+        <name>build.log</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines name of the log file.</description>
+    </property>
+    <property>
+        <name>build.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the build logs are stored.</description>
+    </property>
+    <property>
+        <name>build.signal.status.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the signal related files are stored.</description>
+    </property>
+    <property>
+        <name>build.status.email.template</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>This is the email template path where it updates the build status based on metadata database contents. The default file could (email_status.html.ftl under tools\common\template\log)be used as the base and any additional info could be added</description>
+    </property>
+    <property>
+        <name>build.logging.key.stages</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description> Defines which stages are considered as key stages and logged.</description>
+    </property>
+    <property>
+        <name>build.logging.start.stage</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Defines at which point logging is started.</description>
+    </property>
+    <property>
+        <name>build.name</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>A general label for this type of build. Currently if not defined, product.name will be used to set this property, but this will likely be removed in future.</description>
+    </property>
+    <property>
+        <name>build.output.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory where build output is placed.</description>
+    </property>
+    <property>
+        <name>build.property.cache.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>A file where persistent properties for a build should be stored.</description>
+    </property>
+    <property>
+        <name>build.sisfiles.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory where sisfiles are placed.</description>
+    </property>
+    <property>
+        <name>build.summary.file</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is the file where build summary is stored.</description>
+    </property>
+    <property>
+        <name>build.system</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>This specifies which build system is used. Default for this is ebs You can use ec for Electric Cloud..</description>
+    </property>
+    <property>
+        <name>build.system.ebs</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defined if build.system is set to "ebs", which is the default.</description>
+    </property>
+    <property>
+        <name>build.system.sbs</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defined if ${build.system} is set to "sbs".</description>
+    </property>
+    <property>
+        <name>build.temp.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>A directory for storing temporary build files.</description>
+    </property>
+    <property>
+        <name>build.type</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The general type of the build. This is used for checking the tools environment. Potential values include core, ido, product.</description>
+    </property>
+    <property>
+        <name>build.errors.limit</name>
+        <editStatus>allowed</editStatus>
+        <type>number</type>
+        <description>Maximum allowable errors in a build.</description>
+    </property>
+    <property>
+        <name>canonical.sysdef.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path of the generated canonical System Definition file that contains all the input System Definition file content.</description>
+    </property>
+    <property>
+        <name>ccm.base.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Directory where CCM operations will be performed.</description>
+    </property>
+    <property>
+        <name>ccm.home.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Home directory of CCM operations.</description>
+    </property>
+    <property>
+        <name>ccm.database</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Name of the CCM database to use. No default value.</description>
+    </property>
+    <property>
+        <name>ccm.cache.xml</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the cache.xml file which enables global synergy sessions.</description>
+    </property>
+    <property>
+        <name>ccm.database.path</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Path of the CCM database. No default value</description>
+    </property>
+    <property>
+        <name>ccm.enabled</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines that property if you want the ccm-get-input step to be run during the build area preparation.</description>
+    </property>
+    <property>
+        <name>ccm.engine.host</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Engine host of CCM database. No default value.</description>
+    </property>
+    <property>
+        <name>ccm.user.login</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Contains the user name for CCM by reading the information from .netrc file.</description>
+    </property>
+    <property>
+        <name>ccm.user.password</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Contains the password for CCM user name by reading the information from .netrc file.</description>
+    </property>
+    <property>
+        <name>ccmgetinput</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>To check which ccmgetinput helium will be use </description>
+    </property>
+    <property>
+        <name>ccmtask.python.script.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path for the Python script to handle the ccm task bridge to the ccm.py module.</description>
+    </property>
+    <!-- CMAKER -->
+    <property>
+        <name>cmaker.component.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of the cmaker component to install it.</description>
+    </property>
+    <property>
+        <name>cmaker.config.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Directory where to execute cMaker.</description>
+    </property>
+    <property>
+        <name>cmaker.log.label</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Custom label added to the cmaker logs.</description>
+    </property>
+    <property>
+        <name>cmaker.pp.version</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Version of PP(NCP) configuration to be exported</description>
+    </property>
+    <property>
+        <name>cmaker.s60.version</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Version of S60(require cmaker.pp.version to be set) configuration to be exported</description>
+    </property>
+    <property>
+        <name>common.overlay.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Location of the common overlay.</description>
+    </property>
+    <property>
+        <name>current.env.config</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Internal property used for environment setting in the beginning of the build.</description>
+    </property>
+    <property>
+        <name>ctool.region.china</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>.</description>
+    </property>
+    <property>
+        <name>ctool.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the configuration tool.</description>
+    </property>
+    <property>
+        <name>ctool.western.conf</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>configuration for the western variant.</description>
+    </property>
+    <property>
+        <name>ctool.china.conf</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>configuration for the chinese variant.</description>
+    </property>
+    <property>
+        <name>ctool.japan.conf</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>configuration for the japanese variant.</description>
+    </property>
+    <property>
+        <name>customer.makefile.target</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Default makefile target for running customer iMaker ROM building.</description>
+    </property>
+    <property>
+        <name>data.model.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The data model XML file for the Ant configuration.</description>
+    </property>
+    <property>
+        <name>data.model.parsed</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The data model XML file for the Ant configuration parsed.</description>
+    </property>
+    <property>
+        <name>delta.ant.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp file</description>
+    </property>
+    <property>
+        <name>delta.zip.delete.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Special Instructions file for SymDEC</description>
+    </property>
+    <property>
+        <name>delta.zip.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The zip file</description>
+    </property>
+    <property>
+        <name>delta.zip.location</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Output location</description>
+    </property>
+    <property>
+        <name>delta.zip.temp.location</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp location</description>
+    </property>
+    <property>
+        <name>delta.zip.file.size</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Define the file size of the zipped up released file, this is then used by delta
+         zipping code to determine if a delta zip is required or a full zip should be created.
+         The delta zip will only be published if it is less than 1/2 the size of this property 
+         </description>
+    </property>
+    <property>
+        <name>diamonds.compile.summary</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Compilation summary file for diamonds.</description>
+    </property>
+    <property>
+        <name>diamonds.listener.configuration.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Diamonds Configuration file with full path used for diamonds listener.</description>
+    </property>
+    <property>
+        <name>antlib.import.module.path</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path where ant XML files dynamically downloaded from jar file.</description>
+    </property>
+    <property>
+        <name>diamonds.build.id</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The ID assigned to the build by the Diamonds server.</description>
+    </property>
+    <property>
+        <name>diamonds.build.url</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The full URL to the build entry on the Diamonds server.</description>
+    </property>
+    <property>
+        <name>diamonds.host</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Diamonds server's host address.</description>
+    </property>
+    <property>
+        <name>diamonds.path</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Diamonds server build location.</description>
+    </property>
+    <property>
+        <name>diamonds.port</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Diamonds server port number.</description>
+    </property>
+    <property>
+        <name>diamonds.mail</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Email address of diamonds server.</description>
+    </property>
+    <property>
+        <name>diamonds.schema</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Diamonds rest api schema.</description>
+    </property>
+    <property>
+        <name>documentation.host</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The host server where the Helium documentation is stored.</description>
+    </property>
+    <property>
+        <name>documentation.path.root</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The root of the path on the host server where the Helium documentation is stored.</description>
+    </property>
+    <property>
+        <name>documentation.path</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The full path on the host server where the Helium documentation is stored.</description>
+    </property>
+    <property>
+        <name>diamonds.target.list.to.log</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>List of targets that should be logged in to Diamonds.</description>
+    </property>
+    
+    <property>
+        <name>documentation.url.root</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Root location of the Helium release documentation.</description>
+    </property>
+    
+    <property>
+        <name>log.target</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Enables logging of the start and end of individual targets.</description>
+    </property>
+    <property>
+        <name>log4j.configuration</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the path to log4j configuration.</description>
+    </property>
+    
+    <property>
+        <name>call.cleanup</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Ensures the cleanup-all target is called when the build finishes.</description>
+    </property>
+    <property>
+        <name>sbs.config</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Configurations for which the components to be built(armv5,winscw)</description>
+    </property>
+    <property>
+        <name>skip.sbs.layer.generation</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>skip sbs layer filtering (true) for new schema and false for schema 1.4.0</description>
+    </property>
+    <property>
+        <name>ec.allow.duplicates</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Setting this to "1" will force xml2mak to generate only warnings (instead of errors) for duplicate components in the component list</description>
+    </property>
+    <property>
+        <name>ec.emake</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location of emake tool.</description>
+    </property>
+    <property>
+        <name>ec.history.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This specifies the directory where Electric Cloud history files are stored. 
+        Currently defined in helium.ant.xml and mapped related to publish.root.dir</description>
+    </property>
+    <property>
+        <name>ec.historyfile</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Temporary location of the EC history file used by the current build.</description>
+    </property>
+    <property>
+        <name>ec.makefile.file</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location of the Makefile generated to run the EC build.</description>
+    </property>
+    <property>
+        <name>ec.maxagents</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Maximum number of agent to be used</description>
+    </property>
+    <property>
+        <name>ec.history.option</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Should be create for single node build and merge for multi node build.</description>
+    </property>
+    <property>
+        <name>ec.mode</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>mode is either serial / parallel - default is parallel</description>
+    </property>
+    <property>
+        <name>week.number</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>this is used to identify the history files based on releases</description>
+    </property>
+    <property>
+        <name>branch.name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>this along with week.number used to find proper history file based on releases.</description>
+    </property>
+    <property>
+        <name>ec.scripts.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>ec scripts location</description>
+    </property>
+    <property>
+        <name>ec.sysdef2make</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of sysdef2make.pl file, which is used to translate system definition files to make files. Internal property that normally does not require changes.</description>
+    </property>
+    <property>
+        <name>ec.tools.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location of EC-tools. Passed to environment variable EC_TOOLS_DIR, when calling ecbuild_electric.cmd to execute Electric Cloud build.</description>
+    </property>
+    <property>
+        <name>email.ldap.server</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Network address of the LDAP server.</description>
+    </property>
+    <property>
+        <name>ldap.organization.unit.rootdn</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Organization root DN for LDAP server.</description>
+    </property>
+    <property>
+        <name>ldap.people.rootdn</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>People root DN for LDAP server.</description>
+    </property>
+    <property>
+        <name>email.ldap.rootdn</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Root distinguished name of the LDAP server.</description>
+    </property>
+    <property>
+        <name>email.smtp.server</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Network address of the SMTP server.</description>
+    </property>
+    <property>
+        <name>skip.ats.sending</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Skips sending drop package file to ATS/ASTE after its creation.</description>
+    </property>
+    <property>
+        <name>skip.build.duplicates</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>This allow you to skip the build duplciates log generation.</description>
+    </property>
+    <property>
+        <name>skip.codescanner</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Skip the codescanner target if true (true/yes/on).</description>
+    </property>
+    <property>
+        <name>skip.policy-validation</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Skip the policy validation target if true (true/yes/on).</description>
+    </property>
+    <property>
+        <name>codescanner.config</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the location of a custom configuration for codescanner.</description>
+    </property>
+    <property>
+        <name>codescanner.format</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the format of Codescanner output (html|xml|std).</description>
+    </property>
+    <property>
+        <name>codescanner.log.unique</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines if the folder for Codescanner output is unique (on|off).</description>
+    </property>
+    <property>
+        <name>file-comparison.bcomp_path</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the location of BComp.exe.</description>
+    </property>
+    <property>
+        <name>file-comparison.bcomp_conf</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the location of Beyond Compare configuration file.</description>
+    </property>
+    <property>
+        <name>file-comparison.left_side</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>The fileset id used on the left side of comparison.</description>
+    </property>
+    <property>
+        <name>file-comparison.right_side</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>The fileset id used on the right side of comparison.</description>
+    </property>
+    <property>
+        <name>file-comparison.output</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the location where comparison output should be put.</description>
+    </property>
+    <property>
+        <name>file-comparison.left_name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the name of the folder for the left side of comparison.</description>
+    </property>
+    <property>
+        <name>file-comparison.right_name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the name of the folder for the right side of comparison.</description>
+    </property>
+    <property>
+        <name>file-comparison.regexp.from</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the regexp pattern (in ANT-pattern style) which to mach from given filesets.</description>
+    </property>
+    <property>
+        <name>file-comparison.regexp.to</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the regexp pattern (in ANT-pattern style) what to use in (possible) replacement.</description>
+    </property>
+    <property>
+        <name>skip.compile-ec-patch</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>If defined it skips the buildtools emake patching.</description>
+    </property>
+    <property>
+        <name>ee_roms.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>ee log file location</description>
+    </property>
+    <property>
+        <name>ee.makefile.target</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines make target that is run when creating engineer english images.</description>
+    </property>
+    <property>
+        <name>epocroot</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>epocroot path</description>
+    </property>
+    <property>
+        <name>ext.java.lib.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>External ant library path</description>
+    </property>
+    <property>
+        <name>genxml.output.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path for the output XML file generated by genxml used as input to EBS or EC.</description>
+    </property>
+    <property>
+        <name>genxml.output.file.suffix</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Suffix used in genxml related output files. This value is added into file names to show that they are genxml related. Used in log files, genxml output files and component list for EE images. Normally does not need to be set.</description>
+    </property>
+    <property>
+        <name>helium.build.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path where Helium-specific outputs are written to.</description>
+    </property>
+    <property>
+        <name>helium.doc.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of helium doc src.</description>
+    </property>
+    <property>
+        <name>helium.ccm.workarea.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The path to a Synergy work area used for updating Helium releases.</description>
+    </property>
+    <property>
+        <name>helium.svn.url</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>SVN URL where to find Helium.</description>
+    </property>
+    <property>
+        <name>helium.java.lib.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>helium java library location</description>
+    </property>
+    <property>
+        <name>helium.svn.workarea.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The path to a Subversion work area used for updating Helium releases.</description>
+    </property>
+    <property>
+        <name>helium.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the logical path to the helium directory used to start a build.</description>
+    </property>
+    <property>
+        <name>helium.version</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Contains Helium version information</description>
+    </property>
+    <!--
+        IDO codescanner integration.
+    -->
+    <property>
+        <name>ido.codescanner.config</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the location of a custom configuration for codescanner.</description>
+    </property>
+    <property>
+        <name>ido.codescanner.output.dir</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Defines the location of Codescanner output.</description>
+    </property>
+    <property>
+        <name>ido.codescanner.output.type</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines the format of Codescanner output (html|xml|std).</description>
+    </property>
+    <property>
+        <name>ido.keep.old</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Once define this property will enable the backup of old ado before doing the copy.</description>
+    </property>
+    <property>
+        <name>ido.template.robot.ready</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location of the ready.txt FMPP template (override that property if you want to customize the content).</description>
+    </property>
+    <property>
+        <name>robot.email.to</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Comma seperated list of email address.</description>
+    </property>
+    <property>
+        <name>imaker.command</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the iMaker executable file.</description>
+    </property>
+    <property>
+        <name>imaker.engine</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines which accelerator to use for running iMaker. (default value from build.system property)</description>
+    </property>
+    <property>
+        <name>imaker.fmpp.ant</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of the Ant iMaker execution template.</description>
+    </property>
+    <property>
+        <name>imaker.fmpp.makefile</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of the EC iMaker execution template.</description>
+    </property>    
+    <property>
+        <name>tools.ivy.config.file</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The tools dependencies Ivy settings configuration file.</description>
+    </property>
+    <property>
+        <name>loc.output.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The directory that will contain the zipped .loc files zip package.</description>
+    </property>
+    <property>
+        <name>loc.output.filename</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The filename of the zip-loc-files target output zip file.</description>
+    </property>
+    <property>
+        <name>loc.temp.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The location of temporary directory used during zip-loc-files.</description>
+    </property>
+    <property>
+        <name>localisation.files.china</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Localisation files for the China region.</description>
+    </property>
+    <property>
+        <name>localisation.files.japan</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Localisation files for the Japan region.</description>
+    </property>
+    <property>
+        <name>localisation.files.western</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Localisation files for the western region.</description>
+    </property>
+    <property>
+        <name>localisation.makefile.target</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Makefile target that is executed when creating localised rom images (target localisation-roms).</description>
+    </property>
+    <property>
+        <name>localisation.s60locfiles.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of Series 60 localisation input files. Internal property that does not normally needs to be set.</description>
+    </property>
+    <property>
+        <name>localisation.tool</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This key defines which tool should be used to localise the build area (localisation-mcss-localiser or localisation-s60-localiser).</description>
+    </property>
+    <property>
+        <name>localisation.buildfile</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>begining of the localisation buildfile name</description>
+    </property>
+    <property>
+        <name>isis_mktarget.list</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Comma separated list of file names(main, what, check file names)</description>
+    </property>
+    <property>
+        <name>log.build.build_id</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Diamonds logging information.</description>
+    </property>
+    <property>
+        <name>log.build.category</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Diamonds logging information.</description>
+    </property>
+    <property>
+        <name>log.build.computer</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Diamonds logging information.</description>
+    </property>
+    <property>
+        <name>log.build.user</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Diamonds logging information.</description>
+    </property>
+    <property>
+        <name>md5.signature.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Output location of md5 file</description>
+    </property>
+    <property>
+        <name>md5.split</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Number of partial md5 files to use during creation</description>
+    </property>
+    <property>
+        <name>old.md5.file.present</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Is a previous builds md5 being passed manually</description>
+    </property>
+    <property>
+        <name>metadata.db.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the SQLite metadata database file.</description>
+    </property>
+    <property>
+        <name>exclude.test.layers</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Comma seperated excluded test layers. The test components (mentioned in the excluded test layers) will not be included in the ATS test drops</description>
+    </property>
+    <property>
+        <name>delta.exclude.commasep</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Comma seperated excluded directories from the zip</description>
+    </property>
+    <property>
+        <name>old.md5.file</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>A previous builds md5</description>
+    </property>
+    <property>
+        <name>number.of.threads</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>how many parallel threads can run</description>
+    </property>
+    <property>
+        <name>overlays.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the overlays output log file.</description>
+    </property>
+    <property>
+        <name>parse_abld_what.tool</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the parse_what_log.pl tool.</description>
+    </property>
+    <property>
+        <name>prep.root.dir</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The directory where new build area directories are created and substed to the build drive.</description>
+    </property>
+    <property>
+        <name>qmake.enabled</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>If defined the qmake stage will be enabled during compilation.</description>
+    </property>
+    <property>
+        <name>qt.dir</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The location of the Qt framework to build.</description>
+    </property>
+    <property>
+        <name>qt.qmake.ant.template</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The location of the ant template to run qmake commands.</description>
+    </property>
+    <property>
+        <name>qt.qmake.makefile.template</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The location of the makefile template to run qmake commands.</description>
+    </property>
+    <property>
+        <name>qt.configure.args</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The command lines argument passed to the configure tool.</description>
+    </property>
+    <property>
+        <name>qt.qmake.default.args</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Setting default arguments to qMake command line, if the qmakeArgs is defined from the system definition file
+        then those arguments are discarded.</description>
+    </property>
+    <property>
+        <name>qt.configure.log.name</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The name of the Qt configure output log.</description>
+    </property>
+    <property>
+        <name>absolute.prep.root.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This will convert absolute path for prep.root.dir if anybody use relative path.</description>
+    </property>
+    <property>
+        <name>prep.build.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory where the build area is prepared. Once created it is substed to the build.drive.</description>
+    </property>
+    <property>
+        <name>prep.delivery.modificationset</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location where the XML modificationset file should be generated. If not defined the file is not generated. (Usefull for CI systems)</description>
+    </property>
+    <property>
+        <name>publish.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Directory where the build is published (includes build.id)</description>
+    </property>
+    <property>
+        <name>publish.ccm.folder</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Synergy folder where you want your task to be published.</description>
+    </property>
+    <property>
+        <name>publish.base.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Directory where all builds are published. Same as publish.dir but without build.id at the end</description>
+    </property>
+    <property>
+        <name>publish.fileset.ids</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The fileset id which will be upload</description>
+    </property>
+    <property>
+        <name>publish.release.subdir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Subdir part of the publish release dir, relative to publish.root.dir</description>
+    </property>
+    <property>
+        <name>publish.release.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The directory where the release of this build is published to on the local network.</description>
+    </property>
+    <property>
+        <name>release.images.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The directory where flash images of build can be found</description>
+    </property>
+    <property>
+        <name>releasenotes.output</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of output rtf file</description>
+    </property>
+    <property>
+        <name>releasenotes.output.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the directory that will contain the output of release notes creation.</description>
+    </property>
+    <property>
+        <name>releasenotes.props</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Property file with customer values</description>
+    </property>
+    <property>
+        <name>releasenotes.scan2log</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of scan2log HTML file</description>
+    </property>
+    <property>
+        <name>releasenotes.temp.errors</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp file</description>
+    </property>
+    <property>
+        <name>releasenotes.temp.output</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp file</description>
+    </property>
+    <property>
+        <name>releasenotes.temp.props</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp file</description>
+    </property>
+    <property>
+        <name>releasenotes.temp.props2</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp file</description>
+    </property>
+    <property>
+        <name>releasenotes.template</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the name of the release note template used.</description>
+    </property>
+    <property>
+        <name>rombuild.using.var</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Define this property if you build is using Symbian Binary Variation.</description>
+    </property>
+    <property>
+        <name>rombuild.buildinfo.template</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>FMPP template to generate a buildinfo makefile.</description>
+    </property>
+    <property>
+        <name>rombuild.buildinfo.output</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of the output file.</description>
+    </property>
+    <property>
+        <name>rombuild.makefile.name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>The filename of the output makefile generated by Helium for iMaker.</description>
+    </property>
+    <property>
+        <name>roms.spec.name</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Used to select spec-section in rom image configuration for building. Used only for makefpsx.</description>
+    </property>
+    <property>
+        <name>s60.delta.config.prefix</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Define the prefix part of the configuration name that builds delta variant.</description>
+    </property>
+    <property>
+        <name>s60.getenv.trigger.location</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Define the location of the trigger file that should be used by CI.</description>
+    </property>
+    <property>
+        <name>getenv.tool.location</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the location of the getenv.pl script.</description>
+    </property>
+    <property>
+        <name>src.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>java source directory location for helium library</description>
+    </property>
+    <property>
+        <name>subcon.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the subcon ROMs log.</description>
+    </property>
+    <property>
+        <name>subcon.makefile.target</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The name of the makefile target for making subcon ROMs.</description>
+    </property>
+    <property>
+        <name>subcon.zips.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The directory where subcon zips are stored.</description>
+    </property>
+    <property>
+        <name>team</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Used to specify which team configuration is being used. These configuration files are under /mc/mc_build/teams.</description>
+    </property>
+    <property>
+        <name>temp.build.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Directory to store temporary files generated during the process.</description>
+    </property>
+    <property>
+        <name>trace.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the trace ROMs log.</description>
+    </property>
+    <property>
+        <name>trace.makefile.target</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The name of the makefile target for making trace ROMs.</description>
+    </property>
+    <property>
+        <name>uda.makefile.target</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The name of the makefile target for making UDA images.</description>
+    </property>
+    <property>
+        <name>zip.ee.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines log file where to record archiving of engineering english area.</description>
+    </property>
+    <property>
+        <name>zip.subcon.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines log file where to record archiving of subcon environment.</description>
+    </property>
+    <property>
+        <name>zip.subcon_roms.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The log file name for zipping subcon_roms.</description>
+    </property>
+    <property>
+        <name>zip.trace_roms.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The log file name for zipping trace_roms.</description>
+    </property>
+    <property>
+        <name>zip.uda_roms.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The log file name for zipping uda_roms.</description>
+    </property>
+    <property>
+        <name>zips.build.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory where build area is archived after the build has finished. </description>
+    </property>
+    <property>
+        <name>zips.flashfiles.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory where flash files are archived.</description>
+    </property>
+    <property>
+        <name>zips.loc.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory where build area is archived after the localisation.</description>
+    </property>
+    <property>
+        <name>zip.localised.log.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the localization zipping log file.</description>
+    </property>
+    <property>
+        <name>remote.builds.config.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The path to the configuration file for remote builds.</description>
+    </property>
+    <property>
+        <name>local.free.space</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The amount of free space needed on the build machine in Mbs.</description>
+    </property>
+    <property>
+        <name>localisation.language.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defined where to find languages.xml.</description>
+    </property>
+    <property>
+        <name>network.free.space</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Amount of free space in MBs needed on the network drive where the build is published. The ``network.drive`` drive property must also be defined.</description>
+    </property>
+    <property>
+        <name>network.drive</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The drive letter of a substed drive that maps to the network location where the build is published.</description>
+    </property>
+    <property>
+        <name>ec.build.class</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Build class for Electric Cloud. No default value.</description>
+    </property>
+    <property>
+        <name>sbs.tools.config</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>tools configuration to be built</description>
+    </property>
+    <property>
+        <name>sbs.implicit.tools.build</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>uses tools config to be built before building the actual configuration.</description>
+    </property>
+    <property>
+        <name>sysdef.clean.configurations.list</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Comma-separated list of System Definition configuration names to be built in the ido-prep-clean stage. If not defined the sysdef.configurations.list will be used to generate that configuration list.</description>
+    </property>
+    <property>
+        <name>sysdef.configurations.list</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Comma-separated list of System Definition configuration names to be built in the compile-main stage.</description>
+    </property>
+    <property>
+        <name>compile.symbianos</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Property must be set if the Symbian System Definition file is included in a build, in order to do full build from source.</description>
+    </property>
+    <property>
+        <name>publish.subdir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Subdir part of the publish dir, relative to publish.root.dir</description>
+    </property>
+    <property>
+        <name>error.email.to.list</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>List of email addresses where email is sent in case of build failure. No default value</description>
+    </property>
+    <property>
+        <name>release.dir.root</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>This is the directory which points to release-directory root.</description>
+    </property>
+    <property>
+        <name>enabled.ats</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Value must be set to execute ats-test target. for example, 'value="1"'</description>
+    </property>
+    <property>
+        <name>enabled.aste</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Value must be set to execute ats-aste target. for example, 'value="1"'</description>
+    </property>
+    <property>
+        <name>eunit.prepare.zip</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Name of eunit zip file. Need to unzip into build area to start eunit test</description>
+    </property>
+    <property>
+        <name>core.build.version</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>This Defaults to the ${major.version}.${minor.version} combo and is available so that 1 number can be used (dot can be removed)</description>
+    </property>
+    <property>
+        <name>major.version</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Part of a version information that is used to differentiate a build. Major version is the part that changes less frequently. Ie. year.</description>
+    </property>
+    <property>
+        <name>minor.version</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Part of a version information that is used to differentiate a build. Minor version is the part that changes more frequntly. Ie week or a running number.</description>
+    </property>
+    <property>
+        <name>notes.database</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>The Notes database to do DCT5 upload to.</description>
+    </property>
+    <property>
+        <name>notes.release.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The DCT5 Release Notes SW Release Folder (where your build is Published to, so it can be obtained from there.)</description>
+    </property>
+    <property>
+        <name>notes.server</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Lotus notes server name</description>
+    </property>
+    <property>
+        <name>prep.config.file</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Defines configuration file used in prep-copy target. The file defines how files are copied and extracted into build area.</description>
+    </property>
+    <property>
+        <name>prep.delivery.file</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Defines configuration file used in synergy operations (ccm-get-input for example). This file contains definition of projects that are checkouted or snapshotted.</description>
+    </property>
+    <property>
+        <name>product.family</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>In product builds defines the product family that the build product belong to.</description>
+    </property>
+    <property>
+        <name>product.list</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>In product builds defines the list of products that are build in the configuration. Property is used in rom image creation, localisation release notes creation and data packaging.</description>
+    </property>
+    <property>
+        <name>product.printname</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>A printable name for a product used in release notes.</description>
+    </property>
+    <property>
+        <name>product.type</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Project ID in release notes.</description>
+    </property>
+    <property>
+        <name>publish</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Defines whether the build content will be published to the network.</description>
+    </property>
+    <property>
+        <name>is.published</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The value is either true or false depending on whether the publish property is set or not.</description>
+    </property>
+    <property>
+        <name>publish.root.dir</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Defines the root directory of publish feature. Should point into the root of the folder that will contain published nightly builds/releases.</description>
+    </property>
+    <property>
+        <name>releasenotes.logo</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the logo image file which will be used in release notes.</description>
+    </property>
+    <property>
+        <name>relnotes.config.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Defines the directory that contains release notes creation configuration files.</description>
+    </property>
+    <property>
+        <name>sis.config.file</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Configuration file for SIS-file generation.</description>
+    </property>
+    <property>
+        <name>sms.number</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>sms numbers to report error or build information.</description>
+    </property>
+    <property>
+        <name>src</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Source location for junit test class</description>
+    </property>
+    <property>
+        <name>src.classes</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Java source files location for helium library</description>
+    </property>
+    <property>
+        <name>subcon.build.drive</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Build drive for subcon build</description>
+    </property>
+    <property>
+        <name>subcon.prep.config.file</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description> Subcon prep configuration file location </description>
+    </property>
+    <property>
+        <name>subcon.rombuild.config.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>A ROM configuration file for verifying subcon ROMS.</description>
+    </property>
+    <property>
+        <name>rombuild.config.file</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>This key defines where this parsed file will be located.</description>
+    </property>
+    <property>
+        <name>rombuild.config.file.parsed</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Locates the parsed configuration for ROM builds.</description>
+    </property>
+    <property>
+        <name>ee.rom.output.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>/output/development_flash_images/engineering_english/logs</description>
+    </property>
+    <property>
+        <name>core.rom.output.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>/output/release_flash_images/rnd/core</description>
+    </property>
+    <property>
+        <name>selge.ini.network.dir</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>\\\\vcfiler02\\pub\\flash_user\\Crashbin/working\\selge_ini_prep</description>
+    </property>
+    <property>
+        <name>unix.username</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Unix username.</description>
+    </property>
+    <property>
+        <name>unix.username.available</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Equal 0 if the unix username if available</description>
+    </property>
+    <property>
+        <name>unix.password</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Unix password</description>
+    </property>
+    <property>
+        <name>image_creation.copyto</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path for copying the image files default is output/images</description>
+    </property>
+    <property>
+        <name>image_creation.drive</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Drive (environment) to use for creating images</description>
+    </property>
+    <property>
+        <name>variant.image.targetpath</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path for copying the variant image files default is under output/variant_images</description>
+    </property>
+    <property>
+        <name>zips.ee.spec.name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>the value should be "ee"</description>
+    </property>
+    <property>
+        <name>zip.config.file</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Path to the the zip specification file</description>
+    </property>
+    <property>
+        <name>zip.config.file.parsed</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path to the parsed file of zip specification file</description>
+    </property>
+    <property>
+        <name>unix.password.available</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Equal 0 if the unix password if available</description>
+    </property>
+    <property>
+        <name>failonerror</name>
+        <editStatus>never</editStatus>
+        <type>boolean</type>
+        <description>failonerror attribute for exec</description>
+    </property>
+    <property>
+        <name>flash.config.enabled</name>
+        <editStatus>recommended</editStatus>
+        <type>flag</type>
+        <description>Define that property to enable config file generation.</description>
+    </property>
+    <property>
+        <name>compile.signal.input</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Name of the signal input to be able to override the compile-main target.</description>
+    </property>
+    <property>
+        <name>compile.sysdef.dtd.stub</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>compile.sysdef.dtd.stub</description>
+    </property>
+    <property>
+        <name>ec.mem.limit</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>memory limit for EC execution. See user guide for more details</description>
+    </property>
+    <property>
+        <name>archive.using.ec</name>
+        <editStatus>recommended</editStatus>
+        <type>boolean</type>
+        <description>Set to true to enable EC zipping</description>
+    </property>
+    <property>
+        <name>build.drive.notdefined</name>
+        <editStatus>never</editStatus>
+        <type>flag</type>
+        <description>used to track if build.drive has predefined or not</description>
+    </property>
+    <property>
+        <name>ado.mapping.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA.</description>
+    </property>
+    <property>
+        <name>ado.quality.mapping.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA for quality targets.</description>
+    </property>
+    <property>
+        <name>ido.romtree</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path to the build romtree; the location contains iby files. Default value is "${build.drive}${env.EPOCROOT}/epoc32/rom/include"</description>
+    </property>
+    <property>
+        <name>ido.cenrep.root</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path to the cenrep root. Default value is "${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep/ido/src"</description>
+    </property>
+    <property>
+        <name>ido.cenrep.target</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path to the cenrep target directory. Default value is "${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9"</description>
+    </property>
+    <property>
+        <name>s60.build.robot.date</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>This property represent the releasing interval. The syntax is as follow:
+            day1,time1,day2,time2,projectname;day1,time1,day2,time2,projectname2
+            
+            With day and time matching the following properties:
+            day [1, 14]
+            time [00, 23]:[00, 59]
+            
+            Example:
+            2,10:00,3,20:00,ABS_domain
+        </description>
+    </property>
+    <property>
+        <name>s60.build.robot.path</name>
+        <editStatus>must</editStatus>
+        <type>string</type>
+        <description>Location where to publish the build robot delivery.</description>
+    </property>
+    <property>
+        <name>validate.properties.at.startup</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>display warnings at build startup if required properties are not defined.</description>
+    </property>
+    <property>
+        <name>tracing.csv.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path location for the memory tracing data captured by the TracingLogger.</description>
+    </property>
+    <property>
+        <name>imagetool.cfg.xml.parsed</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Locates the parsed configuration for ImageTool in the build directory.</description>
+    </property>
+    <property>
+        <name>imagetool.destination</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location where to copy ImageTool and definitions.</description>
+    </property>
+    <property>
+        <name>imagetool.images</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Defines comma separated list of image names.</description>
+    </property>
+    <property>
+        <name>imagetool.log</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines name of the ImageTool log file.</description>
+    </property>
+    <property>
+        <name>imagetool.output.dir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the location of ImageTool output files.</description>
+    </property>
+    <property>
+        <name>imagetool.tooldir</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Defines the location of ImageTool.</description>
+    </property>
+    <property>
+        <name>read.build.int</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>This must be set to enable reading the build.number from a text database file located on the network. It allows automated build number incrementing.</description>
+    </property>
+    <property>
+        <name>build.int.db.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>The directory where the build integer database text files are stored.</description>
+    </property>
+    <property>
+        <name>create.bom.workarea.root</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Your synergy work area directory (Set as the parent of the helium dir by default)</description>
+    </property>
+    <property>
+        <name>validate.policy.csv</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Location of the CSV file that defines policy IDs.</description>
+    </property>
+    <property>
+        <name>validate.policy.ignoreroot</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Skip the validation of the given root folders.</description>
+    </property>
+    <property>
+        <name>validate.policy.log</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location validate policy xml log.</description>
+    </property>
+    <property>
+        <name>validate.policy.log.xml</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location of the LogXML output file.</description>
+    </property>
+    <property>
+        <name>validate.policy.pattern</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Comma separated list of pattern for policy validation. Defualt value is, distribution.policy.s60,distribution.policy </description>
+    </property>
+    
+    <property>
+        <name>internal.api.config</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the config to parse the build content.</description>
+    </property>
+    <property>
+        <name>internal.api.output.prebuild</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the prebuild ado header content.</description>
+    </property>
+    <property>
+        <name>internal.api.output.postbuild</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the postbuild ado header content.</description>
+    </property>
+    <property>
+        <name>required.ant.version</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>The version of Apache Ant required by Helium.</description>
+    </property>
+    <property>
+        <name>sbs.hlm.scanlog</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Enable helium scanlog for raptor. (experimental temporary solution)</description>
+    </property>
+    <property>
+        <name>ivy.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of ivy jar.</description>
+    </property>
+    <property>
+        <name>ivy.filename</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Name of ivy jar.</description>
+    </property>
+    <property>
+        <name>logging.output.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of generated logging config.</description>
+    </property>
+    <property>
+        <name>last.major.helium.version</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Last major helium version</description>
+    </property>
+    <property>
+        <name>database.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of helium database</description>
+    </property>
+    <property>
+        <name>teamlevel.ci.system</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>Change release tag from team level to product level</description>
+    </property>
+    <property>
+        <name>teamlevel.folder.number</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Folder name which contains those tasks to change the release tag</description>
+    </property>
+    <property>
+        <name>programlevel.release.tag</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Program level release tag name</description>
+    </property>
+    <property>
+        <name>sms.server</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Server that sends SMSs</description>
+    </property>
+    <property>
+        <name>data.model.xsl</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Data Model extra content</description>
+    </property>
+    <property>
+        <name>ci.min.ba.maintain</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Minimal number of build area to keep.</description>
+    </property>
+    <property>
+        <name>ci.session.file</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the session file which will be created by Helium.</description>
+    </property>
+    <property>
+        <name>ci.project.config</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of the configuration that will be generated for the Cruise Control HLMSynergy modificationset.</description>
+    </property>
+    <property>
+        <name>signals.buildexception.signalname</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Name of the signal configuration that is used when a signal is fired after catching a BuildException failure.</description>
+    </property>
+    <property>
+        <name>hlm.enable.asserts</name>
+        <editStatus>recommended</editStatus>
+        <type>string</type>
+        <description>Enable helium asserts. Build will fail if this is enabled and asserts fail.</description>
+    </property>       
+    <property>
+        <name>python.modules.path</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Python modules path.</description>
+    </property>
+    <property>
+        <name>metadata.dbfile</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of build metadata database.</description>
+    </property>
+    <group>
+        <name>Environment</name>
+        <description/>
+        <propertyRef usage="required">tools.ivy.config.file</propertyRef>
+    </group>
+    <group>
+        <name>Policy validation</name>
+        <description>Properties which drive the policy validation.</description>
+        <propertyRef usage="optional">validate.policy.csv</propertyRef>
+        <propertyRef usage="optional">validate.policy.log</propertyRef>
+        <propertyRef usage="optional">validate.policy.ignoreroot</propertyRef>
+        <propertyRef usage="optional">validate.policy.pattern</propertyRef>
+    </group>
+    <group>
+        <name>preparation</name>
+        <description>Preparing the build area.</description>
+        <propertyRef usage="required">prep.config.file</propertyRef>
+        <propertyRef usage="optional">prep.delivery.file</propertyRef>
+    </group>
+    <group>
+        <name>localFreeSpace</name>
+        <description>Checking for disk space on local machine.</description>
+        <propertyRef usage="required">build.drive</propertyRef>
+        <propertyRef usage="optional">local.free.space</propertyRef>
+    </group>
+    <group>
+        <name>remoteFreeSpace</name>
+        <description>Checking for disk space on network disk.</description>
+        <propertyRef usage="required">network.drive</propertyRef>
+        <propertyRef usage="required">network.free.space</propertyRef>
+    </group>
+    <group>
+        <name>compilation</name>
+        <description>Main compilation.</description>
+        <propertyRef usage="required">sysdef.configurations.list</propertyRef>
+        <!--<propertyRef usage="required">sysdef.configurations</propertyRef>-->
+        <propertyRef usage="required">build.system</propertyRef>
+        <propertyRef usage="optional">build.system.ebs</propertyRef>
+        <propertyRef usage="optional">ido.build.filter</propertyRef>
+    </group>
+    <group>
+        <name>sisFiles</name>
+        <description>Creating SIS files.</description>
+        <propertyRef usage="optional">sis.config.file</propertyRef>
+    </group>
+    <group>
+        <name>rombuild</name>
+        <description>Creating ROM images.</description>
+        <propertyRef usage="optional">rombuild.config.file</propertyRef>
+        <propertyRef usage="optional">rombuild.config.file.parsed</propertyRef>
+        <propertyRef usage="required">roms.spec.name</propertyRef>
+        <propertyRef usage="optional">rombuild.using.var</propertyRef>
+    </group>
+    <!--<group>
+        <name>uda</name>
+        <description>Creating UDA images.</description>
+        <propertyRef usage="required">uda.config</propertyRef>
+        <propertyRef usage="required">uda.config.name</propertyRef>
+    </group>-->
+    <group>
+        <name>subcon</name>
+        <description>Creating a subcon build area and testing the creation of subcon images.</description>
+        <propertyRef usage="optional">subcon.build.drive</propertyRef>
+        <propertyRef usage="optional">subcon.prep.config.file</propertyRef>
+        <propertyRef usage="optional">subcon.rombuild.config.file</propertyRef>
+    </group>
+    <group>
+        <name>archive</name>
+        <description>Zipping the build area.</description>
+        <propertyRef usage="optional">zips.ee.spec.name</propertyRef>
+        <propertyRef usage="optional">zip.config.file</propertyRef>
+        <propertyRef usage="optional">zip.config.file.parsed</propertyRef>
+        <propertyRef usage="optional">zips.build.dir</propertyRef>
+        <propertyRef usage="optional">zip.wa.file</propertyRef>
+    </group>
+    <group>
+        <name>publish</name>
+        <description>Publishing the build to the network.</description>
+        <propertyRef usage="optional">publish</propertyRef>
+        <propertyRef usage="optional">is.published</propertyRef>
+        <propertyRef usage="optional">publish.root.dir</propertyRef>
+        <propertyRef usage="optional">publish.dir</propertyRef>
+        <propertyRef usage="optional">publish.subdir</propertyRef>
+        <propertyRef usage="optional">publish.base.dir</propertyRef>
+        <propertyRef usage="optional">publish.fileset.ids</propertyRef>
+        <propertyRef usage="optional">publish.release.subdir</propertyRef>
+        <propertyRef usage="optional">publish.release.dir</propertyRef>
+    </group>
+    <group>
+        <name>mobilecrash</name>
+        <description>Mobilecrash configuration.</description>
+        <propertyRef usage="optional">ee.rom.output.dir</propertyRef>
+        <propertyRef usage="optional">core.rom.output.dir</propertyRef>
+        <propertyRef usage="optional">selge.ini.network.dir</propertyRef>
+    </group>
+    <group>
+        <name>ReleaseNotes</name>
+        <description>Release notes generation.</description>
+        <propertyRef usage="optional">relnotes.config.dir</propertyRef>
+        <propertyRef usage="optional">releasenotes.logo</propertyRef>
+        <propertyRef usage="optional">releasenotes.output</propertyRef>
+        <propertyRef usage="optional">releasenotes.output.dir</propertyRef>
+        <propertyRef usage="optional">releasenotes.props</propertyRef>
+        <propertyRef usage="optional">releasenotes.scan2log</propertyRef>
+        <propertyRef usage="optional">releasenotes.temp.errors</propertyRef>
+        <propertyRef usage="optional">releasenotes.temp.output</propertyRef>
+        <propertyRef usage="optional">releasenotes.temp.props</propertyRef>
+        <propertyRef usage="optional">releasenotes.temp.props2</propertyRef>
+        <propertyRef usage="optional">releasenotes.template</propertyRef>
+    </group>
+    <group>
+        <name>DeltaZip</name>
+        <description/>
+        <propertyRef usage="optional">md5.signature.file</propertyRef>
+        <propertyRef usage="optional">md5.split</propertyRef>
+        <propertyRef usage="optional">old.md5.file.present</propertyRef>
+        <propertyRef usage="optional">delta.exclude.commasep</propertyRef>
+        <propertyRef usage="optional">old.md5.file</propertyRef>
+        <propertyRef usage="optional">delta.ant.file</propertyRef>
+        <propertyRef usage="optional">delta.zip.delete.file</propertyRef>
+        <propertyRef usage="optional">delta.zip.file</propertyRef>
+        <propertyRef usage="optional">delta.zip.location</propertyRef>
+        <propertyRef usage="optional">delta.zip.temp.location</propertyRef>
+    </group>
+    <group>
+        <name>CCM</name>
+        <description/>
+        <propertyRef usage="optional">ccm.base.dir</propertyRef>
+        <propertyRef usage="optional">ccm.home.dir</propertyRef>
+        <propertyRef usage="optional">ccm.database</propertyRef>
+        <propertyRef usage="optional">ccm.enabled</propertyRef>
+        <propertyRef usage="optional">ccmgetinput</propertyRef>
+        <propertyRef usage="optional">ccm.database.path</propertyRef>
+        <propertyRef usage="optional">ccm.engine.host</propertyRef>
+        <propertyRef usage="optional">ccm.user.login</propertyRef>
+        <propertyRef usage="optional">ccm.user.password</propertyRef>        
+        <propertyRef usage="optional">ccm.cache.xml</propertyRef>
+    </group>
+    <group>
+        <name>EC</name>
+        <description/>
+        <propertyRef usage="optional">ec.allow.duplicates</propertyRef>
+        <propertyRef usage="optional">ec.emake</propertyRef>
+        <propertyRef usage="optional">ec.history.dir</propertyRef>
+        <propertyRef usage="optional">ec.historyfile</propertyRef>
+        <propertyRef usage="optional">ec.makefile.file</propertyRef>
+        <propertyRef usage="optional">ec.maxagents</propertyRef>
+        <propertyRef usage="optional">ec.history.option</propertyRef>
+        <propertyRef usage="optional">ec.scripts.dir</propertyRef>
+        <propertyRef usage="optional">ec.sysdef2make</propertyRef>
+        <propertyRef usage="optional">ec.tools.dir</propertyRef>
+        <propertyRef usage="optional">ec.build.class</propertyRef>
+        <propertyRef usage="optional">sbs.implicit.tools.build</propertyRef>
+        <propertyRef usage="optional">sbs.tools.config</propertyRef>
+        <propertyRef usage="optional">ec.mem.limit</propertyRef>
+        <propertyRef usage="optional">skip.compile-ec-patch</propertyRef>
+        <propertyRef usage="optional">archive.using.ec</propertyRef>
+    </group>
+    <group>
+        <name>cMaker</name>
+        <description/>
+        <propertyRef usage="optional">cmaker.component.dir</propertyRef>
+        <propertyRef usage="optional">cmaker.config.dir</propertyRef>
+        <propertyRef usage="optional">cmaker.pp.version</propertyRef>
+        <propertyRef usage="optional">cmaker.s60.version</propertyRef>
+        <propertyRef usage="optional">cmaker.log.label</propertyRef>
+    </group>
+    <group>
+        <name>IDO - Codescanner</name>
+        <description>Codescanner related Ant properties.</description>
+        <propertyRef usage="optional">ido.codescanner.config</propertyRef>
+        <propertyRef usage="optional">ido.codescanner.output.dir</propertyRef>
+        <propertyRef usage="optional">ido.codescanner.output.type</propertyRef>
+        <propertyRef usage="optional">skip.codescanner</propertyRef>
+    </group>
+    <group>
+        <name>iMaker - integration</name>
+        <description>New iMaker integration support.</description>
+        <propertyRef usage="optional">rombuild.buildinfo.template</propertyRef>
+        <propertyRef usage="optional">rombuild.buildinfo.output</propertyRef>
+        <propertyRef usage="optional">imaker.engine</propertyRef>
+    </group>
+    <group>
+        <name>ImageTool</name>
+        <description>ImageTool configuration.</description>
+        <propertyRef usage="required">imagetool.destination</propertyRef>
+        <propertyRef usage="required">imagetool.images</propertyRef>
+        <propertyRef usage="optional">imagetool.cfg.xml.parsed</propertyRef>
+        <propertyRef usage="optional">imagetool.log</propertyRef>
+        <propertyRef usage="optional">imagetool.output.dir</propertyRef>
+        <propertyRef usage="optional">imagetool.tooldir</propertyRef>
+    </group>
+    <group>
+        <name>Diamonds</name>
+        <description/>
+        <propertyRef usage="required">diamonds.host</propertyRef>
+        <propertyRef usage="required">diamonds.path</propertyRef>
+        <propertyRef usage="required">diamonds.port</propertyRef>
+        <propertyRef usage="optional">diamonds.mail</propertyRef>
+        <propertyRef usage="optional">log.target</propertyRef>
+        <propertyRef usage="optional">call.cleanup</propertyRef>
+        <propertyRef usage="optional">diamonds.listener.configuration.file</propertyRef>
+        <propertyRef usage="optional">diamonds.compile.summary</propertyRef>
+        <propertyRef usage="optional">diamonds.schema</propertyRef>
+        <propertyRef usage="optional">diamonds.build.id</propertyRef>
+        <propertyRef usage="optional">diamonds.build.url</propertyRef>
+        <propertyRef usage="optional">diamonds.target.list.to.log</propertyRef>
+    </group>
+    <group>
+        <name>Localisation</name>
+        <description/>
+        <propertyRef usage="optional">loc.output.dir</propertyRef>
+        <propertyRef usage="optional">loc.output.filename</propertyRef>
+        <propertyRef usage="optional">loc.temp.dir</propertyRef>
+        <propertyRef usage="optional">localisation.files.china</propertyRef>
+        <propertyRef usage="optional">localisation.files.japan</propertyRef>
+        <propertyRef usage="optional">localisation.files.western</propertyRef>
+        <propertyRef usage="optional">localisation.makefile.target</propertyRef>
+        <propertyRef usage="optional">localisation.s60locfiles.dir</propertyRef>
+        <propertyRef usage="optional">localisation.tool</propertyRef>
+        <propertyRef usage="optional">localisation.buildfile</propertyRef>
+        <propertyRef usage="optional">isis_mktarget.list</propertyRef>
+        <propertyRef usage="optional">localisation.language.file</propertyRef>
+    </group>
+    <group>
+        <name>ATS</name>
+        <description/>
+        <propertyRef usage="optional">ats.ctc.host</propertyRef>
+        <propertyRef usage="optional">ats.testrun.name</propertyRef>
+        <propertyRef usage="optional">ats.plan.name</propertyRef>
+        <propertyRef usage="optional">ats.aste.testrun.name</propertyRef>
+        <propertyRef usage="optional">ats.aste.plan.name</propertyRef>
+        <propertyRef usage="optional">ats.trace.enabled</propertyRef>
+        <propertyRef usage="optional">ats.ctc.enabled</propertyRef>
+        <propertyRef usage="optional">ats.obey.pkgfiles.rule</propertyRef>
+        <propertyRef usage="optional">ats.flashfiles.minlimit</propertyRef>
+        <propertyRef usage="optional">ats.sisfiles.minlimit</propertyRef>
+        <propertyRef usage="optional">ats.email.list</propertyRef>
+        <propertyRef usage="optional">ats.target.platform</propertyRef>
+        <propertyRef usage="optional">ats.flash.images</propertyRef>
+        <propertyRef usage="optional">ats.test.timeout</propertyRef>
+        <propertyRef usage="optional">ats.product.hwid</propertyRef>
+        <propertyRef usage="optional">ats.drop.file</propertyRef>
+        <propertyRef usage="optional">ats.aste.drop.file</propertyRef>
+        <propertyRef usage="optional">ats.aste.email.list</propertyRef>
+        <propertyRef usage="optional">ats.product.name</propertyRef>
+        <propertyRef usage="optional">ats.script.type</propertyRef>
+        <propertyRef usage="optional">ats.drop.location</propertyRef>
+        <propertyRef usage="optional">ats.server</propertyRef>
+        <propertyRef usage="optional">ats.password</propertyRef>
+        <propertyRef usage="optional">ats.username</propertyRef>
+        <propertyRef usage="optional">ats.report.location</propertyRef>
+        <propertyRef usage="optional">enabled.ats</propertyRef>
+        <propertyRef usage="optional">enabled.aste</propertyRef>
+        <propertyRef usage="optional">skip.ats.sending</propertyRef>
+        <propertyRef usage="optional">eunit.test.package</propertyRef>
+        <propertyRef usage="optional">eunitexerunner.flags</propertyRef>
+        <propertyRef usage="optional">drop.file.counter</propertyRef>
+        <propertyRef usage="optional">exclude.test.layers</propertyRef>
+    </group>
+    <group>
+        <name>Company</name>
+        <description/>
+        <propertyRef usage="optional">email.ldap.server</propertyRef>
+        <propertyRef usage="optional">email.ldap.rootdn</propertyRef>
+        <propertyRef usage="optional">email.smtp.server</propertyRef>
+        <propertyRef usage="optional">sms.server</propertyRef>
+        <propertyRef usage="optional">ldap.organization.unit.rootdn</propertyRef>
+        <propertyRef usage="optional">ldap.people.rootdn</propertyRef>
+    </group>
+    <group>
+        <name>Release</name>
+        <description/>
+        <propertyRef usage="optional">s60.build.robot.date</propertyRef>
+        <propertyRef usage="optional">s60.build.robot.path</propertyRef>
+    </group>
+    <group>
+        <name>Qt</name>
+        <description/>
+        <propertyRef usage="optional">qt.dir</propertyRef>
+        <propertyRef usage="optional">qt.configure.log.name</propertyRef>
+        <propertyRef usage="optional">qt.qmake.ant.template</propertyRef>
+        <propertyRef usage="optional">qt.qmake.makefile.template</propertyRef>
+        <propertyRef usage="optional">qt.configure.args</propertyRef>
+        <propertyRef usage="optional">qt.qmake.default.args</propertyRef>
+        <propertyRef usage="optional">qmake.enabled</propertyRef>
+    </group>
+    <group>
+        <name>Misc</name>
+        <description/>
+        <propertyRef usage="optional">absolute.prep.root.dir</propertyRef>
+        <propertyRef usage="optional">ado.mapping.file</propertyRef>
+        <propertyRef usage="optional">ado.quality.mapping.file</propertyRef>
+        <propertyRef usage="optional">antlib.import.module.path</propertyRef>
+        <propertyRef usage="optional">binary.root</propertyRef>
+        <propertyRef usage="optional">branch.name</propertyRef>
+        <propertyRef usage="optional">build.cache.dir</propertyRef>
+        <propertyRef usage="optional">build.cache.log.dir</propertyRef>
+        <propertyRef usage="optional">build.drive.notdefined</propertyRef>
+        <propertyRef usage="optional">build.duplicates.log</propertyRef>
+        <propertyRef usage="optional">build.errors.limit</propertyRef>
+        <propertyRef usage="optional">build.id</propertyRef>
+        <propertyRef usage="optional">build.log.dir</propertyRef>
+        <propertyRef usage="optional">build.signal.status.dir</propertyRef>
+        <propertyRef usage="optional">build.status.email.template</propertyRef>
+        <propertyRef usage="optional">build.log</propertyRef>
+        <propertyRef usage="optional">build.logging.key.stages</propertyRef>
+        <propertyRef usage="optional">build.logging.start.stage</propertyRef>
+        <propertyRef usage="optional">build.name</propertyRef>
+        <propertyRef usage="optional">build.output.dir</propertyRef>
+        <propertyRef usage="optional">build.property.cache.file</propertyRef>
+        <propertyRef usage="optional">build.sisfiles.dir</propertyRef>
+        <propertyRef usage="optional">build.summary.file</propertyRef>
+        <propertyRef usage="optional">build.system.sbs</propertyRef>
+        <propertyRef usage="optional">build.temp.dir</propertyRef>
+        <propertyRef usage="optional">build.type</propertyRef>
+        <propertyRef usage="optional">build.version</propertyRef>
+        <propertyRef usage="optional">cache.dir</propertyRef>
+        <propertyRef usage="optional">log4j.cache.dir</propertyRef>
+        <propertyRef usage="optional">canonical.sysdef.file</propertyRef>
+        <propertyRef usage="optional">ccmtask.python.script.file</propertyRef>
+        <propertyRef usage="optional">codescanner.config</propertyRef>
+        <propertyRef usage="optional">codescanner.format</propertyRef>
+        <propertyRef usage="optional">codescanner.log.unique</propertyRef>
+        <propertyRef usage="optional">common.overlay.dir</propertyRef>
+        <propertyRef usage="optional">compile.signal.input</propertyRef>
+        <propertyRef usage="optional">compile.symbianos</propertyRef>
+        <propertyRef usage="optional">compile.sysdef.dtd.stub</propertyRef>
+        <propertyRef usage="optional">core.build.version</propertyRef>
+        <propertyRef usage="optional">create.bom.workarea.root</propertyRef>
+        <propertyRef usage="optional">ctool.china.conf</propertyRef>
+        <propertyRef usage="optional">ctool.dir</propertyRef>
+        <propertyRef usage="optional">ctool.japan.conf</propertyRef>
+        <propertyRef usage="optional">ctool.region.china</propertyRef>
+        <propertyRef usage="optional">ctool.western.conf</propertyRef>
+        <propertyRef usage="optional">current.env.config</propertyRef>
+        <propertyRef usage="optional">customer.makefile.target</propertyRef>
+        <propertyRef usage="optional">data.model.file</propertyRef>
+        <propertyRef usage="optional">data.model.parsed</propertyRef>
+        <propertyRef usage="optional">database.file</propertyRef>
+        <propertyRef usage="optional">delta.zip.file.size</propertyRef>
+        <propertyRef usage="optional">disable.analysis.tool</propertyRef>
+        <propertyRef usage="optional">documentation.host</propertyRef>
+        <propertyRef usage="optional">documentation.path.root</propertyRef>
+        <propertyRef usage="optional">documentation.path</propertyRef>
+        <propertyRef usage="optional">documentation.url.root</propertyRef>
+        <propertyRef usage="optional">ec.mode</propertyRef>
+        <propertyRef usage="optional">ee.makefile.target</propertyRef>
+        <propertyRef usage="optional">ee_roms.log.file</propertyRef>
+        <propertyRef usage="optional">epocroot</propertyRef>
+        <propertyRef usage="optional">error.email.to.list</propertyRef>
+        <propertyRef usage="optional">eunit.prepare.zip</propertyRef>
+        <propertyRef usage="optional">ext.java.lib.dir</propertyRef>
+        <propertyRef usage="optional">failonerror</propertyRef>
+        <propertyRef usage="optional">file-comparison.bcomp_conf</propertyRef>
+        <propertyRef usage="optional">file-comparison.bcomp_path</propertyRef>
+        <propertyRef usage="optional">file-comparison.left_name</propertyRef>
+        <propertyRef usage="optional">file-comparison.left_side</propertyRef>
+        <propertyRef usage="optional">file-comparison.output</propertyRef>
+        <propertyRef usage="optional">file-comparison.regexp.from</propertyRef>
+        <propertyRef usage="optional">file-comparison.regexp.to</propertyRef>
+        <propertyRef usage="optional">file-comparison.right_name</propertyRef>
+        <propertyRef usage="optional">file-comparison.right_side</propertyRef>
+        <propertyRef usage="optional">genxml.output.file.suffix</propertyRef>
+        <propertyRef usage="optional">genxml.output.file</propertyRef>
+        <propertyRef usage="optional">getenv.tool.location</propertyRef>
+        <propertyRef usage="optional">helium.build.dir</propertyRef>
+        <propertyRef usage="optional">helium.doc.dir</propertyRef>
+        <propertyRef usage="optional">helium.ccm.workarea.dir</propertyRef>
+        <propertyRef usage="optional">helium.svn.url</propertyRef>
+        <propertyRef usage="optional">helium.dir</propertyRef>
+        <propertyRef usage="optional">helium.java.lib.dir</propertyRef>
+        <propertyRef usage="optional">helium.svn.workarea.dir</propertyRef>
+        <propertyRef usage="optional">helium.version</propertyRef>
+        <propertyRef usage="optional">ido.cenrep.root</propertyRef>
+        <propertyRef usage="optional">ido.cenrep.target</propertyRef>
+        <propertyRef usage="optional">ido.keep.old</propertyRef>
+        <propertyRef usage="optional">ido.romtree</propertyRef>
+        <propertyRef usage="optional">ido.template.robot.ready</propertyRef>
+        <propertyRef usage="optional">image_creation.copyto</propertyRef>
+        <propertyRef usage="optional">image_creation.drive</propertyRef>
+        <propertyRef usage="optional">imaker.command</propertyRef>
+        <propertyRef usage="optional">imaker.fmpp.ant</propertyRef>
+        <propertyRef usage="optional">imaker.fmpp.makefile</propertyRef>
+        <propertyRef usage="optional">internal.api.config</propertyRef>
+        <propertyRef usage="optional">internal.api.output.postbuild</propertyRef>
+        <propertyRef usage="optional">internal.api.output.prebuild</propertyRef>
+        <propertyRef usage="optional">ivy.file</propertyRef>
+        <propertyRef usage="optional">ivy.filename</propertyRef>
+        <propertyRef usage="optional">last.major.helium.version</propertyRef>
+        <propertyRef usage="optional">log.build.build_id</propertyRef>
+        <propertyRef usage="optional">log.build.category</propertyRef>
+        <propertyRef usage="optional">log.build.computer</propertyRef>
+        <propertyRef usage="optional">log.build.user</propertyRef>
+        <propertyRef usage="optional">log4j.configuration</propertyRef>
+        <propertyRef usage="optional">logging.output.file</propertyRef>
+        <propertyRef usage="optional">major.version</propertyRef>
+        <propertyRef usage="optional">metadata.db.file</propertyRef>
+        <propertyRef usage="optional">minor.version</propertyRef>
+        <propertyRef usage="optional">notes.database</propertyRef>
+        <propertyRef usage="optional">notes.release.dir</propertyRef>
+        <propertyRef usage="optional">notes.server</propertyRef>
+        <propertyRef usage="optional">number.of.threads</propertyRef>
+        <propertyRef usage="optional">overlays.log.file</propertyRef>
+        <propertyRef usage="optional">parse_abld_what.tool</propertyRef>
+        <propertyRef usage="optional">prep.build.dir</propertyRef>
+        <propertyRef usage="optional">prep.delivery.modificationset</propertyRef>
+        <propertyRef usage="optional">prep.root.dir</propertyRef>
+        <propertyRef usage="optional">product.family</propertyRef>
+        <propertyRef usage="optional">product.list</propertyRef>
+        <propertyRef usage="optional">product.printname</propertyRef>
+        <propertyRef usage="optional">product.type</propertyRef>
+        <propertyRef usage="optional">programlevel.release.tag</propertyRef>
+        <propertyRef usage="optional">publish.ccm.folder</propertyRef>
+        <propertyRef usage="optional">read.build.int</propertyRef>
+        <propertyRef usage="optional">build.int.db.dir</propertyRef>
+        <propertyRef usage="optional">release.dir.root</propertyRef>
+        <propertyRef usage="optional">remote.builds.config.file</propertyRef>
+        <propertyRef usage="optional">required.ant.version</propertyRef>
+        <propertyRef usage="optional">robot.email.to</propertyRef>
+        <propertyRef usage="optional">rombuild.makefile.name</propertyRef>
+        <propertyRef usage="optional">s60.delta.config.prefix</propertyRef>
+        <propertyRef usage="optional">s60.getenv.trigger.location</propertyRef>
+        <propertyRef usage="optional">sbs.config</propertyRef>
+        <propertyRef usage="optional">skip.sbs.layer.generation</propertyRef>
+        <propertyRef usage="optional">sbs.hlm.scanlog</propertyRef>
+        <propertyRef usage="optional">skip.build.duplicates</propertyRef>
+        <propertyRef usage="optional">skip.policy-validation</propertyRef>
+        <propertyRef usage="optional">sms.number</propertyRef>
+        <propertyRef usage="optional">src.classes</propertyRef>
+        <propertyRef usage="optional">src.dir</propertyRef>
+        <propertyRef usage="optional">src</propertyRef>
+        <propertyRef usage="optional">subcon.log.file</propertyRef>
+        <propertyRef usage="optional">subcon.makefile.target</propertyRef>
+        <propertyRef usage="optional">subcon.zips.dir</propertyRef>
+        <propertyRef usage="optional">sysdef.clean.configurations.list</propertyRef>
+        <propertyRef usage="optional">team</propertyRef>
+        <propertyRef usage="optional">teamlevel.ci.system</propertyRef>
+        <propertyRef usage="optional">teamlevel.folder.number</propertyRef>
+        <propertyRef usage="optional">temp.build.dir</propertyRef>
+        <propertyRef usage="optional">trace.log.file</propertyRef>
+        <propertyRef usage="optional">trace.makefile.target</propertyRef>
+        <propertyRef usage="optional">tracing.csv.file</propertyRef>
+        <propertyRef usage="optional">tsrc.data.dir</propertyRef>
+        <propertyRef usage="optional">tsrc.path.list</propertyRef>
+        <propertyRef usage="optional">uda.makefile.target</propertyRef>
+        <propertyRef usage="optional">unix.password.available</propertyRef>
+        <propertyRef usage="optional">unix.password</propertyRef>
+        <propertyRef usage="optional">unix.username.available</propertyRef>
+        <propertyRef usage="optional">unix.username</propertyRef>
+        <propertyRef usage="optional">unsubst.after.build</propertyRef>
+        <propertyRef usage="optional">validate.policy.log.xml</propertyRef>
+        <propertyRef usage="optional">validate.properties.at.startup</propertyRef>
+        <propertyRef usage="optional">variant.image.targetpath</propertyRef>
+        <propertyRef usage="optional">week.number</propertyRef>
+        <propertyRef usage="optional">zip.ee.log.file</propertyRef>
+        <propertyRef usage="optional">zip.localised.log.file</propertyRef>
+        <propertyRef usage="optional">zip.subcon.log.file</propertyRef>
+        <propertyRef usage="optional">zip.subcon_roms.log.file</propertyRef>
+        <propertyRef usage="optional">zip.trace_roms.log.file</propertyRef>
+        <propertyRef usage="optional">zip.uda_roms.log.file</propertyRef>
+        <propertyRef usage="optional">zips.flashfiles.dir</propertyRef>
+        <propertyRef usage="optional">zips.loc.dir</propertyRef>
+        <propertyRef usage="optional">flash.config.enabled</propertyRef>
+        <propertyRef usage="optional">release.images.dir</propertyRef>
+        <propertyRef usage="optional">data.model.xsl</propertyRef>
+        <propertyRef usage="optional">ci.min.ba.maintain</propertyRef>
+        <propertyRef usage="optional">ci.session.file</propertyRef>
+        <propertyRef usage="optional">ci.project.config</propertyRef>
+        <propertyRef usage="optional">archive.max.number.of.threads</propertyRef>
+        <propertyRef usage="optional">signals.buildexception.signalname</propertyRef>
+        <propertyRef usage="optional">hlm.enable.asserts</propertyRef>
+        <propertyRef usage="optional">python.modules.path</propertyRef>
+        <propertyRef usage="optional">metadata.dbfile</propertyRef>
+    </group>
+</heliumDataModel>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/helium_data_model.xsl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!-- 
+============================================================================ 
+Name        : helium_data_model.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!--
+
+This describes the allowed values for some of the fields:
+
+property:
+- editStatus: [must, recommended, allowed, discouraged, never] 
+  type: [string, boolean, integer]
+
+-->
+<xsl:output method="xml" indent="yes"/>
+
+<xsl:template match="/">
+    <heliumDataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\tools\common\schema\helium_data_model.xsd">
+        <xsl:copy-of select="//property"/>
+        <xsl:copy-of select="//group"/>
+    </heliumDataModel>
+</xsl:template>
+</xsl:stylesheet> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/helium_distribution_test.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium_distribution_test.cfg.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <config name="helium_subcon">
+        <set name="root.dir" value="${helium.dir}/.."/>
+        <set name="max.files.per.archive" value="65000"/>
+        <set name="archive.tool" value="7za"/>
+        <set name="archives.dir" value="${helium.subcon.build.location}"/>
+        <set name="temp.build.dir" value="${env.TEMP}"/>
+        <set name="name" value="helium_${helium.version}_subcon"/>
+        <set name="include" value="helium/**/*"/>
+        <set name="exclude" value="helium/**/.svn,helium/build/**/*,helium/**/*.pyc,helium/**/*.pyo,helium/**/distribution.policy.s60,helium/**/hlm_debug.log"/>
+        <set name="distribution.policy.s60" value="7"/>
+        <set name="ignore.missing.policyfiles" value="true"/>
+
+        <!-- Keeping the distribution policy files for Mercurial delivery. -->
+        <config name="helium_sf_hg">
+            <set name="name" value="helium_${helium.version}_sf_hg"/>
+            <set name="exclude" value="helium/**/.svn,helium/build/**/*,helium/**/*.pyc,helium/**/*.pyo,**/.classpath,**/.project,helium/**/distribution.policy.s60"/>
+        </config>
+        <!-- 
+             PDT inherits the subcon and remove the docs
+             generated doc will be added to the package later.
+          -->
+        <config name="helium_sf_pdt">
+            <set name="name" value="helium_${helium.version}_sf_pdt"/>
+            <append name="exclude" value="**/.classpath,**/.project,helium/**/distribution.policy.s60,helium/doc/**"/>                    
+        </config>
+
+        <config name="winimage">
+            <set name="name" value="helium_${helium.version}_subcon_winimage"/>
+            <set name="distribution.policy.s60" value="311"/>
+        </config>
+    </config>
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/helium_eclipse_java_profile.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,285 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!-- 
+============================================================================ 
+Name        : helium_eclipse_java_profile.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<profiles version="11">
+<profile kind="CodeFormatterProfile" name="Helium" version="11">
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+</profile>
+</profiles>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/install/build-cruisecontrol-bin.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build-cruisecontrol-bin.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-cruisecontrol" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>Cruise Control installation script.</description>
+    <target name="install">
+        <property name="cc.temp.dir" value="${helium.dir}/build/cruisecontrol_temp"/>
+        <property name="hlm.external.dir" value="${helium.dir}/external"/>
+        <echo>
+        unzipping artifact: 
+        organisation=${artifact.organisation} 
+        module=${artifact.module} 
+        revision=${artifact.revision}
+        artifact=${artifact.artifact}
+        type=${artifact.type}
+        ext=${artifact.ext}
+        origin=${artifact.origin}
+        local=${artifact.local}
+        size=${artifact.size}
+        file=${artifact.file}
+        helium.dir=${helium.dir}
+        </echo>
+        <delete failonerror="false">
+            <fileset dir="${hlm.external.dir}/CruiseControl">
+                <exclude name="cruisecontrol.bat"/>
+                <exclude name="distribution.policy.S60"/>
+            </fileset>
+        </delete>
+        <delete dir="${cc.temp.dir}" failonerror="false"/>
+        <mkdir dir="${cc.temp.dir}"/>
+        <unzip src="${artifact.file}" dest="${cc.temp.dir}">
+            <mapper>
+                <regexpmapper from="^cruisecontrol-bin-[^/\\]*[/\\](.*)$$" to="\1"/>
+            </mapper>
+        </unzip>
+        
+        <!-- Generating version file. -->
+        <echo file="${cc.temp.dir}/${artifact.module}_${artifact.revision}.txt">
+            unzipping artifact: 
+            organisation=${artifact.organisation} 
+            module=${artifact.module} 
+            revision=${artifact.revision}
+            artifact=${artifact.artifact}
+            type=${artifact.type}
+            ext=${artifact.ext}
+            origin=${artifact.origin}
+            local=${artifact.local}
+            size=${artifact.size}
+            file=${artifact.file}
+            helium.dir=${helium.dir}
+        </echo>        
+        
+        <if>
+            <available file="${hlm.external.dir}/CruiseControl/cruisecontrol.bat"/>
+            <then>
+                <move file="${cc.temp.dir}/cruisecontrol.bat" tofile="${cc.temp.dir}/real_cruisecontrol.bat"/>
+            </then>
+        </if>
+        
+        <move todir="${hlm.external.dir}/CruiseControl">
+            <fileset dir="${cc.temp.dir}"/>
+        </move>
+        <delete dir="${cc.temp.dir}" failonerror="false"/>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/install/build-hccc.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build-hccc.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-hccc" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>Helium Cruise Control Customization installation script.</description>
+    <target name="install">
+        <echo>
+        unzipping artifact: 
+        organisation=${artifact.organisation} 
+        module=${artifact.module} 
+        revision=${artifact.revision}
+        artifact=${artifact.artifact}
+        type=${artifact.type}
+        ext=${artifact.ext}
+        origin=${artifact.origin}
+        local=${artifact.local}
+        size=${artifact.size}
+        file=${artifact.file}
+        helium.dir=${helium.dir}
+        </echo>
+        <unzip src="${artifact.file}" dest="${helium.dir}/external/CruiseControl/">
+            <mapper>
+                <regexpmapper from="^cruisecontrol-bin-[^/\\]*[/\\](.*)$$" to="\1"/>
+            </mapper>
+        </unzip>        
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/install/build-jep.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build-jep.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-jep" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>Jep library installation script.</description>
+    <target name="install">
+        <echo>
+        unzipping artifact: 
+        organisation=${artifact.organisation} 
+        module=${artifact.module} 
+        revision=${artifact.revision}
+        artifact=${artifact.artifact}
+        type=${artifact.type}
+        ext=${artifact.ext}
+        origin=${artifact.origin}
+        local=${artifact.local}
+        size=${artifact.size}
+        file=${artifact.file}
+        helium.dir=${helium.dir}
+        </echo>
+
+        <!-- path must use backslashes -->
+        <exec executable="${artifact.file}">
+            <arg line="/S /D=${helium.dir}\external\jep_1.6_2.5" />
+        </exec>
+
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/install/build-logilab-common.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build-logilab-common.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-logilab-common" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>Logilab library installation script.</description>
+    <target name="install">
+        <echo>
+          unzipping artifact: 
+          organisation=${artifact.organisation} 
+          module=${artifact.module} 
+          revision=${artifact.revision}
+          artifact=${artifact.artifact}
+          type=${artifact.type}
+          ext=${artifact.ext}
+          origin=${artifact.origin}
+          local=${artifact.local}
+          size=${artifact.size}
+          file=${artifact.file}
+          helium.dir=${helium.dir}
+        </echo>
+        
+        <bunzip2 src="${artifact.file}" dest="${artifact.file}.tar"/>
+        <untar src="${artifact.file}.tar" dest="${helium.dir}/external/python/lib/2.5"/>
+        <move todir="${helium.dir}/external/python/lib/2.5/logilab/common" flatten="true" overwrite="true">
+            <fileset dir="${helium.dir}/external/python/lib/2.5" includes="logilab-common*/**"/>
+        </move>
+        <touch file="${helium.dir}/external/python/lib/2.5/logilab/__init__.py"/>
+
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/install/build-xincluder.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build-logilab-common.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-xincluder" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>xincluder installation script.</description>
+    <target name="install">
+        <property environment="env"/>
+        <echo>
+          unzipping artifact: 
+          organisation=${artifact.organisation} 
+          module=${artifact.module} 
+          revision=${artifact.revision}
+          artifact=${artifact.artifact}
+          type=${artifact.type}
+          ext=${artifact.ext}
+          origin=${artifact.origin}
+          local=${artifact.local}
+          size=${artifact.size}
+          file=${artifact.file}
+          helium.dir=${helium.dir}
+        </echo>
+        
+        <gunzip src="${artifact.file}" dest="${artifact.file}.tar"/>
+        <mkdir dir="${env.TEMP}/xincluder"/>
+        <untar src="${artifact.file}.tar" dest="${env.TEMP}/xincluder"/>
+        
+        <move todir="${helium.dir}/external/antlibs" flatten="true" overwrite="true">
+            <fileset dir="${env.TEMP}/xincluder" includes="**/xincluder*.jar"/>
+        </move>
+        
+        <mkdir dir="${helium.dir}/external/sources"/>
+        <copy file="${artifact.file}" todir="${helium.dir}/external/sources"/>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.0">
+
+    <info organisation="S60_SAM"
+          module="helium"
+          revision="2.32"
+          status="integration"
+          publication="">
+        <license name="Nokia" url="http://www.my.org/mymodule/mylicense.html"/>
+        <ivyauthor name="Helium team" url="http://helium.nmp.nokia.com/"/>
+        <repository name="Helium" url="http://www.jayasoft.fr/org/ivyrep/" pattern="[organisation]/[module]/ivy-[revision].xml" ivys="true" artifacts="false"/>
+        <description homepage="http://www.my.org/mymodule/">
+        </description>
+    </info>
+
+    <configurations>
+        <conf name="core" description="Core Helium tools from SymSEE."/>
+        <conf name="subcon" extends="core" description="Helium libraries for SF and Nokia."/>
+        <conf name="core_install" extends="subcon" description="Core Helium libraries."/>
+        <conf name="product" extends="core" description="Product build libraries."/>
+        <conf name="ido" extends="core" description="IDO build tools from SymSEE."/>
+        <conf name="sf_install" description="SF build libraries."/>
+        <conf name="ido_install" extends="ido" description="IDO build libraries."/>
+        <conf name="internal" extends="ido" description="Internal libraries."/>
+    </configurations>
+    
+    <publications/>
+    
+    <dependencies defaultconfmapping="core->default;subcon->default;core_install->default;ido_install->default;sf_install->default">
+        <!-- Core dependencies -->
+        <dependency org="SWEPT" name="ant" rev="1.7" conf="core"/>
+        <dependency org="SWEPT" name="java" rev="1.6" conf="core"/>
+        <dependency org="SWEPT" name="perl" rev="5.6.1" conf="core"/>
+        <dependency org="SWEPT" name="python" rev="2.5" conf="core"/>
+
+        <!-- Dependency for product builds -->
+        <dependency org="SWEPT" name="unzip" rev="5.40" conf="product->default"/>
+        
+        <!-- IDO dependencies -->
+        <dependency org="SWEPT" name="7zip" rev="4" conf="ido->default"/>
+        <dependency org="SWEPT" name="ccm" rev="6.5" conf="ido->default"/>
+        <dependency org="SWEPT" name="codescanner" rev="[2.0,2.1]" conf="ido->default"/>
+        <dependency org="SWEPT" name="java13" rev="1.3.1" conf="ido->default"/>
+        <dependency org="SWEPT" name="sbs" rev="2.4" conf="ido->default"/>
+        
+        <!-- These dependencies are not in Ibiblio Maven2 so they need to be referenced explicitly by url -->
+        <dependency org="python" name="eggs_subcon" rev="1.0" conf="subcon"/>
+        <dependency org="java" name="jars_subcon" rev="1.0" conf="subcon"/>
+        <dependency org="python" name="eggs" rev="1.0" conf="core_install"/>
+        <dependency org="java" name="jars" rev="1.0" conf="core_install"/>
+        
+        <!-- Dependencies in Ibiblio Maven2 -->
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-collections" name="commons-collections" rev="3.2" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-configuration" name="commons-configuration" rev="1.5" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-lang" name="commons-lang" rev="2.4" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-logging" name="commons-logging" rev="1.1.1" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="ant-contrib" name="ant-contrib" rev="1.0b2" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="bsf" name="bsf" rev="2.4.0" transitive="false" conf="subcon"/>
+        <!-- License: Dom4j -->
+        <dependency org="dom4j" name="dom4j" rev="1.6.1" transitive="false" conf="subcon"/>
+        <!-- License: BSD and CDDL -->
+        <dependency org="org.freemarker" name="freemarker" rev="2.3.13" transitive="false" conf="subcon"/>
+        <!-- License: Apache 1.1 and BSD -->
+        <dependency org="net.sourceforge.fmpp" name="fmpp" rev="0.9.13" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-codec" name="commons-codec" rev="1.3" transitive="false" conf="subcon"/>
+        <!-- License: Apache 1.1 -->
+        <dependency org="commons-discovery" name="commons-discovery" rev="0.2" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-httpclient" name="commons-httpclient" rev="3.1" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-io" name="commons-io" rev="1.4" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="commons-jxpath" name="commons-jxpath" rev="1.2" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="org.apache.ant" name="ant-antunit" rev="1.0" transitive="false" conf="subcon"/>
+        <!-- License: BSD -->
+        <dependency org="asm" name="asm" rev="2.2.1" transitive="false" conf="subcon"/>
+        <!-- License: BSD -->
+        <dependency org="jsch" name="jsch" rev="0.1.29" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="log4j" name="log4j" rev="1.2.9" transitive="false" conf="subcon"/>
+        <!-- License: Apache 1.1 -->
+        <dependency org="oro" name="oro" rev="2.0.8" transitive="false" conf="subcon"/>
+        <!-- License: Common Public License Version 1.0 -->
+        <dependency org="wsdl4j" name="wsdl4j" rev="1.5.1" transitive="false" conf="subcon"/>
+        <dependency org="jaxen" name="jaxen" rev="1.1.1" transitive="false" conf="subcon"/>
+        <!-- License: BSD -->
+        <dependency org="xmlunit" name="xmlunit" rev="1.2" transitive="false" conf="subcon"/>
+        <!-- License: BSD, CDDL -->
+        <dependency org="javax.mail" name="mail" rev="1.4.1" transitive="false" conf="subcon"/>
+        <!-- License: Apache 1.1 -->
+        <dependency org="velocity" name="velocity-dep" rev="1.3.1" transitive="false" conf="subcon"/>
+        <!-- License: Common Public License Version 1.0 -->
+        <dependency org="junit" name="junit" rev="4.5" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="xalan" name="xalan" rev="2.7.1" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="xalan" name="serializer" rev="2.7.1" transitive="false" conf="subcon"/>
+        <!-- License: Common Public License Version 1.0 -->
+        <dependency org="emma" name="emma" rev="2.0.5312" transitive="false" conf="subcon"/>
+        <!-- License: Common Public License Version 1.0 -->
+        <dependency org="emma" name="emma_ant" rev="2.0.5312" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="org.apache.maven.scm" name="maven-scm-api" rev="1.1" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="org.apache.maven.scm" name="maven-scm-provider-hg" rev="1.1" transitive="false" conf="subcon"/>
+        <!-- License: Apache 2.0 -->
+        <dependency org="org.codehaus.plexus" name="plexus-utils" rev="1.5.6" transitive="false" conf="subcon"/>
+        
+        <dependency org="asm" name="asm-tree" rev="2.2.1" transitive="false" conf="core_install"/>
+        <dependency org="axis" name="axis" rev="latest.integration" transitive="false" conf="core_install"/>
+        <dependency org="xml-apis" name="xml-apis" rev="latest.integration" transitive="false" conf="core_install"/>
+        <dependency org="javax.xml" name="jaxrpc" rev="latest.integration" transitive="false" conf="core_install"/>
+        <dependency org="checkstyle" name="checkstyle" rev="4.4" conf="internal"/>        
+        <!-- License: BSD -->
+        <dependency org="javax.xml.soap" name="saaj-api" rev="1.3" transitive="false" conf="core_install"/>
+        
+        <!--
+        sun.mail
+        <dependency org="" name="dsn" rev="latest.integration" transitive="false" conf="core_install"/>
+        <dependency org="" name="smtp" rev="latest.integration" transitive="false" conf="core_install"/>
+        -->
+        
+        <!-- Installed using installer -->
+        <!-- License: MIT -->
+        <dependency org="java" name="jep" rev="2.3-java6" transitive="false" conf="subcon"/>
+        
+        <!-- License: LGPL, W3C -->
+        <dependency org="java" name="xincluder" rev="1.0d11" transitive="false" conf="subcon"/>
+        
+        <!-- IDO continous integration package -->
+        <dependency org="java" name="cruisecontrol" rev="2.8.2" conf="ido_install"/>
+        
+        <dependency org="java" name="cruisecontrol" rev="2.8.2" conf="sf_install"/>
+    </dependencies>
+    
+</ivy-module>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/7zip-4.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 7zip-4.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="7zip"
+          revision="4"/>
+    <publications>
+        <artifact name="7za" type="exe" versionArgs=""/> 
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/ant-1.7.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ant-1.7.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="ant"
+          revision="1.7"/>
+    <description>Apache Ant. Used for the core build process.</description>
+    <publications/>
+</ivy-module>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/ccm-6.5.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ccm-6.5.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="ccm"
+          revision="6.5"/>
+    <publications>
+        <artifact name="ccm.exe" type="exe" versionArgs="version -c"/> 
+    </publications>
+</ivy-module>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/codescanner-2.0.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : codescanner-2.0.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="codescanner"
+          revision="2.0"/>
+    <publications>
+        <artifact name="codescanner" type="exe" versionArgs=""/> 
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/codescanner-2.1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : codescanner-2.1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="codescanner"
+          revision="2.1"/>
+    <publications>
+        <artifact name="codescanner" type="exe" versionArgs=""/> 
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cruisecontrol-2.7.1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="cruisecontrol"
+          revision="2.7.1" />
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" /> 
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2-hc1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cruisecontrol-2.7.2-hc1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="cruisecontrol"
+          revision="2.7.2-hc1" />
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" url="http://helium.nmp.nokia.com/svn/cruisecontrol/trunk/official/cruisecontrol-bin-2.7.2.zip"/>
+    </publications>
+    
+    <dependencies>
+        <dependency org="helium-external" name="hccc" rev="1-2.7.2"/>
+    </dependencies>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cruisecontrol-2.7.2.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="cruisecontrol"
+          revision="2.7.2" />
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" url="http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.7.2.zip"/>
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.3.rc1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cruisecontrol-2.7.3.rc1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="cruisecontrol"
+          revision="2.7.3.rc1" />
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" url="http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.7.3.rc1.zip"/>
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.8.1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cruisecontrol-2.8.1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="cruisecontrol"
+          revision="2.8.1" />
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" url="http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.8.1.zip"/>
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.8.2.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cruisecontrol-2.8.2.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="java"
+          module="cruisecontrol"
+          revision="2.8.2" />
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" url="http://helium.nmp.nokia.com/svn/cruisecontrol/trunk/official/cruisecontrol-bin-2.8.2.zip"/>
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/eggs-1.0.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : eggs-1.0.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info 
+        organisation="python"
+        module="eggs"
+        revision="1.0"/>
+        
+        <publications>
+        <artifact name="4Suite_XML" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/4/4Suite-XML/4Suite_XML-1.0.2-py2.5-win32.egg"/>
+        <artifact name="Amara" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/A/Amara/Amara-1.2.0.2-py2.5.egg"/>
+        <artifact name="Jinja" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/J/Jinja/Jinja-1.2-py2.5-win32.egg"/>
+        <artifact name="Pygments" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/P/Pygments/Pygments-0.10-py2.5.egg"/>
+        
+        <!-- Sphinx must be unzipped -->
+        <artifact name="Sphinx" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/S/Sphinx/Sphinx-0.4.1-py2.5.egg"/>
+        
+        <artifact name="simplejson" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/s/simplejson/simplejson-1.7.1-py2.5.egg"/>
+        
+        <!-- Helium version has been modified -->
+        <artifact name="ZSI" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/Z/ZSI/ZSI-2.0_rc3-py2.5.egg"/>
+        
+        <artifact name="PyXML" ext="egg" type="egg" url="http://code.enthought.com/enstaller/eggs/windows/xp/PyXML-0.8.4.0002-py2.5-win32.egg"/>
+        <artifact name="docutils" ext="egg" type="egg" url="http://code.enthought.com/enstaller/eggs/windows/xp/docutils-0.3.9.0002-py2.5.egg"/>
+        <artifact name="epydoc" ext="egg" type="egg" url="http://code.enthought.com/enstaller/eggs/windows/xp/epydoc-2.0.0002-py2.5.egg"/>
+        <artifact name="nose" ext="egg" type="egg" url="http://code.enthought.com/enstaller/eggs/windows/xp/nose-0.9.3.0002-py2.5.egg"/>
+        
+                
+        <artifact name="distutils" ext="zip" type="egg" url="http://www.python.org/community/sigs/current/distutils-sig/download/Distutils-1.0.2.zip"/>
+        <artifact name="logilab-common" ext="tar.gz" type="egg" url="ftp://ftp.logilab.fr/pub/common/logilab-common-0.32.0.tar.gz"/>
+        
+        <artifact name="mocker" ext="tar.bz2" type="egg" url="http://launchpad.net/mocker/trunk/0.10.1/+download/mocker-0.10.1.tar.bz2"/>
+        <artifact name="path" ext="zip" type="egg" url="http://pypi.python.org/packages/source/p/path.py/path-2.2.zip#md5=941660081788282887f652510d80e64e"/>
+        <artifact name="psyco" ext="tar.gz" type="egg" url="http://mesh.dl.sourceforge.net/sourceforge/psyco/psyco-1.6-src.tar.gz"/>
+        <artifact name="pylint" ext="tar.gz" type="egg" url="ftp://ftp.logilab.fr/pub/pylint/pylint-0.14.0.tar.gz"/>
+        <artifact name="pyrtf" ext="tar.gz" type="egg" url="http://kent.dl.sourceforge.net/sourceforge/pyrtf/PyRTF-0.45.tar.gz"/>
+        <artifact name="lxml" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/l/lxml/lxml-2.0.6-py2.5-win32.egg"/>
+        <!--
+        <artifact name="mock" ext="py" type="egg" url="http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?section=python&file=mock.py"/>
+        -->
+      </publications>
+
+
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/eggs_subcon-1.0.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : eggs_subcon-1.0.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info 
+        organisation="python"
+        module="eggs_subcon"
+        revision="1.0"/>
+        
+    <publications>
+        <artifact name="setuptools" ext="egg" type="egg" url="http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c8-py2.5.egg"/>
+    </publications>
+
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/hccc-1-2.7.2.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : hccc-1-2.7.2.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="hccc"
+          revision="1-2.7.2" />
+    <publications>
+        <artifact name="hccc" type="binary" ext="zip" url="http://helium.nmp.nokia.com/svn/cruisecontrol/trunk/bin/hccc_1-2.7.2.zip"/>
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/jars-1.0.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : jars-1.0.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info 
+        organisation="java"
+        module="jars"
+        revision="1.0"/>
+        
+        <publications>
+        <artifact name="jera" ext="jar" type="jar" url="http://www.jera.com/tools/anttasks/JeraAntTasks.jar"/>
+        <!-- License: GPL -->
+        <artifact name="antdoclet" ext="zip" type="jar" url="http://download.berlios.de/antdoclet/antdoclet-1.1.zip"/>
+        <artifact name="svnant" ext="zip" type="jar" url="http://subclipse.tigris.org/files/documents/906/32898/svnant-1.0.0.zip"/>
+        <artifact name="sqlitejdbc" ext="jar" type="jar" url="http://files.zentus.com/sqlitejdbc/sqlitejdbc-v054.jar"/>
+     </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/jars_subcon-1.0.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : jars_subcon-1.0.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info 
+        organisation="java"
+        module="jars_subcon"
+        revision="1.0"/>
+        
+    <publications>
+        <!-- License: Apache 1.1 -->
+        <artifact name="xmltask-v1.15.1" ext="jar" type="jar" url="http://kent.dl.sourceforge.net/sourceforge/xmltask/xmltask-v1.15.1.jar"/>
+        <!-- License: LGPL, SPL -->
+        <artifact name="bsh-2.1b0" ext="jar" type="jar" url="http://helium.nmp.nokia.com/svn/beanshell/branches/2.1b0/bin/bsh-2.1b0.jar"/>
+        <!-- License: LGPL -->
+        <artifact name="xia" ext="jar" type="jar" url="http://www.jeckle.de/freeStuff/xia/xia.jar"/>
+        <!-- License: LGPL and BSD -->
+        <artifact name="bliki-3.0.7" ext="zip" type="jar" url="http://heanet.dl.sourceforge.net/sourceforge/plog4u/bliki.3.0.7.zip"/>
+        <!-- License: LGPL -->
+        <artifact name="antform" ext="zip" type="jar" url="http://surfnet.dl.sourceforge.net/sourceforge/antforms/antform-bin-2.0beta2.zip"/>
+
+        <artifact name="xia_source" ext="zip" type="zip" url="http://www.jeckle.de/freeStuff/xia/xia.zip"/>
+        <artifact name="bsh-2.1b0_source" ext="zip" type="zip" url="http://helium.nmp.nokia.com/svn/beanshell/branches/2.1b0/bsh-2.1b0-sources.zip"/>
+        <artifact name="wsdl4j-1.5.1-sources" ext="zip" type="zip" url="http://mirrors.ibiblio.org/pub/mirrors/maven2/wsdl4j/wsdl4j/1.5.1/wsdl4j-1.5.1-sources.jar"/>
+        <artifact name="freemarker-2.3.13-sources" ext="zip" type="zip" url="http://mirrors.ibiblio.org/pub/mirrors/maven2/org/freemarker/freemarker/2.3.13/freemarker-2.3.13-sources.jar"/>
+        <artifact name="mail-1.4.1-sources" ext="zip" type="zip" url="http://mirrors.ibiblio.org/pub/mirrors/maven2/javax/mail/mail/1.4.1/mail-1.4.1-sources.jar"/>
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/java-1.6.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : java-1.6.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="java" revision="1.6"/>
+    <publications>
+        <artifact name="java" type="exe" versionArgs="-version"/> 
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/java13-1.3.1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : java13-1.3.1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="java13" revision="1.3.1"/>
+    <publications>
+        <artifact name="c:\\apps\\j2sdk_1.3.1_06\\jre\\bin\\java.exe" type="exe" versionArgs="-version"/> 
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/jep-2.3-java6.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : jep-2.3-java6.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="jep"
+          revision="2.3" />
+    <publications>
+        <artifact name="jep" type="binary" ext="exe" url="http://mesh.dl.sourceforge.net/sourceforge/jepp/jep-2.3-Java6-Python25.exe"/>
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/perl-5.6.1.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : perl-5.6.1.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="perl"
+          revision="5.6.1"/>
+    <publications>
+        <artifact name="perl" type="exe" versionArgs="-v"/> 
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/python-2.5.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : python-2.5.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="python"
+          revision="2.5"/>
+    <publications>
+        <artifact name="python" type="exe" versionArgs="--version"/> 
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/sbs-2.4.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sbs-2.4.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="sbs"
+          revision="2.4"/>
+    <publications>
+        <artifact name="sbs.bat" type="exe" versionArgs="-version" versionExp=".*2\.[4-9].*"/> 
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/symsee-7.2.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : symsee-7.2.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="symsee"
+          revision="7.2"/>
+    
+    <publications/>
+    
+    <dependencies>
+        <dependency org="SWEPT" name="ant" rev="1.7"/>
+        <dependency org="SWEPT" name="java" rev="[1.5.0_12,1.6.0_02]"/>
+        <dependency org="SWEPT" name="perl" rev="5.6.1"/>
+        <dependency org="SWEPT" name="python" rev="2.5"/>
+        <dependency org="SWEPT" name="codescanner" rev="2.0.1"/>
+    </dependencies>
+    
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/unzip-5.40.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : unzip-5.40.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="SWEPT"
+          module="unzip"
+          revision="5.40"/>
+    <publications>
+        <artifact name="unzip" type="exe" versionArgs="-v"/> 
+    </publications>
+</ivy-module>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/modules/xincluder-1.0d11.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : jep-2.3-java6.ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="java"
+          module="xincluder"
+          revision="1.0d11" />
+    <publications>
+        <artifact name="xincluder" ext="tar.gz" type="jar_zipped" url="ftp://ftp.ibiblio.org/pub/languages/java/javafaq/xincluder-1.0d11.tar.gz"/>
+    </publications>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/ivy/tools_ivy_settings.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : tools_ivy_settings.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!-- Ivy settings file for environment tools and dependency libraries. -->
+<ivysettings>
+    
+    <typedef name="tool" classname="com.nokia.ivy.ToolResolver"/>
+    <caches useOrigin="true"/>
+    <settings validate="false" defaultResolver="external"/>
+    
+    <property name="ivy.checksums" value="" override="true"/>
+    
+    <resolvers>
+        <filesystem name="download">
+            <ivy pattern="${helium.dir}/config/ivy/modules/[module]-[revision].ivy.xml" />
+        </filesystem>
+        
+        <chain name="external">
+            <ibiblio name="ibiblio" m2compatible="true" />
+        </chain>
+        
+        <url name="helium-svn">
+            <ivy pattern="http://helium.nmp.nokia.com/svn/[module]/branches/[revision]/bin/ivy.xml" />
+        </url>
+
+        <dual name="tool-resolver">
+            <filesystem name="ivy-tool-resolver">
+                <ivy pattern="${helium.dir}/config/ivy/modules/[module]-[revision].ivy.xml" />
+            </filesystem>
+            
+            <tool name="artifact-tool-resolver" validate="false">
+                <artifact pattern="[name]"/>
+            </tool>
+        </dual>
+    </resolvers>
+
+    
+    <triggers>
+        <ant-build  antfile="${helium.dir}/config/ivy/install/build-[artifact].ant.xml"
+                    target="install"
+                       event="post-download-artifact"
+                       prefix="artifact"/>
+                       
+      <ant-call target="unzip-egg" prefix="artifact"
+          event="post-download-artifact" filter="ext=zip AND type=egg"/>
+      <ant-call target="unzip-jar" prefix="artifact"
+          event="post-download-artifact" filter="ext=zip AND type=jar"/>
+      <ant-call target="gunzip-egg" prefix="artifact"
+          event="post-download-artifact" filter="ext=tar.gz AND type=egg"/>
+      <ant-call target="bunzip-egg" prefix="artifact"
+          event="post-download-artifact" filter="ext=tar.bz2 AND type=egg"/>
+    </triggers>
+
+    
+    <modules>
+        <module organisation="SWEPT" name=".*" resolver="tool-resolver" />
+        <module organisation="python" name=".*" resolver="download" />
+        <module organisation="java" name=".*" resolver="download" />
+        <module organisation="helium-external" name=".*" resolver="helium-svn" />
+    </modules>
+    
+</ivysettings>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/java_checkstyle_config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : java_checkstyle_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE module PUBLIC
+    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
+    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
+
+<!--
+
+  Checkstyle configuration using Eclipse Helium profile
+
+-->
+
+<module name="Checker">
+
+    <!-- Checks that a package.html file exists for each package.     -->
+    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
+    <!-- module name="PackageHtml"/-->
+
+    <!-- Checks whether files end with a new line.                        -->
+    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
+    <!--<module name="NewlineAtEndOfFile"/>-->
+
+    <!-- Checks that property files contain the same keys.         -->
+    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
+    <module name="Translation"/>
+
+
+    <module name="TreeWalker">
+
+        <!-- Checks for Javadoc comments.                     -->
+        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+        <!--<module name="JavadocMethod"/>
+        <module name="JavadocVariable"/>
+        <module name="JavadocStyle"/>-->
+        
+        <module name="JavadocType">
+           <property name="scope" value="public"/>
+           <property name="allowMissingParamTags" value="true"/>
+        </module>
+
+        <!-- Checks for Naming Conventions.                  -->
+        <!-- See http://checkstyle.sf.net/config_naming.html -->
+        <module name="ConstantName"/>
+        <module name="LocalFinalVariableName"/>
+        <module name="LocalVariableName"/>
+        <module name="MemberName"/>
+        <module name="MethodName"/>
+        <module name="PackageName"/>
+        <module name="ParameterName"/>
+        <module name="StaticVariableName"/>
+        <module name="TypeName"/>
+
+
+        <!-- Checks for Headers                                -->
+        <!-- See http://checkstyle.sf.net/config_header.html   -->
+        <!-- <module name="Header">                            -->
+            <!-- The follow property value demonstrates the ability     -->
+            <!-- to have access to ANT properties. In this case it uses -->
+            <!-- the ${basedir} property to allow Checkstyle to be run  -->
+            <!-- from any directory within a project. See property      -->
+            <!-- expansion,                                             -->
+            <!-- http://checkstyle.sf.net/config.html#properties        -->
+            <!-- <property                                              -->
+            <!--     name="headerFile"                                  -->
+            <!--     value="${basedir}/java.header"/>                   -->
+        <!-- </module> -->
+
+        <!-- Following interprets the header file as regular expressions. -->
+        <!-- <module name="RegexpHeader"/>                                -->
+
+
+        <!-- Checks for imports                              -->
+        <!-- See http://checkstyle.sf.net/config_import.html -->
+        <!--<module name="AvoidStarImport"/>-->
+        <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
+        <module name="RedundantImport"/>
+        <module name="UnusedImports"/>
+
+
+        <!-- Checks for Size Violations.                    -->
+        <!-- See http://checkstyle.sf.net/config_sizes.html -->
+        <module name="FileLength"/>
+        <!--<module name="LineLength"/>-->
+        <module name="MethodLength"/>
+        <module name="ParameterNumber"/>
+
+
+        <!-- Checks for whitespace                               -->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+        <!--<module name="EmptyForIteratorPad"/>
+        <module name="MethodParamPad"/>
+        <module name="NoWhitespaceAfter"/>
+        <module name="NoWhitespaceBefore"/>
+        <module name="OperatorWrap"/>
+        <module name="ParenPad"/>
+        <module name="TypecastParenPad"/>
+        <module name="WhitespaceAfter"/>-->
+        <module name="TabCharacter"/>
+        <module name="WhitespaceAround"/>
+
+
+        <!-- Modifier Checks                                    -->
+        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
+        <module name="ModifierOrder"/>
+        <module name="RedundantModifier"/>
+
+
+        <!-- Checks for blocks. You know, those {}'s         -->
+        <!-- See http://checkstyle.sf.net/config_blocks.html -->
+        <module name="AvoidNestedBlocks"/>
+        <module name="EmptyBlock"/>
+        <!--<module name="LeftCurly">--> 
+        <!--<module name="NeedBraces"/>-->
+        <!--<module name="RightCurly">-->
+
+
+        <!-- Checks for common coding problems               -->
+        <!-- See http://checkstyle.sf.net/config_coding.html -->
+        <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->
+        <module name="EmptyStatement"/>
+        <module name="EqualsHashCode"/>
+        <!--<module name="HiddenField"/>-->
+        <module name="IllegalInstantiation"/>
+        <module name="InnerAssignment"/>
+        <!--<module name="MagicNumber"/>-->
+        <module name="MissingSwitchDefault"/>
+        <module name="RedundantThrows"/>
+        <module name="SimplifyBooleanExpression"/>
+        <module name="SimplifyBooleanReturn"/>
+
+        <!-- Checks for class design                         -->
+        <!-- See http://checkstyle.sf.net/config_design.html -->
+        <!--<module name="DesignForExtension"/>-->
+        <module name="FinalClass"/>
+        <module name="HideUtilityClassConstructor"/>
+        <module name="InterfaceIsType"/>
+        <module name="VisibilityModifier"/>
+
+
+        <!-- Miscellaneous other checks.                   -->
+        <!-- See http://checkstyle.sf.net/config_misc.html -->
+        <module name="ArrayTypeStyle"/>
+        <!--<module name="FinalParameters"/>
+        <module name="GenericIllegalRegexp">
+            <property name="format" value="\s+$"/>
+            <property name="message" value="Line has trailing spaces."/>
+        </module>-->
+        <module name="TodoComment"/>
+        <module name="UpperEll"/>
+        
+        <module name="ExplicitInitialization"/>
+        <module name="UnnecessaryParentheses"/>
+        <module name="DeclarationOrder"/>
+        
+        <module name="StringLiteralEquality"/>
+        
+        <module name="CyclomaticComplexity">
+            <property name="max" value="25"/>
+        </module>
+        
+        <module name="SuperFinalize"/>
+    </module>
+
+</module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/logging.conf.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+<#--
+============================================================================ 
+Name        : logging.conf.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+[formatters]
+keys: simple,detailed
+ 
+[handlers]
+keys: console,syslog
+ 
+[loggers]
+keys: root,dp
+ 
+[formatter_simple]
+format: %(levelname)s:%(name)s:%(message)s
+
+[formatter_detailed]
+format: %(levelname)s:%(name)s: %(module)s:%(lineno)d: %(message)s
+
+[handler_console]
+class: StreamHandler
+args: []
+formatter: simple
+
+[handler_syslog]
+class: handlers.SysLogHandler
+args: [('myhost.mycorp.net', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER]
+formatter: detailed
+
+[logger_root]
+level: INFO
+handlers: syslog
+
+[logger_dp]
+<#if ant?keys?seq_contains("dp.debug") || ant?keys?seq_contains("debug")>
+level: DEBUG
+<#else>
+level: INFO
+</#if>
+handlers: console
+qualname: dp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/metadata_filter_config_default.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : metadata_filter__config_default.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="metadata-filter-config" xmlns:hlm="http://www.nokia.com/helium">
+
+    <hlm:metadatafilterset id="filterset.common">
+        <metadatafilterset filterfile="${helium.dir}/config/metadata_regex.csv" />
+    </hlm:metadatafilterset>
+
+    <!-- Unique filter id is generated for each filterset used during specific phase
+        of the builds. Customer could override it by redifning the filterset
+        with same id and add their own configuration on top of it. 
+    -->
+    <hlm:metadatafilterset id="filterset.genxml.ec">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+
+    <hlm:metadatafilterset id="filterset.test.ccm">
+        <metadatafilter priority="error" regex="^ERROR:" description="" />
+        <metadatafilter priority="warning" regex="^WARNING:.*" description="" />
+        <metadatafilter priority="info" regex="^INFO:" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.qt.configure">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.sbs">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.compile">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.genxml.merge">
+        <metadatafilter priority="error" regex="^ERROR:" description="" />
+        <metadatafilter priority="error" regex="^Context:" description="" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.buildarea.prep">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.ant.output">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.imaker">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.ee.roms">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+
+    <hlm:metadatafilterset id="filterset.temprecord">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+
+    <hlm:metadatafilterset id="filterset.subcon.roms">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.trace.roms">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.uda.roms">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+    
+    <hlm:metadatafilterset id="filterset.dp">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+    
+    <hlm:metadatafilterset id="filterset.fota">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+    
+    <hlm:metadatafilterset id="filterset.archive.nopolicy">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+    
+    <hlm:metadatafilterset id="filterset.getenv">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+    
+    <hlm:metadatafilterset id="filterset.archive.policy">
+        <metadatafilter priority="error" regex="^POLICY_ERROR:" description="" />
+        <metadatafilter priority="warning" regex="^POLICY_WARNING:" description="" /> 
+        <metadatafilter priority="info" regex="^POLICY_INFO:" description="" /> 
+    </hlm:metadatafilterset>
+    
+    <hlm:metadatafilterset id="filterset.prepWorkArea">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.ats">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.aste">
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
+    <hlm:metadatafilterset id="filterset.sisfiles">
+        <metadatafilter priority="error" regex=".*[Ee]rror\s*:\s+.*" description="To capture the error generated by makesis" />
+        <metadatafilter priority="error" regex=".*file I/O fault.*" description="To capture the error generated by signsis" />
+    </hlm:metadatafilterset>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/metadata_regex.csv	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+priority,regex,description
+FATAL,.*mingw_make\.exe.*,
+ERROR,.*\): Missing file:.*, 
+ERROR,^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:.*,
+ERROR,.*Error:\s+.*,
+ERROR,.*is not recognized as an internal or external command.*,
+ERROR,^MISSING:.*,
+ERROR,.*FLEXlm error:.*,
+ERROR,.*(ABLD|BLDMAKE) ERROR:.*,
+ERROR,.*FATAL ERROR\(S\):.*,
+ERROR,.*fatal error C1001: INTERNAL COMPILER ERROR.*,
+ERROR,.*fatal error U1077.*,
+ERROR,.*warning U4010,
+ERROR,^make(?:\[\d+\])?\: \*\*\*.*,
+ERROR,^make(?:\[\d+\])?:\s+.*\s+not\s+remade.*,
+ERROR,error: ((Internal fault):)$,
+ERROR,Exception: [A-Z0-9_]+.*,
+ERROR,.*target .* given more than once in the same rule.*,
+ERROR,^ERROR:.*,
+ERROR,^ERROR EC\d+:.*,
+ERROR,Errors caused tool to abort..*,
+ERROR,.*no rule to make.*,
+ERROR,^ERROR\t.*,
+ERROR,.*Traceback \(most recent call last\).*,
+CRITICAL,[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049),
+WARNING,^(\d+\))?\s.*WARNING:.*,
+WARNING,^MAKEDEF WARNING:.*,
+WARNING,.*\\\\(?)\(\d+\)\s:\sWarning:\s\(\d+\),
+WARNING,^(BLDMAKE |MAKEDEF )?WARNING:.*,
+WARNING,.*\(\d+\) : warning C.*,
+WARNING,.*\d+: warning:.*,
+WARNING,.*Usage Warning:.*,
+WARNING,.*mwld.exe:.*,
+WARNING,^Command line warning.*,
+WARNING,.*ERROR: bad relocation:.*,
+WARNING,^(\d+) warning.*,
+WARNING,.*EventType:\s+Error\s+Source:\s+SweepNT.*,
+WARNING,^WARN\t.*,
+WARNING,.*LINK : warning.*,
+REMARK,.*Command line warning D4025 : .*,
+REMARK,^REMARK: .*,
+REMARK,^EventType:\s+Error\s+Source:\s+GNU\s+Make.*,
+REMARK,".*:\d+: warning: cannot find matching deallocation function""r""((:\d+)*: note: ).*",
+INFO,^INFO:.*,
+ERROR,"\""(.*)\"" , line (\d+): (Error: +(.\d+.*?):.*)$",
+WARNING,"line \d+: Warning:', r':\s+warning\s+\w+:.*",
+WARNING,"\""(.*)\""\, line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)$",
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/pylintrc.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,288 @@
+
+[MASTER]
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=CVS
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflicts with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option
+# conflicts with the enable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories.
+#enable-msg-cat=
+
+# Disable all messages in the listed categories.
+#disable-msg-cat=
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+disable-msg=C0301,W0401,W0611,W0614,R0801,W0402,R0914
+
+
+[REPORTS]
+
+# set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html
+output-format=text
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells wether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note).You have access to the variables errors warning, statement which
+# respectivly contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=no
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branchs, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+# 
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__)|(_[a-zA-Z0-9_]{2,40}))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-zA-Z0-9_]{2,40}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-zA-Z0-9_]{2,40}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-zA-Z0-9_]{2,40}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-zA-Z0-9_]{2,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-zA-Z0-9_]{2,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,apply,input
+
+
+# try to find bugs in the code using type inference
+# 
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# When zope mode is activated, consider the acquired-members option to ignore
+# access to some undefined attributes.
+zope=no
+
+# List of members which are usually get through zope's acquisition mecanism and
+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
+acquired-members=REQUEST,acl_users,aq_parent
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assigment
+# 
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existant members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+# 
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+# 
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+# 
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for :
+# * unauthorized constructions
+# * strict indentation
+# * line length
+# * use of <> instead of !=
+# 
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+
+# checks for:
+# * warning notes in the code like FIXME, XXX
+# * PEP 263: source code with non ascii character but no encoding declaration
+# 
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+# 
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/signaling_config_default.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : signaling_config_default.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="signaling-config" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Definitions of helium signals. 
+    </description>
+    
+    <taskdef resource="org/apache/tools/ant/types/conditions/antlib.xml" />
+
+    <!-- Only for backward compatibility -->
+    <hlm:notifierList id="defaultSignalFailNotifier">
+        <hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl" title="[signal] ${signal.name}"
+            smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="fail">
+        </hlm:emailNotifier>
+    </hlm:notifierList>
+
+    <hlm:notifierList id="defaultFailNotifier">
+        <hlm:emailNotifier defaultTemplate="${helium.dir}/tools/common/templates/log/email_default.html.ftl" title="[signal] ${signal.name}"
+            smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="fail">
+        </hlm:emailNotifier>
+    </hlm:notifierList>
+
+
+    <!-- check for its usage 
+    <hlm:notifierList id="defaultSignalWarnNotifier">
+        <hlm:emailNotifier defaultTemplate="${helium.dir}/tools/common/templates/log/email_warning.html.ftl" title="[signal] ${signal.name}"
+            smtp="${email.smtp.server}" ldap="${email.ldap.server}">
+        </hlm:emailNotifier>
+    </hlm:notifierList>
+    -->
+
+    <!-- This configuration just dump some message while a signal is raised. -->
+    <hlm:notifierList id="echoSignalNotifier">
+        <hlm:executeTaskNotifier>
+            <echo>defaultSignalAlwaysNotifier: Signal: ${signal.name}</echo>
+            <echo>defaultSignalAlwaysNotifier: Status: ${signal.status}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+    <!-- Only for backward compatibility -->
+    <hlm:notifierList id="defaultSignalAlwaysNotifier">
+        <hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl" title="[signal] ${signal.name}"
+            smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="always">
+        </hlm:emailNotifier>
+    </hlm:notifierList>
+
+    <hlm:notifierList id="defaultAlwaysNotifier">
+        <hlm:emailNotifier defaultTemplate="${helium.dir}/tools/common/templates/log/email_default.html.ftl" title="[signal] ${signal.name}"
+            smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="always">
+        </hlm:emailNotifier>
+    </hlm:notifierList>
+
+    <hlm:signalInput id="buildManagementSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultSignalFailNotifier"/>
+    </hlm:signalInput>
+
+    <!-- default signal input, incase if no signal input is defined this
+        will be used -->
+    <hlm:signalInput id="defaultSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="prepWorkAreaSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <!-- Check for its usage (as email template is not supported as 
+    converted directly from ant xml file). 
+    <hlm:signalInput id="prepWorkAreaSignalInputWarn" failbuild="never">
+        <hlm:notifierListRef refid="defaultSignalWarnNotifier" />
+    </hlm:signalInput>
+    -->
+    <hlm:signalInput id="preparationSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="compileCleanSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+
+    <hlm:signalInput id="compileSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="eeRomsSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultAlwaysNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="subconRomsSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultAlwaysNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="localizedRomsSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultAlwaysNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="rombuildSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="traceRomsSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="graceUploadSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="dataPackagingSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="buildFinishedSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="publishSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="testOneSignalInput" failbuild="now" />
+
+    <hlm:signalInput id="testTwoSignalInput" failbuild="never" />
+
+    <hlm:signalInput id="testThreeSignalInput" failbuild="defer" />
+
+    <hlm:signalInput id="testAlwaysSignalInput" />
+
+    <hlm:signalInput id="testAlertsSignalInput" failbuild="now" />
+
+    <hlm:signalInput id="fotaSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="fotaSignalInput" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="btSmokeTestNotifySignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="archivePolicyErrorSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="signalValidatePolicyInvalidOrMissingInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="testSBSScanlogInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="testSBSScanlog" target="test-scanlog-metadata-1" message="sbs scanlog processed">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${env.TEMP}/signals/test-scanlog-metadata-1.log.status.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="testSBSScanlogInput" />
+            <notifierInput file = "${env.TEMP}/signals/test-scanlog-metadata-1.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="prepWorkAreaSignal" target="prep-work-area" message="Errors happened during Preparing Work Area">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.cache.log.dir}/signals/${build.id}_ccm_get_input.log.status.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="prepWorkAreaSignalInput" />
+            <notifierInput file = "${build.cache.log.dir}/signals/${build.id}_ccm_get_input.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="preparationSignal" target="prep-fail" message="Errors during preparation">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ant_build.log.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="preparationSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_ant_build.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="eeRomsSignal" target="ee-roms" message="Errors happened during ee rom image">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ee_roms.log.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="eeRomsSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_ee_roms.log.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="subconRomsSignal" target="subcon-roms" message="Errors happened during subcon rom image">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_subcon_roms.log.status.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="subconRomsSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_subcon.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+
+    <hlm:signalListenerConfig id="traceRomsSignal" target="trace-roms" message="Errors happened during trace rom">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_trace_roms.log.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="traceRomsSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_trace_roms.log.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="fotaSignal" target="fota-a-build" message="Fota execution finished">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_fota.log.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="fotaSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_fota.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="dataPackagingSignal" target="build-icreatordp" message="DP creation finished">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_dp.log.status.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="dataPackagingSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_dp.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalInput id="atsSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="atsSignal" target="ats-test" message="ATS creation finished">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ats.log.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="atsSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_ats.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="asteSignal" target="ats-aste" message="ASTE finished">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ats.log.status.xml" />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="atsSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_ats.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="mattiSignal" target="matti-test" message="ATS MATTI creation finished">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ats.log.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="atsSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_ats.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="publishSignal" target="publish" message="content published">
+        <signalNotifierInput>
+            <signalInput refid="publishSignalInput" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="testAlertsSignal" target="check-signal" message="Test alert signal">
+        <signalNotifierInput>
+            <signalInput refid="testAlertsSignalInput" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="btSmokeTestNotifySignal" target="blacktusk-signal" message="Blacktusk signal">
+        <signalNotifierInput>
+            <signalInput refid="btSmokeTestNotifySignalInput" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalInput id="archiveErrorSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="signalValidatePolicyInvalidOrMissing" target="render-validate-policy" message="Policy file validation">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_validate_policy.log.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="signalValidatePolicyInvalidOrMissingInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_validate_policy.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalInput id="canonicalSysDefFailSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    
+    <hlm:signalInput id="getenvSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="getEnvSignal" target="preparation-getenv" message="Getenv finished">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_getenv.log.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="getenvSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_getenv.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalInput id="signalConfigureQtInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="signalConfigureQt" target="configure-qt" message="Configuring Qt framework">
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${qt.configure.log.name}.status.xml" />
+        </targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="signalConfigureQtInput" />
+            <notifierInput file = "${build.signal.status.dir}/${qt.configure.log.name}.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+    <!-- Signal configuration for a signal sent when the build fails completely. -->
+    <hlm:signalInput id="buildExceptionSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultFailNotifier"/>
+    </hlm:signalInput>
+
+    <property name="signals.buildexception.signalinput" value="buildExceptionSignalInput"/>
+
+    <hlm:signalInput id="signalRunQMakeInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="sisfilesSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultSignalFailNotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="sisFilesSignal" target="sisfiles" message="sisfiles finished">
+        <hlm:targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_sisfiles.log.status.xml" 
 />
+        </hlm:targetCondition>
+        <signalNotifierInput>
+            <signalInput refid="sisfilesSignalInput" />
+            <notifierInput file = "${build.signal.status.dir}/${build.id}_sisfiles.log.status.html" />
+        </signalNotifierInput>
+    </hlm:signalListenerConfig>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/version.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+#Helium version - DO NOT EDIT
+#Tue Sep 22 14:15:51 IST 2009
+last.major.helium.version=5.0
+helium.version=6.0.1
Binary file buildframework/helium/doc/images/bom.png has changed
Binary file buildframework/helium/doc/images/dp.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/index.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<!--<link rel="stylesheet" type="text/css" href="stylesheets/style.css">-->
+<title>Helium Documentation Index</title>
+</head>
+
+<body>
+    <div style="font-family:arial">
+        <h1>Helium Documentation</h1>
+    
+        <a href="../build/doc/index.html">Helium Documentation</a>
+        <p/>
+        If this link does not work, please run <tt>hlm docs</tt> from the <tt>/helium</tt> directory and try again.
+        <p/>
+        The main Helium documentation is HTML generated from the RST text documents. 
+    </div>
+</body>
+    
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/.templates/sidebar.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+
+   <h3>API Search</h3>
+   <form class="search" action="api/search.html" method="get">
+       <input type="text" name="q" size="18" /> <input type="submit" value="Go" />
+       <input type="hidden" name="check_keywords" value="yes" />
+       <input type="hidden" name="area" value="default" />
+   </form>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/index.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN">
+
+<html>
+<head>
+  <title>Ant Tasks Documentation </title>
+  </head>
+
+<frameset cols="30,70">
+
+	<frameset rows="20,80">
+	    <frame name="libindex" src="libindex.html"/>
+	    <frame name="taskindex" src="index.all.html"/>
+    </frameset>
+	<frame name="task" src="overview.html" />
+
+</frameset>
+
+</html>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/libindex.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+##
+## This is an Velocity template for generating an HTML index
+## of the Ant "categories" (antlibs)
+##
+## Objects expected in context:
+##
+##     $title      - Project title (of type String)
+##     $antroot - (of type AntRoot)
+## 
+<html>
+<head>
+  <title>$title Ant Libraries</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+</head>
+<body>
+
+<div id="navigation">
+
+	<a href="overview.html" target="task">
+		<h2>$title Ant Libs</h2>
+	</a>
+	<p>
+## Iterate through the Categories
+#foreach( $category in $antroot.getCategories() )
+        <a href="index.${category}.html" target="taskindex">
+        	$category
+        </a><br />
+#end
+	</p>
+
+        <a href="index.all.html" target="taskindex">
+        	<i>all</i>
+        </a><br />
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/main.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+##
+## This template is the entry point for calling other templates.
+## The output of this template goes to stdout.
+##
+## Objects available in context:
+##
+## $velocity   - Helper object for processing other templates (of type VelocityFacade)
+## $antroot   - Contains all the Ant tasks/types (of type AntRoot)
+## $title         - Project title (of type String)
+##
+
+AntDoclet - Running project $title
+
+- Generating Task and Types documentation...
+##
+#foreach( $taskDoc in $antroot.getAll() ) ##
+  #if ( ! $taskDoc.isIgnored() )
+
+- Processing $taskDoc.antName ##
+      $velocity.eval( "task.vm", "${taskDoc.getFullClassName()}.html" ) ##
+  #else ##
+- Ignoring $taskDoc.fullClassName()##
+  #end ##
+#end ##
+
+
+- Generating Navigation indexes...
+## Now, generate an "index" file for the categories, and one for each category
+$velocity.eval( "libindex.vm", "libindex.html" )
+$velocity.eval( "overview.vm", "overview.html" )
+#foreach( $category in $antroot.getCategories() )
+	$velocity.eval( "taskindex.vm", "index.${category}.html" )
+#end
+#set($category = "all")
+$velocity.eval( "taskindex.vm", "index.${category}.html" )
+
+- Done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/overview.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+  <title>$title</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+
+</head>
+<body>
+
+<h1>$title - Ant Tasks Documentation</h1>
+
+<p>This document is the Ant Tasks specification for the Helium build toolkit.</p>
+
+	
+</body>
+
+</html> 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/style.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+
+
+body  {
+   font-family: verdana, arial,helvetica,sanserif;
+   font-size: 90%;
+}
+
+h2 {
+	font-size: 110%;
+	text-align: left;
+}
+
+div#navigation h2 {
+	text-align: left;
+	background-color: #CCCCFF;
+    font-variant: small-caps;
+    margin-bottom: 0;
+    padding-left: 5%;
+}
+
+h3 {
+	font-size: 100%;
+	text-align: left;
+	background-color: #CCCCFF;
+    margin-bottom: 0;
+}
+
+h4 {
+	font-size: 90%;
+    margin-top: 5%;
+}
+
+div#navigation {
+	float: left;
+}
+
+#navigation div.description {
+    margin-left: 5%;
+    font-size: small;
+}
+
+div.description {
+    margin: 5%;
+    font-size: medium;
+}
+
+pre {
+	border: solid 1px black;
+	background-color: #FFFFCC;
+	font-size: smaller;
+	font-family: monospace;
+}
+
+code {
+	font-size: smaller;
+	font-family: monospace;
+}
+
+table {
+	font-family: arial,helvetica,sanserif;
+	font-size: 80%;
+    margin: 5%;
+    padding: 0px;
+
+//	border: solid 1px black;
+    border-spacing: 0px;
+	border-collapse: collapse;
+}
+
+tr:first-child {
+	background-color: #DDDDFF;
+}
+
+td {
+	margin: 0px;
+	padding: 2px;
+	border: solid 1px black;
+	border-spacing: 0px;
+	border-collapse: collapse;
+}
+
+
+.copyright {
+	color: #999999;
+	font-size: 60%;
+	text-align: center;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/task.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+##
+## This is a Velocity template for generating an HTML
+## document describing an Ant Task/Type 
+## 
+## Objects expected in context:
+##
+##     $taskDoc - Describes an Ant Task/Type (of type AntDoc)
+##
+## 
+<html>
+<head>
+  <title>&lt;$taskDoc.getAntName()&gt;</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+</head>
+
+<body>
+
+    <h2><strong>&lt;$!taskDoc.getAntCategory() : $taskDoc.getAntName()&gt;</strong></h2>
+
+    <h3><strong>Description</strong></h3>
+	<div class="description">
+        $taskDoc.getComment()
+	</div>
+
+    <h3><a name="attributes"><strong>Parameters</strong></a></h3>
+
+	    <table>
+			<tr>
+				<td valign="top" align="left"><b>Attribute</b></td>
+                <td valign="top" align="left"><b>Description</b></td>
+                <td valign="top" align="left"><b>Type</b></td>
+                <td valign="top" align="left"><b>Required?</b></td>
+			</tr>
+
+#foreach ($attr in $taskDoc.attributes )
+
+			<tr>
+    		    <td valign="top" align="left">$attr</td>
+
+                <td valign="top" align="left">
+                     $taskDoc.getAttributeComment($attr)
+                </td>
+
+                <td valign="top" align="left">
+                    $taskDoc.getAttributeType($attr)
+                </td>
+
+                <td valign="top" align="left">
+
+  #if( $taskDoc.getAttributeRequired($attr) )
+                       <b>Yes</b> $taskDoc.getAttributeRequired($attr)
+  #elseif ( $taskDoc.getAttributeNotRequired($attr) )
+                       <b>No</b> $taskDoc.getAttributeNotRequired($attr)
+  #else ?
+  #end
+                </td>
+			</tr>
+#end
+		</table>
+
+        <h3>Parameters accepted as nested elements</h3>
+
+		<div class="description">
+#if ($taskDoc.isTaskContainer())
+			<p>This Task is a Container (it accepts nested Tasks).</p>
+#end
+
+#if ($taskDoc.supportsCharacters())
+			<p>This Task accepts text in its element body.</p>
+#end
+
+#foreach ($element in $taskDoc.getNestedElements())
+            
+  #set($elementDoc = $taskDoc.getElementDoc($element))
+
+    	    <h4>
+                ####
+		#### Put a link for those types that are in this javadoc run
+		#### and have nested elements (since nested-nested elements
+		#### is the only info we are not showing for each nested element)
+		####
+  #if( $elementDoc.sourceIncluded() && ($elementDoc.getNestedElements().hasMoreElements() || $elementDoc.isTagged()))
+		    <a href="${elementDoc.getFullClassName()}.html">
+                    <strong>&lt;$element&gt; ...</strong>
+		    </a>
+  #else
+                    <strong>&lt;$element&gt;</strong>
+
+    #if ( ! $elementDoc.sourceIncluded() )
+                    (Of type ${elementDoc.getAntName()} )
+    #end
+  #end
+			</h4>
+
+  #if($elementDoc.getComment())
+		    $elementDoc.getComment()
+  #end
+
+			<table border="0" cellspacing="2" cellpadding="2" width="100%">
+				<tr>
+	            	<td valign="top" align="left"><b>Attribute</b></td>
+	                <td valign="top" align="left"><b>Description</b></td>
+	                <td valign="top" align="left"><b>Type</b></td>
+	                <td valign="top" align="left"><b>Required</b></td>
+				</tr>
+
+  #foreach ($elementAttr in $elementDoc.getAttributes())
+
+	            <tr>
+    	        	<td>$elementAttr</td>
+        	        <td>
+###                #if($elementDoc.getAttributeComment($elementAttr))
+	                    <span>$!elementDoc.getAttributeComment($elementAttr)</span>
+###                #end
+					</td>
+
+					<td>
+                      $elementDoc.getAttributeType($elementAttr)
+					</td>
+
+					<td>
+
+    #if($elementDoc.getAttributeRequired($elementAttr))
+                       <b>Yes</b> $elementDoc.getAttributeRequired($elementAttr)
+    #elseif ( $elementDoc.getAttributeNotRequired($elementAttr) )
+                       <b>No</b> $elementDoc.getAttributeNotRequired($elementAttr)
+    #else ?
+    #end
+                    
+	                </td>
+				</tr>
+  #end
+			</table>
+#end
+		</div>
+    <br />
+	<hr />
+
+	<div class="copyright"><em>Generated with <a href="http://antdoclet.neuroning.com">AntDoclet</a></em></div>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/antdoclet/html/taskindex.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+##
+## This is an Velocity template for generating an HTML index
+## of the Ant Task/Types
+##
+## Objects expected in context:
+##
+##     $title      - Project title (of type String)
+##     $antroot - (of type AntRoot)
+## 
+<html>
+<head>
+  <title>$title Ant Tasks</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+
+</head>
+<body>
+
+<div id="navigation">
+
+    ## Tasks
+<h2>$category Tasks</h2>
+
+	#foreach( $taskDoc in $antroot.getTasksByCategory($category) )
+		#if($taskDoc && !$taskDoc.isInnerClass())
+
+<p><a href="${taskDoc.getFullClassName()}.html" target="task">
+    Task &lt;${taskDoc.getAntName()}&gt;
+       </a>
+</p>
+ <div class="description">
+                 #if($taskDoc.getShortComment())
+		    $taskDoc.getShortComment()
+		 #else
+		    <i>No comment available</i>
+		 #end
+</div>
+		#end
+	#end
+
+
+  ## Types
+<h2>$category Types</h2>
+
+  #foreach( $taskDoc in $antroot.getTypesByCategory($category) )
+    #if($taskDoc && !$taskDoc.isInnerClass() && $taskDoc.isTagged())
+<p><a href="${taskDoc.getFullClassName()}.html"  target="task">
+    Type &lt;${taskDoc.getAntName()}&gt;
+   </a>
+</p>
+
+<div class="description">
+                #if($taskDoc.getShortComment())
+		    $taskDoc.getShortComment()
+		 #else
+		    <i>No comment available</i>
+		 #end
+</div>
+
+    #end
+  #end
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/allmacros-frame.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<@helium_api_head_section title="All macros (Helium)"/>
+
+<body>
+
+<font size="+1" class="frameheadingfont">
+    <b>All macros</b>
+</font>
+<br/>
+
+<table border="0" width="100%" summary="">
+    <tr>
+        <td style="white-space: nowrap">
+        <#assign macrolist=doc.antDatabase.project.macro.name?sort>
+        <#list macrolist as macrovar>
+            <font class="frameitemfont">
+                <a href="macro-${macrovar}.html" title="${macrovar}" target="classframe">${macrovar}</a>
+            </font>
+            <br/>
+        </#list>
+        </td>
+    </tr>
+</table>
+    
+<@helium_api_html_footer/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/allproperties-frame.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<@helium_api_head_section title="All properties (Helium)"/>
+
+<body>
+    <font size="+1" class="frameheadingfont">
+        <b>All properties</b>
+    </font>
+    <br/>
+
+    <table border="0" width="100%" summary="">
+    <tr>
+    <td style="white-space: nowrap">
+    <#assign propertylist=data.heliumDataModel.property.name?sort>
+    <#list propertylist as propertyvar>
+    <font class="frameitemfont">
+    <a href="property-${propertyvar}.html" title="${propertyvar}" target="classframe">${propertyvar}</a>
+    </font>
+    <br/>
+    </#list>
+    </td>
+    </tr>
+    </table>
+
+<@helium_api_html_footer/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/alltargets-frame.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<@helium_api_head_section title="All targets (Helium)"/>
+
+<body>
+    <font size="+1" class="frameheadingfont">
+        <b>All targets</b>
+    </font>
+    <br/>
+
+    <table border="0" width="100%" summary="">
+    <tr>
+    <td style="white-space: nowrap">
+    <#assign targetlist=doc.antDatabase.project.target.name?sort>
+    <#list targetlist as targetvar>
+    <font class="frameitemfont">
+    <a href="target-${targetvar}.html" title="${targetvar}" target="classframe">${targetvar}</a>
+    </font>
+    <br/>
+    </#list>
+    </td>
+    </tr>
+    </table>
+    
+    
+<@helium_api_html_footer/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/api.ftllib	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,169 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<#if ant?keys?seq_contains("tracurl")>
+    <#assign helium_browser_trunk=ant.tracurl>
+<#else>
+    <#assign helium_browser_trunk="">
+</#if>
+
+<#macro helium_api_navbar>
+<!-- ========= start of top navbar ======= -->
+<a name="navbar_top"><!-- --></a>
+<a href="#skip-navbar_top" title="skip navigation links"></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0" summary="">
+<tr>
+<td colspan="2" bgcolor="#eeeeff" class="navbarcell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3" summary="">
+  <tr align="center" valign="top">
+  <td bgcolor="#ffffff" class="navbarcell1"> &#160;<a href="overview-summary.html"><font class="navbarfont1"><b>overview</b></font>&#160;</a></td>
+
+  <td bgcolor="#ffffff" class="navbarcell1">    <a href="deprecated-list.html"><font class="navbarfont1"><b>deprecated</b></font></a>&#160;</td>
+    
+  <td bgcolor="#eeeeff" class="navbarcell1">    <a href="properties-table.html"><font class="navbarfont1"><b>properties-table</b></font></a>&#160;</td>  
+  <td bgcolor="#eeeeff" class="navbarcell1">    <a href="index-1.html"><font class="navbarfont1"><b>index</b></font></a>&#160;</td>
+  <td bgcolor="#eeeeff" class="navbarcell1">    <a href="help.html"><font class="navbarfont1"><b>help</b></font></a>&#160;</td>
+  </tr>
+</table>
+</td>
+<td align="right" valign="top" rowspan="3"><em>
+<b>Helium API</b></em>
+
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="navbarcell2"><font size="-2">
+&#160;prev&#160;
+&#160;next</font></td>
+<td bgcolor="white" class="navbarcell2"><font size="-2">
+  <a href="index.html?overview-summary.html" target="_top"><b>frames</b></a>  &#160;
+&#160;<a href="overview-summary.html" target="_top"><b>no frames</b></a>  &#160;
+
+&#160;<script type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<a href="allclasses-noframe.html"><b>all classes</b></a>');
+  }
+  //-->
+</script>
+<noscript>
+  <a href="allclasses-noframe.html"><b>all classes</b></a>
+</noscript>
+
+
+</font></td>
+</tr>
+</table>
+<a name="skip-navbar_top"></a>
+<!-- ========= end of top navbar ========= -->
+</#macro>
+
+
+
+<#macro helium_api_head_section title>
+
+<head>
+    <meta name="keywords" content="helium"/>
+    <meta http-equiv="content-type" content="text/html+xml; charset=iso-8859-1"/>
+    <link rel="stylesheet" href="stylesheet.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:   '',
+        VERSION:    '0'
+      };
+    </script>
+    <script type="text/javascript" src="../_static/jquery.js"></script>
+
+    <script type="text/javascript" src="../_static/interface.js"></script>
+    <script type="text/javascript" src="../_static/doctools.js"></script>
+    
+    <title>${title}</title>
+</head>
+
+</#macro>
+
+
+<#macro helium_api_header title>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<@helium_api_head_section title="${title}"/>
+
+<body>
+    <@helium_api_navbar/>
+    <hr/>
+</#macro>
+
+
+<#macro helium_api_html_footer>
+    <hr/>
+    <@helium_api_navbar/>
+    <font size="-2">Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html</font>
+ </body>
+
+</html>
+
+</#macro>
+
+
+<#macro helium_api_location_path location>
+    <#assign target_line=""/>
+    <#assign res = location?matches(":(\\d+):$") />
+    <#list res as m>
+        <#assign target_line="#L${m?groups[1]}"/>
+    </#list>      
+    <#assign location_path=location/>
+    <#if location?index_of("helium\\") &gt; 0>
+        <#assign location_path=location?substring(location?last_index_of('helium\\'))/>
+    </#if>
+       <#assign target_url=location_path?replace("\\", "/")?replace(":(\\d+):", "", 'ri') />
+    <tt class="docutils literal"><a href="${helium_browser_trunk}/${target_url}${target_line}">${location_path}</a></tt>  
+</#macro>
+
+<#macro helium_project_path location>
+    <#assign location_path=location/>
+    <#if location?index_of("helium\\") &gt; 0>
+        <#assign location_path=location?substring(location?last_index_of('helium\\'))/>
+    </#if>
+       <#assign target_url=location_path?replace("\\", "/")?replace(":(\\d+):", "", 'ri') />
+    <tt class="docutils literal"><a href="${helium_browser_trunk}/${target_url}">${target_url}</a></tt>  
+</#macro>
+
+<#-- Macros for recursively handling random HTML elements inside documentation elements. -->
+<#macro tt> <tt><#recurse></tt> </#macro>
+
+<#macro p><p><#recurse></p></#macro>
+
+<#macro ul><ul><#recurse></ul></#macro>
+
+<#macro li><li><#recurse></li></#macro>
+
+<#macro b><b><#recurse></b></#macro>
+
+<#macro pre><pre>${.node?html}</pre></#macro>
+
+<#macro @text>${.node?trim}</#macro>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/apisearchindex.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+.. index::
+  module:  Helium API Search
+
+=================
+Helium API Search
+=================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/deprecated-list.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,83 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<@helium_api_header title="Deprecated targets (Helium)"/>
+
+
+    <font size="+1" class="frameheadingfont">
+        <b>Deprecated targets</b>
+    </font>
+    <br/>
+
+    <table border="0" width="100%" summary="">
+    <tr>
+    <td style="white-space: nowrap">
+    <#assign targetlist=doc.antDatabase.project.target.name?sort>
+    <#list targetlist as targetvar>
+    
+      <#list doc.antDatabase.project.target as targetref>
+        <#if targetvar == targetref.name>
+          <#if targetref.deprecated?size &gt; 0>
+          <font class="frameitemfont">
+              <a href="target-${targetvar}.html" title="${targetvar}" target="classframe">${targetvar}</a>
+              <br/>${targetref.deprecated}
+          </font>
+          <br/>
+          </#if>
+        </#if>
+      </#list>
+    
+    </#list>
+    </td>
+    </tr>
+    </table>
+
+    <br/>
+    <font size="+1" class="frameheadingfont">
+        <b>Deprecated properties</b>
+    </font>
+    <br/>
+
+    <table border="0" width="100%" summary="">
+    <tr>
+    <td style="white-space: nowrap">
+    <#assign propertylist=data.heliumDataModel.property.name?sort>
+    <#list propertylist as propertyvar>
+      <#list data.heliumDataModel.property as propertyref>
+      <#if propertyvar == propertyref.name>
+        <#if propertyref.deprecated?size &gt; 0>
+        <font class="frameitemfont">
+        <a href="property-${propertyvar}.html" title="${propertyvar}" target="classframe">${propertyvar}</a>
+        <br/>${propertyref.deprecated}
+        </font>
+        <br/>
+        </#if>
+      </#if>
+      </#list>
+    </#list>
+    </td>
+    </tr>
+    </table>
+
+
+<@helium_api_html_footer/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/help.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<@helium_api_header title="Helium API Help"/>
+
+    <center>
+    <h1>
+    How This API Document Is Organized
+    </h1>
+    
+    </center>
+    
+    This API document describes the Helium user API (Application Programming Interface) in terms of its Ant targets, properties and other configuration. It has pages corresponding to the items in the navigation bar, described as follows:
+    
+    <h3>Project</h3>
+    
+    A project corresponds to an Apache Ant XML file. Each project contains a number of targets.
+    
+    <h3>Target</h3>
+    
+    Each target has its own page listing the following sections:
+    <ul>
+    <li>Location</li>
+    <li>Description</li>
+    <li>Property dependencies. A list of Ant properties that this target uses and their edit status requirements.</li>
+    <li>Target dependencies. A list of other targets that will be called before or during this target execution.</li>
+    </ul>
+    
+    Target dependencies legend:
+    <ul>
+    <li>Blue arrows point to direct dependencies.</li>
+    <li>Green arrows point to antcall and runtarget dependencies.</li>
+    </ul>
+    
+    <p align="center">
+    <img src="target-example.dot.png" usemap="#target-example"
+         style="border-style: none"/>
+    <map name="target-example" id="target-example">
+        <#include "target-example.dot.cmap"/>
+    </map>
+    </p>
+
+    <h3>Property Group</h3>
+    A list of Property groups that group together related configuration elements, their usage requirements within that group and their edit status requirements..    
+    
+    <h3>Property</h3>
+    Each property has its own page listing the following sections:
+    <ul>
+    <li>Description</li>
+    <li>Usage</li>
+    <li>Type</li>
+    <li>Edit Status : The values could be must, recommended, allowed, discouraged or never.</li>
+    </ul>    
+    <h3></h3>
+    <h3></h3>
+
+
+<@helium_api_html_footer/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/index-1.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<@helium_api_header title="Index (Helium API)"/>
+
+
+
+    <h1>Index</h1>
+    <dl>
+        <#assign indexlist = {}>
+        <#list data.heliumDataModel.property.name as propertyName>
+            <#assign indexlist = indexlist + {propertyName: "property"}>
+        </#list>
+        <#list doc.antDatabase.project.target.name as targetName>
+            <#assign indexlist = indexlist + {targetName: "target"}>
+        </#list>
+        
+        <#assign alphabetlist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']>
+        <#list alphabetlist as letter>
+            <a href="#${letter}">${letter?upper_case}</a>
+        </#list>
+        
+        <#list alphabetlist as letter>
+            <h2><a name="${letter}">${letter?upper_case}</a></h2>
+            <#list indexlist?keys?sort as element>
+                <#if element?starts_with(letter)>
+                    <dt><a href="${indexlist[element]}-${element}.html">${element}</a></dt>
+                </#if>
+            </#list>
+            <p/>
+        </#list>
+    </dl>
+
+
+<@helium_api_html_footer/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/index.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+     
+<#include "api.ftllib"/>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<@helium_api_head_section title="Helium API"/>
+
+<frameset cols="20%,80%">
+<frameset rows="30%,70%">
+<frame src="overview-frame.html" name="packagelistframe" title="All packages"/>
+<frame src="alltargets-frame.html" name="packageframe" title="All classes and interfaces (except non-static nested types)"/>
+</frameset>
+<frame src="overview-summary.html" name="classframe" title="package, class and interface descriptions"/>
+</frameset>
+
+<noframes>
+<body>
+<h2>frame alert</h2>
+<p/>
+this document is designed to be viewed using the frames feature. if you see this message, you are using a non-frame-capable web client.
+<br/>
+link to<a href="overview-summary.html">non-frame version.</a>
+</body>
+</noframes>
+
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/macro.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+<#list doc.antDatabase.project.macro as macro>
+<@pp.changeOutputFile name="macro-${macro.name}.html" />
+
+<@helium_api_header title="Macro ${macro.name}"/>
+
+
+
+<h2>Macro ${macro.name}</h2>
+
+<p><b>Location</b></p>
+<p><@helium_api_location_path location="${macro.location}"/></p>
+
+<hr/>
+
+<h3>Description</h3>
+<p>
+<#recurse macro.documentation>
+</p>
+<p/>
+
+<p>Example: <pre>${macro.usage}</pre></p>
+
+<hr/>
+   
+<@helium_api_html_footer/>
+
+</#list>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/overview-frame.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<#include "api.ftllib"/>
+
+<@helium_api_head_section title="Overview (Helium API)"/>
+
+<body bgcolor="white">
+
+    <table border="0" width="100%" summary="">
+    <tr>
+    <td style="white-space: nowrap"><font size="+1" class="frametitlefont">
+    <b></b></font></td>
+    </tr>
+    </table>
+    
+    <table border="0" width="100%" summary="">
+    <tr>
+    <td style="white-space: nowrap">
+    <font class="frameitemfont">
+    <a href="alltargets-frame.html" target="packageframe">All targets</a>
+    <br/>
+    <a href="allproperties-frame.html" target="packageframe">All properties</a>
+    <br/>
+    <a href="allmacros-frame.html" target="packageframe">All macros</a>
+    </font>
+    <p/>
+    
+    <font size="+1" class="frameheadingfont">Projects</font>
+    <br/>
+    <#assign projectlist=doc.antDatabase.project.name?sort>
+    <#list projectlist as project>
+    <font class="frameitemfont"><a href="project-frame-${project}.html" target="packageframe">${project}</a></font>
+    <br/>
+    </#list>
+    
+    <p/>
+    <font size="+1" class="frameheadingfont">Property groups</font>
+    <br/>
+    <#assign grouplist=data.heliumDataModel.group.name?sort>
+    <#list grouplist as group>
+    <font class="frameitemfont"><a href="propertygroups-frame-${group}.html" target="packageframe">${group}</a></font>
+    <br/>
+    </#list>
+    
+    
+    </td>
+    </tr>
+    </table>
+    
+    <p/>
+    &#160;
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/overview-summary.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<@helium_api_header title="Helium API"/>
+
+
+    <center>
+        <h1>Helium API</h1>
+    </center>
+    
+    <p>
+    This is the API specification for the Helium build toolkit.
+    </p>
+    
+    <ul>
+        <li><a href="#projects">Projects</a></li>
+        <li><a href="#propertygroups">Property groups</a></li>
+    </ul>
+    
+    <h2><a name="projects">Projects</a></h2>
+    <p>
+    Helium is configured into a set of Ant project files that group related functionality.
+    </p>
+    <table class="docutils">
+        <tr>
+            <th class="head">Project name</th>
+            <th class="head">Description</th>
+        </tr>
+        <#assign projectInfo = {}>
+        <#list doc.antDatabase.project as project>
+            <#assign projectInfo = projectInfo + {project.name: project.documentation}>
+        </#list>
+        <#list projectInfo?keys?sort as name>
+            <tr>
+                <td><a href="project-${name}.html" target="classframe">${name}</a></td>
+                <td><#recurse projectInfo[name]></td>
+            </tr>
+        </#list>
+    </table>
+    <br/>
+    
+    <h2><a name="propertygroups">Property groups</a></h2>
+    <p>
+    Property groups define a set of properties that relate to a specific feature or functionality in Helium.
+    </p>
+    <table class="docutils">
+        <tr>
+            <th class="head">Property group name</th>
+            <th class="head">Description</th>
+        </tr>
+        <#list data.heliumDataModel.group as group>
+            <tr>
+                <td><a href="propertygroup-${group.name}.html" target="classframe">${group.name}</a></td>
+                <td>${group.description}</td>
+            </tr>
+        </#list>
+    </table>    
+
+<@helium_api_html_footer/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/project-frame.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#list doc.antDatabase.project as project>
+<@pp.changeOutputFile name="project-frame-${project.name}.html" />
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<#include "api.ftllib"/>
+
+<@helium_api_head_section title="Project (Helium API)"/>
+
+<body>
+    <table border="0" width="100%" summary="">
+    <tr>
+        <td style="white-space: nowrap">
+            <font size="+1" class="frameheadingfont">Targets</font>&#160;
+            <font class="frameitemfont">
+            <br/>
+    
+            <#assign targetlist=project.target.name?sort>
+            <#list targetlist as target>
+            <a href="target-${target}.html" title="" target="classframe">${target}</a>
+            <br/>
+            </#list>
+            </font>
+        </td>
+    </tr>
+    </table>
+</body>
+
+</html>
+
+</#list>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/project.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<#list doc.antDatabase.project as project>
+<@pp.changeOutputFile name="project-${project.name}.html" />
+
+<@helium_api_header title="Project ${project.name}"/>
+
+
+    
+<h2>Project ${project.name}</h2>
+
+<p><b>Location</b></p>
+<#if (project[".//target"]?size > 0)>
+<p><@helium_project_path location="${project.target[0].location}"/></p>
+</#if>
+<h3>Description</h3>
+<p>
+<#recurse project.documentation>
+</p>
+<p/>
+<hr/>
+
+
+<h3>Targets</h3>
+<table class="docutils">
+    <tr>
+        <th class="head">Target name</th><th class="head">Description</th>
+    </tr>
+    <#assign targetInfo = {}>
+    <#list project.target as target>
+        <#assign targetInfo = targetInfo + {target.name: target.documentation}>
+    </#list>
+    <#list targetInfo?keys?sort as name>
+        <tr>
+            <td><a href="target-${name}.html" target="classframe">${name}</a></td><td><#recurse targetInfo[name]></td>
+        </tr>
+    </#list>
+</table>
+
+<h3>Properties</h3>
+
+<#assign propertymodel=data.heliumDataModel.property>
+<#assign propertylist=project.property>
+<#list propertymodel as propertyInModel>
+<#list propertylist as propertyvar>
+    <#if propertyvar.name == propertyInModel.name>
+        <font class="frameitemfont">
+        <a href="property-${propertyvar.name}.html" title="${propertyvar.name}" target="classframe">${propertyvar.name}</a>
+        </font>
+        <br/>
+    </#if>
+</#list>
+</#list>
+
+<h3>File Includes</h3>
+<#assign filelist=project.fileDependency>
+<#list filelist as filelistvar>
+<font class="frameitemfont">
+${filelistvar}
+</font>
+<br/>
+</#list>
+
+<h3>Python Modules</h3>
+<#assign pymodulelist=project.pythonDependency>
+<#list pymodulelist.module as pymodulevar>
+  <#if pymodulevar?size &gt; 0>        
+    <font class="frameitemfont">
+      ${pymodulevar}
+    </font>  
+  </#if>
+<br/>
+</#list>
+        
+
+
+<@helium_api_html_footer/>
+
+</#list>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/properties-table.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<@helium_api_header title="Properties (Helium API)"/>
+
+<script type="text/javascript" src="properties-table.js"></script>
+
+    <center>
+    <h1>
+    Properties table(Sortable)
+    </h1>
+    <table class="sortable" border="1" cellpadding="5" ID="tableSort">
+    <tr>
+    <th onmouseover="this.style.cursor = 'pointer';"><font color="blue"><u>Property</u></font></th>
+    <th onmouseover="this.style.cursor = 'pointer';"><font color="blue"><u>Description</u></font></th>
+    <th onmouseover="this.style.cursor = 'pointer';"><font color="blue"><u>Edit Status</u></font></th>
+    <th onmouseover="this.style.cursor = 'pointer';"><font color="blue"><u>Type</u></font></th>
+    </tr>
+    <#assign propertySort=data.heliumDataModel.property.name?sort>
+    <#assign propertyTable=data.heliumDataModel.property>
+    <#list propertySort as propertyName>
+    <#list propertyTable as property>
+    <#if propertyName == property.name>
+    <tr>
+    <td><a href="property-${property.name}.html" title="${property.name}" target="classframe">${property.name}</a></td>
+    <td>${property.description}</td>
+    <td>${property.editStatus}</td>
+    <td>${property.type}</td>
+    </tr>
+    </#if>
+    </#list>
+    </#list>
+    </table>
+
+
+<@helium_api_html_footer/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/properties-table.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,492 @@
+/*
+  SortTable
+  version 2
+  7th April 2007
+  Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
+  
+  Instructions:
+  Download this file
+  Add <script src="sorttable.js"></script> to your HTML
+  Add class="sortable" to any table you'd like to make sortable
+  Click on the headers to sort
+  
+  Thanks to many, many people for contributions and suggestions.
+  Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
+  This basically means: do what you want with it.
+*/
+
+ 
+var stIsIE = /*@cc_on!@*/false;
+
+sorttable = {
+  init: function() {
+    // quit if this function has already been called
+    if (arguments.callee.done) return;
+    // flag this function so we don't do the same thing twice
+    arguments.callee.done = true;
+    // kill the timer
+    if (_timer) clearInterval(_timer);
+    
+    if (!document.createElement || !document.getElementsByTagName) return;
+    
+    sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
+    
+    forEach(document.getElementsByTagName('table'), function(table) {
+      if (table.className.search(/\bsortable\b/) != -1) {
+        sorttable.makeSortable(table);
+      }
+    });
+    
+  },
+  
+  makeSortable: function(table) {
+    if (table.getElementsByTagName('thead').length == 0) {
+      // table doesn't have a tHead. Since it should have, create one and
+      // put the first table row in it.
+      the = document.createElement('thead');
+      the.appendChild(table.rows[0]);
+      table.insertBefore(the,table.firstChild);
+    }
+    // Safari doesn't support table.tHead, sigh
+    if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
+    
+    if (table.tHead.rows.length != 1) return; // can't cope with two header rows
+    
+    // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
+    // "total" rows, for example). This is B&R, since what you're supposed
+    // to do is put them in a tfoot. So, if there are sortbottom rows,
+    // for backwards compatibility, move them to tfoot (creating it if needed).
+    sortbottomrows = [];
+    for (var i=0; i<table.rows.length; i++) {
+      if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {
+        sortbottomrows[sortbottomrows.length] = table.rows[i];
+      }
+    }
+    if (sortbottomrows) {
+      if (table.tFoot == null) {
+        // table doesn't have a tfoot. Create one.
+        tfo = document.createElement('tfoot');
+        table.appendChild(tfo);
+      }
+      for (var i=0; i<sortbottomrows.length; i++) {
+        tfo.appendChild(sortbottomrows[i]);
+      }
+      delete sortbottomrows;
+    }
+    
+    // work through each column and calculate its type
+    headrow = table.tHead.rows[0].cells;
+    for (var i=0; i<headrow.length; i++) {
+      // manually override the type with a sorttable_type attribute
+      if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
+        mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
+        if (mtch) { override = mtch[1]; }
+          if (mtch && typeof sorttable["sort_"+override] == 'function') {
+            headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
+          } else {
+            headrow[i].sorttable_sortfunction = sorttable.guessType(table,i);
+          }
+          // make it clickable to sort
+          headrow[i].sorttable_columnindex = i;
+          headrow[i].sorttable_tbody = table.tBodies[0];
+          dean_addEvent(headrow[i],"click", function(e) {
+
+          if (this.className.search(/\bsorttable_sorted\b/) != -1) {
+            // if we're already sorted by this column, just 
+            // reverse the table, which is quicker
+            sorttable.reverse(this.sorttable_tbody);
+            this.className = this.className.replace('sorttable_sorted',
+                                                    'sorttable_sorted_reverse');
+            this.removeChild(document.getElementById('sorttable_sortfwdind'));
+            sortrevind = document.createElement('span');
+            sortrevind.id = "sorttable_sortrevind";
+            sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5</font>' : '&nbsp;&#x25B4;';
+            this.appendChild(sortrevind);
+            return;
+          }
+          if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
+            // if we're already sorted by this column in reverse, just 
+            // re-reverse the table, which is quicker
+            sorttable.reverse(this.sorttable_tbody);
+            this.className = this.className.replace('sorttable_sorted_reverse',
+                                                    'sorttable_sorted');
+            this.removeChild(document.getElementById('sorttable_sortrevind'));
+            sortfwdind = document.createElement('span');
+            sortfwdind.id = "sorttable_sortfwdind";
+            sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
+            this.appendChild(sortfwdind);
+            return;
+          }
+          
+          // remove sorttable_sorted classes
+          theadrow = this.parentNode;
+          forEach(theadrow.childNodes, function(cell) {
+            if (cell.nodeType == 1) { // an element
+              cell.className = cell.className.replace('sorttable_sorted_reverse','');
+              cell.className = cell.className.replace('sorttable_sorted','');
+            }
+          });
+          sortfwdind = document.getElementById('sorttable_sortfwdind');
+          if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }
+          sortrevind = document.getElementById('sorttable_sortrevind');
+          if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }
+          
+          this.className += ' sorttable_sorted';
+          sortfwdind = document.createElement('span');
+          sortfwdind.id = "sorttable_sortfwdind";
+          sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
+          this.appendChild(sortfwdind);
+
+            // build an array to sort. This is a Schwartzian transform thing,
+            // i.e., we "decorate" each row with the actual sort key,
+            // sort based on the sort keys, and then put the rows back in order
+            // which is a lot faster because you only do getInnerText once per row
+            row_array = [];
+            col = this.sorttable_columnindex;
+            rows = this.sorttable_tbody.rows;
+            for (var j=0; j<rows.length; j++) {
+              row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
+            }
+            /* If you want a stable sort, uncomment the following line */
+            //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
+            /* and comment out this one */
+            row_array.sort(this.sorttable_sortfunction);
+            
+            tb = this.sorttable_tbody;
+            for (var j=0; j<row_array.length; j++) {
+              tb.appendChild(row_array[j][1]);
+            }
+            
+            delete row_array;
+          });
+        }
+    }
+  },
+  
+  guessType: function(table, column) {
+    // guess the type of a column based on its first non-blank row
+    sortfn = sorttable.sort_alpha;
+    for (var i=0; i<table.tBodies[0].rows.length; i++) {
+      text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
+      if (text != '') {
+        if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
+          return sorttable.sort_numeric;
+        }
+        // check for a date: dd/mm/yyyy or dd/mm/yy 
+        // can have / or . or - as separator
+        // can be mm/dd as well
+        possdate = text.match(sorttable.DATE_RE)
+        if (possdate) {
+          // looks like a date
+          first = parseInt(possdate[1]);
+          second = parseInt(possdate[2]);
+          if (first > 12) {
+            // definitely dd/mm
+            return sorttable.sort_ddmm;
+          } else if (second > 12) {
+            return sorttable.sort_mmdd;
+          } else {
+            // looks like a date, but we can't tell which, so assume
+            // that it's dd/mm (English imperialism!) and keep looking
+            sortfn = sorttable.sort_ddmm;
+          }
+        }
+      }
+    }
+    return sortfn;
+  },
+  
+  getInnerText: function(node) {
+    // gets the text we want to use for sorting for a cell.
+    // strips leading and trailing whitespace.
+    // this is *not* a generic getInnerText function; it's special to sorttable.
+    // for example, you can override the cell text with a customkey attribute.
+    // it also gets .value for <input> fields.
+    
+    hasInputs = (typeof node.getElementsByTagName == 'function') &&
+                 node.getElementsByTagName('input').length;
+    
+    if (node.getAttribute("sorttable_customkey") != null) {
+      return node.getAttribute("sorttable_customkey");
+    }
+    else if (typeof node.textContent != 'undefined' && !hasInputs) {
+      return node.textContent.replace(/^\s+|\s+$/g, '');
+    }
+    else if (typeof node.innerText != 'undefined' && !hasInputs) {
+      return node.innerText.replace(/^\s+|\s+$/g, '');
+    }
+    else if (typeof node.text != 'undefined' && !hasInputs) {
+      return node.text.replace(/^\s+|\s+$/g, '');
+    }
+    else {
+      switch (node.nodeType) {
+        case 3:
+          if (node.nodeName.toLowerCase() == 'input') {
+            return node.value.replace(/^\s+|\s+$/g, '');
+          }
+        case 4:
+          return node.nodeValue.replace(/^\s+|\s+$/g, '');
+          break;
+        case 1:
+        case 11:
+          var innerText = '';
+          for (var i = 0; i < node.childNodes.length; i++) {
+            innerText += sorttable.getInnerText(node.childNodes[i]);
+          }
+          return innerText.replace(/^\s+|\s+$/g, '');
+          break;
+        default:
+          return '';
+      }
+    }
+  },
+  
+  reverse: function(tbody) {
+    // reverse the rows in a tbody
+    newrows = [];
+    for (var i=0; i<tbody.rows.length; i++) {
+      newrows[newrows.length] = tbody.rows[i];
+    }
+    for (var i=newrows.length-1; i>=0; i--) {
+       tbody.appendChild(newrows[i]);
+    }
+    delete newrows;
+  },
+  
+  /* sort functions
+     each sort function takes two parameters, a and b
+     you are comparing a[0] and b[0] */
+  sort_numeric: function(a,b) {
+    aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));
+    if (isNaN(aa)) aa = 0;
+    bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); 
+    if (isNaN(bb)) bb = 0;
+    return aa-bb;
+  },
+  sort_alpha: function(a,b) {
+    if (a[0]==b[0]) return 0;
+    if (a[0]<b[0]) return -1;
+    return 1;
+  },
+  sort_ddmm: function(a,b) {
+    mtch = a[0].match(sorttable.DATE_RE);
+    y = mtch[3]; m = mtch[2]; d = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt1 = y+m+d;
+    mtch = b[0].match(sorttable.DATE_RE);
+    y = mtch[3]; m = mtch[2]; d = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt2 = y+m+d;
+    if (dt1==dt2) return 0;
+    if (dt1<dt2) return -1;
+    return 1;
+  },
+  sort_mmdd: function(a,b) {
+    mtch = a[0].match(sorttable.DATE_RE);
+    y = mtch[3]; d = mtch[2]; m = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt1 = y+m+d;
+    mtch = b[0].match(sorttable.DATE_RE);
+    y = mtch[3]; d = mtch[2]; m = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt2 = y+m+d;
+    if (dt1==dt2) return 0;
+    if (dt1<dt2) return -1;
+    return 1;
+  },
+  
+  shaker_sort: function(list, comp_func) {
+    // A stable sort function to allow multi-level sorting of data
+    // see: http://en.wikipedia.org/wiki/Cocktail_sort
+    // thanks to Joseph Nahmias
+    var b = 0;
+    var t = list.length - 1;
+    var swap = true;
+
+    while(swap) {
+        swap = false;
+        for(var i = b; i < t; ++i) {
+            if ( comp_func(list[i], list[i+1]) > 0 ) {
+                var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
+                swap = true;
+            }
+        } // for
+        t--;
+
+        if (!swap) break;
+
+        for(var i = t; i > b; --i) {
+            if ( comp_func(list[i], list[i-1]) < 0 ) {
+                var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
+                swap = true;
+            }
+        } // for
+        b++;
+
+    } // while(swap)
+  }  
+}
+
+/* ******************************************************************
+   Supporting functions: bundled here to avoid depending on a library
+   ****************************************************************** */
+
+// Dean Edwards/Matthias Miller/John Resig
+
+/* for Mozilla/Opera9 */
+if (document.addEventListener) {
+    document.addEventListener("DOMContentLoaded", sorttable.init, false);
+}
+
+/* for Internet Explorer */
+/*@cc_on @*/
+/*@if (@_win32)
+    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
+    var script = document.getElementById("__ie_onload");
+    script.onreadystatechange = function() {
+        if (this.readyState == "complete") {
+            sorttable.init(); // call the onload handler
+        }
+    };
+/*@end @*/
+
+/* for Safari */
+if (/WebKit/i.test(navigator.userAgent)) { // sniff
+    var _timer = setInterval(function() {
+        if (/loaded|complete/.test(document.readyState)) {
+            sorttable.init(); // call the onload handler
+        }
+    }, 10);
+}
+
+/* for other browsers */
+window.onload = sorttable.init;
+
+// written by Dean Edwards, 2005
+// with input from Tino Zijdel, Matthias Miller, Diego Perini
+
+// http://dean.edwards.name/weblog/2005/10/add-event/
+
+function dean_addEvent(element, type, handler) {
+    if (element.addEventListener) {
+        element.addEventListener(type, handler, false);
+    } else {
+        // assign each event handler a unique ID
+        if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
+        // create a hash table of event types for the element
+        if (!element.events) element.events = {};
+        // create a hash table of event handlers for each element/event pair
+        var handlers = element.events[type];
+        if (!handlers) {
+            handlers = element.events[type] = {};
+            // store the existing event handler (if there is one)
+            if (element["on" + type]) {
+                handlers[0] = element["on" + type];
+            }
+        }
+        // store the event handler in the hash table
+        handlers[handler.$$guid] = handler;
+        // assign a global event handler to do all the work
+        element["on" + type] = handleEvent;
+    }
+};
+// a counter used to create unique IDs
+dean_addEvent.guid = 1;
+
+function removeEvent(element, type, handler) {
+    if (element.removeEventListener) {
+        element.removeEventListener(type, handler, false);
+    } else {
+        // delete the event handler from the hash table
+        if (element.events && element.events[type]) {
+            delete element.events[type][handler.$$guid];
+        }
+    }
+};
+
+function handleEvent(event) {
+    var returnValue = true;
+    // grab the event object (IE uses a global event object)
+    event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
+    // get a reference to the hash table of event handlers
+    var handlers = this.events[event.type];
+    // execute each event handler
+    for (var i in handlers) {
+        this.$$handleEvent = handlers[i];
+        if (this.$$handleEvent(event) === false) {
+            returnValue = false;
+        }
+    }
+    return returnValue;
+};
+
+function fixEvent(event) {
+    // add W3C standard event methods
+    event.preventDefault = fixEvent.preventDefault;
+    event.stopPropagation = fixEvent.stopPropagation;
+    return event;
+};
+fixEvent.preventDefault = function() {
+    this.returnValue = false;
+};
+fixEvent.stopPropagation = function() {
+  this.cancelBubble = true;
+}
+
+// Dean's forEach: http://dean.edwards.name/base/forEach.js
+/*
+    forEach, version 1.0
+    Copyright 2006, Dean Edwards
+    License: http://www.opensource.org/licenses/mit-license.php
+*/
+
+// array-like enumeration
+if (!Array.forEach) { // mozilla already supports this
+    Array.forEach = function(array, block, context) {
+        for (var i = 0; i < array.length; i++) {
+            block.call(context, array[i], i, array);
+        }
+    };
+}
+
+// generic enumeration
+Function.prototype.forEach = function(object, block, context) {
+    for (var key in object) {
+        if (typeof this.prototype[key] == "undefined") {
+            block.call(context, object[key], key, object);
+        }
+    }
+};
+
+// character enumeration
+String.forEach = function(string, block, context) {
+    Array.forEach(string.split(""), function(chr, index) {
+        block.call(context, chr, index, string);
+    });
+};
+
+// globally resolve forEach enumeration
+var forEach = function(object, block, context) {
+    if (object) {
+        var resolve = Object; // default
+        if (object instanceof Function) {
+            // functions have a "length" property
+            resolve = Function;
+        } else if (object.forEach instanceof Function) {
+            // the object implements a custom forEach method so use that
+            object.forEach(block, context);
+            return;
+        } else if (typeof object == "string") {
+            // the object is a string
+            resolve = String;
+        } else if (typeof object.length == "number") {
+            // the object is array-like
+            resolve = Array;
+        }
+        resolve.forEach(object, block, context);
+    }
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/property.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,76 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<#list data.heliumDataModel.property as property>
+<@pp.changeOutputFile name="property-${property.name}.html" />
+
+<@helium_api_header title="property ${property.name}"/>
+
+
+    
+<h2>Property ${property.name}</h2>
+<b>Type</b>
+<p>
+${property.type}
+</p>
+<b>Edit status</b>
+<p>
+${property.editStatus}
+</p>
+<b>Default value</b>
+<#assign ifDefined = false>
+<#list doc.antDatabase.project.property as propDatabase>
+    <#if propDatabase.name == property.name>       
+        <p>
+        <tt class="docutils literal">${propDatabase.defaultValue}</tt>
+        </p>
+        <#assign ifDefined = true>
+        <#break>
+    </#if>
+</#list>
+<#if ifDefined == false>
+    <p>
+    None defined.
+    </p>
+</#if>
+<#if property.deprecated?size &gt; 0>
+    <b>Deprecated</b>
+    <p>
+    ${property.deprecated}
+    </p>        
+</#if>
+
+<hr/>
+
+<h3>Description</h3>
+<p>
+${property.description}
+</p>
+
+
+
+<@helium_api_html_footer/>
+
+</#list>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/propertygroup.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<#list data.heliumDataModel.group as group>
+<@pp.changeOutputFile name="propertygroup-${group.name}.html" />
+
+<@helium_api_header title="Property group ${group.name}"/>
+
+
+
+<h2>Property group ${group.name}</h2>
+
+<h3>Description </h3>
+<p>
+${group.description}
+</p>
+
+<h3>Properties</h3>
+<#assign propertyList=group.propertyRef?sort>
+<p> 
+<table class="docutils" width="50%">
+    <tr>
+        <th class="head">Name</th>
+        <th class="head">Edit status</th>
+        <th class="head">Deprecated</th>
+    </tr>
+    <tr>
+        <td colspan="3">User editable properties</td>
+    </tr>
+    <#list propertyList as property>
+        <#list data.heliumDataModel.property as propDataModel>
+            <#if property == propDataModel.name>
+                <#if propDataModel.editStatus == "must" || propDataModel.editStatus == "recommended" || propDataModel.editStatus == "allowed">
+                    <tr>
+                        <td><a href="property-${property}.html" title="${propDataModel.description}" target="classframe"><tt class="docutils literal">${property}</tt></a></td>
+                        <td><a href="help.html" title="Help" target="classframe">${propDataModel.editStatus}</a></td>
+                        <td>
+                            <#if propDataModel.deprecated?size &gt; 0>
+                                ${propDataModel.deprecated}
+                            </#if>
+                        </td>
+                    </tr>
+                </#if>
+            </#if>
+        </#list>
+    </#list>
+    <tr>
+        <td colspan="3">Internal properties</td>
+    </tr>
+    <#list propertyList as property>
+        <#list data.heliumDataModel.property as propDataModel>
+            <#if property == propDataModel.name>
+                <#if propDataModel.editStatus == "never" || propDataModel.editStatus == "discouraged">
+                    <tr>
+                        <td><a href="property-${property}.html" title="${propDataModel.description}" target="classframe"><tt class="docutils literal">${property}</tt></a></td>
+                        <td><a href="help.html" title="Help" target="classframe">${propDataModel.editStatus}</a></td>
+                        <td>
+                            <#if propDataModel.deprecated?size &gt; 0>
+                                ${propDataModel.deprecated}
+                            </#if>
+                        </td>
+                    </tr>
+                </#if>
+            </#if>
+        </#list>
+    </#list>
+</table>
+</p>
+
+
+
+<@helium_api_html_footer/>
+
+</#list>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/propertygroups-frame.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#list data.heliumDataModel.group as group>
+<@pp.changeOutputFile name="propertygroups-frame-${group.name}.html" />
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<#include "api.ftllib"/>
+
+<@helium_api_head_section title=""/>
+
+<body>
+    <table border="0" width="100%" summary="">
+    <tr>
+        <td>
+            <font size="+1" class="frameheadingfont">
+                <a href="propertygroup-${group.name}.html" target="classframe">${group.name}</a>
+            </font>
+        </td>
+    </tr>
+    <tr>
+    <td style="white-space: nowrap">
+        <font size="+1" class="frameheadingfont">Properties</font>&#160;
+        <br/>
+        <font class="frameitemfont">
+            <#assign propertyList=group.propertyRef?sort>
+            <#list propertyList as property>
+                <a href="property-${property}.html" title="${property}" target="classframe">${property}</a>
+                <br/>
+            </#list>
+        </font>
+    </td>
+    </tr>
+    </table>
+</body>
+
+</html>
+
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/stylesheet.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,823 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: white;
+    color: #000;
+    margin: 5;
+    padding: 5;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    color: #fff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    color: #fff;
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related a {
+    color: white;
+}
+
+/* ::: TOC :::: */
+div.sidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sidebar p {
+    color: white;
+}
+
+div.sidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sidebar ul {
+    margin: 10px;
+    padding: 0;
+    list-style: none;
+    color: white;
+}
+
+div.sidebar ul ul,
+div.sidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sidebar a {
+    color: #98dbcc;
+}
+
+div.sidebar form {
+    margin-top: 10px;
+}
+
+div.sidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+    margin: -5px 10px 5px 10px;
+    padding: 10px;
+    line-height: 160%;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+    padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    padding: 5px 10px 5px 10px;
+    border-top: 1px solid #cbe7e5;
+    border-bottom: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecomments {
+    position: absolute;
+    right: 20px;
+}
+
+div.inlinecomments a.bubble {
+    display: block;
+    float: right;
+    background-image: url(style/comment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+    text-align: center;
+    padding-top: 3px;
+    font-size: 0.9em;
+    line-height: 14px;
+    font-weight: bold;
+    color: black;
+}
+
+div.inlinecomments a.bubble span {
+    display: none;
+}
+
+div.inlinecomments a.emptybubble {
+    background-image: url(style/nocomment.png);
+}
+
+div.inlinecomments a.bubble:hover {
+    background-image: url(style/hovercomment.png);
+    text-decoration: none;
+    color: #3ca0a4;
+}
+
+div.inlinecomments div.comments {
+    float: right;
+    margin: 25px 5px 0 0;
+    max-width: 50em;
+    min-width: 30em;
+    border: 1px solid #2eabb0;
+    background-color: #f2fbfd;
+    z-index: 150;
+}
+
+div#comments {
+    border: 1px solid #2eabb0;
+    margin-top: 20px;
+}
+
+div#comments div.nocomments {
+    padding: 10px;
+    font-weight: bold;
+}
+
+div.inlinecomments div.comments h3,
+div#comments h3 {
+    margin: 0;
+    padding: 0;
+    background-color: #2eabb0;
+    color: white;
+    border: none;
+    padding: 3px;
+}
+
+div.inlinecomments div.comments div.actions {
+    padding: 4px;
+    margin: 0;
+    border-top: none;
+}
+
+div#comments div.comment {
+    margin: 10px;
+    border: 1px solid #2eabb0;
+}
+
+div.inlinecomments div.comment h4,
+div.commentwindow div.comment h4,
+div#comments div.comment h4 {
+    margin: 10px 0 0 0;
+    background-color: #2eabb0;
+    color: white;
+    border: none;
+    padding: 1px 4px 1px 4px;
+}
+
+div#comments div.comment h4 {
+    margin: 0;
+}
+
+div#comments div.comment h4 a {
+    color: #d5f4f4;
+}
+
+div.inlinecomments div.comment div.text,
+div.commentwindow div.comment div.text,
+div#comments div.comment div.text {
+    margin: -5px 0 -5px 0;
+    padding: 0 10px 0 10px;
+}
+
+div.inlinecomments div.comment div.meta,
+div.commentwindow div.comment div.meta,
+div#comments div.comment div.meta {
+    text-align: right;
+    padding: 2px 10px 2px 0;
+    font-size: 95%;
+    color: #538893;
+    border-top: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+div.commentwindow {
+    position: absolute;
+    width: 500px;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+    display: none;
+    z-index: 130;
+}
+
+div.commentwindow h3 {
+    margin: 0;
+    background-color: #2eabb0;
+    color: white;
+    border: none;
+    padding: 5px;
+    font-size: 1.5em;
+    cursor: pointer;
+}
+
+div.commentwindow div.actions {
+    margin: 10px -10px 0 -10px;
+    padding: 4px 10px 4px 10px;
+    color: #538893;
+}
+
+div.commentwindow div.actions input {
+    border: 1px solid #2eabb0;
+    background-color: white;
+    color: #135355;
+    cursor: pointer;
+}
+
+div.commentwindow div.form {
+    padding: 0 10px 0 10px;
+}
+
+div.commentwindow div.form input,
+div.commentwindow div.form textarea {
+    border: 1px solid #3c9ea2;
+    background-color: white;
+    color: black;
+}
+
+div.commentwindow div.error {
+    margin: 10px 5px 10px 5px;
+    background-color: #fbe5dc;
+    display: none;
+}
+
+div.commentwindow div.form textarea {
+    width: 99%;
+}
+
+div.commentwindow div.preview {
+    margin: 10px 0 10px 0;
+    background-color: #70d0d4;
+    padding: 0 1px 1px 25px;
+}
+
+div.commentwindow div.preview h4 {
+    margin: 0 0 -5px -20px;
+    padding: 4px 0 0 4px;
+    color: white;
+    font-size: 1.3em;
+}
+
+div.commentwindow div.preview div.comment {
+    background-color: #f2fbfd;
+}
+
+div.commentwindow div.preview div.comment h4 {
+    margin: 10px 0 0 0!important;
+    padding: 1px 4px 1px 4px!important;
+    font-size: 1.2em;
+}
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+    border: 1px solid #ccc;
+    background-color: white;
+    color: black;
+}
+
+div#suggest-changes-box textarea {
+    width: 99%;
+    height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview { 
+    background-image: url(style/preview.png);
+    padding: 0 20px 20px 20px;
+    margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+    background-color: #ffe4e4;
+    padding: 10px;
+    margin: 0 -20px 0 -20px;
+    border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 0 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.sortable {
+    border: 0;
+}
+
+table.sortable td, table.sortable th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    padding: 5px;
+    background-color: #efc;
+    color: #333;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+td.linenos pre {
+    padding: 0;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 100%;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.document, 
+    div.documentwrapper, 
+    div.bodywrapper {
+        margin: 0;
+        width : 100%;
+    }
+
+    div.sidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/target-dependencies.dot.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,101 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#list doc.antDatabase.project.target as target>
+<@pp.changeOutputFile name="target-${target.name}.dot" />
+
+strict digraph G {
+    rankdir=LR;
+    rotate=180;
+    ordering=out;
+<#assign currentTarget = target.name>
+<#macro targetFunc targetMain caller>
+
+<#if caller == 0>
+    "${targetMain.name}" [fontcolor=blue,fontsize=12,shape=box,style=filled,href="target-${targetMain.name}.html"];
+    <#list doc.antDatabase.project.target as parent>
+        <#list parent.dependency as dependency>
+            <#if targetMain.name == dependency>
+                <#if parent.name != currentTarget>
+                    "${parent.name}" [fontcolor=brown,fontsize=12,shape=box,href="target-${parent.name}.html"];
+                </#if>
+                <#if dependency.@type == "direct">
+                    "${parent.name}" -> "${targetMain.name}" [color=navyblue,fontsize=12];
+                </#if>
+                <#if dependency.@type == "exec">
+                    "${parent.name}" -> "${targetMain.name}" [color=limegreen,fontsize=12];
+                </#if>
+            </#if>
+        </#list>
+    </#list>
+</#if>
+<#if caller == 1>
+    "${targetMain.name}" [fontcolor=brown,fontsize=12,shape=box,href="target-${targetMain.name}.html"];
+</#if>
+
+<#if targetMain.dependency?size == 1>
+    <#list targetMain.dependency as dependency>
+    "${dependency}" [fontcolor=brown,fontsize=12,shape=box,href="target-${dependency}.html"];
+    </#list>
+</#if>
+
+<#assign depTotal=targetMain.dependency?size>
+<#assign depLastIndex=targetMain.dependency?size-1>
+
+<#if depTotal &gt; 1>
+    <#list 0..depLastIndex as index>
+        <#if targetMain.dependency[index].@type == "direct">
+        "${targetMain.name}" -> "${targetMain.dependency[index]}" [color=navyblue,label="${index+1}",fontsize=12];
+        </#if>
+        <#if targetMain.dependency[index].@type == "exec">
+        "${targetMain.name}" -> "${targetMain.dependency[index]}" [color=limegreen,label="${index+1}",fontsize=12];
+        </#if>
+        <#list doc.antDatabase.project.target as targetDep>
+            <#if targetDep.name == targetMain.dependency[index]>
+            <@targetFunc targetMain=targetDep caller=1 />
+            </#if>
+        </#list>
+    </#list>
+</#if>
+
+<#attempt>
+<#if depTotal == 1>
+    <#if targetMain.dependency.@type == "direct">
+    "${targetMain.name}" -> "${targetMain.dependency[depTotal-1]}" [color=navyblue];
+    </#if>
+    <#if targetMain.dependency.@type == "exec">
+    "${targetMain.name}" -> "${targetMain.dependency[depTotal-1]}" [color=limegreen];
+    </#if>
+    <#list doc.antDatabase.project.target as targetDep>
+        <#if targetDep.name == targetMain.dependency && targetDep.name != "blacktusk-signal">
+        <@targetFunc targetMain=targetDep caller=1 />
+        </#if>
+    </#list>
+</#if>
+<#recover>
+
+</#attempt>
+
+</#macro>
+
+<@targetFunc targetMain=target caller=0 />
+}
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/target-example.dot.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<@pp.changeOutputFile name="target-example.dot" />
+
+strict digraph G {
+    rankdir=LR;
+    rotate=180;
+    ordering=out;    
+    target [fontcolor=brown,fontsize=12,shape=box];
+    direct_dependency [fontcolor=brown,fontsize=12,shape=box];
+    indirect_dependency [fontcolor=brown,fontsize=12,shape=box];
+    antcall_dependency [fontcolor=brown,fontsize=12,shape=box];
+    runtarget_dependency [fontcolor=brown,fontsize=12,shape=box]; 
+    target -> direct_dependency [color=navyblue,label="1",fontsize=12];
+    direct_dependency -> indirect_dependency [color=navyblue,label="1",fontsize=12];
+    target -> antcall_dependency [color=limegreen,label="2",fontsize=12];
+    target -> runtarget_dependency [color=limegreen,label="3",fontsize=12];
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api/target.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,147 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "api.ftllib"/>
+
+<#list doc.antDatabase.project.target as target>
+<@pp.changeOutputFile name="target-${target.name}.html" />
+
+<@helium_api_header title="Target ${target.name}"/>
+
+
+    
+<h2>Target ${target.name}</h2>
+
+<p><b>Location</b></p>
+<p><@helium_api_location_path location="${target.location}"/></p>
+
+<p><b>Conditional execution</b></p>        
+<#if target.ifDependency?length &gt; 0>
+<p>Target <b>is</b> run if property defined: <code>${target.ifDependency}</code></p>
+</#if>
+<#if target.unlessDependency?length &gt; 0>
+<p>Target <b>is not</b> run if property defined: <code>${target.unlessDependency}</code></p>
+</#if>
+<#if target.ifDependency?length == 0 && target.unlessDependency?length == 0>
+<p>No conditions on target execution.</p>
+</#if>
+<hr/>
+
+<h3>Description</h3>
+<p>
+<#recurse target.documentation>
+</p>
+<p/>
+<hr/>
+
+
+<#assign executableList=target.executable?sort>
+<#if executableList?size &gt; 0>
+<h3>Target external Dependency</h3>
+<p> 
+<table class="docutils" width="50%">
+    <tr>
+        <th class="head">Name</th>
+    </tr>
+    <#list executableList as excutable>
+        <tr>
+                    <td>${excutable}</td>
+            </tr>
+    </#list>
+</table>
+</p>
+</#if>
+
+
+<h3>Property dependencies</h3>
+
+<#assign propertyList=target.propertyDependency?sort>
+
+<p> 
+<table class="docutils" width="50%">
+    <tr>
+        <th class="head">Name</th><th class="head">Edit status</th>
+    </tr>
+    <tr>
+        <td colspan="2">User editable properties</td>
+    </tr>
+    <#list propertyList as property>
+        <#list data.heliumDataModel.property as propDataModel>
+            <#if property == propDataModel.name>
+                <#if propDataModel.editStatus == "must" || propDataModel.editStatus == "recommended" || propDataModel.editStatus == "allowed">
+                    <tr>
+                        <td><a href="property-${property}.html" title="${propDataModel.description}" target="classframe"><tt class="docutils literal">${property}</tt></a></td><td><a href="help.html" title="Help" target="classframe">${propDataModel.editStatus}</a></td>
+                    </tr>
+                </#if>
+            </#if>
+        </#list>
+    </#list>
+    <tr>
+        <td colspan="2">Internal properties</td>
+    </tr>
+    <#list propertyList as property>
+        <#list data.heliumDataModel.property as propDataModel>
+            <#if property == propDataModel.name>
+                <#if propDataModel.editStatus == "never" || propDataModel.editStatus == "discouraged">
+                    <tr>
+                        <td><a href="property-${property}.html" title="${propDataModel.description}" target="classframe"><tt class="docutils literal">${property}</tt></a></td><td><a href="help.html" title="Help" target="classframe">${propDataModel.editStatus}</a></td>
+                    </tr>
+                </#if>
+            </#if>
+        </#list>
+    </#list>
+</table>
+</p>
+
+<#if target.deprecated?size &gt; 0>
+    <h3>Deprecated :</h3>
+    <p>
+    ${target.deprecated}
+    </p>
+</#if>
+<hr/>
+
+
+<h3>Target dependencies</h3>
+<p align="center">
+<img src="target-${target.name}.dot.png" alt="${target.name} dependencies" usemap="#dependencies"
+     style="border-style: none"/>
+<map name="dependencies" id="dependencies">
+  <#attempt>
+      <#include "target-${target.name}.dot.cmap"/>
+      <#recover>
+  </#attempt>
+</map>
+</p>
+<hr/>
+
+
+<h3>Source code</h3>
+<pre>
+    ${target.source?html}
+</pre>
+
+
+<@helium_api_html_footer/>
+
+</#list>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/api_changes.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,95 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+##############################
+Helium API Changes
+##############################
+
+.. index::
+  module: Helium API Changes
+
+.. contents::
+
+This describes API changes between release ${old_release} and release ${new_release}.
+
+Projects added
+==============
+<#list doc.apiChanges.project?sort as project>
+    <#if project.@state == 'added'>
+* `${project} <api/helium/project-${project}.html>`_
+    </#if>
+</#list>
+
+Projects removed
+================
+<#list doc.apiChanges.project?sort as project>
+    <#if project.@state == 'removed'>
+* ${project}
+    </#if>
+</#list>
+
+Targets added
+=============
+<#list doc.apiChanges.target?sort as target>
+    <#if target.@state == 'added'>
+* `${target} <api/helium/target-${target}.html>`_
+    </#if>
+</#list>
+
+Targets removed or made private
+===============================
+<#list doc.apiChanges.target?sort as target>
+    <#if target.@state == 'removed'>
+* ${target}
+    </#if>
+</#list>
+
+Properties added
+================
+<#list doc.apiChanges.property?sort as property>
+    <#if property.@state == 'added'>
+* `${property} <api/helium/property-${property}.html>`_
+    </#if>
+</#list>
+
+Properties removed
+==================
+<#list doc.apiChanges.property?sort as property>
+    <#if property.@state == 'removed'>
+* ${property}
+    </#if>
+</#list>
+
+Macros added
+============
+<#list doc.apiChanges.macro?sort as macro>
+    <#if macro.@state == 'added'>
+* `${macro} <api/helium/macro-${macro}.html>`_
+    </#if>
+</#list>
+
+Macros removed
+==============
+<#list doc.apiChanges.macro?sort as macro>
+    <#if macro.@state == 'removed'>
+* ${macro}
+    </#if>
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/architecture.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,101 @@
+###########################
+Helium Architecture
+###########################
+
+.. index::
+  module: Helium Architecture
+
+
+.. contents::
+
+Introduction
+============
+
+.. raw:: html
+   :file: helium_overview.html
+   
+This is a overview of the Helium toolkit and its dependencies as a stack.
+   
+.. index::
+  single: Architectural Principles
+
+Architectural principles
+========================
+
+**Favour reusing existing software over writing new code.** There is a lot of useful open-source software available. If the license is sufficiently open it is better to use what exists. Development of new features should check for any existing software that may fulfill some or all of the implementation requirements.
+
+**Favour reusable libraries over standalone scripts.** Object-orientated programming and the development of libraries encourages reusability, reduced maintenance and higher quality.
+
+**Develop unit tests for testing the libraries.** Unit testing is important for regression testing and for agile development within a team. A developer can make changes and have confidence that no functionality has broken by running the unit tests.
+
+**Prefer platform independence.** The selection of tools and the development of libraries and scripts is done in a way that maximises independence from the underlying OS or hardware platform. Where specific dependencies are required they are configurable. Shell commands should be restricted to the set supported by the Unix Utils package on Windows, to ensure compatibility between Linux and Windows.
+
+.. index::
+  single: Archtectural References
+
+References
+----------
+
+* The Pragmatic Programmer, Andrew Hunt and David Thomas. See the `list of tips`_.
+
+.. _`list of tips` : http://www.pragmaticprogrammer.com/ppbook/extracts/rule_list.html
+
+
+.. index::
+  single: Architectural Practices
+
+Practices
+=========
+
+Files created in Ant, Perl, Python or XML syntax must follow the `Style guide <coding_conventions.html>`_.
+
+
+.. index::
+  single: Architectural Configuration
+
+Configuration
+=============
+
+XML is recommended for defining configuration files. Ant configuration types and tasks should be used where most logical. If a more structured configuration is needed then a custom XML schema can be defined. Existing schemas should be reused where possible.
+
+(add existing schemas)
+
+.. index::
+  single: APIs
+
+APIs 
+=========
+
+See the reference API documentation:
+
+* `Helium API`_
+* `Java APIs`_
+* `Python APIs`_
+* `Custom Ant tasks`_
+
+.. _`Helium API` : api/helium/index.html
+.. _`Java APIs` : api/java/index.html
+.. _`Python APIs` : api/python/index.html
+.. _`Custom Ant tasks` : api/ant/index.html
+
+
+.. index::
+  single: Tools and scripts locations
+
+Tools and scripts locations
+===========================
+
+All tools used by Helium (which means called by Ant at some point during a build sequence, directly or indirectly) come from one of these locations:
+
+* **Inside /helium/tools**. Content is generally developed or imported by the Helium team and is our responsibility. We strive to test it using unit tests where possible and general build execution. It should follow Helium coding guidelines. This may be libraries closely integrated with Ant, or standalone tools called by Ant like iCreatorDP.
+* **Inside /helium/external**. These are tools provided by an external party, which could be open source projects or other teams in Nokia. Updates are the responsibility of the maintainer. Typically Helium developers will import the updates, but if agreed the supplier might also directly make the update. If the content is currently provided as a Synergy project it is desirable to simply use releases of that.
+* **Inside /epoc32**. This covers the Symbian toolchain, iMaker, etc. At the point where the tool is needed it should have been exported into /epoc32.
+* **Already Installed**. All language runtimes such as Java, Perl and Python.
+
+.. index::
+  single: Dependency Diagram
+
+Dependency Diagram
+==================
+
+.. image:: images/dependencies.grph.png
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/coding_conventions.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,266 @@
+##############################
+Coding Conventions
+##############################
+
+.. index::
+  module: Coding Conventions
+
+.. contents::
+
+Introduction
+============
+
+This describes how you should write code for Helium. It covers Ant XML, Java and Python.
+
+.. index::
+  single: General Conventions
+
+General conventions
+===================
+
+* Changing the working directory should be avoided in any language.
+
+.. index::
+  single: Ant Conventions
+
+Ant conventions
+======================
+
+These conventions are applicable to all Ant XML script files.
+
+.. index::
+  single: XML Indentations
+
+XML indentation
+---------------
+
+* Indents are 4 spaces. Tabs should not be used.
+* The XML element structure should be consistently indented.
+
+.. index::
+  single: File Names
+
+File names
+----------
+
+* Ant files intended to be called by a ``bld.bat`` should be named ``build.xml`` (the default name Ant looks for).
+* All other Ant files should end with "``.ant.xml``".
+
+.. index::
+  single: File Organisation
+
+File organisation
+-----------------
+
+* ``helium.ant.xml`` is the root Ant file under ``/helium`` that includes all the other Ant files.
+* ``helium.ant.xml`` should only include top-level build stage Ant files, e.g. ``preparation.ant.xml``. Within each build stage directory, further Ant files should be included by that build stage file. This reduces frequent edits to ``helium.ant.xml``.
+
+.. index::
+  single: Targets
+
+Targets
+-----------
+
+* Target names are a mix of lowercase letters and numbers and the '-' character.
+* Configuration files needed as input to external scripts/tools are not defined as arguments using any kind of hardcoded path (absolute or relative). Rather an Ant property should define the path to the file and that property value is used as the argument in the call to the tool.
+* Ant properties are used in preference (where the option exists) to external environment variables (that start with ``env.``).
+* Targets can be marked as deprecated by adding one optional tag ``<deprecated> value </deprecated>`` in the comment tag top of the target area.
+* Targets can be marked as private by adding ``Private:`` in the comment tag top of the target area.
+
+.. index::
+  single: Properties
+
+.. _properties_label:
+
+Properties
+----------
+
+* Properties are named using lowercase words separated by the '.' character.
+* Values should not have any dependencies on the location of the ``helium`` project. Based on the ``HELIUM_HOME`` setting, the project could be anywhere, so paths should not assume it to be relative to any other location.
+* Properties can be marked as deprecated in the data model by adding one optional tag ``<deprecated>``.
+
+.. csv-table:: Property naming conventions
+   :header: "Rule", "Description"
+   
+   "File paths", "Property name should end with ``.file``"
+   "Directory paths", "Property name should end with ``.dir``. The ``location`` attribute is recommended over ``value``. No trailing slashes are required. Paths should use other properties such as ``build.drive`` to be flexible. Forward slashes should be used, unless backslashes are specifically needed."
+   "Value list", "Property name should end with ``.list``."
+
+Ant tasks
+---------
+
+There are two preferred ways to implement an Ant task:
+
+* A pure Java Task subclass.
+* A ``<scriptdef>`` task using Jep.
+
+In general these guidelines should be noted:
+
+* Use short, descriptive task names that fit with the Ant naming style. All custom tasks should be under the ``hlm:`` namespace.
+* Avoid referencing property values directly inside the task implementation. Data values should typically be passed as attributes.
+* Do not put Jep code inside a .py file. Pylint cannot handle the Java-related syntax. Rather use the embedded scriptdef code to handle the Jep-specific parts and use pure Python libraries where necessary. Use a ``.jep`` file extension if moving the entire scriptdef content out to a separate file.
+
+Implement using tasks when the functionality may be used in more than one place or it will help the design and maintenance to provide a well-defined interface for that function.
+
+Scripts
+-------
+
+A script allows more flexible code than is provided by the standard tasks while not being as formalized as a new custom task. There are two preferred ways to implement embedded scripts:
+
+* A ``<script>`` task using Jep.
+* A ``<hlm:python>`` task using embedded Python code. This typically does not allow much interaction with the Ant process.
+
+Here properties can be accessed directly but it is good practice to only reference them in the embedded code. If the functionality is significant create separate Python libraries as needed and call them from the embedded script, e.g::
+
+    <hlm:python>
+    import mycode
+    mycode.dostuff(r'${prop.1}')
+    </hlm:python>
+    
+    <script language="jep">
+    import mycode
+    value = mycode.dostuff(project.getProperty('prop.1'))
+    project.setProperty('xyz', value)
+    </script>
+    
+Use a script when prototyping or a more specialized operation is needed in only one place. Embedded scripts should generally be kept as short as possible.
+
+.. index::
+  single: Java conventions
+
+Java conventions
+================
+
+.. index::
+  single: Ant Task Documentions
+
+Ant task documentation
+----------------------
+
+* Javadoc comment of a Ant task class should include the Ant-specific tag ``@ant.task``. It accepts three "attributes": ``name``, ``category`` and ``ignored``. When ``ignored=true``, the class will not be included in the documentation. For example::
+    
+    /**
+     * Code Sample for Ant Task class Comments
+     * @ant.task name="copy" category="filesystem"
+     * @ant.task ignored="true"
+     */
+    public class Copy
+
+* The task properties documentation is extracted from the property getter/setter methods. The tags are ``@ant.required`` and ``@ant.not-required`` which indicate if the property is required or not required. For example::
+
+    /**
+     * Code Sample for Ant Task property Comments
+     * @ant.required 
+     * Default is false.
+     */
+    public void setOverwrite(boolean overwrite){ 
+        this.forceOverwrite = overwrite;
+    }
+
+All custom tasks should be commented in this way.
+
+.. index::
+  single: File Execution
+
+File execution
+==============
+
+File execution should not depend on the extension of the file. The appropriate executable should be used to run the script, e.g::
+
+    python foo.py
+    
+not::
+
+    foo.py
+
+
+.. index::
+  single: Documentation conventions
+
+Documentation conventions
+=========================
+
+Standalone documents are written in reStructuredText_ format.
+
+.. _reStructuredText : http://docutils.sourceforge.net/rst.html
+
+
+.. index::
+  single: Python conventions
+
+Python conventions
+=========================
+
+Specific conventions
+--------------------
+
+Python Code Indentation
+```````````````````````
+
+* Indents are 4 spaces. Tabs should not be used.
+
+
+Documentation
+`````````````
+
+* Docstrings are written in reStructuredText_ format, according to `PEP 257 - Docstring Conventions`_. Documentation is extracted using Epydoc_, so the reStructuredText tags that Epydoc recognises are used.
+
+.. _`PEP 257 - Docstring Conventions` : http://www.python.org/dev/peps/pep-0257/
+.. _Epydoc : http://epydoc.sourceforge.net/
+
+
+Unit testing
+````````````
+
+* Unit tests are written for each Python module.
+* They should follow the Nose_ testing framework conventions.
+* The test suite is run by calling ``hlm py-unittest``.
+
+.. _Nose : http://somethingaboutorange.com/mrl/projects/nose/
+
+
+Lint 
+````
+
+* Always check your code with pylint_ before checking it in.
+* Aim for pylint_ score >= 8.
+
+.. _pylint: http://www.logilab.org/857
+
+
+Reference coding standards
+--------------------------
+
+These reference standards are used for all conventions not covered above.
+
+* `PEP 8 - Style Guide for Python Code`_.
+* `Twisted Coding Standard`_ (but with a grain of salt):
+
+.. _`PEP 8 - Style Guide for Python Code` : http://www.python.org/dev/peps/pep-0008/
+.. _`Twisted Coding Standard` : http://twistedmatrix.com/trac/browser/trunk/doc/development/policy/coding-standard.xhtml?format=raw
+
+
+.. index::
+  single: Quality Checklist
+
+Quality checklist
+=================
+
+'''Python'''
+
+* All modules have a single description line in the module comment.
+
+.. index::
+  single: Bad Word Scanner configuration
+
+Bad Word Scanner configuration
+==============================
+
+This section will probably only ever be used by a helium contributor:
+
+Bad word scanner scans the helium code for the words that should not be in the helium source code. You need to include the bad words
+in a .cvs file and scan the directory of the source code. Bad words include Nokia product names, competitors product names etc.
+
+Run the following command ::
+
+    hlm check-bad-words
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/conf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,181 @@
+# -*- coding: utf-8 -*-
+#============================================================================ 
+#Name        : ant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+#
+# Helium Documentation documentation build configuration file, created by
+# sphinx-quickstart on Fri May 09 09:49:44 2008.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default value; values that are commented out
+# serve to show the default value.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('some/directory'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+#extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['.templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = 'Helium'
+copyright = '2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '0.23'
+# The full version, including alpha/beta/rc tags.
+release = '0.23'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+#exclude_dirs = []
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# The name of an image file (within the static path) to place at the top of
+# the sidebar.
+html_logo = 'helium_pallot_small.jpg'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['.static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+html_sidebars = {
+   'index': 'sidebar.html'
+}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Helium doc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('index', 'Helium.tex', 'Helium Documentation', 'The Helium Team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/default.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,842 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    color: #fff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    color: #fff;
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related a {
+    color: white;
+}
+
+/* ::: TOC :::: */
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: white;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    list-style: none;
+    color: white;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+    margin: -5px 10px 5px 10px;
+    padding: 10px;
+    line-height: 160%;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+    padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    padding: 5px 10px 5px 10px;
+    border-top: 1px solid #cbe7e5;
+    border-bottom: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecomments {
+    position: absolute;
+    right: 20px;
+}
+
+div.inlinecomments a.bubble {
+    display: block;
+    float: right;
+    background-image: url(style/comment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+    text-align: center;
+    padding-top: 3px;
+    font-size: 0.9em;
+    line-height: 14px;
+    font-weight: bold;
+    color: black;
+}
+
+div.inlinecomments a.bubble span {
+    display: none;
+}
+
+div.inlinecomments a.emptybubble {
+    background-image: url(style/nocomment.png);
+}
+
+div.inlinecomments a.bubble:hover {
+    background-image: url(style/hovercomment.png);
+    text-decoration: none;
+    color: #3ca0a4;
+}
+
+div.inlinecomments div.comments {
+    float: right;
+    margin: 25px 5px 0 0;
+    max-width: 50em;
+    min-width: 30em;
+    border: 1px solid #2eabb0;
+    background-color: #f2fbfd;
+    z-index: 150;
+}
+
+div#comments {
+    border: 1px solid #2eabb0;
+    margin-top: 20px;
+}
+
+div#comments div.nocomments {
+    padding: 10px;
+    font-weight: bold;
+}
+
+div.inlinecomments div.comments h3,
+div#comments h3 {
+    margin: 0;
+    padding: 0;
+    background-color: #2eabb0;
+    color: white;
+    border: none;
+    padding: 3px;
+}
+
+div.inlinecomments div.comments div.actions {
+    padding: 4px;
+    margin: 0;
+    border-top: none;
+}
+
+div#comments div.comment {
+    margin: 10px;
+    border: 1px solid #2eabb0;
+}
+
+div.inlinecomments div.comment h4,
+div.commentwindow div.comment h4,
+div#comments div.comment h4 {
+    margin: 10px 0 0 0;
+    background-color: #2eabb0;
+    color: white;
+    border: none;
+    padding: 1px 4px 1px 4px;
+}
+
+div#comments div.comment h4 {
+    margin: 0;
+}
+
+div#comments div.comment h4 a {
+    color: #d5f4f4;
+}
+
+div.inlinecomments div.comment div.text,
+div.commentwindow div.comment div.text,
+div#comments div.comment div.text {
+    margin: -5px 0 -5px 0;
+    padding: 0 10px 0 10px;
+}
+
+div.inlinecomments div.comment div.meta,
+div.commentwindow div.comment div.meta,
+div#comments div.comment div.meta {
+    text-align: right;
+    padding: 2px 10px 2px 0;
+    font-size: 95%;
+    color: #538893;
+    border-top: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+div.commentwindow {
+    position: absolute;
+    width: 500px;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+    display: none;
+    z-index: 130;
+}
+
+div.commentwindow h3 {
+    margin: 0;
+    background-color: #2eabb0;
+    color: white;
+    border: none;
+    padding: 5px;
+    font-size: 1.5em;
+    cursor: pointer;
+}
+
+div.commentwindow div.actions {
+    margin: 10px -10px 0 -10px;
+    padding: 4px 10px 4px 10px;
+    color: #538893;
+}
+
+div.commentwindow div.actions input {
+    border: 1px solid #2eabb0;
+    background-color: white;
+    color: #135355;
+    cursor: pointer;
+}
+
+div.commentwindow div.form {
+    padding: 0 10px 0 10px;
+}
+
+div.commentwindow div.form input,
+div.commentwindow div.form textarea {
+    border: 1px solid #3c9ea2;
+    background-color: white;
+    color: black;
+}
+
+div.commentwindow div.error {
+    margin: 10px 5px 10px 5px;
+    background-color: #fbe5dc;
+    display: none;
+}
+
+div.commentwindow div.form textarea {
+    width: 99%;
+}
+
+div.commentwindow div.preview {
+    margin: 10px 0 10px 0;
+    background-color: #70d0d4;
+    padding: 0 1px 1px 25px;
+}
+
+div.commentwindow div.preview h4 {
+    margin: 0 0 -5px -20px;
+    padding: 4px 0 0 4px;
+    color: white;
+    font-size: 1.3em;
+}
+
+div.commentwindow div.preview div.comment {
+    background-color: #f2fbfd;
+}
+
+div.commentwindow div.preview div.comment h4 {
+    margin: 10px 0 0 0!important;
+    padding: 1px 4px 1px 4px!important;
+    font-size: 1.2em;
+}
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+    border: 1px solid #ccc;
+    background-color: white;
+    color: black;
+}
+
+div#suggest-changes-box textarea {
+    width: 99%;
+    height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+    background-image: url(style/preview.png);
+    padding: 0 20px 20px 20px;
+    margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+    background-color: #ffe4e4;
+    padding: 10px;
+    margin: 0 -20px 0 -20px;
+    border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+ 
+/*BMT added 16/10/08 */
+a:link {
+    color: blue;
+    text-decoration: none;
+}
+
+a:visited {
+    color: navy;
+    text-decoration: none;
+}
+
+a:hover {
+    color: purple;
+    text-decoration: underline;
+}
+/* BMT end added 16/10/08 */
+
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 250%; color:black;}
+div.body h2 { font-size: 190%; color:#36237f;}
+div.body h3 { font-size: 150%; color:#4933af;}
+div.body h4 { font-size: 120%; color:#6223df;}
+div.body h5 { font-size: 100%; color:#6f23ef;}
+div.body h6 { font-size: 80%; color:#5a62ff;}
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: left;
+    line-height: 130%;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 0 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    padding: 5px;
+    background-color: #efc;
+    color: #333;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 100%;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width : 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/developer_guide.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,191 @@
+.. index::
+  module: Developer Guide
+
+###################################
+Developer Guide
+###################################
+
+.. contents::
+
+Introduction
+============
+
+This describes various practices, procedures and conventions used within Helium. It should be read by all contributors to Helium along with the Coding Conventions.
+
+.. index::
+  single: Documentation
+
+Documentation
+=============
+
+Standalone documents like this design document and the user guide are documented in reStructuredText__ format.
+
+__ http://docutils.sourceforge.net/rst.html
+
+HTML documentation is generated in ``/helium/build/doc`` using the ``hlm doc`` command.
+
+
+.. index::
+  single: Index References-creating
+
+Creating Index References
+-------------------------
+
+In order to get things in the index you have to manually add the following code to the .rst files: ::
+ 
+  .. index::
+     module: file heading (the text in the 1st heading at the top of the page) gets added to index as module
+
+put this text at the top of the file::
+
+  .. index::
+    single: heading text
+
+put this just above a heading. This gets added to the index as a normal indexed link.
+
+If you replace 'single' with 'pair' it puts 2 enteries in the index:::
+ 
+  .. index::
+     pair: iname1; ename2
+
+In the index it becomes iname1 with ename2 below it and indented (in the 'i' section) and also ename2 with iname1 
+below it and indented (in the 'e' section)
+
+The index directive needs blank lines either side of it.
+
+
+.. index::
+  single: Directory Structure
+
+Directory structure
+===================
+
+The ``/helium`` directory structure consists of:
+
+``/build``
+    This is not under source control. It is created on demand to store generated documentation, testing and coverage output and so on.
+    
+``/config``
+    Configuration files for parts of Helium. Some of these may only need to be defined in Helium, whereas others may be default configuration that may be overridden by a user.
+    
+``/doc``
+    All documentation related to Helium. Files are in .rst format (HTML versions can be generated under ``/build/doc`` using the ``hlm doc`` command).
+    
+``/external``
+    Applications and libraries that are maintained outside of the Helium team.
+
+``/testconfig``
+    Test build configurations.
+
+``/tests``
+    Test data for unit tests. All unit tests are co-located with the code under test.
+
+``/tools``
+    A number of subdirectories for each stage of the build. Each directory may contain Ant scripts and other tools and scripts related to that stage.
+
+``/tools/common``
+    Common libraries for Java, Perl and Python and XML schemas.
+    
+
+Ant script structure
+--------------------
+
+The ``helium.ant.xml`` file in the project root should be imported by each build configuration. This in turn imports the root files for each of the key build stages defined in the ``/tools`` directory. ``helium.ant.xml`` also defines a number of common Ant default properties.
+
+
+.. index::
+  single: Custom Ant library
+
+Custom Ant library
+==================
+
+All custom Ant tasks and loggers should be added under ``/tools/common/java/src``. The command::
+
+  hlm-jar.bat
+
+can be run from the ``/helium`` directory. This will update the ``nokia_ant.jar`` file in ``/tools/common/java/lib``.
+
+Each custom task must be defined inside the ``antlib.xml`` file inside ``/tools/common/java/src/nokia/ant``.
+
+
+.. index::
+  single: XML Schemas
+
+XML schemas
+===========
+
+A ``validate-xml`` command can be run to check the various Helium XML files against their schema (this is run in the automated unit tests).
+
+There are schema files for these XML file types:
+
+* Helium data model.
+
+
+.. index::
+  single: Helium Data Model
+
+Helium data model
+=================
+
+The Helium data model defines the configuration elements needed to configure Helium. It is defined in the file ``/config/helium_data_model.xml`` and contains:
+
+* A list of configuration elements with metadata:
+
+  * Name. Defines the name of the configuration element. Required.
+  * Type. Defines the type of the configuration element, i.e. if the configuration element is a string, integer, boolean or flag. Required.
+  * Usage. Defines the typical usage of the property. Must one of "must", "recommended", "allowed", "discouraged", "never". Required.
+  * Description. This should be in .rst format. Required.
+  * Deprecated. This is a optional element that defines the property is deprecated.
+
+* A list of groups that group together related configuration elements and their usage requirements within that group, i.e. if that feature is to be used, what configuration is required and what is optional. All required configuration elements in a group must be defined.
+  
+Any Ant configuration can be checked against the model by running ``hlm check``.
+
+
+.. index::
+  single: Assertions
+
+Assertions
+==========
+
+There are some basic assertion macros defined in ``common.ant.xml``. These can be used to check for correctness at the end of a target, e.g. checking that a file exists which the target was supposed to create.
+
+The assertions can be enabled by defining the ``hlm.enable.asserts``. If ``hlm.enable.asserts`` is not enabled, macro will print warnings only.
+There are several macros:
+
+``hlm:assert``
+    A basic assertion that will check any task contained within it.
+    
+``hlm:assertFileExists``
+    Takes a file attribute and asserts that the file exists.
+
+.. index::
+  single: Ivy Configuration
+
+Ivy Configuration
+------------------
+
+Ibiblio
+````````
+
+Libraries in Maven2 Ibiblio_ repository can use: ``helium/config/ivy/ivy.xml``
+
+.. _Ibiblio: http://mirrors.ibiblio.org/pub/mirrors/maven2/
+
+These parameters should be used, if library has passed legal tests: ``transitive="false"``, ``conf="subcon"``
+Otherwise use: ``transitive="false"``, ``conf="core_install"``
+
+Direct URLs
+```````````
+
+Use these for a direct url link, if the library is needed for the subcon release::
+
+    helium/config/ivy/modules/jars_subcon-1.0.ivy.xml
+    helium/config/ivy/modules/eggs_subcon-1.0.ivy.xml
+
+Otherwise add to these files for non subcon libraries::
+
+    helium/config/ivy/modules/eggs-1.0.ivy.xml
+    helium/config/ivy/modules/jars-1.0.ivy.xml
+    
+A new ivy config file can be added for a non-jar or egg type file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/feature_list.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,391 @@
+===================
+Helium Feature List
+===================
+ 
+.. index::
+  module: Helium Feature List
+
+.. contents::
+
+.. index::
+  single: feature - Framework
+
+Framework
+=========
+
+.. index::
+  single: feature - Logging
+
+Logging
+-------
+
+* Individual log files created for most build stages.
+* A summary log file is created from individual log files.
+
+  * Shows categorized messages divided into errors, significant warnings and warnings.
+
+.. index::
+  single: feature - Signalling
+
+Signaling
+----------
+
+* Build engineer can be signaled via email and SMS at many key points during the build.
+
+  * The triggering and choice of when to signal can be configured.
+  
+.. index::
+  single: feature - Validation
+
+Validation
+----------
+
+* Validate an Ant configuration against the data model.
+
+.. index::
+  single: feature - Password Handling
+
+Password handling
+-----------------
+
+* Query passwords from a .netrc file or request via a dialog.
+
+.. index::
+  single: feature - Diamonds logging
+
+Diamonds logging
+----------------
+* Can upload build id, start and end time, creator, host name, release label.
+* Can upload stage start and end time based on the configuration of stages
+* Can upload build tools name and its version information.
+* Can upload release location.
+* Can parse multiple scan log file.
+* Can upload build faults related information.
+* Can upload BOM contents.
+* Can upload "number of object files" and "number of generated files".
+* Can upload build system and number of processors.
+* Can upload distribution policy file related errors like missing, invalid encoding and error type A, B, C.
+* Can upload List of Illegal APIs names if disable.analysis.tool is not set.
+* Can upload custom build tags.
+* Logging can be skipped if desired.
+
+
+.. index::
+  single: feature - Documentation
+
+Documentation
+-------------
+
+* Quick start, manual, tutorials, How-To's and development guidelines in HTML format.
+* Helium API documents the Ant targets and properties.
+* Documentation for Python and Java APIs and custom Ant tasks.
+
+
+.. index::
+  single: feature - build stages
+
+Build stages
+============
+
+.. index::
+  single: feature - startup
+
+Startup
+-------
+
+* A number of build configurations can be run on several machines from a single work area.
+* A subcon release can be bootstrapped to download required libraries for building ROMs.
+
+.. index::
+  single: feature Synergy operations
+
+Synergy operations
+------------------
+
+* Update a Synergy work area.
+
+  * Create snapshots.
+  * Checkout projects and update with folders and tasks.
+  
+* Build management functions.
+
+.. index::
+  single: feature Mercurial operations
+
+Mercurial operations
+--------------------
+
+* Set or show the current branch name
+* Checkout a repository
+* Export the header and diffs for one or more changesets
+* Display information about an item
+* Create a new repository in the given directory
+* Show revision history of entire repository or files
+* Pull changes from the specified source
+* Remove the specified files on the next commit
+* Add one or more tags for the current or given revision
+* List repository tags
+* Update working directory
+
+.. index::
+  single: feature - Preparation
+
+Preparation
+-----------
+
+* Checking the build machine environment for required tools.
+* Build drive creation through subst'ing.
+* Preparation of the build area.
+
+  * Copy operations, with content filtering.
+  * Unzip operations, with content filtering.
+  * Extraction of ICDs/ICFs in order.
+  * Checks content is available before starting preparation steps.
+
+* Support for Dragonfly workspace creation.
+* BOM and BOM delta creation.
+
+  * HTML and plain text output files.
+
+* Unarchive a release from network.
+
+.. index::
+  single: feature - compilation
+
+Compilation
+-----------
+
+* Compilation using System Definition XML format.
+
+  * The System Definition files are pre-processed to insert Ant properties
+
+* Different build systems can be selected.
+
+  * Symbian EBS.
+  * Electric Cloud (EC) with history file management.
+  * Symbian Build System (Raptor).
+  
+* A clean target allows a clean configuration to be built.
+  
+* cMaker support (clean, export, what).
+
+.. index::
+  single: feature - SIS files
+
+SIS files
+---------
+
+* SIS files can be built.
+
+.. index::
+  single: feature - Quality Assurance
+
+Quality assurance
+-----------------
+* Policy file validation.
+* Build duplicates detection.
+* Internal exports detection.
+* Codescanner task.
+
+.. index::
+  single: feature - Publishing
+
+Publishing
+----------
+
+* Create zips of the EE build area.
+
+  * Content can be split across zips depending on number of files and file sizes.
+  * In release metadata it holds md5checksum value and size of all the zip files.
+* Zipping using EBS / EC based on the build system.
+* Create delta zips for each localised region.
+* Publish at several points during the build to a network directory.
+* Zip content selected based on distribution.policy file content.
+* Zip content selected based on component exports.
+
+.. index::
+  single: feature - Localisation
+
+Localisation
+------------
+
+* S60 3.2.x support
+
+  * Support for S60 localisation tool.
+  * Support for localise resources tool which localises using in EBS / EC based on the build system.
+  * Possibility to provide a different set of configuration for each region.
+  * Locales_xx.iby generation that support override directive from SP.
+  * Cenrep generation for variants (languagepack and customer).
+  * Languagepack automation (Should be moved to SP/iMaker in the future).
+  
+* S60 5.0.x support
+
+  * DTD localisation.
+  * Regional variation.
+
+.. index::
+  single: feature - iMaker image creation
+
+iMaker image creation
+---------------------
+
+* Creates EE images.
+* Image creation using EBS / EC based on the build system
+* Language pack creation/automation.
+* Customer variant creation.
+* Creates SW version string for the images and override the one in ROM. (through Helium/iMaker feature).
+* Firmware ID generation and automatic inclusion (through iMaker feature).
+* Debug image creation (through Helium/iMaker feature).
+* Core image creation.
+* Auto-detection of variant folder.
+* Variation from variant folder (no export/clean-export to epoc32).
+* Automatic region switching.
+* (Future feature) Support for languagepack automation (through iMaker, still RD feature at the moment).
+
+.. index::
+  single: feature - Release Notes Creation
+
+Release notes creation
+----------------------
+
+* Modifies a RTF template with values from build.
+* Adds table of errors and warnings.
+* Generates list of baselines, projects and tasks used.
+
+.. index::
+  single: feature - Delta Releasing
+
+Delta releasing
+---------------
+
+* Creates a MD5 list of files in a build area.
+* Compares a set of these files and zips new/ changed.
+* Generates a XML file for SymDEC of files deleted.
+ 
+.. index::
+  single: feature - Testing
+
+Testing
+-------
+
+ ATS test package generation for API (unit and/or Module) and UI test
+
+ ============== ======== =========== === ======= ========= ===========
+ Test Framework PKG File Dir Parsing CTC Tracing sis files Test Assets
+ ============== ======== =========== === ======= ========= ===========
+ **STIF**          -          -       -     -        -          
+ **TEF**           -
+ **RTEST**         -
+ **MTF**           -
+ **EUnit**         -                  -     -        -          
+ **ASTE**                                                       -
+ ============== ======== =========== === ======= ========= ===========
+
+ - Supported
+  
+  
+.. index::
+  single: feature - IDO builds
+
+IDO builds
+----------
+* Codescanner integration for IDO.
+* Build area preparation for IDO (ADO base copying).
+
+Other features
+==============
+
+.. index::
+  single: feature - Interation
+
+Integration
+-----------
+
+* Overlays can be validated to check the need for merging.
+* Automated merge task creation.
+
+.. index::
+  single: feature - Miscallaneous
+
+Miscellaneous
+-------------
+
+* Clean the build areas root directory of old builds based on a dialog selection.
+* Print a list of target dependencies.
+* The source code can be scanned for words that are classed as 'bad words' i.e. words that should not be used within the code e.g. Nokia product names, competitor names and competitor product names, these ''bad words'' are counted and displayed at the end of the build process
+
+.. index::
+  single: feature - Supported SCM tools
+
+Supported SCM tools
+-------------------
+
+* Synergy
+* Mercurial
+
+.. index::
+  single: feature - Nokia Build stages
+
+Nokia Build stages
+==================
+
+.. index::
+  single: feature - FOTA update packages creation
+
+FOTA update packages creation 
+-----------------------------
+* Generation of FOTA packages between 2 published releases.
+* Generation of FOTA toggle packages for TRUE test.
+* Support of MakeUPCT: generation of _fota.cnf and .fota.conf files.
+
+.. index::
+  single: feature - Data packaging
+
+Data packaging
+--------------
+
+* Generates VPL and DCP and signature files.
+* Compresses images.
+* Flashes phone to generate SPR.
+* Creates input for gMES and NSU.
+* Installer creation using InstallShield.
+
+.. index::
+  single: feature - UDA creation
+
+UDA and Mass Memory Creation
+----------------------------
+
+* UDA creation using iMaker
+* Mass Memory using ImageTool
+
+.. index::
+  single: feature - RnD SDK creation
+
+RnD SDK creation
+----------------
+
+* RndSDK creation tool is used to create an SDK using S60 released Rnd environment.
+* It generates the eclipse based html-documentation for the APIs present in the Rnd Environment.
+* The APIs in the S60 Rnd environment can be filtered, based on the required API categories Public, Domain etc.
+* The output is a zip file containing the Rnd SDK environment, along with the documentation of the APIs present in it.
+* The developer can extract and use the RndSDK for further development.
+
+.. index::
+  single: feature - API Analysis
+
+API analysis
+------------
+
+* API Analysis takes input from apidescr.xml, generated by the Analysis tool from S60 build environment and generates count of SDK, Domain and Internal APIs for diamonds logging.
+* The analysis can be run as part of the RnD SDK or independently. 
+* API  tests are supported by `Testing`_
+
+.. index::
+  single: feature - Releasing
+
+Releasing
+---------
+
+* Upload content to network.
+* Release to Grace.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/helium_overview.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,65 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html>
+<body>
+
+<style>
+div a.atext, div a.ahead {color:#000; text-decoration:  none;display:block;padding:3px 0px}
+a.atext          { font-weight: bold; font-family: arial; font-size:small; color:black; text-decoration: none}
+a.ahead          {text-align: right; line-height: 90%}
+.table          { border-width: 0px 0px 0px 0px}
+.tdbody         { padding-left: .4em; padding-right: .4em; line- height: 90%; text-align: center; vertical-align: middle height:  1.7em; }
+.tdleftside     { padding-left: .25em; text-align: left; border- width: 2px 0px 2px 2px; vertical-align: middle; }
+.tdrightside    { padding-left: .25em; padding-right: .25em; text- align: center; vertical-align: middle; }
+.tdhead         { padding-right: .5em; border-width: 0px 0px 0px  0px; text-align: right; vertical-align: middle; }
+</style>
+
+<table class="table" border="1" width="80%" bordercolor="#c0c0c0" cellpadding="0" cellspacing="0">
+
+<#list doc.helium.layer as layer>
+    <tr>
+        <td class="tdhead" colspan="2"
+        onmouseover="this.bgColor='#F8D583'; style.cursor='pointer'" 
+        onmouseout="this.bgColor='#FFFFFF'">${layer.name}</td>
+        <td style="border-width: 0px 0px 0px 0px;" colspan="1">
+            <table class="table" width="100%" bgcolor="#eeeeee" cellpadding="4px" cellspacing="1px">
+            <#list layer.row as row>
+                <tr>
+                <#list row.component as component>
+                    <td class="tdbody" bgcolor="${layer.colour}"
+                      onmouseover="this.bgColor='#F8D583'; style.cursor='pointer'" 
+                      onmouseout="this.bgColor='${layer.colour}'"><a href="" class="atext">${component}</a></td>
+                </#list>
+                </tr>
+            </#list>
+            </table>
+        </td>
+    </tr>
+</#list>
+
+</table>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/helium_overview.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<helium>
+    <layer>
+        <name>Apache Ant</name>
+        <colour>#FFC726</colour>
+        <row>
+            <component>Apache Ant</component>
+        </row>
+    </layer>
+    <layer>
+        <name>Helium domains</name>
+        <colour>#66FFFF</colour>
+        <row>
+            <component>Preparation</component>
+            <component>Compilation</component>
+            <component>ROM/UDA creation</component>
+            <component>Localisation</component>
+            <component>Testing</component>
+        </row>
+        <row>
+            <component>Publishing</component>
+            <component>Releasing</component>
+            <component>Data packaging</component>
+            <component>Integration</component>
+            <component>FOTA</component>
+        </row>
+    </layer>
+    <layer>
+        <name>Helium services</name>
+        <colour>#C5D5A9</colour>
+        <row>
+            <component>Common configuration</component>
+            <component>Logging</component>
+            <component>Signaling</component>
+            <component>Metrics recording</component>
+        </row>
+        <row>
+            <component>Configuration validation</component>
+            <component>API documentation</component>
+            <component>Error checking</component>
+        </row>
+    </layer>
+    <layer>
+        <name>Ant libraries</name>
+        <colour>#A3B8CB</colour>
+        <row>
+            <component>antunit</component>
+            <component>ant-contrib</component>
+            <component>commons configuration</component>
+            <component>antform</component>
+            <component>freemarker</component>
+            <component>junit</component>
+        </row>
+        <row>
+            <component>dom4j</component>
+            <component>svnant</component>
+            <component>xmltask</component>
+            <component>ivy</component>
+        </row>
+    </layer>
+    <layer>
+        <name>External tools in Helium</name>
+        <colour>#ED9B4F</colour>
+        <row>
+            <component>Capability scan</component>
+            <component>CheckStubSis</component>
+            <component>CruiseControl</component>
+            <component>DependencyAnalyzer</component>
+            <component>VplSignJava</component>
+        </row>
+        <row>
+            <component>symbiantools</component>
+            <component>filedisk</component>
+            <component>info-zip</component>
+            <component>Subversion</component>
+            <component>unxutils</component>
+        </row>
+    </layer>
+    <layer>
+        <name>External tools not in Helium</name>
+        <colour>#E76F00</colour>
+        <row>
+            <component>7zip</component>
+            <component>Synergy</component>
+            <component>Mercurial</component>
+            <component>CodeScanner</component>
+            <component>GRACE CLI</component>
+        </row>
+        <row>
+            <component>Java 1.3.1</component>
+            <component>PCLint</component>
+            <component>RVCT</component>
+            <component>SymDEC</component>
+        </row>
+    </layer>
+    <layer>
+        <name>Runtimes</name>
+        <colour>#B2BC00</colour>
+        <row>
+            <component>Java 6</component>
+            <component>Python 2.5</component>
+            <component>Perl 5.6</component>
+        </row>
+    </layer>
+    <layer>
+        <name>Platforms</name>
+        <colour>#C69200</colour>
+        <row>
+            <component>Windows</component>
+            <component>Linux</component>
+        </row>
+    </layer>
+</helium>
Binary file buildframework/helium/doc/src/helium_pallot_small.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/index.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,18 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<!--<link rel="stylesheet" type="text/css" href="stylesheets/style.css">-->
+<title>Helium Documentation</title>
+</head>
+
+<frameset cols="26%,74%">
+<frame src="toc.html" name="navFrame">
+<frame src="cover.html" name="mainFrame">
+</frameset>
+<noframes>
+<H2>Helium Documentation</H2>
+
+<a href="toc.html">Apache Ant User Manual</a></noframes>
+
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/index.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,189 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+.. Helium Documentation documentation master file, created by sphinx-quickstart on Fri May 09 09:49:44 2008.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+.. index::
+  module:  Helium Documentation
+
+====================
+Helium documentation
+====================
+
+.. toctree::
+   :maxdepth: 1
+
+.. raw:: html
+
+   <table border="0" cellspacing="0" cellpadding="10">
+   <tr valign="top">
+   <td width="50%" style="border-right: 1px solid black">
+ 
+.. index::
+  single: Getting Started
+   
+Getting Started
+================
+
+This section contains instructions on how to get started with Helium including where to get it from and how to use it at the very simplest level. 
+<#if !(ant?keys?seq_contains("sf"))>
+This section also has a link to an elearning that goes through Helium at a very high level.
+</#if>
+
+.. toctree::
+   :maxdepth: 1
+   
+   introduction
+   quick_start_guide
+   feature_list
+   user-graph
+
+<#if !(ant?keys?seq_contains("sf"))>
+* Elearning_
+
+.. _Elearning: http://lmp.nokia.com/lms/lang-en/taxonomy/TAX_Search.asp?UserMode=0&SearchStr=helium
+</#if>
+
+.. raw:: html
+
+   </td><td width="50%">
+
+
+Tutorials and HOWTOs
+=====================
+This section lists all the available tutorials on Helium and how to configure and use it.
+
+.. toctree::
+   :maxdepth: 1
+   
+   tutorials/configuration/SimplestConfiguration
+   tutorials/configuration/UseHlmTasksInConfiguration
+   tutorials/configuration/HowtoCreateANewSignal
+   tutorials/rom_image
+   tutorials/variant
+   tutorials/qt_build
+<#if !ant?keys?seq_contains("sf")>
+   nokia/blacktusk/howto-setup-blacktusk-with-helium
+
+* IDO_
+
+.. _IDO: ido
+
+* TeamCI_
+
+.. _TeamCI: teamci
+</#if>
+
+.. raw:: html
+
+   </td></tr>
+   <tr valign="top">
+   <td width="50%" style="border-right: 1px solid black" rowspan="2">
+
+.. index::  single: Helium Manual
+  
+Helium Manual
+==============
+
+This section contains the details of the various activities that can be performed by Helium, you should look
+here for specific information about a task or action.
+
+.. toctree::
+   :maxdepth: 1
+
+<#if !ant?keys?seq_contains("sf")>   
+   nokia/nokia
+   nokia/retrieving
+</#if>
+   sf
+   manual/running
+   manual/configuring
+   manual/configuringdiamonds
+   manual/signaling
+   manual/stages
+<#if !ant?keys?seq_contains("sf")>
+   nokia/nokiastages
+   nokia/rndsdk_user_manual
+   nokia/quality
+</#if>
+   manual/cruisecontrol
+   manual/debugging
+   metrics
+   manual/APIs
+<#if !ant?keys?seq_contains("sf")>
+   api_changes
+   
+* helium-antlib_
+
+.. _helium-antlib: helium-antlib
+</#if>
+
+.. raw:: html
+
+   </td><td>
+
+Helium Architecture
+===================
+
+This section describes the architecture of Helium. It also contains a link to the style guide to be used for 
+coding conventions.
+
+
+.. toctree::
+   :maxdepth: 1
+ 
+   architecture
+  
+.. raw:: html
+
+   </td></tr>
+   <tr valign="top"><td>
+
+Developer Guide
+==================
+This section contains information on how to make changes to Helium either as a tools team developer or an external 
+developer. The 'developer guide' link contains information on the structure of the directories and some important
+information on how to add libraries and other miscellaneous information.
+It also contains details on how to test the changes made.
+
+.. toctree::
+   :maxdepth: 1
+
+<#if !ant?keys?seq_contains("sf")>
+   nokia/howto-contribute
+   nokia/legal
+   nokia/testing
+</#if>
+   developer_guide
+   coding_conventions
+
+.. raw:: html
+
+   </td></tr>
+   </table>
+   
+Indices and Tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/introduction.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+###################
+Helium Introduction
+###################
+
+.. index::
+  module:  Introduction
+
+.. contents::
+
+.. index::
+  single:  Introduction
+
+Introduction
+=============
+
+This is the user guide and technical description for Helium, an ANT based build framework used to build S60 based products.
+This documentation describes how to configure and use the Helium build framework from the point of view of an IDO integrator,
+a build manager, a helium contributor and subcon user.
+
+Helium contains all you need in order to create a work area, a build area, perform the compilation, link, create localised 
+variants, submit build information to Diamonds (used for statistical analysis), create Data Packages, 
+zip the files to create a release and much more. The aim is for helium to be used by every build and release team working on
+S60 products within Nokia. It is also used by some Subcons as part of the tool set given to them to allow subcons to build parts
+of the S60 code.
+
+Before you start reading about Helium it is very advisable that you are familiar with ANT_ and how it works so  
+click on this `ANT link`_ if you are not familiar with ANT_.
+
+.. _ANT link: http://ant.apache.org/
+.. _ANT: http://ant.apache.org/
+
+Ant makes great use of XML_ files for its configuration so if you are unfamiliar with XML_ files it is recommended that you read the 
+information at the XML_ link.
+
+.. _XML: http://www.w3.org/XML/
+
+There are various parts of this documentation that are only of interest to certain users (in particular the Helium integrator), 
+it is hoped that eventually there will 
+be separate contents lists for the different users, but for the time being this is not possible, so bare with us.
+ 
+
+NOTE: for best viewing you should use Windows Internet Explorer 7.0 or newer as version 6.0 has some problems with display of the
+navigation bar and contents list.
+
+
+.. index::
+  single:  Vision
+
+Vision
+=========
+
+The Helium vision is to fulfill the following demands:
+
+ * A "common unified toolset".
+ * Easy to use and configure for all different builds.
+   
+   * Fully automated builds.
+   * Verbose and clear messages.
+ 
+ * Light.
+ * Simple things should be easy to do, complex things should be possible.
+
+.. index::
+  single:  Background
+  
+Background
+============
+
+Helium was developed from a need to reduce "reinventing the wheel" for build tools. It was based on the mc_tools project which had the same goal within the former MC organization.
+
+.. index::
+  single:  Why Ant?
+  
+Why Ant?
+==========
+
+Helium is fundamentally based on Apache ANT_. Why was ANT_ chosen when there were many other similar frameworks inside Nokia,
+such as sbt, isis_build and TrombiBuild. The main reason is that while the other toolkits were developed inside Nokia,
+ANT_ is an open source tool from Apache, based on relatively simple XML_ files that define the build steps. 
+Through leveraging the power of open source Helium has integrated a large amount of functionality that would have taken
+much longer to develop in-house, as well as benefit from existing, high-quality documentation.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/junit_testing.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,245 @@
+.. index::
+  module: Testing using JUnit
+
+####################
+Testing using JUnit
+####################
+
+
+.. contents::
+
+.. index::
+  single: JUnit - what is it
+
+What is JUnit
+=============
+JUnit is a simple open source Java testing framework used to write and run repeatable automated tests. It is an 
+instance of the xUnit architecture for unit testing framework. Eclipse supports creating test cases and running 
+test suites, so it is easy to use for your Java applications.
+
+.. index::
+  single: JUnit features include
+
+JUnit features include:
+-----------------------
+    * Assertions for testing expected results
+    * Test fixtures for sharing common test data
+    * Test suites for easily organizing and running tests
+    * Graphical and textual test runners
+
+.. index::
+  single: JUnit Coding Convention
+
+JUnit Coding Convention:
+------------------------
+    * Name of the test class must end with "Test".
+    * Name of the method must begin with "test".
+    * Return type of a test method must be void.
+    * Test method must not throw any exception.
+    * Test method must not have any parameter.
+
+.. index::
+  single: JUnit write and run simple test
+
+How you write and run a simple test
+===================================
+    Lets think about we need to test the following Calculator Class 
+
+    public class Calculator
+    {
+        
+        int sum(int num1,int num2){
+        
+            return num1+num2;          
+            
+        }   
+             
+    }
+        
+1. Import JUnit Class.
+----------------------
+
+(The assumption for this code using junit v 4.4 )
+
+import junit.framework.*;
+
+Since we are using some constructs created by the makers of JUnit we must import any of the classes we desire to use, most of these reside in the framework subdirectory, hence the import statement.   
+
+
+2. Create a subclass of TestCase:
+----------------------------------
+
+public class CalculatorTest extends  TestCase {
+  
+  Calculator cal=new Calculator();
+  
+}
+
+Our simple class needs to define its own test method(s) to actually be of any use so it extends TestCase which provides us with the ability to define our own test methods
+
+3. Write a test method to assert expected results on the object under test:
+---------------------------------------------------------------------------
+public void  testSum() {
+  
+     assertEquals(2,cal.sum(1,1));
+     
+}
+
+4. Code location:
+-----------------
+Place the test class under "\helium\tools\common\java\test"
+
+
+
+5. Execute the test by the command
+----------------------------------
+
+    hlm ju-unittest
+
+
+
+.. index::
+  single: JUnit report
+
+JUnit report 
+============
+
+There are few ways to check the report 
+
+1. At console
+-------------
+
+The test result appears in the console as below (after execute the command : hlm ju-unittest)
+
+    [cobertura-report] Cobertura GNU GPL License (NO WARRANTY) - See COPYRIGHT file
+
+    [cobertura-report] Cobertura: Loaded information on 14 classes.
+
+    [cobertura-report]
+
+    [cobertura-report] Average line coverage : 19.00%
+
+    [cobertura-report] Average branch coverage : 15.00%
+
+    [cobertura-report]
+
+    [cobertura-report] class-name=nokia.ant.AntConfiguration line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.AntLint line-rate=00.00% branch-rate=00.00%
+    
+    [cobertura-report] class-name=nokia.ant.ScanLogParser line-rate=00.00% branch-rate0.00%
+
+    [cobertura-report] class-name=nokia.ant.XMLHandler line-rate=66.23% branch-rate=45.00%
+
+
+2. At Buildbot
+--------------
+For a regular build the result appear in buildbot as follows 
+
+    [cobertura-report] Cobertura GNU GPL License (NO WARRANTY) - See COPYRIGHT file
+
+    [cobertura-report] Cobertura: Loaded information on 14 classes.
+
+    [ccobertura-report] 
+
+    [cobertura-report] Average line coverage : 15.56%
+
+    [cobertura-report] Average branch coverage : 06.96%
+
+    [cobertura-report] 
+
+    [cobertura-report] class-name=nokia.ant.AntConfiguration line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.AntLint line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.AntLint$AntLintHandler line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.BuildData line-rate=59.49% branch-rate=20.00%
+
+    [cobertura-report] class-name=nokia.ant.BuildData$BuildFault line-rate=100.00% branch-rate=100.00%
+
+    [cobertura-report] class-name=nokia.ant.BuildData$StageData line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.Retry line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.ScanLogParser line-rate=00.00% branch-rate=00.00%
+
+    [cobertura-report] class-name=nokia.ant.XMLHandler line-rate=66.23% branch-rate=45.00%
+
+    [cobertura-report] Report time: 640ms
+
+
+
+3. Report folder 
+----------------
+
+If you need to generate a html report then please uncomment the below line from build.xml and check the report from ${line.coverage.reports} properties location
+
+<!-- <cobertura-report  format="html" destdir="${line.coverage.reports}" srcdir="${src.classes}" datafile="../cobertura.ser" /> -->
+
+    
+            
+.. index::
+  single: JUnit execute multiple test cases
+
+Execute multiple test cases with TestSuite
+==========================================
+
+If you have two tests and you'll run them together you could run the tests one at a time yourself, but you would quickly grow tired of that. Instead, JUnit provides an object TestSuite which runs any number of test cases together. The suite method is like a main method that is specialized to run tests.
+
+Create a suite and add each test case you want to execute:
+
+    public static void suite(){
+    
+        TestSuite suite = new TestSuite();
+        
+            suite.addTest(new CalculatorTest ("testSum"));
+            
+            ****************************************;
+                        
+            ****************************************;
+                              
+            ****************************************;
+                        
+        return suite;   
+                
+    }   
+      
+
+Since JUnit 2.0 there is an even simpler way to create a test suite, which holds all testXXX() methods. 
+You only pass the class with the tests to a TestSuite and it extracts the test methods automatically.
+    
+
+.. index::
+  single: JUnit Assert
+
+JUnit Assert
+============
+
+.. csv-table::   
+   :header: "Assert Name"
+
+   "``assertEquals(expected, actual)``"
+   "``assertEquals(message, expected, actual)``"
+   "``assertEquals(expected, actual, delta)``"
+   "``assertEquals(message, expected, actual, delta)``" 
+   "``assertFalse(condition)``"
+   "``assertFalse(message, condition)``"
+   "``Assert(Not)Null(object)``"
+   "``Assert(Not)Null(message, object)``"
+   "``Assert(Not)Same(expected, actual)``"
+   "``Assert(Not)Same(message, expected, actual)``"
+   "``assertTrue(condition)``"
+   "``assertTrue(message, condition)``"
+
+
+.. index::
+  single: JUnit References
+
+References
+==========
+http://www.junit.org/
+
+http://junit.sourceforge.net/doc/cookstour/cookstour.htm
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/APIs.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+.. index::
+  module: API
+
+###################
+API
+###################
+
+
+.. contents::
+
+Introduction
+============
+
+This section contains the API to Helium.
+
+
+.. index::
+  single: API
+
+APIs
+====
+
+* `Search API`_
+
+.. _`Search API`: ../api/index.html
+
+* `Helium API`_
+
+    The `Helium API`_ specifies all the available Ant_ targets and their 
+    required properties.  The API is the number one resource to use when 
+    building up a Helium configuration.
+
+.. _`Helium API`: ../api/helium/index.html
+.. _Ant: http://ant.apache.org
+
+* `Helium Antlib`_
+
+.. _`Helium Antlib`: ../helium-antlib/index.html
+
+<#if !(ant?keys?seq_contains("sf"))>
+* `Python API`_
+
+.. _`Python API`: ../api/python/index.html
+
+* `Java API`_
+
+.. _`Java API`: ../api/java/index.html
+</#if>
+
+* `Ant Tasks`_
+
+.. _`Ant Tasks`: ../api/ant/index.html
+
+<#if !(ant?keys?seq_contains("sf"))>
+Customer APIs
+=============
+
+* `IDO API`_
+* `DFS70501 API`_
+
+.. _`IDO API`: ../ido/api/helium/index.html
+.. _`DFS70501 API`: ../dfs70501/api/helium/index.html
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/ats.dot	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+digraph G {
+
+"IBY list" -> "test.mk's"
+"test.mk's" -> "Build roms"
+"Per product" -> "Build roms"
+"Per product" -> "sysdef test layers"
+"sysdef test layers" -> "components pkg"  [label="Exclude any exclude.test.layers"]
+"components pkg" -> "Generate install_steps"
+"components pkg" -> "Generate execute_steps"
+"Generate install_steps" -> "test.xml"
+"Generate execute_steps" -> "test.xml"
+"Build roms" -> "rom images"
+"rom images" -> "ATSDrop zip"
+"test.xml" -> "ATSDrop zip"
+"ATSDrop zip"-> "network drive"
+"network drive" -> "ats server"
+"ats server" -> "Per test set (per component and or pkg)"
+"Per test set (per component and or pkg)" -> "flash images"
+"Per test set (per component and or pkg)" -> "install files"
+"Per test set (per component and or pkg)" -> "execute tests"
+"ats server" -> "send results to diamonds"
+
+subgraph "cluster1" {color=yellow;style=filled;label="per sysdef component or module"; "components pkg"; "Generate install_steps"; "Generate execute_steps"; "test.xml"; "ATSDrop zip"; "rom images"}
+
+subgraph "cluster2" {color=yellow;style=filled;label="ATS server runs each test set in parallel to protos"; "flash images"; "install files"; "execute tests"}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/configuring.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,387 @@
+.. index::
+  module: Configuring Helium
+
+==================
+Configuring Helium
+==================
+
+.. contents::
+
+Introduction
+============
+
+This describes the key aspects of configuring a Helium build and other aspects of using the Helium build toolkit.
+
+Helium consists of several phases (the stages_ section explains these in detail) these are briefly outlined here:
+
+* pre-build   - performs several checks on the environment and creates the Bill of Materials (BOM) before copying the relevant files from synergy to the build area and unzipping them.
+* build       - compiles the  files.
+* post-build  - creates SIS files (system Installation files), creates ROM images, zips the build area for releasing, publishes releases, creates localised images, produces data packages, reports results to diamonds server.
+
+.. _stages: stages.html
+
+.. index::
+  single: Configuration files
+
+Configuration files
+===================
+
+Defining a Helium build configuration can be a simple or complicated task depending on the requirements. Helium supports a lot of build 
+functionality but much of it is optional. All configuration files are based on XML using a number of different XML schemas or formats. 
+Over time more consistency and harmonisation of the formats will be implemented. Below is a list of the key formats:
+    
+.. csv-table:: Helium configuration file types
+   :header: "Format", "Where used"
+   
+    "Apache Ant", "All build configurations must start with at least a ``build.xml`` file in the directory where builds will be run, that contains the minimum of Helium Ant properties to configure the build."
+    "Common configuration", "Several build stages: ROM build, zipping, SIS file creation."
+    "Environment/shell variables", "Configuring the PATH and other environment settings."
+    "Preparation", "Creation of a build area, using copy and unzip steps."
+
+.. index::
+  single: Ant configuration
+
+Ant configuration
+-----------------
+
+The Ant format is the most important because at least one Ant file is required to run any kind of build command. Read the `Using Ant`_ section of the Ant manual that describes how to write generic Ant files.
+
+.. _`Using Ant`: 
+
+In the context of Helium, some specific elements and properties should be used. Here is an example of a very basic Helium Ant file::
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <project default="product-build">
+        <!-- Import environment variables as Ant properties. -->
+        <property environment="env"/>
+
+        <!-- A basic property definition -->
+        <property name="product.name" value="PRODUCT"/>
+        
+        <!-- helium.dir will always refer to the directory of the Helium instance being used.
+        
+        All build configurations must import helium.ant.xml to use Helium. -->
+        <import file="${helium.dir}/helium.ant.xml"/>
+    </project>
+
+Note that here the default target is ``product-build`` so this would be used for a product build configuration. In reality it would need many more properties to be complete.
+
+Refer to the `configuration reference`_ for a full list of all Helium Ant properties.
+
+.. _`configuration reference`: ../api/helium/index.html
+
+.. index::
+  single: Common configuration format
+
+.. _common-configuration-format-label:
+
+Common configuration format
+---------------------------
+
+Several parts of the build require more complex configuration than basic ``name=value`` properties. A common format is introduced for these configurations that is closely matching the future Raptor build system format in concept.
+
+Currently only \`ROM Image configuration (using iMaker)\`_ and \`SIS files\`_ are configured using this format.
+
+Summary:
+
+ * The XML document format consists of a ``<build>`` root element.
+
+ * ``<config>`` subelements define specifications (configurations) to be built.
+
+   * ``<config>`` elements can be nested, i.e. a ``<config>`` element can contain other ``<config>`` elements, etc.
+
+   * A ``name`` attribute identifies that element. It can be used to select one or a group of configurations.
+
+   * An ``abstract`` attribute marks that specification as being not directly buildable. Child specifications not marked as abstract may be buildable.
+
+ * ``<set>`` elements inside ``<config>`` s define property values. A property defined in a child ``<config>`` element overrides the value of a property with the same name in a parent specification. All parent properties are inherited if not overridden.
+
+   * Comma-separated values or repeated elements will result in a list property value when evaluated.
+
+
+.. index::
+  single: Passwords
+
+Passwords
+=========
+
+Helium requires access to a few resources that require username and password authentication, like Synergy for SCM operations and a user's network login/password for GRACE upload. To avoid the need for a password dialog request, these details can be entered in a ``.netrc`` file located on the user's HOME drive. The HOME location is one of:
+
+Windows
+  H: drive
+  
+Linux
+  ``/home/user``
+  
+A ``.netrc`` file is a standard Unix file format.
+
+The following entries are available:
+
+Synergy::
+
+  machine synergy login <synergy-username> password <synergy-password>
+
+``synergy`` can be replaced by the name of a specific database if the settings should apply only to that database, e.g::
+
+  machine vc1s60p1 login <synergy-username> password <synergy-password>
+
+Then account could be used to override the default GSCM settings::
+
+  machine sa1ido login <synergy-username> password <synergy-password> account /db/path@dbhost 
+
+Nokia specific
+--------------
+
+NOE::
+
+  machine noe login <network-username> password <network-password>
+
+GRACE::
+
+  machine grace login <network-username> password <network-password>
+  
+Lotus Notes::
+
+  machine notes login <notes-username> password <notes-password>
+
+nWiki::
+
+  machine nwiki login <nwiki-username> password <nwiki-password>
+
+**Note:- that the nWiki password is different to that used for NOE/Notes/Grace and therefore will typically require the use of the macro macro-netrc.username along with the macro macro-netrc.password.**
+
+
+.. index::
+  single: Signals notifications
+
+Signals notifications
+=====================
+
+Helium contains a number of signal events that are triggered at various points during the build. These provide the following features:
+
+* Determine whether to fail the build immediately, deferred to the end or not at all.
+* Send an email alert message.
+* Send an SMS alert message.
+
+A default configuration of the signals is defined in ``config/helium_signals_default.xml``. By default the email alerts are sent to the build manager, but each signal can have a custom email list by defining a property ``<signal-name>.email.list``. 
+
+
+.. index::
+  single: Viewing target dependencies
+
+Viewing target dependencies
+===========================
+
+The ``deps`` target can be used to display a list of the target dependencies for a given target. See the `manual page`_ for more information. Also the ``execlist`` command works in a similar way but shows a dialog showing a separated list of all the dependent targets and then just the top-level of dependencies, to help with continuing a build on the command line.
+
+.. _`manual page`: ../api/helium/target-deps.html
+
+
+.. index::
+  single: Automating build number assignment
+
+Automating build number assignment
+==================================
+
+Typically the build number for a build is defined on the command line. However it may be desirable to automate the allocation of a new build number using a simple text database file. To do this, add the property ``read.build.int`` to the configuration or the command line. This will look for a text file in this location::
+
+    ${publish.root.dir}/${build.name}/builds/${build.name}_${core.build.version}_${build.tag}_build_int_db.txt
+    
+If the file is not present it is created with a new build number value of "001". If it does exist the value is read from the file and then incremented and written back for the next build. A ``build.tag`` property can also be defined to start the build number with a text string if needed.
+
+
+.. index::
+  single: Advanced configuration
+
+Advanced configuration
+======================
+
+.. index::
+  single: Custom targets
+
+Custom targets
+--------------
+
+Custom targets are often needed in a configuration to customize, extend or otherwise modify the default behaviour and build sequences of Helium.
+
+To override a target inside Helium define a custom target with the same name. The original target will then be named with
+the prefix of the project (Ant file) name, e.g. ``common.hello``. There are three ways to customize a target:
+
+.. index::
+  single: Completely replace the target
+
+Completely replace the target
+:::::::::::::::::::::::::::::
+
+Just define the custom target::
+
+    <target name="hello">
+        <echo message="Custom hello!"/>
+    </target>
+    
+.. index::
+  single: Run custom code after the target
+
+Run custom code after the target
+::::::::::::::::::::::::::::::::
+
+Define the overriding custom target and make it depend on the original target::
+
+    <target name="hello" depends="common.hello">
+        <echo message="After hello!"/>
+    </target>
+
+.. index::
+  single: Run custom code before the target
+
+Run custom code before the target
+:::::::::::::::::::::::::::::::::
+
+This is a little more complicated. Two custom targets are needed, one to implement the custom behaviour, and the 2nd to override the original target and define the dependencies::
+
+    <target name="pre-hello">
+        <echo message="Before hello!"/>
+    </target>
+    
+    <target name="hello" depends="pre-hello,common.hello"/>
+
+.. index::
+  single: Call a target with different params
+
+Call a target with different params
+:::::::::::::::::::::::::::::::::::
+
+In rare situations you may need to override a target in helium or call it with different properties, you should create a target in your config with the same name before you import helium.ant.xml::
+
+    <target name="localisation-roms">
+        <for list="${localisation.makefile.target}" delimiter="," param="target" >
+            <sequential>
+                <antcall target="localisation-32.localisation-roms">
+                    <param name="localisation.makefile.target" value="@{target}"/>
+                </antcall>
+            </sequential>
+        </for>
+    </target>
+
+.. index::
+  single: Using Helium internal tasks and macros
+
+Using Helium internal tasks and macros
+--------------------------------------
+
+Helium contains a number of internal tasks and macros that are defined under a Helium XML namespace. This is to make it easier to distinguish them from standard Ant and 3rd party tasks inside the Helium Ant files. This means that namespaces must be correctly applied to most Helium tasks or macros.
+
+Helium tasks start with the prefix ``hlm:``, for example::
+
+    <target name="do-signal">
+        <hlm:signal name="testSignal"/>
+    </target>
+    
+To include an XML element with a ``hlm:`` prefix the Helium namespace must be defined in the root element of the XML file::
+
+    <project name="myproject" xmlns:hlm="http://www.nokia.com/helium">
+    ....
+    </project>
+
+.. index::
+  single: MC Helium configuration
+
+MC Helium configuration
+-----------------------
+
+Based on the former MC codeline policy the SAL organisation in MC has used a hierarchical structure for the Helium build configuration files. This is an example configuration that can be used as a guideline.
+
+.. index::
+  single: Product family and product properties
+
+Product family and product properties
+:::::::::::::::::::::::::::::::::::::
+
+These are set in hierarchical structure under mc_build::
+
+    /mc_build
+        /<SAL>
+            /<product>
+                /<variant>
+                
+E.g::
+
+    /mc_build
+        /mc_4032_build
+            mc_4032_build.ant.xml - product family configuration.
+            /PRODUCT
+                PRODUCT.ant.xml - product configuration.
+                /RM247
+                    build.xml - variant configuration.
+                /RM297
+                    build.xml
+            /PRODUCT
+                /RMxxx
+        /mc_5132_build
+            /PRODUCT
+       /teams
+           juno.ant.xml
+
+Ant files at each level contain the configuration for that level. Builds are run from the outermost directories, e.g. RM247 and ``<import>`` statements are used to import the files in the parent directories. The ``mc_4032_build.ant.xml`` file would import ``helium.ant.xml``.
+
+For an example of a product build click here.
+
+.. toctree::
+   :maxdepth: 1
+   
+   product_example.rst
+   
+
+.. index::
+  single: Team properties
+
+.. _`Team-Properties-label`:
+
+Team properties
+:::::::::::::::
+
+For the MC build configurations are a number of properties that are related to a team and/or site. 
+These are all combined in a single configuration file. All the team configuration files are stored under ``/mc/mc_build/teams``. 
+This allows different build configurations to be run in different locations, or handle multiple product family configurations at one site.
+
+In order for this to work in windows environment you may need to set up an environment variable called TEAM. So click 
+start->settings->control panel and double click on 'system' to open the system properties window. Click on the 'advanced' tab and then click the
+'environment variables' tab. Create a new variable preferably under the system varaibles but if you do not have permission to add one here then add
+it to the user variables make the variable name 'TEAM' (note capital letters) and the team name is what ever your team name is.
+
+Also see :ref:`Setting-Team_properties-label`:
+
+
+.. index::
+  single: Setting the team/site
+
+Setting the team/site
+:::::::::::::::::::::
+
+To enable running any build with any team/site configuration, the team must be defined separately from the build configuration files. The team name should be the same as the team configuration file under ``/mc/mc_build/teams`` without the "``.ant.xml``".
+
+The team can be set in one of the following ways (using the example of the ``juno.ant.xml`` file):
+
+* Define a ``TEAM`` environment variable, e.g. ``TEAM=juno``.
+* Add an Ant command line parameter to set the team, e.g::
+
+    hlm product-build -Dteam=juno
+
+.. index::
+  single: System definition configuration files
+
+System definition configuration files
+:::::::::::::::::::::::::::::::::::::
+
+Sysdef configuration defines the source code you actually want to compile with Helium. More information about the System definition
+files can be found from: http://developer.symbian.org/wiki/index.php/System_Definition. 
+
+Under helium/testconfig/mc/mc_build/ibusal_51_build/ is the file IBUSAL51_SystemDefinition.xml  which can be examined as a sample definition file.
+It is used by the Helium test environment to test helium works. It consists of a list of components to compile and some special instructions to 
+perform whilst compiling the components e.g. run toucher.exe on certain directories. You will need to make sure this file exists and contains 
+the correct components when building and especialy for a product which consists of many hundreds of components. It should be possible to use 
+the file supplied by S60, but you may need to copy the component compile lines from the file and add them to the existing file in helium in 
+order to make sure you also get the special instructions which are required to make the builds create a ROM image successfully (or any
+other action requested).
+    
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/configuringdiamonds.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+.. index::
+  module: Configuring Diamonds
+
+====================
+Configuring Diamonds
+====================
+
+.. contents::
+
+Introduction
+------------
+Diamonds is web application that can collect all build related information and categorize
+builds. It can represent build information in different metrics. This document describes how
+to configure diamonds in helium.
+
+Diamonds Server setup
+---------------------
+Please define ``diamonds.host`` property with server address and ``diamonds.port`` with server port number.
+e. g. ::
+
+    <!-- Diamonds server details -->
+    <property name="diamonds.host" value="diamonds.xxx.com"/>
+    <property name="diamonds.port" value="9900"/>
+
+
+Initialize diamonds
+-------------------
+`diamonds` target is the initialize target for diamonds logging. Call diamonds target in build target sequence
+and this will log the already available data to diamonds and continue to log data onward as soon as they are available.
+This is done already in helium build target sequence. So user can ignore this section.
+
+Disable diamonds logging
+-------------------------------
+Diamonds logging can be skipped by defining the property ``skip.diamonds`` to true.
+e.g.::
+
+    hlm -Dskip.diamonds=true 
+
+
+Add targets into diamonds configuration ftl file
+------------------------------------------------
+Diamonds detail configurations are in helium/config/diamonds_config.xml.ftl file.
+User have to add target here(this target must be already defined in configuration) 
+if they want to log some additional data to diamonds after the target execution.
+
+Define the target with the following attributes inside ``<targets>`` node:
+
+.. csv-table:: Target
+   :header: "Attribute", "Description", "Required"
+   
+    "name", "Name of the target","Yes"
+    "template-file", "template file to process the data","No, if not defined, consider template file name same as target name"
+    "logfile", "log file which will be processed","No"
+    "ant-properties","set true if you need values from ant properties, default is false","No"
+    "defer", "logging will be deferred and will be logged at the build finish time. Default is false","No"
+
+e.g
+::
+
+    <target name="check-tool-dependencies" template-file="tool.xml.ftl" 
+    logfile="${ant['temp.build.dir']}/build/doc/ivy/tool-dependencies-${ant['build.type']}.xml" ant-properties="true"
+    defer="true"/>    
+
+
+If no logfile provided, looks for xml file to send using <build.id_target_name.xml> file or <target_name.xml> file, 
+if both doesn't exists does nothing. tries to pass ant properties and sends it. For below example, it looks for 
+<build.id_create-bom.xml> or create_bom.xml and if any one exists then it will send that data. 
+
+::
+    
+    <target name="create-bom"/>
+
+
+Using only ant properties for a specific target to send data
+
+::
+    
+    <target name="ant-prop-target" template-file="ant-prop.xml.ftl" ant-properties="true"/>
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/cruisecontrol.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+CruiseControl Helium Integration
+================================
+
+CruiseControl version: 2.8.2
+
+HCC version: 1
+
+How to use CC Helium customizations
+-----------------------------------
+
+Checks for modifications made to a Synergy repository. It does this by examining a provided reference project, getting the tasks from all folders in that project, and checking the completion time of those tasks against the last build.
+
+In CruiseControl config.xml:
+
+.. code-block:: xml
+
+   <cruisecontrol>
+      <!-- Helium customization. -->
+      <plugin name="hlmmodificationset" classname="com.nokia.cruisecontrol.sourcecontrol.HLMSynergy"/>
+      ...
+
+How to use Dashboard Helium customizations
+------------------------------------------
+
+To enable the Helium build summary widget please use the Helium specific
+dashboard configuration file:
+
+set CCDIR=<PATH_TO_CC_HOME>
+
+<HELIUM_CCC_DIR>\cruisecontrol.bat
+
+How to configure the Ant builder
+--------------------------------
+
+To prevent log.xml missing exception while running Helium please configure the ant builder this way:
+
+.. code-block:: xml
+
+   <ant .... uselogger="false" showProgress="false"... >
+      <!-- Configure the XMLLogger -->
+      <listener classname="org.apache.tools.ant.XmlLogger"/>
+      <property name="XmlLogger.file" value="${configuration.dir}/log.xml" />
+   </ant>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/debugging.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+.. index::
+  module: Debugging
+
+#########
+Debugging
+#########
+
+
+.. contents::
+   
+   
+.. _Troubleshooting-label:
+
+Troubleshooting
+===============
+
+This section contains details on how to find errors and problems within helium itself (for helium contributors) and within the configuration files
+and ANT tasks etc. for the build managers and subcons.
+
+.. index::
+  single: Output Logs
+
+.. index::
+  single: Logs
+
+Output Logs
+-----------
+
+When running Helium there are a large number of output logs created to assist with debugging and determining what has been performed and what has not.
+All of the log files are generated in the build area, usually under the ``output\logs`` folder. Many of the logs are created in different formats
+e.g. the Bill Of Materials log file exists as .html, .xml and .txt (all the same information). Some of the logs exist as different file formats giving
+different information at various stages of the activity, e.g. the cenrep logs in which case generally the .html files are a summary of the whole activity.
+For mc product builds the following log files are created 
+where xx is the name of the build + build id e.g. mc_5132_12.030_ant_env.log
+where nn is the variant number(s):
+
+.. csv-table:: build logs
+   :header: "Log name", "File type", "Purpose"
+
+    "xx_ant_env.log", "Ant environment Log", "Lists all the environment varaibles"
+    "xx_ant_build.log", "Ant build Log", "Lists all the ANT tasks that have been executed"
+    "xx_BOM.html", "BOM listing", "lists all the projects and tasks included in the build"
+    "xx_bom_delta.html", "BOM delta listing", "lists all the delta projects and tasks included in the build"
+    "xx_ee_roms.log", "ee ROM creation log", "lists all the .iby, .txt, etc. files included in the ee ROM creation, including missing files"
+    "xx_scan2.html", "compile record", "lists all the components built with their errors (0 if no errors)"
+    "xx_prebuild_scan2.html", "pre-compilation record", "lists all the pre-build components with their errors (0 if no errors)"
+    "xx_postbuild_scan2.html", "post-compilation record", "lists all the post-build components with their errors (0 if no errors)"
+    "xx_dtd_scan2.html", "dtd-compilation record", "lists all the dtd components with their errors (0 if no errors)"
+    "xx_dtd_build.log", "dtd-build record", "lists all the dtd components included in the build"
+    "xx_zips_scan2.html", "zips creation log", "lists all the zip files created and whether there are any errors"
+    "xx_cenrep_scan2.html", "cenrep creation log", "lists all the cenrep files created and whether there are any errors"
+    "xx_edge_bin_var_scan2.html", "Edge bin var creation log", "lists all the edge bin var files created and whether there are any errors"
+    "localisation_nn.html", "localisation creation log", "lists all the full build activites for localisation for a particular variant and whether there are any errors"
+    "xx_china_scan2.html", "China variant creation log", "lists all the build and link activites for creation of the China variant and whether there are any errors"
+    "xx_japan_scan2.html", "Japan variant creation log", "lists all the build and link activites for creation of the Japan variant and whether there are any errors"
+    "xx_western_scan2.html", "Western variant creation log", "lists all the build and link activites for creation of the Western variant and whether there are any errors"
+    "hlm_listener.log", "Helium debug log", "Helium debug log for internal data [Helium runtime information] and it can be found inside HELIUM_CACHE_DIR folder"
+    "hlm_debug.log", "Helium debug log", "Helium debug log for all other debug log (all java logs) and it can be found inside HELIUM_CACHE_DIR folder"
+       
+Targets and their log
+;;;;;;;;;;;;;;;;;;;;;
+
+.. image:: ../images/dependencies_log.grph.png
+
+.. index::
+  single: Troubleshooting
+
+
+Troubleshooting - Helium
+------------------------
+
+Use the ``diagnostics`` command provide debugging information when reporting problems. It lists all the environment variables and all the ANT 
+properties and all the ANT targets within Helium
+so you might find it useful to pipe it to a log file so that you can read all of the output at your leisure.
+
+To run the diagnostics command type in a command window where the hlm.bat file is:
+
+hlm diagnostics > diag.log
+
+.. index::
+  single: Failing early in the build
+
+Failing early in the build
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+The ``failonerror`` property is defined in ``helium.ant.xml`` and has the default value ``false``. It is used to control whether the <exec> 
+tasks fail when errors occur or the build execution just continues. The build can be configured to "fail fast" if this is set to ``true``, 
+either on the command line or in a build configuration before importing ``helium.ant.xml``. Given that many ``exec`` tasks will return an 
+error code due to build errors, it is not recommended to set this to true for regular builds.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/product_example.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,889 @@
+.. index::
+  module: Example Product
+
+==================
+Example Product
+==================
+
+.. contents::
+
+Introduction
+============
+
+This section gives an example of a product and its configuration files which produces a complete build, link, ROM image generation and variant creation.
+
+
+.. index::
+  single: Example - File Structure
+  
+.. _product-example-label:
+
+Legacy File Structure
+=====================
+
+The following is an example of the file structure required, 'mc' is the product root directory. The convention used here is '\' indicates a sub folder below the current folder. The mc project is saved under synergy or some other version control software. (There is a naming convention; any .xml file that contains ant configuration information is named file.ant.xml if it is purely a configuration file for the project it is named file.xml) ::
+
+  \mc
+    \helium   #contains the helium tool set.
+    \mc_build #contains the build command files and build configuration files (mostly ant configuration files).
+        languages.xml
+        team.ant.xml
+        \mc_number_build
+            delivery.xml
+            prep.xml
+            rom_image_comfig.xml
+            \all
+                bld.bat
+                build.xml
+            \product
+                build.xml
+                bld.bat
+       \teams
+          teamName.ant.xml
+    \mc_config    #contains configuration files specific to the product being build e.g. which components to include.
+        \product
+            \rom
+                \include
+                    mc_product_override.iby
+        \product_edge
+            \rom
+                \include
+                    mc_product_override.iby
+        \product_lta
+            \rom
+                \include
+                    mc_product_override.iby
+    \mc_overlay       #these contain files that are to overwite code supplied by S60 in the same structure as is saved in the S60 code under 2 different folders
+        \common       #contains overlay files common to all products
+            \files
+                \config
+                \epoc32
+                .
+                .
+                .
+        \product_overlay  #contains files that are to overwite S60 files that are specific to the product and not the others in the family of products.
+            \files
+                \config
+                \epoc32
+                .
+                .
+                .
+    \mc_sw      #contains any extra software required for the build i.e. new features to be added that are not yet in the main line code.
+        \mc_nummber_sw
+            \exports
+            
+
+Within each folder there needs to be certain files which contain certain configuration information, this is all configurable, but, this example is put here to give you tsome idea of what ot put where.
+
+.. index::
+  single: Example - Main Configuration Files
+
+Main Configuration Files
+=========================            
+
+The following example files are the main files used within the example.
+
+.. index::
+  single: Example - team.ant.xml file
+
+team.ant.xml file
+------------------
+
+This uses the TEAM variable set up in the PC control panel environment variables. The variable name must be in upper case and the value in lower case.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <project name="mc_tools.nbuild.team">
+      <property name="team" value="${env.TEAM}"/>
+      <import file="teams/${team}.ant.xml"/>
+  </project>
+
+.. index::
+  single: Example - languages.xml file
+
+languages.xml
+-------------
+
+This file contains a list of all the languages used by the product, the example only shows 3.
+
+.. code-block:: xml
+
+  <?xml version="1.0" ?>
+  <languages>
+      <language id="01" name="English"><inc>0</inc><srsf>uk</srsf></language>
+      <language id="02" name="French"><srsf>fre</srsf></language>
+      <language id="03" name="German"><srsf>ger</srsf></language>
+      <language id="326" name="Malay"><core>china</core><srsf>mly326</srsf><fallbacks>70</fallbacks></language>
+  </languages>
+
+
+.. index::
+  single: Example - delivery.xml file
+
+Delivery.xml
+-------------
+
+This file contains the list of projects that should be checkedout or copied (snapshot) from synergy.
+
+.. code-block:: xml
+
+  <build>
+      <spec name="mc_number" abstract="true">
+          <set name="database" value="${ccm.database}"/>
+          <set name="dir" value="${ccm.base.dir}" />
+          <set name="threads" value="6" />
+          <set name="use.reconfigure.template" value="false" />
+          <set name="release" value="${release.tag}" />
+          
+          <spec name="proj1_sw-wk200832:project:db1#1" type="snapshot" />
+  
+          <spec name="proj2-db2#0833:project:db3#1" type="checkout" />
+          <spec name="cellmo" abstract="true">
+              <set name="dir" value="${ccm.base.dir}\cellmo" />
+              <set name="threads" value="1" />
+  
+              <spec name="cellmo_bins_rmnum_product-wk08w31:project:db1#1" type="snapshot" />
+              <spec name="cellmo_bins_rmnum_product_chn-wk08w31:project:db5#1" type="snapshot" />
+              <spec name="cellmo_bins_rmnum_product_lta-wk08w31:project:db6#1" type="snapshot" />
+          </spec>
+      </spec>
+  </build>
+  
+
+.. index::
+  single: Example - prep.xml file
+
+prep.xml
+-----------
+
+This file takes the checked out projects (and snapshots) and copies them to the build area, unzipping those files that need unzipping.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <prepSpec>
+      <config>
+          <exclude name="abld.bat"/>
+          <exclude name=".static_wa"/>
+          <exclude name="_ccmwaid.inf"/>
+          <exclude name="documentation/*"/>
+          <exclude name="documents/*"/>
+          <exclude name="doc/*"/>
+      </config>
+      
+      <source label="Symbian" basedir="${symbian.release.dir}">
+          <unzip name="${symbian.zip.prefix}${symbian.release}_src_generic_part1.zip"/>
+          <unzip name="${symbian.zip.prefix}${symbian.release}_src_generic_part2.zip"/>
+          <unzip name="${symbian.zip.prefix}${symbian.release}_src_generic_part3.zip"/>
+          <unzip name="${symbian.zip.prefix}${symbian.release}_src_cedar.zip"/>
+          <unzip name="${symbian.zip.prefix}${symbian.release}_src_common_other_sources_part2.zip"/>
+  
+          <!-- This is required to generate all the .jar files correctly under \epoc32\tools\ -->
+          <unzip name="${symbian.zip.prefix}${symbian.release}_src_product.zip" dest="${build.drive}/src"/>
+  
+          <unzip name="${symbian.zip.prefix}${symbian.release}_epoc32.zip"/>
+          <unzip name="${symbian.zip.prefix}${symbian.release}_epoc32_RELEASE_ARMV5.zip"/>
+      </source>
+  
+      <!-- Unzip (ICF/ICD)'s if there are any -->
+      <source name="icds" basedir="">
+        <unzipicds dest="${build.drive}\">
+          <!-- Unzipping from following location
+               * S60
+               * common
+               * product
+            -->
+          <location name="${ccm.base.dir}/S60/S60/Symbian_ICD_ICF/${symbian.release}" />
+          <location name="${mc_number_build.dir}../../../mc_overlay/${product.family}_overlay/common/files/s60/Symbian_ICD_ICF/${symbian.release}" />
+        </unzipicds>
+      </source>
+  
+      <!-- Unzip (ICF/ICD)'s if there are any -->
+      <source name="product_icds" basedir="">
+        <unzipicds dest="${build.drive}\">
+          <location name="${mc_number_build.dir}../../../mc_overlay/${product.family}_overlay/common/files/s60/Symbian_ICD_ICF/product_ICF" />
+        </unzipicds>
+      </source>
+  
+      <!-- copying  s60 content -->
+      <source label="S60" basedir="${ccm.base.dir}">
+        <copy name="S60/s60"   dest="s60" />
+      </source>
+  
+      <source label="IBUSAL51" basedir="${ccm.base.dir}/">
+        <copy name="IBUSAL_RapidoYawe/IBUSAL_RapidoYawe"/>
+      </source>
+      
+     <source label="component_SW" basedir="${ccm.base.dir}">
+         <copy name="component_sw"         dest="component_sw"/>
+     </source>
+  
+      <source label="CELLMO" basedir="${ccm.base.dir}">
+         <unzip name="\cellmo\cellmo_bins_rm2num_product\cellmo_bins_rmnum_product\rmnum_product.zip" dest="${build.drive}\cellmo\${cellmo.imagename.product}"/> 
+         <unzip name="\cellmo\cellmo_bins_rmnum_product_chn\cellmo_bins_rmnum_product_chn\rmnum_product_chn.zip" dest="${build.drive}\cellmo\${cellmo.imagename.product.edge}"/> 
+         <unzip name="\cellmo\cellmo_bins_rmnum_product_lta\cellmo_bins_rmnum_product_lta\rmnum_product_lta.zip" dest="${build.drive}\cellmo\${cellmo.imagename.product.lta}"/> 
+      </source>
+      <source label="CELLMO_copy" basedir="${build.drive}\cellmo">
+          <!-- product cellmo copy -->
+          <copy name="${cellmo.imagename.product}\${dsp.imagename}.hex"  tofile="${build.drive}\epoc32\rom\config\PLATFORM\product\dsp.hex"/>
+          <copy name="${cellmo.imagename.product}\nalo.axf"      tofile="${build.drive}\epoc32\rom\config\PLATFORM\product\nalo.axf"/>
+          <copy name="${cellmo.imagename.product}\naloext.axf"    tofile="${build.drive}\epoc32\rom\config\PLATFORM\product\naloext.axf"/>
+          <copy name="${cellmo.imagename.product}\3rd.bin"       tofile="${build.drive}\epoc32\rom\config\PLATFORM\product\3rd.bin"/>
+          <copy name="${cellmo.imagename.product}\${cellmo.imagename.product}.out"  tofile="${build.drive}\epoc32\rom\config\PLATFORM\product\isa.out"/>
+          <!-- product Edge cellmo copy -->
+          <copy name="${cellmo.imagename.product.edge}\${dsp.imagename.edge}.hex"  tofile="${build.drive}\epoc32\rom\config\PLATFORM\product_edge\dsp.hex"/>
+          <copy name="${cellmo.imagename.product.edge}\nalo.axf"      tofile="${build.drive}\epoc32\rom\config\PLATFORM\product_edge\nalo.axf"/>
+          <copy name="${cellmo.imagename.product.edge}\naloext.axf"    tofile="${build.drive}\epoc32\rom\config\PLATFORM\product_edge\naloext.axf"/>
+          <copy name="${cellmo.imagename.product.edge}\3rd.bin"       tofile="${build.drive}\epoc32\rom\config\PLATFORM\product_edge\3rd.bin"/>
+          <copy name="${cellmo.imagename.product.edge}\${cellmo.imagename.product.edge}.out"  tofile="${build.drive}\epoc32\rom\config\PLATFORM\product_edge\isa.out"/>
+          <!--
+      </source>
+      <source name="patches" basedir="">
+        <unzipicds dest="${build.drive}\">
+          <location name="${patch.zip.dir}" />
+          <include name="*" />
+        </unzipicds>
+      </source>
+      
+  </prepSpec>
+  
+
+.. index::
+  single: Example - rom_image_config.xml file
+
+Legacy rom_image_config.xml file
+--------------------------------
+
+This file contains all the information necessary to create the rom image, i.e. what variants are to be created and which libraries are to go in each variant.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <build xmlns:xi="http://www.w3.org/2003/XInclude">
+      <spec name="mc" abstract="true">
+          <set name="ui.platform" value="mcnumber"/>
+          <set name="zips.loc.dir" value="${zips.loc.dir}" />
+          <set name="languages.xml.location" value="${localisation.language.file}" />
+          <set name="variation.dir" value="${build.drive}\mc\mc_config\mc_number_config\product\variation" />
+          <set name="rombuild.config.file" value="${rombuild.config.file.parsed}" />
+          <set name="version.product.name" value="N78"/>
+          <set name="imaker.languagepack.automation" value="0"/>
+          <set name="enable.romsymbol" value="1"/>
+          <set name="today" value="$(TODAY)"/>
+          <set name="languagepack.id" value="000"/> <!-- language pack id is 000 in case of EE. -->
+          <set name="customer.id" value="000"/> <!-- customer id is 000 in case of EE. -->
+          <set name="uda.id" value="000" />
+          <set name="massmemory.id" value="000" />
+          <set name="memorycard.id" value="000" />
+          <set name="customer.revision" value="1"/>
+          <set name="uda.revision" value="1"/>
+          <set name="massmemory.revision" value="1" />
+          <set name="memorycard.revision" value="1" />
+      
+    <!-- This property can be overriden by variant team -->
+          <set name="rommake.flags.vt" value=""/>
+          <set name="rommake.flags" value="-es60ibymacros -DXTI_TRACES -DNO_PLATSEC ${rommake.flags.vt}"/>
+          <set name="version.bandvariant" value="0"/>
+          <set name="version.pd.milestone" value="${major.version}"/>
+          <set name="version.pr" value="${pr}"/>
+          <set name="version.m.step" value="${m.step}"/>
+          <set name="version.bandvariant" value="0"/>
+          <set name="version.rimcycle" value="${minor.version}"/>
+  
+          <set name="image.version.name" value="${version.pr}.${build.number}${fota.a.build}" />
+          <set name="rombuild.id" value="${rommake.product.type}_${image.version.name}"/>
+  
+          <set name="rom.output.dir" value="${build.output.dir}"/>
+          <set name="image.type" value="prd,rnd"/>
+          <set name="customer.type" value="vanilla"/>
+          <set name="uda.type" value="vanilla"/>
+          <set name="image.master.iby" value="\epoc32\rom\master.oby"/>
+          <set name="image.variant.iby" value="\epoc32\rom\mc_number_variant_imaker.oby"/>
+          <set name="include.rnd.oby" value="$(if $(subst rnd,,$(TYPE)),0,1)" /> <!-- include rnd applications only in rnd images -->
+          <set name="image.override.iby" value="\epoc32\rom\override.oby"/>
+          <set name="version.copyright" value="(C) Nokia"/>
+          <set name="build.drive" value="${build.drive}"/>
+          <set name="customer.image.version.name" value="${image.version.name}" />
+          <set name="uda.image.version.name" value="${image.version.name}" />
+          <set name="massmemory.image.version.name" value="${image.version.name}" />
+          <set name="memorycard.image.version.name" value="${image.version.name}" />
+      
+  
+          <!-- Template full outputdir  (used by iMaker for ROM generation) -->
+          <set name="flash.output.dir" value="${rom.output.dir}/development_flash_images/engineering_english/${image.type}"/>
+          <set name="core.output.dir" value="${rom.output.dir}/${core.image.path}"/>
+          <set name="languagepack.output.dir" value="${rom.output.dir}/${languagepack.image.path}"/>
+          <set name="customer.output.dir" value="${rom.output.dir}/${customer.image.path}"/>
+          <set name="uda.output.dir" value="${rom.output.dir}${uda.image.path}"/>
+          <set name="eraseuda.output.dir" value="${rom.output.dir}"/>
+          <set name="flash.config.publish.dir" value="${build.output.dir}/${flash.config.path}"/> 
+          
+          <!-- Template relative paths  -->
+          <set name="core.image.path" value="release_flash_images/${image.type}/core" />
+          <set name="languagepack.image.path" value="release_flash_images/${image.type}/language/${description}_${languagepack.id}" />
+          <set name="customer.image.path" value="release_flash_images/${image.type}/customer/${customer.type}/${description}_${customer.id}" />
+          <set name="uda.image.path" value="release_flash_images/${image.type}/uda/${uda.type}/${description}_${uda.id}" />
+          <set name="memorycard.image.path" value="release_flash_images/memorycard/${description}_${memorycard.id}" />
+          <set name="massmemory.image.path" value="release_flash_images/massmemory/${description}_${massmemory.id}" />
+          <set name="flash.config.path" value="${customer.image.path}" />
+  
+          <!-- Template names  -->
+          <set name="flash.image.name" value="${rombuild.id}_${image.type}_${flash.id}"/>    
+          <set name="eraseuda.image.name" value="${rombuild.id}_${build.version}"/>    
+          <set name="empty.eraseuda.image.name" value="${rombuild.id}_${build.version}_empty"/>    
+          <set name="core.image.name" value="${rombuild.id}_${image.type}"/>
+          <set name="languagepack.image.name" value="${rombuild.id}_${languagepack.id}_${image.type}"/>
+          <set name="customer.image.name" value="${rommake.product.type}_${customer.image.version.name}_${customer.id}.${customer.revision}_${image.type}"/>
+          <set name="uda.image.name" value="${rommake.product.type}_${uda.image.version.name}_${uda.id}.${uda.revision}_${image.type}"/>
+          <set name="memorycard.image.name" value="${rommake.product.type}_${memorycard.image.version.name}_${memorycard.id}.${memorycard.revision}"/>
+          <set name="massmemory.image.name" value="${rommake.product.type}_${massmemory.image.version.name}_${massmemory.id}.${massmemory.revision}"/>
+          <set name="flash.config.name" value="${languagepack.image.name}_${customer.image.version.name}.${customer.id}.${customer.revision}_${image.type}_${uda.image.version.name}.${uda.id}.${uda.revision}_${image.type}_${massmemory.id}.${massmemory.revision}_${memorycard.id}.${memorycard.revision}.config.xml"/>
+          
+  
+          <!-- fwid generation -->
+          <set name="rofs1.fwid.id" value="core"/>
+          <set name="rofs2.fwid.id" value="language"/>
+          <set name="rofs3.fwid.id" value="customer"/>
+          <set name="rofs1.fwid.version" value="${version.product.type}_${core.version.info}"/>
+          <set name="rofs2.fwid.version" value="${rofs2.version.info}"/>
+          <set name="rofs3.fwid.version" value="${rofs3.version.info}"/>
+          <set name="fota.fwid" value="${rofs1.fwid.version} ${rofs2.fwid.version} ${rofs3.fwid.version}"/>
+  
+  
+          <!-- Core version string format-->
+          <set name="core.template" value="${core.version.info}\\n${today}\\n${version.product.type}\\n(C)Nokia"/>
+          <set name="languagepack.template" value="${rofs2.version.info}\\n${today}\\n${version.product.type}" />
+          <set name="variant.template" value="${languagepack.template}" /> <!-- Backward compatibility -->
+          <set name="customer.template" value="${rofs3.version.info}\\\n${today}"/>
+          <set name="model.template" value="${version.copyright} ${version.product.name}"/>
+          <set name="uda.template" value="${pr}.${version.bandvariant}.${build.number}\\n${today}\\n${product.type}\\n${copyright} ${version.product.name} (${uda.id})"/>
+  
+          <!-- default localisation settings -->
+          <set name="variation" value="western"/>
+          <set name="languagepack.revision" value="1"/>
+          <set name="description" value=""/>
+  
+          <!-- Do not build target in parallel by default -->
+          <set name="build.parallel" value="false" />
+  
+          <!-- templates to generate the makefiles -->
+          <set name="output.makefile.filename" value="${rombuild.makefile.name}"/>
+          <set name="main.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\main.mk"/>
+          <set name="flash.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\flash.mk"/>
+          <set name="core.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\core.mk"/>
+          <set name="languagepack.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\languagepack.mk"/>
+          <set name="customer.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\customer.mk"/>
+          <set name="uda.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\uda.mk"/>
+          <set name="eraseuda.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\eraseuda.mk"/>
+          <set name="flash.config.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\template.config.xml"/>
+          <set name="flash.config.makefile.template" value="${build.drive}\mc\mc_config\mc_number_config\rombuild\flash_config.mk"/>
+          <set name="makeupct_core.makefile.template" value="..\..\mc\mc_config\mc_number_config\rombuild\makeupct_core.mk"/>
+          
+          <spec name="product" abstract="true">
+      
+              <set name="config.name" value="product"/>
+              <set name="version.bandvariant" value="0"/>
+  
+              <set name="rommake.hwid" value="num1"/>
+              <set name="version.product.type" value="RM-num"/>
+              <set name="rommake.product.name" value="product"/>
+              <set name="rommake.product.type" value="RM-num"/>
+  
+              <spec type="TemplateBuilder">
+                  <set name="template.build.id" value="${pr}.${build.number}" />
+                  <set name="template.file" value="${build.drive}\config\s60_32_config\number_config\number_product_config\config\data\CenrepVar_product\data\VariantData_product_template.xml" />
+                  <set name="output.file" value="${build.drive}\config\s60_32_config\number_config\number_product_config\config\data\CenrepVar_product\data\VariantData_product.xml" />
+              </spec>
+  
+              <spec name="ee_group" abstract="true">
+                  <set name="image.type" value="rnd,prd"/>
+                  <set name="variant.txt.path" value="\epoc32\data\z\resource\versions\langsw.${config.name}.txt"/>
+                  <set name="image.type.version" value="EE$(if $(subst rnd,,$(TYPE)),,RD)" /> <!-- EE for Prd, EERD for R&D -->               
+  
+                  <!-- GUI images -->
+                  <spec name="ee_roms" abstract="true">
+                      <set name="build.parallel" value="true" />
+                      <set name="flash.image.name" value="${rombuild.id}_${image.type}"/>                  
+                      
+                      <spec name="ee_rnd" abstract="true">
+                          <set name="image.type" value="rnd"/>
+                          
+                          <spec type="flash">                            
+                              <set name="flash.id" value="ui" />
+                              <set name="use.foti" value="0"/>
+                              <set name="use.fota" value="0"/>                       
+                          </spec>                    
+                          
+                          <spec type="eraseuda"/>
+                      </spec>
+  
+                      <spec name="ee_prd" abstract="true">
+                          <set name="image.type" value="prd"/>
+                          
+                          <spec type="flash">                            
+                              <set name="flash.id" value="ui" />
+                              <set name="use.foti" value="1"/>
+                              <set name="use.fota" value="1"/>                       
+                          </spec>                                        
+                          
+                          <spec type="eraseuda"/>
+                      </spec>
+                  </spec>
+      
+                  <spec name="subcon_roms" abstract="true">
+                      <set name="build.parallel" value="true" />
+                      <set name="image.type" value="subcon"/>
+                      
+                      <spec type="flash">
+                          <set name="flash.id" value="ui" />
+                      </spec>
+      
+                      <spec type="eraseuda"/>
+                  </spec>
+      
+      
+                  <spec name="traces" abstract="true">
+                      <set name="build.parallel" value="false" />
+                      <set name="flash.output.dir" value="${rom.output.dir}/${rommake.product.name}/${flash.id}_traces"/>    
+                          
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="wakeup_trace" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              SysStartlib1.exe" />
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="telephony" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              telephontlib1.LIB"/>
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="audio" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              audiolibrary1.dll,
+                              audiolibrary2.dll"/>
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="videotelephony" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              videolibrary1.dll,
+                              videolibrary2.dll"/>
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="mms" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              mmslib1.dll,
+                              mmslib2.dll"/>
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="sms" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              smsslib1.dll"/>
+                      </spec>
+          
+      
+                  </spec>
+              </spec>
+          
+              <!-- Language pack and Variant -->
+              <spec name="variants" abstract="true">
+                  <set name="build.parallel" value="false" />        
+                  <!-- core -->
+                  <spec type="core">
+                      <set name="core.id" value="000" />
+                      <spec type="makeupct_core" />
+                  </spec>
+           
+                  <!-- western group -->
+                  <spec name="western" abstract="true">
+                      <set name="build.parallel" value="true" />
+                      <spec type="languagepack">
+                          <set name="languagepack.id" value="001" />
+                          <set name="default" value="01"/>
+                          <set name="languages" value="01,02,03,05,04,13"/>
+                          <set name="description" value="EURO1"/>
+                          <set name="variation" value="western"/>
+                      </spec> 
+                      <spec type="languagepack">
+                          <set name="languagepack.id" value="002"/>
+                          <set name="default" value="01"/>
+                          <set name="languages" value="01,02,03,14,05,18"/>
+                          <set name="description" value="EURO2"/>
+                      </spec>
+                      <spec type="languagepack">
+                          <set name="languagepack.id" value="003"/>
+                          <set name="default" value="01"/>
+                          <set name="languages" value="01,09,06,08,15,07"/>
+                          <set name="description" value="SCANDINAVIA"/>
+                      </spec>
+     
+           
+                  <!-- china group -->
+                  <spec  name="china" abstract="true">
+                      <set name="build.parallel" value="true" />
+                      <set name="variation" value="china" />
+                      <spec type="languagepack">
+                          <set name="languagepack.id" value="011"/>
+                          <set name="default" value="29"/>
+                          <set name="languages" value="29,157"/>
+                          <set name="description" value="CHINESE_TAIWAN"/>
+                      </spec>
+                  </spec>
+              
+                  <!-- japan group -->
+                  <spec  name="japan" abstract="true">
+                      <set name="build.parallel" value="true" />
+                      <set name="variation" value="japan" />
+                      <spec  type="languagepack">
+                          <set name="languagepack.id" value="014"/>
+                          <set name="default" value="160"/>
+                          <set name="languages" value="160,32"/>
+                          <set name="description" value="JAPAN"/>
+                      </spec>
+                  </spec>
+              </spec>
+          </spec>
+  
+          <!--
+            product edge configuration
+          -->
+          <spec name="product_edge" abstract="true">
+              <set name="config.name" value="product_edge"/>
+              <set name="variation.dir" value="${build.drive}\mc\mc_config\mc_number_config\product_edge\variation" />
+              <set name="version.bandvariant" value="1"/>
+              <set name="zips.loc.dir" value="${zips.loc.dir}" />
+              <set name="variation" value="western"/>
+              <set name="config.name" value="product_edge"/>
+              <set name="rommake.product.name" value="product_edge"/>
+              <set name="version.product.type" value="RM-num"/>
+              <set name="rommake.product.type" value="RM-num"/>
+        
+              <set name="rommake.hwid" value="2100"/>
+  
+              <spec type="TemplateBuilder">
+                  <set name="template.build.id" value="${pr}.${build.number}" />
+                  <set name="template.file" value="${build.drive}\config\s60_32_config\number_config\number_product_edge_config\config\data\CenrepVar_productedge\data\VariantData_productedge_template.xml" />
+                  <set name="output.file" value="${build.drive}\config\s60_32_config\number_config\number_product_edge_config\config\data\CenrepVar_productedge\data\VariantData_productedge.xml" />
+              </spec>
+  
+              <spec name="ee_group" abstract="true">
+                  <set name="image.type" value="rnd,prd"/>
+                  <set name="variant.txt.path" value="\epoc32\data\z\resource\versions\langsw.${config.name}.txt"/>
+                  <set name="image.type.version" value="EE$(if $(subst rnd,,$(TYPE)),,RD)" /> <!-- EE for Prd, EERD for R&D -->
+                  
+  
+                  <!-- GUI images -->
+                  <spec name="ee_roms" abstract="true">
+                      <set name="build.parallel" value="true" />   
+                      <set name="flash.image.name" value="${rombuild.id}_${image.type}"/>               
+                      
+                      <spec name="ee_rnd" abstract="true">
+                          <set name="image.type" value="rnd"/>
+                          
+                          <spec type="flash">                            
+                              <set name="flash.id" value="ui" />
+                              <set name="use.foti" value="0"/>
+                              <set name="use.fota" value="0"/>                       
+                          </spec>                    
+                          
+                          <spec type="eraseuda"/>
+                      </spec>
+  
+                      <spec name="ee_prd" abstract="true">
+                          <set name="image.type" value="prd"/>
+                          
+                          <spec type="flash">                            
+                              <set name="flash.id" value="ui" />
+                              <set name="use.foti" value="1"/>
+                              <set name="use.fota" value="1"/>                       
+                          </spec>                                        
+                          
+                          <spec type="eraseuda"/>
+                      </spec>
+                  </spec>
+      
+                  <spec name="subcon_roms" abstract="true">
+                      <set name="build.parallel" value="true" />
+                      <set name="image.type" value="subcon"/>
+                      
+                      <spec type="flash">
+                          <set name="flash.id" value="ui" />
+                      </spec>
+      
+                      <spec type="eraseuda"/>
+                  </spec>
+      
+      
+                  <spec name="traces" abstract="true">
+                      <set name="build.parallel" value="false" />
+                      <set name="flash.output.dir" value="${rom.output.dir}/${rommake.product.name}/${flash.id}_traces"/>    
+                          
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="wakeup_trace" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              SysStartlib1.exe" />
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="telephony" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              telephonylib1.LIB"/>
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="audio" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              audiolib1.dll"/>
+                      </spec>
+          
+                      <spec type="flash">
+                          <set name="flash.id" value="videotelephony" />
+                          <set name="image.type" value="rnd"/>
+                          <set name="mytraces.binaries" value="
+                              videolib1.dll"/>
+                      </spec>
+          
+                  </spec>
+              </spec>
+  
+              <spec name="variants" abstract="true">
+                  <set name="variation" value="china"/>
+                  <set name="build.parallel" value="false" />      
+                  <!-- core -->
+                  <spec type="core">
+                      <set name="core.id" value="000" />
+                      <set name="image.type" value="rnd,prd"/>
+                      <spec type="makeupct_core" />
+                  </spec>
+  
+                  <!-- customer -->
+                  <spec  type="customer">
+                      <set name="customer.id" value="053"/>
+                      <set name="customer.revision" value="1"/>
+                      <set name="description" value="edge_customer_variant"/>
+                  </spec>
+  
+                  <spec type="languagepack">
+                      <set name="languagepack.id" value="020"/>
+                      <set name="default" value="31"/>
+                      <set name="languages" value="159,31"/>
+                      <set name="description" value="CHINAPRC_NoFMTX"/>
+                  </spec>
+      <xi:include href="${product_edge.variant.config}"/>
+  
+              </spec>
+          </spec>
+    
+      
+          </spec>    
+      </spec>
+  </build>
+
+
+.. index::
+  single: Example - bld.bat
+
+bld.bat
+--------------------
+
+This file is the one called when you start helium and it simply calls the hlm.bat file in the helium directory. ::
+
+  @echo off
+  
+  if not defined HELIUM_HOME set HELIUM_HOME=%~dp0..\..\..\helium
+  
+  %HELIUM_HOME%\hlm.bat %*
+
+
+.. index::
+  single: Example - build.xml
+
+build.xml
+--------------------
+
+This file contains all the initial product specific configuration required  by helium.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <project>
+      <property environment="env"/>                                         #the PC property 'ENVIRONMENT' is replaced with 'env'
+      <import file="../../team.ant.xml"/>                                   #where to get the config file containing the team specific information.
+      
+      <property name="product.list" value="product,product_edge,product_lta"/> #the list of products to be built
+      <!-- build.number should be defined as a commandline parameter -->
+      <property name="major.version" value="14"/>                           #release version
+      <property name="minor.version" value="PR14"/>
+      <property name="pr" value="14" />
+      <property name="m.step" value="3" />
+          
+      <property name="armv5.only" value="1" />                              #only build for armv5
+      <property name="build.version" value="${pr}.${build.number}" />       #create the build version
+      
+      <property name="local.free.space" value="102400" />
+  
+      #these are the configuration files specific to each variant
+      <property name="product.variant.config" location="${build.drive}/mc/mc_build/mc_family_build/dummy_variant_config.xml" />
+      <property name="product_edge.variant.config" location="${build.drive}/mc/mc_build/mc_family_build/dummy_variant_config.xml" />
+      <property name="product_lta.variant.config" location="${build.drive}/mc/mc_build/mc_family_build/dummy_variant_config.xml" />
+  
+      <property name="build.errors.limit" value="-1" />
+      <property name="flash.config.enabled" value="enabled" />
+      
+       <!-- -->
+      <import file="../mc_family_build.ant.xml"/>                 #include the family product config file
+
+      <path id="system.definition.files">                       #locations of various system configuration files.
+          <pathelement path="${build.drive}/mc/mc_build/mc_family_build/family_System_Definition.xml"/>
+          <pathelement path="${build.drive}/mc/mc_build/mc_family_build/family_SDF_loc.xml"/>
+          <pathelement path="${build.drive}/mc/mc_build/ibusal_51_build/IBUSAL51_System_Definition.xml" />
+          <fileset dir="${build.drive}/s60/tools/build_platforms/build/data" includes="S60_System*.xml"/>
+          <pathelement path="${build.drive}/mc/mc_build/mc_family_build/product/product_System_Definition.xml" />
+          <pathelement path="${build.drive}/MULTIMEDIA_SW/ME_SCD_DESW/ME_SCD_DESW/sysdef/System_Definition_product.xml" />
+      </path>
+  
+  </project>
+  
+
+.. index::
+  single: Example - teamName.ant.xml
+
+teamName.ant.xml
+--------------------
+
+This file contains all the configuration required by a particular team, it lists where the servers are and the locations of synergy variables, GRACE variables etc.:
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <project name="teamName">
+      <property name="publish.root.dir" value="\\faba\df\r1120\NT\Build_and_Release\temp"/>
+      <property name="prep.root.dir" value="E:/${user.name}/BuildArea"/>
+      <property name="build.drive" value="z:"/>
+      
+      
+      <!-- Synergy configuration -->
+      <property name="ccm.database" value="fa1ffamily" />
+      <property name="ccm.database.path" value="/nokia/fa/grps/dbs/${ccm.database}" />
+      <property name="ccm.engine.host" value="faweh.erp.company.com" />
+          <!-- used to set ccm.base.dir -->
+      <property name="ccm.home.dir" location="E:/${user.name}/ccm_wa/${ccm.database}" />
+      
+      
+      <!-- Root path for all Synergy work areas. -->    
+      <property name="nss.zip.dir" value="\\faba\df\r1120\NT\Build_and_Release\GRACE\MC\NSS" />
+      <property name="symbian.root.dir" value="\\faba\df\r1120\NT\Build_and_Release\GRACE\MC\SOS"/>
+      <property name="s60.root.dir" value="\\faba\df\r1120\NT\Build_and_Release\GRACE\MC\S60"/>
+      <property name="cellmo.root.dir" value="\\faba\df\r1120\NT\Build_and_Release\GRACE\MC\Cellmo\product"/>
+      <property name="error.email.to.list" value="${env.EMAIL}"/> <!-- BM should set it throught environment -->
+      <property name="ec.cluster.manager" value="fa001"/>
+      <property name="ec.build.class" value="ISISBR"/>
+      <property name="work.area.temp.dir" location="\\vcer02\prj2\Juno\SWBuilds\WorkAreaCopyCache"/>
+          <!-- Grace releasing configuration -->
+      <property name="release.grace.configurationfile" value="./grace_upload_configuration.ant.xml" />
+      
+      <property name="release.dir.root" value="\\faba\df\r1120\NT\Build_and_Release\family_Off-Cycle\Increment_Releases" />
+      
+      <!-- FOTA -->
+      <property name="fota.publish.root.dir" value="${publish.root.dir}"/>
+      <property name="fota.unix.publish.root.dir" value="/nokia/fa/grps/r1120/NT/Build_and_Release/temp"/>
+      <property name="fota.upct.server.address" value="farem02" />
+  
+      <!-- Grace settings -->
+      <property name="release.grace.server" value="fam01.europe.company.com" />
+      <property name="release.grace.service" value="ISIS" />
+      <property name="release.grace.product" value="${product.family}" />
+      <property name="release.grace.sambaserver" value="\\fa01.europe.company.com\GRACE" />
+      
+      <!-- Mail settings -->
+      <property name="release.grace.mail.host" value="ca01.noe.company.com" />
+      <property name="release.grace.mail.port" value="25" />
+      <property name="release.grace.mail.from" value="email address of person to email" />
+      <property name="release.grace.mail.to" value="email address" />
+      <property name="release.grace.mail.replyto" value="${release.grace.mail.to}" />
+      <property name="release.grace.mail.subject" value="Grace upload for ${release.grace.product} ${rel_label} completed" />
+      <property name="release.grace.mail.message" value="Grace upload for ${release.grace.product} ${rel_label} completed SUCCESFULLY." />
+      
+      <property name="build.completed.mail.to" value="M-MC-MCSS-INTEGRATION-PLATFORM DG" />
+      <property name="build.completed.mail.subject" value="NIGHTLY BUILD ${build.id} at ${env.COMPUTERNAME} has been completed" />
+      <property name="build.completed.message" 
+        value="This is an automated e-mail, reply to address: ${release.grace.mail.from}${line.separator}${line.separator}
+        ${product.name} NIGHTLY BUILD ${build.id} on ${env.COMPUTERNAME}${line.separator}
+        ================================================================================${line.separator}
+        NB has been completed at ${time.completed}${line.separator}
+        Build area at \\${env.COMPUTERNAME}\Build_D$\BA\${build.id}${line.separator}
+        Server: ${env.COMPUTERNAME}${line.separator}
+        ${line.separator}
+        Engineering english build files created${line.separator}
+        "
+      />
+  </project>
+ 
+ 
+.. index::
+  single: Example - mc_product_override.iby file
+
+mc_product_override.iby file
+------------------------------
+ 
+ This file contains details of files that will be used to create the ROM image. ::
+ 
+ 
+  //FMTX stuff (to prevent from showing the missing file as there is already InternalHWRMFmTxPolicy.ini file in rom)
+  data-override=empty private\101f7a02\HWRMFmTxPolicy.ini
+  
+  // Variating ActiveIdle theme
+  
+  #ifdef MC_ACTIVEIDLE_VARIANT
+  #ifndef __MC_NO_FMTX_IN_ROM
+  data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.,MC_ACTIVEIDLE_VARIANT,.o0000)           PRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.o0000
+  data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.,MC_ACTIVEIDLE_VARIANT,.o0000)           PRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.o0000
+  ROM_IMAGE[2] data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.,MC_ACTIVEIDLE_VARIANT,.o0001)                                 PRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001
+  ROM_IMAGE[2] data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.,MC_ACTIVEIDLE_VARIANT,.o0001)                                 PRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001
+  #endif // __MC_NO_FMTX_IN_ROM
+  #endif // MC_ACTIVEIDLE_VARIANT
+  
+  // Variantion ends
+  
+  
+  // Product customisation
+  #include <commontsy.var>
+  #ifdef MC_PRODUCT_CUSTOMISATION_VAR
+  define __MC_PRODUCT_CUSTOMISATION_VAR__ MC_PRODUCT_CUSTOMISATION_VAR
+  file-override=ABI_DIR\BUILD_DIR\COMMONTSY.__MC_PRODUCT_CUSTOMISATION_VAR__.DLL    Sys\Bin\COMMONTSY.DLL
+  #endif
+  
+  
+  ROM_IMAGE[2] {
+  #ifdef LPID
+  #ifdef product
+  data-override=concat3(\epoc32\data\Z\Resource\bootdata\languages.product.,LPID,.txt)   "resource\Bootdata\languages.txt"
+  data-override=concat3(\epoc32\data\Z\Resource\versions\lang.product.,LPID,.txt)   "resource\versions\lang.txt"
+  #endif
+  #ifdef product_EDGE
+  data-override=concat3(\epoc32\data\Z\Resource\bootdata\languages.product_edge.,LPID,.txt)   "resource\Bootdata\languages.txt"
+  data-override=concat3(\epoc32\data\Z\Resource\versions\lang.product_edge.,LPID,.txt)   "resource\versions\lang.txt"
+  #endif
+  #ifdef product_LTA
+  data-override=concat3(\epoc32\data\Z\Resource\bootdata\languages.product_lta.,LPID,.txt)   "resource\Bootdata\languages.txt"
+  data-override=concat3(\epoc32\data\Z\Resource\versions\lang.product_lta.,LPID,.txt)   "resource\versions\lang.txt"
+  #endif
+  #endif // LPID 
+  }
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/running.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,127 @@
+.. index::
+  module: Running Helium
+
+##############
+Running Helium
+##############
+
+
+.. contents::
+
+
+.. index::
+  single: Command line
+
+Command line
+============
+
+The Helium command line interface is basically the same as the Ant command line, the main difference being that ``hlm`` is used instead of ``ant``. Please make sure to read the `Ant documentation`_.
+
+.. _`Ant documentation`: http://ant.apache.org/
+
+.. index::
+  single: Command line help
+
+Command line help
+-----------------
+
+To get a help summary on the command line, run ``hlm`` or ``hlm help``.
+
+To get help on a specific command, run ``hlm help <command>``.
+
+.. index::
+  single: Basic Commands
+
+Basic commands
+--------------
+
+::
+
+    hlm hello
+    
+Prints Hello to the command line. Very simple way to check the configuration is runnable.
+
+::
+
+    hlm version
+
+Prints out the Helium version information.
+
+::
+
+    hlm config
+
+Prints the Ant configuration properties.
+
+::
+
+    hlm diagnostics
+
+Prints various diagnostic information that is useful for debugging.
+ 
+
+.. index::
+  single: Configuration validation
+
+Configuration validation
+========================
+
+An Ant configuration can be validated against the Helium data model using the command::
+
+    hlm check
+    
+This will check for a number of things:
+
+* Warn about deprecated properties that are defined.
+* Warn about required properties in groups where at least one other property from that group is used. A group is a set of related properties for a feature. If that feature is to be used some properties may then be required and some may still be optional within that group.
+* Show for information any properties that are in the configuration but not in the data model. A particular build configuration may want to define some properties that are additional to those recognised by Helium.
+
+
+.. index::
+  single: Tools version checking
+
+Tools version checking
+======================
+
+Tool version checking can be performed to ensure that all tools have correct versions present. At the same time, a path setting file will be created. Calling this file will add tools into path, so hard coding paths is no longer needed.
+
+To perform checking run the command::
+
+  hlm check-tool-versions
+
+
+.. index::
+  single: Build output
+
+Build output
+================
+
+When a build is running the targets being executed are listed on the screen there is no need to pipe this to a file as the ant targets are logged in the   ``\*_ant_build.log`` for product and IDO builds. Once the build is complete it will say on the screen whether the build was successful or failed. If it has failed it should give an indication of where and why it failed on the screen but for more information you must examine the output logs. If the build says it was successfult this does not necessarily mean that the build compiled all components successfully, you must examine the logs to check that all is compiled and linked correctly. See :ref:`Troubleshooting-label` for information on logs and where they kept.
+
+The result of the build (compiled files, linked (flash) files etc.) are  stored in the usual folders and directories under the ``\epoc32`` directory.
+
+
+.. index::
+  single: Logging
+  
+Logging
+=======
+
+Diamonds
+--------
+Logging to the Diamonds metrics database can be disabled by setting the property:: 
+
+    skip.diamonds=true
+
+Internal data
+-------------
+
+Helium can collect internal data about builds for the purpose of improving support. This can be disabled by setting an environment variable::
+
+    set HLM_DISABLE_INTERNAL_DATA=1
+
+ 
+Troubleshooting
+================
+
+See :ref:`Troubleshooting-label` for information on how to find faults with Helium.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/sbs.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,154 @@
+.. index::
+  module: SBS in Helium
+
+.. index::
+  module: Raptor (SBS) in Helium
+
+=======================
+SBS (raptor) In Helium
+=======================
+
+.. contents::
+
+This document describes requirements and how to run sbs builds using helium
+
+
+SBS Requirements
+-----------------
+
+Before starting the build, SBS needs to be updated for s60 related changes, please follow the instructions from the link below,
+
+`How to Build Raptor <http://s60wiki.nokia.com/S60Wiki/How_To_Build_With_Raptor>`_
+
+1. SBS_HOME environment variable needs to be set
+2. PATH environment variable needs to be updated with SBS related exe:
+
+   path(SBS_HOME\\BIN;SBS_HOME\\win32\\mingw\\bin;SBS_HOME\\win32\\msys\\bin)
+
+3. RVCT requirement for raptor is 22_616, in IDO config / product config batch file the env variable needs to be set to
+HLM_RVCT_VERSION=22_616
+
+For Example: ::
+
+ set HELIUM_HOME=E:\Build_E\ec_test\helium-trunk\helium
+ set PATH=e:\svn\bin;E:\sbs\bin;c:\apps\actpython;%PATH%
+ set SBS_HOME=E:\sbs
+ set MWSym2Libraries=%MWSym2Libraries%;C:\APPS\carbide\x86Build\Symbian_Support\Runtime\Runtime_x86\Runtime_Win32\Libs
+ set TEAM=site_name
+   
+(Note: For IDOs, these environment variables are set automatically, for S60 option is proposed).
+
+Required SBS input for Helium
+------------------------------
+1. To run using SBS mode the following properties need to be set with the values shown below:
+
+   * build.system - sbs - gmake as SBS engine
+   * build.system - sbs-ec emake as SBS engine (ECA 4.3 or above required)
+
+2. sbs.config - (configurations for which the sbs needs to be run - for example (armv5 / winscw) - default is armv5 only.
+
+The layers to be built for SBS are obtained from System definition files (layers.sysdef.xml found in each component top level folder in the released code). The requirement for the system definition files to be run using SBS / raptor is to have a unique filter for each configuration. The current setup is using raptor\_<configuration_name> for example, for s60_build configuration, the filter should be raptor\_s60_build.
+This is the temporary solution and discussions are on to finalise / improve the filter mechanism for raptor. The raptor\_ change has been added to the layers.sysdef.xml files supplied for the IDOs and S60_SBS build releases but when building using DFS full builds the files need to be modified to add the raptor\_ for each layer.
+
+Supported SBS parameters from helium
+-------------------------------------
+
+List of parameters::
+
+   a. layers - No need to specify for the full IDO / product configuration. If there is a requirement to run specific layer alone, then this needs to be set.
+   b. config - (configuration to be built - armv5, winscw - with comma seperated values)
+   c. skipBuild - just to generate the makefile for SBS and not to run the targets.
+   d. singleJob - run in single thread for engine gmake only
+   e. layerOrder - If the layers need to be built using order, then this needs to be set to true.
+   f. command - command to be executed(SBS commands - REALLYCLEAN, EXPORT, BITMAP, RESOURCE, TARGET)
+   g. sysdef-base - base location for the sysdef (root directory for relative paths in the system definition files)
+   h. enable-filter - to use the SBS log processing using filter options from SBS, this should be set to true
+      to use helium log filter and scanlog.
+   i. retry-limit - number of times to try in case of transient failure ( -t of sbs).
+   j. run-check - (true / false) runs the --check sbs command if set to true
+   k. run-what - (true / false) runs the --what sbs command if set to true
+
+Command line arguments to SBS using Helium:
+-------------------------------------------
+
+build.system=sbs
+~~~~~~~~~~~~~~~~~
+To build using gmake as the engine, and all others with default values (skipBuild - false, with multiple jobs (default
+set by helium is number.of.processor*2 and no layer order)
+
+If multiple configurations need to be built, a comma separated list needs to be passed as (armv5,winscw) to sbs.config property.
+
+examples::
+   
+   <property name="sbs.config" value="armv5" />
+   <property name="sbs.config" value="armv5,winscw" />
+   <property name="sbs.config" value="armv5,winscw,armv5.test"/>
+   
+This can be set in the IDO root directory build.xml file.
+
+Here is an example command to use (first 'cd' to IDO configuration directory ido_configuration/running/idos/abs/branches/mcl_devlon ) ::
+
+   hlm -Dbuild.drive=z: -Dbuild.system=sbs -Dbuild.number=005 -Dskip.password.validation=true ido-build
+
+   
+build.system=sbs-ec
+~~~~~~~~~~~~~~~~~~~~
+To build using emake as the engine with default values set by helium (sbs make engine as emake and other emake parameters using ec) just the ``sbs.config`` property has   to be set to configuration to be built(armv5, winscw).
+   
+Here is an example command to use (first 'cd' to IDO configuration directory ido_configuration/running/idos/abs/branches/mcl_devlon )
+
+hlm -Dbuild.drive=z: -Dbuild.system.main.build=sbs-ec -Dbuild.number=005 -Dskip.password.validation=true ido-build
+
+Note the different flag ``-Dbuild.system.main.build=sbs-ec``
+
+
+Passing Make options to SBS using helium
+-----------------------------------------
+
+Make options for different make engines could be passed to SBS using ant reference as below,
+(Note: currently supported make engine options are emake options only, in the future will
+be added for pvm and gmake).
+
+Make options for SBS using helium:
+
+.. code-block:: xml
+
+   <hlm:sbsMakeOptions id="sbs-ec.fullbuild.options" engine="emake">
+      <hlm:makeOption name="--emake-emulation" value="gmake" />
+      <hlm:makeOption name="--emake-annodetail" value="basic,history,waiting" />
+      <hlm:makeOption name="--emake-class" value="${ec.build.class}" />
+   </hlm:sbsMakeOptions>
+   
+First user defined make options need to be defined as above, then the default ``<build.system>.make.options``
+parameter needs to be overridden in the antcall of user defined config as below:
+   
+.. code-block:: xml
+   
+   <antcall target="compile-main" inheritAll="false" inheritRefs="true">
+      <reference refid="sbs-ec.fullbuild.options" torefid="sbs-ec.make.options"/>
+   </antcall>
+   
+Here the ``sbs-ec.fullbuild.options`` mapped to ``sbs-ec.make.options`` and used by helium to set
+emake options for SBS.
+   
+Building for different SBS input (advanced users)
+--------------------------------------------------
+
+Some examples to build for different sbs input using helium are below:
+   
+To build using a single thread, the sbs helium variable is:
+   
+.. code-block:: xml
+   
+   <hlm:argSet id="sbs.singlethread.var">
+      <hlm:arg name="config" value="${sbs.config}" />
+      <hlm:arg name="singleJob" value="true" />
+   </hlm:argSet>
+   
+And set ``sbs.var`` to ``sbs.singlethread.var`` as below during <antcall> target to call compile-main:
+
+.. code-block:: xml
+
+   <antcall target="compile-main" inheritAll="false" inheritRefs="true">
+      <reference refid="sbs.singlethread.var" torefid="sbs.var"/>
+   </antcall>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/signaling.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,181 @@
+Configuring Signaling
+=====================
+
+Helium signaling framework offers you a simplest way to control 
+failures on build flow, and provides you an easy way to get reporting on
+some crucial steps of your build.
+
+
+The configuration
+-----------------
+
+The signaling configuration is divided on three parts:
+
+   * the signalConfig: defines the signal (Depreciated - please use signalListenerConfig)
+   * the signalListenerConfig: defines the signal
+   * the signalInput: defines what to do when a signal is raised
+   * the notifierList: defines a set of notifiers
+
+signalListenerConfig
+....................
+
+This part of the configuration is not targeted to be overridden by the build manager.
+
+The following example defines a custom signal named as **customSignal**.
+The default configuration must reference a default signalInput configuration using a nested inputRef element,
+so the signaling framework knows how to behave when a signal is raised.
+
+.. code-block:: xml
+
+    <hlm:signalListenerConfig id="customSignal" target="target-name" message="target-name triggered a signal">
+        <signalNotifierInput>
+            <signalInput refid="signalInputId" />
+            <notifierInput file="some/file/to/notify.html" />
+        </signalNotifierInput>
+        <hlm:targetCondition>
+            </available file="some-file.txt" />
+        </hlm:targetCondition>
+    </hlm:signalConfig>
+ 
+A signal will then be triggered each time the **target-name** completed. The signalInput will then defined how it should be handled.
+
+Other way to trigger a signal is by using the signal task:
+ 
+.. code-block:: xml
+
+    <hlm:signal name="customSignal" result="1">
+        <signalNotifierInput>
+            <signalInput refid="signalInputId" />
+            <notifierInput file="some/file/to/notify.html" />
+        </signalNotifierInput>
+    </hlm:signal>
+    
+
+signalInput
+...........
+
+This Ant type defines what a signal should do when it is raised. The failbuild attribute defines
+if a build failure should be:
+
+    * failing the build now (value: now)
+    * deferred at the end of the build (value: defer)
+    * ignored (value: never)
+   
+Then the configuration will accept a reference to a notifierList using the notifierListRef element.
+
+Example of configurations
+
+.. code-block:: xml
+
+    <hlm:signalInput id="customSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="customNotifier" />
+    </hlm:signalInput>
+  
+This will run all notifier from the customNotifier configuration then fail the build.
+
+.. code-block:: xml
+
+    <hlm:signalInput id="customSignalInput" failbuild="defer"/>
+
+This will defer the failure at the end of the build, no notifier will be run.
+
+notifierList
+............
+
+The notifierList Ant type allows the user to configure a set of Notifier (e.g Email, execute task):
+
+The following example configures a notifier list that will send an email and run few echo task to print
+some information.
+
+.. code-block:: xml
+
+    <hlm:notifierList id="customNotifier">
+        <hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl"
+                           title="[signal] ${signal.name}" smtp="smtp.server.address"
+                           ldap="ldap://ldap.server.address:389"
+                           notifyWhen="always"/>
+        <hlm:executeTaskNotifier>
+            <echo>defaultSignalAlwaysNotifier: Signal: ${signal.name}</echo>
+            <echo>defaultSignalAlwaysNotifier: Status: ${signal.status}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+Detailed documentation of the notifier interface could be found `here <../../helium-antlib/index.html>`_.
+
+
+Example: configuring compileSignal
+----------------------------------
+
+In this example we will configure the compileSignal to behave this way:
+
+   * send an email to additional users e.g: user@foo.com, user@bar.com
+   * defer the build failure.
+
+You configuration should contains (e.g build.xml)
+
+.. code-block:: xml
+
+   <?xml version="1.0"?>
+   <project name="mybuild">
+      ...
+      <import file="${helium.dir}/helium.ant.xml"/>
+      ...
+      
+      <hlm:notifierList id="myCustomNotifierList">
+          <hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl"
+                title="[signal] My build goes wrong: ${signal.name}"
+                smtp="${email.smtp.server}"
+                ldap="${email.ldap.server}"
+                notifyWhen="fail"
+                additionalrecipients="user@foo.com,user@bar.com"/>
+      </hlm:notifierList>
+      
+      <hlm:signalInput id="compileSignalInput" failbuild="defer">
+         <hlm:notifierListRef refid="myCustomNotifierList" />
+      </hlm:signalInput>
+
+   </project>
+
+   
+A custom notifierList has been created with **myCustomNotifierList** as reference ID. It defines
+a emailNotifier which uses the default email template under Helium (${helium.dir}/tools/common/templates/log/email_new.html.ftl).
+It also set the title of you email to be "[signal] My build goes wrong: ${signal.name}" (signal.name property will be replace by the signal name raised).
+**notifyWhen** attribute will make the notifier to send a notification only on build failure.
+Finally the two additional email addresses will be set using the **additionalrecipients** attribute. 
+
+We then need to link the signal configuration and our custom the notifier list. The signalInput element is use to achieve that. 
+It must be defined using the same reference ID (see reference overriding howto) as the one in the Helium configuration, the naming convention for this is: **<signal_name>Input**.
+Its **failbuild** attribute is set to **defer** which will configure the build to keepgoing, and fail at the end of the build flow.
+Finally an embedded notifierListRef element will reference our custom notifier list: **myCustomNotifierList**.
+
+While failing the signaling framework will execute all notifier defined and then store internally the build failure so it can raise it again at the end of the execution.
+    
+
+Example: Report specific errors not included by default
+-------------------------------------------------------
+
+Target prep-work-area has extra log extraction added and output xml is read by a new signal.
+
+.. code-block:: xml
+
+   <hlm:signalInput id="prepWorkAreaSignalInputWarn" failbuild="defer">
+       <hlm:notifierListRef refid="defaultSignalFailNotifier" />
+   </hlm:signalInput>
+   
+   <hlm:signalListenerConfig id="prepWorkAreaSignalWarn">
+        <signalNotifierInput>
+            <signalInput refid="prepWorkAreaSignalInputWarn" />
+            <notifierInput file="${build.log.dir}/${build.id}_ccm_get_input.log2.xml" />
+        </signalNotifierInput>
+       <hlm:targetCondition name="prep-work-area" message="Warnings happened during Preparing Work Area">
+           <hlm:hasSeverity severity="error" file="${build.log.dir}/${build.id}_ccm_get_input.log2.xml"/>
+       </hlm:targetCondition>
+   </hlm:signalListenerConfig>
+
+   <target name="prep-work-area" depends="ccmgetinput.prep-work-area">
+       <hlm:logextract file="${build.log.dir}/${build.id}_ccm_get_input.log" outputfile="${build.log.dir}/${build.id}_ccm_get_input.log2.xml">
+           <logfilterset>
+               <logfilter category="error" regex=".*Explicitly specified but not included" />
+           </logfilterset>
+       </hlm:logextract>
+   </target>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/stages.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2088 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+.. index::
+  module: Stages
+
+=============
+Helium stages
+=============
+
+.. contents::
+
+This section gives details of each of the phases of a Helium build and what they do.
+
+
+.. index::
+  single: Stage - startup
+
+Stage: Startup
+==============
+
+.. index::
+  single: Remote builds
+
+Remote builds
+-------------
+
+.. index::
+  single: Remote build Commands
+
+Remote build Commands
+:::::::::::::::::::::
+
+Remote builds are used when a number of build configurations need to be run on several machines from a single work area. For a remote machine to receive the commands, a build manager must login and start the antserver process by running ``c:\apps\antserver\run_ant_server.bat``.
+
+Two commands are supported::
+
+  hlm distribute-work-area
+
+Tars up the work area, copies it to a network location defined by the work.area.temp.dir property, and sends a command to the remote servers to untar the work area. On the remote servers the basedir is deleted before the work area is untarred. ::
+
+  hlm start-remote-builds
+
+Sends commands to start the builds based on the remote builds configuration file entries.
+
+
+.. index::
+  single: Remote build configuration
+
+Remote build configuration
+::::::::::::::::::::::::::
+
+The configuration file format defines one or more builds::
+
+  <BuildProcessDefinition>
+      <remoteBuilds>
+          <build machine="vcbldsrv12" ccmhomedir="${r'$'}{ccm.home.dir}" basedir="${r'$'}{ccm.base.dir}" executable="hlm" dir="${r'$'}{mc_4031_build.dir}\PRODUCT" args="product-build -Dbuild.number=${r'$'}{build.number} -Dprep.root.dir=d:\pmackay"/>
+      </remoteBuilds>
+  </BuildProcessDefinition>
+
+Each ``<build>`` element has a number of attributes:
+
+machine
+  The name of the remote build machine. The commands will only work if an Ant server instance is running, so be careful not to run the server on the local machine!
+
+ccmhomedir
+  This should match to the ``ccm.home.dir`` property.
+
+basedir
+  This defines the directory in which the current work area (under ``ccm.home.dir``) is located.
+
+executable
+  The file to be executed when starting a build. Typically this can be left as ``hlm``.
+
+dir
+  The directory where the executable should be found and where the command will be run from.
+
+args
+  The arguments passed to the executable. These should consist of Ant arguments, as the build is run using Ant. Note that this attribute value is treated in the same way as the line attribute in the Ant ``exec`` task - spaces are interpreted as separating the arguments.
+
+The ``remote.builds.config.file`` property defines the location of the configuration file. This should be defined in a team Ant configuration file.
+
+
+.. Commented out because we will not use this for our releases
+   Subcon bootstrap
+   ----------------
+    
+   The subcon edition of Helium does not include any 3rd party libraries due to licensing restrictions.
+   Before you start using a copy of helium for the first time you need to call ``hlm-bootstrap.bat``.
+    
+   Run like this if you get timeout errors and set to the values of your proxy server::
+   
+     hlm-bootstrap.bat -Dproxy.host=172.16.42.137 -Dproxy.port=8080
+    
+   Or if you have no proxy server::
+    
+     hlm-bootstrap.bat -Dproxy.disabled=y
+    
+   The bootstrap process is:
+    
+    * Download Ivy jars.
+    * Use Ivy to download dependencies.
+    * Extract and install dependencies.
+
+
+.. index::
+  single: Stage - Preparation
+
+Stage: Preparation
+==================
+
+At the start of preparation a new directory is created for the build and subst'ed to ``build.drive``. If a directory with this name already exists, it is renamed to have a current timestamp on the end.
+
+.. index::
+  single: How to prepare the build area?
+
+How to prepare the build area?
+------------------------------
+
+A key part of build preparation is initialising the build drive by copying or unzipping the input files. The ``build.prep.config.file`` should reference a file that follows the prep XML file format (e.g. mc\mc_build\mc_4031_build\prep.xml). A suggestion is that this file is called prep.xml by default.
+
+The XML format of the prep file is as follows:
+
+Beginning of the file and config
+:::::::::::::::::::::::::::::::::
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <prepSpec>
+        <config>
+            <exclude name="_ccmwaid.inf"/>
+            <exclude name="abld.bat"/>
+            <exclude name=".static_wa"/> 
+            <exclude name="documentation/*"/> 
+            <exclude name="documents/*"/> 
+            <exclude name="doc/*"/>
+        </config>
+
+Each exclude under config defines which files are NOT extracted during unzip phases.
+
+Unzip
+:::::
+
+.. code-block:: xml
+
+    <source label="Symbian" basedir="${r'$'}{symbian.release.dir}">
+        <unzip name="${r'$'}{symbian.zip.prefix}${r'$'}{symbian.release}_src_generic_part1.zip"/>
+        <unzip name="${r'$'}{symbian.zip.prefix}${r'$'}{symbian.release}_epoc32.zip">
+            <include name="epoc32/tools/*"/>
+        </unzip>
+    </source>
+
+Each separate unzip phase is defined beginning with source. Each file that needs to be unzipped is specified with unzip. It is also possible to define what parts of the zips are extracted using include tags.
+
+ICD/ICF Unzip
+::::::::::::::
+
+.. code-block:: xml
+
+    <source name="icds" basedir="">
+        <unzipicds dest="Z:\">
+            <location name="${r'$'}{ccm.base.dir}/S60_3_1/S60_3_1/Symbian_ICD_ICF/${r'$'}{symbian.release}" />
+            <include name="src/*" />
+        </unzipicds>
+    </source>
+
+ICDs/ICFs (Intermediate Code Fix\Drop) are extracted using unzipicds tag. Using this command ensures that the files are extracted in the correct order. Multiple ICD/ICF directories can be given to be extracted by giving multiple locations.
+
+Copy
+::::
+
+.. code-block:: xml
+
+    <source label="S60" basedir="${r'$'}{ccm.base.dir}/S60_3_1/S60_3_1">
+        <copy name="adaptation" dest="adaptation"/>
+        <copy name="S60" dest="S60">
+            <exclude name="S60/bldvariant/Series_60_3_1_common/ProductVariant.hrh"/>
+        </copy>
+    </source>
+
+Each separate copy phase is defined beginning with source. The dest parameter for each copy command defines to what folder the files are copied starting fron the given basedir. It is also possible to exclude files using the exclude tag.
+
+File end
+::::::::
+
+::
+
+    </prepSpec>
+
+
+ICF/ICD:
+````````
+
+This information is extracted from the filesystem, it uses the sources defined in the preparation xml configuration file to retreive the ICF/ICD content.
+
+.. Note::
+    This means that all ICD/ICF extracted from any other source will not be considered.
+    So you MUST use the <unzipicds dest=""> statement of the preparation configuration file.
+
+Flags:
+``````
+
+Flags are extracted from the ProductVariant.hrh (mc_config/${r'$'}{build.configuration}_config/${r'$'}{product.name}/include/ProductVariant.hrh).
+
+.. index::
+  single: Stage - Source preparation
+
+Stage: Source preparation
+=========================
+
+The build preparation consists in two parts:
+
+ * Getting delivery content (Synergy, zips...),
+ * Preparing the build area.
+
+How to get delivery content from Synergy?
+
+It is possible to automatically get content from Synergy using the Helium framework.
+To handle that you have to configure the delivery.xml file from your family build configuration folder and reference by the property prep.delivery.file.
+
+Example configurations like a minibuild can be found under the Helium source tree.
+
+Example of configuration:
+
+.. code-block:: xml
+
+    <build>
+        <config name="mc_5132" abstract="true">
+            <set name="database" value="fa1f5132"/>
+            <set name="host" value="${r'$'}{ccm.engine.host}" />
+            <set name="dbpath" value="${r'$'}{ccm.database.path}" />
+        
+            <set name="dir" value="Z:\some\location"/>
+            <set name="threads" value="4"/> 
+            <set name="sync" value="true"/> 
+            <set name="use.reconfigure.template" value="false"/> 
+            <set name="release" value="${r'$'}{release.tag}" />
+            
+            <config name="ppd_sw-PPD51.32_200810:project:sa1spp#1" type="checkout" >
+               <set name="folders" value="jk1f5132#1820" />
+            </config>
+            
+            <config name="WLANSniffer2-2007_wk21:project:e002sa08#1" type="snapshot" />
+            
+            <config name="NSeries08_Themes-1:project:fa1f5132#1" type="checkout" >
+               <set name="tasks" value="jk1f5132#1763" />
+               <set name="skip.ci" value="true"/> 
+            </config>
+            
+            <config name="NSeries08_Themes-1:project:fa1f5133#2" type="checkout" >               
+               <set name="skip.ci" value="false"/> 
+               <set name="ci.custom.query" value="(release='MinibuildDomain/next')"/>
+            </config>
+            
+            <config name="S60-S60.32_200810:project:sa1spp#1" type="checkout" >
+               <set name="folders" value="jk1f5132#1983" />
+            </config>
+
+            <config name="ppd_sw-username:project:sa1spp#1" type="update"/>
+             
+            <config name="cellmo" abstract="true">
+                <set name="dir" value="${r'$'}{ccm.base.dir}\cellmo" />
+                <set name="threads" value="1" />
+            
+                <config name="cellmo_bins_rm235_PRODUCT-ncpp.ICPR71_08w24.2:project:tr1cmtsw#1" type="snapshot" />
+                <config name="cellmo_bins_rm236_PRODUCT_chn-ncpp.ICPR71_08w24.2:project:tr1cmtsw#1" type="snapshot" />
+                <config name="cellmo_bins_rm342_PRODUCT_lta-ncpp.ICPR71_08w24.2:project:tr1cmtsw#1" type="snapshot" />
+            </config>
+
+        </config>
+    <build>
+    
+    
+Checkout: only need to define this when extra tasks are required on top of the listed project, otherwise use the snapshot type.
+    The following properties are required:
+        - release : synergy release to use.
+        - dir     : the location of your target snapshot.
+        - database: the name of the synergy database you want to use.
+    The following properties are optional:
+        - thread  : optional parameter, this define the number of process to run for parallel snapshots.
+        - purpose : Purpose to check out with.
+        - sync : Force a sync step after the work area update.
+        - version : the version to check out toward to.
+        - tasks : add additional tasks to the reconfigure properties.
+        - folders : add additional folders to the reconfigure properties.
+        - use.reconfigure.template: enable the usage of the reconfigure templates, this means the project will just be reconfigured, the reconfigure properties will not be modified.
+        - fix.missing.baselines: automatically detect new projects and check them out.
+        - replace.subprojects: boolean value to enable/disable project replacement during update (default: true).
+        - skip.ci: boolean value to include/exclude the project from CC modificationset checking.
+        - ci.custom.query: Extend the synergy query for CC modificationset checking eg.(release='MinibuildDomain/next').
+        - show.conflicts: boolean value to check for task conflicts.
+        - show.conflicts.objects: boolean value to check for object conflicts.
+Snapshot: define type of the spec as snapshot and name as the baseline name.
+    The following properties are required:
+        - dir     : the location of your target snapshot.
+        - database: the name of the synergy database you want to use.
+    The following properties are optional:
+        - thread  : optional parameter, this define the number of process to run for parallel snapshots.
+
+Update: define type of the spec as update and name as the project to update.
+    The following properties are required:
+        - database: the name of the synergy database you want to use.
+
+To get synergy source you just have to run::
+
+  hlm prep-work-area
+
+.. index::
+  single: Stage - Compilation
+
+Stage: Compilation
+==================
+
+Compilation is based on configuration using Symbian System Definition XML files.
+See http://developer.symbian.org/wiki/index.php/System_Definition
+
+Every System Definition file can contain content for two separate sections:
+
+System model
+    A definition of the system describing the components that exist, broken into layers, modules, etc.
+    
+Build model
+    Build configurations that define what is to be built and how it will be built. Separate unitLists define groups of components.
+
+The steps to configure a Helium build for main compilation are as follows:
+
+1. Put together a list of the System Definition files that define the components needing to be built in the system model sections. This could be one or several files depending on what components need building. They should be defined in an Ant ``<path>`` type with an ``id`` atttribute set to ``system.definition.files``, e.g:
+
+.. code-block:: xml
+
+    <path id="system.definition.files">
+        <fileset dir="${r'$'}{build.drive}/src/common/generic/tools/build" includes="System_Definition*.xml"/>
+        <pathelement path="${r'$'}{build.drive}/mc/mc_build/ibusal_40_build/ibusal_40/IBUSAL40_System_Definition.xml"/>
+        <fileset dir="${r'$'}{build.drive}/s60/tools/build_platforms/build/data" includes="S60_System*.xml"/>
+        <pathelement path="${r'$'}{build.drive}/me/me_scd_desw/sysdef/System_Definition_PRODUCT.xml"/>
+        <pathelement path="${r'$'}{build.drive}/mc/mc_build/${r'$'}{product.family}_build/4032_System_Definition.xml"/>
+    </path>
+    
+  The order of the files is significant. If building Symbian OS, the Symbian System Definition file must come first. Here both ``fileset`` and ``pathelement`` are used. ``pathelement`` selects just one file whereas a ``fileset`` can use wildcards to select multiple files or handle problems of filenames changing across different platform releases.
+
+2. Determine if an existing build configuration in any of the build model sections of the files are suitable for what needs to be built. A build configuration typically looks something like this:
+
+.. code-block:: xml
+
+    <configuration name="foo_config" description="Build foo">
+         <unitListRef unitList="foo_list"/>
+        
+         <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+         <task><buildLayer command="abld export" unitParallel="Y"/></task>
+         <task><buildLayer command="abld makefile" targetList="default" unitParallel="Y" targetParallel="N"/></task>
+         <task><buildLayer command="abld resource" targetList="default" unitParallel="N" targetParallel="N"/></task>
+         <task><buildLayer command="abld library" targetList="default" unitParallel="N" targetParallel="N"/></task>
+         <task><buildLayer command="abld target" targetList="default" unitParallel="Y" targetParallel="Y"/></task>
+         <task><buildLayer command="abld final" targetList="default" unitParallel="N" targetParallel="N"/></task>
+         <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+         <task><buildLayer command="abld -what target" targetList="default" unitParallel="Y" targetParallel="Y"/></task>
+         <task><buildLayer command="abld help" unitParallel="Y"/></task>
+         <task><buildLayer command="abld -check build" targetList="default" unitParallel="Y" targetParallel="Y"/></task>
+    </configuration>
+
+  A ``unitListRef`` includes a ``unitList`` defined somewhere else as part of this configuration. The ``buildLayer`` elements define ``abld`` steps to run on each component. If an existing configuration is not sufficient a new one must be defined in a separate file (which should be included in the ``path`` type).
+
+3. Define the ``sysdef.configurations`` Ant property to contain a comma-separated list of build configuration names that must match the ``name`` attribute of the ``configuration``. Each configuration will be built in turn in the ``compile-main`` Ant target.
+
+Note: Build will fail if compilation error exceeds the number specified in ``build.errors.limit``. Default value is ``0`` and set it to ``-1`` to ignore this.
+
+.. index::
+  triple: Builds; EBS; EC
+
+EBS and EC compilation
+----------------------
+
+If you want to get Helium to switch compiler version you need to define the HLM_RVCT_VERSION environment variable (Nokia specific feature)::
+
+    set HLM_RVCT_VERSION=22_593
+
+
+The setting could be mentioned under the configuration's Helium bootstrapper.
+
+
+By default Helium is configured to run EBS builds. The ``build.system`` property determines what build system to use. An EC build can be run from the command line using::
+
+    hlm <build target> -Dbuild.system=ec-helium
+
+
+EC build could be configured to be running in parallel (default) or in serial mode (1 node build)::
+
+    hlm <build target> -Dbuild.system=ec-helium -Dec.mode=serial
+
+Also the --emake-debug could be configured either by the environment using the EMAKE_DEBUG variable or using the ``emake_debug_flag`` property. Its default value is 'g'.
+
+
+SBS (Raptor) compilation
+------------------------
+
+.. toctree::
+   :maxdepth: 1
+
+   sbs
+
+
+.. index::
+  single: Stage - Post Build
+
+Stage: Post Build
+=================
+
+.. index::
+  single: SIS Files
+
+Sis Files
+---------
+SIS files can be built during the postbuild stage. The ``sis.config.file`` property defines the path to a :ref:`common-configuration-format-label` file, e.g.
+
+.. code-block:: xml
+
+    <build>
+        <config abstract="true">
+            <set name="makesis.tool" value="${r'$'}{build.drive}\epoc32\tools\makesis.exe"/>
+            <set name="signsis.tool" value="${r'$'}{build.drive}\epoc32\tools\signsis.exe"/>
+            <set name="build.sisfiles.dir" value="${r'$'}{build.sisfiles.dir}"/>
+            <set name="key" value="${r'$'}{build.drive}\s60\tools\taskmgr\internal\sis\RDTest_02.key"/>
+            <set name="cert" value="${r'$'}{build.drive}\s60\tools\taskmgr\internal\sis\RDTest_02.der"/>
+            <config>
+                <set name="name" value="ScreenGrabber_3"/>
+                <set name="path" value="${r'$'}{build.drive}\s60\tools\screengrabber\sis"/>
+            </config>
+            <config>
+                <set name="name" value="app_trk"/>
+                <set name="path" value="${r'$'}{build.drive}\s60\tools\trk\sis"/>
+            </config>
+        </config>
+    </build>
+
+The propertes are:
+
+.. csv-table:: Property descriptions
+   :header: "Property", "Description", "Values"
+
+   "``makesis.tool``", "The path for the makesis tool that builds a .sis file.", ""
+   "``signsis.tool``", "The path for the signsis tool that signs a .sis file to create a .sisx file.", ""
+   "``publish.unsigned``", "This will copy .sis files into ${r'$'}{build.output.dir}/sisfiles.", "true, false"
+   "``build.sisfiles.dir``", "The directory where the .sis file should be put.", ""
+   "``key``", "The key to use for signing.", ""
+   "``cert``", "The certificate to use for signing.", ""
+   "``name``", "The name of the .pkg file to parse.", ""
+   "``sis.name``", "The name of the .sis file to create. If omitted it will default to the name of the .pkg file.", ""
+   "``path``", "The path where the .pkg file exists as input to building the .sis file.", ""
+
+Checking Stub SIS files
+-----------------------
+This step involves checking stub sis files published to ``z:/epoc32/data/z/system/install`` and it ensures that only valid stub sis files are published.The target is included in postbuild and using ParseStubSis.pl script to do the work, it will run automatically and save the output in stubresult.log.xml. It can also be run from the command line by using::
+
+    hlm check-stub-sis
+    
+It checks all files in the target folder and renames the invalid sis files with .bak extention. 
+
+.. index::
+  single: S60 3.2 Localisation
+
+Stage: S60 3.2 Localisation
+===========================
+
+.. csv-table:: Ant property descriptions
+   :header: "Property", "Description", "Default Values"
+
+   "``localisation.language.file``", "This defines where to find the languages.xml database.", "/epoc32/tools/s60tools/languages.xml"
+   "``rombuild.config.file``", "This key defines  where this parsed file will be located.", ""
+   "``localisation.files``", "This key  defines which files should be used to localise the build.", "-i ${r'$'}{build.drive}/epoc32/tools/s60tools/LocInfo_input_S60.txt"
+   "``localisation.tool``", "This key defines which tool should be used to localise the build area (localise-resources or localisation-s60-localiser).", "localise-resources"
+
+The process uses the information from the languages.xml to know what languages have to be localised. In order to have language pack configured correctly you also have to configure them (as explained in the next section).
+
+.. index::
+  single: Creation of core, language pack and customer variant images
+
+Creation of core, language pack and customer variant images
+-----------------------------------------------------------
+
+Core, language pack and customer variant images are created automatically in product-build. 
+They can also be created separately calling localisation target::
+
+  hlm -Dbuild.number=xx localisation
+
+
+Stage: ROM creation
+===================
+
+Called by ``build-roms`` target.
+
+.. index::
+   single: imakerconfigurationset type
+
+The imakerconfigurationset type
+-------------------------------
+
+Information on how to configure the properties is given below:
+
+The imakerconfigurationset supports imakerconfiguration nested elements.
+
+'''imakerconfiguration''' element:
+
+.. csv-table:: Ant properties to modify
+   :header: "Attribute", "Description", "Values"
+
+   "``regionalVariation``", "Enable regional variation switching.", "false"
+
+The imakerconfiguration supports three sub-types:
+
+.. csv-table:: Ant properties to modify
+   :header: "Sub-type", "Description"
+
+   "``makefileset``", "Defines the list of iMaker configuration to run image creation on."
+   "``targetset``", "List of regular expression used to match which target need to be executed."
+   "``variableset``", "List of variable to set when executing iMaker."
+
+
+Example of configuration:
+
+.. code-block:: xml
+     
+    <hlm:imakerconfigurationset>
+        <imakerconfiguration regionalVariation="true">
+            <makefileset>
+                <include name="**/devlon52/*ui.mk"/>
+            </makefileset>
+            <targetset>
+                <include name="^core${r'$'}" />
+                <include name="langpack_\d+" />
+                <include name="^custvariant_.*${r'$'}" />
+                <include name="^udaerase${r'$'}" />
+            </targetset>
+            <variableset>
+                <variable name="TYPE" value="rnd"/>
+                <variable name="USE_FOTI" value="0"/>
+                <variable name="USE_FOTA" value="1"/>
+            </variableset>
+        </imakerconfiguration>
+    </hlm:imakerconfigurationset>
+
+.. index::
+   single: The iMaker Task
+
+The imaker task
+---------------
+
+.. csv-table:: Ant properties to modify
+   :header: "Attribute", "Description", "Values"
+
+   "``executor``", "Name of the build system to be used.", "ebs, helium-ec and ec"
+   "``name``", "Log and intermediate file differentiator.", ""
+   "``signal``", "Enable/disable signaling mechanism.", "true, false"
+
+Example:
+
+.. code-block:: xml
+
+    <hlm:imaker executor="${r'$'}{build.system}" name="build">
+        <hlm:imakerconfigurationset>
+            <imakerconfiguration regionalVariation="true">
+                <makefileset>
+                   <include name="**/devlon52/*ui.mk"/>
+                </makefileset>
+                <targetset>
+                   <include name="core"/>
+                   <include name="langpack_\d+"/>
+                   <exclude name="cus.*"/>
+                </targetset>
+                <variableset>
+                    <variable name="TYPE" value="rnd"/>
+                </variableset>
+            </imakerconfiguration>
+        </hlm:imakerconfigurationset>
+    </hlm:imaker>
+
+
+.. index::
+  single: Legacy ROM creation
+
+.. _ROM-creation-label:
+
+Stage: Legacy ROM creation
+==========================
+
+A S60 3.2 build uses the localisation target which calls localisation-roms. A S60 5.0 build only requires the localisation-roms target since localisation is done differently.
+
+There are 2 targets used to create the ROM images these are 'ee-roms' and 'localisation-roms'. The 'ee-roms' target
+builds an Engineering English version and the 'localisation-roms' target builds all the localised ROM images. Both require
+some configuration particularly the 'localisation-roms' target so that it knows which variants to build etc. This configuration
+is explained below but 1st here is an example of how to create the EE ROM image using Helium::
+
+  hlm -Dbuild.number=xx ee-roms
+  
+where xx is the build number.
+
+To see an example of how to build the localised versions click :ref:`localised example <localisation-label>`:
+
+.. index::
+  single: ROM Image configuration
+
+Legacy ROM Image configuration
+------------------------------
+
+Engineering English ROMs, including debug/trace images, can be configured per build configuration. The path to the configuration file is defined by the ``rombuild.config.file`` property. The :ref:`common-configuration-format-label` is used, e.g.
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <build>
+        <config name="PRODUCT" abstract="true">
+            <set name="rommake.cmt.path" value="${r'$'}{build.drive}\epoc32\rombuild"/>
+            ....
+            <!-- GUI images -->
+            <set name="rommake.args" value="-rebldxld -es60ibymacros -DS60_IN_ROM"/>
+            
+            <config name="ee_roms">
+                <config name="flash">
+                    <set name="image.type" value="rnd"/>
+                </config>
+            </config>
+        </config>
+    </build>
+
+The properties that can be set for configuring each ROM image are described below:
+
+.. csv-table:: Property descriptions
+   :header: "Property", "Description", "Values"
+
+   "``output.makefile.template``", "This defines the name of the output makefile (MUST NOT contain path info).", "${r'$'}{rombuild.makefile.name}"
+   "``main.makefile.template``", "This defines the location of the main part of the makefile (template).", "${r'$'}{mc_5132_build.dir}/imaker.mk"
+   "``flash.makefile.template``", "This defines template location for flash makefile targets (ee roms).", "${r'$'}{mc_5132_build.dir}/flash.mk"
+   "``mytraces.file``", "The path for the mytraces.txt file that contains the list of debug binaries to include. (Template)", ""
+   "``version.product.name``", "The name of the product that appears in the version string.", "e.g. N91"
+   "``version.pd.milestone``", "The current PD milestone.", ""
+   "``version.pr``", "The current PR branch number.", ""
+   "``version.bandvariant``", "The band variant.", ""
+   "``version.buildnumber``", "The build number. This should be set to the Ant property.", "${r'$'}{build.number} (default)"
+   "``version.variant``", "The variant version number.", ""
+   "``version.product.type``", "The product type shown in the version string.", "e.g. RM43"
+   "``version.rimcycle``", "The year and week of the current RIM cycle.", ""
+   "``rom.id``", "An identifier for the ROM image filenames. Currently based on Ant ``build.id`` property.", ""
+   "``rommake.hwid``", "The hardware ID provided to the ROM build tool.", ""
+   "``rommake.product.name``", "The product name provided to the ROM build tool.", "e.g. devlon4"
+   "``rom.output.dir``", "The directory where the ROM image files will be copied.", ""
+   "``cmt``", "The CMT to use (if included).", ""
+   "``image.ui``", "The UI type.", "gui, text"
+   "``image.iby``", "The path for the top-level .iby file", ".iby path"
+   "``image.nocmt``", "Whether the image should include a CMT or not", "true, false (default)"
+   "``image.name.extension``", "A text extension added to the image filename.", "Optional"
+   "``version.copyright``", "Copyright text used in the version string.", ""
+   "``core.template``", "The template for the core version string format.", ""
+   "``variant.template``", "The template for the variant version string format.", ""
+   "``uda.template``", "The template for the UDA version string format.", ""
+   "``model.template``", "The template for the model version string format.", ""
+   "``core.txt.path``", "Path to the sw.txt version file.", ""
+   "``variant.txt.path``", "Path to the langsw.txt version file.", ""
+   "``model.txt.path``", "Path to the model.txt version file.", ""
+   "``uda.txt.path``", "Path to the UDA version file.", ""
+   "``mytraces.binaries``", "A list of binaries that should be ``UDEB``. The list will be included in ``mytraces.txt``. Either comma-separated items can be used or multiple properties defined.", ""
+   "``build.parallel``", "Defines if a group is buildable in parallel.", "true/false"
+
+
+Ant properties can be used and they will be replaced by their values before the file is processed.
+
+All abstract ``<config>`` element will be considered as makefile group target. You have to ensure that you defined an ee_roms abstract spec to be able to build EE roms.
+
+This example configuration will build one rom during ee_roms call that will use flash template:
+
+.. code-block:: xml
+    
+   <config name="ee_roms" abstract="true">
+       <config name="flash">
+            <set name="flash.id" value="ui_rom" />
+       </config>
+   </config>
+
+Mandatory keys:
+    "``flash.id``" defines a uniq id for the rom creation, used to define makefile template.
+
+
+.. index::
+  single: Main makefile template
+
+Main makefile template
+----------------------
+
+The ROM image creation tools use a makefile template to generate a target for each image. The main.makefile.template is used as the top-level part of the makefile, you can define any common custom steps in there. The template allows us to easily add any custom dependencies before creating the variant (also post steps could be added). The current version of the main makefile template should look like that, dont't forget it is tied to the product family.
+
+.. index::
+  single: Xinclude
+  
+.. _`Xinclude-label`:
+
+Xinclude
+---------
+
+Xinclude is a generic tool to include lists of files in tasks. However, Xinclude for ROM creation is deprecated, so please ensure you are using iMaker for all ROM image creation. Click on :ref:`iMaker-label` for details.  
+
+
+.. _localisation-label:
+  
+Legacy Customer variant configuration 
+:::::::::::::::::::::::::::::::::::::
+To create a new customer variant, just add a spec of the type customer: e.g:
+
+.. code-block:: xml
+
+  <config type="customer">
+      <set name="customer.id" value="100"/>
+      <set name="customer.revision" value="2"/>
+      <set name="description" value=""/>
+      <set name="compatible.languagepack" value="01,03"/>
+  </config>
+
+
+This specification must be added in the specification of the appropriate region (western, china, japan or thai).
+
+For each customer specification, helium creates 
+  * the customer variant image 
+  * the flash configuration file (during publishing.).
+
+If compatible.languagepack property is omitted, the system assumes the customer variant is compatible with all language packs. A flash configuration file is created for each language pack.
+
+In case a variant created with a previous build is re-used with the current build, an extra property must be declared: e.g:
+
+.. code-block:: xml
+
+  <config type="customer">
+      <set name="customer.image.version.name" value="10.30"/>
+      <set name="customer.id" value="101"/>
+      <set name="description" value="OPERATOR_UK"/>
+      <set name="compatible.languagepack" value="01"/>
+  </config>
+
+
+customer.image.version.name is the build ID with which the re-used variant was created.
+
+
+.. index::
+  single: Trace image creation
+
+Trace image creation
+--------------------
+Initial support for recompiling and creating rom images is provided by the build-traces target. This feature will be refactored and revised, so the details will still change.
+
+.. csv-table:: Ant property descriptions
+   :header: "Property", "Description", "Values"
+
+   "``tracebuild.tracetype``", "This defines the type of traces to create", "general, phone or all"
+   "``tracebuild.product``", "This defines the product for which to create images.", ""
+   "``tracebuild.variant``", "This defines the imaker target to use in image creation", ""
+
+
+.. index::
+  single: Stage - Publishing
+
+Stage: Publishing
+=================
+
+.. index::
+  single: Uploading to Diamonds
+
+Uploading build information to Diamonds web application
+-------------------------------------------------------
+
+Diamonds is a utility tool that keeps track of build and release information. See the **Metrics** manual under section `Helium Configuration`_ for more info.
+
+.. _Helium Configuration: ../metrics.html#helium-configuration
+
+
+.. index::
+  single: Zipping Build area
+
+Zipping of the build area
+-------------------------
+
+The Engineering English build area is archived in the ``zip-ee`` target. Zipping of the localised build area is done by ``zip-localisation`` target. These properties need to be set:
+
+``zip.config.file``
+    Location of the config file.
+    
+``zips.ee.spec.name``
+    Spec name for ee zipping (e.g. "ee").
+    
+``zips.localised.spec.name``
+    Spec name for localised build area zipping (e.g. "localised").
+
+The ``zip.config.file`` property defines the path to a :ref:`common-configuration-format-label` file that defines the content of the zips created. It can consist of multiple configs, e.g.
+
+.. code-block:: xml
+
+    <build>
+        <config name="ee" abstract="true">
+            <set name="max.uncompressed.size" value="2000000000"/>
+            <set name="max.files.per.archive" value="65000"/>
+            <set name="archive.tool" value="7za"/>
+            <set name="root.dir" value="${r'$'}{build.drive}\"/>
+            <set name="archives.dir" value="${r'$'}{build.output.dir}\build_area\engineering_english_test"/>
+            <set name="temp.build.dir" value="${r'$'}{temp.build.dir}"/>
+            <config>
+                <set name="name" value="${r'$'}{build.id}_dev_flashfiles"/>
+                <set name="include" value="output\development_flash_images\"/>
+                </config>
+                <config>
+                    <set name="name" value="${r'$'}{build.id}_release_flashfiles"/>
+                    <set name="include" value="output\release_flash_images\"/>
+                </config>
+            </config>
+            <config name="localised" abstract="true">
+                <set name="max.uncompressed.size" value="2000000000"/> 
+                <set name="max.files.per.archive" value="65000"/>    
+                <set name="archive.tool" value="7za"/>
+                <set name="root.dir" value="${r'$'}{build.drive}\"/>
+        
+                <set name="archives.dir" value="${r'$'}{build.output.dir}\build_area\localised"/>
+                <set name="temp.build.dir" value="${r'$'}{temp.build.dir}"/>
+    
+                <config>
+                    <set name="name" value="${r'$'}{build.id}_dev_flashfiles_ee"/>
+                    <set name="include" value="output\development_flash_images\engineering_english\"/>
+                </config>
+                
+                <config>
+                    <set name="name" value="${r'$'}{build.id}_dev_flashfiles_localised"/>
+                    <set name="include" value="output\development_flash_images\localised\"/>
+                </config>
+            </config>
+        </config>
+      
+        <config name="policy">
+            <config>
+                <set name="name" value="${r'$'}{build.id}_dev_flashfiles"/>
+                <set name="include" value="output\development_flash_images\"/>
+                <set name="mapper" value="policy"/>
+                <set name="policy.internal.name" value="really_confidential_stuff"/>
+                <set name="policy.filenames" value="Distribution.Policy.S60"/>
+            </config>
+        </config>
+
+        <config name="policy.remover">
+            <config>
+                <set name="name" value="${r'$'}{build.id}_s60_osext"/>
+                <set name="include" value="s60\osext\"/>
+                <set name="mapper" value="policy.remover"/>
+                <set name="policy.internal.name" value="really_confidential_stuff"/>
+                <set name="policy.filenames" value="Distribution.Policy.S60"/>
+                <set name="policy.root.dir" value="${r'$'}{root.dir}/s60"/>
+            </config>
+        </config>
+      
+        <config name="scanner">
+            <config>
+                <set name="name" value="${r'$'}{build.id}_dev_flashfiles"/>
+                <set name="scanners" value="abld.what"/>
+                <set name="abld.buildpath" value="path/to/component/group"/>
+                <set name="exclude" value="**/*.dll"/>
+                <set name="exclude.lst" value="${r'$'}{build.drive}/exclude.lst"/>
+            </config>
+        </config>
+
+    </build>
+
+
+
+.. csv-table:: Common property descriptions
+   :header: "Property", "Description", "Values"   
+
+   "``temp.build.dir``", "Directory to store temporary files generated during the process.", ""
+   "``name``", "The name of the zip file.", ""
+
+
+.. csv-table:: File System scanner property descriptions (default)
+   :header: "Property", "Description", "Values"
+
+   "``include``", "Path to include files/directories in the zip. Follows the Ant fileset convention.", ""
+   "``exclude``", "Path to exclude files/directories in the zip. Follows the Ant fileset convention.", ""
+   "``exclude.lst``", "Location of a file containing an exclude list(one pattern per line).", ""
+   "``distribution.policy.s60``", "Defines that the included files will be filtered based on the value of the ``Distribution.Policy.S60`` files. The file found closest to the root will override those in subdirectories.", "The value found in the file, e.g. 0 or 1. This can be negated by putting a '!' in front."
+
+
+.. csv-table:: Abld what scanner property descriptions (abld.what)
+   :header: "Property", "Description", "Values"
+
+   "``exclude``", "Path to exclude files/directories in the zip. Follows the Ant fileset convention.", ""
+   "``exclude.lst``", "Location of a file containing an exclude list(one pattern per line).", ""
+   "``abld.buildpath``", "The path to an bld.inf directory. The files built from this component will be included.", ""
+   "``abld.type``", "For what platform should abld be run for.", "armv5"
+   "``abld.epocroot``", "To specify an EPOCROOT other than \\.", ""
+
+
+.. csv-table:: Default Mappers property description (default)
+   :header: "Property", "Description", "Values"
+
+   "``name``", "The name of the zip file.", ""
+   "``max.uncompressed.size``", "Maximum size in bytes of the content being included in each zip file. If the included content exceeds this, multiple zips will be created.", ""
+   "``max.files.per.archive``", "Maximum number of files that can be included in an archive. If the total exceeds this, multiple zips will be created.", ""
+   "``archive.tool``", "The command-line archiving tool. 7zip and zip are supported.", "7za, zip"
+   "``root.dir``", "The root directory of the content being zipped.", ""
+   "``archives.dir``", "The directory where the zip files are saved to.", ""
+   "``zip.root.dir``", "The root directory for the content inside the zip file.", "root.dir value"
+
+
+.. csv-table:: Policy Mappers property description (policy)
+   :header: "Property", "Description", "Values"
+
+   "``name``", "The name of the zip file.", ""
+   "``policy.internal.name``", "Suffix of the archive that contains the confidential content.", "internal"
+   "``policy.filenames``", "Comma separated list of policy filename.", "Distribution.Policy.S60"
+   "``archive.tool``", "The command-line archiving tool. 7zip and zip are supported.", "7za, zip"
+   "``archives.dir``", "The directory where the zip files are saved to.", ""
+   "``policy.csv``", "This property defines the location of the policy definition file.", ""
+   "``policy.default.value``", "This property defines the policy value when policy file is missing or invalid (e.g. wrong format).", "9999"
+
+The policy mapper enables the sorting of the content compare to its policy value. The mapper is looking for a policy file in the file to archive directory.
+If the distribution policy file is missing then the file will go to the ``policy.default.value`` archive. Else it tries to open the file which
+MUST be ASCII encoded, and have its content matching the following expression: ``^\\d+\\s*$``.
+File not matching those specifications will be reported as invalid and the assiociated content will go to the ``policy.default.value`` archive.
+
+Archive filenames are generated the following way:
+
+Policy value is 0::
+   
+   ${r'$'}{archive.dir}/${r'$'}{name}.zip
+
+Policy value is different from 0::
+   
+   ${r'$'}{archive.dir}/${r'$'}{name}_${r'$'}{policy.internal.name}_<policy_value>.zip
+
+If the policy file is missing or its content is invalid ot the olicy value is not found in the ``${r'$'}{policy.csv}``::
+   
+   ${r'$'}{archive.dir}/${r'$'}{name}_${r'$'}{policy.internal.name}_${r'$'}{policy.default.value}.zip
+
+
+.. csv-table:: Policy Remover Mappers property description (policy)
+   :header: "Property", "Description", "Values"
+
+   "``name``", "The name of the zip file.", ""
+   "``policy.internal.name``", "Suffix of the archive that contains the confidential content.", "internal"
+   "``policy.filenames``", "Comma separated list of policy filename.", "Distribution.Policy.S60"
+   "``archive.tool``", "The command-line archiving tool. 7zip and zip are supported.", "7za, zip"
+   "``archives.dir``", "The directory where the zip files are saved to.", ""
+   "``policy.root.dir``", "This property allows the user to restrict the root of policy scanning.", "root.dir value"
+   "``policy.default.value``", "This property defines the policy value when policy file is missing or invalid (e.g. wrong format).", "9999"
+
+The remover mapper in addition to policy mapper behaviour will remove the content not required for the build.
+The removal process is based on the policy.csv file information, content will be kept in the following cases:
+
+ * Included in build column is ``yes``    
+ * Included in build column is ``bin``    
+
+
+Two additionals removers have been introduced to support action from SFL and EPL column, you use the following
+named mappers to use them:
+
+ * sfl.policy.remover based on the 4th column of the csv
+ * epl.policy.remover based on the 5th column of the csv
+
+They support the same set of configuration properties as the default policy.remover.
+
+ 
+.. index::
+  single: Zipping SUBCON
+
+Subcon zipping
+--------------
+
+Subcon zipping is also configured using the same XML format as ``zip-ee`` and implemented in the ``zip-subcon`` target. A ``zips.subcon.spec.name`` property must be defined but currently it is still a separate configuration file.
+
+.. index::
+  single: Zipping .loc files
+
+Zipping .loc files
+------------------
+
+```zip-loc-files``` -target finds, sorts into language specific folders and archives all the .loc files from the build area. Usage::
+
+   hlm -Dbuild.number=XX zip-loc-files
+
+The following properties are needed (default values defined in helium.ant.xml):
+
+- loc.temp.dir - the temporary directory used by zip-loc-files
+- loc.output.dir - the directory where the output zip file is stored
+- loc.output.filename - the name of the output-file (xxx.zip)
+- loc.files.zipper - The location of the tool (should not be changed)
+  
+
+.. index::
+  single: Stage - Releasing
+
+Stage: Releasing
+================
+
+A published build can be made into a release by running the command::
+
+    hlm release
+
+from the root of the directory on the network where the build is located. This will create a matching release directory and copy the appropriate files there. The selected files are defined in ``release.ant.xml``.
+
+.. index::
+  single: Stage - Delta Releasing
+
+Stage: Delta releasing
+======================
+
+Introduction:
+
+A delta release is a zip file with only the changed and new files between two build areas. A xml file is also generated that contains the list of files removed between the two build areas. This xml file is read by SymDEC and deletes these files.
+
+Prequisities for automated use:
+
+- Publish is run after this stage
+
+Each build should run the 'delta-zip' target which creates a delta from a previous build to the current one. (This target looks at previous builds in the publish dir for the md5 file and chooses the most recent one).
+
+Optionally: A previous builds md5 can be passed as a argument, this might be the last bi-weekly release or used when builds are not published (The last build would have run the delta-zip target)::
+
+  hlm delta-zip -Dold.md5.file=e:\wk01_build\output\build_area\delta_zip\0.0742.3.X.15.md5 -Dold.md5.file.present=y
+  
+Exclude directories from the zip::
+
+  <property name="delta.exclude.commasep" value="epoc32_save.zip,output/**/*,delta_zips/**/*,temp/**/*"/>
+
+Uploading of this into Grace is similar to the grace-upload target::
+
+  hlm delta-zip-grace-upload
+
+Output::
+
+  Z:\output\build_area\delta_zip
+   + delta_zip.zip
+   + specialInstructions.xml
+   + release_metadata.xml
+
+
+.. index::
+  single: Stage - Release Notes
+
+Stage: Release Notes
+====================
+
+Introduction:
+
+This generates a release note by modifying a template (that you can edit yourself) with values from the build and Synergy.
+
+Usage::
+
+  hlm release-notes -Dbuild.number=1
+
+Define in your build configuration the path to the config of relnotes::
+
+  e.g. <property name="relnotes.config.dir" value="${r'$'}{helium.dir}/../mc_config/${r'$'}{product.family}_config/${r'$'}{build.name}/relnotes"/>
+
+The contents of "config_template" in helium/extensions/nokia/config/relnotes should be copied to the appropriate directory::
+
+  e.g. mc/mc_config/mc_5132_config/mc_5132/relnotes
+
+Contents of template:
+ * logo.png : the logo of your product
+ * template.rtf : the document that is modified to form the output
+ * relnotes_properties.ant.xml : the names of the tokens in template.rtf that will be replaced
+                  Many of the values are commented out as they change rapidly and will need to be added to the output RTF file manually.
+ * relnotes.properties : the values of the tokens
+                         New values can be added e.g. token1=1.0 and referenced in relnotes.xml by ${r'$'}{token1}
+                         If you want a link to a file start with .\\filename or .\\folder\\filename or \\\\share1\\file
+
+Project names can be looked up from the BOM and are set into properties, see ``config_template/relnotes/relnotes_properties.ant.xml`` for example
+
+If you want to add a new value to the output that is dynamic then you should:
+
+1) Open your template.rtf in Word and add some text that is unique eg. NewValueHere
+2) Open your template.rtf in a plain text editor such as UltraEdit and search for your value. You may find it is split over two lines or contains RTF markup language mixed into the value e.g. New\\pardValueHere
+   If this is the case reformat so you get the value all on one line and remove extra markup.
+3) Check your template still works in Word
+4) Add a new property to relnotes.properties or use existing properties from Helium or your build config files
+5) Add a new replace statement to relnotes_properties.ant.xml that references the property in step 4
+
+Output::
+
+  Z:\output\relnotes
+
+.. index::
+  single: Executing a build
+
+Executing a build
+====================
+
+This section explains how to execute a general build step-by-step.
+
+
+
+.. index::
+  single: Running build operations
+
+Running build operations
+------------------------
+
+Needed configuration
+::::::::::::::::::::
+
+TODO
+
+Setting the build number
+::::::::::::::::::::::::
+
+The ``build.number`` property is typically not defined in a configuration file, as it changes for every new build. It should be defined as a command line parameter::
+
+    -Dbuild.number=123
+
+A shortcut can also be used::    
+
+    -Dbn=123    
+
+.. index::
+  single: Setting the team property
+
+.. _Setting-Team_properties-label:
+
+Setting the team property
+:::::::::::::::::::::::::
+
+SET TEAM=<team-name> (this defines which team specific .xml file from /mc/mc_build/teams is used for build configuration).
+
+Also see :ref: `Team-Properties-label` for more information.
+
+.. index::
+  single: ANT properties
+
+ANT properties
+::::::::::::::
+
+build.configuration
+build.drive
+ec.cluster.manager
+major.version
+minor.version
+prep.root.dir
+product.name
+
+
+.. index::
+  single: Build Types
+
+Types of build
+::::::::::::::
+
+There are different types of builds that can be run depending on the required output.
+
+.. index::
+  single: Build Main
+
+build-main
+::::::::::
+
+Before this phase it is needed to run the prebuild command (hlm prebuild -Dbuild.number=123) which creates necessary folders to the build area.
+
+Build-main phase is used to compile the components defined in the build.configuration property which refers to defined configuration in System_Definition.xml file(s) (ANT property system.definition.files in /mc/mc_build/PLATFORM/PLATFORM_build.ant.xml). The command to run is: hlm build-main -Dbuild.number=123
+
+
+.. index::
+  single: Product-Build
+
+product-build
+:::::::::::::
+
+A product build executes the typical stages for building product software and ROM images. Generally this involves building all the software completely from scratch. It can be run using the command:
+  hlm product-build -Dbuild.number=123
+
+This can be run from a product build configuration directory, e.g. <tt>/mc/mc_build/mc_4031_build/cogsworth</tt>.
+
+Product-build command combines all needed subcommands for doing a build. The subcommands run in product-build are:
+prep -> Prepares the build area (see prep instructions above)
+build-generic -> Runs prebuild, build-main, postbuild, flashfiles, java-certification-rom, zip-main and publish-generic commands.
+build-variants -> Runs notify-errors, mobilecrash-prep, zip-flashfiles, zip-localization and publish-variants commands.
+final -> Notifies of errors and creates log files.
+
+.. index::
+  single: platform build
+
+platform-build
+::::::::::::::
+
+A platform build executes the typical stages for building a platform deliverable. This is more limited than a product build, as some of the stages are unnecessary, e.g. building variant ROM images.
+
+The commands executed are:
+prep -> Prepares the build area
+build-main -> Compiles the components defined in the build.configuration
+flashfiles -> Creates flashfiles
+zip-main -> Zips the build area
+
+.. index::
+  single: Incremental Build
+
+Incremental build
+:::::::::::::::::
+
+An incremental build will use a previous completed product build as a starting point (probably unzipping it during preparation) and will clean and rebuild a handful of components. This is useful for testing platform component releases and off-cycle integration operations. An incremental build can be run using the command::
+
+  hlm incremental-build
+
+.. Note::
+
+  Incremental builds are not currently supported.
+
+
+Cenrep creation (S60 3.2.3 - 5.x)
+:::::::::::::::::::::::::::::::::
+<#if !(ant?keys?seq_contains("sf"))>
+See: http://s60wiki.nokia.com/S60Wiki/Central_Repository_Usage
+</#if>
+
+The target ``configtool`` can be used to run the Configuration Tool.
+
+Currently supported Configuration Tool arguments are:
+
+command_line | name
+
+-master_conf    :   master_conf
+-confml         :   confml
+-impl           :   impl
+-iby            :   iby
+-ignore_errors  :   keepgoing(true - uses -ignore_errors, otherwise not, setting 
+                    true generates cenrep incase of errors, and signals has to be configured to stop the build
+                    in case of errors).
+
+Default values are:
+
+.. code-block:: xml
+
+    <hlm:argSet id="cnftool.refid">
+        <hlm:arg name="path" value="${r'$'}{build.drive}/s60/tools/toolsextensions/configurationtool" />
+        <hlm:arg name="master_conf" value="s60.confml" />
+        <hlm:arg name="confml" value="\epoc32\rom\config\confml_data\s60" />
+        <hlm:arg name="impl" value="\epoc32\rom\config\confml_data\s60" />
+        <hlm:arg name="iby" value="\epoc32\rom\include\" />
+        <hlm:arg name="keepgoing" value="false" />
+    </hlm:argSet>
+
+
+Running individual build commands
+---------------------------------
+
+Individual build stages can be run from command line with a command "hlm _COMMAND_ -Dbuild.number=123". Each of the commands defined in this guide can be run individually. The functionality of a certain command can be looked up by searching '<target name="COMMAND"' from files in mc directory.
+
+
+.. index::
+  single: Build Types
+
+Customising the build
+---------------------
+
+TODO
+
+Customising the build sequence
+::::::::::::::::::::::::::::::
+
+TODO
+
+Overriding properties
+:::::::::::::::::::::
+
+TODO
+    
+
+.. index::
+  single: Integration Help
+
+Integration Help
+================
+
+This section provides information about the various integration help programs included into Helium framework. The tools described in this section should help the build manager in his pre-build work (e.g. merge detection,...).
+
+.. index::
+  single: Cleaning the build machines
+
+Cleaning the build machines
+---------------------------
+
+After several builds have been run it is necessary to clean the build machine of old work areas. Deleting several work areas run under the same username can be done using the ``clean-pc`` command, which displays a dialog showing the build area directories. Select the checkboxes of those to be deleted.
+
+
+.. index::
+  single: Advanced Usage
+
+Advanced Usage
+=================
+
+
+.. index::
+  single: UDA (using iMaker)
+
+UDA (using iMaker)
+------------------
+
+UDA creation using iMaker follows the same process, it uses a template that requires the following keys to be defined.
+
+"``uda.id``" this key defines uniquely the uda.
+"``content.dir``" defines the location of UDA content.
+
+This is a simple example of uda spec:
+
+::
+
+    <config name="uda">
+      <set name="uda.id" value="myuda" />
+      <set name="content.dir" value="${r'$'}{build.drive}/uda1/" />
+    </config>
+
+To build the uda you have to run the following Ant target: (use uda.makefile.target to specify which rom you want to build)
+  hlm uda-roms -Dteam=kawa -Dbuild.number=xx
+
+
+.. index::
+  single: Core and Variant images creation
+
+Core and Variant images creation
+--------------------------------
+
+Core and variant images are created automatically in product-build. They can also be created separately calling do-localisation target::
+
+  hlm localisation-roms -Dteam=kawa -Dbuild.number=xx
+
+Variation (S60 3.2.3 - 5.x)
+---------------------------
+
+See ../tutorials/imaker/iMakerUseCaseCustomerVariantConfml.html
+
+Variation (S60 3.2)
+-------------------
+
+In the new process the variation handling deviate from regular Nokia variation rule as the backup/export/restore process from Creator.pl has been dropped. Now each variant is self contained, which means the content must be reference from the variation folder! On the same way  language pack configuration is automated, which means that branching files like ``languages.txt``, ``lang.txt``... is strictly forbiden.
+
+Structure and Naming
+::::::::::::::::::::
+
+The variation folder naming must match that rule ``.+_${r'$'}{variant.id}``.
+
+Finally your variation folder must have the following structure::
+
+    + variation
+        + euro1_01
+            + data
+                + VariantData_01.xml
+        + euro2_02
+            + data
+                + VariantData_02.xml
+        + japan_15
+            + data
+                + VariantData_15.xml
+        + ...
+
+
+Cenrep variation
+::::::::::::::::
+
+
+Developer has to create a VariantData_${r'$'}{variant.id}.xml file for each variant that references product one (SPP/PRODUCT process).
+
+Example of an dummy PRODUCT variant configuration:
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <Variant xmlns:xi="http://www.w3.org/2001/xinclude">
+        <xi:include href="file:\\\%EPOCROOT%\spp_config\s60_32_config\PLATFORM_config\PLATFORM_PRODUCT_config\config\data\CenrepVar_PRODUCT\data\VariantData_PRODUCT.xml"/>
+    </Variant>
+
+
+To rebuild cenrep configuration using Customisation Tool for all variants you can use the following command:
+    hlm -Dbuild.number=xx localisation-create-cenrep
+
+Note: for Xinclude information see :ref:`Xinclude-label`:
+
+.. index::
+  single: iMaker image creation template
+
+iMaker image creation template
+------------------------------
+
+::
+
+   ###############################################################################
+   # iMaker templates
+   ###############################################################################
+   
+   # defining helium in the build area if not set by the environment
+   HELIUM_HOME?=\mc\helium
+   PYTHONPATH?=$(HELIUM_HOME)\install\python\lib\python2.4\win32;$(HELIUM_HOME)\tools\common\python\lib
+   
+   # using winimage from helium delivery.
+   WINIMAGE_TOOL=$(HELIUM_HOME)/tools/localisation/exports/winimage.exe
+   
+   CALL_IMAKER_PLATFORM=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f $(E32ROMCFG)/helium_features.mk
+   CALL_IMAKER=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) $(if $(UI_PLATFORM),-u$(UI_PLATFORM)) -f $(E32ROMCFG)/helium_features.mk
+   CALL_TARGET=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f $(E32ROMCFG)/$(COREPLAT_NAME)/$(PRODUCT_NAME)/mc_imaker.mk
+   
+   transfer_option=$(foreach option,$1,$(if $($(option)),"$(option)=$($(option))",))
+   
+   #
+   # Variation handling
+   #
+   unzip_%:
+       @echo Unzipping variation $*...
+       -@unzip -o -qq -d $(subst \,/,$(EPOCROOT)) /output/build_area/localised/delta_$*_package.zip
+   
+   
+   include helium_features.mk
+   ###############################################################################   
+
+
+.. index::
+  single: Flash makefile template
+
+Flash makefile template
+-----------------------
+
+This is the currently used template for flash rom type.
+
+::
+
+   ###############################################################################
+   # Flash template
+   ###############################################################################
+   
+   flash${r'$'}{flash.id}${r'$'}{image.type}: TYPE=${r'$'}{image.type}
+   flash${r'$'}{flash.id}${r'$'}{image.type}: NAME=${r'$'}{build.id}_$(TYPE)$(if ${r'$'}{flash.id},_${r'$'}{flash.id},)
+   flash${r'$'}{flash.id}${r'$'}{image.type}: WORKDIR=${r'$'}{rom.output.dir}/${r'$'}{rommake.product.name}/${r'$'}{image.type}
+   flash${r'$'}{flash.id}${r'$'}{image.type}: OBYPARSE_UDEBFILE=${r'$'}{mytraces.file}
+   flash${r'$'}{flash.id}${r'$'}{image.type}: FEAT_UDEBFILE=$(if "${r'$'}{mytraces.binaries}",1,0)
+   flash${r'$'}{flash.id}${r'$'}{image.type}: BLDROM_OPTVAR=${r'$'}{rommake.flags}
+   flash${r'$'}{flash.id}${r'$'}{image.type}: HWID=${r'$'}{rommake.hwid}
+   flash${r'$'}{flash.id}${r'$'}{image.type}: OPTION_LIST=TYPE NAME WORKDIR OBYPARSE_UDEBFILE CORE_UDEBFILE BLDROM_OPTVAR HWID
+   flash${r'$'}{flash.id}${r'$'}{image.type}: unzip_western
+      -@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash
+      -@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash
+    
+The target is using target specific variable to override the default iMaker values. The script also makes sure that the current environment is western, so do not need anymore to switch between environments. You can customize your target as needed, e.g. call custom scripts...
+
+.. Note::
+        Don't forget that all template are parsed and concatenated, which means a modification in the main one could affect any target one.
+
+.. index::
+  single: Create a customize makefile target
+
+How to create a customize makefile target
+-----------------------------------------
+
+In order to create a custom makefile target for rom image creation you have to first create the makefile template: You will call your target test for example. In that case you have to create a test.mk file that should define your target. E.g
+
+::
+   
+   ###############################################################################
+   # Test template
+   ###############################################################################
+   
+   flash_${r'$'}{target.name}_${r'$'}{image.type}: TYPE=${r'$'}{image.type}
+   flash_${r'$'}{target.name}_${r'$'}{image.type}: OPTION_LIST=TYPE
+      -@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash
+      -@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash
+
+Then you have to declare it into your configuration file, just add the following line to your main configuration:
+::
+   
+   <set name="test.makefile.template" />
+
+Then to create a ROM according to that template just add a specification to the configuration file::
+   
+   <config name="test">
+       <set name="image.type" value="rnd,prd" />
+       <set name="target.name" value="ui_rom" />
+   </config>
+ 
+This will create two targets in the generated makefiles: test_ui_rom_rnd and test_ui_rom_prd.
+
+.. index::
+  single: Language pack configuration
+
+Language pack configuration
+---------------------------
+
+Please read the ``ROM Image configuration (using iMaker)`` part first to have a better understanding of this part.
+
+.. index::
+  single: Main Language configuration
+
+Main configuration
+------------------
+
+These keys must be defined in order to enbable localisation/variation process.
+
+.. csv-table:: Configuration property descriptions
+   :header: "Property", "Description", "Values"
+
+   "``zips.loc.dir``", "The directory where to find variation delta packages.", "${r'$'}{zips.loc.dir}"
+   "``languages.xml.location``", "This defines where to find the languages.xml database.", "${r'$'}{localisation.language.file}"
+   "``variation.dir``", "This defines the path where variation for a product is located.", "${r'$'}{mc_5132_config.dir}\${r'$'}{product.name}\variation"
+   "``rombuild.config.file``", "That key defines where this parsed file will be located.", "${r'$'}{rombuild.config.file.parsed}"
+   "``core.makefile.template``", "This defines what template to use for core creation.", "${r'$'}{mc_5132_build.dir}/core.mk"
+   "``languagepack.makefile.template``", "This defines what template to use for core creation.", "${r'$'}{mc_5132_build.dir}/languagepack.mk"
+   "``operator.makefile.template``", "This defines what template to use for core creation.", "${r'$'}{mc_5132_build.dir}/operator.mk"
+
+Other keys could be defined accordingly to the template you are using.
+
+
+.. index::
+  single: Language pack configuration
+
+Legacy Language pack configuration
+----------------------------------
+
+Language pack could be defined into the rom image configuration, the name of the template is "``languagepack``" (this is used to render the correct makefile template).
+Example of configuration:
+
+.. code-block:: xml
+   
+   <config name="languagepack">
+       <set name="languagepack.id" value="01" />
+       <set name="description" value="01" />
+          <set name="default" value="01" />
+       <set name="languages" value="01,02,03" />
+       <set name="variation" value="western" />
+   </config>
+
+The following fields are mandatories to define a correct language pack:
+"``variant.id``" defines the variant id from the variant chart.
+"``description``" defines variant content (must not contains space).
+"``default``" default language id.
+"``languages``" comma separated list of languages to be included.
+"``variation``" defines which variation to use (western, china, japan) You can define western variation at top level and override it on target.
+
+
+.. index::
+  single: Customer Variant configuration
+
+Legacy Customer variant configuration
+-------------------------------------
+
+Customer variant could be define the same way.
+Example:
+
+.. code-block:: xml
+   
+   <config name="customer_variants" abstract="true">
+   ...
+
+      <set name="variation.dir" value="\path\to\customer\variants" />
+      <config name="customer">
+          <set name="customer.id" value="20" />
+          <set name="description" value="OPERATOR" />
+      </config>
+      <config name="customer">
+          <set name="customer.id" value="10" />
+          <set name="description" value="orange" />
+          ...
+      </config>
+        <config name="customer">
+              <set name="customer.id" value="11" />
+              <set name="description" value="orange_fr" />
+        </config>
+      ...
+   </config>
+      
+Only description and customer.id and variation.dir are mandatory for customer variants.
+
+The variant creation process is now working without any copy on top of epoc32 directory, you can override epoc32 content directly from the variant directory.
+
+To run the creation of all images under the '''customer_variants''' group, just call the following command line on your configuration:
+
+  hlm customer-roms -Dteam=kawa -Dbuild.number=xx 
+
+If you just want to build one particular customer variant just invoke the following command:
+
+  hlm customer-roms -Dteam=kawa -Dbuild.number=xx -Dcustomer.makefile.target=customer99rnd
+  
+The naming of the target follows this template: customer``customer.id````image.type``.
+
+
+.. index::
+  single: ATS3 - STIF, TEF, RTEST, MTF and EUnit
+
+.. _`Stage-ATS3-label`:
+
+Stage: ATS3 - STIF, TEF, RTEST, MTF and EUnit (also Qt)
+=======================================================
+
+ATS testing is the automatic testing of the phone code once it has been compiled and linked to create a ROM image.
+
+Explanation of the process for getting ATS3 (`STIF`_ and `EUnit`_) tests compiled and executed by Helium, through the use of the ``ats-test`` target.
+
+http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`STIF`: http://s60wiki.nokia.com/S60Wiki/STIF
+.. _`EUnit`: http://s60wiki.nokia.com/S60Wiki/EUnit
+</#if>
+
+.. image:: ats.dot.png
+
+Prerequisites
+----------------
+
+* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
+* The reader is expected to already have a working ATS3 setup in which test cases can be executed.  ATS3 server names, 
+  access rights and authentication etc. is supposed to be already taken care of.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
+<#else>
+.. _`Harmonized Test Interface (HTI)`: http://developer.symbian.org/wiki/index.php/HTI_Tool
+</#if>
+
+Test source components
+-------------------------
+
+Test source usually lives in a component's ``tsrc`` directory.  Test source components are created like any other Symbian SW component; 
+there is a ``group`` directory with a ``bld.inf`` file for building, ``.mmp`` files for defining the targets, and so on.
+
+The test generation code expects ``.pkg`` file in the ``group`` directory of test component to be compiled, to get the paths of the files 
+(can be data, configuration, initialization etc. files) to be installed and where to install on the phone. 
+
+Three STEPS to setup ATS with Helium
+--------------------------------------
+
+**STEP 1: Configure System Definition Files**
+ If the tsrc directory structure meets the criteria defined in the `new API test automation guidelines`_, then test components 
+ should be included in the System Definition files; **layers** in ``layers.sysdef.xml`` file and **configuration** in ``build.sysdef.xml`` 
+ file (`Structure of System Definition files`_).
+ 
+ <#if !(ant?keys?seq_contains("sf"))>
+.. _`new API test automation guidelines`: http://s60wiki.nokia.com/S60Wiki/Test_Asset_Guidelines
+.. _`Structure of System Definition files`: http://delivery.nmp.nokia.com/trac/helium/wiki/SystemDefinitionFiles
+</#if>
+
+A template of layer in layers.sysdef.xml
+
+.. code-block:: xml
+
+    <layer name="name_test_layer">
+        <module name="module_name_one">
+            <unit unitID="unit_id1" name="unit_name1" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
+        </module>
+        
+        <module name="module_name_two">
+            <unit unitID="unit_id2" name="unit_name2" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
+        </module>
+    </layer> 
+
+* Layer name should end with **_test_layer**
+* Two standard names for ATS test layers are being used; ``unit_test_layer`` and ``api_test_layer``. Test components (the``unit`` tags) 
+  should be specified under these layers and grouped by ``module`` tag(s).
+* In the above, two modules means two drop files will be created; ``module`` may have one or more ``unit``
+* By using property ``exclude.test.layers``, complete layers can be excluded and the components inside that layer will not be included in the AtsDrop. This property is a comma (,) separated list
+
+
+**STEP 2: Configure ATS properties in build.xml**
+
+**(A)** Username and Password for the ATS3 should be set in the `.netrc file`_
+
+.. code-block:: text
+
+    machine ats login ats_user_name password ats_password
+
+Add the above line in the .netrc file and replace *ats_user_name* with your real ats username and "ats_password" with ats password.
+    
+**(B)** The following properties are ATS dependent with their edit status
+
+* [must] - must be set by user
+* [recommended] - should be set by user but not mandatory
+* [allowed] - should **not** be set by user however, it is possible.
+
+.. table::
+
+    ============================== =============== ===============
+    **Property Name**              **Edit Status** **Description**
+    ============================== =============== ===============
+    **ats.server**                 [must]          For example: "4fix012345" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product.
+    **ats.drop.location**          [must]          Server location (UNC path) to save the ATSDrop file, before sending to the ATS Server. For example: \\\\trwsem00\\some_folder\\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location,  its value can be any local folder on build machine, for example c:/temp (no network share needed).
+    **ats.product.name**           [must]          Name of the product to be tested. For example: "PRODUCT".
+    **eunit.test.package**         [recommended]   The EUnit package name to be unzipped on the environment, for executing EUnit tests. "
+    **eunitexerunner.flags**       [recommended]   Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off".
+    **ats.email.list**             [recommended]   The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses.
+    **ats.flashfiles.minlimit**    [recommended]   Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files.
+    **ats.plan.name**              [recommended]   Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan".
+    **ats.product.hwid**           [recommended]   Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set.
+    **ats.script.type**            [recommended]   There are two types of ats script files to send drop to ATS server, "runx" and "import"; only difference is that with "import" ATS doesn't have to have access rights to testdrop.zip file, as it is sent to the system over http and import doesn't need network shares. If that is not needed "import" should not be used. Default value is "runx" as "import" involves heavy processing on ATS server.
+    **ats.target.platform**        [recommended]   Sets target platform for compiling test components. Default value is "armv5 urel".
+    **ats.test.timeout**           [recommended]   To set test commands execution time limit on ATS3 server, in seconds. Default value is "60".
+    **ats.testrun.name**           [recommended]   Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions.
+    **ats.trace.enabled**          [recommended]   Should be "True" if tracing is needed during the tests running on ATS3. Deafault value is "False", the values are case-sensitive.
+    **ats.ctc.enabled**            [recommended]   Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Deafault value is "False", the values are case-sensitive.
+    **ats.ctc.host**               [recommended]   CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example "10.0.0.1". If not given, code coverage reports are not created
+    **ats.obey.pkgfiles.rule**     [recommended]   If the property is set to "True", then the only test components which will have PKG files, will be included into the test.xml as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is False.
+    **reference.ats.flash.images** [recommended]   Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=""* attribute of the filset to "${r'$'}{build.output.dir}/variant_images" if "variant-image-creation" target is being used.
+    **tsrc.data.dir**              [allowed]       The default value is "data" and refers to the 'data' directory under 'tsrc' directory.
+    **tsrc.path.list**             [allowed]       Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te layers.sysdef.xml files to get compiled. Not recommended, but the property value can be set if there are no system definition file(s), and tsrc directories paths to set manually.
+    **ats.report.location**        [allowed]       Sets ATS reports store location. Default location is "${r'$'}{publish.dir}/${r'$'}{publish.subdir}".
+    **ats.multiset.enabled**       [allowed]       Should be "True" so a set is used for each pkg file in a component, this allows tests to run in parallel on several devices.
+
+    ============================== =============== ===============
+
+
+An example of setting up properties:
+
+.. code-block:: xml
+
+    <property name="ats.server" value="4fio00105"  />
+    <property name="ats.drop.location" location="\\trwsimXX\ATS3_TEST_SHARE\" />
+    <property name="ats.email.list" value="temp.user@company.com; another.email@company.com" />
+    <property name="ats.flashfiles.minlimit" value="2" />
+    <property name="ats.product.name" value="PRODUCT" />
+    <property name="ats.plan.name" value="plan" />
+    <property name="ats.product.hwid" value="" />
+    <property name="ats.script.type" value="runx" />
+    <property name="ats.target.platform" value="armv5 urel" />
+    <property name="ats.test.timeout" value="60" />
+    <property name="ats.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
+    <property name="ats.trace.enabled" value="False" />
+    <property name="ats.ctc.enabled" value="False" />
+    <property name="ats.obey.pkgfiles.rule" value="False" />
+    <property name="ats.report.location" value="${r'$'}{publish.dir}/${r'$'}{publish.subdir}" />
+    <property name="eunit.test.package" value="" />
+    <property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
+        
+        ...
+        <import file="${r'$'}{helium.dir}/helium.ant.xml" />
+        ...
+    
+    <fileset id="reference.ats.flash.images" dir="${r'$'}{release.images.dir}">
+        <include name="**/${r'$'}{build.id}*.core.fpsx"/>
+        <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
+        <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
+        <include name="**/*rnd.C00"/>
+        <include name="**/*rnd.V01"/>
+        <include name="**/*.fpsx"/>
+        <include name="**/*_rnd.fpsx"/>
+    </fileset>
+    
+
+*PLEASE NOTE:* Always declare *Properties* before and *filesets* after importing helium.ant.xml.
+
+**STEP 3: Call target ats-test**
+
+To execute the target, a property should be set(``<property name="enabled.ats" value="1" />``).
+
+Then call ``ats-test``, which will create the ATSDrop.zip (test package).
+
+If property *ats.email.list* is set, an email (test report) will be sent when the tests are ready on ATS.
+
+CTC:
+----
+
+CTC code coverage measurement can be created automatically by enabling property ``ats.ctc.enabled``
+
+Also, property ``ats.ctc.host`` must be defined (See the description above)
+
+Qt Tests:
+---------
+
+QtTest.lib is supported and the default harness is set to EUnit. If ``QtTest.lib`` is there in ``.mmp`` file, Helium sets the Harness to Eunit and ATS supported Qt steps are added to test.xml file
+
+In ``layers.sysdef.xml`` file, the layer name should end with "_test_layer" e.g. "qt_unit_test_layer".
+
+There are several ``.PKG`` files created after executing ``qmake``, but only one is selected based on which target platform is set. Please read the property (``ats.target.platform``) description above.
+
+.. _`Skip-Sending-AtsDrop-label`:
+
+Skip Sending AtsDrop to ATS3
+----------------------------
+
+By setting property of ``skip.ats.sending``, ``ats-test`` target only creates a drop file, and does not send the drop (or package) to ATS3 server.
+
+Customizing the test.xml in ATS3
+--------------------------------
+
+The user can customize the generated test.xml with files:
+
+* **preset_custom.xml** goes before first set
+* **postset_custom.xml** goes after last set
+* **precase_custom.xml** goes before first case 
+* **postcase_custom.xml** goes after last case
+* **prestep_custom.xml** goes before first step
+* **poststep_custom.xml** goes after last step
+* **prerun_custom.xml** goes before first run or execute step
+* **postrun_custom.xml** goes after last run or execute step
+* **prepostaction.xml** goes before first postaction
+* **postpostaction.xml** goes after last postaction
+
+The files must be in the directory custom under the tsrc folder processed. 
+
+The files need to be proper XML snippets that fit to their place. In case of an error an error is logged and a comment inserted to the generated XML file.
+
+A postaction section customization file ( prepostaction.xml or postpostaction.xml) could look like this
+
+.. code-block:: xml
+
+  <postAction>
+    <type>Pre PostAction from custom file</type> 
+    <params>
+       <param name="foo2" value="bar2" /> 
+    </params>
+  </postAction>
+  
+
+
+The ``prestep_custom.xml`` can be used to flash and unstall something custom.
+
+.. code-block:: xml
+
+  <step name="Install measurement tools" harness="STIF" significant="false">
+    <!-- Copy SIS-packages to DUT -->
+    <command>install</command>
+    <params>
+        <param src="Nokia_Energy_Profiler_1_1.sisx"/>
+        <param dst="c:\data\Nokia_Energy_Profiler_1_1.sisx"/>
+    </params>
+    ...
+  </step>
+
+
+And then the  ``prerun_custom.xml`` can be used to start measuring.
+
+.. code-block:: xml
+
+  <step name="Start measurement" harness="STIF" significant="false">
+      <!-- Start measurement -->
+      <command>execute</command>
+      <params>
+          <param file="neplauncher.exe"/>
+          <param parameters="start c:\data\nep.csv"/>
+          <param timeout="30"/>
+      </params>
+  </step>
+
+
+
+**Note:** The users is expected to check the generated test.xml manually, as there is no validation. Invalid XML input files will be disregarded and a comment will be inserted to the generated XML file.
+
+Overriding Test xml values
+--------------------------
+
+Set the property ``ats.config.file`` to the location of the config file.
+
+Example configuration:
+
+.. code-block:: xml
+
+    <ATSConfigData>  
+        <config name="common" abstract="true">
+         
+            <!-- Properties to add/ modify -->
+            <config type="properties">
+               <set name="HARNESS" value="STIF" />
+               <set name="2" value="3" />
+            </config>
+            
+            <!-- Settings to add/ modify -->
+            <config type="settings">
+               <set name="HARNESS" value="STIF" />
+               <set name="2" value="3" />
+            </config>
+            
+            <!-- Attributes to modify -->
+            <config type="attributes">
+               <set name="xyz" value="2" />
+               <set name="significant" value="true" />
+            </config>
+        </config>
+    </ATSConfigData>
+
+
+.. index::
+  single: ATS3 - ASTE
+
+Stage: ATS3 - ASTE
+===================
+
+Explanation of the process for getting ATS3 `ASTE`_ tests compiled and executed by Helium, through the use of the ``ats-aste`` target.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`ASTE`: http://s60wiki.nokia.com/S60Wiki/ASTE
+</#if>
+
+Prerequisites
+--------------
+
+* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
+* The reader is expected to already have a working ATS3 setup in which test cases can be executed.  ATS3 server names, access rights and authentication etc. is supposed to be already taken care of.
+* `SW Test Asset`_ location and type of test should be known.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
+.. _`SW Test Asset`: http://s60wiki.nokia.com/S60Wiki/MC_SW_Test_Asset_documentation
+</#if>
+
+Test source components
+--------------------------
+
+Unlike STIF, EUnit etc tests, test source components (or ``tsrc`` structure) is not needed for `ASTE`_ tests.
+
+Two STEPS to setup ASTE with Helium
+------------------------------------
+
+**STEP 1: Configure ASTE properties in build.xml**
+
+**(A)** Username and Password for the ATS3 should be set in the `.netrc file`_
+
+.. code-block:: text
+
+    machine ats login ats_user_name password ats_password
+
+Add the above line in the .netrc file and replace *ats_user_name* with your real ats username and "ats_password" with ats password.
+    
+.. _`.netrc file`: configuring.html?highlight=netrc#passwords
+
+
+**(B)** The following properties are ASTE dependent with their edit status
+
+* [must] - must be set by user
+* [recommended] - should be set by user but not mandatory
+* [allowed] - should **not** be set by user however, it is possible.
+
+.. table::
+
+    =============================== =============== ===============
+    **Property Name**               **Edit Status** **Description**
+    =============================== =============== ===============
+    **ats.server**                  [must]          For example: "4fio00105" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product.
+    **ats.drop.location**           [must]          Server location (UNC path) to save the ATS3Drop file, before sending to the ATS. For example: \\\\trwsem00\\some_folder\\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location,  its value can be any local folder on build machine, for example c:/temp (no network share needed).
+    **ats.product.name**            [must]          Name of the product to be tested. For example: "PRODUCT".
+    **ats.aste.testasset.location** [must]          Location of SW Test Assets, if the TestAsset is not packaged then it is first compressed to a ``.zip`` file. It should be a UNC path.
+    **ats.aste.software.release**   [must]          Flash images releases, for example "SPP 51.32".
+    **ats.aste.software.version**   [must]          Version of the software to be tested. For example: "W810"
+    **ats.aste.email.list**         [recommended]   The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses.
+    **ats.flashfiles.minlimit**     [recommended]   Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files.
+    **ats.aste.plan.name**          [recommended]   Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan".
+    **ats.product.hwid**            [recommended]   Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set.
+    **ats.test.timeout**            [recommended]   To set test commands execution time limit on ATS3 server, in seconds. Default value is "60".
+    **ats.aste.testrun.name**       [recommended]   Modify the test-run name if you have understanding of test.xml file or leave it as it is. Default value is a string consists of build id, product name, major and minor versions.
+    **ats.aste.test.type**          [recommended]   Type of test to run. Default is "smoke".
+    **ats.aste.testasset.caseids**  [recommended]   These are the cases that which tests should be run from the TestAsset. For example, value can be set as "100,101,102,103,105,106,". A comma is needed to separate case IDs
+    **ats.aste.language**           [recommended]   Variant Language to be tested. Default is "English"
+    **reference.ats.flash.images**  [recommended]   Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=""* attribute of the filset to "${r'$'}{build.output.dir}/variant_images" if "variant-image-creation" target is being used.
+    
+    =============================== =============== ===============
+    
+An example of setting up properties:
+    
+.. code-block:: xml
+    
+    <property name="ats.server" value="4fio00105"  />
+    <property name="ats.drop.location" value="\\trwsimXX\ATS3_TEST_SHARE\" />
+    <property name="ats.aste.email.list" value="temp.user@company.com; another.email@company.com" />
+    <property name="ats.flashfiles.minlimit" value="2" />
+    <property name="ats.product.name" value="PRODUCT" />
+    <property name="ats.aste.plan.name" value="plan" />
+    <property name="ats.product.hwid" value="" />
+    <property name="ats.test.timeout" value="60" />
+    <property name="ats.aste.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
+    <property name="ats.aste.testasset.location" value="" />
+    <property name="ats.aste.software.release" value="SPP 51.32" />
+    <property name="ats.aste.test.type" value="smoke" />
+    <property name="ats.aste.testasset.caseids" value="100,101,102,104,106," />
+    <property name="ats.aste.software.version" value="W810" />
+    <property name="ats.aste.language" value="English" />
+         
+    ...
+    <import file="${r'$'}{helium.dir}/helium.ant.xml" />
+    ...
+    
+    <fileset id="reference.ats.flash.images" dir="${r'$'}{release.images.dir}">
+        <include name="**/${r'$'}{build.id}*.core.fpsx"/>
+        <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
+        <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
+        <include name="**/*rnd.C00"/>
+        <include name="**/*rnd.V01"/>
+        <include name="**/*.fpsx"/>
+        <include name="**/*_rnd.fpsx"/>
+    </fileset>
+    
+
+*PLEASE NOTE:* Always declare *Properties* before and *filesets* after importing helium.ant.xml.
+
+**STEP 2: Call target ats-aste**
+
+To execute the target, a property should be set(``<property name="enabled.aste" value="1" />``).
+
+Then call ``ats-aste``, which will create the ATSDrop.zip (test package).
+
+If property ``ats.aste.email.list`` is set, an email (test report) will be sent when the tests are ready on ATS/ASTE.
+
+
+Skip Sending AtsDrop to ATS3
+------------------------------
+
+click :ref:`Skip-Sending-AtsDrop-label`:
+
+.. index::
+  single: MATTI
+
+Stage: MATTI
+=============
+
+MATTI testing is very similar to ATS3 testing, so for details of how it all links together see :ref:`Stage-ATS3-label`: `and the matti website`_.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`and the matti website`:  http://trmatti1.nmp.nokia.com/help/
+</#if>  
+
+The set up of parameters is very similar (a few less parameters and it mostly uses ATS3 values). The main difference is that once the drop file has been uploaded to the ATS3 server it uses MATTI to perform the tests and not ATS3, this is achieved by calling the MATTIDrop.py script instead of the ATSE or ATS3 scripts when creating the drop file (the drop file contains the flash files and the ruby tests to be performed).
+
+The following parameters are the ones that are not listed in the ATS3 parameters, all other parameters required are as listed in the ATS3 section above.
+
+* [must] - must be set by user
+* [recommended] - should be set by user but not mandatory
+* [allowed] - should **not** be set by user however, it is possible.
+
+.. table::
+
+    =============================== =============== ===============
+    **Property Name**               **Edit Status** **Description**
+    =============================== =============== ===============
+    **matti.scripts**               [must]          The location of the test scrips as ruby test files i.e. .rb files.
+    **enabled.matti**               [must]          Enable MATTI testing to occur, if not present the target 'matti-test' will not run.
+    **template.file**               [must]          Location of the matti template file.
+    **ats.sis.images.dir**          [recommended]   Location of the the .sis installation files needed to flash to the phone (if required and present).
+    **ats.script.type**             [must]          Always set to import, this means the MATTI server will retrieve the tests.
+    **ats.image.type**              [must]          Image type whether Engineering English or localised.
+    **ats.flashfiles.minlimit**     [must]          Minimum number of flash files required in to add to the drop file.
+    **tsrc.data.dir**               [recommended]   Test source code data directory. only required for testing the ANT MATTI code.
+    **ta.flag.list**                [recommended]   TA flag list.
+    
+    =============================== =============== ===============
+
+All you need to do is setup the following parameters:
+
+.. code-block:: xml
+
+    <property name="enabled.matti" value="1" />
+    <property name="enabled.ats" value="1" />
+    <property name="matti.scripts" value="${r'$'}{helium.dir}\testconfig\ats3\matti\script" />
+    <property name="template.file" value="${r'$'}{helium.dir}\tools\common\python\lib\ats3\matti\template\matti_demo.xml" />
+    <property name="ats.sis.images.dir" location="${r'$'}{build.drive}\output\matti\sis" />
+    <property name="ats.image.type" value="variant" />
+    <property name="ats.product.name" value="" />
+    <property name="ats.email.list" value="" />
+    <property name="ats.plan.name" value="" />
+    <property name="ats.flashfiles.minlimit" value="2" />
+    <property name="ats.target.platform" value="armv5 urel" />
+    <property name="ats.script.type" value="import" />
+    <property name="ats.product.hwid" value="" />
+    <property name="core.build.version" value="1" />
+    <property name="ats.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{core.build.version}" />
+    <property name="ats.test.timeout" value="60" />
+    <property name="ats.output.dir" location="${r'$'}{build.drive}\output\ats" />
+
+    <!--ats3 testing properties-->
+    <property name="tsrc.data.dir" value="data_rom" />
+    <property name="ats.ctc.enabled" value="True" />
+    <property name="ats.flashfiles.minlimit" value="2"/>
+    <property name="ta.flag.list" value="TA_M, TA_MU, TA_MMAPPFW,TA_MM"/>
+    <property name="ats.server" value="12345675:80"/>
+
+In order to upload and view the test run you need to have a valid user id and password that matches that in your .netrc file. To create the account open a web browser window and enter the name of the ats.server with /ats3 at the end e.g. http://123456:80/ats3. Click on the link in the top right hand corner to create the account. To view the test run once your account is active you need to click on the 'test runs' tab.
+
+To run the tests call the target `matti-test` (you will need to define the 'build.drive', 'build.number' and it is best to create the 'core.build.version' on the command line as well if you do not add it to the list of targets run that create the ROM image). e.g.
+::
+
+    hlm -Dbuild.number=001 -Dbuild.drive=z: -Dcore.build.version=001 matti-test
+
+If it displays the message 'Testdrop created!' with the file name then the MATTIDrops.py script has done what it needs to do. The next thing to check is that the drop file has been uploaded to the ATS3 server OK. If that is performed successfully then the rest of the testing needs to be performed by the ATS3 server. There is also a test.xml file created that contains details needed for debugging any problems that might occur. To determine if the tests have run correctly you need to read the test run details from the server.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/tool-dependencies.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+.. index::
+  single:  Helium tools dependencies
+
+.. csv-table:: Helium tools dependencies
+   :header: "Tool", "Purpose", "Optionality"
+   
+<#list doc["ivy-report/dependencies/module"] as module>
+   "${module.@name} ${module.revision.@name}", "", "${module.revision.caller.@conf}"
+</#list>
Binary file buildframework/helium/doc/src/mc_tools_design.vsd has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/metrics.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,217 @@
+####################
+Helium Build Metrics
+####################
+
+.. index::
+  module: Helium Build Metrics
+
+
+.. contents::
+
+Introduction
+============
+
+This describes the types of build and release metrics that can be collected using Helium and a Diamonds installation and how they can be collected.
+
+.. index::
+  single: Diamonds
+
+Diamonds Link for builds:
+=========================
+    Diamonds Homepage: <http://diamonds.nmp.nokia.com/diamonds>
+
+
+Helium configuration
+====================
+To enable logging to diamonds from Helium one needs to ensure that:
+
+* The properties *diamonds.host* and *diamonds.port* are set correctly.
+* By default they are taken from *helium/tools/common/companyproperties.ant.xml*,
+  but can be overridden by using:
+
+  * **Command line**    
+  
+    For example, if the Diamonds server IP address changed to **new.diamonds.server:newport** then you would use:
+    
+    * *hlm.bat -Ddiamonds.host=new.diamonds.server -Ddiamonds.port=newport*
+
+  * **ANT team file** 
+   
+    For example, if the Diamonds server IP address changed to **new.diamonds.server:newport** then you would put the following lines in your <team>.ant.xml: 
+
+    * *<property name="diamonds.host" value="new.diamonds.server"/>*  
+    * *<property name="diamonds.port" value="newport"/>*
+
+* If you define the property skip.diamonds to 'true' diamonds is disabled.
+
+
+.. index::
+  single: Diamonds server configuration
+
+Diamonds server configuration
+=============================
+
+    Config File: helium/config/diamonds_config.xml.ftl
+
+
+Properties need to be defined for successful logging:
+-----------------------------------------------------
+
+ ==========================        ============
+ Property name                     Description
+ ==========================        ============ 
+ diamonds.host                     Diamonds server address 
+ diamonds.port                     Server port number
+ diamonds.path                     Builds path in diamonds server
+ build.family                      Category of product
+ time-stamp                        Time stamp format
+ stages                            Start and end target of a stages with logical stage name
+ sysdef.configurations.list        System definition name list to log component faults
+ build.name                        Name of product
+ release.label                     Name of release
+ publish                           Set this property to publish to network
+ publish.dir                       Published build environment location
+ release.grace.dir                 Published location
+ disable.analysis.tool             Set this property to disable API Usage Metrics
+ diamonds.build.tags               Set this property to send custom build tag(s) to Diamonds
+ ==========================        ============
+
+
+.. index::
+  single: Metrics
+
+Metrics
+=======
+
+    
+Metrics name: Build duration
+----------------------------
+
+Description
+~~~~~~~~~~~~
+    Build duration in hours as a function of time.
+
+Collection method
+~~~~~~~~~~~~~~~~~~~
+    The started time and finished time are uploaded to diamonds automatically from Helium. 
+    
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Summary.  
+    
+    For categorization by product programs, Build->Click "category" hyperlink. For 
+    categorization by build accelerators, Build->Other->Click "Build system" hyperlink.
+    
+    
+RVCT compiler warnings 
+----------------------
+
+Description
+~~~~~~~~~~~
+    Number of build warnings in SW build - RVCT compiler warnings to tell about the quality of the software.
+    
+Collection Method
+~~~~~~~~~~~~~~~~~
+    Number of RVCT bad warnings, warnings and errors are send to diamond aumatically from Helium after each build.
+
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Summary->Compilation error summary.
+    
+
+Metrics name: "number of object files" and "number of generated files"
+----------------------------------------------------------------------
+
+Description
+~~~~~~~~~~~~
+    Number of object files and generated files for a build    
+
+Collection method
+~~~~~~~~~~~~~~~~~~~
+    Necessary data are collected from build information automatically    
+
+    Based on helium/config/diamonds_config.xml.ftl cofiguration, Helium automatically sends the start and end time of a stage to diamonds.
+
+        
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Others->Object files & Generated files.  
+   
+   
+Metrics name: Build stage duration
+----------------------------------
+
+Description
+~~~~~~~~~~~~
+    Date and time of start and finish. A=Date and time of start B= Date and time of finish.
+    Metric = B-A calculated for each build stages. In the graph only the 4 main stages are shown.\
+
+        * *1. pre-build (Synergy check outs and snapshots, build area preparation)*
+        * *2. build (main build)*
+        * *3. post build (Post build, China, Japan, EE images, EE zip,  Localization, Localized roms)*
+        * *4. release to channels (db, ftp, network disk)*
+
+Collection method
+~~~~~~~~~~~~~~~~~~~
+    The started time and finished time are uploaded to diamonds automatically from Helium. 
+    
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Summary. Click "Stages>>"
+    
+    
+Metrics name: API Usage
+----------------------------------
+
+Description
+~~~~~~~~~~~~
+    Types of api are private, internal, domain and sdk. Illegal API is (internal+private), if  any illegal api exists it will show the Illegal API's name with path.
+
+Collection method
+~~~~~~~~~~~~~~~~~~~
+    If disable.analysis.tool is not set, data will be uploaded to diamonds automatically from Helium. 
+    
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Other->API usage  
+
+
+Metrics name: Build tags
+------------------------
+
+Description
+~~~~~~~~~~~~
+    Build tags are used to group builds for metric collection purposes.
+
+Collection method
+~~~~~~~~~~~~~~~~~~~
+    To send custom build tags to Diamonds the property diamonds.build.tags should be set as follows:
+     * For a single build tag (e.g. "build_tag1") -> hlm -Ddiamonds.build.tags="build_tag1" 
+     * For multiple build tags (e.g. "build_tag1" and "build_tagN") -> hlm -Ddiamonds.build.tags="build_tag1,build_tagN" 
+    
+    Note:
+    * Build tags should not exceed 50 characters.
+    * Duplicate build tags will be ignored. 
+    * If an "Available Tag" is set, then in Diamonds it gets removed from that list and transferred to "Build's Tags" list.
+
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Tags->Build's Tags.  
+    
+    For categorization by tags, Click Builds->"Navigation" pane->"Build Archives"->by tags 
+
+
+Metrics name: Information about "base environment" 
+--------------------------------------------------
+
+Description
+~~~~~~~~~~~~
+    Information about what "base environment" is unzipped.
+    
+Collection method
+~~~~~~~~~~~~~~~~~~~
+    Necessary data are collected from build information automatically if currentRelease.xml exists in the environment. 
+    
+Location in Diamonds
+~~~~~~~~~~~~~~~~~~~~~~
+    In Diamonds, Builds->Content. See "Input" for s60.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/minibuilds.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+.. index::
+  module:  Minibuild test configurations
+
+Minibuild test configurations
+=============================
+
+Minibuilds are buildbots (automated test systems) that are used to test parts of Helium. For each platform/family of products e.g. 5132 and 5152 
+a buildbot is created that tests the platform using 
+a subset of the complete build. All build bots are automatically executed each time something is checked in to the Helium subversion trunk.
+
+.. index::
+  single:  Minibuild test configurations- getting started
+
+Getting Started
+---------------
+
+.. toctree::
+   
+<#list project.getReference('internal.ref.minibuilds')?split(';') as filename>
+   ${filename?replace('\\', '/')}
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/quick_start_guide.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,123 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+########################
+Helium Quick Start Guide 
+########################
+
+.. index::
+  module: Helium Quick Start Guide
+
+.. contents::
+
+Introduction
+============
+
+This document is a quick start guide for Ant based Helium build framework. More information can be found from `Helium manual`_.
+
+.. _`Helium manual`: index.html#index-65
+
+This quick start guide is aimed at getting you helium on the build machine and showing you how to run helium in the very
+simplest of ways. Further reading and configuration is required to perform a complete build of a component or a product.
+
+<#if !ant?keys?seq_contains("sf")>
+To set up your environment please follow the `Helium Environment Setup`_ also make sure you have correct SymSEE version mentioned in this link. 
+
+.. _`Helium Environment Setup`: nokia/nokia.html
+</#if>
+
+<#if ant?keys?seq_contains("sf")>
+To set up your environment please follow the steps of `Helium Environment Setup`_.
+
+.. _`Helium Environment Setup`: sf.html
+</#if>
+
+
+.. index::
+  single: Helium configuration
+
+Helium configuration
+--------------------
+
+- Helium is configured using a combination of Ant configuration elements (properties, filesets, etc) and other XML files for more complex
+  configuration of particular parts of the build. For initial tests run in this quick start guide you do not need to configure anything, but 
+  do please read the following references for more information:
+
+  - `Using Ant <http://ant.apache.org/manual/using.html>`_: specifically the Projects and Properties sections.
+  - `Configure Helium  <manual/configuring.html>`_: `common configuration format <manual/configuring.html#common-configuration-format>`_ and `Helium stages <manual/stages.html>`_.
+  - `Helium glossary <api/helium/properties-table.html>`_: lists the specific properties used in Helium.
+
+.. index::
+  single: Running builds with Helium
+
+.. _Running-helium-label:
+
+Running builds with Helium
+==========================
+
+After configuring the framework, running builds with Helium is simple. The command-line interface is the same as for Apache Ant. 
+Please read `Running Ant <http://ant.apache.org/manual/running.html>`_ for more information.
+
+You start the build with ``hlm`` command. Navigate into 'helium' directory (should contain the file hlm.bat) and type::
+
+    hlm [target] [-D<property>=<value>] [-f <ant_build_file>] [-h] [-p -v]
+    
+    [target]                        Run Ant target
+    [-D<property>=<value>]          Set an Ant property
+    [-f <ant_build_file>]           Use another Ant build file
+    [-h]                            Print Ant help text
+    [-p -v]                         List all Ant targets
+    
+    Variable properties for helium:
+    -Dsysdef.configuration=default set build configuration, default value is 'default'
+    -Dbuild.system=ebs             set build system, default value is 'ebs'
+                                      - possible values are 'ebs' and 'ec'
+    
+    Usage examples:
+    hlm                            build the default build target
+    hlm -Dbuild.system=ec-helium   use electric cloud build system
+
+
+Eg:: 
+
+    hlm -Dbuild.number=1 hi
+    
+This is a very simple task found in the file ``\helium\tool\common\common.ant.xml``
+
+The code is shown below::
+
+    <!-- A simple test target that prints a simple message -->  This is a comment line <!--  --> 
+                                                                indicates comment text
+    <target name="hello">                                       This is the target name 'hello'
+        <echo message="Hello!"/>                                what the task does echo the word 'hello'
+        <if>                                                    Conditional branch
+            <isset property="build.number"/>                    If the property build.number is present 
+            <then>                                              then 
+                <echo message="Ant libs found OK"/>             echo additional text 'Ant libs found OK'
+            </then>                                             end of 'then' action
+        </if>                                                   end of 'if' action
+    </target>                                                   end of target/task
+    
+    
+    <target name="hi" depends="hello"/>                         this is the called target which depends
+                                                                upon the target 'hello' being run before
+                                                                this target is run.
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/sf.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+======================================
+Setting up Helium (Symbian Foundation)
+======================================
+
+Installation
+------------
+
+Install the following tools:
+
+* `ActivePython 2.5`_
+
+.. _`ActivePython 2.5`: http://www.activestate.com/activepython/downloads
+
+* `ActivePerl 5.6.1`_
+
+.. _`ActivePerl 5.6.1`: http://www.activestate.com/activeperl/downloads
+
+Included in Helium release:
+
+* `Apache Ant 1.7.0`_
+
+.. _`Apache Ant 1.7.0`: http://archive.apache.org/dist/ant/binaries/apache-ant-1.7.0-bin.zip
+
+* `Java 6`_
+
+.. _`Java 6`: http://java.com/en/download/index.jsp
+
+* 7zip_
+
+.. _7zip: http://www.7-zip.org
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/toc.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<title>Apache Ant User Manual</title>
+<base target="mainFrame">
+</head>
+
+<body>
+
+<h2>Table of Contents</h2>
+<a href="manual/introduction.html">Introduction</a><br>
+<a href="quick_start_guide.html">Quick start guide</a><br>
+<a href="feature_list.html">Feature list</a><br>
+
+<h4>Manual</h4>
+<a href="manual/installing.html">Installing Helium</a><br>
+<a href="manual/using.html">Using Helium</a><br>
+<a href="manual/running.html">Running Helium</a><br>
+<a href="manual/stages.html">Helium stages</a><br>
+<a href="data_model.html">Configuration reference</a><br>
+<a href="metrics.html">Metrics</a><br>
+<a href="manual/datapackage.html">Data Package reference</a><br>
+<a href="api/index.html" target="_top">Helium API</a><br>
+
+<h4>Tutorials</h4>
+<a href="tutorials/ido.html">IDOs</a><br>
+<a href="tutorials/variant.html">Variant teams - Customer Variant creation</a><br>
+<a href="tutorials/vt_uda.html">Variant teams - UDA creation</a><br>
+<a href="tutorials/using.html">Developers</a><br>
+<a href="tutorials/pre-release-testing.html">Testing Helium pre-releases</a><br>
+
+<h4>Development</h4>
+<a href="architecture.html">Architecture</a><br>
+<a href="design.html">Design</a><br>
+<a href="style_guide.html">Style guide</a><br>
+<a href="api/python/index.html" target="_top">Python API</a><br>
+<a href="api/java/index.html" target="_top">Java API</a><br>
+<a href="api/ant/index.html" target="_top">Ant Task Doc</a><br>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+How to create a new signal
+==========================
+
+This document will help you implementing a new signal in your configuration.  
+
+Use case
+--------
+You have one target named **custom-action** which
+should generate an artifact in some know location, and you would like the build to continue as far 
+as possible even if that artifact is missing, but being informed during the build it is not going as expected. 
+
+
+Base configuration
+------------------
+
+The following code snippet will be the base configuration for this exercise.   
+
+build.xml
+
+.. code-block:: xml
+
+   <?xml version="1.0" ?>
+   <project name="config" default="test" xmlns:hlm="http://www.nokia.com/helium"> 
+      <property environment="env"/>
+      <import file="${helium.dir}/helium_preinclude.ant.xml"/>
+
+      <!-- Location of the artifact -->    
+      <property name="artifact" location="artifact.txt"/>
+            
+      <import file="${helium.dir}/helium.ant.xml"/>
+
+      <!-- The target -->
+      <target name="custom-action">
+         <delete failonerror="false" file="${artifact}"/>
+         <if>
+            <istrue value="${create.artifact}"/>
+            <then>
+               <echo file="${artifact}">My artifact</echo>
+            </then>
+         </if>
+      </target>
+      
+      <target name="custom-dummy">
+        <echo message="Dummy action"/>
+      </target>
+   
+   </project>   
+
+
+
+To declare a new signal to the framework you need to define a new signalConfig reference.
+You also need to create a signalInput configuration to define your signal behaviour.
+
+.. code-block:: xml
+ 
+   <hlm:signalInput id="customActionSignalInput" failbuild="defer"/>
+   
+   <hlm:signalListenerConfig id="customActionSignal" name="custom-action" message="custom-action target ended.">
+      <signalNotifierInput>
+          <signalInput refid="customActionSignalInput" />
+          <notifierInput file="${artifact}" />
+      </signalNotifierInput>
+      <hlm:targetCondition>
+         <not><available file="${artifact}"/></not>            
+      </hlm:targetCondition>
+   </hlm:signalConfig>
+
+
+The signalListenerConfig defines which target to listen and raise signal for. The target name is defined through the **name** attribute.
+Then the nested **targetCondition** element is used to configure how the signal should be triggered.
+This element accepts any nested `Ant conditions <http://ant.apache.org/manual/CoreTasks/conditions.html>`_.
+In this case the signal will get raised only id the file is not present after the execution of the **custom-action** target.
+
+The framework then uses the defined signalInput from the signalNotifierInput configuration to know how to behave when the signal is raised. In the previous example it will
+simply keep running and fail the build at the end. Then files defined by the nested notifierInput will be passed to the notifier.
+
+The execution of the **custom-action custom-dummy** build sequence will happen entirely even if the artifact is not 
+created properly, then fail the build mentioning the faulty target::
+
+   > hlm custom-action custom-dummy
+   Internal data listening enabled.
+   Buildfile: build.xml
+        [echo]  Using build drive X:
+   
+   custom-action:
+   18:21:14,503  INFO - Signal customActionSignal will be deferred.
+   
+   custom-dummy:
+        [echo] Dummy action
+   
+   BUILD FAILED
+   customActionSignal: custom-action target ended. : custom-action
+   
+   
+   Total time: 2 seconds
+
+
+If you enable the artifact creation then the build will proceed successfully::
+
+   >hlm custom-action custom-dummy -Dcreate.artifact=true
+   Internal data listening enabled.
+   Buildfile: build.xml
+        [echo]  Using build drive X:
+   
+   custom-action:
+   
+   custom-dummy:
+        [echo] Dummy action
+   
+   BUILD SUCCESSFUL
+   Total time: 2 seconds
+
+   
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/configuration/SimplestConfiguration.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+
+
+Basic Helium configuration
+==========================
+
+These two files define the smallest Helium configuration possible: 
+
+First the build.xml, it consists in two Ant instructions:
+   
+   * The creation of a 'env' property which stores current environment variables (see http://ant.apache.org/manual/CoreTasks/property.html).
+   * Then the inclusion of Helium features importing the ${helium.dir}/helium.ant.xml, the helium.dir is automatically defined by the Helium bootstrapper.
+
+build.xml:
+
+.. code-block:: xml
+   
+   <?xml version="1.0" encoding="UTF-8"?>
+   <project name="simple-config">
+       <property environment="env"/>
+       <import file="${helium.dir}/helium.ant.xml"/>   
+   </project>
+
+
+Finally the Helium bootstrapper, which consists in a simple batch file (or shell script under Linux).
+Its job is to redirect calls to the hlm.bat script under the HELIUM_HOME dir. Additional checks could be added there e.g:
+   
+   * check if the user has defined the HELIUM_HOME environment variable. 
+   * set/modify environment
+   * define the HELIUM_HOME if Helium is in a known location
+
+hlm.bat::
+   
+   @echo off
+   setlocal
+   if not defined HELIUM_HOME  ( 
+   echo HELIUM_HOME is not defined.
+   goto :eof 
+   )
+   %HELIUM_HOME%\hlm.bat %*
+   endlocal
+
+
+
+Download the example:
+`simple_config.zip <simple_config.zip>`_
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/configuration/UseHlmTasksInConfiguration.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+
+
+How to use Helium  ant tasks in configuration
+=============================================
+
+Sometimes customer may need to use helium ant tasks from their configurations and in the 
+following way customer can use helium ant tasks by importing helium_preinclude.ant.xml:
+
+Here is a example of build.xml:
+   
+   * The creation of a 'env' property which stores current environment variables (see http://ant.apache.org/manual/CoreTasks/property.html).
+   * Import ${helium.dir}/helium_preinclude.ant.xml  to include helium ant tasks. 
+   * Then a target which is using a helium ant task.
+   * Then the inclusion of Helium features importing the ${helium.dir}/helium.ant.xml, the helium.dir is automatically defined by the Helium bootstrapper.
+
+build.xml:
+
+.. code-block:: xml
+
+    <project name="helium-test" default="test" xmlns:hlm="http://www.nokia.com/helium"> 
+        <description>
+        Helium pre include test.
+        </description>
+        <property environment="env"/>
+        <import file="${env.HELIUM_HOME}\helium_preinclude.ant.xml"/>   
+            
+        <target name="test">
+           <hlm:logtoconsole action="stop"/>
+                <echo>Should not print anything.</echo>
+           <hlm:logtoconsole action="resume"/>
+           <echo>Should print something.</echo>       
+        </target>
+        
+        <import file="${env.HELIUM_HOME}\helium.ant.xml"/>           
+    </project>    
+
+
+Finally the Helium bootstrapper, which consists in a simple batch file (or shell script under Linux).
+Its job is to redirect calls to the hlm.bat script under the HELIUM_HOME dir. Additional checks could be added there e.g:
+   
+   * check if the user has defined the HELIUM_HOME environment variable. 
+   * set/modify environment
+   * define the HELIUM_HOME if Helium is in a known location
+
+hlm.bat::
+   
+   @echo off
+   setlocal
+   if not defined HELIUM_HOME  ( 
+   echo HELIUM_HOME is not defined.
+   goto :eof 
+   )
+   %HELIUM_HOME%\hlm.bat %*
+   endlocal
+
Binary file buildframework/helium/doc/src/tutorials/configuration/simple_config.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+How to generate iMaker buildinfo using Helium
+=============================================
+
+Config location: http://helium.nmp.nokia.com/trac/browser/configs/test/test_buildinfo
+
+The configuration
+-----------------
+
+build.xml
+~~~~~~~~~
+
+The configuration shows how to override the default Helium template by overriding the *rombuild.buildinfo.template* Ant property::
+
+   <property name="rombuild.buildinfo.template" location="./image_conf_buildinfo.mk.ftl"/>
+
+
+
+FTL template
+~~~~~~~~~~~~
+
+It is possible to extract custom data by updating the templete using the `FreeMarker <http://fmpp.sourceforge.net/freemarker/>`_ Template Language (http://fmpp.sourceforge.net/freemarker/). 
+The following example extract all ant properties starting with *"build."*:
+[[IncludeSource(/configs/test/test_buildinfo/image_conf_buildinfo.mk.ftl,include_templates/include_text)]]
+
+Creating the configuration
+--------------------------
+
+To create the file on your build area (Z: drive in our case) you simply need to invoke *rombuild-imaker-create-buildinfo* Helium target:
+(Just make sure you have defined HELIUM_HOME first)
+
+::
+   
+   > hlm.bat -Dbuild.drive=Z: rombuild-imaker-create-buildinfo
+   *** WARNING: Can't find vcvars32.bat - MS Visual Studio not present.
+   Buildfile: build.xml
+   
+   create-data-model-db:
+   
+   validate-at-startup:
+      [python] ERROR: Description has no content for 'read.build.int'
+      [python] WARNING: Required property not defined: sysdef.configurations.list
+      [python] WARNING: Required property not defined: tsrc.data.dir
+      [python] WARNING: Required property not defined: ats3.pathToDrop
+      [python] WARNING: Required property not defined: ats3.host
+      [python] WARNING: Required property not defined: ats.flash.images
+      [python] WARNING: Required property not defined: ats.image.type
+      [python] WARNING: Required property not defined: ats.drop.file
+      [python] WARNING: Required property not defined: ats3.username
+      [python] WARNING: Required property not defined: cache.drive
+      [python] WARNING: Required property not defined: ats.product.name
+      [python] WARNING: Required property not defined: ats3.password
+
+   rombuild-imaker-create-buildinfo:
+        [fmpp] File processed.
+   
+   BUILD SUCCESSFUL
+   Total time: 3 seconds
+
+
+The output
+~~~~~~~~~~
+
+The file image_conf_buildinfo.mk should be generated under /epoc32/rom/config, and should contains something similar to::
+
+   ##########################################################################
+   #
+   # Helium - iMaker buildinfo template. 
+   #
+   ##########################################################################
+
+   BUILD_LOGGING_KEY_STAGES = prep,build-ebs-main,postbuild,flashfiles,java-certification-rom,zip-main,publish-generic,variants-core,variants-elaf,variants-china,variants-thai,variants-japan,variants,mobilecrash-prep,localise-tutorial-content,hdd-images,zip-flashfiles,zip-localisation,data-packaging-prep
+   BUILD_SUMMARY_FILE_2 = Z:\output\logs\summary\pf_5250_16_wk2008_summary.log2.xml
+   BUILD_LOG = Z:\output\logs\pf_5250_16_wk2008_ant_build.log
+   BUILD_NAME = pf_5250
+   BUILD_CACHE_LOG_DIR = C:\DOCUME~1\wbernard\LOCALS~1\Temp\helium\wbernard\pf_5250_16_wk2008\logs
+   BUILD_SYSTEM = ebs
+   BUILD_LOG_DIR = Z:\output\logs
+   BUILD_CACHE_DIR = C:\DOCUME~1\wbernard\LOCALS~1\Temp\helium\wbernard\pf_5250_16_wk2008
+   BUILD_OUTPUT_DIR = Z:\output
+   BUILD_SUMMARY_FILE = Z:\output\logs\pf_5250_16_wk2008_build_summary.xml
+   BUILD_VERSION = 0.0.1
+   BUILD_SYSTEM_EBS = Not used
+   BUILD_SISFILES_DIR = Z:\output\sisfiles
+   BUILD_ERRORS_LIMIT = 0
+   BUILD_DRIVE = Z:
+   BUILD_NUMBER = 1
+   BUILD_DUPLICATES_LOG = Z:\output\logs\pf_5250_16_wk2008_build_duplicates.xml
+   BUILD_LOGGING_START_STAGE = check-env-prep
+   BUILD_ID = pf_5250_16_wk2008
+
+
+
+Download the example: `buildinfo_creation.zip <buildinfo_creation.zip>`_
\ No newline at end of file
Binary file buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/qt_build.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+.. index::
+  module: How to create a ROM Image
+
+################################
+Configure Helium for Qt building
+################################
+
+.. contents::
+
+This tutorial explains how to update your configuration to enable Qt building.
+
+Configuring Qt
+==============
+
+Helium has a ready to use target which allows you to configure Qt. You just need to make sure the qt.dir
+property is configured with the correct location of your Qt source.
+Then you can run the target as follow::
+
+ > hlm -Dbuild.drive=Q: -Dbuild.number=1 configure-qt
+ ...
+ 
+This target has now been depreciated in Helium 6.0, please consider building Qt using Symbian toolchain (SBS or SBSv2).
+
+Building Qt components
+======================
+
+Qt component can be configured using system definition files version 1.5.1, its definition could be 
+found under HELIUM_HOME/tools/common/dtd/sysdef_1_5_1.dtd. You also need to define this schema as the 
+main one for the system definition file merging operations, this can be done by adding the following 
+line to your build configuration::
+
+   <property name="compile.sysdef.dtd.stub" location="${helium.dir}/tools/common/dtd/sysdef_dtd_1_5_1.xml" /> 
+
+
+Then qmake building needs to be activated by defining the ``qmake.enabled`` property. 
+   
+Then you can configure your Qt components by using the proFile attribute under the system definition files.
+The proFile attribute defines the name of the pro file relatively to the path defined by the bldFile attribute.
+Default qMake command line parameters can be overridden by using the optional qmakeArgs attribute. 
+Example::
+   
+   <?xml version="1.0"?>
+   <!DOCTYPE SystemDefinition SYSTEM "sysdef_1_5_1.dtd" []>
+   <SystemDefinition name="organizer" schema="1.5.1">
+     <systemModel>
+       <layer name="app_layer">
+         <module name="module">
+           <unit unitID="my.component" name="my.component"  bldFile="my/component/location/group"  proFile="component.pro" mrp=""/>
+           <unit unitID="my.component2" name="my.component2"  bldFile="my/component/location/group"  proFile="component.pro" qmakeArgs="-r" mrp=""/>
+         </module>
+       </layer>
+     </systemModel>
+   </SystemDefinition>
+   
+
+The system definition files can now be merged and filtered(similarly to Raptor). Helium will use the filtered information
+during the build to run qMake and generate the bld.inf required to make Symbian builds.
+This will follow this algorithm::
+
+   foreach unit from the filtered system definition file:
+      cd <bldFile>
+      qmake <proFile>
+
+The file qmake.generated.txt is created with the list of files generated.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/rom_image.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+.. index::
+  module: How to create a ROM Image
+
+################################
+How to create a ROM Image
+################################
+
+.. contents::
+
+This tutorial explains how to create a ROM image and all the configurations required to achieve this.
+
+
+Introduction
+=============
+
+The ROM image is the end product which is flashed (downloaded) in to the phone and makes the phone behave the way it is supposed to behave (or not if there are problems present). ROM images are created within Helium using the S60 tool iMaker. iMaker is a ROM-image creation tool which provides a simple, standardized and configurable ROM-image creation framework. iMaker is based on the standardized GNU Make system and is therefore platform-independent. iMaker is a tool that creates a flash image from a set of Symbian binary and data files. iMaker mainly functions on top of the Symbian buildrom utility. 
+
+The iMaker tool itself runs the Make tool and consists of thin layer of Perl. 
+iMaker offers a standardized framework for defining configuration parameters for the ROM-image 
+creation. The framework tools and configurability can easily be extended in the end customer interface, 
+without changing the core iMaker functionality. 
+
+Within Helium there are a series of targets that can be run that call iMaker and hence build the ROM image. 
+This section is targeting build managers and IDOs who need to configure Helium to build ROM images using iMaker.
+ 
+
+In order to use Helium for ROM-image creation your ROMs need to be configured to
+be created using Helium. The creation is supported by the iMaker task which supports the  '''imakerconfigurationset'''
+element to configure what needs to be built.
+
+.. index::
+   single: How to Install iMaker
+
+How to Install iMaker
+=====================
+
+iMaker comes as part of S60 code and therefore should be automatically installed when S60 is installed. However, if you are not using S60
+it is also available via Helium under the 'helium_trunk/external/imaker/bin' directory, the main executable is called 'mingw_make.exe'.
+
+
+.. index::
+   single: ROM Creation Commands
+
+ROM Creation Commands
+======================
+
+To build an Engineering English (EE) version of the ROM use the target 'ee-roms' for localised images use the target
+'localisation'. These are both for product builds and need several parameters to be configured before they will work successfully.
+For details on how to configure helium for ROM image creation click :ref:`ROM-creation-label`.
+
+.. index::
+   single: Engineering English - brief description
+
+Engineering English - brief description
+----------------------------------------
+
+EE builds are the basic builds that contain all the required components but the only available language is English. 
+It is often used to prove that a build can be made or for basic testing, without the added complication of different languages.
+
+.. index::
+   single: Localisation - brief description
+
+Localisation - brief description
+---------------------------------
+
+Localisation is the process used to create the different variants for different parts of the world. For each different language
+available in a phone there is one or more text files that contain the text to be displayed, e.g. contacts, options, exit, keypad locked,
+all have to be translated to the relevent language text. There are various regional variations as well which need to be implemented
+so the correct files need to be included, this is all part of the configuration for localisation.
+
+ 
+.. index::
+   single: iMaker User Guide
+
+.. _iMaker-label:
+
+iMaker User Guide
+=================
+
+There is an `iMaker User Guide` available from helium in the \\helium-trunk\\external\\imaker\\doc folder 
+it is a PDF file (S60_iMaker_User_Guide.pdf) and explains 
+everything you need to know about iMaker. iMaker is based on `GNU Make`_ click on the link to view a .html version of `GNU Make`_ documentation. 
+
+.. _`GNU Make`: http://www.gnu.org/software/make/manual/make.html
+
+.. index::
+   single: iMaker tutorials
+
+iMaker tutorials
+================
+
+This section lists all available tutorials on how to configure and use iMaker.
+
+.. toctree::
+   :maxdepth: 1
+
+   imaker/buildinfo_creation
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/tutorials/variant.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,185 @@
+.. index::
+  module: Variant creation tutorial
+
+################################
+Legacy Variant creation tutorial
+################################
+
+This section describes the configuration required to create a variants and UDA, this should be read along with the :ref:`localisation-label`:
+sections else where.
+
+Variant Creation
+-----------------
+
+This section aims to describe the creation of Customer Variants using Helium.  
+
+
+The variant team should configure their variant using the following template:
+ 
+   variation (configurable location)
+      operator_xx_51
+         data
+            ibys
+            cenreps
+            rscs
+         variation
+            rss rebuilt using binary variation (like spp psw folder)
+         config
+            hlm.bat
+            build.xml (mini-configuration referencing product release one)
+            customer_rom_config.xml (external configuration to define the variant image)
+
+
+
+Keep in mind that with MultiROFS nothing will get exported by image creation, ibys and content will be directly
+referenced from the variant location: data directory and variant root will be added to the ROM creation include path.
+           
+
+You can configure your variant build environment with the following template files:
+
+
+* build.xml:
+
+.. code-block:: xml
+
+   <?xml version="1.0" encoding="utf-8" ?> 
+   <project name="customer_variants" basedir="/mc/mc_build/mc_5132_build/all">
+       <dirname property="customer_variants.basedir" file="${ant.file.customer_variants}" />
+       <!-- Product you are generating the variant for -->
+       <property name="product.list" value="PRODUCT" /> 
+       <!-- Specifying the variant config that should be used. -->
+       <property name="PRODUCT.customer.roms.config" location="${customer_variants.basedir}/customer_rom_config.xml" />
+       <!-- Specifying our rom image creation group: should be always the same -->
+       <property name="customer.makefile.target" value="vt_customer_variants" /> 
+       <!-- Referencing the build configuration -->
+       <import file="/mc/mc_build/mc_5132_build/all/build.xml" /> 
+   </project>
+ 
+ 
+* customer_rom_config.xml:
+
+.. code-block:: xml
+
+   <?xml version="1.0" encoding="UTF-8" ?> 
+   <config name="vt_customer_variants" abstract="true">
+      <set name="customer.type" value="operatorcountry" /> 
+      <set name="variation.dir" value="\variation" /> 
+      <set name="image.type" value="prd" /> 
+   
+      <!--  Your variant config --> 
+      <config type="customer">
+         <set name="customer.id" value="151" /> 
+         <set name="customer.revision" value="2" /> 
+         <set name="description" value="" /> 
+         <set name="compatible.languagepack" value="03" /> 
+      </config>
+   </config>
+   
+
+What is happening when generating the Customer Variant?
+The customer file will be included by the platform configuration and be included by the XInclude mechanism.
+This currently means that the platform has to explicitly add the include information. But we will try to remove that dependence in the future.
+
+UDA creation 
+-------------
+
+The main concept of this section is to explain how the Variant Team should use Helium to handle UDA creation.
+First of all the UDA environment is split in 2 different parts: the content and the config::
+
+   + uda_delivery      
+      + uda_content
+         + common
+            - content.zip
+         + application1
+            - file1.zip
+            - file2.zip
+         + application2
+            - file.zip
+
+      + config
+         - hlm.bat
+         - build.xml
+         - uda_rom_config.xml (standalone configuration)
+
+     
+* The content must contain subdirectories that represents different kind of features which store them as zip files. 
+  All the zip files under that folder will be unzipped when generating the UDA.
+* The configuration is a standalone Helium configuration that would be used to configure the UDA creation.
+
+
+Example of configuration:
+
+* build.xml
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8" ?> 
+    <project basedir=".">
+    <property environment="env" /> 
+    <property name="product.list" value="PRODUCT" /> 
+    <property name="build.drive" value="Z:" /> 
+    <property name="rombuild.config.file" location="uda_rom_config.xml" /> 
+    <property name="product.name" value="PRODUCT" /> 
+    <property name="major.version" value="0" /> 
+    <property name="minor.version" value="0" /> 
+    <import file="${helium.dir}/helium.ant.xml" /> 
+  </project>
+  
+* uda_rom_config.xml
+
+.. code-block:: xml
+ 
+   <?xml version="1.0" encoding="UTF-8" ?> 
+   <build xmlns:xi="http://www.w3.org/2001/XInclude">
+   <config name="PRODUCT" abstract="true">
+      <set name="ui.platform" value="mc5132" /> 
+      <set name="version.product.name" value="N00" /> 
+      <set name="rom.output.dir" value="${build.output.dir}" /> 
+      <set name="uda.output.dir" value="${rom.output.dir}${uda.image.path}" /> 
+      
+      <!--  Template relative paths  --> 
+      <set name="uda.image.path" value="release_flash_images/${image.type}/user_data/${image.type}/${uda.id}_${description}" /> 
+
+      <!--  Template names  --> 
+      <set name="uda.image.name" value="${rombuild.id}_${uda.id}.${uda.revision}_${image.type}" /> 
+
+      <!--  Template publish paths (used for flash config files generation) --> 
+      <set name="uda.publish.dir" value="${rom.publish.dir}${uda.image.path}" /> 
+      <set name="uda.template" value="${version.product.name} (${uda.id})" /> 
+      
+      <!--  Do not build target in parallel by default --> 
+      <set name="build.parallel" value="false" /> 
+      <set name="image.type" value="prd" /> 
+      <!--  Driving iMaker configuration generation --> 
+      <set name="output.makefile.filename" value="${rombuild.makefile.name}" /> 
+      <set name="main.makefile.template" value="${helium.dir}\tools\rombuild\generic_templates\main.mk" /> 
+      <set name="uda.makefile.template" value="${helium.dir}\tools\rombuild\generic_templates\vt_uda.mk" /> 
+      <set name="winimage.tool" value="${build.drive}/winimage.exe" /> 
+      <set name="uda.content.dir" value="/uda_PRODUCT/content" /> 
+      
+      <!-- Group of UDA to be built -->
+      <config name="uda_roms" abstract="true">
+      
+         <!-- Defining a UDA -->
+         <config type="uda">
+            <set name="uda.id" value="111" /> 
+            <set name="uda.revision" value="0" /> 
+            <set name="uda.content" value="common,snakes" /> 
+         </config>
+
+
+      </config>
+   </config>
+   </build>
+   
+.. csv-table:: Property descriptions
+   :header: "Property", "Description"
+
+   "``uda.id``", "Defines the uda identification number"
+   "``uda.revision``", "Defines the revision number for the version string"
+   "``uda.content``", "Comma separated list that defines the UDA content"
+   "``uda.content.dir``", "Location of the content subdirectories"
+   "``uda.template``", "Template that defines the how to generate the version string"
+   "``uda.image.path``", "Template that defines where to generated the UDA"
+   "``uda.image.name``", "Template that defines how to name the UDA"
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/user-graph.dot.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,157 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+strict digraph G {
+    compound=true;
+    subgraph cluster_0 {
+        node [style=filled];
+        <#if !(ant?keys?seq_contains("sf"))>
+            Ant -> "Quick Guide"[dir=none];
+            "Quick Guide" -> "Setting up Helium at Nokia"[dir=none];
+            "Setting up Helium at Nokia" -> "Running Helium"[dir=none];
+            "Running Helium" -> "Feature List"[dir=none];
+            "Feature List" -> Diamonds[dir=none];
+            Diamonds -> "Helium Wiki"[dir=none];
+            "Helium Wiki" -> "Helium Forum"[dir=none];
+        <#else>
+            Ant -> "Quick Guide"[dir=none];
+            "Quick Guide" -> "Setting up Helium"[dir=none];
+            "Setting up Helium" -> "Running Helium"[dir=none];
+            "Running Helium" -> "Feature List"[dir=none];
+        </#if>
+        label = "Beginners";
+    }
+
+    subgraph cluster_1 {
+        node [style=filled];
+        <#if !(ant?keys?seq_contains("sf"))>
+            "Configure Helium" -> IDO[dir=none];
+            "Configure Helium" -> TeamCI[dir=none];
+            "Configure Helium" -> MCL[dir=none];
+        <#else>
+            "Configure Helium";
+        </#if>
+        label = "Intermediate";
+    }
+    
+    subgraph cluster_2 {
+        node [style=filled];
+        <#if !(ant?keys?seq_contains("sf"))>
+            "ROM Image" -> "Variant Creation"[dir=none];
+            "Variant Creation" -> "Helium Stages"[dir=none];
+            "Helium Stages" -> "Helium Nokia Stages"[dir=none];
+            "Helium Nokia Stages" -> "SDK Creation"[dir=none];
+        <#else>
+            "ROM Image" -> "Variant Creation"[dir=none];
+            "Variant Creation" -> "Helium Stages"[dir=none];
+        </#if>
+        label = "Advanced";
+    }
+    
+
+    subgraph cluster_4 {
+        node [style=filled];
+        <#if !(ant?keys?seq_contains("sf"))>
+            "Helium Developer Guide" -> "Coding Convention"[dir=none];
+            "Coding Convention" -> "Helium Test Plan"[dir=none];
+            "Helium Test Plan" -> Python[dir=none];
+            Python -> Java[dir=none];
+            Java -> FMPP[dir=none];
+            FMPP -> "DOS Scripting"[dir=none];
+        <#else>
+            "Helium Developer Guide" -> "Coding Convention"[dir=none];
+            "Coding Convention" -> Python[dir=none];
+            Python -> Java[dir=none];
+            Java -> FMPP[dir=none];
+            FMPP -> "DOS Scripting"[dir=none];
+        </#if>
+        label = "Helium Developer";
+    }
+    
+    <#if !(ant?keys?seq_contains("sf"))>
+        subgraph cluster_2_1{
+            node [style=filled, rankdir=LR];
+            EBS [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/EBS"];
+            Raptor [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/Raptor"];
+            "Electric Cloud" [fontcolor=navyblue,fontsize=12,shape=box,href="http://www.connecting.nokia.com/nmp/tpm/nmpglosw.nsf/document/ES21T6K9FM4?OpenDocument"];
+            ATS [fontcolor=navyblue,fontsize=12,shape=box,href="manual/stages.html#stage-ats3-stif-and-eunit"];
+            BlackTusk [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/blacktusk/howto-setup-blacktusk-with-helium.html"];
+    }
+    </#if>
+    
+    subgraph cluster_4_1 {
+        node [style=filled, rankdir=LR];
+        ANTUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/antlibs/antunit/"];
+        NOSE [fontcolor=navyblue,fontsize=12,shape=box,href="http://ivory.idyll.org/articles/nose-intro.html"];
+        JUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://helium.nmp.nokia.com/trac/wiki/JUnit"];
+    }
+    
+    Start -> Ant [lhead=cluster_0];
+    Start -> "Configure Helium" [lhead=cluster_1];
+    Start -> "ROM Image" [lhead=cluster_2];
+    Start -> "Helium Developer Guide" [lhead=cluster_4];
+    <#if !(ant?keys?seq_contains("sf"))>
+        "SDK Creation" -> "Electric Cloud"[dir=none, lhead=cluster_2_1, ltail=cluster_2];
+    </#if>
+    "DOS Scripting" -> NOSE[dir=none, lhead=cluster_4_1, ltail=cluster_4];
+   
+    
+    Start [fontcolor=navyblue,fontsize=12,style=filled,href="introduction.html"];
+    
+    Ant [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/manual/"];
+    "Quick Guide" [fontcolor=navyblue,fontsize=12,shape=box,href="quick_start_guide.html"];
+    "Running Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/running.html"];
+    
+    <#if (ant?keys?seq_contains("sf"))>
+        "Setting up Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="sf.html"];
+    </#if>
+    
+    "Feature List" [fontcolor=navyblue,fontsize=12,shape=box,href="feature_list.html"];
+    "Configure Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/configuring.html"];
+    "Helium Stages" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/stages.html"];
+    
+
+    "ROM Image" [fontcolor=navyblue,fontsize=12,shape=box,href="tutorials/rom_image.html"];
+    "Variant Creation" [fontcolor=navyblue,fontsize=12,shape=box,href="tutorials/variant.html"];
+    
+    <#if !(ant?keys?seq_contains("sf"))>
+        "Setting up Helium at Nokia" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/nokia.html"];
+        "Helium Nokia Stages" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/nokiastages.html"];
+        Diamonds [fontcolor=navyblue,fontsize=12,shape=box,href="http://diamonds.nmp.nokia.com/diamonds/"];
+        "Helium Wiki" [fontcolor=navyblue,fontsize=12,shape=box,href="http://delivery.nmp.nokia.com/trac/helium/wiki"];
+        "Helium Forum" [fontcolor=navyblue,fontsize=12,shape=box,href="http://forums.connecting.nokia.com/forums/forum.jspa?forumID=262"];
+        MCL [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/S60_Software_Asset_Management/Organization/Delivery_Services/Howto_build_DFS70.91.91_/_S60.MCL_with_Helium"];
+        "SDK Creation" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/rndsdk_user_manual.html"];
+        IDO [fontcolor=navyblue,fontsize=12,shape=box,href="ido/index.html"];
+        TeamCI [fontcolor=navyblue,fontsize=12,shape=box,href="teamci/index.html"];
+        "Helium Test Plan" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/testing.html"];
+    </#if>
+      
+    "Helium Developer Guide" [fontcolor=navyblue,fontsize=12,shape=box,href="developer_guide.html"];
+    "Coding Convention" [fontcolor=navyblue,fontsize=12,shape=box,href="coding_conventions.html"];
+    Python [fontcolor=navyblue,fontsize=12,shape=box,href="http://www.python.org/"];
+    Java [fontcolor=navyblue,fontsize=12,shape=box,href="http://java.sun.com/j2se/"];
+    FMPP [fontcolor=navyblue,fontsize=12,shape=box,href="http://fmpp.sourceforge.net/"];
+    "DOS Scripting" [fontcolor=navyblue,fontsize=12,shape=box,href="http://en.wikipedia.org/wiki/Batch_script"];
+    ANTUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/antlibs/antunit/"];
+    NOSE [fontcolor=navyblue,fontsize=12,shape=box,href="http://ivory.idyll.org/articles/nose-intro.html"];
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/user-graph.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+###################
+Users' Flow Diagram
+###################
+
+.. raw:: html
+
+   <img src="images/user-graph.dot.png" alt="Flow Diagram" usemap="#flowdiagram" style="border-style: none"/>
+   <map name="flowdiagram" id="flowdiagram">
+
+.. raw:: html
+   :file: user-graph.dot.cmap
+
+.. raw:: html
+
+   </map>
\ No newline at end of file
Binary file buildframework/helium/external/antlibs/ant-antunit-1.1.jar has changed
Binary file buildframework/helium/external/antlibs/ant-contrib-1.0b2.jar has changed
Binary file buildframework/helium/external/antlibs/antform.jar has changed
Binary file buildframework/helium/external/antlibs/asm-2.2.1.jar has changed
Binary file buildframework/helium/external/antlibs/bliki-3.0.7.jar has changed
Binary file buildframework/helium/external/antlibs/bsf-2.4.0.jar has changed
Binary file buildframework/helium/external/antlibs/bsh-2.1b0-1.0.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/antlibs/com/kirkk/analyzer/framework/Filter.properties	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+filter.packages = javax.*;java.*;org.omg*;org.ietf.jgss*;org.w3c.dom*;org.xml.sax*;sun.*;sunw.*;com.sun.*
+filter.jars=
\ No newline at end of file
Binary file buildframework/helium/external/antlibs/commons-codec-1.3.jar has changed
Binary file buildframework/helium/external/antlibs/commons-collections-3.2.jar has changed
Binary file buildframework/helium/external/antlibs/commons-configuration-1.5.jar has changed
Binary file buildframework/helium/external/antlibs/commons-discovery-0.2.jar has changed
Binary file buildframework/helium/external/antlibs/commons-httpclient-3.1.jar has changed
Binary file buildframework/helium/external/antlibs/commons-io-1.4.jar has changed
Binary file buildframework/helium/external/antlibs/commons-jxpath-1.2.jar has changed
Binary file buildframework/helium/external/antlibs/commons-lang-2.4.jar has changed
Binary file buildframework/helium/external/antlibs/commons-logging-1.1.1.jar has changed
Binary file buildframework/helium/external/antlibs/dom4j-1.6.1.jar has changed
Binary file buildframework/helium/external/antlibs/emma.jar has changed
Binary file buildframework/helium/external/antlibs/emma_ant.jar has changed
Binary file buildframework/helium/external/antlibs/fmpp-0.9.13.jar has changed
Binary file buildframework/helium/external/antlibs/freemarker-2.3.13.jar has changed
Binary file buildframework/helium/external/antlibs/ivy-helium-2.0.0-beta2.jar has changed
Binary file buildframework/helium/external/antlibs/jakarta-oro-2.0.8.jar has changed
Binary file buildframework/helium/external/antlibs/jaranalyzer-1.2.jar has changed
Binary file buildframework/helium/external/antlibs/jaxen-1.1.1.jar has changed
Binary file buildframework/helium/external/antlibs/jsch-0.1.39.jar has changed
Binary file buildframework/helium/external/antlibs/junit-4.5.jar has changed
Binary file buildframework/helium/external/antlibs/jython-2.5.jar has changed
Binary file buildframework/helium/external/antlibs/log4j-1.2.9.jar has changed
Binary file buildframework/helium/external/antlibs/mail-1.4.1.jar has changed
Binary file buildframework/helium/external/antlibs/maven-scm-api-1.1.jar has changed
Binary file buildframework/helium/external/antlibs/maven-scm-provider-hg-1.1.jar has changed
Binary file buildframework/helium/external/antlibs/plexus-utils-1.5.6.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/antlibs/readme.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+
+antdoclet.jar: 1.1
\ No newline at end of file
Binary file buildframework/helium/external/antlibs/serializer.jar has changed
Binary file buildframework/helium/external/antlibs/sqlitejdbc-v053.jar has changed
Binary file buildframework/helium/external/antlibs/velocity-dep-1.3.1.jar has changed
Binary file buildframework/helium/external/antlibs/wsdl4j-1.5.1.jar has changed
Binary file buildframework/helium/external/antlibs/xalan.jar has changed
Binary file buildframework/helium/external/antlibs/xia-1.0.jar has changed
Binary file buildframework/helium/external/antlibs/xincluder.jar has changed
Binary file buildframework/helium/external/antlibs/xmltask-v1.15.1.jar has changed
Binary file buildframework/helium/external/antlibs/xmlunit-1.2.jar has changed
Binary file buildframework/helium/external/cc-customizations/antlibs/bsf-2.4.0.jar has changed
Binary file buildframework/helium/external/cc-customizations/antlibs/bsh-2.1b0-1.0.jar has changed
Binary file buildframework/helium/external/cc-customizations/antlibs/commons-logging-1.1.1.jar has changed
Binary file buildframework/helium/external/cc-customizations/antlibs/junit-4.5.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/bin/HELIUM-README.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+Cruise control Helium Integration
+=================================
+
+Cruise Control version: 2.8.2    		
+HCC version: 1
+
+Helium additions
+----------------
+cruisecontrol-bin-2.8.2\HELIUM-README.txt
+cruisecontrol-bin-2.8.2\cruisecontrol.bat
+cruisecontrol-bin-2.8.2\distribution.policy.S60
+cruisecontrol-bin-2.8.2\etc\distribution.policy.S60
+cruisecontrol-bin-2.8.2\etc\jetty.xml
+cruisecontrol-bin-2.8.2\helium-dashboard-config.xml
+cruisecontrol-bin-2.8.2\lib\distribution.policy.S60
+cruisecontrol-bin-2.8.2\lib\nokia_helium_cc.jar
+
+
+    		
+How to use CC Helium customizations
+-----------------------------------
+
+In config.xml:
+----8<----8<----8<----8<----8<----8<----8<----
+<cruisecontrol>
+	<!-- Helium customization. -->
+	<plugin name="xmlmodificationset" classname="com.nokia.cruisecontrol.sourcecontrol.XMLModificationSet"/>
+	<plugin name="hlmmodificationset" classname="com.nokia.cruisecontrol.sourcecontrol.HLMSynergy"/>
+	...
+----8<----8<----8<----8<----8<----8<----8<----
+
+How to use Dashboard Helium customizations
+------------------------------------------
+
+To enable the Helium build summary widget please use the Helium specific
+dashboard configuration file:
+set CCDIR=<PATH_TO_CC_HOME>
+<HELIUM_CCC_DIR>\cruisecontrol.bat
+    		
+How to configure the Ant builder
+--------------------------------
+
+To prevent log.xml missing exception while running Helium please configure the ant builder this way:
+<ant .... uselogger="false" showProgress="false"... >
+   <!-- Configure the XMLLogger -->
+   <listener classname="org.apache.tools.ant.XmlLogger"/>
+   <property name="XmlLogger.file" value="${configuration.dir}/log.xml" />
+</ant>
+
+_______________
+The Helium Team
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/bin/cruisecontrol.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+set HELIUMCCEXT_HOME=%~dp0
+
+REM Detecting CruiseControl
+if not defined CCDIR (
+if exist "%HELIUMCCEXT_HOME%..\..\cruisecontrol\cruisecontrol.bat" (
+set CCDIR=%HELIUMCCEXT_HOME%..\..\cruisecontrol
+) else (
+echo CCDIR is not defined
+goto :end
+)
+)
+
+if not defined DASHBOARD_CONFIG set DASHBOARD_CONFIG=%HELIUMCCEXT_HOME%helium-dashboard-config.xml
+set CC_OPTS=%CC_OPTS%  -Ddashboard.config=%DASHBOARD_CONFIG% -Dhelium.cc.ext.home=%HELIUMCCEXT_HOME%
+set CC_ARGS=-lib %HELIUMCCEXT_HOME%lib -webapppath %CCDIR%/webapps/cruisecontrol -dashboard %CCDIR%/webapps/dashboard -jettyxml %HELIUMCCEXT_HOME%etc/jetty.xml %CC_ARGS%
+call %CCDIR%\cruisecontrol.bat %CC_ARGS% %*
+:end
+endlocal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/bin/etc/jetty.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,240 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
+<!--
+  CruiseControl, a Continuous Integration Toolkit
+  Copyright (c) 2001, ThoughtWorks, Inc.
+  200 E. Randolph, 25th Floor
+  Chicago, IL 60601 USA
+  All rights reserved.
+ 
+  Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+        names of its contributors may be used to endorse or promote
+        products derived from this software without specific prior
+        written permission.
+ 
+  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 REGENTS 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.
+
+============================================================================ 
+Name        : helium-dashboard-config.xml
+Part of     : Helium 
+
+Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+============================================================================ 
+-->
+<Configure id="Server" class="org.mortbay.jetty.Server">
+
+    <!-- =========================================================== -->
+    <!-- Server Thread Pool                                          -->
+    <!-- =========================================================== -->
+    <Set name="ThreadPool">
+
+      <New class="org.mortbay.thread.QueuedThreadPool">
+        <Set name="minThreads">10</Set>
+        <Set name="maxThreads">200</Set>
+        <Set name="lowThreads">20</Set>
+        <Set name="SpawnOrShrinkAt">2</Set>
+      </New>
+
+      <!-- Optional Java 5 bounded threadpool with job queue 
+      <New class="org.mortbay.thread.concurrent.ThreadPool">
+        <Set name="corePoolSize">50</Set>
+        <Set name="maximumPoolSize">50</Set>
+      </New>
+      -->
+    </Set>
+
+
+
+    <!-- =========================================================== -->
+    <!-- Set connectors                                              -->
+    <!-- =========================================================== -->
+    <!-- One of each type!                                           -->
+    <!-- =========================================================== -->
+
+    <!-- Use this connector for many frequently idle connections
+         and for threadless continuations.
+    -->    
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.nio.SelectChannelConnector">
+            <Set name="host"><SystemProperty name="jetty.host" /></Set>
+            <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
+            <Set name="maxIdleTime">30000</Set>
+            <Set name="Acceptors">2</Set>
+            <Set name="statsOn">false</Set>
+            <Set name="confidentialPort">8443</Set>
+	    <Set name="lowResourcesConnections">5000</Set>
+	    <Set name="lowResourcesMaxIdleTime">5000</Set>
+          </New>
+      </Arg>
+    </Call>
+
+    <!-- Use this connector if NIO is not available. 
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.bio.SocketConnector">
+            <Set name="port">8081</Set>
+            <Set name="maxIdleTime">50000</Set>
+            <Set name="lowResourceMaxIdleTime">1500</Set>
+          </New>
+      </Arg>
+    </Call>
+    -->
+
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+    <!-- To add a HTTPS SSL listener                                     -->
+    <!-- see jetty-ssl.xml to add an ssl connector. use                  -->
+    <!-- java -jar start.jar etc/jetty.xml etc/jetty-ssl.xml             -->
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+    
+    <!-- =========================================================== -->
+    <!-- Set up global session ID manager                            -->
+    <!-- =========================================================== -->
+    <!--
+    <Set name="sessionIdManager">
+      <New class="org.mortbay.jetty.servlet.HashSessionIdManager">
+        <Set name="workerName">node1</Set>
+      </New>
+    </Set>
+    -->
+
+    <!-- =========================================================== -->
+    <!-- Set handler Collection Structure                            --> 
+    <!-- =========================================================== -->
+    <Set name="handler">
+      <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
+        <Set name="handlers">
+         <Array type="org.mortbay.jetty.Handler">
+           <Item>
+             <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
+           </Item>
+           <Item>
+             <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
+           </Item>
+           <Item>
+             <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
+           </Item>
+         </Array>
+        </Set>
+      </New>
+    </Set>
+    
+    <!-- =========================================================== -->
+    <!-- Configure the context deployer                              -->
+    <!-- A context deployer will deploy contexts described in        -->
+    <!-- configuration files discovered in a directory.              -->
+    <!-- The configuration directory can be scanned for hot          -->
+    <!-- deployments at the configured scanInterval.                 -->
+    <!--                                                             -->
+    <!-- This deployer is configured to deploy contexts configured   -->
+    <!-- in the $JETTY_HOME/contexts directory                       -->
+    <!--                                                             -->
+    <!-- =========================================================== -->
+    <Call name="addLifeCycle">
+      <Arg>
+        <New class="org.mortbay.jetty.deployer.ContextDeployer">
+          <Set name="contexts"><Ref id="Contexts"/></Set>
+          <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
+          <Set name="scanInterval">1</Set>
+        </New>
+      </Arg>
+    </Call>
+
+    <!-- =========================================================== -->
+    <!-- Configure the webapp deployer.                              -->
+    <!-- A webapp  deployer will deploy standard webapps discovered  -->
+    <!-- in a directory at startup, without the need for additional  -->
+    <!-- configuration files.    It does not support hot deploy or   -->
+    <!-- non standard contexts (see ContextDeployer above).          -->
+    <!--                                                             -->
+    <!-- This deployer is configured to deploy webapps from the      -->
+    <!-- $JETTY_HOME/webapps directory                               -->
+    <!--                                                             -->
+    <!-- Normally only one type of deployer need be used.            -->
+    <!--                                                             -->
+    <!-- =========================================================== -->
+    <Call name="addLifeCycle">
+      <Arg>
+        <New class="com.nokia.jetty.deployer.WebAppDeployer">
+          <Set name="contexts"><Ref id="Contexts"/></Set>
+          <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
+          <Set name="parentLoaderPriority">false</Set>
+          <Set name="extract">true</Set>
+          <Set name="allowDuplicates">false</Set>
+          <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+          <Set name="extraClasspath"><SystemProperty name="helium.cc.ext.home" default="."/>/lib/nokia_helium_cc.jar</Set>
+        </New>
+      </Arg>
+    </Call>
+
+    <!-- =========================================================== -->
+    <!-- Configure Authentication Realms                             -->
+    <!-- Realms may be configured for the entire server here, or     -->
+    <!-- they can be configured for a specific web app in a context  -->
+    <!-- configuration (see $(jetty.home)/contexts/test.xml for an   -->
+    <!-- example).                                                   -->
+    <!-- =========================================================== -->
+    <Set name="UserRealms">
+      <Array type="org.mortbay.jetty.security.UserRealm">
+        <Item>
+          <New class="org.mortbay.jetty.security.HashUserRealm">
+            <Set name="name">Test Realm</Set>
+            <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
+            <Set name="refreshInterval">0</Set>
+          </New>
+        </Item>
+      </Array>
+    </Set>
+
+    <!-- =========================================================== -->
+    <!-- Configure Request Log                                       -->
+    <!-- Request logs  may be configured for the entire server here, -->
+    <!-- or they can be configured for a specific web app in a       -->
+    <!-- contexts configuration (see $(jetty.home)/contexts/test.xml -->
+    <!-- for an example).                                            -->
+    <!-- =========================================================== -->
+    <Ref id="RequestLog">
+      <Set name="requestLog">
+        <New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
+          <Set name="filename"><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Set>
+          <Set name="filenameDateFormat">yyyy_MM_dd</Set>
+          <Set name="retainDays">90</Set>
+          <Set name="append">true</Set>
+          <Set name="extended">true</Set>
+          <Set name="logCookies">false</Set>
+          <Set name="LogTimeZone">GMT</Set>
+        </New>
+      </Set>
+    </Ref>
+
+    <!-- =========================================================== -->
+    <!-- extra options                                               -->
+    <!-- =========================================================== -->
+    <Set name="stopAtShutdown">true</Set>
+    <Set name="sendServerVersion">true</Set>
+    <Set name="sendDateHeader">true</Set>
+    <Set name="gracefulShutdown">1000</Set>
+
+</Configure>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/bin/helium-dashboard-config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/********************************************************************************
+ * CruiseControl, a Continuous Integration Toolkit
+ * Copyright (c) 2007, ThoughtWorks, Inc.
+ * 200 E. Randolph, 25th Floor
+ * Chicago, IL 60601 USA
+ * All rights reserved.
+ *
+ * Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * 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 REGENTS 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.
+ ********************************************************************************/
+ -->
+ <!--
+============================================================================ 
+Name        : helium-dashboard-config.xml
+Part of     : Helium 
+
+Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+============================================================================
+-->
+ <dashboard>
+ 	<buildloop
+	    logsdir="logs"
+      	    artifactsdir="artifacts" />
+	<features allowforcebuild="true"/>
+	<!--<trackingtool projectname="" baseurl="" keywords=""/>-->
+ 	<subtabs>
+ 		<!--<subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.AntOutputWidget" />
+	    <subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidget" />-->
+	    <subtab class="com.nokia.cruisecontrol.dashboard.widgets.HeliumSummary" />
+	</subtabs>
+</dashboard>
+ 
Binary file buildframework/helium/external/cc-customizations/bin/lib/nokia_helium_cc.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set PATH=%JAVA_HOME%\bin;%PATH%
+ant -lib antlibs %*
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-ccc-build" default="build"> 
+
+	<property name="build.temp.dir" location="${ant.file.helium-ccc-build}/../../build" />
+	<property name="bin.dir" location="${ant.file.helium-ccc-build}/../bin" />
+	<property name="cc.version" value="2.8.2" />
+	<property name="helium.custom.version" value="1" />
+
+
+	<property name="cc.dir.name" value="cruisecontrol-bin-${cc.version}"/>
+	<property name="cc.root.dir" location="${build.temp.dir}/${cc.dir.name}" />
+	<property name="cc.overlay.dir" location="${build.temp.dir}/delta/${cc.dir.name}" />
+	<property name="cc.zip" location="${ant.file.helium-ccc-build}/../../official/${cc.dir.name}.zip" />
+
+	<fileset id="ref.overlay" dir="${cc.overlay.dir}/..">
+		<include name="**"/>
+		<exclude name="**/.svn/**"/>
+	</fileset>
+
+	
+	<target name="clean" description="Cleanup" unless="skip.clean">
+		<delete dir="${build.temp.dir}"/>
+	</target>
+	
+	<target name="create-output-dirs">
+    	<mkdir dir="${build.temp.dir}"/>
+    	<mkdir dir="${build.temp.dir}/classes"/>
+    	<mkdir dir="${cc.overlay.dir}/lib"/>		
+	</target>
+
+	<target name="check-get-cc">
+		<echo>${cc.zip}</echo>
+		<available file="${cc.zip}" property="cc.zip.present"/>
+	</target>
+
+	<target name="get-cc" depends="check-get-cc" unless="cc.zip.present">
+		<mkdir dir="${cc.zip}/.."/>
+		<get src="http://kent.dl.sourceforge.net/sourceforge/cruisecontrol/${cc.dir.name}.zip" dest="${cc.zip}" />
+	</target>
+	
+	<target name="unzip-cc" depends="create-output-dirs,get-cc">
+		<mkdir dir="${cc.zip}/.."/>
+		<unzip src="${cc.zip}" dest="${build.temp.dir}">
+			<patternset>
+				<include name="*/lib/**"/>
+				<include name="*/webapps/dashboard/WEB-INF/classes/**"/>
+			</patternset>
+		</unzip>
+	</target>
+	
+    <!-- Building CruiseControl customization. -->
+    <target name="build" description="Builds CruiseControl specific Helium extensions" depends="unzip-cc">
+        <javac srcdir="${ant.file.helium-ccc-build}/../src" destdir="${build.temp.dir}/classes" debug="true" source="1.5" target="1.5">
+            <classpath>
+                <fileset dir="${cc.root.dir}/lib" includes="*.jar"/>
+                <pathelement path="${cc.root.dir}/webapps/dashboard/WEB-INF/classes"/>
+            </classpath>
+            <include name="**"/>
+        </javac>
+        <jar destfile="${cc.overlay.dir}/lib/nokia_helium_cc.jar">
+	    	<fileset dir="${build.temp.dir}/classes">
+				<include name="**/*.class"/>
+        	</fileset>
+        </jar>
+    	<copy todir="${cc.overlay.dir}">
+    		<fileset dir="${ant.file.helium-ccc-build}/../overlay">
+    			<include name="**"/>
+    			<exclude name="**/.svn/**"/>
+    		</fileset>
+    	</copy>
+    	
+    	<echo file="${cc.overlay.dir}/HELIUM-README.txt" message=""/>
+    	<script language="beanshell">
+files = project.getReference("ref.overlay");
+String result = "";
+for(i = files.iterator();i.hasNext();) {
+	file = i.next();
+    String filename = file.getFile().getAbsolutePath().substring(file.getBaseDir().getAbsolutePath().length() + 1);		
+    result += filename + "\n";
+}
+project.setProperty("overlay.content", result);
+  	    </script>
+    	<copy file="${ant.file.helium-ccc-build}/../templates/HELIUM-README.txt" tofile="${cc.overlay.dir}/HELIUM-README.txt" overwrite="true">
+			<filterchain>
+				<expandproperties/>
+			</filterchain>
+    	</copy>
+    </target>
+	
+	<!-- Packaging the delivery -->
+	<target name="create-release" depends="build">
+		<copy todir="${bin.dir}">
+			<fileset dir="${cc.overlay.dir}" includes="**"/>
+		</copy>
+	</target>
+	
+		
+	<target name="all" depends="clean,build"/>
+	
+	<target name="junit" depends="unzip-cc">
+        <delete dir="${build.temp.dir}/junit_classes" failonerror="false"/>
+        <mkdir dir="${build.temp.dir}/junit_classes" />
+		<path id="cc.classpath">
+			<fileset dir="${cc.root.dir}/lib" includes="*.jar"/>
+			<pathelement path="${cc.root.dir}/webapps/dashboard/WEB-INF/classes"/>
+			<fileset dir="${ant.file.helium-ccc-build}/../bin/lib" includes="*.jar"/>
+		</path>
+
+		<javac srcdir="${ant.file.helium-ccc-build}/../tests/src" destdir="${build.temp.dir}/junit_classes" debug="true" source="1.5" target="1.5">
+            <classpath refid="cc.classpath" />
+            <include name="**/*.java" />
+        </javac>
+        
+        <path id="build.classpath">
+            <pathelement location="${build.temp.dir}/junit_classes" />
+        </path>
+        <junit fork="yes" printsummary="yes" haltonfailure="no" showoutput="yes">
+            <formatter type="brief" usefile="false"/>
+            <classpath refid="build.classpath" />
+            <classpath refid="cc.classpath" />
+            
+            <batchtest fork="yes" todir="${build.temp.dir}/junit_test">
+                <fileset dir="${ant.file.helium-ccc-build}/../tests/src">
+                    <include name="**/*Test*.java"/>
+                </fileset>
+            </batchtest>
+        </junit>
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/overlay/cruisecontrol.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+set HELIUMCCEXT_HOME=%~dp0
+
+REM Detecting CruiseControl
+if not defined CCDIR (
+if exist "%HELIUMCCEXT_HOME%..\..\cruisecontrol\cruisecontrol.bat" (
+set CCDIR=%HELIUMCCEXT_HOME%..\..\cruisecontrol
+) else (
+echo CCDIR is not defined
+goto :end
+)
+)
+
+if not defined DASHBOARD_CONFIG set DASHBOARD_CONFIG=%HELIUMCCEXT_HOME%helium-dashboard-config.xml
+set CC_OPTS=%CC_OPTS%  -Ddashboard.config=%DASHBOARD_CONFIG% -Dhelium.cc.ext.home=%HELIUMCCEXT_HOME%
+set CC_ARGS=-lib %HELIUMCCEXT_HOME%lib -webapppath %CCDIR%/webapps/cruisecontrol -dashboard %CCDIR%/webapps/dashboard -jettyxml %HELIUMCCEXT_HOME%etc/jetty.xml %CC_ARGS%
+call %CCDIR%\cruisecontrol.bat %CC_ARGS% %*
+:end
+endlocal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/overlay/etc/jetty.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,240 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
+<!--
+  CruiseControl, a Continuous Integration Toolkit
+  Copyright (c) 2001, ThoughtWorks, Inc.
+  200 E. Randolph, 25th Floor
+  Chicago, IL 60601 USA
+  All rights reserved.
+ 
+  Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+        names of its contributors may be used to endorse or promote
+        products derived from this software without specific prior
+        written permission.
+ 
+  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 REGENTS 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.
+
+============================================================================ 
+Name        : helium-dashboard-config.xml
+Part of     : Helium 
+
+Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+============================================================================ 
+-->
+<Configure id="Server" class="org.mortbay.jetty.Server">
+
+    <!-- =========================================================== -->
+    <!-- Server Thread Pool                                          -->
+    <!-- =========================================================== -->
+    <Set name="ThreadPool">
+
+      <New class="org.mortbay.thread.QueuedThreadPool">
+        <Set name="minThreads">10</Set>
+        <Set name="maxThreads">200</Set>
+        <Set name="lowThreads">20</Set>
+        <Set name="SpawnOrShrinkAt">2</Set>
+      </New>
+
+      <!-- Optional Java 5 bounded threadpool with job queue 
+      <New class="org.mortbay.thread.concurrent.ThreadPool">
+        <Set name="corePoolSize">50</Set>
+        <Set name="maximumPoolSize">50</Set>
+      </New>
+      -->
+    </Set>
+
+
+
+    <!-- =========================================================== -->
+    <!-- Set connectors                                              -->
+    <!-- =========================================================== -->
+    <!-- One of each type!                                           -->
+    <!-- =========================================================== -->
+
+    <!-- Use this connector for many frequently idle connections
+         and for threadless continuations.
+    -->    
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.nio.SelectChannelConnector">
+            <Set name="host"><SystemProperty name="jetty.host" /></Set>
+            <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
+            <Set name="maxIdleTime">30000</Set>
+            <Set name="Acceptors">2</Set>
+            <Set name="statsOn">false</Set>
+            <Set name="confidentialPort">8443</Set>
+	    <Set name="lowResourcesConnections">5000</Set>
+	    <Set name="lowResourcesMaxIdleTime">5000</Set>
+          </New>
+      </Arg>
+    </Call>
+
+    <!-- Use this connector if NIO is not available. 
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.bio.SocketConnector">
+            <Set name="port">8081</Set>
+            <Set name="maxIdleTime">50000</Set>
+            <Set name="lowResourceMaxIdleTime">1500</Set>
+          </New>
+      </Arg>
+    </Call>
+    -->
+
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+    <!-- To add a HTTPS SSL listener                                     -->
+    <!-- see jetty-ssl.xml to add an ssl connector. use                  -->
+    <!-- java -jar start.jar etc/jetty.xml etc/jetty-ssl.xml             -->
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+    
+    <!-- =========================================================== -->
+    <!-- Set up global session ID manager                            -->
+    <!-- =========================================================== -->
+    <!--
+    <Set name="sessionIdManager">
+      <New class="org.mortbay.jetty.servlet.HashSessionIdManager">
+        <Set name="workerName">node1</Set>
+      </New>
+    </Set>
+    -->
+
+    <!-- =========================================================== -->
+    <!-- Set handler Collection Structure                            --> 
+    <!-- =========================================================== -->
+    <Set name="handler">
+      <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
+        <Set name="handlers">
+         <Array type="org.mortbay.jetty.Handler">
+           <Item>
+             <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
+           </Item>
+           <Item>
+             <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
+           </Item>
+           <Item>
+             <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
+           </Item>
+         </Array>
+        </Set>
+      </New>
+    </Set>
+    
+    <!-- =========================================================== -->
+    <!-- Configure the context deployer                              -->
+    <!-- A context deployer will deploy contexts described in        -->
+    <!-- configuration files discovered in a directory.              -->
+    <!-- The configuration directory can be scanned for hot          -->
+    <!-- deployments at the configured scanInterval.                 -->
+    <!--                                                             -->
+    <!-- This deployer is configured to deploy contexts configured   -->
+    <!-- in the $JETTY_HOME/contexts directory                       -->
+    <!--                                                             -->
+    <!-- =========================================================== -->
+    <Call name="addLifeCycle">
+      <Arg>
+        <New class="org.mortbay.jetty.deployer.ContextDeployer">
+          <Set name="contexts"><Ref id="Contexts"/></Set>
+          <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
+          <Set name="scanInterval">1</Set>
+        </New>
+      </Arg>
+    </Call>
+
+    <!-- =========================================================== -->
+    <!-- Configure the webapp deployer.                              -->
+    <!-- A webapp  deployer will deploy standard webapps discovered  -->
+    <!-- in a directory at startup, without the need for additional  -->
+    <!-- configuration files.    It does not support hot deploy or   -->
+    <!-- non standard contexts (see ContextDeployer above).          -->
+    <!--                                                             -->
+    <!-- This deployer is configured to deploy webapps from the      -->
+    <!-- $JETTY_HOME/webapps directory                               -->
+    <!--                                                             -->
+    <!-- Normally only one type of deployer need be used.            -->
+    <!--                                                             -->
+    <!-- =========================================================== -->
+    <Call name="addLifeCycle">
+      <Arg>
+        <New class="com.nokia.jetty.deployer.WebAppDeployer">
+          <Set name="contexts"><Ref id="Contexts"/></Set>
+          <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
+          <Set name="parentLoaderPriority">false</Set>
+          <Set name="extract">true</Set>
+          <Set name="allowDuplicates">false</Set>
+          <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+          <Set name="extraClasspath"><SystemProperty name="helium.cc.ext.home" default="."/>/lib/nokia_helium_cc.jar</Set>
+        </New>
+      </Arg>
+    </Call>
+
+    <!-- =========================================================== -->
+    <!-- Configure Authentication Realms                             -->
+    <!-- Realms may be configured for the entire server here, or     -->
+    <!-- they can be configured for a specific web app in a context  -->
+    <!-- configuration (see $(jetty.home)/contexts/test.xml for an   -->
+    <!-- example).                                                   -->
+    <!-- =========================================================== -->
+    <Set name="UserRealms">
+      <Array type="org.mortbay.jetty.security.UserRealm">
+        <Item>
+          <New class="org.mortbay.jetty.security.HashUserRealm">
+            <Set name="name">Test Realm</Set>
+            <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
+            <Set name="refreshInterval">0</Set>
+          </New>
+        </Item>
+      </Array>
+    </Set>
+
+    <!-- =========================================================== -->
+    <!-- Configure Request Log                                       -->
+    <!-- Request logs  may be configured for the entire server here, -->
+    <!-- or they can be configured for a specific web app in a       -->
+    <!-- contexts configuration (see $(jetty.home)/contexts/test.xml -->
+    <!-- for an example).                                            -->
+    <!-- =========================================================== -->
+    <Ref id="RequestLog">
+      <Set name="requestLog">
+        <New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
+          <Set name="filename"><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Set>
+          <Set name="filenameDateFormat">yyyy_MM_dd</Set>
+          <Set name="retainDays">90</Set>
+          <Set name="append">true</Set>
+          <Set name="extended">true</Set>
+          <Set name="logCookies">false</Set>
+          <Set name="LogTimeZone">GMT</Set>
+        </New>
+      </Set>
+    </Ref>
+
+    <!-- =========================================================== -->
+    <!-- extra options                                               -->
+    <!-- =========================================================== -->
+    <Set name="stopAtShutdown">true</Set>
+    <Set name="sendServerVersion">true</Set>
+    <Set name="sendDateHeader">true</Set>
+    <Set name="gracefulShutdown">1000</Set>
+
+</Configure>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/overlay/helium-dashboard-config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/********************************************************************************
+ * CruiseControl, a Continuous Integration Toolkit
+ * Copyright (c) 2007, ThoughtWorks, Inc.
+ * 200 E. Randolph, 25th Floor
+ * Chicago, IL 60601 USA
+ * All rights reserved.
+ *
+ * Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * 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 REGENTS 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.
+ ********************************************************************************/
+ -->
+ <!--
+============================================================================ 
+Name        : helium-dashboard-config.xml
+Part of     : Helium 
+
+Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+============================================================================
+-->
+ <dashboard>
+ 	<buildloop
+	    logsdir="logs"
+      	    artifactsdir="artifacts" />
+	<features allowforcebuild="true"/>
+	<!--<trackingtool projectname="" baseurl="" keywords=""/>-->
+ 	<subtabs>
+ 		<!--<subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.AntOutputWidget" />
+	    <subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidget" />-->
+	    <subtab class="com.nokia.cruisecontrol.dashboard.widgets.HeliumSummary" />
+	</subtabs>
+</dashboard>
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/readme.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+Cruise Control Helium integration
+---------------------------------
+
+Requirements:
+JDK 1.5/1.6
+
+How to build the delivery?
+> build.bat
+
+_______________
+The Helium Team
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/ant/HeliumCCLogger.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,595 @@
+/* ============================================================================ 
+Name        : HeliumBuilder.java
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================ */
+
+package com.nokia.cruisecontrol.ant;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.util.Hashtable;
+import java.util.Stack;
+import java.util.Enumeration;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.apache.tools.ant.util.DOMElementWriter;
+import org.apache.tools.ant.util.StringUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+import org.apache.tools.ant.*;
+
+/**
+ * Generates a file in the current directory with an XML description of what
+ * happened during a build. The default filename is "log.xml", but this can be
+ * overridden with the property <code>XmlLogger.file</code>.
+ * 
+ * This implementation assumes in its sanity checking that only one thread runs
+ * a particular target/task at a time. This is enforced by the way that parallel
+ * builds and antcalls are done - and indeed all but the simplest of tasks could
+ * run into problems if executed in parallel.
+ * 
+ * @see Project#addBuildListener(BuildListener)
+ */
+public class HeliumCCLogger implements org.apache.tools.ant.BuildLogger
+{
+    /** Message priority of &quot;error&quot;. */
+    public static final int MSG_ERR = 0;
+
+    /** Message priority of &quot;warning&quot;. */
+    public static final int MSG_WARN = 1;
+
+    /** Message priority of &quot;information&quot;. */
+    public static final int MSG_INFO = 2;
+
+    /** Message priority of &quot;verbose&quot;. */
+    public static final int MSG_VERBOSE = 3;
+
+    /** Message priority of &quot;debug&quot;. */
+    public static final int MSG_DEBUG = 4;
+
+    /** DocumentBuilder to use when creating the document to start with. */
+    private static DocumentBuilder builder = getDocumentBuilder();
+
+    /** XML element name for a build. */
+    private static final String BUILD_TAG = "build";
+
+    /** XML element name for a target. */
+    private static final String TARGET_TAG = "target";
+
+    /** XML element name for a task. */
+    private static final String TASK_TAG = "task";
+
+    /** XML element name for a message. */
+    private static final String MESSAGE_TAG = "message";
+
+    /** XML attribute name for a name. */
+    private static final String NAME_ATTR = "name";
+
+    /** XML attribute name for a time. */
+    private static final String TIME_ATTR = "time";
+
+    /** XML attribute name for a message priority. */
+    private static final String PRIORITY_ATTR = "priority";
+
+    /** XML attribute name for a file location. */
+    private static final String LOCATION_ATTR = "location";
+
+    /** XML attribute name for an error description. */
+    private static final String ERROR_ATTR = "error";
+
+    /** XML element name for a stack trace. */
+    private static final String STACKTRACE_TAG = "stacktrace";
+
+    /** The complete log document for this build. */
+    private Document doc = builder.newDocument();
+
+    /** Mapping for when tasks started (Task to TimedElement). */
+    private Hashtable tasks = new Hashtable();
+
+    /** Mapping for when targets started (Task to TimedElement). */
+    private Hashtable targets = new Hashtable();
+
+    /**
+     * Mapping of threads to stacks of elements (Thread to Stack of
+     * TimedElement).
+     */
+    private Hashtable threadStacks = new Hashtable();
+
+    /**
+     * When the build started.
+     */
+    private TimedElement buildElement;
+
+    private int msgOutputLevel = MSG_DEBUG;
+
+    private PrintStream outStream;
+
+ 
+    /**
+     * Returns a default DocumentBuilder instance or throws an
+     * ExceptionInInitializerError if it can't be created.
+     * 
+     * @return a default DocumentBuilder instance.
+     */
+    private static DocumentBuilder getDocumentBuilder()
+    {
+        try
+        {
+            return DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        }
+        catch (Exception exc)
+        {
+            throw new ExceptionInInitializerError(exc);
+        }
+    }
+
+
+    /** Utility class representing the time an element started. */
+    private static class TimedElement
+    {
+        /**
+         * Start time in milliseconds (as returned by
+         * <code>System.currentTimeMillis()</code>).
+         */
+        private long startTime;
+
+        /** Element created at the start time. */
+        private Element element;
+
+        public String toString()
+        {
+            return element.getTagName() + ":" + element.getAttribute("name");
+        }
+    }
+
+
+    /**
+     * Fired when the build starts, this builds the top-level element for the
+     * document and remembers the time of the start of the build.
+     * 
+     * @param event
+     *            Ignored.
+     */
+    public void buildStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Fired when the build finishes, this adds the time taken and any error
+     * stacktrace to the build element and writes the document to disk.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Will not be
+     *            <code>null</code>.
+     */
+    public void buildFinished(BuildEvent event)
+    {
+        long totalTime = System.currentTimeMillis() - buildElement.startTime;
+        // buildElement.element.setAttribute(TIME_ATTR,
+        // DefaultLogger.formatTime(totalTime));
+
+        System.out.println("Build finished in cruise control HeliumCCLogger");
+
+        if (event.getException() != null)
+        {
+            System.out.println("Build finished exception occured in cruise control HeliumCCLogger");
+            System.out.println("Build finished exception is:-----"
+                    + event.getException().toString());
+            buildElement.element.setAttribute(ERROR_ATTR, event.getException().toString());
+            // print the stacktrace in the build file it is always useful...
+            // better have too much info than not enough.
+            Throwable t = event.getException();
+            Text errText = doc.createCDATASection(StringUtils.getStackTrace(t));
+            Element stacktrace = doc.createElement(STACKTRACE_TAG);
+            stacktrace.appendChild(errText);
+            buildElement.element.appendChild(stacktrace);
+        }
+        String outFilename = event.getProject().getProperty("HeliumCCLogger.file");
+        System.out.println("Build finished writing to log file1" + outFilename);
+        if (outFilename == null)
+        {
+            outFilename = "log.xml";
+        }
+        System.out.println("Build finished writing to log file2");
+        String xslUri = event.getProject().getProperty("ant.HeliumCCLogger.stylesheet.uri");
+        if (xslUri == null)
+        {
+            xslUri = "log.xsl";
+        }
+        System.out.println("Build finished writing to log file3");
+        Writer out = null;
+        try
+        {
+            // specify output in UTF8 otherwise accented characters will blow
+            // up everything
+            System.out.println("Build finished writing to log file3");
+
+            OutputStream stream = outStream;
+            if (stream == null)
+            {
+                stream = new FileOutputStream(outFilename);
+            }
+            out = new OutputStreamWriter(stream, "UTF8");
+            System.out.println("Build finished writing to log file4");
+
+            out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+            if (xslUri.length() > 0)
+            {
+                out.write("<?xml-stylesheet type=\"text/xsl\" href=\"" + xslUri + "\"?>\n\n");
+            }
+            System.out.println("Build finished writing to log file5");
+            (new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
+            out.flush();
+        }
+        catch (IOException exc)
+        {
+            System.out.println("Build finished writing to log file6");
+            throw new BuildException("Unable to write log file", exc);
+        }
+        finally
+        {
+            System.out.println("Build finished writing to log file7");
+
+            if (out != null)
+            {
+                try
+                {
+                    out.close();
+                }
+                catch (IOException e)
+                {
+                    // ignore
+                    e = null;
+                }
+            }
+        }
+        buildElement = null;
+    }
+
+    /**
+     * Returns the stack of timed elements for the current thread.
+     * 
+     * @return the stack of timed elements for the current thread
+     */
+    private Stack getStack()
+    {
+        Stack threadStack = (Stack) threadStacks.get(Thread.currentThread());
+        if (threadStack == null)
+        {
+            threadStack = new Stack();
+            threadStacks.put(Thread.currentThread(), threadStack);
+        }
+        /*
+         * For debugging purposes uncomment: org.w3c.dom.Comment s =
+         * doc.createComment("stack=" + threadStack);
+         * buildElement.element.appendChild(s);
+         */
+        return threadStack;
+    }
+
+    /**
+     * Fired when a target starts building, this pushes a timed element for the
+     * target onto the stack of elements for the current thread, remembering the
+     * current time and the name of the target.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Will not be
+     *            <code>null</code>.
+     */
+    public void targetStarted(BuildEvent event)
+    {
+        System.out.println("target started in cruise control HeliumCCLogger");
+        Target target = event.getTarget();
+        TimedElement targetElement = new TimedElement();
+        targetElement.startTime = System.currentTimeMillis();
+        targetElement.element = doc.createElement(TARGET_TAG);
+        targetElement.element.setAttribute(NAME_ATTR, target.getName());
+        targets.put(target, targetElement);
+        getStack().push(targetElement);
+    }
+
+    /**
+     * Fired when a target finishes building, this adds the time taken and any
+     * error stacktrace to the appropriate target element in the log.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Will not be
+     *            <code>null</code>.
+     */
+    public void targetFinished(BuildEvent event)
+    {
+        System.out.println("target finished in cruise control HeliumCCLogger");
+        Target target = event.getTarget();
+        TimedElement targetElement = (TimedElement) targets.get(target);
+        if (targetElement != null)
+        {
+            long totalTime = System.currentTimeMillis() - targetElement.startTime;
+            // targetElement.element.setAttribute(TIME_ATTR,
+            // DefaultLogger.formatTime(totalTime));
+
+            TimedElement parentElement = null;
+            Stack threadStack = getStack();
+            if (!threadStack.empty())
+            {
+                TimedElement poppedStack = (TimedElement) threadStack.pop();
+                if (poppedStack != targetElement)
+                {
+                    throw new RuntimeException("Mismatch - popped element = " + poppedStack
+                            + " finished target element = " + targetElement);
+                }
+                if (!threadStack.empty())
+                {
+                    parentElement = (TimedElement) threadStack.peek();
+                }
+            }
+            if (parentElement == null)
+            {
+                buildElement.element.appendChild(targetElement.element);
+            }
+            else
+            {
+                parentElement.element.appendChild(targetElement.element);
+            }
+        }
+        targets.remove(target);
+    }
+
+    /**
+     * Fired when a task starts building, this pushes a timed element for the
+     * task onto the stack of elements for the current thread, remembering the
+     * current time and the name of the task.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Will not be
+     *            <code>null</code>.
+     */
+    public void taskStarted(BuildEvent event)
+    {
+        TimedElement taskElement = new TimedElement();
+        taskElement.startTime = System.currentTimeMillis();
+        taskElement.element = doc.createElement(TASK_TAG);
+
+        Task task = event.getTask();
+        String name = event.getTask().getTaskName();
+        if (name == null)
+        {
+            name = "";
+        }
+        taskElement.element.setAttribute(NAME_ATTR, name);
+        taskElement.element.setAttribute(LOCATION_ATTR, event.getTask().getLocation().toString());
+        tasks.put(task, taskElement);
+        getStack().push(taskElement);
+    }
+
+    /**
+     * Fired when a task finishes building, this adds the time taken and any
+     * error stacktrace to the appropriate task element in the log.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Will not be
+     *            <code>null</code>.
+     */
+    public void taskFinished(BuildEvent event)
+    {
+        Task task = event.getTask();
+        TimedElement taskElement = (TimedElement) tasks.get(task);
+        if (taskElement != null)
+        {
+            long totalTime = System.currentTimeMillis() - taskElement.startTime;
+            // taskElement.element.setAttribute(TIME_ATTR,
+            // DefaultLogger.formatTime(totalTime));
+            Target target = task.getOwningTarget();
+            TimedElement targetElement = null;
+            if (target != null)
+            {
+                targetElement = (TimedElement) targets.get(target);
+            }
+            if (targetElement == null)
+            {
+                buildElement.element.appendChild(taskElement.element);
+            }
+            else
+            {
+                targetElement.element.appendChild(taskElement.element);
+            }
+            Stack threadStack = getStack();
+            if (!threadStack.empty())
+            {
+                TimedElement poppedStack = (TimedElement) threadStack.pop();
+                if (poppedStack != taskElement)
+                {
+                    throw new RuntimeException("Mismatch - popped element = " + poppedStack
+                            + " finished task element = " + taskElement);
+                }
+            }
+            tasks.remove(task);
+        }
+        else
+        {
+            throw new RuntimeException("Unknown task " + task + " not in " + tasks);
+        }
+    }
+
+    /**
+     * Get the TimedElement associated with a task.
+     * 
+     * Where the task is not found directly, search for unknown elements which
+     * may be hiding the real task
+     */
+    private TimedElement getTaskElement(Task task)
+    {
+        TimedElement element = (TimedElement) tasks.get(task);
+        if (element != null)
+        {
+            return element;
+        }
+
+        for (Enumeration e = tasks.keys(); e.hasMoreElements();)
+        {
+            Task key = (Task) e.nextElement();
+            if (key instanceof UnknownElement)
+            {
+                if (((UnknownElement) key).getTask() == task)
+                {
+                    return (TimedElement) tasks.get(key);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Fired when a message is logged, this adds a message element to the most
+     * appropriate parent element (task, target or build) and records the
+     * priority and text of the message.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Will not be
+     *            <code>null</code>.
+     */
+    public void messageLogged(BuildEvent event)
+    {
+
+        if (buildElement == null)
+        {
+            buildElement = new TimedElement();
+            buildElement.startTime = System.currentTimeMillis();
+            buildElement.element = doc.createElement(BUILD_TAG);
+        }
+        int priority = event.getPriority();
+        if (priority > msgOutputLevel)
+        {
+            return;
+        }
+        Element messageElement = doc.createElement(MESSAGE_TAG);
+
+        String name = "debug";
+        switch (event.getPriority())
+        {
+        case MSG_ERR:
+            name = "error";
+            break;
+        case MSG_WARN:
+            name = "warn";
+            break;
+        case MSG_INFO:
+            name = "info";
+            break;
+        default:
+            name = "debug";
+            break;
+        }
+        messageElement.setAttribute(PRIORITY_ATTR, name);
+
+        Throwable ex = event.getException();
+        if (MSG_DEBUG <= msgOutputLevel && ex != null)
+        {
+            Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex));
+            Element stacktrace = doc.createElement(STACKTRACE_TAG);
+            stacktrace.appendChild(errText);
+            buildElement.element.appendChild(stacktrace);
+        }
+        Text messageText = doc.createCDATASection(event.getMessage());
+        messageElement.appendChild(messageText);
+
+        TimedElement parentElement = null;
+
+        Task task = event.getTask();
+
+        Target target = event.getTarget();
+        if (task != null)
+        {
+            parentElement = getTaskElement(task);
+        }
+        if (parentElement == null && target != null)
+        {
+            parentElement = (TimedElement) targets.get(target);
+        }
+
+        /*
+         * if (parentElement == null) { Stack threadStack = (Stack)
+         * threadStacks.get(Thread.currentThread()); if (threadStack != null) {
+         * if (!threadStack.empty()) { parentElement = (TimedElement)
+         * threadStack.peek(); } } }
+         */
+
+        if (parentElement != null)
+        {
+            parentElement.element.appendChild(messageElement);
+        }
+        else
+        {
+            buildElement.element.appendChild(messageElement);
+        }
+    }
+
+    // -------------------------------------------------- BuildLogger interface
+
+    /**
+     * Set the logging level when using this as a Logger
+     * 
+     * @param level
+     *            the logging level - see
+     *            {@link org.apache.tools.ant.Project#MSG_ERR Project} class for
+     *            level definitions
+     */
+    public void setMessageOutputLevel(int level)
+    {
+        msgOutputLevel = level;
+    }
+
+    /**
+     * Set the output stream to which logging output is sent when operating as a
+     * logger.
+     * 
+     * @param output
+     *            the output PrintStream.
+     */
+    public void setOutputPrintStream(PrintStream output)
+    {
+        this.outStream = new PrintStream(output, true);
+    }
+
+    /**
+     * Ignore emacs mode, as it has no meaning in XML format
+     * 
+     * @param emacsMode
+     *            true if logger should produce emacs compatible output
+     */
+    public void setEmacsMode(boolean emacsMode)
+    {
+    }
+
+    /**
+     * Ignore error print stream. All output will be written to either the XML
+     * log file or the PrintStream provided to setOutputPrintStream
+     * 
+     * @param err
+     *            the stream we are going to ignore.
+     */
+    public void setErrorPrintStream(PrintStream err)
+    {
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/dashboard/widgets/HeliumSummary.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+/* 
+============================================================================ 
+Name        : HeliumSummary.java
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.dashboard.widgets;
+
+import java.io.*;
+import java.util.Map;
+import net.sourceforge.cruisecontrol.dashboard.widgets.Widget;
+
+public class HeliumSummary implements Widget
+{
+    public String getDisplayName()
+    {
+        return "Helium summary";
+    }
+
+    public Object getOutput(Map parameters)
+    {
+        String output = "Error retreiving logs.";
+        try
+        {
+            File projectLogDir = findHeliumLogDir(parameters);
+            if (projectLogDir.exists())
+            {
+                File log = findCCLog(projectLogDir);
+                if (log != null)
+                {
+                    FileReader fr = new FileReader(log);
+                    BufferedReader br = new BufferedReader(fr);
+                    String s;
+                    output = "";
+                    while ((s = br.readLine()) != null)
+                    {
+                        output += s;
+                    }
+                    fr.close();
+                }
+                else
+                {
+                    output = "Could not find CC summary.";
+                }
+            }
+            else
+            {
+                output = "Could not find " + projectLogDir.getAbsolutePath();
+            }
+        }
+        catch (Exception e)
+        {
+            return e.toString();
+        }
+        return output;
+    }
+
+    protected File findCCLog(File location)
+    {
+        if (location.exists() && location.isDirectory())
+        {
+            File[] list = location.listFiles();
+            for (int i = 0; i < list.length; i++)
+            {
+                if (list[i].isDirectory())
+                {
+                    File result = findCCLog(list[i]);
+                    if (result != null)
+                        return result;
+                }
+                else if (list[i].getName().toLowerCase().endsWith("_cc_summary.html"))
+                {
+                    return list[i];
+                }
+            }
+        }
+        return null;
+    }
+
+    protected File findHeliumLogDir(Map parameters) throws Exception
+    {
+        File projectLogDir = (File) parameters.get(Widget.PARAM_BUILD_ARTIFACTS_ROOT);
+        if (projectLogDir != null)
+            return projectLogDir;
+
+        throw new Exception("Could not retieve the log directory.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergy.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1300 @@
+/********************************************************************************
+ * CruiseControl, a Continuous Integration Toolkit
+ * Copyright (c) 2001, ThoughtWorks, Inc.
+ * 200 E. Randolph, 25th Floor
+ * Chicago, IL 60601 USA
+ * All rights reserved.
+ *
+ * Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * 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 REGENTS 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.
+ ********************************************************************************/
+/* 
+ ============================================================================ 
+ Name        : HLMSynergy.java
+ Part of     : Helium 
+
+ Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+ ============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import org.jdom.*;
+import org.jdom.input.SAXBuilder;
+
+import net.sourceforge.cruisecontrol.CruiseControlException;
+import net.sourceforge.cruisecontrol.SourceControl;
+import net.sourceforge.cruisecontrol.sourcecontrols.SourceControlProperties;
+import net.sourceforge.cruisecontrol.util.ManagedCommandline;
+import net.sourceforge.cruisecontrol.util.Util;
+import net.sourceforge.cruisecontrol.Modification;
+import net.sourceforge.cruisecontrol.util.ValidationHelper;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.Level;
+
+/**
+ * Checks for modifications made to a Telelogic CM Synergy repository. It does
+ * this by examining a provided reference project, getting the tasks from all
+ * folders in that project, and checking the completion time of those tasks
+ * against the last build.
+ * 
+ * @author <a href="mailto:rjmpsmith@gmail.com">Robert J. Smith</a>
+ */
+public class HLMSynergy implements SourceControl
+{
+    /**
+     * A delimiter used for data values returned from a CM Synergy query
+     */
+    public static final String CCM_ATTR_DELIMITER = "@#@#@#@";
+
+    /**
+     * A delimiter used to mark the end of a multi-lined result from a query
+     */
+    public static final String CCM_END_OBJECT = "<<<#@#@#>>>";
+
+    /**
+     * The default CM Synergy command line client executable
+     */
+    public static final String CCM_EXE = "ccm";
+
+    /**
+     * The environment variable used by CM Synergy to determine which backend
+     * ccmSession to use when issuing commands.
+     */
+    public static final String CCM_SESSION_VAR = "CCM_ADDR";
+
+    /**
+     * The default CM Synergy session map file
+     */
+    public static final String CCM_SESSION_FILE = System.getProperty("user.home") + File.separator
+            + ".ccmsessionmap";
+
+    /**
+     * An instance of the logging class
+     */
+    private static final Logger LOG = Logger.getLogger(HLMSynergy.class);
+
+    /**
+     * Configuration file.
+     */
+    private String filename;
+    
+    /**
+     * detectBaselineUpdate
+     */
+    private boolean detectBaselineUpdate;
+    /**
+     * A collection of properties which will be passed to and set within the
+     * builder.
+     */
+     
+    private SourceControlProperties properties = new SourceControlProperties();
+
+    /**
+     * The name of the property which will be set and passed to the builder if
+     * any object has changed since the last build.
+     */
+    private String property = "cc.ccm.haschanged";
+
+    /**
+     * The version number delimeter used by the database with which this CM
+     * Synergy session is connected.
+     */
+    private String ccmDelimiter = "-";
+
+    /**
+     * The URL for your installation of Change Synergy
+     */
+    private String changeSynergyURL;
+
+    /**
+     * The CCM database with which we wish to connect
+     */
+    private String ccmDb;
+
+    /**
+     * The CM Synergy executable used for executing commands. If not set, we
+     * will use the default value "ccm".
+     */
+    private String ccmExe;
+
+    /**
+     * The CM Synergy project spec (2 part name).
+     */
+    private String projectSpec;
+
+    /**
+     * The instance number of the project. This is almost always "1", but might
+     * need to be overridden if you are using DCM?
+     */
+    private String projectInstance = "1";
+
+    /**
+     * The CM Synergy project four part name we will use as a template to
+     * determine if any new tasks have been completed.
+     */
+    private String projectFourPartName;
+
+    /**
+     * If set to true, the contents of the folders contained within the
+     * project's reconfigure properties will be updated before we query to find
+     * new tasks.
+     */
+    private boolean updateFolders = true;
+
+    /**
+     * The file which contains the mapping between CM Synergy session names and
+     * IDs.
+     */
+    private File sessionFile;
+
+    /**
+     * The name of the CM Synergy session to use.
+     */
+    private String sessionName;
+
+    /**
+     * The date format as returned by your installation of CM Synergy.
+     */
+    private String ccmDateFormat = "EEE MMM dd HH:mm:ss yyyy"; // Fri Dec 3
+
+    // 17:51:56 2004
+
+    /**
+     * If set to true, the project will be reconfigured when changes are
+     * detected.
+     */
+    private boolean reconfigure;
+
+    /**
+     * Used in conjunction with reconfigure. If set to true, all subprojects
+     * will be reconfigured when changes are detected.
+     */
+    private boolean recurse = true;
+
+    /**
+     * If set to true, the time a task came into a reconfigure folder is used to
+     * determine modified tasks instead of the tasks completion time. Works for
+     * Synergy 6.3SP1 and newer only.
+     */
+    private boolean useBindTime;
+
+    /**
+     * If set to true, the work area location will not be queried and passed to
+     * the builder.
+     */
+    private boolean ignoreWorkarea;
+
+    /**
+     * The locale used for parsing dates.
+     */
+    private Locale locale;
+
+    /**
+     * The language used to set the locale for parsing CM Synergy dates.
+     */
+    private String language = "en";
+
+    /**
+     * A reusable commandline for issuing CM Synergy commands
+     */
+    private ManagedCommandline cmd;
+
+    /**
+     * The country used to set the locale for parsing CM Synergy dates.
+     */
+    private String country = "US";
+
+    /**
+     * The number of modified tasks found
+     */
+    private int numTasks;
+
+    /**
+     * The number of modified objects found
+     */
+    private int numObjects;
+
+    /**
+     * The baseline modification cache.
+     */
+    private ModificationCache baselineCache = new ModificationCache();
+    
+    /**
+     * The constructor.
+     */
+    public HLMSynergy()
+    {
+        // Configure the logger to be always in debug mode.
+        LOG.setLevel(Level.DEBUG);
+    }
+
+    /**
+     * Setting the file attribute.
+     */
+    public void setFile(String filename)
+    {
+        LOG.debug("Set CCM configuration file: " + filename);
+        this.filename = filename;
+    }
+    
+    /**
+     * Setting the file BaseLine Update.
+     */
+    public void setDetectBaselineUpdate(boolean detectBaselineUpdate)
+    {
+        this.detectBaselineUpdate = detectBaselineUpdate;
+    }
+
+    /**
+     * Sets the name of the CM Synergy executable to use when issuing commands.
+     * 
+     * @param ccmExe
+     *            the name of the CM Synergy executable
+     */
+    public void setCcmExe(String ccmExe)
+    {
+        this.ccmExe = ccmExe;
+    }
+
+    /**
+     * Sets the CM Synergy project spec to be used as a template for calculating
+     * changes. The value set here can be accessed from within the build as the
+     * property "cc.ccm.project".
+     * 
+     * @param projectSpec
+     *            The project spec (in 2 part name format).
+     */
+    public void setProject(String projectSpec)
+    {
+        this.projectSpec = projectSpec;
+    }
+
+    /**
+     * Sets the project's instance value. This value will be used in any query
+     * which involves the project. Defaults to "1". This default should work for
+     * most people. You might, however, need to override this value when using
+     * DCM?
+     * 
+     * @param projectInstance
+     *            The instance number of the project.
+     */
+    public void setInstance(String projectInstance)
+    {
+        this.projectInstance = projectInstance;
+    }
+
+    /**
+     * Sets the URL for your installation of Change Synergy. This is used to
+     * create active links from the modification report to the Change Requests
+     * associated with the modified tasks. If not set, the links will not be
+     * created. If you wish to use this feature, you must also set the ccmdb
+     * attribute to the remote location of the Synergy database.
+     * 
+     * @param url
+     *            The URL of your ChangeSynergy installation
+     */
+    public void setChangeSynergyURL(String url)
+    {
+        this.changeSynergyURL = url;
+    }
+
+    /**
+     * Sets the remote Synergy database with which to connect. This is only
+     * needed if you wish to create active links from the build results page to
+     * your installation of Change Synergy. If you set this attribute, you must
+     * also set the changesynergyurl attribute.
+     * 
+     * @param db
+     *            The remote Synergy database with which to connect (e.g.
+     *            /ccmdb/mydb).
+     */
+    public void setCcmDb(String db)
+    {
+        this.ccmDb = db;
+    }
+
+    /**
+     * Sets the value of the updateFolders attribute. If set to true, the
+     * contents of the folders contained within the project's reconfigure
+     * properties will be updated before we query to find new tasks.
+     */
+    public void setUpdateFolders(boolean updateFolders)
+    {
+        this.updateFolders = updateFolders;
+    }
+
+    /**
+     * Sets the file which contains the mapping between CM Synergy session names
+     * and IDs. This file should be in the standard properties file format. Each
+     * line should map one name to a CM Synergy session ID (as returned by the
+     * "ccm status" command).
+     * <p>
+     * example: <br>
+     * <br>
+     * session1=localhost:65024:192.168.1.17
+     * 
+     * @param sessionFile
+     *            The session file
+     */
+    public void setSessionFile(String sessionFile)
+    {
+        this.sessionFile = new File(sessionFile);
+    }
+
+    /**
+     * Sets the name of the CM Synergy session to use with this plugin. This
+     * name should appear in the specified session file.
+     * 
+     * @param sessionName
+     *            The session name
+     * 
+     * @see #setSessionFile(String)
+     */
+    public void setSessionName(String sessionName)
+    {
+        this.sessionName = sessionName;
+    }
+
+    /**
+     * Sets the date format used by your installation of CM Synergy. The format
+     * string should use the syntax described in <code>SimpleDateFormat</code>.
+     * The default is "EEE MMM dd HH:mm:ss yyyy" The value set here can be
+     * accessed from within the build as the property "cc.ccm.dateformat".
+     * 
+     * @param format
+     *            the date format
+     */
+    public void setCcmDateFormat(String format)
+    {
+        this.ccmDateFormat = format;
+    }
+
+    /**
+     * Sets the value of the reconfigure attribute. If set to true, the project
+     * will be reconfigured when changes are detected. Default value is false.
+     */
+    public void setReconfigure(boolean reconfigure)
+    {
+        this.reconfigure = reconfigure;
+    }
+
+    /**
+     * Sets the value of the useBindtime attribute. If set to true, the time the
+     * task came into the reconfigure folders is used to query the modifications
+     * instead of the time the task was completed. Works for Synergy 6.3SP1 and
+     * newer only. Default value is false.
+     */
+    public void setUseBindTime(boolean useBindTime)
+    {
+        this.useBindTime = useBindTime;
+    }
+
+    /**
+     * Sets the value of the recurse attribute. Used in conjuction with the
+     * reconfigure attribute. If set to true, all subprojects will also be
+     * reconfigured when changes are detected. Default is true.
+     */
+    public void setRecurse(boolean recurse)
+    {
+        this.recurse = recurse;
+    }
+
+    /**
+     * Sets the value of the ignoreWorkarea attribute. If set to true, we will
+     * not attempt to determine the location of the project's workarea, nor will
+     * we pass the cc.ccm.workarea attribute to the builders. Default is false.
+     */
+    public void setIgnoreWorkarea(boolean ignoreWorkarea)
+    {
+        this.ignoreWorkarea = ignoreWorkarea;
+    }
+
+    /**
+     * Sets the language used to create the locale for parsing CM Synergy dates.
+     * The format should follow the ISO standard as specified by
+     * <code>java.util.Locale</code>. The default is "en" (English).
+     * 
+     * @param language
+     *            The language to use when creating the <code>Locale</code>
+     */
+    public void setLanguage(String language)
+    {
+        this.language = language;
+    }
+
+    /**
+     * Sets the country used to create the locale for parsing CM Synergy dates.
+     * The format should follow the ISO standard as specified by
+     * <code>java.util.Locale</code>. The default is "US" (United States).
+     * 
+     * @param country
+     *            The ISO country code to use
+     */
+    public void setCountry(String country)
+    {
+        this.country = country;
+    }
+
+    public Map getProperties()
+    {
+        return properties.getPropertiesAndReset();
+    }
+
+    public void setProperty(String property)
+    {
+        this.property = property;
+    }
+
+    public void validate() throws CruiseControlException
+    {
+        // ValidationHelper.assertIsSet(projectSpec, "project",
+        // this.getClass());
+        ValidationHelper.assertIsSet(filename, "file", this.getClass());
+    }
+
+    public List getModifications(Date lastBuild, Date now)
+    {
+        baselineCache.cleanup(lastBuild);
+        // Create a Locale appropriate for this installation
+        try
+        {
+            LOG.info("Parsing " + filename);
+            SAXBuilder saxBuilder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");
+            org.jdom.Document jdomDocument = saxBuilder.build(new File(filename));
+            Element root = jdomDocument.getRootElement();
+            List projects = root.getChildren("project");
+            List<Modification> mresult = new ArrayList<Modification>();
+            String action;
+            String name;
+            String database;
+            for (int i = 0; i < projects.size(); i++)
+            {
+                Element project = (Element) projects.get(i);
+                action = project.getAttribute("action").getValue();
+                name = project.getAttribute("name").getValue();
+                database = project.getAttribute("database").getValue();
+                if (action != null && name != null && database != null)
+                {
+                    if (action.equals("to_be_checkout"))
+                    {
+                        LOG.info("Creating a HLM modification");
+                        Modification m = new Modification();
+                        m.type = "to_be_checkout";
+                        m.userName = "user";
+                        m.modifiedTime = new Date(lastBuild.getTime() + 100);
+                        mresult.add(m);
+                        properties.put(property, "true");
+                        /*
+                         * Currently one notification, but in general it should
+                         * be the list of projects checked out to be added and
+                         * only those project needs to be checked out.
+                         */
+                        return mresult;
+                    }
+                    else
+                    {
+                        LOG.info("Creating a CC modification");
+                        projectFourPartName = name;
+                        sessionName = database;
+                        ccmDb = database;
+                        locale = new Locale(language, country);
+
+                        if (!locale.equals(Locale.US))
+                        {
+                            LOG.info("Locale has been set to " + locale.toString());
+                        }
+
+                        // Attempt to get the database delimiter
+                        cmd = createCcmCommand(ccmExe, sessionName, sessionFile);
+                        cmd.createArgument("delimiter");
+                        try
+                        {
+                            cmd.execute();
+                            cmd.assertExitCode(0);
+                            this.ccmDelimiter = cmd.getStdoutAsString().trim();
+                        }
+                        catch (Exception e1)
+                        {
+                            StringBuffer buff = new StringBuffer(
+                                    "Could not connect to provided CM Synergy session");
+                            LOG.error(buff.toString(), e1);
+                            return null;
+                        }
+
+                        LOG.info("Checking for modifications between " + lastBuild.toString()
+                                + " and " + now.toString());
+
+                        // If we were asked to update the folders, do so
+                        if (updateFolders)
+                        {   
+                            SynergyBaselineProjects q = new SynergyBaselineProjects(cmd,
+                                    projectFourPartName);
+                            List<String> before = null;
+                            if (detectBaselineUpdate) {
+                                before = q.getBaselineProjects();
+                            }    
+                            refreshReconfigureProperties();
+                            if (detectBaselineUpdate) {
+                                LOG.info("Checking for new baselines between " + lastBuild.toString()
+                                + " and " + now.toString());                                
+                                List<String> after = q.getBaselineProjects();
+                                mresult.addAll(getBaselineModifications(lastBuild, now, before, after));
+                            }
+                        }
+
+                        // Create a list of modifications based upon tasks
+                        // completed
+                        // since the last build.
+                        numObjects = 0;
+                        numTasks = 0;
+                        List taskList = getModifiedTasks(lastBuild);
+                        if (taskList != null && !taskList.isEmpty())
+                        {
+                            mresult.addAll(taskList);
+                        }
+
+                        LOG.info("Found " + numObjects + " modified object(s) in " + numTasks
+                                + " new task(s).");
+
+                        // If we were asked to reconfigure the project, do so
+                        if (reconfigure && (numObjects > 0))
+                        {
+                            reconfigureProject();
+                        }
+
+                        // Pass to the build any relevent properties
+                        properties.put("cc.ccm.project", projectFourPartName);
+                        properties.put("cc.ccm.dateformat", ccmDateFormat);
+                        String sessionID = cmd.getVariable(CCM_SESSION_VAR);
+                        if (sessionID != null)
+                        {
+                            properties.put("cc.ccm.session", sessionID);
+                        }
+                        if (numObjects > 0)
+                        {
+                            properties.put(property, "true");
+                        }
+                        if (!ignoreWorkarea)
+                        {
+                            properties.put("cc.ccm.workarea", getWorkarea());
+                        }
+                    }
+                }
+            }
+            return mresult;
+        }
+        catch (Exception e)
+        {
+            LOG.info("Exception in modificationset" + e.getMessage());
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * Return the list of baseline modifications
+     * @param lastBuild
+     * @param now
+     * @param before
+     * @param after
+     * @return a List of Modification objects
+     */
+    protected List<Modification> getBaselineModifications(Date lastBuild, Date now, List<String> before, List<String> after) {
+        for (String aname : after)
+        {
+            LOG.debug(aname + " in before?");
+            if (!before.contains(aname))
+            {
+                LOG.info("Baseline added: " + aname);
+                Modification m = new Modification("baseline");
+                Modification.ModifiedFile f = m.createModifiedFile(aname, "");
+                f.action = "added";
+                m.userName = "user";
+                m.comment = "Added baseline: " + aname;
+                m.modifiedTime = new Date(lastBuild.getTime() + 100);
+                baselineCache.add(m);
+            }
+        }
+        for (String bname : before)
+        {
+            LOG.debug(bname + " in after?");
+            if (!after.contains(bname))
+            {
+                LOG.info("Baseline removed: " + bname);
+                Modification m = new Modification("baseline");
+                Modification.ModifiedFile f = m.createModifiedFile(bname, "");
+                f.action = "deleted";
+                m.type = "baseline_removal";
+                m.userName = "user";
+                m.comment = "Removed baseline: " + bname;
+                m.modifiedTime = new Date(lastBuild.getTime() + 100);
+                baselineCache.add(m);
+            }
+        }
+        return baselineCache.getModifications(lastBuild, now);
+    }
+    
+    /**
+     * Update the folders within the given project's reconfigure properties.
+     */
+    private void refreshReconfigureProperties()
+    {
+        LOG.info("Refreshing reconfigure properties for project " + projectFourPartName + ".");
+
+        // Construct the CM Synergy command
+        cmd.clearArgs();
+        cmd.createArgument("reconfigure_properties");
+        if (recurse)
+        {
+            cmd.createArgument("-recurse");
+        }
+        cmd.createArguments("-refresh", projectFourPartName);
+        try
+        {
+            cmd.execute();
+            cmd.assertExitCode(0);
+        }
+        catch (Exception e)
+        {
+            String message = "Could not refresh reconfigure properties for project \""
+                    + projectFourPartName + "\".";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+    }
+
+    /**
+     * Get a list of all tasks which are contained in all folders in the
+     * reconfigure properties of the specified project and were completed after
+     * the last build. If useBindTime is <code>true</code> not the completion
+     * time of the task is considered but the time the task came into the
+     * folder.
+     * 
+     * @return A list of <code>HLMSynergyModifications</code> which represent
+     *         the new tasks
+     */
+    private List getModifiedTasks(Date lastBuild)
+    {
+
+        // The format used for converting Java dates into CM Synergy dates
+        // Note that the format used to submit commands differs from the
+        // format used in the results of that command!?!
+        SimpleDateFormat toCcmDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", locale);
+        boolean isBaselineBasedProject = false;
+
+        // Determine if the project has a System Testing purpose
+        cmd.clearArgs();
+        cmd.createArgument("prop");
+        cmd.createArgument("-p");
+        cmd.createArgument(projectFourPartName);
+        cmd.createArgument("-f");
+        cmd.createArgument("%purpose");
+        try
+        {
+            cmd.execute();
+        }
+        catch (Exception e)
+        {
+            String message = "Could not query for new tasks.";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+
+        // Determine if the project is either of a System Testing or
+        // Insulated Development purpose. If it is, set the appropriate flag
+        if (cmd.getStdoutAsString().startsWith("System Testing"))
+        {
+            isBaselineBasedProject = true;
+        }
+        else if (cmd.getStdoutAsString().startsWith("Insulated Development"))
+        {
+            isBaselineBasedProject = true;
+        }
+
+        // get the release of the project
+        String release = getProjectRelease(projectFourPartName);
+        String latestBaseline = getLatestBaseline(release);
+
+        // Construct the CM Synergy command
+        cmd.clearArgs();
+        cmd.createArgument("query");
+        cmd.createArgument("-u");
+
+        // Set up the output format
+        cmd.createArgument("-f");
+        cmd.createArgument("%displayname" + CCM_ATTR_DELIMITER + // 0
+                "%release" + CCM_ATTR_DELIMITER + // 1
+                "%owner" + CCM_ATTR_DELIMITER + // 2
+                "%completion_date" + CCM_ATTR_DELIMITER + // 3
+                "%task_synopsis" + CCM_END_OBJECT); // 4
+
+        // Construct the query string
+        if (useBindTime & (!isBaselineBasedProject))
+        {
+            cmd.createArgument("is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName
+                    + "'), '>', time('" + toCcmDate.format(lastBuild) + "'))");
+        }
+        else if (!isBaselineBasedProject)
+        {
+            cmd.createArgument("is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName
+                    + "')) and (completion_date>time('" + toCcmDate.format(lastBuild) + "')"
+                    + " or dcm_receive_time>time('" + toCcmDate.format(lastBuild) + "'))");
+        }
+        else if (useBindTime & isBaselineBasedProject)
+        {
+            cmd.createArgument("is_task_in_baseline_of('" + latestBaseline + "'), '>', time('"
+                    + toCcmDate.format(lastBuild)
+                    + "') or is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName
+                    + "'), '>', time('" + toCcmDate.format(lastBuild) + "'))");
+        }
+        else
+        {
+            cmd.createArgument("(is_task_in_baseline_of('" + latestBaseline
+                    + "') and (completion_date>time('" + toCcmDate.format(lastBuild)
+                    + "') or dcm_receive_time>time('" + toCcmDate.format(lastBuild) + "'))) or "
+                    + "(is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName
+                    + "')) and ((completion_date>time('" + toCcmDate.format(lastBuild)
+                    + "')) or (dcm_receive_time>time('" + toCcmDate.format(lastBuild) + "'))))");
+        }
+
+        // Execute the command
+        try
+        {
+            cmd.execute();
+        }
+        catch (Exception e)
+        {
+            String message = "Could not query for new tasks.";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+
+        // create a modification list with discovered tasks
+        List modificationList = new ArrayList();
+        Iterator tasks = format(cmd.getStdoutAsList()).iterator();
+        while (tasks.hasNext())
+        {
+            numTasks++;
+            String[] attributes = tokeniseEntry((String) tasks.next(), 5);
+            if (attributes == null)
+            {
+                LOG.warn("Could not determine attributes for at least one "
+                        + "discovered task! The modification set is suspect.");
+                continue;
+            }
+            HLMSynergyModification mod = new HLMSynergyModification();
+            mod.setTaskNumber(attributes[0]);
+            mod.revision = attributes[1];
+            mod.userName = attributes[2];
+            mod.modifiedTime = getDateFromSynergy(attributes[3]);
+            mod.comment = attributes[4];
+
+            // Populate the included files by quering for objects in the task
+            getModifiedObjects(mod);
+
+            // Find any Change Requests with which the task is associated
+            getAssociatedCRs(mod);
+
+            // Add the modification to the list
+            modificationList.add(mod);
+        }
+
+        return modificationList;
+    }
+
+    /**
+     * Get the latest baseline name for a given release value
+     * 
+     * @param release
+     *            The release value for which to find the latest baseline
+     * @return The name of the latest Synergy baseline for the supplied release
+     *         value
+     */
+
+    private String getLatestBaseline(String release)
+    {
+        String baseline = new String();
+        String nextBaseline = new String();
+        // The format used for converting Java dates into CM Synergy dates
+        // Note that the format used to submit commands differs from the
+        // format used in the results of that command!?!
+        SimpleDateFormat toCcmDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", locale);
+
+        // Construct the CM Synergy command
+        cmd.clearArgs();
+        cmd.createArgument("query");
+        cmd.createArgument("-u");
+        cmd.createArgument("-ns");
+
+        // Set up the output format
+        cmd.createArgument("-f");
+        cmd.createArgument("%objectname");
+
+        // Construct the query string
+        cmd.createArgument("status='published_baseline' and release='" + release + "'");
+
+        // Execute the command
+        try
+        {
+            cmd.execute();
+        }
+        catch (Exception e)
+        {
+            String message = "Could not query for latest baseline";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+        String baselineString = cmd.getStdoutAsString();
+        String[] baselineList = baselineString.split("\r\n|\r|\n");
+        return baselineList[baselineList.length - 1].trim();
+    }
+
+    /**
+     * Get the Synergy Release value for a given project
+     * 
+     * @param projectFourPartName
+     *            The project whose release you wish to obtain
+     * @return The release value for the given project
+     */
+
+    private String getProjectRelease(String projectFourPartName)
+    {
+
+        cmd.clearArgs();
+        cmd.createArgument("prop");
+        cmd.createArgument("-p");
+        cmd.createArgument(projectFourPartName);
+        cmd.createArgument("-f");
+        cmd.createArgument("%release");
+        try
+        {
+            cmd.execute();
+        }
+        catch (Exception e)
+        {
+            String message = "Could not get project release";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+        String[] release = cmd.getStdoutAsString().split("\r\n|\r|\n");
+        return release[0].trim();
+    }
+
+    /**
+     * Split the results of a CM Synergy query into individual tokens. This
+     * method was added for compatibility with the 1.3 JRE.
+     * 
+     * @param line
+     *            The line to be tokenised.
+     * @param maxTokens
+     *            The maximum number of tokens in the line
+     * 
+     * @return The tokens found
+     */
+    private String[] tokeniseEntry(String line, int maxTokens)
+    {
+        int minTokens = maxTokens - 1; // comment may be absent.
+        String[] tokens = new String[maxTokens];
+        Arrays.fill(tokens, "");
+        int tokenIndex = 0;
+        for (int oldIndex = 0, index = line.indexOf(CCM_ATTR_DELIMITER, 0); true; oldIndex = index
+                + CCM_ATTR_DELIMITER.length(), index = line.indexOf(CCM_ATTR_DELIMITER, oldIndex), tokenIndex++)
+        {
+            if (tokenIndex > maxTokens)
+            {
+                LOG.debug("Too many tokens; skipping entry");
+                return null;
+            }
+            if (index == -1)
+            {
+                tokens[tokenIndex] = line.substring(oldIndex);
+                break;
+            }
+
+            tokens[tokenIndex] = line.substring(oldIndex, index);
+        }
+        if (tokenIndex < minTokens)
+        {
+            LOG.debug("Not enough tokens; skipping entry");
+            return null;
+        }
+        return tokens;
+    }
+
+    /**
+     * Populate the object list of a Modification by querying for objects
+     * associated with the task.
+     */
+    private void getModifiedObjects(HLMSynergyModification mod)
+    {
+        // Construct the CM Synergy command
+        cmd.clearArgs();
+        cmd.createArgument("task");
+        cmd.createArguments("-show", "objects");
+
+        // Set up the output format
+        cmd.createArgument("-f");
+        cmd.createArgument("%name" + CCM_ATTR_DELIMITER + // 0
+                "%version" + CCM_ATTR_DELIMITER + // 1
+                "%type" + CCM_ATTR_DELIMITER + // 2
+                "%instance" + CCM_ATTR_DELIMITER + // 3
+                "%project" + CCM_ATTR_DELIMITER + // 4
+                "%comment" + CCM_END_OBJECT); // 5
+
+        // Construct the query string
+        cmd.createArgument(mod.getTaskNumber());
+
+        // Execute the command
+        try
+        {
+            cmd.execute();
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Could not query for objects in task \"" + mod.getTaskNumber()
+                    + "\". The modification list will be incomplete!", e);
+        }
+
+        // Populate the modification with the object data from the task
+        Iterator objects = format(cmd.getStdoutAsList()).iterator();
+        while (objects.hasNext())
+        {
+            numObjects++;
+            String object = (String) objects.next();
+            String[] attributes = tokeniseEntry(object, 6);
+            if (attributes == null)
+            {
+                LOG.warn("Could not determine attributes for object associated " + "with task \""
+                        + mod.revision + "\".");
+                continue;
+            }
+            // Add each object to the HLMSynergyModification
+            mod.createModifiedObject(attributes[0], attributes[1], attributes[2], attributes[3],
+                    attributes[4], attributes[5]);
+        }
+    }
+
+    /**
+     * Queries the CM Synergy repository to find any Change Requests with which
+     * a task is associated. If the Change Synergy URL and database were
+     * provided, we will add HTML based links to those CRs.
+     * 
+     * @param mod
+     *            The modification object
+     */
+    private void getAssociatedCRs(HLMSynergyModification mod)
+    {
+        // Construct the CM Synergy command
+        cmd.clearArgs();
+        cmd.createArgument("query");
+        cmd.createArgument("-u");
+
+        // Set up the output format
+        cmd.createArguments("-f", "%displayname");
+
+        // Construct the query string
+        cmd.createArgument("cvtype='problem' and has_associated_task('task" + mod.getTaskNumber()
+                + ccmDelimiter + "1:task:probtrac')");
+
+        // Execute the command
+        try
+        {
+            cmd.execute();
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Could not query for associated CRs. The modification list "
+                    + "may be incomplete!", e);
+        }
+
+        // Add the Change Request(s) to the modification
+        List crList = cmd.getStdoutAsList();
+        if (crList != null)
+        {
+            Iterator crs = crList.iterator();
+            while (crs.hasNext())
+            {
+                String crNum = ((String) crs.next()).trim();
+                HLMSynergyModification.ChangeRequest cr = mod.createChangeRequest(crNum);
+                if (changeSynergyURL != null && ccmDb != null)
+                {
+                    StringBuffer href = new StringBuffer(changeSynergyURL);
+                    href.append("/servlet/com.continuus.webpt.servlet.PTweb?");
+                    href
+                            .append("ACTION_FLAG=frameset_form&#38;TEMPLATE_FLAG=ProblemReportView&#38;database=");
+                    href.append(ccmDb);
+                    href.append("&#38;role=User&#38;problem_number=");
+                    href.append(crNum);
+                    cr.setHref(href.toString());
+                }
+            }
+        }
+    }
+
+    /**
+     * Determine the work area location for the specified project.
+     * 
+     * @return The work area location
+     */
+    private String getWorkarea()
+    {
+        String defaultWorkarea = ".";
+
+        // Get the literal workarea from Synergy
+        cmd.clearArgs();
+        cmd.createArgument("attribute");
+        cmd.createArguments("-show", "wa_path");
+        cmd.createArguments("-project", projectFourPartName);
+
+        try
+        {
+            cmd.execute();
+            cmd.assertExitCode(0);
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Could not determine the workarea location for project \""
+                    + projectFourPartName + "\".", e);
+            return defaultWorkarea;
+        }
+
+        // The command will return the literal work area, but what we are
+        // really interested in is the top level directory within that work
+        // area.
+        File workareaPath = new File(cmd.getStdoutAsString().trim());
+        if (!workareaPath.isDirectory())
+        {
+            LOG
+                    .warn("The workarea reported by Synergy does not exist or is not accessible by this session - \""
+                            + workareaPath.toString() + "\".");
+            return defaultWorkarea;
+        }
+        String[] dirs = workareaPath.list();
+        if (dirs.length != 1)
+        {
+            LOG.warn("The workarea reported by Synergy is invalid - \"" + workareaPath.toString()
+                    + "\".");
+            return defaultWorkarea;
+        }
+
+        // Found it!
+        return workareaPath.getAbsolutePath() + File.separator + dirs[0];
+    }
+
+    /**
+     * Reconfigure the project
+     */
+    private void reconfigureProject()
+    {
+        LOG.debug("Reconfiguring project " + projectFourPartName + ".");
+
+        // Construct the CM Synergy command
+        cmd.clearArgs();
+        cmd.createArgument("reconfigure");
+        if (recurse)
+        {
+            cmd.createArgument("-recurse");
+        }
+        cmd.createArguments("-project", projectFourPartName);
+
+        try
+        {
+            cmd.execute();
+            cmd.assertExitCode(0);
+        }
+        catch (Exception e)
+        {
+            String message = "Could not reconfigure project \"" + projectFourPartName + "\".";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+    }
+
+    /**
+     * Format the output of a CM Synergy query by removing newlines introduced
+     * by comments.
+     * 
+     * @param in
+     *            The <code>List</code> to be formated
+     * @return The formated <code>List</code>
+     */
+    private List format(List in)
+    {
+        // Concatenate output lines until we hit the end of object delimiter.
+        List out = new ArrayList();
+        Iterator it = in.iterator();
+        StringBuffer buff = new StringBuffer();
+        while (it.hasNext())
+        {
+            buff.append((String) it.next());
+            int index = buff.toString().lastIndexOf(CCM_END_OBJECT);
+            if (index > -1)
+            {
+                buff.delete(index, buff.length());
+                out.add(buff.toString());
+                buff = new StringBuffer();
+            }
+        }
+        return out;
+    }
+
+    /**
+     * Parse a CM Synergy date string into a Java <code>Date</code>. If the
+     * string cannot be parsed, a warning is written to the log, and the current
+     * date is returned.
+     * 
+     * @param dateString
+     *            the date string to parse
+     * @return The date
+     * 
+     * @see #setCcmDateFormat(String)
+     */
+    private Date getDateFromSynergy(String dateString)
+    {
+        SimpleDateFormat fromCcmDate = new SimpleDateFormat(ccmDateFormat, locale);
+        Date date;
+        try
+        {
+            date = fromCcmDate.parse(dateString);
+        }
+        catch (ParseException e)
+        {
+            LOG.warn("Could not parse CM Synergy date \"" + dateString
+                    + "\" into Java Date using format \"" + ccmDateFormat + "\".", e);
+            date = new Date();
+        }
+        return date;
+    }
+
+    /**
+     * Given a CM Synergy session name, looks up the corresponding session ID.
+     * 
+     * @param sessionName
+     *            The CM Synergy session name
+     * @param sessionFile
+     *            The session map file
+     * @return The session ID.
+     */
+    public static String getSessionID(String sessionName, File sessionFile)
+            throws CruiseControlException
+    {
+
+        // If no session file was provided, try to use the default
+        if (sessionFile == null)
+        {
+            sessionFile = new File(CCM_SESSION_FILE);
+        }
+
+        // Load the persisted session information from file
+        Properties sessionProperties;
+        try
+        {
+            sessionProperties = Util.loadPropertiesFromFile(sessionFile);
+        }
+        catch (IOException e)
+        {
+            throw new CruiseControlException(e);
+        }
+
+        // Look up and return the full session ID
+        return sessionProperties.getProperty(sessionName);
+    }
+
+    /**
+     * Creates a <code>ManagedCommandline</code> configured to run CM Synergy
+     * commands.
+     * 
+     * @param ccmExe
+     *            Full path of the CM Synergy command line client (or
+     *            <code>null</code> to use the default).
+     * @param sessionName
+     *            The name of the session as stored in the map file (or
+     *            <code>null</code> to use the default session).
+     * @param sessionFile
+     *            The CM Synergy session map file (or <code>null</code> to use
+     *            the default).
+     * @return A configured <code>ManagedCommandline</code>
+     */
+    public static ManagedCommandline createCcmCommand(String ccmExe, String sessionName,
+            File sessionFile)
+    {
+
+        // If no executable name was provided, use the default
+        if (ccmExe == null)
+        {
+            ccmExe = CCM_EXE;
+        }
+
+        // Attempt to get the appropriate CM Synergy session
+        String sessionID = null;
+        if (sessionName != null)
+        {
+            try
+            {
+                sessionID = getSessionID(sessionName, sessionFile);
+                if (sessionID == null)
+                {
+                    LOG.error("Could not find a session ID for CM Synergy session named \""
+                            + sessionName + "\". Attempting to use the default (current) session.");
+                }
+            }
+            catch (CruiseControlException e)
+            {
+                LOG.error("Failed to look up CM Synergy session named \"" + sessionName
+                        + "\". Attempting to use the default (current) session.", e);
+            }
+        }
+
+        // Create a managed command line
+        ManagedCommandline command = new ManagedCommandline(ccmExe);
+
+        // If we were able to find a CM Synergy session ID, use it
+        if (sessionID != null)
+        {
+            command.setVariable(CCM_SESSION_VAR, sessionID);
+        }
+
+        return command;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergyModification.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,614 @@
+/********************************************************************************
+ * CruiseControl, a Continuous Integration Toolkit
+ * Copyright (c) 2001, ThoughtWorks, Inc.
+ * 200 E. Randolph, 25th Floor
+ * Chicago, IL 60601 USA
+ * All rights reserved.
+ *
+ * Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * 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 REGENTS 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.
+ ********************************************************************************/
+/* 
+============================================================================ 
+Name        : HLMSynergyModification.java
+Part of     : Helium 
+
+Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.jdom.CDATA;
+import org.jdom.Element;
+import org.jdom.output.XMLOutputter;
+
+import net.sourceforge.cruisecontrol.Modification;
+
+/**
+ * Data structure which holds data specific to a single modification within a CM
+ * Synergy repository.
+ * 
+ * @author <a href="mailto:rjmpsmith@hotmail.com">Robert J. Smith</a>
+ */
+public class HLMSynergyModification extends Modification
+{
+
+    private static final Logger LOG = Logger.getLogger(HLMSynergyModification.class);
+
+    private static final String MODIFICATION_TYPE = "ccmtask";
+
+    private static final String TAGNAME_MODIFICATION = "modification";
+
+    private static final String TAGNAME_OBJECT = "ccmobject";
+
+    private static final String TAGNAME_CHANGEREQUEST = "ccmcr";
+
+    private static final String TAGNAME_NAME = "name";
+
+    private static final String TAGNAME_TASKNUMBER = "task";
+
+    private static final String TAGNAME_VERSION = "version";
+
+    private static final String TAGNAME_TYPE = "type";
+
+    private static final String TAGNAME_INSTANCE = "instance";
+
+    private static final String TAGNAME_PROJECT = "project";
+
+    private static final String TAGNAME_COMMENT = "comment";
+
+    private static final String TAGNAME_DATE = "date";
+
+    private static final String TAGNAME_USER = "user";
+
+    private static final String TAGNAME_EMAIL = "email";
+
+    private static final String TAGNAME_REVISION = "revision";
+
+    private static final String TAGNAME_HTML_LINK = "a";
+
+    private static final String TAGNAME_HTML_LINK_HREF = "href";
+
+    private static final String TAGNAME_HTML_INS = "ins";
+
+    /**
+     * The CM Synergy task number represented by this modification
+     */
+    private String taskNumber;
+
+    /**
+     * A list of change requests associated with this modification
+     */
+    private List<ChangeRequest> changeRequests = new ArrayList<ChangeRequest>();
+
+    /**
+     * Creates a new <code>CMSynergyModification</code> object and sets it's
+     * modification type to "ccmtask".
+     */
+    public HLMSynergyModification()
+    {
+        super(MODIFICATION_TYPE);
+    }
+
+    public String getTaskNumber()
+    {
+        return taskNumber;
+    }
+
+    public void setTaskNumber(String taskNumber)
+    {
+        this.taskNumber = taskNumber;
+    }
+
+    public List<ChangeRequest> getChangeRequests()
+    {
+        return changeRequests;
+    }
+
+    public void setChangeRequests(List<ChangeRequest> changeRequests)
+    {
+        this.changeRequests = changeRequests;
+    }    
+    
+    /**
+     * Creates a new <code>ModifiedObject</code>, and adds it to the list of CM
+     * Synergy objects associated with the task.
+     * 
+     * @return A new <code>ModifiedObject</code>
+     */
+    public final ModifiedObject createModifiedObject()
+    {
+        ModifiedObject obj = new ModifiedObject();
+        files.add(obj);
+        return obj;
+    }
+
+    /**
+     * Creates a new <code>ModifiedObject</code>, populates the fields, and adds
+     * it to the list of CM Synergy objects associated with the task.
+     * 
+     * @param name
+     *            The object's name
+     * @param version
+     *            The object's version
+     * @param type
+     *            The object's type within CM Synergy
+     * @param instance
+     *            The object's instance
+     * @param project
+     *            The project with which the object is associated
+     * @param comment
+     *            The comment provided when checking in the object
+     * 
+     * @return A new <code>ModifiedObject</code>
+     */
+    public final ModifiedObject createModifiedObject(String name, String version, String type,
+            String instance, String project, String comment)
+    {
+        ModifiedObject obj = createModifiedObject();
+        obj.name = name;
+        obj.version = version;
+        obj.type = type;
+        obj.instance = instance;
+        obj.project = project;
+        obj.comment = comment;
+        return obj;
+    }
+
+    /**
+     * Creates a new <code>ChangeRequest</code>, and adds it to the list of
+     * change requests associated with the task.
+     * 
+     * @param number
+     *            The CR number
+     * 
+     * @return A new <code>ChangeRequest</code>
+     */
+    public final ChangeRequest createChangeRequest(String number)
+    {
+        ChangeRequest cr = new ChangeRequest();
+        cr.number = number;
+        changeRequests.add(cr);
+        return cr;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * net.sourceforge.cruisecontrol.Modification#toElement(java.text.DateFormat
+     * )
+     */
+    public Element toElement(final DateFormat formatter)
+    {
+        Element modificationElement = new Element(TAGNAME_MODIFICATION);
+        modificationElement.setAttribute(TAGNAME_TYPE, type);
+
+        if (modifiedTime != null)
+        {
+            Element dateElement = new Element(TAGNAME_DATE);
+            dateElement.addContent(formatter.format(modifiedTime));
+            modificationElement.addContent(dateElement);
+        }
+
+        if (userName != null)
+        {
+            Element userElement = new Element(TAGNAME_USER);
+            userElement.addContent(userName);
+            modificationElement.addContent(userElement);
+        }
+
+        if (comment != null)
+        {
+            Element commentElement = new Element(TAGNAME_COMMENT);
+            CDATA cd;
+            try
+            {
+                cd = new CDATA(comment);
+            }
+            catch (org.jdom.IllegalDataException e)
+            {
+                LOG.error(e);
+                cd = new CDATA("Unable to parse comment. It contains illegal data.");
+            }
+            commentElement.addContent(cd);
+            modificationElement.addContent(commentElement);
+        }
+
+        if (taskNumber != null)
+        {
+            Element taskNumberElement = new Element(TAGNAME_TASKNUMBER);
+            taskNumberElement.addContent(taskNumber);
+            modificationElement.addContent(taskNumberElement);
+        }
+
+        if (revision != null)
+        {
+            Element revisionElement = new Element(TAGNAME_REVISION);
+            revisionElement.addContent(revision);
+            modificationElement.addContent(revisionElement);
+        }
+
+        if (emailAddress != null)
+        {
+            Element emailAddressElement = new Element(TAGNAME_EMAIL);
+            emailAddressElement.addContent(emailAddress);
+            modificationElement.addContent(emailAddressElement);
+        }
+
+        for (final ModifiedFile file : files)
+        {
+            final ModifiedObject obj = (ModifiedObject) file;
+            modificationElement.addContent(obj.toElement());
+        }
+
+        for (final ChangeRequest cr : changeRequests)
+        {
+            modificationElement.addContent(cr.toElement());
+        }
+
+        return modificationElement;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+        StringBuffer sb = new StringBuffer();
+
+        sb.append("Task Number: ").append(taskNumber).append('\n');
+        sb.append("Owner: ").append(userName).append('\n');
+        sb.append("Release: ").append(revision).append('\n');
+        sb.append("Completion Date: ").append(formatter.format(modifiedTime)).append('\n');
+        sb.append("Synopsis: ").append(comment).append('\n');
+
+        for (final ChangeRequest cr : changeRequests)
+        {
+            sb.append("\tChange Request: ").append(cr.number).append('\n');
+        }
+
+        for (final ModifiedFile file : files)
+        {
+            ModifiedObject obj = (ModifiedObject) file;
+            sb.append("\tAssociated Object: ").append(obj.name).append('\n');
+            sb.append("\tVersion: ").append(obj.version).append('\n');
+            sb.append("\tType: ").append(obj.type).append('\n');
+            sb.append("\tInstance: ").append(obj.instance).append('\n');
+            sb.append("\tProject: ").append(obj.project).append('\n');
+            sb.append("\tComment: ").append(obj.comment).append('\n');
+        }
+
+        sb.append('\n');
+        return sb.toString();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.sourceforge.cruisecontrol.Modification#log(java.text.DateFormat)
+     */
+    public void log(final DateFormat formatter)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Task Number: " + taskNumber);
+            LOG.debug("Owner: " + userName);
+            LOG.debug("Release: " + revision);
+            LOG.debug("Completion Date: " + formatter.format(modifiedTime));
+            LOG.debug("Synopsis: " + comment);
+
+            for (final ChangeRequest cr : changeRequests)
+            {
+                LOG.debug("\tChange Request: " + cr.number + "\n");
+            }
+
+            for (final ModifiedFile file : files)
+            {
+                final ModifiedObject obj = (ModifiedObject) file;
+                LOG.debug("\tAssociated Object: " + obj.name);
+                LOG.debug("\tVersion: " + obj.version);
+                LOG.debug("\tType: " + obj.type);
+                LOG.debug("\tInstance: " + obj.instance);
+                LOG.debug("\tProject: " + obj.project);
+                LOG.debug("\tComment: " + obj.comment);
+            }
+
+            LOG.debug("");
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element,
+     * java.text.DateFormat)
+     */
+    public void fromElement(final Element modification, final DateFormat formatter)
+    {
+
+        type = modification.getAttributeValue(TAGNAME_TYPE);
+
+        try
+        {
+            String s = modification.getChildText(TAGNAME_DATE);
+            if (s == null)
+            {
+                XMLOutputter outputter = new XMLOutputter();
+                LOG.info("XML: " + outputter.outputString(modification));
+            }
+            modifiedTime = formatter.parse(s);
+        }
+        catch (ParseException e)
+        {
+            modifiedTime = new Date();
+        }
+
+        taskNumber = modification.getChildText(TAGNAME_TASKNUMBER);
+        revision = modification.getChildText(TAGNAME_REVISION);
+        userName = modification.getChildText(TAGNAME_USER);
+        comment = modification.getChildText(TAGNAME_COMMENT);
+        emailAddress = modification.getChildText(TAGNAME_EMAIL);
+
+        files.clear();
+        List modfiles = modification.getChildren(TAGNAME_OBJECT);
+        if (modfiles != null)
+        {
+            Iterator it = modfiles.iterator();
+            while (it.hasNext())
+            {
+                Element modfileElement = (Element) it.next();
+                ModifiedObject modfile = new ModifiedObject();
+                modfile.fromElement(modfileElement);
+                files.add(modfile);
+            }
+        }
+
+        changeRequests.clear();
+        List crs = modification.getChildren(TAGNAME_CHANGEREQUEST);
+        if (crs != null)
+        {
+            Iterator it = crs.iterator();
+            while (it.hasNext())
+            {
+                Element crElement = (Element) it.next();
+                ChangeRequest cr = new ChangeRequest();
+                cr.fromElement(crElement);
+                changeRequests.add(cr);
+            }
+        }
+    }
+
+    /**
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(Object o)
+    {
+        if (o == null || !(o instanceof HLMSynergyModification))
+        {
+            return false;
+        }
+        HLMSynergyModification mod = (HLMSynergyModification) o;
+        return type.equals(mod.type) && taskNumber.equals(mod.taskNumber);
+    }
+
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((type == null) ? 0 : type.hashCode())
+                + ((taskNumber == null) ? 0 : taskNumber.hashCode());
+        return result;
+    }
+
+    /**
+     * Data structure which holds data specific to a single object included in a
+     * modification within a CM Synergy repository.
+     * 
+     * @author <a href="mailto:rjmpsmith@hotmail.com">Robert J. Smith </a>
+     */
+    public class ModifiedObject extends Modification.ModifiedFile
+    {
+
+        // Let's not deal with possible null values
+        private String name = "";
+
+        private String version = "";
+
+        private String type = "";
+
+        private String instance = "";
+
+        private String project = "";
+
+        private String comment = "";
+
+        // Only the parent class should call the constructor
+        protected ModifiedObject()
+        {
+            super(null, null, null, null);
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see
+         * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element
+         * , java.text.DateFormat)
+         */
+        public Element toElement()
+        {
+            Element element = new Element(TAGNAME_OBJECT);
+
+            Element nameElement = new Element(TAGNAME_NAME);
+            nameElement.addContent(name);
+            element.addContent(nameElement);
+
+            Element versionElement = new Element(TAGNAME_VERSION);
+            versionElement.addContent(version);
+            element.addContent(versionElement);
+
+            Element typeElement = new Element(TAGNAME_TYPE);
+            typeElement.addContent(type);
+            element.addContent(typeElement);
+
+            Element instanceElement = new Element(TAGNAME_INSTANCE);
+            instanceElement.addContent(instance);
+            element.addContent(instanceElement);
+
+            Element projectElement = new Element(TAGNAME_PROJECT);
+            projectElement.addContent(project);
+            element.addContent(projectElement);
+
+            Element commentElement = new Element(TAGNAME_COMMENT);
+            CDATA cd;
+            try
+            {
+                cd = new CDATA(comment);
+            }
+            catch (org.jdom.IllegalDataException e)
+            {
+                LOG.error(e);
+                cd = new CDATA("Unable to parse comment.  It contains illegal data.");
+            }
+            commentElement.addContent(cd);
+            element.addContent(commentElement);
+
+            return element;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see
+         * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element
+         * , java.text.DateFormat)
+         */
+        public void fromElement(Element modification)
+        {
+            name = modification.getChildText(TAGNAME_NAME);
+            version = modification.getChildText(TAGNAME_VERSION);
+            type = modification.getChildText(TAGNAME_TYPE);
+            instance = modification.getChildText(TAGNAME_INSTANCE);
+            project = modification.getChildText(TAGNAME_PROJECT);
+            comment = modification.getChildText(TAGNAME_COMMENT);
+        }
+
+    }
+
+    /**
+     * Data structure which holds data specific to a Change Request associated
+     * with a modification within a CM Synergy repository.
+     * 
+     * @author <a href="mailto:rjmpsmith@hotmail.com">Robert J. Smith </a>
+     */
+    public class ChangeRequest
+    {
+
+        private String href;
+
+        private String number = "";
+
+        // Only the parent class should call the constructor
+        protected ChangeRequest()
+        {
+        }
+
+        public void setHref(String href)
+        {
+            this.href = href;
+        }
+        /*
+         * (non-Javadoc)
+         * 
+         * @see
+         * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element
+         * , java.text.DateFormat)
+         */
+        public Element toElement()
+        {
+            Element element = new Element(TAGNAME_CHANGEREQUEST);
+
+            if (href != null)
+            {
+                Element linkElement = new Element(TAGNAME_HTML_LINK);
+                linkElement.setAttribute(TAGNAME_HTML_LINK_HREF, href);
+                linkElement.addContent(number);
+                element.addContent(linkElement);
+            }
+            else
+            {
+                Element insElement = new Element(TAGNAME_HTML_INS);
+                insElement.addContent(number);
+                element.addContent(insElement);
+            }
+
+            return element;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see
+         * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element
+         * , java.text.DateFormat)
+         */
+        public void fromElement(Element modification)
+        {
+            Element linkElement = modification.getChild(TAGNAME_HTML_LINK);
+            if (linkElement != null)
+            {
+                href = linkElement.getAttributeValue(TAGNAME_HTML_LINK_HREF);
+                number = linkElement.getText();
+            }
+            else
+            {
+                Element insElement = modification.getChild(TAGNAME_HTML_INS);
+                if (insElement != null)
+                {
+                    number = insElement.getText();
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/ModificationCache.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,76 @@
+/* 
+============================================================================ 
+Name        : BaselineModificationCache.java 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import net.sourceforge.cruisecontrol.Modification;
+
+/**
+ * This helper class is a cache to store baseline changes, 
+ * which are not timed based operations.
+ *
+ */
+public class ModificationCache
+{
+    private List<Modification> cache = new ArrayList<Modification>();
+    
+    /**
+     * Add a modification to the cache.
+     * @param m the modification.
+     */
+    public synchronized void add(Modification m) {
+        cache.add(m);
+    }
+    
+    /**
+     * Get the modification between the interval.
+     * @param lastBuild
+     * @param now
+     * @return
+     */
+    public synchronized List<Modification> getModifications(Date lastBuild, Date now) {
+        List<Modification> result = new ArrayList<Modification>();
+        for (Modification m : cache) {
+            if (m.modifiedTime.after(lastBuild) && m.modifiedTime.before(now)) {
+                result.add(m);
+            }
+        }
+        return result;
+    }
+    
+    /**
+     * Remove cleanup the cache, removes all stuff older than last build.
+     * @param lastBuild
+     */
+    public synchronized void cleanup(Date lastBuild) {
+        List<Modification> result = new ArrayList<Modification>();
+        for (Modification m : cache) {
+            if (m.modifiedTime.after(lastBuild)) {
+                result.add(m);
+            }
+        }
+        cache = result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/OperationFailedException.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+/********************************************************************************
+ * CruiseControl, a Continuous Integration Toolkit
+ * Copyright (c) 2001, ThoughtWorks, Inc.
+ * 200 E. Randolph, 25th Floor
+ * Chicago, IL 60601 USA
+ * All rights reserved.
+ *
+ * Redistribution and use 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 ThoughtWorks, Inc., CruiseControl, nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * 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 REGENTS 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.
+ ********************************************************************************/
+/* 
+============================================================================ 
+Name        : HLMSynergyModification.java
+Part of     : Helium 
+
+Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+public class OperationFailedException extends RuntimeException
+{
+    /**
+     * The serial ID.
+     */
+    private static final long serialVersionUID = 1778679212994311647L;
+
+    /**
+     * The constructor
+     * @param message error message
+     * @param e the real error.
+     */
+    public OperationFailedException(String message, Exception e)
+    {
+        super(message, e);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/SynergyBaselineProjects.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,92 @@
+/* 
+============================================================================ 
+Name        : SynergyBaselineProjects.java 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+import net.sourceforge.cruisecontrol.util.ManagedCommandline;
+
+public class SynergyBaselineProjects
+{
+    private static final Logger LOG = Logger.getLogger(SynergyBaselineProjects.class);
+
+    private ManagedCommandline cmd;
+
+    private String project;
+
+    public SynergyBaselineProjects(ManagedCommandline cmd, String project)
+    {
+        this.cmd = cmd;
+        this.project = project;
+        // Configure the logger to be always in debug mode.
+        LOG.setLevel(Level.DEBUG);
+    }
+
+    /**
+     * Running the following command: ccm query
+     * "hierarchy_project_members(is_project_in_baseline_of(is_baseline_in_pg_of
+     * ( is_project_grouping_of('<project_four_part_name>'))),none)"
+     * 
+     * @return a list of baseline projects
+     * @throws IOException
+     */
+    public List<String> getBaselineProjects()
+    {
+        List<String> baselines = new ArrayList<String>();
+        LOG.info("Querying baselines projects for " + project);
+        cmd.clearArgs();
+        cmd.createArgument("query");
+        cmd.createArgument("hierarchy_project_members(is_project_in_baseline_of("
+                + "is_baseline_in_pg_of(is_project_grouping_of('" + project + "'))),none)");
+        cmd.createArgument("-u");
+        cmd.createArgument("-f");
+        cmd.createArgument("%objectname");
+        try
+        {
+            cmd.execute();
+            cmd.assertExitCode(0);
+        }
+        catch (Exception e)
+        {
+            String message = "Could not query baseline projects for \"" + project + "\".";
+            LOG.error(message, e);
+            throw new OperationFailedException(message, e);
+        }
+        LOG.info("stderr: " + cmd.getStderrAsString());
+        LOG.info("stdout: " + cmd.getStdoutAsString());
+
+        for (Object o : cmd.getStdoutAsList())
+        {
+            String l = (String) o;
+            if (l.length() > 0)
+            {
+                LOG.info("Baseline: " + l);
+                baselines.add(l);
+            }
+        }
+        return baselines;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMapper.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,112 @@
+/* 
+============================================================================ 
+Name        : XPathMapper.java 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+import java.util.List;
+import net.sourceforge.cruisecontrol.CruiseControlException;
+import org.jdom.*;
+import org.jdom.xpath.*;
+import org.apache.log4j.Logger;
+
+public class XPathMapper
+{
+    private static final Logger LOG = Logger.getLogger(XPathMapper.class);
+
+    private String expression;
+
+    private String value;
+
+    private String name = "";
+
+
+    /**
+     * Validating the configuration input. 
+     * @throws CruiseControlException
+     */
+    public void validate() throws CruiseControlException
+    {
+        // Has expression been defined?
+        if (name == null)
+            throw new CruiseControlException("'expression' attribute not defined.");
+        if (expression == null && value == null)
+            throw new CruiseControlException(
+                    "Either 'expression' or 'value' attribute must be defined.");
+        if (value != null && expression != null)
+            throw new CruiseControlException(
+                    "You can define both attributes 'expression' and 'value'.");
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setExpression(String expression)
+    {
+        this.expression = expression;
+    }
+
+    public String getExpression()
+    {
+        return expression;
+    }
+
+    public void setValue(String value)
+    {
+        this.value = value;
+    }
+
+    public String getValue()
+    {
+        return value;
+    }
+
+    public String extract(Object element) throws CruiseControlException
+    {
+        if (value != null)
+            return value;
+
+        try
+        {
+            List nodes = (List) XPath.selectNodes(element, this.getExpression());
+            if (nodes.size() > 1)
+                throw new CruiseControlException("'" + this.getExpression()
+                        + "' returns several results.");
+            if (nodes.size() < 1)
+                throw new CruiseControlException("'" + this.getExpression()
+                        + "' does not return any result.");
+
+            Attribute attr = (Attribute) nodes.get(0);
+            return attr.getValue();
+        }
+        catch (org.jdom.JDOMException exc)
+        {
+            throw new CruiseControlException("Could not extract data using '"
+                    + this.getExpression() + "' " + exc);
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMatcher.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,117 @@
+/* ============================================================================ 
+Name        : XPathMatcher.java
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================ */
+package com.nokia.cruisecontrol.sourcecontrol;
+
+import net.sourceforge.cruisecontrol.CruiseControlException;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+import java.util.Map;
+import org.apache.log4j.Logger;
+
+public class XPathMatcher
+{
+    /**
+     * An instance of the logging class
+     */
+    private static final Logger LOG = Logger.getLogger(XPathMatcher.class);
+
+    private String expression;
+
+    private String name = "";
+
+    private Vector mappers = new Vector();
+
+
+    public List getModifications(Date arg0, Date arg1)
+    {
+        return null;
+    }
+
+    public Map getProperties()
+    {
+        return null;
+    }
+
+    /**
+     * Validate the input from the configuration. 
+     * @throws CruiseControlException
+     */
+    public void validate() throws CruiseControlException
+    {
+        // Has expression been defined?
+        if (expression == null)
+            throw new CruiseControlException("'expression' attribute not defined.");
+        for (Iterator i = mappers.iterator(); i.hasNext();)
+        {
+            XPathMapper mapper = (XPathMapper) i.next();
+            mapper.validate();
+        }
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setExpression(String expression)
+    {
+        this.expression = expression;
+    }
+
+    public String getExpression()
+    {
+        return expression;
+    }
+
+    public Object createMap()
+    {
+        LOG.info("==== Creating a mapper object.");
+        XPathMapper mapper = new XPathMapper();
+        mappers.add(mapper);
+        return mapper;
+    }
+
+    public XPathMapper getMapper(String name)
+    {
+        LOG.info("==== Get mapper: " + name);
+
+        for (Iterator i = mappers.iterator(); i.hasNext();)
+        {
+            XPathMapper mapper = (XPathMapper) i.next();
+            if (mapper.getName().equals(name))
+                return mapper;
+        }
+        return null;
+    }
+
+    public boolean hasMapper(String name)
+    {
+        LOG.info("==== Has mapper: => " + name);
+        return this.getMapper(name) != null;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/src/com/nokia/jetty/deployer/WebAppDeployer.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,302 @@
+//========================================================================
+//$Id: WebAppDeployer.java 2032 2007-07-26 06:11:24Z janb $
+//Copyright 2006 Mort Bay Consulting Pty. Ltd.
+//------------------------------------------------------------------------
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at 
+//http://www.apache.org/licenses/LICENSE-2.0
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+//========================================================================
+/* 
+ ============================================================================ 
+ Name        : WebAppDeployer.java
+ Part of     : Helium 
+
+ Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+ ============================================================================
+ */
+
+package com.nokia.jetty.deployer;
+
+import java.util.ArrayList;
+
+import org.apache.log4j.Logger;
+import org.mortbay.component.AbstractLifeCycle;
+import org.mortbay.jetty.Handler;
+import org.mortbay.jetty.HandlerContainer;
+import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.jetty.handler.ContextHandlerCollection;
+import org.mortbay.jetty.webapp.WebAppContext;
+import org.mortbay.resource.Resource;
+import org.mortbay.util.URIUtil;
+
+/**
+ * Web Application Deployer.
+ * 
+ * The class searches a directory for and deploys standard web application. At
+ * startup, the directory specified by {@link #setWebAppDir(String)} is searched
+ * for subdirectories (excluding hidden and CVS) or files ending with ".zip" or
+ * "*.war". For each webapp discovered is passed to a new instance of
+ * {@link WebAppContext} (or a subclass specified by {@link #getContexts()}.
+ * {@link ContextHandlerCollection#getContextClass()}
+ * 
+ * This deployer does not do hot deployment or undeployment. Nor does it support
+ * per webapplication configuration. For these features see
+ * {@link ContextDeployer}.
+ * 
+ * @see {@link ContextDeployer}
+ */
+public class WebAppDeployer extends AbstractLifeCycle
+{
+    private Logger log = Logger.getLogger(this.getClass());
+
+    private HandlerContainer contexts;
+
+    private String webAppDir;
+
+    private String defaultsDescriptor;
+
+    private String[] configurationClasses;
+
+    private boolean extract;
+
+    private boolean parentLoaderPriority;
+
+    private boolean allowDuplicates;
+
+    private ArrayList<WebAppContext> deployed;
+
+    private String extraClasspath;
+
+    public String[] getConfigurationClasses()
+    {
+        return configurationClasses;
+    }
+
+    public void setConfigurationClasses(String[] configurationClasses)
+    {
+        this.configurationClasses = configurationClasses;
+    }
+
+    public HandlerContainer getContexts()
+    {
+        return contexts;
+    }
+
+    public void setContexts(HandlerContainer contexts)
+    {
+        this.contexts = contexts;
+    }
+
+    public String getDefaultsDescriptor()
+    {
+        return defaultsDescriptor;
+    }
+
+    public void setDefaultsDescriptor(String defaultsDescriptor)
+    {
+        this.defaultsDescriptor = defaultsDescriptor;
+    }
+
+    public boolean isExtract()
+    {
+        return extract;
+    }
+
+    public void setExtract(boolean extract)
+    {
+        this.extract = extract;
+    }
+
+    public boolean isParentLoaderPriority()
+    {
+        return parentLoaderPriority;
+    }
+
+    public void setParentLoaderPriority(boolean parentPriorityClassLoading)
+    {
+        parentLoaderPriority = parentPriorityClassLoading;
+    }
+
+    public String getWebAppDir()
+    {
+        return webAppDir;
+    }
+
+    public void setWebAppDir(String dir)
+    {
+        this.webAppDir = dir;
+    }
+
+    public boolean getAllowDuplicates()
+    {
+        return allowDuplicates;
+    }
+
+    public void setExtraClasspath(String extraClasspath)
+    {
+        this.extraClasspath = extraClasspath;
+    }
+
+    public String getExtraClasspath()
+    {
+        return extraClasspath;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param allowDuplicates
+     *            If false, do not deploy webapps that have already been
+     *            deployed or duplicate context path
+     */
+    public void setAllowDuplicates(boolean allowDuplicates)
+    {
+        this.allowDuplicates = allowDuplicates;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @throws Exception
+     */
+    public void doStart() throws Exception
+    {
+        deployed = new ArrayList<WebAppContext>();
+
+        scan();
+
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Scan for webapplications.
+     * 
+     * @throws Exception
+     */
+    public void scan() throws Exception
+    {
+        if (contexts == null)
+            throw new IllegalArgumentException("No HandlerContainer");
+
+        Resource r = Resource.newResource(this.webAppDir);
+        if (!r.exists())
+            throw new IllegalArgumentException("No such webapps resource " + r);
+
+        if (!r.isDirectory())
+            throw new IllegalArgumentException("Not directory webapps resource " + r);
+
+        String[] files = r.list();
+
+        files: for (int f = 0; files != null && f < files.length; f++)
+        {
+            String context = files[f];
+
+            if (context.equalsIgnoreCase("CVS/") || context.equalsIgnoreCase("CVS")
+                    || context.startsWith("."))
+                continue;
+
+            Resource app = r.addPath(r.encode(context));
+
+            if (context.toLowerCase().endsWith(".war") || context.toLowerCase().endsWith(".jar"))
+            {
+                context = context.substring(0, context.length() - 4);
+                Resource unpacked = r.addPath(context);
+                if (unpacked != null && unpacked.exists() && unpacked.isDirectory())
+                    continue;
+            }
+            else if (!app.isDirectory())
+                continue;
+
+            if (context.equalsIgnoreCase("root") || context.equalsIgnoreCase("root/"))
+                context = URIUtil.SLASH;
+            else
+                context = "/" + context;
+            if (context.endsWith("/") && context.length() > 0)
+                context = context.substring(0, context.length() - 1);
+
+            // Check the context path has not already been added or the webapp
+            // itself is not already deployed
+            if (!allowDuplicates)
+            {
+                Handler[] installed = contexts.getChildHandlersByClass(ContextHandler.class);
+                for (int i = 0; i < installed.length; i++)
+                {
+                    ContextHandler c = (ContextHandler) installed[i];
+
+                    if (context.equals(c.getContextPath()))
+                        continue files;
+
+                    String path;
+                    if (c instanceof WebAppContext)
+                        path = ((WebAppContext) c).getWar();
+                    else
+                        path = (c.getBaseResource() == null) ? "" : c.getBaseResource().getFile()
+                                .getAbsolutePath();
+
+                    if (path.equals(app.getFile().getAbsolutePath()))
+                        continue files;
+
+                }
+            }
+
+            // create a webapp
+            WebAppContext wah = null;
+            if (contexts instanceof ContextHandlerCollection
+                    && WebAppContext.class.isAssignableFrom(((ContextHandlerCollection) contexts)
+                            .getContextClass()))
+            {
+                try
+                {
+                    wah = (WebAppContext) ((ContextHandlerCollection) contexts).getContextClass()
+                            .newInstance();
+                }
+                catch (Exception e)
+                {
+                    throw new Error(e);
+                }
+            }
+            else
+            {
+                wah = new WebAppContext();
+            }
+
+            // configure it
+            wah.setContextPath(context);
+            if (configurationClasses != null)
+                wah.setConfigurationClasses(configurationClasses);
+            if (defaultsDescriptor != null)
+                wah.setDefaultsDescriptor(defaultsDescriptor);
+            wah.setExtractWAR(extract);
+            wah.setWar(app.toString());
+            wah.setParentLoaderPriority(parentLoaderPriority);
+            log.info("Adding additional path to the WebAppContext");
+            if (extraClasspath != null)
+            {
+                log.info("Adding additional path to the WebAppContext: " + extraClasspath);
+                System.out.println("Adding additional path to the WebAppContext: "
+                        + extraClasspath);
+                wah.setExtraClasspath(extraClasspath);
+            }
+            // add it
+            contexts.addHandler(wah);
+            deployed.add(wah);
+
+            if (contexts.isStarted())
+                contexts.start(); // TODO Multi exception
+        }
+    }
+
+    public void doStop() throws Exception
+    {
+        for (int i = deployed.size(); i-- > 0;)
+        {
+            ContextHandler wac = (ContextHandler) deployed.get(i);
+            wac.stop();// TODO Multi exception
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/templates/HELIUM-README.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+Cruise control Helium Integration
+=================================
+
+Cruise Control version: ${cc.version}    		
+HCC version: ${helium.custom.version}
+
+Helium additions
+----------------
+${overlay.content}
+
+    		
+How to use CC Helium customizations
+-----------------------------------
+
+In config.xml:
+----8<----8<----8<----8<----8<----8<----8<----
+<cruisecontrol>
+	<!-- Helium customization. -->
+	<plugin name="xmlmodificationset" classname="com.nokia.cruisecontrol.sourcecontrol.XMLModificationSet"/>
+	<plugin name="hlmmodificationset" classname="com.nokia.cruisecontrol.sourcecontrol.HLMSynergy"/>
+	...
+----8<----8<----8<----8<----8<----8<----8<----
+
+How to use Dashboard Helium customizations
+------------------------------------------
+
+To enable the Helium build summary widget please use the Helium specific
+dashboard configuration file:
+set CCDIR=<PATH_TO_CC_HOME>
+<HELIUM_CCC_DIR>\cruisecontrol.bat
+    		
+How to configure the Ant builder
+--------------------------------
+
+To prevent log.xml missing exception while running Helium please configure the ant builder this way:
+<ant .... uselogger="false" showProgress="false"... >
+   <!-- Configure the XMLLogger -->
+   <listener classname="org.apache.tools.ant.XmlLogger"/>
+   <property name="XmlLogger.file" value="${configuration.dir}/log.xml" />
+</ant>
+
+_______________
+The Helium Team
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/templates/ivy.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+<!-- 
+============================================================================ 
+Name        : ivy.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="1.3">
+    <info organisation="helium-external"
+          module="cruisecontrol"
+          revision="${cc.version}-hc.${helium.custom.version}" />
+    
+    <publications>
+        <artifact name="cruisecontrol-bin" type="binary" ext="zip" url="http://helium.nmp.nokia.com/svn/cruisecontrol/branches/${cc.version}-hc.${helium.custom.version}/official/cruisecontrol-bin-${cc.version}.zip"/>
+    </publications>
+
+	<dependencies>
+		<dependency org="helium-external" name="hccc" rev="${helium.custom.version}">
+			<artifact name="hccc" type="binary" ext="zip" url="http://helium.nmp.nokia.com/svn/cruisecontrol/branches/${cc.version}-hc.${helium.custom.version}/bin/hccc_${helium.custom.version}-${cc.version}.zip"/>
+		</dependency>
+	</dependencies>	
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/cc-customizations/tests/src/com/nokia/cruisecontrol/sourcecontrol/tests/TestModificationCache.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+/* 
+============================================================================ 
+Name        : TestModificationCache.java
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+ */
+package com.nokia.cruisecontrol.sourcecontrol.tests;
+
+import org.junit.*;
+
+import com.nokia.cruisecontrol.sourcecontrol.ModificationCache;
+
+import static org.junit.Assert.*;
+import net.sourceforge.cruisecontrol.Modification;
+import java.util.Date;
+import java.util.List;
+
+public class TestModificationCache 
+{
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Check the getModifications.
+     * @throws Exception
+     */
+    @Test
+    public void test_getModifications() throws Exception {
+        ModificationCache cache = new ModificationCache();
+        // before
+        Modification m = new Modification();
+        m.comment = "before";
+        m.modifiedTime = new Date(100);
+        cache.add(m);
+
+        // in
+        m = new Modification();
+        m.comment = "in";
+        m.modifiedTime = new Date(150);
+        cache.add(m);
+
+        // after
+        m = new Modification();
+        m.comment = "after";
+        m.modifiedTime = new Date(200);
+        cache.add(m);
+        
+        List<Modification> mods = cache.getModifications(new Date(110), new Date(199));
+        assertTrue("The result must contain only one element.", mods.size() == 1);
+        assertTrue("The element should have the comment 'in'.", mods.get(0).comment.equals("in"));
+    }
+
+    /**
+     * Check the cleanup.
+     * @throws Exception
+     */
+    @Test
+    public void test_cleanup() throws Exception {
+        ModificationCache cache = new ModificationCache();
+        // before
+        Modification m = new Modification();
+        m.comment = "before";
+        m.modifiedTime = new Date(100);
+        cache.add(m);
+
+        // in
+        m = new Modification();
+        m.comment = "in";
+        m.modifiedTime = new Date(150);
+        cache.add(m);
+
+        // after
+        m = new Modification();
+        m.comment = "after";
+        m.modifiedTime = new Date(200);
+        cache.add(m);
+        
+        cache.cleanup(new Date(199));
+        List<Modification> mods = cache.getModifications(new Date(0), new Date(1000));
+        assertTrue("The result must contain only one element.", mods.size() == 1);
+        assertTrue("The element should have the comment 'in'.", mods.get(0).comment.equals("after"));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/COPYING.TXT	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/example.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,70 @@
+C:\>filedisk
+syntax:
+filedisk /mount  <devicenumber> <filename> [size[k|M|G] | /ro | /cd] <drive:>
+filedisk /umount <drive:>
+filedisk /status <drive:>
+
+filename formats:
+  c:\path\filedisk.img
+  \Device\Harddisk0\Partition1\path\filedisk.img
+  \\server\share\path\filedisk.img
+
+example:
+filedisk /mount  0 c:\temp\filedisk.img 8M f:
+filedisk /mount  1 c:\temp\cdimage.iso /cd i:
+filedisk /umount f:
+filedisk /umount i:
+
+C:\>filedisk /mount 0 c:\temp\filedisk.img 8M f:
+
+C:\>format /fs:fat f:
+The type of the file system is RAW.
+The new file system is FAT.
+
+WARNING, ALL DATA ON NON-REMOVABLE DISK
+DRIVE F: WILL BE LOST!
+Proceed with Format (Y/N)? y
+Verifying 7M
+Initializing the File Allocation Table (FAT)...
+Volume label (11 characters, ENTER for none)? filedisk
+Format complete.
+
+    8 353 792 bytes total disk space.
+    8 353 792 bytes available on disk.
+
+        2 048 bytes in each allocation unit.
+        4 079 allocation units available on disk.
+
+           12 bits in each FAT entry.
+
+Volume Serial Number is 28DF-0C81
+
+C:\>dir f:
+ Volume in drive F is FILEDISK
+ Volume Serial Number is 28DF-0C81
+
+ Directory of F:\
+
+File Not Found
+
+C:\>chkdsk f:
+The type of the file system is FAT.
+Volume FILEDISK created 2002-11-24 14:25
+Volume Serial Number is 28DF-0C81
+Windows is verifying files and folders...
+File and folder verification is complete.
+Windows has checked the file system and found no problems.
+
+    8 353 792 bytes total disk space.
+    8 353 792 bytes available on disk.
+
+        2 048 bytes in each allocation unit.
+        4 079 total allocation units on disk.
+        4 079 allocation units available on disk.
+
+C:\>filedisk /status f:
+f: \??\c:\temp\filedisk.img Size: 8388608 bytes
+
+C:\>filedisk /umount f:
+
+C:\>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/exe/MAKEFILE	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/exe/filedisk.c	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,423 @@
+/*
+    Control program for a virtual disk driver for Windows NT/2000/XP.
+    Copyright (C) 1999, 2000, 2001, 2002 Bo Brantén.
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+    This program 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 General Public License for more details.
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <windows.h>
+#include <winioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "filedisk.h"
+
+int FileDiskSyntax(void)
+{
+    fprintf(stderr, "syntax:\n");
+    fprintf(stderr, "filedisk /mount  <devicenumber> <filename> [size[k|M|G] | /ro | /cd] <drive:>\n");
+    fprintf(stderr, "filedisk /umount <drive:>\n");
+    fprintf(stderr, "filedisk /status <drive:>\n");
+    fprintf(stderr, "\n");
+    fprintf(stderr, "filename formats:\n");
+    fprintf(stderr, "  c:\\path\\filedisk.img\n");
+    fprintf(stderr, "  \\Device\\Harddisk0\\Partition1\\path\\filedisk.img\n");
+    fprintf(stderr, "  \\\\server\\share\\path\\filedisk.img\n");
+    fprintf(stderr, "\n");
+    fprintf(stderr, "example:\n");
+    fprintf(stderr, "filedisk /mount  0 c:\\temp\\filedisk.img 8M f:\n");
+    fprintf(stderr, "filedisk /mount  1 c:\\temp\\cdimage.iso /cd i:\n");
+    fprintf(stderr, "filedisk /umount f:\n");
+    fprintf(stderr, "filedisk /umount i:\n");
+
+    return -1;
+}
+
+void PrintLastError(char* Prefix)
+{
+    LPVOID lpMsgBuf;
+
+    FormatMessage( 
+        FORMAT_MESSAGE_ALLOCATE_BUFFER |
+        FORMAT_MESSAGE_FROM_SYSTEM |
+        FORMAT_MESSAGE_IGNORE_INSERTS,
+        NULL,
+        GetLastError(),
+        0,
+        (LPTSTR) &lpMsgBuf,
+        0,
+        NULL
+        );
+
+    fprintf(stderr, "%s %s", Prefix, (LPTSTR) lpMsgBuf);
+
+    LocalFree(lpMsgBuf);
+}
+
+int
+FileDiskMount(
+    int                     DeviceNumber,
+    POPEN_FILE_INFORMATION  OpenFileInformation,
+    char                    DriveLetter,
+    BOOLEAN                 CdImage
+)
+{
+    char    VolumeName[] = "\\\\.\\ :";
+    char    DeviceName[255];
+    HANDLE  Device;
+    DWORD   BytesReturned;
+
+    VolumeName[4] = DriveLetter;
+
+    Device = CreateFile(
+        VolumeName,
+        GENERIC_READ | GENERIC_WRITE,
+        FILE_SHARE_READ | FILE_SHARE_WRITE,
+        NULL,
+        OPEN_EXISTING,
+        FILE_FLAG_NO_BUFFERING,
+        NULL
+        );
+
+    if (Device != INVALID_HANDLE_VALUE)
+    {
+        SetLastError(ERROR_BUSY);
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    if (CdImage)
+    {
+        sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber);
+    }
+    else
+    {
+        sprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber);
+    }
+
+    if (!DefineDosDevice(
+        DDD_RAW_TARGET_PATH,
+        &VolumeName[4],
+        DeviceName
+        ))
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    Device = CreateFile(
+        VolumeName,
+        GENERIC_READ | GENERIC_WRITE,
+        FILE_SHARE_READ | FILE_SHARE_WRITE,
+        NULL,
+        OPEN_EXISTING,
+        FILE_FLAG_NO_BUFFERING,
+        NULL
+        );
+
+    if (Device == INVALID_HANDLE_VALUE)
+    {
+        PrintLastError(&VolumeName[4]);
+        DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
+        return -1;
+    }
+
+    if (!DeviceIoControl(
+        Device,
+        IOCTL_FILE_DISK_OPEN_FILE,
+        OpenFileInformation,
+        sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1,
+        NULL,
+        0,
+        &BytesReturned,
+        NULL
+        ))
+    {
+        PrintLastError("FileDisk:");
+        DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
+        return -1;
+    }
+
+    return 0;
+}
+
+int FileDiskUmount(char DriveLetter)
+{
+    char    VolumeName[] = "\\\\.\\ :";
+    HANDLE  Device;
+    DWORD   BytesReturned;
+
+    VolumeName[4] = DriveLetter;
+
+    Device = CreateFile(
+        VolumeName,
+        GENERIC_READ | GENERIC_WRITE,
+        FILE_SHARE_READ | FILE_SHARE_WRITE,
+        NULL,
+        OPEN_EXISTING,
+        FILE_FLAG_NO_BUFFERING,
+        NULL
+        );
+
+    if (Device == INVALID_HANDLE_VALUE)
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    if (!DeviceIoControl(
+        Device,
+        FSCTL_LOCK_VOLUME,
+        NULL,
+        0,
+        NULL,
+        0,
+        &BytesReturned,
+        NULL
+        ))
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    if (!DeviceIoControl(
+        Device,
+        IOCTL_FILE_DISK_CLOSE_FILE,
+        NULL,
+        0,
+        NULL,
+        0,
+        &BytesReturned,
+        NULL
+        ))
+    {
+        PrintLastError("FileDisk:");
+        return -1;
+    }
+
+    if (!DeviceIoControl(
+        Device,
+        FSCTL_DISMOUNT_VOLUME,
+        NULL,
+        0,
+        NULL,
+        0,
+        &BytesReturned,
+        NULL
+        ))
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    if (!DeviceIoControl(
+        Device,
+        FSCTL_UNLOCK_VOLUME,
+        NULL,
+        0,
+        NULL,
+        0,
+        &BytesReturned,
+        NULL
+        ))
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    CloseHandle(Device);
+
+    if (!DefineDosDevice(
+        DDD_REMOVE_DEFINITION,
+        &VolumeName[4],
+        NULL
+        ))
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    return 0;
+}
+
+int FileDiskStatus(char DriveLetter)
+{
+    char                    VolumeName[] = "\\\\.\\ :";
+    HANDLE                  Device;
+    POPEN_FILE_INFORMATION  OpenFileInformation;
+    DWORD                   BytesReturned;
+
+    VolumeName[4] = DriveLetter;
+
+    Device = CreateFile(
+        VolumeName,
+        GENERIC_READ,
+        FILE_SHARE_READ | FILE_SHARE_WRITE,
+        NULL,
+        OPEN_EXISTING,
+        FILE_FLAG_NO_BUFFERING,
+        NULL
+        );
+
+    if (Device == INVALID_HANDLE_VALUE)
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    OpenFileInformation = malloc(sizeof(OPEN_FILE_INFORMATION) + MAX_PATH);
+
+    if (!DeviceIoControl(
+        Device,
+        IOCTL_FILE_DISK_QUERY_FILE,
+        NULL,
+        0,
+        OpenFileInformation,
+        sizeof(OPEN_FILE_INFORMATION) + MAX_PATH,
+        &BytesReturned,
+        NULL
+        ))
+    {
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    if (BytesReturned < sizeof(OPEN_FILE_INFORMATION))
+    {
+        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        PrintLastError(&VolumeName[4]);
+        return -1;
+    }
+
+    printf("%c: %.*s Size: %I64u bytes%s\n",
+        DriveLetter,
+        OpenFileInformation->FileNameLength,
+        OpenFileInformation->FileName,
+        OpenFileInformation->FileSize,
+        OpenFileInformation->ReadOnly ? ", ReadOnly" : ""
+        );
+
+    return 0;
+}
+
+int __cdecl main(int argc, char* argv[])
+{
+    char*                   Command;
+    int                     DeviceNumber;
+    char*                   FileName;
+    char*                   Option;
+    char                    DriveLetter;
+    BOOLEAN                 CdImage = FALSE;
+    POPEN_FILE_INFORMATION  OpenFileInformation;
+
+    Command = argv[1];
+
+    if ((argc == 5 || argc == 6) && !strcmp(Command, "/mount"))
+    {
+        DeviceNumber = atoi(argv[2]);
+        FileName = argv[3];
+
+        if (strlen(FileName) < 2)
+        {
+            return FileDiskSyntax();
+        }
+
+        OpenFileInformation =
+            malloc(sizeof(OPEN_FILE_INFORMATION) + strlen(FileName) + 7);
+
+        memset(
+            OpenFileInformation,
+            0,
+            sizeof(OPEN_FILE_INFORMATION) + strlen(FileName) + 7
+            );
+
+        if (FileName[0] == '\\')
+        {
+            if (FileName[1] == '\\')
+                // \\server\share\path\filedisk.img
+            {
+                strcpy(OpenFileInformation->FileName, "\\??\\UNC");
+                strcat(OpenFileInformation->FileName, FileName + 1);
+            }
+            else
+                // \Device\Harddisk0\Partition1\path\filedisk.img
+            {
+                strcpy(OpenFileInformation->FileName, FileName);
+            }
+        }
+        else
+            // c:\path\filedisk.img
+        {
+            strcpy(OpenFileInformation->FileName, "\\??\\");
+            strcat(OpenFileInformation->FileName, FileName);
+        }
+
+        OpenFileInformation->FileNameLength =
+            (USHORT) strlen(OpenFileInformation->FileName);
+
+        if (argc > 5)
+        {
+            Option = argv[4];
+            DriveLetter = argv[5][0];
+
+            if (!strcmp(Option, "/ro"))
+            {
+                OpenFileInformation->ReadOnly = TRUE;
+            }
+            else if (!strcmp(Option, "/cd"))
+            {
+                CdImage = TRUE;
+            }
+            else
+            {
+                if (Option[strlen(Option) - 1] == 'G')
+                {
+                    OpenFileInformation->FileSize.QuadPart =
+                        _atoi64(Option) * 1024 * 1024 * 1024;
+                }
+                else if (Option[strlen(Option) - 1] == 'M')
+                {
+                    OpenFileInformation->FileSize.QuadPart =
+                        _atoi64(Option) * 1024 * 1024;
+                }
+                else if (Option[strlen(Option) - 1] == 'k')
+                {
+                    OpenFileInformation->FileSize.QuadPart =
+                        _atoi64(Option) * 1024;
+                }
+                else
+                {
+                    OpenFileInformation->FileSize.QuadPart =
+                        _atoi64(Option);
+                }
+            }
+        }
+        else
+        {
+            DriveLetter = argv[4][0];
+        }
+        return FileDiskMount(DeviceNumber, OpenFileInformation, DriveLetter, CdImage);
+    }
+    else if (argc == 3 && !strcmp(Command, "/umount"))
+    {
+        DriveLetter = argv[2][0];
+        return FileDiskUmount(DriveLetter);
+    }
+    else if (argc == 3 && !strcmp(Command, "/status"))
+    {
+        DriveLetter = argv[2][0];
+        return FileDiskStatus(DriveLetter);
+    }
+    else
+    {
+        return FileDiskSyntax();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/exe/filedisk.rc	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+//Microsoft Developer Studio generated resource script.
+//
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,11
+ PRODUCTVERSION 1,0,0,11
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName", "Bo Brantén\0"
+            VALUE "FileDescription", "FileDisk Virtual Disk Driver\0"
+            VALUE "FileVersion", "1.0.0.11\0"
+            VALUE "InternalName", "filedisk\0"
+            VALUE "LegalCopyright", "Copyright © 1999-2002 Bo Brantén\0"
+            VALUE "OriginalFilename", "filedisk.exe\0"
+            VALUE "ProductName", "filedisk\0"
+            VALUE "ProductVersion", "1.0.0.11\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // !_MAC
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/exe/sources	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+TARGETNAME=filedisk
+TARGETPATH=obj
+TARGETTYPE=PROGRAM
+UMTYPE=console
+INCLUDES=..\sys\inc
+SOURCES=filedisk.c filedisk.rc
Binary file buildframework/helium/external/filedisk/filedisk.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/filedisk.reg	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,18 @@
+REGEDIT4
+
+[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk]
+
+"ErrorControl"=dword:00000001
+
+#
+# When to start the driver:
+#   At boot:  Start=1
+#   Manually: Start=3
+#
+"Start"=dword:00000001
+
+"Type"=dword:00000001
+
+[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk\Parameters]
+
+"NumberOfDevices"=dword:00000004
Binary file buildframework/helium/external/filedisk/filedisk.sys has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/install.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+Copy the driver (filedisk.sys) to %systemroot%\system32\drivers\.
+
+Optionally edit filedisk.reg for automatic/manually start and
+number of devices.
+
+Import filedisk.reg to the Registry.
+
+Reboot.
+
+Use the program filedisk.exe to mount/umount files, for an example
+of use see the file example.txt.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/readme.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+
+    This is a virtual disk driver for Windows NT/2000/XP that uses
+    one or more files to emulate physical disks.
+    Copyright (C) 1999-2006 Bo Brantén.
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+    This program 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 General Public License for more details.
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    The GNU General Public License is also available from:
+    http://www.gnu.org/copyleft/gpl.html
+
+    Windows and Windows NT are either registered trademarks or trademarks of
+    Microsoft Corporation in the United States and/or other countries.
+
+    Please send comments, corrections and contributions to bosse@acc.umu.se
+
+    The most recent version of this program is available from:
+    http://www.acc.umu.se/~bosse/
+
+    Revision history:
+
+   14. 2006-01-05
+       Updated impersonation so that use of image files stored on network
+       drives work on Windows 2000 SP4, Windows XP SP2 and
+       Windows Server 2003 SP1.
+
+   13. 2004-06-09
+       Small fix in file size handling.
+
+   12. 2004-05-27
+       Possible fix for memory leak.
+
+   11. 2002-11-30
+       Added ioctl to query information about mounted disk image files by
+       request from developer of GUI.
+
+   10. 2002-11-24
+       Added a check so that FileDisk doesn't use compressed or encrypted
+       images. For an explanation why this doesn't work see comment in the
+       source code.
+
+    9. 2002-08-26
+       Corrected the share access for read-only FileDisk images.
+
+    8. 2002-08-11
+       Updated the control application to support UNC paths.
+       Changed the handling of CD-ROM device objects to avoid some problems on
+       Windows XP.
+       Corrected the handling of file sizes so that FileDisk images can be
+       sparse files.
+
+    7. 2002-02-28
+       Added support for CD-images.
+
+    6. 2002-01-21
+       Added support for impersonation so that FileDisk images can be stored
+       on network drives.
+
+    5. 2002-01-18
+       Updated for Windows XP by Robert A. Rose.
+
+    4. 2001-07-08
+       Formating to FAT on Windows 2000 now works.
+
+    3. 2001-05-14
+       Corrected the error messages from the usermode control application.
+
+    2. 2000-03-15
+       Added handling of IOCTL_DISK_CHECK_VERIFY to make the driver work on
+       Windows 2000 (tested on beta 3, build 2031). Formating to FAT still
+       doesn't work but formating to NTFS does.
+
+    1. 1999-06-09
+       Initial release.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/sys/inc/filedisk.h	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+/*
+    This is a virtual disk driver for Windows NT/2000/XP that uses one or more
+    files to emulate physical disks.
+    Copyright (C) 1999, 2000, 2001, 2002 Bo Brantén.
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+    This program 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 General Public License for more details.
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef _FILE_DISK_
+#define _FILE_DISK_
+
+#ifndef __T
+#ifdef _NTDDK_
+#define __T(x)  L ## x
+#else
+#define __T(x)  x
+#endif
+#endif
+
+#ifndef _T
+#define _T(x)   __T(x)
+#endif
+
+#define DEVICE_BASE_NAME    _T("\\FileDisk")
+#define DEVICE_DIR_NAME     _T("\\Device")      DEVICE_BASE_NAME
+#define DEVICE_NAME_PREFIX  DEVICE_DIR_NAME     DEVICE_BASE_NAME
+
+#define FILE_DEVICE_FILE_DISK       0x8000
+
+#define IOCTL_FILE_DISK_OPEN_FILE   CTL_CODE(FILE_DEVICE_FILE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_FILE_DISK_CLOSE_FILE  CTL_CODE(FILE_DEVICE_FILE_DISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_FILE_DISK_QUERY_FILE  CTL_CODE(FILE_DEVICE_FILE_DISK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+typedef struct _OPEN_FILE_INFORMATION {
+    LARGE_INTEGER   FileSize;
+    BOOLEAN         ReadOnly;
+    USHORT          FileNameLength;
+    UCHAR           FileName[1];
+} OPEN_FILE_INFORMATION, *POPEN_FILE_INFORMATION;
+
+#endif
Binary file buildframework/helium/external/filedisk/sys/obj/i386/checked/filedisk.sys has changed
Binary file buildframework/helium/external/filedisk/sys/obj/i386/free/filedisk.sys has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/sys/src/MAKEFILE	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/sys/src/Sources	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,5 @@
+TARGETNAME=filedisk
+TARGETPATH=..\obj
+TARGETTYPE=DRIVER
+INCLUDES=..\inc
+SOURCES=filedisk.c filedisk.rc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/sys/src/filedisk.c	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1537 @@
+/*
+    This is a virtual disk driver for Windows NT/2000/XP that uses
+    one or more files to emulate physical disks.
+    Copyright (C) 1999-2006 Bo Brantén.
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+    This program 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 General Public License for more details.
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <ntddk.h>
+#include <ntdddisk.h>
+#include <ntddcdrm.h>
+#include <ntverp.h>
+
+//
+// We include some stuff from newer DDK:s here so that one
+// version of the driver for all versions of Windows can
+// be compiled with the Windows NT 4.0 DDK.
+//
+#if (VER_PRODUCTBUILD < 2195)
+
+#define FILE_DEVICE_MASS_STORAGE            0x0000002d
+#define IOCTL_STORAGE_CHECK_VERIFY2         CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FILE_ATTRIBUTE_ENCRYPTED            0x00004000
+
+#endif
+
+#if (VER_PRODUCTBUILD < 2600)
+
+#define IOCTL_DISK_GET_PARTITION_INFO_EX    CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_GET_LENGTH_INFO          CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+typedef enum _PARTITION_STYLE {
+    PARTITION_STYLE_MBR,
+    PARTITION_STYLE_GPT
+} PARTITION_STYLE;
+
+typedef unsigned __int64 ULONG64, *PULONG64;
+
+typedef struct _PARTITION_INFORMATION_MBR {
+    UCHAR   PartitionType;
+    BOOLEAN BootIndicator;
+    BOOLEAN RecognizedPartition;
+    ULONG   HiddenSectors;
+} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
+
+typedef struct _PARTITION_INFORMATION_GPT {
+    GUID    PartitionType;
+    GUID    PartitionId;
+    ULONG64 Attributes;
+    WCHAR   Name[36];
+} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
+
+typedef struct _PARTITION_INFORMATION_EX {
+    PARTITION_STYLE PartitionStyle;
+    LARGE_INTEGER   StartingOffset;
+    LARGE_INTEGER   PartitionLength;
+    ULONG           PartitionNumber;
+    BOOLEAN         RewritePartition;
+    union {
+        PARTITION_INFORMATION_MBR Mbr;
+        PARTITION_INFORMATION_GPT Gpt;
+    };
+} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
+
+typedef struct _GET_LENGTH_INFORMATION {
+    LARGE_INTEGER Length;
+} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
+
+#endif // (VER_PRODUCTBUILD < 2600)
+
+//
+// We include some stuff from ntifs.h here so that
+// the driver can be compiled with only the DDK.
+//
+
+#define TOKEN_SOURCE_LENGTH 8
+
+typedef enum _TOKEN_TYPE {
+    TokenPrimary = 1,
+    TokenImpersonation
+} TOKEN_TYPE;
+
+typedef struct _TOKEN_SOURCE {
+    CCHAR   SourceName[TOKEN_SOURCE_LENGTH];
+    LUID    SourceIdentifier;
+} TOKEN_SOURCE, *PTOKEN_SOURCE;
+
+typedef struct _TOKEN_CONTROL {
+    LUID            TokenId;
+    LUID            AuthenticationId;
+    LUID            ModifiedId;
+    TOKEN_SOURCE    TokenSource;
+} TOKEN_CONTROL, *PTOKEN_CONTROL;
+
+typedef struct _SECURITY_CLIENT_CONTEXT {
+    SECURITY_QUALITY_OF_SERVICE SecurityQos;
+    PACCESS_TOKEN               ClientToken;
+    BOOLEAN                     DirectlyAccessClientToken;
+    BOOLEAN                     DirectAccessEffectiveOnly;
+    BOOLEAN                     ServerIsRemote;
+    TOKEN_CONTROL               ClientTokenControl;
+} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
+
+#define PsDereferenceImpersonationToken(T)  \
+            {if (ARGUMENT_PRESENT(T)) {     \
+                (ObDereferenceObject((T))); \
+            } else {                        \
+                ;                           \
+            }                               \
+}
+
+#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T)))
+
+NTKERNELAPI
+VOID
+PsRevertToSelf (
+    VOID
+);
+
+NTKERNELAPI
+NTSTATUS
+SeCreateClientSecurity (
+    IN PETHREAD                     Thread,
+    IN PSECURITY_QUALITY_OF_SERVICE QualityOfService,
+    IN BOOLEAN                      RemoteClient,
+    OUT PSECURITY_CLIENT_CONTEXT    ClientContext
+);
+
+#define SeDeleteClientSecurity(C)  {                                           \
+            if (SeTokenType((C)->ClientToken) == TokenPrimary) {               \
+                PsDereferencePrimaryToken( (C)->ClientToken );                 \
+            } else {                                                           \
+                PsDereferenceImpersonationToken( (C)->ClientToken );           \
+            }                                                                  \
+}
+
+NTKERNELAPI
+VOID
+SeImpersonateClient (
+    IN PSECURITY_CLIENT_CONTEXT ClientContext,
+    IN PETHREAD                 ServerThread OPTIONAL
+);
+
+NTKERNELAPI
+TOKEN_TYPE
+SeTokenType (
+    IN PACCESS_TOKEN Token
+);
+
+#ifndef SE_IMPERSONATE_PRIVILEGE
+#define SE_IMPERSONATE_PRIVILEGE        (29L)
+#endif
+
+#define TOKEN_ASSIGN_PRIMARY            (0x0001)
+#define TOKEN_DUPLICATE                 (0x0002)
+#define TOKEN_IMPERSONATE               (0x0004)
+#define TOKEN_QUERY                     (0x0008)
+#define TOKEN_QUERY_SOURCE              (0x0010)
+#define TOKEN_ADJUST_PRIVILEGES         (0x0020)
+#define TOKEN_ADJUST_GROUPS             (0x0040)
+#define TOKEN_ADJUST_DEFAULT            (0x0080)
+
+#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
+                          TOKEN_ASSIGN_PRIMARY     |\
+                          TOKEN_DUPLICATE          |\
+                          TOKEN_IMPERSONATE        |\
+                          TOKEN_QUERY              |\
+                          TOKEN_QUERY_SOURCE       |\
+                          TOKEN_ADJUST_PRIVILEGES  |\
+                          TOKEN_ADJUST_GROUPS      |\
+                          TOKEN_ADJUST_DEFAULT)
+
+typedef struct _TOKEN_PRIVILEGES {
+    ULONG               PrivilegeCount;
+    LUID_AND_ATTRIBUTES Privileges[1];
+} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenProcessToken (
+    IN HANDLE       ProcessHandle,
+    IN ACCESS_MASK  DesiredAccess,
+    OUT PHANDLE     TokenHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+NtAdjustPrivilegesToken (
+    IN HANDLE               TokenHandle,
+    IN BOOLEAN              DisableAllPrivileges,
+    IN PTOKEN_PRIVILEGES    NewState,
+    IN ULONG                BufferLength,
+    OUT PTOKEN_PRIVILEGES   PreviousState OPTIONAL,
+    OUT PULONG              ReturnLength
+);
+
+//
+// For backward compatibility with Windows NT 4.0 by Bruce Engle.
+//
+#ifndef MmGetSystemAddressForMdlSafe
+#define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) MmGetSystemAddressForMdlPrettySafe(MDL)
+
+PVOID
+MmGetSystemAddressForMdlPrettySafe (
+    PMDL Mdl
+    )
+{
+    CSHORT  MdlMappingCanFail;
+    PVOID   MappedSystemVa;
+
+    MdlMappingCanFail = Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL;
+
+    Mdl->MdlFlags |= MDL_MAPPING_CAN_FAIL;
+
+    MappedSystemVa = MmGetSystemAddressForMdl(Mdl);
+
+    if (MdlMappingCanFail == 0)
+    {
+        Mdl->MdlFlags &= ~MDL_MAPPING_CAN_FAIL;
+    }
+
+    return MappedSystemVa;
+}
+#endif
+
+#include "filedisk.h"
+
+#define PARAMETER_KEY           L"\\Parameters"
+
+#define NUMBEROFDEVICES_VALUE   L"NumberOfDevices"
+
+#define DEFAULT_NUMBEROFDEVICES 4
+
+#define SECTOR_SIZE             512
+
+#define TOC_DATA_TRACK          0x04
+
+HANDLE dir_handle;
+
+typedef struct _DEVICE_EXTENSION {
+    BOOLEAN                     media_in_device;
+    HANDLE                      file_handle;
+    ANSI_STRING                 file_name;
+    LARGE_INTEGER               file_size;
+    BOOLEAN                     read_only;
+    PSECURITY_CLIENT_CONTEXT    security_client_context;
+    LIST_ENTRY                  list_head;
+    KSPIN_LOCK                  list_lock;
+    KEVENT                      request_event;
+    PVOID                       thread_pointer;
+    BOOLEAN                     terminate_thread;
+} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
+
+NTSTATUS
+DriverEntry (
+    IN PDRIVER_OBJECT   DriverObject,
+    IN PUNICODE_STRING  RegistryPath
+);
+
+NTSTATUS
+FileDiskCreateDevice (
+    IN PDRIVER_OBJECT   DriverObject,
+    IN ULONG            Number,
+    IN DEVICE_TYPE      DeviceType
+);
+
+VOID
+FileDiskUnload (
+    IN PDRIVER_OBJECT   DriverObject
+);
+
+PDEVICE_OBJECT
+FileDiskDeleteDevice (
+    IN PDEVICE_OBJECT   DeviceObject
+);
+
+NTSTATUS
+FileDiskCreateClose (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+);
+
+NTSTATUS
+FileDiskReadWrite (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+);
+
+NTSTATUS
+FileDiskDeviceControl (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+);
+
+VOID
+FileDiskThread (
+    IN PVOID            Context
+);
+
+NTSTATUS
+FileDiskOpenFile (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+);
+
+NTSTATUS
+FileDiskCloseFile (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+);
+
+NTSTATUS
+FileDiskAdjustPrivilege (
+    IN ULONG            Privilege,
+    IN BOOLEAN          Enable
+);
+
+int swprintf(wchar_t *, const wchar_t *, ...);
+
+#pragma code_seg("INIT")
+
+NTSTATUS
+DriverEntry (
+    IN PDRIVER_OBJECT   DriverObject,
+    IN PUNICODE_STRING  RegistryPath
+    )
+{
+    UNICODE_STRING              parameter_path;
+    RTL_QUERY_REGISTRY_TABLE    query_table[2];
+    ULONG                       n_devices;
+    NTSTATUS                    status;
+    UNICODE_STRING              device_dir_name;
+    OBJECT_ATTRIBUTES           object_attributes;
+    ULONG                       n;
+    USHORT                      n_created_devices;
+
+    parameter_path.Length = 0;
+
+    parameter_path.MaximumLength = RegistryPath->Length + sizeof(PARAMETER_KEY);
+
+    parameter_path.Buffer = (PWSTR) ExAllocatePool(PagedPool, parameter_path.MaximumLength);
+
+    if (parameter_path.Buffer == NULL)
+    {
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    RtlCopyUnicodeString(&parameter_path, RegistryPath);
+
+    RtlAppendUnicodeToString(&parameter_path, PARAMETER_KEY);
+
+    RtlZeroMemory(&query_table[0], sizeof(query_table));
+
+    query_table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
+    query_table[0].Name = NUMBEROFDEVICES_VALUE;
+    query_table[0].EntryContext = &n_devices;
+
+    status = RtlQueryRegistryValues(
+        RTL_REGISTRY_ABSOLUTE,
+        parameter_path.Buffer,
+        &query_table[0],
+        NULL,
+        NULL
+        );
+
+    ExFreePool(parameter_path.Buffer);
+
+    if (!NT_SUCCESS(status))
+    {
+        KdPrint(("FileDisk: Query registry failed, using default values.\n"));
+        n_devices = DEFAULT_NUMBEROFDEVICES;
+    }
+
+    RtlInitUnicodeString(&device_dir_name, DEVICE_DIR_NAME);
+
+    InitializeObjectAttributes(
+        &object_attributes,
+        &device_dir_name,
+        OBJ_PERMANENT,
+        NULL,
+        NULL
+        );
+
+    status = ZwCreateDirectoryObject(
+        &dir_handle,
+        DIRECTORY_ALL_ACCESS,
+        &object_attributes
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        return status;
+    }
+
+    ZwMakeTemporaryObject(dir_handle);
+
+    for (n = 0, n_created_devices = 0; n < n_devices; n++)
+    {
+        status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_DISK);
+
+        if (NT_SUCCESS(status))
+        {
+            n_created_devices++;
+        }
+    }
+
+    for (n = 0; n < n_devices; n++)
+    {
+        status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_CD_ROM);
+
+        if (NT_SUCCESS(status))
+        {
+            n_created_devices++;
+        }
+    }
+
+    if (n_created_devices == 0)
+    {
+        ZwClose(dir_handle);
+        return status;
+    }
+
+    DriverObject->MajorFunction[IRP_MJ_CREATE]         = FileDiskCreateClose;
+    DriverObject->MajorFunction[IRP_MJ_CLOSE]          = FileDiskCreateClose;
+    DriverObject->MajorFunction[IRP_MJ_READ]           = FileDiskReadWrite;
+    DriverObject->MajorFunction[IRP_MJ_WRITE]          = FileDiskReadWrite;
+    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl;
+
+    DriverObject->DriverUnload = FileDiskUnload;
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+FileDiskCreateDevice (
+    IN PDRIVER_OBJECT   DriverObject,
+    IN ULONG            Number,
+    IN DEVICE_TYPE      DeviceType
+    )
+{
+    WCHAR               device_name_buffer[MAXIMUM_FILENAME_LENGTH];
+    UNICODE_STRING      device_name;
+    NTSTATUS            status;
+    PDEVICE_OBJECT      device_object;
+    PDEVICE_EXTENSION   device_extension;
+    HANDLE              thread_handle;
+
+    ASSERT(DriverObject != NULL);
+
+    if (DeviceType == FILE_DEVICE_CD_ROM)
+    {
+        swprintf(
+            device_name_buffer,
+            DEVICE_NAME_PREFIX L"Cd" L"%u",
+            Number
+            );
+    }
+    else
+    {
+        swprintf(
+            device_name_buffer,
+            DEVICE_NAME_PREFIX L"%u",
+            Number
+            );
+    }
+
+    RtlInitUnicodeString(&device_name, device_name_buffer);
+
+    status = IoCreateDevice(
+        DriverObject,
+        sizeof(DEVICE_EXTENSION),
+        &device_name,
+        DeviceType,
+        0,
+        FALSE,
+        &device_object
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        return status;
+    }
+
+    device_object->Flags |= DO_DIRECT_IO;
+
+    device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension;
+
+    device_extension->media_in_device = FALSE;
+
+    if (DeviceType == FILE_DEVICE_CD_ROM)
+    {
+        device_object->Characteristics |= FILE_READ_ONLY_DEVICE;
+        device_extension->read_only = TRUE;
+    }
+
+    InitializeListHead(&device_extension->list_head);
+
+    KeInitializeSpinLock(&device_extension->list_lock);
+
+    KeInitializeEvent(
+        &device_extension->request_event,
+        SynchronizationEvent,
+        FALSE
+        );
+
+    device_extension->terminate_thread = FALSE;
+
+    status = PsCreateSystemThread(
+        &thread_handle,
+        (ACCESS_MASK) 0L,
+        NULL,
+        NULL,
+        NULL,
+        FileDiskThread,
+        device_object
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        IoDeleteDevice(device_object);
+        return status;
+    }
+
+    status = ObReferenceObjectByHandle(
+        thread_handle,
+        THREAD_ALL_ACCESS,
+        NULL,
+        KernelMode,
+        &device_extension->thread_pointer,
+        NULL
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        ZwClose(thread_handle);
+
+        device_extension->terminate_thread = TRUE;
+
+        KeSetEvent(
+            &device_extension->request_event,
+            (KPRIORITY) 0,
+            FALSE
+            );
+
+        IoDeleteDevice(device_object);
+
+        return status;
+    }
+
+    ZwClose(thread_handle);
+
+    return STATUS_SUCCESS;
+}
+
+#pragma code_seg("PAGE")
+
+VOID
+FileDiskUnload (
+    IN PDRIVER_OBJECT DriverObject
+    )
+{
+    PDEVICE_OBJECT device_object;
+
+    PAGED_CODE();
+
+    device_object = DriverObject->DeviceObject;
+
+    while (device_object)
+    {
+        device_object = FileDiskDeleteDevice(device_object);
+    }
+
+    ZwClose(dir_handle);
+}
+
+PDEVICE_OBJECT
+FileDiskDeleteDevice (
+    IN PDEVICE_OBJECT DeviceObject
+    )
+{
+    PDEVICE_EXTENSION   device_extension;
+    PDEVICE_OBJECT      next_device_object;
+
+    PAGED_CODE();
+
+    ASSERT(DeviceObject != NULL);
+
+    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+    device_extension->terminate_thread = TRUE;
+
+    KeSetEvent(
+        &device_extension->request_event,
+        (KPRIORITY) 0,
+        FALSE
+        );
+
+    KeWaitForSingleObject(
+        device_extension->thread_pointer,
+        Executive,
+        KernelMode,
+        FALSE,
+        NULL
+        );
+
+    ObDereferenceObject(device_extension->thread_pointer);
+
+    if (device_extension->security_client_context != NULL)
+    {
+        SeDeleteClientSecurity(device_extension->security_client_context);
+        ExFreePool(device_extension->security_client_context);
+    }
+
+    next_device_object = DeviceObject->NextDevice;
+
+    IoDeleteDevice(DeviceObject);
+
+    return next_device_object;
+}
+
+NTSTATUS
+FileDiskCreateClose (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+    )
+{
+    PAGED_CODE();
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = FILE_OPENED;
+
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+}
+
+#pragma code_seg()
+
+NTSTATUS
+FileDiskReadWrite (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+    )
+{
+    PDEVICE_EXTENSION   device_extension;
+    PIO_STACK_LOCATION  io_stack;
+
+    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+    if (!device_extension->media_in_device)
+    {
+        Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE;
+        Irp->IoStatus.Information = 0;
+
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+        return STATUS_NO_MEDIA_IN_DEVICE;
+    }
+
+    io_stack = IoGetCurrentIrpStackLocation(Irp);
+
+    if (io_stack->Parameters.Read.Length == 0)
+    {
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+        Irp->IoStatus.Information = 0;
+
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+        return STATUS_SUCCESS;
+    }
+
+    IoMarkIrpPending(Irp);
+
+    ExInterlockedInsertTailList(
+        &device_extension->list_head,
+        &Irp->Tail.Overlay.ListEntry,
+        &device_extension->list_lock
+        );
+
+    KeSetEvent(
+        &device_extension->request_event,
+        (KPRIORITY) 0,
+        FALSE
+        );
+
+    return STATUS_PENDING;
+}
+
+NTSTATUS
+FileDiskDeviceControl (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+    )
+{
+    PDEVICE_EXTENSION   device_extension;
+    PIO_STACK_LOCATION  io_stack;
+    NTSTATUS            status;
+
+    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+    io_stack = IoGetCurrentIrpStackLocation(Irp);
+
+    if (!device_extension->media_in_device &&
+        io_stack->Parameters.DeviceIoControl.IoControlCode !=
+        IOCTL_FILE_DISK_OPEN_FILE)
+    {
+        Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE;
+        Irp->IoStatus.Information = 0;
+
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+        return STATUS_NO_MEDIA_IN_DEVICE;
+    }
+
+    switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
+    {
+    case IOCTL_FILE_DISK_OPEN_FILE:
+        {
+            SECURITY_QUALITY_OF_SERVICE security_quality_of_service;
+
+            if (device_extension->media_in_device)
+            {
+                KdPrint(("FileDisk: IOCTL_FILE_DISK_OPEN_FILE: Media already opened\n"));
+
+                status = STATUS_INVALID_DEVICE_REQUEST;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
+                sizeof(OPEN_FILE_INFORMATION))
+            {
+                status = STATUS_INVALID_PARAMETER;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
+                sizeof(OPEN_FILE_INFORMATION) +
+                ((POPEN_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->FileNameLength -
+                sizeof(UCHAR))
+            {
+                status = STATUS_INVALID_PARAMETER;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            if (device_extension->security_client_context != NULL)
+            {
+                SeDeleteClientSecurity(device_extension->security_client_context);
+            }
+            else
+            {
+                device_extension->security_client_context =
+                    ExAllocatePool(NonPagedPool, sizeof(SECURITY_CLIENT_CONTEXT));
+            }
+
+            RtlZeroMemory(&security_quality_of_service, sizeof(SECURITY_QUALITY_OF_SERVICE));
+
+            security_quality_of_service.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
+            security_quality_of_service.ImpersonationLevel = SecurityImpersonation;
+            security_quality_of_service.ContextTrackingMode = SECURITY_STATIC_TRACKING;
+            security_quality_of_service.EffectiveOnly = FALSE;
+
+            SeCreateClientSecurity(
+                PsGetCurrentThread(),
+                &security_quality_of_service,
+                FALSE,
+                device_extension->security_client_context
+                );
+
+            IoMarkIrpPending(Irp);
+
+            ExInterlockedInsertTailList(
+                &device_extension->list_head,
+                &Irp->Tail.Overlay.ListEntry,
+                &device_extension->list_lock
+                );
+
+            KeSetEvent(
+                &device_extension->request_event,
+                (KPRIORITY) 0,
+                FALSE
+                );
+
+            status = STATUS_PENDING;
+
+            break;
+        }
+
+    case IOCTL_FILE_DISK_CLOSE_FILE:
+        {
+            IoMarkIrpPending(Irp);
+
+            ExInterlockedInsertTailList(
+                &device_extension->list_head,
+                &Irp->Tail.Overlay.ListEntry,
+                &device_extension->list_lock
+                );
+
+            KeSetEvent(
+                &device_extension->request_event,
+                (KPRIORITY) 0,
+                FALSE
+                );
+
+            status = STATUS_PENDING;
+
+            break;
+        }
+
+    case IOCTL_FILE_DISK_QUERY_FILE:
+        {
+            POPEN_FILE_INFORMATION open_file_information;
+
+            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof(OPEN_FILE_INFORMATION) + device_extension->file_name.Length - sizeof(UCHAR))
+            {
+                status = STATUS_BUFFER_TOO_SMALL;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            open_file_information = (POPEN_FILE_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
+
+            open_file_information->FileSize.QuadPart = device_extension->file_size.QuadPart;
+            open_file_information->ReadOnly = device_extension->read_only;
+            open_file_information->FileNameLength = device_extension->file_name.Length;
+
+            RtlCopyMemory(
+                open_file_information->FileName,
+                device_extension->file_name.Buffer,
+                device_extension->file_name.Length
+                );
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = sizeof(OPEN_FILE_INFORMATION) +
+                open_file_information->FileNameLength - sizeof(UCHAR);
+
+            break;
+        }
+
+    case IOCTL_DISK_CHECK_VERIFY:
+    case IOCTL_CDROM_CHECK_VERIFY:
+    case IOCTL_STORAGE_CHECK_VERIFY:
+    case IOCTL_STORAGE_CHECK_VERIFY2:
+        {
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = 0;
+            break;
+        }
+
+    case IOCTL_DISK_GET_DRIVE_GEOMETRY:
+    case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
+        {
+            PDISK_GEOMETRY  disk_geometry;
+            ULONGLONG       length;
+
+            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof(DISK_GEOMETRY))
+            {
+                status = STATUS_BUFFER_TOO_SMALL;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            disk_geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer;
+
+            length = device_extension->file_size.QuadPart;
+
+            disk_geometry->Cylinders.QuadPart = length / SECTOR_SIZE / 32 / 2;
+            disk_geometry->MediaType = FixedMedia;
+            disk_geometry->TracksPerCylinder = 2;
+            disk_geometry->SectorsPerTrack = 32;
+            disk_geometry->BytesPerSector = SECTOR_SIZE;
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
+
+            break;
+        }
+
+    case IOCTL_DISK_GET_LENGTH_INFO:
+        {
+            PGET_LENGTH_INFORMATION get_length_information;
+
+            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof(GET_LENGTH_INFORMATION))
+            {
+                status = STATUS_BUFFER_TOO_SMALL;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            get_length_information = (PGET_LENGTH_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
+
+            get_length_information->Length.QuadPart = device_extension->file_size.QuadPart;
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION);
+
+        break;
+        }
+
+    case IOCTL_DISK_GET_PARTITION_INFO:
+        {
+            PPARTITION_INFORMATION  partition_information;
+            ULONGLONG               length;
+
+            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof(PARTITION_INFORMATION))
+            {
+                status = STATUS_BUFFER_TOO_SMALL;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            partition_information = (PPARTITION_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
+
+            length = device_extension->file_size.QuadPart;
+
+            partition_information->StartingOffset.QuadPart = 0;
+            partition_information->PartitionLength.QuadPart = length;
+            partition_information->HiddenSectors = 1;
+            partition_information->PartitionNumber = 0;
+            partition_information->PartitionType = 0;
+            partition_information->BootIndicator = FALSE;
+            partition_information->RecognizedPartition = FALSE;
+            partition_information->RewritePartition = FALSE;
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION);
+
+            break;
+        }
+
+    case IOCTL_DISK_GET_PARTITION_INFO_EX:
+        {
+            PPARTITION_INFORMATION_EX   partition_information_ex;
+            ULONGLONG                   length;
+
+            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof(PARTITION_INFORMATION_EX))
+            {
+                status = STATUS_BUFFER_TOO_SMALL;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            partition_information_ex = (PPARTITION_INFORMATION_EX) Irp->AssociatedIrp.SystemBuffer;
+
+            length = device_extension->file_size.QuadPart;
+
+            partition_information_ex->PartitionStyle = PARTITION_STYLE_MBR;
+            partition_information_ex->StartingOffset.QuadPart = 0;
+            partition_information_ex->PartitionLength.QuadPart = length;
+            partition_information_ex->PartitionNumber = 0;
+            partition_information_ex->RewritePartition = FALSE;
+            partition_information_ex->Mbr.PartitionType = 0;
+            partition_information_ex->Mbr.BootIndicator = FALSE;
+            partition_information_ex->Mbr.RecognizedPartition = FALSE;
+            partition_information_ex->Mbr.HiddenSectors = 1;
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX);
+
+            break;
+        }
+
+    case IOCTL_DISK_IS_WRITABLE:
+        {
+            if (!device_extension->read_only)
+            {
+                status = STATUS_SUCCESS;
+            }
+            else
+            {
+                status = STATUS_MEDIA_WRITE_PROTECTED;
+            }
+            Irp->IoStatus.Information = 0;
+            break;
+        }
+
+    case IOCTL_DISK_MEDIA_REMOVAL:
+    case IOCTL_STORAGE_MEDIA_REMOVAL:
+        {
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = 0;
+            break;
+        }
+
+    case IOCTL_CDROM_READ_TOC:
+        {
+            PCDROM_TOC cdrom_toc;
+
+            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof(CDROM_TOC))
+            {
+                status = STATUS_BUFFER_TOO_SMALL;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            cdrom_toc = (PCDROM_TOC) Irp->AssociatedIrp.SystemBuffer;
+
+            RtlZeroMemory(cdrom_toc, sizeof(CDROM_TOC));
+
+            cdrom_toc->FirstTrack = 1;
+            cdrom_toc->LastTrack = 1;
+            cdrom_toc->TrackData[0].Control = TOC_DATA_TRACK;
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = sizeof(CDROM_TOC);
+
+            break;
+        }
+
+    case IOCTL_DISK_SET_PARTITION_INFO:
+        {
+            if (device_extension->read_only)
+            {
+                status = STATUS_MEDIA_WRITE_PROTECTED;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
+                sizeof(SET_PARTITION_INFORMATION))
+            {
+                status = STATUS_INVALID_PARAMETER;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = 0;
+
+            break;
+        }
+
+    case IOCTL_DISK_VERIFY:
+        {
+            PVERIFY_INFORMATION verify_information;
+
+            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
+                sizeof(VERIFY_INFORMATION))
+            {
+                status = STATUS_INVALID_PARAMETER;
+                Irp->IoStatus.Information = 0;
+                break;
+            }
+
+            verify_information = (PVERIFY_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
+
+            status = STATUS_SUCCESS;
+            Irp->IoStatus.Information = verify_information->Length;
+
+            break;
+        }
+
+    default:
+        {
+            KdPrint((
+                "FileDisk: Unknown IoControlCode %#x\n",
+                io_stack->Parameters.DeviceIoControl.IoControlCode
+                ));
+
+            status = STATUS_INVALID_DEVICE_REQUEST;
+            Irp->IoStatus.Information = 0;
+        }
+    }
+
+    if (status != STATUS_PENDING)
+    {
+        Irp->IoStatus.Status = status;
+
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+
+    return status;
+}
+
+VOID
+FileDiskThread (
+    IN PVOID Context
+    )
+{
+    PDEVICE_OBJECT      device_object;
+    PDEVICE_EXTENSION   device_extension;
+    PLIST_ENTRY         request;
+    PIRP                irp;
+    PIO_STACK_LOCATION  io_stack;
+    PUCHAR              system_buffer;
+    PUCHAR              buffer;
+
+    ASSERT(Context != NULL);
+
+    device_object = (PDEVICE_OBJECT) Context;
+
+    device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension;
+
+    KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);
+
+    FileDiskAdjustPrivilege(SE_IMPERSONATE_PRIVILEGE, TRUE);
+
+    for (;;)
+    {
+        KeWaitForSingleObject(
+            &device_extension->request_event,
+            Executive,
+            KernelMode,
+            FALSE,
+            NULL
+            );
+
+        if (device_extension->terminate_thread)
+        {
+            PsTerminateSystemThread(STATUS_SUCCESS);
+        }
+
+        while (request = ExInterlockedRemoveHeadList(
+            &device_extension->list_head,
+            &device_extension->list_lock
+            ))
+        {
+            irp = CONTAINING_RECORD(request, IRP, Tail.Overlay.ListEntry);
+
+            io_stack = IoGetCurrentIrpStackLocation(irp);
+
+            switch (io_stack->MajorFunction)
+            {
+            case IRP_MJ_READ:
+                system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
+                if (system_buffer == NULL)
+                {
+                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+                    irp->IoStatus.Information = 0;
+                    break;
+                }
+                buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length);
+                if (buffer == NULL)
+                {
+                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+                    irp->IoStatus.Information = 0;
+                    break;
+                }
+                ZwReadFile(
+                    device_extension->file_handle,
+                    NULL,
+                    NULL,
+                    NULL,
+                    &irp->IoStatus,
+                    buffer,
+                    io_stack->Parameters.Read.Length,
+                    &io_stack->Parameters.Read.ByteOffset,
+                    NULL
+                    );
+                RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length);
+                ExFreePool(buffer);
+                break;
+
+            case IRP_MJ_WRITE:
+                if ((io_stack->Parameters.Write.ByteOffset.QuadPart +
+                     io_stack->Parameters.Write.Length) >
+                     device_extension->file_size.QuadPart)
+                {
+                    irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+                    irp->IoStatus.Information = 0;
+                }
+                ZwWriteFile(
+                    device_extension->file_handle,
+                    NULL,
+                    NULL,
+                    NULL,
+                    &irp->IoStatus,
+                    MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority),
+                    io_stack->Parameters.Write.Length,
+                    &io_stack->Parameters.Write.ByteOffset,
+                    NULL
+                    );
+                break;
+
+            case IRP_MJ_DEVICE_CONTROL:
+                switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
+                {
+                case IOCTL_FILE_DISK_OPEN_FILE:
+
+                    SeImpersonateClient(device_extension->security_client_context, NULL);
+
+                    irp->IoStatus.Status = FileDiskOpenFile(device_object, irp);
+
+                    PsRevertToSelf();
+
+                    break;
+
+                case IOCTL_FILE_DISK_CLOSE_FILE:
+                    irp->IoStatus.Status = FileDiskCloseFile(device_object, irp);
+                    break;
+
+                default:
+                    irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
+                }
+                break;
+
+            default:
+                irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
+            }
+
+            IoCompleteRequest(
+                irp,
+                (CCHAR) (NT_SUCCESS(irp->IoStatus.Status) ?
+                IO_DISK_INCREMENT : IO_NO_INCREMENT)
+                );
+        }
+    }
+}
+
+#pragma code_seg("PAGE")
+
+NTSTATUS
+FileDiskOpenFile (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+    )
+{
+    PDEVICE_EXTENSION               device_extension;
+    POPEN_FILE_INFORMATION          open_file_information;
+    UNICODE_STRING                  ufile_name;
+    NTSTATUS                        status;
+    OBJECT_ATTRIBUTES               object_attributes;
+    FILE_END_OF_FILE_INFORMATION    file_eof;
+    FILE_BASIC_INFORMATION          file_basic;
+    FILE_STANDARD_INFORMATION       file_standard;
+    FILE_ALIGNMENT_INFORMATION      file_alignment;
+
+    PAGED_CODE();
+
+    ASSERT(DeviceObject != NULL);
+    ASSERT(Irp != NULL);
+
+    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+    open_file_information = (POPEN_FILE_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
+
+    if (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM)
+    {
+        device_extension->read_only = open_file_information->ReadOnly;
+    }
+
+    device_extension->file_name.Length = open_file_information->FileNameLength;
+    device_extension->file_name.MaximumLength = open_file_information->FileNameLength;
+    device_extension->file_name.Buffer = ExAllocatePool(NonPagedPool, open_file_information->FileNameLength);
+
+    RtlCopyMemory(
+        device_extension->file_name.Buffer,
+        open_file_information->FileName,
+        open_file_information->FileNameLength
+        );
+
+    status = RtlAnsiStringToUnicodeString(
+        &ufile_name,
+        &device_extension->file_name,
+        TRUE
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        ExFreePool(device_extension->file_name.Buffer);
+        Irp->IoStatus.Status = status;
+        Irp->IoStatus.Information = 0;
+        return status;
+    }
+
+    InitializeObjectAttributes(
+        &object_attributes,
+        &ufile_name,
+        OBJ_CASE_INSENSITIVE,
+        NULL,
+        NULL
+        );
+
+    status = ZwCreateFile(
+        &device_extension->file_handle,
+        device_extension->read_only ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,
+        &object_attributes,
+        &Irp->IoStatus,
+        NULL,
+        FILE_ATTRIBUTE_NORMAL,
+        device_extension->read_only ? FILE_SHARE_READ : 0,
+        FILE_OPEN,
+        FILE_NON_DIRECTORY_FILE |
+        FILE_RANDOM_ACCESS |
+        FILE_NO_INTERMEDIATE_BUFFERING |
+        FILE_SYNCHRONOUS_IO_NONALERT,
+        NULL,
+        0
+        );
+
+    if (status == STATUS_OBJECT_NAME_NOT_FOUND || status == STATUS_NO_SUCH_FILE)
+    {
+        if (device_extension->read_only || open_file_information->FileSize.QuadPart == 0)
+        {
+            ExFreePool(device_extension->file_name.Buffer);
+            RtlFreeUnicodeString(&ufile_name);
+
+            Irp->IoStatus.Status = STATUS_NO_SUCH_FILE;
+            Irp->IoStatus.Information = 0;
+
+            return STATUS_NO_SUCH_FILE;
+        }
+        else
+        {
+            status = ZwCreateFile(
+                &device_extension->file_handle,
+                GENERIC_READ | GENERIC_WRITE,
+                &object_attributes,
+                &Irp->IoStatus,
+                &open_file_information->FileSize,
+                FILE_ATTRIBUTE_NORMAL,
+                0,
+                FILE_OPEN_IF,
+                FILE_NON_DIRECTORY_FILE |
+                FILE_RANDOM_ACCESS |
+                FILE_NO_INTERMEDIATE_BUFFERING |
+                FILE_SYNCHRONOUS_IO_NONALERT,
+                NULL,
+                0
+                );
+
+            if (!NT_SUCCESS(status))
+            {
+                ExFreePool(device_extension->file_name.Buffer);
+                RtlFreeUnicodeString(&ufile_name);
+                return status;
+            }
+
+            if (Irp->IoStatus.Information == FILE_CREATED)
+            {
+                file_eof.EndOfFile.QuadPart = open_file_information->FileSize.QuadPart;
+
+                status = ZwSetInformationFile(
+                    device_extension->file_handle,
+                    &Irp->IoStatus,
+                    &file_eof,
+                    sizeof(FILE_END_OF_FILE_INFORMATION),
+                    FileEndOfFileInformation
+                    );
+
+                if (!NT_SUCCESS(status))
+                {
+                    ExFreePool(device_extension->file_name.Buffer);
+                    RtlFreeUnicodeString(&ufile_name);
+                    ZwClose(device_extension->file_handle);
+                    return status;
+                }
+            }
+        }
+    }
+    else if (!NT_SUCCESS(status))
+    {
+        ExFreePool(device_extension->file_name.Buffer);
+        RtlFreeUnicodeString(&ufile_name);
+        return status;
+    }
+
+    RtlFreeUnicodeString(&ufile_name);
+
+    status = ZwQueryInformationFile(
+        device_extension->file_handle,
+        &Irp->IoStatus,
+        &file_basic,
+        sizeof(FILE_BASIC_INFORMATION),
+        FileBasicInformation
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        ExFreePool(device_extension->file_name.Buffer);
+        ZwClose(device_extension->file_handle);
+        return status;
+    }
+
+/*
+    //
+    // The NT cache manager can deadlock if a filesystem that is using the cache
+    // manager is used in a virtual disk that stores its file on a filesystem
+    // that is also using the cache manager, this is why we open the file with
+    // FILE_NO_INTERMEDIATE_BUFFERING above, however if the file is compressed
+    // or encrypted NT will not honor this request and cache it anyway since it
+    // need to store the decompressed/unencrypted data somewhere, therefor we put
+    // an extra check here and don't alow disk images to be compressed/encrypted.
+    //
+    if (file_basic.FileAttributes & (FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_ENCRYPTED))
+    {
+        ExFreePool(device_extension->file_name.Buffer);
+        ZwClose(device_extension->file_handle);
+        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
+        Irp->IoStatus.Information = 0;
+        return STATUS_ACCESS_DENIED;
+    }
+*/
+
+    status = ZwQueryInformationFile(
+        device_extension->file_handle,
+        &Irp->IoStatus,
+        &file_standard,
+        sizeof(FILE_STANDARD_INFORMATION),
+        FileStandardInformation
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        ExFreePool(device_extension->file_name.Buffer);
+        ZwClose(device_extension->file_handle);
+        return status;
+    }
+
+    device_extension->file_size.QuadPart = file_standard.EndOfFile.QuadPart;
+
+    status = ZwQueryInformationFile(
+        device_extension->file_handle,
+        &Irp->IoStatus,
+        &file_alignment,
+        sizeof(FILE_ALIGNMENT_INFORMATION),
+        FileAlignmentInformation
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        ExFreePool(device_extension->file_name.Buffer);
+        ZwClose(device_extension->file_handle);
+        return status;
+    }
+
+    DeviceObject->AlignmentRequirement = file_alignment.AlignmentRequirement;
+
+    if (device_extension->read_only)
+    {
+        DeviceObject->Characteristics |= FILE_READ_ONLY_DEVICE;
+    }
+    else
+    {
+        DeviceObject->Characteristics &= ~FILE_READ_ONLY_DEVICE;
+    }
+
+    device_extension->media_in_device = TRUE;
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+FileDiskCloseFile (
+    IN PDEVICE_OBJECT   DeviceObject,
+    IN PIRP             Irp
+    )
+{
+    PDEVICE_EXTENSION device_extension;
+
+    PAGED_CODE();
+
+    ASSERT(DeviceObject != NULL);
+    ASSERT(Irp != NULL);
+
+    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+    ExFreePool(device_extension->file_name.Buffer);
+
+    ZwClose(device_extension->file_handle);
+
+    device_extension->media_in_device = FALSE;
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+FileDiskAdjustPrivilege (
+    IN ULONG    Privilege,
+    IN BOOLEAN  Enable
+    )
+{
+    NTSTATUS            status;
+    HANDLE              token_handle;
+    TOKEN_PRIVILEGES    token_privileges;
+
+    PAGED_CODE();
+
+    status = ZwOpenProcessToken(
+        NtCurrentProcess(),
+        TOKEN_ALL_ACCESS,
+        &token_handle
+        );
+
+    if (!NT_SUCCESS(status))
+    {
+        return status;
+    }
+
+    token_privileges.PrivilegeCount = 1;
+    token_privileges.Privileges[0].Luid = RtlConvertUlongToLuid(Privilege);
+    token_privileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0;
+
+    //
+    // Normaly one would use ZwAdjustPrivilegesToken but it is only available
+    // on Windows 2000 and later versions, however since we are in a system
+    // thread does ExGetPreviousMode always return KernelMode and therefore
+    // can NtAdjustPrivilegesToken be used directly.
+    //
+    status = NtAdjustPrivilegesToken(
+        token_handle,
+        FALSE,
+        &token_privileges,
+        sizeof(token_privileges),
+        NULL,
+        NULL
+        );
+
+    ZwClose(token_handle);
+
+    return status;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/filedisk/sys/src/filedisk.rc	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+//Microsoft Developer Studio generated resource script.
+//
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,14
+ PRODUCTVERSION 1,0,0,14
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x3L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName", "Bo Brantén\0"
+            VALUE "FileDescription", "FileDisk Virtual Disk Driver\0"
+            VALUE "FileVersion", "1.0.0.14\0"
+            VALUE "InternalName", "filedisk\0"
+            VALUE "LegalCopyright", "Copyright © 1999-2006 Bo Brantén\0"
+            VALUE "OriginalFilename", "filedisk.sys\0"
+            VALUE "ProductName", "filedisk\0"
+            VALUE "ProductVersion", "1.0.0.14\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // !_MAC
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Binary file buildframework/helium/external/helium-antlib/antlibs/ant-antunit-1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/ant-contrib-1.0b2.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/emma.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/emma_ant.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/fmpp-0.9.13.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/junit-4.5.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/velocity-dep-1.3.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/antlibs/xmlunit-1.2.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-core.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-diamonds.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-metadata.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-quality.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-scm.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-signaling.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+set ANT_ARGS=-lib antlibs -lib lib -lib core/lib -lib diamonds/lib -lib scm/lib
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+module load java/1.6.0
+module load "tww/ant/1.7.1"
+module load mercurial
+setenv ANT_ARGS "-lib antlibs -lib lib" 
+ant $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib" default="build" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib build file.</description>
+    
+    <property environment="env" />
+    
+    <import file="macros.ant.xml" />    
+    
+    
+    <path id="subant.build.files">
+        <fileset dir="." includes="core/build.xml" />
+        <fileset dir="." includes="signaling/build.xml" />
+        <fileset dir="." includes="*/build.xml" />
+    </path>
+
+    
+    <target name="compile" description="Compile class files">
+        <subantPreset target="compile"/>
+    </target>
+    
+    
+    <target name="jar" description="Create jar files">
+        <subantPreset target="jar"/>
+    </target>
+    
+    
+    <target name="build" description="Runs compile and jar">
+        <subantPreset target="build"/>
+    </target>
+    
+    
+    <target name="junit" description="Runs jUnit tests">
+        <subantPreset target="junit"/>
+    </target>
+    
+    
+    <target name="unittest" description="Runs AntUnit tests">
+        <subantPreset target="unittest"/>
+    </target>
+    
+    
+    <target name="test" description="Runs all tests">
+        <subantPreset target="test"/>
+    </target>
+    
+
+    <target name="clean" description="Cleans build outputs">
+        <subantPreset target="clean"/>
+    </target>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-core">
+    <description>Helium Antlib Core build file.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="core"/>
+    
+    <path id="helium.core.classpath">
+        <fileset dir="${ant.file.helium-core}/../lib" includes="*.jar"/>
+    </path>
+
+</project>
+
+
Binary file buildframework/helium/external/helium-antlib/core/lib/jakarta-oro-2.0.8.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/AbstractTemplateInputSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core;
+
+/**
+ * Implements the source name handling.
+ */
+public abstract class AbstractTemplateInputSource implements
+        TemplateInputSource {
+
+    private String sourceName;
+    /**
+     * Get template source name.
+     * @return
+     *      template source name.
+     */
+    public String getSourceName() {
+        return sourceName;
+    }
+    /**
+     * Add template source name
+     * @param String 
+     *          template source name     
+     */
+    public void setSourceName(String souceName) {
+        this.sourceName = souceName;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,357 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core;
+
+import java.util.Arrays;
+import java.util.Properties;
+import java.util.Hashtable;
+import java.util.zip.GZIPOutputStream;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import javax.mail.*;
+import javax.mail.internet.*;
+import javax.naming.*;
+import javax.naming.directory.*;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import org.apache.log4j.Logger;
+import org.apache.commons.io.FileUtils;
+
+/**
+ * Send compressed or uncompressed xml data with email.
+ */
+public class EmailDataSender {
+
+    // Logger
+    private static Logger log = Logger.getLogger(EmailDataSender.class);
+
+    // Address email is sent from
+    private String from;
+    
+    // The target address
+    private String[] toAddressList;
+
+    // LDAP config
+    private String ldapURL;
+    // TODO all reference to nokia internals MUST be removed.
+    private String rootdn = "o=Nokia";
+
+    // Configured smtp server address
+    private String smtpServerAddress;
+    /**
+    * Constructor
+    * 
+    * @param String
+    *            comma separeted email recepients list
+    * @param String
+    *            smtp server 
+    * @param String
+    *            ldap server
+    */
+    public EmailDataSender(String toStrings, String smtpServer,
+            String ldapAddress) {
+        if (toStrings != null) {
+            String[] splitList = toStrings.split(",");
+            toAddressList = splitList;
+        }
+        smtpServerAddress = smtpServer;
+        ldapURL = ldapAddress;
+    }
+    /**
+    * Constructor
+    * 
+    * @param String
+    *            email recepient list in array
+    * @param String
+    *            smtp server 
+    * @param String
+    *            ldap server
+    */
+    public EmailDataSender(String[] toList, String smtpServer,
+            String ldapAddress) {
+        toAddressList = toList;
+        smtpServerAddress = smtpServer;
+        ldapURL = ldapAddress;
+    }
+    /**
+    * Constructor
+    * 
+    * @param String
+    *            email recepients list in array
+    * @param String
+    *            smtp server 
+    * @param String
+    *            ldap server
+    * @param String
+    *            root domain in ldap server
+    */
+    public EmailDataSender(String[] toList, String smtpServer,
+            String ldapAddress, String rootdn) {
+        toAddressList = toList;
+        smtpServerAddress = smtpServer;
+        ldapURL = ldapAddress;
+        this.rootdn = rootdn;
+    }
+    /**
+    * Set sender address.
+    *
+    * @param String
+    *            mail sender address
+    */
+    public void setFrom(String from) {
+        this.from = from;
+    }
+    /**
+    * Add current user to recipient list.
+    *    
+    */
+    public void addCurrentUserToAddressList() {
+        // Create an empty array if needed
+        if (toAddressList == null)
+            toAddressList = new String[0];
+        try {
+            String userEmail;
+            userEmail = getUserEmail();
+            toAddressList = Arrays.copyOf(toAddressList,
+                    toAddressList.length + 1);
+            toAddressList[toAddressList.length - 1] = userEmail;
+        } catch (Exception e) {
+            return;
+        }
+    }
+    /**
+    * Get recipient address list.
+    * 
+    * @return
+    *       Recipient address list.
+    */
+    private InternetAddress[] getToAddressList() {
+        int toListLength = 0;
+        if (toAddressList != null)
+            toListLength = toAddressList.length;
+        InternetAddress[] addressList = new InternetAddress[toListLength];
+        try {
+            log.debug("EmailDataSender:getToAddressList:length: "
+                    + toListLength);
+            for (int i = 0; i < toListLength; i++) {
+                log.debug("EmailDataSender:getToAddressList:address:"
+                        + toAddressList[i]);
+                addressList[i] = new InternetAddress(toAddressList[i]);
+            }
+        } catch (Exception aex) {
+            log.error("EmailDataSender:AddressException: " + aex);
+        }
+        return addressList;
+    }
+    /**
+    * Send xml data without compression
+    * 
+    * @param String
+    *            purpose of this email
+    * @param String
+    *            file to send 
+    * @param String
+    *            mime type
+    * @param String
+    *            subject of email
+    * @param String
+    *            header of email
+    */
+    public void sendData(String purpose, String fileToSend, String mimeType,
+            String subject, String header) {
+        sendData(purpose, fileToSend, mimeType, subject, header, false);
+    }
+
+   
+    /**
+    * Sending the XML data(compressed) through email.
+    * 
+    * @param String
+    *            purpose of this email
+    * @param String
+    *            file to send     
+    * @param String
+    *            subject of email
+    * @param String
+    *            header of email
+    */
+    public void compresseAndSendData(String purpose, String fileToSend,
+            String subject, String header) {
+        sendData(purpose, fileToSend, null, subject, header, true);
+    }
+    /**
+    * Send xml data 
+    * 
+    * @param String
+    *            purpose of this email
+    * @param String
+    *            file to send 
+    * @param String
+    *            mime type
+    * @param String
+    *            subject of email
+    * @param String
+    *            header of mail
+    * @param boolean
+    *            compress data if true
+    */
+    public void sendData(String purpose, String fileToSend, String mimeType,
+            String subject, String header, boolean compressData) {
+        try {
+            log.debug("EmailDataSender:sendData:file: " + fileToSend);
+            log.debug("EmailDataSender:sendData:mimetype: " + mimeType);
+            if (fileToSend != null) {
+                log.debug("EmailDataSender:sendData:smtp address: "
+                        + smtpServerAddress);
+                InternetAddress[] toAddresses = getToAddressList();
+                Properties props = new Properties();
+                props.setProperty("mail.smtp.host", smtpServerAddress);
+                Session mailSession = Session.getDefaultInstance(props, null);
+                MimeMessage message = new MimeMessage(mailSession);
+                String subjectToSend = subject;
+                if (subject == null) {
+                    subjectToSend = "";
+                }
+                message.setSubject(subjectToSend);
+                MimeMultipart multipart = new MimeMultipart("related");
+                BodyPart messageBodyPart = new MimeBodyPart();
+                ByteArrayDataSource dataSrc = null;
+                log.debug("EmailDataSender:sendData:Send file: " + fileToSend);
+                String fileName = new File(fileToSend).getName();
+                if (compressData) {
+                    log.debug("EmailDataSender: Sending compressed data");
+                    dataSrc = compressFile(fileToSend);
+                    dataSrc.setName(fileName + ".gz");
+                    messageBodyPart.setFileName(fileName + ".gz");
+                } else {
+                    log.debug("EmailDataSender: Sending uncompressed data:");
+                    dataSrc = new ByteArrayDataSource(new FileInputStream(
+                            new File(fileToSend)), mimeType);
+
+                    message.setContent(FileUtils.readFileToString(new File(
+                            fileToSend)), "text/html");
+                    multipart = null;
+                }
+                String headerToSend = null;
+                if (header == null) {
+                    headerToSend = "";
+                }
+                messageBodyPart.setHeader("helium-bld-data", headerToSend);
+                messageBodyPart.setDataHandler(new DataHandler(dataSrc));
+
+                if (multipart != null) {
+                    multipart.addBodyPart(messageBodyPart); // add to the
+                    // multipart
+                    message.setContent(multipart);
+                }
+                try {
+                    InternetAddress fromAddress = getFromAddress(); 
+                    message.setFrom(fromAddress);
+                } catch (Exception e) {
+                    log.debug("Error retrieving current user email address: " + e.getMessage());
+                }
+                message.addRecipients(Message.RecipientType.TO, toAddresses);
+                log.info("Sending email alert: " + subject);
+                Transport.send(message);
+            }
+        } catch (Exception e) {
+            log.info("Not sending e-mail signal because of errors");
+            log.debug("Failed sending e-mail: " + purpose + ": ", e);
+        }
+    }
+
+    /**
+     * GZipping a string.
+     * 
+     * @param data
+     *            the content to be gzipped.
+     * @param filename
+     *            the name for the file.
+     * @return a ByteArrayDataSource.
+     */
+    protected ByteArrayDataSource compressFile(String fileName)
+            throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        GZIPOutputStream gz = new GZIPOutputStream(out);
+        BufferedInputStream bufferedInputStream = new BufferedInputStream(
+                new FileInputStream(new File(fileName)));
+        byte[] dataBuffer = new byte[512];
+        while ((bufferedInputStream.read(dataBuffer)) != -1) {
+            gz.write(dataBuffer);
+        }
+        gz.close();
+        bufferedInputStream.close();
+        ByteArrayDataSource dataSrc = new ByteArrayDataSource(
+                out.toByteArray(), "application/x-gzip");
+        return dataSrc;
+    }
+    /**
+    * Get sender address.
+    * 
+    * @return
+    *       sender address.
+    */
+    private InternetAddress getFromAddress() throws Exception {
+        if (from != null) {
+            return new InternetAddress(from);
+        }
+        return new InternetAddress(getUserEmail());
+    }
+    
+    /**
+     * Getting user email.
+     * 
+     * @return
+     *    the user email address.
+     */
+    protected String getUserEmail() throws Exception {
+        String username = System.getProperty("user.name");
+        log.debug("EmailDataSender:getUserEmail:username: " + username);
+
+        // Set up environment for creating initial context
+        Hashtable<String, String> env = new Hashtable<String, String>(11);
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+                "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, ldapURL + "/" + rootdn);
+
+        // Create initial context
+        DirContext ctx = new InitialDirContext(env);
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+        try {
+            NamingEnumeration<SearchResult> en = ctx.search("", "uid=" + username, controls);
+            if (en.hasMore()) {
+                SearchResult sr = en.next();
+                String email = (String) sr.getAttributes().get("mail").get();
+                log.debug("EmailDataSender:getUserEmail:" + email);
+                return email;
+            }
+        } catch (javax.naming.NameNotFoundException ex) {
+            log.debug("EmailDataSender:username:" + username + "finding error");
+            throw new HlmAntLibException("Error find user email");
+        }
+        throw new HlmAntLibException("Could not find user email in LDAP.");
+    }
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/HlmAntLibException.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core;
+
+/**
+ * HlmAntlib exception handling class
+ */
+public class HlmAntLibException extends RuntimeException {
+
+    private static final long serialVersionUID = -2504337723465536053L;
+
+    /**
+     * Constructor
+     * 
+     * @param String
+     *            exception message
+     */
+    public HlmAntLibException(String msg) {
+        super("HlmAntLibException:generic:" + msg);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param String
+     *            module which throws the exception
+     * @param String
+     *            exception message
+     */
+    public HlmAntLibException(String module, String msg) {
+        super("HlmAntLibException:" + module + ":" + msg);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/LogSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core;
+
+import java.io.File;
+
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * This class is the base class for all types of logs
+ * 
+ */
+public class LogSource extends DataType {
+
+    public File getFilename() {
+        //will be implemented by subclasses
+        throw new HlmAntLibException("Improper logsource usage"); 
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPHash.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,151 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import freemarker.template.ObjectWrapper;
+import freemarker.template.SimpleCollection;
+import freemarker.template.SimpleScalar;
+import freemarker.template.TemplateCollectionModel;
+import freemarker.template.TemplateHashModelEx;
+import freemarker.template.TemplateModel;
+import fmpp.Engine;
+import fmpp.models.AddTransform;
+import fmpp.models.ClearTransform;
+import fmpp.models.CopyWritableVariableMethod;
+import fmpp.models.NewWritableHashMethod;
+import fmpp.models.NewWritableSequenceMethod;
+import fmpp.models.RemoveTransform;
+import fmpp.models.SetTransform;
+
+/**
+ * Downgraded implementation which makes the PPHash public (from FMPP).
+ */
+public class PPHash implements TemplateHashModelEx {
+    private Map<String, TemplateModel> map = new HashMap<String, TemplateModel>();
+
+    /**
+    * Constructor
+    *     
+    */
+    public PPHash() {
+        // transforms
+        put("set", new SetTransform());
+        put("add", new AddTransform());
+        put("remove", new RemoveTransform());
+        put("clear", new ClearTransform());
+
+        // methods
+        put("newWritableSequence", new NewWritableSequenceMethod());
+        put("newWritableHash", new NewWritableHashMethod());
+        put("copyWritable", new CopyWritableVariableMethod());
+
+        // constants
+        put("slash", File.separator);
+        put("version", Engine.getVersionNumber());
+        put("freemarkerVersion", Engine.getFreeMarkerVersionNumber());
+
+    }
+    /**
+    * Get number of templates.
+    * 
+    * @return
+    *       Number of templates.
+    */
+    public int size() {
+        return map.size();
+    }
+
+    /**
+    * Get templates.
+    * 
+    * @return
+    *       templates.
+    */
+    public TemplateCollectionModel keys() {
+        return new SimpleCollection(map.keySet(), ObjectWrapper.SIMPLE_WRAPPER);
+    }
+    
+    /**
+    * Get template values.
+    * 
+    * @return
+    *       template values.
+    */
+    public TemplateCollectionModel values() {
+        return new SimpleCollection(map.values(), ObjectWrapper.SIMPLE_WRAPPER);
+    }
+
+    /**
+    * Get a template.
+    * 
+    * @param String
+    *            key for template
+    * @return
+    *       a template.
+    */
+    public TemplateModel get(String key) {
+        return map.get(key);
+    }
+
+     /**
+    * Check if there are any template.
+    * 
+    * @return
+    *       True if no template.
+    */
+    public boolean isEmpty() {
+        return map.isEmpty();
+    }
+     /**
+    * Add template
+    *     
+    * @param String
+    *            name of template
+    * @param TemplateModel
+    *            value
+    */
+    public void put(String name, TemplateModel value) {
+        map.put(name, value);
+    }
+     /**
+    * Add template
+    *     
+    * @param String
+    *            name of template
+    * @param String
+    *            value
+    */
+    public void put(String name, String value) {
+        map.put(name, new SimpleScalar(value));
+    }
+
+     /**
+    * Delete template
+    *     
+    * @param String
+    *            name of template
+    */
+    public void remove(String name) {
+        map.remove(name);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPInputSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core;
+/**
+ * Template source.
+ */
+public class PPInputSource implements TemplateInputSource {
+
+    private String name = "pp";
+
+     /**
+    * Get source name
+    *     
+    * @return 
+    *        name of source
+    */
+    @Override
+    public String getSourceName() {
+        return name;
+    }
+
+     /**
+    * Get hash
+    *     
+    * @return 
+    *        hash
+    */
+    public PPHash getPPHash() {
+        return new PPHash();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PropertiesSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core;
+
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
+
+/**
+ * Property set configuration holder. Will make the defined properties available
+ * under a named variable.
+ */
+public class PropertiesSource extends AbstractTemplateInputSource {
+    private Map<String, String> properties;
+
+    /**
+     * Constructor
+     * 
+     * @param String
+     *            Name of template
+     * @param Hashtable
+     *            properties
+     */
+    public PropertiesSource(String name, Map<String, String> props) {
+        setSourceName(name);
+        properties = props;
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param String
+     *            Name of template
+     * @param Properties
+     *            properties
+     */
+    public PropertiesSource(String name, Properties props) {
+        setSourceName(name);
+        properties = new Hashtable<String, String>();
+        for (Entry<Object, Object> entry : props.entrySet()) {
+            properties.put((String) entry.getKey(), (String) entry.getValue());
+        }
+    }
+
+    /**
+     * Get properties.
+     * 
+     * @return Properties.
+     */
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateInputSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+
+package com.nokia.helium.core;
+
+/**
+ * Generic interface between all input sources.
+ */
+public interface TemplateInputSource {
+    /**
+     * Get the name of the source inside the template.
+     * 
+     * @return
+     *          source name.
+     */
+    String getSourceName();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core;
+
+import freemarker.template.Template;
+import freemarker.template.Configuration;
+
+import java.io.FileWriter;
+import java.io.File;
+import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.log4j.Logger;
+
+/**
+ * Template processor.
+ * 
+ */
+public class TemplateProcessor {
+
+    private Logger log = Logger.getLogger(TemplateProcessor.class);
+
+    /**
+     * Create a Map of FreeMarker compatible data from the list of input source.
+     * 
+     * @param inputSources
+     * @return
+     * @throws TemplateProcessorException
+     */
+    private HashMap<String, Object> getTemplateMap(
+            List<TemplateInputSource> inputSources) {
+        HashMap<String, Object> templateMap = new HashMap<String, Object>();
+        try {
+            for (TemplateInputSource source : inputSources) {
+                if (source instanceof XMLTemplateSource) {
+                    XMLTemplateSource xmlSource = (XMLTemplateSource) source;
+                    File inputFile = xmlSource.getSourceLocation();
+                    if (inputFile.exists()) {
+                        templateMap.put(xmlSource.getSourceName(),
+                                freemarker.ext.dom.NodeModel.parse(inputFile));
+                    } else {
+                        log.debug("TemplateProcessor: input file " + inputFile
+                                + " for the template does not exists");
+                    }
+                } else if (source instanceof PropertiesSource) {
+                    PropertiesSource propSource = (PropertiesSource) source;
+                    templateMap.put(propSource.getSourceName(), propSource
+                            .getProperties());
+                } else if (source instanceof PPInputSource) {
+                    PPInputSource ppSource = (PPInputSource) source;
+                    templateMap.put(ppSource.getSourceName(), ppSource
+                            .getPPHash());
+                }
+            }
+        } catch (java.io.IOException e) {
+            log.warn("I/O Error during template conversion: " + e.getMessage());
+            throw new TemplateProcessorException(
+                    "I/O Error during template conversion: " + e.getMessage());
+        } catch (org.xml.sax.SAXException e1) {
+            log.warn("XML parser error: " + e1);
+            throw new TemplateProcessorException("XML parser error: "
+                    + e1.getMessage());
+        } catch (javax.xml.parsers.ParserConfigurationException e3) {
+            log.warn("Parser error: " + e3);
+            throw new TemplateProcessorException("Parser error: "
+                    + e3.getMessage());
+        }
+        return templateMap;
+    }
+
+    /**
+     * Convert a template.
+     * 
+     * @param templateFile
+     * @param outputFile
+     * @param sourceList
+     * @throws TemplateProcessorException
+     */
+    public void convertTemplate(String templateFile, String outputFile,
+            List<TemplateInputSource> sourceList) {
+        convertTemplate(new File(templateFile), new File(outputFile),
+                sourceList);
+    }
+
+    /**
+     * Convert a template.
+     * 
+     * @param templateFile
+     * @param outputFile
+     * @param sourceList
+     * @throws TemplateProcessorException
+     */
+    public void convertTemplate(File templateFile, File outputFile,
+            List<TemplateInputSource> sourceList) {
+        if (templateFile != null) {
+            convertTemplate(templateFile.getParent(), templateFile.getName(),
+                    outputFile.toString(), sourceList);
+        } else {
+            log.error("Template file is not defined.");
+            throw new TemplateProcessorException("Template file not defined.");
+        }
+    }
+
+    /**
+     * Converts the template to generate xml file to be sent to the server.
+     * 
+     * @param templateFile
+     *            - template file to be converted
+     * @param input
+     *            - input source file.
+     * @param outputFile
+     *            - location to store the converted file
+     * @param antProperties
+     *            - used as one of the input for conversion.
+     * @param inputSourceType
+     *            - source input type (xml / properties from file). Currently
+     *            xml input source is the only one supported.
+     * @return - location of the input source.
+     * @throws TemplateProcessorException
+     */
+    public void convertTemplate(String templateDir, String templateFile,
+            String outputFile, List<TemplateInputSource> sourceList) {
+
+        Configuration cfg = new Configuration();
+        File templateDirFile = new File(templateDir);
+        if (templateDir != null && templateDirFile.exists()) {
+            try {
+                cfg.setDirectoryForTemplateLoading(templateDirFile);
+                log
+                        .debug("diamonds:TemplateProcessor:adding template directory loader: "
+                                + templateDir);
+            } catch (java.io.IOException ie) {
+                log.debug("Template directory configuring error.");
+                log.info("Template directory configuring error.");
+                throw new TemplateProcessorException(
+                        "Template directory configuring error: " + ie);
+            }
+        } else {
+            log.debug("Template directory does not exist: "
+                    + templateDirFile.getAbsolutePath());
+            log.info("Template directory does not exist: "
+                    + templateDirFile.getAbsolutePath());
+            throw new TemplateProcessorException(
+                    "Template directory does not exist: "
+                            + templateDirFile.getAbsolutePath());
+        }
+        try {
+            Template template = cfg.getTemplate(templateFile);
+            Map<String, Object> templateMap = getTemplateMap(sourceList);
+            template.process(templateMap, new FileWriter(outputFile));
+        } catch (freemarker.core.InvalidReferenceException ivx) {
+            log.warn("Invalid reference in configuration: ", ivx);
+            throw new TemplateProcessorException(
+                    "Invalid reference in config: " + ivx);
+        } catch (freemarker.template.TemplateException e2) {
+            log.warn("TemplateException: ", e2);
+            throw new TemplateProcessorException("TemplateException: " + e2);
+        } catch (java.io.IOException e) {
+            log.warn("I/O Error during template conversion: " + e.getMessage());
+            throw new TemplateProcessorException(
+                    "I/O Error during template conversion: " + e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessorException.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+
+package com.nokia.helium.core;
+
+/**
+ * Template Exception handler.
+ * 
+ */
+public class TemplateProcessorException extends RuntimeException {
+    
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Default constructor.
+     * @param message the error message.
+     */
+    public TemplateProcessorException(String message) {
+        super(message);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/XMLTemplateSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+
+package com.nokia.helium.core;
+
+import java.io.File;
+
+/**
+ * HlmAntlib exception handling class
+ */
+public class XMLTemplateSource extends AbstractTemplateInputSource
+{
+    private File sourceLocation;
+
+    /**
+    * Constructor
+    * 
+    * @param String
+    *            Name of template
+    * @param String
+    *            location of template 
+    */
+    public XMLTemplateSource(String name, File location) {
+        setSourceName(name);
+        sourceLocation = location;
+    }
+    
+    /**
+    * Get source location
+    * 
+    * @return 
+    *            source location. 
+    */
+    public File getSourceLocation() {
+        return sourceLocation;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core.ant;
+
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.util.List;
+import java.io.BufferedReader;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+
+import org.apache.tools.ant.taskdefs.ImportTask;
+import org.apache.tools.ant.helper.DefaultExecutor;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Location;
+import com.nokia.helium.core.ant.types.*;
+
+import java.util.HashMap;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import org.apache.log4j.Logger;
+
+/**
+ * This class implements a flexible Ant Executor which allows dynamic discovery
+ * and automatic loading of new features. It also supports pre/post actions to
+ * be executed.
+ */
+public class HeliumExecutor extends DefaultExecutor {
+    private HashMap<String, Vector<HlmDefinition>> preOperations = new HashMap<String, Vector<HlmDefinition>>();
+    private HashMap<String, Vector<HlmDefinition>> postOperations = new HashMap<String, Vector<HlmDefinition>>();
+    private HashMap<String, Vector<HlmExceptionHandler>> exceptionHandlers = new HashMap<String, Vector<HlmExceptionHandler>>();
+    private Project project;
+    private Logger log = Logger.getLogger(HeliumExecutor.class);
+
+    /**
+     * Override the default Ant executor.
+     * 
+     * @param project
+     *            Object of the project
+     * @param targetNames
+     *            Array of target names to execute
+     * 
+     */
+    public void executeTargets(Project project, String[] targetNames) {
+        this.project = project;
+        log.debug("[HeliumExecutor] Running executeTargets");
+        BuildException failure = null;
+        try {
+            loadModules(project);
+            doOperations(preOperations, project, targetNames);
+            super.executeTargets(project, targetNames);
+        } catch (BuildException e) {
+            // Saving current issue
+            failure = e;
+        }
+
+        try {
+            doOperations(postOperations, project, targetNames);
+        } catch (BuildException e) {
+            // Treating possible new issues...
+            if (failure != null) {
+                failure = new BuildException(e.toString() + failure.toString());
+            } else {
+                failure = e;
+            }
+        }
+        // Propagating any raised issues.
+        if (failure != null) {
+            handleExceptions(project, failure);
+            throw failure;
+        }
+    }
+
+    /**
+     * Loading all the discovered modules.
+     * 
+     * @param module
+     * @param prj
+     */
+    private void loadModules(Project prj) {
+        List<File> moduleList = loadAvailableModules();
+        for (File moduleName : moduleList) {
+            loadModule(moduleName, prj);
+        }
+    }
+
+    /**
+     * Load a specific module.
+     * 
+     * @param moduleLib
+     * @param prj
+     */
+    private void loadModule(File moduleLib, Project prj) {
+        String file = getHlmAntLibFile(moduleLib);
+        if (file == null) {
+            return;
+        }
+        log.debug("[HeliumExecutor] Loading " + moduleLib.getName());
+        ImportTask task = new ImportTask();
+        Target target = new Target();
+        target.setName("");
+        target.setProject(prj);
+        task.setOwningTarget(target);
+        task.setLocation(new Location(file));
+        task.setFile(file);
+        task.setProject(prj);
+        task.execute();
+        String moduleName = getModuleName(moduleLib);
+        Object refObject = prj.getReference(moduleName + ".list");
+
+        if (refObject == null) {
+            log.debug(moduleName + ".list not found");
+        }
+        if (refObject != null && refObject instanceof HlmDefList) {
+            HlmDefList defList = (HlmDefList) refObject;
+            Vector<HlmDefinition> tempDefList = new Vector<HlmDefinition>(
+                    defList.getPreDefList());
+            if (tempDefList != null) {
+                preOperations.put(moduleName, tempDefList);
+            }
+            Vector<HlmDefinition> tempPostDefList = new Vector<HlmDefinition>(
+                    defList.getPostDefList());
+            if (tempPostDefList != null) {
+                postOperations.put(moduleName, tempPostDefList);
+            }
+            Vector<HlmExceptionHandler> tempExceptionDefList = defList
+                    .getExceptionHandlerList();
+            if (tempExceptionDefList != null) {
+                exceptionHandlers.put(moduleName, tempExceptionDefList);
+            }
+            log.debug("HeliumExecutor:loadModule:pre-opsize"
+                    + preOperations.size());
+            log.debug("HeliumExecutor:loadModule:post-opsize"
+                    + postOperations.size());
+            log.debug("HeliumExecutor:loadModule:exception-opsize"
+                    + exceptionHandlers.size());
+            log.debug("[HeliumExecutor] Checking " + moduleLib);
+        }
+    }
+
+    /**
+     * Search for helium.antlib.xml under the module Jar.
+     * 
+     * @param moduleLib
+     * @return
+     * @throws IOException
+     */
+    protected URL findHeliumAntlibXml(File moduleLib) throws IOException {
+        JarFile jarFile = new JarFile(moduleLib);
+        Enumeration<JarEntry> jee = jarFile.entries();
+        while (jee.hasMoreElements()) {
+            JarEntry je = jee.nextElement();
+            if (je.getName().endsWith("/helium.antlib.xml")) {
+                return new URL("jar:" + moduleLib.toURI().toString() + "!/"
+                        + je.getName());
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Retrieve the found helium.antlib.xml. TODO improve if possible without
+     * extracting the file.
+     * 
+     * @param moduleLib
+     * @return
+     */
+    private String getHlmAntLibFile(File moduleLib) {
+        log.debug("[HeliumExecutor] Checking " + moduleLib);
+        try {
+            URL url = findHeliumAntlibXml(moduleLib);
+            if (url == null)
+                return null;
+            log.debug("[HeliumExecutor] Getting " + url);
+
+            JarURLConnection jarConnection = (JarURLConnection) url
+                    .openConnection();
+            JarEntry jarEntry = jarConnection.getJarEntry();
+            JarFile jarFile = new JarFile(moduleLib);
+            InputStream is = jarFile.getInputStream(jarEntry);
+            InputStreamReader isr = new InputStreamReader(is);
+            BufferedReader reader = new BufferedReader(isr);
+            File file = File.createTempFile("helium", "antlib.xml");
+            file.deleteOnExit();
+            FileWriter writer = new FileWriter(file);
+            String line;
+            while ((line = reader.readLine()) != null) {
+                writer.write(line + "\n");
+            }
+            writer.close();
+            reader.close();
+            log.debug("[HeliumExecutor] Temp file " + file.getAbsolutePath());
+            return file.getAbsolutePath();
+        } catch (Exception ex) {
+            log.error("[HeliumExecutor] Error: ", ex);
+            return null;
+        }
+    }
+
+    private void doOperations(
+            HashMap<String, Vector<HlmDefinition>> operations, Project prj,
+            String[] targetNames) {
+        log.debug("HeliumExecutor:doOperations: start");
+        for (String moduleName : operations.keySet()) {
+            log.debug("HeliumExecutor:doOperations: module" + moduleName);
+            for (HlmDefinition definition : operations.get(moduleName)) {
+                definition.execute(prj, moduleName, targetNames);
+            }
+        }
+    }
+
+    private void handleExceptions(Project prj, Exception e) {
+        log.debug("HeliumExecutor:handleExceptions: start");
+        for (String moduleName : this.exceptionHandlers.keySet()) {
+            log.debug("HeliumExecutor:handleExceptions: module" + moduleName);
+            for (HlmExceptionHandler exceptionHandler : this.exceptionHandlers
+                    .get(moduleName)) {
+                exceptionHandler.handleException(prj, moduleName, e);
+            }
+        }
+    }
+
+    private String getModuleName(File moduleLib) {
+        String name = moduleLib.getName();
+        return name.substring(0, name.lastIndexOf('.'));
+    }
+
+    private List<File> loadAvailableModules() {
+        List<File> moduleList = new ArrayList<File>();
+        String classpathString = System.getProperty("java.class.path");
+        StringTokenizer tokenizier = new StringTokenizer(classpathString,
+                File.pathSeparator);
+        String token;
+        while (tokenizier.hasMoreTokens()) {
+            token = (String) tokenizier.nextToken();
+            if (new File(token).isFile() && token.endsWith(".jar")) {
+                moduleList.add(new File(token));
+            }
+        }
+        return moduleList;
+    }
+
+    protected Project getProject() {
+        return project;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmDefinition.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant;
+
+import org.apache.tools.ant.Project;
+
+/**
+ * This interface defines the API of an HeliumExecutor task. 
+ */
+public interface HlmDefinition {
+    
+    /**
+     * This method will implement the action to be performed by the 
+     * HeliumExecutor plugin. 
+     * @param prj
+     * @param module
+     */
+    void execute(Project prj, String module, String[] targetNames);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmExceptionHandler.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant;
+
+import org.apache.tools.ant.Project;
+
+/**
+ * This interface defines the API of an HeliumExecutor task. 
+ */
+public interface HlmExceptionHandler {
+    
+    /**
+     * This method will implement the action to be performed by the 
+     * HeliumExecutor plugin. 
+     * @param project
+     * @param module
+     * @param exception
+     */
+    void handleException(Project project, String module, Exception exception);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="path2file" classname="com.nokia.helium.core.ant.taskdefs.SerializePathTask"/>
+    <taskdef name="countSeverity" classname="com.nokia.helium.core.ant.taskdefs.XMLLogCount"/>
+    <!-- Type definition -->
+    <typedef name="hasSeverity" classname="com.nokia.helium.core.ant.conditions.XMLLogCondition"/>
+    <typedef name="ldapauthenticate" classname="com.nokia.helium.core.ant.taskdefs.ValidateUserLogin" />
+
+    <!-- Type definition -->
+    <typedef name="deflist" classname="com.nokia.helium.core.ant.types.HlmDefList"/>
+    <typedef name="importdef" classname="com.nokia.helium.core.ant.types.HlmImportDef"/>
+    <typedef name="listenerdef" classname="com.nokia.helium.core.ant.types.HlmListenerDef"/> 
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core.ant.conditions;
+
+import java.io.File;
+import org.apache.tools.ant.BuildException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+import com.nokia.helium.core.ant.types.ConditionType;
+
+/**
+ * This class implements a Ant Condition which report true if it finds any
+ * matching severity inside an XML log.
+ * 
+ * Example:
+ * <pre>
+ * &lt;target name=&quot;fail-on-build-error&quot;&gt;
+ *   &lt;fail message=&quot;The build contains errors&quot;&gt;
+ *     &lt;hlm:hasSeverity file=&quot;build_log.log.xml&quot; severity=&quot;error&quot;/&gt;
+ *   &lt;/fail&gt;
+ * &lt;/target&gt;
+ * </pre>
+ * 
+ * The condition will eval as true if the build_log.log.xml contains any error message in the log.
+ * 
+ * @ant.type name="hasSeverity" category="Core"
+ */
+public class XMLLogCondition extends ConditionType {
+
+    // The severity to count
+    private String severity;
+    private String logRegexp;
+    private File fileName;
+
+    /**
+     * Sets which severity will be counted.
+     * 
+     * @param severity
+     * @ant.required
+     */
+    public void setSeverity(String severity) {
+        this.severity = severity;
+    }
+
+    public void setFile(File file) {
+        fileName = file;
+    }
+
+    /**
+     * Regular expression which used to match a specific log filename.
+     * 
+     * @param regex
+     * @ant.not-required
+     */
+    public void setLogMatcher(String regex) {
+        this.logRegexp = regex;
+    }
+
+    /**
+     * Get the number of a particular severity.
+     * 
+     * @return the number of a particular severity.
+     */
+    public int getSeverity() {
+        int messageCount = 0;
+        if (fileName == null || !fileName.exists()) {
+            //this.log("Error: Log file does not exist " + fileName);
+            return -1;
+        }
+        if (severity == null)
+            throw new BuildException("'severity' attribute is not defined");
+
+        this.log("Looking for severity '" + severity + "' under '"
+                + fileName.getAbsolutePath() + "'");
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+        try {
+            SAXParser saxParser = factory.newSAXParser();
+            MessageHandler handler = new MessageHandler();
+            saxParser.parse(fileName, handler);
+            this.log("Found " + handler.getMessageCount() + " " + severity
+                    + "(s).");
+            messageCount += handler.getMessageCount();
+        } catch (Exception exc) {
+            throw new BuildException(exc);
+        }
+        return messageCount;
+    }
+
+    /**
+     * This method open the defined file and count the number of message tags
+     * with their severity attribute matching the configured one.
+     * 
+     * @return if true if message with the defined severity have been found.
+     */
+    public boolean eval() {
+        int severity = getSeverity();
+        if (severity < 0) {
+            return false;
+        }
+        return severity > 0;
+    }
+
+    /**
+     * Implements a SAX handler specialized in counting message tag with a
+     * specific severity.
+     */
+    class MessageHandler extends DefaultHandler {
+
+        private int count;
+
+        public MessageHandler() {
+        }
+
+        @Override
+        public void startElement(String uri, String localName, String name,
+                Attributes attributes) throws SAXException {
+            super.startElement(uri, localName, name, attributes);
+            if (name.equals(severity) && count == 0) {
+                count = Integer.valueOf(attributes.getValue("count"));
+            }
+        }
+
+        public int getMessageCount() {
+            return count;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/AntCall.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.taskdefs;
+
+import org.apache.tools.ant.taskdefs.Ant;
+import org.apache.tools.ant.taskdefs.CallTarget;
+
+/**
+ * This task extends current AntCall task by
+ * supporting any kind of Reference object.
+ * 
+ * @ant.task name="antcall" category="Core"
+ */
+public class AntCall extends CallTarget {
+
+    /**
+     * Add a Reference object.
+     * @param ref the reference object.
+     */
+    public void add(Ant.Reference ref) {
+        this.addReference(ref);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/SerializePathTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.taskdefs;
+
+import java.io.*;
+import java.util.Vector;
+import java.util.Iterator;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Path;
+
+/**
+ * This class implements a Path de/serializer which can dumps the list of files
+ * to a UTF-8 file or retrieve a list path from a file into a path datatype.
+ *
+ * Examples:
+ * <pre>
+ * &lt;target name=&quot;serialize&quot;&gt;
+ *   &lt;hlm:path2file file=&quot;output.txt&quot;&gt;
+ *     &lt;path&gt;
+ *         &lt;pathelement path=&quot;/temp/filename.ext&quot;/&gt;
+ *     &lt;/path&gt;
+ *   &lt;/hlm:path2file&gt;
+ * &lt;/target&gt;
+ * </pre>
+ * 
+ * The execution of the <code>serialize</code> task will produce a file called output.txt that will contains
+ * a line referencing the /temp/filename.ext.
+
+ * <pre>
+ * &lt;target name=&quot;deserialize&quot;&gt;
+ *   &lt;hlm:path2file reference=&quot;output.ref&quot;&gt; file=&quot;output.txt&quot;/&gt;
+ * &lt;/target&gt;
+ * </pre>
+ * 
+ * The execution of the <code>deserialize</code> task will create a path datatype that will
+ * contains a pathelement pointing on <code>/temp/filename.ext.</code>
+ * 
+ * @ant.task name="path2file" category="Core"
+ */
+public class SerializePathTask extends Task {
+
+    private Vector<Path> paths = new Vector<Path>();
+    private File filename;
+    private String reference;
+
+    /**
+     * Add path datatype to the task.
+     * 
+     * @param path
+     */
+    public void add(Path path) {
+        paths.add(path);
+    }
+
+    /**
+     * Set reference attribute.
+     * 
+     * @param reference
+     */
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * Set file attribute. It is a mandatory setting.
+     * 
+     * @param filename
+     */
+    public void setFile(File filename) {
+        this.filename = filename;
+    }
+
+    /**
+     * Excecute the task. If filename is defined and reference is not, it will
+     * try to dump the paths content into a file. Else if a filename and a
+     * reference is defined it will covert each line of the file into a
+     * pathelement of a path datatype.
+     */
+    public void execute() {
+        if (filename == null) {
+            throw new BuildException("'file' attribute must be defined");
+        }
+        if (filename != null && reference == null) {
+            this.log("Dumping paths into file " + filename);
+            try {
+                OutputStreamWriter os = new OutputStreamWriter(
+                        new FileOutputStream(filename), "UTF8");
+                for (Iterator<Path> ipath = paths.iterator(); ipath.hasNext();) {
+                    Path path = ipath.next();
+                    String[] plist = path.list();
+                    for (int i = 0; i < plist.length; i++) {
+                        os.write(plist[i] + "\n");
+                    }
+                }
+                os.close();
+            } catch (Exception exc) {
+                throw new BuildException(exc);
+            }
+        } else if (filename != null && reference != null) {
+            this.log("Converting " + filename + " content into path.");
+            try {
+                Path path = new Path(getProject());
+                BufferedReader is = new BufferedReader(new InputStreamReader(
+                        new FileInputStream(filename), "UTF-8"));
+                String line = null;
+                while ((line = is.readLine()) != null) {
+                    path.createPathElement().setPath(line);
+                }
+                this.log("Creating reference " + reference + ".");
+                getProject().addReference(reference, path);
+            } catch (Exception exc) {
+                throw new BuildException(exc);
+            }
+        } else {
+            new BuildException("The task is not configured properly.");
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,236 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.core.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import javax.naming.*;
+import javax.naming.directory.*;
+import java.util.Hashtable;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+/**
+ * Task is to validate noe user with LDAP server.
+ * <pre>
+ * Usage: &lt;hlm:ldapauthenticate url="${email.ldap.server}" 
+                                rootdn="${email.ldap.rootdn}" 
+                                searchdn="${ldap.organization.unit.rootdn}, ${ldap.people.rootdn}" 
+                                filter="uid=${env.USERNAME}" 
+                                outputproperty="is.authentication.sucess" 
+                                key="employeeNumber"
+                                password="${noe.password}"/&gt;
+   </pre>
+   <pre>
+ * Usage:   &lt;condition property="is.authentication.sucess" &gt;
+                &lt;hlm:ldapauthenticate url="${email.ldap.server}" 
+                                rootdn="${email.ldap.rootdn}" 
+                                searchdn="${ldap.organization.unit.rootdn}, ${ldap.people.rootdn}" 
+                                filter="uid=${env.USERNAME}" 
+                                key="employeeNumber"
+                                password="${noe.password}"/&gt;
+            &lt;condition/&gt;
+   </pre>
+   @ant.task name="ldapauthenticate" category="Core" 
+ */
+public class ValidateUserLogin extends Task implements Condition
+{
+    private String url;
+    private String rootdn;
+    private String filter;
+    private String key;
+    private String property;
+    private String searchdn;
+    private String password;
+        
+    public void execute()
+    {
+        
+        if (property == null)
+            throw new BuildException("'property' attribute is not defined");
+        validateParameters(url, rootdn, filter, key, searchdn, password);
+        log("Authenticating the user...");
+        if (authenticateUser(url, searchUser(url, rootdn, filter, key, searchdn))) {
+            getProject().setProperty(property, "true");
+        }
+        else {
+            getProject().setProperty(property, "false");
+        }
+    }
+    
+    public boolean eval() {
+        
+        validateParameters(url, rootdn, filter, key, searchdn, password);
+        return authenticateUser(url, searchUser(url, rootdn, filter, key, searchdn)); 
+         
+    }
+    
+    public String searchUser(String url, String rootdn, String filter, String key, String searchdn) {
+        
+        String userSearchDN = null;
+        // Set up environment for creating initial context
+        Hashtable<String, String> env = new Hashtable<String, String>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+                "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, url + "/" + rootdn);
+
+        // Create initial context
+        env.put(Context.SECURITY_AUTHENTICATION, "simple");
+        DirContext ctx = null;
+        NamingEnumeration results = null;
+        try {
+            ctx = new InitialDirContext(env);
+            SearchControls controls = new SearchControls();
+            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            results = ctx.search("", filter, controls);
+            while (results.hasMore()) {
+                SearchResult searchResult = (SearchResult) results.next();
+                Attributes attributes = searchResult.getAttributes();
+                Attribute attr = attributes.get(key);
+                userSearchDN = key + "=" + (String) attr.get() + ", " + searchdn + ", " + rootdn;
+            }
+        } catch (NamingException e) {
+            e.printStackTrace(); 
+            throw new BuildException("LDAP Naming exception"); 
+        }
+        return userSearchDN;
+    }
+    
+    public void validateParameters(String url, String rootdn, String filter, String key, String searchdn, String password) {
+        
+        if (url == null)
+            throw new BuildException("'url' attribute is not defined");
+        if (rootdn == null)
+            throw new BuildException("'rootdn' attribute is not defined");
+        if (filter == null)
+            throw new BuildException("'filter' attribute is not defined");
+        if (key == null)
+            throw new BuildException("'key' attribute is not defined");
+        if (searchdn == null)
+            throw new BuildException("'searchdn' attribute is not defined");
+        if (password == null)
+            throw new BuildException("'password' attribute is not defined");
+    }
+    
+    public boolean authenticateUser(String ldapurl, String rooTdn) {
+    
+        Hashtable<String, String> env = new Hashtable<String, String>(11);
+        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, ldapurl);
+        env.put(Context.SECURITY_AUTHENTICATION, "simple");
+        env.put(Context.SECURITY_PRINCIPAL, rooTdn);
+        env.put(Context.SECURITY_CREDENTIALS, password);
+        try {
+            DirContext authContext = new InitialDirContext(env);
+            return true;
+        } catch (NamingException e) {
+            return false;  
+        }
+
+    }
+    public String getUrl() 
+    {
+        return url;
+    }
+    /**
+     * ldap URL
+     * @ant.required
+     */
+    public void setUrl(String url) 
+    {
+        this.url = url;
+    }
+    
+
+    public String getRootdn() 
+    {
+        return rootdn;
+    }
+    /**
+     * user password to authenticate
+     * @ant.required
+     */
+    public void setpassword(String password) 
+    {
+        this.password = password;
+    }
+    
+    public String getpassword() 
+    {
+        return password;
+    }
+    /**
+     * ldap root distinguished name to search user.
+     * @ant.required
+     */
+    public void setRootdn(String rootdn) 
+    {
+        this.rootdn = rootdn;
+    }
+    
+    public String getsearchdn() 
+    {
+        return searchdn;
+    }
+    /**
+     * ldap distinguished name to search user
+     * @ant.required
+     */
+    public void setsearchdn(String searchdn) 
+    {
+        this.searchdn = searchdn;
+    }
+
+    public String getFilter() 
+    {
+        return filter;
+    }
+    /**
+     * object name to search in the ldap.
+     * @ant.required
+     */
+    public void setFilter(String filter) 
+    {
+        this.filter = filter;
+    }
+
+    public String getOutputProperty() 
+    {
+        return property;
+    }
+    /**
+     * output property to set if the user found.
+     * @ant.required
+     */
+    public void setOutputProperty(String property) 
+    {
+        this.property = property;
+    }
+
+    public String getKey() 
+    {
+        return key;
+    }
+    /**
+     * key to search the user information
+     * @ant.required
+     */
+    public void setKey(String key) 
+    {
+        this.key = key;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/XMLLogCount.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.core.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import com.nokia.helium.core.ant.conditions.XMLLogCondition;
+
+/**
+ * This class sets a property to the number of matching severity inside a XML log.
+ * 
+ * @ant.task name="countSeverity" category="Core"
+ */
+public class XMLLogCount extends Task {
+
+    private File fileName;
+    private String severity;
+    private String logRegexp;
+    private String property;
+
+    /**
+     * File to be parsed.
+     * 
+     * @param filename
+     * @ant.required
+     */
+    public void setFile(File filename) {
+        fileName = filename;
+    }
+
+    /**
+     * Defines the severity name to be counted.
+     * 
+     * @param severity
+     * @ant.required
+     */
+    public void setSeverity(String severity) {
+        this.severity = severity;
+    }
+
+    /**
+     * Name of the property to be set.
+     * @param property the property name
+     * @ant.required
+     */
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    /**
+     * Regular expression which used to match a specific log filename.
+     * @param regex
+     * @ant.not-required
+     */
+    public void setLogMatcher(String regex) {
+        this.logRegexp = regex;
+    }
+    
+    /**
+     *  Execute the task. Set the property with number of severities.  
+     * @throws BuildException
+     */
+    public void execute() {
+        if (property == null)
+            throw new BuildException("'property' attribute is not defined");
+        
+        XMLLogCondition cond = new XMLLogCondition();
+        cond.setFile(fileName);
+        cond.setLogMatcher(logRegexp);
+        cond.setSeverity(severity);
+        getProject().setNewProperty(property, "" + cond.getSeverity());
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ConditionType.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+/**
+ * Base class for conditions.
+ */
+public class ConditionType extends ProjectComponent implements Condition {
+    
+    public boolean eval() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/FallbackReference.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Ant;
+
+/**
+ * This DataType implements a reference fallback.
+ * If refid is not defined then the implementation,
+ * can fallback on a defaultRefid.  
+ *
+ * @ant.type name="fallbackReference" category="Core"
+ */
+public class FallbackReference extends Ant.Reference {
+
+    private String defaultRefid;
+
+    /**
+     * Set the refid if it is defined, else it uses the defaultRefid
+     * @param id
+     */
+    public void setRefid(String id) {
+        getProject().log("Setting reference:  " + id, Project.MSG_DEBUG);
+        super.setRefId(id);
+        if (getProject().getReference(super.getRefId()) == null
+                && defaultRefid != null) {
+            super.setRefId(defaultRefid);
+        }
+    }
+
+    /**
+     * Set the default refid if it refid doesn't exists then
+     * it configures the reference to use the defaultRefid. 
+     * @param id
+     */
+    public void setDefaultRefid(String defaultRefid) {
+        getProject().log("Setting default reference: " + defaultRefid,
+                Project.MSG_DEBUG);
+        this.defaultRefid = defaultRefid;
+        if (getProject().getReference(super.getRefId()) == null) {
+            getProject().log(
+                    "Reference not defined using default reference: "
+                            + defaultRefid, Project.MSG_DEBUG);
+            setRefId(defaultRefid);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmDefList.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,108 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import java.util.Vector;
+import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.core.ant.HlmExceptionHandler;
+
+/**
+ * 
+ */
+public class HlmDefList extends DataType {
+
+    private Vector<HlmPreDefImpl> preDefList = new Vector<HlmPreDefImpl>();
+    private Vector<HlmPostDefImpl> postDefList = new Vector<HlmPostDefImpl>();
+    private Vector<HlmExceptionHandler> exceptionHandlerList = new Vector<HlmExceptionHandler>();
+
+    /**
+     * Creates an empty hlm post-action definition and adds it to the list.
+     */
+    public HlmPreDefImpl createHlmPreDefImpl() {
+        HlmPreDefImpl def = new HlmPreDefImpl();
+        add(def);
+        return (HlmPreDefImpl) def;
+    }
+
+    /**
+     * Creates an empty hlm post-action definition and adds it to the list.
+     */
+    public HlmPostDefImpl createHlmPostDefImpl() {
+        HlmPostDefImpl def = new HlmPostDefImpl();
+        add(def);
+        return (HlmPostDefImpl) def;
+    }
+
+    /**
+     * Add a given variable to the list
+     * 
+     * @param var
+     *            variable to add
+     */
+    public void add(HlmPreDefImpl definition) {
+        if (definition != null) {
+            preDefList.add(definition);
+        }
+    }
+
+    /**
+     * Add a post-action to the list.
+     */
+    public void add(HlmPostDefImpl definition) {
+        if (definition != null) {
+            postDefList.add(definition);
+        }
+    }
+    
+    /**
+     * Add a exception handler to the list.
+     */
+    public void add(HlmExceptionHandler exceptionHandler) {
+        if (exceptionHandler != null) {
+            exceptionHandlerList.add(exceptionHandler);
+        }
+    }
+
+    /**
+     * Get the pre-action list.
+     * 
+     * @return a vector containing all the pre-actions
+     */
+    public Vector<HlmPreDefImpl> getPreDefList() {
+        return preDefList;
+    }
+
+    /**
+     * Get the post-action list.
+     * 
+     * @return a vector containing all the post-actions
+     */
+    public Vector<HlmPostDefImpl> getPostDefList() {
+        return postDefList;
+    }
+    
+    /**
+     * Get the exception handler list.
+     * 
+     * @return a vector containing all the exception handlers
+     */
+    public Vector<HlmExceptionHandler> getExceptionHandlerList() {
+        return exceptionHandlerList;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.taskdefs.ImportTask;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Location;
+import org.apache.tools.ant.Project;
+
+import java.io.File;
+
+/**
+ * This class implements an Executor importer pre-action.
+ * 
+ * @ant.type name="importdef" category="Core"
+ */
+public class HlmImportDef extends HlmPreDefImpl {
+
+    private static Logger log = Logger.getLogger(HlmImportDef.class);
+    
+    private File file ;
+
+    public void setFile(File file) {
+        this.file = file;
+    }
+
+    /**
+     * Will import the given file.
+     */
+    public void execute(Project prj, String module, String[] targetNames) {
+        log.debug("importdef:fileName" + file.toString());
+        log.debug("importdef:prj name" + prj.getName());
+        ImportTask task = new ImportTask();
+        Target target = new Target();
+        target.setName("");
+        target.setProject(prj);
+        task.setOwningTarget(target);
+        task.setLocation(new Location(file.getAbsolutePath()));
+        task.setFile(file.toString());
+        task.setProject(prj);
+        task.execute();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildListener;
+
+/**
+ * This class implements a listener registration action.
+ * 
+ * @ant.type name="listenerdef" category="Core"
+ */
+public class HlmListenerDef extends HlmPreDefImpl {
+
+    private String classname;
+
+    public void setClassname(String classname) {
+        this.classname = classname;
+    }
+
+    /**
+     * Register given listener to the project.
+     */
+    public void execute(Project prj, String module, String[] targetNames) {
+        try {
+            Class<?> listenerClass = Class.forName(classname);
+            BuildListener listener = (BuildListener) listenerClass
+                    .newInstance();
+            prj.addBuildListener(listener);
+        } catch (ClassNotFoundException ex) {
+            ex.printStackTrace();
+        } catch (InstantiationException ex1) {
+            ex1.printStackTrace();
+        } catch (IllegalAccessException ex1) {
+            ex1.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.log4j.Logger;
+
+import com.nokia.helium.core.ant.HeliumExecutor;
+import com.nokia.helium.core.ant.HlmDefinition;
+
+/**
+ * Implement an abstract post-action.
+ */
+public class HlmPostDefImpl extends DataType implements HlmDefinition {
+    private Logger log = Logger.getLogger(HeliumExecutor.class);
+
+    /**
+     * Do nothing.
+     */
+    public void execute(Project prj, String module, String[] targetNames) {
+        log.debug("HlmPostDefImpl:execute:" + module);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPreDefImpl.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.ant.HlmDefinition;
+
+/**
+ * Implement an abstract pre-action.
+ */
+public class HlmPreDefImpl extends DataType implements HlmDefinition {
+    /**
+     * Do nothing.
+     */
+    public void execute(Project prj, String module, String[] targetNames) {
+        // empty will implemented by the sub classes.
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ReferenceType.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Helper class to force user providing a reference. It doesn't implement any
+ * particular Ant interface.
+ */
+public class ReferenceType extends DataType {
+    /**
+     * Returns the referenced object.
+     * 
+     * @return the reference object.
+     */
+    public Object getReferencedObject() {
+        Reference reference = getRefid();
+        Object obj = reference.getReferencedObject(getProject());
+        return obj;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/log4j.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium Antlib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+            <appender-ref ref="FILE"/>
+            <appender-ref ref="CONSOLE"/>
+    </appender>
+
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="false" />
+    </filter>
+    </appender>
+
+
+    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
+        <param name="File" value="hlm_debug.log"/>
+        <param name="append" value="false"/>
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="true" />
+    </filter>
+
+    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
+
+    </appender>
+
+  <logger name="com.nokia" additivity="false">
+      <level value="DEBUG" />
+    <appender-ref ref="ASYNC" />
+  </logger>
+
+    <root>
+        <priority value="DEBUG"/>
+        <appender-ref ref="CONSOLE"/>
+    </root>
+</log4j:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+module load java/1.6.0
+setenv ANT_ARGS "-lib ../../antlibs -lib ../../bin/helium-core.jar -lib ../../lib" 
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\lib -lib %CD%\..\..\lib -lib %CD%\..\..\antlibs -lib %CD%\..\..\bin\helium-core.jar
+ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+endlocal
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium antlib core tests.</description>
+    <target name="unittest" depends="unittest-core" />
+
+    <target name="unittest-core">
+        <au:antunit>
+            <fileset dir="." includes="**/test_*.ant.xml" />
+            <au:plainlistener />
+        </au:antunit>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/executor/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : build.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-executor">
+    <description>Helium antlib core executor test config.</description>
+
+    <target name="target">
+        <echo>Running target.</echo>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_executor.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-executor" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium antlib core executor tests.</description>
+
+    <target name="test-executor">
+        <au:logcapturer/>
+        <exec osfamily="windows" executable="cmd">
+            <arg line="/C ant"/>
+            <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor"/>
+            <arg line="-lib ../../../../bin"/>
+            <arg line="-lib ../../../../antlibs"/>
+            <arg line="target"/>
+        </exec>    
+        <exec osfamily="unix" executable="ant">
+            <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor"/>
+            <arg line="-lib ../../../../bin"/>
+            <arg line="-lib ../../../../antlibs"/>
+            <arg line="target"/>
+        </exec>
+        <exec osfamily="unix" executable="ant">
+            <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor"/>
+            <arg line="-lib ../../../../bin"/>
+            <arg line="-lib ../../../../antlibs"/>
+            <arg line="target"/>
+        </exec>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/serializepath/test_serializepath.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_serializepath.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-serializepath" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib core serializepath tests.</description>
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete file="dump.txt" failonerror="false" />
+    </target>
+
+    <fileset id="empty_folder.path" dir="data/empty_folder" />
+
+    <!-- the actual test case -->
+    <target name="test-serializepath-emptydump">
+        <!-- Creating an empty file -->
+        <hlm:path2file file="dump.txt" />
+        <au:assertFileExists file="dump.txt" />
+        <hlm:path2file file="dump.txt" reference="path2file.empty"/>
+        <au:assertTrue>
+            <resourcecount refid="path2file.empty" when="eq" count="0" />
+        </au:assertTrue>
+    </target>
+
+    <!-- the actual test case -->
+    <target name="test-serializepath-data">
+        <!-- Creating an empty file -->
+        <hlm:path2file file="dump.txt">
+            <path>
+                <fileset dir="${ant.file.test-serializepath}/../data">
+                    <include name="**/test.txt"/>    
+                </fileset>
+            </path>
+        </hlm:path2file>
+        <au:assertFileExists file="dump.txt" />
+        <hlm:path2file file="dump.txt" reference="path2file.data"/>
+        <au:assertTrue>
+            <resourcecount refid="path2file.data" when="eq" count="2" />
+        </au:assertTrue>
+    </target>
+
+    <!-- the actual test case -->
+    <target name="test-serializepath-noattribute">
+        <!-- Creating an empty file -->
+        <au:expectfailure>
+            <hlm:path2file/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-serializepath-nofile-reference">
+        <!-- Creating an empty file -->
+        <au:expectfailure>
+            <hlm:path2file reference="ref.not.defined"/>
+        </au:expectfailure>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/data/helium_minibuild_ido_compile.log.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<build-status>
+        <warning count= "2" />
+        <error count= "1" />
+        <fatal count= "0" />
+        <default count= "0" />
+        <remark count= "0" />
+        <info count= "0" />
+</build-status>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_countseverity.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_countseverity.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-countseverity" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib core countseverity tests.</description>
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+    </target>
+
+    <fileset id="empty_folder.path" dir="data/empty_folder" />
+    <target name="test-countseverity-no-property">
+        <au:expectfailure>
+            <hlm:countSeverity severity="error" file="./data/helium_minibuild_ido_compile.log.xml" />
+        </au:expectfailure>
+    </target>
+
+    <!-- the actual test case -->
+    <target name="test-countseverity-error">
+        <!-- Check for errors -->
+        <hlm:countSeverity severity="error" file="./data/helium_minibuild_ido_compile.log.xml" property="errors"/>
+        <au:assertTrue>
+            <equals arg1="${errors}" arg2="1"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-countseverity-warning">
+        <!-- Check for warnings -->
+        <hlm:countSeverity severity="warning" file="./data/helium_minibuild_ido_compile.log.xml" property="warnings"/>
+        <echo message="Warnings: ${warnings}"/>
+        <au:assertTrue>
+            <equals arg1="${warnings}" arg2="2"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-countseverity-info">
+        <!-- Check for infos -->
+        <hlm:countSeverity severity="infos" file="./data/helium_minibuild_ido_compile.log.xml" property="infos"/>
+        <au:assertTrue>
+            <equals arg1="${infos}" arg2="0"/>
+        </au:assertTrue>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_hasseverity.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_hasseverity.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-hasseverity" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib core hasseverity tests.</description>
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+    </target>
+
+    <fileset id="empty_folder.path" dir="data/empty_folder" />
+
+    <!-- the actual test case -->
+    <target name="test-hasseverity-error">
+        <!-- Check for errors -->
+        <au:assertTrue>
+            <hlm:hasSeverity severity="error" file="./data/helium_minibuild_ido_compile.log.xml" />
+        </au:assertTrue>
+    </target>
+
+    <target name="test-hasseverity-warning">
+        <!-- Check for warnings -->
+        <au:assertTrue>
+            <hlm:hasSeverity severity="warning" file="./data/helium_minibuild_ido_compile.log.xml" />
+        </au:assertTrue>
+    </target>
+
+    <target name="test-hasseverity-info">
+        <!-- Check for infos -->
+        <au:assertFalse>
+            <hlm:hasSeverity severity="info" file="./data/helium_minibuild_ido_compile.log.xml" />
+        </au:assertFalse>
+    </target>
+</project>
Binary file buildframework/helium/external/helium-antlib/core/tests/lib/ant-antunit-1.0.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-diamonds">
+    <description>Helium Antlib build file.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="diamonds"/>
+    
+    <path id="helium.diamonds.classpath">
+        <fileset dir="${helium.antlib.root.dir}/bin" includes="*.jar"/>
+        <fileset dir="${helium.antlib.root.dir}/diamonds/lib" includes="*.jar"/>
+    </path>
+
+</project>
+
+
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-codec-1.3.jar has changed
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-configuration-1.5.jar has changed
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-httpclient-3.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-lang-2.4.jar has changed
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-logging-1.1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/dom4j-1.6.1.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,242 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.methods.FileRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import com.nokia.helium.core.EmailDataSender;
+
+import java.io.IOException;
+import java.io.File;
+
+/**
+ * Diamonds client used to connect to get build id and also to send the build
+ * results
+ * 
+ */
+public class DiamondsClient {
+
+    private static final int INT_SERV_ERROR = 500;
+
+    private static final int SERV_NOT_FOUND = 404;
+
+    private static final int SERV_OK = 200;
+    
+    private boolean isRecordOnly;
+
+    private Logger log = Logger.getLogger(DiamondsClient.class);
+
+    private String host;
+
+    private String port;
+
+    private String path;
+
+    private String emailID;
+
+    private HttpClient httpClient;
+
+
+    public DiamondsClient(String hst, String prt, String pth, String mailID) {
+        host = hst;
+        port = prt;
+        path = pth;
+        emailID = mailID;
+        httpClient = new HttpClient();
+    }
+
+    private int executeMethod(PostMethod postMethod) throws DiamondsException {
+        int result = 0;
+        try {
+            result = httpClient.executeMethod(postMethod);
+        } catch (IOException e) {
+            log.info("IOException while sending http request");
+            log.debug("IOException while sending http request: ", e);
+            isRecordOnly = true;
+            throw new DiamondsException("Exception in executeMethod");
+            // e.printStackTrace();
+        }
+        return result;
+    }
+
+    private String checkForProtocol(String url) throws DiamondsException {
+        String retURL = url;
+        try {
+            if (!StringUtils.containsIgnoreCase(url, "http://")) {
+                retURL = "http://" + url;
+            }
+        } catch (Exception ex) {
+            // ex.printStackTrace();
+            isRecordOnly = true;
+            log.info("Failed to check url, defaulting to input.");
+            throw new DiamondsException("Exception verifying URL");
+        }
+        return retURL;
+    }
+
+    private String getURL() throws DiamondsException {
+        return getURL(null);
+    }
+
+    private String getURL(String subPath) throws DiamondsException {
+        String urlPath = path;
+        if (subPath != null) {
+            urlPath = subPath;
+        }
+        return checkForProtocol("http://" + host + ":" + port + urlPath);
+    }
+
+    private PostMethod getPostMethod(String fileName, String urlPath) {
+
+        // Get the Diamonds XML-file which is to be exported
+        File input = new File(fileName);
+
+        // Prepare HTTP post
+        PostMethod post = new PostMethod(urlPath);
+
+        // Request content will be retrieved directly
+        // from the input stream
+
+        RequestEntity entity = new FileRequestEntity(input,
+                "text/xml; charset=ISO-8859-1");
+        post.setRequestEntity(entity);
+        return post;
+    }
+
+    private int processPostMethodResult(int result) {
+        // Log status code
+        switch (result) {
+        case INT_SERV_ERROR:
+            // log.error("Internal server error");
+            break;
+        case SERV_NOT_FOUND:
+            // log.error("Server not found");
+            break;
+        case SERV_OK:
+            // log.info("Connection to diamonds server - OK");
+            break;
+        default:
+            // log.debug("Response code: " + result);
+        }
+        return result;
+    }
+
+
+    /**
+     * 
+     * @param fileName
+     *            Filename to export to Diamonds
+     * @return diamonds build id
+     */
+    public String getBuildId(String fileName) throws DiamondsException {
+        String diamondsBuildID = null;
+        PostMethod postMethod = null;
+
+        // Get HTTP client
+        // MyHttpClient httpclient = createHttpClient();
+
+        // Execute post request
+        try {
+            if (!isRecordOnly) {
+                String strURL = getURL();
+                log.debug("strURL:" + strURL);
+                postMethod = getPostMethod(fileName, strURL);
+                log.debug("postmethod:" + postMethod);
+                int postMethodResult = httpClient.executeMethod(postMethod);
+                log.debug("postmethod-result:" + postMethodResult);
+    
+                int result = processPostMethodResult(postMethodResult);
+
+                if (result == SERV_OK) {
+                    // Display and save response code which functions as a id for
+                    // the build.
+                    diamondsBuildID = postMethod.getResponseBodyAsString();
+                    log.debug("diamondsBuildID: " + diamondsBuildID);
+                } else {
+                    isRecordOnly = true;
+                    log.debug("Connection Failed.");
+                    log
+                            .info("Diamonds data not sent, because of connection failure.");
+                    //throw new DiamondsException("Connection Failed");
+                }
+            }
+        } catch (HttpException ex) {
+            isRecordOnly = true;
+            log.debug("Connection Failed", ex);
+            log.info("Diamonds data not sent, because of httpexception.");
+            // log.error("Failed: " + ex.toString());
+            //throw new DiamondsException("Http Exception see the logs: "
+            //        + ex.getMessage());
+        } catch (IOException ex1) {
+            isRecordOnly = true;
+            log.debug("Connection Failed. ", ex1);
+            log.info("Diamonds data not sent, because of io exception.");
+            // log.error("Failed: " + ex.toString());
+            //throw new DiamondsException("Network error, see the logs: "
+            //        + ex1.getMessage());
+        } finally {
+            // Release current connection to the connection pool once you are
+            // done
+            if (postMethod != null) {
+                postMethod.releaseConnection();
+            }
+        }
+        return diamondsBuildID;
+    }
+
+    public int sendData(String fileName, String urlPath) {
+        PostMethod postMethod = null;
+        int result = -1;
+        if (urlPath != null && !isRecordOnly) {
+            try {
+                String strURL = getURL(urlPath);
+                postMethod = getPostMethod(fileName, strURL);
+                result = processPostMethodResult(httpClient
+                        .executeMethod(postMethod));
+            } catch (Exception e) {
+                log.debug("DiamondsClient:sendData by Http: ", e);
+                log.info("The final data via http not sent because errors: ", e);
+            }
+        }
+        return result;
+    }
+
+    public int sendDataByMail(String fileName, String smtpServer,
+            String ldapServer) {
+        log.debug("DiamondsClient:sendDataByEmail:emailID" + emailID);
+        EmailDataSender emailSender = new EmailDataSender(emailID, smtpServer,
+                ldapServer);
+        try {
+            log.debug("DiamondsClient:sendDataByEmail: " + fileName);
+            emailSender.sendData("diamonds", fileName, "application/xml",
+                    "[DIAMONDS_DATA]", null);
+            log.debug("DiamondsClient:sendDataByEmail:succeeds");
+        } catch (Exception e) {
+            log.debug("DiamondsClient:sendDataByEmail: ", e);
+            log.info("The final data via http not sent because errors: ", e);
+            return -1;
+        }
+        return 0;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,252 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.BuildException;
+
+import java.util.*;
+import org.dom4j.io.SAXReader;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.apache.log4j.Logger;
+
+/**
+ * Loads the configuration information from the xml file.
+ * 
+ */
+public final class DiamondsConfig {
+    private static DiamondsProperties diamondsProperties;
+
+    private static List<Stage> stages;
+
+    private static Logger log;
+
+    private static Map<String, Target> targets;
+
+    private static String outputDir;
+
+    private static String templateDir;
+    
+    private static String initialiserTargetName;
+
+    private DiamondsConfig() {
+    }
+    
+    /**
+     * Method accessed by loggers to load the diamonds specific configuration.
+     * 
+     * @param configFile
+     *            - configuration to load
+     * 
+     */
+    public static void parseConfiguration(String configFile)
+            throws DiamondsException {
+        if (log == null) {
+            log = Logger.getLogger(DiamondsConfig.class);
+        }
+        SAXReader saxReader = new SAXReader();
+        Document document = null;
+        try {
+            log.debug("diamonds:DiamondsConfig:reading configuration");
+            document = saxReader.read(configFile);
+        } catch (Exception e) {
+            log.debug("diamonds:DiamondsConfig:", e);
+            throw new DiamondsException("Diamonds configuration parsing error: "
+                    + e.getMessage());
+        }
+        parseConfig(document);
+        diamondsProperties = parseDiamondsProperties(document);
+        stages = parseStages(document);
+        targets = parseTargets(document);
+    }
+
+    /**
+     * Parses the general configuration info.
+     * 
+     * @param document
+     *            - XML config in DOM4J document
+     */
+    private static void parseConfig(Document document) {
+        log.debug("diamonds:DiamondsConfig:parsing general configuration.");
+        Node node = document.selectSingleNode("//output-dir");
+        outputDir = node.valueOf("@path");
+        node = document.selectSingleNode("//template-dir");
+        templateDir = node.valueOf("@path");
+    }
+
+    /**
+     * Parses the server info.
+     * 
+     * @param document
+     *            - XML config in DOM4J document
+     */
+    private static DiamondsProperties parseDiamondsProperties(Document document) {
+        log.debug("diamonds:DiamondsConfig:parsing diamonds properties.");
+        
+        Map<String, String> propertiesMap = new HashMap<String, String>();
+        
+        loadProperty(document, propertiesMap, "host");
+        loadProperty(document, propertiesMap, "port");
+        loadProperty(document, propertiesMap, "path");
+        loadProperty(document, propertiesMap, "tstampformat");
+        loadProperty(document, propertiesMap, "mail");
+        loadProperty(document, propertiesMap, "ldapserver");
+        loadProperty(document, propertiesMap, "smtpserver");
+        loadProperty(document, propertiesMap, "initialiser-target-name");
+        loadProperty(document, propertiesMap, "category-property");
+        loadProperty(document, propertiesMap, "buildid-property");
+        return new DiamondsProperties(propertiesMap);
+    }
+
+    /**
+     * Parses the Targets data from config.
+     * 
+     * @param document
+     *            - XML config in DOM4J document
+     * @return list of targets available in the config
+     */
+    @SuppressWarnings("unchecked")
+    private static Map<String, Target> parseTargets(Document document) {
+        log.debug("diamonds:DiamondsConfig:parsing for targets");
+        Map<String, Target> targets = new HashMap<String, Target>();
+        List<Element> stageNodes = document.selectNodes("//target");
+       
+        // Set initialiserTargetName according to target name defined Diamonds config file
+        initialiserTargetName = diamondsProperties.getProperty("initialiser-target-name");
+        targets.put(initialiserTargetName, new Target(initialiserTargetName,"","","",""));
+        for (Element stageNode : stageNodes) {
+            targets.put(stageNode.valueOf("@name"), new Target(stageNode
+                    .valueOf("@name"), stageNode.valueOf("@template-file"),
+                    stageNode.valueOf("@logfile"), stageNode
+                            .valueOf("@ant-properties"), stageNode
+                            .valueOf("@defer")));
+        }
+        return targets;
+    }
+
+    /**
+     * Parses the stages info.
+     * 
+     * @param document
+     *            - XML config in DOM4J document
+     * @return list of stages in config
+     */
+    @SuppressWarnings("unchecked")
+    private static List<Stage> parseStages(Document document) {
+        List<Stage> stages = new ArrayList<Stage>();
+        List<Element> stageNodes = document.selectNodes("//stage");
+        log.debug("diamonds:DiamondsConfig:parsing for stages");
+        for (Element stage : stageNodes) {
+            stages.add(new Stage(stage.valueOf("@name"), stage
+                    .valueOf("@start"), stage.valueOf("@end"), stage
+                    .valueOf("@logfile")));
+        }
+        return stages;
+    }
+
+    /**
+     * Helper function to get the stages
+     * 
+     * @return the stages from config in memory
+     */
+    static List<Stage> getStages() {
+        return stages;
+    }
+
+    /**
+     * Helper function to get the targets
+     * 
+     * @return the targets from config in memory
+     */
+    static Map<String, Target> getTargets() {
+        return targets;
+    }
+
+    /**
+     * Returns true if stages exists in config
+     * 
+     * @return the existance of stages in config
+     */
+    public static boolean isStagesInConfig() {
+        return stages != null;
+    }
+
+    /**
+     * Returns true if targets exists in config
+     * 
+     * @return the targets from config in memory
+     */
+    public static boolean isTargetsInConfig() {
+        return targets != null;
+    }
+
+    /**
+     * Gets the diamonds properties loaded from config
+     * 
+     * @return the targets from config in memory
+     */
+    public static DiamondsProperties getDiamondsProperties() {
+        return diamondsProperties;
+    }
+
+    /**
+     * Gets the output directory
+     * 
+     * @return the output directory, loaded from config
+     */
+    static String getOutputDir() {
+        return outputDir;
+    }
+
+    /**
+     * Gets the output directory
+     * 
+     * @return the output directory, loaded from config
+     */
+    static String getTemplateDir() {
+        return templateDir;
+    }
+    
+    /**
+     * Gets the initialiserTargetName
+     * 
+     * @return the initialiserTargetName, loaded from config
+     */
+    public static String getInitialiserTargetName() {
+        return initialiserTargetName;
+    }
+    
+    /**
+     * Load diamonds property into hashmap.
+     * @param doc
+     * @param hash
+     * @param name
+     * @return
+     */
+    public static void loadProperty(Document document, Map<String, String> hash, String name) {
+        Node node = document.selectSingleNode("//property[@name='" + name + "']");
+        if (node == null) {
+            throw new BuildException("diamonds: DiamondsConfig:'" + name + "' property definition is missing.");
+        }
+        hash.put(name, node.valueOf("@value"));
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsException.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds;
+
+/**
+ * Exception class for Diamonds implementation
+ * 
+ */
+public class DiamondsException extends Exception {
+
+    private static final long serialVersionUID = 8743300713686555395L;
+
+    /**
+     * Constructor
+     * 
+     * @exception - exception to be processed.
+     */
+
+    public DiamondsException(String exception) {
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: To update the build status to Diamonds with signals in case of build exceptions.
+*
+*/
+ 
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.HlmExceptionHandler;
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateInputSource;
+import com.nokia.helium.core.TemplateProcessor;
+import com.nokia.helium.signal.SignalStatus;
+import com.nokia.helium.signal.SignalStatusList;
+
+import org.apache.log4j.Logger;
+
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.List;
+import java.io.File;
+import java.util.ArrayList;
+import java.text.SimpleDateFormat;
+import java.util.Properties;
+
+
+/**
+ * Class to store the builds status and check the signal is present in the deferred signal list.
+ * if so get the signal informations like signal name, error message and target name.
+ * With collected signal information and build status send the generated XML file to diamonds client class
+ * to update the information into diamonds
+ */
+public class DiamondsExceptionStatusUpdate implements HlmExceptionHandler {
+    private Logger log = Logger.getLogger(DiamondsExceptionStatusUpdate.class);
+
+    /* Initiate build status to failed as this method will be invoked in case of exceptions only */
+    private String buildStatus = "failed";
+
+    private SimpleDateFormat timeFormat;
+
+    private TemplateProcessor templateProcessor;
+
+    private Hashtable<String, String> signalInformation = new Hashtable<String, String>();
+
+    private String outputFile,templateFile;
+
+    private List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+
+    /**
+     * Implements the Exception method to update build status and signal information to diamonds.
+     * @param project
+     * @param module
+     * @param e
+     */
+    @SuppressWarnings("unchecked")
+    public void handleException(Project project, String module, Exception e) {
+        templateProcessor = new TemplateProcessor();
+        Properties tempProperties = new Properties();
+        String templateDir = DiamondsConfig.getTemplateDir();
+        /* Initialize the diamond properties class to access the diamonds properties */
+        DiamondsProperties diamondsProperties = DiamondsConfig.getDiamondsProperties();
+        //Check, Is the diamonds listener is initialized?
+        if (DiamondsListenerImpl.isInitialized()) {
+            timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat"));
+            /* Initialize the diamond client class required to update the information into diamonds. */
+            DiamondsClient diamondsClient = new DiamondsClient(project
+                    .getProperty(diamondsProperties.getProperty("host")),
+                    project.getProperty(diamondsProperties
+                            .getProperty("port")), project
+                            .getProperty(diamondsProperties
+                                    .getProperty("path")), project
+                                    .getProperty(diamondsProperties
+                                            .getProperty("mail")));
+
+            /* Check is the signal is in deferred signal list?
+             * If so get the signal information like signal name, error message and target name
+             * 
+             */
+            if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
+                Vector<SignalStatus> signalList = SignalStatusList.getDeferredSignalList().getSignalStatusList();
+                timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat"));
+                log.debug("[DiamondsExceptionStatusUpdate] => Build Status = " + buildStatus);
+                int i = 0;
+                for (SignalStatus status : signalList) {
+                    signalInformation.put("diamond.signal.name." + i, status.getName());
+                    signalInformation.put("diamond.error.message." + i, status.getMessage());
+                    signalInformation.put("diamond.time.stamp." + i,new String(timeFormat.format(status.getTimestamp())));
+                    i += 1;
+                }
+                /* Generate the signal XML file required for diamonds to update the signal information,
+                 * using templateprocessor class
+                 */
+                templateFile = "diamonds_signal.xml.ftl";
+                outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-signal.xml";
+                sourceList.add(new PropertiesSource("diamondSignal", signalInformation));
+                templateProcessor.convertTemplate(templateDir, templateFile, outputFile,sourceList);
+
+                /* send the generated XML file for diamonds client to update the signals information into Diamonds */
+                log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile);
+                diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID());
+                try {
+                    DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
+                } catch (DiamondsException de) {
+                    log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+                }
+            }
+            /* Check, is the signal is in now signal list?
+             * If so get the signal information like signal name, error message and target name
+             * 
+             */
+            if (SignalStatusList.getNowSignalList().hasSignalInList()) {
+                Vector<SignalStatus> signalList = SignalStatusList.getNowSignalList().getSignalStatusList();
+                buildStatus = "failed";
+                timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat"));
+                log.debug("[DiamondsExceptionStatusUpdate] => Build Status = " + buildStatus);
+                int i = 0;
+                for (SignalStatus status : signalList) {
+                    signalInformation.put("diamond.signal.name." + i, status.getName());
+                    signalInformation.put("diamond.error.message." + i, status.getMessage());
+                    signalInformation.put("diamond.time.stamp." + i,new String(timeFormat.format(status.getTimestamp())));
+                    i += 1;
+                }
+                /* Generate the signal XML file required for diamonds to update the signal information,
+                 * using templateprocessor class
+                 */
+                templateFile = "diamonds_signal.xml.ftl";
+                outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-signal.xml";
+                sourceList.add(new PropertiesSource("diamondSignal", signalInformation));
+                templateProcessor.convertTemplate(templateDir, templateFile, outputFile,sourceList);
+
+                /* send the generated XML file for diamonds client to update the signals information into Diamonds */
+                log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile);
+                diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID());
+                try {
+                    DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
+                } catch (DiamondsException de) {
+                    log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+                }
+            }
+            /* Generate the build status XML file required for diamonds to update the build status information,
+             * using templateprocessor class. 
+             */
+            tempProperties.put("build.status", buildStatus);
+            sourceList.add(new PropertiesSource("ant", project.getProperties()));
+            sourceList.add(new PropertiesSource("diamonds", tempProperties));
+            outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-status.xml";
+            templateFile = "diamonds_status.xml.ftl";
+            templateProcessor.convertTemplate(templateDir, templateFile, outputFile, sourceList);
+
+            /* send the generated XML file for diamonds client to update the build status into Diamonds */
+            log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile);
+            diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID());
+            try {
+                DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
+            } catch (DiamondsException de) {
+                log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+            }
+        }
+
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListener.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.BuildEvent;
+
+/**
+ * Diamonds specific Listener interface.
+ * 
+ */
+public interface DiamondsListener {
+    /**
+     * Function to process logging info during beginning of target execution
+     * 
+     * @param event
+     *            of target execution.
+     */
+    void targetBegin(BuildEvent buildEvent) throws DiamondsException;
+
+    /**
+     * Function to process logging info during end of target execution
+     * 
+     * @param event
+     *            of target execution.
+     */
+    void targetEnd(BuildEvent buildEvent) throws DiamondsException;
+
+    /**
+     * Function to process logging info during beginning of build
+     * 
+     * @param event
+     *            of target execution.
+     */
+    void buildBegin(BuildEvent buildEvent) throws DiamondsException;
+
+    /**
+     * Function to process logging info during end of build
+     * 
+     * @param event
+     *            of target execution.
+     */
+    void buildEnd(BuildEvent buildEvent) throws DiamondsException;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,287 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.util.FileUtils;
+import java.util.Date;
+import java.util.List;
+import java.util.HashSet;
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.apache.log4j.Logger;
+import java.util.Properties;
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateInputSource;
+import com.nokia.helium.core.TemplateProcessor;
+
+/**
+ * Base diamonds logger implementation. The common implementation like
+ * initialization done here and used by sub classes.
+ */
+public class DiamondsListenerImpl implements DiamondsListener {
+
+    private static ArrayList<File> finalLogList = new ArrayList<File>();
+
+    private static DiamondsClient diamondsClient;
+
+    private static boolean isInitialized;
+
+    private static ArrayList<String> deferLogList = new ArrayList<String>();
+
+    private TemplateProcessor templateProcessor;
+
+    private Project project;
+    
+    private SimpleDateFormat timeFormat;
+
+    private Date buildStartTime;
+    
+    private Logger log = Logger.getLogger(DiamondsListenerImpl.class);
+
+    /**
+     * Default constructor
+     */
+    public DiamondsListenerImpl() {
+        templateProcessor = new TemplateProcessor();
+        timeFormat = new SimpleDateFormat(DiamondsConfig
+                .getDiamondsProperties().getProperty("tstampformat"));
+    }
+
+    /**
+     * Function to process logging info during end of build
+     * 
+     * @param event
+     *            of target execution.
+     */
+    public final void buildBegin(BuildEvent buildEvent)
+            throws DiamondsException {
+        project = buildEvent.getProject();
+        buildStartTime = new Date();
+    }
+    
+    /**
+     * Function to process logging info during end of build
+     * 
+     * @param event
+     *            of target execution.
+     */
+    @SuppressWarnings("unchecked")
+    public final void buildEnd(BuildEvent buildEvent) throws DiamondsException {
+        if (isInitialized()) {
+            log.debug("diamonds:DiamondsListenerImpl:sending final data to diamonds.");
+            String output = DiamondsConfig.getOutputDir() + File.separator
+                    + "diamonds-finish.xml";
+            File outputFile = new File(output);
+            String finishTemplateFile = "diamonds_finish.xml.ftl";
+            try {
+                Properties tempProperties = new Properties();
+                tempProperties.put("build.end.time", timeFormat
+                        .format(new Date()));
+                List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+                sourceList.add(new PropertiesSource("ant", project
+                        .getProperties()));
+                sourceList
+                        .add(new PropertiesSource("diamonds", tempProperties));
+                templateProcessor.convertTemplate(DiamondsConfig
+                        .getTemplateDir(), finishTemplateFile, output,
+                        sourceList);
+            } catch (Exception e) {
+                log.debug("diamonds:DiamondsListenerImpl:exception: ", e);
+                throw new DiamondsException(
+                        "failed to convert the build finish template: "
+                                + e.getMessage());
+            }
+
+            try {
+                log.info("Sending final data to diamonds.");
+                // String mergedFile = mergeFiles(output);
+                diamondsClient.sendData(output, DiamondsConfig
+                        .getDiamondsProperties().getDiamondsBuildID());
+            } catch (Exception e) {
+                log.debug("diamonds:DiamondsListenerImpl: exception: ", e);
+                throw new DiamondsException("Failed to send data to diamonds: "
+                        + e.getMessage());
+            }
+            mergeToFullResults(outputFile);
+            isInitialized = false;
+            DiamondsProperties props = DiamondsConfig.getDiamondsProperties();
+            String smtpServer = project.getProperty(props
+                    .getProperty("smtpserver"));
+            String ldapServer = project.getProperty(props
+                    .getProperty("ldapserver"));
+
+            try {
+                File first = finalLogList.remove(0);
+                String outputDir = DiamondsConfig.getOutputDir();
+                File fullResultsFile = new File(outputDir + File.separator
+                        + "diamonds-full-results.xml");
+                FileUtils.getFileUtils().copyFile(first, fullResultsFile);
+                XMLMerger merger = new XMLMerger(fullResultsFile);
+                HashSet<File> h = new HashSet<File>(finalLogList);
+                for (File f : h) {
+                    try {
+                        merger.merge(f);
+                    } catch (XMLMerger.XMLMergerException xe) {
+                        log.debug("Error during the merge: ", xe);
+                    }
+                }
+                diamondsClient.sendDataByMail(
+                        fullResultsFile.getAbsolutePath(), smtpServer,
+                        ldapServer);
+            } catch (Exception e) {
+                log.debug("Error sending diamonds final log: ", e);
+            }
+        }
+    }
+
+    /**
+     * Function to process logging info during begining of target execution
+     * 
+     * @param event
+     *            of target execution.
+     */
+    public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
+        initDiamondsClient();
+    }
+
+    /**
+     * Function to process logging info during end of target execution
+     * 
+     * @param event
+     *            of target execution.
+     */
+    public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
+    }
+
+    /**
+     * returns true if diamonds is already initialized for the build.
+     * 
+     * @param true diamonds initialized otherwise false.
+     */
+    public static boolean isInitialized() {
+        return isInitialized;
+    }
+
+    public static void mergeToFullResults(File xmlFile) throws DiamondsException {
+        finalLogList.add(xmlFile);
+    }
+
+    protected String getSourceFile(String inputName) {
+        return DiamondsConfig.getOutputDir() + File.separator + inputName
+                + ".xml";
+    }
+    
+    protected DiamondsClient getDiamondsClient() {
+        return diamondsClient;
+    }
+    
+    protected TemplateProcessor getTemplateProcessor() {
+        return templateProcessor;
+    }
+    
+    protected boolean getIsInitialized() {
+        return isInitialized;
+    }
+    
+    protected SimpleDateFormat getTimeFormat() {
+        return timeFormat;
+    }
+    
+    protected ArrayList<String> getDeferLogList() {
+        return deferLogList;
+    }
+
+    /**
+     * Initializes the diamonds client and sends the initial data
+     */
+    @SuppressWarnings("unchecked")
+    protected void initDiamondsClient() throws DiamondsException {
+        String outputDir = DiamondsConfig.getOutputDir();
+        if (!isInitialized) {
+            String startTemplateFile = "diamonds_start.xml.ftl";
+            String output = outputDir + File.separator
+                    + "diamonds-start.log.xml";
+            File outputFile = new File(output);
+            try {
+                Properties tempProperties = new Properties();
+                tempProperties.put("build.start.time", timeFormat
+                        .format(buildStartTime));
+                List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+                sourceList.add(new PropertiesSource("ant", project
+                        .getProperties()));
+                sourceList
+                        .add(new PropertiesSource("diamonds", tempProperties));
+                DiamondsProperties diamondsProperties = DiamondsConfig
+                        .getDiamondsProperties();
+                templateProcessor.convertTemplate(DiamondsConfig
+                        .getTemplateDir(), startTemplateFile, output,
+                        sourceList);
+                mergeToFullResults(outputFile);
+
+                // String mergedFile = mergeFiles(output);
+                log.info("Initializing diamonds client");
+                diamondsClient = new DiamondsClient(project
+                        .getProperty(diamondsProperties.getProperty("host")),
+                        project.getProperty(diamondsProperties
+                                .getProperty("port")), project
+                                .getProperty(diamondsProperties
+                                        .getProperty("path")), project
+                                .getProperty(diamondsProperties
+                                        .getProperty("mail")));
+                String buildID = diamondsClient
+                        .getBuildId(outputFile.getAbsolutePath());
+                if (buildID != null) {
+                    diamondsProperties.setDiamondsBuildID(buildID);
+                    project.setProperty(diamondsProperties.getProperty("buildid-property"),
+                            diamondsProperties.getDiamondsBuildID());
+                    log.info("Got build id from diamonds"
+                            + diamondsClient.getBuildId(outputFile
+                                    .getAbsolutePath()));
+                } else {
+                    diamondsProperties.setDiamondsBuildID(buildID);
+                    project.setProperty(diamondsProperties.getProperty("buildid-property"),
+                            "default");
+                    log.info("diamonds build id set to default and in record only mode");
+                }
+                if (deferLogList.size() > 0) {
+                    log
+                            .debug("diamonds:DiamondsListenerImpl: sending DefferList");
+                    ListIterator<String> defferList = deferLogList
+                            .listIterator();
+                    while (defferList.hasNext()) {
+                        String mergedDeferFile = defferList.next();
+                        mergeToFullResults(new File(mergedDeferFile));
+                        diamondsClient.sendData(mergedDeferFile, DiamondsConfig
+                                .getDiamondsProperties().getDiamondsBuildID());
+                    }
+                    deferLogList.clear();
+                }
+                isInitialized = true;
+            } catch (Exception e) {
+                log.debug("diamonds:DiamondsListenerImpl: ", e);
+                throw new DiamondsException("failed to connect to diamonds: "
+                        + e.getMessage());
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: To update the build status to Diamonds with signals in case of build exceptions.
+*
+*/
+ 
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.types.*;
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateInputSource;
+import com.nokia.helium.core.TemplateProcessor;
+
+import org.apache.log4j.Logger;
+
+import java.util.List;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Properties;
+
+
+/**
+ * Class to store the builds status and send the generated XML file to diamonds client class
+ * to update the build status into diamonds
+ */
+public class DiamondsPostBuildStatusUpdate extends HlmPostDefImpl {
+    private Logger log;
+
+    /* Initiate build status to failed as this method will be invoked in case of exceptions only */
+    private String buildStatus = "succeeded";
+
+    private TemplateProcessor templateProcessor;
+
+    private String outputFile,templateFile;
+
+    private List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+
+    public DiamondsPostBuildStatusUpdate() {
+        log = Logger.getLogger(DiamondsPostBuildStatusUpdate.class);    
+    }
+
+    /**
+     * Override execute method to update build status to diamonds.
+     * @param prj
+     * @param module
+     * @param targetNames
+     */
+    @SuppressWarnings("unchecked")
+    public void execute(Project prj, String module, String[] targetNames) {
+        templateProcessor = new TemplateProcessor();
+        Properties tempProperties = new Properties();
+
+        /* Intialiaze the diamond properties class to access the diamonds properties */
+        DiamondsProperties diamondsProperties = DiamondsConfig.getDiamondsProperties();
+
+        //Check, Is the diamonds listener is initialized?
+        if (DiamondsListenerImpl.isInitialized()) {
+            /* Initialize the diamond client class required to update the information into diamonds. */
+            DiamondsClient diamondsClient = new DiamondsClient(getProject()
+                    .getProperty(diamondsProperties.getProperty("host")),
+                    getProject().getProperty(diamondsProperties
+                            .getProperty("port")), getProject()
+                            .getProperty(diamondsProperties
+                                    .getProperty("path")), getProject()
+                                    .getProperty(diamondsProperties
+                                            .getProperty("mail")));
+            /* Generate the build status XML file required for diamonds to update the build status information,
+             * using templateprocessor class. 
+             */
+            tempProperties.put("build.status", buildStatus);
+            sourceList.add(new PropertiesSource("ant", getProject().getProperties()));
+            sourceList.add(new PropertiesSource("diamonds", tempProperties));
+            outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-status.xml";
+            templateFile = "diamonds_status.xml.ftl";
+            templateProcessor.convertTemplate(DiamondsConfig.getTemplateDir(), templateFile, outputFile, sourceList);
+
+            /* send the generated XML file for diamonds client to update the build status into Diamonds */
+            log.debug("[DiamondsPostBuildStatusUpdate] => sending data to diamonds ..." + outputFile);
+            diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID());
+            try {
+                DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
+            } catch (DiamondsException de) {
+                log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+            }
+        }
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsProperties.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+
+package com.nokia.helium.diamonds;
+
+import java.util.Map;
+
+/**
+ * Helper class for Diamonds properties need to connect.
+ * 
+ */
+public class DiamondsProperties {
+    private Map<String, String> diamondsProperties;
+
+    public DiamondsProperties(Map<String, String> configroperties) {
+        diamondsProperties = configroperties;
+    }
+
+    /**
+     * Gets the build id returned by Diamonds server.
+     * 
+     * @return build ID
+     */
+    public String getDiamondsBuildID() {
+        return diamondsProperties.get("buildid");
+    }
+
+    /**
+     * Sets the build id obtained from the server.
+     * 
+     * @param diamondsBuildID
+     */
+    public void setDiamondsBuildID(String diamondsBuildID) {
+        diamondsProperties.put("buildid", diamondsBuildID);
+    }
+
+    /**
+     * Returns the required property obtained from config
+     * 
+     * @param property
+     *            for which the values needs to be obtained.
+     * @return address of server
+     */
+    public String getProperty(String property) {
+        // need to validate the properties while assigning in constructor
+        return diamondsProperties.get(property);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Stage.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds;
+
+/**
+ * Helper class for Stage configuration of Diamonds.
+ * 
+ */
+public class Stage {
+    private String stageName;
+    private String startTargetName;
+    private String endTargetName;
+    private String source;
+
+    /**
+     * Constructor
+     * 
+     * @param stName
+     *            - name of the stage
+     * @param startTgName
+     *            - Name of the start target
+     * @param endTgName
+     *            - Name of the ending target of the stage
+     */
+    public Stage(String stName, String startTgName, String endTgName,
+            String sourceFiles) {
+        String emptyString = "";
+        if (!stName.equals(emptyString)) {
+            stageName = stName;
+        }
+        if (!startTgName.equals(emptyString)) {
+            startTargetName = startTgName;
+        }
+        if (!endTgName.equals(emptyString)) {
+            endTargetName = endTgName;
+        }
+        if (!sourceFiles.equals(emptyString)) {
+            source = sourceFiles;
+        }
+    }
+
+    /**
+     * Get the stage Name of the stage.
+     * 
+     * @return - name of the stage
+     */
+    public String getStageName() {
+        return stageName;
+    }
+
+    /**
+     * Get the stage Name of the stage.
+     * 
+     * @return - name of the stage
+     */
+    public String getSourceFile() {
+        return source;
+    }
+
+    /**
+     * gets the start target of the stage
+     * 
+     * @return - start target of the stage
+     */
+    public String getStartTargetName() {
+        return startTargetName;
+    }
+
+    /**
+     * gets the end target name of the stage.
+     * 
+     * @return - end target name of the stage
+     */
+    public String getEndTargetName() {
+        return endTargetName;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+
+
+
+import java.util.Date;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Enumeration;
+import java.util.Map;
+import java.io.File;
+import java.util.Iterator;
+import java.util.Vector;
+import java.util.ArrayList;
+import org.apache.log4j.Logger;
+
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateInputSource;
+
+
+import com.nokia.helium.core.XMLTemplateSource;
+
+/**
+ * Diamonds client used to connect to get build id and also to send the build
+ * results
+ * 
+ */
+public class StageDiamondsListener extends DiamondsListenerImpl {
+
+    private static final Date INVALID_DATE = new Date(-1);
+
+    private Logger log = Logger.getLogger(StageDiamondsListener.class);
+    
+    private List<Map<String, Date>> stageTargetBeginList = new ArrayList<Map<String, Date>>();
+
+    private Map<String, Stage> stageTargetEndMap = new HashMap<String, Stage>();
+
+    private boolean isTargetMapInitialized;
+
+    private Project project;
+
+    private String currentStartTargetName;
+
+    private List<Stage> stages;
+
+    private Date currentStartTargetTime;
+
+    public StageDiamondsListener() {
+        stages = DiamondsConfig.getStages();
+    }
+
+    public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
+        project = buildEvent.getProject();
+        String targetName = buildEvent.getTarget().getName();
+        if (!isTargetMapInitialized && stages != null) {
+            log
+                    .debug("diamonds:StageDiamondsListener: initializing for all stages.");
+            initStageTargetsMap();
+            isTargetMapInitialized = true;
+        }
+        if (currentStartTargetName == null) {
+            findAndSetStartTimeForTargetInStageList(targetName);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
+        if (currentStartTargetName != null) {
+            String targetName = buildEvent.getTarget().getName();
+            Stage stage = stageTargetEndMap.get(targetName);
+            if (stage != null && getIsInitialized() ) {
+                //initDiamondsClient();
+                String stageName = stage.getStageName();
+                String sourceFile = stage.getSourceFile();
+                log
+                        .debug("diamonds:StageDiamondsListener: finished recording for stage: "
+                                + stageName);
+                if (sourceFile == null) {
+                    sourceFile = getSourceFile(stageName);
+                }
+                project.setProperty("logical.stage", stageName);
+                project.setProperty("stage.start.time", getTimeFormat()
+                        .format(currentStartTargetTime));
+                project.setProperty("stage.end.time", getTimeFormat()
+                        .format(new Date()));
+                currentStartTargetName = null;
+                // Look for template file with stage name
+                String stageTemplateFileName = stageName + ".xml.ftl";
+                File stageTemplateFile = new File(stageTemplateFileName);
+                if (stageTemplateFile.exists()) {
+                    String output = DiamondsConfig.getOutputDir()
+                            + File.separator + stageName + ".xml";
+                    try {
+                        List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+                        sourceList.add(new PropertiesSource("ant", project
+                                .getProperties()));
+                        sourceList
+                                .add(new XMLTemplateSource("doc", new File(sourceFile)));
+                        getTemplateProcessor().convertTemplate(DiamondsConfig
+                                .getTemplateDir(), stageTemplateFileName,
+                                output, sourceList);
+                        mergeToFullResults(new File(output));
+
+                        // String mergedFile = mergeFiles(new File(output));
+
+                        log.info("Sending data to diamonds for stage: "
+                                + stageName);
+                        getDiamondsClient().sendData(output, DiamondsConfig
+                                .getDiamondsProperties().getDiamondsBuildID());
+                    } catch (com.nokia.helium.core.TemplateProcessorException e1) {
+                        throw new DiamondsException(
+                                "template conversion error for stage: "
+                                        + stageName + " : " + e1.getMessage());
+                    }
+                } else {
+                    log.debug("diamonds:StageDiamondsListener:tempalte file: "
+                            + stageTemplateFile + " does not exist");
+                }
+
+                String output = DiamondsConfig.getOutputDir() + File.separator
+                        + stageName + "-time.xml";
+                // Store the time for the current stage and send it
+                stageTemplateFileName = "diamonds_stage.xml.ftl";
+                try {
+                    List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+                    sourceList.add(new PropertiesSource("ant", project
+                            .getProperties()));
+                    sourceList.add(new XMLTemplateSource("doc", new File(sourceFile)));
+                    getTemplateProcessor().convertTemplate(DiamondsConfig
+                            .getTemplateDir(), stageTemplateFileName, output,
+                            sourceList);
+                    mergeToFullResults(new File(output));
+                    // List filesToMerge = new ArrayList();
+
+                    // mergedFile = mergeFiles(output);
+                    getDiamondsClient().sendData(output, DiamondsConfig
+                            .getDiamondsProperties().getDiamondsBuildID());
+                } catch (com.nokia.helium.core.TemplateProcessorException e1) {
+                    log.debug("diamonds:StageDiamondsListener:exception: ", e1);
+                    throw new DiamondsException(
+                            "template conversion error while sending data for stage: "
+                                    + stageName + " : " + e1.getMessage());
+                }
+            }
+        }
+    }
+
+    private void findAndSetStartTimeForTargetInStageList(String targetName)
+            throws DiamondsException {
+        for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter
+                .hasNext();) {
+            Map<String, Date> stageMap = listIter.next();
+            Date targetTime = stageMap.get(targetName);
+            if (targetTime != null && targetTime.equals(INVALID_DATE)) {
+                log.debug("diamonds:StageDiamondsListener: started recording for stage-target: "
+                                + targetName);
+                stageMap.put(targetName, new Date());
+                currentStartTargetName = targetName;
+                currentStartTargetTime = new Date();
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void initStageTargetsMap() {
+        Iterator<Stage> iter = stages.iterator();
+        while (iter.hasNext()) {
+            // stage begin process
+            Stage stage = iter.next();
+            String startTargetName = stage.getStartTargetName();
+            Map<String, Date> stageMap = new HashMap<String, Date>();
+            Vector<Target> arrayList = null;
+            try {
+                arrayList = project.topoSort(startTargetName, project
+                        .getTargets(), false);
+            } catch (BuildException be) {
+                log.debug("Diamonds target missing: ", be);
+            }
+            if (arrayList != null) {
+                Enumeration<Target> targetEnum = arrayList.elements();
+                while (targetEnum.hasMoreElements()) {
+                    // fast lookup
+                    Target target = targetEnum.nextElement();
+                    stageMap.put(target.getName(), INVALID_DATE);
+                }
+                stageTargetBeginList.add(stageMap);
+
+                // stage end process
+                String endTargetName = stage.getEndTargetName();
+                // fast lookup
+                stageTargetEndMap.put(endTargetName, stage);
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Target.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds;
+
+/**
+ * Helper class for the target in diamonds config.
+ * 
+ */
+public class Target {
+    private String targetName;
+    private String source;
+    private boolean reqAntProperties;
+    private boolean defer;
+    private String templatefile;
+
+    /**
+     * Constructor
+     * 
+     * @param target
+     *            - name of the target
+     * @param src
+     *            - input source location.
+     */
+    public Target(String target, String src) {
+        this(target, null, src, "false", "false");
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param target
+     *            - name of the target
+     * @param src
+     *            - input source location.
+     * @param antProps
+     *            - boolean to pass ant properties while conversion.
+     */
+    public Target(String target, String tplfile, String src, String antProps,
+            String deferSend) {
+        String emptyString = "";
+        if (!target.equals(emptyString)) {
+            targetName = target;
+        }
+        if (!src.equals(emptyString)) {
+            source = src;
+        }
+        if (!tplfile.equals(emptyString)) {
+            templatefile = tplfile;
+        }
+        if (antProps != null && antProps.equals("true")) {
+            reqAntProperties = true;
+        }
+        if (deferSend != null && deferSend.equals("true")) {
+            defer = true;
+        }
+    }
+
+    /**
+     * Get the target name of the target to send data
+     * 
+     * @return - target name of the target to send data
+     */
+    public String getTargetName() {
+        return targetName;
+    }
+
+    /**
+     * Get the input source used for template conversion.
+     * 
+     * @return - location of the input source.
+     */
+    public String getSource() {
+        return source;
+    }
+
+    public boolean isDefer() {
+        return defer;
+    }
+
+    public String getTemplateFile() {
+        return templatefile;
+    }
+
+    /**
+     * returns true if ant properties required for conversion, obtained from
+     * configuration.
+     * 
+     * @return - name of the stage
+     */
+    public boolean isAntPropertiesRequired() {
+        return reqAntProperties;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,199 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.helium.diamonds;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Project;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Hashtable;
+import java.util.Map;
+import java.io.File;
+import org.apache.log4j.Logger;
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateInputSource;
+import com.nokia.helium.core.XMLTemplateSource;
+
+/**
+ * Listener sending data based on target configuration to diamonds.
+ */
+public class TargetDiamondsListener extends DiamondsListenerImpl {
+
+    private Project project;
+    
+    private Logger log = Logger.getLogger(TargetDiamondsListener.class);
+
+    private Map<String, com.nokia.helium.diamonds.Target> targetsMap;
+
+    private String currentTarget;
+
+    /**
+     * Default constructor
+     */
+    public TargetDiamondsListener() {
+        targetsMap = DiamondsConfig.getTargets();
+    }
+
+    private boolean isTargetsToExecute(BuildEvent buildEvent) {
+        project = buildEvent.getProject();
+        Target target = buildEvent.getTarget();
+        boolean retValue = false;
+        com.nokia.helium.diamonds.Target currentTarget = targetsMap
+                .get(target.getName());
+        String currentTargetName = null;
+        if (currentTarget != null) {
+            currentTargetName = currentTarget.getTargetName();
+        }
+        if (currentTargetName != null) {
+            String ifCondition = target.getIf();
+            String unlessCondition = target.getUnless();
+            if (ifCondition == null && unlessCondition == null) {
+                retValue = true;
+            } else {
+                String ifProperty = project.getProperty(ifCondition);
+                String unlessProperty = project.getProperty(unlessCondition);
+                if (ifProperty != null || unlessProperty == null) {
+                    retValue = true;
+                }
+            }
+        }
+        return retValue;
+    }
+
+    /**
+     * Function to process logging info during beginning of target execution.
+     * This checks that the current target execution is in config and requires
+     * some data to be send it to diamonds.
+     * 
+     * @param event
+     *            of target execution.
+     */
+    public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
+        String targetName = buildEvent.getTarget().getName();
+        if (isTargetsToExecute(buildEvent)) {
+            currentTarget = targetName;
+            com.nokia.helium.diamonds.Target target = targetsMap
+                    .get(currentTarget);
+            if (!target.isDefer()) {
+                initDiamondsClient();
+            }
+        }
+    }
+
+    /**
+     * Function to process logging info during end of build. If the target in
+     * config, sends the data to diamonds (uses the template conversion if
+     * needed).
+     * 
+     * @param event
+     *            of target execution.
+     */
+    public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
+        String targetName = buildEvent.getTarget().getName();
+        if (currentTarget != null && currentTarget.equals(targetName)) {           
+            if (getIsInitialized()) {
+                log
+                .debug("diamonds:TargetDiamondsListener:finished recording, sending data to diamonds for target: "
+                        + buildEvent.getTarget().getName());
+                sendTargetData(buildEvent, buildEvent.getTarget().getProject());
+            }
+            currentTarget = null;
+        }
+    }
+
+    /**
+     * Sends the data to diamonds. First it looks if the template with target
+     * name exists, then it looks for input source file from config, if ant
+     * properties required from config, it uses it for template conversion. If
+     * no template file exists, sends the data directly.
+     * 
+     * @param event
+     *            of target execution.
+     */
+    @SuppressWarnings("unchecked")
+    private void sendTargetData(BuildEvent buildEvent, Project project)
+            throws DiamondsException {
+        com.nokia.helium.diamonds.Target target = targetsMap
+                .get(currentTarget);
+        String sourceFile = target.getSource();
+        if (sourceFile == null) {
+            sourceFile = getSourceFile(target.getTargetName());
+        }
+        Hashtable<String, String> antProperties = null;
+        String targetTemplateFile = target.getTemplateFile();
+        if (targetTemplateFile == null) {
+            targetTemplateFile = target.getTargetName() + ".xml.ftl";
+        }
+        String output = DiamondsConfig.getOutputDir() + File.separator
+                + target.getTargetName() + ".xml";
+        File templateFile = new File(DiamondsConfig.getTemplateDir(),
+                targetTemplateFile);
+        List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+        if (sourceFile == null) {
+            log
+                    .debug("diamonds:TargetDiamondsListener:sourceFile not defined.");
+        } else {
+            sourceList.add(new XMLTemplateSource("doc", new File(sourceFile)));
+        }
+        // Ant?
+        if (target.isAntPropertiesRequired()) {
+            sourceList
+                    .add(new PropertiesSource("ant", project.getProperties()));
+        }
+        try {
+            if (templateFile.exists()) {
+                if (!(antProperties == null && sourceFile == null)) {
+                    getTemplateProcessor().convertTemplate(DiamondsConfig
+                            .getTemplateDir(), targetTemplateFile, output,
+                            sourceList);
+                }
+            } else {
+                log
+                        .debug("diamonds:TargetDiamondsListener:sendTargetData: exists("
+                                + templateFile.getAbsolutePath() + ") => false");
+
+            }
+        } catch (com.nokia.helium.core.TemplateProcessorException e1) {
+            log.debug(
+                    "diamonds:TargetDiamondsListener:sendTargetData:exception",
+                    e1);
+            throw new DiamondsException(
+                    "template conversion error while sending data for target:"
+                            + target + ":" + e1.getMessage());
+        }
+        File outputFile = new File(output);
+        if (outputFile.exists()) {
+            mergeToFullResults(outputFile);
+            if (!target.isDefer()) {
+                getDiamondsClient().sendData(outputFile.getAbsolutePath(),
+                        DiamondsConfig.getDiamondsProperties()
+                                .getDiamondsBuildID());
+            } else {
+                log.debug("diamonds:TargetDiamondsListener:defer logging for: "
+                        + outputFile);
+                getDeferLogList().add(output);
+            }
+        } else {
+            log.debug("diamonds:TargetDiamondsListener:outputfile "
+                    + outputFile + " does not exist");
+        }
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+
+/**
+ * This class implements an XML file merger. All node from an external XML with
+ * same format (same root node name) will get added to the source root element.
+ */
+public class XMLMerger {
+    private Logger log = Logger.getLogger(getClass());
+    private File merge;
+    private Document doc;
+    private Element root;
+
+    /**
+     * Create an XMLMerger, the merge file will be used as input and output.
+     * 
+     * @param merge
+     * @throws XMLMergerException
+     */
+    public XMLMerger(File merge) throws XMLMergerException {
+        log.debug("Merging into: " + merge.getAbsolutePath());
+        try {
+            this.merge = merge;
+            SAXReader reader = new SAXReader();
+            doc = reader.read(merge);
+            root = doc.getRootElement();
+        } catch (DocumentException e) {
+            throw new XMLMergerException(e.getMessage());
+        }        
+    }
+    
+    /**
+     * Add all sub element of data file into the merged file. If the root
+     * element name is different for the merged file an XMLMergerException is
+     * thrown.
+     * 
+     * @param data
+     *            the input file.
+     * @throws XMLMergerException
+     */
+    public void merge(File data) throws XMLMergerException {
+        log.debug("Merging " + data.getAbsolutePath());
+        try {
+            SAXReader reader = new SAXReader();
+            Document dataDoc = reader.read(data);
+            Element dataRoot = dataDoc.getRootElement();
+            if (!root.getName().equals(dataRoot.getName())) {
+                throw new XMLMergerException(
+                        "Trying to merge incompatible xml format ('"
+                                + root.getName() + "'!='" + dataRoot.getName()
+                                + "')");
+            }
+            mergeNode(root, dataRoot);
+            write();
+        } catch (DocumentException e) {
+            log.debug("Error merging: " + e);
+            throw new XMLMergerException(e.getMessage());
+        }
+    }
+
+    /**
+     * Merging two XML elements. It only keeps difference.
+     * 
+     * @param dest
+     * @param src
+     */
+    @SuppressWarnings("unchecked")
+    protected void mergeNode(Element dest, Element src) {
+        for (Iterator<Element> node = src.elements().iterator(); node.hasNext();) {
+            Element e = node.next();
+            
+            List<Element> ses = dest.elements(e.getName());
+            boolean add = true;
+            for (Element se : ses) {
+                if (areSame(se, e)) {
+                    log.debug("Element " + e.getName() + " already found in dest.");
+                    add = false;
+                }
+            }
+            if (add) {
+                log.debug("Adding node " + e.getName() + " to " + dest.getName());
+                dest.add(e.detach());
+            } else if (ses.size() > 0) {
+                log.debug("Merging " + ses.get(0).getName() + " to " + e.getName());
+                mergeNode(ses.get(0), e);
+            }
+        }
+    }
+
+    /**
+     * Compare two elements name and attributes. Returns true if name and all
+     * attributes are matching, false otherwise.
+     * 
+     * @param a
+     * @param b
+     * @return boolean
+     */
+    @SuppressWarnings("unchecked")
+    protected boolean areSame(Element a, Element b) {
+        log.debug("areSame:" + a + " <=> " + b);
+        if (!a.getName().equals(b.getName()))
+            return false;
+        log.debug("same attribute list size?");
+        if (a.attributes().size() != b.attributes().size())
+            return false;
+        log.debug("same attribute list?");
+        for (Iterator<Attribute> at = a.attributes().iterator(); at.hasNext();) {
+            Attribute attra = at.next();
+            Attribute attrb = b.attribute(attra.getName());
+            if (attrb == null || !attra.getValue().equals(attrb.getValue()))
+                return false;
+        }
+        if (!a.getTextTrim().equals(b.getTextTrim()))
+            return false;
+        return true;
+    }
+
+    /**
+     * Write the XML content back the file.
+     * @throws XMLMergerException
+     */
+    protected void write() throws XMLMergerException {
+        log.debug("Writing " + merge.getAbsolutePath());
+        try {
+            FileOutputStream fos = new FileOutputStream(merge);
+            OutputFormat format = OutputFormat.createPrettyPrint();
+            XMLWriter writer = new XMLWriter(fos, format);
+            writer.write(doc);
+            writer.flush();
+        } catch (Exception e) {
+            throw new XMLMergerException(e.getMessage());
+        }
+    }
+
+    /**
+     * Exception class related to the XMLMerger. 
+     */
+    public class XMLMergerException extends Exception {
+
+        private static final long serialVersionUID = 7624650310086957316L;
+
+        /**
+         * Default constructor.
+         * @param msg error message
+         */
+        public XMLMergerException(String msg) {
+            super(msg);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,259 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.diamonds.ant;
+
+import java.io.File;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.ArrayList;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.BuildException;
+import com.nokia.helium.diamonds.*;
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateProcessor;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.log4j.Logger;
+
+/**
+ * Listener class that can connect to Ant and log information regarding to build
+ * times, number of errors and such. Data is sent to Diamonds server, where it
+ * is processed further.
+ * 
+ * This class is listening all build related events. It catches the build
+ * start-finish, target start-finish events of Ant and gather build start-end
+ * time, errors/warnings and store in BuildData class. Stored data will be
+ * exported to XML and uploaded to Diamonds server after each specific target.
+ * For example after target "create-bom" this class will upload all BOM data to
+ * Diamonds.
+ * 
+ * 
+ */
+public class HeliumListener implements BuildListener {
+
+    private Logger log = Logger.getLogger(HeliumListener.class);
+
+    private List<DiamondsListener> diamondsListeners;
+
+    private Project project;
+
+    private boolean isInitialized;
+
+    private boolean skipDiamonds;
+    private boolean skipDiamondsSet;
+
+    /**
+     * Default constructor.
+     */
+    public HeliumListener() {
+        diamondsListeners = new ArrayList<DiamondsListener>();
+    }
+
+    /**
+     * Ant call this function when build start.
+     */
+    public void buildStarted(BuildEvent event) {
+        project = event.getProject();
+    }
+
+    /**
+     * Triggered when a target starts.
+     */
+    @SuppressWarnings("unchecked") 
+    public void targetStarted(BuildEvent event) {
+        String targetName = event.getTarget().getName();
+        project = event.getProject();
+
+        String skip = project.getProperty("skip.diamonds");
+        if (skip != null && skip.equals("true")) {
+            skipDiamonds = true;
+        }
+        try {
+            if (!skipDiamonds) {
+                if (!isInitialized) {
+                    String configFile = project
+                            .getProperty("diamonds.listener.configuration.file");
+                    parseConfig(configFile, project.getProperties());
+                    isInitialized = true;
+                }
+                DiamondsProperties diamondProperties = DiamondsConfig
+                        .getDiamondsProperties();
+
+                /**
+                 * Initialize Diamonds if and only if initializer-target-name has been called
+                 */
+                if (targetName.equals(DiamondsConfig.getInitialiserTargetName())) {                                        
+                    String categoryName = diamondProperties.getProperty("category-property");
+                    String category = project.getProperty(categoryName);
+                    log.debug("category:" + category);
+                    if (category != null && diamondsListeners.isEmpty()) {
+                        addListeners(event);
+                        log.info("Diamonds enabled");
+                    }
+                }
+            } else {
+                if (!skipDiamondsSet && skipDiamonds)
+                {
+                    log.info("skip.diamonds set, to use diamonds don't set skip.diamonds.");
+                    skipDiamondsSet = true;
+                }
+            }
+        } catch (Exception ex) {
+            log.debug("Diamonds error: ", ex);
+            String errorMessage = ex.getMessage();
+            if (errorMessage == null) {
+                errorMessage = "";
+            }
+            log
+                    .info("Diamonds Error, might not be logged properly, see debug log. "
+                            + errorMessage);
+        }
+        if (diamondsListeners != null) {
+            for (DiamondsListener diamondsListener : diamondsListeners) {
+                try {
+                    diamondsListener.targetBegin(event);
+                } catch (Exception e) {
+                    log.debug("Error:", e);
+                    String errorMessage = e.getMessage();
+                    if (errorMessage == null) {
+                        errorMessage = "";
+                    }
+                    log
+                            .info("Diamonds Error, might not be logged properly, see debug log. "
+                                    + errorMessage);
+                }
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked") 
+    private void parseConfig(String configFile, Hashtable<String, String> antProperties) {
+        TemplateProcessor templateProcessor = new TemplateProcessor();
+        File outputFile = null;
+        try {
+            outputFile = File.createTempFile("diamonds", "-config.xml");
+            outputFile.deleteOnExit();
+            log
+                    .debug("Preprocessing the diamonds configuration: "
+                            + configFile);
+            List sourceList = new ArrayList();
+            sourceList.add(new PropertiesSource("ant", antProperties));
+            templateProcessor.convertTemplate(configFile,
+                    outputFile.toString(), sourceList);
+        } catch (Exception e) {
+            log.debug("Error: ", e);
+            throw new BuildException(
+                    "Diamonds configuration pre-parsing error: "
+                            + e.getMessage());
+        }
+        try {
+            DiamondsConfig.parseConfiguration(outputFile.toString());
+        } catch (Exception e) {
+            log.debug("Error: ", e);
+            throw new BuildException("Diamonds configuration parsing error: "
+                    + e.getMessage());
+        }
+    }
+
+    private void addListeners(BuildEvent event) throws DiamondsException {
+        if (DiamondsConfig.isStagesInConfig()) {
+            StageDiamondsListener stageListener = new StageDiamondsListener();
+            diamondsListeners.add(stageListener);
+            stageListener.buildBegin(event);
+        }
+        if (DiamondsConfig.isTargetsInConfig()) {
+            TargetDiamondsListener targetListener = new TargetDiamondsListener();
+            diamondsListeners.add(targetListener);
+            targetListener.buildBegin(event);
+        }
+    }
+
+    /**
+     * Triggered when a target finishes.
+     */
+    public void targetFinished(BuildEvent event) {
+        if (diamondsListeners != null) {
+            for (DiamondsListener diamondsListener : diamondsListeners) {
+                try {
+                    diamondsListener.targetEnd(event);
+                } catch (Exception e) {
+                    log.debug("Error:", e);
+                    String errorMessage = e.getMessage();
+                    if (errorMessage == null) {
+                        errorMessage = "";
+                    }
+                    log
+                            .info("Diamonds Error, might not be logged properly, see debug log. "
+                                    + errorMessage);
+                }
+
+            }
+        }
+    }
+
+    /**
+     * Triggered when the build finishes.
+     */
+    public void buildFinished(BuildEvent event) {
+        if (diamondsListeners != null) {
+            for (DiamondsListener diamondsListener : diamondsListeners) {
+                try {
+                    diamondsListener.buildEnd(event);
+                } catch (Exception e) {
+                    log.debug("Error: ", e);
+                    log.info("Failed to log in diamonds: " + e);
+                }
+
+            }
+        }
+        project = event.getProject();
+        cleanup();
+    }
+
+    /**
+     * See if build needs a final cleanup target to be called.
+     */
+    private void cleanup() {
+        String loggingoutputfile = project.getProperty("logging.output.file");
+        if (loggingoutputfile != null) {
+            File f = new File(loggingoutputfile);
+            if (f.exists())
+                f.delete();
+        }
+    }
+
+    /**
+     * Triggered when a task starts.
+     */
+    public void taskStarted(BuildEvent event) {
+    }
+
+    /**
+     * Triggered when a task finishes.
+     */
+    public void taskFinished(BuildEvent event) {
+    }
+
+    /**
+     * Triggered when a build message is logged.
+     */
+    public void messageLogged(BuildEvent event) {
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/helium.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <typedef name="diamondsExceptionStatusUpdate" classname="com.nokia.helium.diamonds.DiamondsExceptionStatusUpdate" uri="http://www.nokia.com/helium"/>    
+    <typedef name="diamondsPostBuildStatusUpdate" classname="com.nokia.helium.diamonds.DiamondsPostBuildStatusUpdate" uri="http://www.nokia.com/helium"/>
+    <hlm:deflist id="helium-diamonds.list">
+        <hlm:listenerdef classname="com.nokia.helium.diamonds.ant.HeliumListener"/>
+        <hlm:diamondsExceptionStatusUpdate/>
+        <hlm:diamondsPostBuildStatusUpdate/>
+    </hlm:deflist>    
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+setenv COMPUTERNAME fasbs01
+module load java/1.6.0
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../core/lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-diamonds.jar -lib ../../antlibs"
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib ..\lib -lib ..\..\lib -lib ..\..\core\lib -lib ..\..\bin\helium-core.jar -lib ..\..\bin\helium-diamonds.jar -lib ..\..\antlibs -lib ..\..\bin\helium-signaling.jar
+ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-diamonds-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib diamonds tests.</description>
+    
+    <dirname property="diamonds.unitest.dir" file="${ant.file.helium-antlib-diamonds-unittest}" />
+    <property environment="env" />
+    <import file="../../../nokia/companyproperties.ant.xml" optional="true"/>
+    <import file="../../../../extensions/nokia/external/helium-nokia-antlib/companyproperties.ant.xml" optional="true"/>
+    <property name="diamonds.output.dir" location="${diamonds.unitest.dir}/output" />
+    <property name="diamonds.template.dir" location="${diamonds.unitest.dir}/templates" />
+    <property name="build.family" value="test_new_hlm"/>
+    <property name="id" value="123"/>
+    <property name="name" value="${build.family}_${id}"/>
+    <property name="build.system" value="ec-helium"/>
+    <property name="diamonds.listener.configuration.file" location="${diamonds.unitest.dir}/config/diamonds_config.xml.ftl" />
+    <property name="compile.log.input" location="${diamonds.unitest.dir}/data/compile.log.xml" />
+    <property name="codescanner.log.input" location="${diamonds.unitest.dir}/data/problemIndex.xml" />
+    <property name="policy.log.input" location="${diamonds.unitest.dir}/data/policy.log.xml" />
+    <property name="invalid.target.input.file" location="${diamonds.unitest.dir}/data/invalid.target.input.log.xml" />
+    <property name="symsee.version" value="9.1.0" />
+
+    <import file="./test_diamonds.ant.xml" />
+
+    <target name="unittest" depends="unittest-diamonds" />
+    
+    <target name="unittest-diamonds" >
+        <delete dir="${diamonds.unitest.dir}/output" failonerror="false"/>
+        <mkdir dir="${diamonds.unitest.dir}/output"/>
+        <antcall target="test-all" />
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/config/diamonds_config.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : diamonds_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<configuration>
+<config>
+    <output-dir path="${ant['diamonds.output.dir']}"/>
+    <template-dir path="${ant['diamonds.template.dir']}"/>
+    
+    <property name="smtpserver" value="email.smtp.server" />
+    <property name="ldapserver" value="email.ldap.server" />
+    <property name="initialiser-target-name" value="diamonds" />
+    
+    <server>
+        <property name="host" value="diamonds.host" />
+        <property name="port" value="diamonds.port" />
+        <property name="path" value="diamonds.path" />
+        <property name="tstampformat" value="yyyy-MM-dd'T'HH:mm:ss" />
+        <property name="mail" value="diamonds.mail" />
+        <property name="category-property" value="build.family" />
+        <property name="buildid-property" value="diamonds.build.id" />
+    </server>
+</config>
+<logger>
+    <stages>
+            <!-- verifying basic stage input -->
+            <stage name="pre-build" start="version" end="version" />
+            
+            <!-- verifying basic stage input with input xml file-->
+            <stage name="build" start="compile-target" end="compile-target"
+                logfile="${ant['compile.log.input']}"/>
+    </stages>
+    <targets>
+        <target name="codescanner" template-file="codescanner.xml.ftl"
+            logfile="${ant['codescanner.log.input']}" />
+
+        <!-- if no logfile provided, looks for xml file to send 
+            using <build.id_target_name.xml> file or<target_name.xml> file, 
+            if both doesn't exists does nothing. tries to pass ant properties
+            and sends it.-->
+            
+        <target name="create-bom-log" />
+        
+    <!-- Test the defer case -->
+        <target name="defer-type" template-file="tool.xml.ftl" 
+            ant-properties="true" defer="true"/>
+    </targets>
+</logger>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/data/compile.log.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2301 @@
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="m:\output\logs\ido_tedo_mcl_devlon52_ec_MCL.52.105.s60_build_compile.log">
+    <build>
+        <task name="s60_build">
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+                <message priority="warning"><![CDATA[..\satuisrc\csatuiviewappui.cpp:2558: warning: variable / argument 'aError' is not used in function]]></message>
+                <message priority="remark"><![CDATA[M:\epoc32\include\domain\applications\BrowserUiInternalCRKeys.h:6: note: Please include BrowserUiSDKCRKeys.h in place of BrowserUiInternalCRKeys.h]]></message>
+                <message priority="warning"><![CDATA[..\satuisrc\csatuiviewappui.cpp:2558: warning: variable / argument 'aError' is not used in function]]></message>
+                <message priority="remark"><![CDATA[M:\epoc32\include\domain\applications\BrowserUiInternalCRKeys.h:6: note: Please include BrowserUiSDKCRKeys.h in place of BrowserUiInternalCRKeys.h]]></message>
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+                <message priority="warning"><![CDATA[..\src\cpesinglecallobserver.cpp:328: warning: variable / argument 'aAttended' is not used in function]]></message>
+                <message priority="warning"><![CDATA[..\src\cpesinglecallobserver.cpp:328: warning: variable / argument 'aDestination' is not used in function]]></message>
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+                <message priority="warning"><![CDATA[..\src\cpemessagehandler.cpp:310: warning: variable / argument 'aCallId' is not used in function]]></message>
+                <message priority="warning"><![CDATA[..\src\cpemessagehandler.cpp:310: warning: variable / argument 'aCallId' is not used in function]]></message>
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+                <message priority="warning"><![CDATA[..\src\cdialervideocontainer.cpp:164: warning: variable / argument 'aIndex' is not used in function]]></message>
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+                <message priority="warning"><![CDATA[..\LOGGER\src\CVtLogger.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\LOGGER\src\CVtLogger.cpp:371: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlFactory.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlFactory.cpp:69: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallControl.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallControl.cpp:251: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlSessionContainer.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlSessionContainer.cpp:456: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallStatusMonitor.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallStatusMonitor.cpp:226: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlLineMonitor.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlLineMonitor.cpp:130: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlVideoCall.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlVideoCall.cpp:241: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\VtCtlPanic.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\VtCtlPanic.cpp:35: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\LOGGER\src\CVtLogger.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\LOGGER\src\CVtLogger.cpp:371: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlFactory.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlFactory.cpp:69: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallControl.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallControl.cpp:251: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlSessionContainer.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlSessionContainer.cpp:456: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallStatusMonitor.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlCallStatusMonitor.cpp:226: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlLineMonitor.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlLineMonitor.cpp:130: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlVideoCall.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\CVtCtlVideoCall.cpp:241: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\VtCtlPanic.cpp:20: warning: illegal #pragma]]></message>
+                <message priority="warning"><![CDATA[..\CALLCTRL\src\VtCtlPanic.cpp:35: warning: illegal #pragma]]></message>
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satengine\SatServer\SystemState\src\csatsystemstate.cpp", line 66: Warning:  #550-D: variable "err" was set but never used]]></message>
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satengine\SatServer\Engine\src\csatapnhandler.cpp", line 34: Warning:  #177-D: variable "KMaxAccessPointName" was declared but never referenced]]></message>
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satengine\SatServer\Engine\src\csatapnhandler.cpp", line 38: Warning:  #177-D: variable "KSatMaxApnName" was declared but never referenced]]></message>
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satengine\SatServer\SystemState\src\csatsystemstate.cpp", line 66: Warning:  #550-D: variable "err" was set but never used]]></message>
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satengine\SatServer\Engine\src\csatapnhandler.cpp", line 34: Warning:  #177-D: variable "KMaxAccessPointName" was declared but never referenced]]></message>
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satengine\SatServer\Engine\src\csatapnhandler.cpp", line 38: Warning:  #177-D: variable "KSatMaxApnName" was declared but never referenced]]></message>
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satui\satplugin\aisatpluginsrc\caisatplugin.cpp", line 188: Warning:  #550-D: variable "error" was set but never used]]></message>
+                <message priority="warning"><![CDATA["\s60\mw\telephonyservices\satui\satplugin\aisatpluginsrc\caisatplugin.cpp", line 188: Warning:  #550-D: variable "error" was set but never used]]></message>
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+                <message priority="critical"><![CDATA["\s60\mw\telephonyservices\utils\phoneparser\src\cphoneparserfeatures.cpp", line 81: Warning: C2874W: self may be used before being set]]></message>
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_dom\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\telsrv_sdk\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\CbsServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\cbs\cbsui\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\convergedcallengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\networkhandling\networkhandlingengine\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\aiwdialdata\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\CallUI\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\dialutils\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\EnPolicy\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneclient\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\phoneclientserver\phoneserver\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satengine\SatServer\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satapp\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\satui\satplugin\group">
+            </task>
+            <task name="\s60\mw\telephonyservices\utils\phoneparser\group">
+            </task>
+            <task name="\s60\app\telephony\tel_dom\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\Blacklist\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneui\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuicontrol\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuistates\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiutils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuiview\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\phoneuivoipextension\group">
+            </task>
+            <task name="\s60\app\telephony\phoneapp\silenceactionplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\PhoneCntFinder\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\audiohandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\callhandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\contacthandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\loghandling\group">
+            </task>
+            <task name="\s60\app\telephony\phoneengine\phonemodel\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\aiwcallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\PsetNotesUi\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\pslncallimageplugin\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\telephonysettings\group">
+            </task>
+            <task name="\s60\app\telephony\phonesettings\SSSettings\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\dialer\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\BubbleManager\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ConnectUtil\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\ServiceRequest\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\SFIUtils\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\Ussd\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\vmbx\group">
+            </task>
+            <task name="\s60\app\telephony\phoneuis\TelephonyDeviceMode\group">
+            </task>
+            <task name="\s60\app\videotelephony\videotel_dom\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoengine\PacketVideoEngineBinaries\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\DisplaySink\group">
+            </task>
+            <task name="\s60\app\videotelephony\packetvideoplugins\VideoSource\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videoteleng\Group">
+            </task>
+            <task name="\s60\app\videotelephony\vtengines\videotelcomms\group">
+            </task>
+            <task name="\s60\app\videotelephony\vtuis\videotelui\group">
+            </task>
+        </task>
+    </build>
+</log>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/data/create-bom-log.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<diamonds-build>
+    <schema>10</schema>    
+    <stages>
+      <stage>    
+            <name>build</name>
+            <started>2009-02-03T01:17:52</started>
+            <finished>2009-02-03T01:17:52</finished>
+     </stage>
+    </stages>
+</diamonds-build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/data/problemIndex.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14859 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<problemIndex>
+   <category name="functionality">
+      <problem name="LeaveNoError" severity="medium">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRSSProvider.cpp">
+            118
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmui.cpp">
+            244
+         </file>
+      </problem>
+   </category>
+   <category name="performance">
+      <problem name="arraypassing" severity="medium">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceClient.cpp">
+            61
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSController.cpp">
+            69
+         </file>
+      </problem>
+      <problem name="eikonenvstatic" severity="medium">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\src\lcstylustap.cpp">
+            127
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            291
+            388
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\src\caiwimageprintIf.cpp">
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBNotifier.cpp">
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNObexPinNotifier.cpp">
+            134
+            168
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPBAPPinNotifier.cpp">
+            135
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingview.cpp">
+            93
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            106
+            109
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            82
+            507
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginView.cpp">
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            121
+         </file>
+      </problem>
+      <problem name="trapeleave" severity="medium">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIPairedDevicesView.cpp">
+            916
+            1282
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINMain.cpp">
+            75
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNMain.cpp">
+            129
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btpairedmodel.cpp">
+            138
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            841
+         </file>
+      </problem>
+      <problem name="userafter" severity="medium">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIPairedDevicesView.cpp">
+            1607
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketinitiator.cpp">
+            115
+            235
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            210
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            253
+         </file>
+      </problem>
+   </category>
+   <category name="codingstandards">
+      <problem name="baddefines" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\btrccPluginImplUid.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\BTAccPluginUid.h">
+            32
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacpluginuid.h">
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamerdebug.h">
+            114
+            143
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\inc\btdevmodel.h">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_watcher_api\inc\usbpersonalityids.h">
+            23
+            24
+            25
+            26
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\inc\aiwprintingprovideruid.h">
+            24
+            25
+         </file>
+      </problem>
+      <problem name="cleanup" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketHandler.cpp">
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsServiceManager.cpp">
+            86
+            257
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceStarter.cpp">
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpstransaction.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectRequest.cpp">
+            107
+            452
+            481
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceClient.cpp">
+            118
+            332
+            334
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\decode.cpp">
+            47
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\cusbglobalsystemstateobserver.cpp">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSOPPController.cpp">
+            52
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapPlugin.cpp">
+            53
+            198
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobaldialog.cpp">
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsSession.cpp">
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsm.cpp">
+            69
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectServer.cpp">
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericInfoNotifier.cpp">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosListener.cpp">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapRequestHandler.cpp">
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            184
+            209
+            336
+            524
+            553
+            639
+            644
+            650
+            654
+            853
+            922
+            928
+            934
+            940
+            1005
+            1076
+            1246
+            1266
+            1340
+            1376
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvacc.cpp">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\shutdown.cpp">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBIPController.cpp">
+            93
+            302
+            340
+            404
+            434
+            467
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnpaireddevsettnotifier.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\BTSSProvider.cpp">
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettings.cpp">
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccFwConnection_dos.cpp">
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\pictbridge.cpp">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            320
+            322
+            586
+            673
+            757
+            859
+            931
+            1144
+            1202
+            1224
+            1226
+            1241
+            1244
+            1288
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpdatahandler.cpp">
+            672
+            725
+            1262
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            411
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNObexPinNotifier.cpp">
+            47
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPBAPPinNotifier.cpp">
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPwrNotifier.cpp">
+            45
+            143
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\usb\obexsmusbconnection.cpp">
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            269
+            295
+            358
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSimCardStatusNotifier.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidcenrepwatcher.cpp">
+            42
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosSender.cpp">
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstatemachine.cpp">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\ObexSMPlugin.cpp">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlstring.cpp">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\main.cpp">
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\ecom\BtnotifWrapper.cpp">
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapServerState.cpp">
+            57
+            195
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\src\caiwprintingprovider.cpp">
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irtimer.cpp">
+            54
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapHciExtensionMan.cpp">
+            74
+            249
+            362
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptptimer.cpp">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvsdpquery.cpp">
+            41
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericQueryNotifier.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\ir\obexsmirdaconnection.cpp">
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            76
+            169
+            244
+            307
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccfwconn.cpp">
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmpasskey.cpp">
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingview.cpp">
+            58
+            216
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\src\lcstylustap.cpp">
+            71
+            87
+            102
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsuilayer.cpp">
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            101
+            255
+            407
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcherSession.cpp">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobalprogressdialog.cpp">
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUImageConverter.cpp">
+            73
+            162
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActivePersonalityHandler.cpp">
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsmmain.cpp">
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsstatemachine.cpp">
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidcollection.cpp">
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbDeviceLock.cpp">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\iractivatewatcher.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIDeviceContainer.cpp">
+            608
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUXmlParser.cpp">
+            66
+            130
+            171
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            392
+            396
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irremotelockwatcher.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btbearer\src\btpluginprovider.cpp">
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            147
+            176
+            386
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btrfsplugin\src\btrfsplugin.cpp">
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidgeneric.cpp">
+            51
+            370
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmbtconnection.cpp">
+            105
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsfile.cpp">
+            41
+            113
+            128
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            90
+            1306
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidparser.cpp">
+            138
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActiveState.cpp">
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstatuswatcher.cpp">
+            53
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidfield.cpp">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPController.cpp">
+            76
+            377
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINCableConnectedNotifier.cpp">
+            240
+            513
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRClient.cpp">
+            108
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityNotifier.cpp">
+            54
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\usbobex.cpp">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSniffHandler.cpp">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\ptptransport.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irbearer.cpp">
+            51
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSecurityHandler.cpp">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRSSProvider.cpp">
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsusbnotifier.cpp">
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccplayerstarter.cpp">
+            283
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPServerWait.cpp">
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqNotifier.cpp">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcher.cpp">
+            115
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInquiryAO.cpp">
+            69
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            661
+            1358
+            1395
+            1486
+            1491
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hiddescriptorlist.cpp">
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbbasicpersonality\src\CUsbActiveBasicHandler.cpp">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceAPI.cpp">
+            61
+         </file>
+      </problem>
+      <problem name="driveletters" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\data\BthidResource.rss">
+            1331
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btNotifDebug.h">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\inc\imageprintuidebug.h">
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\inc\RUsbWatcher.h">
+            28
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\ptpdef.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamerdebug.h">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\cusbdevconstarter.cpp">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\inc\BTSendingServiceDebug.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\SrcsClSv.h">
+            52
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\inc\obexutilsdebug.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\inc\IrSendingServiceDebug.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\inc\debug.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunDebug.h">
+            39
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUDebug.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btrfsplugin\src\btrfsplugin.cpp">
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\imageprintuidebug.h">
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\obexsmclient.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\inc\btmtmuidebug.h">
+            33
+         </file>
+      </problem>
+      <problem name="enummembers" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectRequest.cpp">
+            51
+         </file>
+      </problem>
+      <problem name="enumnames" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectRequest.cpp">
+            51
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsopenaudio.h">
+            28
+         </file>
+      </problem>
+      <problem name="forbiddenwords" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_sdk\bluetooth_power_state_api\inc\btserversdkcrkeys.h">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\inc\cremotepersonalityhandler.h">
+            43
+            52
+            70
+            114
+            122
+            129
+            138
+            148
+            160
+            167
+            174
+            183
+            191
+            198
+            205
+            212
+            219
+            226
+            233
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\ptpmsghandler.h">
+            35
+            55
+            63
+            70
+            77
+            84
+            94
+            101
+            108
+            116
+            124
+            132
+            139
+            146
+            153
+            160
+            167
+            179
+            188
+            196
+            205
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\locodserviceman.h">
+            38
+            51
+            76
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacState.h">
+            45
+            56
+            63
+            71
+            80
+            87
+            95
+            104
+            111
+            120
+            186
+            194
+            206
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\btaudiomanplugin.h">
+            35
+            45
+            62
+            72
+            83
+            98
+            111
+            125
+            139
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\inc\bt\DunBtPlugin.h">
+            34
+            60
+            85
+            93
+            102
+            112
+            121
+            130
+            138
+            146
+            156
+            165
+            178
+            189
+            201
+            211
+            223
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\inc\btmtmui.h">
+            310
+            330
+            355
+            376
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunDataWaiter.h">
+            32
+            55
+            65
+            74
+            83
+            91
+            105
+            116
+            125
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\inc\usb\DunUsbListen.h">
+            42
+            68
+            84
+            100
+            108
+            119
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\inc\btregistryobserver.h">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_local_variation_api\inc\btengdomaincrkeys.h">
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpstack.h">
+            42
+            49
+            65
+            85
+            95
+            103
+            112
+            121
+            129
+            141
+            149
+            157
+            165
+            173
+            181
+            189
+            197
+            207
+            216
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\inc\obexutilsentryhandler.h">
+            31
+            50
+            60
+            77
+            85
+            104
+            112
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmman.h">
+            46
+            60
+            70
+            78
+            86
+            95
+            104
+            113
+            122
+            131
+            139
+            160
+            169
+            177
+            186
+            195
+            203
+            212
+            221
+            230
+            246
+            254
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIListedDevicesView.h">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_device_management_api\inc\btengdevman.h">
+            33
+            46
+            56
+            74
+            105
+            117
+            134
+            148
+            167
+            178
+            191
+            200
+            210
+            217
+            224
+            231
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\cusbdevcon.h">
+            44
+            55
+            63
+            71
+            78
+            88
+            95
+            102
+            109
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceStarter.h">
+            189
+            209
+            234
+            255
+            272
+            283
+            293
+            301
+            309
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunSignalNotify.h">
+            30
+            52
+            62
+            72
+            81
+            90
+            98
+            112
+            120
+            128
+            138
+            150
+            159
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSController.h">
+            38
+            54
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdinterruptobserver.h">
+            28
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\inc\lcstylustap.h">
+            30
+            40
+            47
+            54
+            68
+            74
+            84
+            91
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunUpstream.h">
+            34
+            66
+            95
+            106
+            115
+            126
+            150
+            158
+            167
+            176
+            184
+            192
+            206
+            214
+            222
+            230
+            241
+            250
+            261
+            270
+            280
+            288
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacActivePacketDropIoctl.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btbearer\inc\btpluginprovider.h">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\inc\DunServer.h">
+            43
+            76
+            101
+            111
+            121
+            130
+            141
+            156
+            172
+            186
+            197
+            207
+            221
+            235
+            245
+            256
+            269
+            279
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUINCableConnectedNotifier.h">
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_settings_api\inc\btengsettings.h">
+            38
+            49
+            59
+            75
+            85
+            95
+            110
+            121
+            131
+            141
+            154
+            163
+            181
+            189
+            202
+            211
+            219
+            229
+            246
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdbaseclass.h">
+            49
+            72
+            83
+            111
+            116
+            132
+            144
+            153
+            162
+            171
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btpsmplugin\inc\btengpsmplugin.h">
+            32
+            59
+            68
+            78
+            96
+            103
+            110
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\eventmanager.h">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsdisconnect.h">
+            31
+            49
+            60
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\imageprintuiappui.h">
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmscloseaudio.h">
+            31
+            50
+            57
+            66
+            75
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\irbearer.h">
+            35
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\usbobex.h">
+            40
+            59
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpobject.h">
+            36
+            55
+            63
+            71
+            79
+            87
+            95
+            104
+            116
+            127
+            135
+            144
+            153
+            161
+            169
+            178
+            186
+            194
+            202
+            211
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsidle.h">
+            31
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\ObexSMPlugin.h">
+            42
+            51
+            65
+            85
+            94
+            102
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\debug.h">
+            46
+            57
+            68
+            91
+            116
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunSignalCopy.h">
+            31
+            52
+            61
+            71
+            80
+            93
+            101
+            115
+            123
+            131
+            139
+            147
+            157
+            167
+            179
+            188
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\inc\BtuiPluginInterface.h">
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamer.h">
+            40
+            58
+            69
+            80
+            91
+            103
+            113
+            126
+            137
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstate.h">
+            43
+            50
+            117
+            125
+            140
+            149
+            157
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConfiguring.h">
+            29
+            53
+            63
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsyncsock.h">
+            40
+            59
+            66
+            73
+            84
+            91
+            103
+            111
+            119
+            127
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmactiveobserver.h">
+            32
+            42
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUINQueriesNotifier.h">
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_discovery_api\inc\btengdiscovery.h">
+            45
+            103
+            116
+            136
+            163
+            184
+            200
+            220
+            243
+            252
+            262
+            281
+            303
+            330
+            348
+            364
+            375
+            391
+            404
+            417
+            433
+            454
+            474
+            486
+            496
+            511
+            526
+            536
+            545
+            553
+            563
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\inc\csetpersonality.h">
+            32
+            43
+            51
+            58
+            65
+            74
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\inc\BTUIApp.h">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\ptpsession.h">
+            31
+            39
+            46
+            58
+            68
+            75
+            81
+            87
+            93
+            102
+            107
+            112
+            120
+            127
+            133
+            139
+            145
+            151
+            157
+            163
+            169
+            175
+            181
+            187
+            193
+            199
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvsession.h">
+            41
+            51
+            64
+            83
+            92
+            101
+            108
+            115
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIPairedDevicesView.h">
+            55
+            341
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsctrl.h">
+            38
+            66
+            74
+            84
+            95
+            112
+            124
+            132
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvpowercontrolagent.h">
+            50
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\inc\btdevmodelbase.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_personality_plugin_api\inc\tusbpersonalityparams.h">
+            33
+            44
+            52
+            60
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstatedetach.h">
+            36
+            43
+            73
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengclient.h">
+            38
+            48
+            55
+            62
+            70
+            80
+            89
+            99
+            108
+            117
+            128
+            139
+            148
+            157
+            166
+            177
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\inc\btengsdpquery.h">
+            37
+            66
+            73
+            82
+            94
+            108
+            122
+            136
+            158
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\cstatemachine.h">
+            32
+            52
+            62
+            69
+            78
+            86
+            93
+            100
+            110
+            119
+            126
+            134
+            144
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpimagehandler.h">
+            37
+            52
+            60
+            76
+            89
+            98
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\ptptransport.h">
+            84
+            94
+            103
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\inc\bthidsettingcontainer.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstatedisconnect.h">
+            35
+            42
+            55
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdcontrolhandler.h">
+            52
+            74
+            82
+            91
+            125
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\SrcsServiceManager.h">
+            39
+            47
+            77
+            90
+            102
+            118
+            126
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunNetDataport.h">
+            34
+            63
+            74
+            86
+            97
+            107
+            116
+            130
+            157
+            169
+            180
+            190
+            205
+            213
+            221
+            230
+            238
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\inc\btblockedmodel.h">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunAtUrcHandler.h">
+            34
+            59
+            67
+            75
+            90
+            101
+            110
+            120
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicddatahandler.h">
+            49
+            71
+            78
+            85
+            107
+            115
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\inc\btengpairinghandler.h">
+            41
+            62
+            72
+            85
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengactive.h">
+            40
+            50
+            77
+            87
+            103
+            111
+            119
+            126
+            133
+            144
+            152
+            160
+            169
+            181
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstatequery.h">
+            36
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\obexserviceman.h">
+            58
+            65
+            72
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsaController.h">
+            80
+            201
+            209
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunChanMan.h">
+            37
+            74
+            105
+            169
+            179
+            193
+            223
+            231
+            239
+            248
+            263
+            272
+            281
+            290
+            306
+            329
+            337
+            347
+            357
+            369
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\irtimer.h">
+            32
+            43
+            50
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\inc\CUsbActiveMscHandlerMdrv.h">
+            114
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbplugin.h">
+            41
+            62
+            69
+            76
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hiddriveritem.h">
+            31
+            51
+            60
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\rptp.h">
+            40
+            57
+            65
+            75
+            83
+            90
+            105
+            111
+            129
+            141
+            152
+            158
+            165
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsopenaudio.h">
+            42
+            61
+            68
+            77
+            87
+            96
+            107
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\commoninc\locodservicepluginobserver.h">
+            32
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_watcher_api\inc\usbwatcher.h">
+            33
+            45
+            53
+            79
+            91
+            99
+            107
+            114
+            122
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateStreaming.h">
+            29
+            53
+            62
+            72
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptplistener.h">
+            41
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmrfcommsock.h">
+            33
+            48
+            56
+            65
+            75
+            82
+            90
+            98
+            105
+            113
+            121
+            130
+            138
+            161
+            171
+            181
+            190
+            199
+            208
+            217
+            237
+            245
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateListening.h">
+            37
+            62
+            72
+            82
+            102
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\inc\cusbdevconstarter.h">
+            29
+            55
+            62
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\inc\dunactive.h">
+            32
+            42
+            50
+            60
+            97
+            116
+            125
+            136
+            145
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\inc\cosdescriptorhandler.h">
+            35
+            44
+            61
+            72
+            80
+            90
+            100
+            112
+            119
+            126
+            133
+            141
+            148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\ptpclasscontroller\inc\ptpclasscontroller.h">
+            85
+            93
+            121
+            128
+            135
+            144
+            150
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengregistrycleaner.h">
+            56
+            66
+            105
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateSuspended.h">
+            29
+            53
+            63
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\obexsm.h">
+            58
+            65
+            83
+            93
+            100
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunTransUtils.h">
+            30
+            41
+            50
+            62
+            72
+            83
+            100
+            119
+            133
+            142
+            151
+            165
+            175
+            184
+            205
+            240
+            249
+            259
+            279
+            294
+            309
+            324
+            338
+            347
+            356
+            368
+            380
+            397
+            417
+            432
+            442
+            452
+            464
+            474
+            493
+            502
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\crequestshandler.h">
+            31
+            42
+            53
+            60
+            71
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvpluginmgr.h">
+            43
+            64
+            72
+            79
+            89
+            97
+            104
+            112
+            121
+            132
+            143
+            164
+            173
+            182
+            191
+            200
+            215
+            225
+            233
+            242
+            250
+            258
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\inc\BTSSSendListHandler.h">
+            35
+            53
+            68
+            76
+            89
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\inc\DunSession.h">
+            28
+            45
+            56
+            66
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunDataPusher.h">
+            32
+            56
+            68
+            79
+            103
+            111
+            120
+            129
+            140
+            148
+            156
+            172
+            187
+            195
+            203
+            216
+            225
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvbbconnectionmgr.h">
+            42
+            64
+            71
+            78
+            88
+            96
+            106
+            118
+            128
+            137
+            148
+            160
+            183
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptplistcontrol.h">
+            35
+            53
+            61
+            70
+            78
+            86
+            94
+            102
+            110
+            118
+            126
+            136
+            149
+            158
+            166
+            180
+            194
+            203
+            211
+            223
+            231
+            239
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\inc\DunServerUtils.h">
+            32
+            43
+            53
+            63
+            75
+            89
+            109
+            126
+            136
+            148
+            159
+            191
+            201
+            211
+            223
+            237
+            255
+            272
+            282
+            294
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\inc\usb\DunUsbConfig.h">
+            37
+            47
+            56
+            68
+            94
+            102
+            112
+            120
+            136
+            152
+            161
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidreportgenerator.h">
+            31
+            39
+            51
+            67
+            82
+            91
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunTransporter.h">
+            112
+            162
+            173
+            188
+            198
+            206
+            218
+            228
+            242
+            346
+            371
+            401
+            410
+            419
+            429
+            438
+            449
+            468
+            484
+            493
+            504
+            515
+            525
+            535
+            547
+            566
+            584
+            599
+            617
+            628
+            646
+            656
+            664
+            672
+            680
+            692
+            704
+            713
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\inc\bthidengplugin.h">
+            36
+            48
+            66
+            77
+            87
+            102
+            115
+            129
+            143
+            160
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\iractivatewatcher.h">
+            38
+            49
+            57
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\inc\btengconnhandler.h">
+            41
+            61
+            72
+            82
+            93
+            104
+            115
+            126
+            137
+            147
+            155
+            166
+            177
+            185
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmslisten.h">
+            31
+            50
+            58
+            67
+            77
+            89
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpdatahandler.h">
+            38
+            45
+            63
+            71
+            79
+            88
+            102
+            116
+            126
+            136
+            152
+            161
+            170
+            186
+            195
+            207
+            221
+            238
+            247
+            255
+            263
+            271
+            279
+            287
+            295
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\DisconnectHelper.h">
+            28
+            39
+            48
+            69
+            77
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunSignalWaiter.h">
+            32
+            55
+            65
+            74
+            83
+            91
+            105
+            116
+            125
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdwriteobserver.h">
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidreportroot.h">
+            42
+            55
+            71
+            85
+            97
+            106
+            117
+            151
+            162
+            178
+            194
+            210
+            222
+            232
+            242
+            250
+            262
+         </file>
+         <file path="Y:\LC_Domain_osext\shortlinksrv\shortlinksrv_plat\bluetooth_power_management_api\inc\btpm.h">
+            34
+            44
+            60
+            70
+            79
+            88
+            97
+            106
+         </file>
+         <file path="Y:\LC_Domain_osext\shortlinksrv\shortlinksrv_plat\bluetooth_audio_adaptation_api\inc\btaudiostreaminputbase.h">
+            35
+            43
+            53
+            69
+            77
+            94
+            107
+            119
+            132
+            145
+            157
+            169
+            182
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hiditem.h">
+            39
+            64
+            80
+            88
+            98
+            108
+            116
+            125
+            133
+            141
+            149
+            157
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIDeviceContainer.h">
+            47
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\ptp_transport_api\inc\ptptransport.h">
+            84
+            94
+            103
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstateattached.h">
+            36
+            43
+            97
+            105
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\inc\irappgsplugin.h">
+            41
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\btuipluginman.h">
+            37
+            47
+            75
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\inc\ir\DunIrPlugin.h">
+            34
+            55
+            63
+            72
+            82
+            91
+            99
+            107
+            121
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidfield.h">
+            49
+            78
+            86
+            94
+            102
+            110
+            118
+            126
+            134
+            142
+            150
+            158
+            166
+            174
+            182
+            190
+            198
+            206
+            214
+            222
+            230
+            238
+            246
+            254
+            262
+            270
+            278
+            286
+            294
+            302
+            311
+            320
+            328
+            337
+            345
+            353
+            362
+            371
+            379
+            388
+            397
+            406
+            415
+            424
+            433
+            442
+            451
+            460
+            469
+            478
+            487
+            496
+            505
+            514
+            523
+            532
+            541
+            550
+            559
+            569
+            579
+            589
+            599
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btbearer\inc\btpluginnotifier.h">
+            40
+            90
+            101
+            109
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamsender.h">
+            43
+            54
+            63
+            73
+            81
+            91
+            101
+            109
+            127
+            137
+            148
+            158
+            169
+            179
+            192
+            202
+            213
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIMainView.h">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbwriter.h">
+            50
+            71
+            88
+            98
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbreader.h">
+            46
+            69
+            80
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidvalues.h">
+            103
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunDownstream.h">
+            36
+            68
+            78
+            93
+            120
+            128
+            136
+            145
+            160
+            168
+            177
+            189
+            198
+            208
+            221
+            231
+            239
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBNotifier.h">
+            49
+            101
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmstate.h">
+            47
+            62
+            69
+            77
+            86
+            93
+            102
+            111
+            118
+            127
+            135
+            157
+            166
+            174
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\inc\btpairedmodel.h">
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\cep0reader.h">
+            31
+            42
+            52
+            59
+            66
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\inc\bt\DunBtListen.h">
+            41
+            70
+            80
+            88
+            105
+            113
+            122
+            131
+            149
+            158
+            169
+            178
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpresponder.h">
+            48
+            55
+            64
+            75
+            83
+            92
+            109
+            118
+            128
+            136
+            144
+            152
+            165
+            175
+            190
+            203
+            213
+            223
+            231
+            238
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbconnector.h">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateAborting.h">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsaudio.h">
+            33
+            51
+            58
+            69
+            80
+            90
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_personality_plugin_api\inc\cusbpersonalityplugin.h">
+            32
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidconnectioninfo.h">
+            35
+            58
+            66
+            74
+            83
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\inc\dunplugin.h">
+            32
+            54
+            63
+            76
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunAtCmdHandler.h">
+            38
+            72
+            82
+            90
+            101
+            124
+            132
+            141
+            149
+            157
+            171
+            180
+            189
+            201
+            210
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpdeviceinfo.h">
+            33
+            40
+            54
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\inc\irappgspluginview.h">
+            59
+            87
+            95
+            103
+            112
+            119
+            128
+            135
+            143
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\inc\usb\DunUsbPlugin.h">
+            36
+            62
+            86
+            94
+            102
+            110
+            118
+            126
+            135
+            145
+            156
+            166
+            175
+            183
+            191
+            201
+            211
+            226
+            238
+            248
+            260
+            273
+            285
+            294
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\inc\mouse.h">
+            145
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstateattach.h">
+            35
+            42
+            70
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\ptp_transport_api\inc\ptpcallbacks.h">
+            32
+            39
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIActive.h">
+            35
+            45
+            71
+            81
+            99
+            107
+            115
+            122
+            129
+            140
+            148
+            157
+            168
+            180
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengsettings\inc\btengsettingsnotify.h">
+            37
+            48
+            68
+            79
+            89
+            99
+            108
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmstempd.h">
+            31
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIKeyWatcher.h">
+            35
+            60
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmactive.h">
+            33
+            50
+            57
+            65
+            76
+            84
+            92
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\obex_service_utils_api\inc\obexutilsmessagehandler.h">
+            173
+            189
+            197
+            214
+            226
+            236
+            246
+            247
+            254
+            262
+            445
+            458
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\inc\genericactive.h">
+            33
+            43
+            51
+            64
+            85
+            92
+            100
+            113
+            121
+            129
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\ptp_server_api\inc\rptp.h">
+            40
+            57
+            65
+            75
+            83
+            90
+            105
+            111
+            129
+            141
+            152
+            158
+            165
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsconnect.h">
+            37
+            63
+            71
+            83
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\inc\btengsdpattrparser.h">
+            36
+            57
+            70
+            82
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdpacketobserver.h">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\commoninc\locodserviceplugin.h">
+            37
+            54
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_device_control_plugin_api\inc\cusbdevicecontrolplugin.h">
+            38
+            53
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccman.h">
+            127
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\utils\inc\IRActive.h">
+            35
+            45
+            71
+            81
+            99
+            107
+            115
+            122
+            129
+            138
+            146
+            155
+            166
+            178
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvactive.h">
+            32
+            42
+            50
+            64
+            88
+            95
+            103
+            114
+            122
+            130
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsreconnect.h">
+            37
+            55
+            64
+            73
+            81
+            92
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\inc\keyboard.h">
+            147
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_plugin_api\inc\btengplugin.h">
+            37
+            56
+            76
+            98
+            111
+            128
+            138
+            149
+            164
+            177
+            191
+            206
+            222
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\irstatemachine.h">
+            50
+            61
+            71
+            79
+            87
+            95
+            103
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdinterrupthandler.h">
+            48
+            68
+            76
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvkeywatcher.h">
+            38
+            61
+            71
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\ptpeventsender.h">
+            37
+            46
+            59
+            70
+            79
+            90
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsockobserver.h">
+            30
+            39
+            47
+            56
+            64
+            72
+            80
+            92
+            100
+            108
+            116
+            124
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\ptpserver.h">
+            40
+            49
+            55
+            62
+            68
+            75
+            82
+            91
+            98
+            105
+            115
+            122
+            128
+            134
+            141
+            147
+            154
+            160
+            167
+            174
+            181
+            188
+            196
+            205
+            213
+            221
+            228
+            235
+            242
+            255
+            264
+            270
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\cep0writer.h">
+            31
+            42
+            52
+            59
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\inc\dunclient.h">
+            34
+            46
+            56
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\locodservice.h">
+            36
+            44
+            56
+            66
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\genericactive.h">
+            33
+            43
+            51
+            59
+            71
+            92
+            99
+            107
+            120
+            128
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\ptptimer.h">
+            29
+            36
+            41
+            47
+            52
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsdpdbhandler.h">
+            34
+            44
+            57
+            68
+            80
+            90
+            101
+            108
+            115
+            126
+            137
+            148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsrfcomm.h">
+            33
+            61
+            73
+            86
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\cusbstatewatcher.h">
+            33
+            44
+            54
+            61
+            70
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\ptpcallbacks.h">
+            32
+            39
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUINQueriesNotifierMdrv.h">
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\commoninc\locodbearerpluginparams.h">
+            34
+            43
+            52
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_personality_plugin_api\inc\cusbpersonality.h">
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunUtils.h">
+            30
+            40
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengserver.h">
+            49
+            56
+            65
+            90
+            112
+            121
+            129
+            137
+            145
+            153
+            161
+            169
+            177
+            184
+            192
+            200
+            208
+            215
+            225
+            243
+            256
+            272
+            280
+            288
+            296
+            304
+            312
+            320
+            328
+            336
+            345
+            355
+            368
+            378
+            387
+            399
+            409
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstateconnect.h">
+            35
+            42
+            60
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\irstates.h">
+            31
+            60
+            79
+            97
+            115
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidtranslate.h">
+            33
+            41
+            52
+            62
+            75
+            94
+            103
+            115
+            130
+            143
+            154
+            164
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btaudiostreaminputbase.h">
+            35
+            43
+            53
+            69
+            77
+            94
+            107
+            119
+            132
+            145
+            157
+            169
+            182
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\obexsmclient.h">
+            84
+            96
+            104
+            111
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\usbclientwrapper.h">
+            33
+            51
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_dosserver_audio_api\inc\btaudio4dos.h">
+            33
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\imageprintuidocument.h">
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengpairobserver.h">
+            41
+            61
+            69
+            79
+            90
+            110
+            117
+            124
+            131
+            139
+            147
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\imageprintuiapp.h">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\btaudio4dosimpl.h">
+            32
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\inc\vMessageHandler.h">
+            10
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateIdle.h">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidgeneric.h">
+            38
+            49
+            59
+            69
+            79
+            89
+            105
+            121
+            133
+            150
+            170
+            188
+            204
+            220
+            232
+            243
+            254
+            265
+            278
+            295
+            303
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_connection_management_api\inc\btengconnman.h">
+            37
+            52
+            75
+            89
+            113
+            123
+            133
+            156
+            176
+            189
+            203
+            225
+            249
+            261
+            270
+            282
+            308
+            331
+            341
+            356
+            372
+            385
+            400
+            420
+            428
+            437
+            446
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\locodaemon.h">
+            36
+            44
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\inc\genericactive.h">
+            33
+            43
+            51
+            59
+            71
+            92
+            99
+            107
+            120
+            128
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicddataobserver.h">
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConnecting.h">
+            29
+            54
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvstate.h">
+            52
+            99
+            109
+            119
+            132
+            142
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\commoninc\locodbearerplugin.h">
+            34
+            47
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\inc\CUsbWatcher.h">
+            90
+            99
+            107
+            115
+            127
+            138
+            145
+            153
+            162
+            255
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmssniffm.h">
+            31
+            53
+            61
+            71
+            84
+            100
+            112
+            120
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamsendersbc.h">
+            39
+            54
+            63
+            73
+            85
+            95
+            105
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbpacketreader.h">
+            47
+            67
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvactivenotifier.h">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\commoninc\locodbearerpluginobserver.h">
+            32
+            42
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUIConnectionNotifier.h">
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\ObexSMRequester.h">
+            38
+            74
+            80
+            88
+            100
+            108
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\irremotelockwatcher.h">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacActiveObserver.h">
+            32
+            42
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\Pbapplugin.h">
+            32
+            57
+            68
+            80
+            96
+            110
+            125
+            141
+            157
+            174
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIMainContainer.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\requestmanager.h">
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIBlockedDevicesView.h">
+            42
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunPlugin.h">
+            59
+            69
+            78
+            87
+            101
+            111
+            121
+            133
+            146
+            155
+            168
+            191
+            205
+            216
+            226
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpstorage.h">
+            35
+            43
+            62
+            70
+            78
+            86
+            94
+            102
+            110
+            119
+            133
+            142
+            151
+            159
+            167
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbobexclasscontroller\inc\CUsbObexClassController.h">
+            37
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\inc\cselectedpersonalityproperty.h">
+            31
+            42
+            50
+            58
+            68
+            75
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\inc\btengdevicesearch.h">
+            37
+            58
+            71
+            90
+            99
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacactive.h">
+            33
+            53
+            60
+            68
+            79
+            87
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidcollection.h">
+            39
+            78
+            86
+            94
+            102
+            110
+            118
+            129
+            139
+            147
+            155
+            163
+            171
+            179
+            187
+            197
+            205
+            213
+            223
+            233
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConfigured.h">
+            29
+            53
+            62
+            72
+            80
+            91
+            99
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidparser.h">
+            152
+            167
+            242
+            267
+            276
+            294
+            305
+            316
+            328
+            342
+            357
+            372
+            386
+            396
+            408
+            422
+            436
+            451
+            461
+            477
+            490
+            499
+            511
+            521
+            531
+            540
+            549
+            559
+            568
+            577
+            586
+            595
+            604
+            613
+            622
+            631
+            640
+            649
+            658
+            667
+            676
+            685
+            694
+            703
+            712
+            721
+            730
+            739
+            748
+            757
+            766
+            776
+            784
+            792
+            800
+            812
+            821
+            831
+            839
+            847
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\commoninc\locodservicepluginparams.h">
+            34
+            42
+            51
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidinterfaces.h">
+            97
+            108
+            141
+            150
+            159
+            168
+            178
+            188
+            201
+            216
+            230
+            244
+            257
+            277
+            311
+            320
+            329
+            341
+            355
+            371
+            386
+            402
+            420
+            442
+            462
+            476
+            504
+            515
+            526
+            541
+            555
+            570
+            599
+            610
+            622
+            632
+            644
+            656
+            665
+            674
+            683
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunNoteHandler.h">
+            33
+            54
+            62
+            70
+            84
+            92
+            100
+            113
+            122
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsinuse.h">
+            34
+            46
+            68
+            76
+            85
+            93
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunStream.h">
+            29
+            39
+            47
+            59
+            71
+            80
+            91
+            102
+            120
+            133
+            142
+            152
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConnected.h">
+            29
+            54
+            64
+            74
+            96
+            104
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\inc\irkeywatcher.h">
+            34
+            58
+            69
+         </file>
+      </problem>
+      <problem name="ifassignments" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityNotifier.cpp">
+            183
+            213
+            393
+         </file>
+      </problem>
+      <problem name="ifpreprocessor" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\inc\CUsbActiveMscHandlerMdrv.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\inc\oppcontroller.h">
+            24
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\btrccPluginImplUid.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdbaseclass.h">
+            20
+            202
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\inc\socketreader.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidgeneric.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\debug.h">
+            21
+            26
+            28
+            76
+            99
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonobearer\bmbplugin.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btnpbappinnotifier.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccDosSender.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\SrcsSecurityPolicy.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\atextpluginobserver.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_local_variation_api\inc\btengdomaincrkeys.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\inc\debug.h">
+            33
+            47
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\inc\debug.h">
+            20
+            25
+            27
+            58
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmman.h">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceStarter.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\atcodec\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btninquiryao.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdinterruptobserver.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUDebug.h">
+            21
+            25
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\ptp_transport_api\inc\ptptransport.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonobearer\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btpsmplugin\inc\btengpsmplugin.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_api\inc\btengconstants.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConnecting.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\inc\mptpobserver.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\inc\aiwprintingprovideruid.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSController.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdatatypes.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\ObexSMPlugin.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\inc\debugconfig.h">
+            29
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\debug.h">
+            20
+            25
+            27
+            58
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonobearer\playercontrolistener.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstate.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConfiguring.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsyncsock.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\inc\debug.h">
+            20
+            26
+            28
+            50
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\atextsrv.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_sap_connection_state_api\inc\BTSapInternalPSKeys.h">
+            1
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengprivatecrkeys.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\ir\debug.h">
+            36
+            52
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\BTMonoCdmaIncomingFlash.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\inc\debug.h">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\inc\debug.h">
+            33
+            49
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_dut_mode_api\inc\btengdomainpskeys.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\atextsecpolicy.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\common\debug.h">
+            20
+            26
+            28
+            50
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdreadobserver.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\SrcsClSv.h">
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\settingscontainer.h">
+            104
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstatedetach.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\debug.h">
+            20
+            25
+            27
+            58
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpcodedefs.h">
+            25
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapSecurityHandler.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceAPI.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\debug.h">
+            43
+            51
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\inc\datasegmenter.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\inc\irtestpskeys.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\btmc_defs.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstatedisconnect.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUImageConverter.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonobearer\bmbcmdlistener.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUDataConverter.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\debug.h">
+            27
+            29
+            72
+            74
+            95
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstatequery.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_sap_connection_state_api\inc\BTSapDomainPSKeys.h">
+            1
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUINotifDebug.h">
+            24
+            30
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_dosserver_audio_api\inc\btaudio4dos.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbplugin.h">
+            20
+            105
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUXmlParser.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTConnectionTimer.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBPPController.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_secondary_display_api\inc\usbuinotifsecondarydisplay.h">
+            51
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccServer.h">
+            24
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hiddriveritem.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\inc\btmtmuidebug.h">
+            21
+            25
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbbasicpersonality\inc\debug.h">
+            33
+            49
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\debug.h">
+            33
+            47
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateStreaming.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapRequestHandler.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSOPPController.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\usb\debug.h">
+            36
+            52
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateListening.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btNotifDebug.h">
+            21
+            25
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\btrccplayerstarter.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmconfig.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_engine_plugin_api\inc\btengplugin.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateSuspended.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUPassKeyRequest.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\atextsession.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\common\inc\genericclient.h">
+            24
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBNotifier.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacSEPManager.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\inc\bthidconnection.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\inc\debug.h">
+            20
+            25
+            27
+            58
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\ptpcallbacks.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbreader.h">
+            20
+            33
+            175
+            179
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\ptpclasscontroller\inc\ptpclasscontroller.h">
+            24
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidreportgenerator.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSUCapabilityResolver.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSURefObjectResolver.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\debugconfig.h">
+            29
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceParameterList.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\inc\bthidengplugin.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\inc\obexservicemanprivatecrkeys.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\debug.h">
+            20
+            26
+            28
+            50
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\inc\debugconfig.h">
+            24
+            45
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\inc\debug.h">
+            20
+            25
+            27
+            58
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\btrccVolumeLevelController.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\inc\debug.h">
+            33
+            49
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapMessage.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\inc\bthidclientsrv.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonobearer\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\imageprintuidebug.h">
+            23
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdwriteobserver.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapSniffHandler.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_sdk\bluetooth_power_state_api\inc\btserversdkcrkeys.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\inc\IrSSProvider.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdconstants.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccfwconn.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hiditem.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceUtils.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\inc\debug.h">
+            33
+            47
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\btmcprotocolstatus.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstateattached.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\inc\irappgsplugin.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStreamerController.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdlogger.h">
+            21
+            34
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\prjconfig.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvrvc.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\at_command_handler_plugin_api\inc\atextpluginbase.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapPlugin.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidfield.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\inc\BTSSProvider.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\inc\IrSendingServiceDebug.h">
+            21
+            25
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapSocketHandler.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\debugconfig.h">
+            40
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\common\atcodec.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\ptp_transport_api\inc\ptpcallbacks.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBPPObjectRequest.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_secondary_display_notification_api\inc\secondarydisplay\BTnotifSecondaryDisplayAPI.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonobearer\bmbserviceuid.h">
+            1
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbconnector.h">
+            20
+            109
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccSecurityPolicy.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateAborting.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidconnectioninfo.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\ir\obexsmirdaconnection.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\inc\BTSendingServiceDebug.h">
+            21
+            25
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\atextclientsrv.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstateattach.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\BTAccParams.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\BTAccPluginUid.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBPPObjectServer.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\inc\USBClassChangeUIDebug.h">
+            25
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmstempd.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\debugconfig.h">
+            29
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\atcodec\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbpacketreader.h">
+            21
+            35
+            108
+            112
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\AccessoryTypes_4dos.h">
+            24
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\ptptransport.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdpacketobserver.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccman.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\dialup_connection_status_api\inc\dundomainpskeys.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\inc\DunServerSecurityPolicy.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdinterrupthandler.h">
+            20
+            124
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvkeywatcher.h">
+            145
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdcontrolhandler.h">
+            20
+            40
+            189
+            193
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicddatahandler.h">
+            20
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btnotifier.h">
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\debug.h">
+            20
+            26
+            28
+            50
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvpluginman.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacGavdpObserver.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\inc\USBClassChangeUIPluginDebug.h">
+            24
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\common\debug.h">
+            20
+            26
+            28
+            50
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\inc\dunserverdef.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdcontrolobserver.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccDosListener.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\inc\obexutilsdebug.h">
+            21
+            25
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\common\inc\hiddebug.h">
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBPPServerWait.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdusbwriter.h">
+            20
+            38
+            176
+            180
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccFwConnection_d.h">
+            24
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUINQueriesNotifierMdrv.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\debug.h">
+            36
+            52
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_dosserver_audio_api\inc\btaudio4dosdomainpskeys.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\BTAccObserver.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengserver.h">
+            23
+            93
+            221
+            251
+            516
+            528
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvaccstateconnect.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\inc\obexutilsglobalprogressdialog.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidtranslate.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccFwIf.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\inc\debug.h">
+            20
+            27
+            29
+            51
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceClient.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidinterfaces.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\basrvacc.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\BTNGenericInfoNotifier.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateIdle.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\utils.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacGavdp.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\obex_secondary_display_notification_api\inc\secondarydisplay\obexutilssecondarydisplayapi.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\inc\imageprintuidebug.h">
+            23
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapServerState.h">
+            24
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\inc\debug.h">
+            20
+            26
+            28
+            52
+            67
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicddataobserver.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\inc\IRClient.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\prjconfig.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicddatatypes.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\debugconfig.h">
+            29
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStreamEndPoint.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\prjconfig.h">
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\BTAccTypes.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccInfo.h">
+            22
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapSession.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\inc\debugconfig.h">
+            28
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\inc\debugconfig.h">
+            29
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapHciExtensionMan.h">
+            23
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunDebug.h">
+            20
+            27
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunPlugin.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidparser.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\expinc\BTAccPlugin.h">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\debug.h">
+            20
+            26
+            28
+            50
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsreconnect.h">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidcollection.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConfigured.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamerdebug.h">
+            20
+            26
+            40
+            59
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengprivatepskeys.h">
+            20
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\inc\socketwriter.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\btaudio4dosimpl.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBIPController.h">
+            21
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSapSimCardStatusNotifier.h">
+            24
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\bt\debug.h">
+            34
+            50
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStateConnected.h">
+            20
+         </file>
+      </problem>
+      <problem name="longlines" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUCapabilityResolver.cpp">
+            178
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbreader.cpp">
+            415
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamsendersbc.cpp">
+            112
+            188
+         </file>
+      </problem>
+      <problem name="magicnumbers" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpimagehandler.cpp">
+            318
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\atextagent.cpp">
+            102
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthiddevice.cpp">
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmbtconnection.cpp">
+            192
+            195
+            197
+            199
+            201
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpobject.cpp">
+            427
+            428
+            625
+            632
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcprotocol.cpp">
+            867
+            872
+            875
+            1204
+            1214
+            1224
+            1234
+            1244
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            831
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            70
+            74
+            75
+            79
+            82
+            87
+            184
+            419
+            619
+            630
+            631
+            638
+            639
+            640
+            647
+            650
+            651
+            667
+            672
+            674
+            699
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            279
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            191
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            411
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapMessage.cpp">
+            59
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hiddescriptor.cpp">
+            92
+            98
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPwrNotifier.cpp">
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\mapping.cpp">
+            41
+            42
+            43
+            44
+            45
+            46
+            47
+            48
+            49
+            50
+            51
+            52
+            58
+            59
+            60
+            61
+            62
+            63
+            79
+            80
+            81
+            82
+            83
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSession.cpp">
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpstorage.cpp">
+            63
+            409
+            428
+            434
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            269
+            283
+            286
+            295
+            358
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobalprogressdialog.cpp">
+            190
+            193
+            196
+            201
+            204
+            214
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdinterrupthandler.cpp">
+            212
+            216
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketStateListen.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            137
+            156
+            218
+            314
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUDataConverter.cpp">
+            61
+            75
+            91
+            105
+            117
+            121
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            253
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRClient.cpp">
+            165
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsuilayer.cpp">
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcnumber.cpp">
+            103
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstate.cpp">
+            146
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\vMessageHandler.cpp">
+            415
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPinNotifier.cpp">
+            153
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpservermain.cpp">
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\layoututils.cpp">
+            41
+            44
+            47
+            50
+            53
+            56
+            59
+            62
+            65
+            68
+            71
+            96
+            99
+            124
+            127
+            130
+            133
+            136
+            139
+            142
+            145
+            148
+            151
+            154
+            180
+            183
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdbaseclass.cpp">
+            156
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpdeviceinfo.cpp">
+            199
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosListener.cpp">
+            100
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoCmdHandler.cpp">
+            90
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            132
+            151
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmuidata.cpp">
+            370
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmuidata.cpp">
+            398
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialog.cpp">
+            316
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamerController.cpp">
+            308
+            313
+            318
+            323
+            384
+            389
+            394
+            399
+            421
+            426
+            644
+            666
+            683
+            688
+            722
+            883
+            889
+            895
+            901
+            921
+            924
+            927
+            930
+            934
+            1062
+            1068
+            1074
+            1080
+            1100
+            1103
+            1106
+            1109
+            1113
+            1138
+            1144
+            1160
+            1178
+            1179
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            154
+            184
+            524
+            553
+            595
+            639
+            644
+            654
+            823
+            853
+            922
+            928
+            940
+            1005
+            1076
+            1112
+            1246
+            1266
+            1376
+            1482
+            1522
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallstatus.cpp">
+            287
+            291
+            297
+            302
+            363
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqNotifier.cpp">
+            181
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            365
+            367
+            370
+            372
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengregistrycleaner.cpp">
+            211
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccman.cpp">
+            241
+            372
+            475
+            506
+            521
+            553
+            617
+            639
+            709
+            764
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            169
+            307
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            322
+            371
+            440
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            210
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsdpdbhandler.cpp">
+            128
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBIPController.cpp">
+            302
+            404
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccfwconn.cpp">
+            106
+            131
+            190
+            207
+            224
+            240
+            255
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicddatahandler.cpp">
+            392
+            398
+            644
+            648
+            652
+            656
+            660
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            1438
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hiddescriptorlist.cpp">
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            176
+            288
+            338
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\RUsbWatcher.cpp">
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmrfcommsock.cpp">
+            229
+            251
+         </file>
+      </problem>
+      <problem name="membervariablecallld" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINQueriesNotifierMdrv.cpp">
+            256
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPinNotifier.cpp">
+            267
+            312
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericQueryNotifier.cpp">
+            380
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            325
+            399
+            428
+            456
+            513
+            1170
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            404
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            287
+            334
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            291
+            339
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNObexPinNotifier.cpp">
+            148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPBAPPinNotifier.cpp">
+            151
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\notes.cpp">
+            148
+            203
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialog.cpp">
+            142
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINCableConnectedNotifier.cpp">
+            219
+            331
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            441
+            569
+            722
+            865
+         </file>
+      </problem>
+      <problem name="multipledeclarations" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\btuipluginman.cpp">
+            130
+         </file>
+      </problem>
+      <problem name="namespace" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\inc\bthidprivatecrkeys.h">
+            63
+         </file>
+      </problem>
+      <problem name="nonconsttdesc" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobalprogressdialog.cpp">
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            1015
+         </file>
+      </problem>
+      <problem name="null" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceStarter.cpp">
+            263
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            385
+            423
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            146
+            531
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIPairedDevicesView.cpp">
+            553
+            968
+            1278
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            343
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengdiscovery.cpp">
+            158
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectRequest.cpp">
+            155
+            159
+            197
+            201
+            234
+            422
+            463
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPBAPPinNotifier.cpp">
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodelbase.cpp">
+            168
+            531
+            786
+            798
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUPassKeyRequest.cpp">
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdbaseclass.cpp">
+            561
+            565
+            569
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUCapabilityResolver.cpp">
+            186
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPwrNotifier.cpp">
+            89
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbreader.cpp">
+            347
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodel.cpp">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobalprogressdialog.cpp">
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUImageConverter.cpp">
+            136
+            164
+            222
+            223
+            256
+            257
+            258
+            279
+            284
+            303
+            304
+            305
+            306
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            114
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpquery.cpp">
+            316
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPController.cpp">
+            165
+            182
+            352
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRClient.cpp">
+            416
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqNotifier.cpp">
+            93
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityNotifier.cpp">
+            183
+            213
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsSession.cpp">
+            171
+            188
+            200
+            212
+            236
+            260
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPinNotifier.cpp">
+            111
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectServer.cpp">
+            59
+            60
+            61
+            170
+            184
+            306
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRSSProvider.cpp">
+            122
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPServerWait.cpp">
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            108
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\src\BTUIAppUi.cpp">
+            108
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUXmlParser.cpp">
+            100
+            147
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIKeyWatcher.cpp">
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            432
+            836
+            863
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobaldialog.cpp">
+            153
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericQueryNotifier.cpp">
+            355
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btpairedmodel.cpp">
+            182
+            411
+            552
+            771
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            142
+            181
+            321
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccLinker.cpp">
+            373
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBIPController.cpp">
+            480
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnpaireddevsettnotifier.cpp">
+            104
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\BTSSProvider.cpp">
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNObexPinNotifier.cpp">
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmrfcommsock.cpp">
+            139
+            414
+         </file>
+      </problem>
+      <problem name="privateinheritance" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccInfoMainService.h">
+            35
+         </file>
+      </problem>
+      <problem name="resourcesonheap" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUXmlParser.cpp">
+            109
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            161
+            168
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamsender.cpp">
+            58
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            167
+            168
+            1109
+            1166
+         </file>
+      </problem>
+      <problem name="stringliterals" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbplugin.cpp">
+            60
+            68
+            79
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceStarter.cpp">
+            70
+            74
+            94
+            99
+            127
+            138
+            176
+            180
+            191
+            233
+            259
+            304
+            315
+            331
+            346
+            354
+            362
+            367
+            377
+            403
+            408
+            417
+            426
+            435
+            443
+            454
+            471
+            480
+            495
+            498
+            516
+            525
+            596
+            609
+            622
+            642
+            680
+            682
+            691
+            702
+            712
+            783
+            791
+            792
+            811
+            821
+            827
+            847
+            868
+            879
+            889
+            899
+            936
+            947
+            950
+            961
+            991
+            1002
+            1004
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\inc\debug.h">
+            108
+            133
+            153
+            186
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengconnman.cpp">
+            57
+            242
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlparser.cpp">
+            41
+            52
+            54
+            63
+            65
+            75
+            78
+            81
+            90
+            93
+            97
+            108
+            112
+            117
+            124
+            169
+            184
+            194
+            198
+            209
+            216
+            232
+            240
+            251
+            256
+            267
+            271
+            278
+            287
+            292
+            297
+            308
+            311
+            323
+            334
+            337
+            340
+            350
+            353
+            356
+            366
+            369
+            372
+            382
+            385
+            388
+            399
+            402
+            405
+            414
+            417
+            419
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceClient.cpp">
+            63
+            102
+            126
+            179
+            189
+            227
+            238
+            275
+            285
+            369
+            378
+            384
+            393
+            405
+            416
+            420
+            429
+            445
+            454
+            463
+            477
+            508
+            529
+            534
+            543
+            562
+            565
+            573
+            595
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmactive.cpp">
+            58
+            64
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketStateSend.cpp">
+            37
+            40
+            50
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\library.cpp">
+            51
+            71
+            75
+            82
+            86
+            96
+            103
+            111
+            118
+            123
+            129
+            136
+            138
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\inc\debug.h">
+            82
+            97
+            108
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateListening.cpp">
+            86
+            201
+            206
+            223
+            229
+            301
+            313
+            321
+            328
+            348
+            356
+            389
+            402
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengpairinghandler.cpp">
+            100
+            170
+            178
+            207
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\btsssendlisthandler.cpp">
+            80
+            91
+            100
+            110
+            118
+            128
+            134
+            141
+            147
+            166
+            175
+            190
+            199
+            204
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunNoteHandler.cpp">
+            55
+            57
+            66
+            75
+            84
+            87
+            93
+            98
+            108
+            111
+            116
+            122
+            142
+            144
+            153
+            156
+            165
+            168
+            192
+            201
+            226
+            236
+            240
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsconnectnotifier.cpp">
+            39
+            52
+            54
+            63
+            65
+            74
+            82
+            124
+            126
+            135
+            137
+            146
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irremotelockwatcher.cpp">
+            93
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsSession.cpp">
+            61
+            123
+            148
+            176
+            186
+            201
+            215
+            237
+            246
+            261
+            269
+            279
+            338
+            357
+            361
+            371
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsdisconnect.cpp">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\server.cpp">
+            43
+            67
+            101
+            109
+            218
+            227
+            238
+            247
+            268
+            275
+            282
+            289
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDownstream.cpp">
+            53
+            55
+            86
+            89
+            94
+            101
+            114
+            124
+            127
+            132
+            139
+            146
+            156
+            169
+            178
+            186
+            191
+            196
+            216
+            221
+            245
+            249
+            256
+            264
+            268
+            277
+            283
+            288
+            292
+            299
+            309
+            316
+            324
+            335
+            361
+            385
+            405
+            409
+            414
+            421
+            435
+            446
+            454
+            464
+            479
+            489
+            504
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapRequestHandler.cpp">
+            42
+            67
+            81
+            93
+            152
+            165
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            311
+            592
+            612
+            617
+            636
+            637
+            686
+            737
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsscriptsender.cpp">
+            40
+            53
+            55
+            64
+            66
+            75
+            109
+            124
+            141
+            144
+            153
+            155
+            164
+            167
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            46
+            196
+            563
+            602
+            625
+            738
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\client.cpp">
+            55
+            56
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbreader.cpp">
+            61
+            73
+            83
+            99
+            108
+            118
+            131
+            136
+            151
+            163
+            185
+            196
+            210
+            220
+            227
+            238
+            243
+            248
+            257
+            270
+            277
+            284
+            286
+            288
+            293
+            304
+            349
+            371
+            372
+            390
+            391
+            397
+            424
+            425
+            430
+            440
+            451
+            463
+            470
+            474
+            486
+            495
+            506
+            512
+            513
+            524
+            525
+            527
+            539
+            554
+            555
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\debug.h">
+            82
+            97
+            108
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateNotConnected.cpp">
+            40
+            57
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\dunplugin.cpp">
+            43
+            50
+            59
+            60
+            71
+            85
+            95
+            103
+            114
+            120
+            127
+            131
+            149
+            150
+            161
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcoperator.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\src\DunServerUtils.cpp">
+            78
+            86
+            94
+            105
+            120
+            130
+            137
+            140
+            152
+            156
+            166
+            170
+            173
+            175
+            180
+            188
+            192
+            199
+            203
+            216
+            227
+            239
+            243
+            256
+            260
+            266
+            281
+            288
+            291
+            293
+            304
+            308
+            326
+            337
+            349
+            355
+            364
+            367
+            378
+            382
+            387
+            390
+            396
+            397
+            407
+            408
+            419
+            423
+            428
+            431
+            437
+            438
+            445
+            451
+            453
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettings.cpp">
+            99
+            107
+            128
+            138
+            151
+            161
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\common\debug.h">
+            74
+            89
+            100
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\csetpersonality.cpp">
+            33
+            60
+            71
+            111
+            151
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlstring.cpp">
+            69
+            73
+            77
+            81
+            85
+            89
+            95
+            99
+            103
+            107
+            111
+            115
+            119
+            123
+            135
+            139
+            143
+            147
+            160
+            164
+            168
+            179
+            183
+            187
+            191
+            195
+            199
+            203
+            207
+            211
+            215
+            219
+            223
+            227
+            231
+            235
+            239
+            243
+            247
+            251
+            255
+            259
+            263
+            267
+            271
+            275
+            279
+            283
+            287
+            291
+            295
+            299
+            303
+            307
+            311
+            315
+            319
+            323
+            327
+            331
+            335
+            339
+            343
+            347
+            351
+            355
+            359
+            363
+            367
+            371
+            375
+            379
+            383
+            387
+            391
+            395
+            399
+            403
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmonobearer\bmbplugin.cpp">
+            90
+            98
+            138
+            163
+            167
+            193
+            207
+            219
+            230
+            238
+            265
+            268
+            272
+            289
+            292
+            296
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            88
+            109
+            118
+            129
+            135
+            143
+            149
+            159
+            168
+            184
+            193
+            246
+            255
+            279
+            289
+            352
+            365
+            385
+            405
+            413
+            423
+            424
+            443
+            466
+            499
+            532
+            542
+            546
+            563
+            588
+            598
+            622
+            643
+            646
+            655
+            657
+            658
+            759
+            768
+            892
+            902
+            904
+            911
+            943
+            1034
+            1042
+            1069
+            1103
+            1108
+            1113
+            1121
+            1213
+            1255
+            1263
+            1268
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            286
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNObexPinNotifier.cpp">
+            92
+            115
+            125
+            175
+            185
+            194
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodelbase.cpp">
+            334
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacState.cpp">
+            223
+            228
+            334
+            340
+            404
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcsignal.cpp">
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPwrNotifier.cpp">
+            87
+            102
+            112
+            159
+            169
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvstate.cpp">
+            239
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTConnectionTimer.cpp">
+            53
+            58
+            105
+            112
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cep0reader.cpp">
+            32
+            61
+            102
+            114
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            130
+            187
+            247
+            379
+            384
+            392
+            427
+            447
+            451
+            483
+            509
+            513
+            521
+            549
+            566
+            591
+            602
+            613
+            621
+            675
+            923
+            931
+            936
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmslisten.cpp">
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            112
+            137
+            155
+            158
+            162
+            173
+            192
+            228
+            241
+            252
+            279
+            293
+            333
+            356
+            366
+            375
+            387
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbbasicpersonality\inc\debug.h">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidreportroot.cpp">
+            86
+            89
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\src\caiwprintingprovider.cpp">
+            97
+            99
+            110
+            130
+            132
+            147
+            167
+            172
+            182
+            193
+            209
+            219
+            235
+            246
+            259
+            271
+            272
+            280
+            291
+            310
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsrfcomm.cpp">
+            51
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\inc\debug.h">
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengregistrycleaner.cpp">
+            120
+            207
+            260
+            266
+            275
+            280
+            286
+            367
+            374
+            413
+            417
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericQueryNotifier.cpp">
+            103
+            120
+            136
+            236
+            273
+            282
+            295
+            334
+            378
+            381
+            416
+            426
+            436
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\debug.h">
+            74
+            89
+            100
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateCardReaderStatus.cpp">
+            39
+            52
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\src\USBClassChangeUIAppui.cpp">
+            43
+            58
+            69
+            79
+            91
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cstatemachine.cpp">
+            41
+            57
+            98
+            118
+            136
+            141
+            154
+            171
+            186
+            211
+            225
+            233
+            257
+            273
+            300
+            314
+            325
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            144
+            183
+            186
+            187
+            189
+            200
+            206
+            258
+            271
+            324
+            332
+            339
+            345
+            352
+            357
+            363
+            368
+            427
+            442
+            464
+            493
+            504
+            514
+            519
+            539
+            549
+            559
+            564
+            604
+            618
+            650
+            653
+            666
+            683
+            693
+            704
+            718
+            726
+            736
+            739
+            740
+            744
+            756
+            760
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\settingsview.cpp">
+            44
+            47
+            58
+            62
+            73
+            79
+            98
+            100
+            109
+            121
+            127
+            134
+            161
+            166
+            179
+            184
+            194
+            201
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\rptp.cpp">
+            38
+            67
+            78
+            88
+            108
+            120
+            143
+            155
+            166
+            168
+            178
+            180
+            192
+            196
+            206
+            208
+            220
+            229
+            231
+            243
+            250
+            252
+            267
+            271
+            282
+            284
+            294
+            298
+            308
+            312
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingcontainer.cpp">
+            69
+            137
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\settingscontainer.cpp">
+            60
+            87
+            99
+            113
+            129
+            141
+            146
+            156
+            171
+            182
+            194
+            218
+            228
+            239
+            244
+            246
+            258
+            261
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpstorage.cpp">
+            122
+            131
+            177
+            186
+            274
+            294
+            300
+            312
+            317
+            333
+            343
+            348
+            394
+            475
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDataWaiter.cpp">
+            46
+            48
+            57
+            64
+            75
+            78
+            84
+            90
+            93
+            103
+            106
+            113
+            117
+            127
+            130
+            135
+            143
+            153
+            156
+            161
+            167
+            188
+            194
+            203
+            207
+            217
+            222
+            244
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cep0writer.cpp">
+            32
+            60
+            93
+            114
+            122
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallinghandler.cpp">
+            61
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbDeviceLock.cpp">
+            46
+            53
+            70
+            84
+            107
+            113
+            132
+            137
+            142
+            157
+            172
+            192
+            200
+            206
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpimagehandler.cpp">
+            50
+            69
+            71
+            82
+            84
+            94
+            96
+            106
+            125
+            139
+            142
+            155
+            171
+            184
+            204
+            218
+            228
+            246
+            256
+            284
+            294
+            300
+            311
+            331
+            340
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmuidata.cpp">
+            43
+            54
+            57
+            72
+            85
+            98
+            157
+            169
+            185
+            206
+            228
+            250
+            272
+            295
+            372
+            397
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUXmlParser.cpp">
+            49
+            53
+            76
+            80
+            98
+            118
+            134
+            145
+            165
+            174
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsptpnotifier.cpp">
+            38
+            50
+            52
+            61
+            63
+            72
+            78
+            87
+            94
+            98
+            107
+            109
+            118
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\ptpclasscontroller\src\ptpclasscontroller.cpp">
+            75
+            103
+            113
+            128
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btpairedmodel.cpp">
+            368
+            454
+            644
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            205
+            210
+            218
+            233
+            247
+            251
+            259
+            270
+            286
+            327
+            395
+            397
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengclient.cpp">
+            48
+            55
+            61
+            72
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\imageprintuidebug.h">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamEndPoint.cpp">
+            107
+            119
+            132
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmonobearer\playercontrolistener.cpp">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cusbdevcon.cpp">
+            37
+            51
+            65
+            69
+            73
+            77
+            95
+            120
+            124
+            128
+            132
+            136
+            140
+            144
+            148
+            152
+            168
+            177
+            186
+            195
+            204
+            213
+            229
+            237
+            258
+            262
+            276
+            296
+            319
+            334
+            341
+            352
+            366
+            381
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActiveState.cpp">
+            47
+            50
+            92
+            98
+            125
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstatuswatcher.cpp">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstateconnect.cpp">
+            47
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\inc\debug.h">
+            82
+            97
+            108
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\crequestshandler.cpp">
+            37
+            53
+            72
+            101
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\src\locodservice.cpp">
+            67
+            81
+            88
+            94
+            109
+            120
+            133
+            146
+            155
+            172
+            178
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRClient.cpp">
+            61
+            95
+            150
+            192
+            231
+            242
+            305
+            317
+            346
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbbasicpersonality\src\CUsbActiveBasicHandler.cpp">
+            43
+            63
+            91
+            103
+            115
+            127
+            139
+            151
+            160
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSniffHandler.cpp">
+            37
+            44
+            49
+            53
+            58
+            69
+            84
+            92
+            96
+            104
+            108
+            113
+            117
+            122
+            133
+            136
+            143
+            147
+            161
+            165
+            171
+            175
+            187
+            194
+            199
+            203
+            208
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstate.cpp">
+            61
+            68
+            78
+            121
+            131
+            148
+            168
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSecurityHandler.cpp">
+            44
+            74
+            86
+            99
+            105
+            129
+            140
+            174
+            178
+            184
+            189
+            219
+            247
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\src\BTUIAppUi.cpp">
+            167
+            190
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStatePowerOff.cpp">
+            39
+            53
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\connectionmanager.cpp">
+            40
+            54
+            57
+            86
+            89
+            94
+            105
+            109
+            117
+            118
+            119
+            123
+            126
+            137
+            140
+            151
+            155
+            172
+            176
+            188
+            195
+            206
+            207
+            210
+            213
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateReset.cpp">
+            39
+            59
+            90
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\inc\debug.h">
+            74
+            89
+            100
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIRegistryWatcher.cpp">
+            124
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\inc\btaudiostreamerdebug.h">
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINMain.cpp">
+            45
+            63
+            71
+            95
+            100
+            122
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdevman\src\btengdevman.cpp">
+            56
+            170
+            195
+            228
+            240
+            344
+            349
+            360
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsusbnotifier.cpp">
+            44
+            62
+            64
+            73
+            80
+            89
+            94
+            103
+            113
+            129
+            138
+            140
+            149
+            163
+            172
+            197
+            206
+            221
+            230
+            244
+            253
+            255
+            264
+            274
+            293
+            302
+            304
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunNetDataport.cpp">
+            50
+            58
+            69
+            71
+            82
+            86
+            91
+            98
+            105
+            117
+            120
+            123
+            131
+            137
+            138
+            150
+            165
+            169
+            170
+            181
+            195
+            214
+            222
+            229
+            232
+            241
+            246
+            252
+            258
+            264
+            267
+            276
+            284
+            291
+            299
+            302
+            312
+            316
+            320
+            330
+            334
+            339
+            344
+            346
+            351
+            353
+            356
+            365
+            369
+            382
+            384
+            389
+            391
+            395
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvkeywatcher.cpp">
+            298
+            305
+            316
+            331
+            343
+            351
+            359
+            370
+            383
+            395
+            400
+            409
+            460
+            478
+            515
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccSession.cpp">
+            73
+            115
+            354
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbobexclasscontroller\src\CUsbObexClassController.cpp">
+            113
+            135
+            150
+            154
+            172
+            188
+            207
+            247
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaudiomanplugin.cpp">
+            128
+            163
+            292
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbpacketreader.cpp">
+            61
+            71
+            81
+            91
+            100
+            104
+            111
+            114
+            116
+            127
+            135
+            144
+            147
+            159
+            160
+            162
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\decode.cpp">
+            38
+            58
+            188
+            208
+            220
+            238
+            251
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateInit.cpp">
+            38
+            50
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcherServer.cpp">
+            49
+            56
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatedetach.cpp">
+            47
+            75
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\cusbglobalsystemstateobserver.cpp">
+            74
+            98
+            102
+            122
+            128
+            149
+            159
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\cusbdevconstarter.cpp">
+            37
+            60
+            79
+            84
+            94
+            100
+            110
+            112
+            123
+            129
+            150
+            154
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNMain.cpp">
+            54
+            114
+            125
+            139
+            147
+            152
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpstackstatelistener.cpp">
+            55
+            57
+            66
+            69
+            78
+            81
+            101
+            105
+            111
+            121
+            130
+            140
+            143
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectServer.cpp">
+            57
+            99
+            114
+            118
+            142
+            159
+            168
+            174
+            183
+            195
+            204
+            215
+            224
+            234
+            248
+            258
+            262
+            271
+            282
+            293
+            305
+            318
+            329
+            340
+            345
+            357
+            368
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvbbconnectionmgr.cpp">
+            192
+            204
+            320
+            337
+            362
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoCmdHandler.cpp">
+            68
+            90
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\eventmanager.cpp">
+            76
+            88
+            89
+            90
+            91
+            92
+            93
+            94
+            95
+            96
+            97
+            98
+            99
+            100
+            105
+            106
+            107
+            114
+            123
+            128
+            133
+            138
+            144
+            150
+            154
+            164
+            167
+            172
+            179
+            186
+            191
+            197
+            205
+            209
+            221
+            224
+            230
+            235
+            246
+            253
+            258
+            270
+            273
+            278
+            283
+            288
+            299
+            305
+            310
+            315
+            320
+            331
+            336
+            341
+            352
+            357
+            361
+            364
+            373
+            374
+            377
+            382
+            393
+            395
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\src\locodaemon.cpp">
+            68
+            71
+            73
+            97
+            161
+            171
+            175
+            179
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            123
+            150
+            187
+            201
+            217
+            231
+            249
+            264
+            278
+            292
+            306
+            318
+            334
+            340
+            354
+            377
+            453
+            519
+            527
+            537
+            555
+            576
+            596
+            635
+            645
+            649
+            656
+            659
+            677
+            697
+            714
+            725
+            733
+            748
+            824
+            855
+            867
+            908
+            929
+            948
+            961
+            1007
+            1021
+            1031
+            1035
+            1052
+            1062
+            1078
+            1142
+            1153
+            1169
+            1209
+            1213
+            1224
+            1256
+            1275
+            1294
+            1304
+            1323
+            1333
+            1342
+            1352
+            1378
+            1399
+            1404
+            1419
+            1432
+            1444
+            1450
+            1518
+            1578
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallstatus.cpp">
+            61
+            419
+            423
+            453
+            475
+            547
+            574
+            662
+            681
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunSignalCopy.cpp">
+            45
+            47
+            56
+            66
+            76
+            79
+            85
+            91
+            94
+            105
+            108
+            114
+            120
+            123
+            135
+            138
+            154
+            163
+            169
+            179
+            182
+            198
+            203
+            204
+            207
+            213
+            219
+            229
+            232
+            245
+            250
+            270
+            272
+            281
+            289
+            298
+            311
+            320
+            325
+            329
+            334
+            339
+            343
+            348
+            353
+            363
+            368
+            372
+            377
+            382
+            386
+            391
+            396
+            401
+            407
+            412
+            416
+            421
+            425
+            434
+            440
+            449
+            455
+            464
+            477
+            487
+            492
+            509
+            511
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIPairedDevicesView.cpp">
+            107
+            127
+            216
+            221
+            225
+            435
+            462
+            848
+            1065
+            1076
+            1097
+            1103
+            1147
+            1171
+            1193
+            1219
+            1261
+            1539
+            1650
+            1651
+            1652
+            1653
+            1668
+            1673
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\src\caiwimageprintIf.cpp">
+            108
+            121
+            125
+            138
+            148
+            159
+            167
+            179
+            194
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccPlugin.cpp">
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsaudio.cpp">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStatePowerOn.cpp">
+            39
+            59
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsyncsock.cpp">
+            149
+            169
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpdatahandler.cpp">
+            59
+            62
+            72
+            76
+            88
+            113
+            123
+            161
+            171
+            203
+            214
+            236
+            249
+            261
+            276
+            323
+            334
+            343
+            354
+            367
+            382
+            383
+            384
+            385
+            395
+            397
+            401
+            404
+            430
+            442
+            464
+            475
+            479
+            501
+            508
+            532
+            551
+            668
+            673
+            783
+            797
+            818
+            827
+            855
+            867
+            894
+            905
+            999
+            1011
+            1085
+            1129
+            1160
+            1210
+            1227
+            1239
+            1252
+            1253
+            1265
+            1276
+            1286
+            1294
+            1308
+            1318
+            1323
+            1344
+            1389
+            1546
+            1547
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\emptycontainer.cpp">
+            49
+            59
+            70
+            84
+            100
+            112
+            128
+            137
+            144
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacActivePacketDropIoctl.cpp">
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPImageHandler.cpp">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\inc\USBUINotifDebug.h">
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            55
+            61
+            72
+            79
+            90
+            104
+            122
+            136
+            150
+            182
+            211
+            223
+            261
+            296
+            391
+            403
+            483
+            507
+            515
+            530
+            539
+            544
+            549
+            570
+            622
+            635
+            648
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoRequester.cpp">
+            126
+            135
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSimCardStatusNotifier.cpp">
+            45
+            76
+            86
+            98
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmstate.cpp">
+            146
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\btkeyenumtextsettingitem.cpp">
+            59
+            94
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUIConnectionNotifier.cpp">
+            44
+            50
+            62
+            71
+            76
+            86
+            90
+            101
+            135
+            171
+            182
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsentryhandler.cpp">
+            81
+            96
+            110
+            118
+            131
+            146
+            160
+            168
+            182
+            191
+            202
+            207
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\codestore.cpp">
+            49
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcvolume.cpp">
+            63
+            67
+            77
+            93
+            121
+            129
+            186
+            206
+            230
+            249
+            258
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIBlockedDevicesView.cpp">
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\ATCodec\atccommand.cpp">
+            209
+            214
+            261
+            264
+            454
+            483
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapState.cpp">
+            44
+            50
+            56
+            62
+            82
+            125
+            134
+            140
+            151
+            162
+            167
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamsendersbc.cpp">
+            36
+            37
+            46
+            52
+            62
+            63
+            74
+            76
+            88
+            104
+            105
+            106
+            107
+            108
+            109
+            112
+            120
+            127
+            132
+            133
+            145
+            148
+            160
+            166
+            175
+            177
+            183
+            190
+            195
+            196
+            203
+            204
+            210
+            216
+            226
+            227
+            230
+            231
+            237
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            114
+            130
+            141
+            280
+            288
+            294
+            373
+            426
+            499
+            550
+            551
+            599
+            640
+            644
+            709
+            768
+            779
+            900
+            909
+            1095
+            1185
+            1193
+            1231
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapHciExtensionMan.cpp">
+            81
+            87
+            96
+            118
+            129
+            138
+            163
+            167
+            181
+            219
+            229
+            231
+            268
+            270
+            279
+            298
+            305
+            323
+            338
+            347
+            356
+            376
+            378
+            397
+            403
+            426
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextsession.cpp">
+            71
+            176
+            257
+            318
+            331
+            366
+            424
+            429
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvsdpquery.cpp">
+            227
+            261
+            270
+            276
+            282
+            288
+            294
+            312
+            319
+            325
+            329
+            337
+            343
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmman.cpp">
+            90
+            95
+            170
+            190
+            259
+            272
+            282
+            296
+            314
+            327
+            359
+            385
+            418
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstateattach.cpp">
+            47
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmpasskey.cpp">
+            64
+            79
+            93
+            110
+            115
+            144
+            151
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\inc\debug.h">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccClient.cpp">
+            57
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateATR.cpp">
+            39
+            53
+            69
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\src\lcstylustap.cpp">
+            125
+            165
+            178
+            201
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\RUsbWatcher.cpp">
+            60
+            73
+            85
+            96
+            108
+            119
+            131
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\btuipluginman.cpp">
+            120
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\dunclient.cpp">
+            35
+            44
+            74
+            94
+            99
+            109
+            110
+            122
+            137
+            143
+            147
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\debug.h">
+            65
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdinterrupthandler.cpp">
+            62
+            68
+            77
+            84
+            95
+            106
+            116
+            118
+            128
+            130
+            141
+            163
+            164
+            165
+            166
+            171
+            175
+            181
+            190
+            195
+            207
+            223
+            224
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            182
+            213
+            500
+            508
+            579
+            583
+            629
+            636
+            657
+            663
+            722
+            733
+            744
+            752
+            1015
+            1020
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\bt\debug.h">
+            75
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsmmain.cpp">
+            37
+            49
+            68
+            88
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\notes.cpp">
+            56
+            58
+            69
+            72
+            78
+            82
+            102
+            109
+            112
+            124
+            130
+            139
+            142
+            145
+            147
+            149
+            159
+            172
+            174
+            183
+            193
+            197
+            202
+            205
+            214
+            215
+            220
+            250
+            255
+            259
+            263
+            267
+            278
+            303
+            306
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbConfig.cpp">
+            48
+            50
+            74
+            77
+            85
+            93
+            104
+            114
+            117
+            124
+            134
+            137
+            143
+            168
+            175
+            198
+            203
+            210
+            216
+            220
+            231
+            238
+            245
+            283
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btregistryobserver.cpp">
+            122
+            160
+            183
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\inc\debug.h">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\iractivatewatcher.cpp">
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btpsmplugin\src\btpsmplugin.cpp">
+            142
+            146
+            189
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\inc\USBClassChangeUIDebug.h">
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsaController.cpp">
+            72
+            85
+            124
+            141
+            183
+            197
+            223
+            242
+            245
+            262
+            270
+            293
+            312
+            315
+            335
+            354
+            357
+            417
+            440
+            507
+            511
+            516
+            521
+            526
+            622
+            634
+            647
+            667
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\src\cselectedpersonalityproperty.cpp">
+            31
+            47
+            54
+            76
+            90
+            103
+            125
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\inc\debug.h">
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccman.cpp">
+            243
+            258
+            285
+            287
+            374
+            397
+            401
+            415
+            477
+            508
+            523
+            538
+            555
+            581
+            619
+            641
+            711
+            766
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\src\Pbapplugin.cpp">
+            74
+            80
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunUpstream.cpp">
+            52
+            54
+            88
+            93
+            107
+            110
+            118
+            124
+            134
+            137
+            142
+            147
+            157
+            161
+            170
+            175
+            183
+            194
+            223
+            228
+            255
+            259
+            266
+            270
+            281
+            286
+            291
+            294
+            301
+            311
+            324
+            333
+            336
+            345
+            356
+            383
+            407
+            426
+            432
+            443
+            451
+            456
+            467
+            474
+            484
+            491
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\inc\debug.h">
+            74
+            89
+            100
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\imageprintuiappui.cpp">
+            59
+            96
+            126
+            143
+            154
+            158
+            166
+            170
+            182
+            192
+            193
+            194
+            197
+            202
+            207
+            211
+            219
+            220
+            221
+            222
+            230
+            233
+            240
+            247
+            250
+            253
+            262
+            268
+            273
+            276
+            281
+            294
+            295
+            299
+            303
+            308
+            317
+            322
+            328
+            334
+            339
+            343
+            348
+            352
+            356
+            359
+            367
+            372
+            381
+            386
+            391
+            394
+            406
+            416
+            417
+            421
+            432
+            437
+            441
+            446
+            451
+            457
+            460
+            465
+            470
+            476
+            480
+            485
+            490
+            500
+            510
+            513
+            519
+            525
+            531
+            536
+            547
+            556
+            565
+            574
+            591
+            605
+            619
+            626
+            636
+            653
+            663
+            675
+            680
+            689
+            704
+            714
+            722
+            723
+            734
+            747
+            753
+            758
+            771
+            793
+            804
+            814
+            833
+            834
+            836
+            845
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\src\genericactive.cpp">
+            49
+            70
+            75
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlgenerator.cpp">
+            41
+            52
+            62
+            73
+            82
+            110
+            114
+            123
+            128
+            137
+            142
+            151
+            157
+            167
+            186
+            195
+            201
+            212
+            222
+            232
+            240
+            249
+            256
+            267
+            300
+            310
+            316
+            326
+            333
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbconnector.cpp">
+            65
+            76
+            84
+            89
+            100
+            108
+            118
+            121
+            127
+            150
+            158
+            165
+            172
+            179
+            186
+            193
+            201
+            208
+            217
+            221
+            232
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunAtCmdHandler.cpp">
+            92
+            106
+            115
+            117
+            120
+            138
+            142
+            152
+            156
+            164
+            174
+            180
+            190
+            196
+            217
+            224
+            230
+            253
+            276
+            285
+            288
+            296
+            307
+            312
+            318
+            326
+            336
+            338
+            348
+            360
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\inc\USBClassChangeUIPluginDebug.h">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\ir\debug.h">
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\UsbWatcher.cpp">
+            67
+            83
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\emptyview.cpp">
+            45
+            47
+            57
+            60
+            71
+            75
+            86
+            92
+            103
+            115
+            117
+            129
+            134
+            144
+            151
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifierAccFw.cpp">
+            34
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\ATCodec\atcparam.cpp">
+            43
+            50
+            126
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunChanMan.cpp">
+            54
+            56
+            65
+            76
+            85
+            87
+            97
+            109
+            122
+            128
+            136
+            149
+            158
+            167
+            171
+            181
+            191
+            195
+            205
+            215
+            219
+            232
+            253
+            260
+            266
+            274
+            279
+            283
+            295
+            307
+            311
+            337
+            342
+            351
+            356
+            366
+            369
+            386
+            397
+            402
+            411
+            420
+            424
+            432
+            440
+            442
+            453
+            467
+            488
+            499
+            505
+            535
+            545
+            550
+            563
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceAPI.cpp">
+            47
+            68
+            73
+            83
+            87
+            97
+            102
+            105
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\ir\DunIrPlugin.cpp">
+            45
+            47
+            65
+            68
+            75
+            83
+            87
+            98
+            103
+            106
+            117
+            122
+            125
+            135
+            140
+            146
+            151
+            160
+            172
+            195
+            204
+            220
+            231
+            234
+            239
+            249
+            256
+            263
+            270
+            277
+            282
+            285
+            299
+            303
+            307
+            309
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            130
+            159
+            180
+            264
+            276
+            280
+            305
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamsender.cpp">
+            34
+            36
+            45
+            48
+            51
+            54
+            61
+            70
+            75
+            85
+            108
+            119
+            121
+            131
+            136
+            143
+            165
+            175
+            177
+            187
+            190
+            198
+            207
+            213
+            214
+            229
+            233
+            241
+            244
+            257
+            270
+            274
+            277
+            286
+            300
+            302
+            313
+            322
+            326
+            329
+            332
+            340
+            347
+            356
+            361
+            365
+            374
+            376
+            377
+            415
+            420
+            428
+            430
+            440
+            451
+            452
+            457
+            460
+            477
+            483
+            485
+            490
+            495
+            511
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidcenrepwatcher.cpp">
+            52
+            59
+            79
+            84
+            94
+            106
+            116
+            126
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstateattached.cpp">
+            61
+            154
+            171
+            403
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnecting.cpp">
+            70
+            114
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpdeviceinfo.cpp">
+            60
+            161
+            171
+            183
+            225
+            323
+            333
+            392
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketinitiator.cpp">
+            69
+            81
+            125
+            143
+            191
+            200
+            217
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\capabilitymanager.cpp">
+            42
+            59
+            70
+            98
+            110
+            113
+            120
+            126
+            127
+            129
+            131
+            143
+            158
+            168
+            174
+            179
+            186
+            191
+            194
+            205
+            210
+            220
+            225
+            235
+            242
+            251
+            272
+            274
+            283
+            309
+            312
+            322
+            326
+            331
+            337
+            342
+            348
+            357
+            374
+            377
+            415
+            423
+            424
+            435
+            442
+            445
+            457
+            465
+            466
+            477
+            484
+            487
+            498
+            505
+            506
+            516
+            524
+            533
+            538
+            550
+            564
+            565
+            568
+            574
+            588
+            589
+            592
+            599
+            613
+            614
+            617
+            623
+            643
+            653
+            672
+            679
+            684
+            688
+            697
+            712
+            729
+            745
+            748
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqNotifier.cpp">
+            63
+            66
+            75
+            91
+            110
+            120
+            126
+            136
+            146
+            149
+            153
+            162
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\usbuinotifcrwatcher.cpp">
+            36
+            53
+            56
+            85
+            98
+            106
+            118
+            124
+            134
+            136
+            146
+            156
+            167
+            174
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSURefObjectResolver.cpp">
+            87
+            90
+            101
+            104
+            120
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdbaseclass.cpp">
+            52
+            70
+            96
+            126
+            136
+            151
+            157
+            162
+            177
+            189
+            201
+            212
+            238
+            248
+            249
+            262
+            267
+            284
+            289
+            324
+            326
+            331
+            341
+            355
+            360
+            366
+            376
+            379
+            382
+            387
+            389
+            401
+            404
+            410
+            413
+            425
+            427
+            438
+            442
+            452
+            468
+            478
+            481
+            492
+            500
+            511
+            519
+            521
+            532
+            551
+            560
+            574
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcphonestatus.cpp">
+            212
+            350
+            369
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIViewsCommonUtils.cpp">
+            52
+            68
+            92
+            112
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmssniffm.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginView.cpp">
+            49
+            59
+            72
+            82
+            94
+            122
+            131
+            171
+            197
+            242
+            256
+            274
+            283
+            293
+            303
+            309
+            424
+            428
+            439
+            455
+            466
+            497
+            509
+            549
+            562
+            588
+            598
+            608
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketHandler.cpp">
+            60
+            68
+            98
+            113
+            124
+            169
+            192
+            213
+            225
+            234
+            243
+            256
+            312
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginCRWatcher.cpp">
+            40
+            57
+            60
+            89
+            102
+            110
+            122
+            128
+            138
+            140
+            150
+            160
+            171
+            178
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbwriter.cpp">
+            62
+            74
+            84
+            98
+            114
+            136
+            147
+            153
+            157
+            177
+            178
+            179
+            188
+            189
+            190
+            203
+            213
+            222
+            223
+            224
+            225
+            235
+            240
+            245
+            252
+            258
+            271
+            282
+            286
+            288
+            292
+            295
+            337
+            351
+            352
+            353
+            354
+            399
+            411
+            413
+            414
+            418
+            419
+            420
+            424
+            428
+            434
+            440
+            443
+            447
+            457
+            460
+            470
+            477
+            487
+            488
+            492
+            507
+            510
+            519
+            532
+            554
+            564
+            567
+            571
+            574
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\imageprintuidocument.cpp">
+            47
+            52
+            55
+            65
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpstransaction.cpp">
+            54
+            69
+            78
+            82
+            91
+            101
+            110
+            111
+            123
+            132
+            142
+            158
+            167
+            187
+            234
+            243
+            259
+            264
+            290
+            293
+            300
+            303
+            349
+            352
+            359
+            365
+            375
+            395
+            415
+            422
+            442
+            455
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectRequest.cpp">
+            80
+            92
+            115
+            121
+            130
+            140
+            153
+            161
+            166
+            175
+            181
+            186
+            195
+            203
+            208
+            215
+            232
+            240
+            247
+            272
+            286
+            295
+            304
+            311
+            322
+            331
+            343
+            352
+            365
+            409
+            413
+            449
+            450
+            471
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\bt\DunBtPlugin.cpp">
+            46
+            48
+            58
+            61
+            66
+            84
+            87
+            93
+            105
+            115
+            120
+            123
+            134
+            139
+            142
+            152
+            196
+            205
+            208
+            224
+            234
+            245
+            255
+            263
+            268
+            278
+            286
+            291
+            303
+            314
+            318
+            345
+            349
+            359
+            367
+            377
+            384
+            391
+            398
+            405
+            410
+            413
+            429
+            439
+            446
+            470
+            476
+            484
+            493
+            500
+            520
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpstack.cpp">
+            69
+            77
+            113
+            122
+            130
+            135
+            147
+            158
+            239
+            243
+            246
+            286
+            290
+            293
+            305
+            326
+            345
+            351
+            355
+            368
+            376
+            431
+            444
+            656
+            667
+            700
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cusbstatewatcher.cpp">
+            30
+            111
+            120
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\dunactive.cpp">
+            61
+            63
+            72
+            78
+            102
+            104
+            123
+            126
+            136
+            137
+            148
+            149
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcbattery.cpp">
+            86
+            93
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptplistcontrol.cpp">
+            174
+            178
+            179
+            180
+            184
+            188
+            195
+            199
+            208
+            209
+            210
+            215
+            219
+            227
+            231
+            245
+            260
+            270
+            285
+            296
+            299
+            300
+            304
+            317
+            327
+            341
+            346
+            361
+            367
+            371
+            381
+            429
+            442
+            461
+            467
+            512
+            609
+            612
+            623
+            644
+            725
+            913
+            931
+            1006
+            1009
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatequery.cpp">
+            47
+            100
+            166
+            171
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericInfoNotifier.cpp">
+            90
+            93
+            108
+            202
+            268
+            277
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketreader.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamerController.cpp">
+            88
+            131
+            138
+            148
+            174
+            191
+            202
+            223
+            229
+            285
+            330
+            368
+            406
+            433
+            460
+            479
+            481
+            491
+            522
+            546
+            547
+            552
+            561
+            564
+            566
+            576
+            604
+            623
+            646
+            647
+            648
+            649
+            650
+            651
+            652
+            664
+            678
+            699
+            700
+            701
+            719
+            721
+            723
+            724
+            726
+            727
+            735
+            736
+            761
+            769
+            782
+            796
+            804
+            807
+            818
+            837
+            885
+            891
+            897
+            903
+            907
+            933
+            983
+            984
+            987
+            989
+            1003
+            1009
+            1013
+            1027
+            1033
+            1039
+            1045
+            1049
+            1064
+            1070
+            1076
+            1082
+            1086
+            1112
+            1140
+            1146
+            1150
+            1304
+            1315
+            1329
+            1332
+            1359
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\requestmanager.cpp">
+            54
+            63
+            102
+            105
+            114
+            115
+            125
+            126
+            132
+            137
+            142
+            147
+            152
+            157
+            161
+            167
+            170
+            182
+            185
+            189
+            194
+            206
+            208
+            217
+            241
+            252
+            258
+            264
+            268
+            279
+            292
+            307
+            313
+            318
+            325
+            331
+            339
+            355
+            359
+            364
+            368
+            376
+            379
+            384
+            397
+            401
+            406
+            410
+            435
+            439
+            449
+            455
+            460
+            465
+            468
+            479
+            495
+            507
+            517
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunAtUrcHandler.cpp">
+            57
+            64
+            73
+            76
+            83
+            93
+            96
+            102
+            125
+            131
+            151
+            156
+            161
+            169
+            188
+            190
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBIPController.cpp">
+            79
+            96
+            129
+            149
+            157
+            162
+            172
+            185
+            196
+            207
+            217
+            255
+            264
+            308
+            315
+            324
+            350
+            414
+            445
+            478
+            494
+            503
+            538
+            550
+            672
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\inc\debug.h">
+            74
+            89
+            100
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccVolumeLevelController.cpp">
+            108
+            113
+            151
+            164
+            168
+            180
+            187
+            217
+            223
+            229
+            235
+            242
+            281
+            288
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\genericactive.cpp">
+            49
+            70
+            75
+            77
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btbearer\src\btpluginnotifier.cpp">
+            67
+            69
+            77
+            151
+            162
+            170
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengsettings\src\btengsettings.cpp">
+            57
+            222
+            225
+            237
+            247
+            257
+            269
+            274
+            350
+            352
+            376
+            386
+            388
+            423
+            436
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBNotifier.cpp">
+            49
+            65
+            83
+            92
+            110
+            120
+            131
+            142
+            156
+            164
+            174
+            176
+            199
+            210
+            220
+            232
+            238
+            245
+            255
+            262
+            273
+            287
+            290
+            300
+            303
+            305
+            308
+            310
+            312
+            317
+            320
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcmobileline.cpp">
+            109
+            117
+            153
+            229
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpobject.cpp">
+            48
+            60
+            136
+            138
+            148
+            157
+            167
+            169
+            179
+            188
+            223
+            240
+            268
+            286
+            311
+            318
+            320
+            401
+            406
+            420
+            442
+            452
+            454
+            474
+            480
+            484
+            492
+            505
+            608
+            619
+            622
+            633
+            663
+            676
+            678
+            682
+            686
+            688
+            691
+            695
+            704
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\src\DunServer.cpp">
+            42
+            52
+            58
+            82
+            98
+            113
+            123
+            127
+            138
+            142
+            153
+            155
+            165
+            169
+            172
+            176
+            187
+            194
+            198
+            214
+            223
+            241
+            250
+            257
+            261
+            265
+            269
+            273
+            276
+            281
+            293
+            310
+            313
+            318
+            321
+            331
+            350
+            361
+            373
+            376
+            377
+            389
+            401
+            404
+            408
+            412
+            413
+            425
+            437
+            440
+            444
+            453
+            457
+            458
+            469
+            473
+            479
+            490
+            492
+            503
+            515
+            518
+            525
+            533
+            539
+            542
+            543
+            554
+            558
+            561
+            572
+            576
+            579
+            595
+            607
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\debug.h">
+            77
+            85
+            100
+            128
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpserver.cpp">
+            51
+            56
+            67
+            73
+            83
+            95
+            111
+            116
+            119
+            130
+            143
+            153
+            156
+            161
+            171
+            173
+            177
+            180
+            191
+            200
+            213
+            218
+            229
+            241
+            254
+            257
+            267
+            280
+            290
+            300
+            322
+            332
+            338
+            342
+            345
+            350
+            360
+            368
+            377
+            388
+            402
+            413
+            416
+            430
+            442
+            443
+            457
+            460
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcher.cpp">
+            63
+            73
+            76
+            79
+            80
+            85
+            89
+            111
+            125
+            164
+            197
+            212
+            229
+            234
+            277
+            282
+            298
+            311
+            347
+            356
+            367
+            377
+            382
+            394
+            406
+            444
+            467
+            475
+            492
+            505
+            513
+            524
+            532
+            544
+            586
+            588
+            608
+            626
+            658
+            675
+            704
+            716
+            730
+            736
+            745
+            757
+            768
+            784
+            792
+            802
+            814
+            826
+            835
+            838
+            854
+            859
+            870
+            873
+            883
+            891
+            901
+            912
+            926
+            979
+            985
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpmsghandler.cpp">
+            42
+            45
+            57
+            68
+            99
+            100
+            101
+            102
+            103
+            104
+            105
+            106
+            107
+            108
+            110
+            126
+            130
+            140
+            144
+            147
+            149
+            160
+            170
+            173
+            181
+            183
+            187
+            190
+            203
+            212
+            214
+            220
+            224
+            236
+            242
+            252
+            262
+            264
+            268
+            274
+            277
+            287
+            290
+            295
+            300
+            303
+            310
+            319
+            324
+            331
+            337
+            349
+            359
+            366
+            376
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfiguring.cpp">
+            79
+            86
+            155
+            176
+            196
+            205
+            216
+            221
+            229
+            230
+            231
+            232
+            233
+            234
+            235
+            238
+            247
+            262
+            290
+            299
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\inc\debug.h">
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketStateCheckSecurity.cpp">
+            40
+            51
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunTransUtils.cpp">
+            75
+            80
+            89
+            109
+            118
+            133
+            148
+            155
+            160
+            168
+            173
+            177
+            189
+            196
+            201
+            204
+            217
+            224
+            229
+            232
+            244
+            251
+            256
+            259
+            271
+            278
+            283
+            286
+            295
+            300
+            307
+            320
+            330
+            335
+            342
+            352
+            362
+            367
+            373
+            386
+            396
+            408
+            419
+            428
+            431
+            447
+            453
+            457
+            464
+            474
+            477
+            483
+            492
+            504
+            613
+            629
+            634
+            667
+            677
+            718
+            733
+            737
+            743
+            752
+            764
+            780
+            784
+            795
+            799
+            805
+            811
+            816
+            841
+            852
+            856
+            863
+            869
+            874
+            898
+            909
+            915
+            920
+            925
+            949
+            960
+            964
+            969
+            975
+            980
+            983
+            998
+            1014
+            1020
+            1031
+            1041
+            1045
+            1056
+            1059
+            1071
+            1075
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketlistener.cpp">
+            79
+            89
+            125
+            158
+            173
+            182
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsscriptreceiver.cpp">
+            39
+            52
+            55
+            64
+            66
+            75
+            82
+            115
+            131
+            146
+            149
+            158
+            160
+            169
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\ecom\BtnotifWrapper.cpp">
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbPlugin.cpp">
+            54
+            56
+            74
+            77
+            83
+            102
+            111
+            113
+            120
+            124
+            133
+            138
+            147
+            151
+            161
+            166
+            173
+            197
+            201
+            211
+            214
+            228
+            234
+            237
+            247
+            250
+            279
+            300
+            305
+            308
+            319
+            324
+            327
+            337
+            340
+            347
+            361
+            371
+            387
+            398
+            406
+            411
+            422
+            430
+            435
+            445
+            454
+            459
+            470
+            473
+            478
+            488
+            495
+            502
+            509
+            516
+            521
+            524
+            535
+            538
+            545
+            552
+            557
+            568
+            571
+            580
+            588
+            602
+            608
+            621
+            628
+            641
+            648
+            658
+            673
+            684
+            691
+            705
+            719
+            722
+            733
+            740
+            748
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateAPDU.cpp">
+            37
+            43
+            48
+            53
+            63
+            65
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irtimer.cpp">
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSController.cpp">
+            44
+            54
+            59
+            71
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmuidata.cpp">
+            37
+            48
+            51
+            60
+            66
+            77
+            89
+            142
+            153
+            168
+            188
+            209
+            230
+            251
+            273
+            345
+            369
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmuidll.cpp">
+            38
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateConnect.cpp">
+            45
+            84
+            124
+            138
+            169
+            176
+            185
+            193
+            205
+            209
+            214
+            225
+            237
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            64
+            80
+            90
+            102
+            112
+            114
+            124
+            128
+            139
+            146
+            156
+            161
+            163
+            184
+            188
+            191
+            195
+            196
+            201
+            205
+            211
+            215
+            233
+            235
+            246
+            254
+            266
+            281
+            285
+            294
+            304
+            307
+            319
+            321
+            324
+            335
+            338
+            348
+            359
+            369
+            373
+            378
+            379
+            380
+            384
+            385
+            386
+            391
+            396
+            400
+            410
+            437
+            438
+            441
+            454
+            464
+            469
+            481
+            483
+            496
+            497
+            499
+            509
+            511
+            515
+            518
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usblocodplugin\src\usblcdactive.cpp">
+            77
+            83
+            93
+            98
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbMscPersonalityTimer.cpp">
+            31
+            38
+            45
+            52
+            62
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacactive.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmrfcommsock.cpp">
+            215
+            223
+            232
+            254
+            275
+            290
+            301
+            319
+            325
+            330
+            335
+            340
+            345
+            349
+            354
+            359
+            364
+            369
+            374
+            406
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatedisconnect.cpp">
+            40
+            61
+            65
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcactive.cpp">
+            81
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcherSession.cpp">
+            43
+            59
+            69
+            108
+            112
+            119
+            131
+            138
+            142
+            153
+            159
+            182
+            201
+            219
+            230
+            265
+            271
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvactive.cpp">
+            58
+            74
+            80
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUPassKeyRequest.cpp">
+            44
+            49
+            58
+            63
+            72
+            80
+            90
+            99
+            112
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccServer.cpp">
+            174
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobalprogressdialog.cpp">
+            228
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUImageConverter.cpp">
+            54
+            60
+            84
+            89
+            98
+            104
+            116
+            125
+            134
+            171
+            183
+            198
+            207
+            211
+            220
+            244
+            254
+            292
+            301
+            329
+            338
+            348
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsstatemachine.cpp">
+            42
+            56
+            68
+            79
+            81
+            90
+            99
+            108
+            113
+            122
+            130
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnected.cpp">
+            106
+            162
+            201
+            256
+            292
+            298
+            309
+            314
+            320
+            321
+            322
+            323
+            324
+            325
+            326
+            330
+            338
+            349
+            360
+            361
+            407
+            440
+            451
+            472
+            478
+            485
+            513
+            518
+            531
+            554
+            567
+            578
+            625
+            653
+            662
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamer.cpp">
+            35
+            36
+            45
+            50
+            60
+            61
+            70
+            72
+            81
+            88
+            95
+            98
+            108
+            111
+            115
+            122
+            132
+            140
+            149
+            155
+            162
+            165
+            171
+            181
+            183
+            189
+            191
+            196
+            197
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilspropertynotifier.cpp">
+            33
+            38
+            54
+            65
+            74
+            77
+            82
+            86
+            97
+            106
+            116
+            123
+            126
+            128
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINQueriesNotifierMdrv.cpp">
+            46
+            83
+            88
+            100
+            119
+            131
+            159
+            169
+            200
+            210
+            219
+            230
+            255
+            263
+            268
+            271
+            283
+            290
+            298
+            307
+            316
+            320
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateDisconnect.cpp">
+            39
+            52
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunTransporter.cpp">
+            52
+            54
+            64
+            76
+            87
+            90
+            94
+            106
+            118
+            130
+            133
+            137
+            147
+            148
+            164
+            167
+            174
+            180
+            196
+            202
+            208
+            214
+            219
+            228
+            238
+            241
+            255
+            264
+            269
+            276
+            284
+            291
+            296
+            306
+            311
+            324
+            329
+            341
+            347
+            355
+            366
+            372
+            382
+            387
+            394
+            402
+            409
+            413
+            424
+            429
+            436
+            443
+            447
+            464
+            473
+            484
+            499
+            509
+            521
+            529
+            538
+            550
+            558
+            573
+            578
+            588
+            596
+            607
+            617
+            621
+            647
+            652
+            661
+            665
+            677
+            687
+            707
+            716
+            722
+            726
+            736
+            739
+            759
+            765
+            771
+            774
+            785
+            789
+            803
+            806
+            810
+            821
+            825
+            828
+            838
+            841
+            847
+            850
+            860
+            874
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\inc\hidlayoutplugininterface.h">
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\cremotepersonalityhandler.cpp">
+            89
+            115
+            127
+            143
+            157
+            172
+            177
+            220
+            238
+            250
+            256
+            267
+            273
+            281
+            300
+            331
+            344
+            352
+            368
+            383
+            392
+            398
+            413
+            419
+            454
+            460
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateStreaming.cpp">
+            80
+            100
+            129
+            135
+            141
+            167
+            171
+            187
+            210
+            214
+            235
+            239
+            256
+            261
+            272
+            279
+            299
+            306
+            334
+            364
+            396
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\ir\obexsmirdaconnection.cpp">
+            55
+            59
+            66
+            72
+            75
+            84
+            103
+            136
+            142
+            154
+            161
+            167
+            180
+            182
+            196
+            205
+            219
+            231
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpsession.cpp">
+            38
+            41
+            52
+            54
+            64
+            67
+            70
+            80
+            82
+            92
+            146
+            166
+            168
+            178
+            184
+            194
+            200
+            210
+            211
+            217
+            227
+            231
+            241
+            243
+            253
+            289
+            292
+            296
+            309
+            319
+            329
+            331
+            337
+            348
+            358
+            360
+            365
+            367
+            382
+            395
+            405
+            411
+            424
+            436
+            442
+            444
+            455
+            458
+            463
+            465
+            475
+            482
+            484
+            494
+            498
+            503
+            505
+            515
+            528
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            124
+            152
+            186
+            198
+            224
+            245
+            286
+            292
+            298
+            317
+            345
+            374
+            410
+            457
+            493
+            704
+            735
+            744
+            760
+            767
+            771
+            793
+            807
+            829
+            873
+            901
+            1057
+            1114
+            1144
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\src\bthidengplugin.cpp">
+            170
+            204
+            285
+            347
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateIdle.cpp">
+            40
+            53
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketStateListen.cpp">
+            40
+            61
+            69
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsreconnect.cpp">
+            52
+            121
+            180
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvpluginman.cpp">
+            104
+            119
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\atextagent.cpp">
+            50
+            82
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmbtconnection.cpp">
+            54
+            59
+            68
+            74
+            80
+            86
+            91
+            101
+            121
+            154
+            160
+            163
+            167
+            171
+            181
+            214
+            234
+            236
+            242
+            249
+            257
+            272
+            284
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcprotocol.cpp">
+            192
+            203
+            327
+            334
+            341
+            388
+            397
+            763
+            770
+            775
+            880
+            1073
+            1098
+            1121
+            1148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmonobearer\bmbcmdlistener.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsfile.cpp">
+            37
+            51
+            53
+            62
+            64
+            74
+            77
+            86
+            98
+            108
+            114
+            123
+            129
+            138
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            65
+            74
+            100
+            128
+            148
+            187
+            199
+            276
+            354
+            366
+            379
+            388
+            407
+            444
+            475
+            493
+            504
+            524
+            583
+            584
+            593
+            598
+            605
+            638
+            669
+            670
+            695
+            725
+            810
+            834
+            885
+            898
+            942
+            961
+            1014
+            1022
+            1034
+            1047
+            1073
+            1075
+            1092
+            1160
+            1201
+            1227
+            1237
+            1242
+            1254
+            1280
+            1374
+            1392
+            1404
+            1417
+            1424
+            1436
+            1443
+            1466
+            1478
+            1486
+            1494
+            1502
+            1510
+            1518
+            1542
+            1552
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\notetimer.cpp">
+            37
+            60
+            62
+            81
+            93
+            98
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPController.cpp">
+            60
+            88
+            125
+            139
+            144
+            153
+            176
+            192
+            199
+            208
+            218
+            224
+            233
+            254
+            263
+            275
+            284
+            301
+            310
+            325
+            329
+            338
+            354
+            387
+            394
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityNotifier.cpp">
+            41
+            61
+            81
+            139
+            143
+            150
+            165
+            201
+            230
+            235
+            239
+            249
+            258
+            271
+            275
+            292
+            301
+            308
+            312
+            325
+            334
+            347
+            358
+            367
+            387
+            395
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\vMessageHandler.cpp">
+            46
+            56
+            89
+            100
+            144
+            159
+            174
+            222
+            249
+            353
+            370
+            394
+            417
+            437
+            512
+            522
+            614
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRSSProvider.cpp">
+            107
+            115
+            124
+            152
+            158
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccplayerstarter.cpp">
+            107
+            122
+            131
+            203
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\inc\debug.h">
+            82
+            97
+            108
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            171
+            253
+            262
+            273
+            367
+            390
+            407
+            413
+            439
+            460
+            482
+            496
+            527
+            545
+            555
+            592
+            618
+            679
+            717
+            751
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketStateRecv.cpp">
+            42
+            58
+            59
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsconnect.cpp">
+            58
+            141
+            162
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengdevicesearch.cpp">
+            197
+            218
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\usb\debug.h">
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            146
+            154
+            162
+            184
+            190
+            197
+            202
+            205
+            213
+            234
+            254
+            339
+            362
+            447
+            453
+            460
+            497
+            537
+            564
+            592
+            657
+            686
+            694
+            705
+            740
+            842
+            880
+            1052
+            1123
+            1180
+            1326
+            1401
+            1440
+            1512
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfigured.cpp">
+            71
+            103
+            152
+            203
+            253
+            257
+            275
+            296
+            325
+            344
+            361
+            378
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsopenaudio.cpp">
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsServiceManager.cpp">
+            82
+            172
+            177
+            182
+            187
+            193
+            207
+            216
+            219
+            233
+            239
+            245
+            251
+            263
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\src\USBClassChangeUIDocument.cpp">
+            33
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSOPPController.cpp">
+            47
+            55
+            78
+            87
+            106
+            115
+            121
+            130
+            144
+            153
+            162
+            172
+            178
+            185
+            203
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunStream.cpp">
+            38
+            40
+            67
+            79
+            84
+            90
+            96
+            99
+            111
+            123
+            128
+            134
+            140
+            143
+            153
+            156
+            161
+            165
+            175
+            178
+            191
+            194
+            205
+            208
+            217
+            220
+            230
+            261
+            271
+            288
+            292
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\src\DunSession.cpp">
+            40
+            42
+            51
+            57
+            78
+            83
+            89
+            96
+            100
+            119
+            122
+            134
+            138
+            142
+            145
+            157
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsoperation.cpp">
+            48
+            69
+            81
+            99
+            129
+            130
+            144
+            145
+            155
+            156
+            166
+            167
+            176
+            177
+            185
+            186
+            194
+            195
+            206
+            220
+            241
+            253
+            259
+            272
+            290
+            305
+            320
+            332
+            351
+            372
+            396
+            403
+            417
+            452
+            458
+            474
+            482
+            496
+            511
+            515
+            536
+            570
+            574
+            579
+            593
+            696
+            700
+            714
+            741
+            827
+            852
+            948
+            953
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunUtils.cpp">
+            34
+            39
+            45
+            48
+            58
+            62
+            68
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapPlugin.cpp">
+            63
+            108
+            138
+            172
+            208
+            229
+            240
+            251
+            272
+            326
+            355
+            370
+            381
+            392
+            403
+            414
+            426
+            438
+            456
+            466
+            478
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobaldialog.cpp">
+            85
+            108
+            152
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\inc\debug.h">
+            76
+            91
+            102
+            139
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextclient.cpp">
+            56
+            177
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsm.cpp">
+            53
+            65
+            79
+            96
+            120
+            122
+            132
+            143
+            153
+            159
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\inc\debug.h">
+            75
+            90
+            101
+            110
+            143
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidclient\src\bthidclient.cpp">
+            48
+            179
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginContainer.cpp">
+            42
+            58
+            97
+            118
+            125
+            135
+            140
+            150
+            155
+            165
+            180
+            204
+            216
+            230
+            255
+            261
+            270
+            283
+            322
+            334
+            338
+            347
+            352
+            382
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmscloseaudio.cpp">
+            47
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\shutdown.cpp">
+            35
+            46
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnpaireddevsettnotifier.cpp">
+            102
+            113
+            124
+            140
+            146
+            176
+            200
+            212
+            223
+            237
+            247
+            257
+            267
+            276
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irkeywatcher.cpp">
+            71
+            108
+            112
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\BTSSProvider.cpp">
+            57
+            80
+            111
+            115
+            121
+            157
+            163
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmuidll.cpp">
+            38
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\pictbridge.cpp">
+            55
+            80
+            87
+            96
+            101
+            110
+            133
+            142
+            147
+            156
+            158
+            167
+            179
+            189
+            201
+            213
+            222
+            229
+            239
+            252
+            261
+            275
+            284
+            311
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\inc\debug.h">
+            82
+            97
+            108
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvsession.cpp">
+            108
+            249
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunSignalNotify.cpp">
+            45
+            47
+            56
+            66
+            77
+            80
+            86
+            92
+            95
+            106
+            109
+            115
+            121
+            124
+            134
+            137
+            148
+            153
+            163
+            166
+            171
+            176
+            177
+            190
+            200
+            203
+            208
+            214
+            235
+            241
+            250
+            256
+            265
+            270
+            274
+            279
+            284
+            288
+            293
+            298
+            303
+            309
+            314
+            318
+            323
+            327
+            336
+            361
+            370
+            383
+            393
+            415
+            417
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\ObexSMClient.cpp">
+            59
+            71
+            75
+            101
+            105
+            145
+            159
+            161
+            239
+            249
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateSuspended.cpp">
+            77
+            104
+            144
+            148
+            165
+            184
+            205
+            246
+            253
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunSignalWaiter.cpp">
+            46
+            48
+            57
+            65
+            76
+            79
+            85
+            91
+            94
+            104
+            107
+            114
+            118
+            128
+            131
+            136
+            143
+            153
+            156
+            161
+            167
+            188
+            194
+            203
+            208
+            218
+            223
+            243
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengdiscovery.cpp">
+            55
+            158
+            198
+            215
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvrvc.cpp">
+            67
+            68
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSession.cpp">
+            41
+            46
+            113
+            121
+            132
+            142
+            151
+            166
+            172
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUCapabilityResolver.cpp">
+            113
+            116
+            127
+            130
+            293
+            298
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacGavdp.cpp">
+            77
+            81
+            125
+            143
+            169
+            182
+            192
+            200
+            207
+            214
+            226
+            235
+            259
+            292
+            299
+            302
+            334
+            377
+            388
+            391
+            394
+            400
+            403
+            406
+            409
+            413
+            425
+            428
+            431
+            439
+            445
+            473
+            483
+            560
+            573
+            585
+            596
+            608
+            619
+            630
+            641
+            652
+            664
+            672
+            686
+            696
+            707
+            711
+            719
+            729
+            732
+            742
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallactive.cpp">
+            114
+            115
+            128
+            187
+            204
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateIdle.cpp">
+            77
+            86
+            93
+            105
+            115
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstatemachine.cpp">
+            109
+            118
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvactivenotifier.cpp">
+            51
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\main.cpp">
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btNotifDebug.h">
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPinNotifier.cpp">
+            109
+            152
+            155
+            158
+            169
+            175
+            198
+            211
+            222
+            256
+            276
+            368
+            378
+            387
+            424
+            458
+            468
+            469
+            485
+            494
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapServerState.cpp">
+            67
+            89
+            106
+            117
+            160
+            190
+            205
+            223
+            242
+            252
+            266
+            273
+            290
+            301
+            312
+            331
+            346
+            357
+            380
+            406
+            425
+            445
+            458
+            517
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\src\locodserviceman.cpp">
+            97
+            107
+            187
+            197
+            201
+            205
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpeventsender.cpp">
+            42
+            56
+            67
+            79
+            82
+            101
+            112
+            117
+            126
+            129
+            133
+            140
+            151
+            169
+            181
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIKeyWatcher.cpp">
+            73
+            78
+            123
+            137
+            148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialog.cpp">
+            75
+            93
+            101
+            108
+            118
+            155
+            163
+            178
+            186
+            193
+            201
+            215
+            223
+            235
+            243
+            262
+            270
+            277
+            285
+            294
+            312
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdlogger.cpp">
+            111
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\settingsitems.cpp">
+            111
+            144
+            156
+            161
+            165
+            179
+            197
+            228
+            248
+            276
+            293
+            308
+            312
+            314
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            58
+            63
+            96
+            131
+            140
+            172
+            199
+            310
+            319
+            332
+            341
+            354
+            390
+            397
+            408
+            425
+            436
+            451
+            464
+            475
+            494
+            502
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateAborting.cpp">
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmui.cpp">
+            91
+            104
+            123
+            151
+            187
+            217
+            233
+            241
+            330
+            355
+            429
+            442
+            509
+            525
+            570
+            583
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccfwconn.cpp">
+            108
+            133
+            192
+            209
+            226
+            242
+            257
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengconnhandler.cpp">
+            174
+            210
+            222
+            228
+            248
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingview.cpp">
+            82
+            90
+            106
+            116
+            153
+            204
+            219
+            247
+            259
+            301
+            348
+            395
+            428
+            443
+            452
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcherScheduler.cpp">
+            36
+            42
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmstempd.cpp">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\src\cosdescriptorhandler.cpp">
+            88
+            113
+            124
+            137
+            142
+            160
+            180
+            190
+            204
+            213
+            223
+            238
+            244
+            253
+            258
+            272
+            290
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsuilayer.cpp">
+            52
+            78
+            89
+            99
+            110
+            119
+            140
+            151
+            177
+            195
+            221
+            234
+            249
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengsettings\src\btengsettingsnotify.cpp">
+            142
+            187
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdlogger.h">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            58
+            88
+            113
+            116
+            150
+            165
+            179
+            192
+            212
+            245
+            287
+            297
+            323
+            332
+            337
+            349
+            359
+            364
+            380
+            384
+            395
+            433
+            436
+            442
+            449
+            466
+            472
+            498
+            504
+            512
+            519
+            525
+            538
+            559
+            569
+            577
+            585
+            593
+            604
+            609
+            621
+            633
+            639
+            645
+            660
+            686
+            699
+            714
+            729
+            746
+            790
+            805
+            816
+            840
+            847
+            860
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActivePersonalityHandler.cpp">
+            59
+            99
+            151
+            188
+            210
+            219
+            236
+            263
+            288
+            303
+            311
+            321
+            332
+            342
+            354
+            370
+            376
+            384
+            400
+            422
+            433
+            493
+            524
+            557
+            569
+            584
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\genericactive.cpp">
+            49
+            70
+            75
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsidle.cpp">
+            39
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccman_accfw_var.cpp">
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsctrl.cpp">
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            67
+            80
+            117
+            128
+            138
+            151
+            162
+            175
+            191
+            246
+            255
+            267
+            275
+            287
+            299
+            302
+            311
+            329
+            341
+            368
+            431
+            432
+            459
+            493
+            504
+            511
+            520
+            579
+            612
+            631
+            638
+            647
+            650
+            683
+            690
+            701
+            702
+            730
+            737
+            821
+            861
+            863
+            875
+            879
+            892
+            912
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\inc\imageprintuidebug.h">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialogtimer.cpp">
+            46
+            50
+            82
+            87
+            96
+            102
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginModel.cpp">
+            57
+            69
+            80
+            93
+            98
+            109
+            126
+            141
+            145
+            152
+            157
+            166
+            171
+            178
+            188
+            191
+            226
+            228
+            240
+            261
+            269
+            298
+            309
+            324
+            358
+            363
+            374
+            380
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicddatahandler.cpp">
+            62
+            78
+            82
+            92
+            104
+            114
+            132
+            143
+            146
+            155
+            159
+            170
+            184
+            185
+            186
+            211
+            226
+            227
+            228
+            246
+            247
+            248
+            265
+            266
+            267
+            283
+            284
+            285
+            311
+            312
+            313
+            326
+            330
+            340
+            347
+            357
+            358
+            359
+            361
+            367
+            368
+            378
+            384
+            390
+            395
+            401
+            411
+            418
+            426
+            432
+            440
+            455
+            471
+            472
+            473
+            489
+            490
+            491
+            503
+            521
+            533
+            535
+            546
+            548
+            554
+            569
+            573
+            574
+            589
+            597
+            599
+            603
+            606
+            619
+            630
+            633
+            662
+            674
+            680
+            682
+            683
+            689
+            694
+            699
+            708
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsstate.cpp">
+            45
+            56
+            62
+            73
+            97
+            102
+            113
+            114
+            143
+            154
+            163
+            198
+            215
+            226
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptptimer.cpp">
+            39
+            44
+            56
+            67
+            78
+            88
+            91
+            94
+            99
+            104
+            109
+            114
+            118
+            120
+            129
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\common\debug.h">
+            74
+            89
+            100
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidgeneric.cpp">
+            36
+            49
+            61
+            62
+            261
+            275
+            277
+            281
+            283
+            288
+            304
+            318
+            324
+            333
+            340
+            345
+            364
+            367
+            373
+            414
+            419
+            465
+            468
+            517
+            521
+            524
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\session.cpp">
+            76
+            90
+            103
+            111
+            118
+            126
+            128
+            136
+            143
+            152
+            162
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbListen.cpp">
+            52
+            54
+            76
+            80
+            86
+            97
+            103
+            113
+            116
+            124
+            149
+            155
+            177
+            181
+            191
+            202
+            207
+            212
+            222
+            228
+            237
+            241
+            250
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPBAPPinNotifier.cpp">
+            93
+            116
+            126
+            175
+            185
+            194
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapMessage.cpp">
+            193
+            197
+            202
+            211
+            226
+            233
+            240
+            252
+            263
+            280
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacSEPManager.cpp">
+            82
+            112
+            126
+            137
+            145
+            156
+            164
+            175
+            185
+            193
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpservermain.cpp">
+            39
+            48
+            60
+            81
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidparser.cpp">
+            454
+            469
+            556
+            570
+            574
+            579
+            583
+            604
+            650
+            727
+            782
+            861
+            891
+            922
+            954
+            984
+            1020
+            1073
+            1110
+            1139
+            1163
+            1182
+            1202
+            1228
+            1252
+            1271
+            1294
+            1310
+            1335
+            1367
+            1408
+            1450
+            1472
+            1493
+            1514
+            1535
+            1557
+            1613
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\mapping.cpp">
+            132
+            156
+            173
+            181
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDataPusher.cpp">
+            45
+            47
+            71
+            74
+            78
+            88
+            91
+            95
+            106
+            109
+            119
+            130
+            133
+            143
+            146
+            152
+            156
+            166
+            169
+            176
+            186
+            190
+            200
+            218
+            231
+            241
+            242
+            265
+            271
+            294
+            297
+            303
+            318
+            322
+            332
+            340
+            344
+            355
+            396
+            406
+            410
+            415
+            417
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINCableConnectedNotifier.cpp">
+            64
+            70
+            82
+            91
+            96
+            107
+            112
+            124
+            141
+            151
+            162
+            182
+            213
+            241
+            251
+            263
+            274
+            302
+            312
+            329
+            345
+            358
+            408
+            415
+            426
+            456
+            494
+            526
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcnumber.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpresponder.cpp">
+            34
+            39
+            50
+            55
+            66
+            71
+            82
+            84
+            131
+            136
+            309
+            319
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPServerWait.cpp">
+            52
+            57
+            87
+            92
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            106
+            132
+            150
+            153
+            158
+            169
+            190
+            196
+            215
+            237
+            250
+            264
+            265
+            329
+            365
+            375
+            384
+            404
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\bt\DunBtListen.cpp">
+            58
+            60
+            92
+            96
+            126
+            129
+            138
+            146
+            155
+            158
+            164
+            191
+            198
+            231
+            239
+            254
+            257
+            267
+            270
+            276
+            283
+            297
+            302
+            310
+            319
+            334
+            342
+            360
+            371
+            379
+            388
+            400
+            419
+            421
+            431
+            434
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\usb\obexsmusbconnection.cpp">
+            56
+            66
+            74
+            83
+            101
+            128
+            134
+            137
+            171
+            176
+            180
+            182
+            194
+            207
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvpowercontrolagent.cpp">
+            65
+            83
+            87
+            104
+            132
+            156
+            203
+            208
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccLinker.cpp">
+            191
+            201
+            288
+            295
+            323
+            344
+            352
+            380
+            395
+            483
+            492
+            504
+            513
+            528
+            537
+            665
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsdpdbhandler.cpp">
+            95
+            109
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInquiryAO.cpp">
+            50
+            58
+            93
+            97
+            102
+            115
+            119
+            130
+            155
+            160
+            171
+            185
+            191
+            199
+            207
+            212
+            227
+            231
+            245
+            249
+            254
+            263
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengpairobserver.cpp">
+            171
+            197
+            203
+            217
+            278
+            304
+            311
+            356
+            402
+         </file>
+      </problem>
+      <problem name="struct" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\pictbridge_api\inc\dpsdefs.h">
+            239
+            407
+            459
+            468
+            477
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\inc\cremotepersonalityhandler.h">
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\common\inc\genericserver.h">
+            32
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\inc\CUsbWatcher.h">
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceParameterList.h">
+            32
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengclientserver.h">
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTServiceUtils.h">
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\inc\dpsparam.h">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\inc\dpsdefs.h">
+            239
+            407
+            459
+            468
+            477
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBPPObjectRequest.h">
+            126
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\inc\settingstables.h">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\devui_const.h">
+            48
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\pictbridge_api\inc\dpsparam.h">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_notifier_internal_api\inc\btnotif.h">
+            89
+            95
+            102
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicddatatypes.h">
+            46
+            55
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdatatypes.h">
+            46
+            55
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\inc\layout.h">
+            177
+            218
+            310
+            321
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\inc\mapping.h">
+            44
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_notifier_api\inc\usbuinotif.h">
+            35
+            43
+            74
+         </file>
+      </problem>
+      <problem name="tclassdestructor" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlstring.cpp">
+            414
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\TUsbPersonalityParams.cpp">
+            40
+         </file>
+      </problem>
+      <problem name="variablenames" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            251
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            1110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSURefObjectResolver.cpp">
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            272
+            330
+         </file>
+      </problem>
+      <problem name="voidparameter" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\src\genericactive.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvkeywatcher.cpp">
+            479
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateSuspended.cpp">
+            166
+            185
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengsettings\src\btengsettings.cpp">
+            381
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengsettings\src\btengsettingsnotify.cpp">
+            188
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacactive.cpp">
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengdiscovery.cpp">
+            412
+            414
+            428
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvactive.cpp">
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmactive.cpp">
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacState.cpp">
+            335
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            1468
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacGavdp.cpp">
+            743
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidparser.cpp">
+            557
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvstate.cpp">
+            144
+            145
+            241
+            242
+            243
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcherServer.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccServer.cpp">
+            103
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateIdle.cpp">
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengpairinghandler.cpp">
+            172
+            173
+            209
+            210
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            1035
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            953
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            144
+            258
+            299
+            341
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpquery.cpp">
+            252
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateStreaming.cpp">
+            257
+            273
+            300
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallstatus.cpp">
+            424
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceStarter.cpp">
+            838
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\main.cpp">
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfiguring.cpp">
+            156
+            263
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIKeyWatcher.cpp">
+            138
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstate.cpp">
+            150
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btbearer\src\btpluginnotifier.cpp">
+            78
+            185
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnected.cpp">
+            532
+            568
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPinNotifier.cpp">
+            141
+            282
+            320
+            327
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btpsmplugin\src\btpsmplugin.cpp">
+            221
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\layoututils.cpp">
+            218
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstateattached.cpp">
+            265
+            301
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvbbconnectionmgr.cpp">
+            298
+            309
+            324
+            339
+            340
+            347
+            363
+            364
+            365
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccplayerstarter.cpp">
+            150
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmman.cpp">
+            274
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccVolumeLevelController.cpp">
+            304
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            139
+            271
+            305
+            359
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            172
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            192
+            224
+            362
+            385
+            432
+            434
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengconnman.cpp">
+            122
+            281
+            336
+            337
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            513
+            574
+            600
+            700
+            860
+            1372
+            1386
+            1389
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextsession.cpp">
+            431
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvsdpquery.cpp">
+            263
+            294
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            804
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengregistrycleaner.cpp">
+            208
+            209
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengdevicesearch.cpp">
+            198
+            219
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvpowercontrolagent.cpp">
+            110
+            116
+            198
+            199
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvmain.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccLinker.cpp">
+            202
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\src\bthidengplugin.cpp">
+            103
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengconnhandler.cpp">
+            176
+            177
+            182
+            250
+            251
+            252
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            340
+            348
+            354
+            355
+            462
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdevman\src\btengdevman.cpp">
+            245
+            296
+            333
+            366
+            403
+            519
+            531
+            532
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingview.cpp">
+            206
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfigured.cpp">
+            276
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengpairobserver.cpp">
+            218
+            219
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpattrparser.cpp">
+            150
+         </file>
+      </problem>
+   </category>
+   <category name="codereview">
+      <problem name="accessArrayElementWithoutCheck" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            171
+            200
+            212
+            404
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            487
+            530
+            782
+            784
+            786
+            788
+            849
+            1083
+            1085
+            1087
+            1088
+            1306
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmui.cpp">
+            176
+            206
+            344
+            367
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmuidata.cpp">
+            132
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            884
+            952
+            963
+            1004
+            1027
+            1314
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfo.cpp">
+            156
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmuidata.cpp">
+            147
+         </file>
+      </problem>
+      <problem name="accessArrayElementWithoutCheck2" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSocketHandler.cpp">
+            114
+            135
+            247
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptplistcontrol.cpp">
+            188
+            199
+            219
+            231
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            313
+            482
+            736
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            675
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlgenerator.cpp">
+            270
+            296
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpdatahandler.cpp">
+            1246
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpstransaction.cpp">
+            148
+            446
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsoperation.cpp">
+            118
+            119
+            120
+            123
+            125
+            127
+            128
+            129
+            130
+            138
+            139
+            140
+            142
+            144
+            145
+            151
+            152
+            153
+            155
+            156
+            163
+            164
+            165
+            166
+            167
+            172
+            173
+            175
+            176
+            177
+            182
+            183
+            184
+            185
+            186
+            191
+            192
+            193
+            194
+            195
+            199
+            200
+            234
+            310
+            316
+            345
+            349
+            351
+            352
+            355
+            360
+            361
+            362
+            370
+            371
+            372
+            373
+            374
+            380
+            381
+            382
+            388
+            389
+            390
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsxmlparser.cpp">
+            167
+            192
+            227
+            245
+            295
+            297
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodelbase.cpp">
+            562
+            566
+            580
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cstatemachine.cpp">
+            349
+            377
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            138
+            155
+            284
+            285
+            307
+            331
+            616
+            680
+            1183
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINCableConnectedNotifier.cpp">
+            231
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidparser.cpp">
+            584
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            287
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoRequester.cpp">
+            131
+            132
+            133
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\btsssendlisthandler.cpp">
+            130
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRClient.cpp">
+            163
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstatemachine.cpp">
+            83
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbConfig.cpp">
+            96
+            260
+            272
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstate.cpp">
+            190
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapServerState.cpp">
+            166
+            244
+            256
+            268
+            292
+            303
+            318
+            363
+            369
+            436
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketwriter.cpp">
+            161
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatequery.cpp">
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            542
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbPlugin.cpp">
+            747
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamerController.cpp">
+            542
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            600
+            877
+            967
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\cremotepersonalityhandler.cpp">
+            368
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextsession.cpp">
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvsdpquery.cpp">
+            264
+            271
+            277
+            283
+            288
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            99
+            112
+            276
+            329
+            357
+            385
+            409
+            720
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\requestmanager.cpp">
+            259
+            260
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\layout.cpp">
+            540
+            560
+            562
+            563
+            565
+            587
+            589
+            602
+            604
+            605
+            614
+            616
+            618
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccman.cpp">
+            106
+            133
+            149
+            301
+            483
+            513
+            544
+            560
+            702
+            706
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\settingsitems.cpp">
+            189
+            191
+            268
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btpairedmodel.cpp">
+            422
+            439
+            455
+            556
+            567
+            568
+            569
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            394
+            395
+            417
+            418
+            419
+            420
+            421
+            422
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            423
+            432
+            458
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccLinker.cpp">
+            131
+            142
+            152
+            166
+            181
+            192
+            213
+            241
+            313
+            325
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hidsdpclient.cpp">
+            139
+            148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdbaseclass.cpp">
+            228
+            230
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInquiryAO.cpp">
+            251
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\src\caiwimageprintIf.cpp">
+            139
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            374
+         </file>
+      </problem>
+      <problem name="activestart" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\main.cpp">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            337
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cusbdevcon.cpp">
+            384
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\server.cpp">
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmui.cpp">
+            284
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsmmain.cpp">
+            89
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            1514
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\src\DunServer.cpp">
+            54
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\UsbWatcher.cpp">
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\src\locodmain.cpp">
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvmain.cpp">
+            71
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpservermain.cpp">
+            83
+         </file>
+      </problem>
+      <problem name="activestop" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsm.cpp">
+            160
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccServer.cpp">
+            163
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextsrv.cpp">
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\shutdown.cpp">
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            132
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            1373
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\src\DunServer.cpp">
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptptimer.cpp">
+            95
+         </file>
+      </problem>
+      <problem name="baseconstruct" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIBlockedDevicesView.cpp">
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIPairedDevicesView.cpp">
+            119
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            104
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingview.cpp">
+            100
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingcontainer.cpp">
+            39
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginView.cpp">
+            106
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            154
+            158
+         </file>
+      </problem>
+      <problem name="callActiveObjectWithoutCheckingOrStopping" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUImageConverter.cpp">
+            241
+            289
+            326
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmonobearer\bmbplugin.cpp">
+            174
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cusbdevcon.cpp">
+            304
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcher.cpp">
+            248
+            1005
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            486
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            256
+            263
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\btsssendlisthandler.cpp">
+            99
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceAPI.cpp">
+            103
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcprotocol.cpp">
+            1092
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsentryhandler.cpp">
+            94
+            144
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnected.cpp">
+            156
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpimagehandler.cpp">
+            214
+            243
+            276
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstateattached.cpp">
+            150
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccplayerstarter.cpp">
+            119
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\server.cpp">
+            119
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateConnect.cpp">
+            67
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            647
+            1145
+            1262
+            1287
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamerController.cpp">
+            186
+            750
+            786
+            1207
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallstatus.cpp">
+            86
+            656
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengregistrycleaner.cpp">
+            127
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvpowercontrolagent.cpp">
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            392
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccLinker.cpp">
+            407
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdevman\src\btengdevman.cpp">
+            163
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmssniffm.cpp">
+            100
+            199
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfigured.cpp">
+            146
+         </file>
+      </problem>
+      <problem name="commentcode" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmbtconnection.cpp">
+            174
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengclientserver.h">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\ObexSMClient.cpp">
+            53
+            81
+            87
+            92
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\btmcprotocolstatus.h">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengsettings\src\btengsettings.cpp">
+            342
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btsac\btsacStreamerController.h">
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextclient.cpp">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectRequest.cpp">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapMessage.cpp">
+            79
+            86
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapRequestHandler.cpp">
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodelbase.cpp">
+            113
+            114
+            115
+            116
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\src\cosdescriptorhandler.cpp">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingcontainer.cpp">
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            50
+            622
+            839
+            840
+            841
+            1238
+            1366
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\usb\obexsmusbconnection.cpp">
+            188
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\cremotepersonalityhandler.cpp">
+            188
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsglobalprogressdialog.cpp">
+            162
+            165
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            205
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengactive.h">
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            214
+            215
+            216
+            224
+            320
+            321
+            326
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            112
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRClient.cpp">
+            70
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\inc\bthidsettingview.h">
+            149
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvstate.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcnumber.cpp">
+            161
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsSession.cpp">
+            360
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosSender.cpp">
+            123
+            206
+            221
+            240
+            297
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnected.cpp">
+            376
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsm.cpp">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapServerState.cpp">
+            148
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpimagehandler.cpp">
+            111
+            117
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpstackstatelistener.cpp">
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvbbconnectionmgr.cpp">
+            324
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\inc\BTSBPPObjectServer.h">
+            229
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosListener.cpp">
+            75
+            110
+            121
+            132
+            154
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            1067
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            224
+            320
+            321
+            332
+            342
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\src\BTUIAppUi.cpp">
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvpluginmgr.h">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            662
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfiguring.cpp">
+            226
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btnauthnotifier.h">
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamerController.cpp">
+            33
+            1277
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvbbconnectionmgr.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\inc\nptpobject.h">
+            282
+            283
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvsdpquery.cpp">
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            352
+            380
+            404
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btnssppasskeyentrynotifier.h">
+            65
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\ptpclasscontroller\inc\ptpclasscontroller.h">
+            152
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            189
+            314
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapStateNotConnected.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            125
+            874
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBIPController.cpp">
+            648
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcphonestatus.cpp">
+            344
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            187
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbwriter.cpp">
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingview.cpp">
+            52
+            60
+            183
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\imageprintuiappui.cpp">
+            402
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpattrparser.cpp">
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccFwConnection_dos.cpp">
+            127
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\eventmanager.cpp">
+            362
+            365
+         </file>
+      </problem>
+      <problem name="doubleSemiColon" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpserver.cpp">
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\ir\obexsmirdaconnection.cpp">
+            161
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsyncsock.cpp">
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            758
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatequery.cpp">
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            187
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapPlugin.cpp">
+            120
+         </file>
+      </problem>
+      <problem name="foff" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\ptptransport.cpp">
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityPlugin.cpp">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidinterfaces.cpp">
+            48
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextpluginbase.cpp">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\crequestshandler.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidgeneric.cpp">
+            72
+         </file>
+      </problem>
+      <problem name="forgottoputptroncleanupstack" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodel.cpp">
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUISap.cpp">
+            214
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcprotocol.cpp">
+            392
+            722
+            730
+            738
+            745
+            752
+            759
+            774
+            785
+            794
+            803
+            812
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatequery.cpp">
+            154
+            181
+            185
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            1057
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsServiceManager.cpp">
+            235
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            257
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            270
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            1027
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcnumber.cpp">
+            109
+         </file>
+      </problem>
+      <problem name="friend" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\inc\BTUIMainContainer.h">
+            200
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\inc\DunServer.h">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunDownstream.h">
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\inc\dpsusbnotifier.h">
+            41
+            42
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\inc\dpsoperation.h">
+            32
+            95
+            131
+            158
+            171
+            197
+            223
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\inc\DunTransporter.h">
+            376
+            377
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hidparser.h">
+            156
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmonocmdhandler\btmccallstatus.h">
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\inc\btmac\btmsyncsock.h">
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\inc\btrcc\btrccLinker.h">
+            108
+            124
+            143
+            162
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengserver.h">
+            98
+            99
+            100
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\inc\hiddriveritem.h">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\inc\USBClassChangeUIPluginContainer.h">
+            206
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\pictbridge_api\inc\dpsoperation.h">
+            32
+            95
+            131
+            158
+            171
+            197
+            223
+            267
+         </file>
+      </problem>
+      <problem name="intleaves" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbListen.cpp">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidreporttranslator.cpp">
+            89
+            136
+            149
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqUI.cpp">
+            1040
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            540
+            954
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            402
+            868
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodelbase.cpp">
+            164
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            1158
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINCableConnectedNotifier.cpp">
+            169
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidparser.cpp">
+            187
+            419
+            624
+            685
+            739
+            848
+            889
+            920
+            952
+            1292
+            1333
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifierAccFw.cpp">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmui.cpp">
+            481
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunChanMan.cpp">
+            227
+            291
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdinterrupthandler.cpp">
+            139
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoMainService.cpp">
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            408
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifierNonAccFw.cpp">
+            28
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            339
+            518
+            859
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsuilayer.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsm.cpp">
+            130
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapServerState.cpp">
+            378
+            404
+            423
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\layoututils.cpp">
+            214
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\src\btmtmuidata.cpp">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmuidata.cpp">
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            233
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunTransporter.cpp">
+            659
+            818
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapHciExtensionMan.cpp">
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            114
+            668
+            689
+            1331
+            1458
+            1512
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\cremotepersonalityhandler.cpp">
+            483
+            495
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            578
+            1020
+            1044
+            1371
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            702
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINQueriesNotifierMdrv.cpp">
+            227
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialog.cpp">
+            292
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbreader.cpp">
+            438
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btpairedmodel.cpp">
+            119
+            800
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            473
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUISap.cpp">
+            185
+            202
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\inc\layoutmgr.h">
+            257
+            264
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdbaseclass.cpp">
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\src\irmtmui.cpp">
+            440
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIViewsCommonUtils.cpp">
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            655
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            379
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidgeneric.cpp">
+            302
+         </file>
+      </problem>
+      <problem name="LFunctionCantLeave" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\src\lcstylustap.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsServiceManager.cpp">
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdusbplugin.cpp">
+            96
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUINQueriesNotifierMdrv.cpp">
+            81
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccSession.cpp">
+            351
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengactive.cpp">
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\server\src\DunSession.cpp">
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceClient.cpp">
+            452
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\ObexSMPlugin.cpp">
+            104
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateListening.cpp">
+            84
+            165
+            397
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstatedetach.cpp">
+            71
+            78
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cusbstatewatcher.cpp">
+            57
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\src\USBClassChangeUIAppui.cpp">
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\btsssendlisthandler.cpp">
+            44
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoMainService.cpp">
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\dunactive.cpp">
+            100
+            121
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunNoteHandler.cpp">
+            140
+            234
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsconnectnotifier.cpp">
+            89
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapPlugin.cpp">
+            61
+            476
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifierNonAccFw.cpp">
+            28
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            507
+            564
+            1330
+            1340
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcbattery.cpp">
+            127
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\obexsm.cpp">
+            118
+            130
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPObjectServer.cpp">
+            193
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\layoututils.cpp">
+            214
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvbbconnectionmgr.cpp">
+            296
+            307
+            318
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericInfoNotifier.cpp">
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsdisconnect.cpp">
+            43
+            51
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\ObexSMRequester.cpp">
+            76
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\utils\src\iractive.cpp">
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPXMLWriter.cpp">
+            186
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainContainer.cpp">
+            153
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketreader.cpp">
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDownstream.cpp">
+            333
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBDeviceStateWatcher.cpp">
+            103
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapRequestHandler.cpp">
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStreamerController.cpp">
+            708
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallstatus.cpp">
+            224
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvacc.cpp">
+            267
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunSignalCopy.cpp">
+            268
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            103
+            132
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityNotifier.cpp">
+            39
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunAtUrcHandler.cpp">
+            149
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmscloseaudio.cpp">
+            88
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\manager\src\shutdown.cpp">
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnpaireddevsettnotifier.cpp">
+            83
+            122
+            129
+            260
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\dunplugin.cpp">
+            147
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcoperator.cpp">
+            154
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccVolumeLevelController.cpp">
+            257
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettings.cpp">
+            49
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccman_nonaccfw_var.cpp">
+            53
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsaudio.cpp">
+            42
+            75
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketlistener.cpp">
+            121
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsyncsock.cpp">
+            44
+            59
+            137
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvsession.cpp">
+            48
+            91
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcvolume.cpp">
+            81
+            197
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBNotifier.cpp">
+            140
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\src\irappgspluginview.cpp">
+            209
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNObexPinNotifier.cpp">
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpobject.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPBAPPinNotifier.cpp">
+            78
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btdevmodelbase.cpp">
+            319
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hiddescriptor.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcsignal.cpp">
+            131
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUCapabilityResolver.cpp">
+            95
+            111
+            125
+            291
+            306
+            323
+            331
+            339
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPwrNotifier.cpp">
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTConnectionTimer.cpp">
+            103
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPImageHandler.cpp">
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cep0reader.cpp">
+            99
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallactive.cpp">
+            181
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoRequester.cpp">
+            53
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSimCardStatusNotifier.cpp">
+            66
+            84
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmstate.cpp">
+            56
+            62
+            71
+            81
+            87
+            96
+            102
+            112
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            756
+            779
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmslisten.cpp">
+            124
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnumcmpnotifier.cpp">
+            96
+            402
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfiguring.cpp">
+            131
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\BTMonoCdmaIncomingFlash.cpp">
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\src\USBUIConnectionNotifier.cpp">
+            84
+            145
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsentryhandler.cpp">
+            44
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvactivenotifier.cpp">
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosSender.cpp">
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIBlockedDevicesView.cpp">
+            336
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNPinNotifier.cpp">
+            93
+            440
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\src\BTSSProvider.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapServerState.cpp">
+            87
+            264
+            404
+            515
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\src\locodserviceman.cpp">
+            62
+            175
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irtimer.cpp">
+            83
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsrfcomm.cpp">
+            82
+            97
+            107
+            157
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            203
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapHciExtensionMan.cpp">
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptpeventsender.cpp">
+            124
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\ptptimer.cpp">
+            86
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvsdpquery.cpp">
+            161
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcher.cpp">
+            375
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmman.cpp">
+            79
+            382
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialog.cpp">
+            241
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNGenericQueryNotifier.cpp">
+            86
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTServiceParameterList.cpp">
+            473
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\common\src\timeouttimer.cpp">
+            62
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateAborting.cpp">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usblocodplugin\src\usblcdactive.cpp">
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbMscPersonalityTimer.cpp">
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmpasskey.cpp">
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\datasegmenter.cpp">
+            195
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\src\BTUIDocument.cpp">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmrfcommsock.cpp">
+            381
+            411
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmstempd.cpp">
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdinterrupthandler.cpp">
+            126
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNAuthNotifier.cpp">
+            128
+            562
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIPairedDevicesView.cpp">
+            397
+            1326
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbWatcherSession.cpp">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsdialogtimer.cpp">
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\csetpersonality.cpp">
+            57
+            107
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingcontainer.cpp">
+            99
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\ir\obexsmirdaconnection.cpp">
+            217
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSession.cpp">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIActive.cpp">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdlogger.cpp">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsinuse.cpp">
+            38
+            64
+            69
+            74
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSUImageConverter.cpp">
+            205
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            839
+            862
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActivePersonalityHandler.cpp">
+            329
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIKeyWatcher.cpp">
+            113
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\cremotepersonalityhandler.cpp">
+            483
+            495
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cep0writer.cpp">
+            90
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\usbclientwrapper.cpp">
+            41
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmccallinghandler.cpp">
+            154
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbConfig.cpp">
+            229
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btregistryobserver.cpp">
+            138
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\generichid\src\hidcollection.cpp">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbDeviceLock.cpp">
+            166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\iractivatewatcher.cpp">
+            63
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamer.cpp">
+            58
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpimagehandler.cpp">
+            133
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketwriter.cpp">
+            102
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsidle.cpp">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateSuspended.cpp">
+            75
+            98
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\notes.cpp">
+            100
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\src\cselectedpersonalityproperty.cpp">
+            121
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIDeviceContainer.cpp">
+            310
+            547
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsctrl.cpp">
+            130
+            188
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsptpnotifier.cpp">
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateStreaming.cpp">
+            78
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            160
+            231
+            915
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\ptpclasscontroller\src\ptpclasscontroller.cpp">
+            147
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextsrv.cpp">
+            101
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irremotelockwatcher.cpp">
+            66
+            88
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccman.cpp">
+            222
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\devmodel\src\btpairedmodel.cpp">
+            237
+            763
+            835
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunAtCmdHandler.cpp">
+            305
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunUpstream.cpp">
+            354
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\src\bthidengplugin.cpp">
+            252
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdcontrolhandler.cpp">
+            494
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginModel.cpp">
+            124
+            307
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstates.cpp">
+            69
+            90
+            116
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsstate.cpp">
+            43
+            93
+            111
+            141
+            194
+            224
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsreconnect.cpp">
+            50
+            83
+            109
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btrfsplugin\src\btrfsplugin.cpp">
+            68
+            75
+            79
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpattrparser.cpp">
+            44
+            146
+            159
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcprotocol.cpp">
+            155
+            1169
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPController.cpp">
+            401
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmonobearer\bmbcmdlistener.cpp">
+            46
+            53
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\usb\DunUsbListen.cpp">
+            200
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmonobearer\playercontrolistener.cpp">
+            46
+            53
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbdevcon\src\cusbdevcon.cpp">
+            255
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacState.cpp">
+            79
+            89
+            99
+            127
+            137
+            147
+            366
+            384
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\irstatuswatcher.cpp">
+            61
+            73
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            110
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacActivePacketDropIoctl.cpp">
+            66
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUINonSap.cpp">
+            29
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbobexclasscontroller\src\CUsbObexClassController.cpp">
+            144
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengpairobserver.cpp">
+            266
+            295
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDataPusher.cpp">
+            353
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\locod\src\locodservice.cpp">
+            209
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\src\imageprintuiappui.cpp">
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            365
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamsender.cpp">
+            311
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbbasicpersonality\src\CUsbActiveBasicHandler.cpp">
+            41
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\src\BTSapSniffHandler.cpp">
+            184
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcnumber.cpp">
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstate.cpp">
+            40
+            51
+            81
+            86
+            91
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\vMessageHandler.cpp">
+            69
+            425
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\src\IRSSProvider.cpp">
+            55
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvaccstateattached.cpp">
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnecting.cpp">
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccplayerstarter.cpp">
+            77
+            105
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketinitiator.cpp">
+            168
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBPPServerWait.cpp">
+            85
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            90
+            392
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\src\BTUIAppUi.cpp">
+            130
+            165
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            59
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosListener.cpp">
+            130
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsconnect.cpp">
+            56
+            86
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInqNotifier.cpp">
+            73
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\bt\DunBtListen.cpp">
+            369
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\usb\obexsmusbconnection.cpp">
+            205
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSURefObjectResolver.cpp">
+            68
+            85
+            99
+            178
+            186
+            203
+            211
+            219
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvpowercontrolagent.cpp">
+            120
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btpbap\src\DisconnectHelper.cpp">
+            93
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btrcc\btrccLinker.cpp">
+            189
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActiveState.cpp">
+            87
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\src\sicdbaseclass.cpp">
+            509
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNInquiryAO.cpp">
+            128
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIViewsCommonUtils.cpp">
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            228
+            337
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsusbnotifier.cpp">
+            228
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmssniffm.cpp">
+            110
+            122
+            228
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfigured.cpp">
+            194
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\btmac\btmsopenaudio.cpp">
+            86
+            118
+            197
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginView.cpp">
+            596
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\cusbdevconstarter.cpp">
+            121
+            195
+         </file>
+      </problem>
+      <problem name="nonleavenew" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\dpsoperation.cpp">
+            87
+            105
+            110
+            333
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvpowercontrolagent.cpp">
+            34
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbPersonalityNotifier.cpp">
+            183
+            213
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hidsdpclient.cpp">
+            300
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            1109
+            1166
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdevman\src\btengdevman.cpp">
+            158
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvrvc.cpp">
+            32
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengpairobserver.cpp">
+            92
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\src\BTUIMainView.cpp">
+            135
+         </file>
+      </problem>
+      <problem name="pragmaother" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\group\sicdusbplugin_UID_.cpp">
+            3
+            5
+         </file>
+      </problem>
+      <problem name="rfs" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            550
+            617
+            685
+            714
+            958
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsuilayer.cpp">
+            153
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsdpdbhandler.cpp">
+            358
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            413
+            497
+            583
+            872
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicesendutils\src\BTSBIPController.cpp">
+            416
+            447
+            484
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunNoteHandler.cpp">
+            203
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            381
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            703
+            726
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\pictbridgeengine\src\pictbridge.cpp">
+            277
+         </file>
+      </problem>
+      <problem name="rssnames" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\data\phonecapability.rss">
+            19
+         </file>
+      </problem>
+      <problem name="stringsinresourcefiles" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\data\imageprintui.rss">
+            38
+            100
+            285
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\data\101F8671.rss">
+            41
+            42
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\data\irapp.rss">
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\data\btrcc\10208978.rss">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usblocodplugin\data\0x102823dd.rss">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\10274798.rss">
+            36
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\usbman.rss">
+            69
+            87
+            104
+            121
+            141
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\data\1020742B.rss">
+            38
+            39
+            40
+            54
+            61
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\data\USBUINotif.rss">
+            123
+            126
+            129
+            132
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbbasicpersonality\src\10274797.rss">
+            38
+            39
+            48
+            49
+            50
+            58
+            59
+            60
+            67
+            68
+            69
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\data\hidkeyboard.rss">
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexservicebtsend\data\101F86A2.rss">
+            46
+            60
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\data\10208970.rss">
+            41
+            43
+            50
+            67
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\ir\101F9695.rss">
+            43
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\data\USBClassChangeUI_reg.rss">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irbearer\src\20002770.rss">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\data\USBClassChangeUI.rss">
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\ptpclasscontroller\src\1020DF7C.rss">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuibluetooth\data\btmtmui.rss">
+            53
+            61
+            69
+            77
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\ecom\101FD68F.rss">
+            39
+            40
+            41
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintui\data\imageprintui_reg.rss">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\0x20002775.rss">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\data\BTUI.rss">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\data\200159E9.rss">
+            43
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\data\bthidkbdsettings.rss">
+            35
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\data\BthidResource.rss">
+            33
+            264
+            291
+            318
+            1331
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\imageprintuiprovider\data\1020E471.rss">
+            39
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\data\Btui_reg.rss">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\data\101F8636.rss">
+            41
+            42
+            63
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\data\btsac\10208973.rss">
+            42
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\usb\101F9693.rss">
+            43
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\data\10204DB2.rss">
+            19
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\101f7c9d.rss">
+            43
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\data\irapp_reg.rss">
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\data\kbdlayout.rss">
+            35
+            41
+            47
+            53
+            59
+            65
+            71
+            77
+            83
+            89
+            95
+            101
+            107
+            113
+            119
+            125
+            131
+            137
+            143
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\data\1020E472.rss">
+            41
+            43
+            44
+            54
+            55
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\data\102068DC.rss">
+            38
+            39
+            40
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexsendservices\obexserviceirsend\data\001F86A2.rss">
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\data\USBClassChangeUIPlugin.rss">
+            40
+            112
+            124
+            231
+            262
+            263
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btui\Ecom\data\BtuiViewResources.rss">
+            157
+            187
+            1031
+            1032
+            1033
+            1034
+            1037
+            1039
+            1042
+            1043
+            1059
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\irapp\irappgsplugin\data\10204DB0.rss">
+            36
+            37
+            38
+            44
+            45
+            46
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbobexclasscontroller\data\10281F29.rss">
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\lcstylustap\data\10204DAE.rss">
+            43
+            44
+            53
+            54
+            63
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\data\hidmouse.rss">
+            35
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbremotepersonality\src\10283307.rss">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\data\200100C4.rss">
+            36
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\data\101f4689.rss">
+            41
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\data\0x101F7C88.rss">
+            45
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\usbms.rss">
+            23
+            24
+            25
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\data\Obexutils.rss">
+            338
+            488
+            489
+            490
+            491
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\mtmuiinfrared\data\irmtmui.rss">
+            44
+            52
+            60
+            68
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\data\2001E308.rss">
+            42
+            43
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbosdescriptorhandler\src\10283305.rss">
+            37
+            38
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\data\10208970_nonaccfw.rss">
+            39
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\data\20002774.rss">
+            45
+         </file>
+      </problem>
+      <problem name="todocomments" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsap\inc\BTSap_Conn_State_SD.h">
+            37
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidkbdsettings\src\bthidsettingcontainer.cpp">
+            101
+         </file>
+      </problem>
+      <problem name="uids" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\group\UsbWatcherServer_pcsmtp.mmp">
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbuinotif\group\USBUINotifWrapper.mmp">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\group\UsbMscPersonality.mmp">
+            23
+         </file>
+      </problem>
+      <problem name="userWaitForRequest" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\usbengines\usbwatcher\src\CUsbActivePersonalityHandler.cpp">
+            115
+            443
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            1093
+            1128
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\atext\src\atextclient.cpp">
+            176
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidclient\src\bthidclient.cpp">
+            178
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\client\src\dunclient.cpp">
+            60
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            203
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\usbmscpersonality\src\CUsbActiveMscHandlerMdrv.cpp">
+            565
+            596
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsuilayer.cpp">
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanclient\src\ObexSMClient.cpp">
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            207
+            847
+            860
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\bip\src\BIPController.cpp">
+            289
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidengplugin\src\bthidengplugin.cpp">
+            72
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcphonestatus.cpp">
+            349
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            716
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpserver\src\rptp.cpp">
+            65
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            465
+            671
+            705
+            914
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\common\src\genericclient.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccClient.cpp">
+            56
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengpairobserver.cpp">
+            302
+            310
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengclient.cpp">
+            64
+         </file>
+      </problem>
+      <problem name="worryingcomments" severity="low">
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\unitedstates.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\su8intusenglish.cpp">
+            71
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccDosSender.h">
+            217
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\plugins\src\bt\DunBtPlugin.cpp">
+            220
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengpairinghandler.cpp">
+            28
+            94
+            100
+            137
+            164
+            201
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpquery.cpp">
+            90
+            184
+            238
+            259
+            311
+            340
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengclient.cpp">
+            34
+            90
+            123
+            134
+            144
+            154
+            168
+            180
+            194
+            209
+            225
+            236
+            249
+            270
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\src\SrcsSession.cpp">
+            280
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvbbconnectionmgr.cpp">
+            28
+            30
+            32
+            141
+            293
+            304
+            315
+            331
+            370
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosListener.cpp">
+            75
+            110
+            121
+            132
+            154
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\usinternational.cpp">
+            71
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDownstream.cpp">
+            354
+            358
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilsmessagehandler.cpp">
+            229
+            1067
+            1202
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\mouse\src\mouse.cpp">
+            525
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\norwegian.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\layout.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunAtUrcHandler.cpp">
+            61
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnpaireddevsettnotifier.cpp">
+            208
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\src\BTMonoCmdHandler\btmcoperator.cpp">
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\french.cpp">
+            69
+            95
+            276
+            296
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\german.cpp">
+            69
+            95
+            261
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthiddevice.cpp">
+            82
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_secondary_display_notification_api\inc\secondarydisplay\BTnotifSecondaryDisplayAPI.h">
+            51
+            58
+            88
+            94
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\inc\btengsdpquery.h">
+            44
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\ptpstack\src\nptpdatahandler.cpp">
+            1154
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengdiscovery.cpp">
+            186
+            204
+            221
+            232
+            250
+            268
+            286
+            355
+            368
+            384
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\danish.cpp">
+            70
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hiddescriptor.cpp">
+            108
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengactive.h">
+            29
+            30
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacGavdp.cpp">
+            211
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvstate.cpp">
+            94
+            119
+            136
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\usb\obexsmusbconnection.cpp">
+            117
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\BTAccInfoRequester.cpp">
+            82
+            151
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexreceiveservices\opp\src\oppcontroller.cpp">
+            481
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\bluetooth_secondary_display_notification_api\inc\secondarydisplay\BtuiSecondaryDisplayAPI.h">
+            41
+            47
+            77
+            83
+            101
+            107
+            113
+            187
+            193
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConfiguring.cpp">
+            191
+            252
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunTransUtils.cpp">
+            501
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\socketlistener.cpp">
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\btaccDosSender.cpp">
+            206
+            221
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\ecom\BtnotifWrapper.cpp">
+            27
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvpluginmgr.h">
+            33
+            34
+            315
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengserver.cpp">
+            320
+            408
+            421
+            473
+            504
+            521
+            594
+            626
+            655
+            715
+            785
+            811
+            851
+            926
+            975
+            988
+            1065
+            1226
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvbbconnectionmgr.h">
+            32
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\ir\obexsmirdaconnection.cpp">
+            125
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\inc\btengconnhandler.h">
+            26
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengconnhandler.cpp">
+            115
+            148
+            209
+            217
+            219
+            221
+            249
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\portuguese.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btmac\common\atcodec.h">
+            73
+            76
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\bt\debug.h">
+            31
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\inc\layout.h">
+            185
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\obexservicemanserver\inc\debug.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudiostreamer\src\btaudiostreamer.cpp">
+            86
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\italian.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconn_dom\usb_secondary_display_api\inc\usbuinotifsecondarydisplay.h">
+            70
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengconnman\src\btengconnman.cpp">
+            104
+            116
+            127
+            139
+            151
+            163
+            174
+            285
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\su8usenglish.cpp">
+            71
+            97
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\BTNotifier.cpp">
+            352
+            359
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\inc\btnssppasskeyentrynotifier.h">
+            134
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidconnection.cpp">
+            447
+            646
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunUpstream.cpp">
+            158
+            376
+            380
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbuis\usbui\USBClassChangeUIPlugin\src\USBClassChangeUIPluginModel.cpp">
+            360
+            376
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\dutch.cpp">
+            70
+            96
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\finnishswedish.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\utils\src\obexutilslaunchwaiter.cpp">
+            151
+            173
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\src\basrvmain.cpp">
+            64
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\btengdiscovery\src\btengsdpattrparser.cpp">
+            21
+            25
+            84
+            143
+            156
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\unitedstatesdvorak.cpp">
+            69
+            95
+            195
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btaudioman\inc\BTAccDosListener.h">
+            172
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\src\bt\obexsmbtconnection.cpp">
+            140
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunAtCmdHandler.cpp">
+            153
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnected.cpp">
+            438
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\ir\debug.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\spanish.cpp">
+            69
+            95
+            155
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\keyboard\src\keyboard.cpp">
+            396
+            892
+            1320
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\dun\utils\src\DunDataPusher.cpp">
+            380
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\usbclasses\sicdusbplugin\inc\sicdconstants.h">
+            29
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidsession.cpp">
+            50
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\inc\btengsrvstate.h">
+            25
+            33
+            34
+            83
+            84
+            126
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btsac\src\btsac\btsacStateConnecting.cpp">
+            121
+            123
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\belgian.cpp">
+            70
+            96
+            156
+            169
+            176
+            304
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\btnotif\src\btnssppasskeyentrynotifier.cpp">
+            259
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bteng\src\btengsrvpluginmgr.cpp">
+            90
+            183
+            198
+            230
+            268
+            291
+            309
+            327
+            354
+            377
+            398
+            419
+            445
+            466
+            488
+            532
+            550
+            586
+            593
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\layouts\src\unitedkingdom.cpp">
+            69
+            95
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hidsdpclient.cpp">
+            216
+            416
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\localconnectivityservice\obexserviceman\plugins\inc\usb\debug.h">
+            33
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\bthidserver.cpp">
+            1431
+         </file>
+         <file path="Y:\LC_Domain\shortlinkconn\bluetoothengine\bthid\bthidserver\src\hiddescriptorlist.cpp">
+            100
+         </file>
+      </problem>
+   </category>
+</problemIndex>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,191 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.helium.diamonds.tests;
+
+import java.io.File;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.FileReader;
+import java.io.Reader;
+import java.io.BufferedReader;
+import java.io.IOException;
+import com.nokia.helium.diamonds.XMLMerger;
+
+import org.junit.*;
+import static org.junit.Assert.*;
+import org.custommonkey.xmlunit.*;
+
+public class TestXMLMerger {
+    
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    
+    private File createTextFile(String content) throws IOException {
+        File temp = File.createTempFile("merge", ".xml");
+        temp.deleteOnExit();
+        BufferedWriter output = new BufferedWriter(new FileWriter(temp));
+        output.write(content);
+        output.close();
+        return temp;
+    }
+    
+    /**
+     * Simple merge with empty source.
+     * The result should be the same as the merged content.
+     * @throws Exception
+     */
+    @Test
+    public void test_simpleMergeNode() throws Exception {
+        File merge = createTextFile("<?xml version=\"1.0\"?>\n<root/>");
+        File toBeMerged = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section1/>\n" + 
+                "<section2/>\n"+ 
+                "<section3><subnode>text</subnode></section3>\n"+ 
+                "</root>");
+        XMLMerger merger = new XMLMerger(merge);
+        merger.merge(toBeMerged);
+        DifferenceListener differenceListener = new IgnoreTextAndAttributeValuesDifferenceListener();
+        Diff diff = new Diff(new ReaderNoSpaces(new FileReader(merge)), new ReaderNoSpaces(new FileReader(toBeMerged)));
+        diff.overrideDifferenceListener(differenceListener);
+        assertTrue("Test that 2 simple XML merge correctly  " + diff, diff.similar());
+    }
+
+    /**
+     * Test the merging of twice the same content.
+     * Result should be similar to the source.
+     * @throws Exception
+     */
+    @Test
+    public void test_mergeSameNode() throws Exception {
+        File merge = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" + 
+                "<subnode attr=\"1\">1</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        File toBeMerged = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" + 
+                "<subnode attr=\"1\">1</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        XMLMerger merger = new XMLMerger(merge);
+        merger.merge(toBeMerged);
+        DifferenceListener differenceListener = new IgnoreTextAndAttributeValuesDifferenceListener();
+        Diff diff = new Diff(new ReaderNoSpaces(new FileReader(merge)), new ReaderNoSpaces(new FileReader(toBeMerged)));
+        diff.overrideDifferenceListener(differenceListener);
+        assertTrue("Test that identity  " + diff, diff.similar());
+    }
+
+    /**
+     * Testing the merge of several files.
+     * @throws Exception
+     */
+    @Test
+    public void test_mergeWithSubNodeAndAttribute() throws Exception {
+        File merge = createTextFile("<?xml version=\"1.0\"?>\n<root/>");
+        File toBeMerged1 = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" + 
+                "<subnode attr=\"1\">1</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        File toBeMerged2 = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" + 
+                "<subnode attr=\"2\">2</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        File toBeMerged3 = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" + 
+                "<subnode attr=\"3\">3</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        File toBeMerged4 = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" +                 
+                "<subnode attr=\"4\">1</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        File expected = createTextFile("<?xml version=\"1.0\"?>\n<root>\n" +                 
+                "<section>\n" + 
+                "<subnode attr=\"1\">1</subnode>\n" + 
+                "<subnode attr=\"2\">2</subnode>\n" + 
+                "<subnode attr=\"3\">3</subnode>\n" + 
+                "<subnode attr=\"4\">1</subnode>\n" + 
+                "</section>\n" + 
+                "</root>");
+        XMLMerger merger = new XMLMerger(merge);
+        merger.merge(toBeMerged1);
+        merger.merge(toBeMerged2);
+        merger.merge(toBeMerged3);
+        merger.merge(toBeMerged4);
+        Diff diff = new Diff(new ReaderNoSpaces(new FileReader(merge)), new ReaderNoSpaces(new FileReader(expected)));
+        //System.out.println(readTextFile(merge.getAbsolutePath()));
+        assertTrue("test XML matches control skeleton XML " + diff, diff.similar());
+    }
+
+    /**
+     * Load file content into a string. 
+     * @param fullPathFilename
+     * @return the file content as a string
+     * @throws IOException
+     */
+    public static String readTextFile(String fullPathFilename) throws IOException {
+        StringBuffer sb = new StringBuffer(1024);
+        BufferedReader reader = new BufferedReader(new FileReader(fullPathFilename));
+                
+        char[] chars = new char[1024];
+        int numRead = 0;
+        while ( (numRead = reader.read(chars)) > -1) {
+            sb.append(String.valueOf(chars));
+        }
+
+        reader.close();
+
+        return sb.toString();
+    }    
+    
+    public class ReaderNoSpaces extends BufferedReader {
+
+        private boolean skip = true; 
+        public ReaderNoSpaces(Reader in) throws Exception {
+            super(in);
+        }
+        
+        public int read(char[] cbuf, int off, int len) throws IOException {
+            int rlen = super.read(cbuf, off, len);
+            if (rlen < 0)
+                return rlen;
+            int w = off;
+            for (int i = off ; i < off + rlen ; i++) {
+                char c = cbuf[i];
+                if (c == '<')
+                    skip = false;
+                if (c == '>')
+                    skip = true;                
+                if (!(skip && (c == '\n' || c == '\t'|| c == ' '))) {
+                    cbuf[w++] = c;
+                }
+            }
+            return w - off;
+        }
+        
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/apimetrics.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+<#--
+============================================================================ 
+Name        : diamonds-api-metrics.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+    <#if (doc)??>
+    <apis>
+        <count type="sdk"><@totalNoOfRelease type="sdk"/></count>
+        <count type="domain"><@totalNoOfRelease type="domain"/></count>
+        <count type="internal"><@totalNoOfRelease type="internal"/></count>
+        <count type="private"><@totalNoOfRelease type="private"/></count>
+    <illegal-apis>
+    <#list doc.api_dataset.api as illegal>
+        <#if illegal.release.@category == 'private'>
+            <api>${illegal.buildfiles.file.path}</api>
+        </#if>
+        <#if illegal.release.@category == 'internal'>
+            <api>${illegal.buildfiles.file.path}</api>
+        </#if>
+    </#list>
+    </illegal-apis>
+    </apis>
+    </#if>
+
+<#if (doc)?? >
+<#macro totalNoOfRelease type>
+    <#assign count = 0>
+<#list doc.api_dataset.api as apinode>
+        <#if apinode.release.@category == '${type}'>
+            <#assign count = count + 1>
+        </#if>
+    </#list>
+${count}</#macro>
+</#if>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/build.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+<#--
+============================================================================ 
+Name        : diamonds-build.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+    <build>
+        <category>${ant["build.family"]}</category>
+        <name>${ant["id"]}</name>
+        <#if ant?keys?seq_contains("diamonds.start.time")><started>${ant["diamonds.start.time"]}</started></#if>
+        <#if ant?keys?seq_contains("diamonds.end.time")><finished>${ant["diamonds.end.time"]}</finished></#if>
+        <creator>${ant["env.USERNAME"]}</creator>
+        <hostname>${ant["env.COMPUTERNAME"]}</hostname>
+        <product>${ant["name"]}</product>
+        <build_system>${ant["build.system"]}</build_system>
+        <#if ant?keys?seq_contains("env.NUMBER_OF_PROCESSORS")><processor_count>${ant["env.NUMBER_OF_PROCESSORS"]}</processor_count></#if>
+    </build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/codescanner.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+  <#--
+============================================================================ 
+Name        : diamonds-faults.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#include "header.ftl">
+  <faults>
+    <#if (doc)?? >
+      <#--<total severity="codescanner_error"><@totalNoOfSeverity type="error"/></total>-->
+      <total severity="codescanner_warning"><@totalNoOfSeverity type="high"/></total>
+    </#if>
+  </faults>
+<#include "footer.ftl">
+
+<#macro totalNoOfSeverity type>
+  <#assign count = 0>
+<#if (doc)?? >
+<#list doc["problemIndex/category/problem[@severity='${type}']/file"] as problem>
+    <#list problem?split("\n") as lineNo>
+        <#if lineNo?matches(".*[0-9].*")>
+            <#assign count = count + 1>
+        </#if>
+    </#list>
+</#list>
+</#if>
+${count}</#macro>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_finish.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<#--
+============================================================================ 
+Name        : finish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "header.ftl">
+  <build>
+    <#if ant?keys?seq_contains("diamonds.end.time")><finished>${ant["diamonds.end.time"]}</finished></#if>
+  </build>
+<#include "footer.ftl">
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_signal.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<#--
+============================================================================ 
+Name        : finish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "header.ftl"> 
+  <signals>
+      <#assign diamondsignalname = ""/>
+      <#assign diamondkeys = diamondSignal?keys>
+      <#list diamondkeys as diamondkey>
+      <#if diamondkey?contains("diamond.signal.name")>
+      <#list diamondSignal[diamondkey]?split(".") as signalname>
+      <#assign diamondsignalname = signalname/>
+      </#list>
+      <signal>
+      <#list diamondkeys as diamondkey>
+      <#if diamondkey?contains("${diamondsignalname}")>
+          <#if diamondkey?contains("diamond.signal.name.${diamondsignalname}")><name>${diamondSignal[diamondkey]}</name></#if>
+          <#if diamondkey?contains("diamond.error.message.${diamondsignalname}")><message>${diamondSignal[diamondkey]}</message></#if>
+          <#if diamondkey?contains("diamond.time.stamp.${diamondsignalname}")><timestamp>${diamondSignal[diamondkey]}</timestamp></#if>
+      </#if>
+      </#list>
+      </signal>
+      </#if>
+      </#list>
+  </signals>
+<#include "footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_stage.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<#--
+============================================================================ 
+Name        : stage.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#include "header.ftl">
+    <stages>
+      <stage>    
+            <name>${ant["logical.stage"]}</name>
+            <#if ant?keys?seq_contains("stage.start.time")><started>${ant["stage.start.time"]}</started></#if>
+            <#if ant?keys?seq_contains("stage.end.time")><finished>${ant["stage.end.time"]}</finished></#if>
+     </stage>
+    </stages>
+<#include "footer.ftl">
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_start.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+<#--
+============================================================================ 
+Name        : start.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#include "header.ftl">
+<#include "build.xml.ftl">
+<#include "locations.ftl">    
+<#include "footer.ftl">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_status.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<#--
+============================================================================ 
+Name        : finish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "header.ftl"> 
+  <build>
+    <#if diamonds?keys?seq_contains("build.status")><status>${diamonds["build.status"]}</status></#if>
+  </build>
+<#include "footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/faults.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<#--
+============================================================================ 
+Name        : faults.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#include "macro.ftl">
+  <#if doc?? >
+      <@printall type='error'/>
+  </#if>
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/footer.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : footer.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+</diamonds-build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/header.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+<#--
+============================================================================ 
+Name        : header.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "macro.ftl">
+<?xml version="1.0" encoding="UTF-8"?>
+<diamonds-build>
+    <schema>${schema_version}</schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/locations.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+<#--
+============================================================================ 
+Name        : diamonds-locations.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+    <locations>
+    <#if ant?keys?seq_contains("release.grace.dir") &&  !(ant["release.grace.dir"]?contains("${"))>
+        <location>
+              <link>${ant["release.grace.dir"]}</link>
+              <description>GRACE server</description>
+           </location>
+    </#if>
+    <#if ant?keys?seq_contains("publish.dir.list")>
+        <#list ant["publish.dir.list"]?split(",") as path>
+            <#if !path?contains("${")>
+                <location>
+                      <link>${path}</link>
+                      <description>Shared drive</description>
+                   </location>
+               </#if>
+           </#list>
+    </#if>
+    <#if (ant?keys?seq_contains("publish.dir") && !ant["publish.dir"]?contains("${"))>
+            <location>
+                   <link>${ant["publish.dir"]}</link>
+                   <description>Shared drive</description>
+            </location>
+    </#if>
+    </locations>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/macro.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,94 @@
+<#--
+============================================================================ 
+Name        : diamonds-macro.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#macro numberof regex type>
+    <#assign count = 0>
+<#if doc?? >
+    <#list doc.logSummary.log as lognode>
+        <#if lognode.@filename[0]?matches(regex)>
+            <#assign count = count + lognode.build[".//message[@priority='${type}']"]?size>
+        </#if>
+    </#list>
+</#if>
+${count}</#macro>
+<#macro printfaults regex type>
+</#macro>
+
+<#macro printcomponents regex>
+</#macro>
+<#macro printall type>
+    <#if doc?? >
+        <#assign componentname="">
+        <#assign components="">
+        <#assign componenterrors = 0>
+        <#assign totalerrors = 0>
+        <#assign totalwarnings = 0>
+        <#assign componentwarnings = 0>
+        <#assign ls=doc.logSummary["//task/task/@name"]?sort>
+        <!-- print all the fault info -->
+        <faults>
+        <#list ls as task>
+            <#assign currenttask=task?parent>
+            <#assign parenttask=currenttask?parent>
+            <#assign currentcomponentname="${task}">
+            <#if componentname == "">
+                <#assign componentname="${task?parent.@name}">
+                <#assign components="${componentname}">
+            </#if>
+            <#if componentname != currentcomponentname>
+            <component>
+                <name>${componentname}</name>
+                <total severity="error">${componenterrors}</total>
+                <total severity="warning">${componentwarnings}</total>
+            </component>
+                <#assign componentname=currentcomponentname>
+                <#assign components= components + ",${componentname}">
+                <#assign totalerrors = totalerrors + componenterrors>
+                <#assign totalwarnings = totalwarnings + componentwarnings>
+                <#assign componenterrors = 0>
+                <#assign componentwarnings = 0>
+            </#if>
+            <#assign componenterrors = componenterrors + currenttask[".//message[@priority='error']"]?size>
+            <#assign componentwarnings = componentwarnings + currenttask[".//message[@priority='warning']"]?size>
+        </#list>
+            <component>
+                <name>${componentname}</name>
+                <total severity="error">${componenterrors}</total>
+                <total severity="warning">${componentwarnings}</total>
+            </component>
+            <!-- print summary of the errors -->
+            <#assign totalerrors = totalerrors + componenterrors>
+            <#assign totalwarnings = totalwarnings + componentwarnings>
+            <total severity="error">${totalerrors}</total>      
+            <total severity="warning">${totalwarnings}</total>
+            <total severity="warning_rvct_other">${totalerrors}</total>
+            <!-- todo update to calculate the correct value -->
+            <total severity="warning_rvct_bad">${totalwarnings}</total>
+        </faults>
+        <components>
+        <!-- all components -->
+        <#list components?split(",") as component >
+            <component>${component}</component>
+        </#list>
+        </components>
+    </#if>
+</#macro>
+<#assign schema_version=13/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/tool.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<#--
+============================================================================ 
+Name        : diamonds-tool.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "header.ftl">
+       <tools>
+         <tool>
+           <name>SymSEE</name>
+           <version>${ant["symsee.version"]}</version>
+         </tool>
+       </tools>
+<#include "footer.ftl">
+       
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/validate-policy-log.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+<#--
+============================================================================ 
+Name        : validate-policy-log.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#include "macro.ftl">
+<#include "header.ftl">
+<schema>${schema_version}</schema>
+<policyvalidation>
+<#if (doc)??!""?keys?seq_contains('validatePolicy')>
+<#list doc['validatePolicy'].policyvalidation.error as error>
+      <error type="${error.@type}" message="${error.@message}" value="${error.@value}"/>
+</#list>
+</#if>
+</policyvalidation>
+<#include "footer.ftl">
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/test_diamonds.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,136 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_diamonds.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib diamonds unittests.</description>
+    
+    <dirname property="project.dir" file="${ant.file.test-diamonds}" />
+    <target name="version">
+        <echo message="version target for diamonds to verify sending data to diamonds" />
+    </target>
+
+    <target name="diamonds" />
+
+    <target name="compile-target">
+        <echo message="verify the build stage with input source xml file" />
+    </target>
+
+    <target name="codescanner">
+        <echo message="target verification with input source xml file" />
+    </target>
+
+    <target name="create-bom-log">
+        <echo message="target without input file and just to send the data" />
+    </target>
+
+    <target name="invalid-target-input-file">
+        <echo message="target with invalid input source xml file" />
+    </target>
+
+    <target name="invalid-stage-input-file">
+        <echo message="stage with invalid input source xml file" />
+    </target>
+
+    <target name="invalid-template-file">
+        <echo message="target with invalid template-file" />
+    </target>
+
+    <target name="invalid-ant-properties-input">
+        <echo message="target with invalid ant properties input" />
+    </target>
+
+    <target name="non-existing-ant-properties">
+        <echo message="target with non-existing-ant-properties" />
+    </target>
+
+    <target name="invalid-diamonds-server-properties">
+        <echo message="target with invalid-diamonds-server-properties" />
+    </target>
+
+    <target name="defer-type">
+        <echo message="version target for diamonds to verify sending data to diamonds" />
+    </target>
+
+    <target name="test-defer-type">
+        <antcall target="defer-type" />
+    </target>
+
+    <target name="test-create-bom-log">
+        <antcall target="create-bom-log" />
+    </target>
+
+    <target name="test-codescanner">
+        <antcall target="codescanner" />
+    </target>
+
+    <target name="test-invalid-target-input-file">
+        <antcall target="invalid-target-input-file" />
+    </target>
+
+    <target name="test-invalid-stage-input-file">
+        <antcall target="invalid-target-input-file" />
+        <echo message="stage with invalid input source xml file" />
+    </target>
+
+    <target name="test-invalid-template-file">
+        <antcall target="invalid-template-file" />
+    </target>
+
+    <target name="test-invalid-ant-properties-input">
+        <antcall target="invalid-ant-properties-input" />
+    </target>
+
+    <target name="test-non-existing-ant-properties">
+        <antcall target="non-existing-ant-properties" />
+    </target>
+
+    <target name="test-invalid-diamonds-server-properties">
+        <antcall target="invalid-diamonds-server-properties" />
+        <echo message="target with invalid-diamonds-server-properties" />
+    </target>
+
+    <target name="test-compile-target">
+        <antcall target="compile-target" />
+    </target>
+
+    <target name="test-version">
+        <antcall target="version" />
+    </target>
+
+    <target name="test-buildid-set">
+        <echo>${diamonds.build.id}</echo>
+        <au:assertTrue>
+            <isset property="diamonds.build.id"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-buildid-notset">
+        <au:assertFalse>
+            <isset property="diamonds.build.id"/>
+        </au:assertFalse>
+    </target>
+
+    <target name="test-all" depends="test-buildid-notset, diamonds, test-buildid-set, test-defer-type, test-version,
+        test-create-bom-log,test-codescanner,test-compile-target,test-invalid-diamonds-server-properties,
+        test-non-existing-ant-properties,test-invalid-ant-properties-input,test-invalid-template-file,
+        test-invalid-target-input-file,test-invalid-stage-input-file " />
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/index.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN">
+
+<html>
+<head>
+  <title>Ant Tasks Documentation </title>
+  </head>
+
+<frameset cols="30,70">
+
+	<frameset rows="20,80">
+	    <frame name="libindex" src="libindex.html"/>
+	    <frame name="taskindex" src="index.all.html"/>
+    </frameset>
+	<frame name="task" src="overview.html" />
+
+</frameset>
+
+</html>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/libindex.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+##
+## This is an Velocity template for generating an HTML index
+## of the Ant "categories" (antlibs)
+##
+## Objects expected in context:
+##
+##     $title      - Project title (of type String)
+##     $antroot - (of type AntRoot)
+## 
+<html>
+<head>
+  <title>$title Ant Libraries</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+</head>
+<body>
+
+<div id="navigation">
+
+	<a href="overview.html" target="task">
+		<h2>$title Ant Libs</h2>
+	</a>
+	<p>
+## Iterate through the Categories
+#foreach( $category in $antroot.getCategories() )
+        <a href="index.${category}.html" target="taskindex">
+        	$category
+        </a><br />
+#end
+	</p>
+
+        <a href="index.all.html" target="taskindex">
+        	<i>all</i>
+        </a><br />
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/main.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+##
+## This template is the entry point for calling other templates.
+## The output of this template goes to stdout.
+##
+## Objects available in context:
+##
+## $velocity   - Helper object for processing other templates (of type VelocityFacade)
+## $antroot   - Contains all the Ant tasks/types (of type AntRoot)
+## $title         - Project title (of type String)
+##
+
+AntDoclet - Running project $title
+
+- Generating Task and Types documentation...
+##
+#foreach( $taskDoc in $antroot.getAll() ) ##
+  #if ( ! $taskDoc.isIgnored() )
+
+- Processing $taskDoc.antName ##
+      $velocity.eval( "html/task.vm", "${taskDoc.getFullClassName()}.html" ) ##
+  #else ##
+- Ignoring $taskDoc.fullClassName()##
+  #end ##
+#end ##
+
+
+- Generating Navigation indexes...
+## Now, generate an "index" file for the categories, and one for each category
+$velocity.eval( "html/libindex.vm", "libindex.html" )
+$velocity.eval( "html/overview.vm", "overview.html" )
+#foreach( $category in $antroot.getCategories() )
+	$velocity.eval( "html/taskindex.vm", "index.${category}.html" )
+#end
+#set($category = "all")
+$velocity.eval( "html/taskindex.vm", "index.${category}.html" )
+
+- Done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/overview.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+  <title>$title</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+
+</head>
+<body>
+
+<h1>$title - Ant Tasks Documentation</h1>
+
+<p>This document is the Ant Tasks specification for the Helium build toolkit.</p>
+
+	
+</body>
+
+</html> 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/style.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+
+
+body  {
+   font-family: verdana, arial,helvetica,sanserif;
+   font-size: 90%;
+}
+
+h2 {
+	font-size: 110%;
+	text-align: left;
+}
+
+div#navigation h2 {
+	text-align: left;
+	background-color: #CCCCFF;
+    font-variant: small-caps;
+    margin-bottom: 0;
+    padding-left: 5%;
+}
+
+h3 {
+	font-size: 100%;
+	text-align: left;
+	background-color: #CCCCFF;
+    margin-bottom: 0;
+}
+
+h4 {
+	font-size: 90%;
+    margin-top: 5%;
+}
+
+div#navigation {
+	float: left;
+}
+
+#navigation div.description {
+    margin-left: 5%;
+    font-size: small;
+}
+
+div.description {
+    margin: 5%;
+    font-size: medium;
+}
+
+pre {
+	border: solid 1px black;
+	background-color: #FFFFCC;
+	font-size: smaller;
+	font-family: monospace;
+}
+
+code {
+	font-size: smaller;
+	font-family: monospace;
+}
+
+table {
+	font-family: arial,helvetica,sanserif;
+	font-size: 80%;
+    margin: 5%;
+    padding: 0px;
+
+//	border: solid 1px black;
+    border-spacing: 0px;
+	border-collapse: collapse;
+}
+
+tr:first-child {
+	background-color: #DDDDFF;
+}
+
+td {
+	margin: 0px;
+	padding: 2px;
+	border: solid 1px black;
+	border-spacing: 0px;
+	border-collapse: collapse;
+}
+
+
+.copyright {
+	color: #999999;
+	font-size: 60%;
+	text-align: center;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/task.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+##
+## This is a Velocity template for generating an HTML
+## document describing an Ant Task/Type 
+## 
+## Objects expected in context:
+##
+##     $taskDoc - Describes an Ant Task/Type (of type AntDoc)
+##
+## 
+<html>
+<head>
+  <title>&lt;$taskDoc.getAntName()&gt;</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+</head>
+
+<body>
+
+    <h2><strong>&lt;$!taskDoc.getAntCategory() : $taskDoc.getAntName()&gt;</strong></h2>
+
+    <h3><strong>Description</strong></h3>
+	<div class="description">
+        $taskDoc.getComment()
+	</div>
+
+    <h3><a name="attributes"><strong>Parameters</strong></a></h3>
+
+	    <table>
+			<tr>
+				<td valign="top" align="left"><b>Attribute</b></td>
+                <td valign="top" align="left"><b>Description</b></td>
+                <td valign="top" align="left"><b>Type</b></td>
+                <td valign="top" align="left"><b>Required?</b></td>
+			</tr>
+
+#foreach ($attr in $taskDoc.attributes )
+
+			<tr>
+    		    <td valign="top" align="left">$attr</td>
+
+                <td valign="top" align="left">
+                     $taskDoc.getAttributeComment($attr)
+                </td>
+
+                <td valign="top" align="left">
+                    $taskDoc.getAttributeType($attr)
+                </td>
+
+                <td valign="top" align="left">
+
+  #if( $taskDoc.getAttributeRequired($attr) )
+                       <b>Yes</b> $taskDoc.getAttributeRequired($attr)
+  #elseif ( $taskDoc.getAttributeNotRequired($attr) )
+                       <b>No</b> $taskDoc.getAttributeNotRequired($attr)
+  #else ?
+  #end
+                </td>
+			</tr>
+#end
+		</table>
+
+        <h3>Parameters accepted as nested elements</h3>
+
+		<div class="description">
+#if ($taskDoc.isTaskContainer())
+			<p>This Task is a Container (it accepts nested Tasks).</p>
+#end
+
+#if ($taskDoc.supportsCharacters())
+			<p>This Task accepts text in its element body.</p>
+#end
+
+#foreach ($element in $taskDoc.getNestedElements())
+            
+  #set($elementDoc = $taskDoc.getElementDoc($element))
+
+    	    <h4>
+                ####
+		#### Put a link for those types that are in this javadoc run
+		#### and have nested elements (since nested-nested elements
+		#### is the only info we are not showing for each nested element)
+		####
+  #if( $elementDoc.sourceIncluded() && ($elementDoc.getNestedElements().hasMoreElements() || $elementDoc.isTagged()))
+		    <a href="${elementDoc.getFullClassName()}.html">
+                    <strong>&lt;$element&gt; ...</strong>
+		    </a>
+  #else
+                    <strong>&lt;$element&gt;</strong>
+
+    #if ( ! $elementDoc.sourceIncluded() )
+                    (Of type ${elementDoc.getAntName()} )
+    #end
+  #end
+			</h4>
+
+  #if($elementDoc.getComment())
+		    $elementDoc.getComment()
+  #end
+
+			<table border="0" cellspacing="2" cellpadding="2" width="100%">
+				<tr>
+	            	<td valign="top" align="left"><b>Attribute</b></td>
+	                <td valign="top" align="left"><b>Description</b></td>
+	                <td valign="top" align="left"><b>Type</b></td>
+	                <td valign="top" align="left"><b>Required</b></td>
+				</tr>
+
+  #foreach ($elementAttr in $elementDoc.getAttributes())
+
+	            <tr>
+    	        	<td>$elementAttr</td>
+        	        <td>
+###                #if($elementDoc.getAttributeComment($elementAttr))
+	                    <span>$!elementDoc.getAttributeComment($elementAttr)</span>
+###                #end
+					</td>
+
+					<td>
+                      $elementDoc.getAttributeType($elementAttr)
+					</td>
+
+					<td>
+
+    #if($elementDoc.getAttributeRequired($elementAttr))
+                       <b>Yes</b> $elementDoc.getAttributeRequired($elementAttr)
+    #elseif ( $elementDoc.getAttributeNotRequired($elementAttr) )
+                       <b>No</b> $elementDoc.getAttributeNotRequired($elementAttr)
+    #else ?
+    #end
+                    
+	                </td>
+				</tr>
+  #end
+			</table>
+#end
+		</div>
+    <br />
+	<hr />
+
+	<div class="copyright"><em>Generated with <a href="http://antdoclet.neuroning.com">AntDoclet</a></em></div>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/taskindex.vm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+##
+## This is an Velocity template for generating an HTML index
+## of the Ant Task/Types
+##
+## Objects expected in context:
+##
+##     $title      - Project title (of type String)
+##     $antroot - (of type AntRoot)
+## 
+<html>
+<head>
+  <title>$title Ant Tasks</title>
+  <link rel="stylesheet" type="text/css" href="style.css" />
+
+</head>
+<body>
+
+<div id="navigation">
+
+    ## Tasks
+<h2>$category Tasks</h2>
+
+	#foreach( $taskDoc in $antroot.getTasksByCategory($category) )
+		#if($taskDoc && !$taskDoc.isInnerClass())
+
+<p><a href="${taskDoc.getFullClassName()}.html" target="task">
+    Task &lt;${taskDoc.getAntName()}&gt;
+       </a>
+</p>
+ <div class="description">
+                 #if($taskDoc.getShortComment())
+		    $taskDoc.getShortComment()
+		 #else
+		    <i>No comment available</i>
+		 #end
+</div>
+		#end
+	#end
+
+
+  ## Types
+<h2>$category Types</h2>
+
+  #foreach( $taskDoc in $antroot.getTypesByCategory($category) )
+    #if($taskDoc && !$taskDoc.isInnerClass() && $taskDoc.isTagged())
+<p><a href="${taskDoc.getFullClassName()}.html"  target="task">
+    Type &lt;${taskDoc.getAntName()}&gt;
+   </a>
+</p>
+
+<div class="description">
+                #if($taskDoc.getShortComment())
+		    $taskDoc.getShortComment()
+		 #else
+		    <i>No comment available</i>
+		 #end
+</div>
+
+    #end
+  #end
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/src/build.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+======================
+Building Helium Antlib
+======================
+
+Prerequisite
+------------
+
+Before using bld commands please make sure your *JAVA_HOME* environment variable is pointing to the required JDK.  
+
+
+Building
+--------
+
+Simply run the following command on the route of your delivery:
+
+::
+   
+   > bld build
+   Buildfile: build.xml
+   
+   build:
+   
+   compile:
+        [echo] Compiling helium-core
+       [mkdir] Created dir: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\core\classes
+       [javac] Compiling 25 source files to C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\core\classes
+       [javac] Note: Some input files use unchecked or unsafe operations.
+       [javac] Note: Recompile with -Xlint:unchecked for details.
+   
+   ...
+   
+   build:
+        [echo] helium-signaling is built.
+   
+   BUILD SUCCESSFUL
+   Total time: 6 seconds
+   
+Cleaning
+--------
+
+To cleanup the generated files just run:
+
+::
+   
+   > bld clean
+   Buildfile: build.xml
+   
+   clean:
+   
+   clean:
+        [echo] Cleaning helium-core
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\core\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-core.jar
+
+   clean:
+        [echo] Cleaning helium-diamonds
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\diamonds\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-diamonds.jar
+   
+   clean:
+        [echo] Cleaning helium-metadata
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\metadata\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-metadata.jar
+   
+   clean:
+        [echo] Cleaning helium-quality
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\quality\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-quality.jar
+
+   clean:
+        [echo] Cleaning helium-scm
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\scm\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-scm.jar
+   
+   clean:
+        [echo] Cleaning helium-signaling
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\signaling\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-signaling.jar
+   
+   BUILD SUCCESSFUL
+   Total time: 1 second
+   
+Testing
+-------
+
+To run all the testing (junit + antunit):
+
+::
+   
+   > bld test
+
+
+JUnit testing:
+::
+   
+   > bld junit
+
+AntUnit testing:
+::
+   
+   > bld unittest
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/src/conf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,179 @@
+# -*- coding: utf-8 -*-
+#============================================================================ 
+#Name        : ant.py 
+#Part of     : Helium Antlib
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+#
+# Helium Documentation documentation build configuration file, created by
+# sphinx-quickstart on Fri May 09 09:49:44 2008.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default value; values that are commented out
+# serve to show the default value.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('some/directory'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+#extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['.templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = 'Helium Antlib'
+copyright = '2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '0.23'
+# The full version, including alpha/beta/rc tags.
+release = '0.23'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+#exclude_dirs = []
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# The name of an image file (within the static path) to place at the top of
+# the sidebar.
+html_logo = 'images/helium_logo_small.jpg'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['.static', 'images']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Helium Antlib doc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('index', 'Helium.tex', 'Helium Antlib Documentation', 'The Helium Team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
Binary file buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_large.jpg has changed
Binary file buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_small.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/src/index.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+=============
+Helium Antlib
+=============
+.. _Helium Antlib Java API: api/javadoc/index.html
+.. _Helium Antlib AntDoclet: api/doclet/index.html
+
+Developer Documentation
+=======================
+.. toctree::
+   :maxdepth: 1
+
+   structure
+   build
+   
+
+Documentation
+=============
+   * `Helium Antlib AntDoclet`_
+   * `Helium Antlib Java API`_
+   
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/src/structure.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,146 @@
+==============================
+Project Development guidelines
+==============================
+
+
+Helium Antlib is a standalone project which is completely independent from Helium. Its only main requirements are:
+ * Ant 1.7.0
+ * JDK 1.6 or newer
+
+The project is split in several sub-modules which cover specific features.
+
+Anatomy of the project
+======================
+
+::
+   
+   - build.xml
+   - bld.bat
+   - bld.sh
+   + antlibs
+     Ant specific dependencies needed to execute ant properly
+     e.g: Java checkstyle, Code coverage tools
+     The jar in that folder will not be used as compilation dependencies
+   + lib
+     Common dependencies between modules.
+     e.g: common logging, ...
+   + doc
+     General documentation of the project
+   + module1
+   + module1
+   + modulen...
+
+
+Anatomy of a module
+===================
+
+A module contains a set of Ant feature related to a specific domain (e.g: Diamonds, SCM). The following diagram shows 
+the physical structure of a module.
+
+::
+   
+   + <module_name>
+         - build.xml
+         - bld.bat
+         - bld.sh
+         + lib
+           module specific jar dependencies
+         + src
+            + com
+               + nokia
+                   + helium
+                      + <module_name>
+                          + ant
+                             + taskdefs
+                               source of the Ant tasks
+                             + types
+                               source of the Ant DataType 
+                             + listener
+                               source of the Ant Listener
+                             + condition
+                               source of the Ant Conditions
+         + tests
+           - build.xml
+           - bld.bat
+           - bld.sh
+           - test_xxx.ant.xml* - Unittest implemented using AntUnit  
+           + data
+             data used for the the unittests.
+           + src
+             + com
+                + nokia
+                   + helium
+                      + <module_name>
+                         + tests
+                            source of junit unittests.
+
+
+
+General guidelines
+==================
+
+Distribution policy
+-------------------
+
+Each directory of the Antlib project must have a Distribution.policy.S60 file with the policy value 7 (see S60 guidelines).
+
+
+
+External dependencies
+---------------------
+
+External dependencies added to the project must be in compliance with Nokia process and rules.
+
+
+Source code license
+-------------------
+Each file added to the project should include the following license header.
+::
+   
+   /*
+    * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+    * All rights reserved.
+    * This component and the accompanying materials are made available
+    * under the terms of the License "Eclipse Public License v1.0"
+    * which accompanies this distribution, and is available
+    * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+    *
+    * Initial Contributors:
+    * Nokia Corporation - initial contribution.
+    *
+    * Contributors:
+    *
+    * Description:  
+    *
+    */
+
+Documentation
+-------------
+
+All classes and methods must be documented. Ant facade classes (like Task or DataType)
+must be Antdoclet documented (preferably with usage example).
+
+You can find more information on how to document Ant task using the Antdoclet plugin on http://antdoclet.neuroning.com/.
+ 
+Logging
+-------
+
+Developer must use standard Ant logging for any user log output.
+Internal debug logging must be implemented using Log4J framework.
+
+This is an example on how to use logging:
+::
+   
+   import org.apache.log4j.Logger;
+   
+   class MyClass extends Task {
+       private static Logger log = Logger.getLogger(MyClass.class);
+       
+       public void execute() {
+           log("Executing...");
+           log.debug("some useful debug information.");
+       }
+   }
+
+
+Please find more information on Log4J from the online manual: http://logging.apache.org/log4j/1.2/manual.html.
Binary file buildframework/helium/external/helium-antlib/doc/tools/Jinja-1.2-py2.5-win32.egg has changed
Binary file buildframework/helium/external/helium-antlib/doc/tools/Pygments-0.10-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+Metadata-Version: 1.0
+Name: Sphinx
+Version: 0.5.1
+Summary: Python documentation generator
+Home-page: http://sphinx.pocoo.org/
+Author: Georg Brandl
+Author-email: georg@python.org
+License: BSD
+Download-URL: http://pypi.python.org/pypi/Sphinx
+Description: 
+        Sphinx is a tool that makes it easy to create intelligent and beautiful
+        documentation for Python projects (or other documents consisting of
+        multiple reStructuredText sources), written by Georg Brandl.
+        It was originally created to translate the new Python documentation,
+        but has now been cleaned up in the hope that it will be useful to many
+        other projects.
+        
+        Sphinx uses reStructuredText as its markup language, and many of its strengths
+        come from the power and straightforwardness of reStructuredText and its
+        parsing and translating suite, the Docutils.
+        
+        Although it is still under constant development, the following features
+        are already present, work fine and can be seen "in action" in the Python docs:
+        
+        * Output formats: HTML (including Windows HTML Help), plain text and LaTeX,
+        for printable PDF versions
+        * Extensive cross-references: semantic markup and automatic links
+        for functions, classes, glossary terms and similar pieces of information
+        * Hierarchical structure: easy definition of a document tree, with automatic
+        links to siblings, parents and children
+        * Automatic indices: general index as well as a module index
+        * Code handling: automatic highlighting using the Pygments highlighter
+        * Various extensions are available, e.g. for automatic testing of snippets
+        and inclusion of appropriately formatted docstrings.
+        
+Platform: any
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Console
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Utilities
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,216 @@
+AUTHORS
+CHANGES
+EXAMPLES
+LICENSE
+MANIFEST.in
+Makefile
+README
+TODO
+babel.cfg
+ez_setup.py
+setup.cfg
+setup.py
+sphinx-build.py
+sphinx-quickstart.py
+Sphinx.egg-info/PKG-INFO
+Sphinx.egg-info/SOURCES.txt
+Sphinx.egg-info/dependency_links.txt
+Sphinx.egg-info/entry_points.txt
+Sphinx.egg-info/not-zip-safe
+Sphinx.egg-info/requires.txt
+Sphinx.egg-info/top_level.txt
+doc/Makefile
+doc/builders.rst
+doc/changes.rst
+doc/concepts.rst
+doc/conf.py
+doc/config.rst
+doc/contents.rst
+doc/examples.rst
+doc/extensions.rst
+doc/glossary.rst
+doc/intro.rst
+doc/rest.rst
+doc/templating.rst
+doc/_static/sphinx.png
+doc/_templates/index.html
+doc/_templates/indexsidebar.html
+doc/_templates/layout.html
+doc/ext/appapi.rst
+doc/ext/autodoc.rst
+doc/ext/builderapi.rst
+doc/ext/coverage.rst
+doc/ext/doctest.rst
+doc/ext/ifconfig.rst
+doc/ext/intersphinx.rst
+doc/ext/math.rst
+doc/ext/refcounting.rst
+doc/ext/todo.rst
+doc/markup/code.rst
+doc/markup/desc.rst
+doc/markup/index.rst
+doc/markup/inline.rst
+doc/markup/misc.rst
+doc/markup/para.rst
+sphinx/__init__.py
+sphinx/_jinja.py
+sphinx/addnodes.py
+sphinx/application.py
+sphinx/builder.py
+sphinx/cmdline.py
+sphinx/config.py
+sphinx/environment.py
+sphinx/highlighting.py
+sphinx/htmlhelp.py
+sphinx/htmlwriter.py
+sphinx/latexwriter.py
+sphinx/linkcheck.py
+sphinx/quickstart.py
+sphinx/roles.py
+sphinx/search.py
+sphinx/setup_command.py
+sphinx/textwriter.py
+sphinx/directives/__init__.py
+sphinx/directives/code.py
+sphinx/directives/desc.py
+sphinx/directives/other.py
+sphinx/ext/__init__.py
+sphinx/ext/autodoc.py
+sphinx/ext/coverage.py
+sphinx/ext/doctest.py
+sphinx/ext/ifconfig.py
+sphinx/ext/intersphinx.py
+sphinx/ext/jsmath.py
+sphinx/ext/mathbase.py
+sphinx/ext/pngmath.py
+sphinx/ext/refcounting.py
+sphinx/ext/todo.py
+sphinx/locale/__init__.py
+sphinx/locale/__init__.pyc
+sphinx/locale/sphinx.pot
+sphinx/locale/cs/LC_MESSAGES/sphinx.js
+sphinx/locale/cs/LC_MESSAGES/sphinx.mo
+sphinx/locale/cs/LC_MESSAGES/sphinx.po
+sphinx/locale/de/LC_MESSAGES/sphinx.js
+sphinx/locale/de/LC_MESSAGES/sphinx.mo
+sphinx/locale/de/LC_MESSAGES/sphinx.po
+sphinx/locale/es/LC_MESSAGES/sphinx.js
+sphinx/locale/es/LC_MESSAGES/sphinx.mo
+sphinx/locale/es/LC_MESSAGES/sphinx.po
+sphinx/locale/fr/LC_MESSAGES/sphinx.js
+sphinx/locale/fr/LC_MESSAGES/sphinx.mo
+sphinx/locale/fr/LC_MESSAGES/sphinx.po
+sphinx/locale/ja/LC_MESSAGES/sphinx.js
+sphinx/locale/ja/LC_MESSAGES/sphinx.mo
+sphinx/locale/ja/LC_MESSAGES/sphinx.po
+sphinx/locale/nl/LC_MESSAGES/sphinx.js
+sphinx/locale/nl/LC_MESSAGES/sphinx.mo
+sphinx/locale/nl/LC_MESSAGES/sphinx.po
+sphinx/locale/pl/LC_MESSAGES/sphinx.js
+sphinx/locale/pl/LC_MESSAGES/sphinx.mo
+sphinx/locale/pl/LC_MESSAGES/sphinx.po
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
+sphinx/locale/sl/LC_MESSAGES/sphinx.js
+sphinx/locale/sl/LC_MESSAGES/sphinx.mo
+sphinx/locale/sl/LC_MESSAGES/sphinx.po
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
+sphinx/static/contents.png
+sphinx/static/default.css
+sphinx/static/doctools.js
+sphinx/static/file.png
+sphinx/static/jquery.js
+sphinx/static/minus.png
+sphinx/static/navigation.png
+sphinx/static/plus.png
+sphinx/static/rightsidebar.css
+sphinx/static/searchtools.js
+sphinx/static/sphinxdoc.css
+sphinx/static/stickysidebar.css
+sphinx/static/traditional.css
+sphinx/templates/defindex.html
+sphinx/templates/genindex-single.html
+sphinx/templates/genindex-split.html
+sphinx/templates/genindex.html
+sphinx/templates/layout.html
+sphinx/templates/modindex.html
+sphinx/templates/opensearch.xml
+sphinx/templates/page.html
+sphinx/templates/search.html
+sphinx/templates/changes/frameset.html
+sphinx/templates/changes/rstsource.html
+sphinx/templates/changes/versionchanges.html
+sphinx/texinputs/Makefile
+sphinx/texinputs/fncychap.sty
+sphinx/texinputs/howto.cls
+sphinx/texinputs/manual.cls
+sphinx/texinputs/python.ist
+sphinx/texinputs/sphinx.sty
+sphinx/texinputs/tabulary.sty
+sphinx/util/__init__.py
+sphinx/util/compat.py
+sphinx/util/console.py
+sphinx/util/jsdump.py
+sphinx/util/png.py
+sphinx/util/smartypants.py
+sphinx/util/stemmer.py
+sphinx/util/texescape.py
+tests/path.py
+tests/path.pyc
+tests/run.py
+tests/test_application.py
+tests/test_application.pyc
+tests/test_autodoc.py
+tests/test_autodoc.pyc
+tests/test_build.py
+tests/test_build.pyc
+tests/test_config.py
+tests/test_config.pyc
+tests/test_coverage.py
+tests/test_coverage.pyc
+tests/test_env.py
+tests/test_env.pyc
+tests/test_i18n.py
+tests/test_i18n.pyc
+tests/test_markup.py
+tests/test_markup.pyc
+tests/test_quickstart.py
+tests/test_quickstart.pyc
+tests/util.py
+tests/util.pyc
+tests/etree13/ElementPath.py
+tests/etree13/ElementPath.pyc
+tests/etree13/ElementTree.py
+tests/etree13/ElementTree.pyc
+tests/etree13/HTMLTreeBuilder.py
+tests/etree13/__init__.py
+tests/etree13/__init__.pyc
+tests/root/Makefile
+tests/root/autodoc.txt
+tests/root/conf.py
+tests/root/contents.txt
+tests/root/desc.txt
+tests/root/ext.py
+tests/root/ext.pyc
+tests/root/images.txt
+tests/root/img.gif
+tests/root/img.pdf
+tests/root/img.png
+tests/root/includes.txt
+tests/root/literal.inc
+tests/root/markup.txt
+tests/root/math.txt
+tests/root/wrongenc.inc
+tests/root/_static/README
+tests/root/_templates/layout.html
+tests/root/special/api.h
+tests/root/subdir/images.txt
+tests/root/subdir/img.png
+tests/root/subdir/include.inc
+tests/root/subdir/simg.png
+utils/check_sources.py
+utils/pylintrc
+utils/reindent.py
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+[console_scripts]
+sphinx-build = sphinx:main
+sphinx-quickstart = sphinx.quickstart:main
+
+[distutils.commands]
+build_sphinx = sphinx.setup_command:BuildDoc
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,3 @@
+Pygments>=0.8
+Jinja>=1.1
+docutils>=0.4
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+sphinx
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+"""
+    Sphinx
+    ~~~~~~
+
+    The Sphinx documentation toolchain.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+
+__revision__ = '$Revision$'
+__version__ = '0.5.1'
+__released__ = '0.5.1'
+
+
+def main(argv=sys.argv):
+    if sys.version_info[:3] < (2, 4, 0):
+        print >>sys.stderr, \
+              'Error: Sphinx requires at least Python 2.4 to run.'
+        return 1
+
+    try:
+        from sphinx import cmdline
+    except ImportError, err:
+        errstr = str(err)
+        if errstr.lower().startswith('no module named'):
+            whichmod = errstr[16:]
+            if whichmod.startswith('docutils'):
+                whichmod = 'Docutils library'
+            elif whichmod.startswith('jinja'):
+                whichmod = 'Jinja library'
+            elif whichmod == 'roman':
+                whichmod = 'roman module (which is distributed with Docutils)'
+            else:
+                whichmod += ' module'
+            print >>sys.stderr, \
+                  'Error: The %s cannot be found. Did you install Sphinx '\
+                  'and its dependencies correctly?' % whichmod
+            return 1
+        raise
+    return cmdline.main(argv)
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx._jinja
+    ~~~~~~~~~~~~~
+
+    Jinja glue.
+
+    :copyright: 2007-2008 by Georg Brandl, Horst Gutmann.
+    :license: BSD.
+"""
+
+import codecs
+from os import path
+
+from sphinx.util import mtimes_of_files
+from sphinx.application import TemplateBridge
+
+from jinja import Environment
+from jinja.loaders import BaseLoader
+from jinja.exceptions import TemplateNotFound
+
+
+def babel_extract(fileobj, keywords, comment_tags, options):
+    """
+    Simple extractor to get some basic Babel support.
+    """
+    env = Environment()
+    for lineno, sg, pl in env.get_translations_for_string(fileobj.read()):
+        yield lineno, None, (sg, pl), ''
+
+
+class SphinxFileSystemLoader(BaseLoader):
+    """
+    A loader that loads templates either relative to one of a list of given
+    paths, or from an absolute path.
+    """
+
+    def __init__(self, basepath, extpaths):
+        self.basepath = path.abspath(basepath)
+        self.extpaths = map(path.abspath, extpaths)
+        self.searchpaths = self.extpaths + [self.basepath]
+
+    def get_source(self, environment, name, parent):
+        name = name.replace('/', path.sep)
+        if name.startswith('!'):
+            name = name[1:]
+            if not path.exists(path.join(self.basepath, name)):
+                raise TemplateNotFound(name)
+            filename = path.join(self.basepath, name)
+        elif path.isabs(name):
+            if not path.exists(name):
+                raise TemplateNotFound(name)
+            filename = name
+        else:
+            for searchpath in self.searchpaths:
+                if path.exists(path.join(searchpath, name)):
+                    filename = path.join(searchpath, name)
+                    break
+            else:
+                raise TemplateNotFound(name)
+        f = codecs.open(filename, 'r', environment.template_charset)
+        try:
+            return f.read()
+        finally:
+            f.close()
+
+
+class TranslatorEnvironment(Environment):
+    class _Translator(object):
+        def __init__(self, translator):
+            self.trans = translator
+
+        def gettext(self, string):
+            return self.trans.ugettext(string)
+
+        def ngettext(self, singular, plural, n):
+            return self.trans.ungettext(singular, plural, n)
+
+    def __init__(self, *args, **kwargs):
+        self.translator = kwargs['translator']
+        del kwargs['translator']
+        super(TranslatorEnvironment, self).__init__(*args, **kwargs)
+
+    def get_translator(self, context):
+        return TranslatorEnvironment._Translator(self.translator)
+
+
+class BuiltinTemplates(TemplateBridge):
+    def init(self, builder):
+        self.templates = {}
+        base_templates_path = path.join(path.dirname(__file__), 'templates')
+        ext_templates_path = [path.join(builder.confdir, dir)
+                              for dir in builder.config.templates_path]
+        self.templates_path = [base_templates_path] + ext_templates_path
+        loader = SphinxFileSystemLoader(base_templates_path, ext_templates_path)
+        if builder.translator is not None:
+            self.jinja_env = TranslatorEnvironment(loader=loader,
+                    friendly_traceback=False, translator=builder.translator)
+        else:
+            self.jinja_env = Environment(loader=loader,
+                    # disable traceback, more likely that something
+                    # in the application is broken than in the templates
+                    friendly_traceback=False)
+
+    def newest_template_mtime(self):
+        return max(mtimes_of_files(self.templates_path, '.html'))
+
+    def render(self, template, context):
+        if template in self.templates:
+            return self.templates[template].render(context)
+        templateobj = self.templates[template] = \
+                      self.jinja_env.get_template(template)
+        return templateobj.render(context)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.addnodes
+    ~~~~~~~~~~~~~~~
+
+    Additional docutils nodes.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+# index markup
+class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass
+
+# description units (classdesc, funcdesc etc.)
+
+# parent node for signature and content
+class desc(nodes.Admonition, nodes.Element): pass
+
+# additional name parts (module name, class name)
+class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# compatibility alias
+desc_classname = desc_addname
+# return type (C); object type, e.g. -> annotation (Python)
+class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# main name of object
+class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# argument list
+class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement):
+    child_text_separator = ', '
+class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement):
+    child_text_separator = ', '
+    def astext(self):
+        return '[' + nodes.TextElement.astext(self) + ']'
+# annotation (not Python 3-style annotations)
+class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+# node for content
+class desc_content(nodes.General, nodes.Element): pass
+
+# \versionadded, \versionchanged, \deprecated
+class versionmodified(nodes.Admonition, nodes.TextElement): pass
+
+# seealso
+class seealso(nodes.Admonition, nodes.Element): pass
+
+# productionlist
+class productionlist(nodes.Admonition, nodes.Element): pass
+class production(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+# toc tree
+class toctree(nodes.General, nodes.Element): pass
+
+# centered
+class centered(nodes.Part, nodes.Element): pass
+
+# pending xref
+class pending_xref(nodes.Element): pass
+
+# compact paragraph -- never makes a <p>
+class compact_paragraph(nodes.paragraph): pass
+
+# for the ACKS list
+class acks(nodes.Element): pass
+
+# sets the highlighting language for literal blocks
+class highlightlang(nodes.Element): pass
+
+# like emphasis, but doesn't apply further text processors, e.g. smartypants
+class literal_emphasis(nodes.emphasis): pass
+
+# glossary
+class glossary(nodes.Element): pass
+
+# module declaration
+class module(nodes.Element): pass
+
+# start of a file, used in the LaTeX builder only
+class start_of_file(nodes.Element): pass
+
+# tabular column specification, used for the LaTeX writer
+class tabular_col_spec(nodes.Element): pass
+
+# meta directive -- same as docutils' standard meta node, but pickleable
+class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass
+
+# make them known to docutils. this is needed, because the HTML writer
+# will choke at some point if these are not added
+nodes._add_node_class_names("""index desc desc_content desc_signature desc_type
+      desc_addname desc_name desc_parameterlist desc_parameter desc_optional
+      centered versionmodified seealso productionlist production toctree
+      pending_xref compact_paragraph highlightlang literal_emphasis
+      glossary acks module start_of_file tabular_col_spec meta""".split())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/application.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,325 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.application
+    ~~~~~~~~~~~~~~~~~~
+
+    Sphinx application object.
+
+    Gracefully adapted from the TextPress system by Armin.
+
+
+    :copyright: 2008 by Georg Brandl, Armin Ronacher.
+    :license: BSD.
+"""
+
+import sys
+import posixpath
+from cStringIO import StringIO
+
+from docutils import nodes
+from docutils.parsers.rst import directives, roles
+
+import sphinx
+from sphinx.roles import xfileref_role, innernodetypes
+from sphinx.config import Config
+from sphinx.builder import builtin_builders, StandaloneHTMLBuilder
+from sphinx.directives import desc_directive, target_directive, additional_xref_types
+from sphinx.environment import SphinxStandaloneReader
+from sphinx.util.console import bold
+
+
+class SphinxError(Exception):
+    """
+    Base class for Sphinx errors that are shown to the user in a nicer
+    way than normal exceptions.
+    """
+    category = 'Sphinx error'
+
+class ExtensionError(SphinxError):
+    """Raised if something's wrong with the configuration."""
+    category = 'Extension error'
+
+    def __init__(self, message, orig_exc=None):
+        super(ExtensionError, self).__init__(message)
+        self.orig_exc = orig_exc
+
+    def __repr__(self):
+        if self.orig_exc:
+            return '%s(%r, %r)' % (self.__class__.__name__,
+                                   self.message, self.orig_exc)
+        return '%s(%r)' % (self.__class__.__name__, self.message)
+
+    def __str__(self):
+        parent_str = super(ExtensionError, self).__str__()
+        if self.orig_exc:
+            return '%s (exception: %s)' % (parent_str, self.orig_exc)
+        return parent_str
+
+
+# List of all known core events. Maps name to arguments description.
+events = {
+    'builder-inited': '',
+    'env-purge-doc': 'env, docname',
+    'source-read': 'docname, source text',
+    'doctree-read': 'the doctree before being pickled',
+    'missing-reference': 'env, node, contnode',
+    'doctree-resolved': 'doctree, docname',
+    'env-updated': 'env',
+    'html-page-context': 'pagename, context, doctree or None',
+    'build-finished': 'exception',
+}
+
+CONFIG_FILENAME = 'conf.py'
+
+class Sphinx(object):
+
+    def __init__(self, srcdir, confdir, outdir, doctreedir, buildername,
+                 confoverrides, status, warning=sys.stderr, freshenv=False):
+        self.next_listener_id = 0
+        self._listeners = {}
+        self.builderclasses = builtin_builders.copy()
+        self.builder = None
+
+        self.srcdir = srcdir
+        self.confdir = confdir
+        self.outdir = outdir
+        self.doctreedir = doctreedir
+
+        if status is None:
+            self._status = StringIO()
+            self.quiet = True
+        else:
+            self._status = status
+            self.quiet = False
+        if warning is None:
+            self._warning = StringIO()
+        else:
+            self._warning = warning
+        self._warncount = 0
+
+        self._events = events.copy()
+
+        # status code for command-line application
+        self.statuscode = 0
+
+        # read config
+        self.config = Config(confdir, CONFIG_FILENAME, confoverrides)
+
+        # load all extension modules
+        for extension in self.config.extensions:
+            self.setup_extension(extension)
+        # the config file itself can be an extension
+        if self.config.setup:
+            self.config.setup(self)
+
+        # now that we know all config values, collect them from conf.py
+        self.config.init_values()
+
+        if buildername is None:
+            print >>status, 'No builder selected, using default: html'
+            buildername = 'html'
+        if buildername not in self.builderclasses:
+            raise SphinxError('Builder name %s not registered' % buildername)
+
+        self.info(bold('Sphinx v%s, building %s' % (sphinx.__released__,
+                                                    buildername)))
+
+        builderclass = self.builderclasses[buildername]
+        self.builder = builderclass(self, freshenv=freshenv)
+        self.emit('builder-inited')
+
+    def build(self, all_files, filenames):
+        try:
+            if all_files:
+                self.builder.build_all()
+            elif filenames:
+                self.builder.build_specific(filenames)
+            else:
+                self.builder.build_update()
+        except Exception, err:
+            self.emit('build-finished', err)
+            raise
+        else:
+            self.emit('build-finished', None)
+
+    def warn(self, message):
+        self._warncount += 1
+        try:
+            self._warning.write('WARNING: %s\n' % message)
+        except UnicodeEncodeError:
+            encoding = getattr(self._warning, 'encoding', 'ascii')
+            self._warning.write(('WARNING: %s\n' % message).encode(encoding, 'replace'))
+
+    def info(self, message='', nonl=False):
+        try:
+            self._status.write(message)
+        except UnicodeEncodeError:
+            encoding = getattr(self._status, 'encoding', 'ascii')
+            self._status.write(message.encode(encoding, 'replace'))
+        if not nonl:
+            self._status.write('\n')
+        self._status.flush()
+
+    # general extensibility interface
+
+    def setup_extension(self, extension):
+        """Import and setup a Sphinx extension module."""
+        try:
+            mod = __import__(extension, None, None, ['setup'])
+        except ImportError, err:
+            raise ExtensionError('Could not import extension %s' % extension, err)
+        if hasattr(mod, 'setup'):
+            mod.setup(self)
+
+    def import_object(self, objname, source=None):
+        """Import an object from a 'module.name' string."""
+        try:
+            module, name = objname.rsplit('.', 1)
+        except ValueError, err:
+            raise ExtensionError('Invalid full object name %s' % objname +
+                                 (source and ' (needed for %s)' % source or ''), err)
+        try:
+            return getattr(__import__(module, None, None, [name]), name)
+        except ImportError, err:
+            raise ExtensionError('Could not import %s' % module +
+                                 (source and ' (needed for %s)' % source or ''), err)
+        except AttributeError, err:
+            raise ExtensionError('Could not find %s' % objname +
+                                 (source and ' (needed for %s)' % source or ''), err)
+
+    # event interface
+
+    def _validate_event(self, event):
+        event = intern(event)
+        if event not in self._events:
+            raise ExtensionError('Unknown event name: %s' % event)
+
+    def connect(self, event, callback):
+        self._validate_event(event)
+        listener_id = self.next_listener_id
+        if event not in self._listeners:
+            self._listeners[event] = {listener_id: callback}
+        else:
+            self._listeners[event][listener_id] = callback
+        self.next_listener_id += 1
+        return listener_id
+
+    def disconnect(self, listener_id):
+        for event in self._listeners.itervalues():
+            event.pop(listener_id, None)
+
+    def emit(self, event, *args):
+        result = []
+        if event in self._listeners:
+            for _, callback in self._listeners[event].iteritems():
+                result.append(callback(self, *args))
+        return result
+
+    def emit_firstresult(self, event, *args):
+        for result in self.emit(event, *args):
+            if result is not None:
+                return result
+        return None
+
+    # registering addon parts
+
+    def add_builder(self, builder):
+        if not hasattr(builder, 'name'):
+            raise ExtensionError('Builder class %s has no "name" attribute' % builder)
+        if builder.name in self.builderclasses:
+            raise ExtensionError('Builder %r already exists (in module %s)' % (
+                builder.name, self.builderclasses[builder.name].__module__))
+        self.builderclasses[builder.name] = builder
+
+    def add_config_value(self, name, default, rebuild_env):
+        if name in self.config.values:
+            raise ExtensionError('Config value %r already present' % name)
+        self.config.values[name] = (default, rebuild_env)
+
+    def add_event(self, name):
+        if name in self._events:
+            raise ExtensionError('Event %r already present' % name)
+        self._events[name] = ''
+
+    def add_node(self, node, **kwds):
+        nodes._add_node_class_names([node.__name__])
+        for key, val in kwds.iteritems():
+            try:
+                visit, depart = val
+            except ValueError:
+                raise ExtensionError('Value for key %r must be a (visit, depart) '
+                                     'function tuple' % key)
+            if key == 'html':
+                from sphinx.htmlwriter import HTMLTranslator as translator
+            elif key == 'latex':
+                from sphinx.latexwriter import LaTeXTranslator as translator
+            elif key == 'text':
+                from sphinx.textwriter import TextTranslator as translator
+            else:
+                # ignore invalid keys for compatibility
+                continue
+            setattr(translator, 'visit_'+node.__name__, visit)
+            if depart:
+                setattr(translator, 'depart_'+node.__name__, depart)
+
+    def add_directive(self, name, func, content, arguments, **options):
+        func.content = content
+        func.arguments = arguments
+        func.options = options
+        directives.register_directive(name, func)
+
+    def add_role(self, name, role):
+        roles.register_canonical_role(name, role)
+
+    def add_description_unit(self, directivename, rolename, indextemplate='',
+                             parse_node=None, ref_nodeclass=None):
+        additional_xref_types[directivename] = (rolename, indextemplate, parse_node)
+        directives.register_directive(directivename, desc_directive)
+        roles.register_canonical_role(rolename, xfileref_role)
+        if ref_nodeclass is not None:
+            innernodetypes[rolename] = ref_nodeclass
+
+    def add_crossref_type(self, directivename, rolename, indextemplate='',
+                          ref_nodeclass=None):
+        additional_xref_types[directivename] = (rolename, indextemplate, None)
+        directives.register_directive(directivename, target_directive)
+        roles.register_canonical_role(rolename, xfileref_role)
+        if ref_nodeclass is not None:
+            innernodetypes[rolename] = ref_nodeclass
+
+    def add_transform(self, transform):
+        SphinxStandaloneReader.transforms.append(transform)
+
+    def add_javascript(self, filename):
+        StandaloneHTMLBuilder.script_files.append(
+            posixpath.join('_static', filename))
+
+
+class TemplateBridge(object):
+    """
+    This class defines the interface for a "template bridge", that is, a class
+    that renders templates given a template name and a context.
+    """
+
+    def init(self, builder):
+        """
+        Called by the builder to initialize the template system.  *builder*
+        is the builder object; you'll probably want to look at the value of
+        ``builder.config.templates_path``.
+        """
+        raise NotImplementedError('must be implemented in subclasses')
+
+    def newest_template_mtime(self):
+        """
+        Called by the builder to determine if output files are outdated
+        because of template changes.  Return the mtime of the newest template
+        file that was changed.  The default implementation returns ``0``.
+        """
+        return 0
+
+    def render(self, template, context):
+        """
+        Called by the builder to render a *template* with a specified
+        context (a Python dictionary).
+        """
+        raise NotImplementedError('must be implemented in subclasses')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1272 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.builder
+    ~~~~~~~~~~~~~~
+
+    Builder classes for different output formats.
+
+    :copyright: 2007-2008 by Georg Brandl, Sebastian Wiesner, Horst Gutmann.
+    :license: BSD.
+"""
+
+import os
+import time
+import codecs
+import shutil
+import gettext
+import cPickle as pickle
+from os import path
+from cgi import escape
+
+from docutils import nodes
+from docutils.io import StringOutput, FileOutput, DocTreeInput
+from docutils.core import publish_parts
+from docutils.utils import new_document
+from docutils.frontend import OptionParser
+from docutils.readers.doctree import Reader as DoctreeReader
+
+from sphinx import addnodes, locale, __version__
+from sphinx.util import ensuredir, relative_uri, SEP, os_path, texescape, ustrftime
+from sphinx.htmlhelp import build_hhx
+from sphinx.htmlwriter import HTMLWriter, HTMLTranslator, SmartyPantsHTMLTranslator
+from sphinx.textwriter import TextWriter
+from sphinx.latexwriter import LaTeXWriter
+from sphinx.environment import BuildEnvironment, NoUri
+from sphinx.highlighting import PygmentsBridge
+from sphinx.util.console import bold, purple, darkgreen
+from sphinx.search import js_index
+
+try:
+    import json
+except ImportError:
+    try:
+        import simplejson as json
+    except ImportError:
+        json = None
+
+# side effect: registers roles and directives
+from sphinx import roles
+from sphinx import directives
+
+ENV_PICKLE_FILENAME = 'environment.pickle'
+LAST_BUILD_FILENAME = 'last_build'
+INVENTORY_FILENAME = 'objects.inv'
+
+
+class Builder(object):
+    """
+    Builds target formats from the reST sources.
+    """
+
+    # builder's name, for the -b command line options
+    name = ''
+
+    def __init__(self, app, env=None, freshenv=False):
+        self.srcdir = app.srcdir
+        self.confdir = app.confdir
+        self.outdir = app.outdir
+        self.doctreedir = app.doctreedir
+        if not path.isdir(self.doctreedir):
+            os.makedirs(self.doctreedir)
+
+        self.app = app
+        self.warn = app.warn
+        self.info = app.info
+        self.config = app.config
+
+        self.load_i18n()
+
+        # images that need to be copied over (source -> dest)
+        self.images = {}
+
+        # if None, this is set in load_env()
+        self.env = env
+        self.freshenv = freshenv
+
+        self.init()
+        self.load_env()
+
+    # helper methods
+
+    def init(self):
+        """Load necessary templates and perform initialization."""
+        raise NotImplementedError
+
+    def init_templates(self):
+        # Call this from init() if you need templates.
+        if self.config.template_bridge:
+            self.templates = self.app.import_object(
+                self.config.template_bridge, 'template_bridge setting')()
+        else:
+            from sphinx._jinja import BuiltinTemplates
+            self.templates = BuiltinTemplates()
+        self.templates.init(self)
+
+    def get_target_uri(self, docname, typ=None):
+        """
+        Return the target URI for a document name (typ can be used to qualify
+        the link characteristic for individual builders).
+        """
+        raise NotImplementedError
+
+    def get_relative_uri(self, from_, to, typ=None):
+        """
+        Return a relative URI between two source filenames. May raise environment.NoUri
+        if there's no way to return a sensible URI.
+        """
+        return relative_uri(self.get_target_uri(from_),
+                            self.get_target_uri(to, typ))
+
+    def get_outdated_docs(self):
+        """
+        Return an iterable of output files that are outdated, or a string describing
+        what an update build will build.
+        """
+        raise NotImplementedError
+
+    def status_iterator(self, iterable, summary, colorfunc=darkgreen):
+        l = -1
+        for item in iterable:
+            if l == -1:
+                self.info(bold(summary), nonl=1)
+                l = 0
+            self.info(colorfunc(item) + ' ', nonl=1)
+            yield item
+        if l == 0:
+            self.info()
+
+    supported_image_types = []
+
+    def post_process_images(self, doctree):
+        """
+        Pick the best candidate for all image URIs.
+        """
+        for node in doctree.traverse(nodes.image):
+            if '?' in node['candidates']:
+                # don't rewrite nonlocal image URIs
+                continue
+            if '*' not in node['candidates']:
+                for imgtype in self.supported_image_types:
+                    candidate = node['candidates'].get(imgtype, None)
+                    if candidate:
+                        break
+                else:
+                    self.warn('%s:%s: no matching candidate for image URI %r' %
+                              (node.source, getattr(node, 'lineno', ''), node['uri']))
+                    continue
+                node['uri'] = candidate
+            else:
+                candidate = node['uri']
+            if candidate not in self.env.images:
+                # non-existing URI; let it alone
+                continue
+            self.images[candidate] = self.env.images[candidate][1]
+
+    # build methods
+
+    def load_i18n(self):
+        """
+        Load translated strings from the configured localedirs if
+        enabled in the configuration.
+        """
+        self.translator = None
+        if self.config.language is not None:
+            self.info(bold('loading translations [%s]... ' % self.config.language),
+                      nonl=True)
+            locale_dirs = [path.join(path.dirname(__file__), 'locale')] + \
+                          [path.join(self.srcdir, x) for x in self.config.locale_dirs]
+            for dir_ in locale_dirs:
+                try:
+                    trans = gettext.translation('sphinx', localedir=dir_,
+                            languages=[self.config.language])
+                    if self.translator is None:
+                        self.translator = trans
+                    else:
+                        self.translator._catalog.update(trans.catalog)
+                except Exception:
+                    # Language couldn't be found in the specified path
+                    pass
+            if self.translator is not None:
+                self.info('done')
+            else:
+                self.info('locale not available')
+        if self.translator is None:
+            self.translator = gettext.NullTranslations()
+        self.translator.install(unicode=True)
+        locale.init()  # translate common labels
+
+    def load_env(self):
+        """Set up the build environment."""
+        if self.env:
+            return
+        if not self.freshenv:
+            try:
+                self.info(bold('loading pickled environment... '), nonl=True)
+                self.env = BuildEnvironment.frompickle(self.config,
+                    path.join(self.doctreedir, ENV_PICKLE_FILENAME))
+                self.info('done')
+            except Exception, err:
+                if type(err) is IOError and err.errno == 2:
+                    self.info('not found')
+                else:
+                    self.info('failed: %s' % err)
+                self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
+                self.env.find_files(self.config)
+        else:
+            self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
+            self.env.find_files(self.config)
+        self.env.set_warnfunc(self.warn)
+
+    def build_all(self):
+        """Build all source files."""
+        self.build(None, summary='all source files', method='all')
+
+    def build_specific(self, filenames):
+        """Only rebuild as much as needed for changes in the source_filenames."""
+        # bring the filenames to the canonical format, that is,
+        # relative to the source directory and without source_suffix.
+        dirlen = len(self.srcdir) + 1
+        to_write = []
+        suffix = self.config.source_suffix
+        for filename in filenames:
+            filename = path.abspath(filename)[dirlen:]
+            if filename.endswith(suffix):
+                filename = filename[:-len(suffix)]
+            filename = filename.replace(os.path.sep, SEP)
+            to_write.append(filename)
+        self.build(to_write, method='specific',
+                   summary='%d source files given on command '
+                   'line' % len(to_write))
+
+    def build_update(self):
+        """Only rebuild files changed or added since last build."""
+        to_build = self.get_outdated_docs()
+        if isinstance(to_build, str):
+            self.build(['__all__'], to_build)
+        else:
+            to_build = list(to_build)
+            self.build(to_build,
+                       summary='targets for %d source files that are '
+                       'out of date' % len(to_build))
+
+    def build(self, docnames, summary=None, method='update'):
+        if summary:
+            self.info(bold('building [%s]: ' % self.name), nonl=1)
+            self.info(summary)
+
+        updated_docnames = []
+        # while reading, collect all warnings from docutils
+        warnings = []
+        self.env.set_warnfunc(warnings.append)
+        self.info(bold('updating environment: '), nonl=1)
+        iterator = self.env.update(self.config, self.srcdir, self.doctreedir, self.app)
+        # the first item in the iterator is a summary message
+        self.info(iterator.next())
+        for docname in self.status_iterator(iterator, 'reading sources... ', purple):
+            updated_docnames.append(docname)
+            # nothing further to do, the environment has already done the reading
+        for warning in warnings:
+            if warning.strip():
+                self.warn(warning)
+        self.env.set_warnfunc(self.warn)
+
+        if updated_docnames:
+            # save the environment
+            self.info(bold('pickling environment... '), nonl=True)
+            self.env.topickle(path.join(self.doctreedir, ENV_PICKLE_FILENAME))
+            self.info('done')
+
+            # global actions
+            self.info(bold('checking consistency... '), nonl=True)
+            self.env.check_consistency()
+            self.info('done')
+        else:
+            if method == 'update' and not docnames:
+                self.info(bold('no targets are out of date.'))
+                return
+
+        # another indirection to support methods which don't build files
+        # individually
+        self.write(docnames, updated_docnames, method)
+
+        # finish (write static files etc.)
+        self.finish()
+        status = self.app.statuscode == 0 and 'succeeded' or 'finished with problems'
+        if self.app._warncount:
+            self.info(bold('build %s, %s warning%s.' %
+                           (status, self.app._warncount,
+                            self.app._warncount != 1 and 's' or '')))
+        else:
+            self.info(bold('build %s.' % status))
+
+    def write(self, build_docnames, updated_docnames, method='update'):
+        if build_docnames is None or build_docnames == ['__all__']:
+            # build_all
+            build_docnames = self.env.found_docs
+        if method == 'update':
+            # build updated ones as well
+            docnames = set(build_docnames) | set(updated_docnames)
+        else:
+            docnames = set(build_docnames)
+
+        # add all toctree-containing files that may have changed
+        for docname in list(docnames):
+            for tocdocname in self.env.files_to_rebuild.get(docname, []):
+                docnames.add(tocdocname)
+        docnames.add(self.config.master_doc)
+
+        self.info(bold('preparing documents... '), nonl=True)
+        self.prepare_writing(docnames)
+        self.info('done')
+
+        # write target files
+        warnings = []
+        self.env.set_warnfunc(warnings.append)
+        for docname in self.status_iterator(sorted(docnames),
+                                            'writing output... ', darkgreen):
+            doctree = self.env.get_and_resolve_doctree(docname, self)
+            self.write_doc(docname, doctree)
+        for warning in warnings:
+            if warning.strip():
+                self.warn(warning)
+        self.env.set_warnfunc(self.warn)
+
+    def prepare_writing(self, docnames):
+        raise NotImplementedError
+
+    def write_doc(self, docname, doctree):
+        raise NotImplementedError
+
+    def finish(self):
+        raise NotImplementedError
+
+
+class StandaloneHTMLBuilder(Builder):
+    """
+    Builds standalone HTML docs.
+    """
+    name = 'html'
+    copysource = True
+    out_suffix = '.html'
+    indexer_format = js_index
+    supported_image_types = ['image/svg+xml', 'image/png', 'image/gif',
+                             'image/jpeg']
+    searchindex_filename = 'searchindex.js'
+    add_header_links = True
+    add_definition_links = True
+
+    # This is a class attribute because it is mutated by Sphinx.add_javascript.
+    script_files = ['_static/jquery.js', '_static/doctools.js']
+
+    def init(self):
+        """Load templates."""
+        self.init_templates()
+        self.init_translator_class()
+        if self.config.html_file_suffix:
+            self.out_suffix = self.config.html_file_suffix
+
+        if self.config.language is not None:
+            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
+                               'LC_MESSAGES', 'sphinx.js')
+            if path.isfile(jsfile):
+                self.script_files.append('_static/translations.js')
+
+    def init_translator_class(self):
+        if self.config.html_translator_class:
+            self.translator_class = self.app.import_object(
+                self.config.html_translator_class, 'html_translator_class setting')
+        elif self.config.html_use_smartypants:
+            self.translator_class = SmartyPantsHTMLTranslator
+        else:
+            self.translator_class = HTMLTranslator
+
+    def render_partial(self, node):
+        """Utility: Render a lone doctree node."""
+        doc = new_document('<partial node>')
+        doc.append(node)
+        return publish_parts(
+            doc,
+            source_class=DocTreeInput,
+            reader=DoctreeReader(),
+            writer=HTMLWriter(self),
+            settings_overrides={'output_encoding': 'unicode'}
+        )
+
+    def prepare_writing(self, docnames):
+        from sphinx.search import IndexBuilder
+
+        self.indexer = IndexBuilder(self.env)
+        self.load_indexer(docnames)
+        self.docwriter = HTMLWriter(self)
+        self.docsettings = OptionParser(
+            defaults=self.env.settings,
+            components=(self.docwriter,)).get_default_values()
+
+        # format the "last updated on" string, only once is enough since it
+        # typically doesn't include the time of day
+        lufmt = self.config.html_last_updated_fmt
+        if lufmt is not None:
+            self.last_updated = ustrftime(lufmt or _('%b %d, %Y'))
+        else:
+            self.last_updated = None
+
+        logo = self.config.html_logo and \
+               path.basename(self.config.html_logo) or ''
+
+        favicon = self.config.html_favicon and \
+                  path.basename(self.config.html_favicon) or ''
+        if favicon and os.path.splitext(favicon)[1] != '.ico':
+            self.warn('html_favicon is not an .ico file')
+
+        if not isinstance(self.config.html_use_opensearch, basestring):
+            self.warn('html_use_opensearch config value must now be a string')
+
+        self.relations = self.env.collect_relations()
+
+        rellinks = []
+        if self.config.html_use_index:
+            rellinks.append(('genindex', _('General Index'), 'I', _('index')))
+        if self.config.html_use_modindex and self.env.modules:
+            rellinks.append(('modindex', _('Global Module Index'), 'M', _('modules')))
+
+        self.globalcontext = dict(
+            project = self.config.project,
+            release = self.config.release,
+            version = self.config.version,
+            last_updated = self.last_updated,
+            copyright = self.config.copyright,
+            master_doc = self.config.master_doc,
+            style = self.config.html_style,
+            use_opensearch = self.config.html_use_opensearch,
+            docstitle = self.config.html_title,
+            shorttitle = self.config.html_short_title,
+            show_sphinx = self.config.html_show_sphinx,
+            has_source = self.config.html_copy_source,
+            file_suffix = self.out_suffix,
+            script_files = self.script_files,
+            sphinx_version = __version__,
+            rellinks = rellinks,
+            builder = self.name,
+            parents = [],
+            logo = logo,
+            favicon = favicon,
+        )
+        self.globalcontext.update(self.config.html_context)
+
+    def get_doc_context(self, docname, body, metatags):
+        """Collect items for the template context of a page."""
+        # find out relations
+        prev = next = None
+        parents = []
+        rellinks = self.globalcontext['rellinks'][:]
+        related = self.relations.get(docname)
+        titles = self.env.titles
+        if related and related[2]:
+            try:
+                next = {'link': self.get_relative_uri(docname, related[2]),
+                        'title': self.render_partial(titles[related[2]])['title']}
+                rellinks.append((related[2], next['title'], 'N', _('next')))
+            except KeyError:
+                next = None
+        if related and related[1]:
+            try:
+                prev = {'link': self.get_relative_uri(docname, related[1]),
+                        'title': self.render_partial(titles[related[1]])['title']}
+                rellinks.append((related[1], prev['title'], 'P', _('previous')))
+            except KeyError:
+                # the relation is (somehow) not in the TOC tree, handle that gracefully
+                prev = None
+        while related and related[0]:
+            try:
+                parents.append(
+                    {'link': self.get_relative_uri(docname, related[0]),
+                     'title': self.render_partial(titles[related[0]])['title']})
+            except KeyError:
+                pass
+            related = self.relations.get(related[0])
+        if parents:
+            parents.pop() # remove link to the master file; we have a generic
+                          # "back to index" link already
+        parents.reverse()
+
+        # title rendered as HTML
+        title = titles.get(docname)
+        title = title and self.render_partial(title)['title'] or ''
+        # the name for the copied source
+        sourcename = self.config.html_copy_source and docname + '.txt' or ''
+
+        # metadata for the document
+        meta = self.env.metadata.get(docname)
+
+        return dict(
+            parents = parents,
+            prev = prev,
+            next = next,
+            title = title,
+            meta = meta,
+            body = body,
+            metatags = metatags,
+            rellinks = rellinks,
+            sourcename = sourcename,
+            toc = self.render_partial(self.env.get_toc_for(docname))['fragment'],
+            # only display a TOC if there's more than one item to show
+            display_toc = (self.env.toc_num_entries[docname] > 1),
+        )
+
+    def write_doc(self, docname, doctree):
+        self.post_process_images(doctree)
+        destination = StringOutput(encoding='utf-8')
+        doctree.settings = self.docsettings
+
+        self.imgpath = relative_uri(self.get_target_uri(docname), '_images')
+        self.docwriter.write(doctree, destination)
+        self.docwriter.assemble_parts()
+        body = self.docwriter.parts['fragment']
+        metatags = self.docwriter.clean_meta
+
+        ctx = self.get_doc_context(docname, body, metatags)
+        self.index_page(docname, doctree, ctx.get('title', ''))
+        self.handle_page(docname, ctx, event_arg=doctree)
+
+    def finish(self):
+        self.info(bold('writing additional files...'), nonl=1)
+
+        # the global general index
+
+        if self.config.html_use_index:
+            # the total count of lines for each index letter, used to distribute
+            # the entries into two columns
+            genindex = self.env.create_index(self)
+            indexcounts = []
+            for _, entries in genindex:
+                indexcounts.append(sum(1 + len(subitems)
+                                       for _, (_, subitems) in entries))
+
+            genindexcontext = dict(
+                genindexentries = genindex,
+                genindexcounts = indexcounts,
+                split_index = self.config.html_split_index,
+            )
+            self.info(' genindex', nonl=1)
+
+            if self.config.html_split_index:
+                self.handle_page('genindex', genindexcontext, 'genindex-split.html')
+                self.handle_page('genindex-all', genindexcontext, 'genindex.html')
+                for (key, entries), count in zip(genindex, indexcounts):
+                    ctx = {'key': key, 'entries': entries, 'count': count,
+                           'genindexentries': genindex}
+                    self.handle_page('genindex-' + key, ctx, 'genindex-single.html')
+            else:
+                self.handle_page('genindex', genindexcontext, 'genindex.html')
+
+        # the global module index
+
+        if self.config.html_use_modindex and self.env.modules:
+            # the sorted list of all modules, for the global module index
+            modules = sorted(((mn, (self.get_relative_uri('modindex', fn) +
+                                    '#module-' + mn, sy, pl, dep))
+                              for (mn, (fn, sy, pl, dep)) in
+                              self.env.modules.iteritems()),
+                             key=lambda x: x[0].lower())
+            # collect all platforms
+            platforms = set()
+            # sort out collapsable modules
+            modindexentries = []
+            letters = []
+            pmn = ''
+            num_toplevels = 0
+            num_collapsables = 0
+            cg = 0 # collapse group
+            fl = '' # first letter
+            for mn, (fn, sy, pl, dep) in modules:
+                pl = pl and pl.split(', ') or []
+                platforms.update(pl)
+                if fl != mn[0].lower() and mn[0] != '_':
+                    # heading
+                    modindexentries.append(['', False, 0, False,
+                                            mn[0].upper(), '', [], False])
+                    letters.append(mn[0].upper())
+                tn = mn.split('.')[0]
+                if tn != mn:
+                    # submodule
+                    if pmn == tn:
+                        # first submodule - make parent collapsable
+                        modindexentries[-1][1] = True
+                        num_collapsables += 1
+                    elif not pmn.startswith(tn):
+                        # submodule without parent in list, add dummy entry
+                        cg += 1
+                        modindexentries.append([tn, True, cg, False, '', '', [], False])
+                else:
+                    num_toplevels += 1
+                    cg += 1
+                modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl, dep])
+                pmn = mn
+                fl = mn[0].lower()
+            platforms = sorted(platforms)
+
+            # apply heuristics when to collapse modindex at page load:
+            # only collapse if number of toplevel modules is larger than
+            # number of submodules
+            collapse = len(modules) - num_toplevels < num_toplevels
+
+            modindexcontext = dict(
+                modindexentries = modindexentries,
+                platforms = platforms,
+                letters = letters,
+                collapse_modindex = collapse,
+            )
+            self.info(' modindex', nonl=1)
+            self.handle_page('modindex', modindexcontext, 'modindex.html')
+
+        # the search page
+        if self.name != 'htmlhelp':
+            self.info(' search', nonl=1)
+            self.handle_page('search', {}, 'search.html')
+
+        # additional pages from conf.py
+        for pagename, template in self.config.html_additional_pages.items():
+            self.info(' '+pagename, nonl=1)
+            self.handle_page(pagename, {}, template)
+
+        if self.config.html_use_opensearch and self.name != 'htmlhelp':
+            self.info(' opensearch', nonl=1)
+            fn = path.join(self.outdir, '_static', 'opensearch.xml')
+            self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
+
+        self.info()
+
+        # copy image files
+        if self.images:
+            self.info(bold('copying images...'), nonl=True)
+            ensuredir(path.join(self.outdir, '_images'))
+            for src, dest in self.images.iteritems():
+                self.info(' '+src, nonl=1)
+                shutil.copyfile(path.join(self.srcdir, src),
+                                path.join(self.outdir, '_images', dest))
+            self.info()
+
+        # copy static files
+        self.info(bold('copying static files... '), nonl=True)
+        ensuredir(path.join(self.outdir, '_static'))
+        # first, create pygments style file
+        f = open(path.join(self.outdir, '_static', 'pygments.css'), 'w')
+        f.write(PygmentsBridge('html', self.config.pygments_style).get_stylesheet())
+        f.close()
+        # then, copy translations JavaScript file
+        if self.config.language is not None:
+            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
+                               'LC_MESSAGES', 'sphinx.js')
+            if path.isfile(jsfile):
+                shutil.copyfile(jsfile, path.join(self.outdir, '_static',
+                                                  'translations.js'))
+        # then, copy over all user-supplied static files
+        staticdirnames = [path.join(path.dirname(__file__), 'static')] + \
+                         [path.join(self.confdir, spath)
+                          for spath in self.config.html_static_path]
+        for staticdirname in staticdirnames:
+            for filename in os.listdir(staticdirname):
+                if filename.startswith('.'):
+                    continue
+                fullname = path.join(staticdirname, filename)
+                targetname = path.join(self.outdir, '_static', filename)
+                if path.isfile(fullname):
+                    shutil.copyfile(fullname, targetname)
+                elif path.isdir(fullname):
+                    if filename in self.config.exclude_dirnames:
+                        continue
+                    if path.exists(targetname):
+                        shutil.rmtree(targetname)
+                    shutil.copytree(fullname, targetname)
+        # last, copy logo file (handled differently)
+        if self.config.html_logo:
+            logobase = path.basename(self.config.html_logo)
+            shutil.copyfile(path.join(self.confdir, self.config.html_logo),
+                            path.join(self.outdir, '_static', logobase))
+        self.info('done')
+
+        # dump the search index
+        self.handle_finish()
+
+    def get_outdated_docs(self):
+        if self.templates:
+            template_mtime = self.templates.newest_template_mtime()
+        else:
+            template_mtime = 0
+        for docname in self.env.found_docs:
+            if docname not in self.env.all_docs:
+                yield docname
+                continue
+            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
+            try:
+                targetmtime = path.getmtime(targetname)
+            except Exception:
+                targetmtime = 0
+            try:
+                srcmtime = max(path.getmtime(self.env.doc2path(docname)),
+                               template_mtime)
+                if srcmtime > targetmtime:
+                    yield docname
+            except EnvironmentError:
+                # source doesn't exist anymore
+                pass
+
+    def load_indexer(self, docnames):
+        keep = set(self.env.all_docs) - set(docnames)
+        try:
+            f = open(path.join(self.outdir, self.searchindex_filename), 'rb')
+            try:
+                self.indexer.load(f, self.indexer_format)
+            finally:
+                f.close()
+        except (IOError, OSError, ValueError):
+            if keep:
+                self.warn("search index couldn't be loaded, but not all documents "
+                          "will be built: the index will be incomplete.")
+        # delete all entries for files that will be rebuilt
+        self.indexer.prune(keep)
+
+    def index_page(self, pagename, doctree, title):
+        # only index pages with title
+        if self.indexer is not None and title:
+            self.indexer.feed(pagename, title, doctree)
+
+    # --------- these are overwritten by the serialization builder
+
+    def get_target_uri(self, docname, typ=None):
+        return docname + self.out_suffix
+
+    def handle_page(self, pagename, addctx, templatename='page.html',
+                    outfilename=None, event_arg=None):
+        ctx = self.globalcontext.copy()
+        # current_page_name is backwards compatibility
+        ctx['pagename'] = ctx['current_page_name'] = pagename
+
+        def pathto(otheruri, resource=False,
+                   baseuri=self.get_target_uri(pagename)):
+            if not resource:
+                otheruri = self.get_target_uri(otheruri)
+            return relative_uri(baseuri, otheruri)
+        ctx['pathto'] = pathto
+        ctx['hasdoc'] = lambda name: name in self.env.all_docs
+        ctx['customsidebar'] = self.config.html_sidebars.get(pagename)
+        ctx.update(addctx)
+
+        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
+
+        output = self.templates.render(templatename, ctx)
+        if not outfilename:
+            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
+        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
+        try:
+            f = codecs.open(outfilename, 'w', 'utf-8')
+            try:
+                f.write(output)
+            finally:
+                f.close()
+        except (IOError, OSError), err:
+            self.warn("Error writing file %s: %s" % (outfilename, err))
+        if self.copysource and ctx.get('sourcename'):
+            # copy the source file for the "show source" link
+            source_name = path.join(self.outdir, '_sources', os_path(ctx['sourcename']))
+            ensuredir(path.dirname(source_name))
+            shutil.copyfile(self.env.doc2path(pagename), source_name)
+
+    def handle_finish(self):
+        self.info(bold('dumping search index... '), nonl=True)
+        self.indexer.prune(self.env.all_docs)
+        f = open(path.join(self.outdir, self.searchindex_filename), 'wb')
+        try:
+            self.indexer.dump(f, self.indexer_format)
+        finally:
+            f.close()
+        self.info('done')
+
+        self.info(bold('dumping object inventory... '), nonl=True)
+        f = open(path.join(self.outdir, INVENTORY_FILENAME), 'w')
+        try:
+            f.write('# Sphinx inventory version 1\n')
+            f.write('# Project: %s\n' % self.config.project.encode('utf-8'))
+            f.write('# Version: %s\n' % self.config.version)
+            for modname, info in self.env.modules.iteritems():
+                f.write('%s mod %s\n' % (modname, self.get_target_uri(info[0])))
+            for refname, (docname, desctype) in self.env.descrefs.iteritems():
+                f.write('%s %s %s\n' % (refname, desctype, self.get_target_uri(docname)))
+        finally:
+            f.close()
+        self.info('done')
+
+
+class SerializingHTMLBuilder(StandaloneHTMLBuilder):
+    """
+    An abstract builder that serializes the HTML generated.
+    """
+    #: the serializing implementation to use.  Set this to a module that
+    #: implements a `dump`, `load`, `dumps` and `loads` functions
+    #: (pickle, simplejson etc.)
+    implementation = None
+
+    #: the filename for the global context file
+    globalcontext_filename = None
+
+    supported_image_types = ('image/svg+xml', 'image/png', 'image/gif',
+                             'image/jpeg')
+
+    def init(self):
+        self.init_translator_class()
+        self.templates = None   # no template bridge necessary
+
+    def get_target_uri(self, docname, typ=None):
+        if docname == 'index':
+            return ''
+        if docname.endswith(SEP + 'index'):
+            return docname[:-5] # up to sep
+        return docname + SEP
+
+    def handle_page(self, pagename, ctx, templatename='page.html',
+                    outfilename=None, event_arg=None):
+        ctx['current_page_name'] = pagename
+        sidebarfile = self.config.html_sidebars.get(pagename)
+        if sidebarfile:
+            ctx['customsidebar'] = sidebarfile
+
+        if not outfilename:
+            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
+
+        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
+
+        ensuredir(path.dirname(outfilename))
+        f = open(outfilename, 'wb')
+        try:
+            self.implementation.dump(ctx, f, 2)
+        finally:
+            f.close()
+
+        # if there is a source file, copy the source file for the
+        # "show source" link
+        if ctx.get('sourcename'):
+            source_name = path.join(self.outdir, '_sources',
+                                    os_path(ctx['sourcename']))
+            ensuredir(path.dirname(source_name))
+            shutil.copyfile(self.env.doc2path(pagename), source_name)
+
+    def handle_finish(self):
+        # dump the global context
+        outfilename = path.join(self.outdir, self.globalcontext_filename)
+        f = open(outfilename, 'wb')
+        try:
+            self.implementation.dump(self.globalcontext, f, 2)
+        finally:
+            f.close()
+
+        # super here to dump the search index
+        StandaloneHTMLBuilder.handle_finish(self)
+
+        # copy the environment file from the doctree dir to the output dir
+        # as needed by the web app
+        shutil.copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME),
+                        path.join(self.outdir, ENV_PICKLE_FILENAME))
+
+        # touch 'last build' file, used by the web application to determine
+        # when to reload its environment and clear the cache
+        open(path.join(self.outdir, LAST_BUILD_FILENAME), 'w').close()
+
+
+class PickleHTMLBuilder(SerializingHTMLBuilder):
+    """
+    A Builder that dumps the generated HTML into pickle files.
+    """
+    implementation = pickle
+    indexer_format = pickle
+    name = 'pickle'
+    out_suffix = '.fpickle'
+    globalcontext_filename = 'globalcontext.pickle'
+    searchindex_filename = 'searchindex.pickle'
+
+
+class JSONHTMLBuilder(SerializingHTMLBuilder):
+    """
+    A builder that dumps the generated HTML into JSON files.
+    """
+    implementation = json
+    indexer_format = json
+    name = 'json'
+    out_suffix = '.fjson'
+    globalcontext_filename = 'globalcontext.json'
+    searchindex_filename = 'searchindex.json'
+
+    def init(self):
+        if json is None:
+            from sphinx.application import SphinxError
+            raise SphinxError('The module simplejson (or json in Python >= 2.6) '
+                              'is not available. The JSONHTMLBuilder builder '
+                              'will not work.')
+        SerializingHTMLBuilder.init(self)
+
+
+class HTMLHelpBuilder(StandaloneHTMLBuilder):
+    """
+    Builder that also outputs Windows HTML help project, contents and index files.
+    Adapted from the original Doc/tools/prechm.py.
+    """
+    name = 'htmlhelp'
+
+    # don't copy the reST source
+    copysource = False
+    supported_image_types = ['image/png', 'image/gif', 'image/jpeg']
+
+    # don't add links
+    add_header_links = False
+    add_definition_links = False
+
+    def init(self):
+        StandaloneHTMLBuilder.init(self)
+        # the output files for HTML help must be .html only
+        self.out_suffix = '.html'
+
+    def handle_finish(self):
+        build_hhx(self, self.outdir, self.config.htmlhelp_basename)
+
+
+class LaTeXBuilder(Builder):
+    """
+    Builds LaTeX output to create PDF.
+    """
+    name = 'latex'
+    supported_image_types = ['application/pdf', 'image/png', 'image/gif',
+                             'image/jpeg']
+
+    def init(self):
+        self.docnames = []
+        self.document_data = []
+        texescape.init()
+
+    def get_outdated_docs(self):
+        return 'all documents' # for now
+
+    def get_target_uri(self, docname, typ=None):
+        if typ == 'token':
+            # token references are always inside production lists and must be
+            # replaced by \token{} in LaTeX
+            return '@token'
+        if docname not in self.docnames:
+            raise NoUri
+        else:
+            return ''
+
+    def init_document_data(self):
+        preliminary_document_data = map(list, self.config.latex_documents)
+        if not preliminary_document_data:
+            self.warn('No "latex_documents" config value found; no documents '
+                      'will be written.')
+            return
+        # assign subdirs to titles
+        self.titles = []
+        for entry in preliminary_document_data:
+            docname = entry[0]
+            if docname not in self.env.all_docs:
+                self.warn('"latex_documents" config value references unknown '
+                          'document %s' % docname)
+                continue
+            self.document_data.append(entry)
+            if docname.endswith(SEP+'index'):
+                docname = docname[:-5]
+            self.titles.append((docname, entry[2]))
+
+    def write(self, *ignored):
+        # first, assemble the "appendix" docs that are in every PDF
+        appendices = []
+        for fname in self.config.latex_appendices:
+            appendices.append(self.env.get_doctree(fname))
+
+        docwriter = LaTeXWriter(self)
+        docsettings = OptionParser(
+            defaults=self.env.settings,
+            components=(docwriter,)).get_default_values()
+
+        self.init_document_data()
+
+        for entry in self.document_data:
+            docname, targetname, title, author, docclass = entry[:5]
+            toctree_only = False
+            if len(entry) > 5:
+                toctree_only = entry[5]
+            destination = FileOutput(
+                destination_path=path.join(self.outdir, targetname),
+                encoding='utf-8')
+            self.info("processing " + targetname + "... ", nonl=1)
+            doctree = self.assemble_doctree(docname, toctree_only,
+                appendices=(docclass == 'manual') and appendices or [])
+            self.post_process_images(doctree)
+            self.info("writing... ", nonl=1)
+            doctree.settings = docsettings
+            doctree.settings.author = author
+            doctree.settings.title = title
+            doctree.settings.docname = docname
+            doctree.settings.docclass = docclass
+            docwriter.write(doctree, destination)
+            self.info("done")
+
+    def assemble_doctree(self, indexfile, toctree_only, appendices):
+        self.docnames = set([indexfile] + appendices)
+        self.info(darkgreen(indexfile) + " ", nonl=1)
+        def process_tree(docname, tree):
+            tree = tree.deepcopy()
+            for toctreenode in tree.traverse(addnodes.toctree):
+                newnodes = []
+                includefiles = map(str, toctreenode['includefiles'])
+                for includefile in includefiles:
+                    try:
+                        self.info(darkgreen(includefile) + " ", nonl=1)
+                        subtree = process_tree(includefile,
+                                               self.env.get_doctree(includefile))
+                        self.docnames.add(includefile)
+                    except Exception:
+                        self.warn('%s: toctree contains ref to nonexisting file %r' %
+                                  (docname, includefile))
+                    else:
+                        sof = addnodes.start_of_file()
+                        sof.children = subtree.children
+                        newnodes.append(sof)
+                toctreenode.parent.replace(toctreenode, newnodes)
+            return tree
+        tree = self.env.get_doctree(indexfile)
+        if toctree_only:
+            # extract toctree nodes from the tree and put them in a fresh document
+            new_tree = new_document('<latex output>')
+            new_sect = nodes.section()
+            new_sect += nodes.title(u'<Set title in conf.py>', u'<Set title in conf.py>')
+            new_tree += new_sect
+            for node in tree.traverse(addnodes.toctree):
+                new_sect += node
+            tree = new_tree
+        largetree = process_tree(indexfile, tree)
+        largetree.extend(appendices)
+        self.info()
+        self.info("resolving references...")
+        self.env.resolve_references(largetree, indexfile, self)
+        # resolve :ref:s to distant tex files -- we can't add a cross-reference,
+        # but append the document name
+        for pendingnode in largetree.traverse(addnodes.pending_xref):
+            docname = pendingnode['refdocname']
+            sectname = pendingnode['refsectname']
+            newnodes = [nodes.emphasis(sectname, sectname)]
+            for subdir, title in self.titles:
+                if docname.startswith(subdir):
+                    newnodes.append(nodes.Text(_(' (in '), _(' (in ')))
+                    newnodes.append(nodes.emphasis(title, title))
+                    newnodes.append(nodes.Text(')', ')'))
+                    break
+            else:
+                pass
+            pendingnode.replace_self(newnodes)
+        return largetree
+
+    def finish(self):
+        # copy image files
+        if self.images:
+            self.info(bold('copying images...'), nonl=1)
+            for src, dest in self.images.iteritems():
+                self.info(' '+src, nonl=1)
+                shutil.copyfile(path.join(self.srcdir, src),
+                                path.join(self.outdir, dest))
+            self.info()
+
+        # the logo is handled differently
+        if self.config.latex_logo:
+            logobase = path.basename(self.config.latex_logo)
+            shutil.copyfile(path.join(self.confdir, self.config.latex_logo),
+                            path.join(self.outdir, logobase))
+
+        self.info(bold('copying TeX support files... '), nonl=True)
+        staticdirname = path.join(path.dirname(__file__), 'texinputs')
+        for filename in os.listdir(staticdirname):
+            if not filename.startswith('.'):
+                shutil.copyfile(path.join(staticdirname, filename),
+                                path.join(self.outdir, filename))
+        self.info('done')
+
+
+class ChangesBuilder(Builder):
+    """
+    Write a summary with all versionadded/changed directives.
+    """
+    name = 'changes'
+
+    def init(self):
+        self.init_templates()
+
+    def get_outdated_docs(self):
+        return self.outdir
+
+    typemap = {
+        'versionadded': 'added',
+        'versionchanged': 'changed',
+        'deprecated': 'deprecated',
+    }
+
+    def write(self, *ignored):
+        version = self.config.version
+        libchanges = {}
+        apichanges = []
+        otherchanges = {}
+        if version not in self.env.versionchanges:
+            self.info(bold('no changes in this version.'))
+            return
+        self.info(bold('writing summary file...'))
+        for type, docname, lineno, module, descname, content in \
+                self.env.versionchanges[version]:
+            ttext = self.typemap[type]
+            context = content.replace('\n', ' ')
+            if descname and docname.startswith('c-api'):
+                if not descname:
+                    continue
+                if context:
+                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
+                else:
+                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
+                apichanges.append((entry, docname, lineno))
+            elif descname or module:
+                if not module:
+                    module = _('Builtins')
+                if not descname:
+                    descname = _('Module level')
+                if context:
+                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
+                else:
+                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
+                libchanges.setdefault(module, []).append((entry, docname, lineno))
+            else:
+                if not context:
+                    continue
+                entry = '<i>%s:</i> %s' % (ttext.capitalize(), context)
+                title = self.env.titles[docname].astext()
+                otherchanges.setdefault((docname, title), []).append(
+                    (entry, docname, lineno))
+
+        ctx = {
+            'project': self.config.project,
+            'version': version,
+            'docstitle': self.config.html_title,
+            'shorttitle': self.config.html_short_title,
+            'libchanges': sorted(libchanges.iteritems()),
+            'apichanges': sorted(apichanges),
+            'otherchanges': sorted(otherchanges.iteritems()),
+            'show_sphinx': self.config.html_show_sphinx,
+        }
+        f = open(path.join(self.outdir, 'index.html'), 'w')
+        try:
+            f.write(self.templates.render('changes/frameset.html', ctx))
+        finally:
+            f.close()
+        f = open(path.join(self.outdir, 'changes.html'), 'w')
+        try:
+            f.write(self.templates.render('changes/versionchanges.html', ctx))
+        finally:
+            f.close()
+
+        hltext = ['.. versionadded:: %s' % version,
+                  '.. versionchanged:: %s' % version,
+                  '.. deprecated:: %s' % version]
+
+        def hl(no, line):
+            line = '<a name="L%s"> </a>' % no + escape(line)
+            for x in hltext:
+                if x in line:
+                    line = '<span class="hl">%s</span>' % line
+                    break
+            return line
+
+        self.info(bold('copying source files...'))
+        for docname in self.env.all_docs:
+            f = open(self.env.doc2path(docname))
+            lines = f.readlines()
+            targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html'
+            ensuredir(path.dirname(targetfn))
+            f = codecs.open(targetfn, 'w', 'utf8')
+            try:
+                text = ''.join(hl(i+1, line) for (i, line) in enumerate(lines))
+                ctx = {'filename': self.env.doc2path(docname, None), 'text': text}
+                f.write(self.templates.render('changes/rstsource.html', ctx))
+            finally:
+                f.close()
+        shutil.copyfile(path.join(path.dirname(__file__), 'static', 'default.css'),
+                        path.join(self.outdir, 'default.css'))
+
+    def hl(self, text, version):
+        text = escape(text)
+        for directive in ['versionchanged', 'versionadded', 'deprecated']:
+            text = text.replace('.. %s:: %s' % (directive, version),
+                                '<b>.. %s:: %s</b>' % (directive, version))
+        return text
+
+    def finish(self):
+        pass
+
+
+class TextBuilder(Builder):
+    name = 'text'
+    out_suffix = '.txt'
+
+    def init(self):
+        pass
+
+    def get_outdated_docs(self):
+        for docname in self.env.found_docs:
+            if docname not in self.env.all_docs:
+                yield docname
+                continue
+            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
+            try:
+                targetmtime = path.getmtime(targetname)
+            except Exception:
+                targetmtime = 0
+            try:
+                srcmtime = path.getmtime(self.env.doc2path(docname))
+                if srcmtime > targetmtime:
+                    yield docname
+            except EnvironmentError:
+                # source doesn't exist anymore
+                pass
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def prepare_writing(self, docnames):
+        self.writer = TextWriter(self)
+
+    def write_doc(self, docname, doctree):
+        destination = StringOutput(encoding='utf-8')
+        self.writer.write(doctree, destination)
+        outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
+        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
+        try:
+            f = codecs.open(outfilename, 'w', 'utf-8')
+            try:
+                f.write(self.writer.output)
+            finally:
+                f.close()
+        except (IOError, OSError), err:
+            self.warn("Error writing file %s: %s" % (outfilename, err))
+
+    def finish(self):
+        pass
+
+
+# compatibility alias
+WebHTMLBuilder = PickleHTMLBuilder
+
+
+from sphinx.linkcheck import CheckExternalLinksBuilder
+
+builtin_builders = {
+    'html': StandaloneHTMLBuilder,
+    'pickle': PickleHTMLBuilder,
+    'json': JSONHTMLBuilder,
+    'web': PickleHTMLBuilder,
+    'htmlhelp': HTMLHelpBuilder,
+    'latex': LaTeXBuilder,
+    'text': TextBuilder,
+    'changes': ChangesBuilder,
+    'linkcheck': CheckExternalLinksBuilder,
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,186 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.cmdline
+    ~~~~~~~~~~~~~~
+
+    sphinx-build command-line handling.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import sys
+import getopt
+import traceback
+from os import path
+
+from docutils.utils import SystemMessage
+
+from sphinx import __version__
+from sphinx.application import Sphinx, SphinxError
+from sphinx.util import format_exception_cut_frames, save_traceback
+from sphinx.util.console import darkred, nocolor, color_terminal
+
+
+def usage(argv, msg=None):
+    if msg:
+        print >>sys.stderr, msg
+        print >>sys.stderr
+    print >>sys.stderr, """\
+Sphinx v%s
+Usage: %s [options] sourcedir outdir [filenames...]
+Options: -b <builder> -- builder to use; default is html
+         -a        -- write all files; default is to only write new and changed files
+         -E        -- don't use a saved environment, always read all files
+         -d <path> -- path for the cached environment and doctree files
+                      (default: outdir/.doctrees)
+         -c <path> -- path where configuration file (conf.py) is located
+                      (default: same as sourcedir)
+         -C        -- use no config file at all, only -D options
+         -D <setting=value> -- override a setting in configuration
+         -A <name=value>    -- pass a value into the templates, for HTML builder
+         -N        -- do not do colored output
+         -q        -- no output on stdout, just warnings on stderr
+         -Q        -- no output at all, not even warnings
+         -P        -- run Pdb on exception
+Modi:
+* without -a and without filenames, write new and changed files.
+* with -a, write all files.
+* with filenames, write these.""" % (__version__, argv[0])
+
+
+def main(argv):
+    if not sys.stdout.isatty() or not color_terminal():
+        # Windows' poor cmd box doesn't understand ANSI sequences
+        nocolor()
+
+    try:
+        opts, args = getopt.getopt(argv[1:], 'ab:d:c:CD:A:NEqP')
+        allopts = set(opt[0] for opt in opts)
+        srcdir = confdir = path.abspath(args[0])
+        if not path.isdir(srcdir):
+            print >>sys.stderr, 'Error: Cannot find source directory.'
+            return 1
+        if not path.isfile(path.join(srcdir, 'conf.py')) and \
+               '-c' not in allopts and '-C' not in allopts:
+            print >>sys.stderr, 'Error: Source directory doesn\'t contain conf.py file.'
+            return 1
+        outdir = path.abspath(args[1])
+        if not path.isdir(outdir):
+            print >>sys.stderr, 'Making output directory...'
+            os.makedirs(outdir)
+    except (IndexError, getopt.error):
+        usage(argv)
+        return 1
+
+    filenames = args[2:]
+    err = 0
+    for filename in filenames:
+        if not path.isfile(filename):
+            print >>sys.stderr, 'Cannot find file %r.' % filename
+            err = 1
+    if err:
+        return 1
+
+    buildername = all_files = None
+    freshenv = use_pdb = False
+    status = sys.stdout
+    warning = sys.stderr
+    confoverrides = {}
+    htmlcontext = {}
+    doctreedir = path.join(outdir, '.doctrees')
+    for opt, val in opts:
+        if opt == '-b':
+            buildername = val
+        elif opt == '-a':
+            if filenames:
+                usage(argv, 'Cannot combine -a option and filenames.')
+                return 1
+            all_files = True
+        elif opt == '-d':
+            doctreedir = path.abspath(val)
+        elif opt == '-c':
+            confdir = path.abspath(val)
+            if not path.isfile(path.join(confdir, 'conf.py')):
+                print >>sys.stderr, \
+                      'Error: Configuration directory doesn\'t contain conf.py file.'
+                return 1
+        elif opt == '-C':
+            confdir = None
+        elif opt == '-D':
+            try:
+                key, val = val.split('=')
+            except ValueError:
+                print >>sys.stderr, \
+                      'Error: -D option argument must be in the form name=value.'
+                return 1
+            try:
+                val = int(val)
+            except ValueError:
+                pass
+            confoverrides[key] = val
+        elif opt == '-A':
+            try:
+                key, val = val.split('=')
+            except ValueError:
+                print >>sys.stderr, \
+                      'Error: -A option argument must be in the form name=value.'
+                return 1
+            try:
+                val = int(val)
+            except ValueError:
+                pass
+            htmlcontext[key] = val
+        elif opt == '-N':
+            nocolor()
+        elif opt == '-E':
+            freshenv = True
+        elif opt == '-q':
+            status = None
+        elif opt == '-Q':
+            status = None
+            warning = None
+        elif opt == '-P':
+            use_pdb = True
+    confoverrides['html_context'] = htmlcontext
+
+    try:
+        app = Sphinx(srcdir, confdir, outdir, doctreedir, buildername,
+                     confoverrides, status, warning, freshenv)
+        app.build(all_files, filenames)
+        return app.statuscode
+    except KeyboardInterrupt:
+        if use_pdb:
+            import pdb
+            print >>sys.stderr, darkred('Interrupted while building, starting debugger:')
+            traceback.print_exc()
+            pdb.post_mortem(sys.exc_info()[2])
+        return 1
+    except Exception, err:
+        if use_pdb:
+            import pdb
+            print >>sys.stderr, darkred('Exception occurred while building, '
+                                        'starting debugger:')
+            traceback.print_exc()
+            pdb.post_mortem(sys.exc_info()[2])
+        else:
+            if isinstance(err, SystemMessage):
+                print >>sys.stderr, darkred('reST markup error:')
+                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
+            elif isinstance(err, SphinxError):
+                print >>sys.stderr, darkred('%s:' % err.category)
+                print >>sys.stderr, err
+            else:
+                print >>sys.stderr, darkred('Exception occurred:')
+                print >>sys.stderr, format_exception_cut_frames().rstrip()
+                tbpath = save_traceback()
+                print >>sys.stderr, darkred('The full traceback has been saved '
+                                            'in %s, if you want to report the '
+                                            'issue to the author.' % tbpath)
+                print >>sys.stderr, ('Please also report this if it was a user '
+                                     'error, so that a better error message '
+                                     'can be provided next time.')
+                print >>sys.stderr, ('Send reports to sphinx-dev@googlegroups.com. '
+                                     'Thanks!')
+            return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/config.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.config
+    ~~~~~~~~~~~~~
+
+    Build configuration file handling.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD license.
+"""
+
+import os
+from os import path
+
+
+class Config(object):
+    """Configuration file abstraction."""
+
+    # the values are: (default, needs fresh doctrees if changed)
+
+    # If you add a value here, don't forget to include it in the
+    # quickstart.py file template as well as in the docs!
+
+    config_values = dict(
+        # general options
+        project = ('Python', True),
+        copyright = ('', False),
+        version = ('', True),
+        release = ('', True),
+        today = ('', True),
+        today_fmt = (None, True),  # the real default is locale-dependent
+
+        language = (None, True),
+        locale_dirs = ([], True),
+
+        master_doc = ('contents', True),
+        source_suffix = ('.rst', True),
+        source_encoding = ('utf-8', True),
+        unused_docs = ([], True),
+        exclude_dirs = ([], True),
+        exclude_trees = ([], True),
+        exclude_dirnames = ([], True),
+        default_role = (None, True),
+        add_function_parentheses = (True, True),
+        add_module_names = (True, True),
+        show_authors = (False, True),
+        pygments_style = ('sphinx', False),
+        highlight_language = ('python', False),
+        templates_path = ([], False),
+        template_bridge = (None, False),
+        keep_warnings = (False, True),
+
+        # HTML options
+        html_title = (lambda self: '%s v%s documentation' %
+                                   (self.project, self.release),
+                      False),
+        html_short_title = (lambda self: self.html_title, False),
+        html_style = ('default.css', False),
+        html_logo = (None, False),
+        html_favicon = (None, False),
+        html_static_path = ([], False),
+        html_last_updated_fmt = (None, False),  # the real default is locale-dependent
+        html_use_smartypants = (True, False),
+        html_translator_class = (None, False),
+        html_sidebars = ({}, False),
+        html_additional_pages = ({}, False),
+        html_use_modindex = (True, False),
+        html_use_index = (True, False),
+        html_split_index = (False, False),
+        html_copy_source = (True, False),
+        html_use_opensearch = ('', False),
+        html_file_suffix = (None, False),
+        html_show_sphinx = (True, False),
+        html_context = ({}, False),
+
+        # HTML help only options
+        htmlhelp_basename = ('pydoc', False),
+
+        # LaTeX options
+        latex_documents = ([], False),
+        latex_logo = (None, False),
+        latex_appendices = ([], False),
+        latex_use_parts = (False, False),
+        latex_use_modindex = (True, False),
+        # paper_size and font_size are still separate values
+        # so that you can give them easily on the command line
+        latex_paper_size = ('letter', False),
+        latex_font_size = ('10pt', False),
+        latex_elements = ({}, False),
+        # now deprecated - use latex_elements
+        latex_preamble = ('', False),
+    )
+
+    def __init__(self, dirname, filename, overrides):
+        self.overrides = overrides
+        self.values = Config.config_values.copy()
+        config = {}
+        if dirname is not None:
+            config['__file__'] = path.join(dirname, filename)
+            olddir = os.getcwd()
+            try:
+                os.chdir(dirname)
+                execfile(config['__file__'], config)
+            finally:
+                os.chdir(olddir)
+        self._raw_config = config
+        # these two must be preinitialized because extensions can add their
+        # own config values
+        self.setup = config.get('setup', None)
+        self.extensions = config.get('extensions', [])
+
+    def init_values(self):
+        config = self._raw_config
+        config.update(self.overrides)
+        for name in config:
+            if name in self.values:
+                self.__dict__[name] = config[name]
+        del self._raw_config
+
+    def __getattr__(self, name):
+        if name.startswith('_'):
+            raise AttributeError(name)
+        if name not in self.values:
+            raise AttributeError('No such config value: %s' % name)
+        default = self.values[name][0]
+        if callable(default):
+            return default(self)
+        return default
+
+    def __getitem__(self, name):
+        return getattr(self, name)
+
+    def __setitem__(self, name, value):
+        setattr(self, name, value)
+
+    def __delitem__(self, name):
+        delattr(self, name)
+
+    def __contains__(self, name):
+        return name in self.values
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives
+    ~~~~~~~~~~~~~~~~~
+
+    Handlers for additional ReST directives.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from sphinx.directives.desc import *
+from sphinx.directives.code import *
+from sphinx.directives.other import *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.code
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import codecs
+from os import path
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+
+
+# ------ highlight directive --------------------------------------------------------
+
+def highlightlang_directive(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    if 'linenothreshold' in options:
+        try:
+            linenothreshold = int(options['linenothreshold'])
+        except Exception:
+            linenothreshold = 10
+    else:
+        linenothreshold = sys.maxint
+    return [addnodes.highlightlang(lang=arguments[0].strip(),
+                                   linenothreshold=linenothreshold)]
+
+highlightlang_directive.content = 0
+highlightlang_directive.arguments = (1, 0, 0)
+highlightlang_directive.options = {'linenothreshold': directives.unchanged}
+directives.register_directive('highlight', highlightlang_directive)
+directives.register_directive('highlightlang', highlightlang_directive) # old name
+
+
+# ------ code-block directive -------------------------------------------------------
+
+def codeblock_directive(name, arguments, options, content, lineno,
+                        content_offset, block_text, state, state_machine):
+    code = u'\n'.join(content)
+    literal = nodes.literal_block(code, code)
+    literal['language'] = arguments[0]
+    literal['linenos'] = 'linenos' in options
+    return [literal]
+
+codeblock_directive.content = 1
+codeblock_directive.arguments = (1, 0, 0)
+codeblock_directive.options = {'linenos': directives.flag}
+directives.register_directive('code-block', codeblock_directive)
+directives.register_directive('sourcecode', codeblock_directive)
+
+
+# ------ literalinclude directive ---------------------------------------------------
+
+def literalinclude_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    """Like .. include:: :literal:, but only warns if the include file is not found."""
+    if not state.document.settings.file_insertion_enabled:
+        return [state.document.reporter.warning('File insertion disabled', line=lineno)]
+    env = state.document.settings.env
+    rel_fn = arguments[0]
+    source_dir = path.dirname(path.abspath(state_machine.input_lines.source(
+        lineno - state_machine.input_offset - 1)))
+    fn = path.normpath(path.join(source_dir, rel_fn))
+
+    encoding = options.get('encoding', env.config.source_encoding)
+    try:
+        f = codecs.open(fn, 'r', encoding)
+        text = f.read()
+        f.close()
+    except (IOError, OSError):
+        retnode = state.document.reporter.warning(
+            'Include file %r not found or reading it failed' % arguments[0], line=lineno)
+    except UnicodeError:
+        retnode = state.document.reporter.warning(
+            'Encoding %r used for reading included file %r seems to '
+            'be wrong, try giving an :encoding: option' %
+            (encoding, arguments[0]))
+    else:
+        retnode = nodes.literal_block(text, text, source=fn)
+        retnode.line = 1
+        if options.get('language', ''):
+            retnode['language'] = options['language']
+        if 'linenos' in options:
+            retnode['linenos'] = True
+        state.document.settings.env.note_dependency(rel_fn)
+    return [retnode]
+
+literalinclude_directive.options = {'linenos': directives.flag,
+                                    'language': directives.unchanged,
+                                    'encoding': directives.encoding}
+literalinclude_directive.content = 0
+literalinclude_directive.arguments = (1, 0, 0)
+directives.register_directive('literalinclude', literalinclude_directive)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,592 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.desc
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import string
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.util import ws_re
+
+
+# ------ information units ---------------------------------------------------------
+
+def desc_index_text(desctype, module, name, add_modules):
+    if desctype == 'function':
+        if not module:
+            return _('%s() (built-in function)') % name
+        return _('%s() (in module %s)') % (name, module)
+    elif desctype == 'data':
+        if not module:
+            return _('%s (built-in variable)') % name
+        return _('%s (in module %s)') % (name, module)
+    elif desctype == 'class':
+        if not module:
+            return _('%s (built-in class)') % name
+        return _('%s (class in %s)') % (name, module)
+    elif desctype == 'exception':
+        return name
+    elif desctype == 'method':
+        try:
+            clsname, methname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s() (in module %s)') % (name, module)
+            else:
+                return '%s()' % name
+        if module and add_modules:
+            return _('%s() (%s.%s method)') % (methname, module, clsname)
+        else:
+            return _('%s() (%s method)') % (methname, clsname)
+    elif desctype == 'staticmethod':
+        try:
+            clsname, methname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s() (in module %s)') % (name, module)
+            else:
+                return '%s()' % name
+        if module and add_modules:
+            return _('%s() (%s.%s static method)') % (methname, module, clsname)
+        else:
+            return _('%s() (%s static method)') % (methname, clsname)
+    elif desctype == 'attribute':
+        try:
+            clsname, attrname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s (in module %s)') % (name, module)
+            else:
+                return name
+        if module and add_modules:
+            return _('%s (%s.%s attribute)') % (attrname, module, clsname)
+        else:
+            return _('%s (%s attribute)') % (attrname, clsname)
+    elif desctype == 'cfunction':
+        return _('%s (C function)') % name
+    elif desctype == 'cmember':
+        return _('%s (C member)') % name
+    elif desctype == 'cmacro':
+        return _('%s (C macro)') % name
+    elif desctype == 'ctype':
+        return _('%s (C type)') % name
+    elif desctype == 'cvar':
+        return _('%s (C variable)') % name
+    else:
+        raise ValueError('unhandled descenv: %s' % desctype)
+
+
+# ------ make field lists (like :param foo:) in desc bodies prettier
+
+_ = lambda x: x  # make gettext extraction in constants possible
+
+doc_fields_with_arg = {
+    'param': '%param',
+    'parameter': '%param',
+    'arg': '%param',
+    'argument': '%param',
+    'keyword': '%param',
+    'kwarg': '%param',
+    'kwparam': '%param',
+    'type': '%type',
+    'raises': _('Raises'),
+    'raise': 'Raises',
+    'exception': 'Raises',
+    'except': 'Raises',
+    'var': _('Variable'),
+    'ivar': 'Variable',
+    'cvar': 'Variable',
+    'returns': _('Returns'),
+    'return': 'Returns',
+}
+
+doc_fields_with_linked_arg = ('raises', 'raise', 'exception', 'except')
+
+doc_fields_without_arg = {
+    'returns': 'Returns',
+    'return': 'Returns',
+    'rtype': _('Return type'),
+}
+
+del _
+
+
+def _is_only_paragraph(node):
+    # determine if the node only contains one paragraph (and system messages)
+    if len(node) == 0:
+        return False
+    elif len(node) > 1:
+        for subnode in node[1:]:
+            if not isinstance(subnode, nodes.system_message):
+                return False
+    if isinstance(node[0], nodes.paragraph):
+        return True
+    return False
+
+
+def handle_doc_fields(node, env):
+    # don't traverse, only handle field lists that are immediate children
+    for child in node.children:
+        if not isinstance(child, nodes.field_list):
+            continue
+        params = None
+        param_nodes = {}
+        param_types = {}
+        new_list = nodes.field_list()
+        for field in child:
+            fname, fbody = field
+            try:
+                typ, obj = fname.astext().split(None, 1)
+                typdesc = _(doc_fields_with_arg[typ])
+                if _is_only_paragraph(fbody):
+                    children = fbody.children[0].children
+                else:
+                    children = fbody.children
+                if typdesc == '%param':
+                    if not params:
+                        pfield = nodes.field()
+                        pfield += nodes.field_name('', _('Parameters'))
+                        pfield += nodes.field_body()
+                        params = nodes.bullet_list()
+                        pfield[1] += params
+                        new_list += pfield
+                    dlitem = nodes.list_item()
+                    dlpar = nodes.paragraph()
+                    dlpar += nodes.emphasis(obj, obj)
+                    dlpar += nodes.Text(' -- ', ' -- ')
+                    dlpar += children
+                    param_nodes[obj] = dlpar
+                    dlitem += dlpar
+                    params += dlitem
+                elif typdesc == '%type':
+                    typenodes = fbody.children
+                    if _is_only_paragraph(fbody):
+                        typenodes = [nodes.Text(' (')] + \
+                                    typenodes[0].children + [nodes.Text(')')]
+                    param_types[obj] = typenodes
+                else:
+                    fieldname = typdesc + ' '
+                    nfield = nodes.field()
+                    nfieldname = nodes.field_name(fieldname, fieldname)
+                    nfield += nfieldname
+                    node = nfieldname
+                    if typ in doc_fields_with_linked_arg:
+                        node = addnodes.pending_xref(obj, reftype='obj',
+                                                     refcaption=False,
+                                                     reftarget=obj,
+                                                     modname=env.currmodule,
+                                                     classname=env.currclass)
+                        nfieldname += node
+                    node += nodes.Text(obj, obj)
+                    nfield += nodes.field_body()
+                    nfield[1] += fbody.children
+                    new_list += nfield
+            except (KeyError, ValueError):
+                fnametext = fname.astext()
+                try:
+                    typ = _(doc_fields_without_arg[fnametext])
+                except KeyError:
+                    # at least capitalize the field name
+                    typ = fnametext.capitalize()
+                fname[0] = nodes.Text(typ)
+                new_list += field
+        for param, type in param_types.iteritems():
+            if param in param_nodes:
+                param_nodes[param][1:1] = type
+        child.replace_self(new_list)
+
+
+# ------ functions to parse a Python or C signature and create desc_* nodes.
+
+py_sig_re = re.compile(
+    r'''^ ([\w.]*\.)?            # class name(s)
+          (\w+)  \s*             # thing name
+          (?: \((.*)\)           # optional arguments
+          (\s* -> \s* .*)? )? $  # optional return annotation
+          ''', re.VERBOSE)
+
+py_paramlist_re = re.compile(r'([\[\],])')  # split at '[', ']' and ','
+
+def parse_py_signature(signode, sig, desctype, module, env):
+    """
+    Transform a python signature into RST nodes.
+    Return (fully qualified name of the thing, classname if any).
+
+    If inside a class, the current class name is handled intelligently:
+    * it is stripped from the displayed name if present
+    * it is added to the full name (return value) if not present
+    """
+    m = py_sig_re.match(sig)
+    if m is None:
+        raise ValueError
+    classname, name, arglist, retann = m.groups()
+
+    if retann:
+        retann = u' \N{RIGHTWARDS ARROW} ' + retann.strip()[2:]
+
+    if env.currclass:
+        add_module = False
+        if classname and classname.startswith(env.currclass):
+            fullname = classname + name
+            # class name is given again in the signature
+            classname = classname[len(env.currclass):].lstrip('.')
+        elif classname:
+            # class name is given in the signature, but different
+            # (shouldn't happen)
+            fullname = env.currclass + '.' + classname + name
+        else:
+            # class name is not given in the signature
+            fullname = env.currclass + '.' + name
+    else:
+        add_module = True
+        fullname = classname and classname + name or name
+
+    if desctype == 'staticmethod':
+        signode += addnodes.desc_annotation('static ', 'static ')
+
+    if classname:
+        signode += addnodes.desc_addname(classname, classname)
+    # exceptions are a special case, since they are documented in the
+    # 'exceptions' module.
+    elif add_module and env.config.add_module_names and \
+           module and module != 'exceptions':
+        nodetext = module + '.'
+        signode += addnodes.desc_addname(nodetext, nodetext)
+
+    signode += addnodes.desc_name(name, name)
+    if not arglist:
+        if desctype in ('function', 'method', 'staticmethod'):
+            # for callables, add an empty parameter list
+            signode += addnodes.desc_parameterlist()
+        if retann:
+            signode += addnodes.desc_type(retann, retann)
+        return fullname, classname
+    signode += addnodes.desc_parameterlist()
+
+    stack = [signode[-1]]
+    for token in py_paramlist_re.split(arglist):
+        if token == '[':
+            opt = addnodes.desc_optional()
+            stack[-1] += opt
+            stack.append(opt)
+        elif token == ']':
+            try:
+                stack.pop()
+            except IndexError:
+                raise ValueError
+        elif not token or token == ',' or token.isspace():
+            pass
+        else:
+            token = token.strip()
+            stack[-1] += addnodes.desc_parameter(token, token)
+    if len(stack) != 1:
+        raise ValueError
+    if retann:
+        signode += addnodes.desc_type(retann, retann)
+    return fullname, classname
+
+
+c_sig_re = re.compile(
+    r'''^([^(]*?)          # return type
+        ([\w:]+)  \s*      # thing name (colon allowed for C++ class names)
+        (?: \((.*)\) )?    # optionally arguments
+        (\s+const)? $      # const specifier
+    ''', re.VERBOSE)
+c_funcptr_sig_re = re.compile(
+    r'''^([^(]+?)          # return type
+        (\( [^()]+ \)) \s* # name in parentheses
+        \( (.*) \)         # arguments
+        (\s+const)? $      # const specifier
+    ''', re.VERBOSE)
+c_funcptr_name_re = re.compile(r'^\(\s*\*\s*(.*?)\s*\)$')
+
+# RE to split at word boundaries
+wsplit_re = re.compile(r'(\W+)')
+
+# These C types aren't described in the reference, so don't try to create
+# a cross-reference to them
+stopwords = set(('const', 'void', 'char', 'int', 'long', 'FILE', 'struct'))
+
+def parse_c_type(node, ctype):
+    # add cross-ref nodes for all words
+    for part in filter(None, wsplit_re.split(ctype)):
+        tnode = nodes.Text(part, part)
+        if part[0] in string.letters+'_' and part not in stopwords:
+            pnode = addnodes.pending_xref(
+                '', reftype='ctype', reftarget=part, modname=None, classname=None)
+            pnode += tnode
+            node += pnode
+        else:
+            node += tnode
+
+def parse_c_signature(signode, sig, desctype):
+    """Transform a C (or C++) signature into RST nodes."""
+    # first try the function pointer signature regex, it's more specific
+    m = c_funcptr_sig_re.match(sig)
+    if m is None:
+        m = c_sig_re.match(sig)
+    if m is None:
+        raise ValueError('no match')
+    rettype, name, arglist, const = m.groups()
+
+    signode += addnodes.desc_type('', '')
+    parse_c_type(signode[-1], rettype)
+    try:
+        classname, funcname = name.split('::', 1)
+        classname += '::'
+        signode += addnodes.desc_addname(classname, classname)
+        signode += addnodes.desc_name(funcname, funcname)
+        # name (the full name) is still both parts
+    except ValueError:
+        signode += addnodes.desc_name(name, name)
+    # clean up parentheses from canonical name
+    m = c_funcptr_name_re.match(name)
+    if m:
+        name = m.group(1)
+    if not arglist:
+        if desctype == 'cfunction':
+            # for functions, add an empty parameter list
+            signode += addnodes.desc_parameterlist()
+        return name
+
+    paramlist = addnodes.desc_parameterlist()
+    arglist = arglist.replace('`', '').replace('\\ ', '') # remove markup
+    # this messes up function pointer types, but not too badly ;)
+    args = arglist.split(',')
+    for arg in args:
+        arg = arg.strip()
+        param = addnodes.desc_parameter('', '', noemph=True)
+        try:
+            ctype, argname = arg.rsplit(' ', 1)
+        except ValueError:
+            # no argument name given, only the type
+            parse_c_type(param, arg)
+        else:
+            parse_c_type(param, ctype)
+            param += nodes.emphasis(' '+argname, ' '+argname)
+        paramlist += param
+    signode += paramlist
+    if const:
+        signode += addnodes.desc_addname(const, const)
+    return name
+
+
+option_desc_re = re.compile(
+    r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)')
+
+def parse_option_desc(signode, sig):
+    """Transform an option description into RST nodes."""
+    count = 0
+    firstname = ''
+    for m in option_desc_re.finditer(sig):
+        optname, args = m.groups()
+        if count:
+            signode += addnodes.desc_addname(', ', ', ')
+        signode += addnodes.desc_name(optname, optname)
+        signode += addnodes.desc_addname(args, args)
+        if not count:
+            firstname = optname
+        count += 1
+    if not firstname:
+        raise ValueError
+    return firstname
+
+
+strip_backslash_re = re.compile(r'\\(?=[^\\])')
+
+def desc_directive(desctype, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    inode = addnodes.index(entries=[])
+    node = addnodes.desc()
+    node['desctype'] = desctype
+
+    noindex = ('noindex' in options)
+    node['noindex'] = noindex
+    # remove backslashes to support (dummy) escapes; helps Vim's highlighting
+    signatures = map(lambda s: strip_backslash_re.sub('', s.strip()),
+                     arguments[0].split('\n'))
+    names = []
+    clsname = None
+    module = options.get('module', env.currmodule)
+    for i, sig in enumerate(signatures):
+        # add a signature node for each signature in the current unit
+        # and add a reference target for it
+        sig = sig.strip()
+        signode = addnodes.desc_signature(sig, '')
+        signode['first'] = False
+        node.append(signode)
+        try:
+            if desctype in ('function', 'data', 'class', 'exception',
+                            'method', 'staticmethod', 'attribute'):
+                name, clsname = parse_py_signature(signode, sig, desctype, module, env)
+            elif desctype in ('cfunction', 'cmember', 'cmacro', 'ctype', 'cvar'):
+                name = parse_c_signature(signode, sig, desctype)
+            elif desctype == 'cmdoption':
+                optname = parse_option_desc(signode, sig)
+                if not noindex:
+                    targetname = optname.replace('/', '-')
+                    if env.currprogram:
+                        targetname = '-' + env.currprogram + targetname
+                    targetname = 'cmdoption' + targetname
+                    signode['ids'].append(targetname)
+                    state.document.note_explicit_target(signode)
+                    inode['entries'].append(
+                        ('pair', _('%scommand line option; %s') %
+                         ((env.currprogram and env.currprogram + ' ' or ''), sig),
+                         targetname, targetname))
+                    env.note_progoption(optname, targetname)
+                continue
+            elif desctype == 'describe':
+                signode.clear()
+                signode += addnodes.desc_name(sig, sig)
+                continue
+            else:
+                # another registered generic x-ref directive
+                rolename, indextemplate, parse_node = additional_xref_types[desctype]
+                if parse_node:
+                    fullname = parse_node(env, sig, signode)
+                else:
+                    signode.clear()
+                    signode += addnodes.desc_name(sig, sig)
+                    # normalize whitespace like xfileref_role does
+                    fullname = ws_re.sub('', sig)
+                if not noindex:
+                    targetname = '%s-%s' % (rolename, fullname)
+                    signode['ids'].append(targetname)
+                    state.document.note_explicit_target(signode)
+                    if indextemplate:
+                        indexentry = _(indextemplate) % (fullname,)
+                        indextype = 'single'
+                        colon = indexentry.find(':')
+                        if colon != -1:
+                            indextype = indexentry[:colon].strip()
+                            indexentry = indexentry[colon+1:].strip()
+                        inode['entries'].append((indextype, indexentry,
+                                                 targetname, targetname))
+                    env.note_reftarget(rolename, fullname, targetname)
+                # don't use object indexing below
+                continue
+        except ValueError, err:
+            # signature parsing failed
+            signode.clear()
+            signode += addnodes.desc_name(sig, sig)
+            continue             # we don't want an index entry here
+        # only add target and index entry if this is the first description of the
+        # function name in this desc block
+        if not noindex and name not in names:
+            fullname = (module and module + '.' or '') + name
+            # note target
+            if fullname not in state.document.ids:
+                signode['names'].append(fullname)
+                signode['ids'].append(fullname)
+                signode['first'] = (not names)
+                state.document.note_explicit_target(signode)
+                env.note_descref(fullname, desctype, lineno)
+            names.append(name)
+
+            indextext = desc_index_text(desctype, module, name,
+                                        env.config.add_module_names)
+            inode['entries'].append(('single', indextext, fullname, fullname))
+
+    subnode = addnodes.desc_content()
+    # needed for automatic qualification of members
+    clsname_set = False
+    if desctype in ('class', 'exception') and names:
+        env.currclass = names[0]
+        clsname_set = True
+    elif desctype in ('method', 'staticmethod', 'attribute') and \
+             clsname and not env.currclass:
+        env.currclass = clsname.strip('.')
+        clsname_set = True
+    # needed for association of version{added,changed} directives
+    if names:
+        env.currdesc = names[0]
+    state.nested_parse(content, content_offset, subnode)
+    handle_doc_fields(subnode, env)
+    if clsname_set:
+        env.currclass = None
+    env.currdesc = None
+    node.append(subnode)
+    return [inode, node]
+
+desc_directive.content = 1
+desc_directive.arguments = (1, 0, 1)
+desc_directive.options = {'noindex': directives.flag,
+                          'module': directives.unchanged}
+
+desctypes = [
+    # the Python ones
+    'function',
+    'data',
+    'class',
+    'method',
+    'staticmethod',
+    'attribute',
+    'exception',
+    # the C ones
+    'cfunction',
+    'cmember',
+    'cmacro',
+    'ctype',
+    'cvar',
+    # for command line options
+    'cmdoption',
+    # the generic one
+    'describe',
+    'envvar',
+]
+
+for _name in desctypes:
+    directives.register_directive(_name, desc_directive)
+
+_ = lambda x: x
+
+# Generic cross-reference types; they can be registered in the application;
+# the directives are either desc_directive or target_directive
+additional_xref_types = {
+    # directive name: (role name, index text, function to parse the desc node)
+    'envvar': ('envvar', _('environment variable; %s'), None),
+}
+
+del _
+
+
+# ------ target --------------------------------------------------------------------
+
+def target_directive(targettype, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    """Generic target for user-defined cross-reference types."""
+    env = state.document.settings.env
+    rolename, indextemplate, foo = additional_xref_types[targettype]
+    # normalize whitespace in fullname like xfileref_role does
+    fullname = ws_re.sub('', arguments[0].strip())
+    targetname = '%s-%s' % (rolename, fullname)
+    node = nodes.target('', '', ids=[targetname])
+    state.document.note_explicit_target(node)
+    ret = [node]
+    if indextemplate:
+        indexentry = indextemplate % (fullname,)
+        indextype = 'single'
+        colon = indexentry.find(':')
+        if colon != -1:
+            indextype = indexentry[:colon].strip()
+            indexentry = indexentry[colon+1:].strip()
+        inode = addnodes.index(entries=[(indextype, indexentry, targetname, targetname)])
+        ret.insert(0, inode)
+    env.note_reftarget(rolename, fullname, targetname)
+    return ret
+
+target_directive.content = 0
+target_directive.arguments = (1, 0, 1)
+
+# note, the target directive is not registered here, it is used by the application
+# when registering additional xref types
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,411 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.other
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import posixpath
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.locale import pairindextypes
+from sphinx.util import patfilter, ws_re, caption_ref_re
+from sphinx.util.compat import make_admonition
+
+
+# ------ the TOC tree ---------------------------------------------------------------
+
+def toctree_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    suffix = env.config.source_suffix
+    dirname = posixpath.dirname(env.docname)
+    glob = 'glob' in options
+
+    ret = []
+    subnode = addnodes.toctree()
+    includefiles = []
+    includetitles = {}
+    all_docnames = env.found_docs.copy()
+    # don't add the currently visited file in catch-all patterns
+    all_docnames.remove(env.docname)
+    for entry in content:
+        if not entry:
+            continue
+        if not glob:
+            # look for explicit titles and documents ("Some Title <document>").
+            m = caption_ref_re.match(entry)
+            if m:
+                docname = m.group(2)
+                includetitles[docname] = m.group(1)
+            else:
+                docname = entry
+            # remove suffixes (backwards compatibility)
+            if docname.endswith(suffix):
+                docname = docname[:-len(suffix)]
+            # absolutize filenames
+            docname = posixpath.normpath(posixpath.join(dirname, docname))
+            if docname not in env.found_docs:
+                ret.append(state.document.reporter.warning(
+                    'toctree references unknown document %r' % docname, line=lineno))
+            else:
+                includefiles.append(docname)
+        else:
+            patname = posixpath.normpath(posixpath.join(dirname, entry))
+            docnames = sorted(patfilter(all_docnames, patname))
+            for docname in docnames:
+                all_docnames.remove(docname) # don't include it again
+                includefiles.append(docname)
+            if not docnames:
+                ret.append(state.document.reporter.warning(
+                    'toctree glob pattern %r didn\'t match any documents' % entry,
+                    line=lineno))
+    subnode['includefiles'] = includefiles
+    subnode['includetitles'] = includetitles
+    subnode['maxdepth'] = options.get('maxdepth', -1)
+    subnode['glob'] = glob
+    ret.append(subnode)
+    return ret
+
+toctree_directive.content = 1
+toctree_directive.options = {'maxdepth': int, 'glob': directives.flag}
+directives.register_directive('toctree', toctree_directive)
+
+
+# ------ section metadata ----------------------------------------------------------
+
+def module_directive(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    modname = arguments[0].strip()
+    noindex = 'noindex' in options
+    env.currmodule = modname
+    env.note_module(modname, options.get('synopsis', ''),
+                    options.get('platform', ''),
+                    'deprecated' in options)
+    modulenode = addnodes.module()
+    modulenode['modname'] = modname
+    modulenode['synopsis'] = options.get('synopsis', '')
+    targetnode = nodes.target('', '', ids=['module-' + modname])
+    state.document.note_explicit_target(targetnode)
+    ret = [modulenode, targetnode]
+    if 'platform' in options:
+        modulenode['platform'] = options['platform']
+        node = nodes.paragraph()
+        node += nodes.emphasis('', _('Platforms: '))
+        node += nodes.Text(options['platform'], options['platform'])
+        ret.append(node)
+    # the synopsis isn't printed; in fact, it is only used in the modindex currently
+    if not noindex:
+        indextext = _('%s (module)') % modname
+        inode = addnodes.index(entries=[('single', indextext,
+                                         'module-' + modname, modname)])
+        ret.insert(0, inode)
+    return ret
+
+module_directive.arguments = (1, 0, 0)
+module_directive.options = {'platform': lambda x: x,
+                            'synopsis': lambda x: x,
+                            'noindex': directives.flag,
+                            'deprecated': directives.flag}
+directives.register_directive('module', module_directive)
+
+
+def currentmodule_directive(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    # This directive is just to tell people that we're documenting
+    # stuff in module foo, but links to module foo won't lead here.
+    env = state.document.settings.env
+    modname = arguments[0].strip()
+    if modname == 'None':
+        env.currmodule = None
+    else:
+        env.currmodule = modname
+    return []
+
+currentmodule_directive.arguments = (1, 0, 0)
+directives.register_directive('currentmodule', currentmodule_directive)
+
+
+def author_directive(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    # Show authors only if the show_authors option is on
+    env = state.document.settings.env
+    if not env.config.show_authors:
+        return []
+    para = nodes.paragraph()
+    emph = nodes.emphasis()
+    para += emph
+    if name == 'sectionauthor':
+        text = _('Section author: ')
+    elif name == 'moduleauthor':
+        text = _('Module author: ')
+    else:
+        text = _('Author: ')
+    emph += nodes.Text(text, text)
+    inodes, messages = state.inline_text(arguments[0], lineno)
+    emph.extend(inodes)
+    return [para] + messages
+
+author_directive.arguments = (1, 0, 1)
+directives.register_directive('sectionauthor', author_directive)
+directives.register_directive('moduleauthor', author_directive)
+
+
+def program_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    program = ws_re.sub('-', arguments[0].strip())
+    if program == 'None':
+        env.currprogram = None
+    else:
+        env.currprogram = program
+    return []
+
+program_directive.arguments = (1, 0, 1)
+directives.register_directive('program', program_directive)
+
+
+# ------ index markup --------------------------------------------------------------
+
+indextypes = [
+    'single', 'pair', 'triple',
+]
+
+def index_directive(name, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    arguments = arguments[0].split('\n')
+    env = state.document.settings.env
+    targetid = 'index-%s' % env.index_num
+    env.index_num += 1
+    targetnode = nodes.target('', '', ids=[targetid])
+    state.document.note_explicit_target(targetnode)
+    indexnode = addnodes.index()
+    indexnode['entries'] = ne = []
+    for entry in arguments:
+        entry = entry.strip()
+        for type in pairindextypes:
+            if entry.startswith(type+':'):
+                value = entry[len(type)+1:].strip()
+                value = pairindextypes[type] + '; ' + value
+                ne.append(('pair', value, targetid, value))
+                break
+        else:
+            for type in indextypes:
+                if entry.startswith(type+':'):
+                    value = entry[len(type)+1:].strip()
+                    ne.append((type, value, targetid, value))
+                    break
+            # shorthand notation for single entries
+            else:
+                for value in entry.split(','):
+                    value = value.strip()
+                    if not value:
+                        continue
+                    ne.append(('single', value, targetid, value))
+    return [indexnode, targetnode]
+
+index_directive.arguments = (1, 0, 1)
+directives.register_directive('index', index_directive)
+
+# ------ versionadded/versionchanged -----------------------------------------------
+
+def version_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    node = addnodes.versionmodified()
+    node['type'] = name
+    node['version'] = arguments[0]
+    if len(arguments) == 2:
+        inodes, messages = state.inline_text(arguments[1], lineno+1)
+        node.extend(inodes)
+        if content:
+            state.nested_parse(content, content_offset, node)
+        ret = [node] + messages
+    else:
+        ret = [node]
+    env = state.document.settings.env
+    env.note_versionchange(node['type'], node['version'], node, lineno)
+    return ret
+
+version_directive.arguments = (1, 1, 1)
+version_directive.content = 1
+
+directives.register_directive('deprecated', version_directive)
+directives.register_directive('versionadded', version_directive)
+directives.register_directive('versionchanged', version_directive)
+
+
+# ------ see also ------------------------------------------------------------------
+
+def seealso_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    ret = make_admonition(
+        addnodes.seealso, name, [_('See also')], options, content,
+        lineno, content_offset, block_text, state, state_machine)
+    if arguments:
+        argnodes, msgs = state.inline_text(arguments[0], lineno)
+        para = nodes.paragraph()
+        para += argnodes
+        para += msgs
+        ret[0].insert(1, para)
+    return ret
+
+seealso_directive.content = 1
+seealso_directive.arguments = (0, 1, 1)
+directives.register_directive('seealso', seealso_directive)
+
+
+# ------ production list (for the reference) ---------------------------------------
+
+token_re = re.compile('`([a-z_]+)`')
+
+def token_xrefs(text, env):
+    retnodes = []
+    pos = 0
+    for m in token_re.finditer(text):
+        if m.start() > pos:
+            txt = text[pos:m.start()]
+            retnodes.append(nodes.Text(txt, txt))
+        refnode = addnodes.pending_xref(m.group(1))
+        refnode['reftype'] = 'token'
+        refnode['reftarget'] = m.group(1)
+        refnode['modname'] = env.currmodule
+        refnode['classname'] = env.currclass
+        refnode += nodes.literal(m.group(1), m.group(1), classes=['xref'])
+        retnodes.append(refnode)
+        pos = m.end()
+    if pos < len(text):
+        retnodes.append(nodes.Text(text[pos:], text[pos:]))
+    return retnodes
+
+def productionlist_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    node = addnodes.productionlist()
+    messages = []
+    i = 0
+
+    for rule in arguments[0].split('\n'):
+        if i == 0 and ':' not in rule:
+            # production group
+            continue
+        i += 1
+        try:
+            name, tokens = rule.split(':', 1)
+        except ValueError:
+            break
+        subnode = addnodes.production()
+        subnode['tokenname'] = name.strip()
+        if subnode['tokenname']:
+            idname = 'grammar-token-%s' % subnode['tokenname']
+            if idname not in state.document.ids:
+                subnode['ids'].append(idname)
+            state.document.note_implicit_target(subnode, subnode)
+            env.note_reftarget('token', subnode['tokenname'], idname)
+        subnode.extend(token_xrefs(tokens, env))
+        node.append(subnode)
+    return [node] + messages
+
+productionlist_directive.content = 0
+productionlist_directive.arguments = (1, 0, 1)
+directives.register_directive('productionlist', productionlist_directive)
+
+
+# ------ glossary directive ---------------------------------------------------------
+
+def glossary_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    """Glossary with cross-reference targets for :term: roles."""
+    env = state.document.settings.env
+    node = addnodes.glossary()
+    state.nested_parse(content, content_offset, node)
+
+    # the content should be definition lists
+    dls = [child for child in node if isinstance(child, nodes.definition_list)]
+    # now, extract definition terms to enable cross-reference creation
+    for dl in dls:
+        dl['classes'].append('glossary')
+        for li in dl.children:
+            if not li.children or not isinstance(li[0], nodes.term):
+                continue
+            termtext = li.children[0].astext()
+            new_id = 'term-' + nodes.make_id(termtext)
+            if new_id in env.gloss_entries:
+                new_id = 'term-' + str(len(env.gloss_entries))
+            env.gloss_entries.add(new_id)
+            li[0]['names'].append(new_id)
+            li[0]['ids'].append(new_id)
+            state.document.settings.env.note_reftarget('term', termtext.lower(),
+                                                       new_id)
+            # add an index entry too
+            indexnode = addnodes.index()
+            indexnode['entries'] = [('single', termtext, new_id, termtext)]
+            li.insert(0, indexnode)
+    return [node]
+
+glossary_directive.content = 1
+glossary_directive.arguments = (0, 0, 0)
+directives.register_directive('glossary', glossary_directive)
+
+
+# ------ miscellaneous markup -------------------------------------------------------
+
+def centered_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    if not arguments:
+        return []
+    subnode = addnodes.centered()
+    inodes, messages = state.inline_text(arguments[0], lineno)
+    subnode.extend(inodes)
+    return [subnode] + messages
+
+centered_directive.arguments = (1, 0, 1)
+directives.register_directive('centered', centered_directive)
+
+
+def acks_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    node = addnodes.acks()
+    state.nested_parse(content, content_offset, node)
+    if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list):
+        return [state.document.reporter.warning('.. acks content is not a list',
+                                                line=lineno)]
+    return [node]
+
+acks_directive.content = 1
+acks_directive.arguments = (0, 0, 0)
+directives.register_directive('acks', acks_directive)
+
+
+def tabularcolumns_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    # support giving explicit tabulary column definition to latex
+    node = addnodes.tabular_col_spec()
+    node['spec'] = arguments[0]
+    return [node]
+
+tabularcolumns_directive.content = 0
+tabularcolumns_directive.arguments = (1, 0, 1)
+directives.register_directive('tabularcolumns', tabularcolumns_directive)
+
+
+# register the standard rst class directive under a different name
+
+try:
+    # docutils 0.4
+    from docutils.parsers.rst.directives.misc import class_directive
+    directives.register_directive('cssclass', class_directive)
+except ImportError:
+    try:
+        # docutils 0.5
+        from docutils.parsers.rst.directives.misc import Class
+        directives.register_directive('cssclass', Class)
+    except ImportError:
+        # whatever :)
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1387 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.environment
+    ~~~~~~~~~~~~~~~~~~
+
+    Global creation environment.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import os
+import time
+import heapq
+import types
+import imghdr
+import difflib
+import cPickle as pickle
+from os import path
+from glob import glob
+from string import uppercase
+from itertools import izip, groupby
+try:
+    import hashlib
+    md5 = hashlib.md5
+except ImportError:
+    # 2.4 compatibility
+    import md5
+    md5 = md5.new
+
+from docutils import nodes
+from docutils.io import FileInput, NullOutput
+from docutils.core import Publisher
+from docutils.utils import Reporter, relative_path
+from docutils.readers import standalone
+from docutils.parsers.rst import roles
+from docutils.parsers.rst.languages import en as english
+from docutils.parsers.rst.directives.html import MetaBody
+from docutils.writers import UnfilteredWriter
+from docutils.transforms import Transform
+from docutils.transforms.parts import ContentsFilter
+
+from sphinx import addnodes
+from sphinx.util import get_matching_docs, SEP, ustrftime
+from sphinx.directives import additional_xref_types
+
+default_settings = {
+    'embed_stylesheet': False,
+    'cloak_email_addresses': True,
+    'pep_base_url': 'http://www.python.org/dev/peps/',
+    'rfc_base_url': 'http://rfc.net/',
+    'input_encoding': 'utf-8',
+    'doctitle_xform': False,
+    'sectsubtitle_xform': False,
+}
+
+# This is increased every time an environment attribute is added
+# or changed to properly invalidate pickle files.
+ENV_VERSION = 26
+
+
+default_substitutions = set([
+    'version',
+    'release',
+    'today',
+])
+
+dummy_reporter = Reporter('', 4, 4)
+
+
+class RedirStream(object):
+    def __init__(self, writefunc):
+        self.writefunc = writefunc
+    def write(self, text):
+        if text.strip():
+            self.writefunc(text)
+
+
+class NoUri(Exception):
+    """Raised by get_relative_uri if there is no URI available."""
+    pass
+
+
+class DefaultSubstitutions(Transform):
+    """
+    Replace some substitutions if they aren't defined in the document.
+    """
+    # run before the default Substitutions
+    default_priority = 210
+
+    def apply(self):
+        config = self.document.settings.env.config
+        # only handle those not otherwise defined in the document
+        to_handle = default_substitutions - set(self.document.substitution_defs)
+        for ref in self.document.traverse(nodes.substitution_reference):
+            refname = ref['refname']
+            if refname in to_handle:
+                text = config[refname]
+                if refname == 'today' and not text:
+                    # special handling: can also specify a strftime format
+                    text = ustrftime(config.today_fmt or _('%B %d, %Y'))
+                ref.replace_self(nodes.Text(text, text))
+
+
+class MoveModuleTargets(Transform):
+    """
+    Move module targets to their nearest enclosing section title.
+    """
+    default_priority = 210
+
+    def apply(self):
+        for node in self.document.traverse(nodes.target):
+            if not node['ids']:
+                continue
+            if node['ids'][0].startswith('module-') and \
+                   node.parent.__class__ is nodes.section:
+                node.parent['ids'] = node['ids']
+                node.parent.remove(node)
+
+
+class HandleCodeBlocks(Transform):
+    """
+    Move doctest blocks out of blockquotes.
+    """
+    default_priority = 210
+
+    def apply(self):
+        for node in self.document.traverse(nodes.block_quote):
+            if len(node.children) == 1 and isinstance(node.children[0],
+                                                      nodes.doctest_block):
+                node.replace_self(node.children[0])
+
+class CitationReferences(Transform):
+    """
+    Handle citation references before the default docutils transform does.
+    """
+    default_priority = 619
+
+    def apply(self):
+        for citnode in self.document.traverse(nodes.citation_reference):
+            cittext = citnode.astext()
+            refnode = addnodes.pending_xref(cittext, reftype='citation',
+                                            reftarget=cittext)
+            refnode += nodes.Text('[' + cittext + ']')
+            citnode.parent.replace(citnode, refnode)
+
+
+class SphinxStandaloneReader(standalone.Reader):
+    """
+    Add our own transforms.
+    """
+    transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets,
+                  HandleCodeBlocks]
+
+    def get_transforms(self):
+        return standalone.Reader.get_transforms(self) + self.transforms
+
+
+class SphinxDummyWriter(UnfilteredWriter):
+    supported = ('html',)  # needed to keep "meta" nodes
+
+    def translate(self):
+        pass
+
+
+
+class SphinxContentsFilter(ContentsFilter):
+    """
+    Used with BuildEnvironment.add_toc_from() to discard cross-file links
+    within table-of-contents link nodes.
+    """
+    def visit_pending_xref(self, node):
+        text = node.astext()
+        self.parent.append(nodes.literal(text, text))
+        raise nodes.SkipNode
+
+
+class BuildEnvironment:
+    """
+    The environment in which the ReST files are translated.
+    Stores an inventory of cross-file targets and provides doctree
+    transformations to resolve links to them.
+    """
+
+    # --------- ENVIRONMENT PERSISTENCE ----------------------------------------
+
+    @staticmethod
+    def frompickle(config, filename):
+        picklefile = open(filename, 'rb')
+        try:
+            env = pickle.load(picklefile)
+        finally:
+            picklefile.close()
+        env.config.values = config.values
+        if env.version != ENV_VERSION:
+            raise IOError('env version not current')
+        return env
+
+    def topickle(self, filename):
+        # remove unpicklable attributes
+        warnfunc = self._warnfunc
+        self.set_warnfunc(None)
+        values = self.config.values
+        del self.config.values
+        picklefile = open(filename, 'wb')
+        # remove potentially pickling-problematic values from config
+        for key, val in vars(self.config).items():
+            if key.startswith('_') or \
+                   isinstance(val, types.ModuleType) or \
+                   isinstance(val, types.FunctionType) or \
+                   isinstance(val, (type, types.ClassType)):
+                del self.config[key]
+        try:
+            pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
+        finally:
+            picklefile.close()
+        # reset attributes
+        self.config.values = values
+        self.set_warnfunc(warnfunc)
+
+    # --------- ENVIRONMENT INITIALIZATION -------------------------------------
+
+    def __init__(self, srcdir, doctreedir, config):
+        self.doctreedir = doctreedir
+        self.srcdir = srcdir
+        self.config = config
+
+        # the application object; only set while update() runs
+        self.app = None
+
+        # the docutils settings for building
+        self.settings = default_settings.copy()
+        self.settings['env'] = self
+
+        # the function to write warning messages with
+        self._warnfunc = None
+
+        # this is to invalidate old pickles
+        self.version = ENV_VERSION
+
+        # All "docnames" here are /-separated and relative and exclude the source suffix.
+
+        self.found_docs = set()     # contains all existing docnames
+        self.all_docs = {}          # docname -> mtime at the time of build
+                                    # contains all built docnames
+        self.dependencies = {}      # docname -> set of dependent file names, relative to
+                                    # documentation root
+
+        # File metadata
+        self.metadata = {}          # docname -> dict of metadata items
+
+        # TOC inventory
+        self.titles = {}            # docname -> title node
+        self.tocs = {}              # docname -> table of contents nodetree
+        self.toc_num_entries = {}   # docname -> number of real entries
+                                    # used to determine when to show the TOC in a sidebar
+                                    # (don't show if it's only one item)
+        self.toctree_includes = {}  # docname -> list of toctree includefiles
+        self.files_to_rebuild = {}  # docname -> set of files (containing its TOCs)
+                                    # to rebuild too
+        self.glob_toctrees = set()  # docnames that have :glob: toctrees
+
+        # X-ref target inventory
+        self.descrefs = {}          # fullname -> docname, desctype
+        self.filemodules = {}       # docname -> [modules]
+        self.modules = {}           # modname -> docname, synopsis, platform, deprecated
+        self.labels = {}            # labelname -> docname, labelid, sectionname
+        self.anonlabels = {}        # labelname -> docname, labelid
+        self.progoptions = {}       # (program, name) -> docname, labelid
+        self.reftargets = {}        # (type, name) -> docname, labelid
+                                    # where type is term, token, envvar, citation
+
+        # Other inventories
+        self.indexentries = {}      # docname -> list of
+                                    # (type, string, target, aliasname)
+        self.versionchanges = {}    # version -> list of
+                                    # (type, docname, lineno, module, descname, content)
+        self.images = {}            # absolute path -> (docnames, unique filename)
+
+        # These are set while parsing a file
+        self.docname = None         # current document name
+        self.currmodule = None      # current module name
+        self.currclass = None       # current class name
+        self.currdesc = None        # current descref name
+        self.currprogram = None     # current program name
+        self.index_num = 0          # autonumber for index targets
+        self.gloss_entries = set()  # existing definition labels
+
+        # Some magically present labels
+        self.labels['genindex'] = ('genindex', '', _('Index'))
+        self.labels['modindex'] = ('modindex', '', _('Module Index'))
+        self.labels['search']   = ('search', '', _('Search Page'))
+
+    def set_warnfunc(self, func):
+        self._warnfunc = func
+        self.settings['warning_stream'] = RedirStream(func)
+
+    def warn(self, docname, msg, lineno=None):
+        if docname:
+            if lineno is None:
+                lineno = ''
+            self._warnfunc('%s:%s: %s' % (self.doc2path(docname), lineno, msg))
+        else:
+            self._warnfunc('GLOBAL:: ' + msg)
+
+    def clear_doc(self, docname):
+        """Remove all traces of a source file in the inventory."""
+        if docname in self.all_docs:
+            self.all_docs.pop(docname, None)
+            self.metadata.pop(docname, None)
+            self.dependencies.pop(docname, None)
+            self.titles.pop(docname, None)
+            self.tocs.pop(docname, None)
+            self.toc_num_entries.pop(docname, None)
+            self.toctree_includes.pop(docname, None)
+            self.filemodules.pop(docname, None)
+            self.indexentries.pop(docname, None)
+            self.glob_toctrees.discard(docname)
+
+            for subfn, fnset in self.files_to_rebuild.items():
+                fnset.discard(docname)
+                if not fnset:
+                    del self.files_to_rebuild[subfn]
+            for fullname, (fn, _) in self.descrefs.items():
+                if fn == docname:
+                    del self.descrefs[fullname]
+            for modname, (fn, _, _, _) in self.modules.items():
+                if fn == docname:
+                    del self.modules[modname]
+            for labelname, (fn, _, _) in self.labels.items():
+                if fn == docname:
+                    del self.labels[labelname]
+            for key, (fn, _) in self.reftargets.items():
+                if fn == docname:
+                    del self.reftargets[key]
+            for key, (fn, _) in self.progoptions.items():
+                if fn == docname:
+                    del self.progoptions[key]
+            for version, changes in self.versionchanges.items():
+                new = [change for change in changes if change[1] != docname]
+                changes[:] = new
+            for fullpath, (docs, _) in self.images.items():
+                docs.discard(docname)
+                if not docs:
+                    del self.images[fullpath]
+
+    def doc2path(self, docname, base=True, suffix=None):
+        """
+        Return the filename for the document name.
+        If base is True, return absolute path under self.srcdir.
+        If base is None, return relative path to self.srcdir.
+        If base is a path string, return absolute path under that.
+        If suffix is not None, add it instead of config.source_suffix.
+        """
+        suffix = suffix or self.config.source_suffix
+        if base is True:
+            return path.join(self.srcdir, docname.replace(SEP, path.sep)) + suffix
+        elif base is None:
+            return docname.replace(SEP, path.sep) + suffix
+        else:
+            return path.join(base, docname.replace(SEP, path.sep)) + suffix
+
+    def find_files(self, config):
+        """
+        Find all source files in the source dir and put them in self.found_docs.
+        """
+        exclude_dirs  = [d.replace(SEP, path.sep) for d in config.exclude_dirs]
+        exclude_trees = [d.replace(SEP, path.sep) for d in config.exclude_trees]
+        self.found_docs = set(get_matching_docs(
+            self.srcdir, config.source_suffix, exclude_docs=set(config.unused_docs),
+            exclude_dirs=exclude_dirs, exclude_trees=exclude_trees,
+            exclude_dirnames=['_sources'] + config.exclude_dirnames))
+
+    def get_outdated_files(self, config_changed):
+        """
+        Return (added, changed, removed) sets.
+        """
+        # clear all files no longer present
+        removed = set(self.all_docs) - self.found_docs
+
+        added = set()
+        changed = set()
+
+        if config_changed:
+            # config values affect e.g. substitutions
+            added = self.found_docs
+        else:
+            for docname in self.found_docs:
+                if docname not in self.all_docs:
+                    added.add(docname)
+                    continue
+                # if the doctree file is not there, rebuild
+                if not path.isfile(self.doc2path(docname, self.doctreedir,
+                                                 '.doctree')):
+                    changed.add(docname)
+                    continue
+                # check the mtime of the document
+                mtime = self.all_docs[docname]
+                newmtime = path.getmtime(self.doc2path(docname))
+                if newmtime > mtime:
+                    changed.add(docname)
+                    continue
+                # finally, check the mtime of dependencies
+                for dep in self.dependencies.get(docname, ()):
+                    try:
+                        # this will do the right thing when dep is absolute too
+                        deppath = path.join(self.srcdir, dep)
+                        if not path.isfile(deppath):
+                            changed.add(docname)
+                            break
+                        depmtime = path.getmtime(deppath)
+                        if depmtime > mtime:
+                            changed.add(docname)
+                            break
+                    except EnvironmentError:
+                        # give it another chance
+                        changed.add(docname)
+                        break
+
+        return added, changed, removed
+
+    def update(self, config, srcdir, doctreedir, app=None):
+        """(Re-)read all files new or changed since last update.  Yields a summary
+        and then docnames as it processes them.  Store all environment docnames
+        in the canonical format (ie using SEP as a separator in place of
+        os.path.sep)."""
+        config_changed = False
+        if self.config is None:
+            msg = '[new config] '
+            config_changed = True
+        else:
+            # check if a config value was changed that affects how doctrees are read
+            for key, descr in config.config_values.iteritems():
+                if not descr[1]:
+                    continue
+                if self.config[key] != config[key]:
+                    msg = '[config changed] '
+                    config_changed = True
+                    break
+            else:
+                msg = ''
+            # this value is not covered by the above loop because it is handled
+            # specially by the config class
+            if self.config.extensions != config.extensions:
+                msg = '[extensions changed] '
+                config_changed = True
+        # the source and doctree directories may have been relocated
+        self.srcdir = srcdir
+        self.doctreedir = doctreedir
+        self.find_files(config)
+
+        added, changed, removed = self.get_outdated_files(config_changed)
+
+        # if files were added or removed, all documents with globbed toctrees
+        # must be reread
+        if added or removed:
+            changed.update(self.glob_toctrees)
+
+        msg += '%s added, %s changed, %s removed' % (len(added), len(changed),
+                                                     len(removed))
+        yield msg
+
+        self.config = config
+        self.app = app
+
+        # clear all files no longer present
+        for docname in removed:
+            if app:
+                app.emit('env-purge-doc', self, docname)
+            self.clear_doc(docname)
+
+        # read all new and changed files
+        for docname in sorted(added | changed):
+            yield docname
+            self.read_doc(docname, app=app)
+
+        if config.master_doc not in self.all_docs:
+            self.warn(None, 'master file %s not found' %
+                      self.doc2path(config.master_doc))
+
+        self.app = None
+
+        # remove all non-existing images from inventory
+        for imgsrc in self.images.keys():
+            if not os.access(path.join(self.srcdir, imgsrc), os.R_OK):
+                del self.images[imgsrc]
+
+        if app:
+            app.emit('env-updated', self)
+
+
+    # --------- SINGLE FILE READING --------------------------------------------
+
+    def read_doc(self, docname, src_path=None, save_parsed=True, app=None):
+        """
+        Parse a file and add/update inventory entries for the doctree.
+        If srcpath is given, read from a different source file.
+        """
+        # remove all inventory entries for that file
+        if app:
+            app.emit('env-purge-doc', self, docname)
+        self.clear_doc(docname)
+
+        if src_path is None:
+            src_path = self.doc2path(docname)
+
+        if self.config.default_role:
+            role_fn, messages = roles.role(self.config.default_role, english,
+                                           0, dummy_reporter)
+            if role_fn:
+                roles._roles[''] = role_fn
+            else:
+                self.warn(docname, 'default role %s not found' %
+                          self.config.default_role)
+
+        self.docname = docname
+        self.settings['input_encoding'] = self.config.source_encoding
+
+        class SphinxSourceClass(FileInput):
+            def read(self):
+                data = FileInput.read(self)
+                if app:
+                    arg = [data]
+                    app.emit('source-read', docname, arg)
+                    data = arg[0]
+                return data
+
+        # publish manually
+        pub = Publisher(reader=SphinxStandaloneReader(),
+                        writer=SphinxDummyWriter(),
+                        source_class=SphinxSourceClass,
+                        destination_class=NullOutput)
+        pub.set_components(None, 'restructuredtext', None)
+        pub.process_programmatic_settings(None, self.settings, None)
+        pub.set_source(None, src_path)
+        pub.set_destination(None, None)
+        try:
+            pub.publish()
+            doctree = pub.document
+        except UnicodeError, err:
+            from sphinx.application import SphinxError
+            raise SphinxError(err.message)
+        self.filter_messages(doctree)
+        self.process_dependencies(docname, doctree)
+        self.process_images(docname, doctree)
+        self.process_metadata(docname, doctree)
+        self.create_title_from(docname, doctree)
+        self.note_labels_from(docname, doctree)
+        self.note_indexentries_from(docname, doctree)
+        self.note_citations_from(docname, doctree)
+        self.build_toc_from(docname, doctree)
+
+        # store time of reading, used to find outdated files
+        self.all_docs[docname] = time.time()
+
+        if app:
+            app.emit('doctree-read', doctree)
+
+        # make it picklable
+        doctree.reporter = None
+        doctree.transformer = None
+        doctree.settings.warning_stream = None
+        doctree.settings.env = None
+        doctree.settings.record_dependencies = None
+        for metanode in doctree.traverse(MetaBody.meta):
+            # docutils' meta nodes aren't picklable because the class is nested
+            metanode.__class__ = addnodes.meta
+
+        # cleanup
+        self.docname = None
+        self.currmodule = None
+        self.currclass = None
+        self.gloss_entries = set()
+
+        if save_parsed:
+            # save the parsed doctree
+            doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
+            dirname = path.dirname(doctree_filename)
+            if not path.isdir(dirname):
+                os.makedirs(dirname)
+            f = open(doctree_filename, 'wb')
+            try:
+                pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)
+            finally:
+                f.close()
+        else:
+            return doctree
+
+    def filter_messages(self, doctree):
+        """
+        Filter system messages from a doctree.
+        """
+        filterlevel = self.config.keep_warnings and 2 or 5
+        for node in doctree.traverse(nodes.system_message):
+            if node['level'] < filterlevel:
+                node.parent.remove(node)
+
+    def process_dependencies(self, docname, doctree):
+        """
+        Process docutils-generated dependency info.
+        """
+        deps = doctree.settings.record_dependencies
+        if not deps:
+            return
+        docdir = path.dirname(self.doc2path(docname, base=None))
+        for dep in deps.list:
+            dep = path.join(docdir, dep)
+            self.dependencies.setdefault(docname, set()).add(dep)
+
+    def process_images(self, docname, doctree):
+        """
+        Process and rewrite image URIs.
+        """
+        existing_names = set(v[1] for v in self.images.itervalues())
+        docdir = path.dirname(self.doc2path(docname, base=None))
+        for node in doctree.traverse(nodes.image):
+            # Map the mimetype to the corresponding image.  The writer may
+            # choose the best image from these candidates.  The special key * is
+            # set if there is only single candiate to be used by a writer.
+            # The special key ? is set for nonlocal URIs.
+            node['candidates'] = candidates = {}
+            imguri = node['uri']
+            if imguri.find('://') != -1:
+                self.warn(docname, 'Nonlocal image URI found: %s' % imguri, node.line)
+                candidates['?'] = imguri
+                continue
+            # imgpath is the image path *from srcdir*
+            imgpath = path.normpath(path.join(docdir, imguri))
+            # set imgpath as default URI
+            node['uri'] = imgpath
+            if imgpath.endswith(os.extsep + '*'):
+                for filename in glob(path.join(self.srcdir, imgpath)):
+                    new_imgpath = relative_path(self.srcdir, filename)
+                    if filename.lower().endswith('.pdf'):
+                        candidates['application/pdf'] = new_imgpath
+                    elif filename.lower().endswith('.svg'):
+                        candidates['image/svg+xml'] = new_imgpath
+                    else:
+                        try:
+                            f = open(filename, 'rb')
+                            try:
+                                imgtype = imghdr.what(f)
+                            finally:
+                                f.close()
+                        except (OSError, IOError):
+                            self.warn(docname, 'Image file %s not readable' % filename)
+                        if imgtype:
+                            candidates['image/' + imgtype] = new_imgpath
+            else:
+                candidates['*'] = imgpath
+            # map image paths to unique image names (so that they can be put
+            # into a single directory)
+            for imgpath in candidates.itervalues():
+                self.dependencies.setdefault(docname, set()).add(imgpath)
+                if not os.access(path.join(self.srcdir, imgpath), os.R_OK):
+                    self.warn(docname, 'Image file not readable: %s' % imgpath,
+                              node.line)
+                if imgpath in self.images:
+                    self.images[imgpath][0].add(docname)
+                    continue
+                uniquename = path.basename(imgpath)
+                base, ext = path.splitext(uniquename)
+                i = 0
+                while uniquename in existing_names:
+                    i += 1
+                    uniquename = '%s%s%s' % (base, i, ext)
+                self.images[imgpath] = (set([docname]), uniquename)
+                existing_names.add(uniquename)
+
+    def process_metadata(self, docname, doctree):
+        """
+        Process the docinfo part of the doctree as metadata.
+        """
+        self.metadata[docname] = md = {}
+        try:
+            docinfo = doctree[0]
+        except IndexError:
+            # probably an empty document
+            return
+        if docinfo.__class__ is not nodes.docinfo:
+            # nothing to see here
+            return
+        for node in docinfo:
+            if node.__class__ is nodes.author:
+                # handled specially by docutils
+                md['author'] = node.astext()
+            elif node.__class__ is nodes.field:
+                name, body = node
+                md[name.astext()] = body.astext()
+        del doctree[0]
+
+    def create_title_from(self, docname, document):
+        """
+        Add a title node to the document (just copy the first section title),
+        and store that title in the environment.
+        """
+        for node in document.traverse(nodes.section):
+            titlenode = nodes.title()
+            visitor = SphinxContentsFilter(document)
+            node[0].walkabout(visitor)
+            titlenode += visitor.get_entry_text()
+            self.titles[docname] = titlenode
+            return
+
+    def note_labels_from(self, docname, document):
+        for name, explicit in document.nametypes.iteritems():
+            if not explicit:
+                continue
+            labelid = document.nameids[name]
+            if labelid is None:
+                continue
+            node = document.ids[labelid]
+            if name.isdigit() or node.has_key('refuri') or \
+                   node.tagname.startswith('desc_'):
+                # ignore footnote labels, labels automatically generated from a
+                # link and description units
+                continue
+            if name in self.labels:
+                self.warn(docname, 'duplicate label %s, ' % name +
+                          'other instance in %s' % self.doc2path(self.labels[name][0]),
+                          node.line)
+            self.anonlabels[name] = docname, labelid
+            if node.tagname == 'section':
+                sectname = node[0].astext() # node[0] == title node
+            elif node.tagname == 'figure':
+                for n in node:
+                    if n.tagname == 'caption':
+                        sectname = n.astext()
+                        break
+                else:
+                    continue
+            else:
+                # anonymous-only labels
+                continue
+            self.labels[name] = docname, labelid, sectname
+
+    def note_indexentries_from(self, docname, document):
+        entries = self.indexentries[docname] = []
+        for node in document.traverse(addnodes.index):
+            entries.extend(node['entries'])
+
+    def note_citations_from(self, docname, document):
+        for node in document.traverse(nodes.citation):
+            label = node[0].astext()
+            if ('citation', label) in self.reftargets:
+                self.warn(docname, 'duplicate citation %s, ' % label +
+                          'other instance in %s' % self.doc2path(
+                    self.reftargets['citation', label][0]), node.line)
+            self.reftargets['citation', label] = (docname, node['ids'][0])
+
+    def note_toctree(self, docname, toctreenode):
+        """Note a TOC tree directive in a document and gather information about
+           file relations from it."""
+        if toctreenode['glob']:
+            self.glob_toctrees.add(docname)
+        includefiles = toctreenode['includefiles']
+        for includefile in includefiles:
+            # note that if the included file is rebuilt, this one must be
+            # too (since the TOC of the included file could have changed)
+            self.files_to_rebuild.setdefault(includefile, set()).add(docname)
+        self.toctree_includes.setdefault(docname, []).extend(includefiles)
+
+    def build_toc_from(self, docname, document):
+        """Build a TOC from the doctree and store it in the inventory."""
+        numentries = [0] # nonlocal again...
+
+        try:
+            maxdepth = int(self.metadata[docname].get('tocdepth', 0))
+        except ValueError:
+            maxdepth = 0
+
+        def build_toc(node, depth=1):
+            entries = []
+            for subnode in node:
+                if isinstance(subnode, addnodes.toctree):
+                    # just copy the toctree node which is then resolved
+                    # in self.get_and_resolve_doctree
+                    item = subnode.copy()
+                    entries.append(item)
+                    # do the inventory stuff
+                    self.note_toctree(docname, subnode)
+                    continue
+                if not isinstance(subnode, nodes.section):
+                    continue
+                title = subnode[0]
+                # copy the contents of the section title, but without references
+                # and unnecessary stuff
+                visitor = SphinxContentsFilter(document)
+                title.walkabout(visitor)
+                nodetext = visitor.get_entry_text()
+                if not numentries[0]:
+                    # for the very first toc entry, don't add an anchor
+                    # as it is the file's title anyway
+                    anchorname = ''
+                else:
+                    anchorname = '#' + subnode['ids'][0]
+                numentries[0] += 1
+                reference = nodes.reference('', '', refuri=docname,
+                                            anchorname=anchorname,
+                                            *nodetext)
+                para = addnodes.compact_paragraph('', '', reference)
+                item = nodes.list_item('', para)
+                if maxdepth == 0 or depth < maxdepth:
+                    item += build_toc(subnode, depth+1)
+                entries.append(item)
+            if entries:
+                return nodes.bullet_list('', *entries)
+            return []
+        toc = build_toc(document)
+        if toc:
+            self.tocs[docname] = toc
+        else:
+            self.tocs[docname] = nodes.bullet_list('')
+        self.toc_num_entries[docname] = numentries[0]
+
+    def get_toc_for(self, docname):
+        """Return a TOC nodetree -- for use on the same page only!"""
+        toc = self.tocs[docname].deepcopy()
+        for node in toc.traverse(nodes.reference):
+            node['refuri'] = node['anchorname']
+        return toc
+
+    # -------
+    # these are called from docutils directives and therefore use self.docname
+    #
+    def note_descref(self, fullname, desctype, line):
+        if fullname in self.descrefs:
+            self.warn(self.docname,
+                      'duplicate canonical description name %s, ' % fullname +
+                      'other instance in %s' % self.doc2path(self.descrefs[fullname][0]),
+                      line)
+        self.descrefs[fullname] = (self.docname, desctype)
+
+    def note_module(self, modname, synopsis, platform, deprecated):
+        self.modules[modname] = (self.docname, synopsis, platform, deprecated)
+        self.filemodules.setdefault(self.docname, []).append(modname)
+
+    def note_progoption(self, optname, labelid):
+        self.progoptions[self.currprogram, optname] = (self.docname, labelid)
+
+    def note_reftarget(self, type, name, labelid):
+        self.reftargets[type, name] = (self.docname, labelid)
+
+    def note_versionchange(self, type, version, node, lineno):
+        self.versionchanges.setdefault(version, []).append(
+            (type, self.docname, lineno, self.currmodule, self.currdesc, node.astext()))
+
+    def note_dependency(self, filename):
+        basename = path.dirname(self.doc2path(self.docname, base=None))
+        # this will do the right thing when filename is absolute too
+        filename = path.join(basename, filename)
+        self.dependencies.setdefault(self.docname, set()).add(filename)
+    # -------
+
+    # --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
+
+    def get_doctree(self, docname):
+        """Read the doctree for a file from the pickle and return it."""
+        doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
+        f = open(doctree_filename, 'rb')
+        try:
+            doctree = pickle.load(f)
+        finally:
+            f.close()
+        doctree.settings.env = self
+        doctree.reporter = Reporter(self.doc2path(docname), 2, 4,
+                                    stream=RedirStream(self._warnfunc))
+        return doctree
+
+
+    def get_and_resolve_doctree(self, docname, builder, doctree=None,
+                                prune_toctrees=True):
+        """Read the doctree from the pickle, resolve cross-references and
+           toctrees and return it."""
+        if doctree is None:
+            doctree = self.get_doctree(docname)
+
+        # resolve all pending cross-references
+        self.resolve_references(doctree, docname, builder)
+
+        # now, resolve all toctree nodes
+        for toctreenode in doctree.traverse(addnodes.toctree):
+            result = self.resolve_toctree(docname, builder, toctreenode,
+                                          prune=prune_toctrees)
+            if result is None:
+                toctreenode.replace_self([])
+            else:
+                toctreenode.replace_self(result)
+
+        return doctree
+
+    def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0,
+                        titles_only=False):
+        """
+        Resolve a *toctree* node into individual bullet lists with titles
+        as items, returning None (if no containing titles are found) or
+        a new node.
+
+        If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
+        to the value of the *maxdepth* option on the *toctree* node.
+        If *titles_only* is True, only toplevel document titles will be in the
+        resulting tree.
+        """
+
+        def _walk_depth(node, depth, maxdepth, titleoverrides):
+            """Utility: Cut a TOC at a specified depth."""
+            for subnode in node.children[:]:
+                if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)):
+                    subnode['classes'].append('toctree-l%d' % (depth-1))
+                    _walk_depth(subnode, depth, maxdepth, titleoverrides)
+                elif isinstance(subnode, nodes.bullet_list):
+                    if maxdepth > 0 and depth > maxdepth:
+                        subnode.parent.replace(subnode, [])
+                    else:
+                        _walk_depth(subnode, depth+1, maxdepth, titleoverrides)
+
+        def _entries_from_toctree(toctreenode, separate=False):
+            """Return TOC entries for a toctree node."""
+            includefiles = map(str, toctreenode['includefiles'])
+
+            entries = []
+            for includefile in includefiles:
+                try:
+                    toc = self.tocs[includefile].deepcopy()
+                    if not toc.children:
+                        # empty toc means: no titles will show up in the toctree
+                        self.warn(docname, 'toctree contains reference to document '
+                                  '%r that doesn\'t have a title: no link will be '
+                                  'generated' % includefile)
+                except KeyError:
+                    # this is raised if the included file does not exist
+                    self.warn(docname, 'toctree contains reference to nonexisting '
+                              'document %r' % includefile)
+                else:
+                    # if titles_only is given, only keep the main title and
+                    # sub-toctrees
+                    if titles_only:
+                        # delete everything but the toplevel title(s) and toctrees
+                        for toplevel in toc:
+                            # nodes with length 1 don't have any children anyway
+                            if len(toplevel) > 1:
+                                subtoctrees = toplevel.traverse(addnodes.toctree)
+                                toplevel[1][:] = subtoctrees
+                    # resolve all sub-toctrees
+                    for toctreenode in toc.traverse(addnodes.toctree):
+                        i = toctreenode.parent.index(toctreenode) + 1
+                        for item in _entries_from_toctree(toctreenode):
+                            toctreenode.parent.insert(i, item)
+                            i += 1
+                        toctreenode.parent.remove(toctreenode)
+                    if separate:
+                        entries.append(toc)
+                    else:
+                        entries.extend(toc.children)
+            return entries
+
+        maxdepth = maxdepth or toctree.get('maxdepth', -1)
+        titleoverrides = toctree.get('includetitles', {})
+
+        tocentries = _entries_from_toctree(toctree, separate=True)
+        if not tocentries:
+            return None
+
+        newnode = addnodes.compact_paragraph('', '', *tocentries)
+        newnode['toctree'] = True
+        # prune the tree to maxdepth and replace titles, also set level classes
+        _walk_depth(newnode, 1, prune and maxdepth or 0, titleoverrides)
+        # replace titles, if needed, and set the target paths in the
+        # toctrees (they are not known at TOC generation time)
+        for refnode in newnode.traverse(nodes.reference):
+            refnode['refuri'] = builder.get_relative_uri(
+                docname, refnode['refuri']) + refnode['anchorname']
+            if titleoverrides and not refnode['anchorname'] \
+                   and refnode['refuri'] in titleoverrides:
+                newtitle = titleoverrides[refnode['refuri']]
+                refnode.children = [nodes.Text(newtitle)]
+        return newnode
+
+    descroles = frozenset(('data', 'exc', 'func', 'class', 'const', 'attr', 'obj',
+                           'meth', 'cfunc', 'cmember', 'cdata', 'ctype', 'cmacro'))
+
+    def resolve_references(self, doctree, fromdocname, builder):
+        reftarget_roles = set(('token', 'term', 'citation'))
+        # add all custom xref types too
+        reftarget_roles.update(i[0] for i in additional_xref_types.values())
+
+        for node in doctree.traverse(addnodes.pending_xref):
+            contnode = node[0].deepcopy()
+            newnode = None
+
+            typ = node['reftype']
+            target = node['reftarget']
+
+            try:
+                if typ == 'ref':
+                    if node['refcaption']:
+                        # reference to anonymous label; the reference uses the supplied
+                        # link caption
+                        docname, labelid = self.anonlabels.get(target, ('',''))
+                        sectname = node.astext()
+                        if not docname:
+                            newnode = doctree.reporter.system_message(
+                                2, 'undefined label: %s' % target)
+                    else:
+                        # reference to the named label; the final node will contain the
+                        # section name after the label
+                        docname, labelid, sectname = self.labels.get(target, ('','',''))
+                        if not docname:
+                            newnode = doctree.reporter.system_message(
+                                2, 'undefined label: %s -- if you don\'t ' % target +
+                                'give a link caption the label must precede a section '
+                                'header.')
+                    if docname:
+                        newnode = nodes.reference('', '')
+                        innernode = nodes.emphasis(sectname, sectname)
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            # set more info in contnode in case the get_relative_uri call
+                            # raises NoUri, the builder will then have to resolve these
+                            contnode = addnodes.pending_xref('')
+                            contnode['refdocname'] = docname
+                            contnode['refsectname'] = sectname
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname)
+                            if labelid:
+                                newnode['refuri'] += '#' + labelid
+                        newnode.append(innernode)
+                elif typ == 'keyword':
+                    # keywords are referenced by named labels
+                    docname, labelid, _ = self.labels.get(target, ('','',''))
+                    if not docname:
+                        #self.warn(fromdocname, 'unknown keyword: %s' % target)
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ == 'option':
+                    progname = node['refprogram']
+                    docname, labelid = self.progoptions.get((progname, target), ('', ''))
+                    if not docname:
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ in reftarget_roles:
+                    docname, labelid = self.reftargets.get((typ, target), ('', ''))
+                    if not docname:
+                        if typ == 'term':
+                            self.warn(fromdocname, 'term not in glossary: %s' % target,
+                                      node.line)
+                        elif typ == 'citation':
+                            self.warn(fromdocname, 'citation not found: %s' % target,
+                                      node.line)
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname, typ) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ == 'mod':
+                    docname, synopsis, platform, deprecated = \
+                        self.modules.get(target, ('','','', ''))
+                    if not docname:
+                        newnode = builder.app.emit_firstresult('missing-reference',
+                                                               self, node, contnode)
+                        if not newnode:
+                            newnode = contnode
+                    elif docname == fromdocname:
+                        # don't link to self
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        newnode['refuri'] = builder.get_relative_uri(
+                            fromdocname, docname) + '#module-' + target
+                        newnode['reftitle'] = '%s%s%s' % (
+                            (platform and '(%s) ' % platform),
+                            synopsis, (deprecated and ' (deprecated)' or ''))
+                        newnode.append(contnode)
+                elif typ in self.descroles:
+                    # "descrefs"
+                    modname = node['modname']
+                    clsname = node['classname']
+                    searchorder = node.hasattr('refspecific') and 1 or 0
+                    name, desc = self.find_desc(modname, clsname,
+                                                target, typ, searchorder)
+                    if not desc:
+                        newnode = builder.app.emit_firstresult('missing-reference',
+                                                               self, node, contnode)
+                        if not newnode:
+                            newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if desc[0] == fromdocname:
+                            newnode['refid'] = name
+                        else:
+                            newnode['refuri'] = (
+                                builder.get_relative_uri(fromdocname, desc[0])
+                                + '#' + name)
+                        newnode['reftitle'] = name
+                        newnode.append(contnode)
+                else:
+                    raise RuntimeError('unknown xfileref node encountered: %s' % node)
+            except NoUri:
+                newnode = contnode
+            if newnode:
+                node.replace_self(newnode)
+
+        # allow custom references to be resolved
+        builder.app.emit('doctree-resolved', doctree, fromdocname)
+
+    def create_index(self, builder, _fixre=re.compile(r'(.*) ([(][^()]*[)])')):
+        """Create the real index from the collected index entries."""
+        new = {}
+
+        def add_entry(word, subword, dic=new):
+            entry = dic.get(word)
+            if not entry:
+                dic[word] = entry = [[], {}]
+            if subword:
+                add_entry(subword, '', dic=entry[1])
+            else:
+                try:
+                    entry[0].append(builder.get_relative_uri('genindex', fn)
+                                    + '#' + tid)
+                except NoUri:
+                    pass
+
+        for fn, entries in self.indexentries.iteritems():
+            # new entry types must be listed in directives/other.py!
+            for type, string, tid, alias in entries:
+                if type == 'single':
+                    try:
+                        entry, subentry = string.split(';', 1)
+                    except ValueError:
+                        entry, subentry = string, ''
+                    if not entry:
+                        self.warn(fn, 'invalid index entry %r' % string)
+                        continue
+                    add_entry(entry.strip(), subentry.strip())
+                elif type == 'pair':
+                    try:
+                        first, second = map(lambda x: x.strip(),
+                                            string.split(';', 1))
+                        if not first or not second:
+                            raise ValueError
+                    except ValueError:
+                        self.warn(fn, 'invalid pair index entry %r' % string)
+                        continue
+                    add_entry(first, second)
+                    add_entry(second, first)
+                elif type == 'triple':
+                    try:
+                        first, second, third = map(lambda x: x.strip(),
+                                                   string.split(';', 2))
+                        if not first or not second or not third:
+                            raise ValueError
+                    except ValueError:
+                        self.warn(fn, 'invalid triple index entry %r' % string)
+                        continue
+                    add_entry(first, second+' '+third)
+                    add_entry(second, third+', '+first)
+                    add_entry(third, first+' '+second)
+                else:
+                    self.warn(fn, 'unknown index entry type %r' % type)
+
+        newlist = new.items()
+        newlist.sort(key=lambda t: t[0].lower())
+
+        # fixup entries: transform
+        #   func() (in module foo)
+        #   func() (in module bar)
+        # into
+        #   func()
+        #     (in module foo)
+        #     (in module bar)
+        oldkey = ''
+        oldsubitems = None
+        i = 0
+        while i < len(newlist):
+            key, (targets, subitems) = newlist[i]
+            # cannot move if it hassubitems; structure gets too complex
+            if not subitems:
+                m = _fixre.match(key)
+                if m:
+                    if oldkey == m.group(1):
+                        # prefixes match: add entry as subitem of the previous entry
+                        oldsubitems.setdefault(m.group(2), [[], {}])[0].extend(targets)
+                        del newlist[i]
+                        continue
+                    oldkey = m.group(1)
+                else:
+                    oldkey = key
+            oldsubitems = subitems
+            i += 1
+
+        # group the entries by letter
+        def keyfunc((k, v), ltrs=uppercase+'_'):
+            # hack: mutate the subitems dicts to a list in the keyfunc
+            v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems())
+            # now calculate the key
+            letter = k[0].upper()
+            if letter in ltrs:
+                return letter
+            else:
+                # get all other symbols under one heading
+                return 'Symbols'
+        return [(key, list(group)) for (key, group) in groupby(newlist, keyfunc)]
+
+    def collect_relations(self):
+        relations = {}
+        getinc = self.toctree_includes.get
+        def collect(parents, docname, previous, next):
+            includes = getinc(docname)
+            # previous
+            if not previous:
+                # if no previous sibling, go to parent
+                previous = parents[0][0]
+            else:
+                # else, go to previous sibling, or if it has children, to
+                # the last of its children, or if that has children, to the
+                # last of those, and so forth
+                while 1:
+                    previncs = getinc(previous)
+                    if previncs:
+                        previous = previncs[-1]
+                    else:
+                        break
+            # next
+            if includes:
+                # if it has children, go to first of them
+                next = includes[0]
+            elif next:
+                # else, if next sibling, go to it
+                pass
+            else:
+                # else, go to the next sibling of the parent, if present,
+                # else the grandparent's sibling, if present, and so forth
+                for parname, parindex in parents:
+                    parincs = getinc(parname)
+                    if parincs and parindex + 1 < len(parincs):
+                        next = parincs[parindex+1]
+                        break
+                # else it will stay None
+            # same for children
+            if includes:
+                for subindex, args in enumerate(izip(includes, [None] + includes,
+                                                     includes[1:] + [None])):
+                    collect([(docname, subindex)] + parents, *args)
+            relations[docname] = [parents[0][0], previous, next]
+        collect([(None, 0)], self.config.master_doc, None, None)
+        return relations
+
+    def check_consistency(self):
+        """Do consistency checks."""
+
+        for docname in sorted(self.all_docs):
+            if docname not in self.files_to_rebuild:
+                if docname == self.config.master_doc:
+                    # the master file is not included anywhere ;)
+                    continue
+                self.warn(docname, 'document isn\'t included in any toctree')
+
+    # --------- QUERYING -------------------------------------------------------
+
+    def find_desc(self, modname, classname, name, type, searchorder=0):
+        """Find a description node matching "name", perhaps using
+           the given module and/or classname."""
+        # skip parens
+        if name[-2:] == '()':
+            name = name[:-2]
+
+        if not name:
+            return None, None
+
+        # don't add module and class names for C things
+        if type[0] == 'c' and type not in ('class', 'const'):
+            # skip trailing star and whitespace
+            name = name.rstrip(' *')
+            if name in self.descrefs and self.descrefs[name][1][0] == 'c':
+                return name, self.descrefs[name]
+            return None, None
+
+        newname = None
+        if searchorder == 1:
+            if modname and classname and \
+                   modname + '.' + classname + '.' + name in self.descrefs:
+                newname = modname + '.' + classname + '.' + name
+            elif modname and modname + '.' + name in self.descrefs:
+                newname = modname + '.' + name
+            elif name in self.descrefs:
+                newname = name
+        else:
+            if name in self.descrefs:
+                newname = name
+            elif modname and modname + '.' + name in self.descrefs:
+                newname = modname + '.' + name
+            elif modname and classname and \
+                     modname + '.' + classname + '.' + name in self.descrefs:
+                newname = modname + '.' + classname + '.' + name
+            # special case: builtin exceptions have module "exceptions" set
+            elif type == 'exc' and '.' not in name and \
+                 'exceptions.' + name in self.descrefs:
+                newname = 'exceptions.' + name
+            # special case: object methods
+            elif type in ('func', 'meth') and '.' not in name and \
+                 'object.' + name in self.descrefs:
+                newname = 'object.' + name
+        if newname is None:
+            return None, None
+        return newname, self.descrefs[newname]
+
+    def find_keyword(self, keyword, avoid_fuzzy=False, cutoff=0.6, n=20):
+        """
+        Find keyword matches for a keyword. If there's an exact match, just return
+        it, else return a list of fuzzy matches if avoid_fuzzy isn't True.
+
+        Keywords searched are: first modules, then descrefs.
+
+        Returns: None if nothing found
+                 (type, docname, anchorname) if exact match found
+                 list of (quality, type, docname, anchorname, description) if fuzzy
+        """
+
+        if keyword in self.modules:
+            docname, title, system, deprecated = self.modules[keyword]
+            return 'module', docname, 'module-' + keyword
+        if keyword in self.descrefs:
+            docname, ref_type = self.descrefs[keyword]
+            return ref_type, docname, keyword
+        # special cases
+        if '.' not in keyword:
+            # exceptions are documented in the exceptions module
+            if 'exceptions.'+keyword in self.descrefs:
+                docname, ref_type = self.descrefs['exceptions.'+keyword]
+                return ref_type, docname, 'exceptions.'+keyword
+            # special methods are documented as object methods
+            if 'object.'+keyword in self.descrefs:
+                docname, ref_type = self.descrefs['object.'+keyword]
+                return ref_type, docname, 'object.'+keyword
+
+        if avoid_fuzzy:
+            return
+
+        # find fuzzy matches
+        s = difflib.SequenceMatcher()
+        s.set_seq2(keyword.lower())
+
+        def possibilities():
+            for title, (fn, desc, _, _) in self.modules.iteritems():
+                yield ('module', fn, 'module-'+title, desc)
+            for title, (fn, desctype) in self.descrefs.iteritems():
+                yield (desctype, fn, title, '')
+
+        def dotsearch(string):
+            parts = string.lower().split('.')
+            for idx in xrange(0, len(parts)):
+                yield '.'.join(parts[idx:])
+
+        result = []
+        for type, docname, title, desc in possibilities():
+            best_res = 0
+            for part in dotsearch(title):
+                s.set_seq1(part)
+                if s.real_quick_ratio() >= cutoff and \
+                   s.quick_ratio() >= cutoff and \
+                   s.ratio() >= cutoff and \
+                   s.ratio() > best_res:
+                    best_res = s.ratio()
+            if best_res:
+                result.append((best_res, type, docname, title, desc))
+
+        return heapq.nlargest(n, result)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext
+    ~~~~~~~~~~
+
+    Contains Sphinx features not activated by default.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,655 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.autodoc
+    ~~~~~~~~~~~~~~~~~~
+
+    Automatically insert docstrings for functions, classes or whole modules into
+    the doctree, thus avoiding duplication between docstrings and documentation
+    for those who like elaborate docstrings.
+
+    :copyright: 2008 by Georg Brandl, Pauli Virtanen, Martin Hans.
+    :license: BSD.
+"""
+
+import re
+import sys
+import types
+import inspect
+import linecache
+from types import FunctionType, BuiltinMethodType, MethodType
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.statemachine import ViewList
+
+from sphinx.util import rpartition, nested_parse_with_titles
+from sphinx.directives.desc import py_sig_re
+
+try:
+    base_exception = BaseException
+except NameError:
+    base_exception = Exception
+
+_charset_re = re.compile(r'coding[:=]\s*([-\w.]+)')
+_module_charsets = {}
+
+
+class Options(object):
+    pass
+
+
+def is_static_method(obj):
+    """Check if the object given is a static method."""
+    if isinstance(obj, (FunctionType, classmethod)):
+        return True
+    elif isinstance(obj, BuiltinMethodType):
+        return obj.__self__ is not None
+    elif isinstance(obj, MethodType):
+        return obj.im_self is not None
+    return False
+
+
+class AutodocReporter(object):
+    """
+    A reporter replacement that assigns the correct source name
+    and line number to a system message, as recorded in a ViewList.
+    """
+    def __init__(self, viewlist, reporter):
+        self.viewlist = viewlist
+        self.reporter = reporter
+
+    def __getattr__(self, name):
+        return getattr(self.reporter, name)
+
+    def system_message(self, level, message, *children, **kwargs):
+        if 'line' in kwargs:
+            try:
+                source, line = self.viewlist.items[kwargs['line']]
+            except IndexError:
+                pass
+            else:
+                kwargs['source'] = source
+                kwargs['line'] = line
+        return self.reporter.system_message(level, message,
+                                            *children, **kwargs)
+
+    def debug(self, *args, **kwargs):
+        if self.reporter.debug_flag:
+            return self.system_message(0, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        return self.system_message(1, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        return self.system_message(2, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        return self.system_message(3, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        return self.system_message(4, *args, **kwargs)
+
+
+# Some useful event listener factories for autodoc-process-docstring.
+
+def cut_lines(pre, post=0, what=None):
+    """
+    Return a listener that removes the first *pre* and last *post*
+    lines of every docstring.  If *what* is a sequence of strings,
+    only docstrings of a type in *what* will be processed.
+
+    Use like this (e.g. in the ``setup()`` function of :file:`conf.py`)::
+
+       from sphinx.ext.autodoc import cut_lines
+       app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
+
+    This can (and should) be used in place of :confval:`automodule_skip_lines`.
+    """
+    def process(app, what_, name, obj, options, lines):
+        if what and what_ not in what:
+            return
+        del lines[:pre]
+        if post:
+            # remove one trailing blank line.
+            if lines and not lines[-1]:
+                lines.pop(-1)
+            del lines[-post:]
+        # make sure there is a blank line at the end
+        if lines and lines[-1]:
+            lines.append('')
+    return process
+
+def between(marker, what=None, keepempty=False):
+    """
+    Return a listener that only keeps lines between lines that match the
+    *marker* regular expression.  If no line matches, the resulting docstring
+    would be empty, so no change will be made unless *keepempty* is true.
+
+    If *what* is a sequence of strings, only docstrings of a type in *what* will
+    be processed.
+    """
+    marker_re = re.compile(marker)
+    def process(app, what_, name, obj, options, lines):
+        if what and what_ not in what:
+            return
+        deleted = 0
+        delete = True
+        orig_lines = lines[:]
+        for i, line in enumerate(orig_lines):
+            if delete:
+                lines.pop(i - deleted)
+                deleted += 1
+            if marker_re.match(line):
+                delete = not delete
+                if delete:
+                    lines.pop(i - deleted)
+                    deleted += 1
+        if not lines and not keepempty:
+            lines[:] = orig_lines
+        # make sure there is a blank line at the end
+        if lines and lines[-1]:
+            lines.append('')
+    return process
+
+
+def isdescriptor(x):
+    """Check if the object is some kind of descriptor."""
+    for item in '__get__', '__set__', '__delete__':
+        if callable(getattr(x, item, None)):
+            return True
+    return False
+
+
+def prepare_docstring(s):
+    """
+    Convert a docstring into lines of parseable reST.  Return it as a list of
+    lines usable for inserting into a docutils ViewList (used as argument
+    of nested_parse().)  An empty line is added to act as a separator between
+    this docstring and following content.
+    """
+    lines = s.expandtabs().splitlines()
+    # Find minimum indentation of any non-blank lines after first line.
+    margin = sys.maxint
+    for line in lines[1:]:
+        content = len(line.lstrip())
+        if content:
+            indent = len(line) - content
+            margin = min(margin, indent)
+    # Remove indentation.
+    if lines:
+        lines[0] = lines[0].lstrip()
+    if margin < sys.maxint:
+        for i in range(1, len(lines)): lines[i] = lines[i][margin:]
+    # Remove any leading blank lines.
+    while lines and not lines[0]:
+        lines.pop(0)
+    # make sure there is an empty line at the end
+    if lines and lines[-1]:
+        lines.append('')
+    return lines
+
+
+def get_module_charset(module):
+    """Return the charset of the given module (cached in _module_charsets)."""
+    if module in _module_charsets:
+        return _module_charsets[module]
+    try:
+        filename = __import__(module, None, None, ['foo']).__file__
+    except (ImportError, AttributeError):
+        return None
+    if filename[-4:].lower() in ('.pyc', '.pyo'):
+        filename = filename[:-1]
+    for line in [linecache.getline(filename, x) for x in (1, 2)]:
+        match = _charset_re.search(line)
+        if match is not None:
+            charset = match.group(1)
+            break
+    else:
+        charset = 'ascii'
+    _module_charsets[module] = charset
+    return charset
+
+
+class RstGenerator(object):
+    def __init__(self, options, document, lineno):
+        self.options = options
+        self.env = document.settings.env
+        self.reporter = document.reporter
+        self.lineno = lineno
+        self.filename_set = set()
+        self.warnings = []
+        self.result = ViewList()
+
+    def warn(self, msg):
+        self.warnings.append(self.reporter.warning(msg, line=self.lineno))
+
+    def get_doc(self, what, name, obj):
+        """Format and yield lines of the docstring(s) for the object."""
+        docstrings = []
+        if getattr(obj, '__doc__', None):
+            docstrings.append(obj.__doc__)
+        # skip some lines in module docstrings if configured
+        if what == 'module' and self.env.config.automodule_skip_lines and docstrings:
+            docstrings[0] = '\n'.join(docstrings[0].splitlines()
+                                      [self.env.config.automodule_skip_lines:])
+        # for classes, what the "docstring" is can be controlled via an option
+        if what in ('class', 'exception'):
+            content = self.env.config.autoclass_content
+            if content in ('both', 'init'):
+                initdocstring = getattr(obj, '__init__', None).__doc__
+                # for new-style classes, no __init__ means default __init__
+                if initdocstring == object.__init__.__doc__:
+                    initdocstring = None
+                if initdocstring:
+                    if content == 'init':
+                        docstrings = [initdocstring]
+                    else:
+                        docstrings.append(initdocstring)
+            # the default is only the class docstring
+
+        # decode the docstrings using the module's source encoding
+        charset = None
+        module = getattr(obj, '__module__', None)
+        if module is not None:
+            charset = get_module_charset(module)
+
+        for docstring in docstrings:
+            if isinstance(docstring, str):
+                if charset:
+                    docstring = docstring.decode(charset)
+                else:
+                    try:
+                        # try decoding with utf-8, should only work for real UTF-8
+                        docstring = docstring.decode('utf-8')
+                    except UnicodeError:
+                        # last resort -- can't fail
+                        docstring = docstring.decode('latin1')
+            docstringlines = prepare_docstring(docstring)
+            if self.env.app:
+                # let extensions preprocess docstrings
+                self.env.app.emit('autodoc-process-docstring',
+                                  what, name, obj, self.options, docstringlines)
+            for line in docstringlines:
+                yield line
+
+    def resolve_name(self, what, name):
+        """
+        Determine what module to import and what attribute to document.
+
+        Returns a tuple of: the full name, the module name, a path of
+        names to get via getattr, the signature and return annotation.
+        """
+        # first, parse the definition -- auto directives for classes and functions
+        # can contain a signature which is then used instead of an autogenerated one
+        try:
+            path, base, args, retann = py_sig_re.match(name).groups()
+        except:
+            self.warn('invalid signature for auto%s (%r)' % (what, name))
+            return
+        # fullname is the fully qualified name, base the name after the last dot
+        fullname = (path or '') + base
+
+        if what == 'module':
+            if args or retann:
+                self.warn('ignoring signature arguments and return annotation '
+                          'for automodule %s' % fullname)
+            return fullname, fullname, [], None, None
+
+        elif what in ('class', 'exception', 'function'):
+            if path:
+                mod = path.rstrip('.')
+            else:
+                mod = None
+                # if documenting a toplevel object without explicit module, it can
+                # be contained in another auto directive ...
+                if hasattr(self.env, 'autodoc_current_module'):
+                    mod = self.env.autodoc_current_module
+                # ... or in the scope of a module directive
+                if not mod:
+                    mod = self.env.currmodule
+            return fullname, mod, [base], args, retann
+
+        else:
+            if path:
+                mod_cls = path.rstrip('.')
+            else:
+                mod_cls = None
+                # if documenting a class-level object without path, there must be a
+                # current class, either from a parent auto directive ...
+                if hasattr(self.env, 'autodoc_current_class'):
+                    mod_cls = self.env.autodoc_current_class
+                # ... or from a class directive
+                if mod_cls is None:
+                    mod_cls = self.env.currclass
+                # ... if still None, there's no way to know
+                if mod_cls is None:
+                    return fullname, None, [], args, retann
+            mod, cls = rpartition(mod_cls, '.')
+            # if the module name is still missing, get it like above
+            if not mod and hasattr(self.env, 'autodoc_current_module'):
+                mod = self.env.autodoc_current_module
+            if not mod:
+                mod = self.env.currmodule
+            return fullname, mod, [cls, base], args, retann
+
+    def format_signature(self, what, name, obj, args, retann):
+        """
+        Return the signature of the object, formatted for display.
+        """
+        if what not in ('class', 'method', 'function'):
+            return ''
+
+        err = None
+        if args is not None:
+            # signature given explicitly
+            args = "(%s)" % args
+        else:
+            # try to introspect the signature
+            try:
+                args = None
+                getargs = True
+                if what == 'class':
+                    # for classes, the relevant signature is the __init__ method's
+                    obj = getattr(obj, '__init__', None)
+                    # classes without __init__ method, default __init__ or
+                    # __init__ written in C?
+                    if obj is None or obj is object.__init__ or not \
+                       (inspect.ismethod(obj) or inspect.isfunction(obj)):
+                        getargs = False
+                elif inspect.isbuiltin(obj) or inspect.ismethoddescriptor(obj):
+                    # can never get arguments of a C function or method
+                    getargs = False
+                if getargs:
+                    argspec = inspect.getargspec(obj)
+                    if what in ('class', 'method') and argspec[0] and \
+                           argspec[0][0] in ('cls', 'self'):
+                        del argspec[0][0]
+                    args = inspect.formatargspec(*argspec)
+            except Exception, e:
+                args = None
+                err = e
+
+        result = self.env.app.emit_firstresult('autodoc-process-signature', what,
+                                               name, obj, self.options, args, retann)
+        if result:
+            args, retann = result
+
+        if args is not None:
+            return '%s%s' % (args, retann or '')
+        elif err:
+            # re-raise the error for perusal of the handler in generate()
+            raise RuntimeError(err)
+        else:
+            return ''
+
+    def generate(self, what, name, members, add_content, indent=u'', check_module=False):
+        """
+        Generate reST for the object in self.result.
+        """
+        fullname, mod, objpath, args, retann = self.resolve_name(what, name)
+        if not mod:
+            # need a module to import
+            self.warn('don\'t know which module to import for autodocumenting %r '
+                      '(try placing a "module" or "currentmodule" directive in the '
+                      'document, or giving an explicit module name)' % fullname)
+            return
+
+        # the name to put into the generated directive -- doesn't contain the module
+        name_in_directive = '.'.join(objpath) or mod
+
+        # now, import the module and get object to document
+        try:
+            todoc = module = __import__(mod, None, None, ['foo'])
+            if hasattr(module, '__file__') and module.__file__:
+                modfile = module.__file__
+                if modfile[-4:].lower() in ('.pyc', '.pyo'):
+                    modfile = modfile[:-1]
+                self.filename_set.add(modfile)
+            else:
+                modfile = None  # e.g. for builtin and C modules
+            for part in objpath:
+                todoc = getattr(todoc, part)
+        except (ImportError, AttributeError), err:
+            self.warn('autodoc can\'t import/find %s %r, it reported error: "%s", '
+                      'please check your spelling and sys.path' %
+                      (what, str(fullname), err))
+            return
+
+        # check __module__ of object if wanted (for members not given explicitly)
+        if check_module:
+            if hasattr(todoc, '__module__'):
+                if todoc.__module__ != mod:
+                    return
+
+        # format the object's signature, if any
+        try:
+            sig = self.format_signature(what, name, todoc, args, retann)
+        except Exception, err:
+            self.warn('error while formatting signature for %s: %s' %
+                      (fullname, err))
+            sig = ''
+
+        # make sure that the result starts with an empty line.  This is
+        # necessary for some situations where another directive preprocesses
+        # reST and no starting newline is present
+        self.result.append(u'', '')
+
+        # now, create the directive header
+        directive = (what == 'method' and is_static_method(todoc)) \
+                    and 'staticmethod' or what
+        self.result.append(indent + u'.. %s:: %s%s' %
+                           (directive, name_in_directive, sig), '<autodoc>')
+        if what == 'module':
+            # Add some module-specific options
+            if self.options.synopsis:
+                self.result.append(indent + u'   :synopsis: ' + self.options.synopsis,
+                              '<autodoc>')
+            if self.options.platform:
+                self.result.append(indent + u'   :platform: ' + self.options.platform,
+                              '<autodoc>')
+            if self.options.deprecated:
+                self.result.append(indent + u'   :deprecated:', '<autodoc>')
+        else:
+            # Be explicit about the module, this is necessary since .. class:: doesn't
+            # support a prepended module name
+            self.result.append(indent + u'   :module: %s' % mod, '<autodoc>')
+        if self.options.noindex:
+            self.result.append(indent + u'   :noindex:', '<autodoc>')
+        self.result.append(u'', '<autodoc>')
+
+        if self.options.show_inheritance and what in ('class', 'exception'):
+            if len(todoc.__bases__):
+                bases = [b.__module__ == '__builtin__' and
+                         u':class:`%s`' % b.__name__ or
+                         u':class:`%s.%s`' % (b.__module__, b.__name__)
+                         for b in todoc.__bases__]
+                self.result.append(indent + u'   Bases: %s' % ', '.join(bases),
+                                   '<autodoc>')
+                self.result.append(u'', '<autodoc>')
+
+        # the module directive doesn't have content
+        if what != 'module':
+            indent += u'   '
+
+        if modfile:
+            sourcename = '%s:docstring of %s' % (modfile, fullname)
+        else:
+            sourcename = 'docstring of %s' % fullname
+
+        # add content from docstrings
+        for i, line in enumerate(self.get_doc(what, fullname, todoc)):
+            self.result.append(indent + line, sourcename, i)
+
+        # add source content, if present
+        if add_content:
+            for line, src in zip(add_content.data, add_content.items):
+                self.result.append(indent + line, src[0], src[1])
+
+        # document members?
+        if not members or what in ('function', 'method', 'attribute'):
+            return
+
+        # set current namespace for finding members
+        self.env.autodoc_current_module = mod
+        if objpath:
+            self.env.autodoc_current_class = objpath[0]
+
+        # add members, if possible
+        _all = members == ['__all__']
+        members_check_module = False
+        if _all:
+            # unqualified :members: given
+            if what == 'module':
+                if hasattr(todoc, '__all__'):
+                    members_check_module = False
+                    all_members = []
+                    for mname in todoc.__all__:
+                        try:
+                            all_members.append((mname, getattr(todoc, mname)))
+                        except AttributeError:
+                            self.warn('missing attribute mentioned in __all__: '
+                                      'module %s, attribute %s' %
+                                      (todoc.__name__, mname))
+                else:
+                    # for implicit module members, check __module__ to avoid
+                    # documenting imported objects
+                    members_check_module = True
+                    all_members = inspect.getmembers(todoc)
+            else:
+                if self.options.inherited_members:
+                    # getmembers() uses dir() which pulls in members from all
+                    # base classes
+                    all_members = inspect.getmembers(todoc)
+                else:
+                    # __dict__ contains only the members directly defined in the class
+                    all_members = sorted(todoc.__dict__.iteritems())
+        else:
+            all_members = [(mname, getattr(todoc, mname)) for mname in members]
+        for (membername, member) in all_members:
+            # ignore members whose name starts with _ by default
+            if _all and membername.startswith('_'):
+                continue
+
+            # ignore undocumented members if :undoc-members: is not given
+            doc = getattr(member, '__doc__', None)
+            skip = not self.options.undoc_members and not doc
+            # give the user a chance to decide whether this member should be skipped
+            if self.env.app:
+                # let extensions preprocess docstrings
+                skip_user = self.env.app.emit_firstresult(
+                    'autodoc-skip-member', what, membername, member, skip, self.options)
+                if skip_user is not None:
+                    skip = skip_user
+            if skip:
+                continue
+
+            if what == 'module':
+                if isinstance(member, (types.FunctionType,
+                                       types.BuiltinFunctionType)):
+                    memberwhat = 'function'
+                elif isinstance(member, types.ClassType) or \
+                     isinstance(member, type):
+                    if issubclass(member, base_exception):
+                        memberwhat = 'exception'
+                    else:
+                        memberwhat = 'class'
+                else:
+                    # XXX: todo -- attribute docs
+                    continue
+            else:
+                if callable(member):
+                    memberwhat = 'method'
+                elif isdescriptor(member):
+                    memberwhat = 'attribute'
+                else:
+                    # XXX: todo -- attribute docs
+                    continue
+            full_membername = fullname + '.' + membername
+            self.generate(memberwhat, full_membername, ['__all__'], None, indent,
+                          check_module=members_check_module)
+
+        self.env.autodoc_current_module = None
+        self.env.autodoc_current_class = None
+
+
+def _auto_directive(dirname, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    what = dirname[4:]  # strip "auto"
+    name = arguments[0]
+    genopt = Options()
+    members = options.get('members', [])
+    genopt.inherited_members = 'inherited-members' in options
+    if genopt.inherited_members and not members:
+        # :inherited-members: implies :members:
+        members = ['__all__']
+    genopt.undoc_members = 'undoc-members' in options
+    genopt.show_inheritance = 'show-inheritance' in options
+    genopt.noindex = 'noindex' in options
+    genopt.synopsis = options.get('synopsis', '')
+    genopt.platform = options.get('platform', '')
+    genopt.deprecated = 'deprecated' in options
+
+    generator = RstGenerator(genopt, state.document, lineno)
+    generator.generate(what, name, members, content)
+    if not generator.result:
+        return generator.warnings
+
+    # record all filenames as dependencies -- this will at least partially make
+    # automatic invalidation possible
+    for fn in generator.filename_set:
+        state.document.settings.env.note_dependency(fn)
+
+    # use a custom reporter that correctly assigns lines to source and lineno
+    old_reporter = state.memo.reporter
+    state.memo.reporter = AutodocReporter(generator.result, state.memo.reporter)
+    if dirname == 'automodule':
+        node = nodes.section()
+        nested_parse_with_titles(state, generator.result, node)
+    else:
+        node = nodes.paragraph()
+        state.nested_parse(generator.result, 0, node)
+    state.memo.reporter = old_reporter
+    return generator.warnings + node.children
+
+def auto_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+def automodule_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+def autoclass_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+
+def members_option(arg):
+    if arg is None:
+        return ['__all__']
+    return [x.strip() for x in arg.split(',')]
+
+
+def setup(app):
+    mod_options = {'members': members_option, 'undoc-members': directives.flag,
+                   'noindex': directives.flag, 'inherited-members': directives.flag,
+                   'show-inheritance': directives.flag, 'synopsis': lambda x: x,
+                   'platform': lambda x: x, 'deprecated': directives.flag}
+    cls_options = {'members': members_option, 'undoc-members': directives.flag,
+                   'noindex': directives.flag, 'inherited-members': directives.flag,
+                   'show-inheritance': directives.flag}
+    app.add_directive('automodule', automodule_directive,
+                      1, (1, 0, 1), **mod_options)
+    app.add_directive('autoclass', autoclass_directive,
+                      1, (1, 0, 1), **cls_options)
+    app.add_directive('autoexception', autoclass_directive,
+                      1, (1, 0, 1), **cls_options)
+    app.add_directive('autofunction', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    app.add_directive('automethod', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    app.add_directive('autoattribute', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    # deprecated: remove in some future version.
+    app.add_config_value('automodule_skip_lines', 0, True)
+    app.add_config_value('autoclass_content', 'class', True)
+    app.add_event('autodoc-process-docstring')
+    app.add_event('autodoc-process-signature')
+    app.add_event('autodoc-skip-member')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.coverage
+    ~~~~~~~~~~~~~~~~~~~
+
+    Check Python modules and C API for coverage.  Mostly written by Josip
+    Dzolonga for the Google Highly Open Participation contest.
+
+    :copyright: 2008 by Josip Dzolonga, Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import glob
+import inspect
+import cPickle as pickle
+from os import path
+
+from sphinx.builder import Builder
+
+
+# utility
+def write_header(f, text, char='-'):
+    f.write(text + '\n')
+    f.write(char * len(text) + '\n')
+
+def compile_regex_list(name, exps, warnfunc):
+    lst = []
+    for exp in exps:
+        try:
+            lst.append(re.compile(exp))
+        except Exception:
+            warnfunc('invalid regex %r in %s' % (exp, name))
+    return lst
+
+
+class CoverageBuilder(Builder):
+
+    name = 'coverage'
+
+    def init(self):
+        self.c_sourcefiles = []
+        for pattern in self.config.coverage_c_path:
+            pattern = path.join(self.srcdir, pattern)
+            self.c_sourcefiles.extend(glob.glob(pattern))
+
+        self.c_regexes = []
+        for (name, exp) in self.config.coverage_c_regexes.items():
+            try:
+                self.c_regexes.append((name, re.compile(exp)))
+            except Exception:
+                self.warn('invalid regex %r in coverage_c_regexes' % exp)
+
+        self.c_ignorexps = {}
+        for (name, exps) in self.config.coverage_ignore_c_items.iteritems():
+            self.c_ignorexps[name] = compile_regex_list('coverage_ignore_c_items',
+                                                        exps, self.warn)
+        self.mod_ignorexps = compile_regex_list('coverage_ignore_modules',
+                                                self.config.coverage_ignore_modules,
+                                                self.warn)
+        self.cls_ignorexps = compile_regex_list('coverage_ignore_classes',
+                                                self.config.coverage_ignore_classes,
+                                                self.warn)
+        self.fun_ignorexps = compile_regex_list('coverage_ignore_functions',
+                                                self.config.coverage_ignore_functions,
+                                                self.warn)
+
+    def get_outdated_docs(self):
+        return 'coverage overview'
+
+    def write(self, *ignored):
+        self.py_undoc = {}
+        self.build_py_coverage()
+        self.write_py_coverage()
+
+        self.c_undoc = {}
+        self.build_c_coverage()
+        self.write_c_coverage()
+
+    def build_c_coverage(self):
+        # Fetch all the info from the header files
+        for filename in self.c_sourcefiles:
+            undoc = []
+            f = open(filename, 'r')
+            try:
+                for line in f:
+                    for key, regex in self.c_regexes:
+                        match = regex.match(line)
+                        if match:
+                            name = match.groups()[0]
+                            if name not in self.env.descrefs:
+                                for exp in self.c_ignorexps.get(key, ()):
+                                    if exp.match(name):
+                                        break
+                                else:
+                                    undoc.append((key, name))
+                            continue
+            finally:
+                f.close()
+            if undoc:
+                self.c_undoc[filename] = undoc
+
+    def write_c_coverage(self):
+        output_file = path.join(self.outdir, 'c.txt')
+        op = open(output_file, 'w')
+        try:
+            write_header(op, 'Undocumented C API elements', '=')
+            op.write('\n')
+
+            for filename, undoc in self.c_undoc.iteritems():
+                write_header(op, filename)
+                for typ, name in undoc:
+                    op.write(' * %-50s [%9s]\n' % (name, typ))
+                op.write('\n')
+        finally:
+            op.close()
+
+    def build_py_coverage(self):
+        for mod_name in self.env.modules:
+            ignore = False
+            for exp in self.mod_ignorexps:
+                if exp.match(mod_name):
+                    ignore = True
+                    break
+            if ignore:
+                continue
+
+            try:
+                mod = __import__(mod_name, fromlist=['foo'])
+            except ImportError, err:
+                self.warn('module %s could not be imported: %s' % (mod_name, err))
+                self.py_undoc[mod_name] = {'error': err}
+                continue
+
+            funcs = []
+            classes = {}
+
+            for name, obj in inspect.getmembers(mod):
+                # diverse module attributes are ignored:
+                if name[0] == '_':
+                    # begins in an underscore
+                    continue
+                if not hasattr(obj, '__module__'):
+                    # cannot be attributed to a module
+                    continue
+                if obj.__module__ != mod_name:
+                    # is not defined in this module
+                    continue
+
+                full_name = '%s.%s' % (mod_name, name)
+
+                if inspect.isfunction(obj):
+                    if full_name not in self.env.descrefs:
+                        for exp in self.fun_ignorexps:
+                            if exp.match(name):
+                                break
+                        else:
+                            funcs.append(name)
+                elif inspect.isclass(obj):
+                    for exp in self.cls_ignorexps:
+                        if exp.match(name):
+                            break
+                    else:
+                        if full_name not in self.env.descrefs:
+                            # not documented at all
+                            classes[name] = []
+                            continue
+
+                        attrs = []
+
+                        for attr_name, attr in inspect.getmembers(obj, inspect.ismethod):
+                            if attr_name[0] == '_':
+                                # starts with an underscore, ignore it
+                                continue
+
+                            full_attr_name = '%s.%s' % (full_name, attr_name)
+                            if full_attr_name not in self.env.descrefs:
+                                attrs.append(attr_name)
+
+                        if attrs:
+                            # some attributes are undocumented
+                            classes[name] = attrs
+
+            self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes}
+
+    def write_py_coverage(self):
+        output_file = path.join(self.outdir, 'python.txt')
+        op = open(output_file, 'w')
+        failed = []
+        try:
+            write_header(op, 'Undocumented Python objects', '=')
+
+            keys = self.py_undoc.keys()
+            keys.sort()
+            for name in keys:
+                undoc = self.py_undoc[name]
+                if 'error' in undoc:
+                    failed.append((name, undoc['error']))
+                else:
+                    if not undoc['classes'] and not undoc['funcs']:
+                        continue
+
+                    write_header(op, name)
+                    if undoc['funcs']:
+                        op.write('Functions:\n')
+                        op.writelines(' * %s\n' % x for x in undoc['funcs'])
+                        op.write('\n')
+                    if undoc['classes']:
+                        op.write('Classes:\n')
+                        for name, methods in undoc['classes'].iteritems():
+                            if not methods:
+                                op.write(' * %s\n' % name)
+                            else:
+                                op.write(' * %s -- missing methods:\n' % name)
+                                op.writelines('   - %s\n' % x for x in methods)
+                        op.write('\n')
+
+            if failed:
+                write_header(op, 'Modules that failed to import')
+                op.writelines(' * %s -- %s\n' % x for x in failed)
+        finally:
+            op.close()
+
+    def finish(self):
+        # dump the coverage data to a pickle file too
+        picklepath = path.join(self.outdir, 'undoc.pickle')
+        dumpfile = open(picklepath, 'wb')
+        try:
+            pickle.dump((self.py_undoc, self.c_undoc), dumpfile)
+        finally:
+            dumpfile.close()
+
+
+def setup(app):
+    app.add_builder(CoverageBuilder)
+    app.add_config_value('coverage_ignore_modules', [], False)
+    app.add_config_value('coverage_ignore_functions', [], False)
+    app.add_config_value('coverage_ignore_classes', [], False)
+    app.add_config_value('coverage_c_path', [], False)
+    app.add_config_value('coverage_c_regexes', {}, False)
+    app.add_config_value('coverage_ignore_c_items', {}, False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,337 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.doctest
+    ~~~~~~~~~~~~~~~~~~
+
+    Mimic doctest by automatically executing code snippets and checking
+    their results.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import sys
+import time
+import codecs
+import StringIO
+from os import path
+# circumvent relative import
+doctest = __import__('doctest')
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx.builder import Builder
+from sphinx.util.console import bold
+
+blankline_re = re.compile(r'^\s*<BLANKLINE>', re.MULTILINE)
+doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE)
+
+# set up the necessary directives
+
+def test_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    # use ordinary docutils nodes for test code: they get special attributes
+    # so that our builder recognizes them, and the other builders are happy.
+    code = '\n'.join(content)
+    test = None
+    if name == 'doctest':
+        if '<BLANKLINE>' in code:
+            # convert <BLANKLINE>s to ordinary blank lines for presentation
+            test = code
+            code = blankline_re.sub('', code)
+        if doctestopt_re.search(code):
+            if not test:
+                test = code
+            code = doctestopt_re.sub('', code)
+    nodetype = nodes.literal_block
+    if name == 'testsetup' or 'hide' in options:
+        nodetype = nodes.comment
+    if arguments:
+        groups = [x.strip() for x in arguments[0].split(',')]
+    else:
+        groups = ['default']
+    node = nodetype(code, code, testnodetype=name, groups=groups)
+    node.line = lineno
+    if test is not None:
+        # only save if it differs from code
+        node['test'] = test
+    if name == 'testoutput':
+        # don't try to highlight output
+        node['language'] = 'none'
+    node['options'] = {}
+    if name in ('doctest', 'testoutput') and 'options' in options:
+        # parse doctest-like output comparison flags
+        option_strings = options['options'].replace(',', ' ').split()
+        for option in option_strings:
+            if (option[0] not in '+-' or option[1:] not in
+                doctest.OPTIONFLAGS_BY_NAME):
+                # XXX warn?
+                continue
+            flag = doctest.OPTIONFLAGS_BY_NAME[option[1:]]
+            node['options'][flag] = (option[0] == '+')
+    return [node]
+
+# need to have individual functions for each directive due to different
+# options they accept
+
+def testsetup_directive(*args):
+    return test_directive(*args)
+
+def doctest_directive(*args):
+    return test_directive(*args)
+
+def testcode_directive(*args):
+    return test_directive(*args)
+
+def testoutput_directive(*args):
+    return test_directive(*args)
+
+
+parser = doctest.DocTestParser()
+
+# helper classes
+
+class TestGroup(object):
+    def __init__(self, name):
+        self.name = name
+        self.setup = []
+        self.tests = []
+
+    def add_code(self, code):
+        if code.type == 'testsetup':
+            self.setup.append(code)
+        elif code.type == 'doctest':
+            self.tests.append([code])
+        elif code.type == 'testcode':
+            self.tests.append([code, None])
+        elif code.type == 'testoutput':
+            if self.tests and len(self.tests[-1]) == 2:
+                self.tests[-1][1] = code
+        else:
+            raise RuntimeError('invalid TestCode type')
+
+    def __repr__(self):
+        return 'TestGroup(name=%r, setup=%r, tests=%r)' % (
+            self.name, self.setup, self.tests)
+
+
+class TestCode(object):
+    def __init__(self, code, type, lineno, options=None):
+        self.code = code
+        self.type = type
+        self.lineno = lineno
+        self.options = options or {}
+
+    def __repr__(self):
+        return 'TestCode(%r, %r, %r, options=%r)' % (
+            self.code, self.type, self.lineno, self.options)
+
+
+class SphinxDocTestRunner(doctest.DocTestRunner):
+    def summarize(self, out, verbose=None):
+        io = StringIO.StringIO()
+        old_stdout = sys.stdout
+        sys.stdout = io
+        try:
+            res = doctest.DocTestRunner.summarize(self, verbose)
+        finally:
+            sys.stdout = old_stdout
+        out(io.getvalue())
+        return res
+
+# the new builder -- use sphinx-build.py -b doctest to run
+
+class DocTestBuilder(Builder):
+    """
+    Runs test snippets in the documentation.
+    """
+    name = 'doctest'
+
+    def init(self):
+        # default options
+        self.opt = doctest.DONT_ACCEPT_TRUE_FOR_1 | doctest.ELLIPSIS | \
+                   doctest.IGNORE_EXCEPTION_DETAIL
+
+        # HACK HACK HACK
+        # doctest compiles its snippets with type 'single'. That is nice
+        # for doctest examples but unusable for multi-statement code such
+        # as setup code -- to be able to use doctest error reporting with
+        # that code nevertheless, we monkey-patch the "compile" it uses.
+        doctest.compile = self.compile
+
+        self.type = 'single'
+
+        self.total_failures = 0
+        self.total_tries = 0
+        self.setup_failures = 0
+        self.setup_tries = 0
+
+        date = time.strftime('%Y-%m-%d %H:%M:%S')
+
+        self.outfile = codecs.open(path.join(self.outdir, 'output.txt'),
+                                   'w', encoding='utf-8')
+        self.outfile.write('''\
+Results of doctest builder run on %s
+==================================%s
+''' % (date, '='*len(date)))
+
+    def _out(self, text):
+        self.info(text, nonl=True)
+        self.outfile.write(text)
+
+    def _warn_out(self, text):
+        self.info(text, nonl=True)
+        if self.app.quiet:
+            self.warn(text)
+        self.outfile.write(text)
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def get_outdated_docs(self):
+        return self.env.found_docs
+
+    def finish(self):
+        # write executive summary
+        def s(v):
+            return v != 1 and 's' or ''
+        self._out('''
+Doctest summary
+===============
+%5d test%s
+%5d failure%s in tests
+%5d failure%s in setup code
+''' % (self.total_tries, s(self.total_tries),
+       self.total_failures, s(self.total_failures),
+       self.setup_failures, s(self.setup_failures)))
+        self.outfile.close()
+
+        if self.total_failures or self.setup_failures:
+            self.app.statuscode = 1
+
+        sys.path[0:0] = self.config.doctest_path
+
+    def write(self, build_docnames, updated_docnames, method='update'):
+        if build_docnames is None:
+            build_docnames = sorted(self.env.all_docs)
+
+        self.info(bold('running tests...'))
+        for docname in build_docnames:
+            # no need to resolve the doctree
+            doctree = self.env.get_doctree(docname)
+            self.test_doc(docname, doctree)
+
+    def test_doc(self, docname, doctree):
+        groups = {}
+        add_to_all_groups = []
+        self.setup_runner = SphinxDocTestRunner(verbose=False,
+                                                optionflags=self.opt)
+        self.test_runner = SphinxDocTestRunner(verbose=False,
+                                               optionflags=self.opt)
+        if self.config.doctest_test_doctest_blocks:
+            def condition(node):
+                return (isinstance(node, (nodes.literal_block, nodes.comment))
+                        and node.has_key('testnodetype')) or \
+                       isinstance(node, nodes.doctest_block)
+        else:
+            def condition(node):
+                return isinstance(node, (nodes.literal_block, nodes.comment)) \
+                        and node.has_key('testnodetype')
+        for node in doctree.traverse(condition):
+            source = node.has_key('test') and node['test'] or node.astext()
+            if not source:
+                self.warn('no code/output in %s block at %s:%s' %
+                          (node.get('testnodetype', 'doctest'),
+                           self.env.doc2path(docname), node.line))
+            code = TestCode(source, type=node.get('testnodetype', 'doctest'),
+                            lineno=node.line, options=node.get('options'))
+            node_groups = node.get('groups', ['default'])
+            if '*' in node_groups:
+                add_to_all_groups.append(code)
+                continue
+            for groupname in node_groups:
+                if groupname not in groups:
+                    groups[groupname] = TestGroup(groupname)
+                groups[groupname].add_code(code)
+        for code in add_to_all_groups:
+            for group in groups.itervalues():
+                group.add_code(code)
+        if not groups:
+            return
+
+        self._out('\nDocument: %s\n----------%s\n' % (docname, '-'*len(docname)))
+        for group in groups.itervalues():
+            self.test_group(group, self.env.doc2path(docname, base=None))
+        # Separately count results from setup code
+        res_f, res_t = self.setup_runner.summarize(self._out, verbose=False)
+        self.setup_failures += res_f
+        self.setup_tries += res_t
+        if self.test_runner.tries:
+            res_f, res_t = self.test_runner.summarize(self._out, verbose=True)
+            self.total_failures += res_f
+            self.total_tries += res_t
+
+    def compile(self, code, name, type, flags, dont_inherit):
+        return compile(code, name, self.type, flags, dont_inherit)
+
+    def test_group(self, group, filename):
+        ns = {}
+        examples = []
+        for setup in group.setup:
+            examples.append(doctest.Example(setup.code, '', lineno=setup.lineno))
+        if examples:
+            # simulate a doctest with the setup code
+            setup_doctest = doctest.DocTest(examples, {},
+                                            '%s (setup code)' % group.name,
+                                            filename, 0, None)
+            setup_doctest.globs = ns
+            old_f = self.setup_runner.failures
+            self.type = 'exec' # the snippet may contain multiple statements
+            self.setup_runner.run(setup_doctest, out=self._warn_out,
+                                  clear_globs=False)
+            if self.setup_runner.failures > old_f:
+                # don't run the group
+                return
+        for code in group.tests:
+            if len(code) == 1:
+                test = parser.get_doctest(code[0].code, {},
+                                          group.name, filename, code[0].lineno)
+                if not test.examples:
+                    continue
+                for example in test.examples:
+                    # apply directive's comparison options
+                    new_opt = code[0].options.copy()
+                    new_opt.update(example.options)
+                    example.options = new_opt
+                self.type = 'single' # ordinary doctests
+            else:
+                output = code[1] and code[1].code or ''
+                options = code[1] and code[1].options or {}
+                # disable <BLANKLINE> processing as it is not needed
+                options[doctest.DONT_ACCEPT_BLANKLINE] = True
+                example = doctest.Example(code[0].code, output,
+                                          lineno=code[0].lineno,
+                                          options=options)
+                test = doctest.DocTest([example], {}, group.name,
+                                       filename, code[0].lineno, None)
+                self.type = 'exec' # multiple statements again
+            # DocTest.__init__ copies the globs namespace, which we don't want
+            test.globs = ns
+            # also don't clear the globs namespace after running the doctest
+            self.test_runner.run(test, out=self._warn_out, clear_globs=False)
+
+
+def setup(app):
+    app.add_directive('testsetup', testsetup_directive, 1, (0, 1, 1))
+    app.add_directive('doctest', doctest_directive, 1, (0, 1, 1),
+                      hide=directives.flag, options=directives.unchanged)
+    app.add_directive('testcode', testcode_directive, 1, (0, 1, 1),
+                      hide=directives.flag)
+    app.add_directive('testoutput', testoutput_directive, 1, (0, 1, 1),
+                      hide=directives.flag, options=directives.unchanged)
+    app.add_builder(DocTestBuilder)
+    # this config value adds to sys.path
+    app.add_config_value('doctest_path', [], False)
+    app.add_config_value('doctest_test_doctest_blocks', 'default', False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.ifconfig
+    ~~~~~~~~~~~~~~~~~~~
+
+    Provides the ``ifconfig`` directive that allows to write documentation
+    that is included depending on configuration variables.
+
+    Usage::
+
+        .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
+
+           This stuff is only included in the built docs for unstable versions.
+
+    The argument for ``ifconfig`` is a plain Python expression, evaluated in the
+    namespace of the project configuration (that is, all variables from ``conf.py``
+    are available.)
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+
+class ifconfig(nodes.Element): pass
+
+
+def ifconfig_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    node = ifconfig()
+    node.line = lineno
+    node['expr'] = arguments[0]
+    state.nested_parse(content, content_offset, node)
+    return [node]
+
+
+def process_ifconfig_nodes(app, doctree, docname):
+    ns = app.config.__dict__.copy()
+    ns['builder'] = app.builder.name
+    for node in doctree.traverse(ifconfig):
+        try:
+            res = eval(node['expr'], ns)
+        except Exception, err:
+            # handle exceptions in a clean fashion
+            from traceback import format_exception_only
+            msg = ''.join(format_exception_only(err.__class__, err))
+            newnode = doctree.reporter.error('Exception occured in '
+                                             'ifconfig expression: \n%s' %
+                                             msg, base_node=node)
+            node.replace_self(newnode)
+        else:
+            if not res:
+                node.replace_self([])
+            else:
+                node.replace_self(node.children)
+
+
+def setup(app):
+    app.add_node(ifconfig)
+    app.add_directive('ifconfig', ifconfig_directive, 1, (1, 0, 1))
+    app.connect('doctree-resolved', process_ifconfig_nodes)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.intersphinx
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Insert links to Python objects documented in remote Sphinx documentation.
+
+    This works as follows:
+
+    * Each Sphinx HTML build creates a file named "objects.inv" that contains
+      a mapping from Python identifiers to URIs relative to the HTML set's root.
+
+    * Projects using the Intersphinx extension can specify links to such mapping
+      files in the `intersphinx_mapping` config value.  The mapping will then be
+      used to resolve otherwise missing references to Python objects into links
+      to the other documentation.
+
+    * By default, the mapping file is assumed to be at the same location as the
+      rest of the documentation; however, the location of the mapping file can
+      also be specified individually, e.g. if the docs should be buildable
+      without Internet access.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import time
+import urllib
+import posixpath
+from os import path
+
+from docutils import nodes
+
+from sphinx.builder import INVENTORY_FILENAME
+
+
+def fetch_inventory(app, uri, inv):
+    """Fetch, parse and return an intersphinx inventory file."""
+    invdata = {}
+    # both *uri* (base URI of the links to generate) and *inv* (actual
+    # location of the inventory file) can be local or remote URIs
+    localuri = uri.find('://') == -1
+    try:
+        if inv.find('://') != -1:
+            f = urllib.urlopen(inv)
+        else:
+            f = open(path.join(app.srcdir, inv))
+    except Exception, err:
+        app.warn('intersphinx inventory %r not fetchable due to '
+                 '%s: %s' % (inv, err.__class__, err))
+        return
+    try:
+        line = f.next()
+        if line.rstrip() != '# Sphinx inventory version 1':
+            raise ValueError('unknown or unsupported inventory version')
+        line = f.next()
+        projname = line.rstrip()[11:].decode('utf-8')
+        line = f.next()
+        version = line.rstrip()[11:]
+        for line in f:
+            name, type, location = line.rstrip().split(None, 2)
+            if localuri:
+                location = path.join(uri, location)
+            else:
+                location = posixpath.join(uri, location)
+            invdata[name] = (type, projname, version, location)
+        f.close()
+    except Exception, err:
+        app.warn('intersphinx inventory %r not readable due to '
+                 '%s: %s' % (inv, err.__class__, err))
+    else:
+        return invdata
+
+
+def load_mappings(app):
+    """Load all intersphinx mappings into the environment."""
+    now = int(time.time())
+    cache_time = now - app.config.intersphinx_cache_limit * 86400
+    env = app.builder.env
+    if not hasattr(env, 'intersphinx_cache'):
+        env.intersphinx_cache = {}
+    cache = env.intersphinx_cache
+    update = False
+    for uri, inv in app.config.intersphinx_mapping.iteritems():
+        # we can safely assume that the uri<->inv mapping is not changed
+        # during partial rebuilds since a changed intersphinx_mapping
+        # setting will cause a full environment reread
+        if not inv:
+            inv = posixpath.join(uri, INVENTORY_FILENAME)
+        # decide whether the inventory must be read: always read local
+        # files; remote ones only if the cache time is expired
+        if '://' not in inv or uri not in cache \
+               or cache[uri][0] < cache_time:
+            invdata = fetch_inventory(app, uri, inv)
+            cache[uri] = (now, invdata)
+            update = True
+    if update:
+        env.intersphinx_inventory = {}
+        for _, invdata in cache.itervalues():
+            if invdata:
+                env.intersphinx_inventory.update(invdata)
+
+
+def missing_reference(app, env, node, contnode):
+    """Attempt to resolve a missing reference via intersphinx references."""
+    type = node['reftype']
+    target = node['reftarget']
+    if type == 'mod':
+        type, proj, version, uri = env.intersphinx_inventory.get(target,
+                                                                 ('','','',''))
+        if type != 'mod':
+            return None
+        target = 'module-' + target   # for link anchor
+    else:
+        if target[-2:] == '()':
+            target = target[:-2]
+        target = target.rstrip(' *')
+        # special case: exceptions and object methods
+        if type == 'exc' and '.' not in target and \
+           'exceptions.' + target in env.intersphinx_inventory:
+            target = 'exceptions.' + target
+        elif type in ('func', 'meth') and '.' not in target and \
+           'object.' + target in env.intersphinx_inventory:
+            target = 'object.' + target
+        if target not in env.intersphinx_inventory:
+            return None
+        type, proj, version, uri = env.intersphinx_inventory[target]
+    print "Intersphinx hit:", target, uri
+    newnode = nodes.reference('', '')
+    newnode['refuri'] = uri + '#' + target
+    newnode['reftitle'] = '(in %s v%s)' % (proj, version)
+    newnode['class'] = 'external-xref'
+    newnode.append(contnode)
+    return newnode
+
+
+def setup(app):
+    app.add_config_value('intersphinx_mapping', {}, True)
+    app.add_config_value('intersphinx_cache_limit', 5, False)
+    app.connect('missing-reference', missing_reference)
+    app.connect('builder-inited', load_mappings)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.jsmath
+    ~~~~~~~~~~~~~~~~~
+
+    Set up everything for use of JSMath to display math in HTML
+    via JavaScript.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+from sphinx.application import ExtensionError
+from sphinx.ext.mathbase import setup as mathbase_setup
+
+
+def html_visit_math(self, node):
+    self.body.append(self.starttag(node, 'span', '', CLASS='math'))
+    self.body.append(self.encode(node['latex']) + '</span>')
+    raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+    if node['nowrap']:
+        self.body.append(self.starttag(node, 'div', CLASS='math'))
+        self.body.append(node['latex'])
+        self.body.append('</div>')
+        raise nodes.SkipNode
+    for i, part in enumerate(node['latex'].split('\n\n')):
+        part = self.encode(part)
+        if i == 0:
+            # necessary to e.g. set the id property correctly
+            if node['number']:
+                self.body.append('<span class="eqno">(%s)</span>' % node['number'])
+            self.body.append(self.starttag(node, 'div', CLASS='math'))
+        else:
+            # but only once!
+            self.body.append('<div class="math">')
+        if '&' in part or '\\\\' in part:
+            self.body.append('\\begin{split}' + part + '\\end{split}')
+        else:
+            self.body.append(part)
+        self.body.append('</div>\n')
+    raise nodes.SkipNode
+
+def builder_inited(app):
+    if not app.config.jsmath_path:
+        raise ExtensionError('jsmath_path config value must be set for the '
+                             'jsmath extension to work')
+    app.add_javascript(app.config.jsmath_path)
+
+
+def setup(app):
+    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+    app.add_config_value('jsmath_path', '', False)
+    app.connect('builder-inited', builder_inited)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.mathbase
+    ~~~~~~~~~~~~~~~~~~~
+
+    Set up math support in source files and LaTeX/text output.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+
+
+class math(nodes.Inline, nodes.TextElement):
+    pass
+
+class displaymath(nodes.Part, nodes.Element):
+    pass
+
+class eqref(nodes.Inline, nodes.TextElement):
+    pass
+
+
+def wrap_displaymath(math, label):
+    parts = math.split('\n\n')
+    ret = []
+    for i, part in enumerate(parts):
+        if label is not None and i == 0:
+            ret.append('\\begin{split}%s\\end{split}' % part +
+                       (label and '\\label{'+label+'}' or ''))
+        else:
+            ret.append('\\begin{split}%s\\end{split}\\notag' % part)
+    return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}'
+
+
+def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    latex = utils.unescape(text, restore_backslashes=True)
+    return [math(latex=latex)], []
+
+def eq_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    node = eqref('(?)', '(?)', target=text)
+    node['docname'] = inliner.document.settings.env.docname
+    return [node], []
+
+def math_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    latex = '\n'.join(content)
+    if arguments and arguments[0]:
+        latex = arguments[0] + '\n\n' + latex
+    node = displaymath()
+    node['latex'] = latex
+    node['label'] = options.get('label', None)
+    node['nowrap'] = 'nowrap' in options
+    node['docname'] = state.document.settings.env.docname
+    ret = [node]
+    if node['label']:
+        tnode = nodes.target('', '', ids=['equation-' + node['label']])
+        state.document.note_explicit_target(tnode)
+        ret.insert(0, tnode)
+    return ret
+
+
+def latex_visit_math(self, node):
+    self.body.append('$' + node['latex'] + '$')
+    raise nodes.SkipNode
+
+def latex_visit_displaymath(self, node):
+    if node['nowrap']:
+        self.body.append(node['latex'])
+    else:
+        label = node['label'] and node['docname'] + '-' + node['label'] or None
+        self.body.append(wrap_displaymath(node['latex'], label))
+    raise nodes.SkipNode
+
+def latex_visit_eqref(self, node):
+    self.body.append('\\eqref{%s-%s}' % (node['docname'], node['target']))
+    raise nodes.SkipNode
+
+
+def text_visit_math(self, node):
+    self.add_text(node['latex'])
+    raise nodes.SkipNode
+
+def text_visit_displaymath(self, node):
+    self.new_state()
+    self.add_text(node['latex'])
+    self.end_state()
+    raise nodes.SkipNode
+
+def text_visit_eqref(self, node):
+    self.add_text(node['target'])
+    raise nodes.SkipNode
+
+
+def html_visit_eqref(self, node):
+    self.body.append('<a href="#equation-%s">' % node['target'])
+
+def html_depart_eqref(self, node):
+    self.body.append('</a>')
+
+
+def number_equations(app, doctree, docname):
+    num = 0
+    numbers = {}
+    for node in doctree.traverse(displaymath):
+        if node['label'] is not None:
+            num += 1
+            node['number'] = num
+            numbers[node['label']] = num
+        else:
+            node['number'] = None
+    for node in doctree.traverse(eqref):
+        if node['target'] not in numbers:
+            continue
+        num = '(%d)' % numbers[node['target']]
+        node[0] = nodes.Text(num, num)
+
+
+def setup(app, htmlinlinevisitors, htmldisplayvisitors):
+    app.add_node(math,
+                 latex=(latex_visit_math, None),
+                 text=(text_visit_math, None),
+                 html=htmlinlinevisitors)
+    app.add_node(displaymath,
+                 latex=(latex_visit_displaymath, None),
+                 text=(text_visit_displaymath, None),
+                 html=htmldisplayvisitors)
+    app.add_node(eqref,
+                 latex=(latex_visit_eqref, None),
+                 text=(text_visit_eqref, None),
+                 html=(html_visit_eqref, html_depart_eqref))
+    app.add_role('math', math_role)
+    app.add_role('eq', eq_role)
+    app.add_directive('math', math_directive, 1, (0, 1, 1),
+                      label=directives.unchanged, nowrap=directives.flag)
+    app.connect('doctree-resolved', number_equations)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.pngmath
+    ~~~~~~~~~~~~~~~~~~
+
+    Render math in HTML via dvipng.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import shutil
+import tempfile
+import posixpath
+from os import path, getcwd, chdir
+from subprocess import Popen, PIPE
+try:
+    from hashlib import sha1 as sha
+except ImportError:
+    from sha import sha
+
+from docutils import nodes
+
+from sphinx.util import ensuredir
+from sphinx.util.png import read_png_depth, write_png_depth
+from sphinx.application import SphinxError
+from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath
+
+class MathExtError(SphinxError):
+    category = 'Math extension error'
+
+
+DOC_HEAD = r'''
+\documentclass[12pt]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage{amssymb}
+\usepackage{amsfonts}
+\usepackage{bm}
+\pagestyle{empty}
+'''
+
+DOC_BODY = r'''
+\begin{document}
+%s
+\end{document}
+'''
+
+DOC_BODY_PREVIEW = r'''
+\usepackage[active]{preview}
+\begin{document}
+\begin{preview}
+%s
+\end{preview}
+\end{document}
+'''
+
+depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]')
+
+def render_math(self, math):
+    """
+    Render the LaTeX math expression *math* using latex and dvipng.
+
+    Return the filename relative to the built document and the "depth",
+    that is, the distance of image bottom and baseline in pixels, if the
+    option to use preview_latex is switched on.
+
+    Error handling may seem strange, but follows a pattern: if LaTeX or
+    dvipng aren't available, only a warning is generated (since that enables
+    people on machines without these programs to at least build the rest
+    of the docs successfully).  If the programs are there, however, they
+    may not fail since that indicates a problem in the math source.
+    """
+    use_preview = self.builder.config.pngmath_use_preview
+
+    shasum = "%s.png" % sha(math.encode('utf-8')).hexdigest()
+    relfn = posixpath.join(self.builder.imgpath, 'math', shasum)
+    outfn = path.join(self.builder.outdir, '_images', 'math', shasum)
+    if path.isfile(outfn):
+        depth = read_png_depth(outfn)
+        return relfn, depth
+
+    latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
+    latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
+    if isinstance(latex, unicode):
+        latex = latex.encode('utf-8')
+
+    # use only one tempdir per build -- the use of a directory is cleaner
+    # than using temporary files, since we can clean up everything at once
+    # just removing the whole directory (see cleanup_tempdir)
+    if not hasattr(self.builder, '_mathpng_tempdir'):
+        tempdir = self.builder._mathpng_tempdir = tempfile.mkdtemp()
+    else:
+        tempdir = self.builder._mathpng_tempdir
+
+    tf = open(path.join(tempdir, 'math.tex'), 'w')
+    tf.write(latex)
+    tf.close()
+
+    # build latex command; old versions of latex don't have the
+    # --output-directory option, so we have to manually chdir to the
+    # temp dir to run it.
+    ltx_args = [self.builder.config.pngmath_latex, '--interaction=nonstopmode']
+    # add custom args from the config file
+    ltx_args.extend(self.builder.config.pngmath_latex_args)
+    ltx_args.append('math.tex')
+
+    curdir = getcwd()
+    chdir(tempdir)
+
+    try:
+        try:
+            p = Popen(ltx_args, stdout=PIPE, stderr=PIPE)
+        except OSError, err:
+            if err.errno != 2:   # No such file or directory
+                raise
+            if not hasattr(self.builder, '_mathpng_warned_latex'):
+                self.builder.warn('LaTeX command %r cannot be run (needed for math '
+                                  'display), check the pngmath_latex setting' %
+                                  self.builder.config.pngmath_latex)
+                self.builder._mathpng_warned_latex = True
+            return relfn, None
+    finally:
+        chdir(curdir)
+
+    stdout, stderr = p.communicate()
+    if p.returncode != 0:
+        raise MathExtError('latex exited with error:\n[stderr]\n%s\n[stdout]\n%s'
+                           % (stderr, stdout))
+
+    ensuredir(path.dirname(outfn))
+    # use some standard dvipng arguments
+    dvipng_args = [self.builder.config.pngmath_dvipng]
+    dvipng_args += ['-o', outfn, '-T', 'tight', '-z9']
+    # add custom ones from config value
+    dvipng_args.extend(self.builder.config.pngmath_dvipng_args)
+    if use_preview:
+        dvipng_args.append('--depth')
+    # last, the input file name
+    dvipng_args.append(path.join(tempdir, 'math.dvi'))
+    try:
+        p = Popen(dvipng_args, stdout=PIPE, stderr=PIPE)
+    except OSError, err:
+        if err.errno != 2:   # No such file or directory
+            raise
+        if not hasattr(self.builder, '_mathpng_warned_dvipng'):
+            self.builder.warn('dvipng command %r cannot be run (needed for math '
+                              'display), check the pngmath_dvipng setting' %
+                              self.builder.config.pngmath_dvipng)
+            self.builder._mathpng_warned_dvipng = True
+        return relfn, None
+    stdout, stderr = p.communicate()
+    if p.returncode != 0:
+        raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s'
+                           % (stderr, stdout))
+    depth = None
+    if use_preview:
+        for line in stdout.splitlines():
+            m = depth_re.match(line)
+            if m:
+                depth = int(m.group(1))
+                write_png_depth(outfn, depth)
+                break
+
+    return relfn, depth
+
+def cleanup_tempdir(app, exc):
+    if exc:
+        return
+    if not hasattr(app.builder, '_mathpng_tempdir'):
+        return
+    try:
+        shutil.rmtree(app.builder._mathpng_tempdir)
+    except Exception:
+        pass
+
+def html_visit_math(self, node):
+    try:
+        fname, depth = render_math(self, '$'+node['latex']+'$')
+    except MathExtError, exc:
+        sm = nodes.system_message(str(exc), type='WARNING', level=2,
+                                  backrefs=[], source=node['latex'])
+        sm.walkabout(self)
+        self.builder.warn('display latex %r: ' % node['latex'] + str(exc))
+        raise nodes.SkipNode
+    self.body.append('<img class="math" src="%s" alt="%s" %s/>' %
+                     (fname, self.encode(node['latex']).strip(),
+                      depth and 'style="vertical-align: %dpx" ' % (-depth) or ''))
+    raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+    if node['nowrap']:
+        latex = node['latex']
+    else:
+        latex = wrap_displaymath(node['latex'], None)
+    try:
+        fname, depth = render_math(self, latex)
+    except MathExtError, exc:
+        sm = nodes.system_message(str(exc), type='WARNING', level=2,
+                                  backrefs=[], source=node['latex'])
+        sm.walkabout(self)
+        self.builder.warn('inline latex %r: ' % node['latex'] + str(exc))
+        raise nodes.SkipNode
+    self.body.append(self.starttag(node, 'div', CLASS='math'))
+    self.body.append('<p>')
+    if node['number']:
+        self.body.append('<span class="eqno">(%s)</span>' % node['number'])
+    self.body.append('<img src="%s" alt="%s" />\n</div>' %
+                     (fname, self.encode(node['latex']).strip()))
+    self.body.append('</p>')
+    raise nodes.SkipNode
+
+
+def setup(app):
+    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+    app.add_config_value('pngmath_dvipng', 'dvipng', False)
+    app.add_config_value('pngmath_latex', 'latex', False)
+    app.add_config_value('pngmath_use_preview', False, False)
+    app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False)
+    app.add_config_value('pngmath_latex_args', [], False)
+    app.add_config_value('pngmath_latex_preamble', '', False)
+    app.connect('build-finished', cleanup_tempdir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.refcounting
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Supports reference count annotations for C API functions.  Based on
+    refcount.py and anno-api.py in the old Python documentation tools.
+
+    Usage: Set the `refcount_file` config value to the path to the reference
+    count data file.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from os import path
+from docutils import nodes
+
+from sphinx import addnodes
+
+
+# refcount annotation
+class refcount(nodes.emphasis): pass
+
+
+class RCEntry:
+    def __init__(self, name):
+        self.name = name
+        self.args = []
+        self.result_type = ''
+        self.result_refs = None
+
+
+class Refcounts(dict):
+    @classmethod
+    def fromfile(cls, filename):
+        d = cls()
+        fp = open(filename, 'r')
+        try:
+            for line in fp:
+                line = line.strip()
+                if line[:1] in ("", "#"):
+                    # blank lines and comments
+                    continue
+                parts = line.split(":", 4)
+                if len(parts) != 5:
+                    raise ValueError("Wrong field count in %r" % line)
+                function, type, arg, refcount, comment = parts
+                # Get the entry, creating it if needed:
+                try:
+                    entry = d[function]
+                except KeyError:
+                    entry = d[function] = RCEntry(function)
+                if not refcount or refcount == "null":
+                    refcount = None
+                else:
+                    refcount = int(refcount)
+                # Update the entry with the new parameter or the result information.
+                if arg:
+                    entry.args.append((arg, type, refcount))
+                else:
+                    entry.result_type = type
+                    entry.result_refs = refcount
+        finally:
+            fp.close()
+        return d
+
+    def add_refcount_annotations(self, app, doctree):
+        for node in doctree.traverse(addnodes.desc_content):
+            par = node.parent
+            if par['desctype'] != 'cfunction':
+                continue
+            if not par[0].has_key('names') or not par[0]['names']:
+                continue
+            entry = self.get(par[0]['names'][0])
+            if not entry:
+                continue
+            elif entry.result_type not in ("PyObject*", "PyVarObject*"):
+                continue
+            rc = 'Return value: '
+            if entry.result_refs is None:
+                rc += "Always NULL."
+            else:
+                rc += (entry.result_refs and "New" or "Borrowed") + " reference."
+            node.insert(0, refcount(rc, rc))
+
+
+def init_refcounts(app):
+    if app.config.refcount_file:
+        refcounts = Refcounts.fromfile(
+            path.join(app.srcdir, app.config.refcount_file))
+        app.connect('doctree-read', refcounts.add_refcount_annotations)
+
+
+def setup(app):
+    app.add_node(refcount)
+    app.add_config_value('refcount_file', '', True)
+    app.connect('builder-inited', init_refcounts)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.todo
+    ~~~~~~~~~~~~~~~
+
+    Allow todos to be inserted into your documentation.  Inclusion of todos can
+    be switched of by a configuration variable.  The todolist directive collects
+    all todos of your project and lists them along with a backlink to the
+    original location.
+
+    :copyright: 2008 Daniel Bültmann.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+from sphinx.util.compat import make_admonition
+
+class todo_node(nodes.Admonition, nodes.Element): pass
+class todolist(nodes.General, nodes.Element): pass
+
+
+def todo_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+
+    targetid = "todo-%s" % env.index_num
+    env.index_num += 1
+    targetnode = nodes.target('', '', ids=[targetid])
+
+    ad = make_admonition(todo_node, name, [_('Todo')], options, content, lineno,
+                         content_offset, block_text, state, state_machine)
+
+    # Attach a list of all todos to the environment,
+    # the todolist works with the collected todo nodes
+    if not hasattr(env, 'todo_all_todos'):
+        env.todo_all_todos = []
+    env.todo_all_todos.append({
+        'docname': env.docname,
+        'lineno': lineno,
+        'todo': ad[0].deepcopy(),
+        'target': targetnode,
+    })
+
+    return [targetnode] + ad
+
+
+def todolist_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    # Simply insert an empty todolist node which will be replaced later
+    # when process_todo_nodes is called
+    return [todolist('')]
+
+
+def process_todo_nodes(app, doctree, fromdocname):
+    if not app.config['todo_include_todos']:
+        for node in doctree.traverse(todo_node):
+            node.parent.remove(node)
+
+    # Replace all todolist nodes with a list of the collected todos.
+    # Augment each todo with a backlink to the original location.
+    env = app.builder.env
+
+    for node in doctree.traverse(todolist):
+        if not app.config['todo_include_todos']:
+            node.replace_self([])
+            continue
+
+        content = []
+
+        for todo_info in env.todo_all_todos:
+            para = nodes.paragraph()
+            filename = env.doc2path(todo_info['docname'], base=None)
+            description = (
+                _('(The original entry is located in %s, line %d and can be found ') %
+                (filename, todo_info['lineno']))
+            para += nodes.Text(description, description)
+
+            # Create a reference
+            newnode = nodes.reference('', '')
+            innernode = nodes.emphasis(_('here'), _('here'))
+            newnode['refdocname'] = todo_info['docname']
+            newnode['refuri'] = app.builder.get_relative_uri(
+                fromdocname, todo_info['docname'])
+            newnode['refuri'] += '#' + todo_info['target']['refid']
+            newnode.append(innernode)
+            para += newnode
+            para += nodes.Text('.)', '.)')
+
+            # Insert into the todolist
+            content.append(todo_info['todo'])
+            content.append(para)
+
+        node.replace_self(content)
+
+
+def purge_todos(app, env, docname):
+    if not hasattr(env, 'todo_all_todos'):
+        return
+    env.todo_all_todos = [todo for todo in env.todo_all_todos
+                          if todo['docname'] != docname]
+
+
+def visit_todo_node(self, node):
+    self.visit_admonition(node)
+
+def depart_todo_node(self, node):
+    self.depart_admonition(node)
+
+def setup(app):
+    app.add_config_value('todo_include_todos', False, False)
+
+    app.add_node(todolist)
+    app.add_node(todo_node,
+                 html=(visit_todo_node, depart_todo_node),
+                 latex=(visit_todo_node, depart_todo_node),
+                 text=(visit_todo_node, depart_todo_node))
+
+    app.add_directive('todo', todo_directive, 1, (0, 0, 1))
+    app.add_directive('todolist', todolist_directive, 0, (0, 0, 0))
+    app.connect('doctree-resolved', process_todo_nodes)
+    app.connect('env-purge-doc', purge_todos)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.highlighting
+    ~~~~~~~~~~~~~~~~~~~
+
+    Highlight code blocks using Pygments.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import cgi
+import re
+import parser
+
+from sphinx.util.texescape import tex_hl_escape_map
+
+try:
+    import pygments
+    from pygments import highlight
+    from pygments.lexers import PythonLexer, PythonConsoleLexer, CLexer, \
+         TextLexer, RstLexer
+    from pygments.lexers import get_lexer_by_name, guess_lexer
+    from pygments.formatters import HtmlFormatter, LatexFormatter
+    from pygments.filters import ErrorToken
+    from pygments.style import Style
+    from pygments.styles import get_style_by_name
+    from pygments.styles.friendly import FriendlyStyle
+    from pygments.token import Generic, Comment, Number
+except ImportError:
+    pygments = None
+else:
+    class SphinxStyle(Style):
+        """
+        Like friendly, but a bit darker to enhance contrast on the green
+        background.
+        """
+
+        background_color = '#eeffcc'
+        default_style = ''
+
+        styles = FriendlyStyle.styles
+        styles.update({
+            Generic.Output: '#333',
+            Comment: 'italic #408090',
+            Number: '#208050',
+        })
+
+    lexers = dict(
+        none = TextLexer(),
+        python = PythonLexer(),
+        pycon = PythonConsoleLexer(),
+        # the python3 option exists as of Pygments 0.12, but it doesn't
+        # do any harm in previous versions
+        pycon3 = PythonConsoleLexer(python3=True),
+        rest = RstLexer(),
+        c = CLexer(),
+    )
+    for _lexer in lexers.values():
+        _lexer.add_filter('raiseonerror')
+
+
+escape_hl_chars = {ord(u'@'): u'@PYGZat[]',
+                   ord(u'['): u'@PYGZlb[]',
+                   ord(u']'): u'@PYGZrb[]'}
+
+# used if Pygments is not available
+_LATEX_STYLES = r'''
+\newcommand\PYGZat{@}
+\newcommand\PYGZlb{[}
+\newcommand\PYGZrb{]}
+'''
+
+
+parsing_exceptions = (SyntaxError, UnicodeEncodeError)
+if sys.version_info < (2, 5):
+    # Python <= 2.4 raises MemoryError when parsing an
+    # invalid encoding cookie
+    parsing_exceptions += MemoryError,
+
+
+class PygmentsBridge(object):
+    def __init__(self, dest='html', stylename='sphinx'):
+        self.dest = dest
+        if not pygments:
+            return
+        if stylename == 'sphinx':
+            style = SphinxStyle
+        elif '.' in stylename:
+            module, stylename = stylename.rsplit('.', 1)
+            style = getattr(__import__(module, None, None, ['']), stylename)
+        else:
+            style = get_style_by_name(stylename)
+        self.hfmter = {False: HtmlFormatter(style=style),
+                       True: HtmlFormatter(style=style, linenos=True)}
+        self.lfmter = {False: LatexFormatter(style=style, commandprefix='PYG'),
+                       True: LatexFormatter(style=style, linenos=True,
+                                            commandprefix='PYG')}
+
+    def unhighlighted(self, source):
+        if self.dest == 'html':
+            return '<pre>' + cgi.escape(source) + '</pre>\n'
+        else:
+            # first, escape highlighting characters like Pygments does
+            source = source.translate(escape_hl_chars)
+            # then, escape all characters nonrepresentable in LaTeX
+            source = source.translate(tex_hl_escape_map)
+            return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \
+                   source + '\\end{Verbatim}\n'
+
+    def try_parse(self, src):
+        # Make sure it ends in a newline
+        src += '\n'
+
+        # Replace "..." by a mark which is also a valid python expression
+        # (Note, the highlighter gets the original source, this is only done
+        #  to allow "..." in code and still highlight it as Python code.)
+        mark = "__highlighting__ellipsis__"
+        src = src.replace("...", mark)
+
+        # lines beginning with "..." are probably placeholders for suite
+        src = re.sub(r"(?m)^(\s*)" + mark + "(.)", r"\1"+ mark + r"# \2", src)
+
+        # if we're using 2.5, use the with statement
+        if sys.version_info >= (2, 5):
+            src = 'from __future__ import with_statement\n' + src
+
+        if isinstance(src, unicode):
+            # Non-ASCII chars will only occur in string literals
+            # and comments.  If we wanted to give them to the parser
+            # correctly, we'd have to find out the correct source
+            # encoding.  Since it may not even be given in a snippet,
+            # just replace all non-ASCII characters.
+            src = src.encode('ascii', 'replace')
+
+        try:
+            parser.suite(src)
+        except parsing_exceptions:
+            return False
+        else:
+            return True
+
+    def highlight_block(self, source, lang, linenos=False):
+        if not pygments:
+            return self.unhighlighted(source)
+        if lang in ('py', 'python'):
+            if source.startswith('>>>'):
+                # interactive session
+                lexer = lexers['pycon']
+            else:
+                # maybe Python -- try parsing it
+                if self.try_parse(source):
+                    lexer = lexers['python']
+                else:
+                    return self.unhighlighted(source)
+        elif lang in ('python3', 'py3') and source.startswith('>>>'):
+            # for py3, recognize interactive sessions, but do not try parsing...
+            lexer = lexers['pycon3']
+        elif lang == 'guess':
+            try:
+                lexer = guess_lexer(source)
+            except Exception:
+                return self.unhighlighted(source)
+        else:
+            if lang in lexers:
+                lexer = lexers[lang]
+            else:
+                lexer = lexers[lang] = get_lexer_by_name(lang)
+                lexer.add_filter('raiseonerror')
+        try:
+            if self.dest == 'html':
+                return highlight(source, lexer, self.hfmter[bool(linenos)])
+            else:
+                hlsource = highlight(source, lexer, self.lfmter[bool(linenos)])
+                return hlsource.translate(tex_hl_escape_map)
+        except ErrorToken:
+            # this is most probably not the selected language,
+            # so let it pass unhighlighted
+            return self.unhighlighted(source)
+
+    def get_stylesheet(self):
+        if not pygments:
+            if self.dest == 'latex':
+                return _LATEX_STYLES
+            # no HTML styles needed
+            return ''
+        if self.dest == 'html':
+            return self.hfmter[0].get_style_defs()
+        else:
+            styledefs = self.lfmter[0].get_style_defs()
+            # workaround for Pygments < 0.12
+            if styledefs.startswith('\\newcommand\\at{@}'):
+                styledefs += _LATEX_STYLES
+            return styledefs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,220 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.htmlhelp
+    ~~~~~~~~~~~~~~~
+
+    Build HTML help support files.
+    Adapted from the original Doc/tools/prechm.py.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import cgi
+from os import path
+
+from docutils import nodes
+
+from sphinx import addnodes
+
+# Project file (*.hhp) template.  'outname' is the file basename (like
+# the pythlp in pythlp.hhp); 'version' is the doc version number (like
+# the 2.2 in Python 2.2).
+# The magical numbers in the long line under [WINDOWS] set most of the
+# user-visible features (visible buttons, tabs, etc).
+# About 0x10384e:  This defines the buttons in the help viewer.  The
+# following defns are taken from htmlhelp.h.  Not all possibilities
+# actually work, and not all those that work are available from the Help
+# Workshop GUI.  In particular, the Zoom/Font button works and is not
+# available from the GUI.  The ones we're using are marked with 'x':
+#
+#    0x000002   Hide/Show   x
+#    0x000004   Back        x
+#    0x000008   Forward     x
+#    0x000010   Stop
+#    0x000020   Refresh
+#    0x000040   Home        x
+#    0x000080   Forward
+#    0x000100   Back
+#    0x000200   Notes
+#    0x000400   Contents
+#    0x000800   Locate      x
+#    0x001000   Options     x
+#    0x002000   Print       x
+#    0x004000   Index
+#    0x008000   Search
+#    0x010000   History
+#    0x020000   Favorites
+#    0x040000   Jump 1
+#    0x080000   Jump 2
+#    0x100000   Zoom/Font   x
+#    0x200000   TOC Next
+#    0x400000   TOC Prev
+
+project_template = '''\
+[OPTIONS]
+Binary TOC=Yes
+Binary Index=No
+Compiled file=%(outname)s.chm
+Contents file=%(outname)s.hhc
+Default Window=%(outname)s
+Default topic=index.html
+Display compile progress=No
+Full text search stop list file=%(outname)s.stp
+Full-text search=Yes
+Index file=%(outname)s.hhk
+Language=0x409
+Title=%(title)s
+
+[WINDOWS]
+%(outname)s="%(title)s","%(outname)s.hhc","%(outname)s.hhk",\
+"index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0
+
+[FILES]
+'''
+
+contents_header = '''\
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<HTML>
+<HEAD>
+<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
+<!-- Sitemap 1.0 -->
+</HEAD><BODY>
+<OBJECT type="text/site properties">
+        <param name="Window Styles" value="0x801227">
+        <param name="ImageType" value="Folder">
+</OBJECT>
+<UL>
+'''
+
+contents_footer = '''\
+</UL></BODY></HTML>
+'''
+
+object_sitemap = '''\
+<OBJECT type="text/sitemap">
+    <param name="Name" value="%s">
+    <param name="Local" value="%s">
+</OBJECT>
+'''
+
+# List of words the full text search facility shouldn't index.  This
+# becomes file outname.stp.  Note that this list must be pretty small!
+# Different versions of the MS docs claim the file has a maximum size of
+# 256 or 512 bytes (including \r\n at the end of each line).
+# Note that "and", "or", "not" and "near" are operators in the search
+# language, so no point indexing them even if we wanted to.
+stopwords = """
+a  and  are  as  at
+be  but  by
+for
+if  in  into  is  it
+near  no  not
+of  on  or
+such
+that  the  their  then  there  these  they  this  to
+was  will  with
+""".split()
+
+
+def build_hhx(builder, outdir, outname):
+    builder.info('dumping stopword list...')
+    f = open(path.join(outdir, outname+'.stp'), 'w')
+    try:
+        for word in sorted(stopwords):
+            print >>f, word
+    finally:
+        f.close()
+
+    builder.info('writing project file...')
+    f = open(path.join(outdir, outname+'.hhp'), 'w')
+    try:
+        f.write(project_template % {'outname': outname,
+                                    'title': builder.config.html_title,
+                                    'version': builder.config.version,
+                                    'project': builder.config.project})
+        if not outdir.endswith(os.sep):
+            outdir += os.sep
+        olen = len(outdir)
+        for root, dirs, files in os.walk(outdir):
+            staticdir = (root == path.join(outdir, '_static'))
+            for fn in files:
+                if (staticdir and not fn.endswith('.js')) or fn.endswith('.html'):
+                    print >>f, path.join(root, fn)[olen:].replace(os.sep, '\\')
+    finally:
+        f.close()
+
+    builder.info('writing TOC file...')
+    f = open(path.join(outdir, outname+'.hhc'), 'w')
+    try:
+        f.write(contents_header)
+        # special books
+        f.write('<LI> ' + object_sitemap % (builder.config.html_short_title,
+                                            'index.html'))
+        if builder.config.html_use_modindex:
+            f.write('<LI> ' + object_sitemap % (_('Global Module Index'),
+                                                'modindex.html'))
+        # the TOC
+        tocdoc = builder.env.get_and_resolve_doctree(builder.config.master_doc, builder,
+                                                     prune_toctrees=False)
+        def write_toc(node, ullevel=0):
+            if isinstance(node, nodes.list_item):
+                f.write('<LI> ')
+                for subnode in node:
+                    write_toc(subnode, ullevel)
+            elif isinstance(node, nodes.reference):
+                link = node['refuri']
+                title = cgi.escape(node.astext()).replace('"','&quot;')
+                item = object_sitemap % (title, link)
+                f.write(item.encode('ascii', 'xmlcharrefreplace'))
+            elif isinstance(node, nodes.bullet_list):
+                if ullevel != 0:
+                    f.write('<UL>\n')
+                for subnode in node:
+                    write_toc(subnode, ullevel+1)
+                if ullevel != 0:
+                    f.write('</UL>\n')
+            elif isinstance(node, addnodes.compact_paragraph):
+                for subnode in node:
+                    write_toc(subnode, ullevel)
+        istoctree = lambda node: isinstance(node, addnodes.compact_paragraph) and \
+                    node.has_key('toctree')
+        for node in tocdoc.traverse(istoctree):
+            write_toc(node)
+        f.write(contents_footer)
+    finally:
+        f.close()
+
+    builder.info('writing index file...')
+    index = builder.env.create_index(builder)
+    f = open(path.join(outdir, outname+'.hhk'), 'w')
+    try:
+        f.write('<UL>\n')
+        def write_index(title, refs, subitems):
+            def write_param(name, value):
+                item = '    <param name="%s" value="%s">\n' % (name, value)
+                f.write(item.encode('ascii', 'xmlcharrefreplace'))
+            title = cgi.escape(title)
+            f.write('<LI> <OBJECT type="text/sitemap">\n')
+            write_param('Keyword', title)
+            if len(refs) == 0:
+                write_param('See Also', title)
+            elif len(refs) == 1:
+                write_param('Local', refs[0])
+            else:
+                for i, ref in enumerate(refs):
+                    write_param('Name', '[%d] %s' % (i, ref)) # XXX: better title?
+                    write_param('Local', ref)
+            f.write('</OBJECT>\n')
+            if subitems:
+                f.write('<UL> ')
+                for subitem in subitems:
+                    write_index(subitem[0], subitem[1], [])
+                f.write('</UL>')
+        for (key, group) in index:
+            for title, (refs, subitems) in group:
+                write_index(title, refs, subitems)
+        f.write('</UL>\n')
+    finally:
+        f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,457 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.htmlwriter
+    ~~~~~~~~~~~~~~~~~
+
+    docutils writers handling Sphinx' custom nodes.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import posixpath
+import os
+
+from docutils import nodes
+from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator
+
+from sphinx.locale import admonitionlabels, versionlabels
+from sphinx.highlighting import PygmentsBridge
+from sphinx.util.smartypants import sphinx_smarty_pants
+
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+
+class HTMLWriter(Writer):
+    def __init__(self, builder):
+        Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        # sadly, this is mostly copied from parent class
+        self.visitor = visitor = self.builder.translator_class(self.builder,
+                                                               self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
+                     'body_pre_docinfo', 'docinfo', 'body', 'fragment',
+                     'body_suffix', 'meta', 'title', 'subtitle', 'header',
+                     'footer', 'html_prolog', 'html_head', 'html_title',
+                     'html_subtitle', 'html_body', ):
+            setattr(self, attr, getattr(visitor, attr, None))
+        self.clean_meta = ''.join(visitor.meta[2:])
+
+
+class HTMLTranslator(BaseTranslator):
+    """
+    Our custom HTML translator.
+    """
+
+    def __init__(self, builder, *args, **kwds):
+        BaseTranslator.__init__(self, *args, **kwds)
+        self.highlighter = PygmentsBridge('html', builder.config.pygments_style)
+        self.no_smarty = 0
+        self.builder = builder
+        self.highlightlang = builder.config.highlight_language
+        self.highlightlinenothreshold = sys.maxint
+        self.protect_literal_text = 0
+
+    def visit_desc(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS=node['desctype']))
+    def depart_desc(self, node):
+        self.body.append('</dl>\n\n')
+
+    def visit_desc_signature(self, node):
+        # the id is set automatically
+        self.body.append(self.starttag(node, 'dt'))
+        # anchor for per-desc interactive data
+        if node.parent['desctype'] != 'describe' and node['ids'] and node['first']:
+            self.body.append('<!--[%s]-->' % node['ids'][0])
+        if node.parent['desctype'] in ('class', 'exception'):
+            self.body.append('%s ' % node.parent['desctype'])
+    def depart_desc_signature(self, node):
+        if node['ids'] and self.builder.add_definition_links:
+            self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] +
+                             u'title="%s">\u00B6</a>' %
+                             _('Permalink to this definition'))
+        self.body.append('</dt>\n')
+
+    def visit_desc_addname(self, node):
+        self.body.append(self.starttag(node, 'tt', '', CLASS='descclassname'))
+    def depart_desc_addname(self, node):
+        self.body.append('</tt>')
+
+    def visit_desc_type(self, node):
+        pass
+    def depart_desc_type(self, node):
+        pass
+
+    def visit_desc_name(self, node):
+        self.body.append(self.starttag(node, 'tt', '', CLASS='descname'))
+    def depart_desc_name(self, node):
+        self.body.append('</tt>')
+
+    def visit_desc_parameterlist(self, node):
+        self.body.append('<big>(</big>')
+        self.first_param = 1
+    def depart_desc_parameterlist(self, node):
+        self.body.append('<big>)</big>')
+
+    def visit_desc_parameter(self, node):
+        if not self.first_param:
+            self.body.append(', ')
+        else:
+            self.first_param = 0
+        if not node.hasattr('noemph'):
+            self.body.append('<em>')
+    def depart_desc_parameter(self, node):
+        if not node.hasattr('noemph'):
+            self.body.append('</em>')
+
+    def visit_desc_optional(self, node):
+        self.body.append('<span class="optional">[</span>')
+    def depart_desc_optional(self, node):
+        self.body.append('<span class="optional">]</span>')
+
+    def visit_desc_annotation(self, node):
+        self.body.append(self.starttag(node, 'em', CLASS='property'))
+    def depart_desc_annotation(self, node):
+        self.body.append('</em>')
+
+    def visit_desc_content(self, node):
+        self.body.append(self.starttag(node, 'dd', ''))
+    def depart_desc_content(self, node):
+        self.body.append('</dd>')
+
+    def visit_refcount(self, node):
+        self.body.append(self.starttag(node, 'em', '', CLASS='refcount'))
+    def depart_refcount(self, node):
+        self.body.append('</em>')
+
+    def visit_versionmodified(self, node):
+        self.body.append(self.starttag(node, 'p'))
+        text = versionlabels[node['type']] % node['version']
+        if len(node):
+            text += ': '
+        else:
+            text += '.'
+        self.body.append('<span class="versionmodified">%s</span>' % text)
+    def depart_versionmodified(self, node):
+        self.body.append('</p>\n')
+
+    # overwritten
+    def visit_reference(self, node):
+        BaseTranslator.visit_reference(self, node)
+        if node.hasattr('reftitle'):
+            # ugly hack to add a title attribute
+            starttag = self.body[-1]
+            if not starttag.startswith('<a '):
+                return
+            self.body[-1] = '<a title="%s"' % self.attval(node['reftitle']) + \
+                            starttag[2:]
+
+    # overwritten -- we don't want source comments to show up in the HTML
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    # overwritten
+    def visit_admonition(self, node, name=''):
+        self.body.append(self.starttag(
+            node, 'div', CLASS=('admonition ' + name)))
+        if name and name != 'seealso':
+            node.insert(0, nodes.title(name, admonitionlabels[name]))
+        self.set_first_last(node)
+
+    def visit_seealso(self, node):
+        self.visit_admonition(node, 'seealso')
+    def depart_seealso(self, node):
+        self.depart_admonition(node)
+
+    # overwritten for docutils 0.4
+    if hasattr(BaseTranslator, 'start_tag_with_title'):
+        def visit_section(self, node):
+            # the 0.5 version, to get the id attribute in the <div> tag
+            self.section_level += 1
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+
+        def visit_title(self, node):
+            # don't move the id attribute inside the <h> tag
+            BaseTranslator.visit_title(self, node, move_ids=0)
+
+    # overwritten
+    def visit_literal_block(self, node):
+        if node.rawsource != node.astext():
+            # most probably a parsed-literal block -- don't highlight
+            return BaseTranslator.visit_literal_block(self, node)
+        lang = self.highlightlang
+        linenos = node.rawsource.count('\n') >= self.highlightlinenothreshold - 1
+        if node.has_key('language'):
+            # code-block directives
+            lang = node['language']
+        if node.has_key('linenos'):
+            linenos = node['linenos']
+        highlighted = self.highlighter.highlight_block(node.rawsource, lang, linenos)
+        starttag = self.starttag(node, 'div', suffix='', CLASS='highlight-%s' % lang)
+        self.body.append(starttag + highlighted + '</div>\n')
+        raise nodes.SkipNode
+
+    def visit_doctest_block(self, node):
+        self.visit_literal_block(node)
+
+    # overwritten
+    def visit_literal(self, node):
+        if len(node.children) == 1 and \
+               node.children[0] in ('None', 'True', 'False'):
+            node['classes'].append('xref')
+        self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        self.protect_literal_text += 1
+    def depart_literal(self, node):
+        self.protect_literal_text -= 1
+        self.body.append('</tt>')
+
+    def visit_productionlist(self, node):
+        self.body.append(self.starttag(node, 'pre'))
+        names = []
+        for production in node:
+            names.append(production['tokenname'])
+        maxlen = max(len(name) for name in names)
+        for production in node:
+            if production['tokenname']:
+                lastname = production['tokenname'].ljust(maxlen)
+                self.body.append(self.starttag(production, 'strong', ''))
+                self.body.append(lastname + '</strong> ::= ')
+            else:
+                self.body.append('%s     ' % (' '*len(lastname)))
+            production.walkabout(self)
+            self.body.append('\n')
+        self.body.append('</pre>\n')
+        raise nodes.SkipNode
+    def depart_productionlist(self, node):
+        pass
+
+    def visit_production(self, node):
+        pass
+    def depart_production(self, node):
+        pass
+
+    def visit_centered(self, node):
+        self.body.append(self.starttag(node, 'p', CLASS="centered") + '<strong>')
+    def depart_centered(self, node):
+        self.body.append('</strong></p>')
+
+    def visit_compact_paragraph(self, node):
+        pass
+    def depart_compact_paragraph(self, node):
+        pass
+
+    def visit_highlightlang(self, node):
+        self.highlightlang = node['lang']
+        self.highlightlinenothreshold = node['linenothreshold']
+    def depart_highlightlang(self, node):
+        pass
+
+    # overwritten
+    def visit_image(self, node):
+        olduri = node['uri']
+        # rewrite the URI if the environment knows about it
+        if olduri in self.builder.images:
+            node['uri'] = posixpath.join(self.builder.imgpath,
+                                         self.builder.images[olduri])
+
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(os.path.join(self.builder.srcdir,
+                                                    olduri))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    print olduri
+                    pass
+                else:
+                    if not node.has_key('width'):
+                        node['width'] = str(im.size[0])
+                    if not node.has_key('height'):
+                        node['height'] = str(im.size[1])
+                    del im
+        BaseTranslator.visit_image(self, node)
+
+    def visit_toctree(self, node):
+        # this only happens when formatting a toc from env.tocs -- in this
+        # case we don't want to include the subtree
+        raise nodes.SkipNode
+
+    def visit_index(self, node):
+        raise nodes.SkipNode
+
+    def visit_tabular_col_spec(self, node):
+        raise nodes.SkipNode
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_acks(self, node):
+        pass
+    def depart_acks(self, node):
+        pass
+
+    def visit_module(self, node):
+        pass
+    def depart_module(self, node):
+        pass
+
+    def bulk_text_processor(self, text):
+        return text
+
+    # overwritten
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.protect_literal_text:
+            # moved here from base class's visit_literal to support
+            # more formatting in literal nodes
+            for token in self.words_and_spaces.findall(encoded):
+                if token.strip():
+                    # protect literal text from line wrapping
+                    self.body.append('<span class="pre">%s</span>' % token)
+                elif token in ' \n':
+                    # allow breaks at whitespace
+                    self.body.append(token)
+                else:
+                    # protect runs of multiple spaces; the last one can wrap
+                    self.body.append('&nbsp;' * (len(token)-1) + ' ')
+        else:
+            if self.in_mailto and self.settings.cloak_email_addresses:
+                encoded = self.cloak_email(encoded)
+            else:
+                encoded = self.bulk_text_processor(encoded)
+            self.body.append(encoded)
+
+    # these are all for docutils 0.5 compatibility
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+    def depart_note(self, node):
+        self.depart_admonition(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+    def depart_warning(self, node):
+        self.depart_admonition(node)
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    # these are only handled specially in the SmartyPantsHTMLTranslator
+    def visit_literal_emphasis(self, node):
+        return self.visit_emphasis(node)
+    def depart_literal_emphasis(self, node):
+        return self.depart_emphasis(node)
+
+    def depart_title(self, node):
+        close_tag = self.context[-1]
+        if self.builder.add_header_links and \
+               (close_tag.startswith('</h') or
+                close_tag.startswith('</a></h')) and \
+               node.parent.hasattr('ids') and node.parent['ids']:
+            aname = node.parent['ids'][0]
+            # add permalink anchor
+            self.body.append(u'<a class="headerlink" href="#%s" ' % aname +
+                             u'title="%s">\u00B6</a>' %
+                             _('Permalink to this headline'))
+        BaseTranslator.depart_title(self, node)
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
+
+
+class SmartyPantsHTMLTranslator(HTMLTranslator):
+    """
+    Handle ordinary text via smartypants, converting quotes and dashes
+    to the correct entities.
+    """
+
+    def __init__(self, *args, **kwds):
+        self.no_smarty = 0
+        HTMLTranslator.__init__(self, *args, **kwds)
+
+    def visit_literal(self, node):
+        self.no_smarty += 1
+        try:
+            # this raises SkipNode
+            HTMLTranslator.visit_literal(self, node)
+        finally:
+            self.no_smarty -= 1
+
+    def visit_literal_emphasis(self, node):
+        self.no_smarty += 1
+        self.visit_emphasis(node)
+
+    def depart_literal_emphasis(self, node):
+        self.depart_emphasis(node)
+        self.no_smarty -= 1
+
+    def visit_desc_signature(self, node):
+        self.no_smarty += 1
+        HTMLTranslator.visit_desc_signature(self, node)
+
+    def depart_desc_signature(self, node):
+        self.no_smarty -= 1
+        HTMLTranslator.depart_desc_signature(self, node)
+
+    def visit_productionlist(self, node):
+        self.no_smarty += 1
+        try:
+            HTMLTranslator.visit_productionlist(self, node)
+        finally:
+            self.no_smarty -= 1
+
+    def visit_option(self, node):
+        self.no_smarty += 1
+        HTMLTranslator.visit_option(self, node)
+    def depart_option(self, node):
+        self.no_smarty -= 1
+        HTMLTranslator.depart_option(self, node)
+
+    def bulk_text_processor(self, text):
+        if self.no_smarty <= 0:
+            return sphinx_smarty_pants(text)
+        return text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1192 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.latexwriter
+    ~~~~~~~~~~~~~~~~~~
+
+    Custom docutils writer for LaTeX.
+
+    Much of this code is adapted from Dave Kuhlman's "docpy" writer from his
+    docutils sandbox.
+
+    :copyright: 2007-2008 by Georg Brandl, Dave Kuhlman.
+    :license: BSD.
+"""
+
+import re
+import sys
+from os import path
+
+from docutils import nodes, writers
+from docutils.writers.latex2e import Babel
+
+from sphinx import addnodes
+from sphinx import highlighting
+from sphinx.locale import admonitionlabels, versionlabels
+from sphinx.util import ustrftime
+from sphinx.util.texescape import tex_escape_map
+from sphinx.util.smartypants import educateQuotesLatex
+
+HEADER = r'''%% Generated by Sphinx.
+\documentclass[%(papersize)s,%(pointsize)s%(classoptions)s]{%(docclass)s}
+%(inputenc)s
+%(fontenc)s
+%(babel)s
+%(fontpkg)s
+%(fncychap)s
+\usepackage{sphinx}
+%(preamble)s
+
+\title{%(title)s}
+\date{%(date)s}
+\release{%(release)s}
+\author{%(author)s}
+\newcommand{\sphinxlogo}{%(logo)s}
+\renewcommand{\releasename}{%(releasename)s}
+%(makeindex)s
+%(makemodindex)s
+'''
+
+BEGIN_DOC = r'''
+\begin{document}
+%(shorthandoff)s
+%(maketitle)s
+%(tableofcontents)s
+'''
+
+FOOTER = r'''
+%(footer)s
+\renewcommand{\indexname}{%(modindexname)s}
+%(printmodindex)s
+\renewcommand{\indexname}{%(indexname)s}
+%(printindex)s
+\end{document}
+'''
+
+
+class LaTeXWriter(writers.Writer):
+
+    supported = ('sphinxlatex',)
+
+    settings_spec = ('LaTeX writer options', '', (
+        ('Document name', ['--docname'], {'default': ''}),
+        ('Document class', ['--docclass'], {'default': 'manual'}),
+        ('Author', ['--author'], {'default': ''}),
+        ))
+    settings_defaults = {}
+
+    output = None
+
+    def __init__(self, builder):
+        writers.Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        visitor = LaTeXTranslator(self.document, self.builder)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+
+
+# Helper classes
+
+class ExtBabel(Babel):
+    def get_shorthandoff(self):
+        shortlang = self.language.split('_')[0]
+        if shortlang in ('de', 'sl', 'pt', 'es', 'nl', 'pl'):
+            return '\\shorthandoff{"}'
+        return ''
+
+    _ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy()
+    _ISO639_TO_BABEL['sl'] = 'slovene'
+
+
+class Table(object):
+    def __init__(self):
+        self.col = 0
+        self.colcount = 0
+        self.colspec = None
+        self.had_head = False
+        self.has_verbatim = False
+        self.caption = None
+
+
+class Desc(object):
+    def __init__(self, node):
+        self.env = LaTeXTranslator.desc_map.get(node['desctype'], 'describe')
+        self.type = self.cls = self.name = self.params = self.annotation = ''
+        self.count = 0
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+    sectionnames = ["part", "chapter", "section", "subsection",
+                    "subsubsection", "paragraph", "subparagraph"]
+
+    ignore_missing_images = False
+
+    default_elements = {
+        'docclass':        'manual',
+        'papersize':       'letterpaper',
+        'pointsize':       '10pt',
+        'classoptions':    '',
+        'inputenc':        '\\usepackage[utf8]{inputenc}',
+        'fontenc':         '\\usepackage[T1]{fontenc}',
+        'babel':           '\\usepackage{babel}',
+        'fontpkg':         '\\usepackage{times}',
+        'fncychap':        '\\usepackage[Bjarne]{fncychap}',
+        'preamble':        '',
+        'title':           '',
+        'date':            '',
+        'release':         '',
+        'author':          '',
+        'logo':            '',
+        'releasename':     'Release',
+        'makeindex':       '\\makeindex',
+        'makemodindex':    '\\makemodindex',
+        'shorthandoff':    '',
+        'maketitle':       '\\maketitle',
+        'tableofcontents': '\\tableofcontents',
+        'footer':          '',
+        'printmodindex':   '\\printmodindex',
+        'printindex':      '\\printindex',
+    }
+
+    def __init__(self, document, builder):
+        nodes.NodeVisitor.__init__(self, document)
+        self.builder = builder
+        self.body = []
+
+        # sort out some elements
+        papersize = builder.config.latex_paper_size + 'paper'
+        if papersize == 'paper': # e.g. command line "-D latex_paper_size="
+            papersize = 'letterpaper'
+
+        self.elements = self.default_elements.copy()
+        self.elements.update({
+            'docclass':     document.settings.docclass,
+            'papersize':    papersize,
+            'pointsize':    builder.config.latex_font_size,
+            # if empty, the title is set to the first section title
+            'title':        document.settings.title,
+            'date':         ustrftime(builder.config.today_fmt or _('%B %d, %Y')),
+            'release':      builder.config.release,
+            'author':       document.settings.author,
+            'releasename':  _('Release'),
+            'preamble':     builder.config.latex_preamble,
+            'modindexname': _('Module Index'),
+            'indexname':    _('Index'),
+        })
+        if builder.config.latex_logo:
+            self.elements['logo'] = '\\includegraphics{%s}\\par' % \
+                                    path.basename(builder.config.latex_logo)
+        if builder.config.language:
+            babel = ExtBabel(builder.config.language)
+            lang = babel.get_language()
+            if lang:
+                self.elements['classoptions'] += ',' + babel.get_language()
+            else:
+                self.builder.warn('no Babel option known for language %r' %
+                                  builder.config.language)
+            self.elements['shorthandoff'] = babel.get_shorthandoff()
+            self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}'
+        else:
+            self.elements['classoptions'] += ',english'
+        if not builder.config.latex_use_modindex:
+            self.elements['makemodindex'] = ''
+            self.elements['printmodindex'] = ''
+        # allow the user to override them all
+        self.elements.update(builder.config.latex_elements)
+
+        self.highlighter = highlighting.PygmentsBridge(
+            'latex', builder.config.pygments_style)
+        self.context = []
+        self.descstack = []
+        self.bibitems = []
+        self.table = None
+        self.next_table_colspec = None
+        self.highlightlang = builder.config.highlight_language
+        self.highlightlinenothreshold = sys.maxint
+        self.written_ids = set()
+        self.footnotestack = []
+        if self.elements['docclass'] == 'manual':
+            if builder.config.latex_use_parts:
+                self.top_sectionlevel = 0
+            else:
+                self.top_sectionlevel = 1
+        else:
+            self.top_sectionlevel = 2
+        self.next_section_target = None
+        # flags
+        self.verbatim = None
+        self.in_title = 0
+        self.in_production_list = 0
+        self.first_document = 1
+        self.this_is_the_title = 1
+        self.literal_whitespace = 0
+        self.no_contractions = 0
+
+    def astext(self):
+        return (HEADER % self.elements + self.highlighter.get_stylesheet() +
+                u''.join(self.body) + FOOTER % self.elements)
+
+    def visit_document(self, node):
+        self.footnotestack.append(self.collect_footnotes(node))
+        if self.first_document == 1:
+            # the first document is all the regular content ...
+            self.body.append(BEGIN_DOC % self.elements)
+            self.first_document = 0
+        elif self.first_document == 0:
+            # ... and all others are the appendices
+            self.body.append('\n\\appendix\n')
+            self.first_document = -1
+        # "- 1" because the level is increased before the title is visited
+        self.sectionlevel = self.top_sectionlevel - 1
+    def depart_document(self, node):
+        if self.bibitems:
+            widest_label = ""
+            for bi in self.bibitems:
+                if len(widest_label) < len(bi[0]):
+                    widest_label = bi[0]
+            self.body.append('\n\\begin{thebibliography}{%s}\n' % widest_label)
+            for bi in self.bibitems:
+                # cite_key: underscores must not be escaped
+                cite_key = bi[0].replace(r"\_", "_")
+                self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+            self.body.append('\\end{thebibliography}\n')
+            self.bibitems = []
+
+    def visit_start_of_file(self, node):
+        # This marks the begin of a new file; therefore the current module and
+        # class must be reset
+        self.body.append('\n\\resetcurrentobjects\n')
+        # and also, new footnotes
+        self.footnotestack.append(self.collect_footnotes(node))
+
+    def collect_footnotes(self, node):
+        fnotes = {}
+        def footnotes_under(n):
+            if isinstance(n, nodes.footnote):
+                yield n
+            else:
+                for c in n.children:
+                    if isinstance(c, addnodes.start_of_file):
+                        continue
+                    for k in footnotes_under(c):
+                        yield k
+        for fn in footnotes_under(node):
+            num = fn.children[0].astext().strip()
+            fnotes[num] = fn
+            fn.parent.remove(fn)
+        return fnotes
+
+    def depart_start_of_file(self, node):
+        self.footnotestack.pop()
+
+    def visit_highlightlang(self, node):
+        self.highlightlang = node['lang']
+        self.highlightlinenothreshold = node['linenothreshold']
+        raise nodes.SkipNode
+
+    def visit_section(self, node):
+        if not self.this_is_the_title:
+            self.sectionlevel += 1
+        self.body.append('\n\n')
+        if self.next_section_target:
+            self.body.append(r'\hypertarget{%s}{}' % self.next_section_target)
+            self.next_section_target = None
+        #if node.get('ids'):
+        #    for id in node['ids']:
+        #        if id not in self.written_ids:
+        #            self.body.append(r'\hypertarget{%s}{}' % id)
+        #            self.written_ids.add(id)
+    def depart_section(self, node):
+        self.sectionlevel = max(self.sectionlevel - 1, self.top_sectionlevel - 1)
+
+    def visit_problematic(self, node):
+        self.body.append(r'{\color{red}\bfseries{}')
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_topic(self, node):
+        self.body.append('\\setbox0\\vbox{\n'
+                         '\\begin{minipage}{0.95\\textwidth}\n')
+    def depart_topic(self, node):
+        self.body.append('\\end{minipage}}\n'
+                         '\\begin{center}\\setlength{\\fboxsep}{5pt}'
+                         '\\shadowbox{\\box0}\\end{center}\n')
+    visit_sidebar = visit_topic
+    depart_sidebar = depart_topic
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_productionlist(self, node):
+        self.body.append('\n\n\\begin{productionlist}\n')
+        self.in_production_list = 1
+    def depart_productionlist(self, node):
+        self.body.append('\\end{productionlist}\n\n')
+        self.in_production_list = 0
+
+    def visit_production(self, node):
+        if node['tokenname']:
+            self.body.append('\\production{%s}{' % self.encode(node['tokenname']))
+        else:
+            self.body.append('\\productioncont{')
+    def depart_production(self, node):
+        self.body.append('}\n')
+
+    def visit_transition(self, node):
+        self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n')
+    def depart_transition(self, node):
+        pass
+
+    def visit_title(self, node):
+        parent = node.parent
+        if isinstance(parent, addnodes.seealso):
+            # the environment already handles this
+            raise nodes.SkipNode
+        elif self.this_is_the_title:
+            if len(node.children) != 1 and not isinstance(node.children[0], nodes.Text):
+                self.builder.warn('document title is not a single Text node')
+            if not self.elements['title']:
+                # text needs to be escaped since it is inserted into
+                # the output literally
+                self.elements['title'] = node.astext().translate(tex_escape_map)
+            self.this_is_the_title = 0
+            raise nodes.SkipNode
+        elif isinstance(parent, nodes.section):
+            try:
+                self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel])
+            except IndexError:
+                from sphinx.application import SphinxError
+                raise SphinxError('too many nesting section levels for LaTeX, '
+                                  'at heading: %s' % node.astext())
+            self.context.append('}\n')
+        elif isinstance(parent, (nodes.topic, nodes.sidebar)):
+            self.body.append(r'\textbf{')
+            self.context.append('}\n\n\medskip\n\n')
+        elif isinstance(parent, nodes.Admonition):
+            self.body.append('{')
+            self.context.append('}\n')
+        elif isinstance(parent, nodes.table):
+            self.table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        else:
+            self.builder.warn('encountered title node not in section, topic, '
+                              'table, admonition or sidebar')
+            self.body.append('\\textbf{')
+            self.context.append('}\n')
+        self.in_title = 1
+    def depart_title(self, node):
+        self.in_title = 0
+        self.body.append(self.context.pop())
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        else:
+            self.context.append('')
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    desc_map = {
+        'function' : 'funcdesc',
+        'class': 'classdesc',
+        'method': 'methoddesc',
+        'staticmethod': 'staticmethoddesc',
+        'exception': 'excdesc',
+        'data': 'datadesc',
+        'attribute': 'memberdesc',
+        'opcode': 'opcodedesc',
+
+        'cfunction': 'cfuncdesc',
+        'cmember': 'cmemberdesc',
+        'cmacro': 'csimplemacrodesc',
+        'ctype': 'ctypedesc',
+        'cvar': 'cvardesc',
+
+        'describe': 'describe',
+        # and all others are 'describe' too
+    }
+
+    def visit_desc(self, node):
+        self.descstack.append(Desc(node))
+    def depart_desc(self, node):
+        d = self.descstack.pop()
+        self.body.append("\\end{%s}\n" % d.env)
+
+    def visit_desc_signature(self, node):
+        d = self.descstack[-1]
+        # reset these for every signature
+        d.type = d.cls = d.name = d.params = ''
+    def depart_desc_signature(self, node):
+        d = self.descstack[-1]
+        d.cls = d.cls.rstrip('.')
+        if node.parent['desctype'] != 'describe' and node['ids']:
+            hyper = '\\hypertarget{%s}{}' % node['ids'][0]
+        else:
+            hyper = ''
+        if d.count == 0:
+            t1 = "\n\n%s\\begin{%s}" % (hyper, d.env)
+        else:
+            t1 = "\n%s\\%sline" % (hyper, d.env[:-4])
+        d.count += 1
+        if d.env in ('funcdesc', 'classdesc', 'excclassdesc'):
+            t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env in ('datadesc', 'excdesc', 'csimplemacrodesc'):
+            t2 = "{%s}" % (d.name)
+        elif d.env in ('methoddesc', 'staticmethoddesc'):
+            if d.cls:
+                t2 = "[%s]{%s}{%s}" % (d.cls, d.name, d.params)
+            else:
+                t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env == 'memberdesc':
+            if d.cls:
+                t2 = "[%s]{%s}" % (d.cls, d.name)
+            else:
+                t2 = "{%s}" % d.name
+        elif d.env == 'cfuncdesc':
+            if d.cls:
+                # C++ class names
+                d.name = '%s::%s' % (d.cls, d.name)
+            t2 = "{%s}{%s}{%s}" % (d.type, d.name, d.params)
+        elif d.env == 'cmemberdesc':
+            try:
+                type, container = d.type.rsplit(' ', 1)
+                container = container.rstrip('.')
+            except ValueError:
+                container = ''
+                type = d.type
+            t2 = "{%s}{%s}{%s}" % (container, type, d.name)
+        elif d.env == 'cvardesc':
+            t2 = "{%s}{%s}" % (d.type, d.name)
+        elif d.env == 'ctypedesc':
+            t2 = "{%s}" % (d.name)
+        elif d.env == 'opcodedesc':
+            t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env == 'describe':
+            t2 = "{%s}" % d.name
+        self.body.append(t1 + t2)
+
+    def visit_desc_type(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].type = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_name(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].name = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_addname(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].cls = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_parameterlist(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].params = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_annotation(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].annotation = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_refcount(self, node):
+        self.body.append("\\emph{")
+    def depart_refcount(self, node):
+        self.body.append("}\\\\")
+
+    def visit_desc_content(self, node):
+        if node.children and not isinstance(node.children[0], nodes.paragraph):
+            # avoid empty desc environment which causes a formatting bug
+            self.body.append('~')
+    def depart_desc_content(self, node):
+        pass
+
+    def visit_seealso(self, node):
+        self.body.append("\n\n\\strong{%s:}\n\n" % admonitionlabels['seealso'])
+    def depart_seealso(self, node):
+        self.body.append("\n\n")
+
+    def visit_rubric(self, node):
+        if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
+            raise nodes.SkipNode
+        self.body.append('\\paragraph{')
+        self.context.append('}\n')
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_footnote(self, node):
+        pass
+    def depart_footnote(self, node):
+        pass
+
+    def visit_label(self, node):
+        if isinstance(node.parent, nodes.citation):
+            self.bibitems[-1][0] = node.astext()
+        raise nodes.SkipNode
+
+    def visit_tabular_col_spec(self, node):
+        self.next_table_colspec = node['spec']
+        raise nodes.SkipNode
+
+    def visit_table(self, node):
+        if self.table:
+            raise NotImplementedError('Nested tables are not supported.')
+        self.table = Table()
+        self.tablebody = []
+        # Redirect body output until table is finished.
+        self._body = self.body
+        self.body = self.tablebody
+    def depart_table(self, node):
+        self.body = self._body
+        if self.table.caption is not None:
+            self.body.append('\n\\begin{threeparttable}\n'
+                             '\\caption{%s}\n' % self.table.caption)
+        if self.table.has_verbatim:
+            self.body.append('\n\\begin{tabular}')
+        else:
+            self.body.append('\n\\begin{tabulary}{\\textwidth}')
+        if self.table.colspec:
+            self.body.append(self.table.colspec)
+        else:
+            if self.table.has_verbatim:
+                colwidth = 0.95 / self.table.colcount
+                colspec = ('p{%.3f\\textwidth}|' % colwidth) * self.table.colcount
+                self.body.append('{|' + colspec + '}\n')
+            else:
+                self.body.append('{|' + ('L|' * self.table.colcount) + '}\n')
+        self.body.extend(self.tablebody)
+        if self.table.has_verbatim:
+            self.body.append('\\end{tabular}\n\n')
+        else:
+            self.body.append('\\end{tabulary}\n\n')
+        if self.table.caption is not None:
+            self.body.append('\\end{threeparttable}\n\n')
+        self.table = None
+        self.tablebody = None
+
+    def visit_colspec(self, node):
+        self.table.colcount += 1
+    def depart_colspec(self, node):
+        pass
+
+    def visit_tgroup(self, node):
+        pass
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        if self.next_table_colspec:
+            self.table.colspec = '{%s}\n' % self.next_table_colspec
+        self.next_table_colspec = None
+        self.body.append('\\hline\n')
+        self.table.had_head = True
+    def depart_thead(self, node):
+        self.body.append('\\hline\n')
+
+    def visit_tbody(self, node):
+        if not self.table.had_head:
+            self.visit_thead(node)
+    def depart_tbody(self, node):
+        self.body.append('\\hline\n')
+
+    def visit_row(self, node):
+        self.table.col = 0
+    def depart_row(self, node):
+        self.body.append('\\\\\n')
+
+    def visit_entry(self, node):
+        if node.has_key('morerows') or node.has_key('morecols'):
+            raise NotImplementedError('Column or row spanning cells are '
+                                      'not implemented.')
+        if self.table.col > 0:
+            self.body.append(' & ')
+        self.table.col += 1
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header
+
+    def visit_acks(self, node):
+        # this is a list in the source, but should be rendered as a
+        # comma-separated list here
+        self.body.append('\n\n')
+        self.body.append(', '.join(n.astext() for n in node.children[0].children) + '.')
+        self.body.append('\n\n')
+        raise nodes.SkipNode
+
+    def visit_bullet_list(self, node):
+        self.body.append('\\begin{itemize}\n' )
+    def depart_bullet_list(self, node):
+        self.body.append('\\end{itemize}\n' )
+
+    def visit_enumerated_list(self, node):
+        self.body.append('\\begin{enumerate}\n' )
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{enumerate}\n' )
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append(r'\item {} ')
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_definition_list(self, node):
+        self.body.append('\\begin{description}\n')
+    def depart_definition_list(self, node):
+        self.body.append('\\end{description}\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        ctx = ']'
+        if node.has_key('ids') and node['ids']:
+            ctx += '\\hypertarget{%s}{}' % node['ids'][0]
+        self.body.append('\\item[')
+        self.context.append(ctx)
+    def depart_term(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_classifier(self, node):
+        self.body.append('{[}')
+    def depart_classifier(self, node):
+        self.body.append('{]}')
+
+    def visit_definition(self, node):
+        pass
+    def depart_definition(self, node):
+        self.body.append('\n')
+
+    def visit_field_list(self, node):
+        self.body.append('\\begin{quote}\\begin{description}\n')
+    def depart_field_list(self, node):
+        self.body.append('\\end{description}\\end{quote}\n')
+
+    def visit_field(self, node):
+        pass
+    def depart_field(self, node):
+        pass
+
+    visit_field_name = visit_term
+    depart_field_name = depart_term
+
+    visit_field_body = visit_definition
+    depart_field_body = depart_definition
+
+    def visit_paragraph(self, node):
+        self.body.append('\n')
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_centered(self, node):
+        self.body.append('\n\\begin{centering}')
+    def depart_centered(self, node):
+        self.body.append('\n\\end{centering}')
+
+    def visit_module(self, node):
+        modname = node['modname']
+        self.body.append('\n\\declaremodule[%s]{}{%s}' % (modname.replace('_', ''),
+                                                          self.encode(modname)))
+        self.body.append('\n\\modulesynopsis{%s}' % self.encode(node['synopsis']))
+        if node.has_key('platform'):
+            self.body.append('\\platform{%s}' % self.encode(node['platform']))
+    def depart_module(self, node):
+        pass
+
+    def latex_image_length(self, width_str):
+        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+        if not match:
+            # fallback
+            return width_str
+        res = width_str
+        amount, unit = match.groups()[:2]
+        if not unit or unit == "px":
+            # pixels: let LaTeX alone
+            return None
+        elif unit == "%":
+            res = "%.3f\\linewidth" % (float(amount) / 100.0)
+        return res
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = []
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            w = self.latex_image_length(attrs['width'])
+            if w:
+                include_graphics_options.append('width=%s' % w)
+        if attrs.has_key('height'):
+            h = self.latex_image_length(attrs['height'])
+            if h:
+                include_graphics_options.append('height=%s' % h)
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        if node['uri'] in self.builder.images:
+            uri = self.builder.images[node['uri']]
+        else:
+            # missing image!
+            if self.ignore_missing_images:
+                return
+            uri = node['uri']
+        if uri.find('://') != -1:
+            # ignore remote images
+            return
+        self.body.extend(pre)
+        options = ''
+        if include_graphics_options:
+            options = '[%s]' % ','.join(include_graphics_options)
+        self.body.append('\\includegraphics%s{%s}' % (options, uri))
+        self.body.extend(post)
+    def depart_image(self, node):
+        pass
+
+    def visit_figure(self, node):
+        if (not node.attributes.has_key('align') or
+            node.attributes['align'] == 'center'):
+            # centering does not add vertical space like center.
+            align = '\n\\centering'
+            align_end = ''
+        else:
+            # TODO non vertical space for other alignments.
+            align = '\\begin{flush%s}' % node.attributes['align']
+            align_end = '\\end{flush%s}' % node.attributes['align']
+        self.body.append('\\begin{figure}[htbp]%s\n' % align)
+        self.context.append('%s\\end{figure}\n' % align_end)
+    def depart_figure(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_caption(self, node):
+        self.body.append('\\caption{')
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_admonition(self, node):
+        self.body.append('\n\\begin{notice}{note}')
+    def depart_admonition(self, node):
+        self.body.append('\\end{notice}\n')
+
+    def _make_visit_admonition(name):
+        def visit_admonition(self, node):
+            self.body.append('\n\\begin{notice}{%s}{%s:}' %
+                             (name, admonitionlabels[name]))
+        return visit_admonition
+    def _depart_named_admonition(self, node):
+        self.body.append('\\end{notice}\n')
+
+    visit_attention = _make_visit_admonition('attention')
+    depart_attention = _depart_named_admonition
+    visit_caution = _make_visit_admonition('caution')
+    depart_caution = _depart_named_admonition
+    visit_danger = _make_visit_admonition('danger')
+    depart_danger = _depart_named_admonition
+    visit_error = _make_visit_admonition('error')
+    depart_error = _depart_named_admonition
+    visit_hint = _make_visit_admonition('hint')
+    depart_hint = _depart_named_admonition
+    visit_important = _make_visit_admonition('important')
+    depart_important = _depart_named_admonition
+    visit_note = _make_visit_admonition('note')
+    depart_note = _depart_named_admonition
+    visit_tip = _make_visit_admonition('tip')
+    depart_tip = _depart_named_admonition
+    visit_warning = _make_visit_admonition('warning')
+    depart_warning = _depart_named_admonition
+
+    def visit_versionmodified(self, node):
+        intro = versionlabels[node['type']] % node['version']
+        if node.children:
+            intro += ': '
+        else:
+            intro += '.'
+        self.body.append(intro)
+    def depart_versionmodified(self, node):
+        pass
+
+    def visit_target(self, node):
+        def add_target(id):
+            # indexing uses standard LaTeX index markup, so the targets
+            # will be generated differently
+            if not id.startswith('index-'):
+                self.body.append(r'\hypertarget{%s}{}' % id)
+
+        if node.has_key('refid') and node['refid'] not in self.written_ids:
+            parindex = node.parent.index(node)
+            try:
+                next = node.parent[parindex+1]
+                if isinstance(next, nodes.section):
+                    self.next_section_target = node['refid']
+                    return
+            except IndexError:
+                pass
+            add_target(node['refid'])
+            self.written_ids.add(node['refid'])
+    def depart_target(self, node):
+        pass
+
+    def visit_attribution(self, node):
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append('---')
+    def depart_attribution(self, node):
+        self.body.append('\n\\end{flushright}\n')
+
+    def visit_index(self, node, scre=re.compile(r';\s*')):
+        entries = node['entries']
+        for type, string, tid, _ in entries:
+            if type == 'single':
+                self.body.append(r'\index{%s}' % scre.sub('!', self.encode(string)))
+            elif type == 'pair':
+                parts = tuple(self.encode(x.strip()) for x in string.split(';', 1))
+                try:
+                    self.body.append(r'\indexii{%s}{%s}' % parts)
+                except TypeError:
+                    self.builder.warn('invalid pair index entry %r' % string)
+            elif type == 'triple':
+                parts = tuple(self.encode(x.strip()) for x in string.split(';', 2))
+                try:
+                    self.body.append(r'\indexiii{%s}{%s}{%s}' % parts)
+                except TypeError:
+                    self.builder.warn('invalid triple index entry %r' % string)
+            else:
+                self.builder.warn('unknown index entry type %s found' % type)
+        raise nodes.SkipNode
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        uri = node.get('refuri', '')
+        if self.in_title or not uri:
+            self.context.append('')
+        elif uri.startswith('mailto:') or uri.startswith('http:') or \
+             uri.startswith('https:') or uri.startswith('ftp:'):
+            self.body.append('\\href{%s}{' % self.encode(uri))
+            self.context.append('}')
+        elif uri.startswith('#'):
+            self.body.append('\\hyperlink{%s}{' % uri[1:])
+            self.context.append('}')
+        elif uri.startswith('@token'):
+            if self.in_production_list:
+                self.body.append('\\token{')
+            else:
+                self.body.append('\\grammartoken{')
+            self.context.append('}')
+        else:
+            self.builder.warn('unusable reference target found: %s' % uri)
+            self.context.append('')
+    def depart_reference(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_pending_xref(self, node):
+        pass
+    def depart_pending_xref(self, node):
+        pass
+
+    def visit_emphasis(self, node):
+        self.body.append(r'\emph{')
+    def depart_emphasis(self, node):
+        self.body.append('}')
+
+    def visit_literal_emphasis(self, node):
+        self.body.append(r'\emph{\texttt{')
+        self.no_contractions += 1
+    def depart_literal_emphasis(self, node):
+        self.body.append('}}')
+        self.no_contractions -= 1
+
+    def visit_strong(self, node):
+        self.body.append(r'\textbf{')
+    def depart_strong(self, node):
+        self.body.append('}')
+
+    def visit_title_reference(self, node):
+        self.body.append(r'\emph{')
+    def depart_title_reference(self, node):
+        self.body.append('}')
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        self.bibitems.append(['', ''])
+        self.context.append(len(self.body))
+    def depart_citation(self, node):
+        size = self.context.pop()
+        text = ''.join(self.body[size:])
+        del self.body[size:]
+        self.bibitems[-1][1] = text
+
+    def visit_citation_reference(self, node):
+        citeid = node.astext()
+        self.body.append('\\cite{%s}' % citeid)
+        raise nodes.SkipNode
+
+    def visit_literal(self, node):
+        content = self.encode(node.astext().strip())
+        if self.in_title:
+            self.body.append(r'\texttt{%s}' % content)
+        elif node.has_key('role') and node['role'] == 'samp':
+            self.body.append(r'\samp{%s}' % content)
+        else:
+            self.body.append(r'\code{%s}' % content)
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        num = node.astext().strip()
+        try:
+            fn = self.footnotestack[-1][num]
+        except (KeyError, IndexError):
+            raise nodes.SkipNode
+        self.body.append('\\footnote{')
+        fn.walkabout(self)
+        raise nodes.SkipChildren
+    def depart_footnote_reference(self, node):
+        self.body.append('}')
+
+    def visit_literal_block(self, node):
+        self.verbatim = ''
+    def depart_literal_block(self, node):
+        code = self.verbatim.rstrip('\n')
+        lang = self.highlightlang
+        linenos = code.count('\n') >= self.highlightlinenothreshold - 1
+        if node.has_key('language'):
+            # code-block directives
+            lang = node['language']
+        if node.has_key('linenos'):
+            linenos = node['linenos']
+        hlcode = self.highlighter.highlight_block(code, lang, linenos)
+        # workaround for Unicode issue
+        hlcode = hlcode.replace(u'€', u'@texteuro[]')
+        # must use original Verbatim environment and "tabular" environment
+        if self.table:
+            hlcode = hlcode.replace('\\begin{Verbatim}',
+                                    '\\begin{OriginalVerbatim}')
+            self.table.has_verbatim = True
+        # get consistent trailer
+        hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim}
+        hlcode = hlcode.rstrip() + '\n'
+        self.body.append('\n' + hlcode + '\\end{%sVerbatim}\n' %
+                         (self.table and 'Original' or ''))
+        self.verbatim = None
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    def visit_line_block(self, node):
+        """line-block:
+        * whitespace (including linebreaks) is significant
+        * inline markup is supported.
+        * serif typeface
+        """
+        self.body.append('{\\raggedright{}')
+        self.literal_whitespace = 1
+    def depart_line_block(self, node):
+        self.literal_whitespace = 0
+        # remove the last \\
+        del self.body[-1]
+        self.body.append('}\n')
+
+    def visit_line(self, node):
+        self._line_start = len(self.body)
+    def depart_line(self, node):
+        if self._line_start == len(self.body):
+            # no output in this line -- add a nonbreaking space, else the
+            # \\ command will give an error
+            self.body.append('~')
+        if self.table is not None:
+            self.body.append('\\newline\n')
+        else:
+            self.body.append('\\\\\n')
+
+    def visit_block_quote(self, node):
+        # If the block quote contains a single object and that object
+        # is a list, then generate a list not a block quote.
+        # This lets us indent lists.
+        done = 0
+        if len(node.children) == 1:
+            child = node.children[0]
+            if isinstance(child, nodes.bullet_list) or \
+                    isinstance(child, nodes.enumerated_list):
+                done = 1
+        if not done:
+            self.body.append('\\begin{quote}\n')
+    def depart_block_quote(self, node):
+        done = 0
+        if len(node.children) == 1:
+            child = node.children[0]
+            if isinstance(child, nodes.bullet_list) or \
+                    isinstance(child, nodes.enumerated_list):
+                done = 1
+        if not done:
+            self.body.append('\\end{quote}\n')
+
+    # option node handling copied from docutils' latex writer
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+    def depart_option(self, node):
+        # flag that the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.body.append('\\item [')
+        # flag for first option
+        self.context.append(0)
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.body.append('] ')
+
+    def visit_option_list(self, node):
+        self.body.append('\\begin{optionlist}{3cm}\n')
+    def depart_option_list(self, node):
+        self.body.append('\\end{optionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ostring = node.astext()
+        self.body.append(self.encode(ostring.replace('--', u'-{-}')))
+        raise nodes.SkipNode
+
+    def visit_description(self, node):
+        self.body.append( ' ' )
+    def depart_description(self, node):
+        pass
+
+    def visit_superscript(self, node):
+        self.body.append('$^{\\text{')
+    def depart_superscript(self, node):
+        self.body.append('}}$')
+
+    def visit_subscript(self, node):
+        self.body.append('$_{\\text{')
+    def depart_subscript(self, node):
+        self.body.append('}}$')
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_generated(self, node):
+        pass
+    def depart_generated(self, node):
+        pass
+
+    def visit_compound(self, node):
+        pass
+    def depart_compound(self, node):
+        pass
+
+    def visit_container(self, node):
+        pass
+    def depart_container(self, node):
+        pass
+
+    def visit_decoration(self, node):
+        pass
+    def depart_decoration(self, node):
+        pass
+
+    # text handling
+
+    def encode(self, text):
+        text = unicode(text).translate(tex_escape_map)
+        if self.literal_whitespace:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace(u'\n', u'~\\\\\n').replace(u' ', u'~')
+        if self.no_contractions:
+            text = text.replace('--', u'-{-}')
+        return text
+
+    def visit_Text(self, node):
+        if self.verbatim is not None:
+            self.verbatim += node.astext()
+        else:
+            text = self.encode(node.astext())
+            self.body.append(educateQuotesLatex(text))
+    def depart_Text(self, node):
+        pass
+
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    def visit_meta(self, node):
+        # only valid for HTML
+        raise nodes.SkipNode
+
+    def visit_system_message(self, node):
+        pass
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.linkcheck
+    ~~~~~~~~~~~~~~~~
+
+    The CheckExternalLinksBuilder class.
+
+    :copyright: 2008 by Georg Brandl, Thomas Lamb.
+    :license: BSD.
+"""
+
+import socket
+from os import path
+from urllib2 import build_opener, HTTPError
+
+from docutils import nodes
+
+from sphinx.builder import Builder
+from sphinx.util.console import purple, red, darkgreen
+
+# create an opener that will simulate a browser user-agent
+opener = build_opener()
+opener.addheaders = [('User-agent', 'Mozilla/5.0')]
+
+
+class CheckExternalLinksBuilder(Builder):
+    """
+    Checks for broken external links.
+    """
+    name = 'linkcheck'
+
+    def init(self):
+        self.good = set()
+        self.broken = {}
+        self.redirected = {}
+        # set a timeout for non-responding servers
+        socket.setdefaulttimeout(5.0)
+        # create output file
+        open(path.join(self.outdir, 'output.txt'), 'w').close()
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def get_outdated_docs(self):
+        return self.env.found_docs
+
+    def prepare_writing(self, docnames):
+        return
+
+    def write_doc(self, docname, doctree):
+        self.info()
+        for node in doctree.traverse(nodes.reference):
+            try:
+                self.check(node, docname)
+            except KeyError:
+                continue
+
+    def check(self, node, docname):
+        uri = node['refuri']
+
+        if '#' in uri:
+            uri = uri.split('#')[0]
+
+        if uri in self.good:
+            return
+
+        lineno = None
+        while lineno is None and node:
+            node = node.parent
+            lineno = node.line
+
+        if uri[0:5] == 'http:' or uri[0:6] == 'https:':
+            self.info(uri, nonl=1)
+
+            if uri in self.broken:
+                (r, s) = self.broken[uri]
+            elif uri in self.redirected:
+                (r, s) = self.redirected[uri]
+            else:
+                (r, s) = self.resolve(uri)
+
+            if r == 0:
+                self.info(' - ' + darkgreen('working'))
+                self.good.add(uri)
+            elif r == 2:
+                self.info(' - ' + red('broken: ') + s)
+                self.write_entry('broken', docname, lineno, uri + ': ' + s)
+                self.broken[uri] = (r, s)
+                if self.app.quiet:
+                    self.warn('%s:%s: broken link: %s' % (docname, lineno, uri))
+            else:
+                self.info(' - ' + purple('redirected') + ' to ' + s)
+                self.write_entry('redirected', docname, lineno, uri + ' to ' + s)
+                self.redirected[uri] = (r, s)
+        elif len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:':
+            return
+        else:
+            self.warn(uri + ' - ' + red('malformed!'))
+            self.write_entry('malformed', docname, lineno, uri)
+            if self.app.quiet:
+                self.warn('%s:%s: malformed link: %s' % (docname, lineno, uri))
+            self.app.statuscode = 1
+
+        if self.broken:
+            self.app.statuscode = 1
+
+    def write_entry(self, what, docname, line, uri):
+        output = open(path.join(self.outdir, 'output.txt'), 'a')
+        output.write("%s:%s: [%s] %s\n" % (self.env.doc2path(docname, None),
+                                           line, what, uri))
+        output.close()
+
+    def resolve(self, uri):
+        try:
+            f = opener.open(uri)
+            f.close()
+        except HTTPError, err:
+            #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'):
+            #    # Wikipedia blocks requests from urllib User-Agent
+            #    return (0, 0)
+            return (2, str(err))
+        except Exception, err:
+            return (2, str(err))
+        if f.url.rstrip('/') == uri.rstrip('/'):
+            return (0, 0)
+        else:
+            return (1, f.url)
+
+    def finish(self):
+        return
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.locale
+    ~~~~~~~~~~~~~
+
+    Locale utilities.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+_ = lambda x: x
+
+admonitionlabels = {
+    'attention': _('Attention'),
+    'caution':   _('Caution'),
+    'danger':    _('Danger'),
+    'error':     _('Error'),
+    'hint':      _('Hint'),
+    'important': _('Important'),
+    'note':      _('Note'),
+    'seealso':   _('See Also'),
+    'tip':       _('Tip'),
+    'warning':   _('Warning'),
+}
+
+versionlabels = {
+    'versionadded':   _('New in version %s'),
+    'versionchanged': _('Changed in version %s'),
+    'deprecated':     _('Deprecated since version %s'),
+}
+
+pairindextypes = {
+    'module':    _('module'),
+    'keyword':   _('keyword'),
+    'operator':  _('operator'),
+    'object':    _('object'),
+    'exception': _('exception'),
+    'statement': _('statement'),
+    'builtin':   _('built-in function'),
+}
+
+del _
+
+def init():
+    for dct in (admonitionlabels, versionlabels, pairindextypes):
+        for key in dct:
+            dct[key] = _(dct[key])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modul", "Preparing search...": "", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "hledej", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "", "Search Results": "V\u00fdsledky hled\u00e1n\u00ed"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,604 @@
+# Czech translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-10 11:43+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Pavel Kosina <pavel.kosina@gmail.com>\n"
+"Language-Team: Pavel Kosina <pavel.kosina@gmail.com>\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Rejstřík indexů"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "moduly"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "další"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "předchozí"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Vestavěné funkce"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Úroveň modulů"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+#, fuzzy
+msgid "Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+#, fuzzy
+msgid "Search Page"
+msgstr "Vyhledávací stránka"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Trvalý odkaz na tuto definici"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Trvalý odkaz na tento nadpis"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Vydání"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "promměná prostředí, %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[obrázek]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vestavěná funkce)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s() (vestavěná proměnná)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s() (vestavěná proměnná)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s() (třída v %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (metoda %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metoda %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (statická metoda %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statická metoda %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s() (atribut %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s() (atribut %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkce)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (Älen C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C typ)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C proměnná)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Vyvolá"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Proměnná"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Vrací"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Typ navrácené hodnoty"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sparametry příkazového řádku; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformy: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor sekce: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor modulu: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Viz také"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Výstraha"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Upozornění"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "NebezpeÄí"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Chyba"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Rada"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Důležité"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Poznámka"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Viz také"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Varování"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nové ve verzi %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Změněno ve verzi %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastaralé od verze %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "modul"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "klíÄové slovo"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operátor"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "výjimka"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "příkaz"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "vestavěná funkce"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+#, fuzzy
+msgid "Searching"
+msgstr "hledej"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "modul"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Výsledky hledání"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Přehled"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Rejstříky a tabulky:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Celkový obsah"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "seznam všech sekcí a podsekcí"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "prohledej tuto dokumentaci"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "rychlý přístup ke všem modulům"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "všechny funkce, třídy, termíny"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Plný index na jedné stránce"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Index podle písmene"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "může být obrovský"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigace"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Obsah"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Přechozí téma"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "předchozí kapitola"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Další téma"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "další kapitola"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Tato stránka"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Návrh změnu"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Ukázat zdroj"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Rychlé vyhledávání"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Hledání dle klíÄe"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "hledej"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Zadej jméno modulu, třídy nebo funkce."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Hledání uvnitř %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O těchto dokumentech"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Hledání"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Veškerá práva vyhrazena"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Naposledy aktualizováno dne %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Vytvořeno pomocí <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Nejpopulárnější moduly:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Zobrazit moduly dostupné na této platformě"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Zastaralé"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Prohledat %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Poznámka:</strong> Stránka, kterou hledáte, "
+"neexistuje.<br>Snažili jsme se najít nové umístění této stránky, ale "
+"nepovedlo se."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Toto je vyhledávací stránka. Zadejte klíÄová slova    do pole níže a "
+"klikněte na \"hledej\". \n"
+"Prohledávání funkcí  hledá automaticky všechna slova. Stránky obsahující"
+"    slov méně, nebudou nalezeny."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "hledej"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Nic jsme nenašli."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Změny ve verzi %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaticky generovaný seznam změn ve verzi %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Změny v knihovnách"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Změny API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostatní změny"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": "", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,601 @@
+# German translations for Sphinx.
+# Copyright (C) 2008 Translators.
+# This file is distributed under the same license as the Sphinx project.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-07 21:40+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Horst Gutmann <zerok@zerokspot.com>\n"
+"Language-Team: de <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d. %m. %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Allgemeiner Index"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Globaler Modulindex"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "Module"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "weiter"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "zurück"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Modulebene"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d. %m. %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Stichwortverzeichnis"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Suche"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Permalink zu dieser Definition"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Permalink zu dieser Ãœberschrift"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "Umgebungsvariable; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plattform: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[Bild]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (eingebaute Funktion)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in Modul %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (eingebaute Variable)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in Modul %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (eingebaute Klasse)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (Klasse in %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (Methode von %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (Methode von %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (statische Methode von %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statische Methode von %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (Attribut von %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (Attribut von %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-Funktion)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C-Member)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-Makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C-Typ)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-Variable)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Verursacht:"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Rückgabe"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Rückgabetyp"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parameter"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sKommandozeilenoption; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plattformen: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (Modul)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor des Abschnitts: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor des Moduls: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Siehe auch"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Achtung"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Vorsicht"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Gefahr"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Fehler"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Hinweis"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Wichtig"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Bemerkung"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Siehe auch"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tipp"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Warnung"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Neu in Version %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Geändert in Version %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Veraltet ab Version %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "Module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "Schlüsselwort"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "Operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "Objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "Exception"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "Statement"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "eingebaute Funktion"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Suchergebnisse ausblenden"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Suchen..."
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Suche wird vorbereitet..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "Modul, in "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Suchergebnisse"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig "
+"geschrieben und genügend Kategorien ausgewählt?"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Ãœbersicht"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indizes und Tabellen:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Vollständiges Inhaltsverzeichnis"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Liste aller Kapitel und Unterkapitel"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "Durchsuche diese Dokumentation"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "Schneller Zugriff auf alle Module"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "Alle Funktionen, Klassen, Begriffe"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Stichwortverzeichnis &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Gesamtes Stichwortverzeichnis auf einer Seite"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Stichwortverzeichnis nach Anfangsbuchstabe"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "kann groß sein"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Inhalt"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Vorheriges Thema"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "vorheriges Kapitel"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Nächstes Thema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "nächstes Kapitel"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Diese Seite"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Änderung vorschlagen"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Quelltext anzeigen"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Schnellsuche"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Stichwortsuche"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Los"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Gib einen Modul-, Klassen- oder Funktionsnamen an."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Ãœber diese Dokumentation"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Suche"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Zuletzt aktualisiert am %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Mit <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s "
+"erstellt."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Beliebteste Module:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Zeige nur Module, die auf diesen Plattformen verfügbar sind"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Veraltet"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Anmerkung:</strong> Du hast eine nicht länger gültige URL von "
+"diesem Server angefragt. Wir haben versucht dich auf die neue Adresse "
+"dieser Seite umzuleiten, aber dies muss nicht die richtige Seite sein."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Von hier aus kannst du die Dokumentation durchsuchen. Gib deine "
+"Suchbegriffe in das untenstehende Feld ein und klicke auf \"suchen\". "
+"Bitte beachte, dass die Suchfunktion automatisch nach all diesen Worten "
+"suchen wird. Seiten, die nicht alle Worte enthalten, werden nicht in der "
+"Ergebnisliste erscheinen."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "suchen"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Deine Suche ergab leider keine Treffer."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Änderungen in Version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch generierte Liste der Änderungen in Version %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Bibliotheksänderungen"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API-Änderungen"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere Änderungen"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"module, in ": "m\u00f3dulo", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado.  Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Search Results": "Resultados de la b\u00fasqueda"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,611 @@
+# Spanish translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Guillem Borrell <guillem@torroja.dmt.upm.es>\n"
+"Language-Team: es <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Ãndice General"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "siguiente"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+#, fuzzy
+msgid "Builtins"
+msgstr "Funciones de base"
+
+#: sphinx/builder.py:1131
+#, fuzzy
+msgid "Module level"
+msgstr "Módulos"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, fuzzy, python-format
+msgid "%B %d, %Y"
+msgstr "%d de %B de %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Ãndice de Módulos"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Página de Búsqueda"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Enlazar permanentemente con esta definición"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Enlazar permanentemente con este título"
+
+#: sphinx/latexwriter.py:172
+#, fuzzy
+msgid "Release"
+msgstr "Versión"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "variables de entorno; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plataforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[imagen]"
+
+#: sphinx/directives/desc.py:25
+#, fuzzy, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (función de base)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (en el módulo %s)"
+
+#: sphinx/directives/desc.py:29
+#, fuzzy, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (en el módulo %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (clase en %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s método)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s método)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s método estático)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s método estático)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atributo)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributo)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (función C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (miembro C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (tipo C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variable C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Muestra"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Devuelve"
+
+#: sphinx/directives/desc.py:116
+#, fuzzy
+msgid "Return type"
+msgstr "Tipo del argumento devuelto"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parámetros"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sOpciones en línea de comandos; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plataformas:"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor de la sección"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor del módulo"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Ver también"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Atención"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Prudencia"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Peligro"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Error"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Consejo"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Ver También"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Truco"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Advertencia"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nuevo en la versión %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Distinto en la versión %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde la versión %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "palabra clave"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operador"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objeto"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "excepción"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "sentencia"
+
+#: sphinx/locale/__init__.py:40
+#, fuzzy
+msgid "built-in function"
+msgstr "función de base"
+
+#: sphinx/static/doctools.js:174
+#, fuzzy
+msgid "Hide Search Matches"
+msgstr "Coincidencias de la búsqueda"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Buscando"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Preparando la búsqueda"
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "módulo"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Resultados de la búsqueda"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"La búsqueda no dio ningún resultado.  Por favor asegúrese que escribió "
+"todas las palabras correctamente y que ha seleccionado suficientes "
+"categorías"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su"
+" consulta"
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Resumen"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Ãndices y tablas:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Ãndice de contenidos completo"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Muestra todas las secciones"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "buscar en esta documentación"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "acceso rápido a todos los módulos"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "todas las funciones, clases, términos"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Ãndice completo en una página"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Ãndice alfabético"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "puede ser muy grande"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navegación"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Contenidos"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Tema anterior"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Capítulo anterior"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Próximo tema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "Próximo capítulo"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Esta página"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Sugerir una modificación"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Enseñar el código"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Búsqueda rápida"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Búsqueda por palabras clave"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Ir a"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Introducir en nombre de un módulo, clase o función"
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Sobre este documento"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Búsqueda"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Actualizado por última vez en %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Creado con <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Módulos más comunes:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Mostrar sólo los módulos disponibles en estas plataformas"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Nota:</strong> Has solicitado una dirección desactualizada a este"
+" servidor.  Hemos intentado redirigirte a la nueva dirección de la misma "
+"página pero puede no ser la correcta."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Este es el diálogo de búsqueda.  Introduce los términos en el diálogo "
+"siguiente y pulsa \"buscar\".  El asistente buscará automáticamente todas"
+" las palabras.  Las páginas que contengan menos palabras no aparecerán en"
+" la lista de resultados."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "buscar"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Tu consulta no obtuvo ningún resultado"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Cambios en la versión %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de cambios generada automáticamente en la versión %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Cambios en la biblioteca"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Cambios en la API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Otros cambios"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"module, in ": "module, dans", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Search Results": "R\u00e9sultats de la recherche"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,606 @@
+# French translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# David Larlet <larlet@gmail.com>, 2008.
+# Sebastien Douche <sdouche@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: larlet@gmail.com\n"
+"POT-Creation-Date: 2008-08-08 12:39+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Sébastien Douche <sdouche@gmail.com>\n"
+"Language-Team: French Translation Team <sphinx-dev@googlegroups.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Index général"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Index général des modules"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "suivant"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "précédent"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr "(dans"
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Fonctions de base"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Module"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d %B %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Index du module"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Page de recherche"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Lien permanent vers cette définition"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Lien permanent vers ce titre"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Version"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "variable d'environnement; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plateforme : %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (fonction de base)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (dans le module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (dans le module %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe de base)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe dans %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (méthode %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (méthode %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (méthode statique %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (méthode statique %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (attribut %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (attribut %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (fonction C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (membre C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (type C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variable C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Lève"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Retourne"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Type retourné"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Paramètres"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%soption de ligne de commande; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plateformes : "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Auteur de la section : "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Auteur du module : "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Auteur : "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Voir aussi"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "A faire"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(L'entrée orginale se trouve dans %s, à la ligne %d et peut être trouvé"
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "ici"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Attention"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Prudence"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Danger"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Erreur"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Indice"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Note"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Voir aussi"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Astuce"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Warning"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Introduit dans la version %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Modifié dans la version %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsolète depuis la version %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "mot-clé"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "opérateur"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objet"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "exception"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "état"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "fonction de base"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Cacher les résultats de la recherche"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "En cours de recherche"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Préparation de la recherche..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "module, dans"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", dans"
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Résultats de la recherche"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe "
+"des termes de recherche et que vous avez sélectionné suffisamment de "
+"catégories."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Résumé"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indices et tables :"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Table des matières complète"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "lister l'ensemble des sections et sous-sections"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "rechercher dans cette documentation"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "accès rapide à l'ensemble des modules"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "toutes les fonctions, classes, termes"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Index complet sur une seule page"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Indexer les pages par lettre"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "peut être énorme"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Table des matières"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Sujet précédent"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Chapitre précédent"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Sujet suivant"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "Chapitre suivant"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Cette page"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Suggérer une modification"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Montrer la source"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Recherche rapide"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Recherche par mot-clé"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Saisissez un nom de module, classe ou fonction."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Recherchez dans %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "À propos de ces documents"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Recherche"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Mis à jour le %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Créé avec <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Modules les plus utilisés :"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "N'afficher que les modules disponibles sur ces plateformes"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsolète"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Rechercher %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Note :</strong> Vous tentez d'accéder à une ancienne URL de ce "
+"serveur. Nous avons essayé de vous rediriger vers la nouvelle adresse de "
+"cette page, mais ce n'est peut-être pas la bonne."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Vous pouvez effectuer une recherche au sein des documents. Saisissez les "
+"termes\n"
+"    de votre recherche dans le champs ci-dessous et cliquez sur "
+"\"rechercher\". Notez que la fonctionnalité de recherche\n"
+"    va automatique chercher pour tous les mots. Les pages\n"
+"    contenant moins de mots n'apparaîtront pas dans la liste des "
+"résultats."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "rechercher"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Votre recherche n'a retourné aucun résultat"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Modifications dans la version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Liste auto-générée des modifications dans la version %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Modifications de la bibliothèque"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Modifications de l'API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Autres modifications"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"module, in ": "\u30e2\u30b8\u30e5\u30fc\u30eb", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Search Results": "\u691c\u7d22\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,595 @@
+# Japanese translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Yasushi Masuda <whosaysni@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Yasushi MASUDA <whosaysni@gmail.com>\n"
+"Language-Team: ja <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "ç·åˆç´¢å¼•"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "モジュールç·ç´¢å¼•"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "モジュール"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "次ã¸"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "å‰ã¸"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "組ã¿è¾¼ã¿"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "モジュールレベル"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "モジュール索引"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "検索ページ"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "ã“ã®å®šç¾©ã¸ã®ãƒ‘ーマリンク"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "ã“ã®ãƒ˜ãƒƒãƒ‰ãƒ©ã‚¤ãƒ³ã¸ã®ãƒ‘ーマリンク"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "リリース"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境変数; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "プラットフォーム: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[ç”»åƒ]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (組ã¿è¾¼ã¿é–¢æ•°)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s モジュール)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s モジュール)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s ã®ã‚¯ãƒ©ã‚¹)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s ã®é™çš„メソッド)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s ã®é™çš„メソッド)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s ã®å±žæ€§)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s ã®å±žæ€§)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C ã®é–¢æ•°)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C ã®ãƒ¡ãƒ³ãƒå¤‰æ•°)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C ã®ãƒžã‚¯ãƒ­)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C ã®ãƒ‡ãƒ¼ã‚¿åž‹)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C ã®å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "例外"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "変数"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "戻り値"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "戻り値ã®åž‹"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "パラメタ"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sコマンドラインオプション; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "プラットフォーム: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (モジュール)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "ã“ã®ç¯€ã®ä½œè€…: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "モジュールã®ä½œè€…: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "作者: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "å‚考"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "ã”用心"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "å±é™º"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "エラー"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "ヒント"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "ノート"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "å‚考"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "ã¡ãªã¿ã«"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§è¿½åŠ "
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§å¤‰æ›´"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§æ’¤å»ƒ"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "モジュール"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "キーワード"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "演算å­"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "オブジェクト"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "æ–‡"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "組ã¿è¾¼ã¿é–¢æ•°"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "検索çµæžœã‚’éš ã™"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "検索中"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "検索ã®æº–備中..."
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "モジュール"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "検索çµæžœ"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚検索ã—ãŸã„言葉を正ã—ã„ã¤ã¥ã‚Šã§å…¥åŠ›ã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€æ­£ã—ã„カテゴリã®æ¤œç´¢ã‚’è¡Œã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "検索ãŒçµ‚了ã—ã€æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒšãƒ¼ã‚¸ãŒ %s 個ã¿ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "概è¦"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "索引ã¨è¡¨ä¸€è¦§:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "ç·åˆç›®æ¬¡"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "ç« ï¼ç¯€ä¸€è¦§"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "ドキュメントを検索"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "全モジュール早見表"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "関数ã€ã‚¯ãƒ©ã‚¹ãŠã‚ˆã³ç”¨èªžç·è¦§"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "索引 &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "ç·ç´¢å¼•"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "頭文字別索引"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "大ãã„å ´åˆãŒã‚ã‚‹ã®ã§æ³¨æ„"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "目次"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "å‰ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "å‰ã®ç« ã¸"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "次ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "次ã®ç« ã¸"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "変更ã®ã‚µã‚¸ã‚§ã‚¹ãƒˆ"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "ソースコードを表示"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "クイック検索"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "キーワード検索"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "検索"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "モジュールã€ã‚¯ãƒ©ã‚¹ã€ã¾ãŸã¯é–¢æ•°åを入力ã—ã¦ãã ã•ã„"
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã¤ã„ã¦"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "検索"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "著作権"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最終更新: %(last_updated)s"
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s ã§ç”Ÿæˆã—ã¾ã—ãŸã€‚"
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "よãå‚ç…§ã•ã‚Œã¦ã„るモジュール:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "ã“ã®ãƒ—ラットフォームã§åˆ©ç”¨å¯èƒ½ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã ã‘を表示ã™ã‚‹"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "撤廃"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>注æ„:</strong> ã‚ãªãŸãŒè¡¨ç¤ºã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã¯å¤ã„ URL ã§ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«å¯¾å¿œã™ã‚‹æ–°ã—ã„ URL "
+"ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’試ã¿ã¾ã™ãŒã€é©åˆ‡ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã§ãªã„ã‹ã‚‚ã—ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’検索ã§ãã¾ã™ã€‚キーワードを下ã®ãƒœãƒƒã‚¯ã‚¹ã«å…¥åŠ›ã—ã¦ã€ã€Œæ¤œç´¢ã€ã‚’クリックã—ã¦ãã ã•ã„。入力ã•ã‚ŒãŸå…¨ã¦ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒšãƒ¼ã‚¸ãŒæ¤œç´¢ã•ã‚Œã¾ã™ã€‚一部ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã—ã‹å«ã¾ãªã„ページã¯æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "検索"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ï¼ˆã“ã®ãƒªã‚¹ãƒˆã¯è‡ªå‹•ç”Ÿæˆã•ã‚Œã¦ã„ã¾ã™ï¼‰"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "ライブラリã«é–¢ã™ã‚‹å¤‰æ›´"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API ã«é–¢ã™ã‚‹å¤‰æ›´"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "ãã®å¤šã®å¤‰æ›´"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"module, in ": "module", "Preparing search...": "Het zoeken wordt voorbereid", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op.  Controleer of alle woordencorrect gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": "", "Permalink to this headline": "Permanente link naar deze titel", "Searching": "Zoeken", "Permalink to this definition": "Permanente link naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen", "Search Results": "Zoekresultaten"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,603 @@
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: nl <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%b.%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Algemene index"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Globale Module-index"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "volgende"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "vorige"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Moduleniveau"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d. %B %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Module-index"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Zoekpagina"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Permanente link naar deze definitie"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Permanente link naar deze titel"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "Omgevingsvariabele; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platform: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[afbeelding]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (geïntegreerde functie)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in module %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasse in %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s methode)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s methode)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statische methode)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statische methode)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s attribuut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribuut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-functie)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C member)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-macro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C type)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-variabele)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Veroorzaakt"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variabele"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%scommandolijn optie; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformen: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Auteur van deze sectie: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Auteur van deze module: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Auteur: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Zie ook"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Let op!"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Pas op!"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Gevaar"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Fout"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Hint"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Belangrijk"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Notitie"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Zie Ook"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nieuw in versie %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Veranderd in versie %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Verouderd sinds versie %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "trefwoord"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "object"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "foutmelding"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "statement"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "geïntegreerde functie"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Zoekresultaten verbergen"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Zoeken"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Het zoeken wordt voorbereid"
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "module"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Zoekresultaten"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Uw zoekopdracht leverde geen resultaten op.  Controleer of alle "
+"woordencorrect gespeld zijn en dat u genoeg categoriën hebt geselecteerd."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Zoeken voltooid, %s pagina(s) gevonden."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Overzicht"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indices en tabellen:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Volledige inhoudstafel"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "geeft alle secties en subsecties weer"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "zoeken in deze documentatie"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "sneltoegang naar alle modules"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "alle functies, klasses en begrippen"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Volledige index op een pagina"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Index pagineerd per letter"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "kan heel groot zijn"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Inhoudstafel"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Vorig onderwerp"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Vorig hoofdstuk"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Volgend onderwerp"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "volgend hoofdstuk"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Deze Pagina"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Wijziging Voorstellen"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Broncode weergeven"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Snel zoeken"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Trefwoord opzoeken"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Geef de naam van een module, klasse of functie."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Zoeken in %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Over deze documenten"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Zoeken"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Laatste aanpassing op %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Populairste modules:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Enkel modules weergeven die op deze platformen beschikbaar zijn"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Verouderd"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Zoeken %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Opgelet:</strong> U heeft een verouderde URL aangevraagd op deze "
+"server. Wij hebben probeerd u door te verwijzen naar de nieuwe locatie "
+"van deze pagina,  maar dat is misschien niet gelukt."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Hier kan u de documenten doorzoeken.  Geef enkele trefwoorden\n"
+"    in het veld hieronder en klik \"zoeken\".  Merk op dat de zoekfunctie"
+"\n"
+"    steeds naar alle woorden zoekt.  Pagina's die minder woorden bevatten"
+"\n"
+"    zullen niet tussen de resultaten verschijnen."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "zoeken"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Uw zoekopdracht leverde geen resultaten op."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Veranderingen in versie %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch genereerde lijst van veranderingen in versie %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Veranderingen in de bibliotheek"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Veranderingen in de C-API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere veranderingen"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modu\u0142", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania", "Search Results": "Wyniki wyszukiwania"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,600 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-10 11:43+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Michał Kandulski <Michal.Kandulski@poczta.onet.pl>\n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
+"(n%100<10 || n%100>=20) ? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Indeks ogólny"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "moduły"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "dalej"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "wstecz"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Wbudowane"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Poziom modułu"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%B %d %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Wyszukiwanie"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Stały odnośnik do tej definicji"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Stały odnośnik do tego nagłówka"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Wydanie"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "zmienna środowiskowa; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[obrazek]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funkcja wbudowana)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (w module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (w module %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (w klasie %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metoda)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statyczna metoda)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statyczna metoda)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atrybut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atrybut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (funkcja C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (pole C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (makro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (typ C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (zmienna C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Wyrzuca"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Zmienna"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Zwraca"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Typ zwracany"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopcja linii komend; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformy: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moduł)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor rozdziału: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor modułu: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Zobacz także"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Ostrożnie"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Niebezpieczeństwo"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Podpowiedź"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Ważne"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Zobacz także"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Wskazówka"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nowe w wersji %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Zmienione w wersji %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Niezalecane od wersji %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "moduł"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "słowo kluczowe"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "obiekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "wyjÄ…tek"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "instrukcja"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "funkcja wbudowana"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Ukryj wyniki wyszukiwania"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Wyszukiwanie"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Przygotowanie wyszukiwania..."
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "moduł"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Wyniki wyszukiwania"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Nie znaleziono żadnych pasujących dokumentów. Upewnij się, że wszystkie "
+"słowa są poprawnie wpisane i że wybrałeś wystarczającąliczbę kategorii."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "PrzeglÄ…d"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indeksy i tablice:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Kompletny spis treści"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "wymień wszystkie rozdziały i podrozdziały"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "wyszukaj w dokumentacji"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "szybki dostęp do wszystkich modułów"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "wszystkie funkcje, klasy, terminy"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Cały indeks na jednej stronie"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Strony indeksu alfabetycznie"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "może być ogromny"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Spis treści"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Poprzedni temat"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "poprzedni rozdział"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Następny temat"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "następny rozdział"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Ta strona"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Zasugeruj zmianÄ™"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Pokaż źródło"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Szybkie wyszukiwanie"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Szukanie wg słowa kluczowego"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Szukaj"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Wprowadź nazwę modułu, klasy lub funkcji."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Szukaj pośród %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O tych dokumentach"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Szukaj"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ostatnia modyfikacja %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Utworzone przy pomocy <a href=\"http://sphinx.pocoo.org/\">Sphinx</a>'a "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Najbardziej popularne moduły:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Pokaż moduły dostępne tylko na tych platformach"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Niezalecane"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Przeszukaj %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Uwaga:</strong> Zażądano przedawnionego URL'a z tego serwera. "
+"Nastąpiła próba przekierowania do nowej lokalizacji, ale może ona być "
+"niewłaściwa."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Stąd możesz przeszukać dokumentację. Wprowadź szukane\n"
+"    słowa w poniższym okienku i kliknij \"Szukaj\". Zwróć uwagę, że\n"
+"    funkcja szukająca będzie automatycznie szukała wszystkich słów.     "
+"Strony nie zawierające wszystkich słów nie znajdą się na wynikowej     "
+"liście."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "Szukaj"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Nie znaleziono żadnych pasujących stron."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Zmiany w wesji %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatycznie wygenerowana lista zmian w wersji %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Zmiany w bibliotekach"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Zmiany w C API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Inne zmiany"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"module, in ": "m\u00f3dulo, em ", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa", "Search Results": "Resultados da Pesquisa"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,606 @@
+# Portuguese (Brazil) translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <roger.demetrescu@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n"
+"POT-Creation-Date: 2008-11-09 19:46+0100\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Roger Demetrescu <roger.demetrescu@gmail.com>\n"
+"Language-Team: pt_BR <roger.demetrescu@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Ãndice Geral"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "próximo"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr " (em "
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Internos"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Módulo"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Ãndice do Módulo"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Página de Pesquisa"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Link permanente para esta definição"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Link permanente para este título"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Versão"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "váriavel de ambiente; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plataforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[imagem]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (função interna)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (no módulo %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variável interna)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (no módulo %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe interna)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe em %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (método %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (método %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (método estático %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (método estático %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (atributo %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atributo %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (função C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (membro C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (tipo C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variável C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Levanta"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variável"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Retorna"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Tipo de retorno"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parâmetros"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopção de linha de comando; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plataformas: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor da seção: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor do módulo: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Veja também"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "Por fazer"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(A entrada original está localizada em %s, linha %d e pode ser encontrada "
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "aqui"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Atenção"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Cuidado"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Perigo"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Erro"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Veja Também"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Aviso"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Novo na versão %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Alterado na versão %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde a versão %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "palavra-chave"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operador"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objeto"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "exceção"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "comando"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "função interna"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Esconder Resultados da Pesquisa"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Pesquisando"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Preparando pesquisa..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "módulo, em "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", em "
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que"
+" todas as palavras foram digitadas corretamente e de que você tenha "
+"selecionado o mínimo de categorias."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+"Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o "
+"critério de pesquisa."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Visão geral"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Ãndices e tabelas:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Tabela de Conteúdo Completa"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Lista todas seções e subseções"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "Pesquisar esta documentação"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "acesso rápido para todos os módulos"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "todas funções, classes, termos"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Ãndice completo em uma página"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Paginas de índice por letra"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "pode ser enorme"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navegação"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Tabela de Conteúdo"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Tópico anterior"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "capítulo anterior"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Próximo tópico"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "próximo capítulo"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Esta Página"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Sugerir Alteração"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Exibir Fonte"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Pesquisa rápida"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Pesquisa de palavras-chave"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Ir"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Informe o nome de um módulo, classe ou função."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Pesquisar dentro de %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Sobre estes documentos"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Pesquisar"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Última atualização em %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Módulos mais populares:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Exibir somente módulos disponíveis nestas plataformas"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Pesquisar em %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Nota:</strong> Você requisitou uma URL desatualizada deste "
+"servidor. Tentamos redirecioná-lo para um novo endereço desta página, "
+"porém é possível que o mesmo não seja o correto."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"A partir daqui você pode pesquisar estes documentos. Preencha suas \n"
+"    palavras de pesquisa na caixa abaixo e clique em  \"pesquisar\". "
+"Observe que a função de pesquisa\n"
+"    irá pesquisar automaticamente por todas as palavras.\n"
+"    Páginas contendo menos palavras não irão aparecer na lista de "
+"resultado."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "pesquisar"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Sua pesquisa não encontrou nenhum resultado."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Alterações na Versão%(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de alterações na versão %(version)s gerada automaticamente"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Alterações na biblioteca"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Alterações na API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Outras alterações"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"module, in ": "modul, v ", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij Resultate Iskanja", "Search Results": "Rezultati Iskanja"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,597 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version:  Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Rok Garbas <rok.garbas@gmail.com>\n"
+"Language-Team: Rok Garbas <rok.garbas@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Splošni abecedni seznam"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "abecedni seznam"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Splošen Seznam Modulov"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "Moduli"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "naprej"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "nazaj"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr "(v "
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Vgrajeni deli"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Nivo modula"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d %B, %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Abecedni seznam"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Seznam modulov"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Iskalna stran"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Povezava na to definicijo"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Povezava na naslov"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Izdaja"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "globalna spremenljivka; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[slika]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vgrajene funkcije)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (vgrajene spremenljivke)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (v modulu %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (vgrajen razred)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (razred v %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metoda)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statiÄna metoda)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiÄna metoda)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atribut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkcija)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C Älan)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C tip)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C spremenljivka)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Javi"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Spremenljivka"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Vrne"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Vrne tip"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopcija komandne linije; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platforma:"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Avtor sekcije:"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Avtor modula:"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Avtor:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Poglej tudi"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "Naredi"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(Originalen vnos se nahajana v %s, vrstica %d in jo je moÄ poiskati "
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "tukaj"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Pozor"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Previdno"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Navarno"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Napaka"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Pomembno"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Opomba"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Poglej Tudi"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Opozorilo"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Novo v verziji %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Spemenjeno v verziji %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastarelo od verzije %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "modul"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "klluÄna beseda"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "izjema"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "izjava"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "vgrajene funkcije"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Skrij Resultate Iskanja"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "IÅ¡Äem"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Pripravljam iskanje..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "modul, v "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", v "
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Rezultati Iskanja"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Za vaše iskanje ni rezultatov. Prosimo preglejte ali so vse besede "
+"pravilno Ärkovane in ali ste izbrali dovolj kategorij."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Iskanje konÄano, najdeno %s strani, ki ustrezajo iskalnemu nizu."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Pregled"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Kazalo in tabele:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Popoln Seznam Vsebine"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "prikazi vse sekcije in podsekcije"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "isÄi po dokumentaciji"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "hiter dostop do vseh modulov"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "vse funkcije, rezredi, termini"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Seznam &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Poln indeks na eni strani"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Indeksiraj strani po Ärki"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "lahko je veliko"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Seznam Vsebine"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Prejšnja tema"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "prejšnje poglavje"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Naslednja tema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "naslednje poglavje"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Ta stran"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Predlagaj spremembo"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Prikaži izvorno kodo"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Hitro iskanje"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Iskanje po kljuÄniih besedah"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Potrdi"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Vnesi ime mudla, razreda ali funkcije."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "IÅ¡Äi med %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O teh dokumentih"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "IÅ¡Äi"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Vse pravice pridržane"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Vse pravice pridržane</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Vse pravice pridržane %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "ZadnjiÄ posodobljeno na %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Narejeno s <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Najbolj popularni moduli:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Prikaži module na razpolago na platformah"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Zastarelo"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "IÅ¡Äi %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Opomba:</strong> Vaš zahtevek za URL s tega streznika je "
+"zastaral. Poskušali smo vas preusmeriti na novo lokacijo, vendar utegne "
+"biti napaÄna."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"O tukaj lahko isÄete dokumente. Vnesite iskalni\n"
+"    niz v polje spodaj in pritisnite \"iÅ¡Äi\". Sproženo iskanje\n"
+"    bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n"
+"    vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "iÅ¡Äi"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Vaše iskanje ni imelo nobenega zadetka."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Spremembe v Verziji %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Avtomatsko generiran seznam sprememb v verziji %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Spremembe knjižnice"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API spremembe"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostale spremembe"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,589 @@
+# Translations template for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-11-27 18:39+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr ""
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr ""
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr ""
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr ""
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr ""
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr ""
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr ""
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr ""
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr ""
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr ""
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr ""
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr ""
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr ""
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr ""
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr ""
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr ""
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr ""
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr ""
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr ""
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr ""
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr ""
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr ""
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr ""
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr ""
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr ""
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr ""
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr ""
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr ""
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr ""
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr ""
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr ""
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr ""
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr ""
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr ""
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr ""
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr ""
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr ""
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr ""
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr ""
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr ""
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr ""
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr ""
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr ""
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr ""
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr ""
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr ""
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr ""
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr ""
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr ""
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr ""
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+
+#: sphinx/templates/search.html:7
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr ""
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr ""
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"module, in ": "", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Permalink to this definition": "", "Hide Search Matches": "", "Search Results": "\u641c\u5c0b\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,598 @@
+# Chinese (Taiwan) translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Fred Lin <gasolin@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-11-09 19:46+0100\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Fred Lin <gasolin@gmail.com>\n"
+"Language-Team: tw <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "總索引"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr ""
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "模組"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "下一é "
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "上一é "
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr ""
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "模組索引"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "æœå°‹é é¢"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr ""
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr ""
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "釋出"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境變數; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python 建議文件!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "å¹³å°ï¼š%s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[圖片]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (內建函å¼)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (在 %s 模組中)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (內建變數)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s() (在 %s 模組中)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (內建類別)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s 方法)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 方法)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s éœæ…‹æ–¹æ³•)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s éœæ…‹æ–¹æ³•)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s 屬性)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s 屬性)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C 函å¼)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C æˆå“¡)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C 巨集)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C 類別)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C 變數)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr ""
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "變數"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "返回"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "返回類別"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "åƒæ•¸"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%s命令列é¸é …; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "å¹³å°"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (模組)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Section 作者:"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "模組作者:"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "作者:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr ""
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "待辦"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "警示"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "å±éšª"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "錯誤"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "æ示"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "註解"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "å°æŠ€å·§"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "%s 版新功能"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "在 %s 版改變"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "%s 版後已移除"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "模組"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "é—œéµå­—"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "é‹ç®—å­"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "物件"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr ""
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "內建函å¼"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "æœå°‹ä¸­"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "準備æœå°‹..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "æœå°‹çµæžœ"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr ""
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr ""
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr ""
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr ""
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr ""
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "ç€è¦½"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "內容目錄"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "上一個主題"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "上一章"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "下一個主題"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "下一章"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "本é "
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr ""
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "顯示原始碼"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "快速æœå°‹"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "é—œéµå­—æœå°‹"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr ""
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "輸入一個模組ã€é¡žåˆ¥ã€æˆ–是函å¼å稱."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "在 %(docstitle)s 中æœå°‹"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "æœå°‹"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "版權所有"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最後更新日期是 %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr ""
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr ""
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "已移除"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "æœå°‹ %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+
+#: sphinx/templates/search.html:7
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "æœå°‹"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr ""
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API 改變"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "其他改變:"
+
+#~ msgid ""
+#~ "From here you can search these documents. Enter your search\n"
+#~ "    words into the box below and"
+#~ " click \"search\". Note that the "
+#~ "search\n"
+#~ "    function will automatically search for all of the words. Pages\n"
+#~ "    containing less words won't appear in the result list."
+#~ msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,533 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.quickstart
+    ~~~~~~~~~~~~~~~~~
+
+    Quickly setup documentation source to work with Sphinx.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys, os, time
+from os import path
+
+TERM_ENCODING = getattr(sys.stdin, 'encoding', None)
+
+from sphinx.util import make_filename
+from sphinx.util.console import purple, bold, red, turquoise, nocolor, color_terminal
+from sphinx.util.texescape import tex_escape_map
+
+
+PROMPT_PREFIX = '> '
+
+QUICKSTART_CONF = '''\
+# -*- coding: utf-8 -*-
+#
+# %(project)s documentation build configuration file, created by
+# sphinx-quickstart on %(now)s.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [%(extensions)s]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['%(dot)stemplates']
+
+# The suffix of source filenames.
+source_suffix = '%(suffix)s'
+
+# The encoding of source files.
+#source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = '%(master)s'
+
+# General information about the project.
+project = u'%(project)s'
+copyright = u'%(copyright)s'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '%(version)s'
+# The full version, including alpha/beta/rc tags.
+release = '%(release)s'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%%B %%d, %%Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = [%(exclude_trees)s]
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['%(dot)sstatic']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%%b %%d, %%Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = '%(project_fn)sdoc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('%(master)s', '%(project_fn)s.tex', ur'%(project_doc_texescaped)s',
+   ur'%(author_texescaped)s', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
+'''
+
+INTERSPHINX_CONFIG = '''
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {'http://docs.python.org/dev': None}
+'''
+
+MASTER_FILE = '''\
+.. %(project)s documentation master file, created by sphinx-quickstart on %(now)s.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to %(project)s's documentation!
+===========%(underline)s=================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
+'''
+
+MAKEFILE = '''\
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d %(rbuilddir)s/doctrees $(PAPEROPT_$(PAPER)) \
+$(SPHINXOPTS) %(rsrcdir)s
+
+.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
+
+help:
+\t@echo "Please use \\`make <target>' where <target> is one of"
+\t@echo "  html      to make standalone HTML files"
+\t@echo "  pickle    to make pickle files"
+\t@echo "  json      to make JSON files"
+\t@echo "  htmlhelp  to make HTML files and a HTML help project"
+\t@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+\t@echo "  changes   to make an overview over all changed/added/deprecated items"
+\t@echo "  linkcheck to check all external links for integrity"
+
+clean:
+\t-rm -rf %(rbuilddir)s/*
+
+html:
+\tmkdir -p %(rbuilddir)s/html %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) %(rbuilddir)s/html
+\t@echo
+\t@echo "Build finished. The HTML pages are in %(rbuilddir)s/html."
+
+pickle:
+\tmkdir -p %(rbuilddir)s/pickle %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) %(rbuilddir)s/pickle
+\t@echo
+\t@echo "Build finished; now you can process the pickle files."
+
+web: pickle
+
+json:
+\tmkdir -p %(rbuilddir)s/json %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) %(rbuilddir)s/json
+\t@echo
+\t@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+\tmkdir -p %(rbuilddir)s/htmlhelp %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) %(rbuilddir)s/htmlhelp
+\t@echo
+\t@echo "Build finished; now you can run HTML Help Workshop with the" \\
+\t      ".hhp project file in %(rbuilddir)s/htmlhelp."
+
+latex:
+\tmkdir -p %(rbuilddir)s/latex %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) %(rbuilddir)s/latex
+\t@echo
+\t@echo "Build finished; the LaTeX files are in %(rbuilddir)s/latex."
+\t@echo "Run \\`make all-pdf' or \\`make all-ps' in that directory to" \\
+\t      "run these through (pdf)latex."
+
+changes:
+\tmkdir -p %(rbuilddir)s/changes %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) %(rbuilddir)s/changes
+\t@echo
+\t@echo "The overview file is in %(rbuilddir)s/changes."
+
+linkcheck:
+\tmkdir -p %(rbuilddir)s/linkcheck %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) %(rbuilddir)s/linkcheck
+\t@echo
+\t@echo "Link check complete; look for any errors in the above output " \\
+\t      "or in %(rbuilddir)s/linkcheck/output.txt."
+'''
+
+
+def mkdir_p(dir):
+    if path.isdir(dir):
+        return
+    os.makedirs(dir)
+
+
+def is_path(x):
+    """Please enter a valid path name."""
+    return path.isdir(x) or not path.exists(x)
+
+def nonempty(x):
+    """Please enter some text."""
+    return len(x)
+
+def choice(*l):
+    def val(x):
+        return x in l
+    val.__doc__ = 'Please enter one of %s.' % ', '.join(l)
+    return val
+
+def boolean(x):
+    """Please enter either 'y' or 'n'."""
+    return x.upper() in ('Y', 'YES', 'N', 'NO')
+
+def suffix(x):
+    """Please enter a file suffix, e.g. '.rst' or '.txt'."""
+    return x[0:1] == '.' and len(x) > 1
+
+def ok(x):
+    return True
+
+
+def do_prompt(d, key, text, default=None, validator=nonempty):
+    while True:
+        if default:
+            prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default))
+        else:
+            prompt = purple(PROMPT_PREFIX + text + ': ')
+        x = raw_input(prompt)
+        if default and not x:
+            x = default
+        if x.decode('ascii', 'replace').encode('ascii', 'replace') != x:
+            if TERM_ENCODING:
+                x = x.decode(TERM_ENCODING)
+            else:
+                print turquoise('* Note: non-ASCII characters entered and terminal '
+                                'encoding unknown -- assuming UTF-8 or Latin-1.')
+                try:
+                    x = x.decode('utf-8')
+                except UnicodeDecodeError:
+                    x = x.decode('latin1')
+        if validator and not validator(x):
+            print red('* ' + validator.__doc__)
+            continue
+        break
+    d[key] = x
+
+
+def inner_main(args):
+    d = {}
+
+    if not sys.stdout.isatty() or not color_terminal():
+        nocolor()
+
+    print bold('Welcome to the Sphinx quickstart utility.')
+    print '''
+Please enter values for the following settings (just press Enter to
+accept a default value, if one is given in brackets).'''
+
+    print '''
+Enter the root path for documentation.'''
+    do_prompt(d, 'path', 'Root path for the documentation', '.', is_path)
+
+    while path.isfile(path.join(d['path'], 'conf.py')) or \
+          path.isfile(path.join(d['path'], 'source', 'conf.py')):
+        print
+        print bold('Error: an existing conf.py has been found in the '
+                   'selected root path.')
+        print 'sphinx-quickstart will not overwrite existing Sphinx projects.'
+        print
+        do_prompt(d, 'path', 'Please enter a new root path (or just Enter to exit)',
+                  '', is_path)
+        if not d['path']:
+            sys.exit(1)
+
+    print '''
+You have two options for placing the build directory for Sphinx output.
+Either, you use a directory ".build" within the root path, or you separate
+"source" and "build" directories within the root path.'''
+    do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n',
+              boolean)
+    print '''
+Inside the root directory, two more directories will be created; ".templates"
+for custom HTML templates and ".static" for custom stylesheets and other
+static files. Since the leading dot may be inconvenient for Windows users,
+you can enter another prefix (such as "_") to replace the dot.'''
+    do_prompt(d, 'dot', 'Name prefix for templates and static dir', '.', ok)
+
+    print '''
+The project name will occur in several places in the built documentation.'''
+    do_prompt(d, 'project', 'Project name')
+    do_prompt(d, 'author', 'Author name(s)')
+    print '''
+Sphinx has the notion of a "version" and a "release" for the
+software. Each version can have multiple releases. For example, for
+Python the version is something like 2.5 or 3.0, while the release is
+something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
+just set both to the same value.'''
+    do_prompt(d, 'version', 'Project version')
+    do_prompt(d, 'release', 'Project release', d['version'])
+    print '''
+The file name suffix for source files. Commonly, this is either ".txt"
+or ".rst".  Only files with this suffix are considered documents.'''
+    do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix)
+    print '''
+One document is special in that it is considered the top node of the
+"contents tree", that is, it is the root of the hierarchical structure
+of the documents. Normally, this is "index", but if your "index"
+document is a custom template, you can also set this to another filename.'''
+    do_prompt(d, 'master', 'Name of your master document (without suffix)',
+              'index')
+    print '''
+Please indicate if you want to use one of the following Sphinx extensions:'''
+    do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
+              'from modules (y/N)', 'n', boolean)
+    do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
+              'in doctest blocks (y/N)', 'n', boolean)
+    do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx documentation '
+              'of different projects (y/N)', 'n', boolean)
+    print '''
+If you are under Unix, a Makefile can be generated for you so that you
+only have to run e.g. `make html' instead of invoking sphinx-build
+directly.'''
+    do_prompt(d, 'makefile', 'Create Makefile? (Y/n)',
+              os.name == 'posix' and 'y' or 'n', boolean)
+
+    d['project_fn'] = make_filename(d['project'])
+    d['now'] = time.asctime()
+    d['underline'] = len(d['project']) * '='
+    d['extensions'] = ', '.join(
+        repr('sphinx.ext.' + name) for name in ('autodoc', 'doctest', 'intersphinx')
+        if d['ext_' + name].upper() in ('Y', 'YES'))
+    d['copyright'] = time.strftime('%Y') + ', ' + d['author']
+    d['author_texescaped'] = unicode(d['author']).translate(tex_escape_map)
+    d['project_doc'] = d['project'] + ' Documentation'
+    d['project_doc_texescaped'] = \
+        unicode(d['project'] + ' Documentation').translate(tex_escape_map)
+
+    if not path.isdir(d['path']):
+        mkdir_p(d['path'])
+
+    separate = d['sep'].upper() in ('Y', 'YES')
+    srcdir = separate and path.join(d['path'], 'source') or d['path']
+
+    mkdir_p(srcdir)
+    if separate:
+        builddir = path.join(d['path'], 'build')
+        d['exclude_trees'] = ''
+    else:
+        builddir = path.join(srcdir, d['dot'] + 'build')
+        d['exclude_trees'] = repr(d['dot'] + 'build')
+    mkdir_p(builddir)
+    mkdir_p(path.join(srcdir, d['dot'] + 'templates'))
+    mkdir_p(path.join(srcdir, d['dot'] + 'static'))
+
+    conf_text = QUICKSTART_CONF % d
+    if d['ext_intersphinx'].upper() in ('Y', 'YES'):
+        conf_text += INTERSPHINX_CONFIG
+
+    f = open(path.join(srcdir, 'conf.py'), 'w')
+    f.write(conf_text.encode('utf-8'))
+    f.close()
+
+    masterfile = path.join(srcdir, d['master'] + d['suffix'])
+    f = open(masterfile, 'w')
+    f.write((MASTER_FILE % d).encode('utf-8'))
+    f.close()
+
+    create_makefile = d['makefile'].upper() in ('Y', 'YES')
+    if create_makefile:
+        d['rsrcdir'] = separate and 'source' or '.'
+        d['rbuilddir'] = separate and 'build' or d['dot'] + 'build'
+        f = open(path.join(d['path'], 'Makefile'), 'w')
+        f.write((MAKEFILE % d).encode('utf-8'))
+        f.close()
+
+    print
+    print bold('Finished: An initial directory structure has been created.')
+    print '''
+You should now populate your master file %s and create other documentation
+source files. ''' % masterfile + (create_makefile and '''\
+Use the Makefile to build the docs, like so:
+   make builder
+''' or '''\
+Use the sphinx-build command to build the docs, like so:
+   sphinx-build -b builder %s %s
+''' % (srcdir, builddir)) + '''\
+where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
+'''
+
+
+def main(argv=sys.argv):
+    try:
+        return inner_main(argv)
+    except (KeyboardInterrupt, EOFError):
+        print
+        print '[Interrupted.]'
+        return
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,245 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.roles
+    ~~~~~~~~~~~~
+
+    Handlers for additional ReST roles.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+
+from docutils import nodes, utils
+from docutils.parsers.rst import roles
+
+from sphinx import addnodes
+from sphinx.util import ws_re, caption_ref_re
+
+
+generic_docroles = {
+    'command' : nodes.strong,
+    'dfn' : nodes.emphasis,
+    'guilabel' : nodes.strong,
+    'kbd' : nodes.literal,
+    'mailheader' : addnodes.literal_emphasis,
+    'makevar' : nodes.Text,
+    'manpage' : addnodes.literal_emphasis,
+    'mimetype' : addnodes.literal_emphasis,
+    'newsgroup' : addnodes.literal_emphasis,
+    'program' : nodes.strong,
+    'regexp' : nodes.literal,
+}
+
+for rolename, nodeclass in generic_docroles.iteritems():
+    roles.register_generic_role(rolename, nodeclass)
+
+
+def indexmarkup_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]):
+    env = inliner.document.settings.env
+    if not typ:
+        typ = env.config.default_role
+    else:
+        typ = typ.lower()
+    text = utils.unescape(etext)
+    targetid = 'index-%s' % env.index_num
+    env.index_num += 1
+    indexnode = addnodes.index()
+    targetnode = nodes.target('', '', ids=[targetid])
+    inliner.document.note_explicit_target(targetnode)
+    if typ == 'envvar':
+        indexnode['entries'] = [('single', text, targetid, text),
+                                ('single', _('environment variable; %s') % text,
+                                 targetid, text)]
+        xref_nodes = xfileref_role(typ, rawtext, etext, lineno, inliner,
+                                   options, content)[0]
+        return [indexnode, targetnode] + xref_nodes, []
+    elif typ == 'pep':
+        indexnode['entries'] = [('single',
+                                 _('Python Enhancement Proposals!PEP %s') % text,
+                                 targetid, 'PEP %s' % text)]
+        try:
+            pepnum = int(text)
+        except ValueError:
+            msg = inliner.reporter.error('invalid PEP number %s' % text, line=lineno)
+            prb = inliner.problematic(rawtext, rawtext, msg)
+            return [prb], [msg]
+        ref = inliner.document.settings.pep_base_url + 'pep-%04d' % pepnum
+        sn = nodes.strong('PEP '+text, 'PEP '+text)
+        rn = nodes.reference('', '', refuri=ref)
+        rn += sn
+        return [indexnode, targetnode, rn], []
+    elif typ == 'rfc':
+        indexnode['entries'] = [('single', 'RFC; RFC %s' % text,
+                                 targetid, 'RFC %s' % text)]
+        try:
+            rfcnum = int(text)
+        except ValueError:
+            msg = inliner.reporter.error('invalid RFC number %s' % text, line=lineno)
+            prb = inliner.problematic(rawtext, rawtext, msg)
+            return [prb], [msg]
+        ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+        sn = nodes.strong('RFC '+text, 'RFC '+text)
+        rn = nodes.reference('', '', refuri=ref)
+        rn += sn
+        return [indexnode, targetnode, rn], []
+
+roles.register_canonical_role('envvar', indexmarkup_role)
+roles.register_local_role('pep', indexmarkup_role)
+roles.register_local_role('rfc', indexmarkup_role)
+
+
+# default is `literal`
+innernodetypes = {
+    'ref': nodes.emphasis,
+    'term': nodes.emphasis,
+    'token': nodes.strong,
+    'envvar': nodes.strong,
+    'option': addnodes.literal_emphasis,
+}
+
+def _fix_parens(typ, text, env):
+    if typ in ('func', 'meth', 'cfunc'):
+        if text.endswith('()'):
+            # remove parentheses
+            text = text[:-2]
+        if env.config.add_function_parentheses:
+            # add them back to all occurrences if configured
+            text += '()'
+    return text
+
+def xfileref_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    env = inliner.document.settings.env
+    if not typ:
+        typ = env.config.default_role
+    else:
+        typ = typ.lower()
+    text = utils.unescape(text)
+    # if the first character is a bang, don't cross-reference at all
+    if text[0:1] == '!':
+        text = _fix_parens(typ, text[1:], env)
+        return [innernodetypes.get(typ, nodes.literal)(
+            rawtext, text, classes=['xref'])], []
+    # we want a cross-reference, create the reference node
+    pnode = addnodes.pending_xref(rawtext, reftype=typ, refcaption=False,
+                                  modname=env.currmodule, classname=env.currclass)
+    # we may need the line number for warnings
+    pnode.line = lineno
+    # the link title may differ from the target, but by default they are the same
+    title = target = text
+    titleistarget = True
+    # look if explicit title and target are given with `foo <bar>` syntax
+    brace = text.find('<')
+    if brace != -1:
+        titleistarget = False
+        pnode['refcaption'] = True
+        m = caption_ref_re.match(text)
+        if m:
+            target = m.group(2)
+            title = m.group(1)
+        else:
+            # fallback: everything after '<' is the target
+            target = text[brace+1:]
+            title = text[:brace]
+    # special target for Python object cross-references
+    if typ in ('data', 'exc', 'func', 'class', 'const', 'attr', 'meth', 'mod', 'obj'):
+        # fix-up parentheses in link title
+        if titleistarget:
+            title = title.lstrip('.')   # only has a meaning for the target
+            target = target.lstrip('~') # only has a meaning for the title
+            title = _fix_parens(typ, title, env)
+            # if the first character is a tilde, don't display the module/class
+            # parts of the contents
+            if title[0:1] == '~':
+                title = title[1:]
+                dot = title.rfind('.')
+                if dot != -1:
+                    title = title[dot+1:]
+        # remove parentheses from the target too
+        if target.endswith('()'):
+            target = target[:-2]
+        # if the first character is a dot, search more specific namespaces first
+        # else search builtins first
+        if target[0:1] == '.':
+            target = target[1:]
+            pnode['refspecific'] = True
+    # some other special cases for the target
+    elif typ == 'option':
+        program = env.currprogram
+        if titleistarget:
+            if ' ' in title and not (title.startswith('/') or title.startswith('-')):
+                program, target = re.split(' (?=-|--|/)', title, 1)
+                program = ws_re.sub('-', program)
+                target = target.strip()
+        elif ' ' in target:
+            program, target = re.split(' (?=-|--|/)', target, 1)
+            program = ws_re.sub('-', program)
+        pnode['refprogram'] = program
+    elif typ == 'term':
+        # normalize whitespace in definition terms (if the term reference is
+        # broken over a line, a newline will be in target)
+        target = ws_re.sub(' ', target).lower()
+    elif typ == 'ref':
+        # reST label names are always lowercased
+        target = ws_re.sub('', target).lower()
+    else:
+        # remove all whitespace to avoid referencing problems
+        target = ws_re.sub('', target)
+    pnode['reftarget'] = target
+    pnode += innernodetypes.get(typ, nodes.literal)(rawtext, title, classes=['xref'])
+    return [pnode], []
+
+
+def menusel_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    return [nodes.emphasis(
+        rawtext, utils.unescape(text).replace('-->', u'\N{TRIANGULAR BULLET}'))], []
+
+
+_litvar_re = re.compile('{([^}]+)}')
+
+def emph_literal_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    pos = 0
+    retnode = nodes.literal(role=typ.lower())
+    for m in _litvar_re.finditer(text):
+        if m.start() > pos:
+            txt = text[pos:m.start()]
+            retnode += nodes.Text(txt, txt)
+        retnode += nodes.emphasis(m.group(1), m.group(1))
+        pos = m.end()
+    if pos < len(text):
+        retnode += nodes.Text(text[pos:], text[pos:])
+    return [retnode], []
+
+
+specific_docroles = {
+    'data': xfileref_role,
+    'exc': xfileref_role,
+    'func': xfileref_role,
+    'class': xfileref_role,
+    'const': xfileref_role,
+    'attr': xfileref_role,
+    'meth': xfileref_role,
+    'obj': xfileref_role,
+    'cfunc' : xfileref_role,
+    'cmember': xfileref_role,
+    'cdata': xfileref_role,
+    'ctype': xfileref_role,
+    'cmacro': xfileref_role,
+
+    'mod': xfileref_role,
+
+    'keyword': xfileref_role,
+    'ref': xfileref_role,
+    'token': xfileref_role,
+    'term': xfileref_role,
+    'option': xfileref_role,
+
+    'menuselection': menusel_role,
+    'file': emph_literal_role,
+    'samp': emph_literal_role,
+}
+
+for rolename, func in specific_docroles.iteritems():
+    roles.register_canonical_role(rolename, func)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/search.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.search
+    ~~~~~~~~~~~~~
+
+    Create a search index for offline search.
+
+    :copyright: 2007-2008 by Armin Ronacher.
+    :license: BSD.
+"""
+import re
+import cPickle as pickle
+from cStringIO import StringIO
+
+from docutils.nodes import Text, NodeVisitor
+
+from sphinx.util.stemmer import PorterStemmer
+from sphinx.util import jsdump, rpartition
+
+
+word_re = re.compile(r'\w+(?u)')
+
+stopwords = set("""
+a  and  are  as  at
+be  but  by
+for
+if  in  into  is  it
+near  no  not
+of  on  or
+such
+that  the  their  then  there  these  they  this  to
+was  will  with
+""".split())
+
+
+class _JavaScriptIndex(object):
+    """
+    The search index as javascript file that calls a function
+    on the documentation search object to register the index.
+    """
+
+    PREFIX = 'Search.setIndex('
+    SUFFIX = ')'
+
+    def dumps(self, data):
+        return self.PREFIX + jsdump.dumps(data) + self.SUFFIX
+
+    def loads(self, s):
+        data = s[len(self.PREFIX):-len(self.SUFFIX)]
+        if not data or not s.startswith(self.PREFIX) or not \
+           s.endswith(self.SUFFIX):
+            raise ValueError('invalid data')
+        return jsdump.loads(data)
+
+    def dump(self, data, f):
+        f.write(self.dumps(data))
+
+    def load(self, f):
+        return self.loads(f.read())
+
+
+js_index = _JavaScriptIndex()
+
+
+class Stemmer(PorterStemmer):
+    """
+    All those porter stemmer implementations look hideous.
+    make at least the stem method nicer.
+    """
+
+    def stem(self, word):
+        word = word.lower()
+        return PorterStemmer.stem(self, word, 0, len(word) - 1)
+
+
+class WordCollector(NodeVisitor):
+    """
+    A special visitor that collects words for the `IndexBuilder`.
+    """
+
+    def __init__(self, document):
+        NodeVisitor.__init__(self, document)
+        self.found_words = []
+
+    def dispatch_visit(self, node):
+        if node.__class__ is Text:
+            self.found_words.extend(word_re.findall(node.astext()))
+
+
+class IndexBuilder(object):
+    """
+    Helper class that creates a searchindex based on the doctrees
+    passed to the `feed` method.
+    """
+    formats = {
+        'jsdump':   jsdump,
+        'pickle':   pickle
+    }
+
+    def __init__(self, env):
+        self.env = env
+        self._stemmer = Stemmer()
+        # filename -> title
+        self._titles = {}
+        # stemmed word -> set(filenames)
+        self._mapping = {}
+        # desctypes -> index
+        self._desctypes = {}
+
+    def load(self, stream, format):
+        """Reconstruct from frozen data."""
+        if isinstance(format, basestring):
+            format = self.formats[format]
+        frozen = format.load(stream)
+        # if an old index is present, we treat it as not existing.
+        if not isinstance(frozen, dict):
+            raise ValueError('old format')
+        index2fn = frozen['filenames']
+        self._titles = dict(zip(index2fn, frozen['titles']))
+        self._mapping = {}
+        for k, v in frozen['terms'].iteritems():
+            if isinstance(v, int):
+                self._mapping[k] = set([index2fn[v]])
+            else:
+                self._mapping[k] = set(index2fn[i] for i in v)
+        # no need to load keywords/desctypes
+
+    def dump(self, stream, format):
+        """Dump the frozen index to a stream."""
+        if isinstance(format, basestring):
+            format = self.formats[format]
+        format.dump(self.freeze(), stream)
+
+    def get_modules(self, fn2index):
+        rv = {}
+        for name, (doc, _, _, _) in self.env.modules.iteritems():
+            rv[name] = fn2index[doc]
+        return rv
+
+    def get_descrefs(self, fn2index):
+        rv = {}
+        dt = self._desctypes
+        for fullname, (doc, desctype) in self.env.descrefs.iteritems():
+            prefix, name = rpartition(fullname, '.')
+            pdict = rv.setdefault(prefix, {})
+            try:
+                i = dt[desctype]
+            except KeyError:
+                i = len(dt)
+                dt[desctype] = i
+            pdict[name] = (fn2index[doc], i)
+        return rv
+
+    def get_terms(self, fn2index):
+        rv = {}
+        for k, v in self._mapping.iteritems():
+            if len(v) == 1:
+                fn, = v
+                rv[k] = fn2index[fn]
+            else:
+                rv[k] = [fn2index[fn] for fn in v]
+        return rv
+
+    def freeze(self):
+        """Create a usable data structure for serializing."""
+        filenames = self._titles.keys()
+        titles = self._titles.values()
+        fn2index = dict((f, i) for (i, f) in enumerate(filenames))
+        return dict(
+            filenames=filenames,
+            titles=titles,
+            terms=self.get_terms(fn2index),
+            descrefs=self.get_descrefs(fn2index),
+            modules=self.get_modules(fn2index),
+            desctypes=dict((v, k) for (k, v) in self._desctypes.items()),
+        )
+
+    def prune(self, filenames):
+        """Remove data for all filenames not in the list."""
+        new_titles = {}
+        for filename in filenames:
+            if filename in self._titles:
+                new_titles[filename] = self._titles[filename]
+        self._titles = new_titles
+        for wordnames in self._mapping.itervalues():
+            wordnames.intersection_update(filenames)
+
+    def feed(self, filename, title, doctree):
+        """Feed a doctree to the index."""
+        self._titles[filename] = title
+
+        visitor = WordCollector(doctree)
+        doctree.walk(visitor)
+
+        def add_term(word, prefix='', stem=self._stemmer.stem):
+            word = stem(word)
+            if len(word) < 3 or word in stopwords or word.isdigit():
+                return
+            self._mapping.setdefault(prefix + word, set()).add(filename)
+
+        for word in word_re.findall(title):
+            add_term(word)
+
+        for word in visitor.found_words:
+            add_term(word)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.setup_command
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Setuptools/distutils commands to assist the building of sphinx
+    documentation.
+
+    :author: Sebastian Wiesner
+    :contact: basti.wiesner@gmx.net
+    :copyright: 2008 by Sebastian Wiesner.
+    :license: MIT.
+"""
+
+import sys
+import os
+from StringIO import StringIO
+from distutils.cmd import Command
+
+from sphinx.application import Sphinx
+from sphinx.util.console import darkred, nocolor
+
+
+class BuildDoc(Command):
+    """Distutils command to build Sphinx documentation."""
+
+    description = 'Build Sphinx documentation'
+    user_options = [
+        ('fresh-env', 'E', 'discard saved environment'),
+        ('all-files', 'a', 'build all files'),
+        ('source-dir=', 's', 'Source directory'),
+        ('build-dir=', None, 'Build directory'),
+        ('builder=', 'b', 'The builder to use. Defaults to "html"'),
+        ]
+    boolean_options = ['fresh-env', 'all-files']
+
+
+    def initialize_options(self):
+        self.fresh_env = self.all_files = False
+        self.source_dir = self.build_dir = None
+        self.conf_file_name = 'conf.py'
+        self.builder = 'html'
+
+    def finalize_options(self):
+        if self.source_dir is None:
+            if os.path.isdir('doc'):
+                for root, dirnames, filenames in os.walk('doc'):
+                    if 'conf.py' in filenames:
+                        self.source_dir = root
+                        self.announce('Using source directory %s' % root)
+                        break
+        self.ensure_dirname('source_dir')
+        self.source_dir = os.path.abspath(self.source_dir)
+
+        if self.build_dir is None:
+            build = self.get_finalized_command('build')
+            self.build_dir = os.path.join(build.build_base, 'sphinx')
+            self.mkpath(self.build_dir)
+        self.ensure_dirname('build_dir')
+        self.doctree_dir = os.path.join(self.build_dir, 'doctrees')
+        self.mkpath(self.doctree_dir)
+        self.builder_target_dir = os.path.join(self.build_dir, self.builder)
+        self.mkpath(self.builder_target_dir)
+
+    def run(self):
+        if not sys.stdout.isatty() or sys.platform == 'win32':
+            # Windows' poor cmd box doesn't understand ANSI sequences
+            nocolor()
+        if not self.verbose:
+            status_stream = StringIO()
+        else:
+            status_stream = sys.stdout
+        app = Sphinx(self.source_dir, self.source_dir,
+                     self.builder_target_dir, self.doctree_dir,
+                     self.builder, {}, status_stream,
+                     freshenv=self.fresh_env)
+
+        try:
+            if self.all_files:
+                app.builder.build_all()
+            else:
+                app.builder.build_update()
+        except Exception, err:
+            from docutils.utils import SystemMessage
+            if isinstance(err, SystemMessage):
+                sys.stderr, darkred('reST markup error:')
+                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
+            else:
+                raise
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,657 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    color: #fff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    color: #fff;
+    width: 100%;
+    line-height: 30px;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related a {
+    color: white;
+}
+
+/* ::: TOC :::: */
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: white;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    list-style: none;
+    color: white;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+    margin: -5px 10px 5px 10px;
+    padding: 10px;
+    line-height: 160%;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+    padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    padding: 5px 10px 5px 10px;
+    border-top: 1px solid #cbe7e5;
+    border-bottom: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    font-weight: bold;
+}
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+    background-color: #ffe4e4;
+    padding: 10px;
+    margin: 0 -20px 0 -20px;
+    border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* Sidebars */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    padding: 5px;
+    background-color: #efc;
+    color: #333;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 100%;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+img.math {
+    vertical-align: middle;
+}
+
+div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+img.logo {
+    border: 0;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width : 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,232 @@
+/// XXX: make it cross browser
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+ */
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {}
+}
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+}
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+}
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this)
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initModIndex();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can savely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[@id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[@id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlight');
+        });
+      }, 10);
+      $('<li class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
+          .appendTo($('.sidebar .this-page-menu'));
+    }
+  },
+
+  /**
+   * init the modindex toggle buttons
+   */
+  initModIndex : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      console.log($('tr.cg-' + idnum).toggle());
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('span.highlight').removeClass('highlight');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png has changed
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png has changed
Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,16 @@
+/**
+ * Sphinx Doc Design -- Right Side Bar Overrides
+ */
+
+
+div.sphinxsidebar {
+    float: right;
+}
+
+div.bodywrapper {
+    margin: 0 230px 0 0;
+}
+
+div.inlinecomments {
+    right: 250px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,467 @@
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+  var textLower = text.toLowerCase();
+  var start = 0;
+  $.each(keywords, function() {
+    var i = textLower.indexOf(this.toLowerCase());
+    if (i > -1)
+      start = i;
+  });
+  start = Math.max(start - 120, 0);
+  var excerpt = ((start > 0) ? '...' : '') +
+  $.trim(text.substr(start, 240)) +
+  ((start + 240 - text.length) ? '...' : '');
+  var rv = $('<div class="context"></div>').text(excerpt);
+  $.each(hlwords, function() {
+    rv = rv.highlightText(this, 'highlight');
+  });
+  return rv;
+}
+
+/**
+ * Porter Stemmer
+ */
+var PorterStemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[@name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  /**
+   * Sets the index
+   */
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (var i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.setQuery(query);
+  },
+
+  query : function(query) {
+    // stem the searchterms and add them to the
+    // correct list
+    var stemmer = new PorterStemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    for (var i = 0; i < tmp.length; i++) {
+      // stem the word
+      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      // select the correct list
+      if (word[0] == '-') {
+        var toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        var toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$.contains(toAppend, word))
+        toAppend.push(word);
+    };
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    console.debug('SEARCH: searching for:');
+    console.info('required: ', searchterms);
+    console.info('excluded: ', excluded);
+
+    // prepare search
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+    var terms = this._index.terms;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
+    var desctypes = this._index.desctypes;
+    var fileMap = {};
+    var files = null;
+    var objectResults = [];
+    var regularResults = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          if (name.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            fullname = (prefix ? prefix + '.' : '') + name;
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+
+    // perform the search on the required terms
+    for (var i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) == null)
+        break;
+      if (files.length == undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (var j = 0; j < files.length; j++) {
+        var file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (var file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+        continue;
+
+      // ensure that none of the excluded terms is in the
+      // search result.
+      for (var i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            $.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it
+      // to the result list
+      if (valid)
+        regularResults.push([filenames[file], titles[file], '', null]);
+    }
+
+    // delete unused variables in order to not waste
+    // memory until list is retrieved completely
+    delete filenames, titles, terms;
+
+    // now sort the regular results descending by title
+    regularResults.sort(function(a, b) {
+      var left = a[1].toLowerCase();
+      var right = b[1].toLowerCase();
+      return (left > right) ? -1 : ((left < right) ? 1 : 0);
+    });
+
+    // combine both
+    var results = regularResults.concat(objectResults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        listItem.append($('<a/>').attr(
+          'href',
+          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+          highlightstring + item[2]).html(item[1]));
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.get('_sources/' + item[0] + '.txt', function(data) {
+            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+            Search.output.append(listItem);
+            listItem.slideDown(5, function() {
+              displayNextItem();
+            });
+          });
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  }
+}
+
+$(document).ready(function() {
+  Search.init();
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,557 @@
+/**
+ * Alternate Sphinx design
+ * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl.
+ */
+
+body {
+    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;
+    font-size: 14px;
+    letter-spacing: -0.01em;
+    line-height: 150%;
+    text-align: center;
+    /*background-color: #AFC1C4; */
+    background-color: #BFD1D4;
+    color: black;
+    padding: 0;
+    border: 1px solid #aaa;
+
+    margin: 0px 80px 0px 80px;
+    min-width: 740px;
+}
+
+a {
+    color: #CA7900;
+    text-decoration: none;
+}
+
+a:hover {
+    color: #2491CF;
+}
+
+pre {
+    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+    font-size: 0.95em;
+    letter-spacing: 0.015em;
+    padding: 0.5em;
+    border: 1px solid #ccc;
+    background-color: #f8f8f8;
+}
+
+td.linenos pre {
+    padding: 0.5em 0;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+cite, code, tt {
+    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+    font-size: 0.95em;
+    letter-spacing: 0.01em;
+}
+
+hr {
+    border: 1px solid #abc;
+    margin: 2em;
+}
+
+tt {
+    background-color: #f2f2f2;
+    border-bottom: 1px solid #ddd;
+    color: #333;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+    border: 0;
+}
+
+tt.descclassname {
+    background-color: transparent;
+    border: 0;
+}
+
+tt.xref {
+    background-color: transparent;
+    font-weight: bold;
+    border: 0;
+}
+
+a tt {
+    background-color: transparent;
+    font-weight: bold;
+    border: 0;
+    color: #CA7900;
+}
+
+a tt:hover {
+    color: #2491CF;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+pre {
+    line-height: 120%;
+}
+
+pre a {
+    color: inherit;
+    text-decoration: underline;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+div.document {
+    background-color: white;
+    text-align: left;
+    background-image: url(contents.png);
+    background-repeat: repeat-x;
+}
+
+/*
+div.documentwrapper {
+    width: 100%;
+}
+*/
+
+div.clearer {
+    clear: both;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    background-image: url(navigation.png);
+    height: 2em;
+    list-style: none;
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 0;
+    padding-left: 10px;
+}
+
+div.related ul li {
+    margin: 0;
+    padding: 0;
+    height: 2em;
+    float: left;
+}
+
+div.related ul li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related ul li a {
+    margin: 0;
+    padding: 0 5px 0 5px;
+    line-height: 1.75em;
+    color: #EE9816;
+}
+
+div.related ul li a:hover {
+    color: #3CA8E7;
+}
+
+div.body {
+    margin: 0;
+    padding: 0.5em 20px 20px 20px;
+}
+
+div.bodywrapper {
+    margin: 0 240px 0 0;
+    border-right: 1px solid #ccc;
+}
+
+div.body a {
+    text-decoration: underline;
+}
+
+div.sphinxsidebar {
+    margin: 0;
+    padding: 0.5em 15px 15px 0;
+    width: 210px;
+    float: right;
+    text-align: left;
+/*    margin-left: -100%; */
+}
+
+div.sphinxsidebar h4, div.sphinxsidebar h3 {
+    margin: 1em 0 0.5em 0;
+    font-size: 0.9em;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    border: 1px solid #86989B;
+    background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar ul {
+    padding-left: 1.5em;
+    margin-top: 7px;
+    list-style: none;
+    padding: 0;
+    line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+    list-style: square;
+    margin-left: 20px;
+}
+
+p {
+    margin: 0.8em 0 0.5em 0;
+}
+
+p.rubric {
+    font-weight: bold;
+}
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+div.quotebar {
+    background-color: #f8f8f8;
+    max-width: 250px;
+    float: right;
+    padding: 2px 7px;
+    border: 1px solid #ccc;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+div.topic {
+    background-color: #f8f8f8;
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+}
+
+h1 {
+    margin: 0;
+    padding: 0.7em 0 0.3em 0;
+    font-size: 1.5em;
+    color: #11557C;
+}
+
+h2 {
+    margin: 1.3em 0 0.2em 0;
+    font-size: 1.35em;
+    padding: 0;
+}
+
+h3 {
+    margin: 1em 0 -0.3em 0;
+    font-size: 1.2em;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+    color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+    display: none;
+    margin: 0 0 0 0.3em;
+    padding: 0 0.2em 0 0.2em;
+    color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+    display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+    color: #777;
+    background-color: #eee;
+}
+
+table {
+    border-collapse: collapse;
+    margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+    padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.footer {
+    background-color: #E3EFF1;
+    color: #86989B;
+    padding: 3px 8px 3px 0;
+    clear: both;
+    font-size: 0.8em;
+    text-align: right;
+}
+
+div.footer a {
+    color: #86989B;
+    text-decoration: underline;
+}
+
+div.pagination {
+    margin-top: 2em;
+    padding-top: 0.5em;
+    border-top: 1px solid black;
+    text-align: center;
+}
+
+div.sphinxsidebar ul.toc {
+    margin: 1em 0 1em 0;
+    padding: 0 0 0 0.5em;
+    list-style: none;
+}
+
+div.sphinxsidebar ul.toc li {
+    margin: 0.5em 0 0.5em 0;
+    font-size: 0.9em;
+    line-height: 130%;
+}
+
+div.sphinxsidebar ul.toc li p {
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar ul.toc ul {
+    margin: 0.2em 0 0.2em 0;
+    padding: 0 0 0 1.8em;
+}
+
+div.sphinxsidebar ul.toc ul li {
+    padding: 0;
+}
+
+div.admonition, div.warning {
+    font-size: 0.9em;
+    margin: 1em 0 0 0;
+    border: 1px solid #86989B;
+    background-color: #f7f7f7;
+}
+
+div.admonition p, div.warning p {
+    margin: 0.5em 1em 0.5em 1em;
+    padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+    margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+    margin: 0;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    border-bottom: 1px solid #86989B;
+    font-weight: bold;
+    background-color: #AFC1C4;
+}
+
+div.warning {
+    border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+    background-color: #CF0000;
+    border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+    margin: 0.1em 0.5em 0.5em 3em;
+    padding: 0;
+}
+
+div.versioninfo {
+    margin: 1em 0 0 0;
+    border: 1px solid #ccc;
+    background-color: #DDEAF0;
+    padding: 8px;
+    line-height: 1.3em;
+    font-size: 0.9em;
+}
+
+
+a.headerlink {
+    color: #c60f0f!important;
+    font-size: 1em;
+    margin-left: 6px;
+    padding: 0 4px 0 4px;
+    text-decoration: none!important;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #ccc;
+    color: white!important;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+img.math {
+    vertical-align: center;
+}
+
+div.math {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+img.logo {
+    border: 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+/**
+ * Sphinx Doc Design -- Sticky sidebar Overrides
+ */
+
+div.sphinxsidebar {
+    top: 30px;
+    left: 0px;
+    position: fixed;
+    margin: 0;
+    float: none;
+}
+
+div.related {
+    position: fixed;
+}
+
+div.documentwrapper {
+    margin-top: 30px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,700 @@
+/**
+ * Sphinx Doc Design -- traditional python.org style
+ */
+
+body {
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 230px 0 0;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    border: 1px solid #99ccff;
+    padding: 10px;
+    margin: 10px 15px 10px 0;
+}
+
+div.sphinxsidebar {
+    float: right;
+    margin-left: -100%;
+    width: 230px;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    clear: both;
+    width: 100%;
+    background-color: #99ccff;
+    padding: 9px 0 9px 0;
+    text-align: center;
+}
+
+div.related {
+    background-color: #99ccff;
+    color: #333;
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    border-bottom: 5px solid white;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+    font-weight: bold;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* ::: SIDEBAR :::: */
+div.sphinxsidebar h3 {
+    margin: 0;
+}
+
+div.sphinxsidebar h4 {
+    margin: 5px 0 0 0;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    margin-left: 15px;
+    padding: 0;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    border-top: 1px solid #aaa;
+    background-color: #ddd;
+    margin: 10px 0 0 -20px;
+    padding: 5px 0 5px 20px;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    /*border: 2px solid #05171e;
+    background-color: #092835;
+    color: white;*/
+    font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecommentswrapper {
+    float: right;
+    max-width: 40%;
+}
+
+div.commentmarker {
+    float: right;
+    background-image: url(style/comment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+    text-align: center;
+    padding-top: 3px;
+}
+
+div.nocommentmarker {
+    float: right;
+    background-image: url(style/nocomment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+}
+
+div.inlinecomments {
+    margin-left: 10px;
+    margin-bottom: 5px;
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 5px;
+}
+
+div.inlinecomment {
+    border-top: 1px solid #ccc;
+    padding-top: 5px;
+    margin-top: 5px;
+}
+
+.inlinecomments p {
+    margin: 5px 0 5px 0;
+}
+
+.inlinecomments .head {
+    font-weight: bold;
+}
+
+.inlinecomments .meta {
+    font-style: italic;
+}
+
+
+/* :::: COMMENTS :::: */
+
+div#comments h3 {
+    border-top: 1px solid #aaa;
+    padding: 5px 20px 5px 20px;
+    margin: 20px -20px 20px -20px;
+    background-color: #ddd;
+}
+
+/*
+div#comments {
+    background-color: #ccc;
+    margin: 40px -20px -30px -20px;
+    padding: 0 0 1px 0;
+}
+
+div#comments h4 {
+    margin: 30px 0 20px 0;
+    background-color: #aaa;
+    border-bottom: 1px solid #09232e;
+    color: #333;
+}
+
+div#comments form {
+    display: block;
+    margin: 0 0 0 20px;
+}
+
+div#comments textarea {
+    width: 98%;
+    height: 160px;
+}
+
+div#comments div.help {
+    margin: 20px 20px 10px 0;
+    background-color: #ccc;
+    color: #333;
+}
+
+div#comments div.help p {
+    margin: 0;
+    padding: 0 0 10px 0;
+}
+
+div#comments input, div#comments textarea {
+    font-family: 'Bitstream Vera Sans', 'Arial', sans-serif;
+    font-size: 13px;
+    color: black;
+    background-color: #aaa;
+    border: 1px solid #092835;
+}
+
+div#comments input[type="reset"],
+div#comments input[type="submit"] {
+    cursor: pointer;
+    font-weight: bold;
+    padding: 2px;
+    margin: 5px 5px 5px 0;
+    background-color: #666;
+    color: white;
+}
+
+div#comments div.comment {
+    margin: 10px 10px 10px 20px;
+    padding: 10px;
+    border: 1px solid #0f3646;
+    background-color: #aaa;
+    color: #333;
+}
+
+div#comments div.comment p {
+    margin: 5px 0 5px 0;
+}
+
+div#comments div.comment p.meta {
+    font-style: italic;
+    color: #444;
+    text-align: right;
+    margin: -5px 0 -5px 0;
+}
+
+div#comments div.comment h4 {
+    margin: -10px -10px 5px -10px;
+    padding: 3px;
+    font-size: 15px;
+    background-color: #888;
+    color: white;
+    border: 0;
+}
+
+div#comments div.comment pre,
+div#comments div.comment tt {
+    background-color: #ddd;
+    color: #111;
+    border: none;
+}
+
+div#comments div.comment a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div#comments div.comment blockquote {
+    margin: 10px;
+    padding: 10px;
+    border-left: 1px solid #0f3646;
+    /*border: 1px solid #0f3646;
+    background-color: #071c25;*/
+}
+
+div#comments em.important {
+    color: #d00;
+    font-weight: bold;
+    font-style: normal;
+}*/
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+    border: 1px solid #ccc;
+    background-color: white;
+    color: black;
+}
+
+div#suggest-changes-box textarea {
+    width: 99%;
+    height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+    background-image: url(style/preview.png);
+    padding: 0 20px 20px 20px;
+    margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.5em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+}
+
+/* :::: GENINDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a:link:active           { color: #ff0000; }
+a:link:hover            { background-color: #bbeeff; }
+a:visited:hover         { background-color: #bbeeff; }
+a:visited               { color: #551a8b; }
+a:link                  { color: #0000bb; }
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: avantgarde, sans-serif;
+    font-weight: bold;
+}
+
+div.body h1 { font-size: 180%; }
+div.body h2 { font-size: 150%; }
+div.body h3 { font-size: 120%; }
+div.body h4 { font-size: 120%; }
+
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 0 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dd {
+    margin-bottom: 10px;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 0 8px 2px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.refcount {
+    color: #060;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    font-family: monospace;
+    padding: 5px;
+    color: #00008b;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    font-family: monospace;
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 13px;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.documentwrapper {
+        width: 100%;
+    }
+
+    div.body {
+        margin: 0;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
+  "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+  <head>
+    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
+  </head>
+  <frameset cols="45%,*">
+    <frame name="main" src="changes.html">
+    <frame name="src" src="about:blank">
+  </frameset>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>{% trans filename=filename, docstitle=docstitle|e %}{{ filename }} &mdash; {{ docstitle }}{% endtrans %}</title>
+    <style type="text/css">
+      .hl { background-color: yellow }
+    </style>
+  </head>
+  <body style="font-size: 90%">
+    <pre>
+      {{ text }}
+    </pre>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+{% macro entries changes %}
+<ul>{% for entry, docname, lineno in changes %}
+<li><a href="rst/{{ docname }}.html#L{{ lineno-10 }}" target="src">{{ entry }}</a></li>
+{% endfor %}</ul>
+{% endmacro -%}
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <link rel="stylesheet" href="default.css">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
+  </head>
+  <body>
+    <div class="document">
+      <div class="body">
+    <h1>{% trans version=version|e %}Automatically generated list of changes in version {{ version }}{% endtrans %}</h1>
+    <h2>{{ _('Library changes') }}</h2>
+    {% for modname, changes in libchanges %}
+    <h4>{{ modname }}</h4>
+    {{ entries(changes) }}
+    {% endfor %}
+    <h2>{{ _('C API changes') }}</h2>
+    {{ entries(apichanges) }}
+    <h2>{{ _('Other changes') }}</h2>
+    {% for (fn, title), changes in otherchanges %}
+    <h4>{{ title }} <span style="font-size: 50%">({{ fn }})</span></h4>
+    {{ entries(changes) }}
+    {% endfor %}
+      </div>
+    </div>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+{% extends "layout.html" %}
+{% set title = _('Overview') %}
+{% block body %}
+  <h1>{{ docstitle|e }}</h1>
+  <p>
+    Welcome! This is
+    {% block description %}the documentation for {{ project|e }}
+    {{ release|e }}{% if last_updated %}, last updated {{ last_updated|e }}{% endif %}{% endblock %}.
+  </p>
+  {% block tables %}
+  <p><strong>{{ _('Indices and tables:') }}</strong></p>
+  <table class="contentstable" align="center"><tr>
+    <td width="50%">
+      <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">{{ _('Complete Table of Contents') }}</a><br>
+         <span class="linkdescr">{{ _('lists all sections and subsections') }}</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ _('Search Page') }}</a><br>
+         <span class="linkdescr">{{ _('search this documentation') }}</span></p>
+    </td><td width="50%">
+      <p class="biglink"><a class="biglink" href="{{ pathto("modindex") }}">{{ _('Global Module Index') }}</a><br>
+         <span class="linkdescr">{{ _('quick access to all modules') }}</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">{{ _('General Index') }}</a><br>
+         <span class="linkdescr">{{ _('all functions, classes, terms') }}</span></p>
+    </td></tr>
+  </table>
+  {% endblock %}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{% trans key=key %}Index &ndash; {{ key }}{% endtrans %}</h1>
+
+<table width="100%" class="indextable"><tr><td width="33%" valign="top">
+<dl>
+{%- set breakat = count // 2 %}
+{%- set numcols = 1 %}
+{%- set numitems = 0 %}
+{% for entryname, (links, subitems) in entries %}
+<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
+  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+  {%- else -%}
+{{ entryname|e }}
+  {%- endif -%}</dt>
+  {%- if subitems %}
+  <dd><dl>
+    {%- for subentryname, subentrylinks in subitems %}
+    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
+    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+    </dt>
+    {%- endfor %}
+  </dl></dd>
+  {%- endif -%}
+{%- set numitems = numitems + 1 + (subitems|length) -%}
+{%- if numcols < 2 and numitems > breakat -%}
+{%- set numcols = numcols+1 -%}
+</dl></td><td width="33%" valign="top"><dl>
+{%- endif -%}
+{%- endfor %}
+</dl></td></tr></table>
+
+{% endblock %}
+
+{% block sidebarrel %}
+   <h4>Index</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{{ _('Index') }}</h1>
+
+   <p>{{ _('Index pages by letter') }}:</p>
+
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong>
+                                               ({{ _('can be huge') }})</a></p>
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+   <h4>Index</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{{ _('Index') }}</h1>
+
+   {% for key, dummy in genindexentries -%}
+   <a href="#{{ key }}"><strong>{{ key }}</strong></a> {% if not loop.last %}| {% endif %}
+   {%- endfor %}
+
+   <hr />
+
+   {% for key, entries in genindexentries %}
+<h2 id="{{ key }}">{{ key }}</h2>
+<table width="100%" class="indextable"><tr><td width="33%" valign="top">
+<dl>
+{%- set breakat = genindexcounts[loop.index0] // 2 %}
+{%- set numcols = 1 %}
+{%- set numitems = 0 %}
+{% for entryname, (links, subitems) in entries %}
+<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
+  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+  {%- else -%}
+{{ entryname|e }}
+  {%- endif -%}</dt>
+  {%- if subitems %}
+  <dd><dl>
+    {%- for subentryname, subentrylinks in subitems %}
+    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
+    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+    </dt>
+    {%- endfor %}
+  </dl></dd>
+  {%- endif -%}
+{%- set numitems = numitems + 1 + (subitems|length) -%}
+{%- if numcols < 2 and numitems > breakat -%}
+{%- set numcols = numcols+1 -%}
+</dl></td><td width="33%" valign="top"><dl>
+{%- endif -%}
+{%- endfor %}
+</dl></td></tr></table>
+{% endfor %}
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+   <h4>{{ _('Index') }}</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,192 @@
+{%- block doctype -%}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+{%- endblock %}
+{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
+{%- macro relbar %}
+    <div class="related">
+      <h3>{{ _('Navigation') }}</h3>
+      <ul>
+        {%- for rellink in rellinks %}
+        <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
+          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags }}"
+             accesskey="{{ rellink[2] }}">{{ rellink[3] }}</a>
+          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
+        {%- endfor %}
+        {%- block rootrellink %}
+        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
+        {%- endblock %}
+        {%- for parent in parents %}
+          <li><a href="{{ parent.link|e }}" accesskey="U">{{ parent.title }}</a>{{ reldelim1 }}</li>
+        {%- endfor %}
+        {%- block relbaritems %} {% endblock %}
+      </ul>
+    </div>
+{%- endmacro %}
+{%- macro sidebar %}
+      {%- if builder != 'htmlhelp' %}
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+          {%- block sidebarlogo %}
+          {%- if logo %}
+            <p class="logo"><a href="{{ pathto(master_doc) }}">
+              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
+            </a></p>
+          {%- endif %}
+          {%- endblock %}
+          {%- block sidebartoc %}
+          {%- if display_toc %}
+            <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
+            {{ toc }}
+          {%- endif %}
+          {%- endblock %}
+          {%- block sidebarrel %}
+          {%- if prev %}
+            <h4>{{ _('Previous topic') }}</h4>
+            <p class="topless"><a href="{{ prev.link|e }}" title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
+          {%- endif %}
+          {%- if next %}
+            <h4>{{ _('Next topic') }}</h4>
+            <p class="topless"><a href="{{ next.link|e }}" title="{{ _('next chapter') }}">{{ next.title }}</a></p>
+          {%- endif %}
+          {%- endblock %}
+          {%- if sourcename %}
+            <h3>{{ _('This Page') }}</h3>
+            <ul class="this-page-menu">
+            {%- if builder == 'web' %}
+              <li><a href="#comments">Comments ({{ comments|length }} so far)</a></li>
+              <li><a href="{{ pathto('@edit/' + sourcename)|e }}">{{ _('Suggest Change') }}</a></li>
+              <li><a href="{{ pathto('@source/' + sourcename)|e }}">{{ _('Show Source') }}</a></li>
+            {%- elif builder == 'html' %}
+              <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}">{{ _('Show Source') }}</a></li>
+            {%- endif %}
+            </ul>
+          {%- endif %}
+          {%- if customsidebar %}
+          {{ rendertemplate(customsidebar) }}
+          {%- endif %}
+          {%- block sidebarsearch %}
+          {%- if pagename != "search" %}
+          <h3>{% if builder == 'web' %}{{ _('Keyword search')}}{% else %}{{ _('Quick search') }}{% endif %}</h3>
+            <form class="search" action="{{ pathto('search') }}" method="get">
+              <input type="text" name="q" size="18" /> <input type="submit" value="{{ _('Go') }}" />
+              <input type="hidden" name="check_keywords" value="yes" />
+              <input type="hidden" name="area" value="default" />
+            </form>
+            {%- if builder == 'web' %}
+            <p style="font-size: 90%">{{ _('Enter a module, class or function name.') }}</p>
+            {%- endif %}
+          {%- endif %}
+          {%- endblock %}
+        </div>
+      </div>
+      {%- endif %}
+{%- endmacro -%}
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    {{ metatags }}
+    {%- if builder != 'htmlhelp' %}
+      {%- set titlesuffix = " &mdash; " + docstitle|e %}
+    {%- endif %}
+    <title>{{ title|striptags }}{{ titlesuffix }}</title>
+    {%- if builder == 'web' %}
+    <link rel="stylesheet" href="{{ pathto('index') }}?do=stylesheet{%
+      if in_admin_panel %}&admin=yes{% endif %}" type="text/css" />
+    {%- for link, type, title in page_links %}
+    <link rel="alternate" type="{{ type|e(true) }}" title="{{ title|e(true) }}" href="{{ link|e(true) }}" />
+    {%- endfor %}
+    {%- else %}
+    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+    {%- endif %}
+    {%- if builder != 'htmlhelp' %}
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '{{ pathto("", 1) }}',
+        VERSION:     '{{ release|e }}',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '{{ file_suffix }}',
+        HAS_SOURCE:  {{ has_source|lower }}
+      };
+    </script>
+    {%- for scriptfile in script_files %}
+    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+    {%- endfor %}
+    {%- if use_opensearch %}
+    <link rel="search" type="application/opensearchdescription+xml"
+          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
+          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
+    {%- endif %}
+    {%- if favicon %}
+    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
+    {%- endif %}
+    {%- endif %}
+{%- block linktags %}
+    {%- if hasdoc('about') %}
+    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
+    {%- endif %}
+    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
+    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
+    {%- if hasdoc('copyright') %}
+    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
+    {%- endif %}
+    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
+    {%- if parents %}
+    <link rel="up" title="{{ parents[-1].title|striptags }}" href="{{ parents[-1].link|e }}" />
+    {%- endif %}
+    {%- if next %}
+    <link rel="next" title="{{ next.title|striptags }}" href="{{ next.link|e }}" />
+    {%- endif %}
+    {%- if prev %}
+    <link rel="prev" title="{{ prev.title|striptags }}" href="{{ prev.link|e }}" />
+    {%- endif %}
+{%- endblock %}
+{%- block extrahead %} {% endblock %}
+  </head>
+  <body>
+
+{%- block relbar1 %}{{ relbar() }}{% endblock %}
+
+{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
+
+{%- block document %}
+    <div class="document">
+      <div class="documentwrapper">
+      {%- if builder != 'htmlhelp' %}
+        <div class="bodywrapper">
+      {%- endif %}
+          <div class="body">
+            {% block body %} {% endblock %}
+          </div>
+      {%- if builder != 'htmlhelp' %}
+        </div>
+      {%- endif %}
+      </div>
+{%- endblock %}
+
+{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
+      <div class="clearer"></div>
+    </div>
+
+{%- block relbar2 %}{{ relbar() }}{% endblock %}
+
+{%- block footer %}
+    <div class="footer">
+    {%- if hasdoc('copyright') %}
+      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
+    {%- else %}
+      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
+    {%- endif %}
+    {%- if last_updated %}
+      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+    {%- endif %}
+    {%- if show_sphinx %}
+      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+    {%- endif %}
+    </div>
+{%- endblock %}
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+{% extends "layout.html" %}
+{% set title = _('Global Module Index') %}
+{% block extrahead %}
+{{ super() }}
+{% if builder != 'htmlhelp' and collapse_modindex %}
+    <script type="text/javascript">
+      DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX = true;
+    </script>
+{% endif %}
+{% endblock %}
+{% block body %}
+
+   <h1 id="global-module-index">{{ _('Global Module Index') }}</h1>
+{% if builder == 'web' and freqentries %}
+   <p>{{ _('Most popular modules:') }}</p>
+   <div class="modulecloud">
+   {%- for module in freqentries %}
+     <a href="../q/{{ module.name|e }}/" style="font-size: {{ module.size }}%">{{ module.name|e }}</a>
+   {%- endfor %}
+   </div>
+{% endif %}
+{% if builder == 'web' %}
+   <form class="pfform" action="" method="get">
+     {{ _('Show modules only available on these platforms') }}:<br>
+     {% for pl in platforms -%}
+     <input type="checkbox" name="pf" value="{{ pl }}" id="pl-{{ pl }}"
+            {%- if pl in showpf %} checked="checked"{% endif %}>
+     <label for="pl-{{ pl }}">{{ pl }}</label>
+     {% endfor %}
+     <input type="hidden" name="newpf" value="true">
+     <input type="submit" value="Apply">
+   </form>
+{% endif %}
+
+   {%- for letter in letters %}
+   <a href="#cap-{{ letter }}"><strong>{{ letter }}</strong></a> {% if not loop.last %}| {% endif %}
+   {%- endfor %}
+   <hr/>
+
+   <table width="100%" class="indextable" cellspacing="0" cellpadding="2">
+   {%- for modname, collapse, cgroup, indent, fname, synops, pform, dep in modindexentries %}
+   {%- if not modname -%}
+   <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
+   <tr class="cap"><td></td><td><a name="cap-{{ fname }}"><strong>{{ fname }}</strong></a></td><td></td></tr>
+   {%- else -%}
+   <tr{% if indent %} class="cg-{{ cgroup }}"{% endif %}>
+     <td>{% if collapse -%}
+       <img src="{{ pathto('_static/minus.png', 1) }}" id="toggle-{{ cgroup }}"
+            class="toggler" style="display: none" alt="-" />
+         {%- endif %}</td>
+     <td>{% if indent %}&nbsp;&nbsp;&nbsp;{% endif %}
+     {% if fname %}<a href="{{ fname }}">{% endif -%}
+     <tt class="xref">{{ modname|e }}</tt>
+     {%- if fname %}</a>{% endif %}
+   {%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
+   </td><td>{% if dep %}<strong>{{ _('Deprecated')}}:</strong>{% endif %}
+     <em>{{ synops|e }}</em></td></tr>
+   {%- endif -%}
+   {% endfor %}
+   </table>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+  <ShortName>{{ project|e }}</ShortName>
+  <Description>{% trans docstitle=docstitle|e %}Search {{ docstitle }}{% endtrans %}</Description>
+  <InputEncoding>utf-8</InputEncoding>
+  <Url type="text/html" method="get"
+       template="{{ use_opensearch }}/{{ pathto('search') }}?q={searchTerms}&amp;check_keywords=yes&amp;area=default"/>
+  <LongName>{{ docstitle|e }}</LongName>
+{% block extra %} {# Put e.g. an <Image> element here. #} {% endblock %}
+</OpenSearchDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,12 @@
+{% extends "layout.html" %}
+{% set page_links = [
+  (pathto('@rss/' + sourcename), 'application/rss+xml', 'Page Comments'),
+] %}
+{% block body %}
+  {% if oldurl %}
+  <div class="docwarning">
+    {% trans %}<strong>Note:</strong> You requested an out-of-date URL from this server. We've tried to redirect you to the new location of this page, but it may not be the right one.{% endtrans %}
+  </div>
+  {% endif %}
+  {{ body }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+{% extends "layout.html" %}
+{% set title = _('Search') %}
+{% set script_files = script_files + ['_static/searchtools.js'] %}
+{% block body %}
+  <h1 id="search-documentation">{{ _('Search') }}</h1>
+  <p>
+    {% trans %}From here you can search these documents. Enter your search
+    words into the box below and click "search". Note that the search
+    function will automatically search for all of the words. Pages
+    containing fewer words won't appear in the result list.{% endtrans %}
+  </p>
+  <form action="" method="get">
+    <input type="text" name="q" value="" />
+    <input type="submit" value="{{ _('search') }}" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  {% if search_performed %}
+    <h2>{{ _('Search Results') }}</h2>
+    {% if not search_results %}
+      <p>{{ _('Your search did not match any results.') }}</p>
+    {% endif %}
+  {% endif %}
+  <div id="search-results">
+  {% if search_results %}
+    <ul>
+    {% for href, caption, context in search_results %}
+      <li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
+        <div class="context">{{ context|e }}</div>
+      </li>
+    {% endfor %}
+    </ul>
+  {% endif %}
+  </div>
+{% endblock %}
+{% block footer %}
+  {{ super() }}
+  <script type="text/javascript" src="searchindex.js"></script>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+# Makefile for Sphinx LaTeX output
+
+ALLDOCS = $(basename $(wildcard *.tex))
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
+
+# Prefix for archive names
+ARCHIVEPRREFIX =
+
+all: $(ALLPDF)
+all-pdf: $(ALLPDF)
+all-dvi: $(ALLDVI)
+all-ps: all-dvi
+	for f in *.dvi; do dvips $$f; done
+
+zip: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+tar: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+bz2: tar
+	bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+# The number of LaTeX runs is quite conservative, but I don't expect it
+# to get run often, so the little extra time won't hurt.
+%.dvi: %.tex
+	latex '$<'
+	latex '$<'
+	latex '$<'
+	-makeindex -s python.ist '$(basename $<).idx'
+	-makeindex -s python.ist '$(basename mod$<).idx'
+	latex '$<'
+	latex '$<'
+
+%.pdf: %.tex
+	pdflatex '$<'
+	pdflatex '$<'
+	pdflatex '$<'
+	-makeindex -s python.ist '$(basename $<).idx'
+	-makeindex -s python.ist '$(basename mod$<).idx'
+	pdflatex '$<'
+	pdflatex '$<'
+
+clean:
+	rm -f *.pdf *.dvi *.ps
+	rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla
+
+.PHONY: all all-pdf all-dvi all-ps clean
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,683 @@
+%%% Copyright   Ulf A. Lindgren
+%%%
+%%% Note        Premission is granted to modify this file under
+%%%             the condition that it is saved using another
+%%%             file and package name.
+%%%
+%%% Revision    1.1 (1997)
+%%%
+%%%             Jan. 8th Modified package name base date option
+%%%             Jan. 22th Modified FmN and FmTi for error in book.cls
+%%%                  \MakeUppercase{#}->{\MakeUppercase#}
+%%%             Apr. 6th Modified Lenny option to prevent undesired 
+%%%                  skip of line.
+%%%             Nov. 8th Fixed \@chapapp for AMS
+%%%
+%%% Revision    1.2 (1998)
+%%%
+%%%             Feb. 11th Fixed appendix problem related to Bjarne
+%%%             Aug. 11th Fixed problem related to 11pt and 12pt 
+%%%                  suggested by Tomas Lundberg. THANKS!
+%%%
+%%% Revision    1.3 (2004)
+%%%             Sep. 20th problem with frontmatter, mainmatter and
+%%%                  backmatter, pointed out by Lapo Mori
+%%%
+%%% Revision    1.31 (2004)
+%%%             Sep. 21th problem with the Rejne definition streched text
+%%%                  caused ugly gaps in the vrule aligned with the title
+%%%                  text. Kindly pointed out to me by Hendri Adriaens
+%%%
+%%% Revision    1.32 (2005)
+%%%             Jun. 23th compatibility problem with the KOMA class 'scrbook.cls'
+%%%                  a remedy is a redefinition of '\@schapter' in
+%%%                  line with that used in KOMA. The problem was pointed
+%%%                  out to me by Mikkel Holm Olsen
+%%%
+%%% Revision    1.33 (2005)
+%%%             Aug. 9th misspelled ``TWELV'' corrected, the error was pointed
+%%%                  out to me by George Pearson
+%%%
+%%% Revision    1.34 (2007)
+%%%             Added an alternative to Lenny provided by Peter
+%%%             Osborne (2005-11-28)
+%%%             Corrected front, main and back matter, based on input
+%%%             from Bas van Gils (2006-04-24)
+%%%             Jul. 30th Added Bjornstrup option provided by Jean-Marc
+%%%             Francois (2007-01-05).
+%%%             Reverted to \MakeUppercase{#} see rev 1.1, solved
+%%%             problem with MakeUppercase and MakeLowercase pointed
+%%%             out by Marco Feuerstein  (2007-06-06) 
+
+
+%%% Last modified   Jul. 2007
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{fncychap}
+             [2007/07/30 v1.34
+                 LaTeX package (Revised chapters)]
+
+%%%% For conditional inclusion of color
+\newif\ifusecolor
+\usecolorfalse
+
+
+
+%%%% DEFINITION OF Chapapp variables
+\newcommand{\CNV}{\huge\bfseries}
+\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}}
+
+
+%%%% DEFINITION OF TheChapter variables
+\newcommand{\CNoV}{\huge\bfseries}
+\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}}
+
+\newif\ifUCN
+\UCNfalse
+\newif\ifLCN
+\LCNfalse
+\def\ChNameLowerCase{\LCNtrue\UCNfalse}
+\def\ChNameUpperCase{\UCNtrue\LCNfalse}
+\def\ChNameAsIs{\UCNfalse\LCNfalse}
+
+%%%%% Fix for AMSBook 971008
+
+\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}
+
+
+%%%%% Fix for Bjarne and appendix 980211
+
+\newif\ifinapp
+\inappfalse
+\renewcommand\appendix{\par
+  \setcounter{chapter}{0}%
+  \setcounter{section}{0}%
+  \inapptrue%
+  \renewcommand\@chapapp{\appendixname}%
+  \renewcommand\thechapter{\@Alph\c@chapter}}
+
+%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
+
+\@ifundefined{@mainmatter}{\newif\if@mainmatter \@mainmattertrue}{}
+
+%%%%%
+
+
+
+\newcommand{\FmN}[1]{%
+\ifUCN
+   {\MakeUppercase{#1}}\LCNfalse
+\else
+   \ifLCN
+      {\MakeLowercase{#1}}\UCNfalse
+   \else #1
+   \fi
+\fi}
+
+
+%%%% DEFINITION OF Title variables
+\newcommand{\CTV}{\Huge\bfseries}
+\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}}
+
+%%%% DEFINITION OF the basic rule width
+\newlength{\RW}
+\setlength{\RW}{1pt}
+\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}}
+
+\newif\ifUCT
+\UCTfalse
+\newif\ifLCT
+\LCTfalse
+\def\ChTitleLowerCase{\LCTtrue\UCTfalse}
+\def\ChTitleUpperCase{\UCTtrue\LCTfalse}
+\def\ChTitleAsIs{\UCTfalse\LCTfalse}
+\newcommand{\FmTi}[1]{%
+\ifUCT
+   {\MakeUppercase{#1}}\LCTfalse
+\else
+   \ifLCT
+      {\MakeLowercase{#1}}\UCTfalse
+   \else {#1}
+   \fi
+\fi}
+
+
+
+\newlength{\mylen}
+\newlength{\myhi}
+\newlength{\px}
+\newlength{\py}
+\newlength{\pyy}
+\newlength{\pxx}
+
+
+\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@}
+
+\newcommand{\DOCH}{%
+  \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+  \par\nobreak
+  \vskip 20\p@
+  }
+\newcommand{\DOTI}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+\newcommand{\DOTIS}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+
+%%%%%% SONNY DEF
+
+\DeclareOption{Sonny}{%
+  \ChNameVar{\Large\sf}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\Large\sf}
+  \ChRuleWidth{0.5pt}
+  \ChNameUpperCase
+  \renewcommand{\DOCH}{%
+    \raggedleft
+    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+    \par\nobreak
+    \vskip 40\p@}
+  \renewcommand{\DOTI}[1]{%
+    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
+    \vskip 5\p@
+    \CTV\FmTi{#1}\par\nobreak
+    \mghrulefill{\RW}\par\nobreak
+    \vskip 40\p@}
+  \renewcommand{\DOTIS}[1]{%
+    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
+    \vskip 5\p@
+    \CTV\FmTi{#1}\par\nobreak
+    \mghrulefill{\RW}\par\nobreak
+    \vskip 40\p@}
+}
+
+%%%%%% LENNY DEF
+
+\DeclareOption{Lenny}{%
+
+  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
+  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
+  \ChTitleVar{\Huge\bfseries\rm}
+  \ChRuleWidth{1pt}
+  \renewcommand{\DOCH}{%
+    \settowidth{\px}{\CNV\FmN{\@chapapp}}
+    \addtolength{\px}{2pt}
+    \settoheight{\py}{\CNV\FmN{\@chapapp}}
+    \addtolength{\py}{1pt}
+
+    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
+    \addtolength{\mylen}{1pt}
+    \settowidth{\pxx}{\CNoV\thechapter}
+    \addtolength{\pxx}{-1pt}
+
+    \settoheight{\pyy}{\CNoV\thechapter}
+    \addtolength{\pyy}{-2pt}
+    \setlength{\myhi}{\pyy}
+    \addtolength{\myhi}{-1\py}
+    \par
+    \parbox[b]{\textwidth}{%
+    \rule[\py]{\RW}{\myhi}%
+    \hskip -\RW%
+    \rule[\pyy]{\px}{\RW}%
+    \hskip -\px%
+    \raggedright%
+    \CNV\FmN{\@chapapp}\space\CNoV\thechapter%
+    \hskip1pt%
+    \mghrulefill{\RW}%
+    \rule{\RW}{\pyy}\par\nobreak%
+    \vskip -\baselineskip%
+    \vskip -\pyy%
+    \hskip \mylen%
+    \mghrulefill{\RW}\par\nobreak%
+    \vskip \pyy}%
+    \vskip 20\p@}
+ 
+
+  \renewcommand{\DOTI}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+
+  \renewcommand{\DOTIS}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+%%%%%% Peter Osbornes' version of LENNY DEF
+
+\DeclareOption{PetersLenny}{%
+
+% five new lengths 
+\newlength{\bl}                           %  bottom left   : orig \space
+\setlength{\bl}{6pt}
+\newcommand{\BL}[1]{\setlength{\bl}{#1}}
+\newlength{\br}                           %  bottom right  : orig 1pt
+\setlength{\br}{1pt}
+\newcommand{\BR}[1]{\setlength{\br}{#1}}
+\newlength{\tl}                           %  top left      : orig 2pt
+\setlength{\tl}{2pt}
+\newcommand{\TL}[1]{\setlength{\tl}{#1}}
+\newlength{\trr}                           %  top right      :orig 1pt 
+\setlength{\trr}{1pt}
+\newcommand{\TR}[1]{\setlength{\trr}{#1}}
+\newlength{\blrule}                           %  top right      :orig 1pt 
+\setlength{\trr}{0pt}
+\newcommand{\BLrule}[1]{\setlength{\blrule}{#1}}
+
+
+  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
+  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
+  \ChTitleVar{\Huge\bfseries\rm}
+  \ChRuleWidth{1pt}
+\renewcommand{\DOCH}{%
+
+
+%%%%%%%                                   tweaks for 1--9 and A--Z
+\ifcase\c@chapter\relax%
+\or\BL{-3pt}\TL{-4pt}\BR{0pt}\TR{-6pt}%1
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%2
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%3
+\or\BL{0pt}\TL{5pt}\BR{2pt}\TR{-4pt}%4
+\or\BL{0pt}\TL{3pt}\BR{2pt}\TR{-4pt}%5
+\or\BL{-1pt}\TL{0pt}\BR{2pt}\TR{-2pt}%6
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%7
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%8
+\or\BL{0pt}\TL{-3pt}\BR{-4pt}\TR{-2pt}%9
+\or\BL{-3pt}\TL{-3pt}\BR{2pt}\TR{-7pt}%10
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%11
+\or\BL{-6pt}\TL{-6pt}\BR{2pt}\TR{-7pt}%12
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%13
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%14
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%15
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%16
+\or\BL{-5pt}\TL{-3pt}\BR{-8pt}\TR{-6pt}%17
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%18
+\or\BL{-3pt}\TL{-3pt}\BR{-6pt}\TR{-9pt}%19
+\or\BL{0pt}\TL{0pt}\BR{0pt}\TR{-5pt}%20
+\fi
+
+\ifinapp\ifcase\c@chapter\relax%
+\or\BL{0pt}\TL{14pt}\BR{5pt}\TR{-19pt}%A
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}%B
+\or\BL{-3pt}\TL{-2pt}\BR{1pt}\TR{-6pt}\BLrule{0pt}%C
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}\BLrule{0pt}%D
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-3pt}%E
+\or\BL{0pt}\TL{-5pt}\BR{-10pt}\TR{-1pt}%F
+\or\BL{-3pt}\TL{0pt}\BR{0pt}\TR{-7pt}%G
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%H
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%I
+\or\BL{2pt}\TL{0pt}\BR{-3pt}\TR{1pt}%J
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%K
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-19pt}%L
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%M
+\or\BL{0pt}\TL{-5pt}\BR{-2pt}\TR{-1pt}%N
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%O
+\or\BL{0pt}\TL{-5pt}\BR{-9pt}\TR{-3pt}%P
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%Q
+\or\BL{0pt}\TL{-5pt}\BR{4pt}\TR{-8pt}%R
+\or\BL{-2pt}\TL{-2pt}\BR{-2pt}\TR{-7pt}%S
+\or\BL{-3pt}\TL{0pt}\BR{-5pt}\TR{4pt}\BLrule{8pt}%T
+\or\BL{-7pt}\TL{-11pt}\BR{-5pt}\TR{-7pt}\BLrule{0pt}%U
+\or\BL{-14pt}\TL{-5pt}\BR{-14pt}\TR{-1pt}\BLrule{14pt}%V
+\or\BL{-10pt}\TL{-9pt}\BR{-13pt}\TR{-3pt}\BLrule{7pt}%W
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%X
+\or\BL{-6pt}\TL{-4pt}\BR{-7pt}\TR{1pt}\BLrule{7pt}%Y
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%Z
+\fi\fi
+%%%%%%%
+    \settowidth{\px}{\CNV\FmN{\@chapapp}}
+    \addtolength{\px}{\tl}        %MOD change 2pt to \tl
+    \settoheight{\py}{\CNV\FmN{\@chapapp}}
+    \addtolength{\py}{1pt}
+
+    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
+    \addtolength{\mylen}{\trr}% MOD change 1pt to \tr
+    \settowidth{\pxx}{\CNoV\thechapter}
+    \addtolength{\pxx}{-1pt}
+
+    \settoheight{\pyy}{\CNoV\thechapter}
+    \addtolength{\pyy}{-2pt}
+    \setlength{\myhi}{\pyy}
+    \addtolength{\myhi}{-1\py}
+    \par
+    \parbox[b]{\textwidth}{%
+    \rule[\py]{\RW}{\myhi}%
+    \hskip -\RW%
+    \rule[\pyy]{\px}{\RW}% 
+    \hskip -\px%
+    \raggedright%
+    \CNV\FmN{\@chapapp}\rule{\blrule}{\RW}\hskip\bl\CNoV\thechapter%MOD 
+%    \CNV\FmN{\@chapapp}\space\CNoV\thechapter                     %ORIGINAL
+    \hskip\br%                           %MOD 1pt to \br
+    \mghrulefill{\RW}% 
+    \rule{\RW}{\pyy}\par\nobreak% 
+    \vskip -\baselineskip%
+    \vskip -\pyy%
+    \hskip \mylen%
+    \mghrulefill{\RW}\par\nobreak%
+    \vskip \pyy}%
+    \vskip 20\p@}
+ 
+
+  \renewcommand{\DOTI}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+
+  \renewcommand{\DOTIS}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+
+%
+
+
+%%%%%% BJORNSTRUP DEF
+
+\DeclareOption{Bjornstrup}{%
+  \usecolortrue
+  % pzc (Zapf Chancelery) is nice.  ppl (Palatino) is cool too.
+  \ChNumVar{\fontsize{76}{80}\usefont{OT1}{pzc}{m}{n}\selectfont}
+  \ChTitleVar{\raggedleft\Large\sffamily\bfseries}
+
+  \setlength{\myhi}{10pt}         % Space between grey box border and text
+  \setlength{\mylen}{\textwidth}
+  \addtolength{\mylen}{-2\myhi}
+  \renewcommand{\DOCH}{%
+    \settowidth{\py}{\CNoV\thechapter}
+    \addtolength{\py}{-10pt}      % Amount of space by which the
+%                                  % number is shifted right
+    \fboxsep=0pt%
+    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}%
+    \kern-\py\raise20pt%
+    \hbox{\color[gray]{.5}\CNoV\thechapter}\\%
+  }
+  
+  \renewcommand{\DOTI}[1]{%
+    \nointerlineskip\raggedright%
+    \fboxsep=\myhi%
+    \vskip-1ex%
+    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
+    \vskip 40\p@%
+  }
+
+  \renewcommand{\DOTIS}[1]{%
+    \fboxsep=0pt
+    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}\\%
+    \nointerlineskip\raggedright%
+    \fboxsep=\myhi%
+    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
+    \vskip 40\p@%
+  }
+}
+
+
+%%%%%%% GLENN DEF
+
+
+\DeclareOption{Glenn}{%
+  \ChNameVar{\bfseries\Large\sf}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\bfseries\Large\rm}
+  \ChRuleWidth{1pt}
+  \ChNameUpperCase
+  \ChTitleUpperCase
+  \renewcommand{\DOCH}{%
+    \settoheight{\myhi}{\CTV\FmTi{Test}}
+    \setlength{\py}{\baselineskip}
+    \addtolength{\py}{\RW}
+    \addtolength{\py}{\myhi}
+    \setlength{\pyy}{\py}
+    \addtolength{\pyy}{-1\RW}
+     
+    \raggedright
+    \CNV\FmN{\@chapapp}\space\CNoV\thechapter
+    \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak}
+
+  \renewcommand{\DOTI}[1]{%
+    \addtolength{\pyy}{-4pt}
+    \settoheight{\myhi}{\CTV\FmTi{#1}}
+    \addtolength{\myhi}{\py}
+    \addtolength{\myhi}{-1\RW}
+    \vskip -1\pyy
+    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
+    \raggedleft\CTV\FmTi{#1}\par\nobreak
+    \vskip 80\p@}
+
+\newlength{\backskip}
+  \renewcommand{\DOTIS}[1]{%
+%    \setlength{\py}{10pt}
+%    \setlength{\pyy}{\py}
+%    \addtolength{\pyy}{\RW}
+%    \setlength{\myhi}{\baselineskip}
+%    \addtolength{\myhi}{\pyy}
+%    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
+%    \addtolength{}{}
+%\vskip -1\baselineskip
+%    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
+%    \raggedleft\CTV\FmTi{#1}\par\nobreak
+%    \vskip 60\p@}
+%% Fix suggested by Tomas Lundberg
+    \setlength{\py}{25pt}  % eller vad man vill
+    \setlength{\pyy}{\py}
+    \setlength{\backskip}{\py}
+    \addtolength{\backskip}{2pt}
+    \addtolength{\pyy}{\RW}
+    \setlength{\myhi}{\baselineskip}
+    \addtolength{\myhi}{\pyy}
+    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
+    \vskip -1\backskip
+    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 3pt %
+    \raggedleft\CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+%%%%%%% CONNY DEF
+
+\DeclareOption{Conny}{%
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\centering\Huge\rm\bfseries}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\centering\Huge\rm}
+  \ChRuleWidth{2pt}
+
+  \renewcommand{\DOCH}{%
+    \mghrulefill{3\RW}\par\nobreak
+    \vskip -0.5\baselineskip
+    \mghrulefill{\RW}\par\nobreak
+    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+    \par\nobreak
+    \vskip -0.5\baselineskip
+   }
+  \renewcommand{\DOTI}[1]{%
+    \mghrulefill{\RW}\par\nobreak
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 60\p@
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \mghrulefill{\RW}\par\nobreak
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 60\p@
+    }
+  }
+
+%%%%%%% REJNE DEF
+
+\DeclareOption{Rejne}{%
+
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\centering\Large\rm}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\centering\Huge\rm}
+  \ChRuleWidth{1pt}
+  \renewcommand{\DOCH}{%
+    \settoheight{\py}{\CNoV\thechapter}
+    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
+    \addtolength{\py}{-1pt}
+    \CNV\FmN{\@chapapp}\par\nobreak
+    \vskip 20\p@
+    \setlength{\myhi}{2\baselineskip}
+    \setlength{\px}{\myhi}
+    \addtolength{\px}{-1\RW}
+    \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip
+    10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip 10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak
+     \vskip -3\p@% Added -2pt vskip to correct for streched text v1.31
+    }
+  \renewcommand{\DOTI}[1]{%
+    \setlength{\mylen}{\textwidth}
+    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
+    \addtolength{\mylen}{-2\RW}
+    {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule width\RW}\par\nobreak%
+    \vskip -3pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip}%
+    \vskip 60\p@% Added -2pt in vskip to correct for streched text v1.31
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \setlength{\py}{\fboxrule}
+    \setlength{\fboxrule}{\RW}
+    \setlength{\mylen}{\textwidth}
+    \addtolength{\mylen}{-2\RW}
+    \fbox{\parbox{\mylen}{\vskip 2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}} 
+    \setlength{\fboxrule}{\py}
+    \vskip 60\p@
+    }
+  }
+
+
+%%%%%%% BJARNE DEF
+
+\DeclareOption{Bjarne}{%
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\raggedleft\normalsize\rm}
+  \ChNumVar{\raggedleft \bfseries\Large}
+  \ChTitleVar{\raggedleft \Large\rm}
+  \ChRuleWidth{1pt}
+
+
+%% Note thechapter -> c@chapter fix appendix bug
+%% Fixed misspelled 12
+
+  \newcounter{AlphaCnt}
+  \newcounter{AlphaDecCnt}
+  \newcommand{\AlphaNo}{%
+    \ifcase\number\theAlphaCnt
+      \ifnum\c@chapter=0
+        ZERO\else{}\fi
+    \or ONE\or TWO\or THREE\or FOUR\or FIVE
+    \or SIX\or SEVEN\or EIGHT\or NINE\or TEN
+    \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN
+    \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi
+}
+
+  \newcommand{\AlphaDecNo}{%
+    \setcounter{AlphaDecCnt}{0}
+    \@whilenum\number\theAlphaCnt>0\do
+      {\addtocounter{AlphaCnt}{-10}
+       \addtocounter{AlphaDecCnt}{1}}
+     \ifnum\number\theAlphaCnt=0
+     \else
+       \addtocounter{AlphaDecCnt}{-1}
+       \addtocounter{AlphaCnt}{10}
+     \fi
+     
+     
+    \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or
+    FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi
+    }
+  \newcommand{\TheAlphaChapter}{%
+    
+    \ifinapp 
+      \thechapter
+    \else
+      \setcounter{AlphaCnt}{\c@chapter}
+      \ifnum\c@chapter<20
+        \AlphaNo
+      \else
+        \AlphaDecNo\AlphaNo
+      \fi
+    \fi
+    }  
+  \renewcommand{\DOCH}{%
+    \mghrulefill{\RW}\par\nobreak
+    \CNV\FmN{\@chapapp}\par\nobreak 
+    \CNoV\TheAlphaChapter\par\nobreak
+    \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak
+    \vskip 20\p@
+    }
+  \renewcommand{\DOTI}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+}
+
+\DeclareOption*{%
+  \PackageWarning{fancychapter}{unknown style option}
+  }
+
+\ProcessOptions* \relax
+
+\ifusecolor
+  \RequirePackage{color} 
+\fi
+\def\@makechapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright \normalfont
+    \ifnum \c@secnumdepth >\m@ne
+      \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
+        \DOCH
+      \fi
+    \fi
+    \interlinepenalty\@M
+    \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 060424
+      \DOTI{#1}%
+    \else%
+      \DOTIS{#1}%
+    \fi
+  }}
+
+
+%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32)
+
+%%OUT:
+%\def\@schapter#1{\if@twocolumn
+%                   \@topnewpage[\@makeschapterhead{#1}]%
+%                 \else
+%                   \@makeschapterhead{#1}%
+%                   \@afterheading
+%                 \fi}
+
+%%IN:
+\def\@schapter#1{%
+\if@twocolumn%
+  \@makeschapterhead{#1}%
+\else%
+  \@makeschapterhead{#1}%
+  \@afterheading%
+\fi}
+
+%%% End: To avoid problem with scrbook.cls (fncychap version 1.32)
+
+\def\@makeschapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright
+    \normalfont
+    \interlinepenalty\@M
+    \DOTIS{#1}
+    \vskip 40\p@
+  }}
+
+\endinput
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+%
+% howto.cls for Sphinx
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{howto}[2008/10/18 Document class (Sphinx HOWTO)]
+
+% Pass all given class options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ProcessOptions\relax
+\LoadClass[twoside]{article}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{
+  \rule{\textwidth}{1pt}
+  \ifsphinxpdfoutput
+    \begingroup
+    % This \def is required to deal with multi-line authors; it
+    % changes \\ to ', ' (comma-space), making it pass muster for
+    % generating document info in the PDF file.
+    \def\\{, }
+    \pdfinfo{
+      /Author (\@author)
+      /Title (\@title)
+    }
+    \endgroup
+  \fi
+  \begin{flushright}
+    \sphinxlogo%
+    {\rm\Huge\py@HeaderFamily \@title} \par
+    {\em\large\py@HeaderFamily \py@release\releaseinfo} \par
+    \vspace{25pt}
+    {\Large\py@HeaderFamily \@author} \par
+    \vspace{25pt}
+    \@date \par
+    \py@authoraddress \par
+  \end{flushright}
+  \@thanks
+  \setcounter{footnote}{0}
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+\let\py@OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}{
+  \begingroup
+    \parskip = 0mm
+    \py@OldTableofcontents
+  \endgroup
+  \rule{\textwidth}{1pt}
+  \vspace{12pt}
+}  
+
+\@ifundefined{fancyhf}{
+  \pagestyle{plain}}{
+  \pagestyle{normal}}		% start this way; change for
+\pagenumbering{arabic}		% ToC & chapters
+
+\thispagestyle{empty}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+%
+% manual.cls for Sphinx
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{manual}[2008/10/18 Document class (Sphinx manual)]
+
+% Pass all given class options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}
+\ProcessOptions\relax
+\LoadClass[twoside,openright]{report}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{1}
+
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{%
+  \begin{titlepage}%
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \rule{\textwidth}{1pt}%
+    \ifsphinxpdfoutput
+      \begingroup
+      % This \def is required to deal with multi-line authors; it
+      % changes \\ to ', ' (comma-space), making it pass muster for
+      % generating document info in the PDF file.
+      \def\\{, }
+      \pdfinfo{
+        /Author (\@author)
+        /Title (\@title)
+      }
+      \endgroup
+    \fi
+    \begin{flushright}%
+      \sphinxlogo%
+      {\rm\Huge\py@HeaderFamily \@title \par}%
+      {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par}
+      \vfill
+      {\LARGE\py@HeaderFamily \@author \par}
+      \vfill\vfill
+      {\large
+       \@date \par
+       \vfill
+       \py@authoraddress \par
+      }%
+    \end{flushright}%\par
+    \@thanks
+  \end{titlepage}%
+  \cleardoublepage%
+  \setcounter{footnote}{0}%
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+
+% Catch the end of the {abstract} environment, but here make sure the abstract
+% is followed by a blank page if the 'openright' option is used.
+%
+\let\py@OldEndAbstract=\endabstract
+\renewcommand{\endabstract}{
+  \if@openright
+    \ifodd\value{page}
+      \typeout{Adding blank page after the abstract.}
+      \vfil\pagebreak
+    \fi
+  \fi
+  \py@OldEndAbstract
+}
+
+% This wraps the \tableofcontents macro with all the magic to get the spacing
+% right and have the right number of pages if the 'openright' option has been
+% used.  This eliminates a fair amount of crud in the individual document files.
+%
+\let\py@OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}{%
+  \setcounter{page}{1}%
+  \pagebreak%
+  \pagestyle{plain}%
+  {%
+    \parskip = 0mm%
+    \py@OldTableofcontents%
+    \if@openright%
+      \ifodd\value{page}%
+        \typeout{Adding blank page after the table of contents.}%
+        \pagebreak\hspace{0pt}%
+      \fi%
+    \fi%
+    \cleardoublepage%
+  }%
+  \pagenumbering{arabic}%
+  \@ifundefined{fancyhf}{}{\pagestyle{normal}}%
+}
+
+% This is needed to get the width of the section # area wide enough in the
+% library reference.  Doing it here keeps it the same for all the manuals.
+%
+\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+line_max 100
+headings_flag 1
+heading_prefix "  \\bigletter "
+
+preamble "\\begin{theindex}
+\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}}
+
+"
+
+symhead_positive "{Symbols}"
+numhead_positive "{Numbers}"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,709 @@
+%
+% sphinx.sty
+%
+% Adapted from the old python.sty, mostly written by Fred Drake,
+% by Georg Brandl.
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{sphinx}[2008/05/01 LaTeX package (Sphinx markup)]
+
+\RequirePackage{textcomp}
+\RequirePackage{fancyhdr}
+\RequirePackage{fancybox}
+\RequirePackage{titlesec}
+\RequirePackage{tabulary}
+\RequirePackage{amsmath} % for \text
+\RequirePackage{makeidx}
+\RequirePackage{framed}
+\RequirePackage{color}
+\RequirePackage{fancyvrb}
+\RequirePackage{threeparttable}
+
+% Redefine these colors to your liking in the preamble.
+\definecolor{TitleColor}{rgb}{0.126,0.263,0.361}
+\definecolor{InnerLinkColor}{rgb}{0.208,0.374,0.486}
+\definecolor{OuterLinkColor}{rgb}{0.216,0.439,0.388}
+% Redefine these colors to something not white if you want to have colored
+% background and border for code examples.
+\definecolor{VerbatimColor}{rgb}{1,1,1}
+\definecolor{VerbatimBorderColor}{rgb}{1,1,1}
+
+% Uncomment these two lines to ignore the paper size and make the page 
+% size more like a typical published manual.
+%\renewcommand{\paperheight}{9in}
+%\renewcommand{\paperwidth}{8.5in}   % typical squarish manual
+%\renewcommand{\paperwidth}{7in}     % O'Reilly ``Programmming Python''
+
+% For graphicx, check if we are compiling under latex or pdflatex.
+\ifx\pdftexversion\undefined
+  \usepackage{graphicx}
+\else
+  \usepackage[pdftex]{graphicx}
+\fi
+
+% for PDF output, use colors and maximal compression
+\newif\ifsphinxpdfoutput\sphinxpdfoutputfalse
+\ifx\pdfoutput\undefined\else\ifcase\pdfoutput
+  \let\py@NormalColor\relax
+  \let\py@TitleColor\relax
+\else
+  \sphinxpdfoutputtrue
+  \input{pdfcolor}
+  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
+  \def\py@TitleColor{\color{TitleColor}}
+  \pdfcompresslevel=9
+\fi\fi
+
+% XeLaTeX can do colors, too
+\ifx\XeTeXrevision\undefined\else
+  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
+  \def\py@TitleColor{\color{TitleColor}}
+\fi
+
+% Increase printable page size (copied from fullpage.sty)
+\topmargin 0pt
+\advance \topmargin by -\headheight
+\advance \topmargin by -\headsep
+
+% attempt to work a little better for A4 users
+\textheight \paperheight
+\advance\textheight by -2in
+
+\oddsidemargin 0pt
+\evensidemargin 0pt
+%\evensidemargin -.25in  % for ``manual size'' documents
+\marginparwidth 0.5in
+
+\textwidth \paperwidth
+\advance\textwidth by -2in
+
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\parindent = 0mm
+\parskip = 2mm
+\hbadness = 5000                % don't print trivial gripes
+
+\pagestyle{empty}               % start this way; change for
+\pagenumbering{roman}           % ToC & chapters
+
+% Use this to set the font family for headers and other decor:
+\newcommand{\py@HeaderFamily}{\sffamily\bfseries}
+
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifundefined{fancyhf}{}{
+  % Use \pagestyle{normal} as the primary pagestyle for text.
+  \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
+    \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
+    \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
+    \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}}
+    \renewcommand{\headrulewidth}{0.4pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Update the plain style so we get the page number & footer line,
+  % but not a chapter or section title.  This is to keep the first
+  % page of a chapter and the blank page between chapters `clean.'
+  \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+}
+
+% Some custom font markup commands.
+%
+\newcommand{\strong}[1]{{\bf #1}}
+\newcommand{\code}[1]{\texttt{#1}}
+\newcommand{\bfcode}[1]{\code{\bfseries#1}}
+\newcommand{\samp}[1]{`\code{#1}'}
+\newcommand{\email}[1]{\textsf{#1}}
+
+\newcommand{\py@modulebadkey}{{--just-some-junk--}}
+
+% Redefine the Verbatim environment to allow border and background colors.
+% The original environment is still used for verbatims within tables.
+\let\OriginalVerbatim=\Verbatim
+\let\endOriginalVerbatim=\endVerbatim
+
+% Play with vspace to be able to keep the indentation.
+\newlength\distancetoright
+\newlength\leftsidespace
+\def\mycolorbox#1{%
+  \setlength\leftsidespace{\@totalleftmargin}%
+  \setlength\distancetoright{\textwidth}%
+  \advance\distancetoright -\@totalleftmargin %
+  \noindent\hspace*{\@totalleftmargin}%
+  \fcolorbox{VerbatimBorderColor}{VerbatimColor}{%
+  \begin{minipage}{\distancetoright}%
+    \smallskip%
+    \noindent\hspace*{-\leftsidespace}%
+    #1
+  \end{minipage}%
+  }%
+}
+\def\FrameCommand{\mycolorbox}
+
+\renewcommand{\Verbatim}[1][1]{%
+  % The list environement is needed to control perfectly the vertical
+  % space.
+  \list{}{%
+  \setlength\parskip{0pt}%
+  \setlength\itemsep{0ex}%
+  \setlength\topsep{0ex}%
+  \setlength\partopsep{0pt}%
+  \setlength\leftmargin{0pt}%
+  }%
+  \item\MakeFramed {\FrameRestore}%
+     \small%
+    \OriginalVerbatim[#1]%
+}
+\renewcommand{\endVerbatim}{%
+    \endOriginalVerbatim%
+  \endMakeFramed%
+  \endlist%
+}
+
+
+% Index-entry generation support.
+%
+
+% Command to generate two index entries (using subentries)
+\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
+
+% And three entries (using only one level of subentries)
+\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
+
+% And four (again, using only one level of subentries)
+\newcommand{\indexiv}[4]{
+\index{#1!#2 #3 #4}
+\index{#2!#3 #4, #1}
+\index{#3!#4, #1 #2}
+\index{#4!#1 #2 #3}
+}
+
+% support for the module index
+\newif\ifpy@UseModuleIndex
+\py@UseModuleIndexfalse
+
+\newcommand{\makemodindex}{
+  \newwrite\modindexfile
+  \openout\modindexfile=mod\jobname.idx
+  \py@UseModuleIndextrue
+}
+
+\newcommand{\printmodindex}{
+  \@input@{mod\jobname.ind}
+}
+
+% Add the defining entry for a module
+\newcommand{\py@modindex}[2]{%
+  \renewcommand{\py@thismodule}{#1}
+  \ifpy@UseModuleIndex%
+    \@ifundefined{py@modplat@\py@thismodulekey}{
+      \write\modindexfile{\protect\indexentry{#1@{\texttt{#1}}|hyperpage}{\thepage}}%
+    }{\write\modindexfile{\protect\indexentry{#1@{\texttt{#1 }%
+        \emph{(\platformof{\py@thismodulekey})}}|hyperpage}{\thepage}}%
+    }
+  \fi%
+}
+
+% "Current" keys
+\newcommand{\py@thisclass}{}
+\newcommand{\py@thismodule}{}
+\newcommand{\py@thismodulekey}{}
+\newcommand{\py@thismoduletype}{}
+\newcommand{\py@emptymodule}{}
+
+% \declaremodule[key]{type}{name}
+\newcommand{\declaremodule}[3][\py@modulebadkey]{
+  \renewcommand{\py@thismoduletype}{#2}
+  \ifx\py@modulebadkey#1
+    \renewcommand{\py@thismodulekey}{#3}
+  \else
+    \renewcommand{\py@thismodulekey}{#1}
+  \fi
+  \py@modindex{#3}{}
+  %\label{module-\py@thismodulekey}
+}
+
+% Record module platforms for the Module Index
+\newif\ifpy@ModPlatformFileIsOpen \py@ModPlatformFileIsOpenfalse
+\long\def\py@writeModPlatformFile#1{%
+  \protected@write\py@ModPlatformFile%
+    {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
+    {\string#1}%
+}
+\newcommand{\py@ModPlatformFilename}{\jobname.pla}
+\newcommand{\platform}[1]{
+  \ifpy@ModPlatformFileIsOpen\else
+    \newwrite\py@ModPlatformFile
+    \openout\py@ModPlatformFile=\py@ModPlatformFilename
+    \py@ModPlatformFileIsOpentrue
+  \fi
+  \py@writeModPlatformFile{\py@defplatform{\py@thismodulekey}{#1}}
+}
+\newcommand{\py@defplatform}[2]{\expandafter\def\csname py@modplat@#1\endcsname{#2}}
+\newcommand{\platformof}[1]{\csname py@modplat@#1\endcsname}
+
+\InputIfFileExists{\jobname.pla}{}{}
+
+% \moduleauthor{name}{email}
+\newcommand{\moduleauthor}[2]{}
+
+% \sectionauthor{name}{email}
+\newcommand{\sectionauthor}[2]{}
+
+% Ignore module synopsis.
+\newcommand{\modulesynopsis}[1]{}
+
+% Reset "current" objects.
+\newcommand{\resetcurrentobjects}{
+  \renewcommand{\py@thisclass}{}
+  \renewcommand{\py@thismodule}{}
+  \renewcommand{\py@thismodulekey}{}
+  \renewcommand{\py@thismoduletype}{}
+}
+
+% Augment the sectioning commands used to get our own font family in place,
+% and reset some internal data items:
+\titleformat{\section}{\Large\py@HeaderFamily}%
+            {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\subsection}{\large\py@HeaderFamily}%
+            {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\subsubsection}{\py@HeaderFamily}%
+            {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\paragraph}{\large\py@HeaderFamily}%
+            {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor}
+
+
+% Now for a lot of semantically-loaded environments that do a ton of magical
+% things to get the right formatting and index entries for the stuff in
+% Python modules and C API.
+
+
+% {fulllineitems} is used in one place in libregex.tex, but is really for
+% internal use in this file.
+%
+\newcommand{\py@itemnewline}[1]{%
+  \@tempdima\linewidth%
+  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
+}
+
+\newenvironment{fulllineitems}{
+  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
+                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
+                 \itemsep -\parsep
+                 \let\makelabel=\py@itemnewline}
+}{\end{list}}
+
+% \optional is mostly for use in the arguments parameters to the various
+% {*desc} environments defined below, but may be used elsewhere.  Known to
+% be used in the debugger chapter.
+%
+% Typical usage:
+%
+%     \begin{funcdesc}{myfunc}{reqparm\optional{, optparm}}
+%                                    ^^^       ^^^
+%                          No space here       No space here
+%
+% When a function has multiple optional parameters, \optional should be
+% nested, not chained.  This is right:
+%
+%     \begin{funcdesc}{myfunc}{\optional{parm1\optional{, parm2}}}
+%
+\let\py@badkey=\@undefined
+
+\newcommand{\optional}[1]{%
+  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+
+% This can be used when a function or method accepts an varying number 
+% of arguments, such as by using the *args syntax in the parameter list.
+\newcommand{\py@moreargs}{...}
+
+% This can be used when you don't want to document the parameters to a 
+% function or method, but simply state that it's an alias for
+% something else.
+\newcommand{\py@unspecified}{...}
+
+\newcommand{\py@varvars}[1]{{%
+    {\let\unspecified=\py@unspecified%
+      \let\moreargs=\py@moreargs%
+      \emph{#1}}}}
+
+\newlength{\py@argswidth}
+\newcommand{\py@sigparams}[1]{%
+  \parbox[t]{\py@argswidth}{\py@varvars{#1}\code{)}}}
+\newcommand{\py@sigline}[2]{%
+  \settowidth{\py@argswidth}{#1\code{(}}%
+  \addtolength{\py@argswidth}{-2\py@argswidth}%
+  \addtolength{\py@argswidth}{\textwidth}%
+  \item[#1\code{(}\py@sigparams{#2}]}
+
+% C functions ------------------------------------------------------------
+% \begin{cfuncdesc}[refcount]{type}{name}{arglist}
+% Note that the [refcount] slot should only be filled in by
+% tools/anno-api.py; it pulls the value from the refcounts database.
+\newcommand{\cfuncline}[3]{
+  \py@sigline{\code{#1 \bfcode{#2}}}{#3}%
+}
+\newenvironment{cfuncdesc}[3]{
+  \begin{fulllineitems}
+    \cfuncline{#1}{#2}{#3}
+}{\end{fulllineitems}}
+
+% C variables ------------------------------------------------------------
+% \begin{cvardesc}{type}{name}
+\newenvironment{cvardesc}[2]{
+  \begin{fulllineitems}
+    \item[\code{#1 \bfcode{#2}}]
+}{\end{fulllineitems}}
+
+% C data types -----------------------------------------------------------
+% \begin{ctypedesc}[index name]{typedef name}
+\newenvironment{ctypedesc}[2][\py@badkey]{
+  \begin{fulllineitems}
+    \item[\bfcode{#2}]
+}{\end{fulllineitems}}
+
+% C type fields ----------------------------------------------------------
+% \begin{cmemberdesc}{container type}{ctype}{membername}
+\newcommand{\cmemberline}[3]{
+  \item[\code{#2 \bfcode{#3}}]
+}
+\newenvironment{cmemberdesc}[3]{
+  \begin{fulllineitems}
+    \cmemberline{#1}{#2}{#3}
+}{\end{fulllineitems}}
+
+% Funky macros -----------------------------------------------------------
+% \begin{csimplemacrodesc}{name}
+% -- "simple" because it has no args; NOT for constant definitions!
+\newenvironment{csimplemacrodesc}[1]{
+  \begin{fulllineitems}
+    \item[\bfcode{#1}]
+}{\end{fulllineitems}}
+
+% simple functions (not methods) -----------------------------------------
+% \begin{funcdesc}{name}{args}
+\newcommand{\funcline}[2]{%
+  \py@sigline{\bfcode{#1}}{#2}}
+\newenvironment{funcdesc}[2]{
+  \begin{fulllineitems}
+    \funcline{#1}{#2}
+}{\end{fulllineitems}}
+
+% classes ----------------------------------------------------------------
+% \begin{classdesc}{name}{constructor args}
+\newcommand{\classline}[2]{
+  \py@sigline{\strong{class }\bfcode{#1}}{#2}}
+\newenvironment{classdesc}[2]{
+  % Using \renewcommand doesn't work for this, for unknown reasons:
+  \global\def\py@thisclass{#1}
+  \begin{fulllineitems}
+    \classline{#1}{#2}
+}{\end{fulllineitems}}
+
+% \begin{excclassdesc}{name}{constructor args}
+% but indexes as an exception
+\newenvironment{excclassdesc}[2]{
+  % Using \renewcommand doesn't work for this, for unknown reasons:
+  \global\def\py@thisclass{#1}
+  \begin{fulllineitems}
+    \py@sigline{\strong{exception }\bfcode{#1}}{#2}%
+}{\end{fulllineitems}}
+
+% There is no corresponding {excclassdesc*} environment.  To describe
+% a class exception without parameters, use the {excdesc} environment.
+
+
+\let\py@classbadkey=\@undefined
+
+% object method ----------------------------------------------------------
+% \begin{methoddesc}[classname]{methodname}{args}
+\newcommand{\methodline}[3][\@undefined]{
+  \py@sigline{\bfcode{#2}}{#3}}
+\newenvironment{methoddesc}[3][\@undefined]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \methodline{#2}{#3}
+    \else
+      \def\py@thisclass{#1}
+      \methodline{#2}{#3}
+    \fi
+}{\end{fulllineitems}}
+
+% static method ----------------------------------------------------------
+% \begin{staticmethoddesc}[classname]{methodname}{args}
+\newcommand{\staticmethodline}[3][\@undefined]{
+  \py@sigline{static \bfcode{#2}}{#3}}
+\newenvironment{staticmethoddesc}[3][\@undefined]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \staticmethodline{#2}{#3}
+    \else
+      \def\py@thisclass{#1}
+      \staticmethodline{#2}{#3}
+    \fi
+}{\end{fulllineitems}}
+
+% object data attribute --------------------------------------------------
+% \begin{memberdesc}[classname]{membername}
+\newcommand{\memberline}[2][\py@classbadkey]{%
+  \ifx\@undefined#1\relax
+    \item[\bfcode{#2}]
+  \else
+    \item[\bfcode{#2}]
+  \fi
+}
+\newenvironment{memberdesc}[2][\py@classbadkey]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \memberline{#2}
+    \else
+      \def\py@thisclass{#1}
+      \memberline{#2}
+    \fi
+}{\end{fulllineitems}}
+
+% For exceptions: --------------------------------------------------------
+% \begin{excdesc}{name}
+%  -- for constructor information, use excclassdesc instead
+\newenvironment{excdesc}[1]{
+  \begin{fulllineitems}
+    \item[\strong{exception }\bfcode{#1}]
+}{\end{fulllineitems}}
+
+% Module data or constants: ----------------------------------------------
+% \begin{datadesc}{name}
+\newcommand{\dataline}[1]{%
+  \item[\bfcode{#1}]\nopagebreak}
+\newenvironment{datadesc}[1]{
+  \begin{fulllineitems}
+    \dataline{#1}
+}{\end{fulllineitems}}
+
+% bytecode instruction ---------------------------------------------------
+% \begin{opcodedesc}{name}{var}
+% -- {var} may be {}
+\newenvironment{opcodedesc}[2]{
+  \begin{fulllineitems}
+    \item[\bfcode{#1}\quad\emph{#2}]
+}{\end{fulllineitems}}
+
+% generic description ----------------------------------------------------
+\newcommand{\descline}[1]{%
+  \item[\bfcode{#1}]\nopagebreak%
+}
+\newenvironment{describe}[1]{
+  \begin{fulllineitems}
+    \descline{#1}
+}{\end{fulllineitems}}
+
+% This version is being checked in for the historical record; it shows
+% how I've managed to get some aspects of this to work.  It will not
+% be used in practice, so a subsequent revision will change things
+% again.  This version has problems, but shows how to do something
+% that proved more tedious than I'd expected, so I don't want to lose
+% the example completely.
+%
+\newcommand{\grammartoken}[1]{\texttt{#1}}
+\newenvironment{productionlist}[1][\py@badkey]{
+  \def\optional##1{{\Large[}##1{\Large]}}
+  \def\production##1##2{\code{##1}&::=&\code{##2}\\}
+  \def\productioncont##1{& &\code{##1}\\}
+  \def\token##1{##1}
+  \let\grammartoken=\token
+  \parindent=2em
+  \indent
+  \begin{tabular}{lcl}
+}{%
+  \end{tabular}
+}
+
+% Notices / Admonitions
+%
+\newlength{\py@noticelength}
+
+\newcommand{\py@heavybox}{
+  \setlength{\fboxrule}{1pt}
+  \setlength{\fboxsep}{7pt}
+  \setlength{\py@noticelength}{\linewidth}
+  \addtolength{\py@noticelength}{-2\fboxsep}
+  \addtolength{\py@noticelength}{-2\fboxrule}
+  \setlength{\shadowsize}{3pt}
+  \Sbox
+  \minipage{\py@noticelength}
+}
+\newcommand{\py@endheavybox}{
+  \endminipage
+  \endSbox
+  \fbox{\TheSbox}
+}
+
+% Some are quite plain:
+\newcommand{\py@noticestart@note}{}
+\newcommand{\py@noticeend@note}{}
+\newcommand{\py@noticestart@hint}{}
+\newcommand{\py@noticeend@hint}{}
+\newcommand{\py@noticestart@important}{}
+\newcommand{\py@noticeend@important}{}
+\newcommand{\py@noticestart@tip}{}
+\newcommand{\py@noticeend@tip}{}
+
+% Others gets more visible distinction:
+\newcommand{\py@noticestart@warning}{\py@heavybox}
+\newcommand{\py@noticeend@warning}{\py@endheavybox}
+\newcommand{\py@noticestart@caution}{\py@heavybox}
+\newcommand{\py@noticeend@caution}{\py@endheavybox}
+\newcommand{\py@noticestart@attention}{\py@heavybox}
+\newcommand{\py@noticeend@attention}{\py@endheavybox}
+\newcommand{\py@noticestart@danger}{\py@heavybox}
+\newcommand{\py@noticeend@danger}{\py@endheavybox}
+\newcommand{\py@noticestart@error}{\py@heavybox}
+\newcommand{\py@noticeend@error}{\py@endheavybox}
+
+\newenvironment{notice}[2]{
+  \def\py@noticetype{#1}
+  \csname py@noticestart@#1\endcsname
+  \par\strong{#2}
+}{\csname py@noticeend@\py@noticetype\endcsname}
+
+% Allow the release number to be specified independently of the
+% \date{}.  This allows the date to reflect the document's date and
+% release to specify the release that is documented.
+%
+\newcommand{\py@release}{}
+\newcommand{\version}{}
+\newcommand{\shortversion}{}
+\newcommand{\releaseinfo}{}
+\newcommand{\releasename}{Release}
+\newcommand{\release}[1]{%
+  \renewcommand{\py@release}{\releasename\space\version}%
+  \renewcommand{\version}{#1}}
+\newcommand{\setshortversion}[1]{%
+  \renewcommand{\shortversion}{#1}}
+\newcommand{\setreleaseinfo}[1]{%
+  \renewcommand{\releaseinfo}{#1}}
+
+% Allow specification of the author's address separately from the
+% author's name.  This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\py@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+%
+\@ifundefined{ChTitleVar}{}{
+  \ChNameVar{\raggedleft\normalsize\py@HeaderFamily}
+  \ChNumVar{\raggedleft \bfseries\Large\py@HeaderFamily}
+  \ChTitleVar{\raggedleft \rm\Huge\py@HeaderFamily}
+  % This creates chapter heads without the leading \vspace*{}:
+  \def\@makechapterhead#1{%
+    {\parindent \z@ \raggedright \normalfont
+      \ifnum \c@secnumdepth >\m@ne
+        \DOCH
+      \fi
+      \interlinepenalty\@M
+      \DOTI{#1}
+    }
+  }
+}
+
+% Redefine description environment so that it is usable inside fulllineitems.
+%
+\renewcommand{\description}{%
+  \list{}{\labelwidth\z@%
+          \itemindent-\leftmargin%
+	  \labelsep5pt%
+          \let\makelabel=\descriptionlabel}}
+
+% Definition lists; requested by AMK for HOWTO documents.  Probably useful
+% elsewhere as well, so keep in in the general style support.
+%
+\newenvironment{definitions}{%
+  \begin{description}%
+  \def\term##1{\item[##1]\mbox{}\\*[0mm]}
+}{%
+  \end{description}%
+}
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
+
+
+% The following is stuff copied from docutils' latex writer.
+%
+\newcommand{\optionlistlabel}[1]{\bf #1 \hfill}
+\newenvironment{optionlist}[1]
+{\begin{list}{}
+  {\setlength{\labelwidth}{#1}
+   \setlength{\rightmargin}{1cm}
+   \setlength{\leftmargin}{\rightmargin}
+   \addtolength{\leftmargin}{\labelwidth}
+   \addtolength{\leftmargin}{\labelsep}
+   \renewcommand{\makelabel}{\optionlistlabel}}
+}{\end{list}}
+
+\newlength{\lineblockindentation}
+\setlength{\lineblockindentation}{2.5em}
+\newenvironment{lineblock}[1]
+{\begin{list}{}
+  {\setlength{\partopsep}{\parskip}
+   \addtolength{\partopsep}{\baselineskip}
+   \topsep0pt\itemsep0.15\baselineskip\parsep0pt
+   \leftmargin#1}
+ \raggedright}
+{\end{list}}
+
+% Redefine includgraphics for avoiding images larger than the screen size
+% If the size is not specified.
+\let\py@Oldincludegraphics\includegraphics
+
+\newbox\image@box%
+\newdimen\image@width%
+\renewcommand\includegraphics[2][\@empty]{%
+  \ifx#1\@empty%
+    \setbox\image@box=\hbox{\py@Oldincludegraphics{#2}}%
+    \image@width\wd\image@box%
+    \ifdim \image@width>\linewidth%
+      \setbox\image@box=\hbox{\py@Oldincludegraphics[width=\linewidth]{#2}}%
+    \fi%
+    \box\image@box%
+  \else%
+    \py@Oldincludegraphics[#1]{#2}%
+  \fi%
+}
+
+
+% Fix the index and bibliography environments to add an entry to the Table of
+% Contents; this is much nicer than just having to jump to the end of the book
+% and flip around, especially with multiple indexes.
+%
+\let\py@OldTheindex=\theindex
+\renewcommand{\theindex}{
+  \cleardoublepage
+  \phantomsection
+  \py@OldTheindex
+  \addcontentsline{toc}{chapter}{\indexname}
+}
+
+\let\py@OldThebibliography=\thebibliography
+\renewcommand{\thebibliography}[1]{
+  \cleardoublepage
+  \phantomsection
+  \py@OldThebibliography{1}
+  \addcontentsline{toc}{chapter}{\bibname}
+}
+
+% Include hyperref last.
+\RequirePackage[colorlinks,breaklinks,
+                linkcolor=InnerLinkColor,filecolor=OuterLinkColor,
+                menucolor=OuterLinkColor,pagecolor=OuterLinkColor,
+                urlcolor=OuterLinkColor]{hyperref}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,449 @@
+%%
+%% This is file `tabulary.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabulary.dtx  (with options: `package')
+%% DRAFT VERSION
+%%
+%% File `tabulary.dtx'.
+%% Copyright (C) 1995 1996 2003 David Carlisle
+%% This file may be distributed under the terms of the LPPL.
+%% See 00readme.txt for details.
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tabulary}
+          [2007/10/02 v0.9 tabulary package (DPC)]
+\RequirePackage{array}
+\catcode`\Z=14
+\DeclareOption{debugshow}{\catcode`\Z=9\relax}
+\ProcessOptions
+\def\arraybackslash{\let\\=\@arraycr}
+\def\@finalstrut#1{%
+  \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1}
+\newcount\TY@count
+\def\tabulary{%
+  \let\TY@final\tabular
+  \let\endTY@final\endtabular
+  \TY@tabular}
+\def\TY@tabular#1{%
+  \edef\TY@{\@currenvir}%
+  {\ifnum0=`}\fi
+  \@ovxx\TY@linewidth
+  \@ovyy\TY@tablewidth
+  \count@\z@
+  \@tempswatrue
+  \@whilesw\if@tempswa\fi{%
+  \advance\count@\@ne
+  \expandafter\ifx\csname TY@F\the\count@\endcsname\relax
+    \@tempswafalse
+  \else
+    \expandafter\let\csname TY@SF\the\count@\expandafter\endcsname
+                     \csname TY@F\the\count@\endcsname
+    \global\expandafter\let\csname TY@F\the\count@\endcsname\relax
+    \expandafter\let\csname TY@S\the\count@\expandafter\endcsname
+                     \csname TY@\the\count@\endcsname
+  \fi}%
+    \global\TY@count\@ne
+    \TY@width\xdef{0pt}%
+    \global\TY@tablewidth\z@
+    \global\TY@linewidth#1\relax
+Z\message{^^J^^JTable^^J%
+Z        Target Width: \the\TY@linewidth^^J%
+Z        \string\tabcolsep: \the\tabcolsep\space
+Z        \string\arrayrulewidth: \the\arrayrulewidth\space
+Z        \string\doublerulesep: \the\doublerulesep^^J%
+Z        \string\tymin: \the\tymin\space
+Z        \string\tymax: \the\tymax^^J}%
+    \let\@classz\TY@classz
+    \let\verb\TX@verb
+    \toks@{}\TY@get@body}
+\let\TY@@mkpream\@mkpream
+\def\TY@mkpream{%
+    \def\@addamp{%
+      \if@firstamp \@firstampfalse \else
+      \global\advance\TY@count\@ne
+      \edef\@preamble{\@preamble &}\fi
+      \TY@width\xdef{0pt}}%
+    \def\@acol{%
+      \TY@subwidth\col@sep
+      \@addtopreamble{\hskip\col@sep}}%
+    \let\@arrayrule\TY@arrayrule
+    \let\@classvi\TY@classvi
+    \def\@classv{\save@decl
+      \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+      \sbox\z@{\d@llarbegin\@nextchar\d@llarend}%
+      \TY@subwidth{\wd\z@}%
+      \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+      \prepnext@tok}%
+  \global\let\@mkpream\TY@@mkpream
+  \TY@@mkpream}
+\def\TY@arrayrule{%
+  \TY@subwidth\arrayrulewidth
+  \@addtopreamble \vline}
+\def\TY@classvi{\ifcase \@lastchclass
+  \@acol \or
+  \TY@subwidth\doublerulesep
+  \@addtopreamble{\hskip \doublerulesep}\or
+  \@acol \or
+  \@classvii
+  \fi}
+\def\TY@tab{%
+  \setbox\z@\hbox\bgroup
+  \let\[$\let\]$%
+  \let\equation$\let\endequation$%
+    \col@sep\tabcolsep
+    \let\d@llarbegin\begingroup\let\d@llarend\endgroup
+    \let\@mkpream\TY@mkpream
+      \def\multicolumn##1##2##3{\multispan##1\relax}%
+    \CT@start\TY@tabarray}
+\def\TY@tabarray{\@ifnextchar[{\TY@array}{\@array[t]}}
+\def\TY@array[#1]{\@array[t]}
+\def\TY@width#1{%
+  \expandafter#1\csname TY@\the\TY@count\endcsname}
+\def\TY@subwidth#1{%
+  \TY@width\dimen@
+  \advance\dimen@-#1\relax
+  \TY@width\xdef{\the\dimen@}%
+  \global\advance\TY@linewidth-#1\relax}
+\def\endtabulary{%
+  \gdef\@halignto{}%
+  \expandafter\TY@tab\the\toks@
+  \crcr\omit
+  {\xdef\TY@save@row{}%
+     \loop
+    \advance\TY@count\m@ne
+    \ifnum\TY@count>\z@
+    \xdef\TY@save@row{\TY@save@row&\omit}%
+    \repeat}\TY@save@row
+  \endarray\global\setbox1=\lastbox\setbox0=\vbox{\unvbox1
+    \unskip\global\setbox1=\lastbox}\egroup
+  \dimen@\TY@linewidth
+  \divide\dimen@\TY@count
+  \ifdim\dimen@<\tymin
+    \TY@warn{tymin too large (\the\tymin), resetting to \the\dimen@}%
+    \tymin\dimen@
+  \fi
+  \setbox\tw@=\hbox{\unhbox\@ne
+    \loop
+\@tempdima=\lastskip
+\ifdim\@tempdima>\z@
+Z   \message{ecs=\the\@tempdima^^J}%
+   \global\advance\TY@linewidth-\@tempdima
+\fi
+    \unskip
+    \setbox\tw@=\lastbox
+    \ifhbox\tw@
+Z     \message{Col \the\TY@count: Initial=\the\wd\tw@\space}%
+      \ifdim\wd\tw@>\tymax
+        \wd\tw@\tymax
+Z       \message{> max\space}%
+Z     \else
+Z       \message{ \@spaces\space}%
+      \fi
+  \TY@width\dimen@
+Z \message{\the\dimen@\space}%
+  \advance\dimen@\wd\tw@
+Z \message{Final=\the\dimen@\space}%
+   \TY@width\xdef{\the\dimen@}%
+      \ifdim\dimen@<\tymin
+Z        \message{< tymin}%
+         \global\advance\TY@linewidth-\dimen@
+         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
+                                                        {\the\dimen@}%
+       \else
+      \expandafter\ifx\csname TY@F\the\TY@count\endcsname\z@
+Z        \message{***}%
+         \global\advance\TY@linewidth-\dimen@
+         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
+                                                        {\the\dimen@}%
+        \else
+Z        \message{> tymin}%
+         \global\advance\TY@tablewidth\dimen@
+         \global\expandafter\let\csname TY@F\the\TY@count\endcsname
+                                                               \maxdimen
+       \fi\fi
+       \advance\TY@count\m@ne
+    \repeat}%
+    \TY@checkmin
+    \TY@checkmin
+    \TY@checkmin
+    \TY@checkmin
+    \TY@count\z@
+    \let\TY@box\TY@box@v
+  {\expandafter\TY@final\the\toks@\endTY@final}%
+  \count@\z@
+  \@tempswatrue
+  \@whilesw\if@tempswa\fi{%
+  \advance\count@\@ne
+  \expandafter\ifx\csname TY@SF\the\count@\endcsname\relax
+    \@tempswafalse
+  \else
+    \global\expandafter\let\csname TY@F\the\count@\expandafter\endcsname
+                   \csname TY@SF\the\count@\endcsname
+    \global\expandafter\let\csname TY@\the\count@\expandafter\endcsname
+                   \csname TY@S\the\count@\endcsname
+  \fi}%
+  \TY@linewidth\@ovxx
+  \TY@tablewidth\@ovyy
+    \ifnum0=`{\fi}}
+\def\TY@checkmin{%
+  \let\TY@checkmin\relax
+\ifdim\TY@tablewidth>\z@
+  \Gscale@div\TY@ratio\TY@linewidth\TY@tablewidth
+ \ifdim\TY@tablewidth <\linewidth
+   \def\TY@ratio{1}%
+ \fi
+\else
+  \TY@warn{No suitable columns!}%
+  \def\TY@ratio{1}%
+\fi
+\count@\z@
+Z \message{^^JLine Width: \the\TY@linewidth,
+Z             Natural Width: \the\TY@tablewidth,
+Z             Ratio: \TY@ratio^^J}%
+\@tempdima\z@
+\loop
+\ifnum\count@<\TY@count
+\advance\count@\@ne
+  \ifdim\csname TY@F\the\count@\endcsname>\tymin
+    \dimen@\csname TY@\the\count@\endcsname
+    \dimen@\TY@ratio\dimen@
+    \ifdim\dimen@<\tymin
+Z     \message{Column \the\count@\space ->}%
+      \global\expandafter\let\csname TY@F\the\count@\endcsname\tymin
+      \global\advance\TY@linewidth-\tymin
+      \global\advance\TY@tablewidth-\csname TY@\the\count@\endcsname
+      \let\TY@checkmin\TY@@checkmin
+    \else
+      \expandafter\xdef\csname TY@F\the\count@\endcsname{\the\dimen@}%
+      \advance\@tempdima\csname TY@F\the\count@\endcsname
+    \fi
+  \fi
+Z \dimen@\csname TY@F\the\count@\endcsname\message{\the\dimen@, }%
+\repeat
+Z \message{^^JTotal:\the\@tempdima^^J}%
+}
+\let\TY@@checkmin\TY@checkmin
+\newdimen\TY@linewidth
+\def\tyformat{\everypar{{\nobreak\hskip\z@skip}}}
+\newdimen\tymin
+\tymin=10pt
+\newdimen\tymax
+\tymax=2\textwidth
+\def\@testpach{\@chclass
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+  \ifnum \@lastchclass=7 5 \else
+   \ifnum \@lastchclass=8 \tw@ \else
+    \ifnum \@lastchclass=9 \thr@@
+   \else \z@
+   \ifnum \@lastchclass = 10 \else
+   \edef\@nextchar{\expandafter\string\@nextchar}%
+   \@chnum
+   \if \@nextchar c\z@ \else
+    \if \@nextchar l\@ne \else
+     \if \@nextchar r\tw@ \else
+   \if \@nextchar C7 \else
+    \if \@nextchar L8 \else
+     \if \@nextchar R9 \else
+     \if \@nextchar J10 \else
+   \z@ \@chclass
+   \if\@nextchar |\@ne \else
+    \if \@nextchar !6 \else
+     \if \@nextchar @7 \else
+      \if \@nextchar <8 \else
+       \if \@nextchar >9 \else
+  10
+  \@chnum
+  \if \@nextchar m\thr@@\else
+   \if \@nextchar p4 \else
+    \if \@nextchar b5 \else
+   \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi\fi \fi \fi\fi \fi
+     \fi  \fi  \fi  \fi  \fi  \fi \fi \fi \fi \fi \fi}
+\def\TY@classz{%
+  \@classx
+  \@tempcnta\count@
+  \ifx\TY@box\TY@box@v
+    \global\advance\TY@count\@ne
+  \fi
+  \let\centering c%
+  \let\raggedright\noindent
+  \let\raggedleft\indent
+  \let\arraybackslash\relax
+  \prepnext@tok
+  \ifnum\@chnum<4
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \ifnum\@chnum=6
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \@addtopreamble{%
+    \ifcase\@chnum
+      \hfil \d@llarbegin\insert@column\d@llarend \hfil \or
+      \kern\z@
+       \d@llarbegin \insert@column \d@llarend \hfil \or
+      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or
+      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
+      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \d@llarbegin \insert@column \d@llarend \or% dubious "s" case
+      \TY@box\centering\or
+      \TY@box\raggedright\or
+      \TY@box\raggedleft\or
+      \TY@box\relax
+    \fi}\prepnext@tok}
+\def\TY@box#1{%
+  \ifx\centering#1%
+      \hfil \d@llarbegin\insert@column\d@llarend \hfil \else
+  \ifx\raggedright#1%
+        \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+      \d@llarbegin \insert@column \d@llarend \hfil \else
+  \ifx\raggedleft#1%
+      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \else
+  \ifx\relax#1%
+       \d@llarbegin \insert@column \d@llarend
+  \fi  \fi  \fi  \fi}
+\def\TY@box@v#1{%
+      \vtop \@startpbox{\csname TY@F\the\TY@count\endcsname}%
+              #1\arraybackslash\tyformat
+                              \insert@column\@endpbox}
+\newdimen\TY@tablewidth
+\def\Gscale@div#1#2#3{%
+  \setlength\dimen@{#3}%
+  \ifdim\dimen@=\z@
+    \PackageError{graphics}{Division by 0}\@eha
+    \dimen@#2%
+  \fi
+  \edef\@tempd{\the\dimen@}%
+  \setlength\dimen@{#2}%
+  \count@65536\relax
+  \ifdim\dimen@<\z@
+    \dimen@-\dimen@
+    \count@-\count@
+  \fi
+  \loop
+    \ifdim\dimen@<8192\p@
+      \dimen@\tw@\dimen@
+      \divide\count@\tw@
+  \repeat
+  \dimen@ii=\@tempd\relax
+  \divide\dimen@ii\count@
+  \divide\dimen@\dimen@ii
+  \edef#1{\strip@pt\dimen@}}
+\long\def\TY@get@body#1\end
+  {\toks@\expandafter{\the\toks@#1}\TY@find@end}
+\def\TY@find@end#1{%
+  \def\@tempa{#1}%
+  \ifx\@tempa\TY@\def\@tempa{\end{#1}}\expandafter\@tempa
+  \else\toks@\expandafter
+    {\the\toks@\end{#1}}\expandafter\TY@get@body\fi}
+\def\TY@warn{%
+  \PackageWarning{tabulary}}
+\catcode`\Z=11
+\AtBeginDocument{
+\@ifpackageloaded{colortbl}{%
+\expandafter\def\expandafter\@mkpream\expandafter#\expandafter1%
+  \expandafter{%
+    \expandafter\let\expandafter\CT@setup\expandafter\relax
+    \expandafter\let\expandafter\CT@color\expandafter\relax
+    \expandafter\let\expandafter\CT@do@color\expandafter\relax
+    \expandafter\let\expandafter\color\expandafter\relax
+    \expandafter\let\expandafter\CT@column@color\expandafter\relax
+    \expandafter\let\expandafter\CT@row@color\expandafter\relax
+    \@mkpream{#1}}
+\let\TY@@mkpream\@mkpream
+\def\TY@classz{%
+  \@classx
+  \@tempcnta\count@
+  \ifx\TY@box\TY@box@v
+    \global\advance\TY@count\@ne
+  \fi
+  \let\centering c%
+  \let\raggedright\noindent
+  \let\raggedleft\indent
+  \let\arraybackslash\relax
+  \prepnext@tok
+\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil
+  \ifnum\@chnum<4
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \ifnum\@chnum=6
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \@addtopreamble{%
+    \setbox\z@\hbox\bgroup\bgroup
+    \ifcase\@chnum
+      \hskip\stretch{.5}\kern\z@
+      \d@llarbegin\insert@column\d@llarend\hskip\stretch{.5}\or
+      \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<
+       \d@llarbegin \insert@column \d@llarend \hfill \or
+      \hfill\kern\z@ \d@llarbegin \insert@column \d@llarend \or
+      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
+      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \d@llarbegin \insert@column \d@llarend \or% dubious s case
+      \TY@box\centering\or
+      \TY@box\raggedright\or
+      \TY@box\raggedleft\or
+      \TY@box\relax
+    \fi
+ \egroup\egroup
+\begingroup
+  \CT@setup
+  \CT@column@color
+  \CT@row@color
+  \CT@do@color
+\endgroup
+        \@tempdima\ht\z@
+        \advance\@tempdima\minrowclearance
+        \vrule\@height\@tempdima\@width\z@
+\unhbox\z@
+}\prepnext@tok}%
+    \def\TY@arrayrule{%
+      \TY@subwidth\arrayrulewidth
+      \@addtopreamble{{\CT@arc@\vline}}}%
+    \def\TY@classvi{\ifcase \@lastchclass
+      \@acol \or
+      \TY@subwidth\doublerulesep
+      \ifx\CT@drsc@\relax
+        \@addtopreamble{\hskip\doublerulesep}%
+      \else
+        \@addtopreamble{{\CT@drsc@\vrule\@width\doublerulesep}}%
+      \fi\or
+      \@acol \or
+      \@classvii
+      \fi}%
+}{%
+\let\CT@start\relax
+}
+}
+{\uccode`\*=`\ %
+\uppercase{\gdef\TX@verb{%
+  \leavevmode\null\TX@vwarn
+  {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
+  \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
+    \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
+\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
+\begingroup
+\catcode`\*=\catcode`\#
+\catcode`\#=12
+\gdef\TX@vfirst{%
+  \if\@tempa#%
+    \def\@tempb{\TX@v@#}%
+  \else
+    \let\@tempb\TX@v@
+    \if\@tempa\space~\else\@tempa\fi
+  \fi
+  \@tempb}
+\gdef\TX@v@*1 *2{%
+  \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
+\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
+\endgroup
+\def\TX@vwarn{%
+  \@warning{\noexpand\verb may be unreliable inside tabularx/y}%
+  \global\let\TX@vwarn\@empty}
+\endinput
+%%
+%% End of file `tabulary.sty'.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,679 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.textwriter
+    ~~~~~~~~~~~~~~~~~
+
+    Custom docutils writer for plain text.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import textwrap
+
+from docutils import nodes, writers
+
+from sphinx import addnodes
+from sphinx.locale import admonitionlabels, versionlabels
+
+
+class TextWriter(writers.Writer):
+    supported = ('text',)
+    settings_spec = ('No options here.', '', ())
+    settings_defaults = {}
+
+    output = None
+
+    def __init__(self, builder):
+        writers.Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        visitor = TextTranslator(self.document, self.builder)
+        self.document.walkabout(visitor)
+        self.output = visitor.body
+
+# monkey-patch...
+new_wordsep_re = re.compile(
+        r'(\s+|'                                  # any whitespace
+        r'(?<=\s)(?::[a-z-]+:)?`\S+|'             # interpreted text start
+        r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|'   # hyphenated words
+        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
+textwrap.TextWrapper.wordsep_re = new_wordsep_re
+
+MAXWIDTH = 70
+STDINDENT = 3
+
+
+class TextTranslator(nodes.NodeVisitor):
+    sectionchars = '*=-~"+'
+
+    def __init__(self, document, builder):
+        nodes.NodeVisitor.__init__(self, document)
+
+        self.states = [[]]
+        self.stateindent = [0]
+        self.sectionlevel = 0
+        self.table = None
+
+    def add_text(self, text):
+        self.states[-1].append((-1, text))
+    def new_state(self, indent=STDINDENT):
+        self.states.append([])
+        self.stateindent.append(indent)
+    def end_state(self, wrap=True, end=[''], first=None):
+        content = self.states.pop()
+        maxindent = sum(self.stateindent)
+        indent = self.stateindent.pop()
+        result = []
+        toformat = []
+        def do_format():
+            if not toformat:
+                return
+            if wrap:
+                res = textwrap.wrap(''.join(toformat), width=MAXWIDTH-maxindent)
+            else:
+                res = ''.join(toformat).splitlines()
+            if end:
+                res += end
+            result.append((indent, res))
+        for itemindent, item in content:
+            if itemindent == -1:
+                toformat.append(item)
+            else:
+                do_format()
+                result.append((indent + itemindent, item))
+                toformat = []
+        do_format()
+        if first is not None and result:
+            itemindent, item = result[0]
+            if item:
+                result.insert(0, (itemindent - indent, [first + item[0]]))
+                result[1] = (itemindent, item[1:])
+        self.states[-1].extend(result)
+
+    def visit_document(self, node):
+        self.new_state(0)
+    def depart_document(self, node):
+        self.end_state()
+        self.body = '\n'.join(line and (' '*indent + line)
+                              for indent, lines in self.states[0]
+                              for line in lines)
+        # XXX header/footer?
+
+    def visit_highlightlang(self, node):
+        raise nodes.SkipNode
+
+    def visit_section(self, node):
+        self._title_char = self.sectionchars[self.sectionlevel]
+        self.sectionlevel += 1
+    def depart_section(self, node):
+        self.sectionlevel -= 1
+
+    def visit_topic(self, node):
+        self.new_state(0)
+    def depart_topic(self, node):
+        self.end_state()
+
+    visit_sidebar = visit_topic
+    depart_sidebar = depart_topic
+
+    def visit_rubric(self, node):
+        self.new_state(0)
+        self.add_text('-[ ')
+    def depart_rubric(self, node):
+        self.add_text(' ]-')
+        self.end_state()
+
+    def visit_compound(self, node):
+        pass
+    def depart_compound(self, node):
+        pass
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_title(self, node):
+        if isinstance(node.parent, nodes.Admonition):
+            self.add_text(node.astext()+': ')
+            raise nodes.SkipNode
+        self.new_state(0)
+    def depart_title(self, node):
+        if isinstance(node.parent, nodes.section):
+            char = self._title_char
+        else:
+            char = '^'
+        text = ''.join(x[1] for x in self.states.pop() if x[0] == -1)
+        self.stateindent.pop()
+        self.states[-1].append((0, ['', text, '%s' % (char * len(text)), '']))
+
+    def visit_subtitle(self, node):
+        pass
+    def depart_subtitle(self, node):
+        pass
+
+    def visit_attribution(self, node):
+        self.add_text('-- ')
+    def depart_attribution(self, node):
+        pass
+
+    def visit_module(self, node):
+        if node.has_key('platform'):
+            self.new_state(0)
+            self.add_text(_('Platform: %s') % node['platform'])
+            self.end_state()
+        raise nodes.SkipNode
+
+    def visit_desc(self, node):
+        pass
+    def depart_desc(self, node):
+        pass
+
+    def visit_desc_signature(self, node):
+        self.new_state(0)
+        if node.parent['desctype'] in ('class', 'exception'):
+            self.add_text('%s ' % node.parent['desctype'])
+    def depart_desc_signature(self, node):
+        # XXX: wrap signatures in a way that makes sense
+        self.end_state(wrap=False, end=None)
+
+    def visit_desc_name(self, node):
+        pass
+    def depart_desc_name(self, node):
+        pass
+
+    def visit_desc_addname(self, node):
+        pass
+    def depart_desc_addname(self, node):
+        pass
+
+    def visit_desc_type(self, node):
+        pass
+    def depart_desc_type(self, node):
+        pass
+
+    def visit_desc_parameterlist(self, node):
+        self.add_text('(')
+        self.first_param = 1
+    def depart_desc_parameterlist(self, node):
+        self.add_text(')')
+
+    def visit_desc_parameter(self, node):
+        if not self.first_param:
+            self.add_text(', ')
+        else:
+            self.first_param = 0
+        self.add_text(node.astext())
+        raise nodes.SkipNode
+
+    def visit_desc_optional(self, node):
+        self.add_text('[')
+    def depart_desc_optional(self, node):
+        self.add_text(']')
+
+    def visit_desc_annotation(self, node):
+        pass
+    def depart_desc_annotation(self, node):
+        pass
+
+    def visit_refcount(self, node):
+        pass
+    def depart_refcount(self, node):
+        pass
+
+    def visit_desc_content(self, node):
+        self.new_state()
+        self.add_text('\n')
+    def depart_desc_content(self, node):
+        self.end_state()
+
+    def visit_figure(self, node):
+        self.new_state()
+    def depart_figure(self, node):
+        self.end_state()
+
+    def visit_caption(self, node):
+        pass
+    def depart_caption(self, node):
+        pass
+
+    def visit_productionlist(self, node):
+        self.new_state()
+        names = []
+        for production in node:
+            names.append(production['tokenname'])
+        maxlen = max(len(name) for name in names)
+        for production in node:
+            if production['tokenname']:
+                self.add_text(production['tokenname'].ljust(maxlen) + ' ::=')
+                lastname = production['tokenname']
+            else:
+                self.add_text('%s    ' % (' '*len(lastname)))
+            self.add_text(production.astext() + '\n')
+        self.end_state(wrap=False)
+        raise nodes.SkipNode
+
+    def visit_seealso(self, node):
+        self.new_state()
+    def depart_seealso(self, node):
+        self.end_state(first='')
+
+    def visit_footnote(self, node):
+        self._footnote = node.children[0].astext().strip()
+        self.new_state(len(self._footnote) + 3)
+    def depart_footnote(self, node):
+        self.end_state(first='[%s] ' % self._footnote)
+
+    def visit_citation(self, node):
+        if len(node) and isinstance(node[0], nodes.label):
+            self._citlabel = node[0].astext()
+        else:
+            self._citlabel = ''
+        self.new_state(len(self._citlabel) + 3)
+    def depart_citation(self, node):
+        self.end_state(first='[%s] ' % self._citlabel)
+
+    def visit_label(self, node):
+        raise nodes.SkipNode
+
+    # XXX: option list could use some better styling
+
+    def visit_option_list(self, node):
+        pass
+    def depart_option_list(self, node):
+        pass
+
+    def visit_option_list_item(self, node):
+        self.new_state(0)
+    def depart_option_list_item(self, node):
+        self.end_state()
+
+    def visit_option_group(self, node):
+        self._firstoption = True
+    def depart_option_group(self, node):
+        self.add_text('     ')
+
+    def visit_option(self, node):
+        if self._firstoption:
+            self._firstoption = False
+        else:
+            self.add_text(', ')
+    def depart_option(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        pass
+    def depart_option_string(self, node):
+        pass
+
+    def visit_option_argument(self, node):
+        self.add_text(node['delimiter'])
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_description(self, node):
+        pass
+    def depart_description(self, node):
+        pass
+
+    def visit_tabular_col_spec(self, node):
+        raise nodes.SkipNode
+
+    def visit_colspec(self, node):
+        self.table[0].append(node['colwidth'])
+        raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        pass
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        pass
+    def depart_thead(self, node):
+        pass
+
+    def visit_tbody(self, node):
+        self.table.append('sep')
+    def depart_tbody(self, node):
+        pass
+
+    def visit_row(self, node):
+        self.table.append([])
+    def depart_row(self, node):
+        pass
+
+    def visit_entry(self, node):
+        if node.has_key('morerows') or node.has_key('morecols'):
+            raise NotImplementedError('Column or row spanning cells are '
+                                      'not implemented.')
+        self.new_state(0)
+    def depart_entry(self, node):
+        text = '\n'.join('\n'.join(x[1]) for x in self.states.pop())
+        self.stateindent.pop()
+        self.table[-1].append(text)
+
+    def visit_table(self, node):
+        if self.table:
+            raise NotImplementedError('Nested tables are not supported.')
+        self.new_state(0)
+        self.table = [[]]
+    def depart_table(self, node):
+        lines = self.table[1:]
+        fmted_rows = []
+        colwidths = self.table[0]
+        realwidths = colwidths[:]
+        separator = 0
+        # don't allow paragraphs in table cells for now
+        for line in lines:
+            if line == 'sep':
+                separator = len(fmted_rows)
+            else:
+                cells = []
+                for i, cell in enumerate(line):
+                    par = textwrap.wrap(cell, width=colwidths[i])
+                    if par:
+                        maxwidth = max(map(len, par))
+                    else:
+                        maxwidth = 0
+                    realwidths[i] = max(realwidths[i], maxwidth)
+                    cells.append(par)
+                fmted_rows.append(cells)
+
+        def writesep(char='-'):
+            out = ['+']
+            for width in realwidths:
+                out.append(char * (width+2))
+                out.append('+')
+            self.add_text(''.join(out) + '\n')
+
+        def writerow(row):
+            lines = map(None, *row)
+            for line in lines:
+                out = ['|']
+                for i, cell in enumerate(line):
+                    if cell:
+                        out.append(' ' + cell.ljust(realwidths[i]+1))
+                    else:
+                        out.append(' ' * (realwidths[i] + 2))
+                    out.append('|')
+                self.add_text(''.join(out) + '\n')
+
+        for i, row in enumerate(fmted_rows):
+            if separator and i == separator:
+                writesep('=')
+            else:
+                writesep('-')
+            writerow(row)
+        writesep('-')
+        self.table = None
+        self.end_state(wrap=False)
+
+    def visit_acks(self, node):
+        self.new_state(0)
+        self.add_text(', '.join(n.astext() for n in node.children[0].children) + '.')
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        self.add_text(_('[image]'))
+        raise nodes.SkipNode
+
+    def visit_transition(self, node):
+        indent = sum(self.stateindent)
+        self.new_state(0)
+        self.add_text('=' * (MAXWIDTH - indent))
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_bullet_list(self, node):
+        self._list_counter = -1
+    def depart_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        self._list_counter = 0
+    def depart_enumerated_list(self, node):
+        pass
+
+    def visit_definition_list(self, node):
+        self._list_counter = -2
+    def depart_definition_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        if self._list_counter == -1:
+            # bullet list
+            self.new_state(2)
+        elif self._list_counter == -2:
+            # definition list
+            pass
+        else:
+            # enumerated list
+            self._list_counter += 1
+            self.new_state(len(str(self._list_counter)) + 2)
+    def depart_list_item(self, node):
+        if self._list_counter == -1:
+            self.end_state(first='* ', end=None)
+        elif self._list_counter == -2:
+            pass
+        else:
+            self.end_state(first='%s. ' % self._list_counter, end=None)
+
+    def visit_definition_list_item(self, node):
+        self._li_has_classifier = len(node) >= 2 and \
+                                  isinstance(node[1], nodes.classifier)
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.new_state(0)
+    def depart_term(self, node):
+        if not self._li_has_classifier:
+            self.end_state(end=None)
+
+    def visit_classifier(self, node):
+        self.add_text(' : ')
+    def depart_classifier(self, node):
+        self.end_state(end=None)
+
+    def visit_definition(self, node):
+        self.new_state()
+    def depart_definition(self, node):
+        self.end_state()
+
+    def visit_field_list(self, node):
+        pass
+    def depart_field_list(self, node):
+        pass
+
+    def visit_field(self, node):
+        pass
+    def depart_field(self, node):
+        pass
+
+    def visit_field_name(self, node):
+        self.new_state(0)
+    def depart_field_name(self, node):
+        self.add_text(':')
+        self.end_state(end=None)
+
+    def visit_field_body(self, node):
+        self.new_state()
+    def depart_field_body(self, node):
+        self.end_state()
+
+    def visit_centered(self, node):
+        pass
+    def depart_centered(self, node):
+        pass
+
+    def visit_admonition(self, node):
+        self.new_state(0)
+    def depart_admonition(self, node):
+        self.end_state()
+
+    def _visit_admonition(self, node):
+        self.new_state(2)
+    def _make_depart_admonition(name):
+        def depart_admonition(self, node):
+            self.end_state(first=admonitionlabels[name] + ': ')
+        return depart_admonition
+
+    visit_attention = _visit_admonition
+    depart_attention = _make_depart_admonition('attention')
+    visit_caution = _visit_admonition
+    depart_caution = _make_depart_admonition('caution')
+    visit_danger = _visit_admonition
+    depart_danger = _make_depart_admonition('danger')
+    visit_error = _visit_admonition
+    depart_error = _make_depart_admonition('error')
+    visit_hint = _visit_admonition
+    depart_hint = _make_depart_admonition('hint')
+    visit_important = _visit_admonition
+    depart_important = _make_depart_admonition('important')
+    visit_note = _visit_admonition
+    depart_note = _make_depart_admonition('note')
+    visit_tip = _visit_admonition
+    depart_tip = _make_depart_admonition('tip')
+    visit_warning = _visit_admonition
+    depart_warning = _make_depart_admonition('warning')
+
+    def visit_versionmodified(self, node):
+        self.new_state(0)
+        if node.children:
+            self.add_text(versionlabels[node['type']] % node['version'] + ': ')
+        else:
+            self.add_text(versionlabels[node['type']] % node['version'] + '.')
+    def depart_versionmodified(self, node):
+        self.end_state()
+
+    def visit_literal_block(self, node):
+        self.new_state()
+    def depart_literal_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_doctest_block(self, node):
+        self.new_state(0)
+    def depart_doctest_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_line_block(self, node):
+        self.new_state(0)
+    def depart_line_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_line(self, node):
+        pass
+    def depart_line(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.new_state()
+    def depart_block_quote(self, node):
+        self.end_state()
+
+    def visit_compact_paragraph(self, node):
+        pass
+    def depart_compact_paragraph(self, node):
+        pass
+
+    def visit_paragraph(self, node):
+        if not isinstance(node.parent, nodes.Admonition) or \
+               isinstance(node.parent, addnodes.seealso):
+            self.new_state(0)
+    def depart_paragraph(self, node):
+        if not isinstance(node.parent, nodes.Admonition) or \
+               isinstance(node.parent, addnodes.seealso):
+            self.end_state()
+
+    def visit_target(self, node):
+        raise nodes.SkipNode
+
+    def visit_index(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_pending_xref(self, node):
+        pass
+    def depart_pending_xref(self, node):
+        pass
+
+    def visit_reference(self, node):
+        pass
+    def depart_reference(self, node):
+        pass
+
+    def visit_emphasis(self, node):
+        self.add_text('*')
+    def depart_emphasis(self, node):
+        self.add_text('*')
+
+    def visit_literal_emphasis(self, node):
+        self.add_text('*')
+    def depart_literal_emphasis(self, node):
+        self.add_text('*')
+
+    def visit_strong(self, node):
+        self.add_text('**')
+    def depart_strong(self, node):
+        self.add_text('**')
+
+    def visit_title_reference(self, node):
+        self.add_text('*')
+    def depart_title_reference(self, node):
+        self.add_text('*')
+
+    def visit_literal(self, node):
+        self.add_text('``')
+    def depart_literal(self, node):
+        self.add_text('``')
+
+    def visit_subscript(self, node):
+        self.add_text('_')
+    def depart_subscript(self, node):
+        pass
+
+    def visit_superscript(self, node):
+        self.add_text('^')
+    def depart_superscript(self, node):
+        pass
+
+    def visit_footnote_reference(self, node):
+        self.add_text('[%s]' % node.astext())
+        raise nodes.SkipNode
+
+    def visit_citation_reference(self, node):
+        self.add_text('[%s]' % node.astext())
+        raise nodes.SkipNode
+
+    def visit_Text(self, node):
+        self.add_text(node.astext())
+    def depart_Text(self, node):
+        pass
+
+    def visit_problematic(self, node):
+        self.add_text('>>')
+    def depart_problematic(self, node):
+        self.add_text('<<')
+
+    def visit_system_message(self, node):
+        self.new_state(0)
+        self.add_text('<SYSTEM MESSAGE: %s>' % node.astext())
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    def visit_meta(self, node):
+        # only valid for HTML
+        raise nodes.SkipNode
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,284 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util
+    ~~~~~~~~~~~
+
+    Utility functions for Sphinx.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import re
+import sys
+import time
+import fnmatch
+import tempfile
+import traceback
+from os import path
+
+
+# Generally useful regular expressions.
+ws_re = re.compile(r'\s+')
+caption_ref_re = re.compile(r'^([^<]+?)\s*<(.+)>$')
+
+
+# SEP separates path elements in the canonical file names
+#
+# Define SEP as a manifest constant, not so much because we expect it to change
+# in the future as to avoid the suspicion that a stray "/" in the code is a
+# hangover from more *nix-oriented origins.
+SEP = "/"
+
+def os_path(canonicalpath):
+    return canonicalpath.replace(SEP, os.path.sep)
+
+
+def relative_uri(base, to):
+    """Return a relative URL from ``base`` to ``to``."""
+    b2 = base.split(SEP)
+    t2 = to.split(SEP)
+    # remove common segments
+    for x, y in zip(b2, t2):
+        if x != y:
+            break
+        b2.pop(0)
+        t2.pop(0)
+    return ('..' + SEP) * (len(b2)-1) + SEP.join(t2)
+
+
+def ensuredir(path):
+    """Ensure that a path exists."""
+    try:
+        os.makedirs(path)
+    except OSError, err:
+        if not err.errno == 17:
+            raise
+
+
+def walk(top, topdown=True, followlinks=False):
+    """
+    Backport of os.walk from 2.6, where the followlinks argument was added.
+    """
+    names = os.listdir(top)
+
+    dirs, nondirs = [], []
+    for name in names:
+        if path.isdir(path.join(top, name)):
+            dirs.append(name)
+        else:
+            nondirs.append(name)
+
+    if topdown:
+        yield top, dirs, nondirs
+    for name in dirs:
+        fullpath = path.join(top, name)
+        if followlinks or not path.islink(fullpath):
+            for x in walk(fullpath, topdown, followlinks):
+                yield x
+    if not topdown:
+        yield top, dirs, nondirs
+
+
+def get_matching_docs(dirname, suffix, exclude_docs=(), exclude_dirs=(),
+                      exclude_trees=(), exclude_dirnames=()):
+    """
+    Get all file names (without suffix) matching a suffix in a
+    directory, recursively.
+
+    Exclude docs in *exclude_docs*, exclude dirs in *exclude_dirs*,
+    prune dirs in *exclude_trees*, prune dirnames in *exclude_dirnames*.
+    """
+    pattern = '*' + suffix
+    # dirname is a normalized absolute path.
+    dirname = path.normpath(path.abspath(dirname))
+    dirlen = len(dirname) + 1    # exclude slash
+    for root, dirs, files in walk(dirname, followlinks=True):
+        if root[dirlen:] in exclude_dirs:
+            continue
+        if root[dirlen:] in exclude_trees:
+            del dirs[:]
+            continue
+        dirs.sort()
+        files.sort()
+        for prunedir in exclude_dirnames:
+            if prunedir in dirs:
+                dirs.remove(prunedir)
+        for sfile in files:
+            if not fnmatch.fnmatch(sfile, pattern):
+                continue
+            qualified_name = path.join(root[dirlen:], sfile[:-len(suffix)])
+            qualified_name = qualified_name.replace(os.path.sep, SEP)
+            if qualified_name in exclude_docs:
+                continue
+            yield qualified_name
+
+
+def mtimes_of_files(dirnames, suffix):
+    for dirname in dirnames:
+        for root, dirs, files in os.walk(dirname):
+            for sfile in files:
+                if sfile.endswith(suffix):
+                    try:
+                        yield path.getmtime(path.join(root, sfile))
+                    except EnvironmentError:
+                        pass
+
+
+def shorten_result(text='', keywords=[], maxlen=240, fuzz=60):
+    if not text:
+        text = ''
+    text_low = text.lower()
+    beg = -1
+    for k in keywords:
+        i = text_low.find(k.lower())
+        if (i > -1 and i < beg) or beg == -1:
+            beg = i
+    excerpt_beg = 0
+    if beg > fuzz:
+        for sep in ('.', ':', ';', '='):
+            eb = text.find(sep, beg - fuzz, beg - 1)
+            if eb > -1:
+                eb += 1
+                break
+        else:
+            eb = beg - fuzz
+        excerpt_beg = eb
+    if excerpt_beg < 0:
+        excerpt_beg = 0
+    msg = text[excerpt_beg:beg+maxlen]
+    if beg > fuzz:
+        msg = '... ' + msg
+    if beg < len(text)-maxlen:
+        msg = msg + ' ...'
+    return msg
+
+
+class attrdict(dict):
+    def __getattr__(self, key):
+        return self[key]
+    def __setattr__(self, key, val):
+        self[key] = val
+    def __delattr__(self, key):
+        del self[key]
+
+
+def fmt_ex(ex):
+    """Format a single line with an exception description."""
+    return traceback.format_exception_only(ex.__class__, ex)[-1].strip()
+
+
+def rpartition(s, t):
+    """Similar to str.rpartition from 2.5, but doesn't return the separator."""
+    i = s.rfind(t)
+    if i != -1:
+        return s[:i], s[i+len(t):]
+    return '', s
+
+
+def format_exception_cut_frames(x=1):
+    """
+    Format an exception with traceback, but only the last x frames.
+    """
+    typ, val, tb = sys.exc_info()
+    #res = ['Traceback (most recent call last):\n']
+    res = []
+    tbres = traceback.format_tb(tb)
+    res += tbres[-x:]
+    res += traceback.format_exception_only(typ, val)
+    return ''.join(res)
+
+
+def save_traceback():
+    """
+    Save the current exception's traceback in a temporary file.
+    """
+    exc = traceback.format_exc()
+    fd, path = tempfile.mkstemp('.log', 'sphinx-err-')
+    os.write(fd, exc)
+    os.close(fd)
+    return path
+
+
+def _translate_pattern(pat):
+    """
+    Translate a shell-style glob pattern to a regular expression.
+
+    Adapted from the fnmatch module, but enhanced so that single stars don't
+    match slashes.
+    """
+    i, n = 0, len(pat)
+    res = ''
+    while i < n:
+        c = pat[i]
+        i += 1
+        if c == '*':
+            if i < n and pat[i] == '*':
+                # double star matches slashes too
+                i += 1
+                res = res + '.*'
+            else:
+                # single star doesn't match slashes
+                res = res + '[^/]*'
+        elif c == '?':
+            # question mark doesn't match slashes too
+            res = res + '[^/]'
+        elif c == '[':
+            j = i
+            if j < n and pat[j] == '!':
+                j += 1
+            if j < n and pat[j] == ']':
+                j += 1
+            while j < n and pat[j] != ']':
+                j += 1
+            if j >= n:
+                res = res + '\\['
+            else:
+                stuff = pat[i:j].replace('\\', '\\\\')
+                i = j + 1
+                if stuff[0] == '!':
+                    # negative pattern mustn't match slashes too
+                    stuff = '^/' + stuff[1:]
+                elif stuff[0] == '^':
+                    stuff = '\\' + stuff
+                res = '%s[%s]' % (res, stuff)
+        else:
+            res += re.escape(c)
+    return res + '$'
+
+
+_pat_cache = {}
+
+def patfilter(names, pat):
+    """
+    Return the subset of the list NAMES that match PAT.
+    Adapted from fnmatch module.
+    """
+    result = []
+    if pat not in _pat_cache:
+        _pat_cache[pat] = re.compile(_translate_pattern(pat))
+    match = _pat_cache[pat].match
+    return filter(match, names)
+
+
+no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
+
+def make_filename(string):
+    return no_fn_re.sub('', string)
+
+
+def nested_parse_with_titles(state, content, node):
+    # hack around title style bookkeeping
+    surrounding_title_styles = state.memo.title_styles
+    surrounding_section_level = state.memo.section_level
+    state.memo.title_styles = []
+    state.memo.section_level = 0
+    state.nested_parse(content, 0, node, match_titles=1)
+    state.memo.title_styles = surrounding_title_styles
+    state.memo.section_level = surrounding_section_level
+
+
+def ustrftime(format, *args):
+    # strftime for unicode strings
+    return time.strftime(unicode(format).encode('utf-8'), *args).decode('utf-8')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.compat
+    ~~~~~~~~~~~~~~~~~~
+
+    Stuff for docutils compatibility.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+
+# function missing in 0.5 SVN
+def make_admonition(node_class, name, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    #if not content:
+    #    error = state_machine.reporter.error(
+    #        'The "%s" admonition is empty; content required.' % (name),
+    #        nodes.literal_block(block_text, block_text), line=lineno)
+    #    return [error]
+    text = '\n'.join(content)
+    admonition_node = node_class(text)
+    if arguments:
+        title_text = arguments[0]
+        textnodes, messages = state.inline_text(title_text, lineno)
+        admonition_node += nodes.title(title_text, '', *textnodes)
+        admonition_node += messages
+        if options.has_key('class'):
+            classes = options['class']
+        else:
+            classes = ['admonition-' + nodes.make_id(title_text)]
+        admonition_node['classes'] += classes
+    state.nested_parse(content, content_offset, admonition_node)
+    return [admonition_node]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.console
+    ~~~~~~~~~~~~~~~~~~~
+
+    Format colored console output.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+
+codes = {}
+
+def get_terminal_width():
+    """Borrowed from the py lib."""
+    try:
+        import os, termios, fcntl, struct
+        call = fcntl.ioctl(0, termios.TIOCGWINSZ, "\000"*8)
+        height, width = struct.unpack("hhhh", call)[:2]
+        terminal_width = width
+    except (SystemExit, KeyboardInterrupt):
+        raise
+    except:
+        # FALLBACK
+        terminal_width = int(os.environ.get('COLUMNS', 80))-1
+    return terminal_width
+
+_tw = get_terminal_width()
+
+def print_and_backspace(text, func):
+    if not codes:
+        # if no coloring, don't output fancy backspaces
+        func(text)
+    else:
+        func(text.ljust(_tw) + _tw * "\b")
+
+def color_terminal():
+    if 'COLORTERM' in os.environ:
+        return True
+    term = os.environ.get('TERM', 'dumb').lower()
+    if 'xterm' in term or 'color' in term:
+        return True
+    return False
+
+
+def nocolor():
+    codes.clear()
+
+def coloron():
+    codes.update(_orig_codes)
+
+def colorize(name, text):
+    return codes.get(name, '') + text + codes.get('reset', '')
+
+def create_color_func(name):
+    def inner(text):
+        return colorize(name, text)
+    globals()[name] = inner
+
+_attrs = {
+    'reset':     '39;49;00m',
+    'bold':      '01m',
+    'faint':     '02m',
+    'standout':  '03m',
+    'underline': '04m',
+    'blink':     '05m',
+}
+
+for _name, _value in _attrs.items():
+    codes[_name] = '\x1b[' + _value
+
+_colors = [
+    ('black',     'darkgray'),
+    ('darkred',   'red'),
+    ('darkgreen', 'green'),
+    ('brown',     'yellow'),
+    ('darkblue',  'blue'),
+    ('purple',    'fuchsia'),
+    ('turquoise', 'teal'),
+    ('lightgray', 'white'),
+]
+
+for i, (dark, light) in enumerate(_colors):
+    codes[dark] = '\x1b[%im' % (i+30)
+    codes[light] = '\x1b[%i;01m' % (i+30)
+
+_orig_codes = codes.copy()
+
+for _name in codes:
+    create_color_func(_name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.jsdump
+    ~~~~~~~~~~~~~~~~~~
+
+    This module implements a simple JavaScript serializer.
+    Uses the basestring encode function from simplejson.
+
+    :copyright: 2008 by Armin Ronacher, Bob Ippolito, Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+
+_str_re  = re.compile(r'"(\\\\|\\"|[^"])*"')
+_int_re  = re.compile(r'\d+')
+_name_re = re.compile(r'[a-zA-Z]\w*')
+_nameonly_re = re.compile(r'[a-zA-Z]\w*$')
+
+# escape \, ", control characters and everything outside ASCII
+ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
+ESCAPE_DICT = {
+    '\\': '\\\\',
+    '"': '\\"',
+    '\b': '\\b',
+    '\f': '\\f',
+    '\n': '\\n',
+    '\r': '\\r',
+    '\t': '\\t',
+}
+
+ESCAPED = re.compile(r'\\u.{4}|\\.')
+
+
+def encode_string(s):
+    def replace(match):
+        s = match.group(0)
+        try:
+            return ESCAPE_DICT[s]
+        except KeyError:
+            n = ord(s)
+            if n < 0x10000:
+                return '\\u%04x' % (n,)
+            else:
+                # surrogate pair
+                n -= 0x10000
+                s1 = 0xd800 | ((n >> 10) & 0x3ff)
+                s2 = 0xdc00 | (n & 0x3ff)
+                return '\\u%04x\\u%04x' % (s1, s2)
+    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
+
+def decode_string(s):
+    return ESCAPED.sub(lambda m: eval('u"'+m.group()+'"'), s)
+
+
+reswords = set("""\
+abstract   else   instanceof   switch
+boolean   enum   int   synchronized
+break   export   interface   this
+byte   extends   long   throw
+case   false   native   throws
+catch   final   new   transient
+char   finally   null   true
+class   float   package   try
+const   for   private   typeof
+continue   function   protected   var
+debugger   goto   public   void
+default   if   return   volatile
+delete   implements   short   while
+do   import   static   with
+double   in   super""".split())
+
+def dumps(obj, key=False):
+    if key:
+        if not isinstance(obj, basestring):
+            obj = str(obj)
+        if _nameonly_re.match(obj) and obj not in reswords:
+            return obj  # return it as a bare word
+        else:
+            return encode_string(obj)
+    if obj is None:
+        return 'null'
+    elif obj is True or obj is False:
+        return obj and 'true' or 'false'
+    elif isinstance(obj, (int, long, float)):
+        return str(obj)
+    elif isinstance(obj, dict):
+        return '{%s}' % ','.join('%s:%s' % (
+            dumps(key, True),
+            dumps(value)
+        ) for key, value in obj.iteritems())
+    elif isinstance(obj, (tuple, list, set)):
+        return '[%s]' % ','.join(dumps(x) for x in obj)
+    elif isinstance(obj, basestring):
+        return encode_string(obj)
+    raise TypeError(type(obj))
+
+def dump(obj, f):
+    f.write(dumps(obj))
+
+
+def loads(x):
+    """Loader that can read the JS subset the indexer produces."""
+    nothing = object()
+    i = 0
+    n = len(x)
+    stack = []
+    obj = nothing
+    key = False
+    keys = []
+    while i < n:
+        c = x[i]
+        if c == '{':
+            obj = {}
+            stack.append(obj)
+            key = True
+            keys.append(nothing)
+            i += 1
+        elif c == '[':
+            obj = []
+            stack.append(obj)
+            key = False
+            keys.append(nothing)
+            i += 1
+        elif c in '}]':
+            if key:
+                if keys[-1] is not nothing:
+                    raise ValueError("unfinished dict")
+                # empty dict
+                key = False
+            oldobj = stack.pop()
+            keys.pop()
+            if stack:
+                obj = stack[-1]
+                if isinstance(obj, dict):
+                    if keys[-1] is nothing:
+                        raise ValueError("invalid key object", oldobj)
+                    obj[keys[-1]] = oldobj
+                else:
+                    obj.append(oldobj)
+            else:
+                break
+            i += 1
+        elif c == ',':
+            if key:
+                raise ValueError("multiple keys")
+            if isinstance(obj, dict):
+                key = True
+            i += 1
+        elif c == ':':
+            if not isinstance(obj, dict):
+                raise ValueError("colon in list")
+            i += 1
+            if not key:
+                raise ValueError("multiple values")
+            key = False
+        else:
+            m = _str_re.match(x, i)
+            if m:
+                y = decode_string(m.group()[1:-1])
+            else:
+                m = _int_re.match(x, i)
+                if m:
+                    y = int(m.group())
+                else:
+                    m = _name_re.match(x, i)
+                    if m:
+                        y = m.group()
+                        if y == 'true':
+                            y = True
+                        elif y == 'false':
+                            y = False
+                        elif y == 'null':
+                            y = None
+                        elif not key:
+                            raise ValueError("bareword as value")
+                    else:
+                        raise ValueError("read error at pos %d" % i)
+            i = m.end()
+            if isinstance(obj, dict):
+                if key:
+                    keys[-1] = y
+                else:
+                    obj[keys[-1]] = y
+                    key = False
+            else:
+                obj.append(y)
+    if obj is nothing:
+        raise ValueError("nothing loaded from string")
+    return obj
+
+def load(f):
+    return loads(f.read())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.png
+    ~~~~~~~~~~~~~~~
+
+    PNG image manipulation helpers.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import struct
+import binascii
+
+LEN_IEND = 12
+LEN_DEPTH = 22
+
+DEPTH_CHUNK_LEN = struct.pack('!i', 10)
+DEPTH_CHUNK_START = 'tEXtDepth\x00'
+IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
+
+
+def read_png_depth(filename):
+    """
+    Read the special tEXt chunk indicating the depth from a PNG file.
+    """
+    result = None
+    f = open(filename, 'rb')
+    try:
+        f.seek(- (LEN_IEND + LEN_DEPTH), 2)
+        depthchunk = f.read(LEN_DEPTH)
+        if not depthchunk.startswith(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START):
+            # either not a PNG file or not containing the depth chunk
+            return None
+        result = struct.unpack('!i', depthchunk[14:18])[0]
+    finally:
+        f.close()
+    return result
+
+
+def write_png_depth(filename, depth):
+    """
+    Write the special tEXt chunk indicating the depth to a PNG file.
+    The chunk is placed immediately before the special IEND chunk.
+    """
+    data = struct.pack('!i', depth)
+    f = open(filename, 'r+b')
+    try:
+        # seek to the beginning of the IEND chunk
+        f.seek(-LEN_IEND, 2)
+        # overwrite it with the depth chunk
+        f.write(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START + data)
+        # calculate the checksum over chunk name and data
+        f.write(struct.pack('!i', binascii.crc32(DEPTH_CHUNK_START + data)))
+        # replace the IEND chunk
+        f.write(IEND_CHUNK)
+    finally:
+        f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,303 @@
+r"""
+This is based on SmartyPants.py by `Chad Miller`_.
+
+Copyright and License
+=====================
+
+SmartyPants_ license::
+
+    Copyright (c) 2003 John Gruber
+    (http://daringfireball.net/)
+    All rights reserved.
+
+    Redistribution and use 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 "SmartyPants" nor the names of its contributors
+        may be used to endorse or promote products derived from this
+        software without specific prior written permission.
+
+    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.
+
+
+smartypants.py license::
+
+    smartypants.py is a derivative work of SmartyPants.
+
+    Redistribution and use 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.
+
+    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.
+
+.. _Chad Miller: http://web.chad.org/
+"""
+
+import re
+
+
+def sphinx_smarty_pants(t):
+    t = t.replace('&quot;', '"')
+    t = educateDashesOldSchool(t)
+    t = educateQuotes(t)
+    t = t.replace('"', '&quot;')
+    return t
+
+# Constants for quote education.
+
+punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]"""
+close_class = r"""[^\ \t\r\n\[\{\(\-]"""
+dec_dashes = r"""&#8211;|&#8212;"""
+
+# Special case if the very first character is a quote
+# followed by punctuation at a non-word-break. Close the quotes by brute force:
+single_quote_start_re = re.compile(r"""^'(?=%s\\B)""" % (punct_class,))
+double_quote_start_re = re.compile(r"""^"(?=%s\\B)""" % (punct_class,))
+
+# Special case for double sets of quotes, e.g.:
+#   <p>He said, "'Quoted' words in a larger quote."</p>
+double_quote_sets_re = re.compile(r""""'(?=\w)""")
+single_quote_sets_re = re.compile(r"""'"(?=\w)""")
+
+# Special case for decade abbreviations (the '80s):
+decade_abbr_re = re.compile(r"""\b'(?=\d{2}s)""")
+
+# Get most opening double quotes:
+opening_double_quotes_regex = re.compile(r"""
+                (
+                        \s          |   # a whitespace char, or
+                        &nbsp;      |   # a non-breaking space entity, or
+                        --          |   # dashes, or
+                        &[mn]dash;  |   # named dash entities
+                        %s          |   # or decimal entities
+                        &\#x201[34];    # or hex
+                )
+                "                 # the quote
+                (?=\w)            # followed by a word character
+                """ % (dec_dashes,), re.VERBOSE)
+
+# Double closing quotes:
+closing_double_quotes_regex = re.compile(r"""
+                #(%s)?   # character that indicates the quote should be closing
+                "
+                (?=\s)
+                """ % (close_class,), re.VERBOSE)
+
+closing_double_quotes_regex_2 = re.compile(r"""
+                (%s)   # character that indicates the quote should be closing
+                "
+                """ % (close_class,), re.VERBOSE)
+
+# Get most opening single quotes:
+opening_single_quotes_regex = re.compile(r"""
+                (
+                        \s          |   # a whitespace char, or
+                        &nbsp;      |   # a non-breaking space entity, or
+                        --          |   # dashes, or
+                        &[mn]dash;  |   # named dash entities
+                        %s          |   # or decimal entities
+                        &\#x201[34];    # or hex
+                )
+                '                 # the quote
+                (?=\w)            # followed by a word character
+                """ % (dec_dashes,), re.VERBOSE)
+
+closing_single_quotes_regex = re.compile(r"""
+                (%s)
+                '
+                (?!\s | s\b | \d)
+                """ % (close_class,), re.VERBOSE)
+
+closing_single_quotes_regex_2 = re.compile(r"""
+                (%s)
+                '
+                (\s | s\b)
+                """ % (close_class,), re.VERBOSE)
+
+def educateQuotes(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with "educated" curly quote HTML entities.
+
+    Example input:  "Isn't this fun?"
+    Example output: &#8220;Isn&#8217;t this fun?&#8221;
+    """
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break. Close the quotes by brute force:
+    s = single_quote_start_re.sub("&#8217;", s)
+    s = double_quote_start_re.sub("&#8221;", s)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    s = double_quote_sets_re.sub("&#8220;&#8216;", s)
+    s = single_quote_sets_re.sub("&#8216;&#8220;", s)
+
+    # Special case for decade abbreviations (the '80s):
+    s = decade_abbr_re.sub("&#8217;", s)
+
+    s = opening_single_quotes_regex.sub(r"\1&#8216;", s)
+    s = closing_single_quotes_regex.sub(r"\1&#8217;", s)
+    s = closing_single_quotes_regex_2.sub(r"\1&#8217;\2", s)
+
+    # Any remaining single quotes should be opening ones:
+    s = s.replace("'", "&#8216;")
+
+    s = opening_double_quotes_regex.sub(r"\1&#8220;", s)
+    s = closing_double_quotes_regex.sub(r"&#8221;", s)
+    s = closing_double_quotes_regex_2.sub(r"\1&#8221;", s)
+
+    # Any remaining quotes should be opening ones.
+    return s.replace('"', "&#8220;")
+
+
+def educateQuotesLatex(s, dquotes=("``", "''")):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with double quotes corrected to LaTeX quotes.
+
+    Example input:  "Isn't this fun?"
+    Example output: ``Isn't this fun?'';
+    """
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break. Close the quotes by brute force:
+    s = single_quote_start_re.sub("\x04", s)
+    s = double_quote_start_re.sub("\x02", s)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    s = double_quote_sets_re.sub("\x01\x03", s)
+    s = single_quote_sets_re.sub("\x03\x01", s)
+
+    # Special case for decade abbreviations (the '80s):
+    s = decade_abbr_re.sub("\x04", s)
+
+    s = opening_single_quotes_regex.sub("\\1\x03", s)
+    s = closing_single_quotes_regex.sub("\\1\x04", s)
+    s = closing_single_quotes_regex_2.sub("\\1\x04\\2", s)
+
+    # Any remaining single quotes should be opening ones:
+    s = s.replace("'", "\x03")
+
+    s = opening_double_quotes_regex.sub("\\1\x01", s)
+    s = closing_double_quotes_regex.sub("\x02", s)
+    s = closing_double_quotes_regex_2.sub("\\1\x02", s)
+
+    # Any remaining quotes should be opening ones.
+    s = s.replace('"', "\x01")
+
+    # Finally, replace all helpers with quotes.
+    return s.replace("\x01", dquotes[0]).replace("\x02", dquotes[1]).\
+           replace("\x03", "`").replace("\x04", "'")
+
+
+def educateBackticks(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with ``backticks'' -style double quotes
+        translated into HTML curly quote entities.
+    Example input:  ``Isn't this fun?''
+    Example output: &#8220;Isn't this fun?&#8221;
+    """
+    return s.replace("``", "&#8220;").replace("''", "&#8221;")
+
+
+def educateSingleBackticks(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with `backticks' -style single quotes
+        translated into HTML curly quote entities.
+
+    Example input:  `Isn't this fun?'
+    Example output: &#8216;Isn&#8217;t this fun?&#8217;
+    """
+    return s.replace('`', "&#8216;").replace("'", "&#8217;")
+
+
+def educateDashesOldSchool(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with each instance of "--" translated to
+        an en-dash HTML entity, and each "---" translated to
+        an em-dash HTML entity.
+    """
+    return s.replace('---', "&#8212;").replace('--', "&#8211;")
+
+
+def educateDashesOldSchoolInverted(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with each instance of "--" translated to
+        an em-dash HTML entity, and each "---" translated to
+        an en-dash HTML entity. Two reasons why: First, unlike the
+        en- and em-dash syntax supported by
+        EducateDashesOldSchool(), it's compatible with existing
+        entries written before SmartyPants 1.1, back when "--" was
+        only used for em-dashes.  Second, em-dashes are more
+        common than en-dashes, and so it sort of makes sense that
+        the shortcut should be shorter to type. (Thanks to Aaron
+        Swartz for the idea.)
+    """
+    return s.replace('---', "&#8211;").replace('--', "&#8212;")
+
+
+
+def educateEllipses(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with each instance of "..." translated to
+        an ellipsis HTML entity.
+
+    Example input:  Huh...?
+    Example output: Huh&#8230;?
+    """
+    return s.replace('...', "&#8230;").replace('. . .', "&#8230;")
+
+
+__author__ = "Chad Miller <smartypantspy@chad.org>"
+__version__ = "1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400"
+__url__ = "http://wiki.chad.org/SmartyPantsPy"
+__description__ = \
+    "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries in pyblosxom"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,343 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.stemmer
+    ~~~~~~~~~~~~~~~~~~~
+
+    Porter Stemming Algorithm
+
+    This is the Porter stemming algorithm, ported to Python from the
+    version coded up in ANSI C by the author. It may be be regarded
+    as canonical, in that it follows the algorithm presented in
+
+    Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
+    no. 3, pp 130-137,
+
+    only differing from it at the points maked --DEPARTURE-- below.
+
+    See also http://www.tartarus.org/~martin/PorterStemmer
+
+    The algorithm as described in the paper could be exactly replicated
+    by adjusting the points of DEPARTURE, but this is barely necessary,
+    because (a) the points of DEPARTURE are definitely improvements, and
+    (b) no encoding of the Porter stemmer I have seen is anything like
+    as exact as this version, even with the points of DEPARTURE!
+
+    Release 1: January 2001
+
+    :copyright: 2001 by Vivake Gupta <v@nano.com>.
+    :license: Public Domain ("can be used free of charge for any purpose").
+"""
+
+class PorterStemmer(object):
+
+    def __init__(self):
+        """The main part of the stemming algorithm starts here.
+        b is a buffer holding a word to be stemmed. The letters are in b[k0],
+        b[k0+1] ... ending at b[k]. In fact k0 = 0 in this demo program. k is
+        readjusted downwards as the stemming progresses. Zero termination is
+        not in fact used in the algorithm.
+
+        Note that only lower case sequences are stemmed. Forcing to lower case
+        should be done before stem(...) is called.
+        """
+
+        self.b = ""  # buffer for word to be stemmed
+        self.k = 0
+        self.k0 = 0
+        self.j = 0   # j is a general offset into the string
+
+    def cons(self, i):
+        """cons(i) is TRUE <=> b[i] is a consonant."""
+        if self.b[i] == 'a' or self.b[i] == 'e' or self.b[i] == 'i' \
+            or self.b[i] == 'o' or self.b[i] == 'u':
+            return 0
+        if self.b[i] == 'y':
+            if i == self.k0:
+                return 1
+            else:
+                return (not self.cons(i - 1))
+        return 1
+
+    def m(self):
+        """m() measures the number of consonant sequences between k0 and j.
+        if c is a consonant sequence and v a vowel sequence, and <..>
+        indicates arbitrary presence,
+
+           <c><v>       gives 0
+           <c>vc<v>     gives 1
+           <c>vcvc<v>   gives 2
+           <c>vcvcvc<v> gives 3
+           ....
+        """
+        n = 0
+        i = self.k0
+        while 1:
+            if i > self.j:
+                return n
+            if not self.cons(i):
+                break
+            i = i + 1
+        i = i + 1
+        while 1:
+            while 1:
+                if i > self.j:
+                    return n
+                if self.cons(i):
+                    break
+                i = i + 1
+            i = i + 1
+            n = n + 1
+            while 1:
+                if i > self.j:
+                    return n
+                if not self.cons(i):
+                    break
+                i = i + 1
+            i = i + 1
+
+    def vowelinstem(self):
+        """vowelinstem() is TRUE <=> k0,...j contains a vowel"""
+        for i in range(self.k0, self.j + 1):
+            if not self.cons(i):
+                return 1
+        return 0
+
+    def doublec(self, j):
+        """doublec(j) is TRUE <=> j,(j-1) contain a double consonant."""
+        if j < (self.k0 + 1):
+            return 0
+        if (self.b[j] != self.b[j-1]):
+            return 0
+        return self.cons(j)
+
+    def cvc(self, i):
+        """cvc(i) is TRUE <=> i-2,i-1,i has the form consonant - vowel - consonant
+        and also if the second c is not w,x or y. this is used when trying to
+        restore an e at the end of a short  e.g.
+
+           cav(e), lov(e), hop(e), crim(e), but
+           snow, box, tray.
+        """
+        if i < (self.k0 + 2) or not self.cons(i) or self.cons(i-1) or not self.cons(i-2):
+            return 0
+        ch = self.b[i]
+        if ch == 'w' or ch == 'x' or ch == 'y':
+            return 0
+        return 1
+
+    def ends(self, s):
+        """ends(s) is TRUE <=> k0,...k ends with the string s."""
+        length = len(s)
+        if s[length - 1] != self.b[self.k]: # tiny speed-up
+            return 0
+        if length > (self.k - self.k0 + 1):
+            return 0
+        if self.b[self.k-length+1:self.k+1] != s:
+            return 0
+        self.j = self.k - length
+        return 1
+
+    def setto(self, s):
+        """setto(s) sets (j+1),...k to the characters in the string s, readjusting k."""
+        length = len(s)
+        self.b = self.b[:self.j+1] + s + self.b[self.j+length+1:]
+        self.k = self.j + length
+
+    def r(self, s):
+        """r(s) is used further down."""
+        if self.m() > 0:
+            self.setto(s)
+
+    def step1ab(self):
+        """step1ab() gets rid of plurals and -ed or -ing. e.g.
+
+           caresses  ->  caress
+           ponies    ->  poni
+           ties      ->  ti
+           caress    ->  caress
+           cats      ->  cat
+
+           feed      ->  feed
+           agreed    ->  agree
+           disabled  ->  disable
+
+           matting   ->  mat
+           mating    ->  mate
+           meeting   ->  meet
+           milling   ->  mill
+           messing   ->  mess
+
+           meetings  ->  meet
+        """
+        if self.b[self.k] == 's':
+            if self.ends("sses"):
+                self.k = self.k - 2
+            elif self.ends("ies"):
+                self.setto("i")
+            elif self.b[self.k - 1] != 's':
+                self.k = self.k - 1
+        if self.ends("eed"):
+            if self.m() > 0:
+                self.k = self.k - 1
+        elif (self.ends("ed") or self.ends("ing")) and self.vowelinstem():
+            self.k = self.j
+            if self.ends("at"):   self.setto("ate")
+            elif self.ends("bl"): self.setto("ble")
+            elif self.ends("iz"): self.setto("ize")
+            elif self.doublec(self.k):
+                self.k = self.k - 1
+                ch = self.b[self.k]
+                if ch == 'l' or ch == 's' or ch == 'z':
+                    self.k = self.k + 1
+            elif (self.m() == 1 and self.cvc(self.k)):
+                self.setto("e")
+
+    def step1c(self):
+        """step1c() turns terminal y to i when there is another vowel in the stem."""
+        if (self.ends("y") and self.vowelinstem()):
+            self.b = self.b[:self.k] + 'i' + self.b[self.k+1:]
+
+    def step2(self):
+        """step2() maps double suffices to single ones.
+        so -ization ( = -ize plus -ation) maps to -ize etc. note that the
+        string before the suffix must give m() > 0.
+        """
+        if self.b[self.k - 1] == 'a':
+            if self.ends("ational"):   self.r("ate")
+            elif self.ends("tional"):  self.r("tion")
+        elif self.b[self.k - 1] == 'c':
+            if self.ends("enci"):      self.r("ence")
+            elif self.ends("anci"):    self.r("ance")
+        elif self.b[self.k - 1] == 'e':
+            if self.ends("izer"):      self.r("ize")
+        elif self.b[self.k - 1] == 'l':
+            if self.ends("bli"):       self.r("ble") # --DEPARTURE--
+            # To match the published algorithm, replace this phrase with
+            #   if self.ends("abli"):      self.r("able")
+            elif self.ends("alli"):    self.r("al")
+            elif self.ends("entli"):   self.r("ent")
+            elif self.ends("eli"):     self.r("e")
+            elif self.ends("ousli"):   self.r("ous")
+        elif self.b[self.k - 1] == 'o':
+            if self.ends("ization"):   self.r("ize")
+            elif self.ends("ation"):   self.r("ate")
+            elif self.ends("ator"):    self.r("ate")
+        elif self.b[self.k - 1] == 's':
+            if self.ends("alism"):     self.r("al")
+            elif self.ends("iveness"): self.r("ive")
+            elif self.ends("fulness"): self.r("ful")
+            elif self.ends("ousness"): self.r("ous")
+        elif self.b[self.k - 1] == 't':
+            if self.ends("aliti"):     self.r("al")
+            elif self.ends("iviti"):   self.r("ive")
+            elif self.ends("biliti"):  self.r("ble")
+        elif self.b[self.k - 1] == 'g': # --DEPARTURE--
+            if self.ends("logi"):      self.r("log")
+        # To match the published algorithm, delete this phrase
+
+    def step3(self):
+        """step3() dels with -ic-, -full, -ness etc. similar strategy to step2."""
+        if self.b[self.k] == 'e':
+            if self.ends("icate"):     self.r("ic")
+            elif self.ends("ative"):   self.r("")
+            elif self.ends("alize"):   self.r("al")
+        elif self.b[self.k] == 'i':
+            if self.ends("iciti"):     self.r("ic")
+        elif self.b[self.k] == 'l':
+            if self.ends("ical"):      self.r("ic")
+            elif self.ends("ful"):     self.r("")
+        elif self.b[self.k] == 's':
+            if self.ends("ness"):      self.r("")
+
+    def step4(self):
+        """step4() takes off -ant, -ence etc., in context <c>vcvc<v>."""
+        if self.b[self.k - 1] == 'a':
+            if self.ends("al"): pass
+            else: return
+        elif self.b[self.k - 1] == 'c':
+            if self.ends("ance"): pass
+            elif self.ends("ence"): pass
+            else: return
+        elif self.b[self.k - 1] == 'e':
+            if self.ends("er"): pass
+            else: return
+        elif self.b[self.k - 1] == 'i':
+            if self.ends("ic"): pass
+            else: return
+        elif self.b[self.k - 1] == 'l':
+            if self.ends("able"): pass
+            elif self.ends("ible"): pass
+            else: return
+        elif self.b[self.k - 1] == 'n':
+            if self.ends("ant"): pass
+            elif self.ends("ement"): pass
+            elif self.ends("ment"): pass
+            elif self.ends("ent"): pass
+            else: return
+        elif self.b[self.k - 1] == 'o':
+            if self.ends("ion") and (self.b[self.j] == 's' \
+                or self.b[self.j] == 't'): pass
+            elif self.ends("ou"): pass
+            # takes care of -ous
+            else: return
+        elif self.b[self.k - 1] == 's':
+            if self.ends("ism"): pass
+            else: return
+        elif self.b[self.k - 1] == 't':
+            if self.ends("ate"): pass
+            elif self.ends("iti"): pass
+            else: return
+        elif self.b[self.k - 1] == 'u':
+            if self.ends("ous"): pass
+            else: return
+        elif self.b[self.k - 1] == 'v':
+            if self.ends("ive"): pass
+            else: return
+        elif self.b[self.k - 1] == 'z':
+            if self.ends("ize"): pass
+            else: return
+        else:
+            return
+        if self.m() > 1:
+            self.k = self.j
+
+    def step5(self):
+        """step5() removes a final -e if m() > 1, and changes -ll to -l if
+        m() > 1.
+        """
+        self.j = self.k
+        if self.b[self.k] == 'e':
+            a = self.m()
+            if a > 1 or (a == 1 and not self.cvc(self.k-1)):
+                self.k = self.k - 1
+        if self.b[self.k] == 'l' and self.doublec(self.k) and self.m() > 1:
+            self.k = self.k -1
+
+    def stem(self, p, i, j):
+        """In stem(p,i,j), p is a char pointer, and the string to be stemmed
+        is from p[i] to p[j] inclusive. Typically i is zero and j is the
+        offset to the last character of a string, (p[j+1] == '\0'). The
+        stemmer adjusts the characters p[i] ... p[j] and returns the new
+        end-point of the string, k. Stemming never increases word length, so
+        i <= k <= j. To turn the stemmer into a module, declare 'stem' as
+        extern, and delete the remainder of this file.
+        """
+        # copy the parameters into statics
+        self.b = p
+        self.k = j
+        self.k0 = i
+        if self.k <= self.k0 + 1:
+            return self.b # --DEPARTURE--
+
+        # With this line, strings of length 1 or 2 don't go through the
+        # stemming process, although no mention is made of this in the
+        # published algorithm. Remove the line to match the published
+        # algorithm.
+
+        self.step1ab()
+        self.step1c()
+        self.step2()
+        self.step3()
+        self.step4()
+        self.step5()
+        return self.b[self.k0:self.k+1]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.texescape
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    TeX escaping helper.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+tex_replacements = [
+    # map TeX special chars
+    (u'$', ur'\$'),
+    (u'%', ur'\%'),
+    (u'&', ur'\&'),
+    (u'#', ur'\#'),
+    (u'_', ur'\_'),
+    (u'{', ur'\{'),
+    (u'}', ur'\}'),
+    (u'[', ur'{[}'),
+    (u']', ur'{]}'),
+    (u'`', ur'{}`'),
+    (u'\\',ur'\textbackslash{}'),
+    (u'~', ur'\textasciitilde{}'),
+    (u'<', ur'\textless{}'),
+    (u'>', ur'\textgreater{}'),
+    (u'^', ur'\textasciicircum{}'),
+    # map special Unicode characters to TeX commands
+    (u'¶', ur'\P{}'),
+    (u'§', ur'\S{}'),
+    (u'€', ur'\texteuro{}'),
+    (u'∞', ur'\(\infty\)'),
+    (u'±', ur'\(\pm\)'),
+    (u'→', ur'\(\rightarrow\)'),
+    (u'‣', ur'\(\rightarrow\)'),
+    # used to separate -- in options
+    (u'', ur'{}'),
+    # map some special Unicode characters to similar ASCII ones
+    (u'─', ur'-'),
+    (u'⎽', ur'\_'),
+    (u'╲', ur'\textbackslash{}'),
+    (u'│', ur'|'),
+    (u'ℯ', ur'e'),
+    (u'â…ˆ', ur'i'),
+    (u'â‚', ur'1'),
+    (u'â‚‚', ur'2'),
+    # map Greek alphabet
+    (u'α', ur'\(\alpha\)'),
+    (u'β', ur'\(\beta\)'),
+    (u'γ', ur'\(\gamma\)'),
+    (u'δ', ur'\(\delta\)'),
+    (u'ε', ur'\(\epsilon\)'),
+    (u'ζ', ur'\(\zeta\)'),
+    (u'η', ur'\(\eta\)'),
+    (u'θ', ur'\(\theta\)'),
+    (u'ι', ur'\(\iota\)'),
+    (u'κ', ur'\(\kappa\)'),
+    (u'λ', ur'\(\lambda\)'),
+    (u'μ', ur'\(\mu\)'),
+    (u'ν', ur'\(\nu\)'),
+    (u'ξ', ur'\(\xi\)'),
+    (u'ο', ur'o'),
+    (u'Ï€', ur'\(\pi\)'),
+    (u'Ï', ur'\(\rho\)'),
+    (u'σ', ur'\(\sigma\)'),
+    (u'Ï„', ur'\(\tau\)'),
+    (u'Ï…', u'\\(\\upsilon\\)'),
+    (u'φ', ur'\(\phi\)'),
+    (u'χ', ur'\(\chi\)'),
+    (u'ψ', ur'\(\psi\)'),
+    (u'ω', ur'\(\omega\)'),
+    (u'Α', ur'A'),
+    (u'Î’', ur'B'),
+    (u'Γ', ur'\(\Gamma\)'),
+    (u'Δ', ur'\(\Delta\)'),
+    (u'Ε', ur'E'),
+    (u'Ζ', ur'Z'),
+    (u'Η', ur'H'),
+    (u'Θ', ur'\(\Theta\)'),
+    (u'Ι', ur'I'),
+    (u'Κ', ur'K'),
+    (u'Λ', ur'\(\Lambda\)'),
+    (u'Μ', ur'M'),
+    (u'Î', ur'N'),
+    (u'Ξ', ur'\(\Xi\)'),
+    (u'Ο', ur'O'),
+    (u'Π', ur'\(\Pi\)'),
+    (u'Ρ', ur'P'),
+    (u'Σ', ur'\(\Sigma\)'),
+    (u'Τ', ur'T'),
+    (u'Î¥', u'\\(\\Upsilon\\)'),
+    (u'Φ', ur'\(\Phi\)'),
+    (u'Χ', ur'X'),
+    (u'Ψ', ur'\(\Psi\)'),
+    (u'Ω', ur'\(\Omega\)'),
+    (u'Ω', ur'\(\Omega\)'),
+]
+
+tex_escape_map = {}
+tex_hl_escape_map = {}
+_new_cmd_chars = {ord(u'\\'): u'@', ord(u'{'): u'[', ord(u'}'): u']'}
+
+def init():
+    for a, b in tex_replacements:
+        tex_escape_map[ord(a)] = b
+
+    for a, b in tex_replacements:
+        if a in u'[]{}\\': continue
+        tex_hl_escape_map[ord(a)] = b.translate(_new_cmd_chars)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: docutils
+Version: 0.5
+Summary: Docutils -- Python Documentation Utilities
+Home-page: http://docutils.sourceforge.net/
+Author: David Goodger
+Author-email: goodger@python.org
+License: public domain, Python, BSD, GPL (see COPYING.txt)
+Description: Docutils is a modular system for processing documentation
+        into useful formats, such as HTML, XML, and LaTeX.  For
+        input Docutils supports reStructuredText, an easy-to-read,
+        what-you-see-is-what-you-get plaintext markup syntax.
+Platform: OS-independent
+Classifier: Development Status :: 3 - Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: Intended Audience :: Other Audience
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: Public Domain
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: BSD License
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Software Development :: Documentation
+Classifier: Topic :: Text Processing
+Classifier: Natural Language :: English
+Classifier: Natural Language :: Afrikaans
+Classifier: Natural Language :: Esperanto
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Italian
+Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovak
+Classifier: Natural Language :: Spanish
+Classifier: Natural Language :: Swedish
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,482 @@
+BUGS.txt
+COPYING.txt
+FAQ.txt
+HISTORY.txt
+MANIFEST.in
+README.txt
+RELEASE-NOTES.txt
+THANKS.txt
+install.py
+setup.py
+docs/index.txt
+docs/api/cmdline-tool.txt
+docs/api/publisher.txt
+docs/api/runtime-settings.txt
+docs/dev/distributing.txt
+docs/dev/enthought-plan.txt
+docs/dev/enthought-rfp.txt
+docs/dev/hacking.txt
+docs/dev/policies.txt
+docs/dev/pysource.dtd
+docs/dev/pysource.txt
+docs/dev/release.txt
+docs/dev/repository.txt
+docs/dev/semantics.txt
+docs/dev/testing.txt
+docs/dev/todo.txt
+docs/dev/website.txt
+docs/dev/rst/alternatives.txt
+docs/dev/rst/problems.txt
+docs/howto/html-stylesheets.txt
+docs/howto/i18n.txt
+docs/howto/rst-directives.txt
+docs/howto/rst-roles.txt
+docs/howto/security.txt
+docs/peps/pep-0256.txt
+docs/peps/pep-0257.txt
+docs/peps/pep-0258.txt
+docs/peps/pep-0287.txt
+docs/ref/doctree.txt
+docs/ref/docutils.dtd
+docs/ref/soextblx.dtd
+docs/ref/transforms.txt
+docs/ref/rst/definitions.txt
+docs/ref/rst/directives.txt
+docs/ref/rst/introduction.txt
+docs/ref/rst/restructuredtext.txt
+docs/ref/rst/roles.txt
+docs/user/Makefile.docutils-update
+docs/user/config.txt
+docs/user/emacs.txt
+docs/user/latex.txt
+docs/user/links.txt
+docs/user/mailing-lists.txt
+docs/user/slide-shows.txt
+docs/user/tools.txt
+docs/user/images/big-black.png
+docs/user/images/big-white.png
+docs/user/images/default.png
+docs/user/images/happy_monkey.png
+docs/user/images/medium-black.png
+docs/user/images/medium-white.png
+docs/user/images/rsp-all.png
+docs/user/images/rsp-breaks.png
+docs/user/images/rsp-covers.png
+docs/user/images/rsp-cuts.png
+docs/user/images/rsp-empty.png
+docs/user/images/rsp-objects.png
+docs/user/images/rsp.svg
+docs/user/images/s5-files.png
+docs/user/images/s5-files.svg
+docs/user/images/small-black.png
+docs/user/images/small-white.png
+docs/user/rst/cheatsheet.txt
+docs/user/rst/demo.txt
+docs/user/rst/quickref.html
+docs/user/rst/quickstart.txt
+docs/user/rst/images/ball1.gif
+docs/user/rst/images/biohazard.png
+docs/user/rst/images/title.png
+docutils/__init__.py
+docutils/core.py
+docutils/docutils.conf
+docutils/examples.py
+docutils/frontend.py
+docutils/io.py
+docutils/nodes.py
+docutils/statemachine.py
+docutils/urischemes.py
+docutils/utils.py
+docutils/languages/__init__.py
+docutils/languages/af.py
+docutils/languages/ca.py
+docutils/languages/cs.py
+docutils/languages/de.py
+docutils/languages/en.py
+docutils/languages/eo.py
+docutils/languages/es.py
+docutils/languages/fi.py
+docutils/languages/fr.py
+docutils/languages/he.py
+docutils/languages/it.py
+docutils/languages/ja.py
+docutils/languages/nl.py
+docutils/languages/pt_br.py
+docutils/languages/ru.py
+docutils/languages/sk.py
+docutils/languages/sv.py
+docutils/languages/zh_cn.py
+docutils/languages/zh_tw.py
+docutils/parsers/__init__.py
+docutils/parsers/null.py
+docutils/parsers/rst/__init__.py
+docutils/parsers/rst/roles.py
+docutils/parsers/rst/states.py
+docutils/parsers/rst/tableparser.py
+docutils/parsers/rst/directives/__init__.py
+docutils/parsers/rst/directives/admonitions.py
+docutils/parsers/rst/directives/body.py
+docutils/parsers/rst/directives/html.py
+docutils/parsers/rst/directives/images.py
+docutils/parsers/rst/directives/misc.py
+docutils/parsers/rst/directives/parts.py
+docutils/parsers/rst/directives/references.py
+docutils/parsers/rst/directives/tables.py
+docutils/parsers/rst/include/README.txt
+docutils/parsers/rst/include/isoamsa.txt
+docutils/parsers/rst/include/isoamsb.txt
+docutils/parsers/rst/include/isoamsc.txt
+docutils/parsers/rst/include/isoamsn.txt
+docutils/parsers/rst/include/isoamso.txt
+docutils/parsers/rst/include/isoamsr.txt
+docutils/parsers/rst/include/isobox.txt
+docutils/parsers/rst/include/isocyr1.txt
+docutils/parsers/rst/include/isocyr2.txt
+docutils/parsers/rst/include/isodia.txt
+docutils/parsers/rst/include/isogrk1.txt
+docutils/parsers/rst/include/isogrk2.txt
+docutils/parsers/rst/include/isogrk3.txt
+docutils/parsers/rst/include/isogrk4-wide.txt
+docutils/parsers/rst/include/isogrk4.txt
+docutils/parsers/rst/include/isolat1.txt
+docutils/parsers/rst/include/isolat2.txt
+docutils/parsers/rst/include/isomfrk-wide.txt
+docutils/parsers/rst/include/isomfrk.txt
+docutils/parsers/rst/include/isomopf-wide.txt
+docutils/parsers/rst/include/isomopf.txt
+docutils/parsers/rst/include/isomscr-wide.txt
+docutils/parsers/rst/include/isomscr.txt
+docutils/parsers/rst/include/isonum.txt
+docutils/parsers/rst/include/isopub.txt
+docutils/parsers/rst/include/isotech.txt
+docutils/parsers/rst/include/mmlalias.txt
+docutils/parsers/rst/include/mmlextra-wide.txt
+docutils/parsers/rst/include/mmlextra.txt
+docutils/parsers/rst/include/s5defs.txt
+docutils/parsers/rst/include/xhtml1-lat1.txt
+docutils/parsers/rst/include/xhtml1-special.txt
+docutils/parsers/rst/include/xhtml1-symbol.txt
+docutils/parsers/rst/languages/__init__.py
+docutils/parsers/rst/languages/af.py
+docutils/parsers/rst/languages/ca.py
+docutils/parsers/rst/languages/cs.py
+docutils/parsers/rst/languages/de.py
+docutils/parsers/rst/languages/en.py
+docutils/parsers/rst/languages/eo.py
+docutils/parsers/rst/languages/es.py
+docutils/parsers/rst/languages/fi.py
+docutils/parsers/rst/languages/fr.py
+docutils/parsers/rst/languages/he.py
+docutils/parsers/rst/languages/it.py
+docutils/parsers/rst/languages/ja.py
+docutils/parsers/rst/languages/nl.py
+docutils/parsers/rst/languages/pt_br.py
+docutils/parsers/rst/languages/ru.py
+docutils/parsers/rst/languages/sk.py
+docutils/parsers/rst/languages/sv.py
+docutils/parsers/rst/languages/zh_cn.py
+docutils/parsers/rst/languages/zh_tw.py
+docutils/readers/__init__.py
+docutils/readers/doctree.py
+docutils/readers/pep.py
+docutils/readers/standalone.py
+docutils/readers/python/__init__.py
+docutils/readers/python/moduleparser.py
+docutils/readers/python/pynodes.py
+docutils/transforms/__init__.py
+docutils/transforms/components.py
+docutils/transforms/frontmatter.py
+docutils/transforms/misc.py
+docutils/transforms/parts.py
+docutils/transforms/peps.py
+docutils/transforms/references.py
+docutils/transforms/universal.py
+docutils/transforms/writer_aux.py
+docutils/writers/__init__.py
+docutils/writers/docutils_xml.py
+docutils/writers/null.py
+docutils/writers/pseudoxml.py
+docutils/writers/html4css1/__init__.py
+docutils/writers/html4css1/html4css1.css
+docutils/writers/html4css1/template.txt
+docutils/writers/latex2e/__init__.py
+docutils/writers/latex2e/latex2e.tex
+docutils/writers/newlatex2e/__init__.py
+docutils/writers/newlatex2e/base.tex
+docutils/writers/newlatex2e/notes.txt
+docutils/writers/newlatex2e/tests.txt
+docutils/writers/newlatex2e/unicode_map.py
+docutils/writers/pep_html/__init__.py
+docutils/writers/pep_html/pep.css
+docutils/writers/pep_html/template.txt
+docutils/writers/s5_html/__init__.py
+docutils/writers/s5_html/themes/README.txt
+docutils/writers/s5_html/themes/big-black/__base__
+docutils/writers/s5_html/themes/big-black/framing.css
+docutils/writers/s5_html/themes/big-black/pretty.css
+docutils/writers/s5_html/themes/big-white/framing.css
+docutils/writers/s5_html/themes/big-white/pretty.css
+docutils/writers/s5_html/themes/default/blank.gif
+docutils/writers/s5_html/themes/default/framing.css
+docutils/writers/s5_html/themes/default/iepngfix.htc
+docutils/writers/s5_html/themes/default/opera.css
+docutils/writers/s5_html/themes/default/outline.css
+docutils/writers/s5_html/themes/default/pretty.css
+docutils/writers/s5_html/themes/default/print.css
+docutils/writers/s5_html/themes/default/s5-core.css
+docutils/writers/s5_html/themes/default/slides.css
+docutils/writers/s5_html/themes/default/slides.js
+docutils/writers/s5_html/themes/medium-black/__base__
+docutils/writers/s5_html/themes/medium-black/pretty.css
+docutils/writers/s5_html/themes/medium-white/framing.css
+docutils/writers/s5_html/themes/medium-white/pretty.css
+docutils/writers/s5_html/themes/small-black/__base__
+docutils/writers/s5_html/themes/small-black/pretty.css
+docutils/writers/s5_html/themes/small-white/framing.css
+docutils/writers/s5_html/themes/small-white/pretty.css
+extras/optparse.py
+extras/roman.py
+extras/textwrap.py
+extras/docutils.egg-info/PKG-INFO
+extras/docutils.egg-info/SOURCES.txt
+extras/docutils.egg-info/dependency_links.txt
+extras/docutils.egg-info/top_level.txt
+licenses/docutils.conf
+licenses/gpl.txt
+licenses/python-2-1-1.txt
+licenses/python-2-2.txt
+licenses/python-2-3.txt
+test/DocutilsTestSupport.py
+test/alltests.py
+test/coverage.sh
+test/docutils.conf
+test/docutils_difflib.py
+test/package_unittest.py
+test/test_dependencies.py
+test/test_functional.py
+test/test_io.py
+test/test_language.py
+test/test_nodes.py
+test/test_pickle.py
+test/test_publisher.py
+test/test_settings.py
+test/test_statemachine.py
+test/test_traversals.py
+test/test_utils.py
+test/test_viewlist.py
+test/data/config_1.txt
+test/data/config_2.txt
+test/data/config_error_handler.txt
+test/data/config_list.txt
+test/data/config_list_2.txt
+test/data/config_old.txt
+test/data/csv_data.txt
+test/data/csv_dep.txt
+test/data/dependencies.txt
+test/data/full-template.txt
+test/data/include.txt
+test/data/raw.txt
+test/data/stylesheet.txt
+test/functional/README.txt
+test/functional/expected/compact_lists.html
+test/functional/expected/dangerous.html
+test/functional/expected/field_name_limit.html
+test/functional/expected/latex_docinfo.tex
+test/functional/expected/misc_rst_html4css1.html
+test/functional/expected/pep_html.html
+test/functional/expected/standalone_rst_html4css1.html
+test/functional/expected/standalone_rst_latex.tex
+test/functional/expected/standalone_rst_pseudoxml.txt
+test/functional/expected/standalone_rst_s5_html_1.html
+test/functional/expected/standalone_rst_s5_html_2.html
+test/functional/expected/ui/default/blank.gif
+test/functional/expected/ui/default/framing.css
+test/functional/expected/ui/default/iepngfix.htc
+test/functional/expected/ui/default/opera.css
+test/functional/expected/ui/default/outline.css
+test/functional/expected/ui/default/pretty.css
+test/functional/expected/ui/default/print.css
+test/functional/expected/ui/default/s5-core.css
+test/functional/expected/ui/default/slides.css
+test/functional/expected/ui/default/slides.js
+test/functional/expected/ui/small-black/blank.gif
+test/functional/expected/ui/small-black/framing.css
+test/functional/expected/ui/small-black/iepngfix.htc
+test/functional/expected/ui/small-black/opera.css
+test/functional/expected/ui/small-black/outline.css
+test/functional/expected/ui/small-black/pretty.css
+test/functional/expected/ui/small-black/print.css
+test/functional/expected/ui/small-black/s5-core.css
+test/functional/expected/ui/small-black/slides.css
+test/functional/expected/ui/small-black/slides.js
+test/functional/input/compact_lists.txt
+test/functional/input/dangerous.txt
+test/functional/input/field_list.txt
+test/functional/input/latex_docinfo.txt
+test/functional/input/pep_html.txt
+test/functional/input/simple.txt
+test/functional/input/standalone_rst_html4css1.txt
+test/functional/input/standalone_rst_latex.txt
+test/functional/input/standalone_rst_newlatex.txt
+test/functional/input/standalone_rst_pseudoxml.txt
+test/functional/input/standalone_rst_s5_html.txt
+test/functional/input/data/custom_roles.txt
+test/functional/input/data/errors.txt
+test/functional/input/data/header_footer.txt
+test/functional/input/data/latex.txt
+test/functional/input/data/latex2e.txt
+test/functional/input/data/list_table.txt
+test/functional/input/data/nonalphanumeric.txt
+test/functional/input/data/standard.txt
+test/functional/input/data/table_colspan.txt
+test/functional/input/data/table_complex.txt
+test/functional/input/data/table_rowspan.txt
+test/functional/input/data/unicode.txt
+test/functional/output/README.txt
+test/functional/tests/_default.py
+test/functional/tests/_standalone_rst_defaults.py
+test/functional/tests/compact_lists.py
+test/functional/tests/dangerous.py
+test/functional/tests/field_name_limit.py
+test/functional/tests/latex_docinfo.py
+test/functional/tests/misc_rst_html4css1.py
+test/functional/tests/pep_html.py
+test/functional/tests/standalone_rst_html4css1.py
+test/functional/tests/standalone_rst_latex.py
+test/functional/tests/standalone_rst_pseudoxml.py
+test/functional/tests/standalone_rst_s5_html_1.py
+test/functional/tests/standalone_rst_s5_html_2.py
+test/test_parsers/__init__.py
+test/test_parsers/test_rst/__init__.py
+test/test_parsers/test_rst/test_SimpleTableParser.py
+test/test_parsers/test_rst/test_TableParser.py
+test/test_parsers/test_rst/test_block_quotes.py
+test/test_parsers/test_rst/test_bullet_lists.py
+test/test_parsers/test_rst/test_citations.py
+test/test_parsers/test_rst/test_comments.py
+test/test_parsers/test_rst/test_definition_lists.py
+test/test_parsers/test_rst/test_doctest_blocks.py
+test/test_parsers/test_rst/test_east_asian_text.py
+test/test_parsers/test_rst/test_enumerated_lists.py
+test/test_parsers/test_rst/test_field_lists.py
+test/test_parsers/test_rst/test_footnotes.py
+test/test_parsers/test_rst/test_functions.py
+test/test_parsers/test_rst/test_inline_markup.py
+test/test_parsers/test_rst/test_interpreted.py
+test/test_parsers/test_rst/test_line_blocks.py
+test/test_parsers/test_rst/test_literal_blocks.py
+test/test_parsers/test_rst/test_option_lists.py
+test/test_parsers/test_rst/test_outdenting.py
+test/test_parsers/test_rst/test_paragraphs.py
+test/test_parsers/test_rst/test_section_headers.py
+test/test_parsers/test_rst/test_substitutions.py
+test/test_parsers/test_rst/test_tables.py
+test/test_parsers/test_rst/test_targets.py
+test/test_parsers/test_rst/test_transitions.py
+test/test_parsers/test_rst/includes/include9.txt
+test/test_parsers/test_rst/test_directives/__init__.py
+test/test_parsers/test_rst/test_directives/empty.txt
+test/test_parsers/test_rst/test_directives/include 11.txt
+test/test_parsers/test_rst/test_directives/include1.txt
+test/test_parsers/test_rst/test_directives/include10.txt
+test/test_parsers/test_rst/test_directives/include12.txt
+test/test_parsers/test_rst/test_directives/include13.txt
+test/test_parsers/test_rst/test_directives/include2.txt
+test/test_parsers/test_rst/test_directives/include3.txt
+test/test_parsers/test_rst/test_directives/include8.txt
+test/test_parsers/test_rst/test_directives/raw1.txt
+test/test_parsers/test_rst/test_directives/test_admonitions.py
+test/test_parsers/test_rst/test_directives/test_block_quotes.py
+test/test_parsers/test_rst/test_directives/test_class.py
+test/test_parsers/test_rst/test_directives/test_compound.py
+test/test_parsers/test_rst/test_directives/test_container.py
+test/test_parsers/test_rst/test_directives/test_contents.py
+test/test_parsers/test_rst/test_directives/test_date.py
+test/test_parsers/test_rst/test_directives/test_decorations.py
+test/test_parsers/test_rst/test_directives/test_default_role.py
+test/test_parsers/test_rst/test_directives/test_figures.py
+test/test_parsers/test_rst/test_directives/test_images.py
+test/test_parsers/test_rst/test_directives/test_include.py
+test/test_parsers/test_rst/test_directives/test_line_blocks.py
+test/test_parsers/test_rst/test_directives/test_meta.py
+test/test_parsers/test_rst/test_directives/test_parsed_literals.py
+test/test_parsers/test_rst/test_directives/test_raw.py
+test/test_parsers/test_rst/test_directives/test_replace.py
+test/test_parsers/test_rst/test_directives/test_role.py
+test/test_parsers/test_rst/test_directives/test_rubrics.py
+test/test_parsers/test_rst/test_directives/test_sectnum.py
+test/test_parsers/test_rst/test_directives/test_sidebars.py
+test/test_parsers/test_rst/test_directives/test_tables.py
+test/test_parsers/test_rst/test_directives/test_target_notes.py
+test/test_parsers/test_rst/test_directives/test_test_directives.py
+test/test_parsers/test_rst/test_directives/test_title.py
+test/test_parsers/test_rst/test_directives/test_topics.py
+test/test_parsers/test_rst/test_directives/test_unicode.py
+test/test_parsers/test_rst/test_directives/test_unknown.py
+test/test_parsers/test_rst/test_directives/utf-16.csv
+test/test_parsers/test_rst/test_directives/includes/include4.txt
+test/test_parsers/test_rst/test_directives/includes/include5.txt
+test/test_parsers/test_rst/test_directives/includes/more/include6.txt
+test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
+test/test_readers/__init__.py
+test/test_readers/test_pep/__init__.py
+test/test_readers/test_pep/test_inline_markup.py
+test/test_readers/test_pep/test_rfc2822.py
+test/test_readers/test_python/__init__.py
+test/test_readers/test_python/showast
+test/test_readers/test_python/showdoc
+test/test_readers/test_python/showparse
+test/test_readers/test_python/showtok
+test/test_readers/test_python/test_functions.py
+test/test_readers/test_python/test_parser.py
+test/test_readers/test_python/test_token_parser.py
+test/test_transforms/__init__.py
+test/test_transforms/test___init__.py
+test/test_transforms/test_class.py
+test/test_transforms/test_contents.py
+test/test_transforms/test_docinfo.py
+test/test_transforms/test_doctitle.py
+test/test_transforms/test_expose_internals.py
+test/test_transforms/test_filter.py
+test/test_transforms/test_footnotes.py
+test/test_transforms/test_hyperlinks.py
+test/test_transforms/test_messages.py
+test/test_transforms/test_peps.py
+test/test_transforms/test_sectnum.py
+test/test_transforms/test_strip_comments.py
+test/test_transforms/test_substitutions.py
+test/test_transforms/test_target_notes.py
+test/test_transforms/test_transitions.py
+test/test_transforms/test_writer_aux.py
+test/test_writers/__init__.py
+test/test_writers/test_docutils_xml.py
+test/test_writers/test_html4css1_misc.py
+test/test_writers/test_html4css1_parts.py
+test/test_writers/test_html4css1_template.py
+test/test_writers/test_latex2e.py
+test/test_writers/test_null.py
+test/test_writers/test_pseudoxml.py
+test/test_writers/test_s5.py
+tools/buildhtml.py
+tools/docutils.conf
+tools/quicktest.py
+tools/rst2html.py
+tools/rst2latex.py
+tools/rst2newlatex.py
+tools/rst2pseudoxml.py
+tools/rst2s5.py
+tools/rst2xml.py
+tools/rstpep2html.py
+tools/dev/README.txt
+tools/dev/create_unimap.py
+tools/dev/profile_docutils.py
+tools/dev/unicode2rstsubs.py
+tools/editors/README.txt
+tools/editors/emacs/README.txt
+tools/editors/emacs/docutils.conf
+tools/editors/emacs/rst.el
+tools/editors/emacs/tests/Makefile
+tools/editors/emacs/tests/README.txt
+tools/editors/emacs/tests/tests-adjust-section.el
+tools/editors/emacs/tests/tests-basic.el
+tools/editors/emacs/tests/tests-runner.el
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='html', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2latex.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='latex', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2newlatex.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX using
+the new LaTeX writer.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources. This writer is EXPERIMENTAL and should not be used '
+               'in a production environment. ' + default_description)
+
+publish_cmdline(writer_name='newlatex2e', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing pseudo-XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates pseudo-XML from standalone reStructuredText '
+               'sources (for testing purposes).  ' + default_description)
+
+publish_cmdline(description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2s5.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Chris Liechti <cliechti@gmx.net>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML slides using
+the S5 template system.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates S5 (X)HTML slideshow documents from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='s5', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2xml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing Docutils XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates Docutils-native XML from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='xml', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+#!C:\Python25\python.exe
+
+# $Id: rstpep2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML from PEP
+(Python Enhancement Proposal) documents.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML from reStructuredText-format PEP files.  '
+               + default_description)
+
+publish_cmdline(reader_name='pep', writer_name='pep_html',
+                description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+docutils
+roman
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,204 @@
+# $Id: __init__.py 4801 2006-11-12 18:02:08Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the Docutils (Python Documentation Utilities) package.
+
+Package Structure
+=================
+
+Modules:
+
+- __init__.py: Contains component base classes, exception classes, and
+  Docutils version information.
+
+- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
+  functions.
+
+- frontend.py: Runtime settings (command-line interface, configuration files)
+  processing, for Docutils front-ends.
+
+- io.py: Provides a uniform API for low-level input and output.
+
+- nodes.py: Docutils document tree (doctree) node class library.
+
+- statemachine.py: A finite state machine specialized for
+  regular-expression-based text filters.
+
+- urischemes.py: Contains a complete mapping of known URI addressing
+  scheme names to descriptions.
+
+- utils.py: Contains the ``Reporter`` system warning class and miscellaneous
+  utilities.
+
+Subpackages:
+
+- languages: Language-specific mappings of terms.
+
+- parsers: Syntax-specific input parser modules or packages.
+
+- readers: Context-specific input handlers which understand the data
+  source and manage a parser.
+
+- transforms: Modules used by readers and writers to modify DPS
+  doctrees.
+
+- writers: Format-specific output translators.
+"""
+
+__docformat__ = 'reStructuredText'
+
+__version__ = '0.5'
+"""``major.minor.micro`` version number.  The micro number is bumped for API
+changes, for new functionality, and for interim project releases.  The minor
+number is bumped whenever there is a significant project release.  The major
+number will be bumped when the project is feature-complete, and perhaps if
+there is a major change in the design."""
+
+__version_details__ = 'snapshot 2007-11-01, r5461'
+"""Extra version details (e.g. 'snapshot 2005-05-29, r3410', 'repository',
+'release'), modified automatically & manually."""
+
+class ApplicationError(StandardError): pass
+class DataError(ApplicationError): pass
+
+
+class SettingsSpec:
+
+    """
+    Runtime setting specification base class.
+
+    SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
+    """
+
+    settings_spec = ()
+    """Runtime settings specification.  Override in subclasses.
+
+    Defines runtime settings and associated command-line options, as used by
+    `docutils.frontend.OptionParser`.  This is a tuple of:
+
+    - Option group title (string or `None` which implies no group, just a list
+      of single options).
+
+    - Description (string or `None`).
+
+    - A sequence of option tuples.  Each consists of:
+
+      - Help text (string)
+
+      - List of option strings (e.g. ``['-Q', '--quux']``).
+
+      - Dictionary of keyword arguments sent to the OptionParser/OptionGroup
+        ``add_option`` method.
+
+        Runtime setting names are derived implicitly from long option names
+        ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
+        'dest' keyword argument.
+
+        Most settings will also have a 'validator' keyword & function.  The
+        validator function validates setting values (from configuration files
+        and command-line option arguments) and converts them to appropriate
+        types.  For example, the ``docutils.frontend.validate_boolean``
+        function, **required by all boolean settings**, converts true values
+        ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off',
+        'no', 'false', and '') to 0.  Validators need only be set once per
+        setting.  See the `docutils.frontend.validate_*` functions.
+
+        See the optparse docs for more details.
+
+    - More triples of group title, description, options, as many times as
+      needed.  Thus, `settings_spec` tuples can be simply concatenated.
+    """
+
+    settings_defaults = None
+    """A dictionary of defaults for settings not in `settings_spec` (internal
+    settings, intended to be inaccessible by command-line and config file).
+    Override in subclasses."""
+
+    settings_default_overrides = None
+    """A dictionary of auxiliary defaults, to override defaults for settings
+    defined in other components.  Override in subclasses."""
+
+    relative_path_settings = ()
+    """Settings containing filesystem paths.  Override in subclasses.
+    Settings listed here are to be interpreted relative to the current working
+    directory."""
+
+    config_section = None
+    """The name of the config file section specific to this component
+    (lowercase, no brackets).  Override in subclasses."""
+
+    config_section_dependencies = None
+    """A list of names of config file sections that are to be applied before
+    `config_section`, in order (from general to specific).  In other words,
+    the settings in `config_section` are to be overlaid on top of the settings
+    from these sections.  The "general" section is assumed implicitly.
+    Override in subclasses."""
+
+
+class TransformSpec:
+
+    """
+    Runtime transform specification base class.
+
+    TransformSpec subclass objects used by `docutils.transforms.Transformer`.
+    """
+
+    def get_transforms(self):
+        """Transforms required by this class.  Override in subclasses."""
+        if self.default_transforms != ():
+            import warnings
+            warnings.warn('default_transforms attribute deprecated.\n'
+                          'Use get_transforms() method instead.',
+                          DeprecationWarning)
+            return list(self.default_transforms)
+        return []
+
+    # Deprecated; for compatibility.
+    default_transforms = ()
+
+    unknown_reference_resolvers = ()
+    """List of functions to try to resolve unknown references.  Unknown
+    references have a 'refname' attribute which doesn't correspond to any
+    target in the document.  Called when the transforms in
+    `docutils.tranforms.references` are unable to find a correct target.  The
+    list should contain functions which will try to resolve unknown
+    references, with the following signature::
+
+        def reference_resolver(node):
+            '''Returns boolean: true if resolved, false if not.'''
+
+    If the function is able to resolve the reference, it should also remove
+    the 'refname' attribute and mark the node as resolved::
+
+        del node['refname']
+        node.resolved = 1
+
+    Each function must have a "priority" attribute which will affect the order
+    the unknown_reference_resolvers are run::
+
+        reference_resolver.priority = 100
+
+    Override in subclasses."""
+
+
+class Component(SettingsSpec, TransformSpec):
+
+    """Base class for Docutils components."""
+
+    component_type = None
+    """Name of the component type ('reader', 'parser', 'writer').  Override in
+    subclasses."""
+
+    supported = ()
+    """Names for this component.  Override in subclasses."""
+
+    def supports(self, format):
+        """
+        Is `format` supported by this component?
+
+        To be used by transforms to ask the dependent component if it supports
+        a certain input context or output format.
+        """
+        return format in self.supported
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/core.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,613 @@
+# $Id: core.py 5033 2007-03-21 19:51:22Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Calling the ``publish_*`` convenience functions (or instantiating a
+`Publisher` object) with component names will result in default
+behavior.  For custom behavior (setting component options), create
+custom component objects first, and pass *them* to
+``publish_*``/`Publisher`.  See `The Docutils Publisher`_.
+
+.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import pprint
+from types import StringType
+from docutils import __version__, __version_details__, SettingsSpec
+from docutils import frontend, io, utils, readers, writers
+from docutils.frontend import OptionParser
+from docutils.transforms import Transformer
+import docutils.readers.doctree
+
+
+class Publisher:
+
+    """
+    A facade encapsulating the high-level logic of a Docutils system.
+    """
+
+    def __init__(self, reader=None, parser=None, writer=None,
+                 source=None, source_class=io.FileInput,
+                 destination=None, destination_class=io.FileOutput,
+                 settings=None):
+        """
+        Initial setup.  If any of `reader`, `parser`, or `writer` are not
+        specified, the corresponding ``set_...`` method should be called with
+        a component name (`set_reader` sets the parser as well).
+        """
+
+        self.document = None
+        """The document tree (`docutils.nodes` objects)."""
+
+        self.reader = reader
+        """A `docutils.readers.Reader` instance."""
+
+        self.parser = parser
+        """A `docutils.parsers.Parser` instance."""
+
+        self.writer = writer
+        """A `docutils.writers.Writer` instance."""
+
+        for component in 'reader', 'parser', 'writer':
+            assert not isinstance(getattr(self, component), StringType), \
+                   ('passed string as "%s" parameter; use "%s_name" instead'
+                    % (getattr(self, component), component, component))
+
+        self.source = source
+        """The source of input data, a `docutils.io.Input` instance."""
+
+        self.source_class = source_class
+        """The class for dynamically created source objects."""
+
+        self.destination = destination
+        """The destination for docutils output, a `docutils.io.Output`
+        instance."""
+
+        self.destination_class = destination_class
+        """The class for dynamically created destination objects."""
+
+        self.settings = settings
+        """An object containing Docutils settings as instance attributes.
+        Set by `self.process_command_line()` or `self.get_settings()`."""
+
+    def set_reader(self, reader_name, parser, parser_name):
+        """Set `self.reader` by name."""
+        reader_class = readers.get_reader_class(reader_name)
+        self.reader = reader_class(parser, parser_name)
+        self.parser = self.reader.parser
+
+    def set_writer(self, writer_name):
+        """Set `self.writer` by name."""
+        writer_class = writers.get_writer_class(writer_name)
+        self.writer = writer_class()
+
+    def set_components(self, reader_name, parser_name, writer_name):
+        if self.reader is None:
+            self.set_reader(reader_name, self.parser, parser_name)
+        if self.parser is None:
+            if self.reader.parser is None:
+                self.reader.set_parser(parser_name)
+            self.parser = self.reader.parser
+        if self.writer is None:
+            self.set_writer(writer_name)
+
+    def setup_option_parser(self, usage=None, description=None,
+                            settings_spec=None, config_section=None,
+                            **defaults):
+        if config_section:
+            if not settings_spec:
+                settings_spec = SettingsSpec()
+            settings_spec.config_section = config_section
+            parts = config_section.split()
+            if len(parts) > 1 and parts[-1] == 'application':
+                settings_spec.config_section_dependencies = ['applications']
+        #@@@ Add self.source & self.destination to components in future?
+        option_parser = OptionParser(
+            components=(self.parser, self.reader, self.writer, settings_spec),
+            defaults=defaults, read_config_files=1,
+            usage=usage, description=description)
+        return option_parser
+
+    def get_settings(self, usage=None, description=None,
+                     settings_spec=None, config_section=None, **defaults):
+        """
+        Set and return default settings (overrides in `defaults` dict).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        Explicitly setting `self.settings` disables command line option
+        processing from `self.publish()`.
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        self.settings = option_parser.get_default_values()
+        return self.settings
+
+    def process_programmatic_settings(self, settings_spec,
+                                      settings_overrides,
+                                      config_section):
+        if self.settings is None:
+            defaults = (settings_overrides or {}).copy()
+            # Propagate exceptions by default when used programmatically:
+            defaults.setdefault('traceback', 1)
+            self.get_settings(settings_spec=settings_spec,
+                              config_section=config_section,
+                              **defaults)
+
+    def process_command_line(self, argv=None, usage=None, description=None,
+                             settings_spec=None, config_section=None,
+                             **defaults):
+        """
+        Pass an empty list to `argv` to avoid reading `sys.argv` (the
+        default).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        if argv is None:
+            argv = sys.argv[1:]
+        self.settings = option_parser.parse_args(argv)
+
+    def set_io(self, source_path=None, destination_path=None):
+        if self.source is None:
+            self.set_source(source_path=source_path)
+        if self.destination is None:
+            self.set_destination(destination_path=destination_path)
+
+    def set_source(self, source=None, source_path=None):
+        if source_path is None:
+            source_path = self.settings._source
+        else:
+            self.settings._source = source_path
+        self.source = self.source_class(
+            source=source, source_path=source_path,
+            encoding=self.settings.input_encoding)
+
+    def set_destination(self, destination=None, destination_path=None):
+        if destination_path is None:
+            destination_path = self.settings._destination
+        else:
+            self.settings._destination = destination_path
+        self.destination = self.destination_class(
+            destination=destination, destination_path=destination_path,
+            encoding=self.settings.output_encoding,
+            error_handler=self.settings.output_encoding_error_handler)
+
+    def apply_transforms(self):
+        self.document.transformer.populate_from_components(
+            (self.source, self.reader, self.reader.parser, self.writer,
+             self.destination))
+        self.document.transformer.apply_transforms()
+
+    def publish(self, argv=None, usage=None, description=None,
+                settings_spec=None, settings_overrides=None,
+                config_section=None, enable_exit_status=None):
+        """
+        Process command line options and arguments (if `self.settings` not
+        already set), run `self.reader` and then `self.writer`.  Return
+        `self.writer`'s output.
+        """
+        exit = None
+        try:
+            if self.settings is None:
+                self.process_command_line(
+                    argv, usage, description, settings_spec, config_section,
+                    **(settings_overrides or {}))
+            self.set_io()
+            self.document = self.reader.read(self.source, self.parser,
+                                             self.settings)
+            self.apply_transforms()
+            output = self.writer.write(self.document, self.destination)
+            self.writer.assemble_parts()
+        except SystemExit, error:
+            exit = 1
+            exit_status = error.code
+        except Exception, error:
+            if not self.settings:       # exception too early to report nicely
+                raise
+            if self.settings.traceback: # Propagate exceptions?
+                self.debugging_dumps()
+                raise
+            self.report_Exception(error)
+            exit = 1
+            exit_status = 1
+        self.debugging_dumps()
+        if (enable_exit_status and self.document
+            and (self.document.reporter.max_level
+                 >= self.settings.exit_status_level)):
+            sys.exit(self.document.reporter.max_level + 10)
+        elif exit:
+            sys.exit(exit_status)
+        return output
+
+    def debugging_dumps(self):
+        if not self.document:
+            return
+        if self.settings.dump_settings:
+            print >>sys.stderr, '\n::: Runtime settings:'
+            print >>sys.stderr, pprint.pformat(self.settings.__dict__)
+        if self.settings.dump_internals:
+            print >>sys.stderr, '\n::: Document internals:'
+            print >>sys.stderr, pprint.pformat(self.document.__dict__)
+        if self.settings.dump_transforms:
+            print >>sys.stderr, '\n::: Transforms applied:'
+            print >>sys.stderr, (' (priority, transform class, '
+                                 'pending node details, keyword args)')
+            print >>sys.stderr, pprint.pformat(
+                [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
+                  pending and pending.details, kwargs)
+                 for priority, xclass, pending, kwargs
+                 in self.document.transformer.applied])
+        if self.settings.dump_pseudo_xml:
+            print >>sys.stderr, '\n::: Pseudo-XML:'
+            print >>sys.stderr, self.document.pformat().encode(
+                'raw_unicode_escape')
+
+    def report_Exception(self, error):
+        if isinstance(error, utils.SystemMessage):
+            self.report_SystemMessage(error)
+        elif isinstance(error, UnicodeError):
+            self.report_UnicodeError(error)
+        else:
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__, error)
+            print >>sys.stderr, ("""\
+Exiting due to error.  Use "--traceback" to diagnose.
+Please report errors to <docutils-users@lists.sf.net>.
+Include "--traceback" output, Docutils version (%s [%s]),
+Python version (%s), your OS type & version, and the
+command line used.""" % (__version__, __version_details__,
+                         sys.version.split()[0]))
+
+    def report_SystemMessage(self, error):
+        print >>sys.stderr, ('Exiting due to level-%s (%s) system message.'
+                             % (error.level,
+                                utils.Reporter.levels[error.level]))
+
+    def report_UnicodeError(self, error):
+        sys.stderr.write(
+            '%s: %s\n'
+            '\n'
+            'The specified output encoding (%s) cannot\n'
+            'handle all of the output.\n'
+            'Try setting "--output-encoding-error-handler" to\n'
+            '\n'
+            '* "xmlcharrefreplace" (for HTML & XML output);\n'
+            % (error.__class__.__name__, error,
+               self.settings.output_encoding))
+        try:
+            data = error.object[error.start:error.end]
+            sys.stderr.write(
+                '  the output will contain "%s" and should be usable.\n'
+                '* "backslashreplace" (for other output formats, Python 2.3+);\n'
+                '  look for "%s" in the output.\n'
+                % (data.encode('ascii', 'xmlcharrefreplace'),
+                   data.encode('ascii', 'backslashreplace')))
+        except AttributeError:
+            sys.stderr.write('  the output should be usable as-is.\n')
+        sys.stderr.write(
+            '* "replace"; look for "?" in the output.\n'
+            '\n'
+            '"--output-encoding-error-handler" is currently set to "%s".\n'
+            '\n'
+            'Exiting due to error.  Use "--traceback" to diagnose.\n'
+            'If the advice above doesn\'t eliminate the error,\n'
+            'please report it to <docutils-users@lists.sf.net>.\n'
+            'Include "--traceback" output, Docutils version (%s),\n'
+            'Python version (%s), your OS type & version, and the\n'
+            'command line used.\n'
+            % (self.settings.output_encoding_error_handler,
+               __version__, sys.version.split()[0]))
+
+default_usage = '%prog [options] [<source> [<destination>]]'
+default_description = ('Reads from <source> (default is stdin) and writes to '
+                       '<destination> (default is stdout).  See '
+                       '<http://docutils.sf.net/docs/user/config.html> for '
+                       'the full reference.')
+
+def publish_cmdline(reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    writer=None, writer_name='pseudoxml',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=1, argv=None,
+                    usage=default_usage, description=default_description):
+    """
+    Set up & run a `Publisher` for command-line-based file I/O (input and
+    output file paths taken automatically from the command line).  Return the
+    encoded string output also.
+
+    Parameters: see `publish_programmatically` for the remainder.
+
+    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
+    - `usage`: Usage string, output if there's a problem parsing the command
+      line.
+    - `description`: Program description, output for the "--help" option
+      (along with command-line option descriptions).
+    """
+    pub = Publisher(reader, parser, writer, settings=settings)
+    pub.set_components(reader_name, parser_name, writer_name)
+    output = pub.publish(
+        argv, usage, description, settings_spec, settings_overrides,
+        config_section=config_section, enable_exit_status=enable_exit_status)
+    return output
+
+def publish_file(source=None, source_path=None,
+                 destination=None, destination_path=None,
+                 reader=None, reader_name='standalone',
+                 parser=None, parser_name='restructuredtext',
+                 writer=None, writer_name='pseudoxml',
+                 settings=None, settings_spec=None, settings_overrides=None,
+                 config_section=None, enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with file-like I/O.
+    Return the encoded string output also.
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.FileInput, source=source, source_path=source_path,
+        destination_class=io.FileOutput,
+        destination=destination, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_string(source, source_path=None, destination_path=None,
+                   reader=None, reader_name='standalone',
+                   parser=None, parser_name='restructuredtext',
+                   writer=None, writer_name='pseudoxml',
+                   settings=None, settings_spec=None,
+                   settings_overrides=None, config_section=None,
+                   enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.  Return
+    the encoded string or Unicode string output.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_string(..., settings_overrides={'output_encoding': 'unicode'})
+
+    Similarly for Unicode string input (`source`)::
+
+        publish_string(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.StringInput, source=source, source_path=source_path,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_parts(source, source_path=None, source_class=io.StringInput,
+                  destination_path=None,
+                  reader=None, reader_name='standalone',
+                  parser=None, parser_name='restructuredtext',
+                  writer=None, writer_name='pseudoxml',
+                  settings=None, settings_spec=None,
+                  settings_overrides=None, config_section=None,
+                  enable_exit_status=None):
+    """
+    Set up & run a `Publisher`, and return a dictionary of document parts.
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.  For programmatic use with string I/O.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's how::
+
+        publish_parts(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source=source, source_path=source_path, source_class=source_class,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return pub.writer.parts
+
+def publish_doctree(source, source_path=None,
+                    source_class=io.StringInput,
+                    reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.
+    Return the document tree.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's one way::
+
+        publish_doctree(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    pub = Publisher(reader=reader, parser=parser, writer=None,
+                    settings=settings,
+                    source_class=source_class,
+                    destination_class=io.NullOutput)
+    pub.set_components(reader_name, parser_name, 'null')
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(None, None)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return pub.document
+
+def publish_from_doctree(document, destination_path=None,
+                         writer=None, writer_name='pseudoxml',
+                         settings=None, settings_spec=None,
+                         settings_overrides=None, config_section=None,
+                         enable_exit_status=None):
+    """
+    Set up & run a `Publisher` to render from an existing document
+    tree data structure, for programmatic use with string I/O.  Return
+    the encoded string output.
+
+    Note that document.settings is overridden; if you want to use the settings
+    of the original `document`, pass settings=document.settings.
+
+    Also, new document.transformer and document.reporter objects are
+    generated.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_from_doctree(
+            ..., settings_overrides={'output_encoding': 'unicode'})
+
+    Parameters: `document` is a `docutils.nodes.document` object, an existing
+    document tree.
+
+    Other parameters: see `publish_programmatically`.
+    """
+    reader = docutils.readers.doctree.Reader(parser_name='null')
+    pub = Publisher(reader, None, writer,
+                    source=io.DocTreeInput(document),
+                    destination_class=io.StringOutput, settings=settings)
+    if not writer and writer_name:
+        pub.set_writer(writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_destination(None, destination_path)
+    return pub.publish(enable_exit_status=enable_exit_status)
+
+def publish_programmatically(source_class, source, source_path,
+                             destination_class, destination, destination_path,
+                             reader, reader_name,
+                             parser, parser_name,
+                             writer, writer_name,
+                             settings, settings_spec,
+                             settings_overrides, config_section,
+                             enable_exit_status):
+    """
+    Set up & run a `Publisher` for custom programmatic use.  Return the
+    encoded string output and the Publisher object.
+
+    Applications should not need to call this function directly.  If it does
+    seem to be necessary to call this function directly, please write to the
+    Docutils-develop mailing list
+    <http://docutils.sf.net/docs/user/mailing-lists.html#docutils-develop>.
+
+    Parameters:
+
+    * `source_class` **required**: The class for dynamically created source
+      objects.  Typically `io.FileInput` or `io.StringInput`.
+
+    * `source`: Type depends on `source_class`:
+
+      - If `source_class` is `io.FileInput`: Either a file-like object
+        (must have 'read' and 'close' methods), or ``None``
+        (`source_path` is opened).  If neither `source` nor
+        `source_path` are supplied, `sys.stdin` is used.
+
+      - If `source_class` is `io.StringInput` **required**: The input
+        string, either an encoded 8-bit string (set the
+        'input_encoding' setting to the correct encoding) or a Unicode
+        string (set the 'input_encoding' setting to 'unicode').
+
+    * `source_path`: Type depends on `source_class`:
+
+      - `io.FileInput`: Path to the input file, opened if no `source`
+        supplied.
+
+      - `io.StringInput`: Optional.  Path to the file or object that produced
+        `source`.  Only used for diagnostic output.
+
+    * `destination_class` **required**: The class for dynamically created
+      destination objects.  Typically `io.FileOutput` or `io.StringOutput`.
+
+    * `destination`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Either a file-like object (must have 'write' and
+        'close' methods), or ``None`` (`destination_path` is opened).  If
+        neither `destination` nor `destination_path` are supplied,
+        `sys.stdout` is used.
+
+      - `io.StringOutput`: Not used; pass ``None``.
+
+    * `destination_path`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Path to the output file.  Opened if no `destination`
+        supplied.
+
+      - `io.StringOutput`: Path to the file or object which will receive the
+        output; optional.  Used for determining relative paths (stylesheets,
+        source links, etc.).
+
+    * `reader`: A `docutils.readers.Reader` object.
+
+    * `reader_name`: Name or alias of the Reader class to be instantiated if
+      no `reader` supplied.
+
+    * `parser`: A `docutils.parsers.Parser` object.
+
+    * `parser_name`: Name or alias of the Parser class to be instantiated if
+      no `parser` supplied.
+
+    * `writer`: A `docutils.writers.Writer` object.
+
+    * `writer_name`: Name or alias of the Writer class to be instantiated if
+      no `writer` supplied.
+
+    * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
+      dotted-attribute access to runtime settings.  It's the end result of the
+      `SettingsSpec`, config file, and option processing.  If `settings` is
+      passed, it's assumed to be complete and no further setting/config/option
+      processing is done.
+
+    * `settings_spec`: A `docutils.SettingsSpec` subclass or object.  Provides
+      extra application-specific settings definitions independently of
+      components.  In other words, the application becomes a component, and
+      its settings data is processed along with that of the other components.
+      Used only if no `settings` specified.
+
+    * `settings_overrides`: A dictionary containing application-specific
+      settings defaults that override the defaults of other components.
+      Used only if no `settings` specified.
+
+    * `config_section`: A string, the name of the configuration file section
+      for this application.  Overrides the ``config_section`` attribute
+      defined by `settings_spec`.  Used only if no `settings` specified.
+
+    * `enable_exit_status`: Boolean; enable exit status at end of processing?
+    """
+    pub = Publisher(reader, parser, writer, settings=settings,
+                    source_class=source_class,
+                    destination_class=destination_class)
+    pub.set_components(reader_name, parser_name, writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(destination, destination_path)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return output, pub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/examples.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+# $Id: examples.py 4800 2006-11-12 18:02:01Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module contains practical examples of Docutils client code.
+
+Importing this module from client code is not recommended; its contents are
+subject to change in future Docutils releases.  Instead, it is recommended
+that you copy and paste the parts you need into your own code, modifying as
+necessary.
+"""
+
+from docutils import core, io
+
+
+def html_parts(input_string, source_path=None, destination_path=None,
+               input_encoding='unicode', doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns a dictionary of HTML document parts.
+
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.
+
+    Parameters:
+
+    - `input_string`: A multi-line text string; required.
+    - `source_path`: Path to the source file or object.  Optional, but useful
+      for diagnostic output (system messages).
+    - `destination_path`: Path to the file or object which will receive the
+      output; optional.  Used for determining relative paths (stylesheets,
+      source links, etc.).
+    - `input_encoding`: The encoding of `input_string`.  If it is an encoded
+      8-bit string, provide the correct encoding.  If it is a Unicode string,
+      use "unicode", the default.
+    - `doctitle`: Disable the promotion of a lone top-level section title to
+      document title (and subsequent section title to document subtitle
+      promotion); enabled by default.
+    - `initial_header_level`: The initial level for header elements (e.g. 1
+      for "<h1>").
+    """
+    overrides = {'input_encoding': input_encoding,
+                 'doctitle_xform': doctitle,
+                 'initial_header_level': initial_header_level}
+    parts = core.publish_parts(
+        source=input_string, source_path=source_path,
+        destination_path=destination_path,
+        writer_name='html', settings_overrides=overrides)
+    return parts
+
+def html_body(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', output_encoding='unicode',
+              doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns an HTML fragment as a string.
+
+    The return value is the contents of the <body> element.
+
+    Parameters (see `html_parts()` for the remainder):
+
+    - `output_encoding`: The desired encoding of the output.  If a Unicode
+      string is desired, use the default value of "unicode" .
+    """
+    parts = html_parts(
+        input_string=input_string, source_path=source_path,
+        destination_path=destination_path,
+        input_encoding=input_encoding, doctitle=doctitle,
+        initial_header_level=initial_header_level)
+    fragment = parts['html_body']
+    if output_encoding != 'unicode':
+        fragment = fragment.encode(output_encoding)
+    return fragment
+
+def internals(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', settings_overrides=None):
+    """
+    Return the document tree and publisher, for exploring Docutils internals.
+
+    Parameters: see `html_parts()`.
+    """
+    if settings_overrides:
+        overrides = settings_overrides.copy()
+    else:
+        overrides = {}
+    overrides['input_encoding'] = input_encoding
+    output, pub = core.publish_programmatically(
+        source_class=io.StringInput, source=input_string,
+        source_path=source_path,
+        destination_class=io.NullOutput, destination=None,
+        destination_path=destination_path,
+        reader=None, reader_name='standalone',
+        parser=None, parser_name='restructuredtext',
+        writer=None, writer_name='null',
+        settings=None, settings_spec=None, settings_overrides=overrides,
+        config_section=None, enable_exit_status=None)
+    return pub.writer.document, pub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/frontend.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,756 @@
+# $Id: frontend.py 4913 2007-02-12 04:05:20Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Command-line and common processing for Docutils front-end tools.
+
+Exports the following classes:
+
+* `OptionParser`: Standard Docutils command-line processing.
+* `Option`: Customized version of `optparse.Option`; validation support.
+* `Values`: Runtime settings; objects are simple structs
+  (``object.attribute``).  Supports cumulative list settings (attributes).
+* `ConfigParser`: Standard Docutils config file processing.
+
+Also exports the following functions:
+
+* Option callbacks: `store_multiple`, `read_config_file`.
+* Setting validators: `validate_encoding`,
+  `validate_encoding_error_handler`,
+  `validate_encoding_and_error_handler`, `validate_boolean`,
+  `validate_threshold`, `validate_colon_separated_string_list`,
+  `validate_dependency_file`.
+* `make_paths_absolute`.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os
+import os.path
+import sys
+import types
+import warnings
+import ConfigParser as CP
+import codecs
+import docutils
+import docutils.utils
+import docutils.nodes
+try:
+    import optparse
+    from optparse import SUPPRESS_HELP
+except ImportError:
+    import optik as optparse
+    from optik import SUPPRESS_HELP
+
+
+def store_multiple(option, opt, value, parser, *args, **kwargs):
+    """
+    Store multiple values in `parser.values`.  (Option callback.)
+
+    Store `None` for each attribute named in `args`, and store the value for
+    each key (attribute name) in `kwargs`.
+    """
+    for attribute in args:
+        setattr(parser.values, attribute, None)
+    for key, value in kwargs.items():
+        setattr(parser.values, key, value)
+
+def read_config_file(option, opt, value, parser):
+    """
+    Read a configuration file during option processing.  (Option callback.)
+    """
+    try:
+        new_settings = parser.get_config_file_settings(value)
+    except ValueError, error:
+        parser.error(error)
+    parser.values.update(new_settings, parser)
+
+def validate_encoding(setting, value, option_parser,
+                      config_parser=None, config_section=None):
+    try:
+        codecs.lookup(value)
+    except LookupError:
+        raise (LookupError('setting "%s": unknown encoding: "%s"'
+                           % (setting, value)),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_error_handler(setting, value, option_parser,
+                                    config_parser=None, config_section=None):
+    try:
+        codecs.lookup_error(value)
+    except AttributeError:              # prior to Python 2.3
+        if value not in ('strict', 'ignore', 'replace', 'xmlcharrefreplace'):
+            raise (LookupError(
+                'unknown encoding error handler: "%s" (choices: '
+                '"strict", "ignore", "replace", or "xmlcharrefreplace")' % value),
+                   None, sys.exc_info()[2])
+    except LookupError:
+        raise (LookupError(
+            'unknown encoding error handler: "%s" (choices: '
+            '"strict", "ignore", "replace", "backslashreplace", '
+            '"xmlcharrefreplace", and possibly others; see documentation for '
+            'the Python ``codecs`` module)' % value),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_and_error_handler(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    """
+    Side-effect: if an error handler is included in the value, it is inserted
+    into the appropriate place as if it was a separate setting/option.
+    """
+    if ':' in value:
+        encoding, handler = value.split(':')
+        validate_encoding_error_handler(
+            setting + '_error_handler', handler, option_parser,
+            config_parser, config_section)
+        if config_parser:
+            config_parser.set(config_section, setting + '_error_handler',
+                              handler)
+        else:
+            setattr(option_parser.values, setting + '_error_handler', handler)
+    else:
+        encoding = value
+    validate_encoding(setting, encoding, option_parser,
+                      config_parser, config_section)
+    return encoding
+
+def validate_boolean(setting, value, option_parser,
+                     config_parser=None, config_section=None):
+    if isinstance(value, types.UnicodeType):
+        try:
+            return option_parser.booleans[value.strip().lower()]
+        except KeyError:
+            raise (LookupError('unknown boolean value: "%s"' % value),
+                   None, sys.exc_info()[2])
+    return value
+
+def validate_nonnegative_int(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    value = int(value)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+def validate_threshold(setting, value, option_parser,
+                       config_parser=None, config_section=None):
+    try:
+        return int(value)
+    except ValueError:
+        try:
+            return option_parser.thresholds[value.lower()]
+        except (KeyError, AttributeError):
+            raise (LookupError('unknown threshold: %r.' % value),
+                   None, sys.exc_info[2])
+
+def validate_colon_separated_string_list(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if isinstance(value, types.UnicodeType):
+        value = value.split(':')
+    else:
+        last = value.pop()
+        value.extend(last.split(':'))
+    return value
+
+def validate_url_trailing_slash(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if not value:
+        return './'
+    elif value.endswith('/'):
+        return value
+    else:
+        return value + '/'
+
+def validate_dependency_file(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    try:
+        return docutils.utils.DependencyList(value)
+    except IOError:
+        return docutils.utils.DependencyList(None)
+
+def validate_strip_class(setting, value, option_parser,
+                         config_parser=None, config_section=None):
+    if config_parser:                   # validate all values
+        class_values = value
+    else:                               # just validate the latest value
+        class_values = [value[-1]]
+    for class_value in class_values:
+        normalized = docutils.nodes.make_id(class_value)
+        if class_value != normalized:
+            raise ValueError('invalid class value %r (perhaps %r?)'
+                             % (class_value, normalized))
+    return value
+
+def make_paths_absolute(pathdict, keys, base_path=None):
+    """
+    Interpret filesystem path settings relative to the `base_path` given.
+
+    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
+    `OptionParser.relative_path_settings`.
+    """
+    if base_path is None:
+        base_path = os.getcwd()
+    for key in keys:
+        if pathdict.has_key(key):
+            value = pathdict[key]
+            if isinstance(value, types.ListType):
+                value = [make_one_path_absolute(base_path, path)
+                         for path in value]
+            elif value:
+                value = make_one_path_absolute(base_path, value)
+            pathdict[key] = value
+
+def make_one_path_absolute(base_path, path):
+    return os.path.abspath(os.path.join(base_path, path))
+
+
+class Values(optparse.Values):
+
+    """
+    Updates list attributes by extension rather than by replacement.
+    Works in conjunction with the `OptionParser.lists` instance attribute.
+    """
+
+    def __init__(self, *args, **kwargs):
+        optparse.Values.__init__(self, *args, **kwargs)
+        if (not hasattr(self, 'record_dependencies')
+            or self.record_dependencies is None):
+            # Set up dependency list, in case it is needed.
+            self.record_dependencies = docutils.utils.DependencyList()
+
+    def update(self, other_dict, option_parser):
+        if isinstance(other_dict, Values):
+            other_dict = other_dict.__dict__
+        other_dict = other_dict.copy()
+        for setting in option_parser.lists.keys():
+            if (hasattr(self, setting) and other_dict.has_key(setting)):
+                value = getattr(self, setting)
+                if value:
+                    value += other_dict[setting]
+                    del other_dict[setting]
+        self._update_loose(other_dict)
+
+    def copy(self):
+        """Return a shallow copy of `self`."""
+        return self.__class__(defaults=self.__dict__)
+
+
+class Option(optparse.Option):
+
+    ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
+
+    def process(self, opt, value, values, parser):
+        """
+        Call the validator function on applicable settings and
+        evaluate the 'overrides' option.
+        Extends `optparse.Option.process`.
+        """
+        result = optparse.Option.process(self, opt, value, values, parser)
+        setting = self.dest
+        if setting:
+            if self.validator:
+                value = getattr(values, setting)
+                try:
+                    new_value = self.validator(setting, value, parser)
+                except Exception, error:
+                    raise (optparse.OptionValueError(
+                        'Error in option "%s":\n    %s: %s'
+                        % (opt, error.__class__.__name__, error)),
+                           None, sys.exc_info()[2])
+                setattr(values, setting, new_value)
+            if self.overrides:
+                setattr(values, self.overrides, None)
+        return result
+
+
+class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
+
+    """
+    Parser for command-line and library use.  The `settings_spec`
+    specification here and in other Docutils components are merged to build
+    the set of command-line options and runtime settings for this process.
+
+    Common settings (defined below) and component-specific settings must not
+    conflict.  Short options are reserved for common settings, and components
+    are restrict to using long options.
+    """
+
+    standard_config_files = [
+        '/etc/docutils.conf',           # system-wide
+        './docutils.conf',              # project-specific
+        '~/.docutils']                  # user-specific
+    """Docutils configuration files, using ConfigParser syntax.  Filenames
+    will be tilde-expanded later.  Later files override earlier ones."""
+
+    threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
+    """Possible inputs for for --report and --halt threshold values."""
+
+    thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
+    """Lookup table for --report and --halt threshold values."""
+
+    booleans={'1': 1, 'on': 1, 'yes': 1, 'true': 1,
+              '0': 0, 'off': 0, 'no': 0, 'false': 0, '': 0}
+    """Lookup table for boolean configuration file settings."""
+
+    if hasattr(codecs, 'backslashreplace_errors'):
+        default_error_encoding_error_handler = 'backslashreplace'
+    else:
+        default_error_encoding_error_handler = 'replace'
+
+    settings_spec = (
+        'General Docutils Options',
+        None,
+        (('Specify the document title as metadata.',
+          ['--title'], {}),
+         ('Include a "Generated by Docutils" credit and link.',
+          ['--generator', '-g'], {'action': 'store_true',
+                                  'validator': validate_boolean}),
+         ('Do not include a generator credit.',
+          ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
+         ('Include the date at the end of the document (UTC).',
+          ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
+                             'dest': 'datestamp'}),
+         ('Include the time & date (UTC).',
+          ['--time', '-t'], {'action': 'store_const',
+                             'const': '%Y-%m-%d %H:%M UTC',
+                             'dest': 'datestamp'}),
+         ('Do not include a datestamp of any kind.',
+          ['--no-datestamp'], {'action': 'store_const', 'const': None,
+                               'dest': 'datestamp'}),
+         ('Include a "View document source" link.',
+          ['--source-link', '-s'], {'action': 'store_true',
+                                    'validator': validate_boolean}),
+         ('Use <URL> for a source link; implies --source-link.',
+          ['--source-url'], {'metavar': '<URL>'}),
+         ('Do not include a "View document source" link.',
+          ['--no-source-link'],
+          {'action': 'callback', 'callback': store_multiple,
+           'callback_args': ('source_link', 'source_url')}),
+         ('Link from section headers to TOC entries.  (default)',
+          ['--toc-entry-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
+           'default': 'entry'}),
+         ('Link from section headers to the top of the TOC.',
+          ['--toc-top-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
+         ('Disable backlinks to the table of contents.',
+          ['--no-toc-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_false'}),
+         ('Link from footnotes/citations to references. (default)',
+          ['--footnote-backlinks'],
+          {'action': 'store_true', 'default': 1,
+           'validator': validate_boolean}),
+         ('Disable backlinks from footnotes and citations.',
+          ['--no-footnote-backlinks'],
+          {'dest': 'footnote_backlinks', 'action': 'store_false'}),
+         ('Enable section numbering.  (default)',
+          ['--section-numbering'],
+          {'action': 'store_true', 'dest': 'sectnum_xform',
+           'default': 1, 'validator': validate_boolean}),
+         ('Disable section numbering.',
+          ['--no-section-numbering'],
+          {'action': 'store_false', 'dest': 'sectnum_xform'}),
+         ('Remove comment elements from the document tree.',
+          ['--strip-comments'],
+          {'action': 'store_true', 'validator': validate_boolean}),
+         ('Leave comment elements in the document tree. (default)',
+          ['--leave-comments'],
+          {'action': 'store_false', 'dest': 'strip_comments'}),
+         ('Remove all elements with classes="<class>" from the document tree. '
+          '(Multiple-use option.)',
+          ['--strip-elements-with-class'],
+          {'action': 'append', 'dest': 'strip_elements_with_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Remove all classes="<class>" attributes from elements in the '
+          'document tree. (Multiple-use option.)',
+          ['--strip-class'],
+          {'action': 'append', 'dest': 'strip_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Report system messages at or higher than <level>: "info" or "1", '
+          '"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
+          ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
+                               'dest': 'report_level', 'metavar': '<level>',
+                               'validator': validate_threshold}),
+         ('Report all system messages.  (Same as "--report=1".)',
+          ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
+                                'dest': 'report_level'}),
+         ('Report no system messages.  (Same as "--report=5".)',
+          ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
+                              'dest': 'report_level'}),
+         ('Halt execution at system messages at or above <level>.  '
+          'Levels as in --report.  Default: 4 (severe).',
+          ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
+                       'default': 4, 'metavar': '<level>',
+                       'validator': validate_threshold}),
+         ('Halt at the slightest problem.  Same as "--halt=info".',
+          ['--strict'], {'action': 'store_const', 'const': 'info',
+                         'dest': 'halt_level'}),
+         ('Enable a non-zero exit status for non-halting system messages at '
+          'or above <level>.  Default: 5 (disabled).',
+          ['--exit-status'], {'choices': threshold_choices,
+                              'dest': 'exit_status_level',
+                              'default': 5, 'metavar': '<level>',
+                              'validator': validate_threshold}),
+         ('Enable debug-level system messages and diagnostics.',
+          ['--debug'], {'action': 'store_true', 'validator': validate_boolean}),
+         ('Disable debug output.  (default)',
+          ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
+         ('Send the output of system messages to <file>.',
+          ['--warnings'], {'dest': 'warning_stream', 'metavar': '<file>'}),
+         ('Enable Python tracebacks when Docutils is halted.',
+          ['--traceback'], {'action': 'store_true', 'default': None,
+                            'validator': validate_boolean}),
+         ('Disable Python tracebacks.  (default)',
+          ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
+         ('Specify the encoding and optionally the '
+          'error handler of input text.  Default: <locale-dependent>:strict.',
+          ['--input-encoding', '-i'],
+          {'metavar': '<name[:handler]>',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for undecodable characters.  '
+          'Choices: "strict" (default), "ignore", and "replace".',
+          ['--input-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify the text encoding and optionally the error handler for '
+          'output.  Default: UTF-8:strict.',
+          ['--output-encoding', '-o'],
+          {'metavar': '<name[:handler]>', 'default': 'utf-8',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify error handler for unencodable output characters; '
+          '"strict" (default), "ignore", "replace", '
+          '"xmlcharrefreplace", "backslashreplace" (Python 2.3+).',
+          ['--output-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify text encoding and error handler for error output.  '
+          'Default: ASCII:%s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding', '-e'],
+          {'metavar': '<name[:handler]>', 'default': 'ascii',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for unencodable characters in '
+          'error output.  Default: %s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding-error-handler'],
+          {'default': default_error_encoding_error_handler,
+           'validator': validate_encoding_error_handler}),
+         ('Specify the language (as 2-letter code).  Default: en.',
+          ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
+                                 'metavar': '<name>'}),
+         ('Write output file dependencies to <file>.',
+          ['--record-dependencies'],
+          {'metavar': '<file>', 'validator': validate_dependency_file,
+           'default': None}),           # default set in Values class
+         ('Read configuration settings from <file>, if it exists.',
+          ['--config'], {'metavar': '<file>', 'type': 'string',
+                         'action': 'callback', 'callback': read_config_file}),
+         ("Show this program's version number and exit.",
+          ['--version', '-V'], {'action': 'version'}),
+         ('Show this help message and exit.',
+          ['--help', '-h'], {'action': 'help'}),
+         # Typically not useful for non-programmatical use:
+         (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
+         (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': 'id'}),
+         # Hidden options, for development use only:
+         (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--expose-internal-attribute'],
+          {'action': 'append', 'dest': 'expose_internals',
+           'validator': validate_colon_separated_string_list}),
+         (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
+         ))
+    """Runtime settings and command-line options common to all Docutils front
+    ends.  Setting specs specific to individual Docutils components are also
+    used (see `populate_from_components()`)."""
+
+    settings_defaults = {'_disable_config': None,
+                         '_source': None,
+                         '_destination': None,
+                         '_config_files': None}
+    """Defaults for settings that don't have command-line option equivalents."""
+
+    relative_path_settings = ('warning_stream',)
+
+    config_section = 'general'
+
+    version_template = ('%%prog (Docutils %s [%s])'
+                        % (docutils.__version__, docutils.__version_details__))
+    """Default version message."""
+
+    def __init__(self, components=(), defaults=None, read_config_files=None,
+                 *args, **kwargs):
+        """
+        `components` is a list of Docutils components each containing a
+        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
+        default overrides.
+        """
+
+        self.lists = {}
+        """Set of list-type settings."""
+
+        self.config_files = []
+        """List of paths of applied configuration files."""
+
+        optparse.OptionParser.__init__(
+            self, option_class=Option, add_help_option=None,
+            formatter=optparse.TitledHelpFormatter(width=78),
+            *args, **kwargs)
+        if not self.version:
+            self.version = self.version_template
+        # Make an instance copy (it will be modified):
+        self.relative_path_settings = list(self.relative_path_settings)
+        self.components = (self,) + tuple(components)
+        self.populate_from_components(self.components)
+        self.set_defaults_from_dict(defaults or {})
+        if read_config_files and not self.defaults['_disable_config']:
+            try:
+                config_settings = self.get_standard_config_settings()
+            except ValueError, error:
+                self.error(error)
+            self.set_defaults_from_dict(config_settings.__dict__)
+
+    def populate_from_components(self, components):
+        """
+        For each component, first populate from the `SettingsSpec.settings_spec`
+        structure, then from the `SettingsSpec.settings_defaults` dictionary.
+        After all components have been processed, check for and populate from
+        each component's `SettingsSpec.settings_default_overrides` dictionary.
+        """
+        for component in components:
+            if component is None:
+                continue
+            settings_spec = component.settings_spec
+            self.relative_path_settings.extend(
+                component.relative_path_settings)
+            for i in range(0, len(settings_spec), 3):
+                title, description, option_spec = settings_spec[i:i+3]
+                if title:
+                    group = optparse.OptionGroup(self, title, description)
+                    self.add_option_group(group)
+                else:
+                    group = self        # single options
+                for (help_text, option_strings, kwargs) in option_spec:
+                    option = group.add_option(help=help_text, *option_strings,
+                                              **kwargs)
+                    if kwargs.get('action') == 'append':
+                        self.lists[option.dest] = 1
+                if component.settings_defaults:
+                    self.defaults.update(component.settings_defaults)
+        for component in components:
+            if component and component.settings_default_overrides:
+                self.defaults.update(component.settings_default_overrides)
+
+    def get_standard_config_files(self):
+        """Return list of config files, from environment or standard."""
+        try:
+            config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
+        except KeyError:
+            config_files = self.standard_config_files
+
+        # If 'HOME' is not set, expandvars() requires the 'pwd' module which is
+        # not available under certain environments, for example, within
+        # mod_python.  The publisher ends up in here, and we need to publish
+        # from within mod_python.  Therefore we need to avoid expanding when we
+        # are in those environments.
+        expand = os.path.expanduser
+        if 'HOME' not in os.environ:
+            try:
+                import pwd
+            except ImportError:
+                expand = lambda x: x
+        return [expand(f) for f in config_files if f.strip()]
+
+    def get_standard_config_settings(self):
+        settings = Values()
+        for filename in self.get_standard_config_files():
+            settings.update(self.get_config_file_settings(filename), self)
+        return settings
+
+    def get_config_file_settings(self, config_file):
+        """Returns a dictionary containing appropriate config file settings."""
+        parser = ConfigParser()
+        parser.read(config_file, self)
+        self.config_files.extend(parser._files)
+        base_path = os.path.dirname(config_file)
+        applied = {}
+        settings = Values()
+        for component in self.components:
+            if not component:
+                continue
+            for section in (tuple(component.config_section_dependencies or ())
+                            + (component.config_section,)):
+                if applied.has_key(section):
+                    continue
+                applied[section] = 1
+                settings.update(parser.get_section(section), self)
+        make_paths_absolute(
+            settings.__dict__, self.relative_path_settings, base_path)
+        return settings.__dict__
+
+    def check_values(self, values, args):
+        """Store positional arguments as runtime settings."""
+        values._source, values._destination = self.check_args(args)
+        make_paths_absolute(values.__dict__, self.relative_path_settings,
+                            os.getcwd())
+        values._config_files = self.config_files
+        return values
+
+    def check_args(self, args):
+        source = destination = None
+        if args:
+            source = args.pop(0)
+            if source == '-':           # means stdin
+                source = None
+        if args:
+            destination = args.pop(0)
+            if destination == '-':      # means stdout
+                destination = None
+        if args:
+            self.error('Maximum 2 arguments allowed.')
+        if source and source == destination:
+            self.error('Do not specify the same file for both source and '
+                       'destination.  It will clobber the source file.')
+        return source, destination
+
+    def set_defaults_from_dict(self, defaults):
+        self.defaults.update(defaults)
+
+    def get_default_values(self):
+        """Needed to get custom `Values` instances."""
+        defaults = Values(self.defaults)
+        defaults._config_files = self.config_files
+        return defaults
+
+    def get_option_by_dest(self, dest):
+        """
+        Get an option by its dest.
+
+        If you're supplying a dest which is shared by several options,
+        it is undefined which option of those is returned.
+
+        A KeyError is raised if there is no option with the supplied
+        dest.
+        """
+        for group in self.option_groups + [self]:
+            for option in group.option_list:
+                if option.dest == dest:
+                    return option
+        raise KeyError('No option with dest == %r.' % dest)
+
+
+class ConfigParser(CP.ConfigParser):
+
+    old_settings = {
+        'pep_stylesheet': ('pep_html writer', 'stylesheet'),
+        'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
+        'pep_template': ('pep_html writer', 'template')}
+    """{old setting: (new section, new setting)} mapping, used by
+    `handle_old_config`, to convert settings from the old [options] section."""
+
+    old_warning = """
+The "[option]" section is deprecated.  Support for old-format configuration
+files may be removed in a future Docutils release.  Please revise your
+configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
+section "Old-Format Configuration Files".
+"""
+
+    not_utf8_error = """\
+Unable to read configuration file "%s": content not encoded as UTF-8.
+Skipping "%s" configuration file.
+"""
+
+    def __init__(self, *args, **kwargs):
+        CP.ConfigParser.__init__(self, *args, **kwargs)
+
+        self._files = []
+        """List of paths of configuration files read."""
+
+    def read(self, filenames, option_parser):
+        if type(filenames) in (types.StringType, types.UnicodeType):
+            filenames = [filenames]
+        for filename in filenames:
+            try:
+                # Config files must be UTF-8-encoded:
+                fp = codecs.open(filename, 'r', 'utf-8')
+            except IOError:
+                continue
+            try:
+                CP.ConfigParser.readfp(self, fp, filename)
+            except UnicodeDecodeError:
+                sys.stderr.write(self.not_utf8_error % (filename, filename))
+                fp.close()
+                continue
+            fp.close()
+            self._files.append(filename)
+            if self.has_section('options'):
+                self.handle_old_config(filename)
+            self.validate_settings(filename, option_parser)
+
+    def handle_old_config(self, filename):
+        warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
+                               filename, 0)
+        options = self.get_section('options')
+        if not self.has_section('general'):
+            self.add_section('general')
+        for key, value in options.items():
+            if self.old_settings.has_key(key):
+                section, setting = self.old_settings[key]
+                if not self.has_section(section):
+                    self.add_section(section)
+            else:
+                section = 'general'
+                setting = key
+            if not self.has_option(section, setting):
+                self.set(section, setting, value)
+        self.remove_section('options')
+
+    def validate_settings(self, filename, option_parser):
+        """
+        Call the validator function and implement overrides on all applicable
+        settings.
+        """
+        for section in self.sections():
+            for setting in self.options(section):
+                try:
+                    option = option_parser.get_option_by_dest(setting)
+                except KeyError:
+                    continue
+                if option.validator:
+                    value = self.get(section, setting, raw=1)
+                    try:
+                        new_value = option.validator(
+                            setting, value, option_parser,
+                            config_parser=self, config_section=section)
+                    except Exception, error:
+                        raise (ValueError(
+                            'Error in config file "%s", section "[%s]":\n'
+                            '    %s: %s\n        %s = %s'
+                            % (filename, section, error.__class__.__name__,
+                               error, setting, value)), None, sys.exc_info()[2])
+                    self.set(section, setting, new_value)
+                if option.overrides:
+                    self.set(section, option.overrides, None)
+
+    def optionxform(self, optionstr):
+        """
+        Transform '-' to '_' so the cmdline form of option names can be used.
+        """
+        return optionstr.lower().replace('-', '_')
+
+    def get_section(self, section):
+        """
+        Return a given section as a dictionary (empty if the section
+        doesn't exist).
+        """
+        section_dict = {}
+        if self.has_section(section):
+            for option in self.options(section):
+                section_dict[option] = self.get(section, option, raw=1)
+        return section_dict
+
+
+class ConfigDeprecationWarning(DeprecationWarning):
+    """Warning for deprecated configuration file features."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/io.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,412 @@
+# $Id: io.py 4750 2006-09-16 21:32:29Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+I/O classes provide a uniform API for low-level input and output.  Subclasses
+will exist for a variety of input/output mechanisms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+try:
+    import locale
+except:
+    pass
+import re
+from types import UnicodeType
+from docutils import TransformSpec
+
+
+class Input(TransformSpec):
+
+    """
+    Abstract base class for input wrappers.
+    """
+
+    component_type = 'input'
+
+    default_source_path = None
+
+    def __init__(self, source=None, source_path=None, encoding=None,
+                 error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the input source."""
+
+        self.error_handler = error_handler
+        """Text decoding error handler."""
+
+        self.source = source
+        """The source of input data."""
+
+        self.source_path = source_path
+        """A text reference to the source."""
+
+        if not source_path:
+            self.source_path = self.default_source_path
+
+        self.successful_encoding = None
+        """The encoding that successfully decoded the source data."""
+
+    def __repr__(self):
+        return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
+                                                  self.source_path)
+
+    def read(self):
+        raise NotImplementedError
+
+    def decode(self, data):
+        """
+        Decode a string, `data`, heuristically.
+        Raise UnicodeError if unsuccessful.
+
+        The client application should call ``locale.setlocale`` at the
+        beginning of processing::
+
+            locale.setlocale(locale.LC_ALL, '')
+        """
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'input encoding is "unicode" '
+                'but input is not a unicode object')
+        if isinstance(data, UnicodeType):
+            # Accept unicode even if self.encoding != 'unicode'.
+            return data
+        if self.encoding:
+            # We believe the user/application when the encoding is
+            # explicitly given.
+            encodings = [self.encoding]
+        else:
+            data_encoding = self.determine_encoding_from_data(data)
+            if data_encoding:
+                # If the data declares its encoding (explicitly or via a BOM),
+                # we believe it.
+                encodings = [data_encoding]
+            else:
+                # Apply heuristics only if no encoding is explicitly given and
+                # no BOM found.  Start with UTF-8, because that only matches
+                # data that *IS* UTF-8:
+                encodings = ['utf-8']
+                try:
+                    # for Python 2.2 compatibility
+                    encodings.append(locale.nl_langinfo(locale.CODESET))
+                except:
+                    pass
+                try:
+                    encodings.append(locale.getlocale()[1])
+                except:
+                    pass
+                try:
+                    encodings.append(locale.getdefaultlocale()[1])
+                except:
+                    pass
+                # fallback encoding:
+                encodings.append('latin-1')
+        error = None
+        error_details = ''
+        for enc in encodings:
+            if not enc:
+                continue
+            try:
+                decoded = unicode(data, enc, self.error_handler)
+                self.successful_encoding = enc
+                # Return decoded, removing BOMs.
+                return decoded.replace(u'\ufeff', u'')
+            except (UnicodeError, LookupError), error:
+                pass
+        if error is not None:
+            error_details = '\n(%s: %s)' % (error.__class__.__name__, error)
+        raise UnicodeError(
+            'Unable to decode input data.  Tried the following encodings: '
+            '%s.%s'
+            % (', '.join([repr(enc) for enc in encodings if enc]),
+               error_details))
+
+    coding_slug = re.compile("coding[:=]\s*([-\w.]+)")
+    """Encoding declaration pattern."""
+
+    byte_order_marks = (('\xef\xbb\xbf', 'utf-8'),
+                        ('\xfe\xff', 'utf-16-be'),
+                        ('\xff\xfe', 'utf-16-le'),)
+    """Sequence of (start_bytes, encoding) tuples to for encoding detection.
+    The first bytes of input data are checked against the start_bytes strings.
+    A match indicates the given encoding."""
+
+    def determine_encoding_from_data(self, data):
+        """
+        Try to determine the encoding of `data` by looking *in* `data`.
+        Check for a byte order mark (BOM) or an encoding declaration.
+        """
+        # check for a byte order mark:
+        for start_bytes, encoding in self.byte_order_marks:
+            if data.startswith(start_bytes):
+                return encoding
+        # check for an encoding declaration pattern in first 2 lines of file:
+        for line in data.splitlines()[:2]:
+            match = self.coding_slug.search(line)
+            if match:
+                return match.group(1)
+        return None
+
+
+class Output(TransformSpec):
+
+    """
+    Abstract base class for output wrappers.
+    """
+
+    component_type = 'output'
+
+    default_destination_path = None
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the output destination."""
+
+        self.error_handler = error_handler or 'strict'
+        """Text encoding error handler."""
+
+        self.destination = destination
+        """The destination for output data."""
+
+        self.destination_path = destination_path
+        """A text reference to the destination."""
+
+        if not destination_path:
+            self.destination_path = self.default_destination_path
+
+    def __repr__(self):
+        return ('%s: destination=%r, destination_path=%r'
+                % (self.__class__, self.destination, self.destination_path))
+
+    def write(self, data):
+        """`data` is a Unicode string, to be encoded by `self.encode`."""
+        raise NotImplementedError
+
+    def encode(self, data):
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'the encoding given is "unicode" but the output is not '
+                'a Unicode string')
+            return data
+        if not isinstance(data, UnicodeType):
+            # Non-unicode (e.g. binary) output.
+            return data
+        else:
+            try:
+                return data.encode(self.encoding, self.error_handler)
+            except (LookupError, ValueError):
+                # LookupError is raised if there are unencodable chars
+                # in data and the error_handler isn't found. In old
+                # Python versions, ValueError is raised.
+                if self.error_handler == 'xmlcharrefreplace':
+                    # We are using xmlcharrefreplace with a Python
+                    # version that doesn't support it (2.1, 2.2, or
+                    # IronPython 1.0) so we emulate its behavior.
+                    return ''.join([self.xmlcharref_encode(char)
+                                    for char in data])
+                else:
+                    raise
+
+    def xmlcharref_encode(self, char):
+        """Emulate Python 2.3's 'xmlcharrefreplace' encoding error handler."""
+        try:
+            return char.encode(self.encoding, 'strict')
+        except UnicodeError:
+            return '&#%i;' % ord(char)
+
+
+class FileInput(Input):
+
+    """
+    Input for single, simple file-like objects.
+    """
+
+    def __init__(self, source=None, source_path=None,
+                 encoding=None, error_handler='strict',
+                 autoclose=1, handle_io_errors=1):
+        """
+        :Parameters:
+            - `source`: either a file-like object (which is read directly), or
+              `None` (which implies `sys.stdin` if no `source_path` given).
+            - `source_path`: a path to a file, which is opened and then read.
+            - `encoding`: the expected text encoding of the input file.
+            - `error_handler`: the encoding error handler to use.
+            - `autoclose`: close automatically after read (boolean); always
+              false if `sys.stdin` is the source.
+            - `handle_io_errors`: summarize I/O errors here, and exit?
+        """
+        Input.__init__(self, source, source_path, encoding, error_handler)
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if source is None:
+            if source_path:
+                try:
+                    self.source = open(source_path)
+                except IOError, error:
+                    if not handle_io_errors:
+                        raise
+                    print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                                    error)
+                    print >>sys.stderr, (
+                        'Unable to open source file for reading (%r).  Exiting.'
+                        % source_path)
+                    sys.exit(1)
+            else:
+                self.source = sys.stdin
+                self.autoclose = None
+        if not source_path:
+            try:
+                self.source_path = self.source.name
+            except AttributeError:
+                pass
+
+    def read(self):
+        """
+        Read and decode a single file and return the data (Unicode string).
+        """
+        try:
+            data = self.source.read()
+        finally:
+            if self.autoclose:
+                self.close()
+        return self.decode(data)
+
+    def close(self):
+        self.source.close()
+
+
+class FileOutput(Output):
+
+    """
+    Output for single, simple file-like objects.
+    """
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict', autoclose=1,
+                 handle_io_errors=1):
+        """
+        :Parameters:
+            - `destination`: either a file-like object (which is written
+              directly) or `None` (which implies `sys.stdout` if no
+              `destination_path` given).
+            - `destination_path`: a path to a file, which is opened and then
+              written.
+            - `autoclose`: close automatically after write (boolean); always
+              false if `sys.stdout` is the destination.
+        """
+        Output.__init__(self, destination, destination_path,
+                        encoding, error_handler)
+        self.opened = 1
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if destination is None:
+            if destination_path:
+                self.opened = None
+            else:
+                self.destination = sys.stdout
+                self.autoclose = None
+        if not destination_path:
+            try:
+                self.destination_path = self.destination.name
+            except AttributeError:
+                pass
+
+    def open(self):
+        try:
+            self.destination = open(self.destination_path, 'w')
+        except IOError, error:
+            if not self.handle_io_errors:
+                raise
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                            error)
+            print >>sys.stderr, ('Unable to open destination file for writing '
+                                 '(%r).  Exiting.' % self.destination_path)
+            sys.exit(1)
+        self.opened = 1
+
+    def write(self, data):
+        """Encode `data`, write it to a single file, and return it."""
+        output = self.encode(data)
+        if not self.opened:
+            self.open()
+        try:
+            self.destination.write(output)
+        finally:
+            if self.autoclose:
+                self.close()
+        return output
+
+    def close(self):
+        self.destination.close()
+        self.opened = None
+
+
+class StringInput(Input):
+
+    """
+    Direct string input.
+    """
+
+    default_source_path = '<string>'
+
+    def read(self):
+        """Decode and return the source string."""
+        return self.decode(self.source)
+
+
+class StringOutput(Output):
+
+    """
+    Direct string output.
+    """
+
+    default_destination_path = '<string>'
+
+    def write(self, data):
+        """Encode `data`, store it in `self.destination`, and return it."""
+        self.destination = self.encode(data)
+        return self.destination
+
+
+class NullInput(Input):
+
+    """
+    Degenerate input: read nothing.
+    """
+
+    default_source_path = 'null input'
+
+    def read(self):
+        """Return a null string."""
+        return u''
+
+
+class NullOutput(Output):
+
+    """
+    Degenerate output: write nothing.
+    """
+
+    default_destination_path = 'null output'
+
+    def write(self, data):
+        """Do nothing ([don't even] send data to the bit bucket)."""
+        pass
+
+
+class DocTreeInput(Input):
+
+    """
+    Adapter for document tree input.
+
+    The document tree must be passed in the ``source`` parameter.
+    """
+
+    default_source_path = 'doctree input'
+
+    def read(self):
+        """Return the document tree."""
+        return self.source
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    module = __import__(language_code, globals(), locals())
+    _languages[language_code] = module
+    return module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/af.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisasie',
+      'address': 'Adres',
+      'contact': 'Kontak',
+      'version': 'Weergawe',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Kopiereg',
+      'dedication': 'Opdrag',
+      'abstract': 'Opsomming',
+      'attention': 'Aandag!',
+      'caution': 'Wees versigtig!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Wenk',
+      'important': 'Belangrik',
+      'note': 'Nota',
+      'tip': 'Tip', # hint and tip both have the same translation: wenk
+      'warning': 'Waarskuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisasie': 'organization',
+      'adres': 'address',
+      'kontak': 'contact',
+      'weergawe': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'kopiereg': 'copyright',
+      'opdrag': 'dedication',
+      'opsomming': 'abstract'}
+"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/ca.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autors',
+      'organization': u'Organitzaci\u00F3',
+      'address': u'Adre\u00E7a',
+      'contact': u'Contacte',
+      'version': u'Versi\u00F3',
+      'revision': u'Revisi\u00F3',
+      'status': u'Estat',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F2ria',
+      'abstract': u'Resum',
+      'attention': u'Atenci\u00F3!',
+      'caution': u'Compte!',
+      'danger': u'PERILL!',
+      'error': u'Error',
+      'hint': u'Suggeriment',
+      'important': u'Important',
+      'note': u'Nota',
+      'tip': u'Consell',
+      'warning': u'Av\u00EDs',
+      'contents': u'Contingut'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autors': 'authors',
+      u'organitzaci\u00F3': 'organization',
+      u'adre\u00E7a': 'address',
+      u'contacte': 'contact',
+      u'versi\u00F3': 'version',
+      u'revisi\u00F3': 'revision',
+      u'estat': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F2ria': 'dedication',
+      u'resum': 'abstract'}
+"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/cs.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Auto\u0159i',
+      'organization': u'Organizace',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verze',
+      'revision': u'Revize',
+      'status': u'Stav',
+      'date': u'Datum',
+      'copyright': u'Copyright',
+      'dedication': u'V\u011Bnov\u00E1n\u00ED',
+      'abstract': u'Abstrakt',
+      'attention': u'Pozor!',
+      'caution': u'Opatrn\u011B!',
+      'danger': u'!NEBEZPE\u010C\u00CD!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u016Fle\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varov\u00E1n\u00ED',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'auto\u0159i': 'authors',
+      u'organizace': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verze': 'version',
+      u'revize': 'revision',
+      u'stav': 'status',
+      u'datum': 'date',
+      u'copyright': 'copyright',
+      u'v\u011Bnov\u00E1n\u00ED': 'dedication',
+      u'abstrakt': 'abstract'}
+"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/de.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: de.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Gunnar Schwant <g.schwant@gmx.de>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author': 'Autor',
+    'authors': 'Autoren',
+    'organization': 'Organisation',
+    'address': 'Adresse',
+    'contact': 'Kontakt',
+    'version': 'Version',
+    'revision': 'Revision',
+    'status': 'Status',
+    'date': 'Datum',
+    'dedication': 'Widmung',
+    'copyright': 'Copyright',
+    'abstract': 'Zusammenfassung',
+    'attention': 'Achtung!',
+    'caution': 'Vorsicht!',
+    'danger': '!GEFAHR!',
+    'error': 'Fehler',
+    'hint': 'Hinweis',
+    'important': 'Wichtig',
+    'note': 'Bemerkung',
+    'tip': 'Tipp',
+    'warning': 'Warnung',
+    'contents': 'Inhalt'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    'autor': 'author',
+    'autoren': 'authors',
+    'organisation': 'organization',
+    'adresse': 'address',
+    'kontakt': 'contact',
+    'version': 'version',
+    'revision': 'revision',
+    'status': 'status',
+    'datum': 'date',
+    'copyright': 'copyright',
+    'widmung': 'dedication',
+    'zusammenfassung': 'abstract'}
+"""German (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/en.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Author',
+      'authors': 'Authors',
+      'organization': 'Organization',
+      'address': 'Address',
+      'contact': 'Contact',
+      'version': 'Version',
+      'revision': 'Revision',
+      'status': 'Status',
+      'date': 'Date',
+      'copyright': 'Copyright',
+      'dedication': 'Dedication',
+      'abstract': 'Abstract',
+      'attention': 'Attention!',
+      'caution': 'Caution!',
+      'danger': '!DANGER!',
+      'error': 'Error',
+      'hint': 'Hint',
+      'important': 'Important',
+      'note': 'Note',
+      'tip': 'Tip',
+      'warning': 'Warning',
+      'contents': 'Contents'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author': 'author',
+      'authors': 'authors',
+      'organization': 'organization',
+      'address': 'address',
+      'contact': 'contact',
+      'version': 'version',
+      'revision': 'revision',
+      'status': 'status',
+      'date': 'date',
+      'copyright': 'copyright',
+      'dedication': 'dedication',
+      'abstract': 'abstract'}
+"""English (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/eo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'A\u016dtoro',
+      'authors': u'A\u016dtoroj',
+      'organization': u'Organizo',
+      'address': u'Adreso',
+      'contact': u'Kontakto',
+      'version': u'Versio',
+      'revision': u'Revido',
+      'status': u'Stato',
+      'date': u'Dato',
+      # 'copyright': u'Kopirajto',
+      'copyright': u'A\u016dtorrajto',
+      'dedication': u'Dedi\u0109o',
+      'abstract': u'Resumo',
+      'attention': u'Atentu!',
+      'caution': u'Zorgu!',
+      'danger': u'DAN\u011cERO!',
+      'error': u'Eraro',
+      'hint': u'Spuro',
+      'important': u'Grava',
+      'note': u'Noto',
+      'tip': u'Helpeto',
+      'warning': u'Averto',
+      'contents': u'Enhavo'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'a\u016dtoro': 'author',
+      'a\u016dtoroj': 'authors',
+      'organizo': 'organization',
+      'adreso': 'address',
+      'kontakto': 'contact',
+      'versio': 'version',
+      'revido': 'revision',
+      'stato': 'status',
+      'dato': 'date',
+      'a\u016dtorrajto': 'copyright',
+      'dedi\u0109o': 'dedication',
+      'resumo': 'abstract'}
+"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/es.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4572 2006-05-25 20:48:37Z richieadler $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organizaci\u00f3n',
+      'address': u'Direcci\u00f3n',
+      'contact': u'Contacto',
+      'version': u'Versi\u00f3n',
+      'revision': u'Revisi\u00f3n',
+      'status': u'Estado',
+      'date': u'Fecha',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicatoria',
+      'abstract': u'Resumen',
+      'attention': u'\u00a1Atenci\u00f3n!',
+      'caution': u'\u00a1Precauci\u00f3n!',
+      'danger': u'\u00a1PELIGRO!',
+      'error': u'Error',
+      'hint': u'Sugerencia',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Consejo',
+      'warning': u'Advertencia',
+      'contents': u'Contenido'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organizaci\u00f3n': 'organization',
+      u'direcci\u00f3n': 'address',
+      u'contacto': 'contact',
+      u'versi\u00f3n': 'version',
+      u'revisi\u00f3n': 'revision',
+      u'estado': 'status',
+      u'fecha': 'date',
+      u'copyright': 'copyright',
+      u'dedicatoria': 'dedication',
+      u'resumen': 'abstract'}
+"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/fi.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      u'author': u'Tekij\u00e4',
+      u'authors': u'Tekij\u00e4t',
+      u'organization': u'Yhteis\u00f6',
+      u'address': u'Osoite',
+      u'contact': u'Yhteystiedot',
+      u'version': u'Versio',
+      u'revision': u'Vedos',
+      u'status': u'Tila',
+      u'date': u'P\u00e4iv\u00e4ys',
+      u'copyright': u'Tekij\u00e4noikeudet',
+      u'dedication': u'Omistuskirjoitus',
+      u'abstract': u'Tiivistelm\u00e4',
+      u'attention': u'Huomio!',
+      u'caution': u'Varo!',
+      u'danger': u'!VAARA!',
+      u'error': u'Virhe',
+      u'hint': u'Vihje',
+      u'important': u'T\u00e4rke\u00e4\u00e4',
+      u'note': u'Huomautus',
+      u'tip': u'Neuvo',
+      u'warning': u'Varoitus',
+      u'contents': u'Sis\u00e4llys'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'tekij\u00e4': u'author',
+      u'tekij\u00e4t': u'authors',
+      u'yhteis\u00f6': u'organization',
+      u'osoite': u'address',
+      u'yhteystiedot': u'contact',
+      u'versio': u'version',
+      u'vedos': u'revision',
+      u'tila': u'status',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'tekij\u00e4noikeudet': u'copyright',
+      u'omistuskirjoitus': u'dedication',
+      u'tiivistelm\u00e4': u'abstract'}
+"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/fr.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Stefane Fermigier <sf@fermigier.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'author': u'Auteur',
+      u'authors': u'Auteurs',
+      u'organization': u'Organisation',
+      u'address': u'Adresse',
+      u'contact': u'Contact',
+      u'version': u'Version',
+      u'revision': u'R\u00e9vision',
+      u'status': u'Statut',
+      u'date': u'Date',
+      u'copyright': u'Copyright',
+      u'dedication': u'D\u00e9dicace',
+      u'abstract': u'R\u00e9sum\u00e9',
+      u'attention': u'Attention!',
+      u'caution': u'Avertissement!',
+      u'danger': u'!DANGER!',
+      u'error': u'Erreur',
+      u'hint': u'Indication',
+      u'important': u'Important',
+      u'note': u'Note',
+      u'tip': u'Astuce',
+      u'warning': u'Avis',
+      u'contents': u'Sommaire'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'auteur': u'author',
+      u'auteurs': u'authors',
+      u'organisation': u'organization',
+      u'adresse': u'address',
+      u'contact': u'contact',
+      u'version': u'version',
+      u'r\u00e9vision': u'revision',
+      u'statut': u'status',
+      u'date': u'date',
+      u'copyright': u'copyright',
+      u'd\u00e9dicace': u'dedication',
+      u'r\u00e9sum\u00e9': u'abstract'}
+"""French (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/he.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Hebrew-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u05de\u05d7\u05d1\u05e8',
+      'authors': u'\u05de\u05d7\u05d1\u05e8\u05d9',
+      'organization': u'\u05d0\u05e8\u05d2\u05d5\u05df',
+      'address': u'\u05db\u05ea\u05d5\u05d1\u05ea',
+      'contact':  u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8',
+      'version': u'\u05d2\u05e8\u05e1\u05d4',
+      'revision': u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4',
+      'status': u'\u05e1\u05d8\u05d8\u05d5\u05e1',
+      'date': u'\u05ea\u05d0\u05e8\u05d9\u05da',
+      'copyright': u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea',
+      'dedication': u'\u05d4\u05e7\u05d3\u05e9\u05d4',
+      'abstract': u'\u05ea\u05e7\u05e6\u05d9\u05e8',
+      'attention': u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1',
+      'caution': u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea',
+      'danger': u'\u05e1\u05db\u05e0\u05d4',
+      'error': u'\u05e9\u05d2\u05d9\u05d0\u05d4' ,
+      'hint': u'\u05e8\u05de\u05d6',
+      'important': u'\u05d7\u05e9\u05d5\u05d1',
+      'note': u'\u05d4\u05e2\u05e8\u05d4',
+      'tip': u'\u05d8\u05d9\u05e4',
+      'warning': u'\u05d0\u05d6\u05d4\u05e8\u05d4',
+      'contents': u'\u05ea\u05d5\u05db\u05df'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'\u05de\u05d7\u05d1\u05e8': 'author',
+      u'\u05de\u05d7\u05d1\u05e8\u05d9': 'authors',
+      u'\u05d0\u05e8\u05d2\u05d5\u05df': 'organization',
+      u'\u05db\u05ea\u05d5\u05d1\u05ea': 'address',
+      u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8': 'contact',
+      u'\u05d2\u05e8\u05e1\u05d4': 'version',
+      u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4': 'revision',
+      u'\u05e1\u05d8\u05d8\u05d5\u05e1': 'status',
+      u'\u05ea\u05d0\u05e8\u05d9\u05da': 'date',
+      u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea': 'copyright',
+      u'\u05d4\u05e7\u05d3\u05e9\u05d4': 'dedication',
+      u'\u05ea\u05e7\u05e6\u05d9\u05e8': 'abstract'}
+"""Hebrew to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/it.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Nicola Larosa <docutils@tekNico.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Italian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Autore',
+      'authors': 'Autori',
+      'organization': 'Organizzazione',
+      'address': 'Indirizzo',
+      'contact': 'Contatti',
+      'version': 'Versione',
+      'revision': 'Revisione',
+      'status': 'Status',
+      'date': 'Data',
+      'copyright': 'Copyright',
+      'dedication': 'Dedica',
+      'abstract': 'Riassunto',
+      'attention': 'Attenzione!',
+      'caution': 'Cautela!',
+      'danger': '!PERICOLO!',
+      'error': 'Errore',
+      'hint': 'Suggerimento',
+      'important': 'Importante',
+      'note': 'Nota',
+      'tip': 'Consiglio',
+      'warning': 'Avvertenza',
+      'contents': 'Indice'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'autore': 'author',
+      'autori': 'authors',
+      'organizzazione': 'organization',
+      'indirizzo': 'address',
+      'contatto': 'contact',
+      'versione': 'version',
+      'revisione': 'revision',
+      'status': 'status',
+      'data': 'date',
+      'copyright': 'copyright',
+      'dedica': 'dedication',
+      'riassunto': 'abstract'}
+"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/ja.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Hisashi Morita <hisashim@kt.rim.or.jp>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'著者',
+      'authors': u'著者',
+      'organization': u'組織',
+      'address': u'ä½æ‰€',
+      'contact': u'連絡先',
+      'version': u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
+      'revision': u'リビジョン',
+      'status': u'ステータス',
+      'date': u'日付',
+      'copyright': u'著作権',
+      'dedication': u'献辞',
+      'abstract': u'概è¦',
+      'attention': u'注目!',
+      'caution': u'注æ„!',
+      'danger': u'!å±é™º!',
+      'error': u'エラー',
+      'hint': u'ヒント',
+      'important': u'é‡è¦',
+      'note': u'備考',
+      'tip': u'通報',
+      'warning': u'警告',
+      'contents': u'目次'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'著者': 'author',
+      u' n/a': 'authors',
+      u'組織': 'organization',
+      u'ä½æ‰€': 'address',
+      u'連絡先': 'contact',
+      u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³': 'version',
+      u'リビジョン': 'revision',
+      u'ステータス': 'status',
+      u'日付': 'date',
+      u'著作権': 'copyright',
+      u'献辞': 'dedication',
+      u'概è¦': 'abstract'}
+"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/nl.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisatie',
+      'address': 'Adres',
+      'contact': 'Contact',
+      'version': 'Versie',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Copyright',
+      'dedication': 'Toewijding',
+      'abstract': 'Samenvatting',
+      'attention': 'Attentie!',
+      'caution': 'Let op!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Hint',
+      'important': 'Belangrijk',
+      'note': 'Opmerking',
+      'tip': 'Tip',
+      'warning': 'Waarschuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisatie': 'organization',
+      'adres': 'address',
+      'contact': 'contact',
+      'versie': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'copyright': 'copyright',
+      'toewijding': 'dedication',
+      'samenvatting': 'abstract'}
+"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organiza\u00E7\u00E3o',
+      'address': u'Endere\u00E7o',
+      'contact': u'Contato',
+      'version': u'Vers\u00E3o',
+      'revision': u'Revis\u00E3o',
+      'status': u'Estado',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F3ria',
+      'abstract': u'Resumo',
+      'attention': u'Atten\u00E7\u00E3o!',
+      'caution': u'Cuidado!',
+      'danger': u'PERIGO!',
+      'error': u'Erro',
+      'hint': u'Sugest\u00E3o',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Dica',
+      'warning': u'Aviso',
+      'contents': u'Sum\u00E1rio'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organiza\u00E7\u00E3o': 'organization',
+      u'endere\u00E7o': 'address',
+      u'contato': 'contact',
+      u'vers\u00E3o': 'version',
+      u'revis\u00E3o': 'revision',
+      u'estado': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F3ria': 'dedication',
+      u'resumo': 'abstract'}
+"""Brazilian Portuguese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/ru.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'abstract': u'\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f',
+      u'address': u'\u0410\u0434\u0440\u0435\u0441',
+      u'attention': u'\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!',
+      u'author': u'\u0410\u0432\u0442\u043e\u0440',
+      u'authors': u'\u0410\u0432\u0442\u043e\u0440\u044b',
+      u'caution': u'\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e!',
+      u'contact': u'\u041a\u043e\u043d\u0442\u0430\u043a\u0442',
+      u'contents':
+      u'\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435',
+      u'copyright': u'\u041f\u0440\u0430\u0432\u0430 '
+      u'\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f',
+      u'danger': u'\u041e\u041f\u0410\u0421\u041d\u041e!',
+      u'date': u'\u0414\u0430\u0442\u0430',
+      u'dedication':
+      u'\u041f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435',
+      u'error': u'\u041e\u0448\u0438\u0431\u043a\u0430',
+      u'hint': u'\u0421\u043e\u0432\u0435\u0442',
+      u'important': u'\u0412\u0430\u0436\u043d\u043e',
+      u'note': u'\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435',
+      u'organization':
+      u'\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f',
+      u'revision': u'\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f',
+      u'status': u'\u0421\u0442\u0430\u0442\u0443\u0441',
+      u'tip': u'\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430',
+      u'version': u'\u0412\u0435\u0440\u0441\u0438\u044f',
+      u'warning': u'\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436'
+      u'\u0434\u0435\u043d\u0438\u0435'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f': u'abstract',
+      u'\u0430\u0434\u0440\u0435\u0441': u'address',
+      u'\u0430\u0432\u0442\u043e\u0440': u'author',
+      u'\u0430\u0432\u0442\u043e\u0440\u044b': u'authors',
+      u'\u043a\u043e\u043d\u0442\u0430\u043a\u0442': u'contact',
+      u'\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u043f\u0438\u0440\u043e'
+      u'\u0432\u0430\u043d\u0438\u044f': u'copyright',
+      u'\u0434\u0430\u0442\u0430': u'date',
+      u'\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435':
+      u'dedication',
+      u'\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f':
+      u'organization',
+      u'\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f': u'revision',
+      u'\u0441\u0442\u0430\u0442\u0443\u0441': u'status',
+      u'\u0432\u0435\u0440\u0441\u0438\u044f': u'version'}
+"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators =  [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/sk.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autori',
+      'organization': u'Organiz\u00E1cia',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verzia',
+      'revision': u'Rev\u00EDzia',
+      'status': u'Stav',
+      'date': u'D\u00E1tum',
+      'copyright': u'Copyright',
+      'dedication': u'Venovanie',
+      'abstract': u'Abstraktne',
+      'attention': u'Pozor!',
+      'caution': u'Opatrne!',
+      'danger': u'!NEBEZPE\u010cENSTVO!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u00F4le\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varovanie',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autori': 'authors',
+      u'organiz\u00E1cia': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verzia': 'version',
+      u'rev\u00EDzia': 'revision',
+      u'stav': 'status',
+      u'd\u00E1tum': 'date',
+      u'copyright': 'copyright',
+      u'venovanie': 'dedication',
+      u'abstraktne': 'abstract'}
+"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/sv.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author':       u'F\u00f6rfattare',
+    'authors':      u'F\u00f6rfattare',
+    'organization': u'Organisation',
+    'address':      u'Adress',
+    'contact':      u'Kontakt',
+    'version':      u'Version',
+    'revision':     u'Revision',
+    'status':       u'Status',
+    'date':         u'Datum',
+    'copyright':    u'Copyright',
+    'dedication':   u'Dedikation',
+    'abstract':     u'Sammanfattning',
+    'attention':    u'Observera!',
+    'caution':      u'Varning!',
+    'danger':       u'FARA!',
+    'error':        u'Fel',
+    'hint':         u'V\u00e4gledning',
+    'important':    u'Viktigt',
+    'note':         u'Notera',
+    'tip':          u'Tips',
+    'warning':      u'Varning',
+    'contents':     u'Inneh\u00e5ll' }
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    # 'Author' and 'Authors' identical in Swedish; assume the plural:
+    u'f\u00f6rfattare': 'authors',
+    u' n/a':            'author',
+    u'organisation':    'organization',
+    u'adress':          'address',
+    u'kontakt':         'contact',
+    u'version':         'version',
+    u'revision':        'revision',
+    u'status':          'status',
+    u'datum':           'date',
+    u'copyright':       'copyright',
+    u'dedikation':      'dedication', 
+    u'sammanfattning':  'abstract' }
+"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Pan Junyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features
+of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'作者',
+      'authors': u'作者群',
+      'organization': u'组织',
+      'address': u'地å€',
+      'contact': u'è”ç³»',
+      'version': u'版本',
+      'revision': u'修订',
+      'status': u'状æ€',
+      'date': u'日期',
+      'copyright': u'版æƒ',
+      'dedication': u'献辞',
+      'abstract': u'摘è¦',
+      'attention': u'注æ„',
+      'caution': u'å°å¿ƒ',
+      'danger': u'å±é™©',
+      'error': u'错误',
+      'hint': u'æ示',
+      'important': u'é‡è¦',
+      'note': u'注解',
+      'tip': u'技巧',
+      'warning': u'警告',
+      'contents': u'目录',
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'作者': 'author',
+      u'作者群': 'authors',
+      u'组织': 'organization',
+      u'地å€': 'address',
+      u'è”ç³»': 'contact',
+      u'版本': 'version',
+      u'修订': 'revision',
+      u'状æ€': 'status',
+      u'时间': 'date',
+      u'版æƒ': 'copyright',
+      u'献辞': 'dedication',
+      u'摘è¦': 'abstract'}
+"""Simplified Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # 'ï¼›'
+                     u'\uff0c', # ','
+                     u'\u3001', # 'ã€'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Joe YS Jaw <joeysj@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u4f5c\u8005', # '作者' <-- Chinese word
+      'authors': u'\u4f5c\u8005\u7fa4', # '作者群',
+      'organization': u'\u7d44\u7e54', # '組織',
+      'address': u'\u5730\u5740', # '地å€',
+      'contact': u'\u9023\u7d61', # '連絡',
+      'version': u'\u7248\u672c', # '版本',
+      'revision': u'\u4fee\u8a02', # '修訂',
+      'status': u'\u72c0\u614b', # '狀態',
+      'date': u'\u65e5\u671f', # '日期',
+      'copyright': u'\u7248\u6b0a', # '版權',
+      'dedication': u'\u984c\u737b', # 'é¡Œç»',
+      'abstract': u'\u6458\u8981', # '摘è¦',
+      'attention': u'\u6ce8\u610f\uff01', # '注æ„ï¼',
+      'caution': u'\u5c0f\u5fc3\uff01', # 'å°å¿ƒï¼',
+      'danger': u'\uff01\u5371\u96aa\uff01', # 'ï¼å±éšªï¼',
+      'error': u'\u932f\u8aa4', # '錯誤',
+      'hint': u'\u63d0\u793a', # 'æ示',
+      'important': u'\u91cd\u8981', # '注æ„ï¼',
+      'note': u'\u8a3b\u91cb', # '註釋',
+      'tip': u'\u79d8\u8a23', # '秘訣',
+      'warning': u'\u8b66\u544a', # '警告',
+      'contents': u'\u76ee\u9304' # '目錄'
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author (translation required)': 'author',
+      'authors (translation required)': 'authors',
+      'organization (translation required)': 'organization',
+      'address (translation required)': 'address',
+      'contact (translation required)': 'contact',
+      'version (translation required)': 'version',
+      'revision (translation required)': 'revision',
+      'status (translation required)': 'status',
+      'date (translation required)': 'date',
+      'copyright (translation required)': 'copyright',
+      'dedication (translation required)': 'dedication',
+      'abstract (translation required)': 'abstract'}
+"""Traditional Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # 'ï¼›'
+                     u'\uff0c', # ','
+                     u'\u3001', # 'ã€'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/nodes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1801 @@
+# $Id: nodes.py 5033 2007-03-21 19:51:22Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils document tree element class library.
+
+Classes in CamelCase are abstract base classes or auxiliary classes. The one
+exception is `Text`, for a text (PCDATA) node; uppercase is used to
+differentiate from element classes.  Classes in lower_case_with_underscores
+are element classes, matching the XML element generic identifiers in the DTD_.
+
+The position of each node (the level at which it can occur) is significant and
+is represented by abstract base classes (`Root`, `Structural`, `Body`,
+`Inline`, etc.).  Certain transformations will be easier because we can use
+``isinstance(node, base_class)`` to determine the position of the node in the
+hierarchy.
+
+.. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import warnings
+from types import IntType, SliceType, StringType, UnicodeType, \
+     TupleType, ListType, ClassType, TypeType
+from UserString import UserString
+
+
+# ==============================
+#  Functional Node Base Classes
+# ==============================
+
+class Node:
+
+    """Abstract base class of nodes in a document tree."""
+
+    parent = None
+    """Back-reference to the Node immediately containing this Node."""
+
+    document = None
+    """The `document` node at the root of the tree containing this Node."""
+
+    source = None
+    """Path or description of the input source which generated this Node."""
+
+    line = None
+    """The line number (1-based) of the beginning of this Node in `source`."""
+
+    def __nonzero__(self):
+        """
+        Node instances are always true, even if they're empty.  A node is more
+        than a simple container.  Its boolean "truth" does not depend on
+        having one or more subnodes in the doctree.
+
+        Use `len()` to check node length.  Use `None` to represent a boolean
+        false value.
+        """
+        return 1
+
+    def __str__(self):
+        return self.__unicode__().encode('raw_unicode_escape')
+
+    def __unicode__(self):
+        # Override in subclass.
+        raise NotImplementedError
+
+    def asdom(self, dom=None):
+        """Return a DOM **fragment** representation of this Node."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        return self._dom_node(domroot)
+
+    def pformat(self, indent='    ', level=0):
+        """
+        Return an indented pseudo-XML representation, for test purposes.
+
+        Override in subclasses.
+        """
+        raise NotImplementedError
+
+    def copy(self):
+        """Return a copy of self."""
+        raise NotImplementedError
+
+    def deepcopy(self):
+        """Return a deep copy of self (also copying children)."""
+        raise NotImplementedError
+
+    def setup_child(self, child):
+        child.parent = self
+        if self.document:
+            child.document = self.document
+            if child.source is None:
+                child.source = self.document.current_source
+            if child.line is None:
+                child.line = self.document.current_line
+
+    def walk(self, visitor):
+        """
+        Traverse a tree of `Node` objects, calling the
+        `dispatch_visit()` method of `visitor` when entering each
+        node.  (The `walkabout()` method is similar, except it also
+        calls the `dispatch_departure()` method before exiting each
+        node.)
+
+        This tree traversal supports limited in-place tree
+        modifications.  Replacing one node with one or more nodes is
+        OK, as is removing an element.  However, if the node removed
+        or replaced occurs after the current node, the old node will
+        still be traversed, and any new nodes will not.
+
+        Within ``visit`` methods (and ``depart`` methods for
+        `walkabout()`), `TreePruningException` subclasses may be raised
+        (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` implementation for each `Node` subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        stop = 0
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walk calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except (SkipChildren, SkipNode):
+                return stop
+            except SkipDeparture:           # not applicable; ignore
+                pass
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walk(visitor):
+                        stop = 1
+                        break
+            except SkipSiblings:
+                pass
+        except StopTraversal:
+            stop = 1
+        return stop
+
+    def walkabout(self, visitor):
+        """
+        Perform a tree traversal similarly to `Node.walk()` (which
+        see), except also call the `dispatch_departure()` method
+        before exiting each node.
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` and ``depart`` implementation for each `Node`
+        subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        call_depart = 1
+        stop = 0
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except SkipNode:
+                return stop
+            except SkipDeparture:
+                call_depart = 0
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walkabout(visitor):
+                        stop = 1
+                        break
+            except SkipSiblings:
+                pass
+        except SkipChildren:
+            pass
+        except StopTraversal:
+            stop = 1
+        if call_depart:
+            visitor.document.reporter.debug(
+                'docutils.nodes.Node.walkabout calling dispatch_departure '
+                'for %s' % self.__class__.__name__)
+            visitor.dispatch_departure(self)
+        return stop
+
+    def traverse(self, condition=None,
+                 include_self=1, descend=1, siblings=0, ascend=0):
+        """
+        Return an iterable containing
+
+        * self (if include_self is true)
+        * all descendants in tree traversal order (if descend is true)
+        * all siblings (if siblings is true) and their descendants (if
+          also descend is true)
+        * the siblings of the parent (if ascend is true) and their
+          descendants (if also descend is true), and so on
+
+        If `condition` is not None, the iterable contains only nodes
+        for which ``condition(node)`` is true.  If `condition` is a
+        node class ``cls``, it is equivalent to a function consisting
+        of ``return isinstance(node, cls)``.
+
+        If ascend is true, assume siblings to be true as well.
+
+        For example, given the following tree::
+
+            <paragraph>
+                <emphasis>      <--- emphasis.traverse() and
+                    <strong>    <--- strong.traverse() are called.
+                        Foo
+                    Bar
+                <reference name="Baz" refid="baz">
+                    Baz
+
+        Then list(emphasis.traverse()) equals ::
+
+            [<emphasis>, <strong>, <#text: Foo>, <#text: Bar>]
+
+        and list(strong.traverse(ascend=1)) equals ::
+
+            [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>]
+        """
+        r = []
+        if ascend:
+            siblings=1
+        # Check if `condition` is a class (check for TypeType for Python
+        # implementations that use only new-style classes, like PyPy).
+        if isinstance(condition, (ClassType, TypeType)):
+            node_class = condition
+            def condition(node, node_class=node_class):
+                return isinstance(node, node_class)
+        if include_self and (condition is None or condition(self)):
+            r.append(self)
+        if descend and len(self.children):
+            for child in self:
+                r.extend(child.traverse(
+                    include_self=1, descend=1, siblings=0, ascend=0,
+                    condition=condition))
+        if siblings or ascend:
+            node = self
+            while node.parent:
+                index = node.parent.index(node)
+                for sibling in node.parent[index+1:]:
+                    r.extend(sibling.traverse(include_self=1, descend=descend,
+                                              siblings=0, ascend=0,
+                                              condition=condition))
+                if not ascend:
+                    break
+                else:
+                    node = node.parent
+        return r
+
+    def next_node(self, condition=None,
+                  include_self=0, descend=1, siblings=0, ascend=0):
+        """
+        Return the first node in the iterable returned by traverse(),
+        or None if the iterable is empty.
+
+        Parameter list is the same as of traverse.  Note that
+        include_self defaults to 0, though.
+        """
+        iterable = self.traverse(condition=condition,
+                                 include_self=include_self, descend=descend,
+                                 siblings=siblings, ascend=ascend)
+        try:
+            return iterable[0]
+        except IndexError:
+            return None
+
+class Text(Node, UserString):
+
+    """
+    Instances are terminal nodes (leaves) containing text only; no child
+    nodes or attributes.  Initialize by passing a string to the constructor.
+    Access the text itself with the `astext` method.
+    """
+
+    tagname = '#text'
+
+    children = ()
+    """Text nodes have no children, and cannot have children."""
+
+    def __init__(self, data, rawsource=''):
+        UserString.__init__(self, data)
+
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+    def __repr__(self):
+        data = repr(self.data)
+        if len(data) > 70:
+            data = repr(self.data[:64] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def __len__(self):
+        return len(self.data)
+
+    def shortrepr(self):
+        data = repr(self.data)
+        if len(data) > 20:
+            data = repr(self.data[:16] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def _dom_node(self, domroot):
+        return domroot.createTextNode(self.data)
+
+    def astext(self):
+        return self.data
+
+    def __unicode__(self):
+        return self.data
+
+    def copy(self):
+        return self.__class__(self.data)
+
+    def deepcopy(self):
+        return self.copy()
+
+    def pformat(self, indent='    ', level=0):
+        result = []
+        indent = indent * level
+        for line in self.data.splitlines():
+            result.append(indent + line + '\n')
+        return ''.join(result)
+
+
+class Element(Node):
+
+    """
+    `Element` is the superclass to all specific elements.
+
+    Elements contain attributes and child nodes.  Elements emulate
+    dictionaries for attributes, indexing by attribute name (a string).  To
+    set the attribute 'att' to 'value', do::
+
+        element['att'] = 'value'
+
+    There are two special attributes: 'ids' and 'names'.  Both are
+    lists of unique identifiers, and names serve as human interfaces
+    to IDs.  Names are case- and whitespace-normalized (see the
+    fully_normalize_name() function), and IDs conform to the regular
+    expression ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function).
+
+    Elements also emulate lists for child nodes (element nodes and/or text
+    nodes), indexing by integer.  To get the first child node, use::
+
+        element[0]
+
+    Elements may be constructed using the ``+=`` operator.  To add one new
+    child node to element, do::
+
+        element += node
+
+    This is equivalent to ``element.append(node)``.
+
+    To add a list of multiple child nodes at once, use the same ``+=``
+    operator::
+
+        element += [node1, node2]
+
+    This is equivalent to ``element.extend([node1, node2])``.
+    """
+
+    list_attributes = ('ids', 'classes', 'names', 'dupnames', 'backrefs')
+    """List attributes, automatically initialized to empty lists for
+    all nodes."""
+
+    tagname = None
+    """The element generic identifier. If None, it is set as an instance
+    attribute to the name of the class."""
+
+    child_text_separator = '\n\n'
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', *children, **attributes):
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+        self.children = []
+        """List of child nodes (elements and/or `Text`)."""
+
+        self.extend(children)           # maintain parent info
+
+        self.attributes = {}
+        """Dictionary of attribute {name: value}."""
+
+        # Initialize list attributes.
+        for att in self.list_attributes:
+            self.attributes[att] = []
+
+        for att, value in attributes.items():
+            att = att.lower()
+            if att in self.list_attributes:
+                # mutable list; make a copy for this node
+                self.attributes[att] = value[:]
+            else:
+                self.attributes[att] = value
+
+        if self.tagname is None:
+            self.tagname = self.__class__.__name__
+
+    def _dom_node(self, domroot):
+        element = domroot.createElement(self.tagname)
+        for attribute, value in self.attlist():
+            if isinstance(value, ListType):
+                value = ' '.join([serial_escape('%s' % v) for v in value])
+            element.setAttribute(attribute, '%s' % value)
+        for child in self.children:
+            element.appendChild(child._dom_node(domroot))
+        return element
+
+    def __repr__(self):
+        data = ''
+        for c in self.children:
+            data += c.shortrepr()
+            if len(data) > 60:
+                data = data[:56] + ' ...'
+                break
+        if self['names']:
+            return '<%s "%s": %s>' % (self.__class__.__name__,
+                                      '; '.join(self['names']), data)
+        else:
+            return '<%s: %s>' % (self.__class__.__name__, data)
+
+    def shortrepr(self):
+        if self['names']:
+            return '<%s "%s"...>' % (self.__class__.__name__,
+                                     '; '.join(self['names']))
+        else:
+            return '<%s...>' % self.tagname
+
+    def __unicode__(self):
+        if self.children:
+            return u'%s%s%s' % (self.starttag(),
+                                ''.join([unicode(c) for c in self.children]),
+                                self.endtag())
+        else:
+            return self.emptytag()
+
+    def starttag(self):
+        parts = [self.tagname]
+        for name, value in self.attlist():
+            if value is None:           # boolean attribute
+                parts.append(name)
+            elif isinstance(value, ListType):
+                values = [serial_escape('%s' % v) for v in value]
+                parts.append('%s="%s"' % (name, ' '.join(values)))
+            else:
+                parts.append('%s="%s"' % (name, value))
+        return '<%s>' % ' '.join(parts)
+
+    def endtag(self):
+        return '</%s>' % self.tagname
+
+    def emptytag(self):
+        return u'<%s/>' % ' '.join([self.tagname] +
+                                    ['%s="%s"' % (n, v)
+                                     for n, v in self.attlist()])
+
+    def __len__(self):
+        return len(self.children)
+
+    def __getitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            return self.attributes[key]
+        elif isinstance(key, IntType):
+            return self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            return self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __setitem__(self, key, item):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            self.attributes[str(key)] = item
+        elif isinstance(key, IntType):
+            self.setup_child(item)
+            self.children[key] = item
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            for node in item:
+                self.setup_child(node)
+            self.children[key.start:key.stop] = item
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __delitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            del self.attributes[key]
+        elif isinstance(key, IntType):
+            del self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            del self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a simple '
+                              'slice, or an attribute name string')
+
+    def __add__(self, other):
+        return self.children + other
+
+    def __radd__(self, other):
+        return other + self.children
+
+    def __iadd__(self, other):
+        """Append a node or a list of nodes to `self.children`."""
+        if isinstance(other, Node):
+            self.append(other)
+        elif other is not None:
+            self.extend(other)
+        return self
+
+    def astext(self):
+        return self.child_text_separator.join(
+              [child.astext() for child in self.children])
+
+    def non_default_attributes(self):
+        atts = {}
+        for key, value in self.attributes.items():
+            if self.is_not_default(key):
+                atts[key] = value
+        return atts
+
+    def attlist(self):
+        attlist = self.non_default_attributes().items()
+        attlist.sort()
+        return attlist
+
+    def get(self, key, failobj=None):
+        return self.attributes.get(key, failobj)
+
+    def hasattr(self, attr):
+        return self.attributes.has_key(attr)
+
+    def delattr(self, attr):
+        if self.attributes.has_key(attr):
+            del self.attributes[attr]
+
+    def setdefault(self, key, failobj=None):
+        return self.attributes.setdefault(key, failobj)
+
+    has_key = hasattr
+
+    def append(self, item):
+        self.setup_child(item)
+        self.children.append(item)
+
+    def extend(self, item):
+        for node in item:
+            self.append(node)
+
+    def insert(self, index, item):
+        if isinstance(item, Node):
+            self.setup_child(item)
+            self.children.insert(index, item)
+        elif item is not None:
+            self[index:index] = item
+
+    def pop(self, i=-1):
+        return self.children.pop(i)
+
+    def remove(self, item):
+        self.children.remove(item)
+
+    def index(self, item):
+        return self.children.index(item)
+
+    def is_not_default(self, key):
+        if self[key] == [] and key in self.list_attributes:
+            return 0
+        else:
+            return 1
+
+    def update_basic_atts(self, dict):
+        """
+        Update basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') from node or dictionary `dict`.
+        """
+        if isinstance(dict, Node):
+            dict = dict.attributes
+        for att in ('ids', 'classes', 'names', 'dupnames'):
+            for value in dict.get(att, []):
+                if not value in self[att]:
+                    self[att].append(value)
+
+    def clear(self):
+        self.children = []
+
+    def replace(self, old, new):
+        """Replace one child `Node` with another child or children."""
+        index = self.index(old)
+        if isinstance(new, Node):
+            self.setup_child(new)
+            self[index] = new
+        elif new is not None:
+            self[index:index+1] = new
+
+    def replace_self(self, new):
+        """
+        Replace `self` node with `new`, where `new` is a node or a
+        list of nodes.
+        """
+        update = new
+        if not isinstance(new, Node):
+            # `new` is a list; update first child.
+            try:
+                update = new[0]
+            except IndexError:
+                update = None
+        if isinstance(update, Element):
+            update.update_basic_atts(self)
+        else:
+            # `update` is a Text node or `new` is an empty list.
+            # Assert that we aren't losing any attributes.
+            for att in ('ids', 'names', 'classes', 'dupnames'):
+                assert not self[att], \
+                       'Losing "%s" attribute: %s' % (att, self[att])
+        self.parent.replace(self, new)
+
+    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
+        """
+        Return the index of the first child whose class exactly matches.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
+          classes. If a tuple, any of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self[index], c):
+                    return index
+        return None
+
+    def first_child_not_matching_class(self, childclass, start=0,
+                                       end=sys.maxint):
+        """
+        Return the index of the first child whose class does *not* match.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
+          classes. If a tuple, none of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self.children[index], c):
+                    break
+            else:
+                return index
+        return None
+
+    def pformat(self, indent='    ', level=0):
+        return ''.join(['%s%s\n' % (indent * level, self.starttag())] +
+                       [child.pformat(indent, level+1)
+                        for child in self.children])
+
+    def copy(self):
+        return self.__class__(**self.attributes)
+
+    def deepcopy(self):
+        copy = self.copy()
+        copy.extend([child.deepcopy() for child in self.children])
+        return copy
+
+    def set_class(self, name):
+        """Add a new class to the "classes" attribute."""
+        warnings.warn('docutils.nodes.Element.set_class deprecated; '
+                      "append to Element['classes'] list attribute directly",
+                      DeprecationWarning, stacklevel=2)
+        assert ' ' not in name
+        self['classes'].append(name.lower())
+
+    def note_referenced_by(self, name=None, id=None):
+        """Note that this Element has been referenced by its name
+        `name` or id `id`."""
+        self.referenced = 1
+        # Element.expect_referenced_by_* dictionaries map names or ids
+        # to nodes whose ``referenced`` attribute is set to true as
+        # soon as this node is referenced by the given name or id.
+        # Needed for target propagation.
+        by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
+        by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
+        if by_name:
+            assert name is not None
+            by_name.referenced = 1
+        if by_id:
+            assert id is not None
+            by_id.referenced = 1
+
+
+class TextElement(Element):
+
+    """
+    An element which directly contains text.
+
+    Its children are all `Text` or `Inline` subclass nodes.  You can
+    check whether an element's context is inline simply by checking whether
+    its immediate parent is a `TextElement` instance (including subclasses).
+    This is handy for nodes like `image` that can appear both inline and as
+    standalone body elements.
+
+    If passing children to `__init__()`, make sure to set `text` to
+    ``''`` or some other suitable value.
+    """
+
+    child_text_separator = ''
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        if text != '':
+            textnode = Text(text)
+            Element.__init__(self, rawsource, textnode, *children,
+                              **attributes)
+        else:
+            Element.__init__(self, rawsource, *children, **attributes)
+
+
+class FixedTextElement(TextElement):
+
+    """An element which directly contains preformatted text."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        TextElement.__init__(self, rawsource, text, *children, **attributes)
+        self.attributes['xml:space'] = 'preserve'
+
+
+# ========
+#  Mixins
+# ========
+
+class Resolvable:
+
+    resolved = 0
+
+
+class BackLinkable:
+
+    def add_backref(self, refid):
+        self['backrefs'].append(refid)
+
+
+# ====================
+#  Element Categories
+# ====================
+
+class Root: pass
+
+class Titular: pass
+
+class PreBibliographic:
+    """Category of Node which may occur before Bibliographic Nodes."""
+
+class Bibliographic: pass
+
+class Decorative(PreBibliographic): pass
+
+class Structural: pass
+
+class Body: pass
+
+class General(Body): pass
+
+class Sequential(Body):
+    """List-like elements."""
+
+class Admonition(Body): pass
+
+class Special(Body):
+    """Special internal body elements."""
+
+class Invisible(PreBibliographic):
+    """Internal elements that don't appear in output."""
+
+class Part: pass
+
+class Inline: pass
+
+class Referential(Resolvable): pass
+
+
+class Targetable(Resolvable):
+
+    referenced = 0
+
+    indirect_reference_name = None
+    """Holds the whitespace_normalized_name (contains mixed case) of a target.
+    Required for MoinMoin/reST compatibility."""
+
+
+class Labeled:
+    """Contains a `label` as its first element."""
+
+
+# ==============
+#  Root Element
+# ==============
+
+class document(Root, Structural, Element):
+
+    """
+    The document root element.
+
+    Do not instantiate this class directly; use
+    `docutils.utils.new_document()` instead.
+    """
+
+    def __init__(self, settings, reporter, *args, **kwargs):
+        Element.__init__(self, *args, **kwargs)
+
+        self.current_source = None
+        """Path to or description of the input source being processed."""
+
+        self.current_line = None
+        """Line number (1-based) of `current_source`."""
+
+        self.settings = settings
+        """Runtime settings data record."""
+
+        self.reporter = reporter
+        """System message generator."""
+
+        self.indirect_targets = []
+        """List of indirect target nodes."""
+
+        self.substitution_defs = {}
+        """Mapping of substitution names to substitution_definition nodes."""
+
+        self.substitution_names = {}
+        """Mapping of case-normalized substitution names to case-sensitive
+        names."""
+
+        self.refnames = {}
+        """Mapping of names to lists of referencing nodes."""
+
+        self.refids = {}
+        """Mapping of ids to lists of referencing nodes."""
+
+        self.nameids = {}
+        """Mapping of names to unique id's."""
+
+        self.nametypes = {}
+        """Mapping of names to hyperlink type (boolean: True => explicit,
+        False => implicit."""
+
+        self.ids = {}
+        """Mapping of ids to nodes."""
+
+        self.footnote_refs = {}
+        """Mapping of footnote labels to lists of footnote_reference nodes."""
+
+        self.citation_refs = {}
+        """Mapping of citation labels to lists of citation_reference nodes."""
+
+        self.autofootnotes = []
+        """List of auto-numbered footnote nodes."""
+
+        self.autofootnote_refs = []
+        """List of auto-numbered footnote_reference nodes."""
+
+        self.symbol_footnotes = []
+        """List of symbol footnote nodes."""
+
+        self.symbol_footnote_refs = []
+        """List of symbol footnote_reference nodes."""
+
+        self.footnotes = []
+        """List of manually-numbered footnote nodes."""
+
+        self.citations = []
+        """List of citation nodes."""
+
+        self.autofootnote_start = 1
+        """Initial auto-numbered footnote number."""
+
+        self.symbol_footnote_start = 0
+        """Initial symbol footnote symbol index."""
+
+        self.id_start = 1
+        """Initial ID number."""
+
+        self.parse_messages = []
+        """System messages generated while parsing."""
+
+        self.transform_messages = []
+        """System messages generated while applying transforms."""
+
+        import docutils.transforms
+        self.transformer = docutils.transforms.Transformer(self)
+        """Storage for transforms to be applied to this document."""
+
+        self.decoration = None
+        """Document's `decoration` node."""
+
+        self.document = self
+
+    def __getstate__(self):
+        """
+        Return dict with unpicklable references removed.
+        """
+        state = self.__dict__.copy()
+        state['reporter'] = None
+        state['transformer'] = None
+        return state
+
+    def asdom(self, dom=None):
+        """Return a DOM representation of this document."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        domroot.appendChild(self._dom_node(domroot))
+        return domroot
+
+    def set_id(self, node, msgnode=None):
+        for id in node['ids']:
+            if self.ids.has_key(id) and self.ids[id] is not node:
+                msg = self.reporter.severe('Duplicate ID: "%s".' % id)
+                if msgnode != None:
+                    msgnode += msg
+        if not node['ids']:
+            for name in node['names']:
+                id = self.settings.id_prefix + make_id(name)
+                if id and not self.ids.has_key(id):
+                    break
+            else:
+                id = ''
+                while not id or self.ids.has_key(id):
+                    id = (self.settings.id_prefix +
+                          self.settings.auto_id_prefix + str(self.id_start))
+                    self.id_start += 1
+            node['ids'].append(id)
+        self.ids[id] = node
+        return id
+
+    def set_name_id_map(self, node, id, msgnode=None, explicit=None):
+        """
+        `self.nameids` maps names to IDs, while `self.nametypes` maps names to
+        booleans representing hyperlink type (True==explicit,
+        False==implicit).  This method updates the mappings.
+
+        The following state transition table shows how `self.nameids` ("ids")
+        and `self.nametypes` ("types") change with new input (a call to this
+        method), and what actions are performed ("implicit"-type system
+        messages are INFO/1, and "explicit"-type system messages are ERROR/3):
+
+        ====  =====  ========  ========  =======  ====  =====  =====
+         Old State    Input          Action        New State   Notes
+        -----------  --------  -----------------  -----------  -----
+        ids   types  new type  sys.msg.  dupname  ids   types
+        ====  =====  ========  ========  =======  ====  =====  =====
+        -     -      explicit  -         -        new   True
+        -     -      implicit  -         -        new   False
+        None  False  explicit  -         -        new   True
+        old   False  explicit  implicit  old      new   True
+        None  True   explicit  explicit  new      None  True
+        old   True   explicit  explicit  new,old  None  True   [#]_
+        None  False  implicit  implicit  new      None  False
+        old   False  implicit  implicit  new,old  None  False
+        None  True   implicit  implicit  new      None  True
+        old   True   implicit  implicit  new      old   True
+        ====  =====  ========  ========  =======  ====  =====  =====
+
+        .. [#] Do not clear the name-to-id map or invalidate the old target if
+           both old and new targets are external and refer to identical URIs.
+           The new target is invalidated regardless.
+        """
+        for name in node['names']:
+            if self.nameids.has_key(name):
+                self.set_duplicate_name_id(node, id, name, msgnode, explicit)
+            else:
+                self.nameids[name] = id
+                self.nametypes[name] = explicit
+
+    def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
+        old_id = self.nameids[name]
+        old_explicit = self.nametypes[name]
+        self.nametypes[name] = old_explicit or explicit
+        if explicit:
+            if old_explicit:
+                level = 2
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    if node.has_key('refuri'):
+                        refuri = node['refuri']
+                        if old_node['names'] \
+                               and old_node.has_key('refuri') \
+                               and old_node['refuri'] == refuri:
+                            level = 1   # just inform if refuri's identical
+                    if level > 1:
+                        dupname(old_node, name)
+                        self.nameids[name] = None
+                msg = self.reporter.system_message(
+                    level, 'Duplicate explicit target name: "%s".' % name,
+                    backrefs=[id], base_node=node)
+                if msgnode != None:
+                    msgnode += msg
+                dupname(node, name)
+            else:
+                self.nameids[name] = id
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    dupname(old_node, name)
+        else:
+            if old_id is not None and not old_explicit:
+                self.nameids[name] = None
+                old_node = self.ids[old_id]
+                dupname(old_node, name)
+            dupname(node, name)
+        if not explicit or (not old_explicit and old_id is not None):
+            msg = self.reporter.info(
+                'Duplicate implicit target name: "%s".' % name,
+                backrefs=[id], base_node=node)
+            if msgnode != None:
+                msgnode += msg
+
+    def has_name(self, name):
+        return self.nameids.has_key(name)
+
+    # "note" here is an imperative verb: "take note of".
+    def note_implicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=None)
+
+    def note_explicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=1)
+
+    def note_refname(self, node):
+        self.refnames.setdefault(node['refname'], []).append(node)
+
+    def note_refid(self, node):
+        self.refids.setdefault(node['refid'], []).append(node)
+
+    def note_indirect_target(self, target):
+        self.indirect_targets.append(target)
+        if target['names']:
+            self.note_refname(target)
+
+    def note_anonymous_target(self, target):
+        self.set_id(target)
+
+    def note_autofootnote(self, footnote):
+        self.set_id(footnote)
+        self.autofootnotes.append(footnote)
+
+    def note_autofootnote_ref(self, ref):
+        self.set_id(ref)
+        self.autofootnote_refs.append(ref)
+
+    def note_symbol_footnote(self, footnote):
+        self.set_id(footnote)
+        self.symbol_footnotes.append(footnote)
+
+    def note_symbol_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.symbol_footnote_refs.append(ref)
+
+    def note_footnote(self, footnote):
+        self.set_id(footnote)
+        self.footnotes.append(footnote)
+
+    def note_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.footnote_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_citation(self, citation):
+        self.citations.append(citation)
+
+    def note_citation_ref(self, ref):
+        self.set_id(ref)
+        self.citation_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_substitution_def(self, subdef, def_name, msgnode=None):
+        name = whitespace_normalize_name(def_name)
+        if self.substitution_defs.has_key(name):
+            msg = self.reporter.error(
+                  'Duplicate substitution definition name: "%s".' % name,
+                  base_node=subdef)
+            if msgnode != None:
+                msgnode += msg
+            oldnode = self.substitution_defs[name]
+            dupname(oldnode, name)
+        # keep only the last definition:
+        self.substitution_defs[name] = subdef
+        # case-insensitive mapping:
+        self.substitution_names[fully_normalize_name(name)] = name
+
+    def note_substitution_ref(self, subref, refname):
+        subref['refname'] = whitespace_normalize_name(refname)
+
+    def note_pending(self, pending, priority=None):
+        self.transformer.add_pending(pending, priority)
+
+    def note_parse_message(self, message):
+        self.parse_messages.append(message)
+
+    def note_transform_message(self, message):
+        self.transform_messages.append(message)
+
+    def note_source(self, source, offset):
+        self.current_source = source
+        if offset is None:
+            self.current_line = offset
+        else:
+            self.current_line = offset + 1
+
+    def copy(self):
+        return self.__class__(self.settings, self.reporter,
+                              **self.attributes)
+
+    def get_decoration(self):
+        if not self.decoration:
+            self.decoration = decoration()
+            index = self.first_child_not_matching_class(Titular)
+            if index is None:
+                self.append(self.decoration)
+            else:
+                self.insert(index, self.decoration)
+        return self.decoration
+
+
+# ================
+#  Title Elements
+# ================
+
+class title(Titular, PreBibliographic, TextElement): pass
+class subtitle(Titular, PreBibliographic, TextElement): pass
+class rubric(Titular, TextElement): pass
+
+
+# ========================
+#  Bibliographic Elements
+# ========================
+
+class docinfo(Bibliographic, Element): pass
+class author(Bibliographic, TextElement): pass
+class authors(Bibliographic, Element): pass
+class organization(Bibliographic, TextElement): pass
+class address(Bibliographic, FixedTextElement): pass
+class contact(Bibliographic, TextElement): pass
+class version(Bibliographic, TextElement): pass
+class revision(Bibliographic, TextElement): pass
+class status(Bibliographic, TextElement): pass
+class date(Bibliographic, TextElement): pass
+class copyright(Bibliographic, TextElement): pass
+
+
+# =====================
+#  Decorative Elements
+# =====================
+
+class decoration(Decorative, Element):
+
+    def get_header(self):
+        if not len(self.children) or not isinstance(self.children[0], header):
+            self.insert(0, header())
+        return self.children[0]
+
+    def get_footer(self):
+        if not len(self.children) or not isinstance(self.children[-1], footer):
+            self.append(footer())
+        return self.children[-1]
+
+
+class header(Decorative, Element): pass
+class footer(Decorative, Element): pass
+
+
+# =====================
+#  Structural Elements
+# =====================
+
+class section(Structural, Element): pass
+
+
+class topic(Structural, Element):
+
+    """
+    Topics are terminal, "leaf" mini-sections, like block quotes with titles,
+    or textual figures.  A topic is just like a section, except that it has no
+    subsections, and it doesn't have to conform to section placement rules.
+
+    Topics are allowed wherever body elements (list, table, etc.) are allowed,
+    but only at the top level of a section or document.  Topics cannot nest
+    inside topics, sidebars, or body elements; you can't have a topic inside a
+    table, list, block quote, etc.
+    """
+
+
+class sidebar(Structural, Element):
+
+    """
+    Sidebars are like miniature, parallel documents that occur inside other
+    documents, providing related or reference material.  A sidebar is
+    typically offset by a border and "floats" to the side of the page; the
+    document's main text may flow around it.  Sidebars can also be likened to
+    super-footnotes; their content is outside of the flow of the document's
+    main text.
+
+    Sidebars are allowed wherever body elements (list, table, etc.) are
+    allowed, but only at the top level of a section or document.  Sidebars
+    cannot nest inside sidebars, topics, or body elements; you can't have a
+    sidebar inside a table, list, block quote, etc.
+    """
+
+
+class transition(Structural, Element): pass
+
+
+# ===============
+#  Body Elements
+# ===============
+
+class paragraph(General, TextElement): pass
+class compound(General, Element): pass
+class container(General, Element): pass
+class bullet_list(Sequential, Element): pass
+class enumerated_list(Sequential, Element): pass
+class list_item(Part, Element): pass
+class definition_list(Sequential, Element): pass
+class definition_list_item(Part, Element): pass
+class term(Part, TextElement): pass
+class classifier(Part, TextElement): pass
+class definition(Part, Element): pass
+class field_list(Sequential, Element): pass
+class field(Part, Element): pass
+class field_name(Part, TextElement): pass
+class field_body(Part, Element): pass
+
+
+class option(Part, Element):
+
+    child_text_separator = ''
+
+
+class option_argument(Part, TextElement):
+
+    def astext(self):
+        return self.get('delimiter', ' ') + TextElement.astext(self)
+
+
+class option_group(Part, Element):
+
+    child_text_separator = ', '
+
+
+class option_list(Sequential, Element): pass
+
+
+class option_list_item(Part, Element):
+
+    child_text_separator = '  '
+
+
+class option_string(Part, TextElement): pass
+class description(Part, Element): pass
+class literal_block(General, FixedTextElement): pass
+class doctest_block(General, FixedTextElement): pass
+class line_block(General, Element): pass
+
+
+class line(Part, TextElement):
+
+    indent = None
+
+
+class block_quote(General, Element): pass
+class attribution(Part, TextElement): pass
+class attention(Admonition, Element): pass
+class caution(Admonition, Element): pass
+class danger(Admonition, Element): pass
+class error(Admonition, Element): pass
+class important(Admonition, Element): pass
+class note(Admonition, Element): pass
+class tip(Admonition, Element): pass
+class hint(Admonition, Element): pass
+class warning(Admonition, Element): pass
+class admonition(Admonition, Element): pass
+class comment(Special, Invisible, FixedTextElement): pass
+class substitution_definition(Special, Invisible, TextElement): pass
+class target(Special, Invisible, Inline, TextElement, Targetable): pass
+class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
+class citation(General, BackLinkable, Element, Labeled, Targetable): pass
+class label(Part, TextElement): pass
+class figure(General, Element): pass
+class caption(Part, TextElement): pass
+class legend(Part, Element): pass
+class table(General, Element): pass
+class tgroup(Part, Element): pass
+class colspec(Part, Element): pass
+class thead(Part, Element): pass
+class tbody(Part, Element): pass
+class row(Part, Element): pass
+class entry(Part, Element): pass
+
+
+class system_message(Special, BackLinkable, PreBibliographic, Element):
+
+    """
+    System message element.
+
+    Do not instantiate this class directly; use
+    ``document.reporter.info/warning/error/severe()`` instead.
+    """
+
+    def __init__(self, message=None, *children, **attributes):
+        if message:
+            p = paragraph('', message)
+            children = (p,) + children
+        try:
+            Element.__init__(self, '', *children, **attributes)
+        except:
+            print 'system_message: children=%r' % (children,)
+            raise
+
+    def astext(self):
+        line = self.get('line', '')
+        return u'%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
+                                       self['level'], Element.astext(self))
+
+
+class pending(Special, Invisible, Element):
+
+    """
+    The "pending" element is used to encapsulate a pending operation: the
+    operation (transform), the point at which to apply it, and any data it
+    requires.  Only the pending operation's location within the document is
+    stored in the public document tree (by the "pending" object itself); the
+    operation and its data are stored in the "pending" object's internal
+    instance attributes.
+
+    For example, say you want a table of contents in your reStructuredText
+    document.  The easiest way to specify where to put it is from within the
+    document, with a directive::
+
+        .. contents::
+
+    But the "contents" directive can't do its work until the entire document
+    has been parsed and possibly transformed to some extent.  So the directive
+    code leaves a placeholder behind that will trigger the second phase of its
+    processing, something like this::
+
+        <pending ...public attributes...> + internal attributes
+
+    Use `document.note_pending()` so that the
+    `docutils.transforms.Transformer` stage of processing can run all pending
+    transforms.
+    """
+
+    def __init__(self, transform, details=None,
+                 rawsource='', *children, **attributes):
+        Element.__init__(self, rawsource, *children, **attributes)
+
+        self.transform = transform
+        """The `docutils.transforms.Transform` class implementing the pending
+        operation."""
+
+        self.details = details or {}
+        """Detail data (dictionary) required by the pending operation."""
+
+    def pformat(self, indent='    ', level=0):
+        internals = [
+              '.. internal attributes:',
+              '     .transform: %s.%s' % (self.transform.__module__,
+                                          self.transform.__name__),
+              '     .details:']
+        details = self.details.items()
+        details.sort()
+        for key, value in details:
+            if isinstance(value, Node):
+                internals.append('%7s%s:' % ('', key))
+                internals.extend(['%9s%s' % ('', line)
+                                  for line in value.pformat().splitlines()])
+            elif value and isinstance(value, ListType) \
+                  and isinstance(value[0], Node):
+                internals.append('%7s%s:' % ('', key))
+                for v in value:
+                    internals.extend(['%9s%s' % ('', line)
+                                      for line in v.pformat().splitlines()])
+            else:
+                internals.append('%7s%s: %r' % ('', key, value))
+        return (Element.pformat(self, indent, level)
+                + ''.join([('    %s%s\n' % (indent * level, line))
+                           for line in internals]))
+
+    def copy(self):
+        return self.__class__(self.transform, self.details, self.rawsource,
+                              **self.attributes)
+
+
+class raw(Special, Inline, PreBibliographic, FixedTextElement):
+
+    """
+    Raw data that is to be passed untouched to the Writer.
+    """
+
+    pass
+
+
+# =================
+#  Inline Elements
+# =================
+
+class emphasis(Inline, TextElement): pass
+class strong(Inline, TextElement): pass
+class literal(Inline, TextElement): pass
+class reference(General, Inline, Referential, TextElement): pass
+class footnote_reference(Inline, Referential, TextElement): pass
+class citation_reference(Inline, Referential, TextElement): pass
+class substitution_reference(Inline, TextElement): pass
+class title_reference(Inline, TextElement): pass
+class abbreviation(Inline, TextElement): pass
+class acronym(Inline, TextElement): pass
+class superscript(Inline, TextElement): pass
+class subscript(Inline, TextElement): pass
+
+
+class image(General, Inline, Element):
+
+    def astext(self):
+        return self.get('alt', '')
+
+
+class inline(Inline, TextElement): pass
+class problematic(Inline, TextElement): pass
+class generated(Inline, TextElement): pass
+
+
+# ========================================
+#  Auxiliary Classes, Functions, and Data
+# ========================================
+
+node_class_names = """
+    Text
+    abbreviation acronym address admonition attention attribution author
+        authors
+    block_quote bullet_list
+    caption caution citation citation_reference classifier colspec comment
+        compound contact container copyright
+    danger date decoration definition definition_list definition_list_item
+        description docinfo doctest_block document
+    emphasis entry enumerated_list error
+    field field_body field_list field_name figure footer
+        footnote footnote_reference
+    generated
+    header hint
+    image important inline
+    label legend line line_block list_item literal literal_block
+    note
+    option option_argument option_group option_list option_list_item
+        option_string organization
+    paragraph pending problematic
+    raw reference revision row rubric
+    section sidebar status strong subscript substitution_definition
+        substitution_reference subtitle superscript system_message
+    table target tbody term tgroup thead tip title title_reference topic
+        transition
+    version
+    warning""".split()
+"""A list of names of all concrete Node subclasses."""
+
+
+class NodeVisitor:
+
+    """
+    "Visitor" pattern [GoF95]_ abstract superclass implementation for
+    document tree traversals.
+
+    Each node class has corresponding methods, doing nothing by
+    default; override individual methods for specific and useful
+    behaviour.  The `dispatch_visit()` method is called by
+    `Node.walk()` upon entering a node.  `Node.walkabout()` also calls
+    the `dispatch_departure()` method before exiting a node.
+
+    The dispatch methods call "``visit_`` + node class name" or
+    "``depart_`` + node class name", resp.
+
+    This is a base class for visitors whose ``visit_...`` & ``depart_...``
+    methods should be implemented for *all* node types encountered (such as
+    for `docutils.writers.Writer` subclasses).  Unimplemented methods will
+    raise exceptions.
+
+    For sparse traversals, where only certain node types are of interest,
+    subclass `SparseNodeVisitor` instead.  When (mostly or entirely) uniform
+    processing is desired, subclass `GenericNodeVisitor`.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    optional = ()
+    """
+    Tuple containing node class names (as strings).
+
+    No exception will be raised if writers do not implement visit
+    or departure functions for these node classes.
+
+    Used to ensure transitional compatibility with existing 3rd-party writers.
+    """
+
+    def __init__(self, document):
+        self.document = document
+
+    def dispatch_visit(self, node):
+        """
+        Call self."``visit_`` + node class name" with `node` as
+        parameter.  If the ``visit_...`` method does not exist, call
+        self.unknown_visit.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'visit_' + node_name, self.unknown_visit)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def dispatch_departure(self, node):
+        """
+        Call self."``depart_`` + node class name" with `node` as
+        parameter.  If the ``depart_...`` method does not exist, call
+        self.unknown_departure.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'depart_' + node_name, self.unknown_departure)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def unknown_visit(self, node):
+        """
+        Called when entering unknown `Node` types.
+
+        Raise an exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s visiting unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+    def unknown_departure(self, node):
+        """
+        Called before exiting unknown `Node` types.
+
+        Raise exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s departing unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+
+class SparseNodeVisitor(NodeVisitor):
+
+    """
+    Base class for sparse traversals, where only certain node types are of
+    interest.  When ``visit_...`` & ``depart_...`` methods should be
+    implemented for *all* node types (such as for `docutils.writers.Writer`
+    subclasses), subclass `NodeVisitor` instead.
+    """
+
+
+class GenericNodeVisitor(NodeVisitor):
+
+    """
+    Generic "Visitor" abstract superclass, for simple traversals.
+
+    Unless overridden, each ``visit_...`` method calls `default_visit()`, and
+    each ``depart_...`` method (when using `Node.walkabout()`) calls
+    `default_departure()`. `default_visit()` (and `default_departure()`) must
+    be overridden in subclasses.
+
+    Define fully generic visitors by overriding `default_visit()` (and
+    `default_departure()`) only. Define semi-generic visitors by overriding
+    individual ``visit_...()`` (and ``depart_...()``) methods also.
+
+    `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
+    be overridden for default behavior.
+    """
+
+    def default_visit(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+    def default_departure(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+def _call_default_visit(self, node):
+    self.default_visit(node)
+
+def _call_default_departure(self, node):
+    self.default_departure(node)
+
+def _nop(self, node):
+    pass
+
+def _add_node_class_names(names):
+    """Save typing with dynamic assignments:"""
+    for _name in names:
+        setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
+        setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
+        setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
+        setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
+
+_add_node_class_names(node_class_names)
+
+
+class TreeCopyVisitor(GenericNodeVisitor):
+
+    """
+    Make a complete copy of a tree or branch, including element attributes.
+    """
+
+    def __init__(self, document):
+        GenericNodeVisitor.__init__(self, document)
+        self.parent_stack = []
+        self.parent = []
+
+    def get_tree_copy(self):
+        return self.parent[0]
+
+    def default_visit(self, node):
+        """Copy the current node, and make it the new acting parent."""
+        newnode = node.copy()
+        self.parent.append(newnode)
+        self.parent_stack.append(self.parent)
+        self.parent = newnode
+
+    def default_departure(self, node):
+        """Restore the previous acting parent."""
+        self.parent = self.parent_stack.pop()
+
+
+class TreePruningException(Exception):
+
+    """
+    Base class for `NodeVisitor`-related tree pruning exceptions.
+
+    Raise subclasses from within ``visit_...`` or ``depart_...`` methods
+    called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
+    the tree traversed.
+    """
+
+    pass
+
+
+class SkipChildren(TreePruningException):
+
+    """
+    Do not visit any children of the current node.  The current node's
+    siblings and ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipSiblings(TreePruningException):
+
+    """
+    Do not visit any more siblings (to the right) of the current node.  The
+    current node's children and its ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipNode(TreePruningException):
+
+    """
+    Do not visit the current node's children, and do not call the current
+    node's ``depart_...`` method.
+    """
+
+    pass
+
+
+class SkipDeparture(TreePruningException):
+
+    """
+    Do not call the current node's ``depart_...`` method.  The current node's
+    children and siblings are not affected.
+    """
+
+    pass
+
+
+class NodeFound(TreePruningException):
+
+    """
+    Raise to indicate that the target of a search has been found.  This
+    exception must be caught by the client; it is not caught by the traversal
+    code.
+    """
+
+    pass
+
+
+class StopTraversal(TreePruningException):
+
+    """
+    Stop the traversal alltogether.  The current node's ``depart_...`` method
+    is not affected.  The parent nodes ``depart_...`` methods are also called
+    as usual.  No other nodes are visited.  This is an alternative to
+    NodeFound that does not cause exception handling to trickle up to the
+    caller.
+    """
+
+    pass
+
+
+def make_id(string):
+    """
+    Convert `string` into an identifier and return it.
+
+    Docutils identifiers will conform to the regular expression
+    ``[a-z](-?[a-z0-9]+)*``.  For CSS compatibility, identifiers (the "class"
+    and "id" attributes) should have no underscores, colons, or periods.
+    Hyphens may be used.
+
+    - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
+
+          ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
+          followed by any number of letters, digits ([0-9]), hyphens ("-"),
+          underscores ("_"), colons (":"), and periods (".").
+
+    - However the `CSS1 spec`_ defines identifiers based on the "name" token,
+      a tighter interpretation ("flex" tokenizer notation; "latin1" and
+      "escape" 8-bit characters have been replaced with entities)::
+
+          unicode     \\[0-9a-f]{1,4}
+          latin1      [&iexcl;-&yuml;]
+          escape      {unicode}|\\[ -~&iexcl;-&yuml;]
+          nmchar      [-a-z0-9]|{latin1}|{escape}
+          name        {nmchar}+
+
+    The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
+    or periods ("."), therefore "class" and "id" attributes should not contain
+    these characters. They should be replaced with hyphens ("-"). Combined
+    with HTML's requirements (the first character must be a letter; no
+    "unicode", "latin1", or "escape" characters), this results in the
+    ``[a-z](-?[a-z0-9]+)*`` pattern.
+
+    .. _HTML 4.01 spec: http://www.w3.org/TR/html401
+    .. _CSS1 spec: http://www.w3.org/TR/REC-CSS1
+    """
+    id = _non_id_chars.sub('-', ' '.join(string.lower().split()))
+    id = _non_id_at_ends.sub('', id)
+    return str(id)
+
+_non_id_chars = re.compile('[^a-z0-9]+')
+_non_id_at_ends = re.compile('^[-0-9]+|-+$')
+
+def dupname(node, name):
+    node['dupnames'].append(name)
+    node['names'].remove(name)
+    # Assume that this method is referenced, even though it isn't; we
+    # don't want to throw unnecessary system_messages.
+    node.referenced = 1
+
+def fully_normalize_name(name):
+    """Return a case- and whitespace-normalized name."""
+    return ' '.join(name.lower().split())
+
+def whitespace_normalize_name(name):
+    """Return a whitespace-normalized name."""
+    return ' '.join(name.split())
+
+def serial_escape(value):
+    """Escape string values that are elements of a list, for serialization."""
+    return value.replace('\\', r'\\').replace(' ', r'\ ')
+
+# 
+#
+# Local Variables:
+# indent-tabs-mode: nil
+# sentence-end-double-space: t
+# fill-column: 78
+# End:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils parser modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import Component
+
+
+class Parser(Component):
+
+    component_type = 'parser'
+    config_section = 'parsers'
+
+    def parse(self, inputstring, document):
+        """Override to parse `inputstring` into document tree `document`."""
+        raise NotImplementedError('subclass must override this method')
+
+    def setup_parse(self, inputstring, document):
+        """Initial parse setup.  Call at start of `self.parse()`."""
+        self.inputstring = inputstring
+        self.document = document
+        document.reporter.attach_observer(document.note_parse_message)
+
+    def finish_parse(self):
+        """Finalize parse details.  Call at end of `self.parse()`."""
+        self.document.reporter.detach_observer(
+            self.document.note_parse_message)
+
+
+_parser_aliases = {
+      'restructuredtext': 'rst',
+      'rest': 'rst',
+      'restx': 'rst',
+      'rtxt': 'rst',}
+
+def get_parser_class(parser_name):
+    """Return the Parser class from the `parser_name` module."""
+    parser_name = parser_name.lower()
+    if _parser_aliases.has_key(parser_name):
+        parser_name = _parser_aliases[parser_name]
+    module = __import__(parser_name, globals(), locals())
+    return module.Parser
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/null.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""A do-nothing parser."""
+
+from docutils import parsers
+
+
+class Parser(parsers.Parser):
+
+    """A do-nothing parser."""
+
+    supported = ('null',)
+
+    config_section = 'null parser'
+    config_section_dependencies = ('parsers',)
+
+    def parse(self, inputstring, document):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,367 @@
+# $Id: __init__.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
+the reStructuredText parser.
+
+
+Usage
+=====
+
+1. Create a parser::
+
+       parser = docutils.parsers.rst.Parser()
+
+   Several optional arguments may be passed to modify the parser's behavior.
+   Please see `Customizing the Parser`_ below for details.
+
+2. Gather input (a multi-line string), by reading a file or the standard
+   input::
+
+       input = sys.stdin.read()
+
+3. Create a new empty `docutils.nodes.document` tree::
+
+       document = docutils.utils.new_document(source, settings)
+
+   See `docutils.utils.new_document()` for parameter details.
+
+4. Run the parser, populating the document tree::
+
+       parser.parse(input, document)
+
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a state machine, examining its
+input one line at a time. To understand how the parser works, please first
+become familiar with the `docutils.statemachine` module, then see the
+`states` module.
+
+
+Customizing the Parser
+----------------------
+
+Anything that isn't already customizable is that way simply because that type
+of customizability hasn't been implemented yet.  Patches welcome!
+
+When instantiating an object of the `Parser` class, two parameters may be
+passed: ``rfc2822`` and ``inliner``.  Pass ``rfc2822=1`` to enable an initial
+RFC-2822 style header block, parsed as a "field_list" element (with "class"
+attribute set to "rfc2822").  Currently this is the only body-level element
+which is customizable without subclassing.  (Tip: subclass `Parser` and change
+its "state_classes" and "initial_state" attributes to refer to new classes.
+Contact the author if you need more details.)
+
+The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
+It handles inline markup recognition.  A common extension is the addition of
+further implicit hyperlinks, like "RFC 2822".  This can be done by subclassing
+`states.Inliner`, adding a new method for the implicit markup, and adding a
+``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
+subclass.  See `states.Inliner.implicit_inline()` for details.  Explicit
+inline markup can be customized in a `states.Inliner` subclass via the
+``patterns.initial`` and ``dispatch`` attributes (and new methods as
+appropriate).
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils.parsers
+import docutils.statemachine
+from docutils.parsers.rst import states
+from docutils import frontend, nodes
+
+
+class Parser(docutils.parsers.Parser):
+
+    """The reStructuredText parser."""
+
+    supported = ('restructuredtext', 'rst', 'rest', 'restx', 'rtxt', 'rstx')
+    """Aliases this parser supports."""
+
+    settings_spec = (
+        'reStructuredText Parser Options',
+        None,
+        (('Recognize and link to standalone PEP references (like "PEP 258").',
+          ['--pep-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for PEP references '
+          '(default "http://www.python.org/dev/peps/").',
+          ['--pep-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.python.org/dev/peps/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Template for PEP file part of URL. (default "pep-%04d")',
+          ['--pep-file-url-template'],
+          {'metavar': '<URL>', 'default': 'pep-%04d'}),
+         ('Recognize and link to standalone RFC references (like "RFC 822").',
+          ['--rfc-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for RFC references (default "http://www.faqs.org/rfcs/").',
+          ['--rfc-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.faqs.org/rfcs/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Set number of spaces for tab expansion (default 8).',
+          ['--tab-width'],
+          {'metavar': '<width>', 'type': 'int', 'default': 8,
+           'validator': frontend.validate_nonnegative_int}),
+         ('Remove spaces before footnote references.',
+          ['--trim-footnote-reference-space'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Leave spaces before footnote references.',
+          ['--leave-footnote-reference-space'],
+          {'action': 'store_false', 'dest': 'trim_footnote_reference_space'}),
+         ('Disable directives that insert the contents of external file '
+          '("include" & "raw"); replaced with a "warning" system message.',
+          ['--no-file-insertion'],
+          {'action': 'store_false', 'default': 1,
+           'dest': 'file_insertion_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable directives that insert the contents of external file '
+          '("include" & "raw").  Enabled by default.',
+          ['--file-insertion-enabled'],
+          {'action': 'store_true'}),
+         ('Disable the "raw" directives; replaced with a "warning" '
+          'system message.',
+          ['--no-raw'],
+          {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable the "raw" directive.  Enabled by default.',
+          ['--raw-enabled'],
+          {'action': 'store_true'}),))
+
+    config_section = 'restructuredtext parser'
+    config_section_dependencies = ('parsers',)
+
+    def __init__(self, rfc2822=None, inliner=None):
+        if rfc2822:
+            self.initial_state = 'RFC2822Body'
+        else:
+            self.initial_state = 'Body'
+        self.state_classes = states.state_classes
+        self.inliner = inliner
+
+    def parse(self, inputstring, document):
+        """Parse `inputstring` and populate `document`, a document tree."""
+        self.setup_parse(inputstring, document)
+        self.statemachine = states.RSTStateMachine(
+              state_classes=self.state_classes,
+              initial_state=self.initial_state,
+              debug=document.reporter.debug_flag)
+        inputlines = docutils.statemachine.string2lines(
+              inputstring, tab_width=document.settings.tab_width,
+              convert_whitespace=1)
+        self.statemachine.run(inputlines, document, inliner=self.inliner)
+        self.finish_parse()
+
+
+class DirectiveError(Exception):
+
+    """
+    Store a message and a system message level.
+
+    To be thrown from inside directive code.
+
+    Do not instantiate directly -- use `Directive.directive_error()`
+    instead!
+    """
+
+    def __init__(self, level, message):
+        """
+        Initialize with message `message`.  `level` is a system message level.
+        """
+        Exception.__init__(self)
+        self.level = level
+        self.message = message
+
+
+class Directive:
+
+    """
+    Base class for reStructuredText directives.
+
+    The following attributes may be set by subclasses.  They are
+    interpreted by the directive parser (which runs the directive
+    class):
+
+    - `required_arguments`: The number of required arguments (default:
+      0).
+
+    - `optional_arguments`: The number of optional arguments (default:
+      0).
+
+    - `final_argument_whitespace`: A boolean, indicating if the final
+      argument may contain whitespace (default: False).
+
+    - `option_spec`: A dictionary, mapping known option names to
+      conversion functions such as `int` or `float` (default: {}, no
+      options).  Several conversion functions are defined in the
+      directives/__init__.py module.
+
+      Option conversion functions take a single parameter, the option
+      argument (a string or ``None``), validate it and/or convert it
+      to the appropriate form.  Conversion functions may raise
+      `ValueError` and `TypeError` exceptions.
+
+    - `has_content`: A boolean; True if content is allowed.  Client
+      code must handle the case where content is required but not
+      supplied (an empty content list will be supplied).
+
+    Arguments are normally single whitespace-separated words.  The
+    final argument may contain whitespace and/or newlines if
+    `final_argument_whitespace` is True.
+
+    If the form of the arguments is more complex, specify only one
+    argument (either required or optional) and set
+    `final_argument_whitespace` to True; the client code must do any
+    context-sensitive parsing.
+
+    When a directive implementation is being run, the directive class
+    is instantiated, and the `run()` method is executed.  During
+    instantiation, the following instance variables are set:
+
+    - ``name`` is the directive type or name (string).
+
+    - ``arguments`` is the list of positional arguments (strings).
+
+    - ``options`` is a dictionary mapping option names (strings) to
+      values (type depends on option conversion functions; see
+      `option_spec` above).
+
+    - ``content`` is a list of strings, the directive content line by line.
+
+    - ``lineno`` is the line number of the first line of the directive.
+
+    - ``content_offset`` is the line offset of the first line of the content from
+      the beginning of the current input.  Used when initiating a nested parse.
+
+    - ``block_text`` is a string containing the entire directive.
+
+    - ``state`` is the state which called the directive function.
+
+    - ``state_machine`` is the state machine which controls the state which called
+      the directive function.
+
+    Directive functions return a list of nodes which will be inserted
+    into the document tree at the point where the directive was
+    encountered.  This can be an empty list if there is nothing to
+    insert.
+
+    For ordinary directives, the list must contain body elements or
+    structural elements.  Some directives are intended specifically
+    for substitution definitions, and must return a list of `Text`
+    nodes and/or inline elements (suitable for inline insertion, in
+    place of the substitution reference).  Such directives must verify
+    substitution definition context, typically using code like this::
+
+        if not isinstance(state, states.SubstitutionDef):
+            error = state_machine.reporter.error(
+                'Invalid context: the "%s" directive can only be used '
+                'within a substitution definition.' % (name),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+    """
+
+    # There is a "Creating reStructuredText Directives" how-to at
+    # <http://docutils.sf.net/docs/howto/rst-directives.html>.  If you
+    # update this docstring, please update the how-to as well.
+
+    required_arguments = 0
+    """Number of required directive arguments."""
+
+    optional_arguments = 0
+    """Number of optional arguments after the required arguments."""
+
+    final_argument_whitespace = False
+    """May the final argument contain whitespace?"""
+
+    option_spec = None
+    """Mapping of option names to validator functions."""
+
+    has_content = False
+    """May the directive have content?"""
+
+    def __init__(self, name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine):
+        self.name = name
+        self.arguments = arguments
+        self.options = options
+        self.content = content
+        self.lineno = lineno
+        self.content_offset = content_offset
+        self.block_text = block_text
+        self.state = state
+        self.state_machine = state_machine
+
+    def run(self):
+        raise NotImplementedError('Must override run() is subclass.')
+
+    # Directive errors:
+
+    def directive_error(self, level, message):
+        """
+        Return a DirectiveError suitable for being thrown as an exception.
+
+        Call "raise self.directive_error(level, message)" from within
+        a directive implementation to return one single system message
+        at level `level`, which automatically gets the directive block
+        and the line number added.
+
+        You'd often use self.error(message) instead, which will
+        generate an ERROR-level directive error.
+        """
+        return DirectiveError(level, message)
+
+    def debug(self, message):
+        return self.directive_error(0, message)
+
+    def info(self, message):
+        return self.directive_error(1, message)
+
+    def warning(self, message):
+        return self.directive_error(2, message)
+
+    def error(self, message):
+        return self.directive_error(3, message)
+
+    def severe(self, message):
+        return self.directive_error(4, message)
+
+    # Convenience methods:
+
+    def assert_has_content(self):
+        """
+        Throw an ERROR-level DirectiveError if the directive doesn't
+        have contents.
+        """
+        if not self.content:
+            raise self.error('Content block expected for the "%s" directive; '
+                             'none found.' % self.name)
+
+
+def convert_directive_function(directive_fn):
+    """
+    Define & return a directive class generated from `directive_fn`.
+
+    `directive_fn` uses the old-style, functional interface.
+    """
+
+    class FunctionalDirective(Directive):
+
+        option_spec = getattr(directive_fn, 'options', None)
+        has_content = getattr(directive_fn, 'content', False)
+        _argument_spec = getattr(directive_fn, 'arguments', (0, 0, False))
+        required_arguments, optional_arguments, final_argument_whitespace \
+            = _argument_spec
+
+        def run(self):
+            return directive_fn(
+                self.name, self.arguments, self.options, self.content,
+                self.lineno, self.content_offset, self.block_text,
+                self.state, self.state_machine)
+
+    # Return new-style directive.
+    return FunctionalDirective
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,367 @@
+# $Id: __init__.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains directive implementation modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import codecs
+from docutils import nodes
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+_directive_registry = {
+      'attention': ('admonitions', 'Attention'),
+      'caution': ('admonitions', 'Caution'),
+      'danger': ('admonitions', 'Danger'),
+      'error': ('admonitions', 'Error'),
+      'important': ('admonitions', 'Important'),
+      'note': ('admonitions', 'Note'),
+      'tip': ('admonitions', 'Tip'),
+      'hint': ('admonitions', 'Hint'),
+      'warning': ('admonitions', 'Warning'),
+      'admonition': ('admonitions', 'Admonition'),
+      'sidebar': ('body', 'Sidebar'),
+      'topic': ('body', 'Topic'),
+      'line-block': ('body', 'LineBlock'),
+      'parsed-literal': ('body', 'ParsedLiteral'),
+      'rubric': ('body', 'Rubric'),
+      'epigraph': ('body', 'Epigraph'),
+      'highlights': ('body', 'Highlights'),
+      'pull-quote': ('body', 'PullQuote'),
+      'compound': ('body', 'Compound'),
+      'container': ('body', 'Container'),
+      #'questions': ('body', 'question_list'),
+      'table': ('tables', 'RSTTable'),
+      'csv-table': ('tables', 'CSVTable'),
+      'list-table': ('tables', 'ListTable'),
+      'image': ('images', 'Image'),
+      'figure': ('images', 'Figure'),
+      'contents': ('parts', 'Contents'),
+      'sectnum': ('parts', 'Sectnum'),
+      'header': ('parts', 'Header'),
+      'footer': ('parts', 'Footer'),
+      #'footnotes': ('parts', 'footnotes'),
+      #'citations': ('parts', 'citations'),
+      'target-notes': ('references', 'TargetNotes'),
+      'meta': ('html', 'Meta'),
+      #'imagemap': ('html', 'imagemap'),
+      'raw': ('misc', 'Raw'),
+      'include': ('misc', 'Include'),
+      'replace': ('misc', 'Replace'),
+      'unicode': ('misc', 'Unicode'),
+      'class': ('misc', 'Class'),
+      'role': ('misc', 'Role'),
+      'default-role': ('misc', 'DefaultRole'),
+      'title': ('misc', 'Title'),
+      'date': ('misc', 'Date'),
+      'restructuredtext-test-directive': ('misc', 'TestDirective'),}
+"""Mapping of directive name to (module name, class name).  The
+directive name is canonical & must be lowercase.  Language-dependent
+names are defined in the ``language`` subpackage."""
+
+_directives = {}
+"""Cache of imported directives."""
+
+def directive(directive_name, language_module, document):
+    """
+    Locate and return a directive function from its language-dependent name.
+    If not found in the current language, check English.  Return None if the
+    named directive cannot be found.
+    """
+    normname = directive_name.lower()
+    messages = []
+    msg_text = []
+    if _directives.has_key(normname):
+        return _directives[normname], messages
+    canonicalname = None
+    try:
+        canonicalname = language_module.directives[normname]
+    except AttributeError, error:
+        msg_text.append('Problem retrieving directive entry from language '
+                        'module %r: %s.' % (language_module, error))
+    except KeyError:
+        msg_text.append('No directive entry for "%s" in module "%s".'
+                        % (directive_name, language_module.__name__))
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.directives[normname]
+            msg_text.append('Using English fallback for directive "%s".'
+                            % directive_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical directive name.'
+                            % directive_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+    if msg_text:
+        message = document.reporter.info(
+            '\n'.join(msg_text), line=document.current_line)
+        messages.append(message)
+    try:
+        modulename, classname = _directive_registry[canonicalname]
+    except KeyError:
+        # Error handling done by caller.
+        return None, messages
+    try:
+        module = __import__(modulename, globals(), locals())
+    except ImportError, detail:
+        messages.append(document.reporter.error(
+            'Error importing directive module "%s" (directive "%s"):\n%s'
+            % (modulename, directive_name, detail),
+            line=document.current_line))
+        return None, messages
+    try:
+        directive = getattr(module, classname)
+        _directives[normname] = directive
+    except AttributeError:
+        messages.append(document.reporter.error(
+            'No directive class "%s" in module "%s" (directive "%s").'
+            % (classname, modulename, directive_name),
+            line=document.current_line))
+        return None, messages
+    return directive, messages
+
+def register_directive(name, directive):
+    """
+    Register a nonstandard application-defined directive function.
+    Language lookups are not needed for such functions.
+    """
+    _directives[name] = directive
+
+def flag(argument):
+    """
+    Check for a valid flag option (no argument) and return ``None``.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if an argument is found.
+    """
+    if argument and argument.strip():
+        raise ValueError('no argument is allowed; "%s" supplied' % argument)
+    else:
+        return None
+
+def unchanged_required(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        return argument  # unchanged!
+
+def unchanged(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    No argument implies empty string ("").
+    """
+    if argument is None:
+        return u''
+    else:
+        return argument  # unchanged!
+
+def path(argument):
+    """
+    Return the path argument unwrapped (with newlines removed).
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        path = ''.join([s.strip() for s in argument.splitlines()])
+        return path
+
+def uri(argument):
+    """
+    Return the URI argument with whitespace removed.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        uri = ''.join(argument.split())
+        return uri
+
+def nonnegative_int(argument):
+    """
+    Check for a nonnegative integer argument; raise ``ValueError`` if not.
+    (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
+
+def get_measure(argument, units):
+    """
+    Check for a positive argument of one of the units and return a
+    normalized string of the form "<value><unit>" (without space in
+    between).
+    
+    To be called from directive option conversion functions.
+    """
+    match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
+    try:
+        assert match is not None
+        float(match.group(1))
+    except (AssertionError, ValueError):
+        raise ValueError(
+            'not a positive measure of one of the following units:\n%s'
+            % ' '.join(['"%s"' % i for i in units]))
+    return match.group(1) + match.group(2)
+
+def length_or_unitless(argument):
+    return get_measure(argument, length_units + [''])
+
+def length_or_percentage_or_unitless(argument):
+    return get_measure(argument, length_units + ['%', ''])
+
+def class_option(argument):
+    """
+    Convert the argument into a list of ID-compatible strings and return it.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    names = argument.split()
+    class_names = []
+    for name in names:
+        class_name = nodes.make_id(name)
+        if not class_name:
+            raise ValueError('cannot make "%s" into a class name' % name)
+        class_names.append(class_name)
+    return class_names
+
+unicode_pattern = re.compile(
+    r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
+
+def unicode_code(code):
+    r"""
+    Convert a Unicode character code to a Unicode character.
+    (Directive option conversion function.)
+
+    Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
+    ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
+    numeric character entities (e.g. ``&#x262E;``).  Other text remains as-is.
+
+    Raise ValueError for illegal Unicode code values.
+    """
+    try:
+        if code.isdigit():                  # decimal number
+            return unichr(int(code))
+        else:
+            match = unicode_pattern.match(code)
+            if match:                       # hex number
+                value = match.group(1) or match.group(2)
+                return unichr(int(value, 16))
+            else:                           # other text
+                return code
+    except OverflowError, detail:
+        raise ValueError('code too large (%s)' % detail)
+
+def single_char_or_unicode(argument):
+    """
+    A single character is returned as-is.  Unicode characters codes are
+    converted as in `unicode_code`.  (Directive option conversion function.)
+    """
+    char = unicode_code(argument)
+    if len(char) > 1:
+        raise ValueError('%r invalid; must be a single character or '
+                         'a Unicode code' % char)
+    return char
+
+def single_char_or_whitespace_or_unicode(argument):
+    """
+    As with `single_char_or_unicode`, but "tab" and "space" are also supported.
+    (Directive option conversion function.)
+    """
+    if argument == 'tab':
+        char = '\t'
+    elif argument == 'space':
+        char = ' '
+    else:
+        char = single_char_or_unicode(argument)
+    return char
+
+def positive_int(argument):
+    """
+    Converts the argument into an integer.  Raises ValueError for negative,
+    zero, or non-integer values.  (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 1:
+        raise ValueError('negative or zero value; must be positive')
+    return value
+
+def positive_int_list(argument):
+    """
+    Converts a space- or comma-separated list of values into a Python list
+    of integers.
+    (Directive option conversion function.)
+
+    Raises ValueError for non-positive-integer values.
+    """
+    if ',' in argument:
+        entries = argument.split(',')
+    else:
+        entries = argument.split()
+    return [positive_int(entry) for entry in entries]
+
+def encoding(argument):
+    """
+    Verfies the encoding argument by lookup.
+    (Directive option conversion function.)
+
+    Raises ValueError for unknown encodings.
+    """
+    try:
+        codecs.lookup(argument)
+    except LookupError:
+        raise ValueError('unknown encoding: "%s"' % argument)
+    return argument
+
+def choice(argument, values):
+    """
+    Directive option utility function, supplied to enable options whose
+    argument must be a member of a finite set of possible values (must be
+    lower case).  A custom conversion function must be written to use it.  For
+    example::
+
+        from docutils.parsers.rst import directives
+
+        def yesno(argument):
+            return directives.choice(argument, ('yes', 'no'))
+
+    Raise ``ValueError`` if no argument is found or if the argument's value is
+    not valid (not an entry in the supplied list).
+    """
+    try:
+        value = argument.lower().strip()
+    except AttributeError:
+        raise ValueError('must supply an argument; choose from %s'
+                         % format_values(values))
+    if value in values:
+        return value
+    else:
+        raise ValueError('"%s" unknown; choose from %s'
+                         % (argument, format_values(values)))
+
+def format_values(values):
+    return '%s, or "%s"' % (', '.join(['"%s"' % s for s in values[:-1]]),
+                            values[-1])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+# $Id: admonitions.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Admonition directives.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states, directives
+from docutils import nodes
+
+
+class BaseAdmonition(Directive):
+
+    required_arguments = 0
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {}
+    has_content = True
+
+    node_class = None
+    """Subclasses must set this to the appropriate admonition node class."""
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        admonition_node = self.node_class(text)
+        if self.arguments:
+            title_text = self.arguments[0]
+            textnodes, messages = self.state.inline_text(title_text,
+                                                         self.lineno)
+            admonition_node += nodes.title(title_text, '', *textnodes)
+            admonition_node += messages
+            if self.options.has_key('class'):
+                classes = self.options['class']
+            else:
+                classes = ['admonition-' + nodes.make_id(title_text)]
+            admonition_node['classes'] += classes
+        self.state.nested_parse(self.content, self.content_offset,
+                                admonition_node)
+        return [admonition_node]
+
+
+class Admonition(BaseAdmonition):
+
+    required_arguments = 1
+    option_spec = {'class': directives.class_option}
+    node_class = nodes.admonition
+
+
+class Attention(BaseAdmonition):
+
+    node_class = nodes.attention
+
+
+class Caution(BaseAdmonition):
+
+    node_class = nodes.caution
+
+
+class Danger(BaseAdmonition):
+
+    node_class = nodes.danger
+
+
+class Error(BaseAdmonition):
+
+    node_class = nodes.error
+
+
+class Hint(BaseAdmonition):
+
+    node_class = nodes.hint
+
+
+class Important(BaseAdmonition):
+
+    node_class = nodes.important
+
+
+class Note(BaseAdmonition):
+
+    node_class = nodes.note
+
+
+class Tip(BaseAdmonition):
+
+    node_class = nodes.tip
+
+
+class Warning(BaseAdmonition):
+
+    node_class = nodes.warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,192 @@
+# $Id: body.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for additional body elements.
+
+See `docutils.parsers.rst.directives` for API details.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.roles import set_classes
+
+
+class BasePseudoSection(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    node_class = None
+    """Node class to be used (must be set in subclasses)."""
+
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        self.assert_has_content()
+        title_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(title_text, self.lineno)
+        titles = [nodes.title(title_text, '', *textnodes)]
+        # Sidebar uses this code.
+        if self.options.has_key('subtitle'):
+            textnodes, more_messages = self.state.inline_text(
+                self.options['subtitle'], self.lineno)
+            titles.append(nodes.subtitle(self.options['subtitle'], '',
+                                         *textnodes))
+            messages.extend(more_messages)
+        text = '\n'.join(self.content)
+        node = self.node_class(text, *(titles + messages))
+        node['classes'] += self.options.get('class', [])
+        if text:
+            self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Topic(BasePseudoSection):
+
+    node_class = nodes.topic
+
+
+class Sidebar(BasePseudoSection):
+
+    node_class = nodes.sidebar
+
+    option_spec = BasePseudoSection.option_spec.copy()
+    option_spec['subtitle'] = directives.unchanged_required
+
+    def run(self):
+        if isinstance(self.state_machine.node, nodes.sidebar):
+            raise self.error('The "%s" directive may not be used within a '
+                             'sidebar element.' % self.name)
+        return BasePseudoSection.run(self)
+
+
+class LineBlock(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        block = nodes.line_block(classes=self.options.get('class', []))
+        node_list = [block]
+        for line_text in self.content:
+            text_nodes, messages = self.state.inline_text(
+                line_text.strip(), self.lineno + self.content_offset)
+            line = nodes.line(line_text, '', *text_nodes)
+            if line_text.strip():
+                line.indent = len(line_text) - len(line_text.lstrip())
+            block += line
+            node_list.extend(messages)
+            self.content_offset += 1
+        self.state.nest_line_block_lines(block)
+        return node_list
+
+
+class ParsedLiteral(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        set_classes(self.options)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        text_nodes, messages = self.state.inline_text(text, self.lineno)
+        node = nodes.literal_block(text, '', *text_nodes, **self.options)
+        node.line = self.content_offset + 1
+        return [node] + messages
+
+
+class Rubric(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+
+    def run(self):
+        set_classes(self.options)
+        rubric_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(rubric_text, self.lineno)
+        rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options)
+        return [rubric] + messages
+
+
+class BlockQuote(Directive):
+
+    has_content = True
+    classes = []
+
+    def run(self):
+        self.assert_has_content()
+        elements = self.state.block_quote(self.content, self.content_offset)
+        for element in elements:
+            if isinstance(element, nodes.block_quote):
+                element['classes'] += self.classes
+        return elements
+
+
+class Epigraph(BlockQuote):
+
+    classes = ['epigraph']
+
+
+class Highlights(BlockQuote):
+
+    classes = ['highlights']
+
+
+class PullQuote(BlockQuote):
+
+    classes = ['pull-quote']
+
+
+class Compound(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        node = nodes.compound(text)
+        node['classes'] += self.options.get('class', [])
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Container(Directive):
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        try:
+            if self.arguments:
+                classes = directives.class_option(self.arguments[0])
+            else:
+                classes = []
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node = nodes.container(text)
+        node['classes'].extend(classes)
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+# $Id: html.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for typically HTML-specific constructs.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states
+from docutils.transforms import components
+
+
+class MetaBody(states.SpecializedBody):
+
+    class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
+        """HTML-specific "meta" element."""
+        pass
+
+    def field_marker(self, match, context, next_state):
+        """Meta element."""
+        node, blank_finish = self.parsemeta(match)
+        self.parent += node
+        return [], next_state, []
+
+    def parsemeta(self, match):
+        name = self.parse_field_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        node = self.meta()
+        pending = nodes.pending(components.Filter,
+                                {'component': 'writer',
+                                 'format': 'html',
+                                 'nodes': [node]})
+        node['content'] = ' '.join(indented)
+        if not indented:
+            line = self.state_machine.line
+            msg = self.reporter.info(
+                  'No content for meta tag "%s".' % name,
+                  nodes.literal_block(line, line),
+                  line=self.state_machine.abs_line_number())
+            return msg, blank_finish
+        tokens = name.split()
+        try:
+            attname, val = utils.extract_name_value(tokens[0])[0]
+            node[attname.lower()] = val
+        except utils.NameValueError:
+            node['name'] = tokens[0]
+        for token in tokens[1:]:
+            try:
+                attname, val = utils.extract_name_value(token)[0]
+                node[attname.lower()] = val
+            except utils.NameValueError, detail:
+                line = self.state_machine.line
+                msg = self.reporter.error(
+                      'Error parsing meta tag attribute "%s": %s.'
+                      % (token, detail), nodes.literal_block(line, line),
+                      line=self.state_machine.abs_line_number())
+                return msg, blank_finish
+        self.document.note_pending(pending)
+        return pending, blank_finish
+
+
+class Meta(Directive):
+
+    has_content = True
+
+    SMkwargs = {'state_classes': (MetaBody,)}
+
+    def run(self):
+        self.assert_has_content()
+        node = nodes.Element()
+        new_line_offset, blank_finish = self.state.nested_list_parse(
+            self.content, self.content_offset, node,
+            initial_state='MetaBody', blank_finish=1,
+            state_machine_kwargs=self.SMkwargs)
+        if (new_line_offset - self.content_offset) != len(self.content):
+            # incomplete parse of block?
+            error = self.state_machine.reporter.error(
+                'Invalid meta directive.',
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            node += error
+        return node.children
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,160 @@
+# $Id: images.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for figures and simple images.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives, states
+from docutils.nodes import fully_normalize_name, whitespace_normalize_name
+from docutils.parsers.rst.roles import set_classes
+
+try:
+    import Image as PIL                        # PIL
+except ImportError:
+    PIL = None
+
+
+class Image(Directive):
+
+    align_h_values = ('left', 'center', 'right')
+    align_v_values = ('top', 'middle', 'bottom')
+    align_values = align_v_values + align_h_values
+
+    def align(argument):
+        # This is not callable as self.align.  We cannot make it a
+        # staticmethod because we're saving an unbound method in
+        # option_spec below.
+        return directives.choice(argument, Image.align_values)
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'alt': directives.unchanged,
+                   'height': directives.length_or_unitless,
+                   'width': directives.length_or_percentage_or_unitless,
+                   'scale': directives.nonnegative_int,
+                   'align': align,
+                   'target': directives.unchanged_required,
+                   'class': directives.class_option}
+
+    def run(self):
+        if self.options.has_key('align'):
+            if isinstance(self.state, states.SubstitutionDef):
+                # Check for align_v_values.
+                if self.options['align'] not in self.align_v_values:
+                    raise self.error(
+                        'Error in "%s" directive: "%s" is not a valid value '
+                        'for the "align" option within a substitution '
+                        'definition.  Valid values for "align" are: "%s".'
+                        % (self.name, self.options['align'],
+                           '", "'.join(self.align_v_values)))
+            elif self.options['align'] not in self.align_h_values:
+                raise self.error(
+                    'Error in "%s" directive: "%s" is not a valid value for '
+                    'the "align" option.  Valid values for "align" are: "%s".'
+                    % (self.name, self.options['align'],
+                       '", "'.join(self.align_h_values)))
+        messages = []
+        reference = directives.uri(self.arguments[0])
+        self.options['uri'] = reference
+        reference_node = None
+        if self.options.has_key('target'):
+            block = states.escape2null(
+                self.options['target']).splitlines()
+            block = [line for line in block]
+            target_type, data = self.state.parse_target(
+                block, self.block_text, self.lineno)
+            if target_type == 'refuri':
+                reference_node = nodes.reference(refuri=data)
+            elif target_type == 'refname':
+                reference_node = nodes.reference(
+                    refname=fully_normalize_name(data),
+                    name=whitespace_normalize_name(data))
+                reference_node.indirect_reference_name = data
+                self.state.document.note_refname(reference_node)
+            else:                           # malformed target
+                messages.append(data)       # data is a system message
+            del self.options['target']
+        set_classes(self.options)
+        image_node = nodes.image(self.block_text, **self.options)
+        if reference_node:
+            reference_node += image_node
+            return messages + [reference_node]
+        else:
+            return messages + [image_node]
+
+
+class Figure(Image):
+
+    def align(argument):
+        return directives.choice(argument, Figure.align_h_values)
+
+    def figwidth_value(argument):
+        if argument.lower() == 'image':
+            return 'image'
+        else:
+            return directives.nonnegative_int(argument)
+
+    option_spec = Image.option_spec.copy()
+    option_spec['figwidth'] = figwidth_value
+    option_spec['figclass'] = directives.class_option
+    option_spec['align'] = align
+    has_content = True
+
+    def run(self):
+        figwidth = self.options.get('figwidth')
+        if figwidth:
+            del self.options['figwidth']
+        figclasses = self.options.get('figclass')
+        if figclasses:
+            del self.options['figclass']
+        align = self.options.get('align')
+        if align:
+            del self.options['align']
+        (image_node,) = Image.run(self)
+        if isinstance(image_node, nodes.system_message):
+            return [image_node]
+        figure_node = nodes.figure('', image_node)
+        if figwidth == 'image':
+            if PIL and self.state.document.settings.file_insertion_enabled:
+                # PIL doesn't like Unicode paths:
+                try:
+                    i = PIL.open(str(image_node['uri']))
+                except (IOError, UnicodeError):
+                    pass
+                else:
+                    self.state.document.settings.record_dependencies.add(
+                        image_node['uri'])
+                    figure_node['width'] = i.size[0]
+        elif figwidth is not None:
+            figure_node['width'] = figwidth
+        if figclasses:
+            figure_node['classes'] += figclasses
+        if align:
+            figure_node['align'] = align
+        if self.content:
+            node = nodes.Element()          # anonymous container for parsing
+            self.state.nested_parse(self.content, self.content_offset, node)
+            first_node = node[0]
+            if isinstance(first_node, nodes.paragraph):
+                caption = nodes.caption(first_node.rawsource, '',
+                                        *first_node.children)
+                figure_node += caption
+            elif not (isinstance(first_node, nodes.comment)
+                      and len(first_node) == 0):
+                error = self.state_machine.reporter.error(
+                      'Figure caption must be a paragraph or empty comment.',
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                return [figure_node, error]
+            if len(node) > 1:
+                figure_node += nodes.legend('', *node[1:])
+        return [figure_node]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,462 @@
+# $Id: misc.py 5015 2007-03-12 20:25:40Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dethe Elza
+# Copyright: This module has been placed in the public domain.
+
+"""Miscellaneous directives."""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os.path
+import re
+import time
+from docutils import io, nodes, statemachine, utils
+from docutils.parsers.rst import Directive, convert_directive_function
+from docutils.parsers.rst import directives, roles, states
+from docutils.transforms import misc
+
+
+class Include(Directive):
+
+    """
+    Include content read from a separate source file.
+
+    Content may be parsed by the parser, or included as a literal
+    block.  The encoding of the included file can be specified.  Only
+    a part of the given file argument may be included by specifying
+    text to match before and/or after the text to be used.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'literal': directives.flag,
+                   'encoding': directives.encoding,
+                   'start-after': directives.unchanged_required,
+                   'end-before': directives.unchanged_required}
+
+    standard_include_path = os.path.join(os.path.dirname(states.__file__),
+                                         'include')
+
+    def run(self):
+        """Include a reST file as part of the content of this reST file."""
+        if not self.state.document.settings.file_insertion_enabled:
+            raise self.warning('"%s" directive disabled.' % self.name)
+        source = self.state_machine.input_lines.source(
+            self.lineno - self.state_machine.input_offset - 1)
+        source_dir = os.path.dirname(os.path.abspath(source))
+        path = directives.path(self.arguments[0])
+        if path.startswith('<') and path.endswith('>'):
+            path = os.path.join(self.standard_include_path, path[1:-1])
+        path = os.path.normpath(os.path.join(source_dir, path))
+        path = utils.relative_path(None, path)
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        try:
+            self.state.document.settings.record_dependencies.add(path)
+            include_file = io.FileInput(
+                source_path=path, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler),
+                handle_io_errors=None)
+        except IOError, error:
+            raise self.severe('Problems with "%s" directive path:\n%s: %s.'
+                              % (self.name, error.__class__.__name__, error))
+        try:
+            include_text = include_file.read()
+        except UnicodeError, error:
+            raise self.severe(
+                'Problem with "%s" directive:\n%s: %s'
+                % (self.name, error.__class__.__name__, error))
+        # start-after/end-before: no restrictions on newlines in match-text,
+        # and no restrictions on matching inside lines vs. line boundaries
+        after_text = self.options.get('start-after', None)
+        if after_text:
+            # skip content in include_text before *and incl.* a matching text
+            after_index = include_text.find(after_text)
+            if after_index < 0:
+                raise self.severe('Problem with "start-after" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            include_text = include_text[after_index + len(after_text):]
+        before_text = self.options.get('end-before', None)
+        if before_text:
+            # skip content in include_text after *and incl.* a matching text
+            before_index = include_text.find(before_text)
+            if before_index < 0:
+                raise self.severe('Problem with "end-before" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            include_text = include_text[:before_index]
+        if self.options.has_key('literal'):
+            literal_block = nodes.literal_block(include_text, include_text,
+                                                source=path)
+            literal_block.line = 1
+            return [literal_block]
+        else:
+            include_lines = statemachine.string2lines(include_text,
+                                                      convert_whitespace=1)
+            self.state_machine.insert_input(include_lines, path)
+            return []
+
+
+class Raw(Directive):
+
+    """
+    Pass through content unchanged
+
+    Content is included in output based on type argument
+
+    Content may be included inline (content section of directive) or
+    imported from a file or url.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding}
+    has_content = True
+
+    def run(self):
+        if (not self.state.document.settings.raw_enabled
+            or (not self.state.document.settings.file_insertion_enabled
+                and (self.options.has_key('file')
+                     or self.options.has_key('url')))):
+            raise self.warning('"%s" directive disabled.' % self.name)
+        attributes = {'format': ' '.join(self.arguments[0].lower().split())}
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        if self.content:
+            if self.options.has_key('file') or self.options.has_key('url'):
+                raise self.error(
+                    '"%s" directive may not both specify an external file '
+                    'and have content.' % self.name)
+            text = '\n'.join(self.content)
+        elif self.options.has_key('file'):
+            if self.options.has_key('url'):
+                raise self.error(
+                    'The "file" and "url" options may not be simultaneously '
+                    'specified for the "%s" directive.' % self.name)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            path = os.path.normpath(os.path.join(source_dir,
+                                                 self.options['file']))
+            path = utils.relative_path(None, path)
+            try:
+                self.state.document.settings.record_dependencies.add(path)
+                raw_file = io.FileInput(
+                    source_path=path, encoding=encoding,
+                    error_handler=(self.state.document.settings.\
+                                   input_encoding_error_handler),
+                    handle_io_errors=None)
+            except IOError, error:
+                raise self.severe('Problems with "%s" directive path:\n%s.'
+                                  % (self.name, error))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(
+                    'Problem with "%s" directive:\n%s: %s'
+                    % (self.name, error.__class__.__name__, error))
+            attributes['source'] = path
+        elif self.options.has_key('url'):
+            source = self.options['url']
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            try:
+                raw_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError), error:
+                raise self.severe(
+                    'Problems with "%s" directive URL "%s":\n%s.'
+                    % (self.name, self.options['url'], error))
+            raw_file = io.StringInput(
+                source=raw_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(
+                    'Problem with "%s" directive:\n%s: %s'
+                    % (self.name, error.__class__.__name__, error))
+            attributes['source'] = source
+        else:
+            # This will always fail because there is no content.
+            self.assert_has_content()
+        raw_node = nodes.raw('', text, **attributes)
+        return [raw_node]
+
+
+class Replace(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        element = nodes.Element(text)
+        self.state.nested_parse(self.content, self.content_offset,
+                                element)
+        if ( len(element) != 1
+             or not isinstance(element[0], nodes.paragraph)):
+            messages = []
+            for node in element:
+                if isinstance(node, nodes.system_message):
+                    node['backrefs'] = []
+                    messages.append(node)
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive: may contain a single paragraph '
+                'only.' % (self.name), line=self.lineno)
+            messages.append(error)
+            return messages
+        else:
+            return element[0].children
+
+
+class Unicode(Directive):
+
+    r"""
+    Convert Unicode character codes (numbers) to characters.  Codes may be
+    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
+    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
+    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
+    ignored.  Spaces are ignored, and any other text remains as-is.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'trim': directives.flag,
+                   'ltrim': directives.flag,
+                   'rtrim': directives.flag}
+
+    comment_pattern = re.compile(r'( |\n|^)\.\. ')
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        substitution_definition = self.state_machine.node
+        if self.options.has_key('trim'):
+            substitution_definition.attributes['ltrim'] = 1
+            substitution_definition.attributes['rtrim'] = 1
+        if self.options.has_key('ltrim'):
+            substitution_definition.attributes['ltrim'] = 1
+        if self.options.has_key('rtrim'):
+            substitution_definition.attributes['rtrim'] = 1
+        codes = self.comment_pattern.split(self.arguments[0])[0].split()
+        element = nodes.Element()
+        for code in codes:
+            try:
+                decoded = directives.unicode_code(code)
+            except ValueError, err:
+                raise self.error(
+                    'Invalid character code: %s\n%s: %s'
+                    % (code, err.__class__.__name__, err))
+            element += nodes.Text(decoded)
+        return element.children
+
+
+class Class(Directive):
+
+    """
+    Set a "class" attribute on the directive content or the next element.
+    When applied to the next element, a "pending" element is inserted, and a
+    transform does the work later.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        try:
+            class_value = directives.class_option(self.arguments[0])
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node_list = []
+        if self.content:
+            container = nodes.Element()
+            self.state.nested_parse(self.content, self.content_offset,
+                                    container)
+            for node in container:
+                node['classes'].extend(class_value)
+            node_list.extend(container.children)
+        else:
+            pending = nodes.pending(
+                misc.ClassAttribute,
+                {'class': class_value, 'directive': self.name},
+                self.block_text)
+            self.state_machine.document.note_pending(pending)
+            node_list.append(pending)
+        return node_list
+
+
+class Role(Directive):
+
+    has_content = True
+
+    argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
+                                  % ((states.Inliner.simplename,) * 2))
+
+    def run(self):
+        """Dynamically create and register a custom interpreted text role."""
+        if self.content_offset > self.lineno or not self.content:
+            raise self.error('"%s" directive requires arguments on the first '
+                             'line.' % self.name)
+        args = self.content[0]
+        match = self.argument_pattern.match(args)
+        if not match:
+            raise self.error('"%s" directive arguments not valid role names: '
+                             '"%s".' % (self.name, args))
+        new_role_name = match.group(1)
+        base_role_name = match.group(3)
+        messages = []
+        if base_role_name:
+            base_role, messages = roles.role(
+                base_role_name, self.state_machine.language, self.lineno,
+                self.state.reporter)
+            if base_role is None:
+                error = self.state.reporter.error(
+                    'Unknown interpreted text role "%s".' % base_role_name,
+                    nodes.literal_block(self.block_text, self.block_text),
+                    line=self.lineno)
+                return messages + [error]
+        else:
+            base_role = roles.generic_custom_role
+        assert not hasattr(base_role, 'arguments'), (
+            'Supplemental directive arguments for "%s" directive not '
+            'supported (specified by "%r" role).' % (self.name, base_role))
+        try:
+            converted_role = convert_directive_function(base_role)
+            (arguments, options, content, content_offset) = (
+                self.state.parse_directive_block(
+                self.content[1:], self.content_offset, converted_role,
+                option_presets={}))
+        except states.MarkupError, detail:
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive:\n%s.' % (self.name, detail),
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        if not options.has_key('class'):
+            try:
+                options['class'] = directives.class_option(new_role_name)
+            except ValueError, detail:
+                error = self.state_machine.reporter.error(
+                    'Invalid argument for "%s" directive:\n%s.'
+                    % (self.name, detail), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return messages + [error]
+        role = roles.CustomRole(new_role_name, base_role, options, content)
+        roles.register_local_role(new_role_name, role)
+        return messages
+
+
+class DefaultRole(Directive):
+
+    """Set the default interpreted text role."""
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = False
+
+    def run(self):
+        if not self.arguments:
+            if roles._roles.has_key(''):
+                # restore the "default" default role
+                del roles._roles['']
+            return []
+        role_name = self.arguments[0]
+        role, messages = roles.role(role_name, self.state_machine.language,
+                                    self.lineno, self.state.reporter)
+        if role is None:
+            error = self.state.reporter.error(
+                'Unknown interpreted text role "%s".' % role_name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        roles._roles[''] = role
+        # @@@ should this be local to the document, not the parser?
+        return messages
+
+
+class Title(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+
+    def run(self):
+        self.state_machine.document['title'] = self.arguments[0]
+        return []
+
+
+class Date(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        format = '\n'.join(self.content) or '%Y-%m-%d'
+        text = time.strftime(format)
+        return [nodes.Text(text)]
+
+
+class TestDirective(Directive):
+
+    """This directive is useful only for testing purposes."""
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'option': directives.unchanged_required}
+    has_content = True
+
+    def run(self):
+        if self.content:
+            text = '\n'.join(self.content)
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content:' % (self.name, self.arguments, self.options),
+                nodes.literal_block(text, text), line=self.lineno)
+        else:
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content: None' % (self.name, self.arguments, self.options),
+                line=self.lineno)
+        return [info]
+
+# Old-style, functional definition:
+#
+# def directive_test_function(name, arguments, options, content, lineno,
+#                             content_offset, block_text, state, state_machine):
+#     """This directive is useful only for testing purposes."""
+#     if content:
+#         text = '\n'.join(content)
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content:' % (name, arguments, options),
+#             nodes.literal_block(text, text), line=lineno)
+#     else:
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content: None' % (name, arguments, options), line=lineno)
+#     return [info]
+#
+# directive_test_function.arguments = (0, 1, 1)
+# directive_test_function.options = {'option': directives.unchanged_required}
+# directive_test_function.content = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,123 @@
+# $Id: parts.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, languages
+from docutils.transforms import parts
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class Contents(Directive):
+
+    """
+    Table of contents.
+
+    The table of contents is generated in two passes: initial parse and
+    transform.  During the initial parse, a 'pending' element is generated
+    which acts as a placeholder, storing the TOC title and any options
+    internally.  At a later stage in the processing, the 'pending' element is
+    replaced by a 'topic' element, a title and the table of contents proper.
+    """
+
+    backlinks_values = ('top', 'entry', 'none')
+
+    def backlinks(arg):
+        value = directives.choice(arg, Contents.backlinks_values)
+        if value == 'none':
+            return None
+        else:
+            return value
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'depth': directives.nonnegative_int,
+                   'local': directives.flag,
+                   'backlinks': backlinks,
+                   'class': directives.class_option}
+    
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        document = self.state_machine.document
+        language = languages.get_language(document.settings.language_code)
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            messages = []
+            if self.options.has_key('local'):
+                title = None
+            else:
+                title = nodes.title('', language.labels['contents'])
+        topic = nodes.topic(classes=['contents'])
+        topic['classes'] += self.options.get('class', [])
+        if self.options.has_key('local'):
+            topic['classes'].append('local')
+        if title:
+            name = title.astext()
+            topic += title
+        else:
+            name = language.labels['contents']
+        name = nodes.fully_normalize_name(name)
+        if not document.has_name(name):
+            topic['names'].append(name)
+        document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents, rawsource=self.block_text)
+        pending.details.update(self.options)
+        document.note_pending(pending)
+        topic += pending
+        return [topic] + messages
+
+
+class Sectnum(Directive):
+
+    """Automatic section numbering."""
+
+    option_spec = {'depth': int,
+                   'start': int,
+                   'prefix': directives.unchanged_required,
+                   'suffix': directives.unchanged_required}
+
+    def run(self):
+        pending = nodes.pending(parts.SectNum)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        return [pending]
+
+
+class Header(Directive):
+
+    """Contents of document header."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        header = self.state_machine.document.get_decoration().get_header()
+        self.state.nested_parse(self.content, self.content_offset, header)
+        return []
+
+
+class Footer(Directive):
+
+    """Contents of document footer."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        footer = self.state_machine.document.get_decoration().get_footer()
+        self.state.nested_parse(self.content, self.content_offset, footer)
+        return []
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+# $Id: references.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for references and targets.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import references
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class TargetNotes(Directive):
+
+    """Target footnote generation."""
+
+    option_spec = {'class': directives.class_option}
+
+    def run(self):
+        pending = nodes.pending(references.TargetNotes)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        nodelist = [pending]
+        return nodelist
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,444 @@
+# $Id: tables.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; David Priest
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for table elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os.path
+from docutils import io, nodes, statemachine, utils
+from docutils.utils import SystemMessagePropagation
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+try:
+    import csv                          # new in Python 2.3
+except ImportError:
+    csv = None
+
+
+class Table(Directive):
+
+    """
+    Generic table base class.
+    """
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def make_title(self):
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            title = None
+            messages = []
+        return title, messages
+
+    def process_header_option(self):
+        source = self.state_machine.get_source(self.lineno - 1)
+        table_head = []
+        max_header_cols = 0
+        if self.options.has_key('header'):   # separate table header in option
+            rows, max_header_cols = self.parse_csv_data_into_rows(
+                self.options['header'].split('\n'), self.HeaderDialect(),
+                source)
+            table_head.extend(rows)
+        return table_head, max_header_cols
+
+    def check_table_dimensions(self, rows, header_rows, stub_columns):
+        if len(rows) < header_rows:
+            error = self.state_machine.reporter.error(
+                '%s header row(s) specified but only %s row(s) of data '
+                'supplied ("%s" directive).'
+                % (header_rows, len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        if len(rows) == header_rows > 0:
+            error = self.state_machine.reporter.error(
+                'Insufficient data supplied (%s row(s)); no data remaining '
+                'for table body, required by "%s" directive.'
+                % (len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        for row in rows:
+            if len(row) < stub_columns:
+                error = self.state_machine.reporter.error(
+                    '%s stub column(s) specified but only %s columns(s) of '
+                    'data supplied ("%s" directive).' %
+                    (stub_columns, len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            if len(row) == stub_columns > 0:
+                error = self.state_machine.reporter.error(
+                    'Insufficient data supplied (%s columns(s)); no data remaining '
+                    'for table body, required by "%s" directive.'
+                    % (len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+
+    def get_column_widths(self, max_cols):
+        if self.options.has_key('widths'):
+            col_widths = self.options['widths']
+            if len(col_widths) != max_cols:
+                error = self.state_machine.reporter.error(
+                    '"%s" widths do not match the number of columns in table '
+                    '(%s).' % (self.name, max_cols), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+        elif max_cols:
+            col_widths = [100 // max_cols] * max_cols
+        else:
+            error = self.state_machine.reporter.error(
+                'No table data detected in CSV file.', nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return col_widths
+
+    def extend_short_rows_with_empty_cells(self, columns, parts):
+        for part in parts:
+            for row in part:
+                if len(row) < columns:
+                    row.extend([(0, 0, 0, [])] * (columns - len(row)))
+
+
+class RSTTable(Table):
+
+    def run(self):
+        if not self.content:
+            warning = self.state_machine.reporter.warning(
+                'Content block expected for the "%s" directive; none found.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [warning]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        if len(node) != 1 or not isinstance(node[0], nodes.table):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: exactly '
+                'one table expected.' % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table_node = node[0]
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+
+class CSVTable(Table):
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'header': directives.unchanged,
+                   'widths': directives.positive_int_list,
+                   'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding,
+                   'class': directives.class_option,
+                   # field delimiter char
+                   'delim': directives.single_char_or_whitespace_or_unicode,
+                   # treat whitespace after delimiter as significant
+                   'keepspace': directives.flag,
+                   # text field quote/unquote char:
+                   'quote': directives.single_char_or_unicode,
+                   # char used to escape delim & quote as-needed:
+                   'escape': directives.single_char_or_unicode,}
+
+    if csv:
+
+        class DocutilsDialect(csv.Dialect):
+
+            """CSV dialect for `csv_table` directive."""
+
+            delimiter = ','
+            quotechar = '"'
+            doublequote = True
+            skipinitialspace = True
+            lineterminator = '\n'
+            quoting = csv.QUOTE_MINIMAL
+
+            def __init__(self, options):
+                if options.has_key('delim'):
+                    self.delimiter = str(options['delim'])
+                if options.has_key('keepspace'):
+                    self.skipinitialspace = False
+                if options.has_key('quote'):
+                    self.quotechar = str(options['quote'])
+                if options.has_key('escape'):
+                    self.doublequote = False
+                    self.escapechar = str(options['escape'])
+                csv.Dialect.__init__(self)
+
+
+        class HeaderDialect(csv.Dialect):
+
+            """CSV dialect to use for the "header" option data."""
+
+            delimiter = ','
+            quotechar = '"'
+            escapechar = '\\'
+            doublequote = False
+            skipinitialspace = True
+            lineterminator = '\n'
+            quoting = csv.QUOTE_MINIMAL
+
+    def check_requirements(self):
+        if not csv:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is not compatible with this version of '
+                'Python (%s).  Requires the "csv" module, new in Python 2.3.'
+                % (self.name, sys.version.split()[0]), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+
+    def run(self):
+        try:
+            if (not self.state.document.settings.file_insertion_enabled
+                and (self.options.has_key('file')
+                     or self.options.has_key('url'))):
+                warning = self.state_machine.reporter.warning(
+                    'File and URL access deactivated; ignoring "%s" '
+                    'directive.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return [warning]
+            self.check_requirements()
+            title, messages = self.make_title()
+            csv_data, source = self.get_csv_data()
+            table_head, max_header_cols = self.process_header_option()
+            rows, max_cols = self.parse_csv_data_into_rows(
+                csv_data, self.DocutilsDialect(self.options), source)
+            max_cols = max(max_cols, max_header_cols)
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(rows, header_rows, stub_columns)
+            table_head.extend(rows[:header_rows])
+            table_body = rows[header_rows:]
+            col_widths = self.get_column_widths(max_cols)
+            self.extend_short_rows_with_empty_cells(max_cols,
+                                                    (table_head, table_body))
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        except csv.Error, detail:
+            error = self.state_machine.reporter.error(
+                'Error with CSV data in "%s" directive:\n%s'
+                % (self.name, detail), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table = (col_widths, table_head, table_body)
+        table_node = self.state.build_table(table, self.content_offset,
+                                            stub_columns)
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def get_csv_data(self):
+        """
+        Get CSV data from the directive content, from an external
+        file, or from a URL reference.
+        """
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        if self.content:
+            # CSV data is from directive content.
+            if self.options.has_key('file') or self.options.has_key('url'):
+                error = self.state_machine.reporter.error(
+                    '"%s" directive may not both specify an external file and'
+                    ' have content.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source = self.content.source(0)
+            csv_data = self.content
+        elif self.options.has_key('file'):
+            # CSV data is from an external file.
+            if self.options.has_key('url'):
+                error = self.state_machine.reporter.error(
+                      'The "file" and "url" options may not be simultaneously'
+                      ' specified for the "%s" directive.' % self.name,
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            source = os.path.normpath(os.path.join(source_dir,
+                                                   self.options['file']))
+            source = utils.relative_path(None, source)
+            try:
+                self.state.document.settings.record_dependencies.add(source)
+                csv_file = io.FileInput(
+                    source_path=source, encoding=encoding,
+                    error_handler=(self.state.document.settings.\
+                                   input_encoding_error_handler),
+                    handle_io_errors=None)
+                csv_data = csv_file.read().splitlines()
+            except IOError, error:
+                severe = self.state_machine.reporter.severe(
+                    'Problems with "%s" directive path:\n%s.'
+                    % (self.name, error), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(severe)
+        elif self.options.has_key('url'):
+            # CSV data is from a URL.
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            source = self.options['url']
+            try:
+                csv_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError, ValueError), error:
+                severe = self.state_machine.reporter.severe(
+                      'Problems with "%s" directive URL "%s":\n%s.'
+                      % (self.name, self.options['url'], error),
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(severe)
+            csv_file = io.StringInput(
+                source=csv_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            csv_data = csv_file.read().splitlines()
+        else:
+            error = self.state_machine.reporter.warning(
+                'The "%s" directive requires content; none supplied.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return csv_data, source
+
+    def parse_csv_data_into_rows(self, csv_data, dialect, source):
+        # csv.py doesn't do Unicode; encode temporarily as UTF-8
+        csv_reader = csv.reader([(line.encode('utf-8') + '\n')
+                                for line in csv_data],
+                                dialect=dialect)
+        rows = []
+        max_cols = 0
+        for row in csv_reader:
+            row_data = []
+            for cell in row:
+                # decode UTF-8 back to Unicode
+                cell_text = unicode(cell, 'utf-8')
+                cell_data = (0, 0, 0, statemachine.StringList(
+                    cell_text.splitlines(), source=source))
+                row_data.append(cell_data)
+            rows.append(row_data)
+            max_cols = max(max_cols, len(row))
+        return rows, max_cols
+
+
+class ListTable(Table):
+
+    """
+    Implement tables whose data is encoded as a uniform two-level bullet list.
+    For further ideas, see
+    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
+    """ 
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'widths': directives.positive_int_list,
+                   'class': directives.class_option}
+
+    def run(self):
+        if not self.content:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is empty; content required.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return [error]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        try:
+            num_cols, col_widths = self.check_list_content(node)
+            table_data = [[item.children for item in row_list[0]]
+                          for row_list in node[0]]
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(table_data, header_rows, stub_columns)
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        table_node = self.build_table_from_list(table_data, col_widths,
+                                                header_rows, stub_columns)
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def check_list_content(self, node):
+        if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: '
+                'exactly one bullet list expected.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            raise SystemMessagePropagation(error)
+        list_node = node[0]
+        # Check for a uniform two-level bullet list:
+        for item_index in range(len(list_node)):
+            item = list_node[item_index]
+            if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
+                error = self.state_machine.reporter.error(
+                    'Error parsing content block for the "%s" directive: '
+                    'two-level bullet list expected, but row %s does not '
+                    'contain a second-level bullet list.'
+                    % (self.name, item_index + 1), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            elif item_index:
+                # ATTN pychecker users: num_cols is guaranteed to be set in the
+                # "else" clause below for item_index==0, before this branch is
+                # triggered.
+                if len(item[0]) != num_cols:
+                    error = self.state_machine.reporter.error(
+                        'Error parsing content block for the "%s" directive: '
+                        'uniform two-level bullet list expected, but row %s '
+                        'does not contain the same number of items as row 1 '
+                        '(%s vs %s).'
+                        % (self.name, item_index + 1, len(item[0]), num_cols),
+                        nodes.literal_block(self.block_text, self.block_text),
+                        line=self.lineno)
+                    raise SystemMessagePropagation(error)
+            else:
+                num_cols = len(item[0])
+        col_widths = self.get_column_widths(num_cols)
+        return num_cols, col_widths
+
+    def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns):
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(col_widths))
+        table += tgroup
+        for col_width in col_widths:
+            colspec = nodes.colspec(colwidth=col_width)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        rows = []
+        for row in table_data:
+            row_node = nodes.row()
+            for cell in row:
+                entry = nodes.entry()
+                entry += cell
+                row_node += entry
+            rows.append(row_node)
+        if header_rows:
+            thead = nodes.thead()
+            thead.extend(rows[:header_rows])
+            tgroup += thead
+        tbody = nodes.tbody()
+        tbody.extend(rows[header_rows:])
+        tgroup += tbody
+        return table
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,17 @@
+============================================
+ ``docutils/parsers/rst/include`` Directory
+============================================
+
+This directory contains standard data files intended for inclusion in
+reStructuredText documents.  To access these files, use the "include"
+directive with the special syntax for standard "include" data files,
+angle brackets around the file name::
+
+    .. include:: <isonum.txt>
+
+See the documentation for the `"include" directive`__ and
+`reStructuredText Standard Substitution Definition Sets`__ for
+details.
+
+__ http://docutils.sf.net/docs/ref/rst/directives.html#include
+__ http://docutils.sf.net/docs/ref/rst/substitutions.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,162 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angzarr|  unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+.. |cirmid|   unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
+.. |cudarrl|  unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
+.. |cudarrr|  unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+.. |cularr|   unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |cularrp|  unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+.. |curarr|   unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |curarrm|  unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
+.. |Darr|     unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr2|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |ddarr|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
+.. |dfisht|   unicode:: U+0297F .. DOWN FISH TAIL
+.. |dHar|     unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |dharl|    unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |dharr|    unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |dlarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |drarr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |duarr|    unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |duhar|    unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
+.. |erarr|    unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |harrcir|  unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+.. |harrw|    unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |hoarr|    unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
+.. |imof|     unicode:: U+022B7 .. IMAGE OF
+.. |lAarr|    unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |Larr|     unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |larr2|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |larrbfs|  unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |larrfs|   unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
+.. |larrhk|   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |larrlp|   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |larrpl|   unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
+.. |larrsim|  unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
+.. |larrtl|   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |lAtail|   unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
+.. |latail|   unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
+.. |lBarr|    unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
+.. |lbarr|    unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
+.. |ldca|     unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+.. |ldrdhar|  unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
+.. |ldsh|     unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
+.. |lfisht|   unicode:: U+0297C .. LEFT FISH TAIL
+.. |lHar|     unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |lhard|    unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |lharu|    unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |lharul|   unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |llarr|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |llhard|   unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |loarr|    unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
+.. |lrarr|    unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrarr2|   unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrhar|    unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhar2|   unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhard|   unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |lsh|      unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
+.. |luruhar|  unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+.. |Map|      unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
+.. |map|      unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |midcir|   unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
+.. |mumap|    unicode:: U+022B8 .. MULTIMAP
+.. |nearhk|   unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
+.. |neArr|    unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
+.. |nearr|    unicode:: U+02197 .. NORTH EAST ARROW
+.. |nesear|   unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |nhArr|    unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nharr|    unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nlArr|    unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nlarr|    unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nrArr|    unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrarr|    unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nrarrc|   unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
+.. |nrarrw|   unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
+.. |nvHarr|   unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvlArr|   unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvrArr|   unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nwarhk|   unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
+.. |nwArr|    unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
+.. |nwarr|    unicode:: U+02196 .. NORTH WEST ARROW
+.. |nwnear|   unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
+.. |olarr|    unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |orarr|    unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |origof|   unicode:: U+022B6 .. ORIGINAL OF
+.. |rAarr|    unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rarr|     unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |rarr2|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rarrap|   unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+.. |rarrbfs|  unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |rarrc|    unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
+.. |rarrfs|   unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
+.. |rarrhk|   unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |rarrlp|   unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |rarrpl|   unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
+.. |rarrsim|  unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+.. |Rarrtl|   unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+.. |rarrtl|   unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |rarrw|    unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |rAtail|   unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
+.. |ratail|   unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
+.. |RBarr|    unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |rBarr|    unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |rbarr|    unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |rdca|     unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+.. |rdldhar|  unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |rdsh|     unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
+.. |rfisht|   unicode:: U+0297D .. RIGHT FISH TAIL
+.. |rHar|     unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |rhard|    unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rharu|    unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rharul|   unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |rlarr|    unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlarr2|   unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlhar|    unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rlhar2|   unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |roarr|    unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
+.. |rrarr|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rsh|      unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |ruluhar|  unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+.. |searhk|   unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |seArr|    unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
+.. |searr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |seswar|   unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |simrarr|  unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+.. |slarr|    unicode:: U+02190 .. LEFTWARDS ARROW
+.. |srarr|    unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |swarhk|   unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |swArr|    unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
+.. |swarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |swnwar|   unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
+.. |Uarr|     unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr2|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+.. |udarr|    unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |udhar|    unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |ufisht|   unicode:: U+0297E .. UP FISH TAIL
+.. |uHar|     unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |uharl|    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |uharr|    unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |uuarr|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |vArr|     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |varr|     unicode:: U+02195 .. UP DOWN ARROW
+.. |xhArr|    unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |xharr|    unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |xlArr|    unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |xlarr|    unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |xmap|     unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |xrArr|    unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |xrarr|    unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |zigrarr|  unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,126 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ac|       unicode:: U+0223E .. INVERTED LAZY S
+.. |acE|      unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
+.. |amalg|    unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
+.. |barvee|   unicode:: U+022BD .. NOR
+.. |Barwed|   unicode:: U+02306 .. PERSPECTIVE
+.. |barwed|   unicode:: U+02305 .. PROJECTIVE
+.. |bsolb|    unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
+.. |Cap|      unicode:: U+022D2 .. DOUBLE INTERSECTION
+.. |capand|   unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
+.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
+.. |capcap|   unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+.. |capcup|   unicode:: U+02A47 .. INTERSECTION ABOVE UNION
+.. |capdot|   unicode:: U+02A40 .. INTERSECTION WITH DOT
+.. |caps|     unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
+.. |ccaps|    unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
+.. |ccups|    unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
+.. |ccupssm|  unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+.. |coprod|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Cup|      unicode:: U+022D3 .. DOUBLE UNION
+.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
+.. |cupcap|   unicode:: U+02A46 .. UNION ABOVE INTERSECTION
+.. |cupcup|   unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
+.. |cupdot|   unicode:: U+0228D .. MULTISET MULTIPLICATION
+.. |cupor|    unicode:: U+02A45 .. UNION WITH LOGICAL OR
+.. |cups|     unicode:: U+0222A U+0FE00 .. UNION with serifs
+.. |cuvee|    unicode:: U+022CE .. CURLY LOGICAL OR
+.. |cuwed|    unicode:: U+022CF .. CURLY LOGICAL AND
+.. |Dagger|   unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger|   unicode:: U+02020 .. DAGGER
+.. |diam|     unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |divonx|   unicode:: U+022C7 .. DIVISION TIMES
+.. |eplus|    unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
+.. |hercon|   unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
+.. |intcal|   unicode:: U+022BA .. INTERCALATE
+.. |iprod|    unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |loplus|   unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
+.. |lotimes|  unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+.. |lthree|   unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |ltimes|   unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |midast|   unicode:: U+0002A .. ASTERISK
+.. |minusb|   unicode:: U+0229F .. SQUARED MINUS
+.. |minusd|   unicode:: U+02238 .. DOT MINUS
+.. |minusdu|  unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
+.. |ncap|     unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
+.. |ncup|     unicode:: U+02A42 .. UNION WITH OVERBAR
+.. |oast|     unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |ocir|     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |odash|    unicode:: U+0229D .. CIRCLED DASH
+.. |odiv|     unicode:: U+02A38 .. CIRCLED DIVISION SIGN
+.. |odot|     unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |odsold|   unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+.. |ofcir|    unicode:: U+029BF .. CIRCLED BULLET
+.. |ogt|      unicode:: U+029C1 .. CIRCLED GREATER-THAN
+.. |ohbar|    unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
+.. |olcir|    unicode:: U+029BE .. CIRCLED WHITE BULLET
+.. |olt|      unicode:: U+029C0 .. CIRCLED LESS-THAN
+.. |omid|     unicode:: U+029B6 .. CIRCLED VERTICAL BAR
+.. |ominus|   unicode:: U+02296 .. CIRCLED MINUS
+.. |opar|     unicode:: U+029B7 .. CIRCLED PARALLEL
+.. |operp|    unicode:: U+029B9 .. CIRCLED PERPENDICULAR
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |osol|     unicode:: U+02298 .. CIRCLED DIVISION SLASH
+.. |Otimes|   unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+.. |ovbar|    unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
+.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+.. |plusb|    unicode:: U+0229E .. SQUARED PLUS
+.. |pluscir|  unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
+.. |plusdo|   unicode:: U+02214 .. DOT PLUS
+.. |plusdu|   unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
+.. |pluse|    unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
+.. |plussim|  unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
+.. |plustwo|  unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |race|     unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
+.. |roplus|   unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
+.. |rotimes|  unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+.. |rthree|   unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |rtimes|   unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |sdotb|    unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |setmn|    unicode:: U+02216 .. SET MINUS
+.. |simplus|  unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
+.. |smashp|   unicode:: U+02A33 .. SMASH PRODUCT
+.. |solb|     unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
+.. |sqcap|    unicode:: U+02293 .. SQUARE CAP
+.. |sqcaps|   unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
+.. |sqcup|    unicode:: U+02294 .. SQUARE CUP
+.. |sqcups|   unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
+.. |ssetmn|   unicode:: U+02216 .. SET MINUS
+.. |sstarf|   unicode:: U+022C6 .. STAR OPERATOR
+.. |subdot|   unicode:: U+02ABD .. SUBSET WITH DOT
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |supdot|   unicode:: U+02ABE .. SUPERSET WITH DOT
+.. |timesb|   unicode:: U+022A0 .. SQUARED TIMES
+.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
+.. |timesd|   unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |tridot|   unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
+.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
+.. |triplus|  unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
+.. |trisb|    unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
+.. |tritime|  unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
+.. |uplus|    unicode:: U+0228E .. MULTISET UNION
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |wedbar|   unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
+.. |wreath|   unicode:: U+02240 .. WREATH PRODUCT
+.. |xcap|     unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |xcirc|    unicode:: U+025EF .. LARGE CIRCLE
+.. |xcup|     unicode:: U+022C3 .. N-ARY UNION
+.. |xdtri|    unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |xodot|    unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |xoplus|   unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |xotime|   unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |xsqcup|   unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |xuplus|   unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |xutri|    unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |xvee|     unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |xwedge|   unicode:: U+022C0 .. N-ARY LOGICAL AND
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |dlcorn|  unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |drcorn|  unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |gtlPar|  unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
+.. |langd|   unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
+.. |lbrke|   unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
+.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |lceil|   unicode:: U+02308 .. LEFT CEILING
+.. |lfloor|  unicode:: U+0230A .. LEFT FLOOR
+.. |lmoust|  unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lpargt|  unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
+.. |lparlt|  unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
+.. |ltrPar|  unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
+.. |rangd|   unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
+.. |rbrke|   unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
+.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |rceil|   unicode:: U+02309 .. RIGHT CEILING
+.. |rfloor|  unicode:: U+0230B .. RIGHT FLOOR
+.. |rmoust|  unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |rpargt|  unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
+.. |ulcorn|  unicode:: U+0231C .. TOP LEFT CORNER
+.. |urcorn|  unicode:: U+0231D .. TOP RIGHT CORNER
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |gnap|     unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gnE|      unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |gne|      unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gnsim|    unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
+.. |gvnE|     unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |lnap|     unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lnE|      unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |lne|      unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lnsim|    unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
+.. |lvnE|     unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |nap|      unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |napE|     unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
+.. |napid|    unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
+.. |ncong|    unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
+.. |nequiv|   unicode:: U+02262 .. NOT IDENTICAL TO
+.. |ngE|      unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |nge|      unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |nges|     unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |nGg|      unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
+.. |ngsim|    unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |nGt|      unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
+.. |ngt|      unicode:: U+0226F .. NOT GREATER-THAN
+.. |nGtv|     unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |nlE|      unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nle|      unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nles|     unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nLl|      unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
+.. |nlsim|    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |nLt|      unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
+.. |nlt|      unicode:: U+0226E .. NOT LESS-THAN
+.. |nltri|    unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |nltrie|   unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |nLtv|     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |nmid|     unicode:: U+02224 .. DOES NOT DIVIDE
+.. |npar|     unicode:: U+02226 .. NOT PARALLEL TO
+.. |npr|      unicode:: U+02280 .. DOES NOT PRECEDE
+.. |nprcue|   unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |npre|     unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nrtri|    unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |nrtrie|   unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nsc|      unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsccue|   unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |nsce|     unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsim|     unicode:: U+02241 .. NOT TILDE
+.. |nsime|    unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsmid|    unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nspar|    unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsqsube|  unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |nsqsupe|  unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |nsubE|    unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsube|    unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsup|     unicode:: U+02285 .. NOT A SUPERSET OF
+.. |nsupE|    unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |nsupe|    unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |ntgl|     unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |ntlg|     unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |nvap|     unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
+.. |nVDash|   unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |nVdash|   unicode:: U+022AE .. DOES NOT FORCE
+.. |nvDash|   unicode:: U+022AD .. NOT TRUE
+.. |nvdash|   unicode:: U+022AC .. DOES NOT PROVE
+.. |nvge|     unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
+.. |nvgt|     unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
+.. |nvle|     unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
+.. |nvlt|     unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
+.. |nvltrie|  unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
+.. |nvrtrie|  unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
+.. |nvsim|    unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
+.. |parsim|   unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
+.. |prnap|    unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |prnE|     unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |prnsim|   unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |rnmid|    unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+.. |scnap|    unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |scnE|     unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |scnsim|   unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |simne|    unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+.. |solbar|   unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
+.. |subnE|    unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |subne|    unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |supnE|    unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |supne|    unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |vnsub|    unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |vnsup|    unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |vsubnE|   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsubne|   unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupnE|   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupne|   unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |ange|     unicode:: U+029A4 .. ANGLE WITH UNDERBAR
+.. |angmsd|   unicode:: U+02221 .. MEASURED ANGLE
+.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+.. |angrtvb|  unicode:: U+022BE .. RIGHT ANGLE WITH ARC
+.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
+.. |bbrk|     unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+.. |bemptyv|  unicode:: U+029B0 .. REVERSED EMPTY SET
+.. |beth|     unicode:: U+02136 .. BET SYMBOL
+.. |boxbox|   unicode:: U+029C9 .. TWO JOINED SQUARES
+.. |bprime|   unicode:: U+02035 .. REVERSED PRIME
+.. |bsemi|    unicode:: U+0204F .. REVERSED SEMICOLON
+.. |cemptyv|  unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
+.. |cirE|     unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+.. |cirscir|  unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+.. |comp|     unicode:: U+02201 .. COMPLEMENT
+.. |daleth|   unicode:: U+02138 .. DALET SYMBOL
+.. |demptyv|  unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
+.. |ell|      unicode:: U+02113 .. SCRIPT SMALL L
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |emptyv|   unicode:: U+02205 .. EMPTY SET
+.. |gimel|    unicode:: U+02137 .. GIMEL SYMBOL
+.. |iiota|    unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |imath|    unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |inodot|   unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |jmath|    unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |jnodot|   unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
+.. |lltri|    unicode:: U+025FA .. LOWER LEFT TRIANGLE
+.. |lrtri|    unicode:: U+022BF .. RIGHT TRIANGLE
+.. |mho|      unicode:: U+02127 .. INVERTED OHM SIGN
+.. |nang|     unicode:: U+02220 U+020D2 .. ANGLE with vertical line
+.. |nexist|   unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |oS|       unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |planck|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |plankv|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
+.. |range|    unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |sbsol|    unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
+.. |tbrk|     unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |ultri|    unicode:: U+025F8 .. UPPER LEFT TRIANGLE
+.. |urtri|    unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
+.. |vprime|   unicode:: U+02032 .. PRIME
+.. |vzigzag|  unicode:: U+0299A .. VERTICAL ZIGZAG LINE
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,191 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |apE|      unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
+.. |ape|      unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |apid|     unicode:: U+0224B .. TRIPLE TILDE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Barv|     unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
+.. |bcong|    unicode:: U+0224C .. ALL EQUAL TO
+.. |bepsi|    unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |bowtie|   unicode:: U+022C8 .. BOWTIE
+.. |bsim|     unicode:: U+0223D .. REVERSED TILDE
+.. |bsime|    unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
+.. |bump|     unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpE|    unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
+.. |bumpe|    unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |cire|     unicode:: U+02257 .. RING EQUAL TO
+.. |Colon|    unicode:: U+02237 .. PROPORTION
+.. |Colone|   unicode:: U+02A74 .. DOUBLE COLON EQUAL
+.. |colone|   unicode:: U+02254 .. COLON EQUALS
+.. |congdot|  unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
+.. |csub|     unicode:: U+02ACF .. CLOSED SUBSET
+.. |csube|    unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
+.. |csup|     unicode:: U+02AD0 .. CLOSED SUPERSET
+.. |csupe|    unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
+.. |cuepr|    unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |cuesc|    unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |cupre|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Dashv|    unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |dashv|    unicode:: U+022A3 .. LEFT TACK
+.. |easter|   unicode:: U+02A6E .. EQUALS WITH ASTERISK
+.. |ecir|     unicode:: U+02256 .. RING IN EQUAL TO
+.. |ecolon|   unicode:: U+02255 .. EQUALS COLON
+.. |eDDot|    unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |eDot|     unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |efDot|    unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |eg|       unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
+.. |egs|      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |egsdot|   unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+.. |el|       unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
+.. |els|      unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |elsdot|   unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+.. |equest|   unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |equivDD|  unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
+.. |erDot|    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |esdot|    unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |Esim|     unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
+.. |esim|     unicode:: U+02242 .. MINUS TILDE
+.. |fork|     unicode:: U+022D4 .. PITCHFORK
+.. |forkv|    unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
+.. |frown|    unicode:: U+02322 .. FROWN
+.. |gap|      unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gE|       unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |gEl|      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gel|      unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |ges|      unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gescc|    unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |gesdot|   unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |gesdoto|  unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+.. |gesl|     unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
+.. |gesles|   unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+.. |Gg|       unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gl|       unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gla|      unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
+.. |glE|      unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+.. |glj|      unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
+.. |gsdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gsim|     unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gsime|    unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
+.. |gsiml|    unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+.. |Gt|       unicode:: U+0226B .. MUCH GREATER-THAN
+.. |gtcc|     unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
+.. |gtcir|    unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
+.. |gtdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtquest|  unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
+.. |gtrarr|   unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
+.. |homtht|   unicode:: U+0223B .. HOMOTHETIC
+.. |lap|      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lat|      unicode:: U+02AAB .. LARGER THAN
+.. |late|     unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
+.. |lates|    unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
+.. |ldot|     unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lE|       unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |lEg|      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |leg|      unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |les|      unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lescc|    unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |lesdot|   unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |lesdoto|  unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+.. |lesg|     unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
+.. |lesges|   unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+.. |lg|       unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lgE|      unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+.. |Ll|       unicode:: U+022D8 .. VERY MUCH LESS-THAN
+.. |lsim|     unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |lsime|    unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
+.. |lsimg|    unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+.. |Lt|       unicode:: U+0226A .. MUCH LESS-THAN
+.. |ltcc|     unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
+.. |ltcir|    unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
+.. |ltdot|    unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |ltlarr|   unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
+.. |ltquest|  unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
+.. |ltrie|    unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |mcomma|   unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
+.. |mDDot|    unicode:: U+0223A .. GEOMETRIC PROPORTION
+.. |mid|      unicode:: U+02223 .. DIVIDES
+.. |mlcp|     unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
+.. |models|   unicode:: U+022A7 .. MODELS
+.. |mstpos|   unicode:: U+0223E .. INVERTED LAZY S
+.. |Pr|       unicode:: U+02ABB .. DOUBLE PRECEDES
+.. |pr|       unicode:: U+0227A .. PRECEDES
+.. |prap|     unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |prcue|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |prE|      unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
+.. |pre|      unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |prsim|    unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |prurel|   unicode:: U+022B0 .. PRECEDES UNDER RELATION
+.. |ratio|    unicode:: U+02236 .. RATIO
+.. |rtrie|    unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+.. |samalg|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Sc|       unicode:: U+02ABC .. DOUBLE SUCCEEDS
+.. |sc|       unicode:: U+0227B .. SUCCEEDS
+.. |scap|     unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |sccue|    unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |scE|      unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
+.. |sce|      unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |scsim|    unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |sdote|    unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
+.. |sfrown|   unicode:: U+02322 .. FROWN
+.. |simg|     unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
+.. |simgE|    unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+.. |siml|     unicode:: U+02A9D .. SIMILAR OR LESS-THAN
+.. |simlE|    unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+.. |smid|     unicode:: U+02223 .. DIVIDES
+.. |smile|    unicode:: U+02323 .. SMILE
+.. |smt|      unicode:: U+02AAA .. SMALLER THAN
+.. |smte|     unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
+.. |smtes|    unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
+.. |spar|     unicode:: U+02225 .. PARALLEL TO
+.. |sqsub|    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsube|   unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsup|    unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupe|   unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |ssmile|   unicode:: U+02323 .. SMILE
+.. |Sub|      unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subE|     unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |subedot|  unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
+.. |submult|  unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
+.. |subplus|  unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
+.. |subrarr|  unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
+.. |subsim|   unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
+.. |subsub|   unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
+.. |subsup|   unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
+.. |Sup|      unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supdsub|  unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+.. |supE|     unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supedot|  unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+.. |suphsol|  unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
+.. |suphsub|  unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
+.. |suplarr|  unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
+.. |supmult|  unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
+.. |supplus|  unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
+.. |supsim|   unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
+.. |supsub|   unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
+.. |supsup|   unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
+.. |thkap|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thksim|   unicode:: U+0223C .. TILDE OPERATOR
+.. |topfork|  unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
+.. |trie|     unicode:: U+0225C .. DELTA EQUAL TO
+.. |twixt|    unicode:: U+0226C .. BETWEEN
+.. |Vbar|     unicode:: U+02AEB .. DOUBLE UP TACK
+.. |vBar|     unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
+.. |vBarv|    unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
+.. |VDash|    unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |Vdash|    unicode:: U+022A9 .. FORCES
+.. |vDash|    unicode:: U+022A8 .. TRUE
+.. |vdash|    unicode:: U+022A2 .. RIGHT TACK
+.. |Vdashl|   unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |vltri|    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vprop|    unicode:: U+0221D .. PROPORTIONAL TO
+.. |vrtri|    unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vvdash|   unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
+.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
+.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
+.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
+.. |boxH|  unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
+.. |boxh|  unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
+.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
+.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
+.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
+.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
+.. |boxV|  unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
+.. |boxv|  unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
+.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
+.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Acy|    unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
+.. |acy|    unicode:: U+00430 .. CYRILLIC SMALL LETTER A
+.. |Bcy|    unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
+.. |bcy|    unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
+.. |CHcy|   unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
+.. |chcy|   unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
+.. |Dcy|    unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
+.. |dcy|    unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
+.. |Ecy|    unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
+.. |ecy|    unicode:: U+0044D .. CYRILLIC SMALL LETTER E
+.. |Fcy|    unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
+.. |fcy|    unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
+.. |Gcy|    unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
+.. |gcy|    unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
+.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
+.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
+.. |Icy|    unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
+.. |icy|    unicode:: U+00438 .. CYRILLIC SMALL LETTER I
+.. |IEcy|   unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
+.. |iecy|   unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
+.. |IOcy|   unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
+.. |iocy|   unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
+.. |Jcy|    unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
+.. |jcy|    unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
+.. |Kcy|    unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
+.. |kcy|    unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
+.. |KHcy|   unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
+.. |khcy|   unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
+.. |Lcy|    unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
+.. |lcy|    unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
+.. |Mcy|    unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
+.. |mcy|    unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
+.. |Ncy|    unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
+.. |ncy|    unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
+.. |numero| unicode:: U+02116 .. NUMERO SIGN
+.. |Ocy|    unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
+.. |ocy|    unicode:: U+0043E .. CYRILLIC SMALL LETTER O
+.. |Pcy|    unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
+.. |pcy|    unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
+.. |Rcy|    unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
+.. |rcy|    unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
+.. |Scy|    unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
+.. |scy|    unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
+.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
+.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
+.. |SHcy|   unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
+.. |shcy|   unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
+.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
+.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
+.. |Tcy|    unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
+.. |tcy|    unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
+.. |TScy|   unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
+.. |tscy|   unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
+.. |Ucy|    unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
+.. |ucy|    unicode:: U+00443 .. CYRILLIC SMALL LETTER U
+.. |Vcy|    unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
+.. |vcy|    unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
+.. |YAcy|   unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
+.. |yacy|   unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
+.. |Ycy|    unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
+.. |ycy|    unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
+.. |YUcy|   unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
+.. |yucy|   unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
+.. |Zcy|    unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
+.. |zcy|    unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
+.. |ZHcy|   unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
+.. |zhcy|   unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |DJcy|   unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
+.. |djcy|   unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
+.. |DScy|   unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
+.. |dscy|   unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
+.. |DZcy|   unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
+.. |dzcy|   unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
+.. |GJcy|   unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
+.. |gjcy|   unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
+.. |Iukcy|  unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |iukcy|  unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
+.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
+.. |Jukcy|  unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
+.. |jukcy|  unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
+.. |KJcy|   unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
+.. |kjcy|   unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
+.. |LJcy|   unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
+.. |ljcy|   unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
+.. |NJcy|   unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
+.. |njcy|   unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
+.. |TSHcy|  unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
+.. |tshcy|  unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
+.. |Ubrcy|  unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
+.. |ubrcy|  unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
+.. |YIcy|   unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
+.. |yicy|   unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
+.. |breve| unicode:: U+002D8 .. BREVE
+.. |caron| unicode:: U+002C7 .. CARON
+.. |cedil| unicode:: U+000B8 .. CEDILLA
+.. |circ|  unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |die|   unicode:: U+000A8 .. DIAERESIS
+.. |dot|   unicode:: U+002D9 .. DOT ABOVE
+.. |grave| unicode:: U+00060 .. GRAVE ACCENT
+.. |macr|  unicode:: U+000AF .. MACRON
+.. |ogon|  unicode:: U+002DB .. OGONEK
+.. |ring|  unicode:: U+002DA .. RING ABOVE
+.. |tilde| unicode:: U+002DC .. SMALL TILDE
+.. |uml|   unicode:: U+000A8 .. DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Agr|  unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |agr|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |Bgr|  unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |bgr|  unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |Dgr|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |dgr|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Egr|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |egr|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |Ggr|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |ggr|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Igr|  unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |igr|  unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |Kgr|  unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kgr|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Lgr|  unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lgr|  unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |Mgr|  unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mgr|  unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |Ngr|  unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |ngr|  unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Ogr|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |ogr|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Pgr|  unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pgr|  unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |Rgr|  unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rgr|  unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |Sgr|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sgr|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |Tgr|  unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tgr|  unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |Ugr|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |ugr|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xgr|  unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xgr|  unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zgr|  unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zgr|  unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacgr|  unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
+.. |aacgr|  unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
+.. |Eacgr|  unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
+.. |eacgr|  unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
+.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
+.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
+.. |Iacgr|  unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
+.. |iacgr|  unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
+.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+.. |Idigr|  unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+.. |idigr|  unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
+.. |Oacgr|  unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
+.. |oacgr|  unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
+.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
+.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
+.. |Uacgr|  unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
+.. |uacgr|  unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
+.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+.. |Udigr|  unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+.. |udigr|  unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alpha|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |beta|   unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |chi|    unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Delta|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |epsi|   unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsis|  unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsiv|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |eta|    unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Gamma|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |iota|   unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |kappa|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |mu|     unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nu|     unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Omega|  unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|  unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Phi|    unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|    unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phis|   unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phiv|   unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |Pi|     unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|     unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|    unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Psi|    unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|    unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |rho|    unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |rhov|   unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |Sigma|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |tau|    unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |Theta|  unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|  unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |Upsi|   unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |upsi|   unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xi|     unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|     unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |zeta|   unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.alpha|  unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
+.. |b.beta|   unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
+.. |b.chi|    unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
+.. |b.Delta|  unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
+.. |b.delta|  unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
+.. |b.epsi|   unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
+.. |b.epsiv|  unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
+.. |b.eta|    unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
+.. |b.Gamma|  unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
+.. |b.gamma|  unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |b.iota|   unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
+.. |b.kappa|  unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
+.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
+.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
+.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
+.. |b.mu|     unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
+.. |b.nu|     unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
+.. |b.Omega|  unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
+.. |b.omega|  unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
+.. |b.Phi|    unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
+.. |b.phi|    unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
+.. |b.phiv|   unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
+.. |b.Pi|     unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
+.. |b.pi|     unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
+.. |b.piv|    unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
+.. |b.Psi|    unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
+.. |b.psi|    unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
+.. |b.rho|    unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
+.. |b.rhov|   unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
+.. |b.Sigma|  unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
+.. |b.sigma|  unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
+.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
+.. |b.tau|    unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
+.. |b.Theta|  unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
+.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
+.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
+.. |b.Upsi|   unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
+.. |b.upsi|   unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
+.. |b.Xi|     unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
+.. |b.xi|     unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
+.. |b.zeta|   unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,128 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
+.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
+.. |Amacr|  unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
+.. |amacr|  unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
+.. |Aogon|  unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
+.. |aogon|  unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
+.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
+.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
+.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
+.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
+.. |Ccirc|  unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+.. |ccirc|  unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
+.. |Cdot|   unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
+.. |cdot|   unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
+.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
+.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
+.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
+.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
+.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
+.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
+.. |Edot|   unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
+.. |edot|   unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
+.. |Emacr|  unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
+.. |emacr|  unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
+.. |ENG|    unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
+.. |eng|    unicode:: U+0014B .. LATIN SMALL LETTER ENG
+.. |Eogon|  unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
+.. |eogon|  unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
+.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
+.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
+.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
+.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
+.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
+.. |Gcirc|  unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+.. |gcirc|  unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
+.. |Gdot|   unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
+.. |gdot|   unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
+.. |Hcirc|  unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+.. |hcirc|  unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
+.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
+.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
+.. |Idot|   unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
+.. |IJlig|  unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
+.. |ijlig|  unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
+.. |Imacr|  unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
+.. |imacr|  unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
+.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |Iogon|  unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
+.. |iogon|  unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
+.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
+.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
+.. |Jcirc|  unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+.. |jcirc|  unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
+.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
+.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
+.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
+.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
+.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
+.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
+.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
+.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
+.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
+.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
+.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
+.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
+.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
+.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
+.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
+.. |napos|  unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
+.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
+.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
+.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
+.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |Omacr|  unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
+.. |omacr|  unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
+.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
+.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
+.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
+.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
+.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
+.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
+.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
+.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
+.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
+.. |Scirc|  unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+.. |scirc|  unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
+.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
+.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
+.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
+.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
+.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
+.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
+.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
+.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
+.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
+.. |Umacr|  unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
+.. |umacr|  unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
+.. |Uogon|  unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
+.. |uogon|  unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
+.. |Uring|  unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
+.. |uring|  unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
+.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
+.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
+.. |Wcirc|  unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+.. |wcirc|  unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
+.. |Ycirc|  unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+.. |ycirc|  unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
+.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
+.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
+.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
+.. |Zdot|   unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
+.. |zdot|   unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
+.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
+.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
+.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
+.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
+.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
+.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
+.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
+.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
+.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
+.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
+.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
+.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
+.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
+.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
+.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
+.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
+.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
+.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
+.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
+.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
+.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
+.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
+.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
+.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
+.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
+.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
+.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
+.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
+.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
+.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
+.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
+.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
+.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
+.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
+.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
+.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
+.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
+.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
+.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
+.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
+.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
+.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,13 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
+.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
+.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
+.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
+.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
+.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
+.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
+.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
+.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
+.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
+.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
+.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
+.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
+.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
+.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
+.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
+.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
+.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
+.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
+.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
+.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
+.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
+.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
+.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
+.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
+.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
+.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
+.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
+.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
+.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
+.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
+.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
+.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,17 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |amp|    unicode:: U+00026 .. AMPERSAND
+.. |apos|   unicode:: U+00027 .. APOSTROPHE
+.. |ast|    unicode:: U+0002A .. ASTERISK
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |bsol|   unicode:: U+0005C .. REVERSE SOLIDUS
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |colon|  unicode:: U+0003A .. COLON
+.. |comma|  unicode:: U+0002C .. COMMA
+.. |commat| unicode:: U+00040 .. COMMERCIAL AT
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |darr|   unicode:: U+02193 .. DOWNWARDS ARROW
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
+.. |equals| unicode:: U+0003D .. EQUALS SIGN
+.. |excl|   unicode:: U+00021 .. EXCLAMATION MARK
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
+.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
+.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |half|   unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
+.. |hyphen| unicode:: U+02010 .. HYPHEN
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |larr|   unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lcub|   unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lowbar| unicode:: U+0005F .. LOW LINE
+.. |lpar|   unicode:: U+00028 .. LEFT PARENTHESIS
+.. |lsqb|   unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |num|    unicode:: U+00023 .. NUMBER SIGN
+.. |ohm|    unicode:: U+02126 .. OHM SIGN
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |percnt| unicode:: U+00025 .. PERCENT SIGN
+.. |period| unicode:: U+0002E .. FULL STOP
+.. |plus|   unicode:: U+0002B .. PLUS SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |quest|  unicode:: U+0003F .. QUESTION MARK
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |rarr|   unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rcub|   unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |rpar|   unicode:: U+00029 .. RIGHT PARENTHESIS
+.. |rsqb|   unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |semi|   unicode:: U+0003B .. SEMICOLON
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sol|    unicode:: U+0002F .. SOLIDUS
+.. |sung|   unicode:: U+0266A .. EIGHTH NOTE
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |trade|  unicode:: U+02122 .. TRADE MARK SIGN
+.. |uarr|   unicode:: U+02191 .. UPWARDS ARROW
+.. |verbar| unicode:: U+0007C .. VERTICAL LINE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |blank|  unicode:: U+02423 .. OPEN BOX
+.. |blk12|  unicode:: U+02592 .. MEDIUM SHADE
+.. |blk14|  unicode:: U+02591 .. LIGHT SHADE
+.. |blk34|  unicode:: U+02593 .. DARK SHADE
+.. |block|  unicode:: U+02588 .. FULL BLOCK
+.. |bull|   unicode:: U+02022 .. BULLET
+.. |caret|  unicode:: U+02041 .. CARET INSERTION POINT
+.. |check|  unicode:: U+02713 .. CHECK MARK
+.. |cir|    unicode:: U+025CB .. WHITE CIRCLE
+.. |clubs|  unicode:: U+02663 .. BLACK CLUB SUIT
+.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
+.. |cross|  unicode:: U+02717 .. BALLOT X
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |dash|   unicode:: U+02010 .. HYPHEN
+.. |diams|  unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
+.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
+.. |dtri|   unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |dtrif|  unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
+.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |female| unicode:: U+02640 .. FEMALE SIGN
+.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
+.. |fflig|  unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
+.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
+.. |filig|  unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
+.. |flat|   unicode:: U+0266D .. MUSIC FLAT SIGN
+.. |fllig|  unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
+.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
+.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
+.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
+.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
+.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
+.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
+.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
+.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
+.. |hairsp| unicode:: U+0200A .. HAIR SPACE
+.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
+.. |incare| unicode:: U+02105 .. CARE OF
+.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |lhblk|  unicode:: U+02584 .. LOWER HALF BLOCK
+.. |loz|    unicode:: U+025CA .. LOZENGE
+.. |lozf|   unicode:: U+029EB .. BLACK LOZENGE
+.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |ltri|   unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |ltrif|  unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |male|   unicode:: U+02642 .. MALE SIGN
+.. |malt|   unicode:: U+02720 .. MALTESE CROSS
+.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |mldr|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |natur|  unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |nldr|   unicode:: U+02025 .. TWO DOT LEADER
+.. |numsp|  unicode:: U+02007 .. FIGURE SPACE
+.. |phone|  unicode:: U+0260E .. BLACK TELEPHONE
+.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
+.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rect|   unicode:: U+025AD .. WHITE RECTANGLE
+.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |rtri|   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |rtrif|  unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |rx|     unicode:: U+0211E .. PRESCRIPTION TAKE
+.. |sext|   unicode:: U+02736 .. SIX POINTED BLACK STAR
+.. |sharp|  unicode:: U+0266F .. MUSIC SHARP SIGN
+.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
+.. |squ|    unicode:: U+025A1 .. WHITE SQUARE
+.. |squf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |star|   unicode:: U+02606 .. WHITE STAR
+.. |starf|  unicode:: U+02605 .. BLACK STAR
+.. |target| unicode:: U+02316 .. POSITION INDICATOR
+.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |uhblk|  unicode:: U+02580 .. UPPER HALF BLOCK
+.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
+.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
+.. |utri|   unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |utrif|  unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,168 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acd|      unicode:: U+0223F .. SINE WAVE
+.. |aleph|    unicode:: U+02135 .. ALEF SYMBOL
+.. |And|      unicode:: U+02A53 .. DOUBLE LOGICAL AND
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |andand|   unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
+.. |andd|     unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
+.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
+.. |andv|     unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
+.. |ang90|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angrt|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angsph|   unicode:: U+02222 .. SPHERICAL ANGLE
+.. |angst|    unicode:: U+0212B .. ANGSTROM SIGN
+.. |ap|       unicode:: U+02248 .. ALMOST EQUAL TO
+.. |apacir|   unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |awint|    unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
+.. |becaus|   unicode:: U+02235 .. BECAUSE
+.. |bernou|   unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bne|      unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
+.. |bnequiv|  unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
+.. |bNot|     unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
+.. |bnot|     unicode:: U+02310 .. REVERSED NOT SIGN
+.. |bottom|   unicode:: U+022A5 .. UP TACK
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Cconint|  unicode:: U+02230 .. VOLUME INTEGRAL
+.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
+.. |compfn|   unicode:: U+02218 .. RING OPERATOR
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |Conint|   unicode:: U+0222F .. SURFACE INTEGRAL
+.. |conint|   unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |ctdot|    unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |cwint|    unicode:: U+02231 .. CLOCKWISE INTEGRAL
+.. |cylcty|   unicode:: U+0232D .. CYLINDRICITY
+.. |disin|    unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
+.. |Dot|      unicode:: U+000A8 .. DIAERESIS
+.. |DotDot|   unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
+.. |dsol|     unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
+.. |dtdot|    unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
+.. |dwangle|  unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
+.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |epar|     unicode:: U+022D5 .. EQUAL AND PARALLEL TO
+.. |eparsl|   unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fltns|    unicode:: U+025B1 .. WHITE PARALLELOGRAM
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hamilt|   unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |iff|      unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |iinfin|   unicode:: U+029DC .. INCOMPLETE INFINITY
+.. |imped|    unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
+.. |Int|      unicode:: U+0222C .. DOUBLE INTEGRAL
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |isindot|  unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
+.. |isinE|    unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
+.. |isins|    unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinsv|   unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinv|    unicode:: U+02208 .. ELEMENT OF
+.. |lagran|   unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Lang|     unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |lbbrk|    unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |loang|    unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
+.. |lobrk|    unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |lopar|    unicode:: U+02985 .. LEFT WHITE PARENTHESIS
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |mnplus|   unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |nedot|    unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
+.. |nhpar|    unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |nis|      unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |nisd|     unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
+.. |niv|      unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Not|      unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
+.. |notinE|   unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
+.. |notinva|  unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notinvb|  unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
+.. |notinvc|  unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
+.. |notni|    unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notniva|  unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notnivb|  unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
+.. |notnivc|  unicode:: U+022FD .. CONTAINS WITH OVERBAR
+.. |nparsl|   unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
+.. |npart|    unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
+.. |npolint|  unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
+.. |nvinfin|  unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
+.. |olcross|  unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
+.. |Or|       unicode:: U+02A54 .. DOUBLE LOGICAL OR
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |ord|      unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
+.. |order|    unicode:: U+02134 .. SCRIPT SMALL O
+.. |oror|     unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
+.. |orslope|  unicode:: U+02A57 .. SLOPING LARGE OR
+.. |orv|      unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
+.. |par|      unicode:: U+02225 .. PARALLEL TO
+.. |parsl|    unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |permil|   unicode:: U+02030 .. PER MILLE SIGN
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |pertenk|  unicode:: U+02031 .. PER TEN THOUSAND SIGN
+.. |phmmat|   unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
+.. |profline| unicode:: U+02312 .. ARC
+.. |profsurf| unicode:: U+02313 .. SEGMENT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |qint|     unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |qprime|   unicode:: U+02057 .. QUADRUPLE PRIME
+.. |quatint|  unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |Rang|     unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rbbrk|    unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
+.. |roang|    unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
+.. |robrk|    unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |ropar|    unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
+.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |simdot|   unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
+.. |sime|     unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+.. |square|   unicode:: U+025A1 .. WHITE SQUARE
+.. |squarf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |strns|    unicode:: U+000AF .. MACRON
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |tdot|     unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |tint|     unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |topbot|   unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
+.. |topcir|   unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
+.. |tprime|   unicode:: U+02034 .. TRIPLE PRIME
+.. |utdot|    unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
+.. |uwangle|  unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
+.. |vangrt|   unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
+.. |veeeq|    unicode:: U+0225A .. EQUIANGULAR TO
+.. |Verbar|   unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |wedgeq|   unicode:: U+02259 .. ESTIMATES
+.. |xnis|     unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,554 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angle|                           unicode:: U+02220 .. ANGLE
+.. |ApplyFunction|                   unicode:: U+02061 .. FUNCTION APPLICATION
+.. |approx|                          unicode:: U+02248 .. ALMOST EQUAL TO
+.. |approxeq|                        unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |Assign|                          unicode:: U+02254 .. COLON EQUALS
+.. |backcong|                        unicode:: U+0224C .. ALL EQUAL TO
+.. |backepsilon|                     unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |backprime|                       unicode:: U+02035 .. REVERSED PRIME
+.. |backsim|                         unicode:: U+0223D .. REVERSED TILDE
+.. |backsimeq|                       unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |Backslash|                       unicode:: U+02216 .. SET MINUS
+.. |barwedge|                        unicode:: U+02305 .. PROJECTIVE
+.. |Because|                         unicode:: U+02235 .. BECAUSE
+.. |because|                         unicode:: U+02235 .. BECAUSE
+.. |Bernoullis|                      unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |between|                         unicode:: U+0226C .. BETWEEN
+.. |bigcap|                          unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |bigcirc|                         unicode:: U+025EF .. LARGE CIRCLE
+.. |bigcup|                          unicode:: U+022C3 .. N-ARY UNION
+.. |bigodot|                         unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |bigoplus|                        unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |bigotimes|                       unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |bigsqcup|                        unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |bigstar|                         unicode:: U+02605 .. BLACK STAR
+.. |bigtriangledown|                 unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |bigtriangleup|                   unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |biguplus|                        unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |bigvee|                          unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |bigwedge|                        unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |bkarow|                          unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |blacklozenge|                    unicode:: U+029EB .. BLACK LOZENGE
+.. |blacksquare|                     unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |blacktriangle|                   unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |blacktriangledown|               unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |blacktriangleleft|               unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |blacktriangleright|              unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |bot|                             unicode:: U+022A5 .. UP TACK
+.. |boxminus|                        unicode:: U+0229F .. SQUARED MINUS
+.. |boxplus|                         unicode:: U+0229E .. SQUARED PLUS
+.. |boxtimes|                        unicode:: U+022A0 .. SQUARED TIMES
+.. |Breve|                           unicode:: U+002D8 .. BREVE
+.. |bullet|                          unicode:: U+02022 .. BULLET
+.. |Bumpeq|                          unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpeq|                          unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |CapitalDifferentialD|            unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |Cayleys|                         unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Cedilla|                         unicode:: U+000B8 .. CEDILLA
+.. |CenterDot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |centerdot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |checkmark|                       unicode:: U+02713 .. CHECK MARK
+.. |circeq|                          unicode:: U+02257 .. RING EQUAL TO
+.. |circlearrowleft|                 unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |circlearrowright|                unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |circledast|                      unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |circledcirc|                     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |circleddash|                     unicode:: U+0229D .. CIRCLED DASH
+.. |CircleDot|                       unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |circledR|                        unicode:: U+000AE .. REGISTERED SIGN
+.. |circledS|                        unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |CircleMinus|                     unicode:: U+02296 .. CIRCLED MINUS
+.. |CirclePlus|                      unicode:: U+02295 .. CIRCLED PLUS
+.. |CircleTimes|                     unicode:: U+02297 .. CIRCLED TIMES
+.. |ClockwiseContourIntegral|        unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |CloseCurlyDoubleQuote|           unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |CloseCurlyQuote|                 unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |clubsuit|                        unicode:: U+02663 .. BLACK CLUB SUIT
+.. |coloneq|                         unicode:: U+02254 .. COLON EQUALS
+.. |complement|                      unicode:: U+02201 .. COMPLEMENT
+.. |complexes|                       unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Congruent|                       unicode:: U+02261 .. IDENTICAL TO
+.. |ContourIntegral|                 unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |Coproduct|                       unicode:: U+02210 .. N-ARY COPRODUCT
+.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |CupCap|                          unicode:: U+0224D .. EQUIVALENT TO
+.. |curlyeqprec|                     unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |curlyeqsucc|                     unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |curlyvee|                        unicode:: U+022CE .. CURLY LOGICAL OR
+.. |curlywedge|                      unicode:: U+022CF .. CURLY LOGICAL AND
+.. |curvearrowleft|                  unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |curvearrowright|                 unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |dbkarow|                         unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |ddagger|                         unicode:: U+02021 .. DOUBLE DAGGER
+.. |ddotseq|                         unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |Del|                             unicode:: U+02207 .. NABLA
+.. |DiacriticalAcute|                unicode:: U+000B4 .. ACUTE ACCENT
+.. |DiacriticalDot|                  unicode:: U+002D9 .. DOT ABOVE
+.. |DiacriticalDoubleAcute|          unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |DiacriticalGrave|                unicode:: U+00060 .. GRAVE ACCENT
+.. |DiacriticalTilde|                unicode:: U+002DC .. SMALL TILDE
+.. |Diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamondsuit|                     unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |DifferentialD|                   unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |digamma|                         unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |div|                             unicode:: U+000F7 .. DIVISION SIGN
+.. |divideontimes|                   unicode:: U+022C7 .. DIVISION TIMES
+.. |doteq|                           unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |doteqdot|                        unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |DotEqual|                        unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |dotminus|                        unicode:: U+02238 .. DOT MINUS
+.. |dotplus|                         unicode:: U+02214 .. DOT PLUS
+.. |dotsquare|                       unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |doublebarwedge|                  unicode:: U+02306 .. PERSPECTIVE
+.. |DoubleContourIntegral|           unicode:: U+0222F .. SURFACE INTEGRAL
+.. |DoubleDot|                       unicode:: U+000A8 .. DIAERESIS
+.. |DoubleDownArrow|                 unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |DoubleLeftArrow|                 unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |DoubleLeftRightArrow|            unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |DoubleLeftTee|                   unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |DoubleLongLeftArrow|             unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |DoubleLongLeftRightArrow|        unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |DoubleLongRightArrow|            unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightArrow|                unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightTee|                  unicode:: U+022A8 .. TRUE
+.. |DoubleUpArrow|                   unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |DoubleUpDownArrow|               unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |DoubleVerticalBar|               unicode:: U+02225 .. PARALLEL TO
+.. |DownArrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Downarrow|                       unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |downarrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |DownArrowUpArrow|                unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |downdownarrows|                  unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |downharpoonleft|                 unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |downharpoonright|                unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |DownLeftVector|                  unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownRightVector|                 unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownTee|                         unicode:: U+022A4 .. DOWN TACK
+.. |DownTeeArrow|                    unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |drbkarow|                        unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |Element|                         unicode:: U+02208 .. ELEMENT OF
+.. |emptyset|                        unicode:: U+02205 .. EMPTY SET
+.. |eqcirc|                          unicode:: U+02256 .. RING IN EQUAL TO
+.. |eqcolon|                         unicode:: U+02255 .. EQUALS COLON
+.. |eqsim|                           unicode:: U+02242 .. MINUS TILDE
+.. |eqslantgtr|                      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |eqslantless|                     unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |EqualTilde|                      unicode:: U+02242 .. MINUS TILDE
+.. |Equilibrium|                     unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |Exists|                          unicode:: U+02203 .. THERE EXISTS
+.. |expectation|                     unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |ExponentialE|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |exponentiale|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |fallingdotseq|                   unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |ForAll|                          unicode:: U+02200 .. FOR ALL
+.. |Fouriertrf|                      unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |geq|                             unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |geqq|                            unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |geqslant|                        unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gg|                              unicode:: U+0226B .. MUCH GREATER-THAN
+.. |ggg|                             unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gnapprox|                        unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gneq|                            unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gneqq|                           unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |GreaterEqual|                    unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |GreaterEqualLess|                unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |GreaterFullEqual|                unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |GreaterLess|                     unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |GreaterSlantEqual|               unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |GreaterTilde|                    unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gtrapprox|                       unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gtrdot|                          unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtreqless|                       unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |gtreqqless|                      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gtrless|                         unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gtrsim|                          unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gvertneqq|                       unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |Hacek|                           unicode:: U+002C7 .. CARON
+.. |hbar|                            unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |heartsuit|                       unicode:: U+02665 .. BLACK HEART SUIT
+.. |HilbertSpace|                    unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hksearow|                        unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |hkswarow|                        unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |hookleftarrow|                   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |hookrightarrow|                  unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |hslash|                          unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |HumpDownHump|                    unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |HumpEqual|                       unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |iiiint|                          unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |iiint|                           unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |Im|                              unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ImaginaryI|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |imagline|                        unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |imagpart|                        unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Implies|                         unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |in|                              unicode:: U+02208 .. ELEMENT OF
+.. |integers|                        unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
+.. |Integral|                        unicode:: U+0222B .. INTEGRAL
+.. |intercal|                        unicode:: U+022BA .. INTERCALATE
+.. |Intersection|                    unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |intprod|                         unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |InvisibleComma|                  unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |InvisibleTimes|                  unicode:: U+02062 .. INVISIBLE TIMES
+.. |langle|                          unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |Laplacetrf|                      unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lbrace|                          unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |lbrack|                          unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |LeftAngleBracket|                unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |LeftArrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |Leftarrow|                       unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |leftarrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |LeftArrowBar|                    unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftArrowRightArrow|             unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftarrowtail|                   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |LeftCeiling|                     unicode:: U+02308 .. LEFT CEILING
+.. |LeftDoubleBracket|               unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |LeftDownVector|                  unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftFloor|                       unicode:: U+0230A .. LEFT FLOOR
+.. |leftharpoondown|                 unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |leftharpoonup|                   unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leftleftarrows|                  unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |LeftRightArrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |Leftrightarrow|                  unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |leftrightarrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |leftrightarrows|                 unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftrightharpoons|               unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |leftrightsquigarrow|             unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |LeftTee|                         unicode:: U+022A3 .. LEFT TACK
+.. |LeftTeeArrow|                    unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |leftthreetimes|                  unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |LeftTriangle|                    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |LeftTriangleEqual|               unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |LeftUpVector|                    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftVector|                      unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leq|                             unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |leqq|                            unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |leqslant|                        unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lessapprox|                      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lessdot|                         unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lesseqgtr|                       unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |lesseqqgtr|                      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |LessEqualGreater|                unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |LessFullEqual|                   unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |LessGreater|                     unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lessgtr|                         unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lesssim|                         unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |LessSlantEqual|                  unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |LessTilde|                       unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |ll|                              unicode:: U+0226A .. MUCH LESS-THAN
+.. |llcorner|                        unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |Lleftarrow|                      unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |lmoustache|                      unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lnapprox|                        unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lneq|                            unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lneqq|                           unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |LongLeftArrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |Longleftarrow|                   unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |longleftarrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |LongLeftRightArrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |Longleftrightarrow|              unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |longleftrightarrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |longmapsto|                      unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |LongRightArrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |Longrightarrow|                  unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |longrightarrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |looparrowleft|                   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |looparrowright|                  unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |LowerLeftArrow|                  unicode:: U+02199 .. SOUTH WEST ARROW
+.. |LowerRightArrow|                 unicode:: U+02198 .. SOUTH EAST ARROW
+.. |lozenge|                         unicode:: U+025CA .. LOZENGE
+.. |lrcorner|                        unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |Lsh|                             unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lvertneqq|                       unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |maltese|                         unicode:: U+02720 .. MALTESE CROSS
+.. |mapsto|                          unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |measuredangle|                   unicode:: U+02221 .. MEASURED ANGLE
+.. |Mellintrf|                       unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |MinusPlus|                       unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |mp|                              unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |multimap|                        unicode:: U+022B8 .. MULTIMAP
+.. |napprox|                         unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |natural|                         unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |naturals|                        unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |nearrow|                         unicode:: U+02197 .. NORTH EAST ARROW
+.. |NegativeMediumSpace|             unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThickSpace|              unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThinSpace|               unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeVeryThinSpace|           unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NestedGreaterGreater|            unicode:: U+0226B .. MUCH GREATER-THAN
+.. |NestedLessLess|                  unicode:: U+0226A .. MUCH LESS-THAN
+.. |nexists|                         unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |ngeq|                            unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |ngeqq|                           unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |ngeqslant|                       unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |ngtr|                            unicode:: U+0226F .. NOT GREATER-THAN
+.. |nLeftarrow|                      unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nleftarrow|                      unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nLeftrightarrow|                 unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nleftrightarrow|                 unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nleq|                            unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nleqq|                           unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nleqslant|                       unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nless|                           unicode:: U+0226E .. NOT LESS-THAN
+.. |NonBreakingSpace|                unicode:: U+000A0 .. NO-BREAK SPACE
+.. |NotCongruent|                    unicode:: U+02262 .. NOT IDENTICAL TO
+.. |NotDoubleVerticalBar|            unicode:: U+02226 .. NOT PARALLEL TO
+.. |NotElement|                      unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |NotEqual|                        unicode:: U+02260 .. NOT EQUAL TO
+.. |NotEqualTilde|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NotExists|                       unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |NotGreater|                      unicode:: U+0226F .. NOT GREATER-THAN
+.. |NotGreaterEqual|                 unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |NotGreaterFullEqual|             unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |NotGreaterGreater|               unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |NotGreaterLess|                  unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |NotGreaterSlantEqual|            unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |NotGreaterTilde|                 unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |NotHumpDownHump|                 unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |NotLeftTriangle|                 unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |NotLeftTriangleEqual|            unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |NotLess|                         unicode:: U+0226E .. NOT LESS-THAN
+.. |NotLessEqual|                    unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |NotLessGreater|                  unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |NotLessLess|                     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |NotLessSlantEqual|               unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |NotLessTilde|                    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |NotPrecedes|                     unicode:: U+02280 .. DOES NOT PRECEDE
+.. |NotPrecedesEqual|                unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotPrecedesSlantEqual|           unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |NotReverseElement|               unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |NotRightTriangle|                unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |NotRightTriangleEqual|           unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |NotSquareSubsetEqual|            unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |NotSquareSupersetEqual|          unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |NotSubset|                       unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |NotSubsetEqual|                  unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |NotSucceeds|                     unicode:: U+02281 .. DOES NOT SUCCEED
+.. |NotSucceedsEqual|                unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotSucceedsSlantEqual|           unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |NotSuperset|                     unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |NotSupersetEqual|                unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |NotTilde|                        unicode:: U+02241 .. NOT TILDE
+.. |NotTildeEqual|                   unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |NotTildeFullEqual|               unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |NotTildeTilde|                   unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |NotVerticalBar|                  unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nparallel|                       unicode:: U+02226 .. NOT PARALLEL TO
+.. |nprec|                           unicode:: U+02280 .. DOES NOT PRECEDE
+.. |npreceq|                         unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nRightarrow|                     unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrightarrow|                     unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nshortmid|                       unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nshortparallel|                  unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsimeq|                          unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsubset|                         unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |nsubseteq|                       unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsubseteqq|                      unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsucc|                           unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsucceq|                         unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsupset|                         unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |nsupseteq|                       unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |nsupseteqq|                      unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |ntriangleleft|                   unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |ntrianglelefteq|                 unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |ntriangleright|                  unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |ntrianglerighteq|                unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nwarrow|                         unicode:: U+02196 .. NORTH WEST ARROW
+.. |oint|                            unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |OpenCurlyDoubleQuote|            unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |OpenCurlyQuote|                  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |orderof|                         unicode:: U+02134 .. SCRIPT SMALL O
+.. |parallel|                        unicode:: U+02225 .. PARALLEL TO
+.. |PartialD|                        unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |pitchfork|                       unicode:: U+022D4 .. PITCHFORK
+.. |PlusMinus|                       unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pm|                              unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |Poincareplane|                   unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |prec|                            unicode:: U+0227A .. PRECEDES
+.. |precapprox|                      unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |preccurlyeq|                     unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Precedes|                        unicode:: U+0227A .. PRECEDES
+.. |PrecedesEqual|                   unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |PrecedesSlantEqual|              unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |PrecedesTilde|                   unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |preceq|                          unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |precnapprox|                     unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |precneqq|                        unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |precnsim|                        unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |precsim|                         unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |primes|                          unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Proportion|                      unicode:: U+02237 .. PROPORTION
+.. |Proportional|                    unicode:: U+0221D .. PROPORTIONAL TO
+.. |propto|                          unicode:: U+0221D .. PROPORTIONAL TO
+.. |quaternions|                     unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |questeq|                         unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |rangle|                          unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rationals|                       unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |rbrace|                          unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rbrack|                          unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |Re|                              unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |realine|                         unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |realpart|                        unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |reals|                           unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |ReverseElement|                  unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |ReverseEquilibrium|              unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |ReverseUpEquilibrium|            unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |RightAngleBracket|               unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |RightArrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |Rightarrow|                      unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rightarrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |RightArrowBar|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightArrowLeftArrow|             unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightarrowtail|                  unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |RightCeiling|                    unicode:: U+02309 .. RIGHT CEILING
+.. |RightDoubleBracket|              unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |RightDownVector|                 unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightFloor|                      unicode:: U+0230B .. RIGHT FLOOR
+.. |rightharpoondown|                unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rightharpoonup|                  unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rightleftarrows|                 unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightleftharpoons|               unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rightrightarrows|                unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rightsquigarrow|                 unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |RightTee|                        unicode:: U+022A2 .. RIGHT TACK
+.. |RightTeeArrow|                   unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |rightthreetimes|                 unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |RightTriangle|                   unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |RightTriangleEqual|              unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |RightUpVector|                   unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightVector|                     unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |risingdotseq|                    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |rmoustache|                      unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |Rrightarrow|                     unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rsh|                             unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |searrow|                         unicode:: U+02198 .. SOUTH EAST ARROW
+.. |setminus|                        unicode:: U+02216 .. SET MINUS
+.. |ShortDownArrow|                  unicode:: U+02193 .. DOWNWARDS ARROW
+.. |ShortLeftArrow|                  unicode:: U+02190 .. LEFTWARDS ARROW
+.. |shortmid|                        unicode:: U+02223 .. DIVIDES
+.. |shortparallel|                   unicode:: U+02225 .. PARALLEL TO
+.. |ShortRightArrow|                 unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |ShortUpArrow|                    unicode:: U+02191 .. UPWARDS ARROW
+.. |simeq|                           unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |SmallCircle|                     unicode:: U+02218 .. RING OPERATOR
+.. |smallsetminus|                   unicode:: U+02216 .. SET MINUS
+.. |spadesuit|                       unicode:: U+02660 .. BLACK SPADE SUIT
+.. |Sqrt|                            unicode:: U+0221A .. SQUARE ROOT
+.. |sqsubset|                        unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsubseteq|                      unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsupset|                        unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupseteq|                      unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |Square|                          unicode:: U+025A1 .. WHITE SQUARE
+.. |SquareIntersection|              unicode:: U+02293 .. SQUARE CAP
+.. |SquareSubset|                    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |SquareSubsetEqual|               unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |SquareSuperset|                  unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |SquareSupersetEqual|             unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |SquareUnion|                     unicode:: U+02294 .. SQUARE CUP
+.. |Star|                            unicode:: U+022C6 .. STAR OPERATOR
+.. |straightepsilon|                 unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |straightphi|                     unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Subset|                          unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subset|                          unicode:: U+02282 .. SUBSET OF
+.. |subseteq|                        unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subseteqq|                       unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |SubsetEqual|                     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subsetneq|                       unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |subsetneqq|                      unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |succ|                            unicode:: U+0227B .. SUCCEEDS
+.. |succapprox|                      unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |succcurlyeq|                     unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |Succeeds|                        unicode:: U+0227B .. SUCCEEDS
+.. |SucceedsEqual|                   unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |SucceedsSlantEqual|              unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |SucceedsTilde|                   unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |succeq|                          unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |succnapprox|                     unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |succneqq|                        unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |succnsim|                        unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |succsim|                         unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |SuchThat|                        unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Sum|                             unicode:: U+02211 .. N-ARY SUMMATION
+.. |Superset|                        unicode:: U+02283 .. SUPERSET OF
+.. |SupersetEqual|                   unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Supset|                          unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supset|                          unicode:: U+02283 .. SUPERSET OF
+.. |supseteq|                        unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |supseteqq|                       unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supsetneq|                       unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |supsetneqq|                      unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |swarrow|                         unicode:: U+02199 .. SOUTH WEST ARROW
+.. |Therefore|                       unicode:: U+02234 .. THEREFORE
+.. |therefore|                       unicode:: U+02234 .. THEREFORE
+.. |thickapprox|                     unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thicksim|                        unicode:: U+0223C .. TILDE OPERATOR
+.. |ThinSpace|                       unicode:: U+02009 .. THIN SPACE
+.. |Tilde|                           unicode:: U+0223C .. TILDE OPERATOR
+.. |TildeEqual|                      unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |TildeFullEqual|                  unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |TildeTilde|                      unicode:: U+02248 .. ALMOST EQUAL TO
+.. |toea|                            unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |tosa|                            unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |triangle|                        unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |triangledown|                    unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |triangleleft|                    unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |trianglelefteq|                  unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |triangleq|                       unicode:: U+0225C .. DELTA EQUAL TO
+.. |triangleright|                   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |trianglerighteq|                 unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |TripleDot|                       unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |twoheadleftarrow|                unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |twoheadrightarrow|               unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |ulcorner|                        unicode:: U+0231C .. TOP LEFT CORNER
+.. |Union|                           unicode:: U+022C3 .. N-ARY UNION
+.. |UnionPlus|                       unicode:: U+0228E .. MULTISET UNION
+.. |UpArrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |Uparrow|                         unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uparrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |UpArrowDownArrow|                unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |UpDownArrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |Updownarrow|                     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |updownarrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |UpEquilibrium|                   unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |upharpoonleft|                   unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |upharpoonright|                  unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |UpperLeftArrow|                  unicode:: U+02196 .. NORTH WEST ARROW
+.. |UpperRightArrow|                 unicode:: U+02197 .. NORTH EAST ARROW
+.. |upsilon|                         unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |UpTee|                           unicode:: U+022A5 .. UP TACK
+.. |UpTeeArrow|                      unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |upuparrows|                      unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |urcorner|                        unicode:: U+0231D .. TOP RIGHT CORNER
+.. |varepsilon|                      unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |varkappa|                        unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |varnothing|                      unicode:: U+02205 .. EMPTY SET
+.. |varphi|                          unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |varpi|                           unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |varpropto|                       unicode:: U+0221D .. PROPORTIONAL TO
+.. |varrho|                          unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |varsigma|                        unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |varsubsetneq|                    unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsubsetneqq|                   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneq|                    unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneqq|                   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vartheta|                        unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |vartriangleleft|                 unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vartriangleright|                unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vee|                             unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |vee|                             unicode:: U+02228 .. LOGICAL OR
+.. |Vert|                            unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |vert|                            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalBar|                     unicode:: U+02223 .. DIVIDES
+.. |VerticalTilde|                   unicode:: U+02240 .. WREATH PRODUCT
+.. |VeryThinSpace|                   unicode:: U+0200A .. HAIR SPACE
+.. |Wedge|                           unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |wedge|                           unicode:: U+02227 .. LOGICAL AND
+.. |wp|                              unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |wr|                              unicode:: U+02240 .. WREATH PRODUCT
+.. |zeetrf|                          unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |aopf|                    unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |bopf|                    unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
+.. |copf|                    unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |dopf|                    unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |eopf|                    unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |fopf|                    unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
+.. |gopf|                    unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |hopf|                    unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |iopf|                    unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |jopf|                    unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
+.. |kopf|                    unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |lopf|                    unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |mopf|                    unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |nopf|                    unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |oopf|                    unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |popf|                    unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |qopf|                    unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |ropf|                    unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |sopf|                    unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |topf|                    unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |uopf|                    unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |vopf|                    unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
+.. |wopf|                    unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
+.. |xopf|                    unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
+.. |yopf|                    unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |zopf|                    unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+.. Definitions of interpreted text roles (classes) for S5/HTML data.
+.. This data file has been placed in the public domain.
+
+.. Colours
+   =======
+
+.. role:: black
+.. role:: gray
+.. role:: silver
+.. role:: white
+
+.. role:: maroon
+.. role:: red
+.. role:: magenta
+.. role:: fuchsia
+.. role:: pink
+.. role:: orange
+.. role:: yellow
+.. role:: lime
+.. role:: green
+.. role:: olive
+.. role:: teal
+.. role:: cyan
+.. role:: aqua
+.. role:: blue
+.. role:: navy
+.. role:: purple
+
+
+.. Text Sizes
+   ==========
+
+.. role:: huge
+.. role:: big
+.. role:: small
+.. role:: tiny
+
+
+.. Display in Slides (Presentation Mode) Only
+   ==========================================
+
+.. role:: slide
+   :class: slide-display
+
+
+.. Display in Outline Mode Only
+   ============================
+
+.. role:: outline
+
+
+.. Display in Print Only
+   =====================
+
+.. role:: print
+
+
+.. Display in Handout Mode Only
+   ============================
+
+.. role:: handout
+
+
+.. Incremental Display
+   ===================
+
+.. role:: incremental
+.. default-role:: incremental
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |acute|  unicode:: U+000B4 .. ACUTE ACCENT
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |cedil|  unicode:: U+000B8 .. CEDILLA
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |macr|   unicode:: U+000AF .. MACRON
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |uml|    unicode:: U+000A8 .. DIAERESIS
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |bdquo|  unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |circ|   unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |euro|   unicode:: U+020AC .. EURO SIGN
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lrm|    unicode:: U+0200E .. LEFT-TO-RIGHT MARK
+.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |permil| unicode:: U+02030 .. PER MILLE SIGN
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rlm|    unicode:: U+0200F .. RIGHT-TO-LEFT MARK
+.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sbquo|  unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |tilde|  unicode:: U+002DC .. SMALL TILDE
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |zwj|    unicode:: U+0200D .. ZERO WIDTH JOINER
+.. |zwnj|   unicode:: U+0200C .. ZERO WIDTH NON-JOINER
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,130 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alefsym|  unicode:: U+02135 .. ALEF SYMBOL
+.. |Alpha|    unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |alpha|    unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Beta|     unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |beta|     unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |bull|     unicode:: U+02022 .. BULLET
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Chi|      unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |chi|      unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |clubs|    unicode:: U+02663 .. BLACK CLUB SUIT
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |crarr|    unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr|     unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Delta|    unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|    unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |diams|    unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |Epsilon|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |epsilon|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |Eta|      unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eta|      unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |frasl|    unicode:: U+02044 .. FRACTION SLASH
+.. |Gamma|    unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|    unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |hearts|   unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |Iota|     unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |iota|     unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |Kappa|    unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kappa|    unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |Lambda|   unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda|   unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |larr|     unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lceil|    unicode:: U+02308 .. LEFT CEILING
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |lfloor|   unicode:: U+0230A .. LEFT FLOOR
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |loz|      unicode:: U+025CA .. LOZENGE
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |Mu|       unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mu|       unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |Nu|       unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |nu|       unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |oline|    unicode:: U+0203E .. OVERLINE
+.. |Omega|    unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|    unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Omicron|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |omicron|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |Phi|      unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|      unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Pi|       unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|       unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|      unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |Psi|      unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|      unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rarr|     unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rceil|    unicode:: U+02309 .. RIGHT CEILING
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfloor|   unicode:: U+0230B .. RIGHT FLOOR
+.. |Rho|      unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rho|      unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |Sigma|    unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|    unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmaf|   unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |spades|   unicode:: U+02660 .. BLACK SPADE SUIT
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Tau|      unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tau|      unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |Theta|    unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|    unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |trade|    unicode:: U+02122 .. TRADE MARK SIGN
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr|     unicode:: U+02191 .. UPWARDS ARROW
+.. |upsih|    unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |Upsilon|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |upsilon|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |Xi|       unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|       unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zeta|     unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zeta|     unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    try:
+        module = __import__(language_code, globals(), locals())
+    except ImportError:
+        return None
+    _languages[language_code] = module
+    return module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'aandag': 'attention',
+      'versigtig': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'wenk': 'hint',
+      'belangrik': 'important',
+      'nota': 'note',
+      'tip': 'tip', # hint and tip both have the same translation: wenk
+      'waarskuwing': 'warning',
+      'vermaning': 'admonition',
+      'kantstreep': 'sidebar',
+      'onderwerp': 'topic',
+      'lynblok': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubriek': 'rubric',
+      'epigraaf': 'epigraph',
+      'hoogtepunte': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'vrae': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'beeldkaart': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'insluiting': 'include',
+      'rou': 'raw',
+      'vervang': 'replace',
+      'unicode': 'unicode', # should this be translated? unikode
+      'datum': 'date',
+      'klas': 'class',
+      'role (translation required)': 'role',
+      'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnote': 'footnotes',
+      #'aanhalings': 'citations',
+      'teikennotas': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Afrikaans name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    'afkorting': 'abbreviation',
+    'ab': 'abbreviation',
+    'akroniem': 'acronym',
+    'ac': 'acronym',
+    'indeks': 'index',
+    'i': 'index',
+    'voetskrif': 'subscript',
+    'sub': 'subscript',
+    'boskrif': 'superscript',
+    'sup': 'superscript',
+    'titelverwysing': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-verwysing': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-verwysing': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'sterk': 'strong',
+    'literal (translation required)': 'literal',
+    'benoemde verwysing': 'named-reference',
+    'anonieme verwysing': 'anonymous-reference',
+    'voetnootverwysing': 'footnote-reference',
+    'aanhalingverwysing': 'citation-reference',
+    'vervangingsverwysing': 'substitution-reference',
+    'teiken': 'target',
+    'uri-verwysing': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'rou': 'raw',}
+"""Mapping of Afrikaans role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,121 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atenci\u00F3': 'attention',
+      u'compte': 'caution',
+      u'perill': 'danger',
+      u'error': 'error',
+      u'suggeriment': 'hint',
+      u'important': 'important',
+      u'nota': 'note',
+      u'consell': 'tip',
+      u'av\u00EDs': 'warning',
+      u'advertiment': 'admonition',
+      u'nota-al-marge': 'sidebar',
+      u'nota-marge': 'sidebar',
+      u'tema': 'topic',
+      u'bloc-de-l\u00EDnies': 'line-block',
+      u'bloc-l\u00EDnies': 'line-block',
+      u'literal-analitzat': 'parsed-literal',
+      u'r\u00FAbrica': 'rubric',
+      u'ep\u00EDgraf': 'epigraph',
+      u'sumari': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'compost': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      u'taula': 'table',
+      u'taula-csv': 'csv-table',
+      u'taula-llista': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imatge': 'image',
+      u'figura': 'figure',
+      u'inclou': 'include',
+      u'incloure': 'include',
+      u'cru': 'raw',
+      u'reempla\u00E7a': 'replace',
+      u'reempla\u00E7ar': 'replace',
+      u'unicode': 'unicode',
+      u'data': 'date',
+      u'classe': 'class',
+      u'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'contingut': 'contents',
+      u'numsec': 'sectnum',
+      u'numeraci\u00F3-de-seccions': 'sectnum',
+      u'numeraci\u00F3-seccions': 'sectnum',
+      u'cap\u00E7alera': 'header',
+      u'peu-de-p\u00E0gina': 'footer',
+      u'peu-p\u00E0gina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'notes-amb-destinacions': 'target-notes',
+      u'notes-destinacions': 'target-notes',
+      u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
+"""Catalan name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abreviatura': 'abbreviation',
+    u'abreviaci\u00F3': 'abbreviation',
+    u'abrev': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acr\u00F2nim': 'acronym',
+    u'ac': 'acronym',
+    u'\u00EDndex': 'index',
+    u'i': 'index',
+    u'sub\u00EDndex': 'subscript',
+    u'sub': 'subscript',
+    u'super\u00EDndex': 'superscript',
+    u'sup': 'superscript',
+    u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
+    u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
+    u't\u00EDtol': 'title-reference',
+    u't': 'title-reference',
+    u'refer\u00E8ncia-a-pep': 'pep-reference',
+    u'refer\u00E8ncia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'refer\u00E8ncia-a-rfc': 'rfc-reference',
+    u'refer\u00E8ncia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'\u00E8mfasi': 'emphasis',
+    u'destacat': 'strong',
+    u'literal': 'literal',
+    u'refer\u00E8ncia-amb-nom': 'named-reference',
+    u'refer\u00E8ncia-nom': 'named-reference',
+    u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
+    u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-a-cita': 'citation-reference',
+    u'refer\u00E8ncia-cita': 'citation-reference',
+    u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
+    u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
+    u'destinaci\u00F3': 'target',
+    u'refer\u00E8ncia-a-uri': 'uri-reference',
+    u'refer\u00E8ncia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'cru': 'raw',}
+"""Mapping of Catalan role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'pozor': 'attention',
+      u'caution (translation required)': 'caution', # jak rozlisit caution a warning?
+      u'nebezpe\u010D\u00ED': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\u016Fle\u017Eit\u00E9': 'important',
+      u'pozn\u00E1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varov\u00E1n\u00ED': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\u00E9ma': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'odd\u00EDl': 'rubric',
+      u'moto': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta (translation required)': 'meta',
+      #'imagemap': 'imagemap',
+      u'image (translation required)': 'image',   # obrazek
+      u'figure (translation required)': 'figure', # a tady?
+      u'include (translation required)': 'include',
+      u'raw (translation required)': 'raw',
+      u'replace (translation required)': 'replace',
+      u'unicode (translation required)': 'unicode',
+      u'datum': 'date',
+      u't\u0159\u00EDda': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'sectnum (translation required)': 'sectnum',
+      u'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Czech name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbreviation (translation required)': 'abbreviation',
+    u'ab (translation required)': 'abbreviation',
+    u'acronym (translation required)': 'acronym',
+    u'ac (translation required)': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'subscript (translation required)': 'subscript',
+    u'sub (translation required)': 'subscript',
+    u'superscript (translation required)': 'superscript',
+    u'sup (translation required)': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'emphasis (translation required)': 'emphasis',
+    u'strong (translation required)': 'strong',
+    u'literal (translation required)': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Czech role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+# $Id: de.py 5174 2007-05-31 00:01:52Z wiemann $
+# Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
+#          Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'achtung': 'attention',
+      'vorsicht': 'caution',
+      'gefahr': 'danger',
+      'fehler': 'error',
+      'hinweis': 'hint',
+      'wichtig': 'important',
+      'notiz': 'note',
+      'tipp': 'tip',
+      'warnung': 'warning',
+      'ermahnung': 'admonition',
+      'kasten': 'sidebar',
+      'seitenkasten': 'sidebar',
+      'thema': 'topic',
+      'zeilen-block': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubrik': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote', # kasten too ?
+      'zusammengesetzt': 'compound',
+      'verbund': 'compound',
+      u'container (translation required)': 'container',
+      #'fragen': 'questions',
+      'tabelle': 'table',
+      'csv-tabelle': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'bild': 'image',
+      'abbildung': 'figure',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',
+      u'einf\xfcgen': 'include',
+      'ersetzung': 'replace',
+      'ersetzen': 'replace',
+      'ersetze': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rolle': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'inhalt': 'contents',
+      'kapitel-nummerierung': 'sectnum',
+      'abschnitts-nummerierung': 'sectnum',
+      u'linkziel-fu\xdfnoten': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'fu\xdfnoten': 'footnotes',
+      #'zitate': 'citations',
+      }
+"""German name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abk\xfcrzung': 'abbreviation',
+      'akronym': 'acronym',
+      'index': 'index',
+      'tiefgestellt': 'subscript',
+      'hochgestellt': 'superscript',
+      'titel-referenz': 'title-reference',
+      'pep-referenz': 'pep-reference',
+      'rfc-referenz': 'rfc-reference',
+      'betonung': 'emphasis',
+      'fett': 'strong',
+      u'w\xf6rtlich': 'literal',
+      'benannte-referenz': 'named-reference',
+      'unbenannte-referenz': 'anonymous-reference',
+      u'fu\xdfnoten-referenz': 'footnote-reference',
+      'zitat-referenz': 'citation-reference',
+      'ersetzungs-referenz': 'substitution-reference',
+      'ziel': 'target',
+      'uri-referenz': 'uri-reference',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',}
+"""Mapping of German role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention': 'attention',
+      'caution': 'caution',
+      'danger': 'danger',
+      'error': 'error',
+      'hint': 'hint',
+      'important': 'important',
+      'note': 'note',
+      'tip': 'tip',
+      'warning': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'image': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+      'class': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      'contents': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'subscript': 'subscript',
+    'sub': 'subscript',
+    'superscript': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atentu': 'attention',
+      u'zorgu': 'caution',
+      u'dangxero': 'danger',
+      u'dan\u011dero': 'danger',
+      u'eraro': 'error',
+      u'spuro': 'hint',
+      u'grava': 'important',
+      u'noto': 'note',
+      u'helpeto': 'tip',
+      u'averto': 'warning',
+      u'admono': 'admonition',
+      u'flankteksto': 'sidebar',
+      u'temo': 'topic',
+      u'linea-bloko': 'line-block',
+      u'analizota-literalo': 'parsed-literal',
+      u'rubriko': 'rubric',
+      u'epigrafo': 'epigraph',
+      u'elstarajxoj': 'highlights',
+      u'elstara\u0135oj': 'highlights',
+      u'ekstera-citajxo': 'pull-quote',
+      u'ekstera-cita\u0135o': 'pull-quote',
+      u'kombinajxo': 'compound',
+      u'kombina\u0135o': 'compound',
+      u'tekstingo': 'container',
+      u'enhavilo': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabelo': 'table',
+      u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
+      u'tabelo-csv': 'csv-table',
+      u'tabelo-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'bildo': 'image',
+      u'figuro': 'figure',
+      u'inkludi': 'include',
+      u'senanaliza': 'raw',
+      u'anstatauxi': 'replace',
+      u'anstata\u016di': 'replace',
+      u'unicode': 'unicode',
+      u'dato': 'date',
+      u'klaso': 'class',
+      u'rolo': 'role',
+      u'preterlasita-rolo': 'default-role',
+      u'titolo': 'title',
+      u'enhavo': 'contents',
+      u'seknum': 'sectnum',
+      u'sekcia-numerado': 'sectnum',
+      u'kapsekcio': 'header',
+      u'piedsekcio': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'celaj-notoj': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Esperanto name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'mallongigo': 'abbreviation',
+    u'mall': 'abbreviation',
+    u'komenclitero': 'acronym',
+    u'kl': 'acronym',
+    u'indekso': 'index',
+    u'i': 'index',
+    u'subskribo': 'subscript',
+    u'sub': 'subscript',
+    u'supraskribo': 'superscript',
+    u'sup': 'superscript',
+    u'titola-referenco': 'title-reference',
+    u'titolo': 'title-reference',
+    u't': 'title-reference',
+    u'pep-referenco': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'rfc-referenco': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'emfazo': 'emphasis',
+    u'forta': 'strong',
+    u'litera': 'literal',
+    u'nomita-referenco': 'named-reference',
+    u'nenomita-referenco': 'anonymous-reference',
+    u'piednota-referenco': 'footnote-reference',
+    u'citajxo-referenco': 'citation-reference',
+    u'cita\u0135o-referenco': 'citation-reference',
+    u'anstatauxa-referenco': 'substitution-reference',
+    u'anstata\u016da-referenco': 'substitution-reference',
+    u'celo': 'target',
+    u'uri-referenco': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'senanaliza': 'raw',
+}
+"""Mapping of Esperanto role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'atenci\u00f3n': 'attention',
+      u'atencion': 'attention',
+      u'precauci\u00f3n': 'caution',
+      u'precaucion': 'caution',
+      u'peligro': 'danger',
+      u'error': 'error',
+      u'sugerencia': 'hint',
+      u'importante': 'important',
+      u'nota': 'note',
+      u'consejo': 'tip',
+      u'advertencia': 'warning',
+      u'exhortacion': 'admonition',
+      u'exhortaci\u00f3n': 'admonition',
+      u'nota-al-margen': 'sidebar',
+      u'tema': 'topic',
+      u'bloque-de-lineas': 'line-block',
+      u'bloque-de-l\u00edneas': 'line-block',
+      u'literal-evaluado': 'parsed-literal',
+      u'firma': 'rubric',
+      u'ep\u00edgrafe': 'epigraph',
+      u'epigrafe': 'epigraph',
+      u'destacado': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'combinacion': 'compound',
+      u'combinaci\u00f3n': 'compound',
+      u'contenedor': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabla': 'table',
+      u'tabla-vsc': 'csv-table',
+      u'tabla-csv': 'csv-table',
+      u'tabla-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imagen': 'image',
+      u'figura': 'figure',
+      u'incluir': 'include',
+      u'sin-analisis': 'raw',
+      u'sin-an\u00e1lisis': 'raw',
+      u'reemplazar': 'replace',
+      u'unicode': 'unicode',
+      u'fecha': 'date',
+      u'clase': 'class',
+      u'rol': 'role',
+      u'rol-por-omision': 'default-role',
+      u'rol-por-omisi\u00f3n': 'default-role',
+      u'titulo': 'title',
+      u't\u00edtulo': 'title',
+      u'contenido': 'contents',
+      u'numseccion': 'sectnum',
+      u'numsecci\u00f3n': 'sectnum',
+      u'numeracion-seccion': 'sectnum',
+      u'numeraci\u00f3n-secci\u00f3n': 'sectnum',
+      u'notas-destino': 'target-notes',
+      u'cabecera': 'header',
+      u'pie': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Spanish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    u'abreviatura': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acronimo': 'acronym',
+    u'acronimo': 'acronym',
+    u'ac': 'acronym',
+    u'indice': 'index',
+    u'i': 'index',
+    u'subindice': 'subscript',
+    u'sub\u00edndice': 'subscript',
+    u'superindice': 'superscript',
+    u'super\u00edndice': 'superscript',
+    u'referencia-titulo': 'title-reference',
+    u'titulo': 'title-reference',
+    u't': 'title-reference',
+    u'referencia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'referencia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'enfasis': 'emphasis',
+    u'\u00e9nfasis': 'emphasis',
+    u'destacado': 'strong',
+    u'literal': 'literal',              # "literal" is also a word in Spanish :-)
+    u'referencia-con-nombre': 'named-reference',
+    u'referencia-anonima': 'anonymous-reference',
+    u'referencia-an\u00f3nima': 'anonymous-reference',
+    u'referencia-nota-al-pie': 'footnote-reference',
+    u'referencia-cita': 'citation-reference',
+    u'referencia-sustitucion': 'substitution-reference',
+    u'referencia-sustituci\u00f3n': 'substitution-reference',
+    u'destino': 'target',
+    u'referencia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'sin-analisis': 'raw',
+    u'sin-an\u00e1lisis': 'raw',
+}
+"""Mapping of Spanish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'huomio': u'attention',
+      u'varo': u'caution',
+      u'vaara': u'danger',
+      u'virhe': u'error',
+      u'vihje': u'hint',
+      u't\u00e4rke\u00e4\u00e4': u'important',
+      u'huomautus': u'note',
+      u'neuvo': u'tip',
+      u'varoitus': u'warning',
+      u'kehotus': u'admonition',
+      u'sivupalkki': u'sidebar',
+      u'aihe': u'topic',
+      u'rivi': u'line-block',
+      u'tasalevyinen': u'parsed-literal',
+      u'ohje': u'rubric',
+      u'epigraafi': u'epigraph',
+      u'kohokohdat': u'highlights',
+      u'lainaus': u'pull-quote',
+      u'taulukko': u'table',
+      u'csv-taulukko': u'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'kysymykset': u'questions',
+      u'meta': u'meta',
+      #u'kuvakartta': u'imagemap',
+      u'kuva': u'image',
+      u'kaavio': u'figure',
+      u'sis\u00e4llyt\u00e4': u'include',
+      u'raaka': u'raw',
+      u'korvaa': u'replace',
+      u'unicode': u'unicode',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'luokka': u'class',
+      u'rooli': u'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'sis\u00e4llys': u'contents',
+      u'kappale': u'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'alaviitteet': u'footnotes',
+      #u'viitaukset': u'citations',
+      u'target-notes (translation required)': u'target-notes'}
+"""Finnish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'lyhennys': u'abbreviation',
+    u'akronyymi': u'acronym',
+    u'kirjainsana': u'acronym',
+    u'hakemisto': u'index',
+    u'luettelo': u'index',
+    u'alaindeksi': u'subscript',
+    u'indeksi': u'subscript',
+    u'yl\u00e4indeksi': u'superscript',
+    u'title-reference (translation required)': u'title-reference',
+    u'title (translation required)': u'title-reference',
+    u'pep-reference (translation required)': u'pep-reference',
+    u'rfc-reference (translation required)': u'rfc-reference',
+    u'korostus': u'emphasis',
+    u'vahvistus': u'strong',
+    u'tasalevyinen': u'literal',
+    u'named-reference (translation required)': u'named-reference',
+    u'anonymous-reference (translation required)': u'anonymous-reference',
+    u'footnote-reference (translation required)': u'footnote-reference',
+    u'citation-reference (translation required)': u'citation-reference',
+    u'substitution-reference (translation required)': u'substitution-reference',
+    u'kohde': u'target',
+    u'uri-reference (translation required)': u'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Finnish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Authors: David Goodger <goodger@python.org>; William Dode
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'attention': 'attention',
+      u'pr\u00E9caution': 'caution',
+      u'danger': 'danger',
+      u'erreur': 'error',
+      u'conseil': 'hint',
+      u'important': 'important',
+      u'note': 'note',
+      u'astuce': 'tip',
+      u'avertissement': 'warning',
+      u'admonition': 'admonition',
+      u'encadr\u00E9': 'sidebar',
+      u'sujet': 'topic',
+      u'bloc-textuel': 'line-block',
+      u'bloc-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'code-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'intertitre': 'rubric',
+      u'exergue': 'epigraph',
+      u'\u00E9pigraphe': 'epigraph',
+      u'chapeau': 'highlights',
+      u'accroche': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qr': 'questions',
+      #u'faq': 'questions',
+      u'tableau': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'm\u00E9ta': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'image': 'image',
+      u'figure': 'figure',
+      u'inclure': 'include',
+      u'brut': 'raw',
+      u'remplacer': 'replace',
+      u'remplace': 'replace',
+      u'unicode': 'unicode',
+      u'date': 'date',
+      u'classe': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'titre (translation required)': 'title',
+      u'sommaire': 'contents',
+      u'table-des-mati\u00E8res': 'contents',
+      u'sectnum': 'sectnum',
+      u'section-num\u00E9rot\u00E9e': 'sectnum',
+      u'liens': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      }
+"""French name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abr\u00E9viation': 'abbreviation',
+      u'acronyme': 'acronym',
+      u'sigle': 'acronym',
+      u'index': 'index',
+      u'indice': 'subscript',
+      u'ind': 'subscript',
+      u'exposant': 'superscript',
+      u'exp': 'superscript',
+      u'titre-r\u00E9f\u00E9rence': 'title-reference',
+      u'titre': 'title-reference',
+      u'pep-r\u00E9f\u00E9rence': 'pep-reference',
+      u'rfc-r\u00E9f\u00E9rence': 'rfc-reference',
+      u'emphase': 'emphasis',
+      u'fort': 'strong',
+      u'litt\u00E9ral': 'literal',
+      u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference',
+      u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference',
+      u'note-r\u00E9f\u00E9rence': 'footnote-reference',
+      u'citation-r\u00E9f\u00E9rence': 'citation-reference',
+      u'substitution-r\u00E9f\u00E9rence': 'substitution-reference',
+      u'lien': 'target',
+      u'uri-r\u00E9f\u00E9rence': 'uri-reference',
+      u'brut': 'raw',}
+"""Mapping of French role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1': 'attention',
+      u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea': 'caution',
+      u'\u05e1\u05db\u05e0\u05d4': 'danger',
+      u'\u05e9\u05d2\u05d9\u05d0\u05d4' : 'error',
+      u'\u05e8\u05de\u05d6': 'hint',
+      u'\u05d7\u05e9\u05d5\u05d1': 'important',
+      u'\u05d4\u05e2\u05e8\u05d4': 'note',
+      u'\u05d8\u05d9\u05e4': 'tip',
+      u'\u05d0\u05d6\u05d4\u05e8\u05d4': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'\u05ea\u05de\u05d5\u05e0\u05d4': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+       u'\u05e1\u05d2\u05e0\u05d5\u05df': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      u'\u05ea\u05d5\u05db\u05df': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    u'\u05ea\u05d7\u05ea\u05d9': 'subscript',
+    'sub': 'subscript',
+    u'\u05e2\u05d9\u05dc\u05d9': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Authors: Nicola Larosa <docutils@tekNico.net>;
+#          Lele Gaifax <lele@seldati.it>
+# Copyright: This module has been placed in the public domain.
+
+# Beware: the italian translation of the reStructuredText documentation
+# at http://docit.bice.dyndns.org/static/ReST, in particular
+# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
+# to be synced with the content of this file.
+
+"""
+Italian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'attenzione': 'attention',
+      'cautela': 'caution',
+      'pericolo': 'danger',
+      'errore': 'error',
+      'suggerimento': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'consiglio': 'tip',
+      'avvertenza': 'warning',
+      'ammonizione': 'admonition',
+      'riquadro': 'sidebar',
+      'argomento': 'topic',
+      'blocco-di-righe': 'line-block',
+      'blocco-interpretato': 'parsed-literal',
+      'rubrica': 'rubric',
+      'epigrafe': 'epigraph',
+      'punti-salienti': 'highlights',
+      'estratto-evidenziato': 'pull-quote',
+      'composito': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'tabella': 'table',
+      'tabella-csv': 'csv-table',
+      'tabella-elenco': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'immagine': 'image',
+      'figura': 'figure',
+      'includi': 'include',
+      'grezzo': 'raw',
+      'sostituisci': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'ruolo': 'role',
+      'ruolo-predefinito': 'default-role',
+      'titolo': 'title',
+      'indice': 'contents',
+      'contenuti': 'contents',
+      'seznum': 'sectnum',
+      'sezioni-autonumerate': 'sectnum',
+      'annota-riferimenti-esterni': 'target-notes',
+      'intestazione': 'header',
+      'piede-pagina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Italian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      'abbreviazione': 'abbreviation',
+      'acronimo': 'acronym',
+      'indice': 'index',
+      'deponente': 'subscript',
+      'esponente': 'superscript',
+      'riferimento-titolo': 'title-reference',
+      'riferimento-pep': 'pep-reference',
+      'riferimento-rfc': 'rfc-reference',
+      'enfasi': 'emphasis',
+      'forte': 'strong',
+      'letterale': 'literal',
+      'riferimento-con-nome': 'named-reference',
+      'riferimento-anonimo': 'anonymous-reference',
+      'riferimento-nota': 'footnote-reference',
+      'riferimento-citazione': 'citation-reference',
+      'riferimento-sostituzione': 'substitution-reference',
+      'destinazione': 'target',
+      'riferimento-uri': 'uri-reference',
+      'grezzo': 'raw',}
+"""Mapping of Italian role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# Corrections to these translations are welcome!
+# é–“é•ã„ãŒã‚ã‚Œã°ã€ã©ã†ãžæ­£ã—ã„翻訳を教ãˆã¦ä¸‹ã•ã„。
+
+directives = {
+    # language-dependent: fixed
+    u'注目': 'attention',
+    u'注æ„': 'caution',
+    u'å±é™º': 'danger',
+    u'エラー': 'error',
+    u'ヒント': 'hint',
+    u'é‡è¦': 'important',
+    u'備考': 'note',
+    u'通報': 'tip',
+    u'警告': 'warning',
+    u'戒告': 'admonition',
+    u'サイドãƒãƒ¼': 'sidebar',
+    u'トピック': 'topic',
+    u'ラインブロック': 'line-block',
+    u'パーズドリテラル': 'parsed-literal',
+    u'ルブリック': 'rubric',
+    u'エピグラフ': 'epigraph',
+    u'題言': 'epigraph',
+    u'ãƒã‚¤ãƒ©ã‚¤ãƒˆ': 'highlights',
+    u'見所': 'highlights',
+    u'プルクオート': 'pull-quote',
+    u'åˆæˆ': 'compound',
+    u'コンテナー': 'container',
+    u'容器': 'container',
+    u'表': 'table',
+    u'csv表': 'csv-table',
+    u'リスト表': 'list-table',
+    #u'質å•': 'questions',
+    #u'å•ç­”': 'questions',
+    #u'faq': 'questions',
+    u'メタ': 'meta',
+    #u'イメージマプ': 'imagemap',
+    u'イメージ': 'image',
+    u'ç”»åƒ': 'image',
+    u'フィグア': 'figure',
+    u'図版': 'figure',
+    u'インクルード': 'include',
+    u'å«ã‚€': 'include',
+    u'組ã¿è¾¼ã¿': 'include',
+    u'生': 'raw',
+    u'原': 'raw',
+    u'æ›ãˆã‚‹': 'replace',
+    u'å–ã‚Šæ›ãˆã‚‹': 'replace',
+    u'掛ã‘替ãˆã‚‹': 'replace',
+    u'ユニコード': 'unicode',
+    u'日付': 'date',
+    u'クラス': 'class',
+    u'ロール': 'role',
+    u'å½¹': 'role',
+    u'ディフォルトロール': 'default-role',
+    u'既定役': 'default-role',
+    u'タイトル': 'title',
+    u'é¡Œ': 'title',                    # é¡Œå 件å
+    u'目次': 'contents',
+    u'節数': 'sectnum',
+    u'ヘッダ': 'header',
+    u'フッタ': 'footer',
+    #u'脚注': 'footnotes',             # 脚註?
+    #u'サイテーション': 'citations',   # 出典 引証 引用
+    u'ターゲットノート': 'target-notes', # 的注 的脚注
+    }
+"""Japanese name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'ç•¥': 'abbreviation',
+    u'頭字語': 'acronym',
+    u'インデックス': 'index',
+    u'索引': 'index',
+    u'添字': 'subscript',
+    u'下付': 'subscript',
+    u'下': 'subscript',
+    u'上付': 'superscript',
+    u'上': 'superscript',
+    u'é¡Œå‚ç…§': 'title-reference',
+    u'pepå‚ç…§': 'pep-reference',
+    u'rfcå‚ç…§': 'rfc-reference',
+    u'強調': 'emphasis',
+    u'å¼·ã„': 'strong',
+    u'リテラル': 'literal',
+    u'整形済ã¿': 'literal',
+    u'å付å‚ç…§': 'named-reference',
+    u'ç„¡åå‚ç…§': 'anonymous-reference',
+    u'脚注å‚ç…§': 'footnote-reference',
+    u'出典å‚ç…§': 'citation-reference',
+    u'代入å‚ç…§': 'substitution-reference',
+    u'çš„': 'target',
+    u'uriå‚ç…§': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'生': 'raw',}
+"""Mapping of Japanese role names to canonical role names for interpreted
+text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,108 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attentie': 'attention',
+      'let-op': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'hint': 'hint',
+      'belangrijk': 'important',
+      'opmerking': 'note',
+      'tip': 'tip',
+      'waarschuwing': 'warning',
+      'aanmaning': 'admonition',
+      'katern': 'sidebar',
+      'onderwerp': 'topic',
+      'lijn-blok': 'line-block',
+      'letterlijk-ontleed': 'parsed-literal',
+      'rubriek': 'rubric',
+      'opschrift': 'epigraph',
+      'hoogtepunten': 'highlights',
+      'pull-quote': 'pull-quote', # Dutch printers use the english term
+      'samenstelling': 'compound',
+      'verbinding': 'compound',
+      u'container (translation required)': 'container',
+      #'vragen': 'questions',
+      'tabel': 'table',
+      'csv-tabel': 'csv-table',
+      'lijst-tabel': 'list-table',
+      #'veelgestelde-vragen': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'opnemen': 'include',
+      'onbewerkt': 'raw',
+      'vervang': 'replace',
+      'vervanging': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'sectie-nummering': 'sectnum',
+      'hoofdstuk-nummering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnoten': 'footnotes',
+      #'citaten': 'citations',
+      'verwijzing-voetnoten': 'target-notes',
+      'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
+"""Dutch name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'afkorting': 'abbreviation',
+    # 'ab': 'abbreviation',
+    'acroniem': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'inferieur': 'subscript',
+    'inf': 'subscript',
+    'superieur': 'superscript',
+    'sup': 'superscript',
+    'titel-referentie': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-referentie': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-referentie': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'extra': 'strong',
+    'extra-nadruk': 'strong',
+    'vet': 'strong',
+    'letterlijk': 'literal',
+    'benoemde-referentie': 'named-reference',
+    'anonieme-referentie': 'anonymous-reference',
+    'voetnoot-referentie': 'footnote-reference',
+    'citaat-referentie': 'citation-reference',
+    'substitie-reference': 'substitution-reference',
+    'verwijzing': 'target',
+    'uri-referentie': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'onbewerkt': 'raw',}
+"""Mapping of Dutch role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'aten\u00E7\u00E3o': 'attention',
+      'cuidado': 'caution',
+      'perigo': 'danger',
+      'erro': 'error',
+      u'sugest\u00E3o': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'dica': 'tip',
+      'aviso': 'warning',
+      u'exorta\u00E7\u00E3o': 'admonition',
+      'barra-lateral': 'sidebar',
+      u't\u00F3pico': 'topic',
+      'bloco-de-linhas': 'line-block',
+      'literal-interpretado': 'parsed-literal',
+      'rubrica': 'rubric',
+      u'ep\u00EDgrafo': 'epigraph',
+      'destaques': 'highlights',
+      u'cita\u00E7\u00E3o-destacada': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'perguntas': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'imagem': 'image',
+      'figura': 'figure',
+      u'inclus\u00E3o': 'include',
+      'cru': 'raw',
+      u'substitui\u00E7\u00E3o': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'\u00EDndice': 'contents',
+      'numsec': 'sectnum',
+      u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'notas-de-rorap\u00E9': 'footnotes',
+      #u'cita\u00E7\u00F5es': 'citations',
+      u'links-no-rodap\u00E9': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Brazilian Portuguese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbrevia\u00E7\u00E3o': 'abbreviation',
+    'ab': 'abbreviation',
+    u'acr\u00F4nimo': 'acronym',
+    'ac': 'acronym',
+    u'\u00EDndice-remissivo': 'index',
+    'i': 'index',
+    'subscrito': 'subscript',
+    'sub': 'subscript',
+    'sobrescrito': 'superscript',
+    'sob': 'superscript',
+    u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference',
+    u't\u00EDtulo': 'title-reference',
+    't': 'title-reference',
+    u'refer\u00EAncia-a-pep': 'pep-reference',
+    'pep': 'pep-reference',
+    u'refer\u00EAncia-a-rfc': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    u'\u00EAnfase': 'emphasis',
+    'forte': 'strong',
+    'literal': 'literal',               # translation required?
+    u'refer\u00EAncia-por-nome': 'named-reference',
+    u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference',
+    u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference',
+    u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference',
+    u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference',
+    'alvo': 'target',
+    u'refer\u00EAncia-a-uri': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'cru': 'raw',}
+"""Mapping of Brazilian Portuguese role names to canonical role names
+for interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+directives = {
+ u'\u0431\u043b\u043e\u043a-\u0441\u0442\u0440\u043e\u043a': u'line-block',
+ u'meta': u'meta',
+ u'\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439-\u043b\u0438\u0442\u0435\u0440\u0430\u043b':
+ u'parsed-literal',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f-\u0446\u0438\u0442\u0430\u0442\u0430':
+ u'pull-quote',
+ u'compound (translation required)': 'compound',
+ u'container (translation required)': 'container',
+ u'table (translation required)': 'table',
+ u'csv-table (translation required)': 'csv-table',
+ u'list-table (translation required)': 'list-table',
+ u'\u0441\u044b\u0440\u043e\u0439': u'raw',
+ u'\u0437\u0430\u043c\u0435\u043d\u0430': u'replace',
+ u'\u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f-\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430-restructuredtext':
+ u'restructuredtext-test-directive',
+ u'\u0446\u0435\u043b\u0435\u0432\u044b\u0435-\u0441\u043d\u043e\u0441\u043a\u0438': 
+ u'target-notes',
+ u'unicode': u'unicode',
+ u'\u0434\u0430\u0442\u0430': u'date',
+ u'\u0431\u043e\u043a\u043e\u0432\u0430\u044f-\u043f\u043e\u043b\u043e\u0441\u0430':
+ u'sidebar',
+ u'\u0432\u0430\u0436\u043d\u043e': u'important',
+ u'\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c': u'include',
+ u'\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435': u'attention',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': u'highlights',
+ u'\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'admonition',
+ u'\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435':
+ u'image',
+ u'\u043a\u043b\u0430\u0441\u0441': u'class',
+ u'role (translation required)': 'role',
+ u'default-role (translation required)': 'default-role',
+ u'title (translation required)': 'title',
+ u'\u043d\u043e\u043c\u0435\u0440-\u0440\u0430\u0437\u0434\u0435\u043b\u0430':
+ u'sectnum',
+ u'\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f-\u0440\u0430\u0437'
+ u'\u0434\u0435\u043b\u043e\u0432': u'sectnum',
+ u'\u043e\u043f\u0430\u0441\u043d\u043e': u'danger',
+ u'\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e': u'caution',
+ u'\u043e\u0448\u0438\u0431\u043a\u0430': u'error',
+ u'\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430': u'tip',
+ u'\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d'
+ u'\u0438\u0435': u'warning',
+ u'\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'note',
+ u'\u0440\u0438\u0441\u0443\u043d\u043e\u043a': u'figure',
+ u'\u0440\u0443\u0431\u0440\u0438\u043a\u0430': u'rubric',
+ u'\u0441\u043e\u0432\u0435\u0442': u'hint',
+ u'\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435': u'contents',
+ u'\u0442\u0435\u043c\u0430': u'topic',
+ u'\u044d\u043f\u0438\u0433\u0440\u0430\u0444': u'epigraph',
+ u'header (translation required)': 'header',
+ u'footer (translation required)': 'footer',}
+"""Russian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ u'\u0430\u043a\u0440\u043e\u043d\u0438\u043c': 'acronym',
+ u'\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'anonymous-reference',
+ u'\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e': 'literal',
+ u'\u0432\u0435\u0440\u0445\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'superscript',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': 'emphasis',
+ u'\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'named-reference',
+ u'\u0438\u043d\u0434\u0435\u043a\u0441': 'index',
+ u'\u043d\u0438\u0436\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'subscript',
+ u'\u0441\u0438\u043b\u044c\u043d\u043e\u0435-\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435':
+  'strong',
+ u'\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435':
+  'abbreviation',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u0430':
+  'substitution-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-pep': 'pep-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-rfc': 'rfc-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-uri': 'uri-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435':
+  'title-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0441\u043d\u043e\u0441\u043a\u0443':
+  'footnote-reference',
+ u'\u0446\u0438\u0442\u0430\u0442\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'citation-reference',
+ u'\u0446\u0435\u043b\u044c': 'target',
+ u'raw (translation required)': 'raw',}
+"""Mapping of Russian role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,91 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'pozor': 'attention',
+      u'opatrne': 'caution',
+      u'nebezpe\xe8enstvo': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\xf4le\x9eit\xe9': 'important',
+      u'pozn\xe1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varovanie': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\xe9ma': 'topic',
+      u'blok-riadkov': 'line-block',
+      u'parsed-literal': 'parsed-literal',
+      u'rubric (translation required)': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qa': 'questions',
+      #u'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      #u'imagemap': 'imagemap',
+      u'obr\xe1zok': 'image',
+      u'tvar': 'figure',
+      u'vlo\x9ei\x9d': 'include',
+      u'raw (translation required)': 'raw',
+      u'nahradi\x9d': 'replace',
+      u'unicode': 'unicode',
+      u'd\u00E1tum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'\xe8as\x9d': 'sectnum',
+      u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum',
+      u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes': 'footnotes',
+      #u'citations': 'citations',
+      }
+"""Slovak name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'raw (translation required)': 'raw',}
+"""Mapping of Slovak role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'observera': 'attention',
+      u'caution (translation required)': 'caution',
+      u'fara': 'danger',
+      u'fel': 'error',
+      u'v\u00e4gledning': 'hint',
+      u'viktigt': 'important',
+      u'notera': 'note',
+      u'tips': 'tip',
+      u'varning': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u'\u00e4mne': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'mellanrubrik': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      # u'fr\u00e5gor': 'questions',
+      # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/:
+      # u'fr\u00e5gor-och-svar': 'questions',
+      # u'vanliga-fr\u00e5gor': 'questions',  
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      # u'bildkarta': 'imagemap',   # FIXME: Translation might be too literal.
+      u'bild': 'image',
+      u'figur': 'figure',
+      u'inkludera': 'include',   
+      u'r\u00e5': 'raw',            # FIXME: Translation might be too literal.
+      u'ers\u00e4tt': 'replace', 
+      u'unicode': 'unicode',
+      u'datum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'inneh\u00e5ll': 'contents',
+      u'sektionsnumrering': 'sectnum',
+      u'target-notes (translation required)': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      # u'fotnoter': 'footnotes',
+      # u'citeringar': 'citations',
+      }
+"""Swedish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'r\u00e5': 'raw',}
+"""Mapping of Swedish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Panjunyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'注æ„': 'attention',
+      u'å°å¿ƒ': 'caution',
+      u'å±é™©': 'danger',
+      u'错误': 'error',
+      u'æ示': 'hint',
+      u'é‡è¦': 'important',
+      u'注解': 'note',
+      u'技巧': 'tip',
+      u'警告': 'warning',
+      u'å¿ å‘Š': 'admonition',
+      u'侧框': 'sidebar',
+      u'主题': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'醒目': 'rubric',
+      u'é“­æ–‡': 'epigraph',
+      u'è¦ç‚¹': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'å¤åˆ': 'compound',
+      u'容器': 'container',
+      #u'questions (translation required)': 'questions',
+      u'表格': 'table',
+      u'csv表格': 'csv-table',
+      u'列表表格': 'list-table',
+      #u'qa (translation required)': 'questions',
+      #u'faq (translation required)': 'questions',
+      u'元数æ®': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'图片': 'image',
+      u'图例': 'figure',
+      u'包å«': 'include',
+      u'原文': 'raw',
+      u'代替': 'replace',
+      u'统一ç ': 'unicode',
+      u'日期': 'date',
+      u'类型': 'class',
+      u'角色': 'role',
+      u'默认角色': 'default-role',
+      u'标题': 'title',
+      u'目录': 'contents',
+      u'章节åºå·': 'sectnum',
+      u'题头': 'header',
+      u'页脚': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Simplified Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'缩写': 'abbreviation',
+    u'简称': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'下标': 'subscript',
+    u'上标': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'强调': 'emphasis',
+    u'加粗': 'strong',
+    u'å­—é¢': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Simplified Chinese role names to canonical role names
+for interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention (translation required)': 'attention',
+      'caution (translation required)': 'caution',
+      'danger (translation required)': 'danger',
+      'error (translation required)': 'error',
+      'hint (translation required)': 'hint',
+      'important (translation required)': 'important',
+      'note (translation required)': 'note',
+      'tip (translation required)': 'tip',
+      'warning (translation required)': 'warning',
+      'admonition (translation required)': 'admonition',
+      'sidebar (translation required)': 'sidebar',
+      'topic (translation required)': 'topic',
+      'line-block (translation required)': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubric (translation required)': 'rubric',
+      'epigraph (translation required)': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions (translation required)': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      #'qa (translation required)': 'questions',
+      #'faq (translation required)': 'questions',
+      'meta (translation required)': 'meta',
+      #'imagemap (translation required)': 'imagemap',
+      'image (translation required)': 'image',
+      'figure (translation required)': 'figure',
+      'include (translation required)': 'include',
+      'raw (translation required)': 'raw',
+      'replace (translation required)': 'replace',
+      'unicode (translation required)': 'unicode',
+      u'日期': 'date',
+      'class (translation required)': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'contents (translation required)': 'contents',
+      'sectnum (translation required)': 'sectnum',
+      'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes (translation required)': 'footnotes',
+      #'citations (translation required)': 'citations',
+      'target-notes (translation required)': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Traditional Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation (translation required)': 'abbreviation',
+    'ab (translation required)': 'abbreviation',
+    'acronym (translation required)': 'acronym',
+    'ac (translation required)': 'acronym',
+    'index (translation required)': 'index',
+    'i (translation required)': 'index',
+    'subscript (translation required)': 'subscript',
+    'sub (translation required)': 'subscript',
+    'superscript (translation required)': 'superscript',
+    'sup (translation required)': 'superscript',
+    'title-reference (translation required)': 'title-reference',
+    'title (translation required)': 'title-reference',
+    't (translation required)': 'title-reference',
+    'pep-reference (translation required)': 'pep-reference',
+    'pep (translation required)': 'pep-reference',
+    'rfc-reference (translation required)': 'rfc-reference',
+    'rfc (translation required)': 'rfc-reference',
+    'emphasis (translation required)': 'emphasis',
+    'strong (translation required)': 'strong',
+    'literal (translation required)': 'literal',
+    'named-reference (translation required)': 'named-reference',
+    'anonymous-reference (translation required)': 'anonymous-reference',
+    'footnote-reference (translation required)': 'footnote-reference',
+    'citation-reference (translation required)': 'citation-reference',
+    'substitution-reference (translation required)': 'substitution-reference',
+    'target (translation required)': 'target',
+    'uri-reference (translation required)': 'uri-reference',
+    'uri (translation required)': 'uri-reference',
+    'url (translation required)': 'uri-reference',
+    'raw (translation required)': 'raw',}
+"""Mapping of Traditional Chinese role names to canonical role names for
+interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,346 @@
+# $Id: roles.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Edward Loper <edloper@gradient.cis.upenn.edu>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines standard interpreted text role functions, a registry for
+interpreted text roles, and an API for adding to and retrieving from the
+registry.
+
+The interface for interpreted role functions is as follows::
+
+    def role_fn(name, rawtext, text, lineno, inliner,
+                options={}, content=[]):
+        code...
+
+    # Set function attributes for customization:
+    role_fn.options = ...
+    role_fn.content = ...
+
+Parameters:
+
+- ``name`` is the local name of the interpreted text role, the role name
+  actually used in the document.
+
+- ``rawtext`` is a string containing the entire interpreted text construct.
+  Return it as a ``problematic`` node linked to a system message if there is a
+  problem.
+
+- ``text`` is the interpreted text content, with backslash escapes converted
+  to nulls (``\x00``).
+
+- ``lineno`` is the line number where the interpreted text beings.
+
+- ``inliner`` is the Inliner object that called the role function.
+  It defines the following useful attributes: ``reporter``,
+  ``problematic``, ``memo``, ``parent``, ``document``.
+
+- ``options``: A dictionary of directive options for customization, to be
+  interpreted by the role function.  Used for additional attributes for the
+  generated elements and other functionality.
+
+- ``content``: A list of strings, the directive content for customization
+  ("role" directive).  To be interpreted by the role function.
+
+Function attributes for customization, interpreted by the "role" directive:
+
+- ``options``: A dictionary, mapping known option names to conversion
+  functions such as `int` or `float`.  ``None`` or an empty dict implies no
+  options to parse.  Several directive option conversion functions are defined
+  in the `directives` module.
+
+  All role functions implicitly support the "class" option, unless disabled
+  with an explicit ``{'class': None}``.
+
+- ``content``: A boolean; true if content is allowed.  Client code must handle
+  the case where content is required but not supplied (an empty content list
+  will be supplied).
+
+Note that unlike directives, the "arguments" function attribute is not
+supported for role customization.  Directive arguments are handled by the
+"role" directive itself.
+
+Interpreted role functions return a tuple of two values:
+
+- A list of nodes which will be inserted into the document tree at the
+  point where the interpreted role was encountered (can be an empty
+  list).
+
+- A list of system messages, which will be inserted into the document tree
+  immediately after the end of the current inline block (can also be empty).
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+DEFAULT_INTERPRETED_ROLE = 'title-reference'
+"""
+The canonical name of the default interpreted role.  This role is used
+when no role is specified for a piece of interpreted text.
+"""
+
+_role_registry = {}
+"""Mapping of canonical role names to role functions.  Language-dependent role
+names are defined in the ``language`` subpackage."""
+
+_roles = {}
+"""Mapping of local or language-dependent interpreted text role names to role
+functions."""
+
+def role(role_name, language_module, lineno, reporter):
+    """
+    Locate and return a role function from its language-dependent name, along
+    with a list of system messages.  If the role is not found in the current
+    language, check English.  Return a 2-tuple: role function (``None`` if the
+    named role cannot be found) and a list of system messages.
+    """
+    normname = role_name.lower()
+    messages = []
+    msg_text = []
+
+    if _roles.has_key(normname):
+        return _roles[normname], messages
+
+    if role_name:
+        canonicalname = None
+        try:
+            canonicalname = language_module.roles[normname]
+        except AttributeError, error:
+            msg_text.append('Problem retrieving role entry from language '
+                            'module %r: %s.' % (language_module, error))
+        except KeyError:
+            msg_text.append('No role entry for "%s" in module "%s".'
+                            % (role_name, language_module.__name__))
+    else:
+        canonicalname = DEFAULT_INTERPRETED_ROLE
+
+    # If we didn't find it, try English as a fallback.
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.roles[normname]
+            msg_text.append('Using English fallback for role "%s".'
+                            % role_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical role name.'
+                            % role_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+
+    # Collect any messages that we generated.
+    if msg_text:
+        message = reporter.info('\n'.join(msg_text), line=lineno)
+        messages.append(message)
+
+    # Look the role up in the registry, and return it.
+    if _role_registry.has_key(canonicalname):
+        role_fn = _role_registry[canonicalname]
+        register_local_role(normname, role_fn)
+        return role_fn, messages
+    else:
+        return None, messages # Error message will be generated by caller.
+
+def register_canonical_role(name, role_fn):
+    """
+    Register an interpreted text role by its canonical name.
+
+    :Parameters:
+      - `name`: The canonical name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _role_registry[name] = role_fn
+
+def register_local_role(name, role_fn):
+    """
+    Register an interpreted text role by its local or language-dependent name.
+
+    :Parameters:
+      - `name`: The local or language-dependent name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _roles[name] = role_fn
+
+def set_implicit_options(role_fn):
+    """
+    Add customization options to role functions, unless explicitly set or
+    disabled.
+    """
+    if not hasattr(role_fn, 'options') or role_fn.options is None:
+        role_fn.options = {'class': directives.class_option}
+    elif not role_fn.options.has_key('class'):
+        role_fn.options['class'] = directives.class_option
+
+def register_generic_role(canonical_name, node_class):
+    """For roles which simply wrap a given `node_class` around the text."""
+    role = GenericRole(canonical_name, node_class)
+    register_canonical_role(canonical_name, role)
+
+
+class GenericRole:
+
+    """
+    Generic interpreted text role, where the interpreted text is simply
+    wrapped with the provided node class.
+    """
+
+    def __init__(self, role_name, node_class):
+        self.name = role_name
+        self.node_class = node_class
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        set_classes(options)
+        return [self.node_class(rawtext, utils.unescape(text), **options)], []
+
+
+class CustomRole:
+
+    """
+    Wrapper for custom interpreted text roles.
+    """
+
+    def __init__(self, role_name, base_role, options={}, content=[]):
+        self.name = role_name
+        self.base_role = base_role
+        self.options = None
+        if hasattr(base_role, 'options'):
+            self.options = base_role.options
+        self.content = None
+        if hasattr(base_role, 'content'):
+            self.content = base_role.content
+        self.supplied_options = options
+        self.supplied_content = content
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        opts = self.supplied_options.copy()
+        opts.update(options)
+        cont = list(self.supplied_content)
+        if cont and content:
+            cont += '\n'
+        cont.extend(content)
+        return self.base_role(role, rawtext, text, lineno, inliner,
+                              options=opts, content=cont)
+
+
+def generic_custom_role(role, rawtext, text, lineno, inliner,
+                        options={}, content=[]):
+    """"""
+    # Once nested inline markup is implemented, this and other methods should
+    # recursively call inliner.nested_parse().
+    set_classes(options)
+    return [nodes.inline(rawtext, utils.unescape(text), **options)], []
+
+generic_custom_role.options = {'class': directives.class_option}
+
+
+######################################################################
+# Define and register the standard roles:
+######################################################################
+
+register_generic_role('abbreviation', nodes.abbreviation)
+register_generic_role('acronym', nodes.acronym)
+register_generic_role('emphasis', nodes.emphasis)
+register_generic_role('literal', nodes.literal)
+register_generic_role('strong', nodes.strong)
+register_generic_role('subscript', nodes.subscript)
+register_generic_role('superscript', nodes.superscript)
+register_generic_role('title-reference', nodes.title_reference)
+
+def pep_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        pepnum = int(text)
+        if pepnum < 0 or pepnum > 9999:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'PEP number must be a number from 0 to 9999; "%s" is invalid.'
+            % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.pep_reference; so this is correct:
+    ref = (inliner.document.settings.pep_base_url
+           + inliner.document.settings.pep_file_url_template % pepnum)
+    set_classes(options)
+    return [nodes.reference(rawtext, 'PEP ' + utils.unescape(text), refuri=ref,
+                            **options)], []
+
+register_canonical_role('pep-reference', pep_reference_role)
+
+def rfc_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        rfcnum = int(text)
+        if rfcnum <= 0:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'RFC number must be a number greater than or equal to 1; '
+            '"%s" is invalid.' % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.rfc_reference, so this is correct:
+    ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+    set_classes(options)
+    node = nodes.reference(rawtext, 'RFC ' + utils.unescape(text), refuri=ref,
+                           **options)
+    return [node], []
+
+register_canonical_role('rfc-reference', rfc_reference_role)
+
+def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    if not options.has_key('format'):
+        msg = inliner.reporter.error(
+            'No format (Writer name) is associated with this role: "%s".\n'
+            'The "raw" role cannot be used directly.\n'
+            'Instead, use the "role" directive to create a new role with '
+            'an associated format.' % role, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    set_classes(options)
+    node = nodes.raw(rawtext, utils.unescape(text, 1), **options)
+    return [node], []
+
+raw_role.options = {'format': directives.unchanged}
+
+register_canonical_role('raw', raw_role)
+
+
+######################################################################
+# Register roles that are currently unimplemented.
+######################################################################
+
+def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}):
+    msg = inliner.reporter.error(
+        'Interpreted text role "%s" not implemented.' % role, line=lineno)
+    prb = inliner.problematic(rawtext, rawtext, msg)
+    return [prb], [msg]
+
+register_canonical_role('index', unimplemented_role)
+register_canonical_role('named-reference', unimplemented_role)
+register_canonical_role('anonymous-reference', unimplemented_role)
+register_canonical_role('uri-reference', unimplemented_role)
+register_canonical_role('footnote-reference', unimplemented_role)
+register_canonical_role('citation-reference', unimplemented_role)
+register_canonical_role('substitution-reference', unimplemented_role)
+register_canonical_role('target', unimplemented_role)
+
+# This should remain unimplemented, for testing purposes:
+register_canonical_role('restructuredtext-unimplemented-role',
+                        unimplemented_role)
+
+
+def set_classes(options):
+    """
+    Auxiliary function to set options['classes'] and delete
+    options['class'].
+    """
+    if options.has_key('class'):
+        assert not options.has_key('classes')
+        options['classes'] = options['class']
+        del options['class']
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2988 @@
+# $Id: states.py 4824 2006-12-09 00:59:23Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the ``docutils.parsers.restructuredtext.states`` module, the core of
+the reStructuredText parser.  It defines the following:
+
+:Classes:
+    - `RSTStateMachine`: reStructuredText parser's entry point.
+    - `NestedStateMachine`: recursive StateMachine.
+    - `RSTState`: reStructuredText State superclass.
+    - `Inliner`: For parsing inline markup.
+    - `Body`: Generic classifier of the first line of a block.
+    - `SpecializedBody`: Superclass for compound element members.
+    - `BulletList`: Second and subsequent bullet_list list_items
+    - `DefinitionList`: Second+ definition_list_items.
+    - `EnumeratedList`: Second+ enumerated_list list_items.
+    - `FieldList`: Second+ fields.
+    - `OptionList`: Second+ option_list_items.
+    - `RFC2822List`: Second+ RFC2822-style fields.
+    - `ExtensionOptions`: Parses directive option fields.
+    - `Explicit`: Second+ explicit markup constructs.
+    - `SubstitutionDef`: For embedded directives in substitution definitions.
+    - `Text`: Classifier of second line of a text block.
+    - `SpecializedText`: Superclass for continuation lines of Text-variants.
+    - `Definition`: Second line of potential definition_list_item.
+    - `Line`: Second line of overlined section title or transition marker.
+    - `Struct`: An auxiliary collection class.
+
+:Exception classes:
+    - `MarkupError`
+    - `ParserError`
+    - `MarkupMismatch`
+
+:Functions:
+    - `escape2null()`: Return a string, escape-backslashes converted to nulls.
+    - `unescape()`: Return a string, nulls removed or restored to backslashes.
+
+:Attributes:
+    - `state_classes`: set of State classes used with `RSTStateMachine`.
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a recursive state machine,
+examining its input one line at a time.  To understand how the parser works,
+please first become familiar with the `docutils.statemachine` module.  In the
+description below, references are made to classes defined in this module;
+please see the individual classes for details.
+
+Parsing proceeds as follows:
+
+1. The state machine examines each line of input, checking each of the
+   transition patterns of the state `Body`, in order, looking for a match.
+   The implicit transitions (blank lines and indentation) are checked before
+   any others.  The 'text' transition is a catch-all (matches anything).
+
+2. The method associated with the matched transition pattern is called.
+
+   A. Some transition methods are self-contained, appending elements to the
+      document tree (`Body.doctest` parses a doctest block).  The parser's
+      current line index is advanced to the end of the element, and parsing
+      continues with step 1.
+
+   B. Other transition methods trigger the creation of a nested state machine,
+      whose job is to parse a compound construct ('indent' does a block quote,
+      'bullet' does a bullet list, 'overline' does a section [first checking
+      for a valid section header], etc.).
+
+      - In the case of lists and explicit markup, a one-off state machine is
+        created and run to parse contents of the first item.
+
+      - A new state machine is created and its initial state is set to the
+        appropriate specialized state (`BulletList` in the case of the
+        'bullet' transition; see `SpecializedBody` for more detail).  This
+        state machine is run to parse the compound element (or series of
+        explicit markup elements), and returns as soon as a non-member element
+        is encountered.  For example, the `BulletList` state machine ends as
+        soon as it encounters an element which is not a list item of that
+        bullet list.  The optional omission of inter-element blank lines is
+        enabled by this nested state machine.
+
+      - The current line index is advanced to the end of the elements parsed,
+        and parsing continues with step 1.
+
+   C. The result of the 'text' transition depends on the next line of text.
+      The current state is changed to `Text`, under which the second line is
+      examined.  If the second line is:
+
+      - Indented: The element is a definition list item, and parsing proceeds
+        similarly to step 2.B, using the `DefinitionList` state.
+
+      - A line of uniform punctuation characters: The element is a section
+        header; again, parsing proceeds as in step 2.B, and `Body` is still
+        used.
+
+      - Anything else: The element is a paragraph, which is examined for
+        inline markup and appended to the parent element.  Processing
+        continues with step 1.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import re
+import roman
+from types import TupleType, FunctionType, MethodType
+from docutils import nodes, statemachine, utils, urischemes
+from docutils import ApplicationError, DataError
+from docutils.statemachine import StateMachineWS, StateWS
+from docutils.nodes import fully_normalize_name as normalize_name
+from docutils.nodes import whitespace_normalize_name
+from docutils.utils import escape2null, unescape, column_width
+import docutils.parsers.rst
+from docutils.parsers.rst import directives, languages, tableparser, roles
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+class MarkupError(DataError): pass
+class UnknownInterpretedRoleError(DataError): pass
+class InterpretedRoleNotImplementedError(DataError): pass
+class ParserError(ApplicationError): pass
+class MarkupMismatch(Exception): pass
+
+
+class Struct:
+
+    """Stores data attributes for dotted-attribute access."""
+
+    def __init__(self, **keywordargs):
+        self.__dict__.update(keywordargs)
+
+
+class RSTStateMachine(StateMachineWS):
+
+    """
+    reStructuredText's master StateMachine.
+
+    The entry point to reStructuredText parsing is the `run()` method.
+    """
+
+    def run(self, input_lines, document, input_offset=0, match_titles=1,
+            inliner=None):
+        """
+        Parse `input_lines` and modify the `document` node in place.
+
+        Extend `StateMachineWS.run()`: set up parse-global data and
+        run the StateMachine.
+        """
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.match_titles = match_titles
+        if inliner is None:
+            inliner = Inliner()
+        inliner.init_customizations(document.settings)
+        self.memo = Struct(document=document,
+                           reporter=document.reporter,
+                           language=self.language,
+                           title_styles=[],
+                           section_level=0,
+                           section_bubble_up_kludge=0,
+                           inliner=inliner)
+        self.document = document
+        self.attach_observer(document.note_source)
+        self.reporter = self.memo.reporter
+        self.node = document
+        results = StateMachineWS.run(self, input_lines, input_offset,
+                                     input_source=document['source'])
+        assert results == [], 'RSTStateMachine.run() results should be empty!'
+        self.node = self.memo = None    # remove unneeded references
+
+
+class NestedStateMachine(StateMachineWS):
+
+    """
+    StateMachine run from within other StateMachine runs, to parse nested
+    document structures.
+    """
+
+    def run(self, input_lines, input_offset, memo, node, match_titles=1):
+        """
+        Parse `input_lines` and populate a `docutils.nodes.document` instance.
+
+        Extend `StateMachineWS.run()`: set up document-wide data.
+        """
+        self.match_titles = match_titles
+        self.memo = memo
+        self.document = memo.document
+        self.attach_observer(self.document.note_source)
+        self.reporter = memo.reporter
+        self.language = memo.language
+        self.node = node
+        results = StateMachineWS.run(self, input_lines, input_offset)
+        assert results == [], ('NestedStateMachine.run() results should be '
+                               'empty!')
+        return results
+
+
+class RSTState(StateWS):
+
+    """
+    reStructuredText State superclass.
+
+    Contains methods used by all State subclasses.
+    """
+
+    nested_sm = NestedStateMachine
+
+    def __init__(self, state_machine, debug=0):
+        self.nested_sm_kwargs = {'state_classes': state_classes,
+                                 'initial_state': 'Body'}
+        StateWS.__init__(self, state_machine, debug)
+
+    def runtime_init(self):
+        StateWS.runtime_init(self)
+        memo = self.state_machine.memo
+        self.memo = memo
+        self.reporter = memo.reporter
+        self.inliner = memo.inliner
+        self.document = memo.document
+        self.parent = self.state_machine.node
+
+    def goto_line(self, abs_line_offset):
+        """
+        Jump to input line `abs_line_offset`, ignoring jumps past the end.
+        """
+        try:
+            self.state_machine.goto_line(abs_line_offset)
+        except EOFError:
+            pass
+
+    def no_match(self, context, transitions):
+        """
+        Override `StateWS.no_match` to generate a system message.
+
+        This code should never be run.
+        """
+        self.reporter.severe(
+            'Internal error: no transition pattern match.  State: "%s"; '
+            'transitions: %s; context: %s; current line: %r.'
+            % (self.__class__.__name__, transitions, context,
+               self.state_machine.line),
+            line=self.state_machine.abs_line_number())
+        return context, None, []
+
+    def bof(self, context):
+        """Called at beginning of file."""
+        return [], []
+
+    def nested_parse(self, block, input_offset, node, match_titles=0,
+                     state_machine_class=None, state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs
+        block_length = len(block)
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        state_machine.unlink()
+        new_offset = state_machine.abs_line_offset()
+        # No `block.parent` implies disconnected -- lines aren't in sync:
+        if block.parent and (len(block) - block_length) != 0:
+            # Adjustment for block if modified in nested parse:
+            self.state_machine.next_line(len(block) - block_length)
+        return new_offset
+
+    def nested_list_parse(self, block, input_offset, node, initial_state,
+                          blank_finish,
+                          blank_finish_state=None,
+                          extra_settings={},
+                          match_titles=0,
+                          state_machine_class=None,
+                          state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`. Also keep track of optional intermediate blank lines and the
+        required final one.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs.copy()
+        state_machine_kwargs['initial_state'] = initial_state
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        if blank_finish_state is None:
+            blank_finish_state = initial_state
+        state_machine.states[blank_finish_state].blank_finish = blank_finish
+        for key, value in extra_settings.items():
+            setattr(state_machine.states[initial_state], key, value)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        blank_finish = state_machine.states[blank_finish_state].blank_finish
+        state_machine.unlink()
+        return state_machine.abs_line_offset(), blank_finish
+
+    def section(self, title, source, style, lineno, messages):
+        """Check for a valid subsection and create one if it checks out."""
+        if self.check_subsection(source, style, lineno):
+            self.new_subsection(title, lineno, messages)
+
+    def check_subsection(self, source, style, lineno):
+        """
+        Check for a valid subsection header.  Return 1 (true) or None (false).
+
+        When a new section is reached that isn't a subsection of the current
+        section, back up the line count (use ``previous_line(-x)``), then
+        ``raise EOFError``.  The current StateMachine will finish, then the
+        calling StateMachine can re-examine the title.  This will work its way
+        back up the calling chain until the correct section level isreached.
+
+        @@@ Alternative: Evaluate the title, store the title info & level, and
+        back up the chain until that level is reached.  Store in memo? Or
+        return in results?
+
+        :Exception: `EOFError` when a sibling or supersection encountered.
+        """
+        memo = self.memo
+        title_styles = memo.title_styles
+        mylevel = memo.section_level
+        try:                            # check for existing title style
+            level = title_styles.index(style) + 1
+        except ValueError:              # new title style
+            if len(title_styles) == memo.section_level: # new subsection
+                title_styles.append(style)
+                return 1
+            else:                       # not at lowest level
+                self.parent += self.title_inconsistent(source, lineno)
+                return None
+        if level <= mylevel:            # sibling or supersection
+            memo.section_level = level   # bubble up to parent section
+            if len(style) == 2:
+                memo.section_bubble_up_kludge = 1
+            # back up 2 lines for underline title, 3 for overline title
+            self.state_machine.previous_line(len(style) + 1)
+            raise EOFError              # let parent section re-evaluate
+        if level == mylevel + 1:        # immediate subsection
+            return 1
+        else:                           # invalid subsection
+            self.parent += self.title_inconsistent(source, lineno)
+            return None
+
+    def title_inconsistent(self, sourcetext, lineno):
+        error = self.reporter.severe(
+            'Title level inconsistent:', nodes.literal_block('', sourcetext),
+            line=lineno)
+        return error
+
+    def new_subsection(self, title, lineno, messages):
+        """Append new subsection to document tree. On return, check level."""
+        memo = self.memo
+        mylevel = memo.section_level
+        memo.section_level += 1
+        section_node = nodes.section()
+        self.parent += section_node
+        textnodes, title_messages = self.inline_text(title, lineno)
+        titlenode = nodes.title(title, '', *textnodes)
+        name = normalize_name(titlenode.astext())
+        section_node['names'].append(name)
+        section_node += titlenode
+        section_node += messages
+        section_node += title_messages
+        self.document.note_implicit_target(section_node, section_node)
+        offset = self.state_machine.line_offset + 1
+        absoffset = self.state_machine.abs_line_offset() + 1
+        newabsoffset = self.nested_parse(
+              self.state_machine.input_lines[offset:], input_offset=absoffset,
+              node=section_node, match_titles=1)
+        self.goto_line(newabsoffset)
+        if memo.section_level <= mylevel: # can't handle next section?
+            raise EOFError              # bubble up to supersection
+        # reset section_level; next pass will detect it properly
+        memo.section_level = mylevel
+
+    def paragraph(self, lines, lineno):
+        """
+        Return a list (paragraph & messages) & a boolean: literal_block next?
+        """
+        data = '\n'.join(lines).rstrip()
+        if re.search(r'(?<!\\)(\\\\)*::$', data):
+            if len(data) == 2:
+                return [], 1
+            elif data[-3] in ' \n':
+                text = data[:-3].rstrip()
+            else:
+                text = data[:-1]
+            literalnext = 1
+        else:
+            text = data
+            literalnext = 0
+        textnodes, messages = self.inline_text(text, lineno)
+        p = nodes.paragraph(data, '', *textnodes)
+        p.line = lineno
+        return [p] + messages, literalnext
+
+    def inline_text(self, text, lineno):
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+        """
+        return self.inliner.parse(text, lineno, self.memo, self.parent)
+
+    def unindent_warning(self, node_name):
+        return self.reporter.warning(
+            '%s ends without a blank line; unexpected unindent.' % node_name,
+            line=(self.state_machine.abs_line_number() + 1))
+
+
+def build_regexp(definition, compile=1):
+    """
+    Build, compile and return a regular expression based on `definition`.
+
+    :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
+        where "parts" is a list of regular expressions and/or regular
+        expression definitions to be joined into an or-group.
+    """
+    name, prefix, suffix, parts = definition
+    part_strings = []
+    for part in parts:
+        if type(part) is TupleType:
+            part_strings.append(build_regexp(part, None))
+        else:
+            part_strings.append(part)
+    or_group = '|'.join(part_strings)
+    regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
+    if compile:
+        return re.compile(regexp, re.UNICODE)
+    else:
+        return regexp
+
+
+class Inliner:
+
+    """
+    Parse inline markup; call the `parse()` method.
+    """
+
+    def __init__(self):
+        self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
+        """List of (pattern, bound method) tuples, used by
+        `self.implicit_inline`."""
+
+    def init_customizations(self, settings):
+        """Setting-based customizations; run when parsing begins."""
+        if settings.pep_references:
+            self.implicit_dispatch.append((self.patterns.pep,
+                                           self.pep_reference))
+        if settings.rfc_references:
+            self.implicit_dispatch.append((self.patterns.rfc,
+                                           self.rfc_reference))
+
+    def parse(self, text, lineno, memo, parent):
+        # Needs to be refactored for nested inline markup.
+        # Add nested_parse() method?
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+
+        Using `self.patterns.initial`, a pattern which matches start-strings
+        (emphasis, strong, interpreted, phrase reference, literal,
+        substitution reference, and inline target) and complete constructs
+        (simple reference, footnote reference), search for a candidate.  When
+        one is found, check for validity (e.g., not a quoted '*' character).
+        If valid, search for the corresponding end string if applicable, and
+        check it for validity.  If not found or invalid, generate a warning
+        and ignore the start-string.  Implicit inline markup (e.g. standalone
+        URIs) is found last.
+        """
+        self.reporter = memo.reporter
+        self.document = memo.document
+        self.language = memo.language
+        self.parent = parent
+        pattern_search = self.patterns.initial.search
+        dispatch = self.dispatch
+        remaining = escape2null(text)
+        processed = []
+        unprocessed = []
+        messages = []
+        while remaining:
+            match = pattern_search(remaining)
+            if match:
+                groups = match.groupdict()
+                method = dispatch[groups['start'] or groups['backquote']
+                                  or groups['refend'] or groups['fnend']]
+                before, inlines, remaining, sysmessages = method(self, match,
+                                                                 lineno)
+                unprocessed.append(before)
+                messages += sysmessages
+                if inlines:
+                    processed += self.implicit_inline(''.join(unprocessed),
+                                                      lineno)
+                    processed += inlines
+                    unprocessed = []
+            else:
+                break
+        remaining = ''.join(unprocessed) + remaining
+        if remaining:
+            processed += self.implicit_inline(remaining, lineno)
+        return processed, messages
+
+    openers = '\'"([{<'
+    closers = '\'")]}>'
+    start_string_prefix = (r'((?<=^)|(?<=[-/: \n%s]))' % re.escape(openers))
+    end_string_suffix = (r'((?=$)|(?=[-/:.,;!? \n\x00%s]))'
+                         % re.escape(closers))
+    non_whitespace_before = r'(?<![ \n])'
+    non_whitespace_escape_before = r'(?<![ \n\x00])'
+    non_whitespace_after = r'(?![ \n])'
+    # Alphanumerics with isolated internal [-._] chars (i.e. not 2 together):
+    simplename = r'(?:(?!_)\w)+(?:[-._](?:(?!_)\w)+)*'
+    # Valid URI characters (see RFC 2396 & RFC 2732);
+    # final \x00 allows backslash escapes in URIs:
+    uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
+    # Delimiter indicating the end of a URI (not part of the URI):
+    uri_end_delim = r"""[>]"""
+    # Last URI character; same as uric but no punctuation:
+    urilast = r"""[_~*/=+a-zA-Z0-9]"""
+    # End of a URI (either 'urilast' or 'uric followed by a
+    # uri_end_delim'):
+    uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals()
+    emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
+    email_pattern = r"""
+          %(emailc)s+(?:\.%(emailc)s+)*   # name
+          (?<!\x00)@                      # at
+          %(emailc)s+(?:\.%(emailc)s*)*   # host
+          %(uri_end)s                     # final URI char
+          """
+    parts = ('initial_inline', start_string_prefix, '',
+             [('start', '', non_whitespace_after,  # simple start-strings
+               [r'\*\*',                # strong
+                r'\*(?!\*)',            # emphasis but not strong
+                r'``',                  # literal
+                r'_`',                  # inline internal target
+                r'\|(?!\|)']            # substitution reference
+               ),
+              ('whole', '', end_string_suffix, # whole constructs
+               [# reference name & end-string
+                r'(?P<refname>%s)(?P<refend>__?)' % simplename,
+                ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
+                 [r'[0-9]+',               # manually numbered
+                  r'\#(%s)?' % simplename, # auto-numbered (w/ label?)
+                  r'\*',                   # auto-symbol
+                  r'(?P<citationlabel>%s)' % simplename] # citation reference
+                 )
+                ]
+               ),
+              ('backquote',             # interpreted text or phrase reference
+               '(?P<role>(:%s:)?)' % simplename, # optional role
+               non_whitespace_after,
+               ['`(?!`)']               # but not literal
+               )
+              ]
+             )
+    patterns = Struct(
+          initial=build_regexp(parts),
+          emphasis=re.compile(non_whitespace_escape_before
+                              + r'(\*)' + end_string_suffix),
+          strong=re.compile(non_whitespace_escape_before
+                            + r'(\*\*)' + end_string_suffix),
+          interpreted_or_phrase_ref=re.compile(
+              r"""
+              %(non_whitespace_escape_before)s
+              (
+                `
+                (?P<suffix>
+                  (?P<role>:%(simplename)s:)?
+                  (?P<refend>__?)?
+                )
+              )
+              %(end_string_suffix)s
+              """ % locals(), re.VERBOSE | re.UNICODE),
+          embedded_uri=re.compile(
+              r"""
+              (
+                (?:[ \n]+|^)            # spaces or beginning of line/string
+                <                       # open bracket
+                %(non_whitespace_after)s
+                ([^<>\x00]+)            # anything but angle brackets & nulls
+                %(non_whitespace_before)s
+                >                       # close bracket w/o whitespace before
+              )
+              $                         # end of string
+              """ % locals(), re.VERBOSE),
+          literal=re.compile(non_whitespace_before + '(``)'
+                             + end_string_suffix),
+          target=re.compile(non_whitespace_escape_before
+                            + r'(`)' + end_string_suffix),
+          substitution_ref=re.compile(non_whitespace_escape_before
+                                      + r'(\|_{0,2})'
+                                      + end_string_suffix),
+          email=re.compile(email_pattern % locals() + '$', re.VERBOSE),
+          uri=re.compile(
+                (r"""
+                %(start_string_prefix)s
+                (?P<whole>
+                  (?P<absolute>           # absolute URI
+                    (?P<scheme>             # scheme (http, ftp, mailto)
+                      [a-zA-Z][a-zA-Z0-9.+-]*
+                    )
+                    :
+                    (
+                      (                       # either:
+                        (//?)?                  # hierarchical URI
+                        %(uric)s*               # URI characters
+                        %(uri_end)s             # final URI char
+                      )
+                      (                       # optional query
+                        \?%(uric)s*
+                        %(uri_end)s
+                      )?
+                      (                       # optional fragment
+                        \#%(uric)s*
+                        %(uri_end)s
+                      )?
+                    )
+                  )
+                |                       # *OR*
+                  (?P<email>              # email address
+                    """ + email_pattern + r"""
+                  )
+                )
+                %(end_string_suffix)s
+                """) % locals(), re.VERBOSE),
+          pep=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (
+                  (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
+                |
+                  (PEP\s+(?P<pepnum2>\d+))      # reference by name
+                )
+                %(end_string_suffix)s""" % locals(), re.VERBOSE),
+          rfc=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (RFC(-|\s+)?(?P<rfcnum>\d+))
+                %(end_string_suffix)s""" % locals(), re.VERBOSE))
+
+    def quoted_start(self, match):
+        """Return 1 if inline markup start-string is 'quoted', 0 if not."""
+        string = match.string
+        start = match.start()
+        end = match.end()
+        if start == 0:                  # start-string at beginning of text
+            return 0
+        prestart = string[start - 1]
+        try:
+            poststart = string[end]
+            if self.openers.index(prestart) \
+                  == self.closers.index(poststart):   # quoted
+                return 1
+        except IndexError:              # start-string at end of text
+            return 1
+        except ValueError:              # not quoted
+            pass
+        return 0
+
+    def inline_obj(self, match, lineno, end_pattern, nodeclass,
+                   restore_backslashes=0):
+        string = match.string
+        matchstart = match.start('start')
+        matchend = match.end('start')
+        if self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [], '')
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            text = unescape(endmatch.string[:endmatch.start(1)],
+                            restore_backslashes)
+            textend = matchend + endmatch.end(1)
+            rawsource = unescape(string[matchstart:textend], 1)
+            return (string[:matchstart], [nodeclass(rawsource, text)],
+                    string[textend:], [], endmatch.group(1))
+        msg = self.reporter.warning(
+              'Inline %s start-string without end-string.'
+              % nodeclass.__name__, line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        rawsource = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, rawsource, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg], ''
+
+    def problematic(self, text, rawsource, message):
+        msgid = self.document.set_id(message, self.parent)
+        problematic = nodes.problematic(rawsource, text, refid=msgid)
+        prbid = self.document.set_id(problematic)
+        message.add_backref(prbid)
+        return problematic
+
+    def emphasis(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.emphasis, nodes.emphasis)
+        return before, inlines, remaining, sysmessages
+
+    def strong(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.strong, nodes.strong)
+        return before, inlines, remaining, sysmessages
+
+    def interpreted_or_phrase_ref(self, match, lineno):
+        end_pattern = self.patterns.interpreted_or_phrase_ref
+        string = match.string
+        matchstart = match.start('backquote')
+        matchend = match.end('backquote')
+        rolestart = match.start('role')
+        role = match.group('role')
+        position = ''
+        if role:
+            role = role[1:-1]
+            position = 'prefix'
+        elif self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [])
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            textend = matchend + endmatch.end()
+            if endmatch.group('role'):
+                if role:
+                    msg = self.reporter.warning(
+                        'Multiple roles in interpreted text (both '
+                        'prefix and suffix present; only one allowed).',
+                        line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                role = endmatch.group('suffix')[1:-1]
+                position = 'suffix'
+            escaped = endmatch.string[:endmatch.start(1)]
+            rawsource = unescape(string[matchstart:textend], 1)
+            if rawsource[-1:] == '_':
+                if role:
+                    msg = self.reporter.warning(
+                          'Mismatch: both interpreted text role %s and '
+                          'reference suffix.' % position, line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                return self.phrase_ref(string[:matchstart], string[textend:],
+                                       rawsource, escaped, unescape(escaped))
+            else:
+                rawsource = unescape(string[rolestart:textend], 1)
+                nodelist, messages = self.interpreted(rawsource, escaped, role,
+                                                      lineno)
+                return (string[:rolestart], nodelist,
+                        string[textend:], messages)
+        msg = self.reporter.warning(
+              'Inline interpreted text or phrase reference start-string '
+              'without end-string.', line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, text, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg]
+
+    def phrase_ref(self, before, after, rawsource, escaped, text):
+        match = self.patterns.embedded_uri.search(escaped)
+        if match:
+            text = unescape(escaped[:match.start(0)])
+            uri_text = match.group(2)
+            uri = ''.join(uri_text.split())
+            uri = self.adjust_uri(uri)
+            if uri:
+                target = nodes.target(match.group(1), refuri=uri)
+            else:
+                raise ApplicationError('problem with URI: %r' % uri_text)
+            if not text:
+                text = uri
+        else:
+            target = None
+        refname = normalize_name(text)
+        reference = nodes.reference(rawsource, text,
+                                    name=whitespace_normalize_name(text))
+        node_list = [reference]
+        if rawsource[-2:] == '__':
+            if target:
+                reference['refuri'] = uri
+            else:
+                reference['anonymous'] = 1
+        else:
+            if target:
+                reference['refuri'] = uri
+                target['names'].append(refname)
+                self.document.note_explicit_target(target, self.parent)
+                node_list.append(target)
+            else:
+                reference['refname'] = refname
+                self.document.note_refname(reference)
+        return before, node_list, after, []
+
+    def adjust_uri(self, uri):
+        match = self.patterns.email.match(uri)
+        if match:
+            return 'mailto:' + uri
+        else:
+            return uri
+
+    def interpreted(self, rawsource, text, role, lineno):
+        role_fn, messages = roles.role(role, self.language, lineno,
+                                       self.reporter)
+        if role_fn:
+            nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
+            return nodes, messages + messages2
+        else:
+            msg = self.reporter.error(
+                'Unknown interpreted text role "%s".' % role,
+                line=lineno)
+            return ([self.problematic(rawsource, rawsource, msg)],
+                    messages + [msg])
+
+    def literal(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.literal, nodes.literal,
+              restore_backslashes=1)
+        return before, inlines, remaining, sysmessages
+
+    def inline_internal_target(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.target, nodes.target)
+        if inlines and isinstance(inlines[0], nodes.target):
+            assert len(inlines) == 1
+            target = inlines[0]
+            name = normalize_name(target.astext())
+            target['names'].append(name)
+            self.document.note_explicit_target(target, self.parent)
+        return before, inlines, remaining, sysmessages
+
+    def substitution_reference(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.substitution_ref,
+              nodes.substitution_reference)
+        if len(inlines) == 1:
+            subref_node = inlines[0]
+            if isinstance(subref_node, nodes.substitution_reference):
+                subref_text = subref_node.astext()
+                self.document.note_substitution_ref(subref_node, subref_text)
+                if endstring[-1:] == '_':
+                    reference_node = nodes.reference(
+                        '|%s%s' % (subref_text, endstring), '')
+                    if endstring[-2:] == '__':
+                        reference_node['anonymous'] = 1
+                    else:
+                        reference_node['refname'] = normalize_name(subref_text)
+                        self.document.note_refname(reference_node)
+                    reference_node += subref_node
+                    inlines = [reference_node]
+        return before, inlines, remaining, sysmessages
+
+    def footnote_reference(self, match, lineno):
+        """
+        Handles `nodes.footnote_reference` and `nodes.citation_reference`
+        elements.
+        """
+        label = match.group('footnotelabel')
+        refname = normalize_name(label)
+        string = match.string
+        before = string[:match.start('whole')]
+        remaining = string[match.end('whole'):]
+        if match.group('citationlabel'):
+            refnode = nodes.citation_reference('[%s]_' % label,
+                                               refname=refname)
+            refnode += nodes.Text(label)
+            self.document.note_citation_ref(refnode)
+        else:
+            refnode = nodes.footnote_reference('[%s]_' % label)
+            if refname[0] == '#':
+                refname = refname[1:]
+                refnode['auto'] = 1
+                self.document.note_autofootnote_ref(refnode)
+            elif refname == '*':
+                refname = ''
+                refnode['auto'] = '*'
+                self.document.note_symbol_footnote_ref(
+                      refnode)
+            else:
+                refnode += nodes.Text(label)
+            if refname:
+                refnode['refname'] = refname
+                self.document.note_footnote_ref(refnode)
+            if utils.get_trim_footnote_ref_space(self.document.settings):
+                before = before.rstrip()
+        return (before, [refnode], remaining, [])
+
+    def reference(self, match, lineno, anonymous=None):
+        referencename = match.group('refname')
+        refname = normalize_name(referencename)
+        referencenode = nodes.reference(
+            referencename + match.group('refend'), referencename,
+            name=whitespace_normalize_name(referencename))
+        if anonymous:
+            referencenode['anonymous'] = 1
+        else:
+            referencenode['refname'] = refname
+            self.document.note_refname(referencenode)
+        string = match.string
+        matchstart = match.start('whole')
+        matchend = match.end('whole')
+        return (string[:matchstart], [referencenode], string[matchend:], [])
+
+    def anonymous_reference(self, match, lineno):
+        return self.reference(match, lineno, anonymous=1)
+
+    def standalone_uri(self, match, lineno):
+        if not match.group('scheme') or urischemes.schemes.has_key(
+              match.group('scheme').lower()):
+            if match.group('email'):
+                addscheme = 'mailto:'
+            else:
+                addscheme = ''
+            text = match.group('whole')
+            unescaped = unescape(text, 0)
+            return [nodes.reference(unescape(text, 1), unescaped,
+                                    refuri=addscheme + unescaped)]
+        else:                   # not a valid scheme
+            raise MarkupMismatch
+
+    def pep_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('pep-'):
+            pepnum = int(match.group('pepnum1'))
+        elif text.startswith('PEP'):
+            pepnum = int(match.group('pepnum2'))
+        else:
+            raise MarkupMismatch
+        ref = (self.document.settings.pep_base_url
+               + self.document.settings.pep_file_url_template % pepnum)
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    rfc_url = 'rfc%d.html'
+
+    def rfc_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('RFC'):
+            rfcnum = int(match.group('rfcnum'))
+            ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum
+        else:
+            raise MarkupMismatch
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    def implicit_inline(self, text, lineno):
+        """
+        Check each of the patterns in `self.implicit_dispatch` for a match,
+        and dispatch to the stored method for the pattern.  Recursively check
+        the text before and after the match.  Return a list of `nodes.Text`
+        and inline element nodes.
+        """
+        if not text:
+            return []
+        for pattern, method in self.implicit_dispatch:
+            match = pattern.search(text)
+            if match:
+                try:
+                    # Must recurse on strings before *and* after the match;
+                    # there may be multiple patterns.
+                    return (self.implicit_inline(text[:match.start()], lineno)
+                            + method(match, lineno) +
+                            self.implicit_inline(text[match.end():], lineno))
+                except MarkupMismatch:
+                    pass
+        return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
+
+    dispatch = {'*': emphasis,
+                '**': strong,
+                '`': interpreted_or_phrase_ref,
+                '``': literal,
+                '_`': inline_internal_target,
+                ']_': footnote_reference,
+                '|': substitution_reference,
+                '_': reference,
+                '__': anonymous_reference}
+
+
+def _loweralpha_to_int(s, _zero=(ord('a')-1)):
+    return ord(s) - _zero
+
+def _upperalpha_to_int(s, _zero=(ord('A')-1)):
+    return ord(s) - _zero
+
+def _lowerroman_to_int(s):
+    return roman.fromRoman(s.upper())
+
+
+class Body(RSTState):
+
+    """
+    Generic classifier of the first line of a block.
+    """
+
+    double_width_pad_char = tableparser.TableParser.double_width_pad_char
+    """Padding character for East Asian double-width text."""
+
+    enum = Struct()
+    """Enumerated list parsing information."""
+
+    enum.formatinfo = {
+          'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
+          'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
+          'period': Struct(prefix='', suffix='.', start=0, end=-1)}
+    enum.formats = enum.formatinfo.keys()
+    enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
+                      'lowerroman', 'upperroman'] # ORDERED!
+    enum.sequencepats = {'arabic': '[0-9]+',
+                         'loweralpha': '[a-z]',
+                         'upperalpha': '[A-Z]',
+                         'lowerroman': '[ivxlcdm]+',
+                         'upperroman': '[IVXLCDM]+',}
+    enum.converters = {'arabic': int,
+                       'loweralpha': _loweralpha_to_int,
+                       'upperalpha': _upperalpha_to_int,
+                       'lowerroman': _lowerroman_to_int,
+                       'upperroman': roman.fromRoman}
+
+    enum.sequenceregexps = {}
+    for sequence in enum.sequences:
+        enum.sequenceregexps[sequence] = re.compile(
+              enum.sequencepats[sequence] + '$')
+
+    grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
+    """Matches the top (& bottom) of a full table)."""
+
+    simple_table_top_pat = re.compile('=+( +=+)+ *$')
+    """Matches the top of a simple table."""
+
+    simple_table_border_pat = re.compile('=+[ =]*$')
+    """Matches the bottom & header bottom of a simple table."""
+
+    pats = {}
+    """Fragments of patterns used by transitions."""
+
+    pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
+    pats['alpha'] = '[a-zA-Z]'
+    pats['alphanum'] = '[a-zA-Z0-9]'
+    pats['alphanumplus'] = '[a-zA-Z0-9_-]'
+    pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
+                    '|%(upperroman)s|#)' % enum.sequencepats)
+    pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
+    # @@@ Loosen up the pattern?  Allow Unicode?
+    pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats
+    pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
+    pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
+    pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
+
+    for format in enum.formats:
+        pats[format] = '(?P<%s>%s%s%s)' % (
+              format, re.escape(enum.formatinfo[format].prefix),
+              pats['enum'], re.escape(enum.formatinfo[format].suffix))
+
+    patterns = {
+          'bullet': ur'[-+*\u2022\u2023\u2043]( +|$)',
+          'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
+          'field_marker': r':(?![: ])([^:\\]|\\.)*(?<! ):( +|$)',
+          'option_marker': r'%(option)s(, %(option)s)*(  +| ?$)' % pats,
+          'doctest': r'>>>( +|$)',
+          'line_block': r'\|( +|$)',
+          'grid_table_top': grid_table_top_pat,
+          'simple_table_top': simple_table_top_pat,
+          'explicit_markup': r'\.\.( +|$)',
+          'anonymous': r'__( +|$)',
+          'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
+          'text': r''}
+    initial_transitions = (
+          'bullet',
+          'enumerator',
+          'field_marker',
+          'option_marker',
+          'doctest',
+          'line_block',
+          'grid_table_top',
+          'simple_table_top',
+          'explicit_markup',
+          'anonymous',
+          'line',
+          'text')
+
+    def indent(self, match, context, next_state):
+        """Block quote."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        elements = self.block_quote(indented, line_offset)
+        self.parent += elements
+        if not blank_finish:
+            self.parent += self.unindent_warning('Block quote')
+        return context, next_state, []
+
+    def block_quote(self, indented, line_offset):
+        elements = []
+        while indented:
+            (blockquote_lines,
+             attribution_lines,
+             attribution_offset,
+             indented,
+             new_line_offset) = self.split_attribution(indented, line_offset)
+            blockquote = nodes.block_quote()
+            self.nested_parse(blockquote_lines, line_offset, blockquote)
+            elements.append(blockquote)
+            if attribution_lines:
+                attribution, messages = self.parse_attribution(
+                    attribution_lines, attribution_offset)
+                blockquote += attribution
+                elements += messages
+            line_offset = new_line_offset
+            while indented and not indented[0]:
+                indented = indented[1:]
+                line_offset += 1
+        return elements
+
+    # U+2014 is an em-dash:
+    attribution_pattern = re.compile(ur'(---?(?!-)|\u2014) *(?=[^ \n])')
+
+    def split_attribution(self, indented, line_offset):
+        """
+        Check for a block quote attribution and split it off:
+
+        * First line after a blank line must begin with a dash ("--", "---",
+          em-dash; matches `self.attribution_pattern`).
+        * Every line after that must have consistent indentation.
+        * Attributions must be preceded by block quote content.
+
+        Return a tuple of: (block quote content lines, content offset,
+        attribution lines, attribution offset, remaining indented lines).
+        """
+        blank = None
+        nonblank_seen = False
+        for i in range(len(indented)):
+            line = indented[i].rstrip()
+            if line:
+                if nonblank_seen and blank == i - 1: # last line blank
+                    match = self.attribution_pattern.match(line)
+                    if match:
+                        attribution_end, indent = self.check_attribution(
+                            indented, i)
+                        if attribution_end:
+                            a_lines = indented[i:attribution_end]
+                            a_lines.trim_left(match.end(), end=1)
+                            a_lines.trim_left(indent, start=1)
+                            return (indented[:i], a_lines,
+                                    i, indented[attribution_end:],
+                                    line_offset + attribution_end)
+                nonblank_seen = True
+            else:
+                blank = i
+        else:
+            return (indented, None, None, None, None)
+
+    def check_attribution(self, indented, attribution_start):
+        """
+        Check attribution shape.
+        Return the index past the end of the attribution, and the indent.
+        """
+        indent = None
+        i = attribution_start + 1
+        for i in range(attribution_start + 1, len(indented)):
+            line = indented[i].rstrip()
+            if not line:
+                break
+            if indent is None:
+                indent = len(line) - len(line.lstrip())
+            elif len(line) - len(line.lstrip()) != indent:
+                return None, None       # bad shape; not an attribution
+        else:
+            # return index of line after last attribution line:
+            i += 1
+        return i, (indent or 0)
+
+    def parse_attribution(self, indented, line_offset):
+        text = '\n'.join(indented).rstrip()
+        lineno = self.state_machine.abs_line_number() + line_offset
+        textnodes, messages = self.inline_text(text, lineno)
+        node = nodes.attribution(text, '', *textnodes)
+        node.line = lineno
+        return node, messages
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        bulletlist = nodes.bullet_list()
+        self.parent += bulletlist
+        bulletlist['bullet'] = match.string[0]
+        i, blank_finish = self.list_item(match.end())
+        bulletlist += i
+        offset = self.state_machine.line_offset + 1   # next line
+        new_line_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=bulletlist, initial_state='BulletList',
+              blank_finish=blank_finish)
+        self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Bullet list')
+        return [], next_state, []
+
+    def list_item(self, indent):
+        if self.state_machine.line[indent:]:
+            indented, line_offset, blank_finish = (
+                self.state_machine.get_known_indented(indent))
+        else:
+            indented, indent, line_offset, blank_finish = (
+                self.state_machine.get_first_known_indented(indent))
+        listitem = nodes.list_item('\n'.join(indented))
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=listitem)
+        return listitem, blank_finish
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated List Item"""
+        format, sequence, text, ordinal = self.parse_enumerator(match)
+        if not self.is_enumerated_list_item(ordinal, sequence, format):
+            raise statemachine.TransitionCorrection('text')
+        enumlist = nodes.enumerated_list()
+        self.parent += enumlist
+        if sequence == '#':
+            enumlist['enumtype'] = 'arabic'
+        else:
+            enumlist['enumtype'] = sequence
+        enumlist['prefix'] = self.enum.formatinfo[format].prefix
+        enumlist['suffix'] = self.enum.formatinfo[format].suffix
+        if ordinal != 1:
+            enumlist['start'] = ordinal
+            msg = self.reporter.info(
+                'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
+                % (text, ordinal), line=self.state_machine.abs_line_number())
+            self.parent += msg
+        listitem, blank_finish = self.list_item(match.end())
+        enumlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=enumlist, initial_state='EnumeratedList',
+              blank_finish=blank_finish,
+              extra_settings={'lastordinal': ordinal,
+                              'format': format,
+                              'auto': sequence == '#'})
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Enumerated list')
+        return [], next_state, []
+
+    def parse_enumerator(self, match, expected_sequence=None):
+        """
+        Analyze an enumerator and return the results.
+
+        :Return:
+            - the enumerator format ('period', 'parens', or 'rparen'),
+            - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
+            - the text of the enumerator, stripped of formatting, and
+            - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
+              ``None`` is returned for invalid enumerator text).
+
+        The enumerator format has already been determined by the regular
+        expression match. If `expected_sequence` is given, that sequence is
+        tried first. If not, we check for Roman numeral 1. This way,
+        single-character Roman numerals (which are also alphabetical) can be
+        matched. If no sequence has been matched, all sequences are checked in
+        order.
+        """
+        groupdict = match.groupdict()
+        sequence = ''
+        for format in self.enum.formats:
+            if groupdict[format]:       # was this the format matched?
+                break                   # yes; keep `format`
+        else:                           # shouldn't happen
+            raise ParserError('enumerator format not matched')
+        text = groupdict[format][self.enum.formatinfo[format].start
+                                 :self.enum.formatinfo[format].end]
+        if text == '#':
+            sequence = '#'
+        elif expected_sequence:
+            try:
+                if self.enum.sequenceregexps[expected_sequence].match(text):
+                    sequence = expected_sequence
+            except KeyError:            # shouldn't happen
+                raise ParserError('unknown enumerator sequence: %s'
+                                  % sequence)
+        elif text == 'i':
+            sequence = 'lowerroman'
+        elif text == 'I':
+            sequence = 'upperroman'
+        if not sequence:
+            for sequence in self.enum.sequences:
+                if self.enum.sequenceregexps[sequence].match(text):
+                    break
+            else:                       # shouldn't happen
+                raise ParserError('enumerator sequence not matched')
+        if sequence == '#':
+            ordinal = 1
+        else:
+            try:
+                ordinal = self.enum.converters[sequence](text)
+            except roman.InvalidRomanNumeralError:
+                ordinal = None
+        return format, sequence, text, ordinal
+
+    def is_enumerated_list_item(self, ordinal, sequence, format):
+        """
+        Check validity based on the ordinal value and the second line.
+
+        Return true iff the ordinal is valid and the second line is blank,
+        indented, or starts with the next enumerator or an auto-enumerator.
+        """
+        if ordinal is None:
+            return None
+        try:
+            next_line = self.state_machine.next_line()
+        except EOFError:              # end of input lines
+            self.state_machine.previous_line()
+            return 1
+        else:
+            self.state_machine.previous_line()
+        if not next_line[:1].strip():   # blank or indented
+            return 1
+        result = self.make_enumerator(ordinal + 1, sequence, format)
+        if result:
+            next_enumerator, auto_enumerator = result
+            try:
+                if ( next_line.startswith(next_enumerator) or
+                     next_line.startswith(auto_enumerator) ):
+                    return 1
+            except TypeError:
+                pass
+        return None
+
+    def make_enumerator(self, ordinal, sequence, format):
+        """
+        Construct and return the next enumerated list item marker, and an
+        auto-enumerator ("#" instead of the regular enumerator).
+
+        Return ``None`` for invalid (out of range) ordinals.
+        """ #"
+        if sequence == '#':
+            enumerator = '#'
+        elif sequence == 'arabic':
+            enumerator = str(ordinal)
+        else:
+            if sequence.endswith('alpha'):
+                if ordinal > 26:
+                    return None
+                enumerator = chr(ordinal + ord('a') - 1)
+            elif sequence.endswith('roman'):
+                try:
+                    enumerator = roman.toRoman(ordinal)
+                except roman.RomanError:
+                    return None
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+            if sequence.startswith('lower'):
+                enumerator = enumerator.lower()
+            elif sequence.startswith('upper'):
+                enumerator = enumerator.upper()
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+        formatinfo = self.enum.formatinfo[format]
+        next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix
+                           + ' ')
+        auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' '
+        return next_enumerator, auto_enumerator
+
+    def field_marker(self, match, context, next_state):
+        """Field list item."""
+        field_list = nodes.field_list()
+        self.parent += field_list
+        field, blank_finish = self.field(match)
+        field_list += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=field_list, initial_state='FieldList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Field list')
+        return [], next_state, []
+
+    def field(self, match):
+        name = self.parse_field_marker(match)
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        field_node = nodes.field()
+        field_node.line = lineno
+        name_nodes, name_messages = self.inline_text(name, lineno)
+        field_node += nodes.field_name(name, '', *name_nodes)
+        field_body = nodes.field_body('\n'.join(indented), *name_messages)
+        field_node += field_body
+        if indented:
+            self.parse_field_body(indented, line_offset, field_body)
+        return field_node, blank_finish
+
+    def parse_field_marker(self, match):
+        """Extract & return field name from a field marker match."""
+        field = match.group()[1:]        # strip off leading ':'
+        field = field[:field.rfind(':')] # strip off trailing ':' etc.
+        return field
+
+    def parse_field_body(self, indented, offset, node):
+        self.nested_parse(indented, input_offset=offset, node=node)
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        optionlist = nodes.option_list()
+        try:
+            listitem, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            # This shouldn't happen; pattern won't match.
+            msg = self.reporter.error(
+                'Invalid option list marker: %s' % message, line=lineno)
+            self.parent += msg
+            indented, indent, line_offset, blank_finish = \
+                  self.state_machine.get_first_known_indented(match.end())
+            elements = self.block_quote(indented, line_offset)
+            self.parent += elements
+            if not blank_finish:
+                self.parent += self.unindent_warning('Option list')
+            return [], next_state, []
+        self.parent += optionlist
+        optionlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=optionlist, initial_state='OptionList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Option list')
+        return [], next_state, []
+
+    def option_list_item(self, match):
+        offset = self.state_machine.abs_line_offset()
+        options = self.parse_option_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        if not indented:                # not an option list item
+            self.goto_line(offset)
+            raise statemachine.TransitionCorrection('text')
+        option_group = nodes.option_group('', *options)
+        description = nodes.description('\n'.join(indented))
+        option_list_item = nodes.option_list_item('', option_group,
+                                                  description)
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=description)
+        return option_list_item, blank_finish
+
+    def parse_option_marker(self, match):
+        """
+        Return a list of `node.option` and `node.option_argument` objects,
+        parsed from an option marker match.
+
+        :Exception: `MarkupError` for invalid option markers.
+        """
+        optlist = []
+        optionstrings = match.group().rstrip().split(', ')
+        for optionstring in optionstrings:
+            tokens = optionstring.split()
+            delimiter = ' '
+            firstopt = tokens[0].split('=')
+            if len(firstopt) > 1:
+                # "--opt=value" form
+                tokens[:1] = firstopt
+                delimiter = '='
+            elif (len(tokens[0]) > 2
+                  and ((tokens[0].startswith('-')
+                        and not tokens[0].startswith('--'))
+                       or tokens[0].startswith('+'))):
+                # "-ovalue" form
+                tokens[:1] = [tokens[0][:2], tokens[0][2:]]
+                delimiter = ''
+            if len(tokens) > 1 and (tokens[1].startswith('<')
+                                    and tokens[-1].endswith('>')):
+                # "-o <value1 value2>" form; join all values into one token
+                tokens[1:] = [' '.join(tokens[1:])]
+            if 0 < len(tokens) <= 2:
+                option = nodes.option(optionstring)
+                option += nodes.option_string(tokens[0], tokens[0])
+                if len(tokens) > 1:
+                    option += nodes.option_argument(tokens[1], tokens[1],
+                                                    delimiter=delimiter)
+                optlist.append(option)
+            else:
+                raise MarkupError(
+                    'wrong number of option tokens (=%s), should be 1 or 2: '
+                    '"%s"' % (len(tokens), optionstring),
+                    self.state_machine.abs_line_number() + 1)
+        return optlist
+
+    def doctest(self, match, context, next_state):
+        data = '\n'.join(self.state_machine.get_text_block())
+        self.parent += nodes.doctest_block(data, data)
+        return [], next_state, []
+
+    def line_block(self, match, context, next_state):
+        """First line of a line block."""
+        block = nodes.line_block()
+        self.parent += block
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        block += line
+        self.parent += messages
+        if not blank_finish:
+            offset = self.state_machine.line_offset + 1   # next line
+            new_line_offset, blank_finish = self.nested_list_parse(
+                  self.state_machine.input_lines[offset:],
+                  input_offset=self.state_machine.abs_line_offset() + 1,
+                  node=block, initial_state='LineBlock',
+                  blank_finish=0)
+            self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.reporter.warning(
+                'Line block ends without a blank line.',
+                line=(self.state_machine.abs_line_number() + 1))
+        if len(block):
+            if block[0].indent is None:
+                block[0].indent = 0
+            self.nest_line_block_lines(block)
+        return [], next_state, []
+
+    def line_block_line(self, match, lineno):
+        """Return one line element of a line_block."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        text = u'\n'.join(indented)
+        text_nodes, messages = self.inline_text(text, lineno)
+        line = nodes.line(text, '', *text_nodes)
+        if match.string.rstrip() != '|': # not empty
+            line.indent = len(match.group(1)) - 1
+        return line, messages, blank_finish
+
+    def nest_line_block_lines(self, block):
+        for index in range(1, len(block)):
+            if block[index].indent is None:
+                block[index].indent = block[index - 1].indent
+        self.nest_line_block_segment(block)
+
+    def nest_line_block_segment(self, block):
+        indents = [item.indent for item in block]
+        least = min(indents)
+        new_items = []
+        new_block = nodes.line_block()
+        for item in block:
+            if item.indent > least:
+                new_block.append(item)
+            else:
+                if len(new_block):
+                    self.nest_line_block_segment(new_block)
+                    new_items.append(new_block)
+                    new_block = nodes.line_block()
+                new_items.append(item)
+        if len(new_block):
+            self.nest_line_block_segment(new_block)
+            new_items.append(new_block)
+        block[:] = new_items
+
+    def grid_table_top(self, match, context, next_state):
+        """Top border of a full table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_grid_table,
+                              tableparser.GridTableParser)
+
+    def simple_table_top(self, match, context, next_state):
+        """Top border of a simple table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_simple_table,
+                              tableparser.SimpleTableParser)
+
+    def table_top(self, match, context, next_state,
+                  isolate_function, parser_class):
+        """Top border of a generic table."""
+        nodelist, blank_finish = self.table(isolate_function, parser_class)
+        self.parent += nodelist
+        if not blank_finish:
+            msg = self.reporter.warning(
+                'Blank line required after table.',
+                line=self.state_machine.abs_line_number() + 1)
+            self.parent += msg
+        return [], next_state, []
+
+    def table(self, isolate_function, parser_class):
+        """Parse a table."""
+        block, messages, blank_finish = isolate_function()
+        if block:
+            try:
+                parser = parser_class()
+                tabledata = parser.parse(block)
+                tableline = (self.state_machine.abs_line_number() - len(block)
+                             + 1)
+                table = self.build_table(tabledata, tableline)
+                nodelist = [table] + messages
+            except tableparser.TableMarkupError, detail:
+                nodelist = self.malformed_table(
+                    block, ' '.join(detail.args)) + messages
+        else:
+            nodelist = messages
+        return nodelist, blank_finish
+
+    def isolate_grid_table(self):
+        messages = []
+        blank_finish = 1
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            messages.append(self.reporter.error('Unexpected indentation.',
+                                                source=source, line=lineno))
+            blank_finish = 0
+        block.disconnect()
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        width = len(block[0].strip())
+        for i in range(len(block)):
+            block[i] = block[i].strip()
+            if block[i][0] not in '+|': # check left edge
+                blank_finish = 0
+                self.state_machine.previous_line(len(block) - i)
+                del block[i:]
+                break
+        if not self.grid_table_top_pat.match(block[-1]): # find bottom
+            blank_finish = 0
+            # from second-last to third line of table:
+            for i in range(len(block) - 2, 1, -1):
+                if self.grid_table_top_pat.match(block[i]):
+                    self.state_machine.previous_line(len(block) - i + 1)
+                    del block[i+1:]
+                    break
+            else:
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        for i in range(len(block)):     # check right edge
+            if len(block[i]) != width or block[i][-1] not in '+|':
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        return block, messages, blank_finish
+
+    def isolate_simple_table(self):
+        start = self.state_machine.line_offset
+        lines = self.state_machine.input_lines
+        limit = len(lines) - 1
+        toplen = len(lines[start].strip())
+        pattern_match = self.simple_table_border_pat.match
+        found = 0
+        found_at = None
+        i = start + 1
+        while i <= limit:
+            line = lines[i]
+            match = pattern_match(line)
+            if match:
+                if len(line.strip()) != toplen:
+                    self.state_machine.next_line(i - start)
+                    messages = self.malformed_table(
+                        lines[start:i+1], 'Bottom/header table border does '
+                        'not match top border.')
+                    return [], messages, i == limit or not lines[i+1].strip()
+                found += 1
+                found_at = i
+                if found == 2 or i == limit or not lines[i+1].strip():
+                    end = i
+                    break
+            i += 1
+        else:                           # reached end of input_lines
+            if found:
+                extra = ' or no blank line after table bottom'
+                self.state_machine.next_line(found_at - start)
+                block = lines[start:found_at+1]
+            else:
+                extra = ''
+                self.state_machine.next_line(i - start - 1)
+                block = lines[start:]
+            messages = self.malformed_table(
+                block, 'No bottom table border found%s.' % extra)
+            return [], messages, not extra
+        self.state_machine.next_line(end - start)
+        block = lines[start:end+1]
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        return block, [], end == limit or not lines[end+1].strip()
+
+    def malformed_table(self, block, detail=''):
+        block.replace(self.double_width_pad_char, '')
+        data = '\n'.join(block)
+        message = 'Malformed table.'
+        lineno = self.state_machine.abs_line_number() - len(block) + 1
+        if detail:
+            message += '\n' + detail
+        error = self.reporter.error(message, nodes.literal_block(data, data),
+                                    line=lineno)
+        return [error]
+
+    def build_table(self, tabledata, tableline, stub_columns=0):
+        colwidths, headrows, bodyrows = tabledata
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(colwidths))
+        table += tgroup
+        for colwidth in colwidths:
+            colspec = nodes.colspec(colwidth=colwidth)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        if headrows:
+            thead = nodes.thead()
+            tgroup += thead
+            for row in headrows:
+                thead += self.build_table_row(row, tableline)
+        tbody = nodes.tbody()
+        tgroup += tbody
+        for row in bodyrows:
+            tbody += self.build_table_row(row, tableline)
+        return table
+
+    def build_table_row(self, rowdata, tableline):
+        row = nodes.row()
+        for cell in rowdata:
+            if cell is None:
+                continue
+            morerows, morecols, offset, cellblock = cell
+            attributes = {}
+            if morerows:
+                attributes['morerows'] = morerows
+            if morecols:
+                attributes['morecols'] = morecols
+            entry = nodes.entry(**attributes)
+            row += entry
+            if ''.join(cellblock):
+                self.nested_parse(cellblock, input_offset=tableline+offset,
+                                  node=entry)
+        return row
+
+
+    explicit = Struct()
+    """Patterns and constants used for explicit markup recognition."""
+
+    explicit.patterns = Struct(
+          target=re.compile(r"""
+                            (
+                              _               # anonymous target
+                            |               # *OR*
+                              (?!_)           # no underscore at the beginning
+                              (?P<quote>`?)   # optional open quote
+                              (?![ `])        # first char. not space or
+                                              # backquote
+                              (?P<name>       # reference name
+                                .+?
+                              )
+                              %(non_whitespace_escape_before)s
+                              (?P=quote)      # close quote if open quote used
+                            )
+                            (?<!(?<!\x00):) # no unescaped colon at end
+                            %(non_whitespace_escape_before)s
+                            [ ]?            # optional space
+                            :               # end of reference name
+                            ([ ]+|$)        # followed by whitespace
+                            """ % vars(Inliner), re.VERBOSE),
+          reference=re.compile(r"""
+                               (
+                                 (?P<simple>%(simplename)s)_
+                               |                  # *OR*
+                                 `                  # open backquote
+                                 (?![ ])            # not space
+                                 (?P<phrase>.+?)    # hyperlink phrase
+                                 %(non_whitespace_escape_before)s
+                                 `_                 # close backquote,
+                                                    # reference mark
+                               )
+                               $                  # end of string
+                               """ % vars(Inliner), re.VERBOSE | re.UNICODE),
+          substitution=re.compile(r"""
+                                  (
+                                    (?![ ])          # first char. not space
+                                    (?P<name>.+?)    # substitution text
+                                    %(non_whitespace_escape_before)s
+                                    \|               # close delimiter
+                                  )
+                                  ([ ]+|$)           # followed by whitespace
+                                  """ % vars(Inliner), re.VERBOSE),)
+
+    def footnote(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        footnote = nodes.footnote('\n'.join(indented))
+        footnote.line = lineno
+        if name[0] == '#':              # auto-numbered
+            name = name[1:]             # autonumber label
+            footnote['auto'] = 1
+            if name:
+                footnote['names'].append(name)
+            self.document.note_autofootnote(footnote)
+        elif name == '*':               # auto-symbol
+            name = ''
+            footnote['auto'] = '*'
+            self.document.note_symbol_footnote(footnote)
+        else:                           # manually numbered
+            footnote += nodes.label('', label)
+            footnote['names'].append(name)
+            self.document.note_footnote(footnote)
+        if name:
+            self.document.note_explicit_target(footnote, footnote)
+        else:
+            self.document.set_id(footnote, footnote)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=footnote)
+        return [footnote], blank_finish
+
+    def citation(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        citation = nodes.citation('\n'.join(indented))
+        citation.line = lineno
+        citation += nodes.label('', label)
+        citation['names'].append(name)
+        self.document.note_citation(citation)
+        self.document.note_explicit_target(citation, citation)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=citation)
+        return [citation], blank_finish
+
+    def hyperlink_target(self, match):
+        pattern = self.explicit.patterns.target
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(
+              match.end(), until_blank=1, strip_indent=0)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        escaped = block[0]
+        blockindex = 0
+        while 1:
+            targetmatch = pattern.match(escaped)
+            if targetmatch:
+                break
+            blockindex += 1
+            try:
+                escaped += block[blockindex]
+            except IndexError:
+                raise MarkupError('malformed hyperlink target.', lineno)
+        del block[:blockindex]
+        block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
+        target = self.make_target(block, blocktext, lineno,
+                                  targetmatch.group('name'))
+        return [target], blank_finish
+
+    def make_target(self, block, block_text, lineno, target_name):
+        target_type, data = self.parse_target(block, block_text, lineno)
+        if target_type == 'refname':
+            target = nodes.target(block_text, '', refname=normalize_name(data))
+            target.indirect_reference_name = data
+            self.add_target(target_name, '', target, lineno)
+            self.document.note_indirect_target(target)
+            return target
+        elif target_type == 'refuri':
+            target = nodes.target(block_text, '')
+            self.add_target(target_name, data, target, lineno)
+            return target
+        else:
+            return data
+
+    def parse_target(self, block, block_text, lineno):
+        """
+        Determine the type of reference of a target.
+
+        :Return: A 2-tuple, one of:
+
+            - 'refname' and the indirect reference name
+            - 'refuri' and the URI
+            - 'malformed' and a system_message node
+        """
+        if block and block[-1].strip()[-1:] == '_': # possible indirect target
+            reference = ' '.join([line.strip() for line in block])
+            refname = self.is_reference(reference)
+            if refname:
+                return 'refname', refname
+        reference = ''.join([''.join(line.split()) for line in block])
+        return 'refuri', unescape(reference)
+
+    def is_reference(self, reference):
+        match = self.explicit.patterns.reference.match(
+            whitespace_normalize_name(reference))
+        if not match:
+            return None
+        return unescape(match.group('simple') or match.group('phrase'))
+
+    def add_target(self, targetname, refuri, target, lineno):
+        target.line = lineno
+        if targetname:
+            name = normalize_name(unescape(targetname))
+            target['names'].append(name)
+            if refuri:
+                uri = self.inliner.adjust_uri(refuri)
+                if uri:
+                    target['refuri'] = uri
+                else:
+                    raise ApplicationError('problem with URI: %r' % refuri)
+            self.document.note_explicit_target(target, self.parent)
+        else:                       # anonymous target
+            if refuri:
+                target['refuri'] = refuri
+            target['anonymous'] = 1
+            self.document.note_anonymous_target(target)
+
+    def substitution_def(self, match):
+        pattern = self.explicit.patterns.substitution
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          strip_indent=0)
+        blocktext = (match.string[:match.end()] + '\n'.join(block))
+        block.disconnect()
+        escaped = escape2null(block[0].rstrip())
+        blockindex = 0
+        while 1:
+            subdefmatch = pattern.match(escaped)
+            if subdefmatch:
+                break
+            blockindex += 1
+            try:
+                escaped = escaped + ' ' + escape2null(block[blockindex].strip())
+            except IndexError:
+                raise MarkupError('malformed substitution definition.',
+                                  lineno)
+        del block[:blockindex]          # strip out the substitution marker
+        block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
+        if not block[0]:
+            del block[0]
+            offset += 1
+        while block and not block[-1].strip():
+            block.pop()
+        subname = subdefmatch.group('name')
+        substitution_node = nodes.substitution_definition(blocktext)
+        substitution_node.line = lineno
+        if not block:
+            msg = self.reporter.warning(
+                'Substitution definition "%s" missing contents.' % subname,
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        block[0] = block[0].strip()
+        substitution_node['names'].append(
+            nodes.whitespace_normalize_name(subname))
+        new_abs_offset, blank_finish = self.nested_list_parse(
+              block, input_offset=offset, node=substitution_node,
+              initial_state='SubstitutionDef', blank_finish=blank_finish)
+        i = 0
+        for node in substitution_node[:]:
+            if not (isinstance(node, nodes.Inline) or
+                    isinstance(node, nodes.Text)):
+                self.parent += substitution_node[i]
+                del substitution_node[i]
+            else:
+                i += 1
+        for node in substitution_node.traverse(nodes.Element):
+            if self.disallowed_inside_substitution_definitions(node):
+                pformat = nodes.literal_block('', node.pformat().rstrip())
+                msg = self.reporter.error(
+                    'Substitution definition contains illegal element:',
+                    pformat, nodes.literal_block(blocktext, blocktext),
+                    line=lineno)
+                return [msg], blank_finish
+        if len(substitution_node) == 0:
+            msg = self.reporter.warning(
+                  'Substitution definition "%s" empty or invalid.'
+                  % subname,
+                  nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        self.document.note_substitution_def(
+            substitution_node, subname, self.parent)
+        return [substitution_node], blank_finish
+
+    def disallowed_inside_substitution_definitions(self, node):
+        if (node['ids'] or
+            isinstance(node, nodes.reference) and node.get('anonymous') or
+            isinstance(node, nodes.footnote_reference) and node.get('auto')):
+            return 1
+        else:
+            return 0
+
+    def directive(self, match, **option_presets):
+        """Returns a 2-tuple: list of nodes, and a "blank finish" boolean."""
+        type_name = match.group(1)
+        directive_class, messages = directives.directive(
+            type_name, self.memo.language, self.document)
+        self.parent += messages
+        if directive_class:
+            return self.run_directive(
+                directive_class, match, type_name, option_presets)
+        else:
+            return self.unknown_directive(type_name)
+
+    def run_directive(self, directive, match, type_name, option_presets):
+        """
+        Parse a directive then run its directive function.
+
+        Parameters:
+
+        - `directive`: The class implementing the directive.  Must be
+          a subclass of `rst.Directive`.
+
+        - `match`: A regular expression match object which matched the first
+          line of the directive.
+
+        - `type_name`: The directive name, as used in the source text.
+
+        - `option_presets`: A dictionary of preset options, defaults for the
+          directive options.  Currently, only an "alt" option is passed by
+          substitution definitions (value: the substitution name), which may
+          be used by an embedded image directive.
+
+        Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
+        """
+        if isinstance(directive, (FunctionType, MethodType)):
+            from docutils.parsers.rst import convert_directive_function
+            directive = convert_directive_function(directive)
+        lineno = self.state_machine.abs_line_number()
+        initial_line_offset = self.state_machine.line_offset
+        indented, indent, line_offset, blank_finish \
+                  = self.state_machine.get_first_known_indented(match.end(),
+                                                                strip_top=0)
+        block_text = '\n'.join(self.state_machine.input_lines[
+            initial_line_offset : self.state_machine.line_offset + 1])
+        try:
+            arguments, options, content, content_offset = (
+                self.parse_directive_block(indented, line_offset,
+                                           directive, option_presets))
+        except MarkupError, detail:
+            error = self.reporter.error(
+                'Error in "%s" directive:\n%s.' % (type_name,
+                                                   ' '.join(detail.args)),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error], blank_finish
+        directive_instance = directive(
+            type_name, arguments, options, content, lineno,
+            content_offset, block_text, self, self.state_machine)
+        try:
+            result = directive_instance.run()
+        except docutils.parsers.rst.DirectiveError, directive_error:
+            msg_node = self.reporter.system_message(directive_error.level,
+                                                    directive_error.message)
+            msg_node += nodes.literal_block(block_text, block_text)
+            msg_node['line'] = lineno
+            result = [msg_node]
+        assert isinstance(result, list), \
+               'Directive "%s" must return a list of nodes.' % type_name
+        for i in range(len(result)):
+            assert isinstance(result[i], nodes.Node), \
+                   ('Directive "%s" returned non-Node object (index %s): %r'
+                    % (type_name, i, result[i]))
+        return (result,
+                blank_finish or self.state_machine.is_next_line_blank())
+
+    def parse_directive_block(self, indented, line_offset, directive,
+                              option_presets):
+        option_spec = directive.option_spec
+        has_content = directive.has_content
+        if indented and not indented[0].strip():
+            indented.trim_start()
+            line_offset += 1
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if indented and (directive.required_arguments
+                         or directive.optional_arguments
+                         or option_spec):
+            for i in range(len(indented)):
+                if not indented[i].strip():
+                    break
+            else:
+                i += 1
+            arg_block = indented[:i]
+            content = indented[i+1:]
+            content_offset = line_offset + i + 1
+        else:
+            content = indented
+            content_offset = line_offset
+            arg_block = []
+        while content and not content[0].strip():
+            content.trim_start()
+            content_offset += 1
+        if option_spec:
+            options, arg_block = self.parse_directive_options(
+                option_presets, option_spec, arg_block)
+            if arg_block and not (directive.required_arguments
+                                  or directive.optional_arguments):
+                raise MarkupError('no arguments permitted; blank line '
+                                  'required before content block')
+        else:
+            options = {}
+        if directive.required_arguments or directive.optional_arguments:
+            arguments = self.parse_directive_arguments(
+                directive, arg_block)
+        else:
+            arguments = []
+        if content and not has_content:
+            raise MarkupError('no content permitted')
+        return (arguments, options, content, content_offset)
+
+    def parse_directive_options(self, option_presets, option_spec, arg_block):
+        options = option_presets.copy()
+        for i in range(len(arg_block)):
+            if arg_block[i][:1] == ':':
+                opt_block = arg_block[i:]
+                arg_block = arg_block[:i]
+                break
+        else:
+            opt_block = []
+        if opt_block:
+            success, data = self.parse_extension_options(option_spec,
+                                                         opt_block)
+            if success:                 # data is a dict of options
+                options.update(data)
+            else:                       # data is an error string
+                raise MarkupError(data)
+        return options, arg_block
+
+    def parse_directive_arguments(self, directive, arg_block):
+        required = directive.required_arguments
+        optional = directive.optional_arguments
+        arg_text = '\n'.join(arg_block)
+        arguments = arg_text.split()
+        if len(arguments) < required:
+            raise MarkupError('%s argument(s) required, %s supplied'
+                              % (required, len(arguments)))
+        elif len(arguments) > required + optional:
+            if directive.final_argument_whitespace:
+                arguments = arg_text.split(None, required + optional - 1)
+            else:
+                raise MarkupError(
+                    'maximum %s argument(s) allowed, %s supplied'
+                    % (required + optional, len(arguments)))
+        return arguments
+
+    def parse_extension_options(self, option_spec, datalines):
+        """
+        Parse `datalines` for a field list containing extension options
+        matching `option_spec`.
+
+        :Parameters:
+            - `option_spec`: a mapping of option name to conversion
+              function, which should raise an exception on bad input.
+            - `datalines`: a list of input strings.
+
+        :Return:
+            - Success value, 1 or 0.
+            - An option dictionary on success, an error string on failure.
+        """
+        node = nodes.field_list()
+        newline_offset, blank_finish = self.nested_list_parse(
+              datalines, 0, node, initial_state='ExtensionOptions',
+              blank_finish=1)
+        if newline_offset != len(datalines): # incomplete parse of block
+            return 0, 'invalid option block'
+        try:
+            options = utils.extract_extension_options(node, option_spec)
+        except KeyError, detail:
+            return 0, ('unknown option: "%s"' % detail.args[0])
+        except (ValueError, TypeError), detail:
+            return 0, ('invalid option value: %s' % ' '.join(detail.args))
+        except utils.ExtensionOptionError, detail:
+            return 0, ('invalid option data: %s' % ' '.join(detail.args))
+        if blank_finish:
+            return 1, options
+        else:
+            return 0, 'option data incompletely parsed'
+
+    def unknown_directive(self, type_name):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(0, strip_indent=0)
+        text = '\n'.join(indented)
+        error = self.reporter.error(
+              'Unknown directive type "%s".' % type_name,
+              nodes.literal_block(text, text), line=lineno)
+        return [error], blank_finish
+
+    def comment(self, match):
+        if not match.string[match.end():].strip() \
+              and self.state_machine.is_next_line_blank(): # an empty comment?
+            return [nodes.comment()], 1 # "A tiny but practical wart."
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        text = '\n'.join(indented)
+        return [nodes.comment(text, text)], blank_finish
+
+    explicit.constructs = [
+          (footnote,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[
+                      (                 # footnote label:
+                          [0-9]+          # manually numbered footnote
+                        |               # *OR*
+                          \#              # anonymous auto-numbered footnote
+                        |               # *OR*
+                          \#%s            # auto-number ed?) footnote label
+                        |               # *OR*
+                          \*              # auto-symbol footnote
+                      )
+                      \]
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (citation,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[(%s)\]          # citation label
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (hyperlink_target,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      _                 # target indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (substitution_def,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \|                # substitution indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (directive,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      (%s)              # directive name
+                      [ ]?              # optional space
+                      ::                # directive delimiter
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def explicit_construct(self, match):
+        """Determine which explicit construct this is, parse & return it."""
+        errors = []
+        for method, pattern in self.explicit.constructs:
+            expmatch = pattern.match(match.string)
+            if expmatch:
+                try:
+                    return method(self, expmatch)
+                except MarkupError, (message, lineno): # never reached?
+                    errors.append(self.reporter.warning(message, line=lineno))
+                    break
+        nodelist, blank_finish = self.comment(match)
+        return nodelist + errors, blank_finish
+
+    def explicit_list(self, blank_finish):
+        """
+        Create a nested state machine for a series of explicit markup
+        constructs (including anonymous hyperlink targets).
+        """
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=self.parent, initial_state='Explicit',
+              blank_finish=blank_finish,
+              match_titles=self.state_machine.match_titles)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Explicit markup')
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def anonymous_target(self, match):
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish \
+              = self.state_machine.get_first_known_indented(match.end(),
+                                                            until_blank=1)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        target = self.make_target(block, blocktext, lineno, '')
+        return [target], blank_finish
+
+    def line(self, match, context, next_state):
+        """Section title overline or transition marker."""
+        if self.state_machine.match_titles:
+            return [match.string], 'Line', []
+        elif match.string.strip() == '::':
+            raise statemachine.TransitionCorrection('text')
+        elif len(match.string.strip()) < 4:
+            msg = self.reporter.info(
+                'Unexpected possible title overline or transition.\n'
+                "Treating it as ordinary text because it's so short.",
+                line=self.state_machine.abs_line_number())
+            self.parent += msg
+            raise statemachine.TransitionCorrection('text')
+        else:
+            blocktext = self.state_machine.line
+            msg = self.reporter.severe(
+                  'Unexpected section title or transition.',
+                  nodes.literal_block(blocktext, blocktext),
+                  line=self.state_machine.abs_line_number())
+            self.parent += msg
+            return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Titles, definition lists, paragraphs."""
+        return [match.string], 'Text', []
+
+
+class RFC2822Body(Body):
+
+    """
+    RFC2822 headers are only valid as the first constructs in documents.  As
+    soon as anything else appears, the `Body` state should take over.
+    """
+
+    patterns = Body.patterns.copy()     # can't modify the original
+    patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
+    initial_transitions = [(name, 'Body')
+                           for name in Body.initial_transitions]
+    initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        fieldlist = nodes.field_list(classes=['rfc2822'])
+        self.parent += fieldlist
+        field, blank_finish = self.rfc2822_field(match)
+        fieldlist += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=fieldlist, initial_state='RFC2822List',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning(
+                  'RFC2822-style field list')
+        return [], next_state, []
+
+    def rfc2822_field(self, match):
+        name = match.string[:match.string.find(':')]
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        fieldnode = nodes.field()
+        fieldnode += nodes.field_name(name, name)
+        fieldbody = nodes.field_body('\n'.join(indented))
+        fieldnode += fieldbody
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=fieldbody)
+        return fieldnode, blank_finish
+
+
+class SpecializedBody(Body):
+
+    """
+    Superclass for second and subsequent compound element members.  Compound
+    elements are lists and list-like constructs.
+
+    All transition methods are disabled (redefined as `invalid_input`).
+    Override individual methods in subclasses to re-enable.
+
+    For example, once an initial bullet list item, say, is recognized, the
+    `BulletList` subclass takes over, with a "bullet_list" node as its
+    container.  Upon encountering the initial bullet list item, `Body.bullet`
+    calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
+    starts up a nested parsing session with `BulletList` as the initial state.
+    Only the ``bullet`` transition method is enabled in `BulletList`; as long
+    as only bullet list items are encountered, they are parsed and inserted
+    into the container.  The first construct which is *not* a bullet list item
+    triggers the `invalid_input` method, which ends the nested parse and
+    closes the container.  `BulletList` needs to recognize input that is
+    invalid in the context of a bullet list, which means everything *other
+    than* bullet list items, so it inherits the transition list created in
+    `Body`.
+    """
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        self.state_machine.previous_line() # back up so parent SM can reassess
+        raise EOFError
+
+    indent = invalid_input
+    bullet = invalid_input
+    enumerator = invalid_input
+    field_marker = invalid_input
+    option_marker = invalid_input
+    doctest = invalid_input
+    line_block = invalid_input
+    grid_table_top = invalid_input
+    simple_table_top = invalid_input
+    explicit_markup = invalid_input
+    anonymous = invalid_input
+    line = invalid_input
+    text = invalid_input
+
+
+class BulletList(SpecializedBody):
+
+    """Second and subsequent bullet_list list_items."""
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        if match.string[0] != self.parent['bullet']:
+            # different bullet: new list
+            self.invalid_input()
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class DefinitionList(SpecializedBody):
+
+    """Second and subsequent definition_list_items."""
+
+    def text(self, match, context, next_state):
+        """Definition lists."""
+        return [match.string], 'Definition', []
+
+
+class EnumeratedList(SpecializedBody):
+
+    """Second and subsequent enumerated_list list_items."""
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated list item."""
+        format, sequence, text, ordinal = self.parse_enumerator(
+              match, self.parent['enumtype'])
+        if ( format != self.format
+             or (sequence != '#' and (sequence != self.parent['enumtype']
+                                      or self.auto
+                                      or ordinal != (self.lastordinal + 1)))
+             or not self.is_enumerated_list_item(ordinal, sequence, format)):
+            # different enumeration: new list
+            self.invalid_input()
+        if sequence == '#':
+            self.auto = 1
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        self.lastordinal = ordinal
+        return [], next_state, []
+
+
+class FieldList(SpecializedBody):
+
+    """Second and subsequent field_list fields."""
+
+    def field_marker(self, match, context, next_state):
+        """Field list field."""
+        field, blank_finish = self.field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class OptionList(SpecializedBody):
+
+    """Second and subsequent option_list option_list_items."""
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        try:
+            option_list_item, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            self.invalid_input()
+        self.parent += option_list_item
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class RFC2822List(SpecializedBody, RFC2822Body):
+
+    """Second and subsequent RFC2822-style field_list fields."""
+
+    patterns = RFC2822Body.patterns
+    initial_transitions = RFC2822Body.initial_transitions
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        field, blank_finish = self.rfc2822_field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], 'RFC2822List', []
+
+    blank = SpecializedBody.invalid_input
+
+
+class ExtensionOptions(FieldList):
+
+    """
+    Parse field_list fields for extension options.
+
+    No nested parsing is done (including inline markup parsing).
+    """
+
+    def parse_field_body(self, indented, offset, node):
+        """Override `Body.parse_field_body` for simpler parsing."""
+        lines = []
+        for line in list(indented) + ['']:
+            if line.strip():
+                lines.append(line)
+            elif lines:
+                text = '\n'.join(lines)
+                node += nodes.paragraph(text, text)
+                lines = []
+
+
+class LineBlock(SpecializedBody):
+
+    """Second and subsequent lines of a line_block."""
+
+    blank = SpecializedBody.invalid_input
+
+    def line_block(self, match, context, next_state):
+        """New line of line block."""
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        self.parent += line
+        self.parent.parent += messages
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class Explicit(SpecializedBody):
+
+    """Second and subsequent explicit markup construct."""
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    blank = SpecializedBody.invalid_input
+
+
+class SubstitutionDef(Body):
+
+    """
+    Parser for the contents of a substitution_definition element.
+    """
+
+    patterns = {
+          'embedded_directive': re.compile(r'(%s)::( +|$)'
+                                           % Inliner.simplename, re.UNICODE),
+          'text': r''}
+    initial_transitions = ['embedded_directive', 'text']
+
+    def embedded_directive(self, match, context, next_state):
+        nodelist, blank_finish = self.directive(match,
+                                                alt=self.parent['names'][0])
+        self.parent += nodelist
+        if not self.state_machine.at_eof():
+            self.blank_finish = blank_finish
+        raise EOFError
+
+    def text(self, match, context, next_state):
+        if not self.state_machine.at_eof():
+            self.blank_finish = self.state_machine.is_next_line_blank()
+        raise EOFError
+
+
+class Text(RSTState):
+
+    """
+    Classifier of second line of a text block.
+
+    Could be a paragraph, a definition list item, or a title.
+    """
+
+    patterns = {'underline': Body.patterns['line'],
+                'text': r''}
+    initial_transitions = [('underline', 'Body'), ('text', 'Body')]
+
+    def blank(self, match, context, next_state):
+        """End of paragraph."""
+        paragraph, literalnext = self.paragraph(
+              context, self.state_machine.abs_line_number() - 1)
+        self.parent += paragraph
+        if literalnext:
+            self.parent += self.literal_block()
+        return [], 'Body', []
+
+    def eof(self, context):
+        if context:
+            self.blank(None, context, None)
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlist = nodes.definition_list()
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        definitionlist += definitionlistitem
+        self.parent += definitionlist
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=definitionlist, initial_state='DefinitionList',
+              blank_finish=blank_finish, blank_finish_state='Definition')
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Definition list')
+        return [], 'Body', []
+
+    def underline(self, match, context, next_state):
+        """Section title."""
+        lineno = self.state_machine.abs_line_number()
+        title = context[0].rstrip()
+        underline = match.string.rstrip()
+        source = title + '\n' + underline
+        messages = []
+        if column_width(title) > len(underline):
+            if len(underline) < 4:
+                if self.state_machine.match_titles:
+                    msg = self.reporter.info(
+                        'Possible title underline, too short for the title.\n'
+                        "Treating it as ordinary text because it's so short.",
+                        line=lineno)
+                    self.parent += msg
+                raise statemachine.TransitionCorrection('text')
+            else:
+                blocktext = context[0] + '\n' + self.state_machine.line
+                msg = self.reporter.warning(
+                    'Title underline too short.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                messages.append(msg)
+        if not self.state_machine.match_titles:
+            blocktext = context[0] + '\n' + self.state_machine.line
+            msg = self.reporter.severe(
+                'Unexpected section title.',
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            self.parent += messages
+            self.parent += msg
+            return [], next_state, []
+        style = underline[0]
+        context[:] = []
+        self.section(title, source, style, lineno - 1, messages)
+        return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Paragraph."""
+        startline = self.state_machine.abs_line_number() - 1
+        msg = None
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            msg = self.reporter.error('Unexpected indentation.',
+                                      source=source, line=lineno)
+        lines = context + list(block)
+        paragraph, literalnext = self.paragraph(lines, startline)
+        self.parent += paragraph
+        self.parent += msg
+        if literalnext:
+            try:
+                self.state_machine.next_line()
+            except EOFError:
+                pass
+            self.parent += self.literal_block()
+        return [], next_state, []
+
+    def literal_block(self):
+        """Return a list of nodes."""
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_indented()
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if not indented:
+            return self.quoted_literal_block()
+        data = '\n'.join(indented)
+        literal_block = nodes.literal_block(data, data)
+        literal_block.line = offset + 1
+        nodelist = [literal_block]
+        if not blank_finish:
+            nodelist.append(self.unindent_warning('Literal block'))
+        return nodelist
+
+    def quoted_literal_block(self):
+        abs_line_offset = self.state_machine.abs_line_offset()
+        offset = self.state_machine.line_offset
+        parent_node = nodes.Element()
+        new_abs_offset = self.nested_parse(
+            self.state_machine.input_lines[offset:],
+            input_offset=abs_line_offset, node=parent_node, match_titles=0,
+            state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
+                                  'initial_state': 'QuotedLiteralBlock'})
+        self.goto_line(new_abs_offset)
+        return parent_node.children
+
+    def definition_list_item(self, termline):
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        definitionlistitem = nodes.definition_list_item(
+            '\n'.join(termline + list(indented)))
+        lineno = self.state_machine.abs_line_number() - 1
+        definitionlistitem.line = lineno
+        termlist, messages = self.term(termline, lineno)
+        definitionlistitem += termlist
+        definition = nodes.definition('', *messages)
+        definitionlistitem += definition
+        if termline[0][-2:] == '::':
+            definition += self.reporter.info(
+                  'Blank line missing before literal block (after the "::")? '
+                  'Interpreted as a definition list item.', line=line_offset+1)
+        self.nested_parse(indented, input_offset=line_offset, node=definition)
+        return definitionlistitem, blank_finish
+
+    classifier_delimiter = re.compile(' +: +')
+
+    def term(self, lines, lineno):
+        """Return a definition_list's term and optional classifiers."""
+        assert len(lines) == 1
+        text_nodes, messages = self.inline_text(lines[0], lineno)
+        term_node = nodes.term()
+        node_list = [term_node]
+        for i in range(len(text_nodes)):
+            node = text_nodes[i]
+            if isinstance(node, nodes.Text):
+                parts = self.classifier_delimiter.split(node.rawsource)
+                if len(parts) == 1:
+                    node_list[-1] += node
+                else:
+                    
+                    node_list[-1] += nodes.Text(parts[0].rstrip())
+                    for part in parts[1:]:
+                        classifier_node = nodes.classifier('', part)
+                        node_list.append(classifier_node)
+            else:
+                node_list[-1] += node
+        return node_list, messages
+
+
+class SpecializedText(Text):
+
+    """
+    Superclass for second and subsequent lines of Text-variants.
+
+    All transition methods are disabled. Override individual methods in
+    subclasses to re-enable.
+    """
+
+    def eof(self, context):
+        """Incomplete construct."""
+        return []
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        raise EOFError
+
+    blank = invalid_input
+    indent = invalid_input
+    underline = invalid_input
+    text = invalid_input
+
+
+class Definition(SpecializedText):
+
+    """Second line of potential definition_list_item."""
+
+    def eof(self, context):
+        """Not a definition."""
+        self.state_machine.previous_line(2) # so parent SM can reassess
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        self.parent += definitionlistitem
+        self.blank_finish = blank_finish
+        return [], 'DefinitionList', []
+
+
+class Line(SpecializedText):
+
+    """
+    Second line of over- & underlined section title or transition marker.
+    """
+
+    eofcheck = 1                        # @@@ ???
+    """Set to 0 while parsing sections, so that we don't catch the EOF."""
+
+    def eof(self, context):
+        """Transition marker at end of section or document."""
+        marker = context[0].strip()
+        if self.memo.section_bubble_up_kludge:
+            self.memo.section_bubble_up_kludge = 0
+        elif len(marker) < 4:
+            self.state_correction(context)
+        if self.eofcheck:               # ignore EOFError with sections
+            lineno = self.state_machine.abs_line_number() - 1
+            transition = nodes.transition(rawsource=context[0])
+            transition.line = lineno
+            self.parent += transition
+        self.eofcheck = 1
+        return []
+
+    def blank(self, match, context, next_state):
+        """Transition marker."""
+        lineno = self.state_machine.abs_line_number() - 1
+        marker = context[0].strip()
+        if len(marker) < 4:
+            self.state_correction(context)
+        transition = nodes.transition(rawsource=marker)
+        transition.line = lineno
+        self.parent += transition
+        return [], 'Body', []
+
+    def text(self, match, context, next_state):
+        """Potential over- & underlined title."""
+        lineno = self.state_machine.abs_line_number() - 1
+        overline = context[0]
+        title = match.string
+        underline = ''
+        try:
+            underline = self.state_machine.next_line()
+        except EOFError:
+            blocktext = overline + '\n' + title
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Incomplete section title.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        source = '%s\n%s\n%s' % (overline, title, underline)
+        overline = overline.rstrip()
+        underline = underline.rstrip()
+        if not self.transitions['underline'][0].match(underline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Missing matching underline for section title overline.',
+                    nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        elif overline != underline:
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                      'Title overline & underline mismatch.',
+                      nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        title = title.rstrip()
+        messages = []
+        if column_width(title) > len(overline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.warning(
+                      'Title overline too short.',
+                      nodes.literal_block(source, source), line=lineno)
+                messages.append(msg)
+        style = (overline[0], underline[0])
+        self.eofcheck = 0               # @@@ not sure this is correct
+        self.section(title.lstrip(), source, style, lineno + 1, messages)
+        self.eofcheck = 1
+        return [], 'Body', []
+
+    indent = text                       # indented title
+
+    def underline(self, match, context, next_state):
+        overline = context[0]
+        blocktext = overline + '\n' + self.state_machine.line
+        lineno = self.state_machine.abs_line_number() - 1
+        if len(overline.rstrip()) < 4:
+            self.short_overline(context, blocktext, lineno, 1)
+        msg = self.reporter.error(
+              'Invalid section title or transition marker.',
+              nodes.literal_block(blocktext, blocktext), line=lineno)
+        self.parent += msg
+        return [], 'Body', []
+
+    def short_overline(self, context, blocktext, lineno, lines=1):
+        msg = self.reporter.info(
+            'Possible incomplete section title.\nTreating the overline as '
+            "ordinary text because it's so short.", line=lineno)
+        self.parent += msg
+        self.state_correction(context, lines)
+
+    def state_correction(self, context, lines=1):
+        self.state_machine.previous_line(lines)
+        context[:] = []
+        raise statemachine.StateCorrection('Body', 'text')
+
+
+class QuotedLiteralBlock(RSTState):
+
+    """
+    Nested parse handler for quoted (unindented) literal blocks.
+
+    Special-purpose.  Not for inclusion in `state_classes`.
+    """
+
+    patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
+                'text': r''}
+    initial_transitions = ('initial_quoted', 'text')
+
+    def __init__(self, state_machine, debug=0):
+        RSTState.__init__(self, state_machine, debug)
+        self.messages = []
+        self.initial_lineno = None
+
+    def blank(self, match, context, next_state):
+        if context:
+            raise EOFError
+        else:
+            return context, next_state, []
+
+    def eof(self, context):
+        if context:
+            text = '\n'.join(context)
+            literal_block = nodes.literal_block(text, text)
+            literal_block.line = self.initial_lineno
+            self.parent += literal_block
+        else:
+            self.parent += self.reporter.warning(
+                'Literal block expected; none found.',
+                line=self.state_machine.abs_line_number())
+            self.state_machine.previous_line()
+        self.parent += self.messages
+        return []
+
+    def indent(self, match, context, next_state):
+        assert context, ('QuotedLiteralBlock.indent: context should not '
+                         'be empty!')
+        self.messages.append(
+            self.reporter.error('Unexpected indentation.',
+                                line=self.state_machine.abs_line_number()))
+        self.state_machine.previous_line()
+        raise EOFError
+
+    def initial_quoted(self, match, context, next_state):
+        """Match arbitrary quote character on the first line only."""
+        self.remove_transition('initial_quoted')
+        quote = match.string[0]
+        pattern = re.compile(re.escape(quote))
+        # New transition matches consistent quotes only:
+        self.add_transition('quoted',
+                            (pattern, self.quoted, self.__class__.__name__))
+        self.initial_lineno = self.state_machine.abs_line_number()
+        return [match.string], next_state, []
+
+    def quoted(self, match, context, next_state):
+        """Match consistent quotes on subsequent lines."""
+        context.append(match.string)
+        return context, next_state, []
+
+    def text(self, match, context, next_state):
+        if context:
+            self.messages.append(
+                self.reporter.error('Inconsistent literal block quoting.',
+                                    line=self.state_machine.abs_line_number()))
+            self.state_machine.previous_line()
+        raise EOFError
+
+
+state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
+                 OptionList, LineBlock, ExtensionOptions, Explicit, Text,
+                 Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List)
+"""Standard set of State classes used to start `RSTStateMachine`."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,525 @@
+# $Id: tableparser.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines table parser classes,which parse plaintext-graphic tables
+and produce a well-formed data structure suitable for building a CALS table.
+
+:Classes:
+    - `GridTableParser`: Parse fully-formed tables represented with a grid.
+    - `SimpleTableParser`: Parse simple tables, delimited by top & bottom
+      borders.
+
+:Exception class: `TableMarkupError`
+
+:Function:
+    `update_dict_of_lists()`: Merge two dictionaries containing list values.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import DataError
+
+
+class TableMarkupError(DataError): pass
+
+
+class TableParser:
+
+    """
+    Abstract superclass for the common parts of the syntax-specific parsers.
+    """
+
+    head_body_separator_pat = None
+    """Matches the row separator between head rows and body rows."""
+
+    double_width_pad_char = '\x00'
+    """Padding character for East Asian double-width text."""
+
+    def parse(self, block):
+        """
+        Analyze the text `block` and return a table data structure.
+
+        Given a plaintext-graphic table in `block` (list of lines of text; no
+        whitespace padding), parse the table, construct and return the data
+        necessary to construct a CALS table or equivalent.
+
+        Raise `TableMarkupError` if there is any problem with the markup.
+        """
+        self.setup(block)
+        self.find_head_body_sep()
+        self.parse_table()
+        structure = self.structure_from_cells()
+        return structure
+
+    def find_head_body_sep(self):
+        """Look for a head/body row separator line; store the line index."""
+        for i in range(len(self.block)):
+            line = self.block[i]
+            if self.head_body_separator_pat.match(line):
+                if self.head_body_sep:
+                    raise TableMarkupError(
+                        'Multiple head/body row separators in table (at line '
+                        'offset %s and %s); only one allowed.'
+                        % (self.head_body_sep, i))
+                else:
+                    self.head_body_sep = i
+                    self.block[i] = line.replace('=', '-')
+        if self.head_body_sep == 0 or self.head_body_sep == (len(self.block)
+                                                             - 1):
+            raise TableMarkupError('The head/body row separator may not be '
+                                   'the first or last line of the table.')
+
+
+class GridTableParser(TableParser):
+
+    """
+    Parse a grid table using `parse()`.
+
+    Here's an example of a grid table::
+
+        +------------------------+------------+----------+----------+
+        | Header row, column 1   | Header 2   | Header 3 | Header 4 |
+        +========================+============+==========+==========+
+        | body row 1, column 1   | column 2   | column 3 | column 4 |
+        +------------------------+------------+----------+----------+
+        | body row 2             | Cells may span columns.          |
+        +------------------------+------------+---------------------+
+        | body row 3             | Cells may  | - Table cells       |
+        +------------------------+ span rows. | - contain           |
+        | body row 4             |            | - body elements.    |
+        +------------------------+------------+---------------------+
+
+    Intersections use '+', row separators use '-' (except for one optional
+    head/body row separator, which uses '='), and column separators use '|'.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure::
+
+        ([24, 12, 10, 10],
+         [[(0, 0, 1, ['Header row, column 1']),
+           (0, 0, 1, ['Header 2']),
+           (0, 0, 1, ['Header 3']),
+           (0, 0, 1, ['Header 4'])]],
+         [[(0, 0, 3, ['body row 1, column 1']),
+           (0, 0, 3, ['column 2']),
+           (0, 0, 3, ['column 3']),
+           (0, 0, 3, ['column 4'])],
+          [(0, 0, 5, ['body row 2']),
+           (0, 2, 5, ['Cells may span columns.']),
+           None,
+           None],
+          [(0, 0, 7, ['body row 3']),
+           (1, 0, 7, ['Cells may', 'span rows.', '']),
+           (1, 1, 7, ['- Table cells', '- contain', '- body elements.']),
+           None],
+          [(0, 0, 9, ['body row 4']), None, None, None]])
+
+    The first item is a list containing column widths (colspecs). The second
+    item is a list of head rows, and the third is a list of body rows. Each
+    row contains a list of cells. Each cell is either None (for a cell unused
+    because of another cell's span), or a tuple. A cell tuple contains four
+    items: the number of extra rows used by the cell in a vertical span
+    (morerows); the number of extra columns used by the cell in a horizontal
+    span (morecols); the line offset of the first line of the cell contents;
+    and the cell contents, a list of lines of text.
+    """
+
+    head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it may be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        self.bottom = len(block) - 1
+        self.right = len(block[0]) - 1
+        self.head_body_sep = None
+        self.done = [-1] * len(block[0])
+        self.cells = []
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        Start with a queue of upper-left corners, containing the upper-left
+        corner of the table itself. Trace out one rectangular cell, remember
+        it, and add its upper-right and lower-left corners to the queue of
+        potential upper-left corners of further cells. Process the queue in
+        top-to-bottom order, keeping track of how much of each text column has
+        been seen.
+
+        We'll end up knowing all the row and column boundaries, cell positions
+        and their dimensions.
+        """
+        corners = [(0, 0)]
+        while corners:
+            top, left = corners.pop(0)
+            if top == self.bottom or left == self.right \
+                  or top <= self.done[left]:
+                continue
+            result = self.scan_cell(top, left)
+            if not result:
+                continue
+            bottom, right, rowseps, colseps = result
+            update_dict_of_lists(self.rowseps, rowseps)
+            update_dict_of_lists(self.colseps, colseps)
+            self.mark_done(top, left, bottom, right)
+            cellblock = self.block.get_2D_block(top + 1, left + 1,
+                                                bottom, right)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            self.cells.append((top, left, bottom, right, cellblock))
+            corners.extend([(top, right), (bottom, left)])
+            corners.sort()
+        if not self.check_parse_complete():
+            raise TableMarkupError('Malformed table; parse incomplete.')
+
+    def mark_done(self, top, left, bottom, right):
+        """For keeping track of how much of each text column has been seen."""
+        before = top - 1
+        after = bottom - 1
+        for col in range(left, right):
+            assert self.done[col] == before
+            self.done[col] = after
+
+    def check_parse_complete(self):
+        """Each text column should have been completely seen."""
+        last = self.bottom - 1
+        for col in range(self.right):
+            if self.done[col] != last:
+                return None
+        return 1
+
+    def scan_cell(self, top, left):
+        """Starting at the top-left corner, start tracing out a cell."""
+        assert self.block[top][left] == '+'
+        result = self.scan_right(top, left)
+        return result
+
+    def scan_right(self, top, left):
+        """
+        Look for the top-right corner of the cell, and make note of all column
+        boundaries ('+').
+        """
+        colseps = {}
+        line = self.block[top]
+        for i in range(left + 1, self.right + 1):
+            if line[i] == '+':
+                colseps[i] = [top]
+                result = self.scan_down(top, left, i)
+                if result:
+                    bottom, rowseps, newcolseps = result
+                    update_dict_of_lists(colseps, newcolseps)
+                    return bottom, i, rowseps, colseps
+            elif line[i] != '-':
+                return None
+        return None
+
+    def scan_down(self, top, left, right):
+        """
+        Look for the bottom-right corner of the cell, making note of all row
+        boundaries.
+        """
+        rowseps = {}
+        for i in range(top + 1, self.bottom + 1):
+            if self.block[i][right] == '+':
+                rowseps[i] = [right]
+                result = self.scan_left(top, left, i, right)
+                if result:
+                    newrowseps, colseps = result
+                    update_dict_of_lists(rowseps, newrowseps)
+                    return i, rowseps, colseps
+            elif self.block[i][right] != '|':
+                return None
+        return None
+
+    def scan_left(self, top, left, bottom, right):
+        """
+        Noting column boundaries, look for the bottom-left corner of the cell.
+        It must line up with the starting point.
+        """
+        colseps = {}
+        line = self.block[bottom]
+        for i in range(right - 1, left, -1):
+            if line[i] == '+':
+                colseps[i] = [bottom]
+            elif line[i] != '-':
+                return None
+        if line[left] != '+':
+            return None
+        result = self.scan_up(top, left, bottom, right)
+        if result is not None:
+            rowseps = result
+            return rowseps, colseps
+        return None
+
+    def scan_up(self, top, left, bottom, right):
+        """
+        Noting row boundaries, see if we can return to the starting point.
+        """
+        rowseps = {}
+        for i in range(bottom - 1, top, -1):
+            if self.block[i][left] == '+':
+                rowseps[i] = [left]
+            elif self.block[i][left] != '|':
+                return None
+        return rowseps
+
+    def structure_from_cells(self):
+        """
+        From the data collected by `scan_cell()`, convert to the final data
+        structure.
+        """
+        rowseps = self.rowseps.keys()   # list of row boundaries
+        rowseps.sort()
+        rowindex = {}
+        for i in range(len(rowseps)):
+            rowindex[rowseps[i]] = i    # row boundary -> row number mapping
+        colseps = self.colseps.keys()   # list of column boundaries
+        colseps.sort()
+        colindex = {}
+        for i in range(len(colseps)):
+            colindex[colseps[i]] = i    # column boundary -> col number map
+        colspecs = [(colseps[i] - colseps[i - 1] - 1)
+                    for i in range(1, len(colseps))] # list of column widths
+        # prepare an empty table with the correct number of rows & columns
+        onerow = [None for i in range(len(colseps) - 1)]
+        rows = [onerow[:] for i in range(len(rowseps) - 1)]
+        # keep track of # of cells remaining; should reduce to zero
+        remaining = (len(rowseps) - 1) * (len(colseps) - 1)
+        for top, left, bottom, right, block in self.cells:
+            rownum = rowindex[top]
+            colnum = colindex[left]
+            assert rows[rownum][colnum] is None, (
+                  'Cell (row %s, column %s) already used.'
+                  % (rownum + 1, colnum + 1))
+            morerows = rowindex[bottom] - rownum - 1
+            morecols = colindex[right] - colnum - 1
+            remaining -= (morerows + 1) * (morecols + 1)
+            # write the cell into the table
+            rows[rownum][colnum] = (morerows, morecols, top + 1, block)
+        assert remaining == 0, 'Unused cells remaining.'
+        if self.head_body_sep:          # separate head rows from body rows
+            numheadrows = rowindex[self.head_body_sep]
+            headrows = rows[:numheadrows]
+            bodyrows = rows[numheadrows:]
+        else:
+            headrows = []
+            bodyrows = rows
+        return (colspecs, headrows, bodyrows)
+
+
+class SimpleTableParser(TableParser):
+
+    """
+    Parse a simple table using `parse()`.
+
+    Here's an example of a simple table::
+
+        =====  =====
+        col 1  col 2
+        =====  =====
+        1      Second column of row 1.
+        2      Second column of row 2.
+               Second line of paragraph.
+        3      - Second column of row 3.
+
+               - Second item in bullet
+                 list (row 3, column 2).
+        4 is a span
+        ------------
+        5
+        =====  =====
+
+    Top and bottom borders use '=', column span underlines use '-', column
+    separation is indicated with spaces.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure, whose interpretation is the same as for
+    `GridTableParser`::
+
+        ([5, 25],
+         [[(0, 0, 1, ['col 1']),
+           (0, 0, 1, ['col 2'])]],
+         [[(0, 0, 3, ['1']),
+           (0, 0, 3, ['Second column of row 1.'])],
+          [(0, 0, 4, ['2']),
+           (0, 0, 4, ['Second column of row 2.',
+                      'Second line of paragraph.'])],
+          [(0, 0, 6, ['3']),
+           (0, 0, 6, ['- Second column of row 3.',
+                      '',
+                      '- Second item in bullet',
+                      '  list (row 3, column 2).'])],
+          [(0, 1, 10, ['4 is a span'])],
+          [(0, 0, 12, ['5']),
+           (0, 0, 12, [''])]])
+    """
+
+    head_body_separator_pat = re.compile('=[ =]*$')
+    span_pat = re.compile('-[ -]*$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it will be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        # Convert top & bottom borders to column span underlines:
+        self.block[0] = self.block[0].replace('=', '-')
+        self.block[-1] = self.block[-1].replace('=', '-')
+        self.head_body_sep = None
+        self.columns = []
+        self.border_end = None
+        self.table = []
+        self.done = [-1] * len(block[0])
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        First determine the column boundaries from the top border, then
+        process rows.  Each row may consist of multiple lines; accumulate
+        lines until a row is complete.  Call `self.parse_row` to finish the
+        job.
+        """
+        # Top border must fully describe all table columns.
+        self.columns = self.parse_columns(self.block[0], 0)
+        self.border_end = self.columns[-1][1]
+        firststart, firstend = self.columns[0]
+        offset = 1                      # skip top border
+        start = 1
+        text_found = None
+        while offset < len(self.block):
+            line = self.block[offset]
+            if self.span_pat.match(line):
+                # Column span underline or border; row is complete.
+                self.parse_row(self.block[start:offset], start,
+                               (line.rstrip(), offset))
+                start = offset + 1
+                text_found = None
+            elif line[firststart:firstend].strip():
+                # First column not blank, therefore it's a new row.
+                if text_found and offset != start:
+                    self.parse_row(self.block[start:offset], start)
+                start = offset
+                text_found = 1
+            elif not text_found:
+                start = offset + 1
+            offset += 1
+
+    def parse_columns(self, line, offset):
+        """
+        Given a column span underline, return a list of (begin, end) pairs.
+        """
+        cols = []
+        end = 0
+        while 1:
+            begin = line.find('-', end)
+            end = line.find(' ', begin)
+            if begin < 0:
+                break
+            if end < 0:
+                end = len(line)
+            cols.append((begin, end))
+        if self.columns:
+            if cols[-1][1] != self.border_end:
+                raise TableMarkupError('Column span incomplete at line '
+                                       'offset %s.' % offset)
+            # Allow for an unbounded rightmost column:
+            cols[-1] = (cols[-1][0], self.columns[-1][1])
+        return cols
+
+    def init_row(self, colspec, offset):
+        i = 0
+        cells = []
+        for start, end in colspec:
+            morecols = 0
+            try:
+                assert start == self.columns[i][0]
+                while end != self.columns[i][1]:
+                    i += 1
+                    morecols += 1
+            except (AssertionError, IndexError):
+                raise TableMarkupError('Column span alignment problem at '
+                                       'line offset %s.' % (offset + 1))
+            cells.append([0, morecols, offset, []])
+            i += 1
+        return cells
+
+    def parse_row(self, lines, start, spanline=None):
+        """
+        Given the text `lines` of a row, parse it and append to `self.table`.
+
+        The row is parsed according to the current column spec (either
+        `spanline` if provided or `self.columns`).  For each column, extract
+        text from each line, and check for text in column margins.  Finally,
+        adjust for insigificant whitespace.
+        """
+        if not (lines or spanline):
+            # No new row, just blank lines.
+            return
+        if spanline:
+            columns = self.parse_columns(*spanline)
+            span_offset = spanline[1]
+        else:
+            columns = self.columns[:]
+            span_offset = start
+        self.check_columns(lines, start, columns)
+        row = self.init_row(columns, start)
+        for i in range(len(columns)):
+            start, end = columns[i]
+            cellblock = lines.get_2D_block(0, start, len(lines), end)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            row[i][3] = cellblock
+        self.table.append(row)
+
+    def check_columns(self, lines, first_line, columns):
+        """
+        Check for text in column margins and text overflow in the last column.
+        Raise TableMarkupError if anything but whitespace is in column margins.
+        Adjust the end value for the last column if there is text overflow.
+        """
+        # "Infinite" value for a dummy last column's beginning, used to
+        # check for text overflow:
+        columns.append((sys.maxint, None))
+        lastcol = len(columns) - 2
+        for i in range(len(columns) - 1):
+            start, end = columns[i]
+            nextstart = columns[i+1][0]
+            offset = 0
+            for line in lines:
+                if i == lastcol and line[end:].strip():
+                    text = line[start:].rstrip()
+                    new_end = start + len(text)
+                    columns[i] = (start, new_end)
+                    main_start, main_end = self.columns[-1]
+                    if new_end > main_end:
+                        self.columns[-1] = (main_start, new_end)
+                elif line[end:nextstart].strip():
+                    raise TableMarkupError('Text in column margin at line '
+                                           'offset %s.' % (first_line + offset))
+                offset += 1
+        columns.pop()
+
+    def structure_from_cells(self):
+        colspecs = [end - start for start, end in self.columns]
+        first_body_row = 0
+        if self.head_body_sep:
+            for i in range(len(self.table)):
+                if self.table[i][0][2] > self.head_body_sep:
+                    first_body_row = i
+                    break
+        return (colspecs, self.table[:first_body_row],
+                self.table[first_body_row:])
+
+
+def update_dict_of_lists(master, newdata):
+    """
+    Extend the list values of `master` with those from `newdata`.
+
+    Both parameters must be dictionaries containing list values.
+    """
+    for key, values in newdata.items():
+        master.setdefault(key, []).extend(values)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+# $Id: __init__.py 4974 2007-03-01 18:06:52Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import utils, parsers, Component
+from docutils.transforms import universal
+
+
+class Reader(Component):
+
+    """
+    Abstract base class for docutils Readers.
+
+    Each reader module or package must export a subclass also called 'Reader'.
+
+    The two steps of a Reader's responsibility are `scan()` and
+    `parse()`.  Call `read()` to process a document.
+    """
+
+    component_type = 'reader'
+    config_section = 'readers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Decorations,
+            universal.ExposeInternals,
+            universal.StripComments,]
+
+    def __init__(self, parser=None, parser_name=None):
+        """
+        Initialize the Reader instance.
+
+        Several instance attributes are defined with dummy initial values.
+        Subclasses may use these attributes as they wish.
+        """
+
+        self.parser = parser
+        """A `parsers.Parser` instance shared by all doctrees.  May be left
+        unspecified if the document source determines the parser."""
+
+        if parser is None and parser_name:
+            self.set_parser(parser_name)
+
+        self.source = None
+        """`docutils.io` IO object, source of input data."""
+
+        self.input = None
+        """Raw text input; either a single string or, for more complex cases,
+        a collection of strings."""
+
+    def set_parser(self, parser_name):
+        """Set `self.parser` by name."""
+        parser_class = parsers.get_parser_class(parser_name)
+        self.parser = parser_class()
+
+    def read(self, source, parser, settings):
+        self.source = source
+        if not self.parser:
+            self.parser = parser
+        self.settings = settings
+        self.input = self.source.read()
+        self.parse()
+        return self.document
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        self.parser.parse(self.input, document)
+        document.current_source = document.current_line = None
+
+    def new_document(self):
+        """Create and return a new empty document tree (root node)."""
+        document = utils.new_document(self.source.source_path, self.settings)
+        return document
+
+
+class ReReader(Reader):
+
+    """
+    A reader which rereads an existing document tree (e.g. a
+    deserializer).
+
+    Often used in conjunction with `writers.UnfilteredWriter`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  They have already been applied
+        # by the reader which originally created the document.
+        return Component.get_transforms(self)
+
+
+_reader_aliases = {}
+
+def get_reader_class(reader_name):
+    """Return the Reader class from the `reader_name` module."""
+    reader_name = reader_name.lower()
+    if _reader_aliases.has_key(reader_name):
+        reader_name = _reader_aliases[reader_name]
+    module = __import__(reader_name, globals(), locals())
+    return module.Reader
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/doctree.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+# $Id: doctree.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""Reader for existing document trees."""
+
+from docutils import readers, utils, transforms
+
+
+class Reader(readers.ReReader):
+
+    """
+    Adapt the Reader API for an existing document tree.
+
+    The existing document tree must be passed as the ``source`` parameter to
+    the `docutils.core.Publisher` initializer, wrapped in a
+    `docutils.io.DocTreeInput` object::
+
+        pub = docutils.core.Publisher(
+            ..., source=docutils.io.DocTreeInput(document), ...)
+
+    The original document settings are overridden; if you want to use the
+    settings of the original document, pass ``settings=document.settings`` to
+    the Publisher call above.
+    """
+
+    supported = ('doctree',)
+
+    config_section = 'doctree reader'
+    config_section_dependencies = ('readers',)
+
+    def parse(self):
+        """
+        No parsing to do; refurbish the document tree instead.
+        Overrides the inherited method.
+        """
+        self.document = self.input
+        # Create fresh Transformer object, to be populated from Writer
+        # component.
+        self.document.transformer = transforms.Transformer(self.document)
+        # Replace existing settings object with new one.
+        self.document.settings = self.settings
+        # Create fresh Reporter object because it is dependent on
+        # (new) settings.
+        self.document.reporter = utils.new_reporter(
+            self.document.get('source', ''), self.document.settings)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/pep.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+# $Id: pep.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Python Enhancement Proposal (PEP) Reader.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.readers import standalone
+from docutils.transforms import peps, references, misc, frontmatter
+from docutils.parsers import rst
+
+
+class Reader(standalone.Reader):
+
+    supported = ('pep',)
+    """Contexts this reader supports."""
+
+    settings_spec = (
+        'PEP Reader Option Defaults',
+        'The --pep-references and --rfc-references options (for the '
+        'reStructuredText parser) are on by default.',
+        ())
+
+    config_section = 'pep reader'
+    config_section_dependencies = ('readers', 'standalone reader')
+
+    def get_transforms(self):
+        transforms = standalone.Reader.get_transforms(self)
+        # We have PEP-specific frontmatter handling.
+        transforms.remove(frontmatter.DocTitle)
+        transforms.remove(frontmatter.SectionSubTitle)
+        transforms.remove(frontmatter.DocInfo)
+        transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes])
+        return transforms
+
+    settings_default_overrides = {'pep_references': 1, 'rfc_references': 1}
+
+    inliner_class = rst.states.Inliner
+
+    def __init__(self, parser=None, parser_name=None):
+        """`parser` should be ``None``."""
+        if parser is None:
+            parser = rst.Parser(rfc2822=1, inliner=self.inliner_class())
+        standalone.Reader.__init__(self, parser, '')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,127 @@
+# $Id: __init__.py 4813 2006-11-13 03:41:08Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains the Python Source Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import docutils.readers
+from docutils.readers.python import moduleparser
+from docutils import parsers
+from docutils import nodes
+from docutils.readers.python import pynodes
+from docutils import readers
+
+class Reader(docutils.readers.Reader):
+
+    config_section = 'python reader'
+    config_section_dependencies = ('readers',)
+
+    default_parser = 'restructuredtext'
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        module_section = moduleparser.parse_module(self.input,
+                                                   self.source.source_path)
+        module_section.walk(DocformatVisitor(self.document))
+        visitor = DocstringFormattingVisitor(
+            document=document,
+            default_parser=self.default_parser)
+        module_section.walk(visitor)
+        self.document.append(module_section)
+
+
+class DocformatVisitor(nodes.SparseNodeVisitor):
+
+    """
+    This sets docformat attributes in a module.  Wherever an assignment
+    to __docformat__ is found, we look for the enclosing scope -- a class,
+    a module, or a function -- and set the docformat attribute there.
+
+    We can't do this during the DocstringFormattingVisitor walking,
+    because __docformat__ may appear below a docstring in that format
+    (typically below the module docstring).
+    """
+
+    def visit_attribute(self, node):
+        assert isinstance(node[0], pynodes.object_name)
+        name = node[0][0].data
+        if name != '__docformat__':
+            return
+        value = None
+        for child in children:
+            if isinstance(child, pynodes.expression_value):
+                value = child[0].data
+                break
+        assert value.startswith("'") or value.startswith('"'), "__docformat__ must be assigned a string literal (not %s); line: %s" % (value, node['lineno'])
+        name = name[1:-1]
+        looking_in = node.parent
+        while not isinstance(looking_in, (pynodes.module_section,
+                                          pynodes.function_section,
+                                          pynodes.class_section)):
+            looking_in = looking_in.parent
+        looking_in['docformat'] = name
+
+
+class DocstringFormattingVisitor(nodes.SparseNodeVisitor):
+
+    def __init__(self, document, default_parser):
+        self.document = document
+        self.default_parser = default_parser
+        self.parsers = {}
+
+    def visit_docstring(self, node):
+        text = node[0].data
+        docformat = self.find_docformat(node)
+        del node[0]
+        node['docformat'] = docformat
+        parser = self.get_parser(docformat)
+        parser.parse(text, self.document)
+        for child in self.document.children:
+            node.append(child)
+        self.document.current_source = self.document.current_line = None
+        del self.document[:]
+
+    def get_parser(self, parser_name):
+        """
+        Get a parser based on its name.  We reuse parsers during this
+        visitation, so parser instances are cached.
+        """
+        parser_name = parsers._parser_aliases.get(parser_name, parser_name)
+        if not self.parsers.has_key(parser_name):
+            cls = parsers.get_parser_class(parser_name)
+            self.parsers[parser_name] = cls()
+        return self.parsers[parser_name]
+
+    def find_docformat(self, node):
+        """
+        Find the __docformat__ closest to this node (i.e., look in the
+        class or module)
+        """
+        while node:
+            if node.get('docformat'):
+                return node['docformat']
+            node = node.parent
+        return self.default_parser
+
+
+if __name__ == '__main__':
+    try:
+        import locale
+        locale.setlocale(locale.LC_ALL, '')
+    except:
+        pass
+
+    from docutils.core import publish_cmdline, default_description
+
+    description = ('Generates pseudo-XML from Python modules '
+                   '(for testing purposes).  ' + default_description)
+
+    publish_cmdline(description=description,
+                    reader=Reader())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,758 @@
+# $Id: moduleparser.py 4813 2006-11-13 03:41:08Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Parser for Python modules.
+
+The `parse_module()` function takes a module's text and file name,
+runs it through the module parser (using compiler.py and tokenize.py)
+and produces a parse tree of the source code, using the nodes as found
+in pynodes.py.  For example, given this module (x.py)::
+
+    # comment
+
+    '''Docstring'''
+
+    '''Additional docstring'''
+
+    __docformat__ = 'reStructuredText'
+
+    a = 1
+    '''Attribute docstring'''
+
+    class C(Super):
+
+        '''C's docstring'''
+
+        class_attribute = 1
+        '''class_attribute's docstring'''
+
+        def __init__(self, text=None):
+            '''__init__'s docstring'''
+
+            self.instance_attribute = (text * 7
+                                       + ' whaddyaknow')
+            '''instance_attribute's docstring'''
+
+
+    def f(x,                            # parameter x
+          y=a*5,                        # parameter y
+          *args):                       # parameter args
+        '''f's docstring'''
+        return [x + item for item in args]
+
+    f.function_attribute = 1
+    '''f.function_attribute's docstring'''
+
+The module parser will produce this module documentation tree::
+
+    <module_section filename="test data">
+        <docstring>
+            Docstring
+        <docstring lineno="5">
+            Additional docstring
+        <attribute lineno="7">
+	    <object_name>
+	        __docformat__
+            <expression_value lineno="7">
+                'reStructuredText'
+        <attribute lineno="9">
+	    <object_name>
+	        a
+            <expression_value lineno="9">
+                1
+            <docstring lineno="10">
+                Attribute docstring
+        <class_section lineno="12">
+	    <object_name>
+	        C
+            <class_base>
+	        Super
+            <docstring lineno="12">
+                C's docstring
+            <attribute lineno="16">
+	        <object_name>
+		    class_attribute
+                <expression_value lineno="16">
+                    1
+                <docstring lineno="17">
+                    class_attribute's docstring
+            <method_section lineno="19">
+	        <object_name>
+		    __init__
+                <docstring lineno="19">
+                    __init__'s docstring
+                <parameter_list lineno="19">
+                    <parameter lineno="19">
+		        <object_name>
+			    self
+                    <parameter lineno="19">
+		        <object_name>
+			    text
+                        <parameter_default lineno="19">
+                            None
+                <attribute lineno="22">
+		    <object_name>
+		        self.instance_attribute
+                    <expression_value lineno="22">
+                        (text * 7 + ' whaddyaknow')
+                    <docstring lineno="24">
+                        instance_attribute's docstring
+        <function_section lineno="27">
+	    <object_name>
+	        f
+            <docstring lineno="27">
+                f's docstring
+            <parameter_list lineno="27">
+                <parameter lineno="27">
+		    <object_name>
+		        x
+                    <comment>
+                        # parameter x
+                <parameter lineno="27">
+		    <object_name>
+		        y
+                    <parameter_default lineno="27">
+                        a * 5
+                    <comment>
+                        # parameter y
+                <parameter excess_positional="1" lineno="27">
+		    <object_name>
+		        args
+                    <comment>
+                        # parameter args
+        <attribute lineno="33">
+	    <object_name>
+	        f.function_attribute
+            <expression_value lineno="33">
+                1
+            <docstring lineno="34">
+                f.function_attribute's docstring
+
+(Comments are not implemented yet.)
+
+compiler.parse() provides most of what's needed for this doctree, and
+"tokenize" can be used to get the rest.  We can determine the line
+number from the compiler.parse() AST, and the TokenParser.rhs(lineno)
+method provides the rest.
+
+The Docutils Python reader component will transform this module doctree into a
+Python-specific Docutils doctree, and then a "stylist transform" will
+further transform it into a generic doctree.  Namespaces will have to be
+compiled for each of the scopes, but I'm not certain at what stage of
+processing.
+
+It's very important to keep all docstring processing out of this, so that it's
+a completely generic and not tool-specific.
+
+::
+
+> Why perform all of those transformations?  Why not go from the AST to a
+> generic doctree?  Or, even from the AST to the final output?
+
+I want the docutils.readers.python.moduleparser.parse_module() function to
+produce a standard documentation-oriented tree that can be used by any tool.
+We can develop it together without having to compromise on the rest of our
+design (i.e., HappyDoc doesn't have to be made to work like Docutils, and
+vice-versa).  It would be a higher-level version of what compiler.py provides.
+
+The Python reader component transforms this generic AST into a Python-specific
+doctree (it knows about modules, classes, functions, etc.), but this is
+specific to Docutils and cannot be used by HappyDoc or others.  The stylist
+transform does the final layout, converting Python-specific structures
+("class" sections, etc.) into a generic doctree using primitives (tables,
+sections, lists, etc.).  This generic doctree does *not* know about Python
+structures any more.  The advantage is that this doctree can be handed off to
+any of the output writers to create any output format we like.
+
+The latter two transforms are separate because I want to be able to have
+multiple independent layout styles (multiple runtime-selectable "stylist
+transforms").  Each of the existing tools (HappyDoc, pydoc, epydoc, Crystal,
+etc.) has its own fixed format.  I personally don't like the tables-based
+format produced by these tools, and I'd like to be able to customize the
+format easily.  That's the goal of stylist transforms, which are independent
+from the Reader component itself.  One stylist transform could produce
+HappyDoc-like output, another could produce output similar to module docs in
+the Python library reference manual, and so on.
+
+It's for exactly this reason::
+
+>> It's very important to keep all docstring processing out of this, so that
+>> it's a completely generic and not tool-specific.
+
+... but it goes past docstring processing.  It's also important to keep style
+decisions and tool-specific data transforms out of this module parser.
+
+
+Issues
+======
+
+* At what point should namespaces be computed?  Should they be part of the
+  basic AST produced by the ASTVisitor walk, or generated by another tree
+  traversal?
+
+* At what point should a distinction be made between local variables &
+  instance attributes in __init__ methods?
+
+* Docstrings are getting their lineno from their parents.  Should the
+  TokenParser find the real line no's?
+
+* Comments: include them?  How and when?  Only full-line comments, or
+  parameter comments too?  (See function "f" above for an example.)
+
+* Module could use more docstrings & refactoring in places.
+
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import compiler
+import compiler.ast
+import tokenize
+import token
+from compiler.consts import OP_ASSIGN
+from compiler.visitor import ASTVisitor
+from types import StringType, UnicodeType, TupleType
+from docutils.readers.python import pynodes
+from docutils.nodes import Text
+
+
+def parse_module(module_text, filename):
+    """Return a module documentation tree from `module_text`."""
+    ast = compiler.parse(module_text)
+    token_parser = TokenParser(module_text)
+    visitor = ModuleVisitor(filename, token_parser)
+    compiler.walk(ast, visitor, walker=visitor)
+    return visitor.module
+
+class BaseVisitor(ASTVisitor):
+
+    def __init__(self, token_parser):
+        ASTVisitor.__init__(self)
+        self.token_parser = token_parser
+        self.context = []
+        self.documentable = None
+
+    def default(self, node, *args):
+        self.documentable = None
+        #print 'in default (%s)' % node.__class__.__name__
+        #ASTVisitor.default(self, node, *args)
+
+    def default_visit(self, node, *args):
+        #print 'in default_visit (%s)' % node.__class__.__name__
+        ASTVisitor.default(self, node, *args)
+
+
+class DocstringVisitor(BaseVisitor):
+
+    def visitDiscard(self, node):
+        if self.documentable:
+            self.visit(node.expr)
+
+    def visitConst(self, node):
+        if self.documentable:
+            if type(node.value) in (StringType, UnicodeType):
+                self.documentable.append(make_docstring(node.value, node.lineno))
+            else:
+                self.documentable = None
+
+    def visitStmt(self, node):
+        self.default_visit(node)
+
+
+class AssignmentVisitor(DocstringVisitor):
+
+    def visitAssign(self, node):
+        visitor = AttributeVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        if visitor.attributes:
+            self.context[-1].extend(visitor.attributes)
+        if len(visitor.attributes) == 1:
+            self.documentable = visitor.attributes[0]
+        else:
+            self.documentable = None
+
+
+class ModuleVisitor(AssignmentVisitor):
+
+    def __init__(self, filename, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.filename = filename
+        self.module = None
+
+    def visitModule(self, node):
+        self.module = module = pynodes.module_section()
+        module['filename'] = self.filename
+        append_docstring(module, node.doc, node.lineno)
+        self.context.append(module)
+        self.documentable = module
+        self.visit(node.node)
+        self.context.pop()
+
+    def visitImport(self, node):
+        self.context[-1] += make_import_group(names=node.names,
+                                              lineno=node.lineno)
+        self.documentable = None
+
+    def visitFrom(self, node):
+        self.context[-1].append(
+            make_import_group(names=node.names, from_name=node.modname,
+                              lineno=node.lineno))
+        self.documentable = None
+
+    def visitFunction(self, node):
+        visitor = FunctionVisitor(self.token_parser,
+                                  function_class=pynodes.function_section)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+    def visitClass(self, node):
+        visitor = ClassVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.klass)
+
+
+class AttributeVisitor(BaseVisitor):
+
+    def __init__(self, token_parser):
+        BaseVisitor.__init__(self, token_parser)
+        self.attributes = pynodes.class_attribute_section()
+
+    def visitAssign(self, node):
+        # Don't visit the expression itself, just the attribute nodes:
+        for child in node.nodes:
+            self.dispatch(child)
+        expression_text = self.token_parser.rhs(node.lineno)
+        expression = pynodes.expression_value()
+        expression.append(Text(expression_text))
+        for attribute in self.attributes:
+            attribute.append(expression)
+
+    def visitAssName(self, node):
+        self.attributes.append(make_attribute(node.name,
+                                              lineno=node.lineno))
+
+    def visitAssTuple(self, node):
+        attributes = self.attributes
+        self.attributes = []
+        self.default_visit(node)
+        n = pynodes.attribute_tuple()
+        n.extend(self.attributes)
+        n['lineno'] = self.attributes[0]['lineno']
+        attributes.append(n)
+        self.attributes = attributes
+        #self.attributes.append(att_tuple)
+
+    def visitAssAttr(self, node):
+        self.default_visit(node, node.attrname)
+
+    def visitGetattr(self, node, suffix):
+        self.default_visit(node, node.attrname + '.' + suffix)
+
+    def visitName(self, node, suffix):
+        self.attributes.append(make_attribute(node.name + '.' + suffix,
+                                              lineno=node.lineno))
+
+
+class FunctionVisitor(DocstringVisitor):
+
+    in_function = 0
+
+    def __init__(self, token_parser, function_class):
+        DocstringVisitor.__init__(self, token_parser)
+        self.function_class = function_class
+
+    def visitFunction(self, node):
+        if self.in_function:
+            self.documentable = None
+            # Don't bother with nested function definitions.
+            return
+        self.in_function = 1
+        self.function = function = make_function_like_section(
+            name=node.name,
+            lineno=node.lineno,
+            doc=node.doc,
+            function_class=self.function_class)
+        self.context.append(function)
+        self.documentable = function
+        self.parse_parameter_list(node)
+        self.visit(node.code)
+        self.context.pop()
+
+    def parse_parameter_list(self, node):
+        parameters = []
+        special = []
+        argnames = list(node.argnames)
+        if node.kwargs:
+            special.append(make_parameter(argnames[-1], excess_keyword=1))
+            argnames.pop()
+        if node.varargs:
+            special.append(make_parameter(argnames[-1],
+                                          excess_positional=1))
+            argnames.pop()
+        defaults = list(node.defaults)
+        defaults = [None] * (len(argnames) - len(defaults)) + defaults
+        function_parameters = self.token_parser.function_parameters(
+            node.lineno)
+        #print >>sys.stderr, function_parameters
+        for argname, default in zip(argnames, defaults):
+            if type(argname) is TupleType:
+                parameter = pynodes.parameter_tuple()
+                for tuplearg in argname:
+                    parameter.append(make_parameter(tuplearg))
+                argname = normalize_parameter_name(argname)
+            else:
+                parameter = make_parameter(argname)
+            if default:
+                n_default = pynodes.parameter_default()
+                n_default.append(Text(function_parameters[argname]))
+                parameter.append(n_default)
+            parameters.append(parameter)
+        if parameters or special:
+            special.reverse()
+            parameters.extend(special)
+            parameter_list = pynodes.parameter_list()
+            parameter_list.extend(parameters)
+            self.function.append(parameter_list)
+
+
+class ClassVisitor(AssignmentVisitor):
+
+    in_class = 0
+
+    def __init__(self, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.bases = []
+
+    def visitClass(self, node):
+        if self.in_class:
+            self.documentable = None
+            # Don't bother with nested class definitions.
+            return
+        self.in_class = 1
+        #import mypdb as pdb
+        #pdb.set_trace()
+        for base in node.bases:
+            self.visit(base)
+        self.klass = klass = make_class_section(node.name, self.bases,
+                                                doc=node.doc,
+                                                lineno=node.lineno)
+        self.context.append(klass)
+        self.documentable = klass
+        self.visit(node.code)
+        self.context.pop()
+
+    def visitGetattr(self, node, suffix=None):
+        if suffix:
+            name = node.attrname + '.' + suffix
+        else:
+            name = node.attrname
+        self.default_visit(node, name)
+
+    def visitName(self, node, suffix=None):
+        if suffix:
+            name = node.name + '.' + suffix
+        else:
+            name = node.name
+        self.bases.append(name)
+
+    def visitFunction(self, node):
+        if node.name == '__init__':
+            visitor = InitMethodVisitor(self.token_parser,
+                                        function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        else:
+            visitor = FunctionVisitor(self.token_parser,
+                                      function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+
+class InitMethodVisitor(FunctionVisitor, AssignmentVisitor): pass
+
+
+class TokenParser:
+
+    def __init__(self, text):
+        self.text = text + '\n\n'
+        self.lines = self.text.splitlines(1)
+        self.generator = tokenize.generate_tokens(iter(self.lines).next)
+        self.next()
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        self.token = self.generator.next()
+        self.type, self.string, self.start, self.end, self.line = self.token
+        return self.token
+
+    def goto_line(self, lineno):
+        while self.start[0] < lineno:
+            self.next()
+        return token
+
+    def rhs(self, lineno):
+        """
+        Return a whitespace-normalized expression string from the right-hand
+        side of an assignment at line `lineno`.
+        """
+        self.goto_line(lineno)
+        while self.string != '=':
+            self.next()
+        self.stack = None
+        while self.type != token.NEWLINE and self.string != ';':
+            if self.string == '=' and not self.stack:
+                self.tokens = []
+                self.stack = []
+                self._type = None
+                self._string = None
+                self._backquote = 0
+            else:
+                self.note_token()
+            self.next()
+        self.next()
+        text = ''.join(self.tokens)
+        return text.strip()
+
+    closers = {')': '(', ']': '[', '}': '{'}
+    openers = {'(': 1, '[': 1, '{': 1}
+    del_ws_prefix = {'.': 1, '=': 1, ')': 1, ']': 1, '}': 1, ':': 1, ',': 1}
+    no_ws_suffix = {'.': 1, '=': 1, '(': 1, '[': 1, '{': 1}
+
+    def note_token(self):
+        if self.type == tokenize.NL:
+            return
+        del_ws = self.del_ws_prefix.has_key(self.string)
+        append_ws = not self.no_ws_suffix.has_key(self.string)
+        if self.openers.has_key(self.string):
+            self.stack.append(self.string)
+            if (self._type == token.NAME
+                or self.closers.has_key(self._string)):
+                del_ws = 1
+        elif self.closers.has_key(self.string):
+            assert self.stack[-1] == self.closers[self.string]
+            self.stack.pop()
+        elif self.string == '`':
+            if self._backquote:
+                del_ws = 1
+                assert self.stack[-1] == '`'
+                self.stack.pop()
+            else:
+                append_ws = 0
+                self.stack.append('`')
+            self._backquote = not self._backquote
+        if del_ws and self.tokens and self.tokens[-1] == ' ':
+            del self.tokens[-1]
+        self.tokens.append(self.string)
+        self._type = self.type
+        self._string = self.string
+        if append_ws:
+            self.tokens.append(' ')
+
+    def function_parameters(self, lineno):
+        """
+        Return a dictionary mapping parameters to defaults
+        (whitespace-normalized strings).
+        """
+        self.goto_line(lineno)
+        while self.string != 'def':
+            self.next()
+        while self.string != '(':
+            self.next()
+        name = None
+        default = None
+        parameter_tuple = None
+        self.tokens = []
+        parameters = {}
+        self.stack = [self.string]
+        self.next()
+        while 1:
+            if len(self.stack) == 1:
+                if parameter_tuple:
+                    # Just encountered ")".
+                    #print >>sys.stderr, 'parameter_tuple: %r' % self.tokens
+                    name = ''.join(self.tokens).strip()
+                    self.tokens = []
+                    parameter_tuple = None
+                if self.string in (')', ','):
+                    if name:
+                        if self.tokens:
+                            default_text = ''.join(self.tokens).strip()
+                        else:
+                            default_text = None
+                        parameters[name] = default_text
+                        self.tokens = []
+                        name = None
+                        default = None
+                    if self.string == ')':
+                        break
+                elif self.type == token.NAME:
+                    if name and default:
+                        self.note_token()
+                    else:
+                        assert name is None, (
+                            'token=%r name=%r parameters=%r stack=%r'
+                            % (self.token, name, parameters, self.stack))
+                        name = self.string
+                        #print >>sys.stderr, 'name=%r' % name
+                elif self.string == '=':
+                    assert name is not None, 'token=%r' % (self.token,)
+                    assert default is None, 'token=%r' % (self.token,)
+                    assert self.tokens == [], 'token=%r' % (self.token,)
+                    default = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                elif name:
+                    self.note_token()
+                elif self.string == '(':
+                    parameter_tuple = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                    self.note_token()
+                else:                   # ignore these tokens:
+                    assert (self.string in ('*', '**', '\n') 
+                            or self.type == tokenize.COMMENT), (
+                        'token=%r' % (self.token,))
+            else:
+                self.note_token()
+            self.next()
+        return parameters
+
+
+def make_docstring(doc, lineno):
+    n = pynodes.docstring()
+    if lineno:
+        # Really, only module docstrings don't have a line
+        # (@@: but maybe they should)
+        n['lineno'] = lineno
+    n.append(Text(doc))
+    return n
+
+def append_docstring(node, doc, lineno):
+    if doc:
+        node.append(make_docstring(doc, lineno))
+
+def make_class_section(name, bases, lineno, doc):
+    n = pynodes.class_section()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    for base in bases:
+        b = pynodes.class_base()
+        b.append(make_object_name(base))
+        n.append(b)
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_object_name(name):
+    n = pynodes.object_name()
+    n.append(Text(name))
+    return n
+
+def make_function_like_section(name, lineno, doc, function_class):
+    n = function_class()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_import_group(names, lineno, from_name=None):
+    n = pynodes.import_group()
+    n['lineno'] = lineno
+    if from_name:
+        n_from = pynodes.import_from()
+        n_from.append(Text(from_name))
+        n.append(n_from)
+    for name, alias in names:
+        n_name = pynodes.import_name()
+        n_name.append(Text(name))
+        if alias:
+            n_alias = pynodes.import_alias()
+            n_alias.append(Text(alias))
+            n_name.append(n_alias)
+        n.append(n_name)
+    return n
+
+def make_class_attribute(name, lineno):
+    n = pynodes.class_attribute()
+    n['lineno'] = lineno
+    n.append(Text(name))
+    return n
+
+def make_attribute(name, lineno):
+    n = pynodes.attribute()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    return n
+
+def make_parameter(name, excess_keyword=0, excess_positional=0):
+    """
+    excess_keyword and excess_positional must be either 1 or 0, and
+    not both of them can be 1.
+    """
+    n = pynodes.parameter()
+    n.append(make_object_name(name))
+    assert not excess_keyword or not excess_positional
+    if excess_keyword:
+        n['excess_keyword'] = 1
+    if excess_positional:
+        n['excess_positional'] = 1
+    return n
+
+def trim_docstring(text):
+    """
+    Trim indentation and blank lines from docstring text & return it.
+
+    See PEP 257.
+    """
+    if not text:
+        return text
+    # Convert tabs to spaces (following the normal Python rules)
+    # and split into a list of lines:
+    lines = text.expandtabs().splitlines()
+    # Determine minimum indentation (first line doesn't count):
+    indent = sys.maxint
+    for line in lines[1:]:
+        stripped = line.lstrip()
+        if stripped:
+            indent = min(indent, len(line) - len(stripped))
+    # Remove indentation (first line is special):
+    trimmed = [lines[0].strip()]
+    if indent < sys.maxint:
+        for line in lines[1:]:
+            trimmed.append(line[indent:].rstrip())
+    # Strip off trailing and leading blank lines:
+    while trimmed and not trimmed[-1]:
+        trimmed.pop()
+    while trimmed and not trimmed[0]:
+        trimmed.pop(0)
+    # Return a single string:
+    return '\n'.join(trimmed)
+
+def normalize_parameter_name(name):
+    """
+    Converts a tuple like ``('a', ('b', 'c'), 'd')`` into ``'(a, (b, c), d)'``
+    """
+    if type(name) is TupleType:
+        return '(%s)' % ', '.join([normalize_parameter_name(n) for n in name])
+    else:
+        return name
+
+if __name__ == '__main__':
+    import sys
+    args = sys.argv[1:]
+    if args[0] == '-v':
+        filename = args[1]
+        module_text = open(filename).read()
+        ast = compiler.parse(module_text)
+        visitor = compiler.visitor.ExampleASTVisitor()
+        compiler.walk(ast, visitor, walker=visitor, verbose=1)
+    else:
+        filename = args[0]
+        content = open(filename).read()
+        print parse_module(content, filename).pformat()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+#! /usr/bin/env python
+# $Id: pynodes.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+from docutils import nodes
+from docutils.nodes import Element, TextElement, Structural, Inline, Part, \
+     Text
+import types
+
+# This is the parent class of all the other pynode classes:
+class PythonStructural(Structural): pass
+
+# =====================
+#  Structural Elements
+# =====================
+
+class module_section(PythonStructural, Element): pass    
+class class_section(PythonStructural, Element): pass
+class class_base(PythonStructural, Element): pass
+class method_section(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+class function_section(PythonStructural, Element): pass
+class class_attribute_section(PythonStructural, Element): pass
+class class_attribute(PythonStructural, Element): pass
+class expression_value(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+
+# Structural Support Elements
+# ---------------------------
+
+class parameter_list(PythonStructural, Element): pass
+class parameter_tuple(PythonStructural, Element): pass
+class parameter_default(PythonStructural, TextElement): pass
+class import_group(PythonStructural, TextElement): pass
+class import_from(PythonStructural, TextElement): pass
+class import_name(PythonStructural, TextElement): pass
+class import_alias(PythonStructural, TextElement): pass
+class docstring(PythonStructural, Element): pass
+
+# =================
+#  Inline Elements
+# =================
+
+# These elements cannot become references until the second
+# pass.  Initially, we'll use "reference" or "name".
+
+class object_name(PythonStructural, TextElement): pass
+class parameter_list(PythonStructural, TextElement): pass
+class parameter(PythonStructural, TextElement): pass
+class parameter_default(PythonStructural, TextElement): pass
+class class_attribute(PythonStructural, TextElement): pass
+class attribute_tuple(PythonStructural, TextElement): pass
+
+# =================
+#  Unused Elements
+# =================
+
+# These were part of the model, and maybe should be in the future, but
+# aren't now.
+#class package_section(PythonStructural, Element): pass
+#class module_attribute_section(PythonStructural, Element): pass
+#class instance_attribute_section(PythonStructural, Element): pass
+#class module_attribute(PythonStructural, TextElement): pass
+#class instance_attribute(PythonStructural, TextElement): pass
+#class exception_class(PythonStructural, TextElement): pass
+#class warning_class(PythonStructural, TextElement): pass
+
+
+# Collect all the classes we've written above
+def install_node_class_names():
+    node_class_names = []
+    for name, var in globals().items():
+        if (type(var) is types.ClassType
+            and issubclass(var, PythonStructural) \
+            and name.lower() == name):
+            node_class_names.append(var.tagname or name)
+    # Register the new node names with GenericNodeVisitor and
+    # SpecificNodeVisitor:
+    nodes._add_node_class_names(node_class_names)
+install_node_class_names()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/readers/standalone.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+# $Id: standalone.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Standalone file Reader for the reStructuredText markup syntax.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import frontend, readers
+from docutils.transforms import frontmatter, references, misc
+
+
+class Reader(readers.Reader):
+
+    supported = ('standalone',)
+    """Contexts this reader supports."""
+
+    document = None
+    """A single document tree."""
+
+    settings_spec = (
+        'Standalone Reader',
+        None,
+        (('Disable the promotion of a lone top-level section title to '
+          'document title (and subsequent section title to document '
+          'subtitle promotion; enabled by default).',
+          ['--no-doc-title'],
+          {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Disable the bibliographic field list transform (enabled by '
+          'default).',
+          ['--no-doc-info'],
+          {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Activate the promotion of lone subsection titles to '
+          'section subtitles (disabled by default).',
+          ['--section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0,
+           'validator': frontend.validate_boolean}),
+         ('Deactivate the promotion of lone subsection titles.',
+          ['--no-section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_false'}),
+         ))
+
+    config_section = 'standalone reader'
+    config_section_dependencies = ('readers',)
+
+    def get_transforms(self):
+        return readers.Reader.get_transforms(self) + [
+            references.Substitutions,
+            references.PropagateTargets,
+            frontmatter.DocTitle,
+            frontmatter.SectionSubTitle,
+            frontmatter.DocInfo,
+            references.AnonymousHyperlinks,
+            references.IndirectHyperlinks,
+            references.Footnotes,
+            references.ExternalTargets,
+            references.InternalTargets,
+            references.DanglingReferences,
+            misc.Transitions,
+            ]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/statemachine.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1490 @@
+# $Id: statemachine.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A finite state machine specialized for regular-expression-based text filters,
+this module defines the following classes:
+
+- `StateMachine`, a state machine
+- `State`, a state superclass
+- `StateMachineWS`, a whitespace-sensitive version of `StateMachine`
+- `StateWS`, a state superclass for use with `StateMachineWS`
+- `SearchStateMachine`, uses `re.search()` instead of `re.match()`
+- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()`
+- `ViewList`, extends standard Python lists.
+- `StringList`, string-specific ViewList.
+
+Exception classes:
+
+- `StateMachineError`
+- `UnknownStateError`
+- `DuplicateStateError`
+- `UnknownTransitionError`
+- `DuplicateTransitionError`
+- `TransitionPatternNotFound`
+- `TransitionMethodNotFound`
+- `UnexpectedIndentationError`
+- `TransitionCorrection`: Raised to switch to another transition.
+- `StateCorrection`: Raised to switch to another state & transition.
+
+Functions:
+
+- `string2lines()`: split a multi-line string into a list of one-line strings
+
+
+How To Use This Module
+======================
+(See the individual classes, methods, and attributes for details.)
+
+1. Import it: ``import statemachine`` or ``from statemachine import ...``.
+   You will also need to ``import re``.
+
+2. Derive a subclass of `State` (or `StateWS`) for each state in your state
+   machine::
+
+       class MyState(statemachine.State):
+
+   Within the state's class definition:
+
+   a) Include a pattern for each transition, in `State.patterns`::
+
+          patterns = {'atransition': r'pattern', ...}
+
+   b) Include a list of initial transitions to be set up automatically, in
+      `State.initial_transitions`::
+
+          initial_transitions = ['atransition', ...]
+
+   c) Define a method for each transition, with the same name as the
+      transition pattern::
+
+          def atransition(self, match, context, next_state):
+              # do something
+              result = [...]  # a list
+              return context, next_state, result
+              # context, next_state may be altered
+
+      Transition methods may raise an `EOFError` to cut processing short.
+
+   d) You may wish to override the `State.bof()` and/or `State.eof()` implicit
+      transition methods, which handle the beginning- and end-of-file.
+
+   e) In order to handle nested processing, you may wish to override the
+      attributes `State.nested_sm` and/or `State.nested_sm_kwargs`.
+
+      If you are using `StateWS` as a base class, in order to handle nested
+      indented blocks, you may wish to:
+
+      - override the attributes `StateWS.indent_sm`,
+        `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or
+        `StateWS.known_indent_sm_kwargs`;
+      - override the `StateWS.blank()` method; and/or
+      - override or extend the `StateWS.indent()`, `StateWS.known_indent()`,
+        and/or `StateWS.firstknown_indent()` methods.
+
+3. Create a state machine object::
+
+       sm = StateMachine(state_classes=[MyState, ...],
+                         initial_state='MyState')
+
+4. Obtain the input text, which needs to be converted into a tab-free list of
+   one-line strings. For example, to read text from a file called
+   'inputfile'::
+
+       input_string = open('inputfile').read()
+       input_lines = statemachine.string2lines(input_string)
+
+5. Run the state machine on the input text and collect the results, a list::
+
+       results = sm.run(input_lines)
+
+6. Remove any lingering circular references::
+
+       sm.unlink()
+"""
+
+__docformat__ = 'restructuredtext'
+
+import sys
+import re
+import types
+import unicodedata
+
+
+class StateMachine:
+
+    """
+    A finite state machine for text filters using regular expressions.
+
+    The input is provided in the form of a list of one-line strings (no
+    newlines). States are subclasses of the `State` class. Transitions consist
+    of regular expression patterns and transition methods, and are defined in
+    each state.
+
+    The state machine is started with the `run()` method, which returns the
+    results of processing in a list.
+    """
+
+    def __init__(self, state_classes, initial_state, debug=0):
+        """
+        Initialize a `StateMachine` object; add state objects.
+
+        Parameters:
+
+        - `state_classes`: a list of `State` (sub)classes.
+        - `initial_state`: a string, the class name of the initial state.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.input_lines = None
+        """`StringList` of input lines (without newlines).
+        Filled by `self.run()`."""
+
+        self.input_offset = 0
+        """Offset of `self.input_lines` from the beginning of the file."""
+
+        self.line = None
+        """Current input line."""
+
+        self.line_offset = -1
+        """Current input line offset from beginning of `self.input_lines`."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        self.initial_state = initial_state
+        """The name of the initial state (key to `self.states`)."""
+
+        self.current_state = initial_state
+        """The name of the current state (key to `self.states`)."""
+
+        self.states = {}
+        """Mapping of {state_name: State_object}."""
+
+        self.add_states(state_classes)
+
+        self.observers = []
+        """List of bound methods or functions to call whenever the current
+        line changes.  Observers are called with one argument, ``self``.
+        Cleared at the end of `run()`."""
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        for state in self.states.values():
+            state.unlink()
+        self.states = None
+
+    def run(self, input_lines, input_offset=0, context=None,
+            input_source=None):
+        """
+        Run the state machine on `input_lines`. Return results (a list).
+
+        Reset `self.line_offset` and `self.current_state`. Run the
+        beginning-of-file transition. Input one line at a time and check for a
+        matching transition. If a match is found, call the transition method
+        and possibly change the state. Store the context returned by the
+        transition method to be passed on to the next transition matched.
+        Accumulate the results returned by the transition methods in a list.
+        Run the end-of-file transition. Finally, return the accumulated
+        results.
+
+        Parameters:
+
+        - `input_lines`: a list of strings without newlines, or `StringList`.
+        - `input_offset`: the line offset of `input_lines` from the beginning
+          of the file.
+        - `context`: application-specific storage.
+        - `input_source`: name or path of source of `input_lines`.
+        """
+        self.runtime_init()
+        if isinstance(input_lines, StringList):
+            self.input_lines = input_lines
+        else:
+            self.input_lines = StringList(input_lines, source=input_source)
+        self.input_offset = input_offset
+        self.line_offset = -1
+        self.current_state = self.initial_state
+        if self.debug:
+            print >>sys.stderr, (
+                '\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
+                % (self.line_offset, '\n| '.join(self.input_lines)))
+        transitions = None
+        results = []
+        state = self.get_state()
+        try:
+            if self.debug:
+                print >>sys.stderr, ('\nStateMachine.run: bof transition')
+            context, result = state.bof(context)
+            results.extend(result)
+            while 1:
+                try:
+                    try:
+                        self.next_line()
+                        if self.debug:
+                            source, offset = self.input_lines.info(
+                                self.line_offset)
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: line (source=%r, '
+                                'offset=%r):\n| %s'
+                                % (source, offset, self.line))
+                        context, next_state, result = self.check_line(
+                            context, state, transitions)
+                    except EOFError:
+                        if self.debug:
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: %s.eof transition'
+                                % state.__class__.__name__)
+                        result = state.eof(context)
+                        results.extend(result)
+                        break
+                    else:
+                        results.extend(result)
+                except TransitionCorrection, exception:
+                    self.previous_line() # back up for another try
+                    transitions = (exception.args[0],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: TransitionCorrection to '
+                              'state "%s", transition %s.'
+                              % (state.__class__.__name__, transitions[0]))
+                    continue
+                except StateCorrection, exception:
+                    self.previous_line() # back up for another try
+                    next_state = exception.args[0]
+                    if len(exception.args) == 1:
+                        transitions = None
+                    else:
+                        transitions = (exception.args[1],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: StateCorrection to state '
+                              '"%s", transition %s.'
+                              % (next_state, transitions[0]))
+                else:
+                    transitions = None
+                state = self.get_state(next_state)
+        except:
+            if self.debug:
+                self.error()
+            raise
+        self.observers = []
+        return results
+
+    def get_state(self, next_state=None):
+        """
+        Return current state object; set it first if `next_state` given.
+
+        Parameter `next_state`: a string, the name of the next state.
+
+        Exception: `UnknownStateError` raised if `next_state` unknown.
+        """
+        if next_state:
+            if self.debug and next_state != self.current_state:
+                print >>sys.stderr, \
+                      ('\nStateMachine.get_state: Changing state from '
+                       '"%s" to "%s" (input line %s).'
+                       % (self.current_state, next_state,
+                          self.abs_line_number()))
+            self.current_state = next_state
+        try:
+            return self.states[self.current_state]
+        except KeyError:
+            raise UnknownStateError(self.current_state)
+
+    def next_line(self, n=1):
+        """Load `self.line` with the `n`'th next line and return it."""
+        try:
+            try:
+                self.line_offset += n
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def is_next_line_blank(self):
+        """Return 1 if the next line is blank or non-existant."""
+        try:
+            return not self.input_lines[self.line_offset + 1].strip()
+        except IndexError:
+            return 1
+
+    def at_eof(self):
+        """Return 1 if the input is at or past end-of-file."""
+        return self.line_offset >= len(self.input_lines) - 1
+
+    def at_bof(self):
+        """Return 1 if the input is at or before beginning-of-file."""
+        return self.line_offset <= 0
+
+    def previous_line(self, n=1):
+        """Load `self.line` with the `n`'th previous line and return it."""
+        self.line_offset -= n
+        if self.line_offset < 0:
+            self.line = None
+        else:
+            self.line = self.input_lines[self.line_offset]
+        self.notify_observers()
+        return self.line
+
+    def goto_line(self, line_offset):
+        """Jump to absolute line offset `line_offset`, load and return it."""
+        try:
+            try:
+                self.line_offset = line_offset - self.input_offset
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def get_source(self, line_offset):
+        """Return source of line at absolute line offset `line_offset`."""
+        return self.input_lines.source(line_offset - self.input_offset)
+
+    def abs_line_offset(self):
+        """Return line offset of current line, from beginning of file."""
+        return self.line_offset + self.input_offset
+
+    def abs_line_number(self):
+        """Return line number of current line (counting from 1)."""
+        return self.line_offset + self.input_offset + 1
+
+    def insert_input(self, input_lines, source):
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 2,
+                                StringList(input_lines, source))
+
+    def get_text_block(self, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        try:
+            block = self.input_lines.get_text_block(self.line_offset,
+                                                    flush_left)
+            self.next_line(len(block) - 1)
+            return block
+        except UnexpectedIndentationError, error:
+            block, source, lineno = error
+            self.next_line(len(block) - 1) # advance to last line of block
+            raise
+
+    def check_line(self, context, state, transitions=None):
+        """
+        Examine one line of input for a transition match & execute its method.
+
+        Parameters:
+
+        - `context`: application-dependent storage.
+        - `state`: a `State` object, the current state.
+        - `transitions`: an optional ordered list of transition names to try,
+          instead of ``state.transition_order``.
+
+        Return the values returned by the transition method:
+
+        - context: possibly modified from the parameter `context`;
+        - next state name (`State` subclass name);
+        - the result output of the transition, a list.
+
+        When there is no match, ``state.no_match()`` is called and its return
+        value is returned.
+        """
+        if transitions is None:
+            transitions =  state.transition_order
+        state_correction = None
+        if self.debug:
+            print >>sys.stderr, (
+                  '\nStateMachine.check_line: state="%s", transitions=%r.'
+                  % (state.__class__.__name__, transitions))
+        for name in transitions:
+            pattern, method, next_state = state.transitions[name]
+            match = self.match(pattern)
+            if match:
+                if self.debug:
+                    print >>sys.stderr, (
+                          '\nStateMachine.check_line: Matched transition '
+                          '"%s" in state "%s".'
+                          % (name, state.__class__.__name__))
+                return method(match, context, next_state)
+        else:
+            if self.debug:
+                print >>sys.stderr, (
+                      '\nStateMachine.check_line: No match in state "%s".'
+                      % state.__class__.__name__)
+            return state.no_match(context, transitions)
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression match.
+
+        Parameter `pattern`: an `re` compiled regular expression.
+        """
+        return pattern.match(self.line)
+
+    def add_state(self, state_class):
+        """
+        Initialize & add a `state_class` (`State` subclass) object.
+
+        Exception: `DuplicateStateError` raised if `state_class` was already
+        added.
+        """
+        statename = state_class.__name__
+        if self.states.has_key(statename):
+            raise DuplicateStateError(statename)
+        self.states[statename] = state_class(self, self.debug)
+
+    def add_states(self, state_classes):
+        """
+        Add `state_classes` (a list of `State` subclasses).
+        """
+        for state_class in state_classes:
+            self.add_state(state_class)
+
+    def runtime_init(self):
+        """
+        Initialize `self.states`.
+        """
+        for state in self.states.values():
+            state.runtime_init()
+
+    def error(self):
+        """Report error details."""
+        type, value, module, line, function = _exception_data()
+        print >>sys.stderr, '%s: %s' % (type, value)
+        print >>sys.stderr, 'input line %s' % (self.abs_line_number())
+        print >>sys.stderr, ('module %s, line %s, function %s'
+                             % (module, line, function))
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes two
+        arguments, the source and offset of the current line.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self):
+        for observer in self.observers:
+            try:
+                info = self.input_lines.info(self.line_offset)
+            except IndexError:
+                info = (None, None)
+            observer(*info)
+
+
+class State:
+
+    """
+    State superclass. Contains a list of transitions, and transition methods.
+
+    Transition methods all have the same signature. They take 3 parameters:
+
+    - An `re` match object. ``match.string`` contains the matched input line,
+      ``match.start()`` gives the start index of the match, and
+      ``match.end()`` gives the end index.
+    - A context object, whose meaning is application-defined (initial value
+      ``None``). It can be used to store any information required by the state
+      machine, and the retured context is passed on to the next transition
+      method unchanged.
+    - The name of the next state, a string, taken from the transitions list;
+      normally it is returned unchanged, but it may be altered by the
+      transition method if necessary.
+
+    Transition methods all return a 3-tuple:
+
+    - A context object, as (potentially) modified by the transition method.
+    - The next state name (a return value of ``None`` means no state change).
+    - The processing result, a list, which is accumulated by the state
+      machine.
+
+    Transition methods may raise an `EOFError` to cut processing short.
+
+    There are two implicit transitions, and corresponding transition methods
+    are defined: `bof()` handles the beginning-of-file, and `eof()` handles
+    the end-of-file. These methods have non-standard signatures and return
+    values. `bof()` returns the initial context and results, and may be used
+    to return a header string, or do any other processing needed. `eof()`
+    should handle any remaining context and wrap things up; it returns the
+    final processing result.
+
+    Typical applications need only subclass `State` (or a subclass), set the
+    `patterns` and `initial_transitions` class attributes, and provide
+    corresponding transition methods. The default object initialization will
+    take care of constructing the list of transitions.
+    """
+
+    patterns = None
+    """
+    {Name: pattern} mapping, used by `make_transition()`. Each pattern may
+    be a string or a compiled `re` pattern. Override in subclasses.
+    """
+
+    initial_transitions = None
+    """
+    A list of transitions to initialize when a `State` is instantiated.
+    Each entry is either a transition name string, or a (transition name, next
+    state name) pair. See `make_transitions()`. Override in subclasses.
+    """
+
+    nested_sm = None
+    """
+    The `StateMachine` class for handling nested processing.
+
+    If left as ``None``, `nested_sm` defaults to the class of the state's
+    controlling state machine. Override it in subclasses to avoid the default.
+    """
+
+    nested_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `nested_sm` constructor.
+
+    Two keys must have entries in the dictionary:
+
+    - Key 'state_classes' must be set to a list of `State` classes.
+    - Key 'initial_state' must be set to the name of the initial state class.
+
+    If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the
+    class of the current state, and 'initial_state' defaults to the name of
+    the class of the current state. Override in subclasses to avoid the
+    defaults.
+    """
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `State` object; make & add initial transitions.
+
+        Parameters:
+
+        - `statemachine`: the controlling `StateMachine` object.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.transition_order = []
+        """A list of transition names in search order."""
+
+        self.transitions = {}
+        """
+        A mapping of transition names to 3-tuples containing
+        (compiled_pattern, transition_method, next_state_name). Initialized as
+        an instance attribute dynamically (instead of as a class attribute)
+        because it may make forward references to patterns and methods in this
+        or other classes.
+        """
+
+        self.add_initial_transitions()
+
+        self.state_machine = state_machine
+        """A reference to the controlling `StateMachine` object."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        if self.nested_sm is None:
+            self.nested_sm = self.state_machine.__class__
+        if self.nested_sm_kwargs is None:
+            self.nested_sm_kwargs = {'state_classes': [self.__class__],
+                                     'initial_state': self.__class__.__name__}
+
+    def runtime_init(self):
+        """
+        Initialize this `State` before running the state machine; called from
+        `self.state_machine.run()`.
+        """
+        pass
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        self.state_machine = None
+
+    def add_initial_transitions(self):
+        """Make and add transitions listed in `self.initial_transitions`."""
+        if self.initial_transitions:
+            names, transitions = self.make_transitions(
+                  self.initial_transitions)
+            self.add_transitions(names, transitions)
+
+    def add_transitions(self, names, transitions):
+        """
+        Add a list of transitions to the start of the transition list.
+
+        Parameters:
+
+        - `names`: a list of transition names.
+        - `transitions`: a mapping of names to transition tuples.
+
+        Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`.
+        """
+        for name in names:
+            if self.transitions.has_key(name):
+                raise DuplicateTransitionError(name)
+            if not transitions.has_key(name):
+                raise UnknownTransitionError(name)
+        self.transition_order[:0] = names
+        self.transitions.update(transitions)
+
+    def add_transition(self, name, transition):
+        """
+        Add a transition to the start of the transition list.
+
+        Parameter `transition`: a ready-made transition 3-tuple.
+
+        Exception: `DuplicateTransitionError`.
+        """
+        if self.transitions.has_key(name):
+            raise DuplicateTransitionError(name)
+        self.transition_order[:0] = [name]
+        self.transitions[name] = transition
+
+    def remove_transition(self, name):
+        """
+        Remove a transition by `name`.
+
+        Exception: `UnknownTransitionError`.
+        """
+        try:
+            del self.transitions[name]
+            self.transition_order.remove(name)
+        except:
+            raise UnknownTransitionError(name)
+
+    def make_transition(self, name, next_state=None):
+        """
+        Make & return a transition tuple based on `name`.
+
+        This is a convenience function to simplify transition creation.
+
+        Parameters:
+
+        - `name`: a string, the name of the transition pattern & method. This
+          `State` object must have a method called '`name`', and a dictionary
+          `self.patterns` containing a key '`name`'.
+        - `next_state`: a string, the name of the next `State` object for this
+          transition. A value of ``None`` (or absent) implies no state change
+          (i.e., continue with the same state).
+
+        Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`.
+        """
+        if next_state is None:
+            next_state = self.__class__.__name__
+        try:
+            pattern = self.patterns[name]
+            if not hasattr(pattern, 'match'):
+                pattern = re.compile(pattern)
+        except KeyError:
+            raise TransitionPatternNotFound(
+                  '%s.patterns[%r]' % (self.__class__.__name__, name))
+        try:
+            method = getattr(self, name)
+        except AttributeError:
+            raise TransitionMethodNotFound(
+                  '%s.%s' % (self.__class__.__name__, name))
+        return (pattern, method, next_state)
+
+    def make_transitions(self, name_list):
+        """
+        Return a list of transition names and a transition mapping.
+
+        Parameter `name_list`: a list, where each entry is either a transition
+        name string, or a 1- or 2-tuple (transition name, optional next state
+        name).
+        """
+        stringtype = type('')
+        names = []
+        transitions = {}
+        for namestate in name_list:
+            if type(namestate) is stringtype:
+                transitions[namestate] = self.make_transition(namestate)
+                names.append(namestate)
+            else:
+                transitions[namestate[0]] = self.make_transition(*namestate)
+                names.append(namestate[0])
+        return names, transitions
+
+    def no_match(self, context, transitions):
+        """
+        Called when there is no match from `StateMachine.check_line()`.
+
+        Return the same values returned by transition methods:
+
+        - context: unchanged;
+        - next state name: ``None``;
+        - empty result list.
+
+        Override in subclasses to catch this event.
+        """
+        return context, None, []
+
+    def bof(self, context):
+        """
+        Handle beginning-of-file. Return unchanged `context`, empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return context, []
+
+    def eof(self, context):
+        """
+        Handle end-of-file. Return empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return []
+
+    def nop(self, match, context, next_state):
+        """
+        A "do nothing" transition method.
+
+        Return unchanged `context` & `next_state`, empty result. Useful for
+        simple state changes (actionless transitions).
+        """
+        return context, next_state, []
+
+
+class StateMachineWS(StateMachine):
+
+    """
+    `StateMachine` subclass specialized for whitespace recognition.
+
+    There are three methods provided for extracting indented text blocks:
+    
+    - `get_indented()`: use when the indent is unknown.
+    - `get_known_indented()`: use when the indent is known for all lines.
+    - `get_first_known_indented()`: use when only the first line's indent is
+      known.
+    """
+
+    def get_indented(self, until_blank=0, strip_indent=1):
+        """
+        Return a block of indented lines of text, and info.
+
+        Extract an indented block where the indent is unknown for all lines.
+
+        :Parameters:
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip common leading indent if true (1,
+              default).
+
+        :Return:
+            - the indented block (a list of lines of text),
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent)
+        if indented:
+            self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, indent, offset, blank_finish
+
+    def get_known_indented(self, indent, until_blank=0, strip_indent=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for all lines.
+        Starting with the current line, extract the entire text block with at
+        least `indent` indentation (which must be whitespace, except for the
+        first line).
+
+        :Parameters:
+            - `indent`: The number of indent columns/characters.
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+
+        :Return:
+            - the indented block,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              block_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, offset, blank_finish
+
+    def get_first_known_indented(self, indent, until_blank=0, strip_indent=1,
+                                 strip_top=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for the first line
+        and unknown for all other lines.
+
+        :Parameters:
+            - `indent`: The first line's indent (# of columns/characters).
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+            - `strip_top`: Strip blank lines from the beginning of the block.
+
+        :Return:
+            - the indented block,
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              first_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        if strip_top:
+            while indented and not indented[0].strip():
+                indented.trim_start()
+                offset += 1
+        return indented, indent, offset, blank_finish
+
+
+class StateWS(State):
+
+    """
+    State superclass specialized for whitespace (blank lines & indents).
+
+    Use this class with `StateMachineWS`.  The transitions 'blank' (for blank
+    lines) and 'indent' (for indented text blocks) are added automatically,
+    before any other transitions.  The transition method `blank()` handles
+    blank lines and `indent()` handles nested indented blocks.  Indented
+    blocks trigger a new state machine to be created by `indent()` and run.
+    The class of the state machine to be created is in `indent_sm`, and the
+    constructor keyword arguments are in the dictionary `indent_sm_kwargs`.
+
+    The methods `known_indent()` and `firstknown_indent()` are provided for
+    indented blocks where the indent (all lines' and first line's only,
+    respectively) is known to the transition method, along with the attributes
+    `known_indent_sm` and `known_indent_sm_kwargs`.  Neither transition method
+    is triggered automatically.
+    """
+
+    indent_sm = None
+    """
+    The `StateMachine` class handling indented text blocks.
+
+    If left as ``None``, `indent_sm` defaults to the value of
+    `State.nested_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `indent_sm` constructor.
+
+    If left as ``None``, `indent_sm_kwargs` defaults to the value of
+    `State.nested_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm = None
+    """
+    The `StateMachine` class handling known-indented text blocks.
+
+    If left as ``None``, `known_indent_sm` defaults to the value of
+    `indent_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `known_indent_sm` constructor.
+
+    If left as ``None``, `known_indent_sm_kwargs` defaults to the value of
+    `indent_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    ws_patterns = {'blank': ' *$',
+                   'indent': ' +'}
+    """Patterns for default whitespace transitions.  May be overridden in
+    subclasses."""
+
+    ws_initial_transitions = ('blank', 'indent')
+    """Default initial whitespace transitions, added before those listed in
+    `State.initial_transitions`.  May be overridden in subclasses."""
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `StateSM` object; extends `State.__init__()`.
+
+        Check for indent state machine attributes, set defaults if not set.
+        """
+        State.__init__(self, state_machine, debug)
+        if self.indent_sm is None:
+            self.indent_sm = self.nested_sm
+        if self.indent_sm_kwargs is None:
+            self.indent_sm_kwargs = self.nested_sm_kwargs
+        if self.known_indent_sm is None:
+            self.known_indent_sm = self.indent_sm
+        if self.known_indent_sm_kwargs is None:
+            self.known_indent_sm_kwargs = self.indent_sm_kwargs
+
+    def add_initial_transitions(self):
+        """
+        Add whitespace-specific transitions before those defined in subclass.
+
+        Extends `State.add_initial_transitions()`.
+        """
+        State.add_initial_transitions(self)
+        if self.patterns is None:
+            self.patterns = {}
+        self.patterns.update(self.ws_patterns)
+        names, transitions = self.make_transitions(
+            self.ws_initial_transitions)
+        self.add_transitions(names, transitions)
+
+    def blank(self, match, context, next_state):
+        """Handle blank lines. Does nothing. Override in subclasses."""
+        return self.nop(match, context, next_state)
+
+    def indent(self, match, context, next_state):
+        """
+        Handle an indented text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for indented blocks
+        (`self.indent_sm`).
+        """
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def known_indent(self, match, context, next_state):
+        """
+        Handle a known-indent text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def first_known_indent(self, match, context, next_state):
+        """
+        Handle an indented text block (first line's indent known).
+
+        Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+
+class _SearchOverride:
+
+    """
+    Mix-in class to override `StateMachine` regular expression behavior.
+
+    Changes regular expression matching, from the default `re.match()`
+    (succeeds only if the pattern matches at the start of `self.line`) to
+    `re.search()` (succeeds if the pattern matches anywhere in `self.line`).
+    When subclassing a `StateMachine`, list this class **first** in the
+    inheritance list of the class definition.
+    """
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression search.
+
+        Overrides `StateMachine.match()`.
+
+        Parameter `pattern`: `re` compiled regular expression.
+        """
+        return pattern.search(self.line)
+
+
+class SearchStateMachine(_SearchOverride, StateMachine):
+    """`StateMachine` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class SearchStateMachineWS(_SearchOverride, StateMachineWS):
+    """`StateMachineWS` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class ViewList:
+
+    """
+    List with extended functionality: slices of ViewList objects are child
+    lists, linked to their parents. Changes made to a child list also affect
+    the parent list.  A child list is effectively a "view" (in the SQL sense)
+    of the parent list.  Changes to parent lists, however, do *not* affect
+    active child lists.  If a parent list is changed, any active child lists
+    should be recreated.
+
+    The start and end of the slice can be trimmed using the `trim_start()` and
+    `trim_end()` methods, without affecting the parent list.  The link between
+    child and parent lists can be broken by calling `disconnect()` on the
+    child list.
+
+    Also, ViewList objects keep track of the source & offset of each item. 
+    This information is accessible via the `source()`, `offset()`, and
+    `info()` methods.
+    """
+
+    def __init__(self, initlist=None, source=None, items=None,
+                 parent=None, parent_offset=None):
+        self.data = []
+        """The actual list of data, flattened from various sources."""
+
+        self.items = []
+        """A list of (source, offset) pairs, same length as `self.data`: the
+        source of each line and the offset of each line from the beginning of
+        its source."""
+
+        self.parent = parent
+        """The parent list."""
+
+        self.parent_offset = parent_offset
+        """Offset of this list from the beginning of the parent list."""
+
+        if isinstance(initlist, ViewList):
+            self.data = initlist.data[:]
+            self.items = initlist.items[:]
+        elif initlist is not None:
+            self.data = list(initlist)
+            if items:
+                self.items = items
+            else:
+                self.items = [(source, i) for i in range(len(initlist))]
+        assert len(self.data) == len(self.items), 'data mismatch'
+
+    def __str__(self):
+        return str(self.data)
+
+    def __repr__(self):
+        return '%s(%s, items=%s)' % (self.__class__.__name__,
+                                     self.data, self.items)
+
+    def __lt__(self, other): return self.data <  self.__cast(other)
+    def __le__(self, other): return self.data <= self.__cast(other)
+    def __eq__(self, other): return self.data == self.__cast(other)
+    def __ne__(self, other): return self.data != self.__cast(other)
+    def __gt__(self, other): return self.data >  self.__cast(other)
+    def __ge__(self, other): return self.data >= self.__cast(other)
+    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
+
+    def __cast(self, other):
+        if isinstance(other, ViewList):
+            return other.data
+        else:
+            return other
+
+    def __contains__(self, item): return item in self.data
+    def __len__(self): return len(self.data)
+
+    # The __getitem__()/__setitem__() methods check whether the index
+    # is a slice first, since native list objects start supporting
+    # them directly in Python 2.3 (no exception is raised when
+    # indexing a list with a slice object; they just work).
+
+    def __getitem__(self, i):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1),  'cannot handle slice with stride'
+            return self.__class__(self.data[i.start:i.stop],
+                                  items=self.items[i.start:i.stop],
+                                  parent=self, parent_offset=i.start)
+        else:
+            return self.data[i]
+
+    def __setitem__(self, i, item):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1), 'cannot handle slice with stride'
+            if not isinstance(item, ViewList):
+                raise TypeError('assigning non-ViewList to ViewList slice')
+            self.data[i.start:i.stop] = item.data
+            self.items[i.start:i.stop] = item.items
+            assert len(self.data) == len(self.items), 'data mismatch'
+            if self.parent:
+                self.parent[i.start + self.parent_offset
+                            : i.stop + self.parent_offset] = item
+        else:
+            self.data[i] = item
+            if self.parent:
+                self.parent[i + self.parent_offset] = item
+
+    def __delitem__(self, i):
+        try:
+            del self.data[i]
+            del self.items[i]
+            if self.parent:
+                del self.parent[i + self.parent_offset]
+        except TypeError:
+            assert i.step is None, 'cannot handle slice with stride'
+            del self.data[i.start:i.stop]
+            del self.items[i.start:i.stop]
+            if self.parent:
+                del self.parent[i.start + self.parent_offset
+                                : i.stop + self.parent_offset]
+
+    def __add__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(self.data + other.data,
+                                  items=(self.items + other.items))
+        else:
+            raise TypeError('adding non-ViewList to a ViewList')
+
+    def __radd__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(other.data + self.data,
+                                  items=(other.items + self.items))
+        else:
+            raise TypeError('adding ViewList to a non-ViewList')
+
+    def __iadd__(self, other):
+        if isinstance(other, ViewList):
+            self.data += other.data
+        else:
+            raise TypeError('argument to += must be a ViewList')
+        return self
+
+    def __mul__(self, n):
+        return self.__class__(self.data * n, items=(self.items * n))
+
+    __rmul__ = __mul__
+
+    def __imul__(self, n):
+        self.data *= n
+        self.items *= n
+        return self
+
+    def extend(self, other):
+        if not isinstance(other, ViewList):
+            raise TypeError('extending a ViewList with a non-ViewList')
+        if self.parent:
+            self.parent.insert(len(self.data) + self.parent_offset, other)
+        self.data.extend(other.data)
+        self.items.extend(other.items)
+
+    def append(self, item, source=None, offset=0):
+        if source is None:
+            self.extend(item)
+        else:
+            if self.parent:
+                self.parent.insert(len(self.data) + self.parent_offset, item,
+                                   source, offset)
+            self.data.append(item)
+            self.items.append((source, offset))
+
+    def insert(self, i, item, source=None, offset=0):
+        if source is None:
+            if not isinstance(item, ViewList):
+                raise TypeError('inserting non-ViewList with no source given')
+            self.data[i:i] = item.data
+            self.items[i:i] = item.items
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item)
+        else:
+            self.data.insert(i, item)
+            self.items.insert(i, (source, offset))
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item,
+                                   source, offset)
+
+    def pop(self, i=-1):
+        if self.parent:
+            index = (len(self.data) + i) % len(self.data)
+            self.parent.pop(index + self.parent_offset)
+        self.items.pop(i)
+        return self.data.pop(i)
+
+    def trim_start(self, n=1):
+        """
+        Remove items from the start of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[:n]
+        del self.items[:n]
+        if self.parent:
+            self.parent_offset += n
+
+    def trim_end(self, n=1):
+        """
+        Remove items from the end of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[-n:]
+        del self.items[-n:]
+
+    def remove(self, item):
+        index = self.index(item)
+        del self[index]
+
+    def count(self, item): return self.data.count(item)
+    def index(self, item): return self.data.index(item)
+
+    def reverse(self):
+        self.data.reverse()
+        self.items.reverse()
+        self.parent = None
+
+    def sort(self, *args):
+        tmp = zip(self.data, self.items)
+        tmp.sort(*args)
+        self.data = [entry[0] for entry in tmp]
+        self.items = [entry[1] for entry in tmp]
+        self.parent = None
+
+    def info(self, i):
+        """Return source & offset for index `i`."""
+        try:
+            return self.items[i]
+        except IndexError:
+            if i == len(self.data):     # Just past the end
+                return self.items[i - 1][0], None
+            else:
+                raise
+
+    def source(self, i):
+        """Return source for index `i`."""
+        return self.info(i)[0]
+
+    def offset(self, i):
+        """Return offset for index `i`."""
+        return self.info(i)[1]
+
+    def disconnect(self):
+        """Break link between this list and parent list."""
+        self.parent = None
+
+
+class StringList(ViewList):
+
+    """A `ViewList` with string-specific methods."""
+
+    def trim_left(self, length, start=0, end=sys.maxint):
+        """
+        Trim `length` characters off the beginning of each item, in-place,
+        from index `start` to `end`.  No whitespace-checking is done on the
+        trimmed text.  Does not affect slice parent.
+        """
+        self.data[start:end] = [line[length:]
+                                for line in self.data[start:end]]
+
+    def get_text_block(self, start, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        end = start
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if not line.strip():
+                break
+            if flush_left and (line[0] == ' '):
+                source, offset = self.info(end)
+                raise UnexpectedIndentationError(self[start:end], source,
+                                                 offset + 1)
+            end += 1
+        return self[start:end]
+
+    def get_indented(self, start=0, until_blank=0, strip_indent=1,
+                     block_indent=None, first_indent=None):
+        """
+        Extract and return a StringList of indented lines of text.
+
+        Collect all lines with indentation, determine the minimum indentation,
+        remove the minimum indentation from all indented lines (unless
+        `strip_indent` is false), and return them. All lines up to but not
+        including the first unindented line will be returned.
+
+        :Parameters:
+          - `start`: The index of the first line to examine.
+          - `until_blank`: Stop collecting at the first blank line if true.
+          - `strip_indent`: Strip common leading indent if true (default).
+          - `block_indent`: The indent of the entire block, if known.
+          - `first_indent`: The indent of the first line, if known.
+
+        :Return:
+          - a StringList of indented lines with mininum indent removed;
+          - the amount of the indent;
+          - a boolean: did the indented block finish with a blank line or EOF?
+        """
+        indent = block_indent           # start with None if unknown
+        end = start
+        if block_indent is not None and first_indent is None:
+            first_indent = block_indent
+        if first_indent is not None:
+            end += 1
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if line and (line[0] != ' '
+                         or (block_indent is not None
+                             and line[:block_indent].strip())):
+                # Line not indented or insufficiently indented.
+                # Block finished properly iff the last indented line blank:
+                blank_finish = ((end > start)
+                                and not self.data[end - 1].strip())
+                break
+            stripped = line.lstrip()
+            if not stripped:            # blank line
+                if until_blank:
+                    blank_finish = 1
+                    break
+            elif block_indent is None:
+                line_indent = len(line) - len(stripped)
+                if indent is None:
+                    indent = line_indent
+                else:
+                    indent = min(indent, line_indent)
+            end += 1
+        else:
+            blank_finish = 1            # block ends at end of lines
+        block = self[start:end]
+        if first_indent is not None and block:
+            block.data[0] = block.data[0][first_indent:]
+        if indent and strip_indent:
+            block.trim_left(indent, start=(first_indent is not None))
+        return block, indent or 0, blank_finish
+
+    def get_2D_block(self, top, left, bottom, right, strip_indent=1):
+        block = self[top:bottom]
+        indent = right
+        for i in range(len(block.data)):
+            block.data[i] = line = block.data[i][left:right].rstrip()
+            if line:
+                indent = min(indent, len(line) - len(line.lstrip()))
+        if strip_indent and 0 < indent < right:
+            block.data = [line[indent:] for line in block.data]
+        return block
+
+    def pad_double_width(self, pad_char):
+        """
+        Pad all double-width characters in self by appending `pad_char` to each.
+        For East Asian language support.
+        """
+        if hasattr(unicodedata, 'east_asian_width'):
+            east_asian_width = unicodedata.east_asian_width
+        else:
+            return                      # new in Python 2.4
+        for i in range(len(self.data)):
+            line = self.data[i]
+            if isinstance(line, types.UnicodeType):
+                new = []
+                for char in line:
+                    new.append(char)
+                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
+                        new.append(pad_char)
+                self.data[i] = ''.join(new)
+
+    def replace(self, old, new):
+        """Replace all occurrences of substring `old` with `new`."""
+        for i in range(len(self.data)):
+            self.data[i] = self.data[i].replace(old, new)
+
+
+class StateMachineError(Exception): pass
+class UnknownStateError(StateMachineError): pass
+class DuplicateStateError(StateMachineError): pass
+class UnknownTransitionError(StateMachineError): pass
+class DuplicateTransitionError(StateMachineError): pass
+class TransitionPatternNotFound(StateMachineError): pass
+class TransitionMethodNotFound(StateMachineError): pass
+class UnexpectedIndentationError(StateMachineError): pass
+
+
+class TransitionCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another transition.
+
+    Raise with one argument, the new transition name.
+    """
+
+
+class StateCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another state.
+
+    Raise with one or two arguments: new state name, and an optional new
+    transition name.
+    """
+
+
+def string2lines(astring, tab_width=8, convert_whitespace=0,
+                 whitespace=re.compile('[\v\f]')):
+    """
+    Return a list of one-line strings with tabs expanded, no newlines, and
+    trailing whitespace stripped.
+
+    Each tab is expanded with between 1 and `tab_width` spaces, so that the
+    next character's index becomes a multiple of `tab_width` (8 by default).
+
+    Parameters:
+
+    - `astring`: a multi-line string.
+    - `tab_width`: the number of columns between tab stops.
+    - `convert_whitespace`: convert form feeds and vertical tabs to spaces?
+    """
+    if convert_whitespace:
+        astring = whitespace.sub(' ', astring)
+    return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]
+
+def _exception_data():
+    """
+    Return exception information:
+
+    - the exception's class name;
+    - the exception object;
+    - the name of the file containing the offending code;
+    - the line number of the offending code;
+    - the function name of the offending code.
+    """
+    type, value, traceback = sys.exc_info()
+    while traceback.tb_next:
+        traceback = traceback.tb_next
+    code = traceback.tb_frame.f_code
+    return (type.__name__, value, code.co_filename, traceback.tb_lineno,
+            code.co_name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,172 @@
+# $Id: __init__.py 4975 2007-03-01 18:08:32Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains modules for standard tree transforms available
+to Docutils components. Tree transforms serve a variety of purposes:
+
+- To tie up certain syntax-specific "loose ends" that remain after the
+  initial parsing of the input plaintext. These transforms are used to
+  supplement a limited syntax.
+
+- To automate the internal linking of the document tree (hyperlink
+  references, footnote references, etc.).
+
+- To extract useful information from the document tree. These
+  transforms may be used to construct (for example) indexes and tables
+  of contents.
+
+Each transform is an optional step that a Docutils component may
+choose to perform on the parsed document.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import languages, ApplicationError, TransformSpec
+
+
+class TransformError(ApplicationError): pass
+
+
+class Transform:
+
+    """
+    Docutils transform component abstract base class.
+    """
+
+    default_priority = None
+    """Numerical priority of this transform, 0 through 999 (override)."""
+
+    def __init__(self, document, startnode=None):
+        """
+        Initial setup for in-place document transforms.
+        """
+
+        self.document = document
+        """The document tree to transform."""
+
+        self.startnode = startnode
+        """Node from which to begin the transform.  For many transforms which
+        apply to the document as a whole, `startnode` is not set (i.e. its
+        value is `None`)."""
+
+        self.language = languages.get_language(
+            document.settings.language_code)
+        """Language module local to this document."""
+
+    def apply(self, **kwargs):
+        """Override to apply the transform to the document tree."""
+        raise NotImplementedError('subclass must override this method')
+
+
+class Transformer(TransformSpec):
+
+    """
+    Stores transforms (`Transform` classes) and applies them to document
+    trees.  Also keeps track of components by component type name.
+    """
+
+    def __init__(self, document):
+        self.transforms = []
+        """List of transforms to apply.  Each item is a 3-tuple:
+        ``(priority string, transform class, pending node or None)``."""
+
+        self.unknown_reference_resolvers = []
+        """List of hook functions which assist in resolving references"""
+
+        self.document = document
+        """The `nodes.document` object this Transformer is attached to."""
+
+        self.applied = []
+        """Transforms already applied, in order."""
+
+        self.sorted = 0
+        """Boolean: is `self.tranforms` sorted?"""
+
+        self.components = {}
+        """Mapping of component type name to component object.  Set by
+        `self.populate_from_components()`."""
+
+        self.serialno = 0
+        """Internal serial number to keep track of the add order of
+        transforms."""
+
+    def add_transform(self, transform_class, priority=None, **kwargs):
+        """
+        Store a single transform.  Use `priority` to override the default.
+        `kwargs` is a dictionary whose contents are passed as keyword
+        arguments to the `apply` method of the transform.  This can be used to
+        pass application-specific data to the transform instance.
+        """
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, None, kwargs))
+        self.sorted = 0
+
+    def add_transforms(self, transform_list):
+        """Store multiple transforms, with default priorities."""
+        for transform_class in transform_list:
+            priority_string = self.get_priority_string(
+                transform_class.default_priority)
+            self.transforms.append(
+                (priority_string, transform_class, None, {}))
+        self.sorted = 0
+
+    def add_pending(self, pending, priority=None):
+        """Store a transform with an associated `pending` node."""
+        transform_class = pending.transform
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, pending, {}))
+        self.sorted = 0
+
+    def get_priority_string(self, priority):
+        """
+        Return a string, `priority` combined with `self.serialno`.
+
+        This ensures FIFO order on transforms with identical priority.
+        """
+        self.serialno += 1
+        return '%03d-%03d' % (priority, self.serialno)
+
+    def populate_from_components(self, components):
+        """
+        Store each component's default transforms, with default priorities.
+        Also, store components by type name in a mapping for later lookup.
+        """
+        for component in components:
+            if component is None:
+                continue
+            self.add_transforms(component.get_transforms())
+            self.components[component.component_type] = component
+        self.sorted = 0
+        # Set up all of the reference resolvers for this transformer. Each
+        # component of this transformer is able to register its own helper
+        # functions to help resolve references.
+        unknown_reference_resolvers = []
+        for i in components:
+            unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
+        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
+        decorated_list.sort()
+        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
+
+    def apply_transforms(self):
+        """Apply all of the stored transforms, in priority order."""
+        self.document.reporter.attach_observer(
+            self.document.note_transform_message)
+        while self.transforms:
+            if not self.sorted:
+                # Unsorted initially, and whenever a transform is added.
+                self.transforms.sort()
+                self.transforms.reverse()
+                self.sorted = 1
+            priority, transform_class, pending, kwargs = self.transforms.pop()
+            transform = transform_class(self.document, startnode=pending)
+            transform.apply(**kwargs)
+            self.applied.append((priority, transform_class, pending, kwargs))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/components.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+# $Id: components.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils component-related transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+
+
+class Filter(Transform):
+
+    """
+    Include or exclude elements which depend on a specific Docutils component.
+
+    For use with `nodes.pending` elements.  A "pending" element's dictionary
+    attribute ``details`` must contain the keys "component" and "format".  The
+    value of ``details['component']`` must match the type name of the
+    component the elements depend on (e.g. "writer").  The value of
+    ``details['format']`` is the name of a specific format or context of that
+    component (e.g. "html").  If the matching Docutils component supports that
+    format or context, the "pending" element is replaced by the contents of
+    ``details['nodes']`` (a list of nodes); otherwise, the "pending" element
+    is removed.
+
+    For example, the reStructuredText "meta" directive creates a "pending"
+    element containing a "meta" element (in ``pending.details['nodes']``).
+    Only writers (``pending.details['component'] == 'writer'``) supporting the
+    "html" format (``pending.details['format'] == 'html'``) will include the
+    "meta" element; it will be deleted from the output of all other writers.
+    """
+
+    default_priority = 780
+
+    def apply(self):
+        pending = self.startnode
+        component_type = pending.details['component'] # 'reader' or 'writer'
+        format = pending.details['format']
+        component = self.document.transformer.components[component_type]
+        if component.supports(format):
+            pending.replace_self(pending.details['nodes'])
+        else:
+            pending.parent.remove(pending)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,512 @@
+# $Id: frontmatter.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger, Ueli Schlaepfer <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to the front matter of a document or a section
+(information found before the main text):
+
+- `DocTitle`: Used to transform a lone top level section's title to
+  the document title, promote a remaining lone top-level section's
+  title to the document subtitle, and determine the document's title
+  metadata (document['title']) based on the document title and/or the
+  "title" setting.
+
+- `SectionSubTitle`: Used to transform a lone subsection into a
+  subtitle.
+
+- `DocInfo`: Used to transform a bibliographic field list into docinfo
+  elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class TitlePromoter(Transform):
+
+    """
+    Abstract base class for DocTitle and SectionSubTitle transforms.
+    """
+
+    def promote_title(self, node):
+        """
+        Transform the following tree::
+
+            <node>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                ...
+
+        `node` is normally a document.
+        """
+        # `node` must not have a title yet.
+        assert not (len(node) and isinstance(node[0], nodes.title))
+        section, index = self.candidate_index(node)
+        if index is None:
+            return None
+        # Transfer the section's attributes to the node:
+        node.attributes.update(section.attributes)
+        # setup_child is called automatically for all nodes.
+        node[:] = (section[:1]        # section title
+                   + node[:index]     # everything that was in the
+                                      # node before the section
+                   + section[1:])     # everything that was in the section
+        assert isinstance(node[0], nodes.title)
+        return 1
+
+    def promote_subtitle(self, node):
+        """
+        Transform the following node tree::
+
+            <node>
+                <title>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                <subtitle>
+                ...
+        """
+        subsection, index = self.candidate_index(node)
+        if index is None:
+            return None
+        subtitle = nodes.subtitle()
+        # Transfer the subsection's attributes to the new subtitle:
+        # This causes trouble with list attributes!  To do: Write a
+        # test case which catches direct access to the `attributes`
+        # dictionary and/or write a test case which shows problems in
+        # this particular case.
+        subtitle.attributes.update(subsection.attributes)
+        # We're losing the subtitle's attributes here!  To do: Write a
+        # test case which shows this behavior.
+        # Transfer the contents of the subsection's title to the
+        # subtitle:
+        subtitle[:] = subsection[0][:]
+        node[:] = (node[:1]       # title
+                   + [subtitle]
+                   # everything that was before the section:
+                   + node[1:index]
+                   # everything that was in the subsection:
+                   + subsection[1:])
+        return 1
+
+    def candidate_index(self, node):
+        """
+        Find and return the promotion candidate and its index.
+
+        Return (None, None) if no valid candidate was found.
+        """
+        index = node.first_child_not_matching_class(
+            nodes.PreBibliographic)
+        if index is None or len(node) > (index + 1) or \
+               not isinstance(node[index], nodes.section):
+            return None, None
+        else:
+            return node[index], index
+
+
+class DocTitle(TitlePromoter):
+
+    """
+    In reStructuredText_, there is no way to specify a document title
+    and subtitle explicitly. Instead, we can supply the document title
+    (and possibly the subtitle as well) implicitly, and use this
+    two-step transform to "raise" or "promote" the title(s) (and their
+    corresponding section contents) to the document level.
+
+    1. If the document contains a single top-level section as its
+       first non-comment element, the top-level section's title
+       becomes the document's title, and the top-level section's
+       contents become the document's immediate contents. The lone
+       top-level section header must be the first non-comment element
+       in the document.
+
+       For example, take this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           A paragraph.
+
+       Once parsed, it looks like this::
+
+           <document>
+               <section names="top-level title">
+                   <title>
+                       Top-Level Title
+                   <paragraph>
+                       A paragraph.
+
+       After running the DocTitle transform, we have::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <paragraph>
+                   A paragraph.
+
+    2. If step 1 successfully determines the document title, we
+       continue by checking for a subtitle.
+
+       If the lone top-level section itself contains a single
+       second-level section as its first non-comment element, that
+       section's title is promoted to the document's subtitle, and
+       that section's contents become the document's immediate
+       contents. Given this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           Second-Level Title
+           ~~~~~~~~~~~~~~~~~~
+
+           A paragraph.
+
+       After parsing and running the Section Promotion transform, the
+       result is::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <subtitle names="second-level title">
+                   Second-Level Title
+               <paragraph>
+                   A paragraph.
+
+       (Note that the implicit hyperlink target generated by the
+       "Second-Level Title" is preserved on the "subtitle" element
+       itself.)
+
+    Any comment elements occurring before the document title or
+    subtitle are accumulated and inserted as the first body elements
+    after the title(s).
+
+    This transform also sets the document's metadata title
+    (document['title']).
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    """
+
+    default_priority = 320
+
+    def set_metadata(self):
+        """
+        Set document['title'] metadata title from the following
+        sources, listed in order of priority:
+
+        * Existing document['title'] attribute.
+        * "title" setting.
+        * Document title node (as promoted by promote_title).
+        """
+        if not self.document.hasattr('title'):
+            if self.document.settings.title is not None:
+                self.document['title'] = self.document.settings.title
+            elif len(self.document) and isinstance(self.document[0], nodes.title):
+                self.document['title'] = self.document[0].astext()
+
+    def apply(self):
+        if getattr(self.document.settings, 'doctitle_xform', 1):
+            # promote_(sub)title defined in TitlePromoter base class.
+            if self.promote_title(self.document):
+                # If a title has been promoted, also try to promote a
+                # subtitle.
+                self.promote_subtitle(self.document)
+        # Set document['title'].
+        self.set_metadata()
+
+
+class SectionSubTitle(TitlePromoter):
+
+    """
+    This works like document subtitles, but for sections.  For example, ::
+
+        <section>
+            <title>
+                Title
+            <section>
+                <title>
+                    Subtitle
+                ...
+
+    is transformed into ::
+
+        <section>
+            <title>
+                Title
+            <subtitle>
+                Subtitle
+            ...
+
+    For details refer to the docstring of DocTitle.
+    """
+
+    default_priority = 350
+
+    def apply(self):
+        if not getattr(self.document.settings, 'sectsubtitle_xform', 1):
+            return
+        for section in self.document.traverse(nodes.section):
+            # On our way through the node tree, we are deleting
+            # sections, but we call self.promote_subtitle for those
+            # sections nonetheless.  To do: Write a test case which
+            # shows the problem and discuss on Docutils-develop.
+            self.promote_subtitle(section)
+
+
+class DocInfo(Transform):
+
+    """
+    This transform is specific to the reStructuredText_ markup syntax;
+    see "Bibliographic Fields" in the `reStructuredText Markup
+    Specification`_ for a high-level description. This transform
+    should be run *after* the `DocTitle` transform.
+
+    Given a field list as the first non-comment element after the
+    document title and subtitle (if present), registered bibliographic
+    field names are transformed to the corresponding DTD elements,
+    becoming child elements of the "docinfo" element (except for a
+    dedication and/or an abstract, which become "topic" elements after
+    "docinfo").
+
+    For example, given this document fragment after parsing::
+
+        <document>
+            <title>
+                Document Title
+            <field_list>
+                <field>
+                    <field_name>
+                        Author
+                    <field_body>
+                        <paragraph>
+                            A. Name
+                <field>
+                    <field_name>
+                        Status
+                    <field_body>
+                        <paragraph>
+                            $RCSfile$
+            ...
+
+    After running the bibliographic field list transform, the
+    resulting document tree would look like this::
+
+        <document>
+            <title>
+                Document Title
+            <docinfo>
+                <author>
+                    A. Name
+                <status>
+                    frontmatter.py
+            ...
+
+    The "Status" field contained an expanded RCS keyword, which is
+    normally (but optionally) cleaned up by the transform. The sole
+    contents of the field body must be a paragraph containing an
+    expanded RCS keyword of the form "$keyword: expansion text $". Any
+    RCS keyword can be processed in any bibliographic field. The
+    dollar signs and leading RCS keyword name are removed. Extra
+    processing is done for the following RCS keywords:
+
+    - "RCSfile" expands to the name of the file in the RCS or CVS
+      repository, which is the name of the source file with a ",v"
+      suffix appended. The transform will remove the ",v" suffix.
+
+    - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC
+      time zone). The RCS Keywords transform will extract just the
+      date itself and transform it to an ISO 8601 format date, as in
+      "2000-12-31".
+
+      (Since the source file for this text is itself stored under CVS,
+      we can't show an example of the "Date" RCS keyword because we
+      can't prevent any RCS keywords used in this explanation from
+      being expanded. Only the "RCSfile" keyword is stable; its
+      expansion text changes only if the file name changes.)
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    .. _reStructuredText Markup Specification:
+       http://docutils.sf.net/docs/ref/rst/restructuredtext.html
+    """
+
+    default_priority = 340
+
+    biblio_nodes = {
+          'author': nodes.author,
+          'authors': nodes.authors,
+          'organization': nodes.organization,
+          'address': nodes.address,
+          'contact': nodes.contact,
+          'version': nodes.version,
+          'revision': nodes.revision,
+          'status': nodes.status,
+          'date': nodes.date,
+          'copyright': nodes.copyright,
+          'dedication': nodes.topic,
+          'abstract': nodes.topic}
+    """Canonical field name (lowcased) to node class name mapping for
+    bibliographic fields (field_list)."""
+
+    def apply(self):
+        if not getattr(self.document.settings, 'docinfo_xform', 1):
+            return
+        document = self.document
+        index = document.first_child_not_matching_class(
+              nodes.PreBibliographic)
+        if index is None:
+            return
+        candidate = document[index]
+        if isinstance(candidate, nodes.field_list):
+            biblioindex = document.first_child_not_matching_class(
+                  (nodes.Titular, nodes.Decorative))
+            nodelist = self.extract_bibliographic(candidate)
+            del document[index]         # untransformed field list (candidate)
+            document[biblioindex:biblioindex] = nodelist
+
+    def extract_bibliographic(self, field_list):
+        docinfo = nodes.docinfo()
+        bibliofields = self.language.bibliographic_fields
+        labels = self.language.labels
+        topics = {'dedication': None, 'abstract': None}
+        for field in field_list:
+            try:
+                name = field[0][0].astext()
+                normedname = nodes.fully_normalize_name(name)
+                if not (len(field) == 2 and bibliofields.has_key(normedname)
+                        and self.check_empty_biblio_field(field, name)):
+                    raise TransformError
+                canonical = bibliofields[normedname]
+                biblioclass = self.biblio_nodes[canonical]
+                if issubclass(biblioclass, nodes.TextElement):
+                    if not self.check_compound_biblio_field(field, name):
+                        raise TransformError
+                    utils.clean_rcs_keywords(
+                          field[1][0], self.rcs_keyword_substitutions)
+                    docinfo.append(biblioclass('', '', *field[1][0]))
+                elif issubclass(biblioclass, nodes.authors):
+                    self.extract_authors(field, name, docinfo)
+                elif issubclass(biblioclass, nodes.topic):
+                    if topics[canonical]:
+                        field[-1] += self.document.reporter.warning(
+                            'There can only be one "%s" field.' % name,
+                            base_node=field)
+                        raise TransformError
+                    title = nodes.title(name, labels[canonical])
+                    topics[canonical] = biblioclass(
+                        '', title, classes=[canonical], *field[1].children)
+                else:
+                    docinfo.append(biblioclass('', *field[1].children))
+            except TransformError:
+                if len(field[-1]) == 1 \
+                       and isinstance(field[-1][0], nodes.paragraph):
+                    utils.clean_rcs_keywords(
+                        field[-1][0], self.rcs_keyword_substitutions)
+                docinfo.append(field)
+        nodelist = []
+        if len(docinfo) != 0:
+            nodelist.append(docinfo)
+        for name in ('dedication', 'abstract'):
+            if topics[name]:
+                nodelist.append(topics[name])
+        return nodelist
+
+    def check_empty_biblio_field(self, field, name):
+        if len(field[-1]) < 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract empty bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    def check_compound_biblio_field(self, field, name):
+        if len(field[-1]) > 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract compound bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        if not isinstance(field[-1][0], nodes.paragraph):
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract bibliographic field "%s" containing '
+                  'anything other than a single paragraph.' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    rcs_keyword_substitutions = [
+          (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+'
+                      r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'),
+          (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),]
+
+    def extract_authors(self, field, name, docinfo):
+        try:
+            if len(field[1]) == 1:
+                if isinstance(field[1][0], nodes.paragraph):
+                    authors = self.authors_from_one_paragraph(field)
+                elif isinstance(field[1][0], nodes.bullet_list):
+                    authors = self.authors_from_bullet_list(field)
+                else:
+                    raise TransformError
+            else:
+                authors = self.authors_from_paragraphs(field)
+            authornodes = [nodes.author('', '', *author)
+                           for author in authors if author]
+            if len(authornodes) >= 1:
+                docinfo.append(nodes.authors('', *authornodes))
+            else:
+                raise TransformError
+        except TransformError:
+            field[-1] += self.document.reporter.warning(
+                  'Bibliographic field "%s" incompatible with extraction: '
+                  'it must contain either a single paragraph (with authors '
+                  'separated by one of "%s"), multiple paragraphs (one per '
+                  'author), or a bullet list with one paragraph (one author) '
+                  'per item.'
+                  % (name, ''.join(self.language.author_separators)),
+                  base_node=field)
+            raise
+
+    def authors_from_one_paragraph(self, field):
+        text = field[1][0].astext().strip()
+        if not text:
+            raise TransformError
+        for authorsep in self.language.author_separators:
+            authornames = text.split(authorsep)
+            if len(authornames) > 1:
+                break
+        authornames = [author.strip() for author in authornames]
+        authors = [[nodes.Text(author)] for author in authornames if author]
+        return authors
+
+    def authors_from_bullet_list(self, field):
+        authors = []
+        for item in field[1][0]:
+            if len(item) != 1 or not isinstance(item[0], nodes.paragraph):
+                raise TransformError
+            authors.append(item[0].children)
+        if not authors:
+            raise TransformError
+        return authors
+
+    def authors_from_paragraphs(self, field):
+        for item in field[1]:
+            if not isinstance(item, nodes.paragraph):
+                raise TransformError
+        authors = [item.children for item in field[1]]
+        return authors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/misc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,143 @@
+# $Id: misc.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import Transform, TransformError
+
+
+class CallBack(Transform):
+
+    """
+    Inserts a callback into a document.  The callback is called when the
+    transform is applied, which is determined by its priority.
+
+    For use with `nodes.pending` elements.  Requires a ``details['callback']``
+    entry, a bound method or function which takes one parameter: the pending
+    node.  Other data can be stored in the ``details`` attribute or in the
+    object hosting the callback method.
+    """
+
+    default_priority = 990
+
+    def apply(self):
+        pending = self.startnode
+        pending.details['callback'](pending)
+        pending.parent.remove(pending)
+
+
+class ClassAttribute(Transform):
+
+    """
+    Move the "class" attribute specified in the "pending" node into the
+    immediately following non-comment element.
+    """
+
+    default_priority = 210
+
+    def apply(self):
+        pending = self.startnode
+        parent = pending.parent
+        child = pending
+        while parent:
+            # Check for appropriate following siblings:
+            for index in range(parent.index(child) + 1, len(parent)):
+                element = parent[index]
+                if (isinstance(element, nodes.Invisible) or
+                    isinstance(element, nodes.system_message)):
+                    continue
+                element['classes'] += pending.details['class']
+                pending.parent.remove(pending)
+                return
+            else:
+                # At end of section or container; apply to sibling
+                child = parent
+                parent = parent.parent
+        error = self.document.reporter.error(
+            'No suitable element following "%s" directive'
+            % pending.details['directive'],
+            nodes.literal_block(pending.rawsource, pending.rawsource),
+            line=pending.line)
+        pending.replace_self(error)
+
+
+class Transitions(Transform):
+
+    """
+    Move transitions at the end of sections up the tree.  Complain
+    on transitions after a title, at the beginning or end of the
+    document, and after another transition.
+
+    For example, transform this::
+
+        <section>
+            ...
+            <transition>
+        <section>
+            ...
+
+    into this::
+
+        <section>
+            ...
+        <transition>
+        <section>
+            ...
+    """
+
+    default_priority = 830
+
+    def apply(self):
+        for node in self.document.traverse(nodes.transition):
+            self.visit_transition(node)
+
+    def visit_transition(self, node):
+        index = node.parent.index(node)
+        error = None
+        if (index == 0 or
+            isinstance(node.parent[0], nodes.title) and
+            (index == 1 or
+             isinstance(node.parent[1], nodes.subtitle) and
+             index == 2)):
+            assert (isinstance(node.parent, nodes.document) or
+                    isinstance(node.parent, nodes.section))
+            error = self.document.reporter.error(
+                'Document or section may not begin with a transition.',
+                line=node.line)
+        elif isinstance(node.parent[index - 1], nodes.transition):
+            error = self.document.reporter.error(
+                'At least one body element must separate transitions; '
+                'adjacent transitions are not allowed.', line=node.line)
+        if error:
+            # Insert before node and update index.
+            node.parent.insert(index, error)
+            index += 1
+        assert index < len(node.parent)
+        if index != len(node.parent) - 1:
+            # No need to move the node.
+            return
+        # Node behind which the transition is to be moved.
+        sibling = node
+        # While sibling is the last node of its parent.
+        while index == len(sibling.parent) - 1:
+            sibling = sibling.parent
+            # If sibling is the whole document (i.e. it has no parent).
+            if sibling.parent is None:
+                # Transition at the end of document.  Do not move the
+                # transition up, and place an error behind.
+                error = self.document.reporter.error(
+                    'Document may not end with a transition.',
+                    line=node.line)
+                node.parent.insert(node.parent.index(node) + 1, error)
+                return
+            index = sibling.parent.index(sibling)
+        # Remove the original transition node.
+        node.parent.remove(node)
+        # Insert the transition after the sibling.
+        sibling.parent.insert(index + 1, node)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/parts.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,164 @@
+# $Id: parts.py 4891 2007-01-22 08:35:57Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class SectNum(Transform):
+
+    """
+    Automatically assigns numbers to the titles of document sections.
+
+    It is possible to limit the maximum section level for which the numbers
+    are added.  For those sections that are auto-numbered, the "autonum"
+    attribute is set, informing the contents table generator that a different
+    form of the TOC should be used.
+    """
+
+    default_priority = 710
+    """Should be applied before `Contents`."""
+
+    def apply(self):
+        self.maxdepth = self.startnode.details.get('depth', sys.maxint)
+        self.startvalue = self.startnode.details.get('start', 1)
+        self.prefix = self.startnode.details.get('prefix', '')
+        self.suffix = self.startnode.details.get('suffix', '')
+        self.startnode.parent.remove(self.startnode)
+        if self.document.settings.sectnum_xform:
+            self.update_section_numbers(self.document)
+
+    def update_section_numbers(self, node, prefix=(), depth=0):
+        depth += 1
+        if prefix:
+            sectnum = 1
+        else:
+            sectnum = self.startvalue
+        for child in node:
+            if isinstance(child, nodes.section):
+                numbers = prefix + (str(sectnum),)
+                title = child[0]
+                # Use &nbsp; for spacing:
+                generated = nodes.generated(
+                    '', (self.prefix + '.'.join(numbers) + self.suffix
+                         +  u'\u00a0' * 3),
+                    classes=['sectnum'])
+                title.insert(0, generated)
+                title['auto'] = 1
+                if depth < self.maxdepth:
+                    self.update_section_numbers(child, numbers, depth)
+                sectnum += 1
+
+
+class Contents(Transform):
+
+    """
+    This transform generates a table of contents from the entire document tree
+    or from a single branch.  It locates "section" elements and builds them
+    into a nested bullet list, which is placed within a "topic" created by the
+    contents directive.  A title is either explicitly specified, taken from
+    the appropriate language module, or omitted (local table of contents).
+    The depth may be specified.  Two-way references between the table of
+    contents and section titles are generated (requires Writer support).
+
+    This transform requires a startnode, which which contains generation
+    options and provides the location for the generated table of contents (the
+    startnode is replaced by the table of contents "topic").
+    """
+
+    default_priority = 720
+
+    def apply(self):
+        details = self.startnode.details
+        if details.has_key('local'):
+            startnode = self.startnode.parent.parent
+            while not (isinstance(startnode, nodes.section)
+                       or isinstance(startnode, nodes.document)):
+                # find the ToC root: a direct ancestor of startnode
+                startnode = startnode.parent
+        else:
+            startnode = self.document
+        self.toc_id = self.startnode.parent['ids'][0]
+        if details.has_key('backlinks'):
+            self.backlinks = details['backlinks']
+        else:
+            self.backlinks = self.document.settings.toc_backlinks
+        contents = self.build_contents(startnode)
+        if len(contents):
+            self.startnode.replace_self(contents)
+        else:
+            self.startnode.parent.parent.remove(self.startnode.parent)
+
+    def build_contents(self, node, level=0):
+        level += 1
+        sections = [sect for sect in node if isinstance(sect, nodes.section)]
+        entries = []
+        autonum = 0
+        depth = self.startnode.details.get('depth', sys.maxint)
+        for section in sections:
+            title = section[0]
+            auto = title.get('auto')    # May be set by SectNum.
+            entrytext = self.copy_and_filter(title)
+            reference = nodes.reference('', '', refid=section['ids'][0],
+                                        *entrytext)
+            ref_id = self.document.set_id(reference)
+            entry = nodes.paragraph('', '', reference)
+            item = nodes.list_item('', entry)
+            if ( self.backlinks in ('entry', 'top')
+                 and title.next_node(nodes.reference) is None):
+                if self.backlinks == 'entry':
+                    title['refid'] = ref_id
+                elif self.backlinks == 'top':
+                    title['refid'] = self.toc_id
+            if level < depth:
+                subsects = self.build_contents(section, level)
+                item += subsects
+            entries.append(item)
+        if entries:
+            contents = nodes.bullet_list('', *entries)
+            if auto:
+                contents['classes'].append('auto-toc')
+            return contents
+        else:
+            return []
+
+    def copy_and_filter(self, node):
+        """Return a copy of a title, with references, images, etc. removed."""
+        visitor = ContentsFilter(self.document)
+        node.walkabout(visitor)
+        return visitor.get_entry_text()
+
+
+class ContentsFilter(nodes.TreeCopyVisitor):
+
+    def get_entry_text(self):
+        return self.get_tree_copy().children
+
+    def visit_citation_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        if node.hasattr('alt'):
+            self.parent.append(nodes.Text(node['alt']))
+        raise nodes.SkipNode
+
+    def ignore_node_but_process_children(self, node):
+        raise nodes.SkipDeparture
+
+    visit_interpreted = ignore_node_but_process_children
+    visit_problematic = ignore_node_but_process_children
+    visit_reference = ignore_node_but_process_children
+    visit_target = ignore_node_but_process_children
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/peps.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,304 @@
+# $Id: peps.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for PEP processing.
+
+- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
+  field list, but some entries get processed.
+- `Contents`: Auto-inserts a table of contents.
+- `PEPZero`: Special processing for PEP 0.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils, languages
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+from docutils.transforms import parts, references, misc
+
+
+class Headers(Transform):
+
+    """
+    Process fields in a PEP's initial RFC-2822 header.
+    """
+
+    default_priority = 360
+
+    pep_url = 'pep-%04d'
+    pep_cvs_url = ('http://svn.python.org/view/*checkout*'
+                   '/peps/trunk/pep-%04d.txt')
+    rcs_keyword_substitutions = (
+          (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),)
+
+    def apply(self):
+        if not len(self.document):
+            # @@@ replace these DataErrors with proper system messages
+            raise DataError('Document tree is empty.')
+        header = self.document[0]
+        if not isinstance(header, nodes.field_list) or \
+              'rfc2822' not in header['classes']:
+            raise DataError('Document does not begin with an RFC-2822 '
+                            'header; it is not a PEP.')
+        pep = None
+        for field in header:
+            if field[0].astext().lower() == 'pep': # should be the first field
+                value = field[1].astext()
+                try:
+                    pep = int(value)
+                    cvs_url = self.pep_cvs_url % pep
+                except ValueError:
+                    pep = value
+                    cvs_url = None
+                    msg = self.document.reporter.warning(
+                        '"PEP" header must contain an integer; "%s" is an '
+                        'invalid value.' % pep, base_node=field)
+                    msgid = self.document.set_id(msg)
+                    prb = nodes.problematic(value, value or '(none)',
+                                            refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    if len(field[1]):
+                        field[1][0][:] = [prb]
+                    else:
+                        field[1] += nodes.paragraph('', '', prb)
+                break
+        if pep is None:
+            raise DataError('Document does not contain an RFC-2822 "PEP" '
+                            'header.')
+        if pep == 0:
+            # Special processing for PEP 0.
+            pending = nodes.pending(PEPZero)
+            self.document.insert(1, pending)
+            self.document.note_pending(pending)
+        if len(header) < 2 or header[1][0].astext().lower() != 'title':
+            raise DataError('No title!')
+        for field in header:
+            name = field[0].astext().lower()
+            body = field[1]
+            if len(body) > 1:
+                raise DataError('PEP header field body contains multiple '
+                                'elements:\n%s' % field.pformat(level=1))
+            elif len(body) == 1:
+                if not isinstance(body[0], nodes.paragraph):
+                    raise DataError('PEP header field body may only contain '
+                                    'a single paragraph:\n%s'
+                                    % field.pformat(level=1))
+            elif name == 'last-modified':
+                date = time.strftime(
+                      '%d-%b-%Y',
+                      time.localtime(os.stat(self.document['source'])[8]))
+                if cvs_url:
+                    body += nodes.paragraph(
+                        '', '', nodes.reference('', date, refuri=cvs_url))
+            else:
+                # empty
+                continue
+            para = body[0]
+            if name == 'author':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node))
+            elif name == 'discussions-to':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node, pep))
+            elif name in ('replaces', 'replaced-by', 'requires'):
+                newbody = []
+                space = nodes.Text(' ')
+                for refpep in re.split(',?\s+', body.astext()):
+                    pepno = int(refpep)
+                    newbody.append(nodes.reference(
+                        refpep, refpep,
+                        refuri=(self.document.settings.pep_base_url
+                                + self.pep_url % pepno)))
+                    newbody.append(space)
+                para[:] = newbody[:-1] # drop trailing space
+            elif name == 'last-modified':
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+                if cvs_url:
+                    date = para.astext()
+                    para[:] = [nodes.reference('', date, refuri=cvs_url)]
+            elif name == 'content-type':
+                pep_type = para.astext()
+                uri = self.document.settings.pep_base_url + self.pep_url % 12
+                para[:] = [nodes.reference('', pep_type, refuri=uri)]
+            elif name == 'version' and len(body):
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+
+
+class Contents(Transform):
+
+    """
+    Insert an empty table of contents topic and a transform placeholder into
+    the document after the RFC 2822 header.
+    """
+
+    default_priority = 380
+
+    def apply(self):
+        language = languages.get_language(self.document.settings.language_code)
+        name = language.labels['contents']
+        title = nodes.title('', name)
+        topic = nodes.topic('', title, classes=['contents'])
+        name = nodes.fully_normalize_name(name)
+        if not self.document.has_name(name):
+            topic['names'].append(name)
+        self.document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents)
+        topic += pending
+        self.document.insert(1, topic)
+        self.document.note_pending(pending)
+
+
+class TargetNotes(Transform):
+
+    """
+    Locate the "References" section, insert a placeholder for an external
+    target footnote insertion transform at the end, and schedule the
+    transform to run immediately.
+    """
+
+    default_priority = 520
+
+    def apply(self):
+        doc = self.document
+        i = len(doc) - 1
+        refsect = copyright = None
+        while i >= 0 and isinstance(doc[i], nodes.section):
+            title_words = doc[i][0].astext().lower().split()
+            if 'references' in title_words:
+                refsect = doc[i]
+                break
+            elif 'copyright' in title_words:
+                copyright = i
+            i -= 1
+        if not refsect:
+            refsect = nodes.section()
+            refsect += nodes.title('', 'References')
+            doc.set_id(refsect)
+            if copyright:
+                # Put the new "References" section before "Copyright":
+                doc.insert(copyright, refsect)
+            else:
+                # Put the new "References" section at end of doc:
+                doc.append(refsect)
+        pending = nodes.pending(references.TargetNotes)
+        refsect.append(pending)
+        self.document.note_pending(pending, 0)
+        pending = nodes.pending(misc.CallBack,
+                                details={'callback': self.cleanup_callback})
+        refsect.append(pending)
+        self.document.note_pending(pending, 1)
+
+    def cleanup_callback(self, pending):
+        """
+        Remove an empty "References" section.
+
+        Called after the `references.TargetNotes` transform is complete.
+        """
+        if len(pending.parent) == 2:    # <title> and <pending>
+            pending.parent.parent.remove(pending.parent)
+
+
+class PEPZero(Transform):
+
+    """
+    Special processing for PEP 0.
+    """
+
+    default_priority =760
+
+    def apply(self):
+        visitor = PEPZeroSpecial(self.document)
+        self.document.walk(visitor)
+        self.startnode.parent.remove(self.startnode)
+
+
+class PEPZeroSpecial(nodes.SparseNodeVisitor):
+
+    """
+    Perform the special processing needed by PEP 0:
+
+    - Mask email addresses.
+
+    - Link PEP numbers in the second column of 4-column tables to the PEPs
+      themselves.
+    """
+
+    pep_url = Headers.pep_url
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        node.replace_self(mask_email(node))
+
+    def visit_field_list(self, node):
+        if 'rfc2822' in node['classes']:
+            raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        self.pep_table = node['cols'] == 4
+        self.entry = 0
+
+    def visit_colspec(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2:
+            node['classes'].append('num')
+
+    def visit_row(self, node):
+        self.entry = 0
+
+    def visit_entry(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2 and len(node) == 1:
+            node['classes'].append('num')
+            p = node[0]
+            if isinstance(p, nodes.paragraph) and len(p) == 1:
+                text = p.astext()
+                try:
+                    pep = int(text)
+                    ref = (self.document.settings.pep_base_url
+                           + self.pep_url % pep)
+                    p[0] = nodes.reference(text, text, refuri=ref)
+                except ValueError:
+                    pass
+
+
+non_masked_addresses = ('peps@python.org',
+                        'python-list@python.org',
+                        'python-dev@python.org')
+
+def mask_email(ref, pepno=None):
+    """
+    Mask the email address in `ref` and return a replacement node.
+
+    `ref` is returned unchanged if it contains no email address.
+
+    For email addresses such as "user@host", mask the address as "user at
+    host" (text) to thwart simple email address harvesters (except for those
+    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
+    return a reference including a default email subject.
+    """
+    if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'):
+        if ref['refuri'][8:] in non_masked_addresses:
+            replacement = ref[0]
+        else:
+            replacement_text = ref.astext().replace('@', '&#32;&#97;t&#32;')
+            replacement = nodes.raw('', replacement_text, format='html')
+        if pepno is None:
+            return replacement
+        else:
+            ref['refuri'] += '?subject=PEP%%20%s' % pepno
+            ref[:] = [replacement]
+            return ref
+    else:
+        return ref
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/references.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,896 @@
+# $Id: references.py 5018 2007-03-12 21:39:31Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for resolving references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class PropagateTargets(Transform):
+
+    """
+    Propagate empty internal targets to the next element.
+
+    Given the following nodes::
+
+        <target ids="internal1" names="internal1">
+        <target anonymous="1" ids="id1">
+        <target ids="internal2" names="internal2">
+        <paragraph>
+            This is a test.
+
+    PropagateTargets propagates the ids and names of the internal
+    targets preceding the paragraph to the paragraph itself::
+
+        <target refid="internal1">
+        <target anonymous="1" refid="id1">
+        <target refid="internal2">
+        <paragraph ids="internal2 id1 internal1" names="internal2 internal1">
+            This is a test.
+    """
+
+    default_priority = 260
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            # Only block-level targets without reference (like ".. target:"):
+            if (isinstance(target.parent, nodes.TextElement) or
+                (target.hasattr('refid') or target.hasattr('refuri') or
+                 target.hasattr('refname'))):
+                continue
+            assert len(target) == 0, 'error: block-level target has children'
+            next_node = target.next_node(ascend=1)
+            # Do not move names and ids into Invisibles (we'd lose the
+            # attributes) or different Targetables (e.g. footnotes).
+            if (next_node is not None and
+                ((not isinstance(next_node, nodes.Invisible) and
+                  not isinstance(next_node, nodes.Targetable)) or
+                 isinstance(next_node, nodes.target))):
+                next_node['ids'].extend(target['ids'])
+                next_node['names'].extend(target['names'])
+                # Set defaults for next_node.expect_referenced_by_name/id.
+                if not hasattr(next_node, 'expect_referenced_by_name'):
+                    next_node.expect_referenced_by_name = {}
+                if not hasattr(next_node, 'expect_referenced_by_id'):
+                    next_node.expect_referenced_by_id = {}
+                for id in target['ids']:
+                    # Update IDs to node mapping.
+                    self.document.ids[id] = next_node
+                    # If next_node is referenced by id ``id``, this
+                    # target shall be marked as referenced.
+                    next_node.expect_referenced_by_id[id] = target
+                for name in target['names']:
+                    next_node.expect_referenced_by_name[name] = target
+                # If there are any expect_referenced_by_... attributes
+                # in target set, copy them to next_node.
+                next_node.expect_referenced_by_name.update(
+                    getattr(target, 'expect_referenced_by_name', {}))
+                next_node.expect_referenced_by_id.update(
+                    getattr(target, 'expect_referenced_by_id', {}))
+                # Set refid to point to the first former ID of target
+                # which is now an ID of next_node.
+                target['refid'] = target['ids'][0]
+                # Clear ids and names; they have been moved to
+                # next_node.
+                target['ids'] = []
+                target['names'] = []
+                self.document.note_refid(target)
+
+
+class AnonymousHyperlinks(Transform):
+
+    """
+    Link anonymous references to targets.  Given::
+
+        <paragraph>
+            <reference anonymous="1">
+                internal
+            <reference anonymous="1">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+
+    Corresponding references are linked via "refid" or resolved via "refuri"::
+
+        <paragraph>
+            <reference anonymous="1" refid="id1">
+                text
+            <reference anonymous="1" refuri="http://external">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+    """
+
+    default_priority = 440
+
+    def apply(self):
+        anonymous_refs = []
+        anonymous_targets = []
+        for node in self.document.traverse(nodes.reference):
+            if node.get('anonymous'):
+                anonymous_refs.append(node)
+        for node in self.document.traverse(nodes.target):
+            if node.get('anonymous'):
+                anonymous_targets.append(node)
+        if len(anonymous_refs) \
+              != len(anonymous_targets):
+            msg = self.document.reporter.error(
+                  'Anonymous hyperlink mismatch: %s references but %s '
+                  'targets.\nSee "backrefs" attribute for IDs.'
+                  % (len(anonymous_refs), len(anonymous_targets)))
+            msgid = self.document.set_id(msg)
+            for ref in anonymous_refs:
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            return
+        for ref, target in zip(anonymous_refs, anonymous_targets):
+            target.referenced = 1
+            while 1:
+                if target.hasattr('refuri'):
+                    ref['refuri'] = target['refuri']
+                    ref.resolved = 1
+                    break
+                else:
+                    if not target['ids']:
+                        # Propagated target.
+                        target = self.document.ids[target['refid']]
+                        continue
+                    ref['refid'] = target['ids'][0]
+                    self.document.note_refid(ref)
+                    break
+
+
+class IndirectHyperlinks(Transform):
+
+    """
+    a) Indirect external references::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refname="direct external">
+
+       The "refuri" attribute is migrated back to all indirect targets
+       from the final direct target (i.e. a target not referring to
+       another indirect target)::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refuri="http://indirect">
+
+       Once the attribute is migrated, the preexisting "refname" attribute
+       is dropped.
+
+    b) Indirect internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refname="indirect internal">
+                   indirect internal
+           <target id="id2" name="indirect internal 2"
+               refname="final target">
+           <target id="id3" name="indirect internal"
+               refname="indirect internal 2">
+
+       Targets which indirectly refer to an internal target become one-hop
+       indirect (their "refid" attributes are directly set to the internal
+       target's "id"). References which indirectly refer to an internal
+       target become direct internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refid="id1">
+                   indirect internal
+           <target id="id2" name="indirect internal 2" refid="id1">
+           <target id="id3" name="indirect internal" refid="id1">
+    """
+
+    default_priority = 460
+
+    def apply(self):
+        for target in self.document.indirect_targets:
+            if not target.resolved:
+                self.resolve_indirect_target(target)
+            self.resolve_indirect_references(target)
+
+    def resolve_indirect_target(self, target):
+        refname = target.get('refname')
+        if refname is None:
+            reftarget_id = target['refid']
+        else:
+            reftarget_id = self.document.nameids.get(refname)
+            if not reftarget_id:
+                # Check the unknown_reference_resolvers
+                for resolver_function in \
+                        self.document.transformer.unknown_reference_resolvers:
+                    if resolver_function(target):
+                        break
+                else:
+                    self.nonexistent_indirect_target(target)
+                return
+        reftarget = self.document.ids[reftarget_id]
+        reftarget.note_referenced_by(id=reftarget_id)
+        if isinstance(reftarget, nodes.target) \
+               and not reftarget.resolved and reftarget.hasattr('refname'):
+            if hasattr(target, 'multiply_indirect'):
+                #and target.multiply_indirect):
+                #del target.multiply_indirect
+                self.circular_indirect_reference(target)
+                return
+            target.multiply_indirect = 1
+            self.resolve_indirect_target(reftarget) # multiply indirect
+            del target.multiply_indirect
+        if reftarget.hasattr('refuri'):
+            target['refuri'] = reftarget['refuri']
+            if target.has_key('refid'):
+                del target['refid']
+        elif reftarget.hasattr('refid'):
+            target['refid'] = reftarget['refid']
+            self.document.note_refid(target)
+        else:
+            if reftarget['ids']:
+                target['refid'] = reftarget_id
+                self.document.note_refid(target)
+            else:
+                self.nonexistent_indirect_target(target)
+                return
+        if refname is not None:
+            del target['refname']
+        target.resolved = 1
+
+    def nonexistent_indirect_target(self, target):
+        if self.document.nameids.has_key(target['refname']):
+            self.indirect_target_error(target, 'which is a duplicate, and '
+                                       'cannot be used as a unique reference')
+        else:
+            self.indirect_target_error(target, 'which does not exist')
+
+    def circular_indirect_reference(self, target):
+        self.indirect_target_error(target, 'forming a circular reference')
+
+    def indirect_target_error(self, target, explanation):
+        naming = ''
+        reflist = []
+        if target['names']:
+            naming = '"%s" ' % target['names'][0]
+        for name in target['names']:
+            reflist.extend(self.document.refnames.get(name, []))
+        for id in target['ids']:
+            reflist.extend(self.document.refids.get(id, []))
+        naming += '(id="%s")' % target['ids'][0]
+        msg = self.document.reporter.error(
+              'Indirect hyperlink target %s refers to target "%s", %s.'
+              % (naming, target['refname'], explanation), base_node=target)
+        msgid = self.document.set_id(msg)
+        for ref in utils.uniq(reflist):
+            prb = nodes.problematic(
+                  ref.rawsource, ref.rawsource, refid=msgid)
+            prbid = self.document.set_id(prb)
+            msg.add_backref(prbid)
+            ref.replace_self(prb)
+        target.resolved = 1
+
+    def resolve_indirect_references(self, target):
+        if target.hasattr('refid'):
+            attname = 'refid'
+            call_method = self.document.note_refid
+        elif target.hasattr('refuri'):
+            attname = 'refuri'
+            call_method = None
+        else:
+            return
+        attval = target[attname]
+        for name in target['names']:
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+        for id in target['ids']:
+            reflist = self.document.refids.get(id, [])
+            if reflist:
+                target.note_referenced_by(id=id)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refid']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+
+
+class ExternalTargets(Transform):
+
+    """
+    Given::
+
+        <paragraph>
+            <reference refname="direct external">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+
+    The "refname" attribute is replaced by the direct "refuri" attribute::
+
+        <paragraph>
+            <reference refuri="http://direct">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+    """
+
+    default_priority = 640
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if target.hasattr('refuri'):
+                refuri = target['refuri']
+                for name in target['names']:
+                    reflist = self.document.refnames.get(name, [])
+                    if reflist:
+                        target.note_referenced_by(name=name)
+                    for ref in reflist:
+                        if ref.resolved:
+                            continue
+                        del ref['refname']
+                        ref['refuri'] = refuri
+                        ref.resolved = 1
+
+
+class InternalTargets(Transform):
+
+    default_priority = 660
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if not target.hasattr('refuri') and not target.hasattr('refid'):
+                self.resolve_reference_ids(target)
+
+    def resolve_reference_ids(self, target):
+        """
+        Given::
+
+            <paragraph>
+                <reference refname="direct internal">
+                    direct internal
+            <target id="id1" name="direct internal">
+
+        The "refname" attribute is replaced by "refid" linking to the target's
+        "id"::
+
+            <paragraph>
+                <reference refid="id1">
+                    direct internal
+            <target id="id1" name="direct internal">
+        """
+        for name in target['names']:
+            refid = self.document.nameids[name]
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref['refid'] = refid
+                ref.resolved = 1
+
+
+class Footnotes(Transform):
+
+    """
+    Assign numbers to autonumbered footnotes, and resolve links to footnotes,
+    citations, and their references.
+
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refname="footnote">
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2">
+            <footnote auto="1" id="id3">
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote">
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Auto-numbered footnotes have attribute ``auto="1"`` and no label.
+    Auto-numbered footnote_references have no reference text (they're
+    empty elements). When resolving the numbering, a ``label`` element
+    is added to the beginning of the ``footnote``, and reference text
+    to the ``footnote_reference``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refid="footnote">
+                    2
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2" refid="id3">
+                    1
+            <footnote auto="1" id="id3" backrefs="id2">
+                <label>
+                    1
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote" backrefs="id1">
+                <label>
+                    2
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Note that the footnotes are not in the same order as the references.
+
+    The labels and reference text are added to the auto-numbered ``footnote``
+    and ``footnote_reference`` elements.  Footnote elements are backlinked to
+    their references via "refids" attributes.  References are assigned "id"
+    and "refid" attributes.
+
+    After adding labels and reference text, the "auto" attributes can be
+    ignored.
+    """
+
+    default_priority = 620
+
+    autofootnote_labels = None
+    """Keep track of unlabeled autonumbered footnotes."""
+
+    symbols = [
+          # Entries 1-4 and 6 below are from section 12.51 of
+          # The Chicago Manual of Style, 14th edition.
+          '*',                          # asterisk/star
+          u'\u2020',                    # dagger &dagger;
+          u'\u2021',                    # double dagger &Dagger;
+          u'\u00A7',                    # section mark &sect;
+          u'\u00B6',                    # paragraph mark (pilcrow) &para;
+                                        # (parallels ['||'] in CMoS)
+          '#',                          # number sign
+          # The entries below were chosen arbitrarily.
+          u'\u2660',                    # spade suit &spades;
+          u'\u2665',                    # heart suit &hearts;
+          u'\u2666',                    # diamond suit &diams;
+          u'\u2663',                    # club suit &clubs;
+          ]
+
+    def apply(self):
+        self.autofootnote_labels = []
+        startnum = self.document.autofootnote_start
+        self.document.autofootnote_start = self.number_footnotes(startnum)
+        self.number_footnote_references(startnum)
+        self.symbolize_footnotes()
+        self.resolve_footnotes_and_citations()
+
+    def number_footnotes(self, startnum):
+        """
+        Assign numbers to autonumbered footnotes.
+
+        For labeled autonumbered footnotes, copy the number over to
+        corresponding footnote references.
+        """
+        for footnote in self.document.autofootnotes:
+            while 1:
+                label = str(startnum)
+                startnum += 1
+                if not self.document.nameids.has_key(label):
+                    break
+            footnote.insert(0, nodes.label('', label))
+            for name in footnote['names']:
+                for ref in self.document.footnote_refs.get(name, []):
+                    ref += nodes.Text(label)
+                    ref.delattr('refname')
+                    assert len(footnote['ids']) == len(ref['ids']) == 1
+                    ref['refid'] = footnote['ids'][0]
+                    footnote.add_backref(ref['ids'][0])
+                    self.document.note_refid(ref)
+                    ref.resolved = 1
+            if not footnote['names'] and not footnote['dupnames']:
+                footnote['names'].append(label)
+                self.document.note_explicit_target(footnote, footnote)
+                self.autofootnote_labels.append(label)
+        return startnum
+
+    def number_footnote_references(self, startnum):
+        """Assign numbers to autonumbered footnote references."""
+        i = 0
+        for ref in self.document.autofootnote_refs:
+            if ref.resolved or ref.hasattr('refid'):
+                continue
+            try:
+                label = self.autofootnote_labels[i]
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many autonumbered footnote references: only %s '
+                      'corresponding footnotes available.'
+                      % len(self.autofootnote_labels), base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.autofootnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refname'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            ref += nodes.Text(label)
+            id = self.document.nameids[label]
+            footnote = self.document.ids[id]
+            ref['refid'] = id
+            self.document.note_refid(ref)
+            assert len(ref['ids']) == 1
+            footnote.add_backref(ref['ids'][0])
+            ref.resolved = 1
+            i += 1
+
+    def symbolize_footnotes(self):
+        """Add symbols indexes to "[*]"-style footnotes and references."""
+        labels = []
+        for footnote in self.document.symbol_footnotes:
+            reps, index = divmod(self.document.symbol_footnote_start,
+                                 len(self.symbols))
+            labeltext = self.symbols[index] * (reps + 1)
+            labels.append(labeltext)
+            footnote.insert(0, nodes.label('', labeltext))
+            self.document.symbol_footnote_start += 1
+            self.document.set_id(footnote)
+        i = 0
+        for ref in self.document.symbol_footnote_refs:
+            try:
+                ref += nodes.Text(labels[i])
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many symbol footnote references: only %s '
+                      'corresponding footnotes available.' % len(labels),
+                      base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.symbol_footnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refid'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            footnote = self.document.symbol_footnotes[i]
+            assert len(footnote['ids']) == 1
+            ref['refid'] = footnote['ids'][0]
+            self.document.note_refid(ref)
+            footnote.add_backref(ref['ids'][0])
+            i += 1
+
+    def resolve_footnotes_and_citations(self):
+        """
+        Link manually-labeled footnotes and citations to/from their
+        references.
+        """
+        for footnote in self.document.footnotes:
+            for label in footnote['names']:
+                if self.document.footnote_refs.has_key(label):
+                    reflist = self.document.footnote_refs[label]
+                    self.resolve_references(footnote, reflist)
+        for citation in self.document.citations:
+            for label in citation['names']:
+                if self.document.citation_refs.has_key(label):
+                    reflist = self.document.citation_refs[label]
+                    self.resolve_references(citation, reflist)
+
+    def resolve_references(self, note, reflist):
+        assert len(note['ids']) == 1
+        id = note['ids'][0]
+        for ref in reflist:
+            if ref.resolved:
+                continue
+            ref.delattr('refname')
+            ref['refid'] = id
+            assert len(ref['ids']) == 1
+            note.add_backref(ref['ids'][0])
+            ref.resolved = 1
+        note.resolved = 1
+
+
+class CircularSubstitutionDefinitionError(Exception): pass
+
+
+class Substitutions(Transform):
+
+    """
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                The
+                <substitution_reference refname="biohazard">
+                    biohazard
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+
+    The ``substitution_reference`` will simply be replaced by the
+    contents of the corresponding ``substitution_definition``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                The
+                <image alt="biohazard" uri="biohazard.png">
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+    """
+
+    default_priority = 220
+    """The Substitutions transform has to be applied very early, before
+    `docutils.tranforms.frontmatter.DocTitle` and others."""
+
+    def apply(self):
+        defs = self.document.substitution_defs
+        normed = self.document.substitution_names
+        subreflist = self.document.traverse(nodes.substitution_reference)
+        nested = {}
+        for ref in subreflist:
+            refname = ref['refname']
+            key = None
+            if defs.has_key(refname):
+                key = refname
+            else:
+                normed_name = refname.lower()
+                if normed.has_key(normed_name):
+                    key = normed[normed_name]
+            if key is None:
+                msg = self.document.reporter.error(
+                      'Undefined substitution referenced: "%s".'
+                      % refname, base_node=ref)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            else:
+                subdef = defs[key]
+                parent = ref.parent
+                index = parent.index(ref)
+                if  (subdef.attributes.has_key('ltrim')
+                     or subdef.attributes.has_key('trim')):
+                    if index > 0 and isinstance(parent[index - 1],
+                                                nodes.Text):
+                        parent.replace(parent[index - 1],
+                                       parent[index - 1].rstrip())
+                if  (subdef.attributes.has_key('rtrim')
+                     or subdef.attributes.has_key('trim')):
+                    if  (len(parent) > index + 1
+                         and isinstance(parent[index + 1], nodes.Text)):
+                        parent.replace(parent[index + 1],
+                                       parent[index + 1].lstrip())
+                subdef_copy = subdef.deepcopy()
+                try:
+                    # Take care of nested substitution references:
+                    for nested_ref in subdef_copy.traverse(
+                          nodes.substitution_reference):
+                        nested_name = normed[nested_ref['refname'].lower()]
+                        if nested_name in nested.setdefault(nested_name, []):
+                            raise CircularSubstitutionDefinitionError
+                        else:
+                            nested[nested_name].append(key)
+                            subreflist.append(nested_ref)
+                except CircularSubstitutionDefinitionError:
+                    parent = ref.parent
+                    if isinstance(parent, nodes.substitution_definition):
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition detected:',
+                            nodes.literal_block(parent.rawsource,
+                                                parent.rawsource),
+                            line=parent.line, base_node=parent)
+                        parent.replace_self(msg)
+                    else:
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition referenced: "%s".'
+                            % refname, base_node=ref)
+                        msgid = self.document.set_id(msg)
+                        prb = nodes.problematic(
+                            ref.rawsource, ref.rawsource, refid=msgid)
+                        prbid = self.document.set_id(prb)
+                        msg.add_backref(prbid)
+                        ref.replace_self(prb)
+                else:
+                    ref.replace_self(subdef_copy.children)
+
+
+class TargetNotes(Transform):
+
+    """
+    Creates a footnote for each external target in the text, and corresponding
+    footnote references after each reference.
+    """
+
+    default_priority = 540
+    """The TargetNotes transform has to be applied after `IndirectHyperlinks`
+    but before `Footnotes`."""
+
+
+    def __init__(self, document, startnode):
+        Transform.__init__(self, document, startnode=startnode)
+
+        self.classes = startnode.details.get('class', [])
+
+    def apply(self):
+        notes = {}
+        nodelist = []
+        for target in self.document.traverse(nodes.target):
+            # Only external targets.
+            if not target.hasattr('refuri'):
+                continue
+            names = target['names']
+            refs = []
+            for name in names:
+                refs.extend(self.document.refnames.get(name, []))
+            if not refs:
+                continue
+            footnote = self.make_target_footnote(target['refuri'], refs,
+                                                 notes)
+            if not notes.has_key(target['refuri']):
+                notes[target['refuri']] = footnote
+                nodelist.append(footnote)
+        # Take care of anonymous references.
+        for ref in self.document.traverse(nodes.reference):
+            if not ref.get('anonymous'):
+                continue
+            if ref.hasattr('refuri'):
+                footnote = self.make_target_footnote(ref['refuri'], [ref],
+                                                     notes)
+                if not notes.has_key(ref['refuri']):
+                    notes[ref['refuri']] = footnote
+                    nodelist.append(footnote)
+        self.startnode.replace_self(nodelist)
+
+    def make_target_footnote(self, refuri, refs, notes):
+        if notes.has_key(refuri):  # duplicate?
+            footnote = notes[refuri]
+            assert len(footnote['names']) == 1
+            footnote_name = footnote['names'][0]
+        else:                           # original
+            footnote = nodes.footnote()
+            footnote_id = self.document.set_id(footnote)
+            # Use uppercase letters and a colon; they can't be
+            # produced inside names by the parser.
+            footnote_name = 'TARGET_NOTE: ' + footnote_id
+            footnote['auto'] = 1
+            footnote['names'] = [footnote_name]
+            footnote_paragraph = nodes.paragraph()
+            footnote_paragraph += nodes.reference('', refuri, refuri=refuri)
+            footnote += footnote_paragraph
+            self.document.note_autofootnote(footnote)
+            self.document.note_explicit_target(footnote, footnote)
+        for ref in refs:
+            if isinstance(ref, nodes.target):
+                continue
+            refnode = nodes.footnote_reference(
+                refname=footnote_name, auto=1)
+            refnode['classes'] += self.classes
+            self.document.note_autofootnote_ref(refnode)
+            self.document.note_footnote_ref(refnode)
+            index = ref.parent.index(ref) + 1
+            reflist = [refnode]
+            if not utils.get_trim_footnote_ref_space(self.document.settings):
+                if self.classes:
+                    reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
+                else:
+                    reflist.insert(0, nodes.Text(' '))
+            ref.parent.insert(index, reflist)
+        return footnote
+
+
+class DanglingReferences(Transform):
+
+    """
+    Check for dangling references (incl. footnote & citation) and for
+    unreferenced targets.
+    """
+
+    default_priority = 850
+
+    def apply(self):
+        visitor = DanglingReferencesVisitor(
+            self.document,
+            self.document.transformer.unknown_reference_resolvers)
+        self.document.walk(visitor)
+        # *After* resolving all references, check for unreferenced
+        # targets:
+        for target in self.document.traverse(nodes.target):
+            if not target.referenced:
+                if target.get('anonymous'):
+                    # If we have unreferenced anonymous targets, there
+                    # is already an error message about anonymous
+                    # hyperlink mismatch; no need to generate another
+                    # message.
+                    continue
+                if target['names']:
+                    naming = target['names'][0]
+                elif target['ids']:
+                    naming = target['ids'][0]
+                else:
+                    # Hack: Propagated targets always have their refid
+                    # attribute set.
+                    naming = target['refid']
+                self.document.reporter.info(
+                    'Hyperlink target "%s" is not referenced.'
+                    % naming, base_node=target)
+
+
+class DanglingReferencesVisitor(nodes.SparseNodeVisitor):
+    
+    def __init__(self, document, unknown_reference_resolvers):
+        nodes.SparseNodeVisitor.__init__(self, document)
+        self.document = document
+        self.unknown_reference_resolvers = unknown_reference_resolvers
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        if node.resolved or not node.hasattr('refname'):
+            return
+        refname = node['refname']
+        id = self.document.nameids.get(refname)
+        if id is None:
+            for resolver_function in self.unknown_reference_resolvers:
+                if resolver_function(node):
+                    break
+            else:
+                if self.document.nameids.has_key(refname):
+                    msg = self.document.reporter.error(
+                        'Duplicate target name, cannot be used as a unique '
+                        'reference: "%s".' % (node['refname']), base_node=node)
+                else:
+                    msg = self.document.reporter.error(
+                        'Unknown target name: "%s".' % (node['refname']),
+                        base_node=node)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      node.rawsource, node.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                node.replace_self(prb)
+        else:
+            del node['refname']
+            node['refid'] = id
+            self.document.ids[id].note_referenced_by(id=id)
+            node.resolved = 1
+
+    visit_footnote_reference = visit_citation_reference = visit_reference
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/universal.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,203 @@
+# $Id: universal.py 4913 2007-02-12 04:05:20Z goodger $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms needed by most or all documents:
+
+- `Decorations`: Generate a document's header & footer.
+- `Messages`: Placement of system messages stored in
+  `nodes.document.transform_messages`.
+- `TestMessages`: Like `Messages`, used on test runs.
+- `FinalReferences`: Resolve remaining references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import sys
+import time
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class Decorations(Transform):
+
+    """
+    Populate a document's decoration element (header, footer).
+    """
+
+    default_priority = 820
+
+    def apply(self):
+        header_nodes = self.generate_header()
+        if header_nodes:
+            decoration = self.document.get_decoration()
+            header = decoration.get_header()
+            header.extend(header_nodes)
+        footer_nodes = self.generate_footer()
+        if footer_nodes:
+            decoration = self.document.get_decoration()
+            footer = decoration.get_footer()
+            footer.extend(footer_nodes)
+
+    def generate_header(self):
+        return None
+
+    def generate_footer(self):
+        # @@@ Text is hard-coded for now.
+        # Should be made dynamic (language-dependent).
+        settings = self.document.settings
+        if settings.generator or settings.datestamp or settings.source_link \
+               or settings.source_url:
+            text = []
+            if settings.source_link and settings._source \
+                   or settings.source_url:
+                if settings.source_url:
+                    source = settings.source_url
+                else:
+                    source = utils.relative_path(settings._destination,
+                                                 settings._source)
+                text.extend([
+                    nodes.reference('', 'View document source',
+                                    refuri=source),
+                    nodes.Text('.\n')])
+            if settings.datestamp:
+                datestamp = time.strftime(settings.datestamp, time.gmtime())
+                text.append(nodes.Text('Generated on: ' + datestamp + '.\n'))
+            if settings.generator:
+                text.extend([
+                    nodes.Text('Generated by '),
+                    nodes.reference('', 'Docutils', refuri=
+                                    'http://docutils.sourceforge.net/'),
+                    nodes.Text(' from '),
+                    nodes.reference('', 'reStructuredText', refuri='http://'
+                                    'docutils.sourceforge.net/rst.html'),
+                    nodes.Text(' source.\n')])
+            return [nodes.paragraph('', '', *text)]
+        else:
+            return None
+
+
+class ExposeInternals(Transform):
+
+    """
+    Expose internal attributes if ``expose_internals`` setting is set.
+    """
+
+    default_priority = 840
+
+    def not_Text(self, node):
+        return not isinstance(node, nodes.Text)
+
+    def apply(self):
+        if self.document.settings.expose_internals:
+            for node in self.document.traverse(self.not_Text):
+                for att in self.document.settings.expose_internals:
+                    value = getattr(node, att, None)
+                    if value is not None:
+                        node['internal:' + att] = value
+
+
+class Messages(Transform):
+
+    """
+    Place any system messages generated after parsing into a dedicated section
+    of the document.
+    """
+
+    default_priority = 860
+
+    def apply(self):
+        unfiltered = self.document.transform_messages
+        threshold = self.document.reporter.report_level
+        messages = []
+        for msg in unfiltered:
+            if msg['level'] >= threshold and not msg.parent:
+                messages.append(msg)
+        if messages:
+            section = nodes.section(classes=['system-messages'])
+            # @@@ get this from the language module?
+            section += nodes.title('', 'Docutils System Messages')
+            section += messages
+            self.document.transform_messages[:] = []
+            self.document += section
+
+
+class FilterMessages(Transform):
+
+    """
+    Remove system messages below verbosity threshold.
+    """
+
+    default_priority = 870
+
+    def apply(self):
+        for node in self.document.traverse(nodes.system_message):
+            if node['level'] < self.document.reporter.report_level:
+                node.parent.remove(node)
+
+
+class TestMessages(Transform):
+
+    """
+    Append all post-parse system messages to the end of the document.
+
+    Used for testing purposes.
+    """
+
+    default_priority = 880
+
+    def apply(self):
+        for msg in self.document.transform_messages:
+            if not msg.parent:
+                self.document += msg
+
+
+class StripComments(Transform):
+
+    """
+    Remove comment elements from the document tree (only if the
+    ``strip_comments`` setting is enabled).
+    """
+
+    default_priority = 740
+
+    def apply(self):
+        if self.document.settings.strip_comments:
+            for node in self.document.traverse(nodes.comment):
+                node.parent.remove(node)
+
+
+class StripClassesAndElements(Transform):
+
+    """
+    Remove from the document tree all elements with classes in
+    `self.document.settings.strip_elements_with_classes` and all "classes"
+    attribute values in `self.document.settings.strip_classes`.
+    """
+
+    default_priority = 750
+
+    def apply(self):
+        if not (self.document.settings.strip_elements_with_classes
+                or self.document.settings.strip_classes):
+            return
+        # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
+        self.strip_elements = dict(
+            [(key, None)
+             for key in (self.document.settings.strip_elements_with_classes
+                         or [])])
+        self.strip_classes = dict(
+            [(key, None) for key in (self.document.settings.strip_classes
+                                     or [])])
+        for node in self.document.traverse(self.check_classes):
+            node.parent.remove(node)
+
+    def check_classes(self, node):
+        if isinstance(node, nodes.Element):
+            for class_value in node['classes'][:]:
+                if class_value in self.strip_classes:
+                    node['classes'].remove(class_value)
+                if class_value in self.strip_elements:
+                    return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+# $Id: writer_aux.py 5174 2007-05-31 00:01:52Z wiemann $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Auxiliary transforms mainly to be used by Writer components.
+
+This module is called "writer_aux" because otherwise there would be
+conflicting imports like this one::
+
+    from docutils import writers
+    from docutils.transforms import writers
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils, languages
+from docutils.transforms import Transform
+
+
+class Compound(Transform):
+
+    """
+    Flatten all compound paragraphs.  For example, transform ::
+
+        <compound>
+            <paragraph>
+            <literal_block>
+            <paragraph>
+
+    into ::
+
+        <paragraph>
+        <literal_block classes="continued">
+        <paragraph classes="continued">
+    """
+
+    default_priority = 910
+
+    def apply(self):
+        for compound in self.document.traverse(nodes.compound):
+            first_child = 1
+            for child in compound:
+                if first_child:
+                    if not isinstance(child, nodes.Invisible):
+                        first_child = 0
+                else:
+                    child['classes'].append('continued')
+            # Substitute children for compound.
+            compound.replace_self(compound[:])
+
+
+class Admonitions(Transform):
+
+    """
+    Transform specific admonitions, like this:
+
+        <note>
+            <paragraph>
+                 Note contents ...
+
+    into generic admonitions, like this::
+
+        <admonition classes="note">
+            <title>
+                Note
+            <paragraph>
+                Note contents ...
+
+    The admonition title is localized.
+    """
+
+    default_priority = 920
+
+    def apply(self):
+        lcode = self.document.settings.language_code
+        language = languages.get_language(lcode)
+        for node in self.document.traverse(nodes.Admonition):
+            node_name = node.__class__.__name__
+            # Set class, so that we know what node this admonition came from.
+            node['classes'].append(node_name)
+            if not isinstance(node, nodes.admonition):
+                # Specific admonition.  Transform into a generic admonition.
+                admonition = nodes.admonition(node.rawsource, *node.children,
+                                              **node.attributes)
+                title = nodes.title('', language.labels[node_name])
+                admonition.insert(0, title)
+                node.replace_self(admonition)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/urischemes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,136 @@
+# $Id: urischemes.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+`schemes` is a dictionary with lowercase URI addressing schemes as
+keys and descriptions as values. It was compiled from the index at
+http://www.iana.org/assignments/uri-schemes (revised 2005-11-28)
+and an older list at http://www.w3.org/Addressing/schemes.html.
+"""
+
+# Many values are blank and should be filled in with useful descriptions.
+
+schemes = {
+      'about': 'provides information on Navigator',
+      'acap': 'Application Configuration Access Protocol; RFC 2244',
+      'addbook': "To add vCard entries to Communicator's Address Book",
+      'afp': 'Apple Filing Protocol',
+      'afs': 'Andrew File System global file names',
+      'aim': 'AOL Instant Messenger',
+      'callto': 'for NetMeeting links',
+      'castanet': 'Castanet Tuner URLs for Netcaster',
+      'chttp': 'cached HTTP supported by RealPlayer',
+      'cid': 'content identifier; RFC 2392',
+      'crid': 'TV-Anytime Content Reference Identifier; RFC 4078',
+      'data': ('allows inclusion of small data items as "immediate" data; '
+               'RFC 2397'),
+      'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518',
+      'dict': 'dictionary service protocol; RFC 2229',
+      'dns': 'Domain Name System resources',
+      'eid': ('External ID; non-URL data; general escape mechanism to allow '
+              'access to information for applications that are too '
+              'specialized to justify their own schemes'),
+      'fax': ('a connection to a terminal that can handle telefaxes '
+              '(facsimiles); RFC 2806'),
+      'feed' : 'NetNewsWire feed',
+      'file': 'Host-specific file names; RFC 1738',
+      'finger': '',
+      'freenet': '',
+      'ftp': 'File Transfer Protocol; RFC 1738',
+      'go': 'go; RFC 3368',
+      'gopher': 'The Gopher Protocol',
+      'gsm-sms': ('Global System for Mobile Communications Short Message '
+                  'Service'),
+      'h323': ('video (audiovisual) communication on local area networks; '
+               'RFC 3508'),
+      'h324': ('video and audio communications over low bitrate connections '
+               'such as POTS modem connections'),
+      'hdl': 'CNRI handle system',
+      'hnews': 'an HTTP-tunneling variant of the NNTP news protocol',
+      'http': 'Hypertext Transfer Protocol; RFC 2616',
+      'https': 'HTTP over SSL; RFC 2818',
+      'hydra': 'SubEthaEdit URI.  See http://www.codingmonkeys.de/subethaedit.',
+      'iioploc': 'Internet Inter-ORB Protocol Location?',
+      'ilu': 'Inter-Language Unification',
+      'im': 'Instant Messaging; RFC 3860',
+      'imap': 'Internet Message Access Protocol; RFC 2192',
+      'info': 'Information Assets with Identifiers in Public Namespaces',
+      'ior': 'CORBA interoperable object reference',
+      'ipp': 'Internet Printing Protocol; RFC 3510',
+      'irc': 'Internet Relay Chat',
+      'iris.beep': 'iris.beep; RFC 3983',
+      'iseek' : 'See www.ambrosiasw.com;  a little util for OS X.',
+      'jar': 'Java archive',
+      'javascript': ('JavaScript code; evaluates the expression after the '
+                     'colon'),
+      'jdbc': 'JDBC connection URI.',
+      'ldap': 'Lightweight Directory Access Protocol',
+      'lifn': '',
+      'livescript': '',
+      'lrq': '',
+      'mailbox': 'Mail folder access',
+      'mailserver': 'Access to data available from mail servers',
+      'mailto': 'Electronic mail address; RFC 2368',
+      'md5': '',
+      'mid': 'message identifier; RFC 2392',
+      'mocha': '',
+      'modem': ('a connection to a terminal that can handle incoming data '
+                'calls; RFC 2806'),
+      'mtqp': 'Message Tracking Query Protocol; RFC 3887',
+      'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656',
+      'news': 'USENET news; RFC 1738',
+      'nfs': 'Network File System protocol; RFC 2224',
+      'nntp': 'USENET news using NNTP access; RFC 1738',
+      'opaquelocktoken': 'RFC 2518',
+      'phone': '',
+      'pop': 'Post Office Protocol; RFC 2384',
+      'pop3': 'Post Office Protocol v3',
+      'pres': 'Presence; RFC 3859',
+      'printer': '',
+      'prospero': 'Prospero Directory Service; RFC 4157',
+      'rdar' : ('URLs found in Darwin source '
+                '(http://www.opensource.apple.com/darwinsource/).'),
+      'res': '',
+      'rtsp': 'real time streaming protocol; RFC 2326',
+      'rvp': '',
+      'rwhois': '',
+      'rx': 'Remote Execution',
+      'sdp': '',
+      'service': 'service location; RFC 2609',
+      'shttp': 'secure hypertext transfer protocol',
+      'sip': 'Session Initiation Protocol; RFC 3261',
+      'sips': 'secure session intitiaion protocol; RFC 3261',
+      'smb': 'SAMBA filesystems.',
+      'snews': 'For NNTP postings via SSL',
+      'snmp': 'Simple Network Management Protocol; RFC 4088',
+      'soap.beep': 'RFC 3288',
+      'soap.beeps': 'RFC 3288',
+      'ssh': 'Reference to interactive sessions via ssh.',
+      't120': 'real time data conferencing (audiographics)',
+      'tag': 'RFC 4151',
+      'tcp': '',
+      'tel': ('a connection to a terminal that handles normal voice '
+              'telephone calls, a voice mailbox or another voice messaging '
+              'system or a service that can be operated using DTMF tones; '
+              'RFC 2806.'),
+      'telephone': 'telephone',
+      'telnet': 'Reference to interactive sessions; RFC 4248',
+      'tftp': 'Trivial File Transfer Protocol; RFC 3617',
+      'tip': 'Transaction Internet Protocol; RFC 2371',
+      'tn3270': 'Interactive 3270 emulation sessions',
+      'tv': '',
+      'urn': 'Uniform Resource Name; RFC 2141',
+      'uuid': '',
+      'vemmi': 'versatile multimedia interface; RFC 2122',
+      'videotex': '',
+      'view-source': 'displays HTML code that was generated with JavaScript',
+      'wais': 'Wide Area Information Servers; RFC 4156',
+      'whodp': '',
+      'whois++': 'Distributed directory service.',
+      'x-man-page': ('Opens man page in Terminal.app on OS X '
+                     '(see macosxhints.com)'),
+      'xmlrpc.beep': 'RFC 3529',
+      'xmlrpc.beeps': 'RFC 3529',
+      'z39.50r': 'Z39.50 Retrieval; RFC 2056',
+      'z39.50s': 'Z39.50 Session; RFC 2056',}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/utils.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,593 @@
+# $Id: utils.py 5040 2007-04-03 17:41:59Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous utilities for the documentation utilities.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import os.path
+import types
+import warnings
+import unicodedata
+from types import StringType, UnicodeType
+from docutils import ApplicationError, DataError
+from docutils import nodes
+
+
+class SystemMessage(ApplicationError):
+
+    def __init__(self, system_message, level):
+        Exception.__init__(self, system_message.astext())
+        self.level = level
+
+
+class SystemMessagePropagation(ApplicationError): pass
+
+
+class Reporter:
+
+    """
+    Info/warning/error reporter and ``system_message`` element generator.
+
+    Five levels of system messages are defined, along with corresponding
+    methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`.
+
+    There is typically one Reporter object per process.  A Reporter object is
+    instantiated with thresholds for reporting (generating warnings) and
+    halting processing (raising exceptions), a switch to turn debug output on
+    or off, and an I/O stream for warnings.  These are stored as instance
+    attributes.
+
+    When a system message is generated, its level is compared to the stored
+    thresholds, and a warning or error is generated as appropriate.  Debug
+    messages are produced iff the stored debug switch is on, independently of
+    other thresholds.  Message output is sent to the stored warning stream if
+    not set to ''.
+
+    The Reporter class also employs a modified form of the "Observer" pattern
+    [GoF95]_ to track system messages generated.  The `attach_observer` method
+    should be called before parsing, with a bound method or function which
+    accepts system messages.  The observer can be removed with
+    `detach_observer`, and another added in its place.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    levels = 'DEBUG INFO WARNING ERROR SEVERE'.split()
+    """List of names for system message levels, indexed by level."""
+
+    # system message level constants:
+    (DEBUG_LEVEL,
+     INFO_LEVEL,
+     WARNING_LEVEL,
+     ERROR_LEVEL,
+     SEVERE_LEVEL) = range(5)
+
+    def __init__(self, source, report_level, halt_level, stream=None,
+                 debug=0, encoding='ascii', error_handler='replace'):
+        """
+        :Parameters:
+            - `source`: The path to or description of the source data.
+            - `report_level`: The level at or above which warning output will
+              be sent to `stream`.
+            - `halt_level`: The level at or above which `SystemMessage`
+              exceptions will be raised, halting execution.
+            - `debug`: Show debug (level=0) system messages?
+            - `stream`: Where warning output is sent.  Can be file-like (has a
+              ``.write`` method), a string (file name, opened for writing),
+              '' (empty string, for discarding all stream messages) or
+              `None` (implies `sys.stderr`; default).
+            - `encoding`: The encoding for stderr output.
+            - `error_handler`: The error handler for stderr output encoding.
+        """
+
+        self.source = source
+        """The path to or description of the source data."""
+
+        self.encoding = encoding
+        """The character encoding for the stderr output."""
+
+        self.error_handler = error_handler
+        """The character encoding error handler."""
+
+        self.debug_flag = debug
+        """Show debug (level=0) system messages?"""
+
+        self.report_level = report_level
+        """The level at or above which warning output will be sent
+        to `self.stream`."""
+
+        self.halt_level = halt_level
+        """The level at or above which `SystemMessage` exceptions
+        will be raised, halting execution."""
+
+        if stream is None:
+            stream = sys.stderr
+        elif type(stream) in (StringType, UnicodeType):
+            # Leave stream untouched if it's ''.
+            if stream != '':
+                if type(stream) == StringType:
+                    stream = open(stream, 'w')
+                elif type(stream) == UnicodeType:
+                    stream = open(stream.encode(), 'w')
+
+        self.stream = stream
+        """Where warning output is sent."""
+
+        self.observers = []
+        """List of bound methods or functions to call with each system_message
+        created."""
+
+        self.max_level = -1
+        """The highest level system message generated so far."""
+
+    def set_conditions(self, category, report_level, halt_level,
+                       stream=None, debug=0):
+        warnings.warn('docutils.utils.Reporter.set_conditions deprecated; '
+                      'set attributes via configuration settings or directly',
+                      DeprecationWarning, stacklevel=2)
+        self.report_level = report_level
+        self.halt_level = halt_level
+        if stream is None:
+            stream = sys.stderr
+        self.stream = stream
+        self.debug_flag = debug
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes one
+        argument, a `nodes.system_message` instance.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self, message):
+        for observer in self.observers:
+            observer(message)
+
+    def system_message(self, level, message, *children, **kwargs):
+        """
+        Return a system_message object.
+
+        Raise an exception or generate a warning if appropriate.
+        """
+        attributes = kwargs.copy()
+        if kwargs.has_key('base_node'):
+            source, line = get_source_line(kwargs['base_node'])
+            del attributes['base_node']
+            if source is not None:
+                attributes.setdefault('source', source)
+            if line is not None:
+                attributes.setdefault('line', line)
+        attributes.setdefault('source', self.source)
+        msg = nodes.system_message(message, level=level,
+                                   type=self.levels[level],
+                                   *children, **attributes)
+        if self.stream and (level >= self.report_level
+                            or self.debug_flag and level == self.DEBUG_LEVEL):
+            msgtext = msg.astext().encode(self.encoding, self.error_handler)
+            print >>self.stream, msgtext
+        if level >= self.halt_level:
+            raise SystemMessage(msg, level)
+        if level > self.DEBUG_LEVEL or self.debug_flag:
+            self.notify_observers(msg)
+        self.max_level = max(level, self.max_level)
+        return msg
+
+    def debug(self, *args, **kwargs):
+        """
+        Level-0, "DEBUG": an internal reporting issue. Typically, there is no
+        effect on the processing. Level-0 system messages are handled
+        separately from the others.
+        """
+        if self.debug_flag:
+            return self.system_message(self.DEBUG_LEVEL, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        """
+        Level-1, "INFO": a minor issue that can be ignored. Typically there is
+        no effect on processing, and level-1 system messages are not reported.
+        """
+        return self.system_message(self.INFO_LEVEL, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        """
+        Level-2, "WARNING": an issue that should be addressed. If ignored,
+        there may be unpredictable problems with the output.
+        """
+        return self.system_message(self.WARNING_LEVEL, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        """
+        Level-3, "ERROR": an error that should be addressed. If ignored, the
+        output will contain errors.
+        """
+        return self.system_message(self.ERROR_LEVEL, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        """
+        Level-4, "SEVERE": a severe error that must be addressed. If ignored,
+        the output will contain severe errors. Typically level-4 system
+        messages are turned into exceptions which halt processing.
+        """
+        return self.system_message(self.SEVERE_LEVEL, *args, **kwargs)
+
+
+class ExtensionOptionError(DataError): pass
+class BadOptionError(ExtensionOptionError): pass
+class BadOptionDataError(ExtensionOptionError): pass
+class DuplicateOptionError(ExtensionOptionError): pass
+
+
+def extract_extension_options(field_list, options_spec):
+    """
+    Return a dictionary mapping extension option names to converted values.
+
+    :Parameters:
+        - `field_list`: A flat field list without field arguments, where each
+          field body consists of a single paragraph only.
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `ValueError` for invalid option values (raised by the conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+        - `DuplicateOptionError` for duplicate options.
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = extract_options(field_list)
+    option_dict = assemble_option_dict(option_list, options_spec)
+    return option_dict
+
+def extract_options(field_list):
+    """
+    Return a list of option (name, value) pairs from field names & bodies.
+
+    :Parameter:
+        `field_list`: A flat field list, where each field name is a single
+        word and each field body consists of a single paragraph only.
+
+    :Exceptions:
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = []
+    for field in field_list:
+        if len(field[0].astext().split()) != 1:
+            raise BadOptionError(
+                'extension option field name may not contain multiple words')
+        name = str(field[0].astext().lower())
+        body = field[1]
+        if len(body) == 0:
+            data = None
+        elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \
+              or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text):
+            raise BadOptionDataError(
+                  'extension option field body may contain\n'
+                  'a single paragraph only (option "%s")' % name)
+        else:
+            data = body[0][0].astext()
+        option_list.append((name, data))
+    return option_list
+
+def assemble_option_dict(option_list, options_spec):
+    """
+    Return a mapping of option names to values.
+
+    :Parameters:
+        - `option_list`: A list of (name, value) pairs (the output of
+          `extract_options()`).
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `DuplicateOptionError` for duplicate options.
+        - `ValueError` for invalid option values (raised by conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+    """
+    options = {}
+    for name, value in option_list:
+        convertor = options_spec[name]  # raises KeyError if unknown
+        if convertor is None:
+            raise KeyError(name)        # or if explicitly disabled
+        if options.has_key(name):
+            raise DuplicateOptionError('duplicate option "%s"' % name)
+        try:
+            options[name] = convertor(value)
+        except (ValueError, TypeError), detail:
+            raise detail.__class__('(option: "%s"; value: %r)\n%s'
+                                   % (name, value, ' '.join(detail.args)))
+    return options
+
+
+class NameValueError(DataError): pass
+
+
+def extract_name_value(line):
+    """
+    Return a list of (name, value) from a line of the form "name=value ...".
+
+    :Exception:
+        `NameValueError` for invalid input (missing name, missing data, bad
+        quotes, etc.).
+    """
+    attlist = []
+    while line:
+        equals = line.find('=')
+        if equals == -1:
+            raise NameValueError('missing "="')
+        attname = line[:equals].strip()
+        if equals == 0 or not attname:
+            raise NameValueError(
+                  'missing attribute name before "="')
+        line = line[equals+1:].lstrip()
+        if not line:
+            raise NameValueError(
+                  'missing value after "%s="' % attname)
+        if line[0] in '\'"':
+            endquote = line.find(line[0], 1)
+            if endquote == -1:
+                raise NameValueError(
+                      'attribute "%s" missing end quote (%s)'
+                      % (attname, line[0]))
+            if len(line) > endquote + 1 and line[endquote + 1].strip():
+                raise NameValueError(
+                      'attribute "%s" end quote (%s) not followed by '
+                      'whitespace' % (attname, line[0]))
+            data = line[1:endquote]
+            line = line[endquote+1:].lstrip()
+        else:
+            space = line.find(' ')
+            if space == -1:
+                data = line
+                line = ''
+            else:
+                data = line[:space]
+                line = line[space+1:].lstrip()
+        attlist.append((attname.lower(), data))
+    return attlist
+
+def new_reporter(source_path, settings):
+    """
+    Return a new Reporter object.
+
+    :Parameters:
+        `source` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.
+    """
+    reporter = Reporter(
+        source_path, settings.report_level, settings.halt_level,
+        stream=settings.warning_stream, debug=settings.debug,
+        encoding=settings.error_encoding,
+        error_handler=settings.error_encoding_error_handler)
+    return reporter
+
+def new_document(source_path, settings=None):
+    """
+    Return a new empty document object.
+
+    :Parameters:
+        `source_path` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.  If none provided, a default set will be used.
+    """
+    from docutils import frontend
+    if settings is None:
+        settings = frontend.OptionParser().get_default_values()
+    reporter = new_reporter(source_path, settings)
+    document = nodes.document(settings, reporter, source=source_path)
+    document.note_source(source_path, -1)
+    return document
+
+def clean_rcs_keywords(paragraph, keyword_substitutions):
+    if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text):
+        textnode = paragraph[0]
+        for pattern, substitution in keyword_substitutions:
+            match = pattern.search(textnode.data)
+            if match:
+                textnode.data = pattern.sub(substitution, textnode.data)
+                return
+
+def relative_path(source, target):
+    """
+    Build and return a path to `target`, relative to `source` (both files).
+
+    If there is no common prefix, return the absolute path to `target`.
+    """
+    source_parts = os.path.abspath(source or 'dummy_file').split(os.sep)
+    target_parts = os.path.abspath(target).split(os.sep)
+    # Check first 2 parts because '/dir'.split('/') == ['', 'dir']:
+    if source_parts[:2] != target_parts[:2]:
+        # Nothing in common between paths.
+        # Return absolute path, using '/' for URLs:
+        return '/'.join(target_parts)
+    source_parts.reverse()
+    target_parts.reverse()
+    while (source_parts and target_parts
+           and source_parts[-1] == target_parts[-1]):
+        # Remove path components in common:
+        source_parts.pop()
+        target_parts.pop()
+    target_parts.reverse()
+    parts = ['..'] * (len(source_parts) - 1) + target_parts
+    return '/'.join(parts)
+
+def get_stylesheet_reference(settings, relative_to=None):
+    """
+    Retrieve a stylesheet reference from the settings object.
+    """
+    if settings.stylesheet_path:
+        assert not settings.stylesheet, \
+               'stylesheet and stylesheet_path are mutually exclusive.'
+        if relative_to == None:
+            relative_to = settings._destination
+        return relative_path(relative_to, settings.stylesheet_path)
+    else:
+        return settings.stylesheet
+
+def get_trim_footnote_ref_space(settings):
+    """
+    Return whether or not to trim footnote space.
+
+    If trim_footnote_reference_space is not None, return it.
+
+    If trim_footnote_reference_space is None, return False unless the
+    footnote reference style is 'superscript'.
+    """
+    if settings.trim_footnote_reference_space is None:
+        return hasattr(settings, 'footnote_references') and \
+               settings.footnote_references == 'superscript'
+    else:
+        return settings.trim_footnote_reference_space
+
+def get_source_line(node):
+    """
+    Return the "source" and "line" attributes from the `node` given or from
+    its closest ancestor.
+    """
+    while node:
+        if node.source or node.line:
+            return node.source, node.line
+        node = node.parent
+    return None, None
+
+def escape2null(text):
+    """Return a string with escape-backslashes converted to nulls."""
+    parts = []
+    start = 0
+    while 1:
+        found = text.find('\\', start)
+        if found == -1:
+            parts.append(text[start:])
+            return ''.join(parts)
+        parts.append(text[start:found])
+        parts.append('\x00' + text[found+1:found+2])
+        start = found + 2               # skip character after escape
+
+def unescape(text, restore_backslashes=0):
+    """
+    Return a string with nulls removed or restored to backslashes.
+    Backslash-escaped spaces are also removed.
+    """
+    if restore_backslashes:
+        return text.replace('\x00', '\\')
+    else:
+        for sep in ['\x00 ', '\x00\n', '\x00']:
+            text = ''.join(text.split(sep))
+        return text
+
+east_asian_widths = {'W': 2,   # Wide
+                     'F': 2,   # Full-width (wide)
+                     'Na': 1,  # Narrow
+                     'H': 1,   # Half-width (narrow)
+                     'N': 1,   # Neutral (not East Asian, treated as narrow)
+                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
+                               # narrow otherwise, but that doesn't work)
+"""Mapping of result codes from `unicodedata.east_asian_width()` to character
+column widths."""
+
+def east_asian_column_width(text):
+    if isinstance(text, types.UnicodeType):
+        total = 0
+        for c in text:
+            total += east_asian_widths[unicodedata.east_asian_width(c)]
+        return total
+    else:
+        return len(text)
+
+if hasattr(unicodedata, 'east_asian_width'):
+    column_width = east_asian_column_width
+else:
+    column_width = len
+
+def uniq(L):
+     r = []
+     for item in L:
+         if not item in r:
+             r.append(item)
+     return r
+
+
+class DependencyList:
+
+    """
+    List of dependencies, with file recording support.
+
+    Note that the output file is not automatically closed.  You have
+    to explicitly call the close() method.
+    """
+
+    def __init__(self, output_file=None, dependencies=[]):
+        """
+        Initialize the dependency list, automatically setting the
+        output file to `output_file` (see `set_output()`) and adding
+        all supplied dependencies.
+        """
+        self.set_output(output_file)
+        for i in dependencies:
+            self.add(i)
+
+    def set_output(self, output_file):
+        """
+        Set the output file and clear the list of already added
+        dependencies.
+
+        `output_file` must be a string.  The specified file is
+        immediately overwritten.
+
+        If output_file is '-', the output will be written to stdout.
+        If it is None, no file output is done when calling add().
+        """
+        self.list = []
+        if output_file == '-':
+            self.file = sys.stdout
+        elif output_file:
+            self.file = open(output_file, 'w')
+        else:
+            self.file = None
+
+    def add(self, filename):
+        """
+        If the dependency `filename` has not already been added,
+        append it to self.list and print it to self.file if self.file
+        is not None.
+        """
+        if not filename in self.list:
+            self.list.append(filename)
+            if self.file is not None:
+                print >>self.file, filename
+
+    def close(self):
+        """
+        Close the output file.
+        """
+        self.file.close()
+        self.file = None
+
+    def __repr__(self):
+        if self.file:
+            output_file = self.file.name
+        else:
+            output_file = None
+        return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+# $Id: __init__.py 4913 2007-02-12 04:05:20Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Writer modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import os.path
+import docutils
+from docutils import languages, Component
+from docutils.transforms import universal
+
+
+class Writer(Component):
+
+    """
+    Abstract base class for docutils Writers.
+
+    Each writer module or package must export a subclass also called 'Writer'.
+    Each writer must support all standard node types listed in
+    `docutils.nodes.node_class_names`.
+
+    The `write()` method is the main entry point.
+    """
+
+    component_type = 'writer'
+    config_section = 'writers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Messages,
+            universal.FilterMessages,
+            universal.StripClassesAndElements,]
+
+    document = None
+    """The document to write (Docutils doctree); set by `write`."""
+
+    output = None
+    """Final translated form of `document` (Unicode string for text, binary
+    string for other forms); set by `translate`."""
+
+    language = None
+    """Language module for the document; set by `write`."""
+
+    destination = None
+    """`docutils.io` Output object; where to write the document.
+    Set by `write`."""
+
+    def __init__(self):
+
+        # Currently only used by HTML writer for output fragments:
+        self.parts = {}
+        """Mapping of document part names to fragments of `self.output`.
+        Values are Unicode strings; encoding is up to the client.  The 'whole'
+        key should contain the entire document output.
+        """
+
+    def write(self, document, destination):
+        """
+        Process a document into its final form.
+
+        Translate `document` (a Docutils document tree) into the Writer's
+        native format, and write it out to its `destination` (a
+        `docutils.io.Output` subclass object).
+
+        Normally not overridden or extended in subclasses.
+        """
+        self.document = document
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.destination = destination
+        self.translate()
+        output = self.destination.write(self.output)
+        return output
+
+    def translate(self):
+        """
+        Do final translation of `self.document` into `self.output`.  Called
+        from `write`.  Override in subclasses.
+
+        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
+        combination with a call to `docutils.nodes.Node.walk()` or
+        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
+        support all standard elements (listed in
+        `docutils.nodes.node_class_names`) and possibly non-standard elements
+        used by the current Reader as well.
+        """
+        raise NotImplementedError('subclass must override this method')
+
+    def assemble_parts(self):
+        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
+        self.parts['whole'] = self.output
+        self.parts['encoding'] = self.document.settings.output_encoding
+        self.parts['version'] = docutils.__version__
+
+
+class UnfilteredWriter(Writer):
+
+    """
+    A writer that passes the document tree on unchanged (e.g. a
+    serializer.)
+
+    Documents written by UnfilteredWriters are typically reused at a
+    later date using a subclass of `readers.ReReader`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  When the document is reused
+        # later, the then-used writer will add the appropriate
+        # transforms.
+        return Component.get_transforms(self)
+
+
+_writer_aliases = {
+      'html': 'html4css1',
+      'latex': 'latex2e',
+      'pprint': 'pseudoxml',
+      'pformat': 'pseudoxml',
+      'pdf': 'rlpdf',
+      'xml': 'docutils_xml',
+      's5': 's5_html'}
+
+def get_writer_class(writer_name):
+    """Return the Writer class from the `writer_name` module."""
+    writer_name = writer_name.lower()
+    if _writer_aliases.has_key(writer_name):
+        writer_name = _writer_aliases[writer_name]
+    module = __import__(writer_name, globals(), locals())
+    return module.Writer
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+# $Id: docutils_xml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes Docutils XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils
+from docutils import frontend, writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('xml',)
+    """Formats this writer supports."""
+
+    settings_spec = (
+        '"Docutils XML" Writer Options',
+        'Warning: the --newlines and --indents options may adversely affect '
+        'whitespace; use them only for reading convenience.',
+        (('Generate XML with newlines before and after tags.',
+          ['--newlines'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Generate XML with indents and newlines.',
+          ['--indents'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Omit the DOCTYPE declaration.',
+          ['--no-doctype'],
+          {'dest': 'doctype_declaration', 'default': 1,
+           'action': 'store_false', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    config_section = 'docutils_xml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    xml_declaration = '<?xml version="1.0" encoding="%s"?>\n'
+    #xml_stylesheet = '<?xml-stylesheet type="text/xsl" href="%s"?>\n'
+    doctype = (
+        '<!DOCTYPE document PUBLIC'
+        ' "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML"'
+        ' "http://docutils.sourceforge.net/docs/ref/docutils.dtd">\n')
+    generator = '<!-- Generated by Docutils %s -->\n'
+
+    def translate(self):
+        settings = self.document.settings
+        indent = newline = ''
+        if settings.newlines:
+            newline = '\n'
+        if settings.indents:
+            newline = '\n'
+            indent = '    '
+        output_prefix = []
+        if settings.xml_declaration:
+            output_prefix.append(
+                self.xml_declaration % settings.output_encoding)
+        if settings.doctype_declaration:
+            output_prefix.append(self.doctype)
+        output_prefix.append(self.generator % docutils.__version__)
+        docnode = self.document.asdom().childNodes[0]
+        self.output = (''.join(output_prefix)
+                       + docnode.toprettyxml(indent, newline))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1538 @@
+# $Id: __init__.py 5314 2007-07-05 12:45:43Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple HyperText Markup Language document tree Writer.
+
+The output conforms to the XHTML version 1.0 Transitional DTD
+(*almost* strict).  The output contains a minimum of formatting
+information.  The cascading style sheet "html4css1.css" is required
+for proper viewing with a modern graphical browser.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import time
+import re
+from types import ListType
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+import docutils
+from docutils import frontend, nodes, utils, writers, languages
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('html', 'html4css1', 'xhtml')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'html4css1.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = (
+        'HTML-Specific Options',
+        None,
+        (('Specify the template file (UTF-8 encoded).  Default is "%s".'
+          % default_template_path,
+          ['--template'],
+          {'default': default_template_path, 'metavar': '<file>'}),
+        ('Specify a stylesheet URL, used verbatim.  Overrides '
+          '--stylesheet-path.',
+          ['--stylesheet'],
+          {'metavar': '<URL>', 'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  The path is adjusted relative to the output HTML '
+          'file.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Embed the stylesheet in the output HTML file.  The stylesheet '
+          'file must be accessible during processing (--stylesheet-path is '
+          'recommended).  This is the default.',
+          ['--embed-stylesheet'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Link to the stylesheet in the output HTML file.  Default: '
+          'embed the stylesheet, do not link to it.',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
+         ('Specify the initial header level.  Default is 1 for "<h1>".  '
+          'Does not affect document title & subtitle (see --no-doc-title).',
+          ['--initial-header-level'],
+          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
+           'metavar': '<level>'}),
+         ('Specify the maximum width (in characters) for one-column field '
+          'names.  Longer field names will span an entire row of the table '
+          'used to render the field list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--field-name-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Specify the maximum width (in characters) for options in option '
+          'lists.  Longer options will span an entire row of the table used '
+          'to render the option list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--option-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "brackets".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Remove extra vertical whitespace between items of "simple" bullet '
+          'lists and enumerated lists.  Default: enabled.',
+          ['--compact-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple bullet and enumerated lists.',
+          ['--no-compact-lists'],
+          {'dest': 'compact_lists', 'action': 'store_false'}),
+         ('Remove extra vertical whitespace between items of simple field '
+          'lists.  Default: enabled.',
+          ['--compact-field-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple field lists.',
+          ['--no-compact-field-lists'],
+          {'dest': 'compact_field_lists', 'action': 'store_false'}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Obfuscate email addresses to confuse harvesters while still '
+          'keeping email links usable with standards-compliant browsers.',
+          ['--cloak-email-addresses'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'html4css1 writer'
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = (
+        'head_prefix', 'head', 'stylesheet', 'body_prefix',
+        'body_pre_docinfo', 'docinfo', 'body', 'body_suffix',
+        'title', 'subtitle', 'header', 'footer', 'meta', 'fragment',
+        'html_prolog', 'html_head', 'html_title', 'html_subtitle',
+        'html_body')
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [writer_aux.Admonitions]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def translate(self):
+        self.visitor = visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+        self.output = self.apply_template()
+
+    def apply_template(self):
+        template_file = open(self.document.settings.template)
+        template = unicode(template_file.read(), 'utf-8')
+        template_file.close()
+        subs = self.interpolation_dict()
+        return template % subs
+
+    def interpolation_dict(self):
+        subs = {}
+        settings = self.document.settings
+        for attr in self.visitor_attributes:
+            subs[attr] = ''.join(getattr(self, attr)).rstrip('\n')
+        subs['encoding'] = settings.output_encoding
+        subs['version'] = docutils.__version__
+        return subs
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+class HTMLTranslator(nodes.NodeVisitor):
+
+    """
+    This HTML writer has been optimized to produce visually compact
+    lists (less vertical whitespace).  HTML's mixed content models
+    allow list items to contain "<li><p>body elements</p></li>" or
+    "<li>just text</li>" or even "<li>text<p>and body
+    elements</p>combined</li>", each with different effects.  It would
+    be best to stick with strict body elements in list items, but they
+    affect vertical spacing in browsers (although they really
+    shouldn't).
+
+    Here is an outline of the optimization:
+
+    - Check for and omit <p> tags in "simple" lists: list items
+      contain either a single paragraph, a nested simple list, or a
+      paragraph followed by a nested simple list.  This means that
+      this list can be compact:
+
+          - Item 1.
+          - Item 2.
+
+      But this list cannot be compact:
+
+          - Item 1.
+
+            This second paragraph forces space between list items.
+
+          - Item 2.
+
+    - In non-list contexts, omit <p> tags on a paragraph if that
+      paragraph is the only child of its parent (footnotes & citations
+      are allowed a label first).
+
+    - Regardless of the above, in definitions, table cells, field bodies,
+      option descriptions, and list items, mark the first child with
+      'class="first"' and the last child with 'class="last"'.  The stylesheet
+      sets the margins (top & bottom respectively) to 0 for these elements.
+
+    The ``no_compact_lists`` setting (``--no-compact-lists`` command-line
+    option) disables list whitespace optimization.
+    """
+
+    xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n'
+    doctype = (
+        '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
+    head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"'
+                            ' xml:lang="%s" lang="%s">\n<head>\n')
+    content_type = ('<meta http-equiv="Content-Type"'
+                    ' content="text/html; charset=%s" />\n')
+    generator = ('<meta name="generator" content="Docutils %s: '
+                 'http://docutils.sourceforge.net/" />\n')
+    stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n'
+    embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n'
+    words_and_spaces = re.compile(r'\S+| +|\n')
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        lcode = settings.language_code
+        self.language = languages.get_language(lcode)
+        self.meta = [self.content_type % settings.output_encoding,
+                     self.generator % docutils.__version__]
+        self.head_prefix = []
+        self.html_prolog = []
+        if settings.xml_declaration:
+            self.head_prefix.append(self.xml_declaration
+                                    % settings.output_encoding)
+            # encoding not interpolated:
+            self.html_prolog.append(self.xml_declaration)
+        self.head_prefix.extend([self.doctype,
+                                 self.head_prefix_template % (lcode, lcode)])
+        self.html_prolog.append(self.doctype)
+        self.head = self.meta[:]
+        stylesheet = utils.get_stylesheet_reference(settings)
+        self.stylesheet = []
+        if stylesheet:
+            if settings.embed_stylesheet:
+                stylesheet = utils.get_stylesheet_reference(
+                    settings, os.path.join(os.getcwd(), 'dummy'))
+                settings.record_dependencies.add(stylesheet)
+                stylesheet_text = open(stylesheet).read()
+                self.stylesheet = [self.embedded_stylesheet % stylesheet_text]
+            else:
+                self.stylesheet = [self.stylesheet_link
+                                   % self.encode(stylesheet)]
+        self.body_prefix = ['</head>\n<body>\n']
+        # document title, subtitle display
+        self.body_pre_docinfo = []
+        # author, date, etc.
+        self.docinfo = []
+        self.body = []
+        self.fragment = []
+        self.body_suffix = ['</body>\n</html>\n']
+        self.section_level = 0
+        self.initial_header_level = int(settings.initial_header_level)
+        # A heterogenous stack used in conjunction with the tree traversal.
+        # Make sure that the pops correspond to the pushes:
+        self.context = []
+        self.topic_classes = []
+        self.colspecs = []
+        self.compact_p = 1
+        self.compact_simple = None
+        self.compact_field_list = None
+        self.in_docinfo = None
+        self.in_sidebar = None
+        self.title = []
+        self.subtitle = []
+        self.header = []
+        self.footer = []
+        self.html_head = [self.content_type] # charset not interpolated
+        self.html_title = []
+        self.html_subtitle = []
+        self.html_body = []
+        self.in_document_title = 0
+        self.in_mailto = 0
+        self.author_in_authors = None
+
+    def astext(self):
+        return ''.join(self.head_prefix + self.head
+                       + self.stylesheet + self.body_prefix
+                       + self.body_pre_docinfo + self.docinfo
+                       + self.body + self.body_suffix)
+
+    def encode(self, text):
+        """Encode special characters in `text` & return."""
+        # @@@ A codec to do these and all other HTML entities would be nice.
+        text = text.replace("&", "&amp;")
+        text = text.replace("<", "&lt;")
+        text = text.replace('"', "&quot;")
+        text = text.replace(">", "&gt;")
+        text = text.replace("@", "&#64;") # may thwart some address harvesters
+        # Replace the non-breaking space character with the HTML entity:
+        text = text.replace(u'\u00a0', "&nbsp;")
+        return text
+
+    def cloak_mailto(self, uri):
+        """Try to hide a mailto: URL from harvesters."""
+        # Encode "@" using a URL octet reference (see RFC 1738).
+        # Further cloaking with HTML entities will be done in the
+        # `attval` function.
+        return uri.replace('@', '%40')
+
+    def cloak_email(self, addr):
+        """Try to hide the link text of a email link from harversters."""
+        # Surround at-signs and periods with <span> tags.  ("@" has
+        # already been encoded to "&#64;" by the `encode` method.)
+        addr = addr.replace('&#64;', '<span>&#64;</span>')
+        addr = addr.replace('.', '<span>&#46;</span>')
+        return addr
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, HTML encode, and return attribute value text."""
+        encoded = self.encode(whitespace.sub(' ', text))
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            # Cloak at-signs ("%40") and periods with HTML entities.
+            encoded = encoded.replace('%40', '&#37;&#52;&#48;')
+            encoded = encoded.replace('.', '&#46;')
+        return encoded
+
+    def starttag(self, node, tagname, suffix='\n', empty=0, **attributes):
+        """
+        Construct and return a start tag given a node (id & class attributes
+        are extracted), tag name, and optional attributes.
+        """
+        tagname = tagname.lower()
+        prefix = []
+        atts = {}
+        ids = []
+        for (name, value) in attributes.items():
+            atts[name.lower()] = value
+        classes = node.get('classes', [])
+        if atts.has_key('class'):
+            classes.append(atts['class'])
+        if classes:
+            atts['class'] = ' '.join(classes)
+        assert not atts.has_key('id')
+        ids.extend(node.get('ids', []))
+        if atts.has_key('ids'):
+            ids.extend(atts['ids'])
+            del atts['ids']
+        if ids:
+            atts['id'] = ids[0]
+            for id in ids[1:]:
+                # Add empty "span" elements for additional IDs.  Note
+                # that we cannot use empty "a" elements because there
+                # may be targets inside of references, but nested "a"
+                # elements aren't allowed in XHTML (even if they do
+                # not all have a "href" attribute).
+                if empty:
+                    # Empty tag.  Insert target right in front of element.
+                    prefix.append('<span id="%s"></span>' % id)
+                else:
+                    # Non-empty tag.  Place the auxiliary <span> tag
+                    # *inside* the element, as the first child.
+                    suffix += '<span id="%s"></span>' % id
+        attlist = atts.items()
+        attlist.sort()
+        parts = [tagname]
+        for name, value in attlist:
+            # value=None was used for boolean attributes without
+            # value, but this isn't supported by XHTML.
+            assert value is not None
+            if isinstance(value, ListType):
+                values = [unicode(v) for v in value]
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(' '.join(values))))
+            else:
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(unicode(value))))
+        if empty:
+            infix = ' /'
+        else:
+            infix = ''
+        return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix
+
+    def emptytag(self, node, tagname, suffix='\n', **attributes):
+        """Construct and return an XML-compatible empty tag."""
+        return self.starttag(node, tagname, suffix, empty=1, **attributes)
+
+    def set_class_on_child(self, node, class_, index=0):
+        """
+        Set class `class_` on the visible child no. index of `node`.
+        Do nothing if node has fewer children than `index`.
+        """
+        children = [n for n in node if not isinstance(n, nodes.Invisible)]
+        try:
+            child = children[index]
+        except IndexError:
+            return
+        child['classes'].append(class_)
+
+    def set_first_last(self, node):
+        self.set_class_on_child(node, 'first', 0)
+        self.set_class_on_child(node, 'last', -1)
+
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            encoded = self.cloak_email(encoded)
+        self.body.append(encoded)
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_abbreviation(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'abbr', ''))
+
+    def depart_abbreviation(self, node):
+        self.body.append('</abbr>')
+
+    def visit_acronym(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'acronym', ''))
+
+    def depart_acronym(self, node):
+        self.body.append('</acronym>')
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address', meta=None)
+        self.body.append(self.starttag(node, 'pre', CLASS='address'))
+
+    def depart_address(self, node):
+        self.body.append('\n</pre>\n')
+        self.depart_docinfo_item()
+
+    def visit_admonition(self, node):
+        self.body.append(self.starttag(node, 'div'))
+        self.set_first_last(node)
+
+    def depart_admonition(self, node=None):
+        self.body.append('</div>\n')
+
+    attribution_formats = {'dash': ('&mdash;', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.context.append(suffix)
+        self.body.append(
+            self.starttag(node, 'p', prefix, CLASS='attribution'))
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '</p>\n')
+
+    def visit_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            if self.author_in_authors:
+                self.body.append('\n<br />')
+        else:
+            self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            self.author_in_authors += 1
+        else:
+            self.depart_docinfo_item()
+
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors')
+        self.author_in_authors = 0      # initialize counter
+
+    def depart_authors(self, node):
+        self.depart_docinfo_item()
+        self.author_in_authors = None
+
+    def visit_block_quote(self, node):
+        self.body.append(self.starttag(node, 'blockquote'))
+
+    def depart_block_quote(self, node):
+        self.body.append('</blockquote>\n')
+
+    def check_simple_list(self, node):
+        """Check for a simple list that can be rendered compactly."""
+        visitor = SimpleListChecker(self.document)
+        try:
+            node.walk(visitor)
+        except nodes.NodeFound:
+            return None
+        else:
+            return 1
+
+    def is_compactable(self, node):
+        return ('compact' in node['classes']
+                or (self.settings.compact_lists
+                    and 'open' not in node['classes']
+                    and (self.compact_simple
+                         or self.topic_classes == ['contents']
+                         or self.check_simple_list(node))))
+
+    def visit_bullet_list(self, node):
+        atts = {}
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = 'simple'
+        self.body.append(self.starttag(node, 'ul', **atts))
+
+    def depart_bullet_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ul>\n')
+
+    def visit_caption(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
+
+    def depart_caption(self, node):
+        self.body.append('</p>\n')
+
+    def visit_citation(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils citation',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def depart_citation(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_citation_reference(self, node):
+        href = '#' + node['refid']
+        self.body.append(self.starttag(
+            node, 'a', '[', CLASS='citation-reference', href=href))
+
+    def depart_citation_reference(self, node):
+        self.body.append(']</a>')
+
+    def visit_classifier(self, node):
+        self.body.append(' <span class="classifier-delimiter">:</span> ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+    def depart_classifier(self, node):
+        self.body.append('</span>')
+
+    def visit_colspec(self, node):
+        self.colspecs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        node.parent.stubs.append(node.attributes.get('stub'))
+
+    def depart_colspec(self, node):
+        pass
+
+    def write_colspecs(self):
+        width = 0
+        for node in self.colspecs:
+            width += node['colwidth']
+        for node in self.colspecs:
+            colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
+            self.body.append(self.emptytag(node, 'col',
+                                           width='%i%%' % colwidth))
+        self.colspecs = []
+
+    def visit_comment(self, node,
+                      sub=re.compile('-(?=-)').sub):
+        """Escape double-dashes in comment text."""
+        self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='compound'))
+        if len(node) > 1:
+            node[0]['classes'].append('compound-first')
+            node[-1]['classes'].append('compound-last')
+            for child in node[1:-1]:
+                child['classes'].append('compound-middle')
+
+    def depart_compound(self, node):
+        self.body.append('</div>\n')
+
+    def visit_container(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='container'))
+
+    def depart_container(self, node):
+        self.body.append('</div>\n')
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact', meta=None)
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item()
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item()
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        self.body.append('</dt>\n')
+        self.body.append(self.starttag(node, 'dd', ''))
+        self.set_first_last(node)
+
+    def depart_definition(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_definition_list(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS='docutils'))
+
+    def depart_definition_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append(self.starttag(node, 'td', ''))
+        self.set_first_last(node)
+
+    def depart_description(self, node):
+        self.body.append('</td>')
+
+    def visit_docinfo(self, node):
+        self.context.append(len(self.body))
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docinfo',
+                                       frame="void", rules="none"))
+        self.body.append('<col class="docinfo-name" />\n'
+                         '<col class="docinfo-content" />\n'
+                         '<tbody valign="top">\n')
+        self.in_docinfo = 1
+
+    def depart_docinfo(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.in_docinfo = None
+        start = self.context.pop()
+        self.docinfo = self.body[start:]
+        self.body = []
+
+    def visit_docinfo_item(self, node, name, meta=1):
+        if meta:
+            meta_tag = '<meta name="%s" content="%s" />\n' \
+                       % (name, self.attval(node.astext()))
+            self.add_meta(meta_tag)
+        self.body.append(self.starttag(node, 'tr', ''))
+        self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
+                         % self.language.labels[name])
+        if len(node):
+            if isinstance(node[0], nodes.Element):
+                node[0]['classes'].append('first')
+            if isinstance(node[-1], nodes.Element):
+                node[-1]['classes'].append('last')
+
+    def depart_docinfo_item(self):
+        self.body.append('</td></tr>\n')
+
+    def visit_doctest_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
+
+    def depart_doctest_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_document(self, node):
+        self.head.append('<title>%s</title>\n'
+                         % self.encode(node.get('title', '')))
+
+    def depart_document(self, node):
+        self.fragment.extend(self.body)
+        self.body_prefix.append(self.starttag(node, 'div', CLASS='document'))
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+        assert not self.context, 'len(context) = %s' % len(self.context)
+
+    def visit_emphasis(self, node):
+        self.body.append('<em>')
+
+    def depart_emphasis(self, node):
+        self.body.append('</em>')
+
+    def visit_entry(self, node):
+        atts = {'class': []}
+        if isinstance(node.parent.parent, nodes.thead):
+            atts['class'].append('head')
+        if node.parent.parent.parent.stubs[node.parent.column]:
+            # "stubs" list is an attribute of the tgroup element
+            atts['class'].append('stub')
+        if atts['class']:
+            tagname = 'th'
+            atts['class'] = ' '.join(atts['class'])
+        else:
+            tagname = 'td'
+            del atts['class']
+        node.parent.column += 1
+        if node.has_key('morerows'):
+            atts['rowspan'] = node['morerows'] + 1
+        if node.has_key('morecols'):
+            atts['colspan'] = node['morecols'] + 1
+            node.parent.column += node['morecols']
+        self.body.append(self.starttag(node, tagname, '', **atts))
+        self.context.append('</%s>\n' % tagname.lower())
+        if len(node) == 0:              # empty cell
+            self.body.append('&nbsp;')
+        self.set_first_last(node)
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_enumerated_list(self, node):
+        """
+        The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
+        CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
+        usable.
+        """
+        atts = {}
+        if node.has_key('start'):
+            atts['start'] = node['start']
+        if node.has_key('enumtype'):
+            atts['class'] = node['enumtype']
+        # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
+        # single "format" attribute? Use CSS2?
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = (atts.get('class', '') + ' simple').strip()
+        self.body.append(self.starttag(node, 'ol', **atts))
+
+    def depart_enumerated_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ol>\n')
+
+    def visit_field(self, node):
+        self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
+
+    def depart_field(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_field_body(self, node):
+        self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
+        self.set_class_on_child(node, 'first', 0)
+        field = node.parent
+        if (self.compact_field_list or
+            isinstance(field.parent, nodes.docinfo) or
+            field.parent.index(field) == len(field.parent) - 1):
+            # If we are in a compact list, the docinfo, or if this is
+            # the last field of the field list, do not add vertical
+            # space after last element.
+            self.set_class_on_child(node, 'last', -1)
+
+    def depart_field_body(self, node):
+        self.body.append('</td>\n')
+
+    def visit_field_list(self, node):
+        self.context.append((self.compact_field_list, self.compact_p))
+        self.compact_p = None
+        if 'compact' in node['classes']:
+            self.compact_field_list = 1
+        elif (self.settings.compact_field_lists
+              and 'open' not in node['classes']):
+            self.compact_field_list = 1
+        if self.compact_field_list:
+            for field in node:
+                field_body = field[-1]
+                assert isinstance(field_body, nodes.field_body)
+                children = [n for n in field_body
+                            if not isinstance(n, nodes.Invisible)]
+                if not (len(children) == 0 or
+                        len(children) == 1 and
+                        isinstance(children[0], nodes.paragraph)):
+                    self.compact_field_list = 0
+                    break
+        self.body.append(self.starttag(node, 'table', frame='void',
+                                       rules='none',
+                                       CLASS='docutils field-list'))
+        self.body.append('<col class="field-name" />\n'
+                         '<col class="field-body" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_field_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.compact_field_list, self.compact_p = self.context.pop()
+
+    def visit_field_name(self, node):
+        atts = {}
+        if self.in_docinfo:
+            atts['class'] = 'docinfo-name'
+        else:
+            atts['class'] = 'field-name'
+        if ( self.settings.field_name_limit
+             and len(node.astext()) > self.settings.field_name_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'th', '', **atts))
+
+    def depart_field_name(self, node):
+        self.body.append(':</th>')
+        self.body.append(self.context.pop())
+
+    def visit_figure(self, node):
+        atts = {'class': 'figure'}
+        if node.get('width'):
+            atts['style'] = 'width: %spx' % node['width']
+        if node.get('align'):
+            atts['align'] = node['align']
+        self.body.append(self.starttag(node, 'div', **atts))
+
+    def depart_figure(self, node):
+        self.body.append('</div>\n')
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = [self.starttag(node, 'div', CLASS='footer'),
+                  '<hr class="footer" />\n']
+        footer.extend(self.body[start:])
+        footer.append('\n</div>\n')
+        self.footer.extend(footer)
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils footnote',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def footnote_backrefs(self, node):
+        backlinks = []
+        backrefs = node['backrefs']
+        if self.settings.footnote_backlinks and backrefs:
+            if len(backrefs) == 1:
+                self.context.append('')
+                self.context.append('</a>')
+                self.context.append('<a class="fn-backref" href="#%s">'
+                                    % backrefs[0])
+            else:
+                i = 1
+                for backref in backrefs:
+                    backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
+                                     % (backref, i))
+                    i += 1
+                self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
+                self.context += ['', '']
+        else:
+            self.context.append('')
+            self.context += ['', '']
+        # If the node does not only consist of a label.
+        if len(node) > 1:
+            # If there are preceding backlinks, we do not set class
+            # 'first', because we need to retain the top-margin.
+            if not backlinks:
+                node[1]['classes'].append('first')
+            node[-1]['classes'].append('last')
+
+    def depart_footnote(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_footnote_reference(self, node):
+        href = '#' + node['refid']
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        else:
+            assert format == 'superscript'
+            suffix = '<sup>'
+            self.context.append('</sup>')
+        self.body.append(self.starttag(node, 'a', suffix,
+                                       CLASS='footnote-reference', href=href))
+
+    def depart_footnote_reference(self, node):
+        self.body.append(self.context.pop() + '</a>')
+
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = [self.starttag(node, 'div', CLASS='header')]
+        header.extend(self.body[start:])
+        header.append('\n<hr class="header"/>\n</div>\n')
+        self.body_prefix.extend(header)
+        self.header.extend(header)
+        del self.body[start:]
+
+    def visit_image(self, node):
+        atts = {}
+        atts['src'] = node['uri']
+        if node.has_key('width'):
+            atts['width'] = node['width']
+        if node.has_key('height'):
+            atts['height'] = node['height']
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(str(atts['src']))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    pass
+                else:
+                    if not atts.has_key('width'):
+                        atts['width'] = str(im.size[0])
+                    if not atts.has_key('height'):
+                        atts['height'] = str(im.size[1])
+                    del im
+            for att_name in 'width', 'height':
+                if atts.has_key(att_name):
+                    match = re.match(r'([0-9.]+)(\S*)$', atts[att_name])
+                    assert match
+                    atts[att_name] = '%s%s' % (
+                        float(match.group(1)) * (float(node['scale']) / 100),
+                        match.group(2))
+        style = []
+        for att_name in 'width', 'height':
+            if atts.has_key(att_name):
+                if re.match(r'^[0-9.]+$', atts[att_name]):
+                    # Interpret unitless values as pixels.
+                    atts[att_name] += 'px'
+                style.append('%s: %s;' % (att_name, atts[att_name]))
+                del atts[att_name]
+        if style:
+            atts['style'] = ' '.join(style)
+        atts['alt'] = node.get('alt', atts['src'])
+        if (isinstance(node.parent, nodes.TextElement) or
+            (isinstance(node.parent, nodes.reference) and
+             not isinstance(node.parent.parent, nodes.TextElement))):
+            # Inline context or surrounded by <a>...</a>.
+            suffix = ''
+        else:
+            suffix = '\n'
+        if node.has_key('align'):
+            if node['align'] == 'center':
+                # "align" attribute is set in surrounding "div" element.
+                self.body.append('<div align="center" class="align-center">')
+                self.context.append('</div>\n')
+                suffix = ''
+            else:
+                # "align" attribute is set in "img" element.
+                atts['align'] = node['align']
+                self.context.append('')
+            atts['class'] = 'align-%s' % node['align']
+        else:
+            self.context.append('')
+        self.body.append(self.emptytag(node, 'img', suffix, **atts))
+
+    def depart_image(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_inline(self, node):
+        self.body.append(self.starttag(node, 'span', ''))
+
+    def depart_inline(self, node):
+        self.body.append('</span>')
+
+    def visit_label(self, node):
+        # Context added in footnote_backrefs.
+        self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
+                                       CLASS='label'))
+
+    def depart_label(self, node):
+        # Context added in footnote_backrefs.
+        self.body.append(']%s</td><td>%s' % (self.context.pop(), self.context.pop()))
+
+    def visit_legend(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='legend'))
+
+    def depart_legend(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line(self, node):
+        self.body.append(self.starttag(node, 'div', suffix='', CLASS='line'))
+        if not len(node):
+            self.body.append('<br />')
+
+    def depart_line(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line_block(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='line-block'))
+
+    def depart_line_block(self, node):
+        self.body.append('</div>\n')
+
+    def visit_list_item(self, node):
+        self.body.append(self.starttag(node, 'li', ''))
+        if len(node):
+            node[0]['classes'].append('first')
+
+    def depart_list_item(self, node):
+        self.body.append('</li>\n')
+
+    def visit_literal(self, node):
+        """Process text to prevent tokens from wrapping."""
+        self.body.append(
+            self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        text = node.astext()
+        for token in self.words_and_spaces.findall(text):
+            if token.strip():
+                # Protect text like "--an-option" from bad line wrapping:
+                self.body.append('<span class="pre">%s</span>'
+                                 % self.encode(token))
+            elif token in ('\n', ' '):
+                # Allow breaks at whitespace:
+                self.body.append(token)
+            else:
+                # Protect runs of multiple spaces; the last space can wrap:
+                self.body.append('&nbsp;' * (len(token) - 1) + ' ')
+        self.body.append('</tt>')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_literal_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
+
+    def depart_literal_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_meta(self, node):
+        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
+        self.add_meta(meta)
+
+    def depart_meta(self, node):
+        pass
+
+    def add_meta(self, tag):
+        self.meta.append(tag)
+        self.head.append(tag)
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            self.body.append(', ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+
+    def depart_option(self, node):
+        self.body.append('</span>')
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        self.body.append(node.get('delimiter', ' '))
+        self.body.append(self.starttag(node, 'var', ''))
+
+    def depart_option_argument(self, node):
+        self.body.append('</var>')
+
+    def visit_option_group(self, node):
+        atts = {}
+        if ( self.settings.option_limit
+             and len(node.astext()) > self.settings.option_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(
+            self.starttag(node, 'td', CLASS='option-group', **atts))
+        self.body.append('<kbd>')
+        self.context.append(0)          # count number of options
+
+    def depart_option_group(self, node):
+        self.context.pop()
+        self.body.append('</kbd></td>\n')
+        self.body.append(self.context.pop())
+
+    def visit_option_list(self, node):
+        self.body.append(
+              self.starttag(node, 'table', CLASS='docutils option-list',
+                            frame="void", rules="none"))
+        self.body.append('<col class="option" />\n'
+                         '<col class="description" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_option_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+
+    def visit_option_list_item(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+
+    def depart_option_list_item(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_option_string(self, node):
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item()
+
+    def should_be_compact_paragraph(self, node):
+        """
+        Determine if the <p> tags around paragraph ``node`` can be omitted.
+        """
+        if (isinstance(node.parent, nodes.document) or
+            isinstance(node.parent, nodes.compound)):
+            # Never compact paragraphs in document or compound.
+            return 0
+        for key, value in node.attlist():
+            if (node.is_not_default(key) and
+                not (key == 'classes' and value in
+                     ([], ['first'], ['last'], ['first', 'last']))):
+                # Attribute which needs to survive.
+                return 0
+        first = isinstance(node.parent[0], nodes.label) # skip label
+        for child in node.parent.children[first:]:
+            # only first paragraph can be compact
+            if isinstance(child, nodes.Invisible):
+                continue
+            if child is node:
+                break
+            return 0
+        parent_length = len([n for n in node.parent if not isinstance(
+            n, (nodes.Invisible, nodes.label))])
+        if ( self.compact_simple
+             or self.compact_field_list
+             or self.compact_p and parent_length == 1):
+            return 1
+        return 0
+
+    def visit_paragraph(self, node):
+        if self.should_be_compact_paragraph(node):
+            self.context.append('')
+        else:
+            self.body.append(self.starttag(node, 'p', ''))
+            self.context.append('</p>\n')
+
+    def depart_paragraph(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_problematic(self, node):
+        if node.hasattr('refid'):
+            self.body.append('<a href="#%s">' % node['refid'])
+            self.context.append('</a>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
+
+    def depart_problematic(self, node):
+        self.body.append('</span>')
+        self.body.append(self.context.pop())
+
+    def visit_raw(self, node):
+        if 'html' in node.get('format', '').split():
+            t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div'
+            if node['classes']:
+                self.body.append(self.starttag(node, t, suffix=''))
+            self.body.append(node.astext())
+            if node['classes']:
+                self.body.append('</%s>' % t)
+        # Keep non-HTML raw text out of output:
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        atts = {'class': 'reference'}
+        if node.has_key('refuri'):
+            atts['href'] = node['refuri']
+            if ( self.settings.cloak_email_addresses
+                 and atts['href'].startswith('mailto:')):
+                atts['href'] = self.cloak_mailto(atts['href'])
+                self.in_mailto = 1
+            atts['class'] += ' external'
+        else:
+            assert node.has_key('refid'), \
+                   'References must have "refuri" or "refid" attribute.'
+            atts['href'] = '#' + node['refid']
+            atts['class'] += ' internal'
+        if not isinstance(node.parent, nodes.TextElement):
+            assert len(node) == 1 and isinstance(node[0], nodes.image)
+            atts['class'] += ' image-reference'
+        self.body.append(self.starttag(node, 'a', '', **atts))
+
+    def depart_reference(self, node):
+        self.body.append('</a>')
+        if not isinstance(node.parent, nodes.TextElement):
+            self.body.append('\n')
+        self.in_mailto = 0
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision', meta=None)
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item()
+
+    def visit_row(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+        node.column = 0
+
+    def depart_row(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_rubric(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='rubric'))
+
+    def depart_rubric(self, node):
+        self.body.append('</p>\n')
+
+    def visit_section(self, node):
+        self.section_level += 1
+        self.body.append(
+            self.starttag(node, 'div', CLASS='section'))
+
+    def depart_section(self, node):
+        self.section_level -= 1
+        self.body.append('</div>\n')
+
+    def visit_sidebar(self, node):
+        self.body.append(
+            self.starttag(node, 'div', CLASS='sidebar'))
+        self.set_first_last(node)
+        self.in_sidebar = 1
+
+    def depart_sidebar(self, node):
+        self.body.append('</div>\n')
+        self.in_sidebar = None
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status', meta=None)
+
+    def depart_status(self, node):
+        self.depart_docinfo_item()
+
+    def visit_strong(self, node):
+        self.body.append('<strong>')
+
+    def depart_strong(self, node):
+        self.body.append('</strong>')
+
+    def visit_subscript(self, node):
+        self.body.append(self.starttag(node, 'sub', ''))
+
+    def depart_subscript(self, node):
+        self.body.append('</sub>')
+
+    def visit_substitution_definition(self, node):
+        """Internal only."""
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.starttag(node, 'p', '',
+                                           CLASS='sidebar-subtitle'))
+            self.context.append('</p>\n')
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
+            self.context.append('</h2>\n')
+            self.in_document_title = len(self.body)
+        elif isinstance(node.parent, nodes.section):
+            tag = 'h%s' % (self.section_level + self.initial_header_level - 1)
+            self.body.append(
+                self.starttag(node, tag, '', CLASS='section-subtitle') +
+                self.starttag({}, 'span', '', CLASS='section-subtitle'))
+            self.context.append('</span></%s>\n' % tag)
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.subtitle = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_subtitle.extend(self.body)
+            del self.body[:]
+
+    def visit_superscript(self, node):
+        self.body.append(self.starttag(node, 'sup', ''))
+
+    def depart_superscript(self, node):
+        self.body.append('</sup>')
+
+    def visit_system_message(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
+        self.body.append('<p class="system-message-title">')
+        backref_text = ''
+        if len(node['backrefs']):
+            backrefs = node['backrefs']
+            if len(backrefs) == 1:
+                backref_text = ('; <em><a href="#%s">backlink</a></em>'
+                                % backrefs[0])
+            else:
+                i = 1
+                backlinks = []
+                for backref in backrefs:
+                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
+                    i += 1
+                backref_text = ('; <em>backlinks: %s</em>'
+                                % ', '.join(backlinks))
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        self.body.append('System Message: %s/%s '
+                         '(<tt class="docutils">%s</tt>%s)%s</p>\n'
+                         % (node['type'], node['level'],
+                            self.encode(node['source']), line, backref_text))
+
+    def depart_system_message(self, node):
+        self.body.append('</div>\n')
+
+    def visit_table(self, node):
+        self.body.append(
+            self.starttag(node, 'table', CLASS='docutils', border="1"))
+
+    def depart_table(self, node):
+        self.body.append('</table>\n')
+
+    def visit_target(self, node):
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            self.body.append(self.starttag(node, 'span', '', CLASS='target'))
+            self.context.append('</span>')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n' or ''
+        self.body.append(self.starttag(node, 'tbody', valign='top'))
+
+    def depart_tbody(self, node):
+        self.body.append('</tbody>\n')
+
+    def visit_term(self, node):
+        self.body.append(self.starttag(node, 'dt', ''))
+
+    def depart_term(self, node):
+        """
+        Leave the end tag to `self.visit_definition()`, in case there's a
+        classifier.
+        """
+        pass
+
+    def visit_tgroup(self, node):
+        # Mozilla needs <colgroup>:
+        self.body.append(self.starttag(node, 'colgroup'))
+        # Appended by thead or tbody:
+        self.context.append('</colgroup>\n')
+        node.stubs = []
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n'
+        # There may or may not be a <thead>; this is for <tbody> to use:
+        self.context.append('')
+        self.body.append(self.starttag(node, 'thead', valign='bottom'))
+
+    def depart_thead(self, node):
+        self.body.append('</thead>\n')
+
+    def visit_title(self, node):
+        """Only 6 section levels are supported by HTML."""
+        check_id = 0
+        close_tag = '</p>\n'
+        if isinstance(node.parent, nodes.topic):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='topic-title first'))
+        elif isinstance(node.parent, nodes.sidebar):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='sidebar-title'))
+        elif isinstance(node.parent, nodes.Admonition):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='admonition-title'))
+        elif isinstance(node.parent, nodes.table):
+            self.body.append(
+                  self.starttag(node, 'caption', ''))
+            close_tag = '</caption>\n'
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
+            close_tag = '</h1>\n'
+            self.in_document_title = len(self.body)
+        else:
+            assert isinstance(node.parent, nodes.section)
+            h_level = self.section_level + self.initial_header_level - 1
+            atts = {}
+            if (len(node.parent) >= 2 and
+                isinstance(node.parent[1], nodes.subtitle)):
+                atts['CLASS'] = 'with-subtitle'
+            self.body.append(
+                  self.starttag(node, 'h%s' % h_level, '', **atts))
+            atts = {}
+            if node.hasattr('refid'):
+                atts['class'] = 'toc-backref'
+                atts['href'] = '#' + node['refid']
+            if atts:
+                self.body.append(self.starttag({}, 'a', '', **atts))
+                close_tag = '</a></h%s>\n' % (h_level)
+            else:
+                close_tag = '</h%s>\n' % (h_level)
+        self.context.append(close_tag)
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.title = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_title.extend(self.body)
+            del self.body[:]
+
+    def visit_title_reference(self, node):
+        self.body.append(self.starttag(node, 'cite', ''))
+
+    def depart_title_reference(self, node):
+        self.body.append('</cite>')
+
+    def visit_topic(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='topic'))
+        self.topic_classes = node['classes']
+
+    def depart_topic(self, node):
+        self.body.append('</div>\n')
+        self.topic_classes = []
+
+    def visit_transition(self, node):
+        self.body.append(self.emptytag(node, 'hr', CLASS='docutils'))
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version', meta=None)
+
+    def depart_version(self, node):
+        self.depart_docinfo_item()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+
+class SimpleListChecker(nodes.GenericNodeVisitor):
+
+    """
+    Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+    Here "simple" means a list item containing nothing other than a single
+    paragraph, a simple list, or a paragraph followed by a simple list.
+    """
+
+    def default_visit(self, node):
+        raise nodes.NodeFound
+
+    def visit_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        children = []
+        for child in node.children:
+            if not isinstance(child, nodes.Invisible):
+                children.append(child)
+        if (children and isinstance(children[0], nodes.paragraph)
+            and (isinstance(children[-1], nodes.bullet_list)
+                 or isinstance(children[-1], nodes.enumerated_list))):
+            children.pop()
+        if len(children) <= 1:
+            return
+        else:
+            raise nodes.NodeFound
+
+    def visit_paragraph(self, node):
+        raise nodes.SkipNode
+
+    def invisible_visit(self, node):
+        """Invisible nodes should be ignored."""
+        raise nodes.SkipNode
+
+    visit_comment = invisible_visit
+    visit_substitution_definition = invisible_visit
+    visit_target = invisible_visit
+    visit_pending = invisible_visit
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,273 @@
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+%(head_prefix)s
+%(head)s
+%(stylesheet)s
+%(body_prefix)s
+%(body_pre_docinfo)s
+%(docinfo)s
+%(body)s
+%(body_suffix)s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2177 @@
+# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $
+# Author: Engelbert Gruber <grubert@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# code contributions from several people included, thanks to all.
+# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
+#
+# convention deactivate code by two # e.g. ##.
+
+import sys
+import time
+import re
+import string
+from types import ListType
+from docutils import frontend, nodes, languages, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+
+from docutils.transforms.references import DanglingReferencesVisitor
+
+class Writer(writers.Writer):
+
+    supported = ('latex','latex2e')
+    """Formats this writer supports."""
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'The LaTeX "--output-encoding" default is "latin-1:strict".',
+        (('Specify documentclass.  Default is "article".',
+          ['--documentclass'],
+          {'default': 'article', }),
+         ('Specify document options.  Multiple options can be given, '
+          'separated by commas.  Default is "10pt,a4paper".',
+          ['--documentoptions'],
+          {'default': '10pt,a4paper', }),
+         ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). '
+          'Default: no, uses figures.',
+          ['--use-latex-footnotes'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "superscript".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Use LaTeX citations. '
+          'Default: no, uses figures which might get mixed with images.',
+          ['--use-latex-citations'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Specify a stylesheet file. The file will be "input" by latex in '
+          'the document header.  Default is no stylesheet ("").  '
+          'Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.',
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet'}),
+         ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) '
+          'supports only one ToC per document, but docutils does not know of '
+          'pagenumbers. LaTeX table of contents also means LaTeX generates '
+          'sectionnumbers.',
+          ['--use-latex-toc'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Add parts on top of the section hierarchy.',
+          ['--use-part-section'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Let LaTeX print author and date, do not show it in docutils '
+          'document info.',
+          ['--use-latex-docinfo'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Use LaTeX abstract environment for the documents abstract.'
+          'Per default the abstract is an unnumbered section.',
+          ['--use-latex-abstract'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Color of any hyperlinks embedded in text '
+          '(default: "blue", "0" to disable).',
+          ['--hyperlink-color'], {'default': 'blue'}),
+         ('Enable compound enumerators for nested enumerated lists '
+          '(e.g. "1.2.a.ii").  Default: disabled.',
+          ['--compound-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compound enumerators for nested enumerated lists.  This is '
+          'the default.',
+          ['--no-compound-enumerators'],
+          {'action': 'store_false', 'dest': 'compound_enumerators'}),
+         ('Enable section ("." subsection ...) prefixes for compound '
+          'enumerators.  This has no effect without --compound-enumerators.  '
+          'Default: disabled.',
+          ['--section-prefix-for-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable section prefixes for compound enumerators.  '
+          'This is the default.',
+          ['--no-section-prefix-for-enumerators'],
+          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
+         ('Set the separator between section number and enumerator '
+          'for compound enumerated lists.  Default is "-".',
+          ['--section-enumerator-separator'],
+          {'default': '-', 'metavar': '<char>'}),
+         ('When possibile, use verbatim for literal-blocks. '
+          'Default is to always use the mbox environment.',
+          ['--use-verbatim-when-possible'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Table style. "standard" with horizontal and vertical lines, '
+          '"booktabs" (LaTeX booktabs style) only horizontal lines '
+          'above and below the table and below the header or "nolines".  '
+          'Default: "standard"',
+          ['--table-style'],
+          {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard',
+           'metavar': '<format>'}),
+         ('LaTeX graphicx package option. '
+          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
+          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
+          'Default is no option.',
+          ['--graphicx-option'],
+          {'default': ''}),
+         ('LaTeX font encoding. '
+          'Possible values are "T1", "OT1", "" or some other fontenc option. '
+          'The font encoding influences available symbols, e.g. "<<" as one '
+          'character. Default is "" which leads to package "ae" (a T1 '
+          'emulation using CM fonts).',
+          ['--font-encoding'],
+          {'default': ''}),
+         ('Per default the latex-writer puts the reference title into '
+          'hyperreferences. Specify "ref*" or "pageref*" to get the section '
+          'number or the page number.',
+          ['--reference-label'],
+          {'default': None, }),
+         ('Specify style and database for bibtex, for example '
+          '"--use-bibtex=mystyle,mydb1,mydb2".',
+          ['--use-bibtex'],
+          {'default': None, }),
+          ),)
+
+    settings_defaults = {'output_encoding': 'latin-1'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'latex2e writer'
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = ("head_prefix", "head", 
+            "body_prefix", "body", "body_suffix")
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        # copy parts 
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+"""
+Notes on LaTeX
+--------------
+
+* LaTeX does not support multiple tocs in one document.
+  (might be no limitation except for docutils documentation)
+
+  The "minitoc" latex package can produce per-chapter tocs in
+  book and report document classes.
+
+* width
+
+  * linewidth - width of a line in the local environment
+  * textwidth - the width of text on the page
+
+  Maybe always use linewidth ?
+
+  *Bug* inside a minipage a (e.g. Sidebar) the linewidth is
+        not changed, needs fix in docutils so that tables
+        are not too wide.
+
+        So we add locallinewidth set it initially and
+        on entering sidebar and reset on exit.
+"""
+
+class Babel:
+    """Language specifics for LaTeX."""
+    # country code by a.schlock.
+    # partly manually converted from iso and babel stuff, dialects and some
+    _ISO639_TO_BABEL = {
+        'no': 'norsk',     #XXX added by hand ( forget about nynorsk?)
+        'gd': 'scottish',  #XXX added by hand
+        'hu': 'magyar',    #XXX added by hand
+        'pt': 'portuguese',#XXX added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',  #XXX rather than german
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    def __init__(self,lang):
+        self.language = lang
+        # pdflatex does not produce double quotes for ngerman in tt.
+        self.double_quote_replacment = None
+        if re.search('^de',self.language):
+            #self.quotes = ("\"`", "\"'")
+            self.quotes = ('{\\glqq}', '{\\grqq}')
+            self.double_quote_replacment = "{\\dq}"
+        elif re.search('^it',self.language):
+            self.quotes = ("``", "''")
+            self.double_quote_replacment = r'{\char`\"}'
+        else:
+            self.quotes = ("``", "''")
+        self.quote_index = 0
+
+    def next_quote(self):
+        q = self.quotes[self.quote_index]
+        self.quote_index = (self.quote_index+1)%2
+        return q
+
+    def quote_quotes(self,text):
+        t = None
+        for part in text.split('"'):
+            if t == None:
+                t = part
+            else:
+                t += self.next_quote() + part
+        return t
+
+    def double_quotes_in_tt (self,text):
+        if not self.double_quote_replacment:
+            return text
+        return text.replace('"', self.double_quote_replacment)
+
+    def get_language(self):
+        if self._ISO639_TO_BABEL.has_key(self.language):
+            return self._ISO639_TO_BABEL[self.language]
+        else:
+            # support dialects.
+            l = self.language.split("_")[0]
+            if self._ISO639_TO_BABEL.has_key(l):
+                return self._ISO639_TO_BABEL[l]
+        return None
+
+
+latex_headings = {
+        'optionlist_environment' : [
+              '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n'
+              '\\newenvironment{optionlist}[1]\n'
+              '{\\begin{list}{}\n'
+              '  {\\setlength{\\labelwidth}{#1}\n'
+              '   \\setlength{\\rightmargin}{1cm}\n'
+              '   \\setlength{\\leftmargin}{\\rightmargin}\n'
+              '   \\addtolength{\\leftmargin}{\\labelwidth}\n'
+              '   \\addtolength{\\leftmargin}{\\labelsep}\n'
+              '   \\renewcommand{\\makelabel}{\\optionlistlabel}}\n'
+              '}{\\end{list}}\n',
+              ],
+        'lineblock_environment' : [
+            '\\newlength{\\lineblockindentation}\n'
+            '\\setlength{\\lineblockindentation}{2.5em}\n'
+            '\\newenvironment{lineblock}[1]\n'
+            '{\\begin{list}{}\n'
+            '  {\\setlength{\\partopsep}{\\parskip}\n'
+            '   \\addtolength{\\partopsep}{\\baselineskip}\n'
+            '   \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n'
+            '   \\leftmargin#1}\n'
+            ' \\raggedright}\n'
+            '{\\end{list}}\n'
+            ],
+        'footnote_floats' : [
+            '% begin: floats for footnotes tweaking.\n',
+            '\\setlength{\\floatsep}{0.5em}\n',
+            '\\setlength{\\textfloatsep}{\\fill}\n',
+            '\\addtolength{\\textfloatsep}{3em}\n',
+            '\\renewcommand{\\textfraction}{0.5}\n',
+            '\\renewcommand{\\topfraction}{0.5}\n',
+            '\\renewcommand{\\bottomfraction}{0.5}\n',
+            '\\setcounter{totalnumber}{50}\n',
+            '\\setcounter{topnumber}{50}\n',
+            '\\setcounter{bottomnumber}{50}\n',
+            '% end floats for footnotes\n',
+            ],
+        'some_commands' : [
+            '% some commands, that could be overwritten in the style file.\n'
+            '\\newcommand{\\rubric}[1]'
+            '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n'
+            '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n'
+            '% end of "some commands"\n',
+            ]
+        }
+
+class DocumentClass:
+    """Details of a LaTeX document class."""
+
+    def __init__(self, document_class, with_part=False):
+        self.document_class = document_class
+        self._with_part = with_part
+
+    def section(self, level):
+        """ Return the section name at the given level for the specific
+            document class.
+
+            Level is 1,2,3..., as level 0 is the title."""
+
+        sections = [ 'section', 'subsection', 'subsubsection', 
+                     'paragraph', 'subparagraph' ]
+        if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'):
+            sections.insert(0, 'chapter')
+        if self._with_part:
+            sections.insert(0, 'part')
+        if level <= len(sections):
+            return sections[level-1]
+        else:
+            return sections[-1]
+
+class Table:
+    """ Manage a table while traversing.
+        Maybe change to a mixin defining the visit/departs, but then
+        class Table internal variables are in the Translator.
+
+        Table style might be 
+        
+        * standard: horizontal and vertical lines
+        * booktabs (requires booktabs latex package): only horizontal lines
+        * nolines, borderless : no lines
+    """
+    def __init__(self,latex_type,table_style):
+        self._latex_type = latex_type
+        self._table_style = table_style
+        self._open = 0
+        # miscellaneous attributes
+        self._attrs = {}
+        self._col_width = []
+        self._rowspan = []
+        self.stubs = []
+
+    def open(self):
+        self._open = 1
+        self._col_specs = []
+        self.caption = None
+        self._attrs = {}
+        self._in_head = 0 # maybe context with search
+    def close(self):
+        self._open = 0
+        self._col_specs = None
+        self.caption = None
+        self._attrs = {}
+        self.stubs = []
+    def is_open(self):
+        return self._open
+
+    def set_table_style(self, table_style):
+        if not table_style in ('standard','booktabs','borderless','nolines'):
+            return
+        self._table_style = table_style
+
+    def used_packages(self):
+        if self._table_style == 'booktabs':
+            return '\\usepackage{booktabs}\n'
+        return ''
+    def get_latex_type(self):
+        return self._latex_type
+
+    def set(self,attr,value):
+        self._attrs[attr] = value
+    def get(self,attr):
+        if self._attrs.has_key(attr):
+            return self._attrs[attr]
+        return None
+    def get_vertical_bar(self):
+        if self._table_style == 'standard':
+            return '|'
+        return ''
+    # horizontal lines are drawn below a row, because we.
+    def get_opening(self):
+        if self._latex_type == 'longtable':
+            # otherwise longtable might move before paragraph and subparagraph
+            prefix = '\\leavevmode\n'
+        else:
+            prefix = ''
+        return '%s\\begin{%s}[c]' % (prefix, self._latex_type)
+    def get_closing(self):
+        line = ""
+        if self._table_style == 'booktabs':
+            line = '\\bottomrule\n'
+        elif self._table_style == 'standard':
+            lines = '\\hline\n'
+        return '%s\\end{%s}' % (line,self._latex_type)
+
+    def visit_colspec(self, node):
+        self._col_specs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        self.stubs.append(node.attributes.get('stub'))
+
+    def get_colspecs(self):
+        """
+        Return column specification for longtable.
+
+        Assumes reST line length being 80 characters.
+        Table width is hairy.
+
+        === ===
+        ABC DEF
+        === ===
+
+        usually gets to narrow, therefore we add 1 (fiddlefactor).
+        """
+        width = 80
+
+        total_width = 0.0
+        # first see if we get too wide.
+        for node in self._col_specs:
+            colwidth = float(node['colwidth']+1) / width
+            total_width += colwidth
+        self._col_width = []
+        self._rowspan = []
+        # donot make it full linewidth
+        factor = 0.93
+        if total_width > 1.0:
+            factor /= total_width
+        bar = self.get_vertical_bar()
+        latex_table_spec = ""
+        for node in self._col_specs:
+            colwidth = factor * float(node['colwidth']+1) / width
+            self._col_width.append(colwidth+0.005)
+            self._rowspan.append(0)
+            latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005)
+        return latex_table_spec+bar
+
+    def get_column_width(self):
+        """ return columnwidth for current cell (not multicell)
+        """
+        return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1]
+
+    def visit_thead(self):
+        self._in_thead = 1
+        if self._table_style == 'standard':
+            return ['\\hline\n']
+        elif self._table_style == 'booktabs':
+            return ['\\toprule\n']
+        return []
+    def depart_thead(self):
+        a = []
+        #if self._table_style == 'standard':
+        #    a.append('\\hline\n')
+        if self._table_style == 'booktabs':
+            a.append('\\midrule\n')
+        if self._latex_type == 'longtable':
+            a.append('\\endhead\n')
+        # for longtable one could add firsthead, foot and lastfoot
+        self._in_thead = 0
+        return a
+    def visit_row(self):
+        self._cell_in_row = 0
+    def depart_row(self):
+        res = [' \\\\\n']
+        self._cell_in_row = None  # remove cell counter
+        for i in range(len(self._rowspan)):
+            if (self._rowspan[i]>0):
+                self._rowspan[i] -= 1
+
+        if self._table_style == 'standard':
+            rowspans = []
+            for i in range(len(self._rowspan)):
+                if (self._rowspan[i]<=0):
+                    rowspans.append(i+1)
+            if len(rowspans)==len(self._rowspan):
+                res.append('\\hline\n')
+            else:
+                cline = ''
+                rowspans.reverse()
+                # TODO merge clines
+                while 1:
+                    try:
+                        c_start = rowspans.pop()
+                    except:
+                        break
+                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
+                res.append(cline)
+        return res
+
+    def set_rowspan(self,cell,value):
+        try:
+            self._rowspan[cell] = value
+        except:
+            pass
+    def get_rowspan(self,cell):
+        try:
+            return self._rowspan[cell]
+        except:
+            return 0
+    def get_entry_number(self):
+        return self._cell_in_row
+    def visit_entry(self):
+        self._cell_in_row += 1
+    def is_stub_column(self):
+        if len(self.stubs) >= self._cell_in_row:
+            return self.stubs[self._cell_in_row-1]
+        return False
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+
+    # When options are given to the documentclass, latex will pass them
+    # to other packages, as done with babel.
+    # Dummy settings might be taken from document settings
+    
+    # Templates
+    # ---------
+    
+    latex_head = '\\documentclass[%s]{%s}\n'
+    linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n'
+    stylesheet = '\\input{%s}\n'
+    # add a generated on day , machine by user using docutils version.
+    generator = '% generated by Docutils <http://docutils.sourceforge.net/>\n'
+    # Config setting defaults
+    # -----------------------
+
+    # use latex tableofcontents or let docutils do it.
+    use_latex_toc = 0
+
+    # TODO: use mixins for different implementations.
+    # list environment for docinfo. else tabularx
+    use_optionlist_for_docinfo = 0 # NOT YET IN USE
+
+    # Use compound enumerations (1.A.1.)
+    compound_enumerators = 0
+
+    # If using compound enumerations, include section information.
+    section_prefix_for_enumerators = 0
+
+    # This is the character that separates the section ("." subsection ...)
+    # prefix from the regular list enumerator.
+    section_enumerator_separator = '-'
+
+    # default link color
+    hyperlink_color = "blue"
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
+        self.use_latex_toc = settings.use_latex_toc
+        self.use_latex_docinfo = settings.use_latex_docinfo
+        self.use_latex_footnotes = settings.use_latex_footnotes
+        self._use_latex_citations = settings.use_latex_citations
+        self._reference_label = settings.reference_label
+        self.hyperlink_color = settings.hyperlink_color
+        self.compound_enumerators = settings.compound_enumerators
+        self.font_encoding = settings.font_encoding
+        self.section_prefix_for_enumerators = (
+            settings.section_prefix_for_enumerators)
+        self.section_enumerator_separator = (
+            settings.section_enumerator_separator.replace('_', '\\_'))
+        if self.hyperlink_color == '0':
+            self.hyperlink_color = 'black'
+            self.colorlinks = 'false'
+        else:
+            self.colorlinks = 'true'
+
+        if self.settings.use_bibtex:
+            self.bibtex = self.settings.use_bibtex.split(",",1)
+            # TODO avoid errors on not declared citations.
+        else:
+            self.bibtex = None
+        # language: labels, bibliographic_fields, and author_separators.
+        # to allow writing labes for specific languages.
+        self.language = languages.get_language(settings.language_code)
+        self.babel = Babel(settings.language_code)
+        self.author_separator = self.language.author_separators[0]
+        self.d_options = self.settings.documentoptions
+        if self.babel.get_language():
+            self.d_options += ',%s' % self.babel.get_language()
+
+        self.d_class = DocumentClass(settings.documentclass, 
+                                     settings.use_part_section)
+        # object for a table while proccessing.
+        self.table_stack = []
+        self.active_table = Table('longtable',settings.table_style)
+
+        # HACK.  Should have more sophisticated typearea handling.
+        if settings.documentclass.find('scr') == -1:
+            self.typearea = '\\usepackage[DIV12]{typearea}\n'
+        else:
+            if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1:
+                self.typearea = '\\typearea{12}\n'
+            else:
+                self.typearea = ''
+
+        if self.font_encoding == 'OT1':
+            fontenc_header = ''
+        elif self.font_encoding == '':
+            fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n'
+        else:
+            fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,)
+        if self.latex_encoding.startswith('utf8'):
+            input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n'
+        else:
+            input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding
+        if self.settings.graphicx_option == '':
+            self.graphicx_package = '\\usepackage{graphicx}\n'
+        elif self.settings.graphicx_option.lower() == 'auto':
+            self.graphicx_package = '\n'.join(
+                ('%Check if we are compiling under latex or pdflatex',
+                 '\\ifx\\pdftexversion\\undefined',
+                 '  \\usepackage{graphicx}',
+                 '\\else',
+                 '  \\usepackage[pdftex]{graphicx}',
+                 '\\fi\n'))
+        else:
+            self.graphicx_package = (
+                '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option)
+
+        self.head_prefix = [
+              self.latex_head % (self.d_options,self.settings.documentclass),
+              '\\usepackage{babel}\n',     # language is in documents settings.
+              fontenc_header,
+              '\\usepackage{shortvrb}\n',  # allows verb in footnotes.
+              input_encoding,
+              # * tabularx: for docinfo, automatic width of columns, always on one page.
+              '\\usepackage{tabularx}\n',
+              '\\usepackage{longtable}\n',
+              self.active_table.used_packages(),
+              # possible other packages.
+              # * fancyhdr
+              # * ltxtable is a combination of tabularx and longtable (pagebreaks).
+              #   but ??
+              #
+              # extra space between text in tables and the line above them
+              '\\setlength{\\extrarowheight}{2pt}\n',
+              '\\usepackage{amsmath}\n',   # what fore amsmath.
+              self.graphicx_package,
+              '\\usepackage{color}\n',
+              '\\usepackage{multirow}\n',
+              '\\usepackage{ifthen}\n',   # before hyperref!
+              self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
+              self.typearea,
+              self.generator,
+              # latex lengths
+              '\\newlength{\\admonitionwidth}\n',
+              '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n'
+              # width for docinfo tablewidth
+              '\\newlength{\\docinfowidth}\n',
+              '\\setlength{\\docinfowidth}{0.9\\textwidth}\n'
+              # linewidth of current environment, so tables are not wider
+              # than the sidebar: using locallinewidth seems to defer evaluation
+              # of linewidth, this is fixing it.
+              '\\newlength{\\locallinewidth}\n',
+              # will be set later.
+              ]
+        self.head_prefix.extend( latex_headings['optionlist_environment'] )
+        self.head_prefix.extend( latex_headings['lineblock_environment'] )
+        self.head_prefix.extend( latex_headings['footnote_floats'] )
+        self.head_prefix.extend( latex_headings['some_commands'] )
+        ## stylesheet is last: so it might be possible to overwrite defaults.
+        stylesheet = utils.get_stylesheet_reference(settings)
+        if stylesheet:
+            settings.record_dependencies.add(stylesheet)
+            self.head_prefix.append(self.stylesheet % (stylesheet))
+
+        if self.linking: # and maybe check for pdf
+            self.pdfinfo = [ ]
+            self.pdfauthor = None
+            # pdftitle, pdfsubject, pdfauthor, pdfkeywords, 
+            # pdfcreator, pdfproducer
+        else:
+            self.pdfinfo = None
+        # NOTE: Latex wants a date and an author, rst puts this into
+        #   docinfo, so normally we do not want latex author/date handling.
+        # latex article has its own handling of date and author, deactivate.
+        # self.astext() adds \title{...} \author{...} \date{...}, even if the
+        # "..." are empty strings.
+        self.head = [ ]
+        # separate title, so we can appen subtitle.
+        self.title = ''
+        # if use_latex_docinfo: collects lists of author/organization/contact/address lines
+        self.author_stack = []
+        self.date = ''
+
+        self.body_prefix = ['\\raggedbottom\n']
+        self.body = []
+        self.body_suffix = ['\n']
+        self.section_level = 0
+        self.context = []
+        self.topic_classes = []
+        # column specification for tables
+        self.table_caption = None
+        
+        # Flags to encode
+        # ---------------
+        # verbatim: to tell encode not to encode.
+        self.verbatim = 0
+        # insert_newline: to tell encode to replace blanks by "~".
+        self.insert_none_breaking_blanks = 0
+        # insert_newline: to tell encode to add latex newline.
+        self.insert_newline = 0
+        # mbox_newline: to tell encode to add mbox and newline.
+        self.mbox_newline = 0
+        # inside citation reference labels underscores dont need to be escaped.
+        self.inside_citation_reference_label = 0
+
+        # Stack of section counters so that we don't have to use_latex_toc.
+        # This will grow and shrink as processing occurs.
+        # Initialized for potential first-level sections.
+        self._section_number = [0]
+
+        # The current stack of enumerations so that we can expand
+        # them into a compound enumeration.  
+        self._enumeration_counters = []
+
+        # The maximum number of enumeration counters we've used.
+        # If we go beyond this number, we need to create a new
+        # counter; otherwise, just reuse an old one.
+        self._max_enumeration_counters = 0
+
+        self._bibitems = []
+
+        # docinfo.
+        self.docinfo = None
+        # inside literal block: no quote mangling.
+        self.literal_block = 0
+        self.literal_block_stack = []
+        self.literal = 0
+        # true when encoding in math mode
+        self.mathmode = 0
+
+    def to_latex_encoding(self,docutils_encoding):
+        """
+        Translate docutils encoding name into latex's.
+
+        Default fallback method is remove "-" and "_" chars from docutils_encoding.
+
+        """
+        tr = {  "iso-8859-1": "latin1",     # west european
+                "iso-8859-2": "latin2",     # east european
+                "iso-8859-3": "latin3",     # esperanto, maltese
+                "iso-8859-4": "latin4",     # north european,scandinavian, baltic
+                "iso-8859-5": "iso88595",   # cyrillic (ISO)
+                "iso-8859-9": "latin5",     # turkish
+                "iso-8859-15": "latin9",    # latin9, update to latin1.
+                "mac_cyrillic": "maccyr",   # cyrillic (on Mac)
+                "windows-1251": "cp1251",   # cyrillic (on Windows)
+                "koi8-r": "koi8-r",         # cyrillic (Russian)
+                "koi8-u": "koi8-u",         # cyrillic (Ukrainian)
+                "windows-1250": "cp1250",   #
+                "windows-1252": "cp1252",   #
+                "us-ascii": "ascii",        # ASCII (US)
+                # unmatched encodings
+                #"": "applemac",
+                #"": "ansinew",  # windows 3.1 ansi
+                #"": "ascii",    # ASCII encoding for the range 32--127.
+                #"": "cp437",    # dos latine us
+                #"": "cp850",    # dos latin 1
+                #"": "cp852",    # dos latin 2
+                #"": "decmulti",
+                #"": "latin10",
+                #"iso-8859-6": ""   # arabic
+                #"iso-8859-7": ""   # greek
+                #"iso-8859-8": ""   # hebrew
+                #"iso-8859-10": ""   # latin6, more complete iso-8859-4
+             }
+        if tr.has_key(docutils_encoding.lower()):
+            return tr[docutils_encoding.lower()]
+        # convert: latin-1 and utf-8 and similar things
+        return docutils_encoding.replace("_", "").replace("-", "").lower()
+
+    def language_label(self, docutil_label):
+        return self.language.labels[docutil_label]
+
+    latex_equivalents = {
+        u'\u00A0' : '~',
+        u'\u2013' : '{--}',
+        u'\u2014' : '{---}',
+        u'\u2018' : '`',
+        u'\u2019' : '\'',
+        u'\u201A' : ',',
+        u'\u201C' : '``',
+        u'\u201D' : '\'\'',
+        u'\u201E' : ',,',
+        u'\u2020' : '{\\dag}',
+        u'\u2021' : '{\\ddag}',
+        u'\u2026' : '{\\dots}',
+        u'\u2122' : '{\\texttrademark}',
+        u'\u21d4' : '{$\\Leftrightarrow$}',
+        # greek alphabet ?
+    }
+
+    def unicode_to_latex(self,text):
+        # see LaTeX codec
+        # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
+        # Only some special chracters are translated, for documents with many
+        # utf-8 chars one should use the LaTeX unicode package.
+        for uchar in self.latex_equivalents.keys():
+            text = text.replace(uchar,self.latex_equivalents[uchar])
+        return text
+
+    def ensure_math(self, text):
+        if not self.__dict__.has_key('ensure_math_re'):
+            chars = {
+                # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div
+                'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' ,
+                # also latin5 and latin9
+                }
+            self.ensure_math_re = re.compile('([%s])' % chars['latin1'])
+        text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text)
+        return text
+
+    def encode(self, text):
+        """
+        Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return
+        """
+        # Escaping with a backslash does not help with backslashes, ~ and ^.
+
+        #     < > are only available in math-mode or tt font. (really ?)
+        #     $ starts math- mode.
+        # AND quotes
+        if self.verbatim:
+            return text
+        # compile the regexps once. do it here so one can see them.
+        #
+        # first the braces.
+        if not self.__dict__.has_key('encode_re_braces'):
+            self.encode_re_braces = re.compile(r'([{}])')
+        text = self.encode_re_braces.sub(r'{\\\1}',text)
+        if not self.__dict__.has_key('encode_re_bslash'):
+            # find backslash: except in the form '{\{}' or '{\}}'.
+            self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
+        # then the backslash: except in the form from line above:
+        # either '{\{}' or '{\}}'.
+        text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
+
+        # then dollar
+        text = text.replace("$", '{\\$}')
+        if not ( self.literal_block or self.literal or self.mathmode ):
+            # the vertical bar: in mathmode |,\vert or \mid
+            #   in textmode \textbar
+            text = text.replace("|", '{\\textbar}')
+            text = text.replace("<", '{\\textless}')
+            text = text.replace(">", '{\\textgreater}')
+        # then
+        text = text.replace("&", '{\\&}')
+        # the ^:
+        # * verb|^| does not work in mbox.
+        # * mathmode has wedge. hat{~} would also work.
+        # text = text.replace("^", '{\\ensuremath{^\\wedge}}')
+        text = text.replace("^", '{\\textasciicircum}')
+        text = text.replace("%", '{\\%}')
+        text = text.replace("#", '{\\#}')
+        text = text.replace("~", '{\\textasciitilde}')
+        # Separate compound characters, e.g. "--" to "-{}-".  (The
+        # actual separation is done later; see below.)
+        separate_chars = '-'
+        if self.literal_block or self.literal:
+            # In monospace-font, we also separate ",,", "``" and "''"
+            # and some other characters which can't occur in
+            # non-literal text.
+            separate_chars += ',`\'"<>'
+            # pdflatex does not produce doublequotes for ngerman.
+            text = self.babel.double_quotes_in_tt(text)
+            if self.font_encoding == 'OT1':
+                # We're using OT1 font-encoding and have to replace
+                # underscore by underlined blank, because this has
+                # correct width.
+                text = text.replace('_', '{\\underline{ }}')
+                # And the tt-backslash doesn't work in OT1, so we use
+                # a mirrored slash.
+                text = text.replace('\\textbackslash', '\\reflectbox{/}')
+            else:
+                text = text.replace('_', '{\\_}')
+        else:
+            text = self.babel.quote_quotes(text)
+            if not self.inside_citation_reference_label:
+                text = text.replace("_", '{\\_}')
+        for char in separate_chars * 2:
+            # Do it twice ("* 2") becaues otherwise we would replace
+            # "---" by "-{}--".
+            text = text.replace(char + char, char + '{}' + char)
+        if self.insert_newline or self.literal_block:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace("\n", '~\\\\\n')
+        elif self.mbox_newline:
+            if self.literal_block:
+                closings = "}" * len(self.literal_block_stack)
+                openings = "".join(self.literal_block_stack)
+            else:
+                closings = ""
+                openings = ""
+            text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings))
+        text = text.replace('[', '{[}').replace(']', '{]}')
+        if self.insert_none_breaking_blanks:
+            text = text.replace(' ', '~')
+        if self.latex_encoding != 'utf8':
+            text = self.unicode_to_latex(text)
+            text = self.ensure_math(text)
+        return text
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, encode, and return attribute value text."""
+        return self.encode(whitespace.sub(' ', text))
+
+    def astext(self):
+        if self.pdfinfo is not None and self.pdfauthor:
+            self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor)
+        if self.pdfinfo:
+            pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n'
+        else:
+            pdfinfo = ''
+        head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \
+               (self.title,
+                ' \\and\n'.join(['~\\\\\n'.join(author_lines)
+                                 for author_lines in self.author_stack]),
+                self.date)
+        return ''.join(self.head_prefix + [head] + self.head + [pdfinfo]
+                        + self.body_prefix  + self.body + self.body_suffix)
+
+    def visit_Text(self, node):
+        self.body.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address')
+
+    def depart_address(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_admonition(self, node, name=''):
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
+        if name:
+            self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
+        self.body.append('\\vspace{2mm}\n')
+
+
+    def depart_admonition(self, node=None):
+        self.body.append('}}\n') # end parbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_author(self, node):
+        self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_authors(self, node):
+        # not used: visit_author is called anyway for each author.
+        pass
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.body.append( '\\begin{quote}\n')
+
+    def depart_block_quote(self, node):
+        self.body.append( '\\end{quote}\n')
+
+    def visit_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            if self.use_latex_toc:
+                raise nodes.SkipNode
+            self.body.append( '\\begin{list}{}{}\n' )
+        else:
+            self.body.append( '\\begin{itemize}\n' )
+
+    def depart_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            self.body.append( '\\end{list}\n' )
+        else:
+            self.body.append( '\\end{itemize}\n' )
+
+    # Imperfect superscript/subscript handling: mathmode italicizes
+    # all letters by default.
+    def visit_superscript(self, node):
+        self.body.append('$^{')
+        self.mathmode = 1
+
+    def depart_superscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_subscript(self, node):
+        self.body.append('$_{')
+        self.mathmode = 1
+
+    def depart_subscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_caption(self, node):
+        self.body.append( '\\caption{' )
+
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_title_reference(self, node):
+        self.body.append( '\\titlereference{' )
+
+    def depart_title_reference(self, node):
+        self.body.append( '}' )
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        if self._use_latex_citations:
+            self.context.append(len(self.body))
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_citation(self, node):
+        if self._use_latex_citations:
+            size = self.context.pop()
+            label = self.body[size]
+            text = ''.join(self.body[size+1:])
+            del self.body[size:]
+            self._bibitems.append([label, text])
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('\\cite{')
+            self.inside_citation_reference_label = 1
+        else:
+            href = ''
+            if node.has_key('refid'):
+                href = node['refid']
+            elif node.has_key('refname'):
+                href = self.document.nameids[node['refname']]
+            self.body.append('[\\hyperlink{%s}{' % href)
+
+    def depart_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('}')
+            self.inside_citation_reference_label = 0
+        else:
+            self.body.append('}]')
+
+    def visit_classifier(self, node):
+        self.body.append( '(\\textbf{' )
+
+    def depart_classifier(self, node):
+        self.body.append( '})\n' )
+
+    def visit_colspec(self, node):
+        self.active_table.visit_colspec(node)
+
+    def depart_colspec(self, node):
+        pass
+
+    def visit_comment(self, node):
+        # Escape end of line by a new comment start in comment text.
+        self.body.append('%% %s \n' % node.astext().replace('\n', '\n% '))
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact')
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_container(self, node):
+        pass
+
+    def depart_container(self, node):
+        pass
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        pass
+
+    def depart_definition(self, node):
+        self.body.append('\n')
+
+    def visit_definition_list(self, node):
+        self.body.append( '\\begin{description}\n' )
+
+    def depart_definition_list(self, node):
+        self.body.append( '\\end{description}\n' )
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append( ' ' )
+
+    def depart_description(self, node):
+        pass
+
+    def visit_docinfo(self, node):
+        self.docinfo = []
+        self.docinfo.append('%' + '_'*75 + '\n')
+        self.docinfo.append('\\begin{center}\n')
+        self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n')
+
+    def depart_docinfo(self, node):
+        self.docinfo.append('\\end{tabularx}\n')
+        self.docinfo.append('\\end{center}\n')
+        self.body = self.docinfo + self.body
+        # clear docinfo, so field names are no longer appended.
+        self.docinfo = None
+
+    def visit_docinfo_item(self, node, name):
+        if name == 'author':
+            if not self.pdfinfo == None:
+                if not self.pdfauthor:
+                    self.pdfauthor = self.attval(node.astext())
+                else:
+                    self.pdfauthor += self.author_separator + self.attval(node.astext())
+        if self.use_latex_docinfo:
+            if name in ('author', 'organization', 'contact', 'address'):
+                # We attach these to the last author.  If any of them precedes
+                # the first author, put them in a separate "author" group (for
+                # no better semantics).
+                if name == 'author' or not self.author_stack:
+                    self.author_stack.append([])
+                if name == 'address':   # newlines are meaningful
+                    self.insert_newline = 1
+                    text = self.encode(node.astext())
+                    self.insert_newline = 0
+                else:
+                    text = self.attval(node.astext())
+                self.author_stack[-1].append(text)
+                raise nodes.SkipNode
+            elif name == 'date':
+                self.date = self.attval(node.astext())
+                raise nodes.SkipNode
+        self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name))
+        if name == 'address':
+            self.insert_newline = 1
+            self.docinfo.append('{\\raggedright\n')
+            self.context.append(' } \\\\\n')
+        else:
+            self.context.append(' \\\\\n')
+        self.context.append(self.docinfo)
+        self.context.append(len(self.body))
+
+    def depart_docinfo_item(self, node):
+        size = self.context.pop()
+        dest = self.context.pop()
+        tail = self.context.pop()
+        tail = self.body[size:] + [tail]
+        del self.body[size:]
+        dest.extend(tail)
+        # for address we did set insert_newline
+        self.insert_newline = 0
+
+    def visit_doctest_block(self, node):
+        self.body.append( '\\begin{verbatim}' )
+        self.verbatim = 1
+
+    def depart_doctest_block(self, node):
+        self.body.append( '\\end{verbatim}\n' )
+        self.verbatim = 0
+
+    def visit_document(self, node):
+        self.body_prefix.append('\\begin{document}\n')
+        # titled document?
+        if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title):
+            self.body_prefix.append('\\maketitle\n')
+            # alternative use titlepage environment.
+            # \begin{titlepage}
+            # ...
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+    def depart_document(self, node):
+        # TODO insertion point of bibliography should none automatic.
+        if self._use_latex_citations and len(self._bibitems)>0:
+            if not self.bibtex:
+                widest_label = ""
+                for bi in self._bibitems:
+                    if len(widest_label)<len(bi[0]):
+                        widest_label = bi[0]
+                self.body.append('\n\\begin{thebibliography}{%s}\n'%widest_label)
+                for bi in self._bibitems:
+                    # cite_key: underscores must not be escaped
+                    cite_key = bi[0].replace(r"{\_}","_")
+                    self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+                self.body.append('\\end{thebibliography}\n')
+            else:
+                self.body.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0])
+                self.body.append('\\bibliography{%s}\n' % self.bibtex[1])
+
+        self.body_suffix.append('\\end{document}\n')
+
+    def visit_emphasis(self, node):
+        self.body.append('\\emph{')
+        self.literal_block_stack.append('\\emph{')
+
+    def depart_emphasis(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_entry(self, node):
+        self.active_table.visit_entry()
+        # cell separation
+        if self.active_table.get_entry_number() == 1:
+            # if the firstrow is a multirow, this actually is the second row.
+            # this gets hairy if rowspans follow each other.
+            if self.active_table.get_rowspan(0):
+                count = 0
+                while self.active_table.get_rowspan(count):
+                    count += 1
+                    self.body.append(' & ')
+                self.active_table.visit_entry() # increment cell count
+        else:
+            self.body.append(' & ')
+
+        # multi{row,column}
+        # IN WORK BUG TODO HACK continues here
+        # multirow in LaTeX simply will enlarge the cell over several rows
+        # (the following n if n is positive, the former if negative).
+        if node.has_key('morerows') and node.has_key('morecols'):
+            raise NotImplementedError('Cells that '
+            'span multiple rows *and* columns are not supported, sorry.')
+        if node.has_key('morerows'):
+            count = node['morerows'] + 1
+            self.active_table.set_rowspan(self.active_table.get_entry_number()-1,count)
+            self.body.append('\\multirow{%d}{%s}{' % \
+                    (count,self.active_table.get_column_width()))
+            self.context.append('}')
+            # BUG following rows must have empty cells.
+        elif node.has_key('morecols'):
+            # the vertical bar before column is missing if it is the first column.
+            # the one after always.
+            if self.active_table.get_entry_number() == 1:
+                bar1 = self.active_table.get_vertical_bar()
+            else:
+                bar1 = ''
+            count = node['morecols'] + 1
+            self.body.append('\\multicolumn{%d}{%sl%s}{' % \
+                    (count, bar1, self.active_table.get_vertical_bar()))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+        # header / not header
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        elif self.active_table.is_stub_column():
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header / not header
+        self.body.append(self.context.pop()) # multirow/column
+        # if following row is spanned from above.
+        if self.active_table.get_rowspan(self.active_table.get_entry_number()):
+           self.body.append(' & ')
+           self.active_table.visit_entry() # increment cell count
+
+    def visit_row(self, node):
+        self.active_table.visit_row()
+
+    def depart_row(self, node):
+        self.body.extend(self.active_table.depart_row())
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.
+        # This allows to set the style and starting value
+        # and unlimited nesting.
+        enum_style = {'arabic':'arabic',
+                'loweralpha':'alph',
+                'upperalpha':'Alph',
+                'lowerroman':'roman',
+                'upperroman':'Roman' }
+        enum_suffix = ""
+        if node.has_key('suffix'):
+            enum_suffix = node['suffix']
+        enum_prefix = ""
+        if node.has_key('prefix'):
+            enum_prefix = node['prefix']
+        if self.compound_enumerators:
+            pref = ""
+            if self.section_prefix_for_enumerators and self.section_level:
+                for i in range(self.section_level):
+                    pref += '%d.' % self._section_number[i]
+                pref = pref[:-1] + self.section_enumerator_separator
+                enum_prefix += pref
+            for ctype, cname in self._enumeration_counters:
+                enum_prefix += '\\%s{%s}.' % (ctype, cname)
+        enum_type = "arabic"
+        if node.has_key('enumtype'):
+            enum_type = node['enumtype']
+        if enum_style.has_key(enum_type):
+            enum_type = enum_style[enum_type]
+
+        counter_name = "listcnt%d" % len(self._enumeration_counters)
+        self._enumeration_counters.append((enum_type, counter_name))
+        # If we haven't used this counter name before, then create a
+        # new counter; otherwise, reset & reuse the old counter.
+        if len(self._enumeration_counters) > self._max_enumeration_counters:
+            self._max_enumeration_counters = len(self._enumeration_counters)
+            self.body.append('\\newcounter{%s}\n' % counter_name)
+        else:
+            self.body.append('\\setcounter{%s}{0}\n' % counter_name)
+            
+        self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \
+            (enum_prefix,enum_type,counter_name,enum_suffix))
+        self.body.append('{\n')
+        self.body.append('\\usecounter{%s}\n' % counter_name)
+        # set start after usecounter, because it initializes to zero.
+        if node.has_key('start'):
+            self.body.append('\\addtocounter{%s}{%d}\n' \
+                    % (counter_name,node['start']-1))
+        ## set rightmargin equal to leftmargin
+        self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
+        self.body.append('}\n')
+
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{list}\n')
+        self._enumeration_counters.pop()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_field(self, node):
+        # real output is done in siblings: _argument, _body, _name
+        pass
+
+    def depart_field(self, node):
+        self.body.append('\n')
+        ##self.body.append('%[depart_field]\n')
+
+    def visit_field_argument(self, node):
+        self.body.append('%[visit_field_argument]\n')
+
+    def depart_field_argument(self, node):
+        self.body.append('%[depart_field_argument]\n')
+
+    def visit_field_body(self, node):
+        # BUG by attach as text we loose references.
+        if self.docinfo:
+            self.docinfo.append('%s \\\\\n' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        # BUG: what happens if not docinfo
+
+    def depart_field_body(self, node):
+        self.body.append( '\n' )
+
+    def visit_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\begin{quote}\n')
+            self.body.append('\\begin{description}\n')
+
+    def depart_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\end{description}\n')
+            self.body.append('\\end{quote}\n')
+
+    def visit_field_name(self, node):
+        # BUG this duplicates docinfo_item
+        if self.docinfo:
+            self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        else:
+            self.body.append('\\item [')
+
+    def depart_field_name(self, node):
+        if not self.docinfo:
+            self.body.append(':]')
+
+    def visit_figure(self, node):
+        if (not node.attributes.has_key('align') or
+            node.attributes['align'] == 'center'):
+            # centering does not add vertical space like center.
+            align = '\n\\centering'
+            align_end = ''
+        else:
+            # TODO non vertical space for other alignments.
+            align = '\\begin{flush%s}' % node.attributes['align']
+            align_end = '\\end{flush%s}' % node.attributes['align']
+        self.body.append( '\\begin{figure}[htbp]%s\n' % align )
+        self.context.append( '%s\\end{figure}\n' % align_end )
+
+    def depart_figure(self, node):
+        self.body.append( self.context.pop() )
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = (['\n\\begin{center}\small\n']
+                  + self.body[start:] + ['\n\\end{center}\n'])
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        if self.use_latex_footnotes:
+            num,text = node.astext().split(None,1)
+            num = self.encode(num.strip())
+            self.body.append('\\footnotetext['+num+']')
+            self.body.append('{')
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_footnote(self, node):
+        if self.use_latex_footnotes:
+            self.body.append('}\n')
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            self.body.append("\\footnotemark["+self.encode(node.astext())+"]")
+            raise nodes.SkipNode
+        href = ''
+        if node.has_key('refid'):
+            href = node['refid']
+        elif node.has_key('refname'):
+            href = self.document.nameids[node['refname']]
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        elif format == 'superscript':
+            suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
+            self.context.append('}')
+        else:                           # shouldn't happen
+            raise AssertionError('Illegal footnote reference format.')
+        self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
+
+    def depart_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            return
+        self.body.append('}%s' % self.context.pop())
+
+    # footnote/citation label
+    def label_delim(self, node, bracket, superscript):
+        if isinstance(node.parent, nodes.footnote):
+            if self.use_latex_footnotes:
+                raise nodes.SkipNode
+            if self.settings.footnote_references == 'brackets':
+                self.body.append(bracket)
+            else:
+                self.body.append(superscript)
+        else:
+            assert isinstance(node.parent, nodes.citation)
+            if not self._use_latex_citations:
+                self.body.append(bracket)
+
+    def visit_label(self, node):
+        self.label_delim(node, '[', '$^{')
+
+    def depart_label(self, node):
+        self.label_delim(node, ']', '}$')
+
+    # elements generated by the framework e.g. section numbers.
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        self.body_prefix.append('\n\\verb|begin_header|\n')
+        self.body_prefix.extend(self.body[start:])
+        self.body_prefix.append('\n\\verb|end_header|\n')
+        del self.body[start:]
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def latex_image_length(self, width_str):
+        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+        if not match:
+            # fallback
+            return width_str
+        res = width_str
+        amount, unit = match.groups()[:2]
+        if unit == "px":
+            # LaTeX does not know pixels but points
+            res = "%spt" % amount
+        elif unit == "%":
+            res = "%.3f\\linewidth" % (float(amount)/100.0)
+        return res
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        # Add image URI to dependency list, assuming that it's
+        # referring to a local file.
+        self.settings.record_dependencies.add(attrs['uri'])
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = []
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            include_graphics_options.append('width=%s' % (
+                            self.latex_image_length(attrs['width']), ))
+        if attrs.has_key('height'):
+            include_graphics_options.append('height=%s' % (
+                            self.latex_image_length(attrs['height']), ))
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        self.body.extend( pre )
+        options = ''
+        if len(include_graphics_options)>0:
+            options = '[%s]' % (','.join(include_graphics_options))
+        self.body.append( '\\includegraphics%s{%s}' % (
+                            options, attrs['uri'] ) )
+        self.body.extend( post )
+
+    def depart_image(self, node):
+        pass
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_interpreted(self, node):
+        # @@@ Incomplete, pending a proper implementation on the
+        # Parser/Reader end.
+        self.visit_literal(node)
+
+    def depart_interpreted(self, node):
+        self.depart_literal(node)
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_line(self, node):
+        self.body.append('\item[] ')
+
+    def depart_line(self, node):
+        self.body.append('\n')
+
+    def visit_line_block(self, node):
+        if isinstance(node.parent, nodes.line_block):
+            self.body.append('\\item[] \n'
+                             '\\begin{lineblock}{\\lineblockindentation}\n')
+        else:
+            self.body.append('\n\\begin{lineblock}{0em}\n')
+
+    def depart_line_block(self, node):
+        self.body.append('\\end{lineblock}\n')
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append('\\item {} ')
+
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_literal(self, node):
+        self.literal = 1
+        self.body.append('\\texttt{')
+
+    def depart_literal(self, node):
+        self.body.append('}')
+        self.literal = 0
+
+    def visit_literal_block(self, node):
+        """
+        Render a literal-block.
+
+        Literal blocks are used for "::"-prefixed literal-indented
+        blocks of text, where the inline markup is not recognized,
+        but are also the product of the parsed-literal directive,
+        where the markup is respected.
+        """
+        # In both cases, we want to use a typewriter/monospaced typeface.
+        # For "real" literal-blocks, we can use \verbatim, while for all
+        # the others we must use \mbox.
+        #
+        # We can distinguish between the two kinds by the number of
+        # siblings that compose this node: if it is composed by a
+        # single element, it's surely either a real one or a
+        # parsed-literal that does not contain any markup.
+        #
+        if not self.active_table.is_open():
+            # no quote inside tables, to avoid vertical space between
+            # table border and literal block.
+            # BUG: fails if normal text preceeds the literal block.
+            self.body.append('\\begin{quote}')
+            self.context.append('\\end{quote}\n')
+        else:
+            self.body.append('\n')
+            self.context.append('\n')
+        if (self.settings.use_verbatim_when_possible and (len(node) == 1)
+              # in case of a parsed-literal containing just a "**bold**" word:
+              and isinstance(node[0], nodes.Text)):
+            self.verbatim = 1
+            self.body.append('\\begin{verbatim}\n')
+        else:
+            self.literal_block = 1
+            self.insert_none_breaking_blanks = 1
+            self.body.append('{\\ttfamily \\raggedright \\noindent\n')
+            # * obey..: is from julien and never worked for me (grubert).
+            #   self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n')
+
+    def depart_literal_block(self, node):
+        if self.verbatim:
+            self.body.append('\n\\end{verbatim}\n')
+            self.verbatim = 0
+        else:
+            self.body.append('\n}')
+            self.insert_none_breaking_blanks = 0
+            self.literal_block = 0
+            # obey end: self.body.append('}\n')
+        self.body.append(self.context.pop())
+
+    def visit_meta(self, node):
+        self.body.append('[visit_meta]\n')
+        # BUG maybe set keywords for pdf
+        ##self.head.append(self.starttag(node, 'meta', **node.attributes))
+
+    def depart_meta(self, node):
+        self.body.append('[depart_meta]\n')
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+
+    def depart_note(self, node):
+        self.depart_admonition()
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+
+    def depart_option(self, node):
+        # flag tha the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.body.append('\\item [')
+        # flag for first option
+        self.context.append(0)
+
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.body.append('] ')
+
+    def visit_option_list(self, node):
+        self.body.append('\\begin{optionlist}{3cm}\n')
+
+    def depart_option_list(self, node):
+        self.body.append('\\end{optionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ##self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+        pass
+
+    def depart_option_string(self, node):
+        ##self.body.append('</span>')
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_paragraph(self, node):
+        index = node.parent.index(node)
+        if not ('contents' in self.topic_classes or
+                (isinstance(node.parent, nodes.compound) and
+                 index > 0 and
+                 not isinstance(node.parent[index - 1], nodes.paragraph) and
+                 not isinstance(node.parent[index - 1], nodes.compound))):
+            self.body.append('\n')
+
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_problematic(self, node):
+        self.body.append('{\\color{red}\\bfseries{}')
+
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        # BUG: hash_char "#" is trouble some in LaTeX.
+        # mbox and other environment do not like the '#'.
+        hash_char = '\\#'
+        if node.has_key('refuri'):
+            href = node['refuri'].replace('#',hash_char)
+        elif node.has_key('refid'):
+            href = hash_char + node['refid']
+        elif node.has_key('refname'):
+            href = hash_char + self.document.nameids[node['refname']]
+        else:
+            raise AssertionError('Unknown reference.')
+        self.body.append('\\href{%s}{' % href)
+        if self._reference_label and not node.has_key('refuri'):
+            self.body.append('\\%s{%s}}' % (self._reference_label,
+                        href.replace(hash_char, '')))
+            raise nodes.SkipNode
+
+    def depart_reference(self, node):
+        self.body.append('}')
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision')
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_section(self, node):
+        self.section_level += 1
+        # Initialize counter for potential subsections:
+        self._section_number.append(0)
+        # Counter for this section's level (initialized by parent section):
+        self._section_number[self.section_level - 1] += 1
+
+    def depart_section(self, node):
+        # Remove counter for potential subsections:
+        self._section_number.pop()
+        self.section_level -= 1
+
+    def visit_sidebar(self, node):
+        # BUG:  this is just a hack to make sidebars render something
+        self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n')
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
+
+    def depart_sidebar(self, node):
+        self.body.append('}}}\n') # end parbox colorbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+
+    attribution_formats = {'dash': ('---', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append(prefix)
+        self.context.append(suffix)
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '\n')
+        self.body.append('\\end{flushright}\n')
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status')
+
+    def depart_status(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_strong(self, node):
+        self.body.append('\\textbf{')
+        self.literal_block_stack.append('\\textbf{')
+
+    def depart_strong(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.document):
+            self.title = self.title + \
+                '\\\\\n\\large{%s}\n' % self.encode(node.astext())
+            raise nodes.SkipNode
+        elif isinstance(node.parent, nodes.section):
+            self.body.append('\\textbf{')
+            self.context.append('}\\vspace{0.2cm}\n\n\\noindent ')
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_system_message(self, node):
+        pass
+
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def visit_table(self, node):
+        if self.active_table.is_open():
+            self.table_stack.append(self.active_table)
+            # nesting longtable does not work (e.g. 2007-04-18)
+            self.active_table = Table('tabular',self.settings.table_style)
+        self.active_table.open()
+        for cl in node['classes']:
+            self.active_table.set_table_style(cl)
+        self.body.append('\n' + self.active_table.get_opening())
+
+    def depart_table(self, node):
+        self.body.append(self.active_table.get_closing() + '\n')
+        self.active_table.close()
+        if len(self.table_stack)>0:
+            self.active_table = self.table_stack.pop()
+        else:
+            self.active_table.set_table_style(self.settings.table_style)
+
+    def visit_target(self, node):
+        # BUG: why not (refuri or refid or refname) means not footnote ?
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}{' % id)
+            self.context.append('}' * len(node['ids']))
+        elif node.get("refid"):
+            self.body.append('\\hypertarget{%s}{' % node.get("refid"))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        # BUG write preamble if not yet done (colspecs not [])
+        # for tables without heads.
+        if not self.active_table.get('preamble written'):
+            self.visit_thead(None)
+            # self.depart_thead(None)
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.body.append('\\item[{')
+
+    def depart_term(self, node):
+        # definition list term.
+        # \leavevmode results in a line break if the term is followed by a item list.
+        self.body.append('}] \leavevmode ')
+
+    def visit_tgroup(self, node):
+        #self.body.append(self.starttag(node, 'colgroup'))
+        #self.context.append('</colgroup>\n')
+        pass
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.body.append('{%s}\n' % self.active_table.get_colspecs())
+        if self.active_table.caption:
+            self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption)
+        self.active_table.set('preamble written',1)
+        # TODO longtable supports firsthead and lastfoot too.
+        self.body.extend(self.active_table.visit_thead())
+
+    def depart_thead(self, node):
+        # the table header written should be on every page
+        # => \endhead
+        self.body.extend(self.active_table.depart_thead())
+        # and the firsthead => \endfirsthead
+        # BUG i want a "continued from previous page" on every not
+        # firsthead, but then we need the header twice.
+        #
+        # there is a \endfoot and \endlastfoot too.
+        # but we need the number of columns to
+        # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns)
+        # self.body.append('\\hline\n\\endfoot\n')
+        # self.body.append('\\hline\n')
+        # self.body.append('\\endlastfoot\n')
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    def bookmark(self, node):
+        """Append latex href and pdfbookmarks for titles.
+        """
+        if node.parent['ids']:
+            for id in node.parent['ids']:
+                self.body.append('\\hypertarget{%s}{}\n' % id)
+            if not self.use_latex_toc:
+                # BUG level depends on style. pdflatex allows level 0 to 3
+                # ToC would be the only on level 0 so i choose to decrement the rest.
+                # "Table of contents" bookmark to see the ToC. To avoid this
+                # we set all zeroes to one.
+                l = self.section_level
+                if l>0:
+                    l = l-1
+                # pdftex does not like "_" subscripts in titles
+                text = self.encode(node.astext())
+                for id in node.parent['ids']:
+                    self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \
+                                     (l, text, id))
+
+    def visit_title(self, node):
+        """Section and other titles."""
+
+        if isinstance(node.parent, nodes.topic):
+            # the table of contents.
+            self.bookmark(node)
+            if ('contents' in self.topic_classes
+            and self.use_latex_toc):
+                self.body.append('\\renewcommand{\\contentsname}{')
+                self.context.append('}\n\\tableofcontents\n\n\\bigskip\n')
+            elif ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+                raise nodes.SkipNode
+            else: # or section titles before the table of contents.
+                # BUG: latex chokes on center environment with 
+                # "perhaps a missing item", therefore we use hfill.
+                self.body.append('\\subsubsection*{~\\hfill ')
+                # the closing brace for subsection.
+                self.context.append('\\hfill ~}\n')
+        # TODO: for admonition titles before the first section
+        # either specify every possible node or ... ?
+        elif isinstance(node.parent, nodes.sidebar) \
+        or isinstance(node.parent, nodes.admonition):
+            self.body.append('\\textbf{\\large ')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.table):
+            # caption must be written after column spec
+            self.active_table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        elif self.section_level == 0:
+            # document title
+            self.title = self.encode(node.astext())
+            if not self.pdfinfo == None:
+                self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) )
+            raise nodes.SkipNode
+        else:
+            self.body.append('\n\n')
+            self.body.append('%' + '_' * 75)
+            self.body.append('\n\n')
+            self.bookmark(node)
+
+            if self.use_latex_toc:
+                section_star = ""
+            else:
+                section_star = "*"
+
+            section_name = self.d_class.section(self.section_level)
+            self.body.append('\\%s%s{' % (section_name, section_star))
+            # MAYBE postfix paragraph and subparagraph with \leavemode to
+            # ensure floatables stay in the section and text starts on a new line.
+            self.context.append('}\n')
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        for id in node.parent['ids']:
+            self.body.append('\\label{%s}\n' % id)
+
+    def visit_topic(self, node):
+        self.topic_classes = node['classes']
+        if ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+            self.body.append('\\begin{abstract}\n')
+
+    def depart_topic(self, node):
+        if ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+            self.body.append('\\end{abstract}\n')
+        self.topic_classes = []
+        if 'contents' in node['classes'] and self.use_latex_toc:
+            pass
+        else:
+            self.body.append('\n')
+
+    def visit_inline(self, node): # titlereference
+        classes = node.get('classes', ['Unknown', ])
+        for cls in classes:
+            self.body.append( '\\docutilsrole%s{' % cls)
+        self.context.append('}'*len(classes))
+
+    def depart_inline(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_rubric(self, node):
+        self.body.append('\\rubric{')
+        self.context.append('}\n')
+
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_transition(self, node):
+        self.body.append('\n\n')
+        self.body.append('%' + '_' * 75)
+        self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}')
+        self.body.append('\n\n')
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version')
+
+    def depart_version(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+
+    def depart_warning(self, node):
+        self.depart_admonition()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+#    def unknown_visit(self, node):
+#    def default_visit(self, node):
+
+# vim: set ts=4 et ai :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+% latex include file for docutils latex writer
+% --------------------------------------------
+%
+% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $
+%
+% This is included at the end of the latex header in the generated file,
+% to allow overwriting defaults, although this could get hairy.
+% Generated files should process well standalone too, LaTeX might give a
+% message about a missing file.
+
+% donot indent first line of paragraph.
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt plus 2pt minus 1pt}
+
+% sloppy
+% ------
+% Less strict (opposite to default fussy) space size between words. Therefore
+% less hyphenation.
+\sloppy
+
+% fonts
+% -----
+% times for pdf generation, gives smaller pdf files.
+%
+% But in standard postscript fonts: courier and times/helvetica do not fit.
+% Maybe use pslatex.
+\usepackage{times}
+
+% pagestyle
+% ---------
+% headings might put section titles in the page heading, but not if
+% the table of contents is done by docutils.
+% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt}
+% should be set too.
+%\pagestyle{plain}
+%
+% or use fancyhdr (untested !)
+%\usepackage{fancyhdr}
+%\pagestyle{fancy}
+%\addtolength{\headheight}{\\baselineskip}
+%\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
+%\renewcommand{\subsectionmark}[1]{\markright{#1}}
+%\fancyhf{}
+%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
+%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
+%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
+%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
+%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
+
+% geometry 
+% --------
+% = papersizes and margins
+%\geometry{a4paper,twoside,tmargin=1.5cm,
+%          headheight=1cm,headsep=0.75cm}
+
+% Do section number display
+% -------------------------
+%\makeatletter
+%\def\@seccntformat#1{}
+%\makeatother
+% no numbers in toc
+%\renewcommand{\numberline}[1]{}
+
+
+% change maketitle
+% ----------------
+%\renewcommand{\maketitle}{
+%  \begin{titlepage}
+%    \begin{center}
+%    \textsf{TITLE \@title} \\
+%       Date: \today
+%    \end{center}
+%  \end{titlepage}
+%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,825 @@
+# $Id: __init__.py 5174 2007-05-31 00:01:52Z wiemann $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+# Thanks to Engelbert Gruber and various contributors for the original
+# LaTeX writer, some code and many ideas of which have been used for
+# this writer.
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import os.path
+from types import ListType
+
+import docutils
+from docutils import nodes, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('newlatex', 'newlatex2e')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'base.tex'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'Note that this LaTeX writer is still EXPERIMENTAL and not '
+        'feature-complete. ',
+        (('Specify a stylesheet file.  The path is used verbatim to include '
+          'the file.  Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Specify a user stylesheet file.  See --stylesheet.',
+          ['--user-stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'user_stylesheet_path'}),
+         ('Specify a user stylesheet file.  See --stylesheet-path.',
+          ['--user-stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'user_stylesheet'})
+         ),)
+
+    settings_defaults = {
+        # Many Unicode characters are provided by unicode_map.py, so
+        # we can default to latin-1.
+        'output_encoding': 'latin-1',
+        'output_encoding_error_handler': 'strict',
+        # Since we are using superscript footnotes, it is necessary to
+        # trim whitespace in front of footnote references.
+        'trim_footnote_reference_space': 1,
+        # Currently unsupported:
+        'docinfo_xform': 0,
+        # During development:
+        'traceback': 1
+        }
+
+    relative_path_settings = ('stylesheet_path', 'user_stylesheet_path')
+
+    config_section = 'newlatex2e writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [
+            writer_aux.Compound, writer_aux.Admonitions]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        assert not visitor.context, 'context not empty: %s' % visitor.context
+        self.output = visitor.astext()
+        self.head = visitor.header
+        self.body = visitor.body
+
+
+class LaTeXException(Exception):
+    """
+    Exception base class to for exceptions which influence the
+    automatic generation of LaTeX code.
+    """
+
+
+class SkipAttrParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\DECattr`` and ``\renewcommand{\DEVparent}{...}`` for this
+    node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class SkipParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\renewcommand{\DEVparent}{...}`` for this node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class LaTeXTranslator(nodes.SparseNodeVisitor):
+
+    # Country code by a.schlock.
+    # Partly manually converted from iso and babel stuff.
+    iso639_to_babel = {
+        'no': 'norsk',     # added by hand
+        'gd': 'scottish',  # added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    # Start with left double quote.
+    left_quote = 1
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = document.settings
+        self.header = []
+        self.body = []
+        self.context = []
+        self.stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.stylesheet_path:
+            self.settings.record_dependencies.add(self.stylesheet_path)
+        # This ugly hack will be cleaned up when refactoring the
+        # stylesheet mess.
+        self.settings.stylesheet = self.settings.user_stylesheet
+        self.settings.stylesheet_path = self.settings.user_stylesheet_path
+        self.user_stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.user_stylesheet_path:
+            self.settings.record_dependencies.add(self.user_stylesheet_path)
+        self.write_header()
+
+    def write_header(self):
+        a = self.header.append
+        a('%% Generated by Docutils %s <http://docutils.sourceforge.net>.'
+          % docutils.__version__)
+        a('')
+        a('% Docutils settings:')
+        lang = self.settings.language_code or ''
+        a(r'\providecommand{\DEVlanguageiso}{%s}' % lang)
+        a(r'\providecommand{\DEVlanguagebabel}{%s}' % self.iso639_to_babel.get(
+            lang, self.iso639_to_babel.get(lang.split('_')[0], '')))
+        a('')
+        if self.user_stylesheet_path:
+            a('% User stylesheet:')
+            a(r'\input{%s}' % self.user_stylesheet_path)
+        a('% Docutils stylesheet:')
+        a(r'\input{%s}' % self.stylesheet_path)
+        a('')
+        a('% Default definitions for Docutils nodes:')
+        for node_name in nodes.node_class_names:
+            a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', ''))
+        a('')
+        a('% Auxiliary definitions:')
+        for attr in (r'\DEVparent \DEVattrlen \DEVtitleastext '
+                     r'\DEVsinglebackref \DEVmultiplebackrefs'
+                     ).split():
+            # Later set using \renewcommand.
+            a(r'\providecommand{%s}{DOCUTILSUNINITIALIZEDVARIABLE}' % attr)
+        for attr in (r'\DEVparagraphindented \DEVhassubtitle').split():
+            # Initialize as boolean variables.
+            a(r'\providecommand{%s}{false}' % attr)
+        a('\n\n')
+
+    unicode_map = unicode_map.unicode_map # comprehensive Unicode map
+    # Fix problems with unimap.py.
+    unicode_map.update({
+        # We have AE or T1 encoding, so "``" etc. work.  The macros
+        # from unimap.py may *not* work.
+        u'\u201C': '{``}',
+        u'\u201D': "{''}",
+        u'\u201E': '{,,}',
+        })
+
+    character_map = {
+        '\\': r'{\textbackslash}',
+        '{': r'{\{}',
+        '}': r'{\}}',
+        '$': r'{\$}',
+        '&': r'{\&}',
+        '%': r'{\%}',
+        '#': r'{\#}',
+        '[': r'{[}',
+        ']': r'{]}',
+        '-': r'{-}',
+        '`': r'{`}',
+        "'": r"{'}",
+        ',': r'{,}',
+        '"': r'{"}',
+        '|': r'{\textbar}',
+        '<': r'{\textless}',
+        '>': r'{\textgreater}',
+        '^': r'{\textasciicircum}',
+        '~': r'{\textasciitilde}',
+        '_': r'{\DECtextunderscore}',
+        }
+    character_map.update(unicode_map)
+    #character_map.update(special_map)
+    
+    # `att_map` is for encoding attributes.  According to
+    # <http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-164.html>,
+    # the following characters are special: # $ % & ~ _ ^ \ { }
+    # These work without special treatment in macro parameters:
+    # $, &, ~, _, ^
+    att_map = {'#': '\\#',
+               '%': '\\%',
+               # We cannot do anything about backslashes.
+               '\\': '',
+               '{': '\\{',
+               '}': '\\}',
+               # The quotation mark may be redefined by babel.
+               '"': '"{}',
+               }
+    att_map.update(unicode_map)
+
+    def encode(self, text, attval=None):
+        """
+        Encode special characters in ``text`` and return it.
+
+        If attval is true, preserve as much as possible verbatim (used
+        in attribute value encoding).  If attval is 'width' or
+        'height', `text` is interpreted as a length value.
+        """
+        if attval in ('width', 'height'):
+            match = re.match(r'([0-9.]+)(\S*)$', text)
+            assert match, '%s="%s" must be a length' % (attval, text)
+            value, unit = match.groups()
+            if unit == '%':
+                value = str(float(value) / 100)
+                unit = r'\DECrelativeunit'
+            elif unit in ('', 'px'):
+                # If \DECpixelunit is "pt", this gives the same notion
+                # of pixels as graphicx.  This is a bit of a hack.
+                value = str(float(value) * 0.75)
+                unit = '\DECpixelunit'
+            return '%s%s' % (value, unit)
+        if attval:
+            get = self.att_map.get
+        else:
+            get = self.character_map.get
+        text = ''.join([get(c, c) for c in text])
+        if (self.literal_block or self.inline_literal) and not attval:
+            # NB: We can have inline literals within literal blocks.
+            # Shrink '\r\n'.
+            text = text.replace('\r\n', '\n')
+            # Convert space.  If "{ }~~~~~" is wrapped (at the
+            # brace-enclosed space "{ }"), the following non-breaking
+            # spaces ("~~~~") do *not* wind up at the beginning of the
+            # next line.  Also note that no hyphenation is done if the
+            # breaking space ("{ }") comes *after* the non-breaking
+            # spaces.
+            if self.literal_block:
+                # Replace newlines with real newlines.
+                text = text.replace('\n', '\mbox{}\\\\{}')
+                replace_fn = self.encode_replace_for_literal_block_spaces
+            else:
+                replace_fn = self.encode_replace_for_inline_literal_spaces
+            text = re.sub(r'\s+', replace_fn, text)
+            # Protect hyphens; if we don't, line breaks will be
+            # possible at the hyphens and even the \textnhtt macro
+            # from the hyphenat package won't change that.
+            text = text.replace('-', r'\mbox{-}')
+            text = text.replace("'", r'{\DECtextliteralsinglequote}')
+            return text
+        else:
+            if not attval:
+                # Replace space with single protected space.
+                text = re.sub(r'\s+', '{ }', text)
+                # Replace double quotes with macro calls.
+                L = []
+                for part in text.split(self.character_map['"']):
+                    if L:
+                        # Insert quote.
+                        L.append(self.left_quote and r'{\DECtextleftdblquote}'
+                                 or r'{\DECtextrightdblquote}')
+                        self.left_quote = not self.left_quote
+                    L.append(part)
+                return ''.join(L)
+            else:
+                return text
+
+    def encode_replace_for_literal_block_spaces(self, match):
+        return '~' * len(match.group())
+
+    def encode_replace_for_inline_literal_spaces(self, match):
+        return '{ }' + '~' * (len(match.group()) - 1)
+
+    def astext(self):
+        return '\n'.join(self.header) + (''.join(self.body))
+
+    def append(self, text, newline='%\n'):
+        """
+        Append text, stripping newlines, producing nice LaTeX code.
+        """
+        lines = ['  ' * self.indentation_level + line + newline
+                 for line in text.splitlines(0)]
+        self.body.append(''.join(lines))
+
+    def visit_Text(self, node):
+        self.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def is_indented(self, paragraph):
+        """Return true if `paragraph` should be first-line-indented."""
+        assert isinstance(paragraph, nodes.paragraph)
+        siblings = [n for n in paragraph.parent if
+                    self.is_visible(n) and not isinstance(n, nodes.Titular)]
+        index = siblings.index(paragraph)
+        if ('continued' in paragraph['classes'] or
+            index > 0 and isinstance(siblings[index-1], nodes.transition)):
+            return 0
+        # Indent all but the first paragraphs.
+        return index > 0
+
+    def before_paragraph(self, node):
+        self.append(r'\renewcommand{\DEVparagraphindented}{%s}'
+                    % (self.is_indented(node) and 'true' or 'false'))
+
+    def before_title(self, node):
+        self.append(r'\renewcommand{\DEVtitleastext}{%s}'
+                    % self.encode(node.astext()))
+        self.append(r'\renewcommand{\DEVhassubtitle}{%s}'
+                    % ((len(node.parent) > 2 and
+                        isinstance(node.parent[1], nodes.subtitle))
+                       and 'true' or 'false'))
+
+    def before_generated(self, node):
+        if 'sectnum' in node['classes']:
+            node[0] = node[0].strip()
+
+    literal_block = 0
+
+    def visit_literal_block(self, node):
+        self.literal_block = 1
+
+    def depart_literal_block(self, node):
+        self.literal_block = 0
+
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    inline_literal = 0
+
+    def visit_literal(self, node):
+        self.inline_literal += 1
+
+    def depart_literal(self, node):
+        self.inline_literal -= 1
+
+    def _make_encodable(self, text):
+        """
+        Return text (a unicode object) with all unencodable characters
+        replaced with '?'.
+
+        Thus, the returned unicode string is guaranteed to be encodable.
+        """
+        encoding = self.settings.output_encoding
+        return text.encode(encoding, 'replace').decode(encoding)
+
+    def visit_comment(self, node):
+        """
+        Insert the comment unchanged into the document, replacing
+        unencodable characters with '?'.
+
+        (This is done in order not to fail if comments contain unencodable
+        characters, because our default encoding is not UTF-8.)
+        """
+        self.append('\n'.join(['% ' + self._make_encodable(line) for line
+                               in node.astext().splitlines(0)]), newline='\n')
+        raise nodes.SkipChildren
+
+    def before_topic(self, node):
+        if 'contents' in node['classes']:
+            for bullet_list in list(node.traverse(nodes.bullet_list)):
+                p = bullet_list.parent
+                if isinstance(p, nodes.list_item):
+                    p.parent.insert(p.parent.index(p) + 1, bullet_list)
+                    del p[1]
+            for paragraph in node.traverse(nodes.paragraph):
+                paragraph.attributes.update(paragraph[0].attributes)
+                paragraph[:] = paragraph[0]
+                paragraph.parent['tocrefid'] = paragraph['refid']
+            node['contents'] = 1
+        else:
+            node['contents'] = 0
+
+    bullet_list_level = 0
+
+    def visit_bullet_list(self, node):
+        self.append(r'\DECsetbullet{\labelitem%s}' %
+                    ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)])
+        self.bullet_list_level += 1
+
+    def depart_bullet_list(self, node):
+        self.bullet_list_level -= 1
+
+    enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha':
+                   'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'}
+
+    enum_counter = 0
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.  This allows
+        # to set the style and starting value and unlimited nesting.
+        # Maybe the actual creation (\DEC) can be moved to the
+        # stylesheet?
+        self.enum_counter += 1
+        enum_prefix = self.encode(node['prefix'])
+        enum_suffix = self.encode(node['suffix'])
+        enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic')
+        start = node.get('start', 1) - 1
+        counter = 'Denumcounter%d' % self.enum_counter
+        self.append(r'\DECmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{'
+                    % (enum_prefix, enum_type, enum_suffix, counter, start))
+                    # for Emacs: }
+
+    def depart_enumerated_list(self, node):
+        self.append('}')  # for Emacs: {
+
+    def before_list_item(self, node):
+        # XXX needs cleanup.
+        if (len(node) and (isinstance(node[-1], nodes.TextElement) or
+                           isinstance(node[-1], nodes.Text)) and
+            node.parent.index(node) == len(node.parent) - 1):
+            node['lastitem'] = 'true'
+
+    before_line = before_list_item
+
+    def before_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            # We're inserting the text in before_raw and thus outside
+            # of \DN... and \DECattr in order to make grouping with
+            # curly brackets work.
+            self.append(node.astext())
+        raise nodes.SkipChildren
+
+    def process_backlinks(self, node, type):
+        """
+        Add LaTeX handling code for backlinks of footnote or citation
+        node `node`.  `type` is either 'footnote' or 'citation'.
+        """
+        self.append(r'\renewcommand{\DEVsinglebackref}{}')
+        self.append(r'\renewcommand{\DEVmultiplebackrefs}{}')
+        if len(node['backrefs']) > 1:
+            refs = []
+            for i in range(len(node['backrefs'])):
+                # \DECmulticitationbacklink or \DECmultifootnotebacklink.
+                refs.append(r'\DECmulti%sbacklink{%s}{%s}'
+                            % (type, node['backrefs'][i], i + 1))
+            self.append(r'\renewcommand{\DEVmultiplebackrefs}{(%s){ }}'
+                        % ', '.join(refs))
+        elif len(node['backrefs']) == 1:
+            self.append(r'\renewcommand{\DEVsinglebackref}{%s}'
+                        % node['backrefs'][0])
+
+    def visit_footnote(self, node):
+        self.process_backlinks(node, 'footnote')
+
+    def visit_citation(self, node):
+        self.process_backlinks(node, 'citation')
+
+    def before_table(self, node):
+        # A table contains exactly one tgroup.  See before_tgroup.
+        pass
+
+    def before_tgroup(self, node):
+        widths = []
+        total_width = 0
+        for i in range(int(node['cols'])):
+            assert isinstance(node[i], nodes.colspec)
+            widths.append(int(node[i]['colwidth']) + 1)
+            total_width += widths[-1]
+        del node[:len(widths)]
+        tablespec = '|'
+        for w in widths:
+            # 0.93 is probably wrong in many cases.  XXX Find a
+            # solution which works *always*.
+            tablespec += r'p{%s\textwidth}|' % (0.93 * w /
+                                                max(total_width, 60))
+        self.append(r'\DECmaketable{%s}{' % tablespec)
+        self.context.append('}')
+        raise SkipAttrParentLaTeX
+
+    def depart_tgroup(self, node):
+        self.append(self.context.pop())
+
+    def before_row(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_thead(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_tbody(self, node):
+        raise SkipAttrParentLaTeX
+
+    def is_simply_entry(self, node):
+        return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or
+                len(node) == 0)
+
+    def before_entry(self, node):
+        is_leftmost = 0
+        if node.hasattr('morerows'):
+            self.document.reporter.severe('Rowspans are not supported.')
+            # Todo: Add empty cells below rowspanning cell and issue
+            # warning instead of severe.
+        if node.hasattr('morecols'):
+            # The author got a headache trying to implement
+            # multicolumn support.
+            if not self.is_simply_entry(node):
+                self.document.reporter.severe(
+                    'Colspanning table cells may only contain one paragraph.')
+                # Todo: Same as above.
+            # The number of columns this entry spans (as a string).
+            colspan = int(node['morecols']) + 1
+            del node['morecols']
+        else:
+            colspan = 1
+        # Macro to call -- \DECcolspan or \DECcolspanleft.
+        macro_name = r'\DECcolspan'
+        if node.parent.index(node) == 0:
+            # Leftmost column.
+            macro_name += 'left'
+            is_leftmost = 1
+        if colspan > 1:
+            self.append('%s{%s}{' % (macro_name, colspan))
+            self.context.append('}')
+        else:
+            # Do not add a multicolumn with colspan 1 beacuse we need
+            # at least one non-multicolumn cell per column to get the
+            # desired column widths, and we can only do colspans with
+            # cells consisting of only one paragraph.
+            if not is_leftmost:
+                self.append(r'\DECsubsequententry{')
+                self.context.append('}')
+            else:
+                self.context.append('')
+        if isinstance(node.parent.parent, nodes.thead):
+            node['tableheaderentry'] = 'true'
+
+        # Don't add \renewcommand{\DEVparent}{...} because there must
+        # not be any non-expandable commands in front of \multicolumn.
+        raise SkipParentLaTeX
+
+    def depart_entry(self, node):
+        self.append(self.context.pop())
+
+    def before_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    indentation_level = 0
+
+    def node_name(self, node):
+        return node.__class__.__name__.replace('_', '')
+
+    # Attribute propagation order.
+    attribute_order = ['align', 'classes', 'ids']
+
+    def attribute_cmp(self, a1, a2):
+        """
+        Compare attribute names `a1` and `a2`.  Used in
+        propagate_attributes to determine propagation order.
+
+        See built-in function `cmp` for return value.
+        """
+        if a1 in self.attribute_order and a2 in self.attribute_order:
+            return cmp(self.attribute_order.index(a1),
+                       self.attribute_order.index(a2))
+        if (a1 in self.attribute_order) != (a2 in self.attribute_order):
+            # Attributes not in self.attribute_order come last.
+            return a1 in self.attribute_order and -1 or 1
+        else:
+            return cmp(a1, a2)
+
+    def propagate_attributes(self, node):
+        # Propagate attributes using \DECattr macros.
+        node_name = self.node_name(node)
+        attlist = []
+        if isinstance(node, nodes.Element):
+            attlist = node.attlist()
+        attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0],
+                                                             pair2[0]))
+        # `numatts` may be greater than len(attlist) due to list
+        # attributes.
+        numatts = 0
+        pass_contents = self.pass_contents(node)
+        for key, value in attlist:
+            if isinstance(value, ListType):
+                self.append(r'\renewcommand{\DEVattrlen}{%s}' % len(value))
+                for i in range(len(value)):
+                    self.append(r'\DECattr{%s}{%s}{%s}{%s}{' %
+                                (i+1, key, self.encode(value[i], attval=key),
+                                 node_name))
+                    if not pass_contents:
+                        self.append('}')
+                numatts += len(value)
+            else:
+                self.append(r'\DECattr{}{%s}{%s}{%s}{' %
+                            (key, self.encode(unicode(value), attval=key),
+                             node_name))
+                if not pass_contents:
+                    self.append('}')
+                numatts += 1
+        if pass_contents:
+            self.context.append('}' * numatts)  # for Emacs: {
+        else:
+            self.context.append('')
+
+    def visit_docinfo(self, node):
+        raise NotImplementedError('Docinfo not yet implemented.')
+
+    def visit_document(self, node):
+        document = node
+        # Move IDs into TextElements.  This won't work for images.
+        # Need to review this.
+        for node in document.traverse(nodes.Element):
+            if node.has_key('ids') and not isinstance(node,
+                                                      nodes.TextElement):
+                next_text_element = node.next_node(nodes.TextElement)
+                if next_text_element:
+                    next_text_element['ids'].extend(node['ids'])
+                    node['ids'] = []
+
+    def pass_contents(self, node):
+        r"""
+        Return True if the node contents should be passed in
+        \DN<nodename>{<contents>} and \DECattr{}{}{}{}{<contents>}.
+        Return False if the node contents should be passed in
+        \DECvisit<nodename> <contents> \DECdepart<nodename>, and no
+        attribute handler should be called.
+        """
+        # Passing the whole document or whole sections as parameters
+        # to \DN... or \DECattr causes LaTeX to run out of memory.
+        return not isinstance(node, (nodes.document, nodes.section))
+
+    def dispatch_visit(self, node):
+        skip_attr = skip_parent = 0
+        # TreePruningException to be propagated.
+        tree_pruning_exception = None
+        if hasattr(self, 'before_' + node.__class__.__name__):
+            try:
+                getattr(self, 'before_' + node.__class__.__name__)(node)
+            except SkipParentLaTeX:
+                skip_parent = 1
+            except SkipAttrParentLaTeX:
+                skip_attr = 1
+                skip_parent = 1
+            except nodes.SkipNode:
+                raise
+            except (nodes.SkipChildren, nodes.SkipSiblings), instance:
+                tree_pruning_exception = instance
+            except nodes.SkipDeparture:
+                raise NotImplementedError(
+                    'SkipDeparture not usable in LaTeX writer')
+
+        if not isinstance(node, nodes.Text):
+            node_name = self.node_name(node)
+            # attribute_deleters will be appended to self.context.
+            attribute_deleters = []
+            if not skip_parent and not isinstance(node, nodes.document):
+                self.append(r'\renewcommand{\DEVparent}{%s}'
+                            % self.node_name(node.parent))
+                for name, value in node.attlist():
+                    if not isinstance(value, ListType) and not ':' in name:
+                        # For non-list and non-special (like
+                        # 'xml:preserve') attributes, set
+                        # \DEVcurrentN<nodename>A<attribute> to the
+                        # attribute value, so that the value of the
+                        # attribute is available in the node handler
+                        # and all children.
+                        macro = r'\DEVcurrentN%sA%s' % (node_name, name)
+                        self.append(r'\def%s{%s}' % (
+                            macro, self.encode(unicode(value), attval=name)))
+                        # Make the attribute undefined afterwards.
+                        attribute_deleters.append(r'\let%s=\relax' % macro)
+            self.context.append('\n'.join(attribute_deleters))
+            if self.pass_contents(node):
+                # Call \DN<nodename>{<contents>}.
+                self.append(r'\DN%s{' % node_name)
+                self.context.append('}')
+            else:
+                # Call \DECvisit<nodename> <contents>
+                # \DECdepart<nodename>.  (Maybe we should use LaTeX
+                # environments for this?)
+                self.append(r'\DECvisit%s' % node_name)
+                self.context.append(r'\DECdepart%s' % node_name)
+            self.indentation_level += 1
+            if not skip_attr:
+                self.propagate_attributes(node)
+            else:
+                self.context.append('')
+
+        if (isinstance(node, nodes.TextElement) and
+            not isinstance(node.parent, nodes.TextElement)):
+            # Reset current quote to left.
+            self.left_quote = 1
+
+        # Call visit_... method.
+        try:
+            nodes.SparseNodeVisitor.dispatch_visit(self, node)
+        except LaTeXException:
+            raise NotImplementedError(
+                'visit_... methods must not raise LaTeXExceptions')
+
+        if tree_pruning_exception:
+            # Propagate TreePruningException raised in before_... method.
+            raise tree_pruning_exception
+
+    def is_invisible(self, node):
+        # Return true if node is invisible or moved away in the LaTeX
+        # rendering.
+        return (not isinstance(node, nodes.Text) and
+                (isinstance(node, nodes.Invisible) or
+                 isinstance(node, nodes.footnote) or
+                 isinstance(node, nodes.citation) or
+                 # Assume raw nodes to be invisible.
+                 isinstance(node, nodes.raw) or
+                 # Floating image or figure.
+                 node.get('align') in ('left', 'right')))
+
+    def is_visible(self, node):
+        return not self.is_invisible(node)
+
+    def needs_space(self, node):
+        """Two nodes for which `needs_space` is true need auxiliary space."""
+        # Return true if node is a visible block-level element.
+        return ((isinstance(node, nodes.Body) or
+                 isinstance(node, nodes.topic)) and
+                not (self.is_invisible(node) or
+                     isinstance(node.parent, nodes.TextElement)))
+
+    def always_needs_space(self, node):
+        """
+        Always add space around nodes for which `always_needs_space()`
+        is true, regardless of whether the other node needs space as
+        well.  (E.g. transition next to section.)
+        """
+        return isinstance(node, nodes.transition)
+
+    def dispatch_departure(self, node):
+        # Call departure method.
+        nodes.SparseNodeVisitor.dispatch_departure(self, node)
+
+        if not isinstance(node, nodes.Text):
+            # Close attribute and node handler call (\DN...{...}).
+            self.indentation_level -= 1
+            self.append(self.context.pop() + self.context.pop())
+            # Delete \DECcurrentN... attribute macros.
+            self.append(self.context.pop())
+            # Get next sibling.
+            next_node = node.next_node(
+                ascend=0, siblings=1, descend=0,
+                condition=self.is_visible)
+            # Insert space if necessary.
+            if  (self.needs_space(node) and self.needs_space(next_node) or
+                 self.always_needs_space(node) or
+                 self.always_needs_space(next_node)):
+                if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph):
+                    # Space between paragraphs.
+                    self.append(r'\DECparagraphspace')
+                else:
+                    # One of the elements is not a paragraph.
+                    self.append(r'\DECauxiliaryspace')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1180 @@
+% System stylesheet for the new LaTeX writer, newlatex2e.
+
+% Major parts of the rendering are done in this stylesheet and not in the
+% Python module.
+
+% For development notes, see notes.txt.
+
+% User documentation (in the stylesheet for now; that may change though):
+
+% Naming conventions:
+% All uppercase letters in macro names have a specific meaning.
+% \D...: All macros introduced by the Docutils LaTeX writer start with "D".
+% \DS<name>: Setup function (called at the bottom of this stylesheet).
+% \DN<nodename>{<contents>}: Handler for Docutils document tree node `node`; called by
+%                            the Python module.
+% \DEV<name>: External variable, set by the Python module.
+% \DEC<name>: External command.  It is called by the Python module and must be
+%             defined in this stylesheet.
+% \DN<nodename>A<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
+%     Attribute handler for `attribute` set on nodes of type `nodename`.
+%     See below for a discussion of attribute handlers.
+% \DA<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
+%     Attribute handler for all `attribute`.  Called only when no specific
+%     \DN<nodename>A<attribute> handler is defined.
+% \DN<nodename>C<class>{<contents>}:
+%     Handler for `class`, when set on nodes of type `nodename`.
+% \DC<class>{<contents>}:
+%     Handler for `class`.  Called only when no specific \DN<nodename>C<class>
+%     handler is defined.
+% \D<name>: Generic variable or function.
+
+% Attribute handlers:
+% TODO
+
+% ---------------------------------------------------------------------------
+
+% Having to intersperse code with \makeatletter-\makeatother pairs is very
+% annoying, so we call \makeatletter at the top and \makeatother at the
+% bottom.   Just be aware that you cannot use "@" as a text character inside
+% this stylesheet.
+\makeatletter
+
+% Print-mode (as opposed to online mode e.g. with Adobe Reader).
+% This causes for example blue hyperlinks.
+\providecommand{\Dprinting}{false}
+
+% \DSearly is called right after \documentclass.
+\providecommand{\DSearly}{}
+% \DSlate is called at the end of the stylesheet (right before the document
+% tree).
+\providecommand{\DSlate}{}
+
+% Use the KOMA script article class.
+\providecommand{\Ddocumentclass}{scrartcl}
+\providecommand{\Ddocumentoptions}{a4paper}
+\providecommand{\DSdocumentclass}{
+  \documentclass[\Ddocumentoptions]{\Ddocumentclass} }
+
+% Todo: This should be movable to the bottom, but it isn't as long as
+% we use \usepackage commands at the top level of this stylesheet
+% (which we shouldn't).
+\DSdocumentclass
+
+\providecommand{\DSpackages}{
+  % Load miscellaneous packages.
+  % Note 1: Many of the packages loaded here are used throughout this stylesheet.
+  % If one of these packages does not work on your system or in your scenario,
+  % please let us know, so we can consider making the package optional.
+  % Note 2: It would appear cleaner to load packages where they are used.
+  % However, since using a wrong package loading order can lead to *very*
+  % subtle bugs, we centralize the loading of most packages here.
+  \DSfontencoding % load font encoding packages
+  \DSlanguage % load babel
+  % Using \ifthenelse conditionals.
+  \usepackage{ifthen} % before hyperref (really!)
+  % There is not support for *not* using hyperref because it's used in many
+  % places.  If this is a problem (e.g. because hyperref doesn't work on your
+  % system), please let us know.
+  \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
+  % Get color, e.g. for links and system messages.
+  \usepackage{color}
+  % Get \textnhtt macro (non-hyphenating type writer).
+  \usepackage{hyphenat}
+  % For sidebars.
+  \usepackage{picins}
+  % We use longtable to create tables.
+  \usepackage{longtable}
+  % Images.
+  \usepackage{graphicx}
+  % These packages might be useful (some just add magic pixie dust), so
+  % evaluate them:
+  %\usepackage{fixmath}
+  %\usepackage{amsmath}
+  % Add some missing symbols like \textonehalf.
+  \usepackage{textcomp}
+}
+
+\providecommand{\DSfontencoding}{
+  % Set up font encoding.  Called by \DSpackages.
+  % AE is a T1 emulation.  It provides mostly the same characters and
+  % features as T1-encoded fonts but doesn't use bitmap fonts (which are
+  % unsuitable for online reading and subtle for printers).
+  \usepackage{ae}
+  % Provide the characters not contained in AE from EC bitmap fonts.
+  \usepackage{aecompl}
+  % Guillemets ("<<", ">>") in AE.
+  \usepackage{aeguill}
+}
+
+\providecommand{\DSsymbols}{%
+  % Fix up symbols.
+  % The Euro symbol in Computer Modern looks, um, funny.  Let's get a
+  % proper Euro symbol.
+  \usepackage{eurosym}%
+  \renewcommand{\texteuro}{\euro}%
+}
+
+% Taken from
+% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
+% and modified.  Used with permission.
+\providecommand{\Dprovidelength}[2]{%
+  \begingroup%
+    \escapechar\m@ne%
+    \xdef\@gtempa{{\string#1}}%
+  \endgroup%
+  \expandafter\@ifundefined\@gtempa%
+  {\newlength{#1}\setlength{#1}{#2}}%
+  {}%
+}
+
+\providecommand{\Dprovidecounter}[2]{%
+  % Like \newcounter except that it doesn't crash if the counter
+  % already exists.
+  \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{}
+}
+
+\Dprovidelength{\Dboxparindent}{\parindent}
+
+\providecommand{\Dmakebox}[1]{%
+  % Make a centered, frameless box.  Useful e.g. for block quotes.
+  % Do not use minipages here, but create pseudo-lists to allow
+  % page-breaking.  (Don't use KOMA-script's addmargin environment
+  % because it messes up bullet lists.)
+  \Dmakelistenvironment{}{}{%
+    \setlength{\parskip}{0pt}%
+    \setlength{\parindent}{\Dboxparindent}%
+    \item{#1}%
+  }%
+}
+
+\providecommand{\Dmakefbox}[1]{%
+  % Make a centered, framed box.  Useful e.g. for admonitions.
+  \vspace{0.4\baselineskip}%
+  \begin{center}%
+    \fbox{%
+      \begin{minipage}[t]{0.9\linewidth}%
+        \setlength{\parindent}{\Dboxparindent}%
+        #1%
+      \end{minipage}%
+    }%
+  \end{center}%
+  \vspace{0.4\baselineskip}%
+}
+
+% We do not currently recognize the difference between an end-sentence and a
+% mid-sentence period (".  " vs. ". " in plain text).  So \frenchspacing is
+% appropriate.
+\providecommand{\DSfrenchspacing}{\frenchspacing}
+
+
+\Dprovidelength{\Dblocklevelvspace}{%
+  % Space between block-level elements other than paragraphs.
+  0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
+}
+\providecommand{\DECauxiliaryspace}{%
+  \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
+  \par\noindent%
+}
+\providecommand{\DECparagraphspace}{\par}
+\providecommand{\Dneedvspace}{true}
+
+\providecommand{\DSlanguage}{%
+  % Set up babel.
+  \usepackage[\DEVlanguagebabel]{babel}
+}
+
+\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
+
+% Handler for 'classes' attribute (called for each class attribute).
+\providecommand{\DAclasses}[5]{%
+  % Dispatch to \DN<nodename>C<class>.
+  \Difdefined{DN#4C#3}{%
+    % Pass only contents, nothing else!
+    \csname DN#4C#3\endcsname{#5}%
+  }{%
+    % Otherwise, dispatch to \DC<class>.
+    \Difdefined{DC#3}{%
+      \csname DC#3\endcsname{#5}%
+    }{%
+      #5%
+    }%
+  }%
+}
+
+\providecommand{\DECattr}[5]{%
+  % Global attribute dispatcher, called inside the document tree.
+  % Parameters:
+  % 1. Attribute number.
+  % 2. Attribute name.
+  % 3. Attribute value.
+  % 4. Node name.
+  % 5. Node contents.
+  \Difdefined{DN#4A#2}{%
+    % Dispatch to \DN<nodename>A<attribute>.
+    \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2}{%
+    % Otherwise dispatch to \DA<attribute>.
+    \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{%
+    % Otherwise simply run the contents without calling a handler.
+    #5%
+  }}%
+}
+
+% ---------- Link handling ----------
+% Targets and references.
+
+\providecommand{\Draisedlink}[1]{%
+  % Anchors are placed on the base line by default.  This is a bad thing for
+  % inline context, so we raise the anchor (normally by \baselineskip).
+  \Hy@raisedlink{#1}%
+}
+
+% References.
+% We're assuming here that the "refid" and "refuri" attributes occur
+% only in inline context (in TextElements).
+\providecommand{\DArefid}[5]{%
+  \ifthenelse{\equal{#4}{reference}}{%
+    \Dexplicitreference{\##3}{#5}%
+  }{%
+    % If this is not a target node (targets with refids are
+    % uninteresting and should be silently dropped).
+    \ifthenelse{\not\equal{#4}{target}}{%
+      % If this is a footnote reference, call special macro.
+      \ifthenelse{\equal{#4}{footnotereference}}{%
+        \Dimplicitfootnotereference{\##3}{#5}%
+      }{%
+        \ifthenelse{\equal{#4}{citationreference}}{%
+          \Dimplicitcitationreference{\##3}{#5}%
+        }{%
+          \Dimplicitreference{\##3}{#5}%
+        }%
+      }%
+    }{}%
+  }%
+}
+\providecommand{\DArefuri}[5]{%
+  \ifthenelse{\equal{#4}{target}}{%
+    % The node name is 'target', so this is a hyperlink target, like this:
+    % .. _mytarget: URI
+    % Hyperlink targets are ignored because they are invisible.
+  }{%
+    % If a non-target node has a refuri attribute, it must be an explicit URI
+    % reference (i.e. node name is 'reference').
+    \Durireference{#3}{#5}%
+  }%
+}
+% Targets.
+\providecommand{\DAids}[5]{%
+  \label{#3}%
+  \ifthenelse{\equal{#4}{footnotereference}}{%
+    {%
+      \renewcommand{\HyperRaiseLinkDefault}{%
+        % Dirty hack to make backrefs to footnote references work.
+        % For some reason, \baselineskip is 0pt in fn references.
+        0.5\Doriginalbaselineskip%
+      }%
+      \Draisedlink{\hypertarget{#3}{}}#5%
+    }%
+  }{%
+    \Draisedlink{\hypertarget{#3}{}}#5%
+  }%
+}
+\providecommand{\Dimplicitreference}[2]{%
+  % Create implicit reference to ID.  Implicit references occur
+  % e.g. in TOC-backlinks of section titles.  Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{#2}%
+}
+\providecommand{\Dimplicitfootnotereference}[2]{%
+  % Ditto, but for the special case of footnotes.
+  % We want them to be rendered like explicit references.
+  \Dexplicitreference{#1}{#2}%
+}
+\providecommand{\Dimplicitcitationreference}[2]{%
+  % Ditto for citation references.
+  \Dimplicitfootnotereference{#1}{#2}%
+}
+\providecommand{\Dcolorexplicitreference}{%
+  \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}%
+}
+\providecommand{\Dexplicitreference}[2]{%
+  % Create explicit reference to ID, e.g. created with "foo_".
+  % Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{{\Dcolorexplicitreference#2}}%
+}
+\providecommand{\Dcolorurireference}{\Dcolorexplicitreference}
+\providecommand{\Durireference}[2]{%
+  % Create reference to URI.  Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{{\Dcolorurireference#2}}%
+}
+
+\Dprovidecounter{Dpdfbookmarkid}{0}%
+\providecommand{\Dpdfbookmark}[1]{%
+  % Temporarily decrement Desctionlevel counter.
+  \addtocounter{Dsectionlevel}{-1}%
+  %\typeout{\arabic{Dsectionlevel}}%
+  %\typeout{#1}%
+  %\typeout{docutils\roman{Dpdfbookmarkid}}%
+  %\typeout{}%
+  \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
+  \addtocounter{Dsectionlevel}{1}%
+  \addtocounter{Dpdfbookmarkid}{1}%
+}
+% ---------- End of Link Handling ----------
+
+\providecommand{\DNparagraph}[1]{%
+  \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}%
+  #1%
+}
+\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
+\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
+\providecommand{\Dtopictitle}[1]{%
+  \Difinsidetoc{\vspace{1em}\par}{}%
+  \noindent\Dformatboxtitle{#1}%
+  \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
+  \par%
+}
+\providecommand{\Dadmonitiontitle}[1]{%
+  \Dtopictitle{#1}%
+}
+\providecommand{\Dtopicsubtitle}[1]{%
+  \noindent\Dformatboxsubtitle{#1}%
+  \vspace{1em}%
+  \par%
+}
+\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
+\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
+\providecommand{\Ddocumenttitle}[1]{%
+  \begin{center}{\Huge#1}\end{center}%
+  \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
+}
+\providecommand{\Ddocumentsubtitle}[1]{%
+  \begin{center}{\huge#1}\end{center}%
+  \vspace{1cm}%
+}
+% Can be overwritten by user stylesheet.
+\providecommand{\Dformatsectiontitle}[1]{#1}
+\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
+\providecommand{\Dbookmarksectiontitle}[1]{%
+  % Return text suitable for use in \section*, \subsection*, etc.,
+  % containing a PDF bookmark.  Parameter:  The title (as node tree).
+  \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}%
+  #1%
+}
+\providecommand{\Dsectiontitlehook}[1]{#1}
+\providecommand{\Dsectiontitle}[1]{%
+  \Dsectiontitlehook{%
+    \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
+  }%
+}
+\providecommand{\Ddispatchsectiontitle}[1]{%
+  \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
+    \Ddeepsectiontitle{#1}%
+  }{%
+    \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
+  }%
+}
+\providecommand{\Ddispatchsectionsubtitle}[1]{%
+  \Ddispatchsectiontitle{#1}%
+}
+\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
+\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
+\providecommand{\Ddeepsectiontitle}[1]{%
+  % Anything below \subsubsection (like \paragraph or \subparagraph)
+  % is useless because it uses the same font.  The only way to
+  % (visually) distinguish such deeply nested sections is to use
+  % section numbering.
+  \subsubsection*{#1}%
+}
+\providecommand{\Dsectionsubtitlehook}[1]{#1}
+\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
+\providecommand{\Dsectionsubtitlescaling}{0.85}
+\providecommand{\Dsectionsubtitle}[1]{%
+  \Dsectionsubtitlehook{%
+    % Move the subtitle nearer to the title.
+    \vspace{-\Dsectionsubtitleraisedistance}%
+    % Don't create a PDF bookmark.
+    \Ddispatchsectionsubtitle{%
+      \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
+    }%
+  }%
+}
+\providecommand{\DNtitle}[1]{%
+  % Dispatch to \D<parent>title.
+  \csname D\DEVparent title\endcsname{#1}%
+}
+\providecommand{\DNsubtitle}[1]{%
+  % Dispatch to \D<parent>subtitle.
+  \csname D\DEVparent subtitle\endcsname{#1}%
+}
+
+\providecommand{\DNliteralblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      \setlength{\leftmargin}{0pt}%
+    }{}%
+    \setlength{\rightmargin}{0pt}%
+  }{%
+    \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
+  }%
+}
+\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}}
+\providecommand{\DNliteral}[1]{\textnhtt{#1}}
+\providecommand{\DNemphasis}[1]{\emph{#1}}
+\providecommand{\DNstrong}[1]{\textbf{#1}}
+\providecommand{\DECvisitdocument}{\begin{document}\noindent}
+\providecommand{\DECdepartdocument}{\end{document}}
+\providecommand{\DNtopic}[1]{%
+  \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{%
+    \addtocounter{Dtoclevel}{1}%
+    \par\noindent%
+    #1%
+    \addtocounter{Dtoclevel}{-1}%
+  }{%
+    \par\noindent%
+    \Dmakebox{#1}%
+  }%
+}
+\providecommand{\DNadmonition}[1]{%
+  \DNtopic{#1}%
+}
+\providecommand{\Dformatrubric}[1]{\textbf{#1}}
+\Dprovidelength{\Dprerubricspace}{0.3em}
+\providecommand{\DNrubric}[1]{%
+  \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
+}
+
+\providecommand{\Dbullet}{}
+\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
+\providecommand{\DNbulletlist}[1]{%
+  \Difinsidetoc{%
+    \Dtocbulletlist{#1}%
+  }{%
+    \Dmakelistenvironment{\Dbullet}{}{#1}%
+  }%
+}
+% Todo: So what on earth is @pnumwidth?
+\renewcommand{\@pnumwidth}{2.2em}
+\providecommand{\DNlistitem}[1]{%
+  \Difinsidetoc{%
+    \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
+      {%
+        \par\addvspace{1em}\noindent%
+        \sectfont%
+        #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}%
+      }%
+    }{%
+      \@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
+        \pageref{\DEVcurrentNlistitemAtocrefid}%
+      }%
+    }%
+  }{%
+    \item{#1}%
+  }%
+}
+\providecommand{\DNenumeratedlist}[1]{#1}
+\Dprovidecounter{Dsectionlevel}{0}
+\providecommand{\Dvisitsectionhook}{}
+\providecommand{\Ddepartsectionhook}{}
+\providecommand{\DECvisitsection}{%
+  \addtocounter{Dsectionlevel}{1}%
+  \Dvisitsectionhook%
+}
+\providecommand{\DECdepartsection}{%
+  \Ddepartsectionhook%
+  \addtocounter{Dsectionlevel}{-1}%
+}
+
+% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
+% because the hyphenat package redefines \_.  So we use
+% \textunderscore here.
+\providecommand{\DECtextunderscore}{\textunderscore}
+
+\providecommand{\Dtextinlineliteralfirstspace}{{ }}
+\providecommand{\Dtextinlineliteralsecondspace}{{~}}
+
+\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
+
+\providecommand{\Dsetlistrightmargin}{%
+  \ifthenelse{\lengthtest{\linewidth>12em}}{%
+    % Equal margins.
+    \setlength{\rightmargin}{\leftmargin}%
+  }{%
+    % If the line is narrower than 10em, we don't remove any further
+    % space from the right.
+    \setlength{\rightmargin}{0pt}%
+  }%
+}
+\providecommand{\Dresetlistdepth}{false}
+\Dprovidelength{\Doriginallabelsep}{\labelsep}
+\providecommand{\Dmakelistenvironment}[3]{%
+  % Make list environment with support for unlimited nesting and with
+  % reasonable default lengths.  Parameters:
+  % 1. Label (same as in list environment).
+  % 2. Spacing (same as in list environment).
+  % 3. List contents (contents of list environment).
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+    % Unfortunately, vertical spacing doesn't work correctly when
+    % using lists inside tabular environments, so we use a minipage.
+    \begin{minipage}[t]{\linewidth}%
+  }{}%
+    {%
+      \renewcommand{\Dneedvspace}{false}%
+      % \parsep0.5\baselineskip
+      \renewcommand{\Dresetlistdepth}{false}%
+      \ifnum \@listdepth>5%
+      \protect\renewcommand{\Dresetlistdepth}{true}%
+      \@listdepth=5%
+      \fi%
+      \begin{list}{%
+          #1%
+        }{%
+          \setlength{\itemsep}{0pt}%
+          \setlength{\partopsep}{0pt}%
+          \setlength{\topsep}{0pt}%
+                                  % List should take 90% of total width.
+          \setlength{\leftmargin}{0.05\linewidth}%
+          \ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
+            \setlength{\leftmargin}{1.8em}%
+          }{}%
+          \setlength{\labelsep}{\Doriginallabelsep}%
+          \Dsetlistrightmargin%
+          #2%
+        }{%
+          #3%
+        }%
+      \end{list}%
+      \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
+    }%
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
+}
+\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
+\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
+
+\Dprovidelength{\Ditemsep}{0pt}
+\providecommand{\DECmakeenumeratedlist}[6]{%
+  % Make enumerated list.
+  % Parameters:
+  % - prefix
+  % - type (\arabic, \roman, ...)
+  % - suffix
+  % - suggested counter name
+  % - start number - 1
+  % - list contents
+  \newcounter{#4}%
+  \Dmakelistenvironment{#1#2{#4}#3}{%
+    % Use as much space as needed for the label.
+    \setlength{\labelwidth}{10em}%
+    % Reserve enough space so that the label doesn't go beyond the
+    % left margin of preceding paragraphs.  Like that:
+    %
+    %    A paragraph.
+    %
+    %   1. First item.
+    \setlength{\leftmargin}{2.5em}%
+    \Dsetlistrightmargin%
+    \setlength{\itemsep}{\Ditemsep}%
+    % Use counter recommended by Python module.
+    \usecounter{#4}%
+    % Set start value.
+    \addtocounter{#4}{#5}%
+  }{%
+    % The list contents.
+    #6%
+  }%
+}
+
+
+% Single quote in literal mode.  \textquotesingle from package
+% textcomp has wrong width when using package ae, so we use a normal
+% single curly quote here.
+\providecommand{\DECtextliteralsinglequote}{'}
+
+
+% "Tabular lists" are field lists and options lists (not definition
+% lists because there the term always appears on its own line).  We'll
+% use the terminology of field lists now ("field", "field name",
+% "field body"), but the same is also analogously applicable to option
+% lists.
+%
+% We want these lists to be breakable across pages.  We cannot
+% automatically get the narrowest possible size for the left column
+% (i.e. the field names or option groups) because tabularx does not
+% support multi-page tables, ltxtable needs to have the table in an
+% external file and we don't want to clutter the user's directories
+% with auxiliary files created by the filecontents environment, and
+% ltablex is not included in teTeX.
+%
+% Thus we set a fixed length for the left column and use list
+% environments.  This also has the nice side effect that breaking is
+% now possible anywhere, not just between fields.
+%
+% Note that we are creating a distinct list environment for each
+% field.  There is no macro for a whole tabular list!
+\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
+\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
+\providecommand{\Dinsidetabular}{false}
+\providecommand{\Dsavefieldname}{}
+\providecommand{\Dsavefieldbody}{}
+\Dprovidelength{\Dusedfieldnamewidth}{0pt}
+\Dprovidelength{\Drealfieldnamewidth}{0pt}
+\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
+\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
+\Dprovidelength{\Dparskiptemp}{0pt}
+\providecommand{\Dtabularlistfield}[1]{%
+  {%
+    % This only saves field name and field body in \Dsavefieldname and
+    % \Dsavefieldbody, resp.  It does not insert any text into the
+    % document.
+    #1%
+    % Recalculate the real field name width everytime we encounter a
+    % tabular list field because it may have been changed using a
+    % "raw" node.
+    \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
+    \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
+    \Dmakelistenvironment{%
+      \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
+    }{%
+      \setlength{\labelwidth}{\Drealfieldnamewidth}%
+      \setlength{\leftmargin}{\Drealfieldnamewidth}%
+      \setlength{\rightmargin}{0pt}%
+      \setlength{\labelsep}{0pt}%
+    }{%
+      \item%
+      \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
+      \setlength{\Dparskiptemp}{\parskip}%
+      \ifthenelse{%
+        \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
+      }{%
+        \mbox{}\par%
+        \setlength{\parskip}{0pt}%
+      }{}%
+      \Dsavefieldbody%
+      \setlength{\parskip}{\Dparskiptemp}%
+      %XXX Why did we need this?
+      %\@finalstrut\@arstrutbox%
+    }%
+    \par%
+  }%
+}
+
+\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
+\providecommand{\DNfieldlist}[1]{#1}
+\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
+\providecommand{\DNfieldname}[1]{%
+  \Dtabularlistfieldname{%
+    \Dformatfieldname{#1}%
+  }%
+}
+\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
+
+\providecommand{\Dformatoptiongroup}[1]{%
+  % Format option group, e.g. "-f file, --input file".
+  \texttt{#1}%
+}
+\providecommand{\Dformatoption}[1]{%
+  % Format option, e.g. "-f file".
+  % Put into mbox to avoid line-breaking at spaces.
+  \mbox{#1}%
+}
+\providecommand{\Dformatoptionstring}[1]{%
+  % Format option string, e.g. "-f".
+  #1%
+}
+\providecommand{\Dformatoptionargument}[1]{%
+  % Format option argument, e.g. "file".
+  \textsl{#1}%
+}
+\providecommand{\Dformatoptiondescription}[1]{%
+  % Format option description, e.g.
+  % "\DNparagraph{Read input data from file.}"
+  #1%
+}
+\providecommand{\DNoptionlist}[1]{#1}
+\providecommand{\Doptiongroupjoiner}{,{ }}
+\providecommand{\Disfirstoption}{%
+  % Auxiliary macro indicating if a given option is the first child
+  % of its option group (if it's not, it has to preceded by
+  % \Doptiongroupjoiner).
+  false%
+}
+\providecommand{\DNoptionlistitem}[1]{%
+  \Dtabularlistfield{#1}%
+}
+\providecommand{\DNoptiongroup}[1]{%
+  \renewcommand{\Disfirstoption}{true}%
+  \Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
+}
+\providecommand{\DNoption}[1]{%
+  % If this is not the first option in this option group, add a
+  % joiner.
+  \ifthenelse{\equal{\Disfirstoption}{true}}{%
+    \renewcommand{\Disfirstoption}{false}%
+  }{%
+    \Doptiongroupjoiner%
+  }%
+  \Dformatoption{#1}%
+}
+\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
+\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
+\providecommand{\DNdescription}[1]{%
+  \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
+}
+
+\providecommand{\DNdefinitionlist}[1]{%
+  \begin{description}%
+    \parskip0pt%
+    #1%
+  \end{description}%
+}
+\providecommand{\DNdefinitionlistitem}[1]{%
+  % LaTeX expects the label in square brackets; we provide an empty
+  % label.
+  \item[]#1%
+}
+\providecommand{\Dformatterm}[1]{#1}
+\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
+% I'm still not sure what's the best rendering for classifiers.  The
+% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
+% Use slanted text because italic would cause too much emphasis.
+\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
+\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
+\providecommand{\Dformatdefinition}[1]{#1}
+\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
+
+\providecommand{\Dlineblockindentation}{2.5em}
+\providecommand{\DNlineblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\DEVparent}{lineblock}}{%
+      % Parent is a line block, so indent.
+      \setlength{\leftmargin}{\Dlineblockindentation}%
+    }{%
+      % At top level; don't indent.
+      \setlength{\leftmargin}{0pt}%
+    }%
+    \setlength{\rightmargin}{0pt}%
+    \setlength{\parsep}{0pt}%
+  }{%
+    #1%
+  }%
+}
+\providecommand{\DNline}[1]{\item#1}
+
+\providecommand{\DNtransition}{%
+  \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
+}
+
+\providecommand{\Dformatblockquote}[1]{%
+  % Format contents of block quote.
+  % This occurs in block-level context, so we cannot use \textsl.
+  {\slshape#1}%
+}
+\providecommand{\Dformatattribution}[1]{---\textup{#1}}
+\providecommand{\DNblockquote}[1]{%
+  \Dmakebox{%
+    \Dformatblockquote{#1}
+  }%
+}
+\providecommand{\DNattribution}[1]{%
+  \par%
+  \begin{flushright}\Dformatattribution{#1}\end{flushright}%
+}
+
+
+% Sidebars:
+% Vertical and horizontal margins.
+\Dprovidelength{\Dsidebarvmargin}{0.5em}
+\Dprovidelength{\Dsidebarhmargin}{1em}
+% Padding (space between contents and frame).
+\Dprovidelength{\Dsidebarpadding}{1em}
+% Frame width.
+\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
+% Position ("l" or "r").
+\providecommand{\Dsidebarposition}{r}
+% Width.
+\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
+\providecommand{\DNsidebar}[1]{
+  \parpic[\Dsidebarposition]{%
+    \begin{minipage}[t]{\Dsidebarwidth}%
+      % Doing this with nested minipages is ugly, but I haven't found
+      % another way to place vertical space before and after the fbox.
+      \vspace{\Dsidebarvmargin}%
+      {%
+        \setlength{\fboxrule}{\Dsidebarframewidth}%
+        \setlength{\fboxsep}{\Dsidebarpadding}%
+        \fbox{%
+          \begin{minipage}[t]{\linewidth}%
+            \setlength{\parindent}{\Dboxparindent}%
+            #1%
+          \end{minipage}%
+        }%
+      }%
+      \vspace{\Dsidebarvmargin}%
+    \end{minipage}%
+  }%
+}
+
+
+% Citations and footnotes.
+\providecommand{\Dformatfootnote}[1]{%
+  % Format footnote.
+  {%
+    \footnotesize#1%
+    % \par is necessary for LaTeX to adjust baselineskip to the
+    % changed font size.
+    \par%
+  }%
+}
+\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
+\Dprovidelength{\Doriginalbaselineskip}{0pt}
+\providecommand{\DNfootnotereference}[1]{%
+  {%
+    % \baselineskip is 0pt in \textsuperscript, so we save it here.
+    \setlength{\Doriginalbaselineskip}{\baselineskip}%
+    \textsuperscript{#1}%
+  }%
+}
+\providecommand{\DNcitationreference}[1]{{[}#1{]}}
+\Dprovidelength{\Dfootnotesep}{3.5pt}
+\providecommand{\Dsetfootnotespacing}{%
+  % Spacing commands executed at the beginning of footnotes.
+  \setlength{\parindent}{0pt}%
+  \hspace{1em}%
+}
+\providecommand{\DNfootnote}[1]{%
+  % See ltfloat.dtx for details.
+  {%
+    \insert\footins{%
+      % BUG: This is too small if the user adds
+      % \onehalfspacing or \doublespace.
+      \vspace{\Dfootnotesep}%
+      \Dsetfootnotespacing%
+      \Dformatfootnote{#1}%
+    }%
+  }%
+}
+\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
+\providecommand{\Dformatfootnotelabel}[1]{%
+  % Keep \footnotesize in footnote labels (\textsuperscript would
+  % reduce the font size even more).
+  \textsuperscript{\footnotesize#1{ }}%
+}
+\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
+\providecommand{\Dformatmultiplebackrefs}[1]{%
+  % If in printing mode, do not write out multiple backrefs.
+  \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
+}
+\providecommand{\Dthislabel}{}
+\providecommand{\DNlabel}[1]{%
+  % Footnote or citatation label.
+  \renewcommand{\Dthislabel}{#1}%
+  \ifthenelse{\not\equal{\DEVsinglebackref}{}}{%
+    \let\Doriginallabel=\Dthislabel%
+    \def\Dthislabel{%
+      \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}%
+    }%
+  }{}%
+  \ifthenelse{\equal{\DEVparent}{footnote}}{%
+    % Footnote label.
+    \Dformatfootnotelabel{\Dthislabel}%
+  }{%
+    \ifthenelse{\equal{\DEVparent}{citation}}{%
+      % Citation label.
+      \Dformatcitationlabel{\Dthislabel}%
+    }{}%
+  }%
+  % If there are multiple backrefs, add them now.
+  \Dformatmultiplebackrefs{\DEVmultiplebackrefs}%
+}
+\providecommand{\Dsinglefootnotebacklink}[2]{%
+  % Create normal backlink of a footnote label.  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\DECmultifootnotebacklink}[2]{%
+  % Create generated backlink, as in (1, 2).  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
+\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}}
+
+
+\providecommand{\DECmaketable}[2]{%
+  % Make table.  Parameters:
+  % 1. Table spec (like "|p|p|").
+  % 2. Table contents.
+  {%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      % Inside longtable; we cannot have nested longtables.
+      \begin{tabular}{#1}%
+        \hline%
+        #2%
+      \end{tabular}%
+    }{%
+      \renewcommand{\Dinsidetabular}{true}%
+      \begin{longtable}{#1}%
+        \hline%
+        #2%
+      \end{longtable}%
+    }%
+  }%
+}
+\providecommand{\DNthead}[1]{%
+  #1%
+  \endhead%
+}
+\providecommand{\DNrow}[1]{%
+  #1\tabularnewline%
+  \hline%
+}
+\providecommand{\Dinsidemulticolumn}{false}
+\providecommand{\Dcompensatingmulticol}[3]{%
+  \multicolumn{#1}{#2}{%
+    {%
+      \renewcommand{\Dinsidemulticolumn}{true}%
+      % Compensate for weird missing vertical space at top of paragraph.
+      \raisebox{-2.5pt}{#3}%
+    }%
+  }%
+}
+\providecommand{\DECcolspan}[2]{%
+  % Take care of the morecols attribute (but incremented by 1).
+  &%
+  \Dcompensatingmulticol{#1}{l|}{#2}%
+}
+\providecommand{\DECcolspanleft}[2]{%
+  % Like \Dmorecols, but called for the leftmost entries in a table
+  % row.
+  \Dcompensatingmulticol{#1}{|l|}{#2}%
+}
+\providecommand{\DECsubsequententry}[1]{%
+  &#1%
+}
+\providecommand{\DNentry}[1]{%
+  % The following sequence adds minimal vertical space above the top
+  % lines of the first cell paragraph, so that vertical space is
+  % balanced at the top and bottom of table cells.
+  \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{%
+    \vspace{-1em}\vspace{-\parskip}\par%
+  }{}%
+  #1%
+  % No need to add an ampersand ("&"); that's done by \DECsubsequententry.
+}
+\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
+\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
+
+
+\providecommand{\DNsystemmessage}[1]{%
+  {%
+    \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
+    \bfseries%
+    #1%
+  }%
+}
+
+
+\providecommand{\Dinsidehalign}{false}
+\newsavebox{\Dalignedimagebox}
+\Dprovidelength{\Dalignedimagewidth}{0pt}
+\providecommand{\Dhalign}[2]{%
+  % Horizontally align the contents to the left or right so that the
+  % text flows around it.
+  % Parameters:
+  % 1. l or r
+  % 2. Contents.
+  \renewcommand{\Dinsidehalign}{true}%
+  % For some obscure reason \parpic consumes some vertical space.
+  \vspace{-3pt}%
+  % Now we do something *really* ugly, but this enables us to wrap the
+  % image in a minipage while still allowing tight frames when
+  % class=border (see \DNimageCborder).
+  \sbox{\Dalignedimagebox}{#2}%
+  \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
+  \parpic[#1]{%
+    \begin{minipage}[b]{\Dalignedimagewidth}%
+      % Compensate for previously added space, but not entirely.
+      \vspace*{2.0pt}%
+      \vspace*{\Dfloatimagetopmargin}%
+      \usebox{\Dalignedimagebox}%
+      \vspace*{1.5pt}%
+      \vspace*{\Dfloatimagebottommargin}%
+    \end{minipage}%
+  }%
+  \renewcommand{\Dinsidehalign}{false}%
+}
+
+
+% Maximum width of an image.
+\providecommand{\Dimagemaxwidth}{\linewidth}
+\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
+% Auxiliary variable.
+\Dprovidelength{\Dcurrentimagewidth}{0pt}
+\providecommand{\DNimageAalign}[5]{%
+  \ifthenelse{\equal{#3}{left}}{%
+    \Dhalign{l}{#5}%
+  }{%
+    \ifthenelse{\equal{#3}{right}}{%
+      \Dhalign{r}{#5}%
+    }{%
+      \ifthenelse{\equal{#3}{center}}{%
+        % Text floating around centered figures is a bad idea.  Thus
+        % we use a center environment.  Note that no extra space is
+        % added by the writer, so the space added by the center
+        % environment is fine.
+        \begin{center}#5\end{center}%
+      }{%
+        #5%
+      }%
+    }%
+  }%
+}
+% Base path for images.
+\providecommand{\Dimagebase}{}
+% Auxiliary command.  Current image path.
+\providecommand{\Dimagepath}{}
+\providecommand{\DNimageAuri}[5]{%
+  % Insert image.  We treat the URI like a path here.
+  \renewcommand{\Dimagepath}{\Dimagebase#3}%
+  \Difdefined{DcurrentNimageAwidth}{%
+    \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}%
+  }{%
+    \Dsimpleimage{\Dimagepath}%
+  }%
+}
+\Dprovidelength{\Dfloatimagevmargin}{0pt}
+\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
+\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  % Need to make bottom-alignment dependent on align attribute (add
+  % functional test first).  Need to observe height attribute.
+  %\begin{minipage}[b]{#1}%
+    \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
+  %\end{minipage}%
+}  
+\providecommand{\Dcurrentimagemaxwidth}{}
+\providecommand{\Dsimpleimage}[1]{%
+  % Insert image, without much parametrization.
+  \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
+  \ifthenelse{\equal{\Dinsidehalign}{true}}{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
+  }{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
+  }%
+  \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
+    \Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
+  }{%
+    \Dwidthimage{\Dcurrentimagewidth}{#1}%
+  }%
+}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  \Dwidthimage{#1}{#2}%
+}
+
+% Figures.
+\providecommand{\DNfigureAalign}[5]{%
+  % Hack to make it work Right Now.
+  %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}%
+  %
+    %\def\DEVcurrentNimageAwidth{\linewidth}%
+    \DNimageAalign{#1}{#2}{#3}{#4}{%
+      \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
+    %\let\DEVcurrentNimageAwidth=\relax%
+  %
+  %\let\DEVcurrentNimageAwidth=\relax%
+}
+\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
+\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1}
+
+\providecommand{\DCborder}[1]{\fbox{#1}}
+% No padding between image and border.
+\providecommand{\DNimageCborder}[1]{\frame{#1}}
+
+
+% Need to replace with language-specific stuff.  Maybe look at
+% csquotes.sty and ask the author for permission to use parts of it.
+\providecommand{\DECtextleftdblquote}{``}
+\providecommand{\DECtextrightdblquote}{''}
+
+% Table of contents:
+\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
+\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
+% Level inside a table of contents.  While this is at -1, we are not
+% inside a TOC.
+\Dprovidecounter{Dtoclevel}{-1}%
+\providecommand{\Dlocaltoc}{false}%
+\providecommand{\DNtopicClocal}[1]{%
+  \renewcommand{\Dlocaltoc}{true}%
+  \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
+  \renewcommand{\Dlocaltoc}{false}%
+}
+\Dprovidelength{\Dtocindent}{0pt}%
+\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
+% Compensate for one additional TOC indentation space so that the
+% top-level is unindented.
+\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
+\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
+\providecommand{\Difinsidetoc}[2]{%
+  \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
+}
+\providecommand{\DNgeneratedCsectnum}[1]{%
+  \Difinsidetoc{%
+    % Section number inside TOC.
+    \makebox[\Dtocsectnumwidth][l]{#1}%
+  }{%
+    % Section number inside section title.
+    #1\quad%
+  }%
+}
+\providecommand{\Dtocbulletlist}[1]{%
+  \addtocounter{Dtoclevel}{1}%
+  \addtolength{\Dtocindent}{\Dtocsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
+  \addtocounter{Dtoclevel}{-1}%
+}
+
+
+% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by
+% specifying "pt" we get the same notion of "pixel" as graphicx.
+\providecommand{\DECpixelunit}{pt}
+% Normally lengths are relative to the current linewidth.
+\providecommand{\DECrelativeunit}{\linewidth}
+
+
+% ACTION: These commands actually *do* something.
+% Ultimately, everything should be done here, and no active content should be
+% above (not even \usepackage).
+
+\DSearly
+\DSpackages
+\DSfrenchspacing
+\DSsymbols
+\DSlate
+
+\makeatother
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2369 @@
+# $Id$
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This file has been placed in the public domain.
+
+# This is a mapping of Unicode characters to LaTeX equivalents.
+# The information has been extracted from
+# <http://www.w3.org/2003/entities/xml/unicode.xml>, written by
+# David Carlisle and Sebastian Rahtz.
+#
+# The extraction has been done by the "create_unimap.py" script
+# located at <http://docutils.sf.net/tools/dev/create_unimap.py>.
+
+unicode_map = {u'\xa0': '$~$',
+u'\xa1': '{\\textexclamdown}',
+u'\xa2': '{\\textcent}',
+u'\xa3': '{\\textsterling}',
+u'\xa4': '{\\textcurrency}',
+u'\xa5': '{\\textyen}',
+u'\xa6': '{\\textbrokenbar}',
+u'\xa7': '{\\textsection}',
+u'\xa8': '{\\textasciidieresis}',
+u'\xa9': '{\\textcopyright}',
+u'\xaa': '{\\textordfeminine}',
+u'\xab': '{\\guillemotleft}',
+u'\xac': '$\\lnot$',
+u'\xad': '$\\-$',
+u'\xae': '{\\textregistered}',
+u'\xaf': '{\\textasciimacron}',
+u'\xb0': '{\\textdegree}',
+u'\xb1': '$\\pm$',
+u'\xb2': '${^2}$',
+u'\xb3': '${^3}$',
+u'\xb4': '{\\textasciiacute}',
+u'\xb5': '$\\mathrm{\\mu}$',
+u'\xb6': '{\\textparagraph}',
+u'\xb7': '$\\cdot$',
+u'\xb8': '{\\c{}}',
+u'\xb9': '${^1}$',
+u'\xba': '{\\textordmasculine}',
+u'\xbb': '{\\guillemotright}',
+u'\xbc': '{\\textonequarter}',
+u'\xbd': '{\\textonehalf}',
+u'\xbe': '{\\textthreequarters}',
+u'\xbf': '{\\textquestiondown}',
+u'\xc0': '{\\`{A}}',
+u'\xc1': "{\\'{A}}",
+u'\xc2': '{\\^{A}}',
+u'\xc3': '{\\~{A}}',
+u'\xc4': '{\\"{A}}',
+u'\xc5': '{\\AA}',
+u'\xc6': '{\\AE}',
+u'\xc7': '{\\c{C}}',
+u'\xc8': '{\\`{E}}',
+u'\xc9': "{\\'{E}}",
+u'\xca': '{\\^{E}}',
+u'\xcb': '{\\"{E}}',
+u'\xcc': '{\\`{I}}',
+u'\xcd': "{\\'{I}}",
+u'\xce': '{\\^{I}}',
+u'\xcf': '{\\"{I}}',
+u'\xd0': '{\\DH}',
+u'\xd1': '{\\~{N}}',
+u'\xd2': '{\\`{O}}',
+u'\xd3': "{\\'{O}}",
+u'\xd4': '{\\^{O}}',
+u'\xd5': '{\\~{O}}',
+u'\xd6': '{\\"{O}}',
+u'\xd7': '{\\texttimes}',
+u'\xd8': '{\\O}',
+u'\xd9': '{\\`{U}}',
+u'\xda': "{\\'{U}}",
+u'\xdb': '{\\^{U}}',
+u'\xdc': '{\\"{U}}',
+u'\xdd': "{\\'{Y}}",
+u'\xde': '{\\TH}',
+u'\xdf': '{\\ss}',
+u'\xe0': '{\\`{a}}',
+u'\xe1': "{\\'{a}}",
+u'\xe2': '{\\^{a}}',
+u'\xe3': '{\\~{a}}',
+u'\xe4': '{\\"{a}}',
+u'\xe5': '{\\aa}',
+u'\xe6': '{\\ae}',
+u'\xe7': '{\\c{c}}',
+u'\xe8': '{\\`{e}}',
+u'\xe9': "{\\'{e}}",
+u'\xea': '{\\^{e}}',
+u'\xeb': '{\\"{e}}',
+u'\xec': '{\\`{\\i}}',
+u'\xed': "{\\'{\\i}}",
+u'\xee': '{\\^{\\i}}',
+u'\xef': '{\\"{\\i}}',
+u'\xf0': '{\\dh}',
+u'\xf1': '{\\~{n}}',
+u'\xf2': '{\\`{o}}',
+u'\xf3': "{\\'{o}}",
+u'\xf4': '{\\^{o}}',
+u'\xf5': '{\\~{o}}',
+u'\xf6': '{\\"{o}}',
+u'\xf7': '$\\div$',
+u'\xf8': '{\\o}',
+u'\xf9': '{\\`{u}}',
+u'\xfa': "{\\'{u}}",
+u'\xfb': '{\\^{u}}',
+u'\xfc': '{\\"{u}}',
+u'\xfd': "{\\'{y}}",
+u'\xfe': '{\\th}',
+u'\xff': '{\\"{y}}',
+u'\u0100': '{\\={A}}',
+u'\u0101': '{\\={a}}',
+u'\u0102': '{\\u{A}}',
+u'\u0103': '{\\u{a}}',
+u'\u0104': '{\\k{A}}',
+u'\u0105': '{\\k{a}}',
+u'\u0106': "{\\'{C}}",
+u'\u0107': "{\\'{c}}",
+u'\u0108': '{\\^{C}}',
+u'\u0109': '{\\^{c}}',
+u'\u010a': '{\\.{C}}',
+u'\u010b': '{\\.{c}}',
+u'\u010c': '{\\v{C}}',
+u'\u010d': '{\\v{c}}',
+u'\u010e': '{\\v{D}}',
+u'\u010f': '{\\v{d}}',
+u'\u0110': '{\\DJ}',
+u'\u0111': '{\\dj}',
+u'\u0112': '{\\={E}}',
+u'\u0113': '{\\={e}}',
+u'\u0114': '{\\u{E}}',
+u'\u0115': '{\\u{e}}',
+u'\u0116': '{\\.{E}}',
+u'\u0117': '{\\.{e}}',
+u'\u0118': '{\\k{E}}',
+u'\u0119': '{\\k{e}}',
+u'\u011a': '{\\v{E}}',
+u'\u011b': '{\\v{e}}',
+u'\u011c': '{\\^{G}}',
+u'\u011d': '{\\^{g}}',
+u'\u011e': '{\\u{G}}',
+u'\u011f': '{\\u{g}}',
+u'\u0120': '{\\.{G}}',
+u'\u0121': '{\\.{g}}',
+u'\u0122': '{\\c{G}}',
+u'\u0123': '{\\c{g}}',
+u'\u0124': '{\\^{H}}',
+u'\u0125': '{\\^{h}}',
+u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}',
+u'\u0127': '$\\Elzxh$',
+u'\u0128': '{\\~{I}}',
+u'\u0129': '{\\~{\\i}}',
+u'\u012a': '{\\={I}}',
+u'\u012b': '{\\={\\i}}',
+u'\u012c': '{\\u{I}}',
+u'\u012d': '{\\u{\\i}}',
+u'\u012e': '{\\k{I}}',
+u'\u012f': '{\\k{i}}',
+u'\u0130': '{\\.{I}}',
+u'\u0131': '{\\i}',
+u'\u0132': '{IJ}',
+u'\u0133': '{ij}',
+u'\u0134': '{\\^{J}}',
+u'\u0135': '{\\^{\\j}}',
+u'\u0136': '{\\c{K}}',
+u'\u0137': '{\\c{k}}',
+u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}',
+u'\u0139': "{\\'{L}}",
+u'\u013a': "{\\'{l}}",
+u'\u013b': '{\\c{L}}',
+u'\u013c': '{\\c{l}}',
+u'\u013d': '{\\v{L}}',
+u'\u013e': '{\\v{l}}',
+u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}',
+u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}',
+u'\u0141': '{\\L}',
+u'\u0142': '{\\l}',
+u'\u0143': "{\\'{N}}",
+u'\u0144': "{\\'{n}}",
+u'\u0145': '{\\c{N}}',
+u'\u0146': '{\\c{n}}',
+u'\u0147': '{\\v{N}}',
+u'\u0148': '{\\v{n}}',
+u'\u0149': "{'n}",
+u'\u014a': '{\\NG}',
+u'\u014b': '{\\ng}',
+u'\u014c': '{\\={O}}',
+u'\u014d': '{\\={o}}',
+u'\u014e': '{\\u{O}}',
+u'\u014f': '{\\u{o}}',
+u'\u0150': '{\\H{O}}',
+u'\u0151': '{\\H{o}}',
+u'\u0152': '{\\OE}',
+u'\u0153': '{\\oe}',
+u'\u0154': "{\\'{R}}",
+u'\u0155': "{\\'{r}}",
+u'\u0156': '{\\c{R}}',
+u'\u0157': '{\\c{r}}',
+u'\u0158': '{\\v{R}}',
+u'\u0159': '{\\v{r}}',
+u'\u015a': "{\\'{S}}",
+u'\u015b': "{\\'{s}}",
+u'\u015c': '{\\^{S}}',
+u'\u015d': '{\\^{s}}',
+u'\u015e': '{\\c{S}}',
+u'\u015f': '{\\c{s}}',
+u'\u0160': '{\\v{S}}',
+u'\u0161': '{\\v{s}}',
+u'\u0162': '{\\c{T}}',
+u'\u0163': '{\\c{t}}',
+u'\u0164': '{\\v{T}}',
+u'\u0165': '{\\v{t}}',
+u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}',
+u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}',
+u'\u0168': '{\\~{U}}',
+u'\u0169': '{\\~{u}}',
+u'\u016a': '{\\={U}}',
+u'\u016b': '{\\={u}}',
+u'\u016c': '{\\u{U}}',
+u'\u016d': '{\\u{u}}',
+u'\u016e': '{\\r{U}}',
+u'\u016f': '{\\r{u}}',
+u'\u0170': '{\\H{U}}',
+u'\u0171': '{\\H{u}}',
+u'\u0172': '{\\k{U}}',
+u'\u0173': '{\\k{u}}',
+u'\u0174': '{\\^{W}}',
+u'\u0175': '{\\^{w}}',
+u'\u0176': '{\\^{Y}}',
+u'\u0177': '{\\^{y}}',
+u'\u0178': '{\\"{Y}}',
+u'\u0179': "{\\'{Z}}",
+u'\u017a': "{\\'{z}}",
+u'\u017b': '{\\.{Z}}',
+u'\u017c': '{\\.{z}}',
+u'\u017d': '{\\v{Z}}',
+u'\u017e': '{\\v{z}}',
+u'\u0192': '$f$',
+u'\u0195': '{\\texthvlig}',
+u'\u019e': '{\\textnrleg}',
+u'\u01aa': '$\\eth$',
+u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}',
+u'\u01c2': '{\\textdoublepipe}',
+u'\u01f5': "{\\'{g}}",
+u'\u0250': '$\\Elztrna$',
+u'\u0252': '$\\Elztrnsa$',
+u'\u0254': '$\\Elzopeno$',
+u'\u0256': '$\\Elzrtld$',
+u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}',
+u'\u0259': '$\\Elzschwa$',
+u'\u025b': '$\\varepsilon$',
+u'\u0261': '{g}',
+u'\u0263': '$\\Elzpgamma$',
+u'\u0264': '$\\Elzpbgam$',
+u'\u0265': '$\\Elztrnh$',
+u'\u026c': '$\\Elzbtdl$',
+u'\u026d': '$\\Elzrtll$',
+u'\u026f': '$\\Elztrnm$',
+u'\u0270': '$\\Elztrnmlr$',
+u'\u0271': '$\\Elzltlmr$',
+u'\u0272': '{\\Elzltln}',
+u'\u0273': '$\\Elzrtln$',
+u'\u0277': '$\\Elzclomeg$',
+u'\u0278': '{\\textphi}',
+u'\u0279': '$\\Elztrnr$',
+u'\u027a': '$\\Elztrnrl$',
+u'\u027b': '$\\Elzrttrnr$',
+u'\u027c': '$\\Elzrl$',
+u'\u027d': '$\\Elzrtlr$',
+u'\u027e': '$\\Elzfhr$',
+u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}',
+u'\u0282': '$\\Elzrtls$',
+u'\u0283': '$\\Elzesh$',
+u'\u0287': '$\\Elztrnt$',
+u'\u0288': '$\\Elzrtlt$',
+u'\u028a': '$\\Elzpupsil$',
+u'\u028b': '$\\Elzpscrv$',
+u'\u028c': '$\\Elzinvv$',
+u'\u028d': '$\\Elzinvw$',
+u'\u028e': '$\\Elztrny$',
+u'\u0290': '$\\Elzrtlz$',
+u'\u0292': '$\\Elzyogh$',
+u'\u0294': '$\\Elzglst$',
+u'\u0295': '$\\Elzreglst$',
+u'\u0296': '$\\Elzinglst$',
+u'\u029e': '{\\textturnk}',
+u'\u02a4': '$\\Elzdyogh$',
+u'\u02a7': '$\\Elztesh$',
+u'\u02bc': "{'}",
+u'\u02c7': '{\\textasciicaron}',
+u'\u02c8': '$\\Elzverts$',
+u'\u02cc': '$\\Elzverti$',
+u'\u02d0': '$\\Elzlmrk$',
+u'\u02d1': '$\\Elzhlmrk$',
+u'\u02d2': '$\\Elzsbrhr$',
+u'\u02d3': '$\\Elzsblhr$',
+u'\u02d4': '$\\Elzrais$',
+u'\u02d5': '$\\Elzlow$',
+u'\u02d8': '{\\textasciibreve}',
+u'\u02d9': '{\\textperiodcentered}',
+u'\u02da': '{\\r{}}',
+u'\u02db': '{\\k{}}',
+u'\u02dc': '{\\texttildelow}',
+u'\u02dd': '{\\H{}}',
+u'\u02e5': '{\\tone{55}}',
+u'\u02e6': '{\\tone{44}}',
+u'\u02e7': '{\\tone{33}}',
+u'\u02e8': '{\\tone{22}}',
+u'\u02e9': '{\\tone{11}}',
+u'\u0300': '{\\`}',
+u'\u0301': "{\\'}",
+u'\u0302': '{\\^}',
+u'\u0303': '{\\~}',
+u'\u0304': '{\\=}',
+u'\u0306': '{\\u}',
+u'\u0307': '{\\.}',
+u'\u0308': '{\\"}',
+u'\u030a': '{\\r}',
+u'\u030b': '{\\H}',
+u'\u030c': '{\\v}',
+u'\u030f': '{\\cyrchar\\C}',
+u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}',
+u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}',
+u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}',
+u'\u0321': '$\\Elzpalh$',
+u'\u0322': '{\\Elzrh}',
+u'\u0327': '{\\c}',
+u'\u0328': '{\\k}',
+u'\u032a': '$\\Elzsbbrg$',
+u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}',
+u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}',
+u'\u0335': '{\\Elzxl}',
+u'\u0336': '{\\Elzbar}',
+u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}',
+u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}',
+u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}',
+u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}',
+u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}',
+u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}',
+u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}',
+u'\u0386': "{\\'{A}}",
+u'\u0388': "{\\'{E}}",
+u'\u0389': "{\\'{H}}",
+u'\u038a': "{\\'{}{I}}",
+u'\u038c': "{\\'{}O}",
+u'\u038e': "$\\mathrm{'Y}$",
+u'\u038f': "$\\mathrm{'\\Omega}$",
+u'\u0390': '$\\acute{\\ddot{\\iota}}$',
+u'\u0391': '$\\Alpha$',
+u'\u0392': '$\\Beta$',
+u'\u0393': '$\\Gamma$',
+u'\u0394': '$\\Delta$',
+u'\u0395': '$\\Epsilon$',
+u'\u0396': '$\\Zeta$',
+u'\u0397': '$\\Eta$',
+u'\u0398': '$\\Theta$',
+u'\u0399': '$\\Iota$',
+u'\u039a': '$\\Kappa$',
+u'\u039b': '$\\Lambda$',
+u'\u039c': '$M$',
+u'\u039d': '$N$',
+u'\u039e': '$\\Xi$',
+u'\u039f': '$O$',
+u'\u03a0': '$\\Pi$',
+u'\u03a1': '$\\Rho$',
+u'\u03a3': '$\\Sigma$',
+u'\u03a4': '$\\Tau$',
+u'\u03a5': '$\\Upsilon$',
+u'\u03a6': '$\\Phi$',
+u'\u03a7': '$\\Chi$',
+u'\u03a8': '$\\Psi$',
+u'\u03a9': '$\\Omega$',
+u'\u03aa': '$\\mathrm{\\ddot{I}}$',
+u'\u03ab': '$\\mathrm{\\ddot{Y}}$',
+u'\u03ac': "{\\'{$\\alpha$}}",
+u'\u03ad': '$\\acute{\\epsilon}$',
+u'\u03ae': '$\\acute{\\eta}$',
+u'\u03af': '$\\acute{\\iota}$',
+u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$',
+u'\u03b1': '$\\alpha$',
+u'\u03b2': '$\\beta$',
+u'\u03b3': '$\\gamma$',
+u'\u03b4': '$\\delta$',
+u'\u03b5': '$\\epsilon$',
+u'\u03b6': '$\\zeta$',
+u'\u03b7': '$\\eta$',
+u'\u03b8': '{\\texttheta}',
+u'\u03b9': '$\\iota$',
+u'\u03ba': '$\\kappa$',
+u'\u03bb': '$\\lambda$',
+u'\u03bc': '$\\mu$',
+u'\u03bd': '$\\nu$',
+u'\u03be': '$\\xi$',
+u'\u03bf': '$o$',
+u'\u03c0': '$\\pi$',
+u'\u03c1': '$\\rho$',
+u'\u03c2': '$\\varsigma$',
+u'\u03c3': '$\\sigma$',
+u'\u03c4': '$\\tau$',
+u'\u03c5': '$\\upsilon$',
+u'\u03c6': '$\\varphi$',
+u'\u03c7': '$\\chi$',
+u'\u03c8': '$\\psi$',
+u'\u03c9': '$\\omega$',
+u'\u03ca': '$\\ddot{\\iota}$',
+u'\u03cb': '$\\ddot{\\upsilon}$',
+u'\u03cc': "{\\'{o}}",
+u'\u03cd': '$\\acute{\\upsilon}$',
+u'\u03ce': '$\\acute{\\omega}$',
+u'\u03d0': '{\\Pisymbol{ppi022}{87}}',
+u'\u03d1': '{\\textvartheta}',
+u'\u03d2': '$\\Upsilon$',
+u'\u03d5': '$\\phi$',
+u'\u03d6': '$\\varpi$',
+u'\u03da': '$\\Stigma$',
+u'\u03dc': '$\\Digamma$',
+u'\u03dd': '$\\digamma$',
+u'\u03de': '$\\Koppa$',
+u'\u03e0': '$\\Sampi$',
+u'\u03f0': '$\\varkappa$',
+u'\u03f1': '$\\varrho$',
+u'\u03f4': '{\\textTheta}',
+u'\u03f6': '$\\backepsilon$',
+u'\u0401': '{\\cyrchar\\CYRYO}',
+u'\u0402': '{\\cyrchar\\CYRDJE}',
+u'\u0403': "{\\cyrchar{\\'\\CYRG}}",
+u'\u0404': '{\\cyrchar\\CYRIE}',
+u'\u0405': '{\\cyrchar\\CYRDZE}',
+u'\u0406': '{\\cyrchar\\CYRII}',
+u'\u0407': '{\\cyrchar\\CYRYI}',
+u'\u0408': '{\\cyrchar\\CYRJE}',
+u'\u0409': '{\\cyrchar\\CYRLJE}',
+u'\u040a': '{\\cyrchar\\CYRNJE}',
+u'\u040b': '{\\cyrchar\\CYRTSHE}',
+u'\u040c': "{\\cyrchar{\\'\\CYRK}}",
+u'\u040e': '{\\cyrchar\\CYRUSHRT}',
+u'\u040f': '{\\cyrchar\\CYRDZHE}',
+u'\u0410': '{\\cyrchar\\CYRA}',
+u'\u0411': '{\\cyrchar\\CYRB}',
+u'\u0412': '{\\cyrchar\\CYRV}',
+u'\u0413': '{\\cyrchar\\CYRG}',
+u'\u0414': '{\\cyrchar\\CYRD}',
+u'\u0415': '{\\cyrchar\\CYRE}',
+u'\u0416': '{\\cyrchar\\CYRZH}',
+u'\u0417': '{\\cyrchar\\CYRZ}',
+u'\u0418': '{\\cyrchar\\CYRI}',
+u'\u0419': '{\\cyrchar\\CYRISHRT}',
+u'\u041a': '{\\cyrchar\\CYRK}',
+u'\u041b': '{\\cyrchar\\CYRL}',
+u'\u041c': '{\\cyrchar\\CYRM}',
+u'\u041d': '{\\cyrchar\\CYRN}',
+u'\u041e': '{\\cyrchar\\CYRO}',
+u'\u041f': '{\\cyrchar\\CYRP}',
+u'\u0420': '{\\cyrchar\\CYRR}',
+u'\u0421': '{\\cyrchar\\CYRS}',
+u'\u0422': '{\\cyrchar\\CYRT}',
+u'\u0423': '{\\cyrchar\\CYRU}',
+u'\u0424': '{\\cyrchar\\CYRF}',
+u'\u0425': '{\\cyrchar\\CYRH}',
+u'\u0426': '{\\cyrchar\\CYRC}',
+u'\u0427': '{\\cyrchar\\CYRCH}',
+u'\u0428': '{\\cyrchar\\CYRSH}',
+u'\u0429': '{\\cyrchar\\CYRSHCH}',
+u'\u042a': '{\\cyrchar\\CYRHRDSN}',
+u'\u042b': '{\\cyrchar\\CYRERY}',
+u'\u042c': '{\\cyrchar\\CYRSFTSN}',
+u'\u042d': '{\\cyrchar\\CYREREV}',
+u'\u042e': '{\\cyrchar\\CYRYU}',
+u'\u042f': '{\\cyrchar\\CYRYA}',
+u'\u0430': '{\\cyrchar\\cyra}',
+u'\u0431': '{\\cyrchar\\cyrb}',
+u'\u0432': '{\\cyrchar\\cyrv}',
+u'\u0433': '{\\cyrchar\\cyrg}',
+u'\u0434': '{\\cyrchar\\cyrd}',
+u'\u0435': '{\\cyrchar\\cyre}',
+u'\u0436': '{\\cyrchar\\cyrzh}',
+u'\u0437': '{\\cyrchar\\cyrz}',
+u'\u0438': '{\\cyrchar\\cyri}',
+u'\u0439': '{\\cyrchar\\cyrishrt}',
+u'\u043a': '{\\cyrchar\\cyrk}',
+u'\u043b': '{\\cyrchar\\cyrl}',
+u'\u043c': '{\\cyrchar\\cyrm}',
+u'\u043d': '{\\cyrchar\\cyrn}',
+u'\u043e': '{\\cyrchar\\cyro}',
+u'\u043f': '{\\cyrchar\\cyrp}',
+u'\u0440': '{\\cyrchar\\cyrr}',
+u'\u0441': '{\\cyrchar\\cyrs}',
+u'\u0442': '{\\cyrchar\\cyrt}',
+u'\u0443': '{\\cyrchar\\cyru}',
+u'\u0444': '{\\cyrchar\\cyrf}',
+u'\u0445': '{\\cyrchar\\cyrh}',
+u'\u0446': '{\\cyrchar\\cyrc}',
+u'\u0447': '{\\cyrchar\\cyrch}',
+u'\u0448': '{\\cyrchar\\cyrsh}',
+u'\u0449': '{\\cyrchar\\cyrshch}',
+u'\u044a': '{\\cyrchar\\cyrhrdsn}',
+u'\u044b': '{\\cyrchar\\cyrery}',
+u'\u044c': '{\\cyrchar\\cyrsftsn}',
+u'\u044d': '{\\cyrchar\\cyrerev}',
+u'\u044e': '{\\cyrchar\\cyryu}',
+u'\u044f': '{\\cyrchar\\cyrya}',
+u'\u0451': '{\\cyrchar\\cyryo}',
+u'\u0452': '{\\cyrchar\\cyrdje}',
+u'\u0453': "{\\cyrchar{\\'\\cyrg}}",
+u'\u0454': '{\\cyrchar\\cyrie}',
+u'\u0455': '{\\cyrchar\\cyrdze}',
+u'\u0456': '{\\cyrchar\\cyrii}',
+u'\u0457': '{\\cyrchar\\cyryi}',
+u'\u0458': '{\\cyrchar\\cyrje}',
+u'\u0459': '{\\cyrchar\\cyrlje}',
+u'\u045a': '{\\cyrchar\\cyrnje}',
+u'\u045b': '{\\cyrchar\\cyrtshe}',
+u'\u045c': "{\\cyrchar{\\'\\cyrk}}",
+u'\u045e': '{\\cyrchar\\cyrushrt}',
+u'\u045f': '{\\cyrchar\\cyrdzhe}',
+u'\u0460': '{\\cyrchar\\CYROMEGA}',
+u'\u0461': '{\\cyrchar\\cyromega}',
+u'\u0462': '{\\cyrchar\\CYRYAT}',
+u'\u0464': '{\\cyrchar\\CYRIOTE}',
+u'\u0465': '{\\cyrchar\\cyriote}',
+u'\u0466': '{\\cyrchar\\CYRLYUS}',
+u'\u0467': '{\\cyrchar\\cyrlyus}',
+u'\u0468': '{\\cyrchar\\CYRIOTLYUS}',
+u'\u0469': '{\\cyrchar\\cyriotlyus}',
+u'\u046a': '{\\cyrchar\\CYRBYUS}',
+u'\u046c': '{\\cyrchar\\CYRIOTBYUS}',
+u'\u046d': '{\\cyrchar\\cyriotbyus}',
+u'\u046e': '{\\cyrchar\\CYRKSI}',
+u'\u046f': '{\\cyrchar\\cyrksi}',
+u'\u0470': '{\\cyrchar\\CYRPSI}',
+u'\u0471': '{\\cyrchar\\cyrpsi}',
+u'\u0472': '{\\cyrchar\\CYRFITA}',
+u'\u0474': '{\\cyrchar\\CYRIZH}',
+u'\u0478': '{\\cyrchar\\CYRUK}',
+u'\u0479': '{\\cyrchar\\cyruk}',
+u'\u047a': '{\\cyrchar\\CYROMEGARND}',
+u'\u047b': '{\\cyrchar\\cyromegarnd}',
+u'\u047c': '{\\cyrchar\\CYROMEGATITLO}',
+u'\u047d': '{\\cyrchar\\cyromegatitlo}',
+u'\u047e': '{\\cyrchar\\CYROT}',
+u'\u047f': '{\\cyrchar\\cyrot}',
+u'\u0480': '{\\cyrchar\\CYRKOPPA}',
+u'\u0481': '{\\cyrchar\\cyrkoppa}',
+u'\u0482': '{\\cyrchar\\cyrthousands}',
+u'\u0488': '{\\cyrchar\\cyrhundredthousands}',
+u'\u0489': '{\\cyrchar\\cyrmillions}',
+u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}',
+u'\u048d': '{\\cyrchar\\cyrsemisftsn}',
+u'\u048e': '{\\cyrchar\\CYRRTICK}',
+u'\u048f': '{\\cyrchar\\cyrrtick}',
+u'\u0490': '{\\cyrchar\\CYRGUP}',
+u'\u0491': '{\\cyrchar\\cyrgup}',
+u'\u0492': '{\\cyrchar\\CYRGHCRS}',
+u'\u0493': '{\\cyrchar\\cyrghcrs}',
+u'\u0494': '{\\cyrchar\\CYRGHK}',
+u'\u0495': '{\\cyrchar\\cyrghk}',
+u'\u0496': '{\\cyrchar\\CYRZHDSC}',
+u'\u0497': '{\\cyrchar\\cyrzhdsc}',
+u'\u0498': '{\\cyrchar\\CYRZDSC}',
+u'\u0499': '{\\cyrchar\\cyrzdsc}',
+u'\u049a': '{\\cyrchar\\CYRKDSC}',
+u'\u049b': '{\\cyrchar\\cyrkdsc}',
+u'\u049c': '{\\cyrchar\\CYRKVCRS}',
+u'\u049d': '{\\cyrchar\\cyrkvcrs}',
+u'\u049e': '{\\cyrchar\\CYRKHCRS}',
+u'\u049f': '{\\cyrchar\\cyrkhcrs}',
+u'\u04a0': '{\\cyrchar\\CYRKBEAK}',
+u'\u04a1': '{\\cyrchar\\cyrkbeak}',
+u'\u04a2': '{\\cyrchar\\CYRNDSC}',
+u'\u04a3': '{\\cyrchar\\cyrndsc}',
+u'\u04a4': '{\\cyrchar\\CYRNG}',
+u'\u04a5': '{\\cyrchar\\cyrng}',
+u'\u04a6': '{\\cyrchar\\CYRPHK}',
+u'\u04a7': '{\\cyrchar\\cyrphk}',
+u'\u04a8': '{\\cyrchar\\CYRABHHA}',
+u'\u04a9': '{\\cyrchar\\cyrabhha}',
+u'\u04aa': '{\\cyrchar\\CYRSDSC}',
+u'\u04ab': '{\\cyrchar\\cyrsdsc}',
+u'\u04ac': '{\\cyrchar\\CYRTDSC}',
+u'\u04ad': '{\\cyrchar\\cyrtdsc}',
+u'\u04ae': '{\\cyrchar\\CYRY}',
+u'\u04af': '{\\cyrchar\\cyry}',
+u'\u04b0': '{\\cyrchar\\CYRYHCRS}',
+u'\u04b1': '{\\cyrchar\\cyryhcrs}',
+u'\u04b2': '{\\cyrchar\\CYRHDSC}',
+u'\u04b3': '{\\cyrchar\\cyrhdsc}',
+u'\u04b4': '{\\cyrchar\\CYRTETSE}',
+u'\u04b5': '{\\cyrchar\\cyrtetse}',
+u'\u04b6': '{\\cyrchar\\CYRCHRDSC}',
+u'\u04b7': '{\\cyrchar\\cyrchrdsc}',
+u'\u04b8': '{\\cyrchar\\CYRCHVCRS}',
+u'\u04b9': '{\\cyrchar\\cyrchvcrs}',
+u'\u04ba': '{\\cyrchar\\CYRSHHA}',
+u'\u04bb': '{\\cyrchar\\cyrshha}',
+u'\u04bc': '{\\cyrchar\\CYRABHCH}',
+u'\u04bd': '{\\cyrchar\\cyrabhch}',
+u'\u04be': '{\\cyrchar\\CYRABHCHDSC}',
+u'\u04bf': '{\\cyrchar\\cyrabhchdsc}',
+u'\u04c0': '{\\cyrchar\\CYRpalochka}',
+u'\u04c3': '{\\cyrchar\\CYRKHK}',
+u'\u04c4': '{\\cyrchar\\cyrkhk}',
+u'\u04c7': '{\\cyrchar\\CYRNHK}',
+u'\u04c8': '{\\cyrchar\\cyrnhk}',
+u'\u04cb': '{\\cyrchar\\CYRCHLDSC}',
+u'\u04cc': '{\\cyrchar\\cyrchldsc}',
+u'\u04d4': '{\\cyrchar\\CYRAE}',
+u'\u04d5': '{\\cyrchar\\cyrae}',
+u'\u04d8': '{\\cyrchar\\CYRSCHWA}',
+u'\u04d9': '{\\cyrchar\\cyrschwa}',
+u'\u04e0': '{\\cyrchar\\CYRABHDZE}',
+u'\u04e1': '{\\cyrchar\\cyrabhdze}',
+u'\u04e8': '{\\cyrchar\\CYROTLD}',
+u'\u04e9': '{\\cyrchar\\cyrotld}',
+u'\u2002': '{\\hspace{0.6em}}',
+u'\u2003': '{\\hspace{1em}}',
+u'\u2004': '{\\hspace{0.33em}}',
+u'\u2005': '{\\hspace{0.25em}}',
+u'\u2006': '{\\hspace{0.166em}}',
+u'\u2007': '{\\hphantom{0}}',
+u'\u2008': '{\\hphantom{,}}',
+u'\u2009': '{\\hspace{0.167em}}',
+u'\u200a': '$\\mkern1mu$',
+u'\u2010': '{-}',
+u'\u2013': '{\\textendash}',
+u'\u2014': '{\\textemdash}',
+u'\u2015': '{\\rule{1em}{1pt}}',
+u'\u2016': '$\\Vert$',
+u'\u2018': '{`}',
+u'\u2019': "{'}",
+u'\u201a': '{,}',
+u'\u201b': '$\\Elzreapos$',
+u'\u201c': '{\\textquotedblleft}',
+u'\u201d': '{\\textquotedblright}',
+u'\u201e': '{,,}',
+u'\u2020': '{\\textdagger}',
+u'\u2021': '{\\textdaggerdbl}',
+u'\u2022': '{\\textbullet}',
+u'\u2024': '{.}',
+u'\u2025': '{..}',
+u'\u2026': '{\\ldots}',
+u'\u2030': '{\\textperthousand}',
+u'\u2031': '{\\textpertenthousand}',
+u'\u2032': "${'}$",
+u'\u2033': "${''}$",
+u'\u2034': "${'''}$",
+u'\u2035': '$\\backprime$',
+u'\u2039': '{\\guilsinglleft}',
+u'\u203a': '{\\guilsinglright}',
+u'\u2057': "$''''$",
+u'\u205f': '{\\mkern4mu}',
+u'\u2060': '{\\nolinebreak}',
+u'\u20a7': '{\\ensuremath{\\Elzpes}}',
+u'\u20ac': '{\\mbox{\\texteuro}}',
+u'\u20db': '$\\dddot$',
+u'\u20dc': '$\\ddddot$',
+u'\u2102': '$\\mathbb{C}$',
+u'\u210a': '{\\mathscr{g}}',
+u'\u210b': '$\\mathscr{H}$',
+u'\u210c': '$\\mathfrak{H}$',
+u'\u210d': '$\\mathbb{H}$',
+u'\u210f': '$\\hslash$',
+u'\u2110': '$\\mathscr{I}$',
+u'\u2111': '$\\mathfrak{I}$',
+u'\u2112': '$\\mathscr{L}$',
+u'\u2113': '$\\mathscr{l}$',
+u'\u2115': '$\\mathbb{N}$',
+u'\u2116': '{\\cyrchar\\textnumero}',
+u'\u2118': '$\\wp$',
+u'\u2119': '$\\mathbb{P}$',
+u'\u211a': '$\\mathbb{Q}$',
+u'\u211b': '$\\mathscr{R}$',
+u'\u211c': '$\\mathfrak{R}$',
+u'\u211d': '$\\mathbb{R}$',
+u'\u211e': '$\\Elzxrat$',
+u'\u2122': '{\\texttrademark}',
+u'\u2124': '$\\mathbb{Z}$',
+u'\u2126': '$\\Omega$',
+u'\u2127': '$\\mho$',
+u'\u2128': '$\\mathfrak{Z}$',
+u'\u2129': '$\\ElsevierGlyph{2129}$',
+u'\u212b': '{\\AA}',
+u'\u212c': '$\\mathscr{B}$',
+u'\u212d': '$\\mathfrak{C}$',
+u'\u212f': '$\\mathscr{e}$',
+u'\u2130': '$\\mathscr{E}$',
+u'\u2131': '$\\mathscr{F}$',
+u'\u2133': '$\\mathscr{M}$',
+u'\u2134': '$\\mathscr{o}$',
+u'\u2135': '$\\aleph$',
+u'\u2136': '$\\beth$',
+u'\u2137': '$\\gimel$',
+u'\u2138': '$\\daleth$',
+u'\u2153': '$\\textfrac{1}{3}$',
+u'\u2154': '$\\textfrac{2}{3}$',
+u'\u2155': '$\\textfrac{1}{5}$',
+u'\u2156': '$\\textfrac{2}{5}$',
+u'\u2157': '$\\textfrac{3}{5}$',
+u'\u2158': '$\\textfrac{4}{5}$',
+u'\u2159': '$\\textfrac{1}{6}$',
+u'\u215a': '$\\textfrac{5}{6}$',
+u'\u215b': '$\\textfrac{1}{8}$',
+u'\u215c': '$\\textfrac{3}{8}$',
+u'\u215d': '$\\textfrac{5}{8}$',
+u'\u215e': '$\\textfrac{7}{8}$',
+u'\u2190': '$\\leftarrow$',
+u'\u2191': '$\\uparrow$',
+u'\u2192': '$\\rightarrow$',
+u'\u2193': '$\\downarrow$',
+u'\u2194': '$\\leftrightarrow$',
+u'\u2195': '$\\updownarrow$',
+u'\u2196': '$\\nwarrow$',
+u'\u2197': '$\\nearrow$',
+u'\u2198': '$\\searrow$',
+u'\u2199': '$\\swarrow$',
+u'\u219a': '$\\nleftarrow$',
+u'\u219b': '$\\nrightarrow$',
+u'\u219c': '$\\arrowwaveright$',
+u'\u219d': '$\\arrowwaveright$',
+u'\u219e': '$\\twoheadleftarrow$',
+u'\u21a0': '$\\twoheadrightarrow$',
+u'\u21a2': '$\\leftarrowtail$',
+u'\u21a3': '$\\rightarrowtail$',
+u'\u21a6': '$\\mapsto$',
+u'\u21a9': '$\\hookleftarrow$',
+u'\u21aa': '$\\hookrightarrow$',
+u'\u21ab': '$\\looparrowleft$',
+u'\u21ac': '$\\looparrowright$',
+u'\u21ad': '$\\leftrightsquigarrow$',
+u'\u21ae': '$\\nleftrightarrow$',
+u'\u21b0': '$\\Lsh$',
+u'\u21b1': '$\\Rsh$',
+u'\u21b3': '$\\ElsevierGlyph{21B3}$',
+u'\u21b6': '$\\curvearrowleft$',
+u'\u21b7': '$\\curvearrowright$',
+u'\u21ba': '$\\circlearrowleft$',
+u'\u21bb': '$\\circlearrowright$',
+u'\u21bc': '$\\leftharpoonup$',
+u'\u21bd': '$\\leftharpoondown$',
+u'\u21be': '$\\upharpoonright$',
+u'\u21bf': '$\\upharpoonleft$',
+u'\u21c0': '$\\rightharpoonup$',
+u'\u21c1': '$\\rightharpoondown$',
+u'\u21c2': '$\\downharpoonright$',
+u'\u21c3': '$\\downharpoonleft$',
+u'\u21c4': '$\\rightleftarrows$',
+u'\u21c5': '$\\dblarrowupdown$',
+u'\u21c6': '$\\leftrightarrows$',
+u'\u21c7': '$\\leftleftarrows$',
+u'\u21c8': '$\\upuparrows$',
+u'\u21c9': '$\\rightrightarrows$',
+u'\u21ca': '$\\downdownarrows$',
+u'\u21cb': '$\\leftrightharpoons$',
+u'\u21cc': '$\\rightleftharpoons$',
+u'\u21cd': '$\\nLeftarrow$',
+u'\u21ce': '$\\nLeftrightarrow$',
+u'\u21cf': '$\\nRightarrow$',
+u'\u21d0': '$\\Leftarrow$',
+u'\u21d1': '$\\Uparrow$',
+u'\u21d2': '$\\Rightarrow$',
+u'\u21d3': '$\\Downarrow$',
+u'\u21d4': '$\\Leftrightarrow$',
+u'\u21d5': '$\\Updownarrow$',
+u'\u21da': '$\\Lleftarrow$',
+u'\u21db': '$\\Rrightarrow$',
+u'\u21dd': '$\\rightsquigarrow$',
+u'\u21f5': '$\\DownArrowUpArrow$',
+u'\u2200': '$\\forall$',
+u'\u2201': '$\\complement$',
+u'\u2202': '$\\partial$',
+u'\u2203': '$\\exists$',
+u'\u2204': '$\\nexists$',
+u'\u2205': '$\\varnothing$',
+u'\u2207': '$\\nabla$',
+u'\u2208': '$\\in$',
+u'\u2209': '$\\not\\in$',
+u'\u220b': '$\\ni$',
+u'\u220c': '$\\not\\ni$',
+u'\u220f': '$\\prod$',
+u'\u2210': '$\\coprod$',
+u'\u2211': '$\\sum$',
+u'\u2212': '{-}',
+u'\u2213': '$\\mp$',
+u'\u2214': '$\\dotplus$',
+u'\u2216': '$\\setminus$',
+u'\u2217': '${_\\ast}$',
+u'\u2218': '$\\circ$',
+u'\u2219': '$\\bullet$',
+u'\u221a': '$\\surd$',
+u'\u221d': '$\\propto$',
+u'\u221e': '$\\infty$',
+u'\u221f': '$\\rightangle$',
+u'\u2220': '$\\angle$',
+u'\u2221': '$\\measuredangle$',
+u'\u2222': '$\\sphericalangle$',
+u'\u2223': '$\\mid$',
+u'\u2224': '$\\nmid$',
+u'\u2225': '$\\parallel$',
+u'\u2226': '$\\nparallel$',
+u'\u2227': '$\\wedge$',
+u'\u2228': '$\\vee$',
+u'\u2229': '$\\cap$',
+u'\u222a': '$\\cup$',
+u'\u222b': '$\\int$',
+u'\u222c': '$\\int\\!\\int$',
+u'\u222d': '$\\int\\!\\int\\!\\int$',
+u'\u222e': '$\\oint$',
+u'\u222f': '$\\surfintegral$',
+u'\u2230': '$\\volintegral$',
+u'\u2231': '$\\clwintegral$',
+u'\u2232': '$\\ElsevierGlyph{2232}$',
+u'\u2233': '$\\ElsevierGlyph{2233}$',
+u'\u2234': '$\\therefore$',
+u'\u2235': '$\\because$',
+u'\u2237': '$\\Colon$',
+u'\u2238': '$\\ElsevierGlyph{2238}$',
+u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$',
+u'\u223b': '$\\homothetic$',
+u'\u223c': '$\\sim$',
+u'\u223d': '$\\backsim$',
+u'\u223e': '$\\lazysinv$',
+u'\u2240': '$\\wr$',
+u'\u2241': '$\\not\\sim$',
+u'\u2242': '$\\ElsevierGlyph{2242}$',
+u'\u2243': '$\\simeq$',
+u'\u2244': '$\\not\\simeq$',
+u'\u2245': '$\\cong$',
+u'\u2246': '$\\approxnotequal$',
+u'\u2247': '$\\not\\cong$',
+u'\u2248': '$\\approx$',
+u'\u2249': '$\\not\\approx$',
+u'\u224a': '$\\approxeq$',
+u'\u224b': '$\\tildetrpl$',
+u'\u224c': '$\\allequal$',
+u'\u224d': '$\\asymp$',
+u'\u224e': '$\\Bumpeq$',
+u'\u224f': '$\\bumpeq$',
+u'\u2250': '$\\doteq$',
+u'\u2251': '$\\doteqdot$',
+u'\u2252': '$\\fallingdotseq$',
+u'\u2253': '$\\risingdotseq$',
+u'\u2254': '{:=}',
+u'\u2255': '$=:$',
+u'\u2256': '$\\eqcirc$',
+u'\u2257': '$\\circeq$',
+u'\u2259': '$\\estimates$',
+u'\u225a': '$\\ElsevierGlyph{225A}$',
+u'\u225b': '$\\starequal$',
+u'\u225c': '$\\triangleq$',
+u'\u225f': '$\\ElsevierGlyph{225F}$',
+u'\u2260': '$\\not =$',
+u'\u2261': '$\\equiv$',
+u'\u2262': '$\\not\\equiv$',
+u'\u2264': '$\\leq$',
+u'\u2265': '$\\geq$',
+u'\u2266': '$\\leqq$',
+u'\u2267': '$\\geqq$',
+u'\u2268': '$\\lneqq$',
+u'\u2269': '$\\gneqq$',
+u'\u226a': '$\\ll$',
+u'\u226b': '$\\gg$',
+u'\u226c': '$\\between$',
+u'\u226d': '$\\not\\kern-0.3em\\times$',
+u'\u226e': '$\\not<$',
+u'\u226f': '$\\not>$',
+u'\u2270': '$\\not\\leq$',
+u'\u2271': '$\\not\\geq$',
+u'\u2272': '$\\lessequivlnt$',
+u'\u2273': '$\\greaterequivlnt$',
+u'\u2274': '$\\ElsevierGlyph{2274}$',
+u'\u2275': '$\\ElsevierGlyph{2275}$',
+u'\u2276': '$\\lessgtr$',
+u'\u2277': '$\\gtrless$',
+u'\u2278': '$\\notlessgreater$',
+u'\u2279': '$\\notgreaterless$',
+u'\u227a': '$\\prec$',
+u'\u227b': '$\\succ$',
+u'\u227c': '$\\preccurlyeq$',
+u'\u227d': '$\\succcurlyeq$',
+u'\u227e': '$\\precapprox$',
+u'\u227f': '$\\succapprox$',
+u'\u2280': '$\\not\\prec$',
+u'\u2281': '$\\not\\succ$',
+u'\u2282': '$\\subset$',
+u'\u2283': '$\\supset$',
+u'\u2284': '$\\not\\subset$',
+u'\u2285': '$\\not\\supset$',
+u'\u2286': '$\\subseteq$',
+u'\u2287': '$\\supseteq$',
+u'\u2288': '$\\not\\subseteq$',
+u'\u2289': '$\\not\\supseteq$',
+u'\u228a': '$\\subsetneq$',
+u'\u228b': '$\\supsetneq$',
+u'\u228e': '$\\uplus$',
+u'\u228f': '$\\sqsubset$',
+u'\u2290': '$\\sqsupset$',
+u'\u2291': '$\\sqsubseteq$',
+u'\u2292': '$\\sqsupseteq$',
+u'\u2293': '$\\sqcap$',
+u'\u2294': '$\\sqcup$',
+u'\u2295': '$\\oplus$',
+u'\u2296': '$\\ominus$',
+u'\u2297': '$\\otimes$',
+u'\u2298': '$\\oslash$',
+u'\u2299': '$\\odot$',
+u'\u229a': '$\\circledcirc$',
+u'\u229b': '$\\circledast$',
+u'\u229d': '$\\circleddash$',
+u'\u229e': '$\\boxplus$',
+u'\u229f': '$\\boxminus$',
+u'\u22a0': '$\\boxtimes$',
+u'\u22a1': '$\\boxdot$',
+u'\u22a2': '$\\vdash$',
+u'\u22a3': '$\\dashv$',
+u'\u22a4': '$\\top$',
+u'\u22a5': '$\\perp$',
+u'\u22a7': '$\\truestate$',
+u'\u22a8': '$\\forcesextra$',
+u'\u22a9': '$\\Vdash$',
+u'\u22aa': '$\\Vvdash$',
+u'\u22ab': '$\\VDash$',
+u'\u22ac': '$\\nvdash$',
+u'\u22ad': '$\\nvDash$',
+u'\u22ae': '$\\nVdash$',
+u'\u22af': '$\\nVDash$',
+u'\u22b2': '$\\vartriangleleft$',
+u'\u22b3': '$\\vartriangleright$',
+u'\u22b4': '$\\trianglelefteq$',
+u'\u22b5': '$\\trianglerighteq$',
+u'\u22b6': '$\\original$',
+u'\u22b7': '$\\image$',
+u'\u22b8': '$\\multimap$',
+u'\u22b9': '$\\hermitconjmatrix$',
+u'\u22ba': '$\\intercal$',
+u'\u22bb': '$\\veebar$',
+u'\u22be': '$\\rightanglearc$',
+u'\u22c0': '$\\ElsevierGlyph{22C0}$',
+u'\u22c1': '$\\ElsevierGlyph{22C1}$',
+u'\u22c2': '$\\bigcap$',
+u'\u22c3': '$\\bigcup$',
+u'\u22c4': '$\\diamond$',
+u'\u22c5': '$\\cdot$',
+u'\u22c6': '$\\star$',
+u'\u22c7': '$\\divideontimes$',
+u'\u22c8': '$\\bowtie$',
+u'\u22c9': '$\\ltimes$',
+u'\u22ca': '$\\rtimes$',
+u'\u22cb': '$\\leftthreetimes$',
+u'\u22cc': '$\\rightthreetimes$',
+u'\u22cd': '$\\backsimeq$',
+u'\u22ce': '$\\curlyvee$',
+u'\u22cf': '$\\curlywedge$',
+u'\u22d0': '$\\Subset$',
+u'\u22d1': '$\\Supset$',
+u'\u22d2': '$\\Cap$',
+u'\u22d3': '$\\Cup$',
+u'\u22d4': '$\\pitchfork$',
+u'\u22d6': '$\\lessdot$',
+u'\u22d7': '$\\gtrdot$',
+u'\u22d8': '$\\verymuchless$',
+u'\u22d9': '$\\verymuchgreater$',
+u'\u22da': '$\\lesseqgtr$',
+u'\u22db': '$\\gtreqless$',
+u'\u22de': '$\\curlyeqprec$',
+u'\u22df': '$\\curlyeqsucc$',
+u'\u22e2': '$\\not\\sqsubseteq$',
+u'\u22e3': '$\\not\\sqsupseteq$',
+u'\u22e5': '$\\Elzsqspne$',
+u'\u22e6': '$\\lnsim$',
+u'\u22e7': '$\\gnsim$',
+u'\u22e8': '$\\precedesnotsimilar$',
+u'\u22e9': '$\\succnsim$',
+u'\u22ea': '$\\ntriangleleft$',
+u'\u22eb': '$\\ntriangleright$',
+u'\u22ec': '$\\ntrianglelefteq$',
+u'\u22ed': '$\\ntrianglerighteq$',
+u'\u22ee': '$\\vdots$',
+u'\u22ef': '$\\cdots$',
+u'\u22f0': '$\\upslopeellipsis$',
+u'\u22f1': '$\\downslopeellipsis$',
+u'\u2305': '{\\barwedge}',
+u'\u2306': '$\\perspcorrespond$',
+u'\u2308': '$\\lceil$',
+u'\u2309': '$\\rceil$',
+u'\u230a': '$\\lfloor$',
+u'\u230b': '$\\rfloor$',
+u'\u2315': '$\\recorder$',
+u'\u2316': '$\\mathchar"2208$',
+u'\u231c': '$\\ulcorner$',
+u'\u231d': '$\\urcorner$',
+u'\u231e': '$\\llcorner$',
+u'\u231f': '$\\lrcorner$',
+u'\u2322': '$\\frown$',
+u'\u2323': '$\\smile$',
+u'\u2329': '$\\langle$',
+u'\u232a': '$\\rangle$',
+u'\u233d': '$\\ElsevierGlyph{E838}$',
+u'\u23a3': '$\\Elzdlcorn$',
+u'\u23b0': '$\\lmoustache$',
+u'\u23b1': '$\\rmoustache$',
+u'\u2423': '{\\textvisiblespace}',
+u'\u2460': '{\\ding{172}}',
+u'\u2461': '{\\ding{173}}',
+u'\u2462': '{\\ding{174}}',
+u'\u2463': '{\\ding{175}}',
+u'\u2464': '{\\ding{176}}',
+u'\u2465': '{\\ding{177}}',
+u'\u2466': '{\\ding{178}}',
+u'\u2467': '{\\ding{179}}',
+u'\u2468': '{\\ding{180}}',
+u'\u2469': '{\\ding{181}}',
+u'\u24c8': '$\\circledS$',
+u'\u2506': '$\\Elzdshfnc$',
+u'\u2519': '$\\Elzsqfnw$',
+u'\u2571': '$\\diagup$',
+u'\u25a0': '{\\ding{110}}',
+u'\u25a1': '$\\square$',
+u'\u25aa': '$\\blacksquare$',
+u'\u25ad': '$\\fbox{~~}$',
+u'\u25af': '$\\Elzvrecto$',
+u'\u25b1': '$\\ElsevierGlyph{E381}$',
+u'\u25b2': '{\\ding{115}}',
+u'\u25b3': '$\\bigtriangleup$',
+u'\u25b4': '$\\blacktriangle$',
+u'\u25b5': '$\\vartriangle$',
+u'\u25b8': '$\\blacktriangleright$',
+u'\u25b9': '$\\triangleright$',
+u'\u25bc': '{\\ding{116}}',
+u'\u25bd': '$\\bigtriangledown$',
+u'\u25be': '$\\blacktriangledown$',
+u'\u25bf': '$\\triangledown$',
+u'\u25c2': '$\\blacktriangleleft$',
+u'\u25c3': '$\\triangleleft$',
+u'\u25c6': '{\\ding{117}}',
+u'\u25ca': '$\\lozenge$',
+u'\u25cb': '$\\bigcirc$',
+u'\u25cf': '{\\ding{108}}',
+u'\u25d0': '$\\Elzcirfl$',
+u'\u25d1': '$\\Elzcirfr$',
+u'\u25d2': '$\\Elzcirfb$',
+u'\u25d7': '{\\ding{119}}',
+u'\u25d8': '$\\Elzrvbull$',
+u'\u25e7': '$\\Elzsqfl$',
+u'\u25e8': '$\\Elzsqfr$',
+u'\u25ea': '$\\Elzsqfse$',
+u'\u25ef': '$\\bigcirc$',
+u'\u2605': '{\\ding{72}}',
+u'\u2606': '{\\ding{73}}',
+u'\u260e': '{\\ding{37}}',
+u'\u261b': '{\\ding{42}}',
+u'\u261e': '{\\ding{43}}',
+u'\u263e': '{\\rightmoon}',
+u'\u263f': '{\\mercury}',
+u'\u2640': '{\\venus}',
+u'\u2642': '{\\male}',
+u'\u2643': '{\\jupiter}',
+u'\u2644': '{\\saturn}',
+u'\u2645': '{\\uranus}',
+u'\u2646': '{\\neptune}',
+u'\u2647': '{\\pluto}',
+u'\u2648': '{\\aries}',
+u'\u2649': '{\\taurus}',
+u'\u264a': '{\\gemini}',
+u'\u264b': '{\\cancer}',
+u'\u264c': '{\\leo}',
+u'\u264d': '{\\virgo}',
+u'\u264e': '{\\libra}',
+u'\u264f': '{\\scorpio}',
+u'\u2650': '{\\sagittarius}',
+u'\u2651': '{\\capricornus}',
+u'\u2652': '{\\aquarius}',
+u'\u2653': '{\\pisces}',
+u'\u2660': '{\\ding{171}}',
+u'\u2662': '$\\diamond$',
+u'\u2663': '{\\ding{168}}',
+u'\u2665': '{\\ding{170}}',
+u'\u2666': '{\\ding{169}}',
+u'\u2669': '{\\quarternote}',
+u'\u266a': '{\\eighthnote}',
+u'\u266d': '$\\flat$',
+u'\u266e': '$\\natural$',
+u'\u266f': '$\\sharp$',
+u'\u2701': '{\\ding{33}}',
+u'\u2702': '{\\ding{34}}',
+u'\u2703': '{\\ding{35}}',
+u'\u2704': '{\\ding{36}}',
+u'\u2706': '{\\ding{38}}',
+u'\u2707': '{\\ding{39}}',
+u'\u2708': '{\\ding{40}}',
+u'\u2709': '{\\ding{41}}',
+u'\u270c': '{\\ding{44}}',
+u'\u270d': '{\\ding{45}}',
+u'\u270e': '{\\ding{46}}',
+u'\u270f': '{\\ding{47}}',
+u'\u2710': '{\\ding{48}}',
+u'\u2711': '{\\ding{49}}',
+u'\u2712': '{\\ding{50}}',
+u'\u2713': '{\\ding{51}}',
+u'\u2714': '{\\ding{52}}',
+u'\u2715': '{\\ding{53}}',
+u'\u2716': '{\\ding{54}}',
+u'\u2717': '{\\ding{55}}',
+u'\u2718': '{\\ding{56}}',
+u'\u2719': '{\\ding{57}}',
+u'\u271a': '{\\ding{58}}',
+u'\u271b': '{\\ding{59}}',
+u'\u271c': '{\\ding{60}}',
+u'\u271d': '{\\ding{61}}',
+u'\u271e': '{\\ding{62}}',
+u'\u271f': '{\\ding{63}}',
+u'\u2720': '{\\ding{64}}',
+u'\u2721': '{\\ding{65}}',
+u'\u2722': '{\\ding{66}}',
+u'\u2723': '{\\ding{67}}',
+u'\u2724': '{\\ding{68}}',
+u'\u2725': '{\\ding{69}}',
+u'\u2726': '{\\ding{70}}',
+u'\u2727': '{\\ding{71}}',
+u'\u2729': '{\\ding{73}}',
+u'\u272a': '{\\ding{74}}',
+u'\u272b': '{\\ding{75}}',
+u'\u272c': '{\\ding{76}}',
+u'\u272d': '{\\ding{77}}',
+u'\u272e': '{\\ding{78}}',
+u'\u272f': '{\\ding{79}}',
+u'\u2730': '{\\ding{80}}',
+u'\u2731': '{\\ding{81}}',
+u'\u2732': '{\\ding{82}}',
+u'\u2733': '{\\ding{83}}',
+u'\u2734': '{\\ding{84}}',
+u'\u2735': '{\\ding{85}}',
+u'\u2736': '{\\ding{86}}',
+u'\u2737': '{\\ding{87}}',
+u'\u2738': '{\\ding{88}}',
+u'\u2739': '{\\ding{89}}',
+u'\u273a': '{\\ding{90}}',
+u'\u273b': '{\\ding{91}}',
+u'\u273c': '{\\ding{92}}',
+u'\u273d': '{\\ding{93}}',
+u'\u273e': '{\\ding{94}}',
+u'\u273f': '{\\ding{95}}',
+u'\u2740': '{\\ding{96}}',
+u'\u2741': '{\\ding{97}}',
+u'\u2742': '{\\ding{98}}',
+u'\u2743': '{\\ding{99}}',
+u'\u2744': '{\\ding{100}}',
+u'\u2745': '{\\ding{101}}',
+u'\u2746': '{\\ding{102}}',
+u'\u2747': '{\\ding{103}}',
+u'\u2748': '{\\ding{104}}',
+u'\u2749': '{\\ding{105}}',
+u'\u274a': '{\\ding{106}}',
+u'\u274b': '{\\ding{107}}',
+u'\u274d': '{\\ding{109}}',
+u'\u274f': '{\\ding{111}}',
+u'\u2750': '{\\ding{112}}',
+u'\u2751': '{\\ding{113}}',
+u'\u2752': '{\\ding{114}}',
+u'\u2756': '{\\ding{118}}',
+u'\u2758': '{\\ding{120}}',
+u'\u2759': '{\\ding{121}}',
+u'\u275a': '{\\ding{122}}',
+u'\u275b': '{\\ding{123}}',
+u'\u275c': '{\\ding{124}}',
+u'\u275d': '{\\ding{125}}',
+u'\u275e': '{\\ding{126}}',
+u'\u2761': '{\\ding{161}}',
+u'\u2762': '{\\ding{162}}',
+u'\u2763': '{\\ding{163}}',
+u'\u2764': '{\\ding{164}}',
+u'\u2765': '{\\ding{165}}',
+u'\u2766': '{\\ding{166}}',
+u'\u2767': '{\\ding{167}}',
+u'\u2776': '{\\ding{182}}',
+u'\u2777': '{\\ding{183}}',
+u'\u2778': '{\\ding{184}}',
+u'\u2779': '{\\ding{185}}',
+u'\u277a': '{\\ding{186}}',
+u'\u277b': '{\\ding{187}}',
+u'\u277c': '{\\ding{188}}',
+u'\u277d': '{\\ding{189}}',
+u'\u277e': '{\\ding{190}}',
+u'\u277f': '{\\ding{191}}',
+u'\u2780': '{\\ding{192}}',
+u'\u2781': '{\\ding{193}}',
+u'\u2782': '{\\ding{194}}',
+u'\u2783': '{\\ding{195}}',
+u'\u2784': '{\\ding{196}}',
+u'\u2785': '{\\ding{197}}',
+u'\u2786': '{\\ding{198}}',
+u'\u2787': '{\\ding{199}}',
+u'\u2788': '{\\ding{200}}',
+u'\u2789': '{\\ding{201}}',
+u'\u278a': '{\\ding{202}}',
+u'\u278b': '{\\ding{203}}',
+u'\u278c': '{\\ding{204}}',
+u'\u278d': '{\\ding{205}}',
+u'\u278e': '{\\ding{206}}',
+u'\u278f': '{\\ding{207}}',
+u'\u2790': '{\\ding{208}}',
+u'\u2791': '{\\ding{209}}',
+u'\u2792': '{\\ding{210}}',
+u'\u2793': '{\\ding{211}}',
+u'\u2794': '{\\ding{212}}',
+u'\u2798': '{\\ding{216}}',
+u'\u2799': '{\\ding{217}}',
+u'\u279a': '{\\ding{218}}',
+u'\u279b': '{\\ding{219}}',
+u'\u279c': '{\\ding{220}}',
+u'\u279d': '{\\ding{221}}',
+u'\u279e': '{\\ding{222}}',
+u'\u279f': '{\\ding{223}}',
+u'\u27a0': '{\\ding{224}}',
+u'\u27a1': '{\\ding{225}}',
+u'\u27a2': '{\\ding{226}}',
+u'\u27a3': '{\\ding{227}}',
+u'\u27a4': '{\\ding{228}}',
+u'\u27a5': '{\\ding{229}}',
+u'\u27a6': '{\\ding{230}}',
+u'\u27a7': '{\\ding{231}}',
+u'\u27a8': '{\\ding{232}}',
+u'\u27a9': '{\\ding{233}}',
+u'\u27aa': '{\\ding{234}}',
+u'\u27ab': '{\\ding{235}}',
+u'\u27ac': '{\\ding{236}}',
+u'\u27ad': '{\\ding{237}}',
+u'\u27ae': '{\\ding{238}}',
+u'\u27af': '{\\ding{239}}',
+u'\u27b1': '{\\ding{241}}',
+u'\u27b2': '{\\ding{242}}',
+u'\u27b3': '{\\ding{243}}',
+u'\u27b4': '{\\ding{244}}',
+u'\u27b5': '{\\ding{245}}',
+u'\u27b6': '{\\ding{246}}',
+u'\u27b7': '{\\ding{247}}',
+u'\u27b8': '{\\ding{248}}',
+u'\u27b9': '{\\ding{249}}',
+u'\u27ba': '{\\ding{250}}',
+u'\u27bb': '{\\ding{251}}',
+u'\u27bc': '{\\ding{252}}',
+u'\u27bd': '{\\ding{253}}',
+u'\u27be': '{\\ding{254}}',
+u'\u27f5': '$\\longleftarrow$',
+u'\u27f6': '$\\longrightarrow$',
+u'\u27f7': '$\\longleftrightarrow$',
+u'\u27f8': '$\\Longleftarrow$',
+u'\u27f9': '$\\Longrightarrow$',
+u'\u27fa': '$\\Longleftrightarrow$',
+u'\u27fc': '$\\longmapsto$',
+u'\u27ff': '$\\sim\\joinrel\\leadsto$',
+u'\u2905': '$\\ElsevierGlyph{E212}$',
+u'\u2912': '$\\UpArrowBar$',
+u'\u2913': '$\\DownArrowBar$',
+u'\u2923': '$\\ElsevierGlyph{E20C}$',
+u'\u2924': '$\\ElsevierGlyph{E20D}$',
+u'\u2925': '$\\ElsevierGlyph{E20B}$',
+u'\u2926': '$\\ElsevierGlyph{E20A}$',
+u'\u2927': '$\\ElsevierGlyph{E211}$',
+u'\u2928': '$\\ElsevierGlyph{E20E}$',
+u'\u2929': '$\\ElsevierGlyph{E20F}$',
+u'\u292a': '$\\ElsevierGlyph{E210}$',
+u'\u2933': '$\\ElsevierGlyph{E21C}$',
+u'\u2936': '$\\ElsevierGlyph{E21A}$',
+u'\u2937': '$\\ElsevierGlyph{E219}$',
+u'\u2940': '$\\Elolarr$',
+u'\u2941': '$\\Elorarr$',
+u'\u2942': '$\\ElzRlarr$',
+u'\u2944': '$\\ElzrLarr$',
+u'\u2947': '$\\Elzrarrx$',
+u'\u294e': '$\\LeftRightVector$',
+u'\u294f': '$\\RightUpDownVector$',
+u'\u2950': '$\\DownLeftRightVector$',
+u'\u2951': '$\\LeftUpDownVector$',
+u'\u2952': '$\\LeftVectorBar$',
+u'\u2953': '$\\RightVectorBar$',
+u'\u2954': '$\\RightUpVectorBar$',
+u'\u2955': '$\\RightDownVectorBar$',
+u'\u2956': '$\\DownLeftVectorBar$',
+u'\u2957': '$\\DownRightVectorBar$',
+u'\u2958': '$\\LeftUpVectorBar$',
+u'\u2959': '$\\LeftDownVectorBar$',
+u'\u295a': '$\\LeftTeeVector$',
+u'\u295b': '$\\RightTeeVector$',
+u'\u295c': '$\\RightUpTeeVector$',
+u'\u295d': '$\\RightDownTeeVector$',
+u'\u295e': '$\\DownLeftTeeVector$',
+u'\u295f': '$\\DownRightTeeVector$',
+u'\u2960': '$\\LeftUpTeeVector$',
+u'\u2961': '$\\LeftDownTeeVector$',
+u'\u296e': '$\\UpEquilibrium$',
+u'\u296f': '$\\ReverseUpEquilibrium$',
+u'\u2970': '$\\RoundImplies$',
+u'\u297c': '$\\ElsevierGlyph{E214}$',
+u'\u297d': '$\\ElsevierGlyph{E215}$',
+u'\u2980': '$\\Elztfnc$',
+u'\u2985': '$\\ElsevierGlyph{3018}$',
+u'\u2986': '$\\Elroang$',
+u'\u2993': '$<\\kern-0.58em($',
+u'\u2994': '$\\ElsevierGlyph{E291}$',
+u'\u2999': '$\\Elzddfnc$',
+u'\u299c': '$\\Angle$',
+u'\u29a0': '$\\Elzlpargt$',
+u'\u29b5': '$\\ElsevierGlyph{E260}$',
+u'\u29b6': '$\\ElsevierGlyph{E61B}$',
+u'\u29ca': '$\\ElzLap$',
+u'\u29cb': '$\\Elzdefas$',
+u'\u29cf': '$\\LeftTriangleBar$',
+u'\u29d0': '$\\RightTriangleBar$',
+u'\u29dc': '$\\ElsevierGlyph{E372}$',
+u'\u29eb': '$\\blacklozenge$',
+u'\u29f4': '$\\RuleDelayed$',
+u'\u2a04': '$\\Elxuplus$',
+u'\u2a05': '$\\ElzThr$',
+u'\u2a06': '$\\Elxsqcup$',
+u'\u2a07': '$\\ElzInf$',
+u'\u2a08': '$\\ElzSup$',
+u'\u2a0d': '$\\ElzCint$',
+u'\u2a0f': '$\\clockoint$',
+u'\u2a10': '$\\ElsevierGlyph{E395}$',
+u'\u2a16': '$\\sqrint$',
+u'\u2a25': '$\\ElsevierGlyph{E25A}$',
+u'\u2a2a': '$\\ElsevierGlyph{E25B}$',
+u'\u2a2d': '$\\ElsevierGlyph{E25C}$',
+u'\u2a2e': '$\\ElsevierGlyph{E25D}$',
+u'\u2a2f': '$\\ElzTimes$',
+u'\u2a34': '$\\ElsevierGlyph{E25E}$',
+u'\u2a35': '$\\ElsevierGlyph{E25E}$',
+u'\u2a3c': '$\\ElsevierGlyph{E259}$',
+u'\u2a3f': '$\\amalg$',
+u'\u2a53': '$\\ElzAnd$',
+u'\u2a54': '$\\ElzOr$',
+u'\u2a55': '$\\ElsevierGlyph{E36E}$',
+u'\u2a56': '$\\ElOr$',
+u'\u2a5e': '$\\perspcorrespond$',
+u'\u2a5f': '$\\Elzminhat$',
+u'\u2a63': '$\\ElsevierGlyph{225A}$',
+u'\u2a6e': '$\\stackrel{*}{=}$',
+u'\u2a75': '$\\Equal$',
+u'\u2a7d': '$\\leqslant$',
+u'\u2a7e': '$\\geqslant$',
+u'\u2a85': '$\\lessapprox$',
+u'\u2a86': '$\\gtrapprox$',
+u'\u2a87': '$\\lneq$',
+u'\u2a88': '$\\gneq$',
+u'\u2a89': '$\\lnapprox$',
+u'\u2a8a': '$\\gnapprox$',
+u'\u2a8b': '$\\lesseqqgtr$',
+u'\u2a8c': '$\\gtreqqless$',
+u'\u2a95': '$\\eqslantless$',
+u'\u2a96': '$\\eqslantgtr$',
+u'\u2a9d': '$\\Pisymbol{ppi020}{117}$',
+u'\u2a9e': '$\\Pisymbol{ppi020}{105}$',
+u'\u2aa1': '$\\NestedLessLess$',
+u'\u2aa2': '$\\NestedGreaterGreater$',
+u'\u2aaf': '$\\preceq$',
+u'\u2ab0': '$\\succeq$',
+u'\u2ab5': '$\\precneqq$',
+u'\u2ab6': '$\\succneqq$',
+u'\u2ab7': '$\\precapprox$',
+u'\u2ab8': '$\\succapprox$',
+u'\u2ab9': '$\\precnapprox$',
+u'\u2aba': '$\\succnapprox$',
+u'\u2ac5': '$\\subseteqq$',
+u'\u2ac6': '$\\supseteqq$',
+u'\u2acb': '$\\subsetneqq$',
+u'\u2acc': '$\\supsetneqq$',
+u'\u2aeb': '$\\ElsevierGlyph{E30D}$',
+u'\u2af6': '$\\Elztdcol$',
+u'\u2afd': '${{/}\\!\\!{/}}$',
+u'\u300a': '$\\ElsevierGlyph{300A}$',
+u'\u300b': '$\\ElsevierGlyph{300B}$',
+u'\u3018': '$\\ElsevierGlyph{3018}$',
+u'\u3019': '$\\ElsevierGlyph{3019}$',
+u'\u301a': '$\\openbracketleft$',
+u'\u301b': '$\\openbracketright$',
+u'\ufb00': '{ff}',
+u'\ufb01': '{fi}',
+u'\ufb02': '{fl}',
+u'\ufb03': '{ffi}',
+u'\ufb04': '{ffl}',
+u'\U0001d400': '$\\mathbf{A}$',
+u'\U0001d401': '$\\mathbf{B}$',
+u'\U0001d402': '$\\mathbf{C}$',
+u'\U0001d403': '$\\mathbf{D}$',
+u'\U0001d404': '$\\mathbf{E}$',
+u'\U0001d405': '$\\mathbf{F}$',
+u'\U0001d406': '$\\mathbf{G}$',
+u'\U0001d407': '$\\mathbf{H}$',
+u'\U0001d408': '$\\mathbf{I}$',
+u'\U0001d409': '$\\mathbf{J}$',
+u'\U0001d40a': '$\\mathbf{K}$',
+u'\U0001d40b': '$\\mathbf{L}$',
+u'\U0001d40c': '$\\mathbf{M}$',
+u'\U0001d40d': '$\\mathbf{N}$',
+u'\U0001d40e': '$\\mathbf{O}$',
+u'\U0001d40f': '$\\mathbf{P}$',
+u'\U0001d410': '$\\mathbf{Q}$',
+u'\U0001d411': '$\\mathbf{R}$',
+u'\U0001d412': '$\\mathbf{S}$',
+u'\U0001d413': '$\\mathbf{T}$',
+u'\U0001d414': '$\\mathbf{U}$',
+u'\U0001d415': '$\\mathbf{V}$',
+u'\U0001d416': '$\\mathbf{W}$',
+u'\U0001d417': '$\\mathbf{X}$',
+u'\U0001d418': '$\\mathbf{Y}$',
+u'\U0001d419': '$\\mathbf{Z}$',
+u'\U0001d41a': '$\\mathbf{a}$',
+u'\U0001d41b': '$\\mathbf{b}$',
+u'\U0001d41c': '$\\mathbf{c}$',
+u'\U0001d41d': '$\\mathbf{d}$',
+u'\U0001d41e': '$\\mathbf{e}$',
+u'\U0001d41f': '$\\mathbf{f}$',
+u'\U0001d420': '$\\mathbf{g}$',
+u'\U0001d421': '$\\mathbf{h}$',
+u'\U0001d422': '$\\mathbf{i}$',
+u'\U0001d423': '$\\mathbf{j}$',
+u'\U0001d424': '$\\mathbf{k}$',
+u'\U0001d425': '$\\mathbf{l}$',
+u'\U0001d426': '$\\mathbf{m}$',
+u'\U0001d427': '$\\mathbf{n}$',
+u'\U0001d428': '$\\mathbf{o}$',
+u'\U0001d429': '$\\mathbf{p}$',
+u'\U0001d42a': '$\\mathbf{q}$',
+u'\U0001d42b': '$\\mathbf{r}$',
+u'\U0001d42c': '$\\mathbf{s}$',
+u'\U0001d42d': '$\\mathbf{t}$',
+u'\U0001d42e': '$\\mathbf{u}$',
+u'\U0001d42f': '$\\mathbf{v}$',
+u'\U0001d430': '$\\mathbf{w}$',
+u'\U0001d431': '$\\mathbf{x}$',
+u'\U0001d432': '$\\mathbf{y}$',
+u'\U0001d433': '$\\mathbf{z}$',
+u'\U0001d434': '$\\mathsl{A}$',
+u'\U0001d435': '$\\mathsl{B}$',
+u'\U0001d436': '$\\mathsl{C}$',
+u'\U0001d437': '$\\mathsl{D}$',
+u'\U0001d438': '$\\mathsl{E}$',
+u'\U0001d439': '$\\mathsl{F}$',
+u'\U0001d43a': '$\\mathsl{G}$',
+u'\U0001d43b': '$\\mathsl{H}$',
+u'\U0001d43c': '$\\mathsl{I}$',
+u'\U0001d43d': '$\\mathsl{J}$',
+u'\U0001d43e': '$\\mathsl{K}$',
+u'\U0001d43f': '$\\mathsl{L}$',
+u'\U0001d440': '$\\mathsl{M}$',
+u'\U0001d441': '$\\mathsl{N}$',
+u'\U0001d442': '$\\mathsl{O}$',
+u'\U0001d443': '$\\mathsl{P}$',
+u'\U0001d444': '$\\mathsl{Q}$',
+u'\U0001d445': '$\\mathsl{R}$',
+u'\U0001d446': '$\\mathsl{S}$',
+u'\U0001d447': '$\\mathsl{T}$',
+u'\U0001d448': '$\\mathsl{U}$',
+u'\U0001d449': '$\\mathsl{V}$',
+u'\U0001d44a': '$\\mathsl{W}$',
+u'\U0001d44b': '$\\mathsl{X}$',
+u'\U0001d44c': '$\\mathsl{Y}$',
+u'\U0001d44d': '$\\mathsl{Z}$',
+u'\U0001d44e': '$\\mathsl{a}$',
+u'\U0001d44f': '$\\mathsl{b}$',
+u'\U0001d450': '$\\mathsl{c}$',
+u'\U0001d451': '$\\mathsl{d}$',
+u'\U0001d452': '$\\mathsl{e}$',
+u'\U0001d453': '$\\mathsl{f}$',
+u'\U0001d454': '$\\mathsl{g}$',
+u'\U0001d456': '$\\mathsl{i}$',
+u'\U0001d457': '$\\mathsl{j}$',
+u'\U0001d458': '$\\mathsl{k}$',
+u'\U0001d459': '$\\mathsl{l}$',
+u'\U0001d45a': '$\\mathsl{m}$',
+u'\U0001d45b': '$\\mathsl{n}$',
+u'\U0001d45c': '$\\mathsl{o}$',
+u'\U0001d45d': '$\\mathsl{p}$',
+u'\U0001d45e': '$\\mathsl{q}$',
+u'\U0001d45f': '$\\mathsl{r}$',
+u'\U0001d460': '$\\mathsl{s}$',
+u'\U0001d461': '$\\mathsl{t}$',
+u'\U0001d462': '$\\mathsl{u}$',
+u'\U0001d463': '$\\mathsl{v}$',
+u'\U0001d464': '$\\mathsl{w}$',
+u'\U0001d465': '$\\mathsl{x}$',
+u'\U0001d466': '$\\mathsl{y}$',
+u'\U0001d467': '$\\mathsl{z}$',
+u'\U0001d468': '$\\mathbit{A}$',
+u'\U0001d469': '$\\mathbit{B}$',
+u'\U0001d46a': '$\\mathbit{C}$',
+u'\U0001d46b': '$\\mathbit{D}$',
+u'\U0001d46c': '$\\mathbit{E}$',
+u'\U0001d46d': '$\\mathbit{F}$',
+u'\U0001d46e': '$\\mathbit{G}$',
+u'\U0001d46f': '$\\mathbit{H}$',
+u'\U0001d470': '$\\mathbit{I}$',
+u'\U0001d471': '$\\mathbit{J}$',
+u'\U0001d472': '$\\mathbit{K}$',
+u'\U0001d473': '$\\mathbit{L}$',
+u'\U0001d474': '$\\mathbit{M}$',
+u'\U0001d475': '$\\mathbit{N}$',
+u'\U0001d476': '$\\mathbit{O}$',
+u'\U0001d477': '$\\mathbit{P}$',
+u'\U0001d478': '$\\mathbit{Q}$',
+u'\U0001d479': '$\\mathbit{R}$',
+u'\U0001d47a': '$\\mathbit{S}$',
+u'\U0001d47b': '$\\mathbit{T}$',
+u'\U0001d47c': '$\\mathbit{U}$',
+u'\U0001d47d': '$\\mathbit{V}$',
+u'\U0001d47e': '$\\mathbit{W}$',
+u'\U0001d47f': '$\\mathbit{X}$',
+u'\U0001d480': '$\\mathbit{Y}$',
+u'\U0001d481': '$\\mathbit{Z}$',
+u'\U0001d482': '$\\mathbit{a}$',
+u'\U0001d483': '$\\mathbit{b}$',
+u'\U0001d484': '$\\mathbit{c}$',
+u'\U0001d485': '$\\mathbit{d}$',
+u'\U0001d486': '$\\mathbit{e}$',
+u'\U0001d487': '$\\mathbit{f}$',
+u'\U0001d488': '$\\mathbit{g}$',
+u'\U0001d489': '$\\mathbit{h}$',
+u'\U0001d48a': '$\\mathbit{i}$',
+u'\U0001d48b': '$\\mathbit{j}$',
+u'\U0001d48c': '$\\mathbit{k}$',
+u'\U0001d48d': '$\\mathbit{l}$',
+u'\U0001d48e': '$\\mathbit{m}$',
+u'\U0001d48f': '$\\mathbit{n}$',
+u'\U0001d490': '$\\mathbit{o}$',
+u'\U0001d491': '$\\mathbit{p}$',
+u'\U0001d492': '$\\mathbit{q}$',
+u'\U0001d493': '$\\mathbit{r}$',
+u'\U0001d494': '$\\mathbit{s}$',
+u'\U0001d495': '$\\mathbit{t}$',
+u'\U0001d496': '$\\mathbit{u}$',
+u'\U0001d497': '$\\mathbit{v}$',
+u'\U0001d498': '$\\mathbit{w}$',
+u'\U0001d499': '$\\mathbit{x}$',
+u'\U0001d49a': '$\\mathbit{y}$',
+u'\U0001d49b': '$\\mathbit{z}$',
+u'\U0001d49c': '$\\mathscr{A}$',
+u'\U0001d49e': '$\\mathscr{C}$',
+u'\U0001d49f': '$\\mathscr{D}$',
+u'\U0001d4a2': '$\\mathscr{G}$',
+u'\U0001d4a5': '$\\mathscr{J}$',
+u'\U0001d4a6': '$\\mathscr{K}$',
+u'\U0001d4a9': '$\\mathscr{N}$',
+u'\U0001d4aa': '$\\mathscr{O}$',
+u'\U0001d4ab': '$\\mathscr{P}$',
+u'\U0001d4ac': '$\\mathscr{Q}$',
+u'\U0001d4ae': '$\\mathscr{S}$',
+u'\U0001d4af': '$\\mathscr{T}$',
+u'\U0001d4b0': '$\\mathscr{U}$',
+u'\U0001d4b1': '$\\mathscr{V}$',
+u'\U0001d4b2': '$\\mathscr{W}$',
+u'\U0001d4b3': '$\\mathscr{X}$',
+u'\U0001d4b4': '$\\mathscr{Y}$',
+u'\U0001d4b5': '$\\mathscr{Z}$',
+u'\U0001d4b6': '$\\mathscr{a}$',
+u'\U0001d4b7': '$\\mathscr{b}$',
+u'\U0001d4b8': '$\\mathscr{c}$',
+u'\U0001d4b9': '$\\mathscr{d}$',
+u'\U0001d4bb': '$\\mathscr{f}$',
+u'\U0001d4bd': '$\\mathscr{h}$',
+u'\U0001d4be': '$\\mathscr{i}$',
+u'\U0001d4bf': '$\\mathscr{j}$',
+u'\U0001d4c0': '$\\mathscr{k}$',
+u'\U0001d4c1': '$\\mathscr{l}$',
+u'\U0001d4c2': '$\\mathscr{m}$',
+u'\U0001d4c3': '$\\mathscr{n}$',
+u'\U0001d4c5': '$\\mathscr{p}$',
+u'\U0001d4c6': '$\\mathscr{q}$',
+u'\U0001d4c7': '$\\mathscr{r}$',
+u'\U0001d4c8': '$\\mathscr{s}$',
+u'\U0001d4c9': '$\\mathscr{t}$',
+u'\U0001d4ca': '$\\mathscr{u}$',
+u'\U0001d4cb': '$\\mathscr{v}$',
+u'\U0001d4cc': '$\\mathscr{w}$',
+u'\U0001d4cd': '$\\mathscr{x}$',
+u'\U0001d4ce': '$\\mathscr{y}$',
+u'\U0001d4cf': '$\\mathscr{z}$',
+u'\U0001d4d0': '$\\mathmit{A}$',
+u'\U0001d4d1': '$\\mathmit{B}$',
+u'\U0001d4d2': '$\\mathmit{C}$',
+u'\U0001d4d3': '$\\mathmit{D}$',
+u'\U0001d4d4': '$\\mathmit{E}$',
+u'\U0001d4d5': '$\\mathmit{F}$',
+u'\U0001d4d6': '$\\mathmit{G}$',
+u'\U0001d4d7': '$\\mathmit{H}$',
+u'\U0001d4d8': '$\\mathmit{I}$',
+u'\U0001d4d9': '$\\mathmit{J}$',
+u'\U0001d4da': '$\\mathmit{K}$',
+u'\U0001d4db': '$\\mathmit{L}$',
+u'\U0001d4dc': '$\\mathmit{M}$',
+u'\U0001d4dd': '$\\mathmit{N}$',
+u'\U0001d4de': '$\\mathmit{O}$',
+u'\U0001d4df': '$\\mathmit{P}$',
+u'\U0001d4e0': '$\\mathmit{Q}$',
+u'\U0001d4e1': '$\\mathmit{R}$',
+u'\U0001d4e2': '$\\mathmit{S}$',
+u'\U0001d4e3': '$\\mathmit{T}$',
+u'\U0001d4e4': '$\\mathmit{U}$',
+u'\U0001d4e5': '$\\mathmit{V}$',
+u'\U0001d4e6': '$\\mathmit{W}$',
+u'\U0001d4e7': '$\\mathmit{X}$',
+u'\U0001d4e8': '$\\mathmit{Y}$',
+u'\U0001d4e9': '$\\mathmit{Z}$',
+u'\U0001d4ea': '$\\mathmit{a}$',
+u'\U0001d4eb': '$\\mathmit{b}$',
+u'\U0001d4ec': '$\\mathmit{c}$',
+u'\U0001d4ed': '$\\mathmit{d}$',
+u'\U0001d4ee': '$\\mathmit{e}$',
+u'\U0001d4ef': '$\\mathmit{f}$',
+u'\U0001d4f0': '$\\mathmit{g}$',
+u'\U0001d4f1': '$\\mathmit{h}$',
+u'\U0001d4f2': '$\\mathmit{i}$',
+u'\U0001d4f3': '$\\mathmit{j}$',
+u'\U0001d4f4': '$\\mathmit{k}$',
+u'\U0001d4f5': '$\\mathmit{l}$',
+u'\U0001d4f6': '$\\mathmit{m}$',
+u'\U0001d4f7': '$\\mathmit{n}$',
+u'\U0001d4f8': '$\\mathmit{o}$',
+u'\U0001d4f9': '$\\mathmit{p}$',
+u'\U0001d4fa': '$\\mathmit{q}$',
+u'\U0001d4fb': '$\\mathmit{r}$',
+u'\U0001d4fc': '$\\mathmit{s}$',
+u'\U0001d4fd': '$\\mathmit{t}$',
+u'\U0001d4fe': '$\\mathmit{u}$',
+u'\U0001d4ff': '$\\mathmit{v}$',
+u'\U0001d500': '$\\mathmit{w}$',
+u'\U0001d501': '$\\mathmit{x}$',
+u'\U0001d502': '$\\mathmit{y}$',
+u'\U0001d503': '$\\mathmit{z}$',
+u'\U0001d504': '$\\mathfrak{A}$',
+u'\U0001d505': '$\\mathfrak{B}$',
+u'\U0001d507': '$\\mathfrak{D}$',
+u'\U0001d508': '$\\mathfrak{E}$',
+u'\U0001d509': '$\\mathfrak{F}$',
+u'\U0001d50a': '$\\mathfrak{G}$',
+u'\U0001d50d': '$\\mathfrak{J}$',
+u'\U0001d50e': '$\\mathfrak{K}$',
+u'\U0001d50f': '$\\mathfrak{L}$',
+u'\U0001d510': '$\\mathfrak{M}$',
+u'\U0001d511': '$\\mathfrak{N}$',
+u'\U0001d512': '$\\mathfrak{O}$',
+u'\U0001d513': '$\\mathfrak{P}$',
+u'\U0001d514': '$\\mathfrak{Q}$',
+u'\U0001d516': '$\\mathfrak{S}$',
+u'\U0001d517': '$\\mathfrak{T}$',
+u'\U0001d518': '$\\mathfrak{U}$',
+u'\U0001d519': '$\\mathfrak{V}$',
+u'\U0001d51a': '$\\mathfrak{W}$',
+u'\U0001d51b': '$\\mathfrak{X}$',
+u'\U0001d51c': '$\\mathfrak{Y}$',
+u'\U0001d51e': '$\\mathfrak{a}$',
+u'\U0001d51f': '$\\mathfrak{b}$',
+u'\U0001d520': '$\\mathfrak{c}$',
+u'\U0001d521': '$\\mathfrak{d}$',
+u'\U0001d522': '$\\mathfrak{e}$',
+u'\U0001d523': '$\\mathfrak{f}$',
+u'\U0001d524': '$\\mathfrak{g}$',
+u'\U0001d525': '$\\mathfrak{h}$',
+u'\U0001d526': '$\\mathfrak{i}$',
+u'\U0001d527': '$\\mathfrak{j}$',
+u'\U0001d528': '$\\mathfrak{k}$',
+u'\U0001d529': '$\\mathfrak{l}$',
+u'\U0001d52a': '$\\mathfrak{m}$',
+u'\U0001d52b': '$\\mathfrak{n}$',
+u'\U0001d52c': '$\\mathfrak{o}$',
+u'\U0001d52d': '$\\mathfrak{p}$',
+u'\U0001d52e': '$\\mathfrak{q}$',
+u'\U0001d52f': '$\\mathfrak{r}$',
+u'\U0001d530': '$\\mathfrak{s}$',
+u'\U0001d531': '$\\mathfrak{t}$',
+u'\U0001d532': '$\\mathfrak{u}$',
+u'\U0001d533': '$\\mathfrak{v}$',
+u'\U0001d534': '$\\mathfrak{w}$',
+u'\U0001d535': '$\\mathfrak{x}$',
+u'\U0001d536': '$\\mathfrak{y}$',
+u'\U0001d537': '$\\mathfrak{z}$',
+u'\U0001d538': '$\\mathbb{A}$',
+u'\U0001d539': '$\\mathbb{B}$',
+u'\U0001d53b': '$\\mathbb{D}$',
+u'\U0001d53c': '$\\mathbb{E}$',
+u'\U0001d53d': '$\\mathbb{F}$',
+u'\U0001d53e': '$\\mathbb{G}$',
+u'\U0001d540': '$\\mathbb{I}$',
+u'\U0001d541': '$\\mathbb{J}$',
+u'\U0001d542': '$\\mathbb{K}$',
+u'\U0001d543': '$\\mathbb{L}$',
+u'\U0001d544': '$\\mathbb{M}$',
+u'\U0001d546': '$\\mathbb{O}$',
+u'\U0001d54a': '$\\mathbb{S}$',
+u'\U0001d54b': '$\\mathbb{T}$',
+u'\U0001d54c': '$\\mathbb{U}$',
+u'\U0001d54d': '$\\mathbb{V}$',
+u'\U0001d54e': '$\\mathbb{W}$',
+u'\U0001d54f': '$\\mathbb{X}$',
+u'\U0001d550': '$\\mathbb{Y}$',
+u'\U0001d552': '$\\mathbb{a}$',
+u'\U0001d553': '$\\mathbb{b}$',
+u'\U0001d554': '$\\mathbb{c}$',
+u'\U0001d555': '$\\mathbb{d}$',
+u'\U0001d556': '$\\mathbb{e}$',
+u'\U0001d557': '$\\mathbb{f}$',
+u'\U0001d558': '$\\mathbb{g}$',
+u'\U0001d559': '$\\mathbb{h}$',
+u'\U0001d55a': '$\\mathbb{i}$',
+u'\U0001d55b': '$\\mathbb{j}$',
+u'\U0001d55c': '$\\mathbb{k}$',
+u'\U0001d55d': '$\\mathbb{l}$',
+u'\U0001d55e': '$\\mathbb{m}$',
+u'\U0001d55f': '$\\mathbb{n}$',
+u'\U0001d560': '$\\mathbb{o}$',
+u'\U0001d561': '$\\mathbb{p}$',
+u'\U0001d562': '$\\mathbb{q}$',
+u'\U0001d563': '$\\mathbb{r}$',
+u'\U0001d564': '$\\mathbb{s}$',
+u'\U0001d565': '$\\mathbb{t}$',
+u'\U0001d566': '$\\mathbb{u}$',
+u'\U0001d567': '$\\mathbb{v}$',
+u'\U0001d568': '$\\mathbb{w}$',
+u'\U0001d569': '$\\mathbb{x}$',
+u'\U0001d56a': '$\\mathbb{y}$',
+u'\U0001d56b': '$\\mathbb{z}$',
+u'\U0001d56c': '$\\mathslbb{A}$',
+u'\U0001d56d': '$\\mathslbb{B}$',
+u'\U0001d56e': '$\\mathslbb{C}$',
+u'\U0001d56f': '$\\mathslbb{D}$',
+u'\U0001d570': '$\\mathslbb{E}$',
+u'\U0001d571': '$\\mathslbb{F}$',
+u'\U0001d572': '$\\mathslbb{G}$',
+u'\U0001d573': '$\\mathslbb{H}$',
+u'\U0001d574': '$\\mathslbb{I}$',
+u'\U0001d575': '$\\mathslbb{J}$',
+u'\U0001d576': '$\\mathslbb{K}$',
+u'\U0001d577': '$\\mathslbb{L}$',
+u'\U0001d578': '$\\mathslbb{M}$',
+u'\U0001d579': '$\\mathslbb{N}$',
+u'\U0001d57a': '$\\mathslbb{O}$',
+u'\U0001d57b': '$\\mathslbb{P}$',
+u'\U0001d57c': '$\\mathslbb{Q}$',
+u'\U0001d57d': '$\\mathslbb{R}$',
+u'\U0001d57e': '$\\mathslbb{S}$',
+u'\U0001d57f': '$\\mathslbb{T}$',
+u'\U0001d580': '$\\mathslbb{U}$',
+u'\U0001d581': '$\\mathslbb{V}$',
+u'\U0001d582': '$\\mathslbb{W}$',
+u'\U0001d583': '$\\mathslbb{X}$',
+u'\U0001d584': '$\\mathslbb{Y}$',
+u'\U0001d585': '$\\mathslbb{Z}$',
+u'\U0001d586': '$\\mathslbb{a}$',
+u'\U0001d587': '$\\mathslbb{b}$',
+u'\U0001d588': '$\\mathslbb{c}$',
+u'\U0001d589': '$\\mathslbb{d}$',
+u'\U0001d58a': '$\\mathslbb{e}$',
+u'\U0001d58b': '$\\mathslbb{f}$',
+u'\U0001d58c': '$\\mathslbb{g}$',
+u'\U0001d58d': '$\\mathslbb{h}$',
+u'\U0001d58e': '$\\mathslbb{i}$',
+u'\U0001d58f': '$\\mathslbb{j}$',
+u'\U0001d590': '$\\mathslbb{k}$',
+u'\U0001d591': '$\\mathslbb{l}$',
+u'\U0001d592': '$\\mathslbb{m}$',
+u'\U0001d593': '$\\mathslbb{n}$',
+u'\U0001d594': '$\\mathslbb{o}$',
+u'\U0001d595': '$\\mathslbb{p}$',
+u'\U0001d596': '$\\mathslbb{q}$',
+u'\U0001d597': '$\\mathslbb{r}$',
+u'\U0001d598': '$\\mathslbb{s}$',
+u'\U0001d599': '$\\mathslbb{t}$',
+u'\U0001d59a': '$\\mathslbb{u}$',
+u'\U0001d59b': '$\\mathslbb{v}$',
+u'\U0001d59c': '$\\mathslbb{w}$',
+u'\U0001d59d': '$\\mathslbb{x}$',
+u'\U0001d59e': '$\\mathslbb{y}$',
+u'\U0001d59f': '$\\mathslbb{z}$',
+u'\U0001d5a0': '$\\mathsf{A}$',
+u'\U0001d5a1': '$\\mathsf{B}$',
+u'\U0001d5a2': '$\\mathsf{C}$',
+u'\U0001d5a3': '$\\mathsf{D}$',
+u'\U0001d5a4': '$\\mathsf{E}$',
+u'\U0001d5a5': '$\\mathsf{F}$',
+u'\U0001d5a6': '$\\mathsf{G}$',
+u'\U0001d5a7': '$\\mathsf{H}$',
+u'\U0001d5a8': '$\\mathsf{I}$',
+u'\U0001d5a9': '$\\mathsf{J}$',
+u'\U0001d5aa': '$\\mathsf{K}$',
+u'\U0001d5ab': '$\\mathsf{L}$',
+u'\U0001d5ac': '$\\mathsf{M}$',
+u'\U0001d5ad': '$\\mathsf{N}$',
+u'\U0001d5ae': '$\\mathsf{O}$',
+u'\U0001d5af': '$\\mathsf{P}$',
+u'\U0001d5b0': '$\\mathsf{Q}$',
+u'\U0001d5b1': '$\\mathsf{R}$',
+u'\U0001d5b2': '$\\mathsf{S}$',
+u'\U0001d5b3': '$\\mathsf{T}$',
+u'\U0001d5b4': '$\\mathsf{U}$',
+u'\U0001d5b5': '$\\mathsf{V}$',
+u'\U0001d5b6': '$\\mathsf{W}$',
+u'\U0001d5b7': '$\\mathsf{X}$',
+u'\U0001d5b8': '$\\mathsf{Y}$',
+u'\U0001d5b9': '$\\mathsf{Z}$',
+u'\U0001d5ba': '$\\mathsf{a}$',
+u'\U0001d5bb': '$\\mathsf{b}$',
+u'\U0001d5bc': '$\\mathsf{c}$',
+u'\U0001d5bd': '$\\mathsf{d}$',
+u'\U0001d5be': '$\\mathsf{e}$',
+u'\U0001d5bf': '$\\mathsf{f}$',
+u'\U0001d5c0': '$\\mathsf{g}$',
+u'\U0001d5c1': '$\\mathsf{h}$',
+u'\U0001d5c2': '$\\mathsf{i}$',
+u'\U0001d5c3': '$\\mathsf{j}$',
+u'\U0001d5c4': '$\\mathsf{k}$',
+u'\U0001d5c5': '$\\mathsf{l}$',
+u'\U0001d5c6': '$\\mathsf{m}$',
+u'\U0001d5c7': '$\\mathsf{n}$',
+u'\U0001d5c8': '$\\mathsf{o}$',
+u'\U0001d5c9': '$\\mathsf{p}$',
+u'\U0001d5ca': '$\\mathsf{q}$',
+u'\U0001d5cb': '$\\mathsf{r}$',
+u'\U0001d5cc': '$\\mathsf{s}$',
+u'\U0001d5cd': '$\\mathsf{t}$',
+u'\U0001d5ce': '$\\mathsf{u}$',
+u'\U0001d5cf': '$\\mathsf{v}$',
+u'\U0001d5d0': '$\\mathsf{w}$',
+u'\U0001d5d1': '$\\mathsf{x}$',
+u'\U0001d5d2': '$\\mathsf{y}$',
+u'\U0001d5d3': '$\\mathsf{z}$',
+u'\U0001d5d4': '$\\mathsfbf{A}$',
+u'\U0001d5d5': '$\\mathsfbf{B}$',
+u'\U0001d5d6': '$\\mathsfbf{C}$',
+u'\U0001d5d7': '$\\mathsfbf{D}$',
+u'\U0001d5d8': '$\\mathsfbf{E}$',
+u'\U0001d5d9': '$\\mathsfbf{F}$',
+u'\U0001d5da': '$\\mathsfbf{G}$',
+u'\U0001d5db': '$\\mathsfbf{H}$',
+u'\U0001d5dc': '$\\mathsfbf{I}$',
+u'\U0001d5dd': '$\\mathsfbf{J}$',
+u'\U0001d5de': '$\\mathsfbf{K}$',
+u'\U0001d5df': '$\\mathsfbf{L}$',
+u'\U0001d5e0': '$\\mathsfbf{M}$',
+u'\U0001d5e1': '$\\mathsfbf{N}$',
+u'\U0001d5e2': '$\\mathsfbf{O}$',
+u'\U0001d5e3': '$\\mathsfbf{P}$',
+u'\U0001d5e4': '$\\mathsfbf{Q}$',
+u'\U0001d5e5': '$\\mathsfbf{R}$',
+u'\U0001d5e6': '$\\mathsfbf{S}$',
+u'\U0001d5e7': '$\\mathsfbf{T}$',
+u'\U0001d5e8': '$\\mathsfbf{U}$',
+u'\U0001d5e9': '$\\mathsfbf{V}$',
+u'\U0001d5ea': '$\\mathsfbf{W}$',
+u'\U0001d5eb': '$\\mathsfbf{X}$',
+u'\U0001d5ec': '$\\mathsfbf{Y}$',
+u'\U0001d5ed': '$\\mathsfbf{Z}$',
+u'\U0001d5ee': '$\\mathsfbf{a}$',
+u'\U0001d5ef': '$\\mathsfbf{b}$',
+u'\U0001d5f0': '$\\mathsfbf{c}$',
+u'\U0001d5f1': '$\\mathsfbf{d}$',
+u'\U0001d5f2': '$\\mathsfbf{e}$',
+u'\U0001d5f3': '$\\mathsfbf{f}$',
+u'\U0001d5f4': '$\\mathsfbf{g}$',
+u'\U0001d5f5': '$\\mathsfbf{h}$',
+u'\U0001d5f6': '$\\mathsfbf{i}$',
+u'\U0001d5f7': '$\\mathsfbf{j}$',
+u'\U0001d5f8': '$\\mathsfbf{k}$',
+u'\U0001d5f9': '$\\mathsfbf{l}$',
+u'\U0001d5fa': '$\\mathsfbf{m}$',
+u'\U0001d5fb': '$\\mathsfbf{n}$',
+u'\U0001d5fc': '$\\mathsfbf{o}$',
+u'\U0001d5fd': '$\\mathsfbf{p}$',
+u'\U0001d5fe': '$\\mathsfbf{q}$',
+u'\U0001d5ff': '$\\mathsfbf{r}$',
+u'\U0001d600': '$\\mathsfbf{s}$',
+u'\U0001d601': '$\\mathsfbf{t}$',
+u'\U0001d602': '$\\mathsfbf{u}$',
+u'\U0001d603': '$\\mathsfbf{v}$',
+u'\U0001d604': '$\\mathsfbf{w}$',
+u'\U0001d605': '$\\mathsfbf{x}$',
+u'\U0001d606': '$\\mathsfbf{y}$',
+u'\U0001d607': '$\\mathsfbf{z}$',
+u'\U0001d608': '$\\mathsfsl{A}$',
+u'\U0001d609': '$\\mathsfsl{B}$',
+u'\U0001d60a': '$\\mathsfsl{C}$',
+u'\U0001d60b': '$\\mathsfsl{D}$',
+u'\U0001d60c': '$\\mathsfsl{E}$',
+u'\U0001d60d': '$\\mathsfsl{F}$',
+u'\U0001d60e': '$\\mathsfsl{G}$',
+u'\U0001d60f': '$\\mathsfsl{H}$',
+u'\U0001d610': '$\\mathsfsl{I}$',
+u'\U0001d611': '$\\mathsfsl{J}$',
+u'\U0001d612': '$\\mathsfsl{K}$',
+u'\U0001d613': '$\\mathsfsl{L}$',
+u'\U0001d614': '$\\mathsfsl{M}$',
+u'\U0001d615': '$\\mathsfsl{N}$',
+u'\U0001d616': '$\\mathsfsl{O}$',
+u'\U0001d617': '$\\mathsfsl{P}$',
+u'\U0001d618': '$\\mathsfsl{Q}$',
+u'\U0001d619': '$\\mathsfsl{R}$',
+u'\U0001d61a': '$\\mathsfsl{S}$',
+u'\U0001d61b': '$\\mathsfsl{T}$',
+u'\U0001d61c': '$\\mathsfsl{U}$',
+u'\U0001d61d': '$\\mathsfsl{V}$',
+u'\U0001d61e': '$\\mathsfsl{W}$',
+u'\U0001d61f': '$\\mathsfsl{X}$',
+u'\U0001d620': '$\\mathsfsl{Y}$',
+u'\U0001d621': '$\\mathsfsl{Z}$',
+u'\U0001d622': '$\\mathsfsl{a}$',
+u'\U0001d623': '$\\mathsfsl{b}$',
+u'\U0001d624': '$\\mathsfsl{c}$',
+u'\U0001d625': '$\\mathsfsl{d}$',
+u'\U0001d626': '$\\mathsfsl{e}$',
+u'\U0001d627': '$\\mathsfsl{f}$',
+u'\U0001d628': '$\\mathsfsl{g}$',
+u'\U0001d629': '$\\mathsfsl{h}$',
+u'\U0001d62a': '$\\mathsfsl{i}$',
+u'\U0001d62b': '$\\mathsfsl{j}$',
+u'\U0001d62c': '$\\mathsfsl{k}$',
+u'\U0001d62d': '$\\mathsfsl{l}$',
+u'\U0001d62e': '$\\mathsfsl{m}$',
+u'\U0001d62f': '$\\mathsfsl{n}$',
+u'\U0001d630': '$\\mathsfsl{o}$',
+u'\U0001d631': '$\\mathsfsl{p}$',
+u'\U0001d632': '$\\mathsfsl{q}$',
+u'\U0001d633': '$\\mathsfsl{r}$',
+u'\U0001d634': '$\\mathsfsl{s}$',
+u'\U0001d635': '$\\mathsfsl{t}$',
+u'\U0001d636': '$\\mathsfsl{u}$',
+u'\U0001d637': '$\\mathsfsl{v}$',
+u'\U0001d638': '$\\mathsfsl{w}$',
+u'\U0001d639': '$\\mathsfsl{x}$',
+u'\U0001d63a': '$\\mathsfsl{y}$',
+u'\U0001d63b': '$\\mathsfsl{z}$',
+u'\U0001d63c': '$\\mathsfbfsl{A}$',
+u'\U0001d63d': '$\\mathsfbfsl{B}$',
+u'\U0001d63e': '$\\mathsfbfsl{C}$',
+u'\U0001d63f': '$\\mathsfbfsl{D}$',
+u'\U0001d640': '$\\mathsfbfsl{E}$',
+u'\U0001d641': '$\\mathsfbfsl{F}$',
+u'\U0001d642': '$\\mathsfbfsl{G}$',
+u'\U0001d643': '$\\mathsfbfsl{H}$',
+u'\U0001d644': '$\\mathsfbfsl{I}$',
+u'\U0001d645': '$\\mathsfbfsl{J}$',
+u'\U0001d646': '$\\mathsfbfsl{K}$',
+u'\U0001d647': '$\\mathsfbfsl{L}$',
+u'\U0001d648': '$\\mathsfbfsl{M}$',
+u'\U0001d649': '$\\mathsfbfsl{N}$',
+u'\U0001d64a': '$\\mathsfbfsl{O}$',
+u'\U0001d64b': '$\\mathsfbfsl{P}$',
+u'\U0001d64c': '$\\mathsfbfsl{Q}$',
+u'\U0001d64d': '$\\mathsfbfsl{R}$',
+u'\U0001d64e': '$\\mathsfbfsl{S}$',
+u'\U0001d64f': '$\\mathsfbfsl{T}$',
+u'\U0001d650': '$\\mathsfbfsl{U}$',
+u'\U0001d651': '$\\mathsfbfsl{V}$',
+u'\U0001d652': '$\\mathsfbfsl{W}$',
+u'\U0001d653': '$\\mathsfbfsl{X}$',
+u'\U0001d654': '$\\mathsfbfsl{Y}$',
+u'\U0001d655': '$\\mathsfbfsl{Z}$',
+u'\U0001d656': '$\\mathsfbfsl{a}$',
+u'\U0001d657': '$\\mathsfbfsl{b}$',
+u'\U0001d658': '$\\mathsfbfsl{c}$',
+u'\U0001d659': '$\\mathsfbfsl{d}$',
+u'\U0001d65a': '$\\mathsfbfsl{e}$',
+u'\U0001d65b': '$\\mathsfbfsl{f}$',
+u'\U0001d65c': '$\\mathsfbfsl{g}$',
+u'\U0001d65d': '$\\mathsfbfsl{h}$',
+u'\U0001d65e': '$\\mathsfbfsl{i}$',
+u'\U0001d65f': '$\\mathsfbfsl{j}$',
+u'\U0001d660': '$\\mathsfbfsl{k}$',
+u'\U0001d661': '$\\mathsfbfsl{l}$',
+u'\U0001d662': '$\\mathsfbfsl{m}$',
+u'\U0001d663': '$\\mathsfbfsl{n}$',
+u'\U0001d664': '$\\mathsfbfsl{o}$',
+u'\U0001d665': '$\\mathsfbfsl{p}$',
+u'\U0001d666': '$\\mathsfbfsl{q}$',
+u'\U0001d667': '$\\mathsfbfsl{r}$',
+u'\U0001d668': '$\\mathsfbfsl{s}$',
+u'\U0001d669': '$\\mathsfbfsl{t}$',
+u'\U0001d66a': '$\\mathsfbfsl{u}$',
+u'\U0001d66b': '$\\mathsfbfsl{v}$',
+u'\U0001d66c': '$\\mathsfbfsl{w}$',
+u'\U0001d66d': '$\\mathsfbfsl{x}$',
+u'\U0001d66e': '$\\mathsfbfsl{y}$',
+u'\U0001d66f': '$\\mathsfbfsl{z}$',
+u'\U0001d670': '$\\mathtt{A}$',
+u'\U0001d671': '$\\mathtt{B}$',
+u'\U0001d672': '$\\mathtt{C}$',
+u'\U0001d673': '$\\mathtt{D}$',
+u'\U0001d674': '$\\mathtt{E}$',
+u'\U0001d675': '$\\mathtt{F}$',
+u'\U0001d676': '$\\mathtt{G}$',
+u'\U0001d677': '$\\mathtt{H}$',
+u'\U0001d678': '$\\mathtt{I}$',
+u'\U0001d679': '$\\mathtt{J}$',
+u'\U0001d67a': '$\\mathtt{K}$',
+u'\U0001d67b': '$\\mathtt{L}$',
+u'\U0001d67c': '$\\mathtt{M}$',
+u'\U0001d67d': '$\\mathtt{N}$',
+u'\U0001d67e': '$\\mathtt{O}$',
+u'\U0001d67f': '$\\mathtt{P}$',
+u'\U0001d680': '$\\mathtt{Q}$',
+u'\U0001d681': '$\\mathtt{R}$',
+u'\U0001d682': '$\\mathtt{S}$',
+u'\U0001d683': '$\\mathtt{T}$',
+u'\U0001d684': '$\\mathtt{U}$',
+u'\U0001d685': '$\\mathtt{V}$',
+u'\U0001d686': '$\\mathtt{W}$',
+u'\U0001d687': '$\\mathtt{X}$',
+u'\U0001d688': '$\\mathtt{Y}$',
+u'\U0001d689': '$\\mathtt{Z}$',
+u'\U0001d68a': '$\\mathtt{a}$',
+u'\U0001d68b': '$\\mathtt{b}$',
+u'\U0001d68c': '$\\mathtt{c}$',
+u'\U0001d68d': '$\\mathtt{d}$',
+u'\U0001d68e': '$\\mathtt{e}$',
+u'\U0001d68f': '$\\mathtt{f}$',
+u'\U0001d690': '$\\mathtt{g}$',
+u'\U0001d691': '$\\mathtt{h}$',
+u'\U0001d692': '$\\mathtt{i}$',
+u'\U0001d693': '$\\mathtt{j}$',
+u'\U0001d694': '$\\mathtt{k}$',
+u'\U0001d695': '$\\mathtt{l}$',
+u'\U0001d696': '$\\mathtt{m}$',
+u'\U0001d697': '$\\mathtt{n}$',
+u'\U0001d698': '$\\mathtt{o}$',
+u'\U0001d699': '$\\mathtt{p}$',
+u'\U0001d69a': '$\\mathtt{q}$',
+u'\U0001d69b': '$\\mathtt{r}$',
+u'\U0001d69c': '$\\mathtt{s}$',
+u'\U0001d69d': '$\\mathtt{t}$',
+u'\U0001d69e': '$\\mathtt{u}$',
+u'\U0001d69f': '$\\mathtt{v}$',
+u'\U0001d6a0': '$\\mathtt{w}$',
+u'\U0001d6a1': '$\\mathtt{x}$',
+u'\U0001d6a2': '$\\mathtt{y}$',
+u'\U0001d6a3': '$\\mathtt{z}$',
+u'\U0001d6a8': '$\\mathbf{\\Alpha}$',
+u'\U0001d6a9': '$\\mathbf{\\Beta}$',
+u'\U0001d6aa': '$\\mathbf{\\Gamma}$',
+u'\U0001d6ab': '$\\mathbf{\\Delta}$',
+u'\U0001d6ac': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6ad': '$\\mathbf{\\Zeta}$',
+u'\U0001d6ae': '$\\mathbf{\\Eta}$',
+u'\U0001d6af': '$\\mathbf{\\Theta}$',
+u'\U0001d6b0': '$\\mathbf{\\Iota}$',
+u'\U0001d6b1': '$\\mathbf{\\Kappa}$',
+u'\U0001d6b2': '$\\mathbf{\\Lambda}$',
+u'\U0001d6b3': '$M$',
+u'\U0001d6b4': '$N$',
+u'\U0001d6b5': '$\\mathbf{\\Xi}$',
+u'\U0001d6b6': '$O$',
+u'\U0001d6b7': '$\\mathbf{\\Pi}$',
+u'\U0001d6b8': '$\\mathbf{\\Rho}$',
+u'\U0001d6b9': '{\\mathbf{\\vartheta}}',
+u'\U0001d6ba': '$\\mathbf{\\Sigma}$',
+u'\U0001d6bb': '$\\mathbf{\\Tau}$',
+u'\U0001d6bc': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6bd': '$\\mathbf{\\Phi}$',
+u'\U0001d6be': '$\\mathbf{\\Chi}$',
+u'\U0001d6bf': '$\\mathbf{\\Psi}$',
+u'\U0001d6c0': '$\\mathbf{\\Omega}$',
+u'\U0001d6c1': '$\\mathbf{\\nabla}$',
+u'\U0001d6c2': '$\\mathbf{\\Alpha}$',
+u'\U0001d6c3': '$\\mathbf{\\Beta}$',
+u'\U0001d6c4': '$\\mathbf{\\Gamma}$',
+u'\U0001d6c5': '$\\mathbf{\\Delta}$',
+u'\U0001d6c6': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6c7': '$\\mathbf{\\Zeta}$',
+u'\U0001d6c8': '$\\mathbf{\\Eta}$',
+u'\U0001d6c9': '$\\mathbf{\\theta}$',
+u'\U0001d6ca': '$\\mathbf{\\Iota}$',
+u'\U0001d6cb': '$\\mathbf{\\Kappa}$',
+u'\U0001d6cc': '$\\mathbf{\\Lambda}$',
+u'\U0001d6cd': '$M$',
+u'\U0001d6ce': '$N$',
+u'\U0001d6cf': '$\\mathbf{\\Xi}$',
+u'\U0001d6d0': '$O$',
+u'\U0001d6d1': '$\\mathbf{\\Pi}$',
+u'\U0001d6d2': '$\\mathbf{\\Rho}$',
+u'\U0001d6d3': '$\\mathbf{\\varsigma}$',
+u'\U0001d6d4': '$\\mathbf{\\Sigma}$',
+u'\U0001d6d5': '$\\mathbf{\\Tau}$',
+u'\U0001d6d6': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6d7': '$\\mathbf{\\Phi}$',
+u'\U0001d6d8': '$\\mathbf{\\Chi}$',
+u'\U0001d6d9': '$\\mathbf{\\Psi}$',
+u'\U0001d6da': '$\\mathbf{\\Omega}$',
+u'\U0001d6db': '$\\partial$',
+u'\U0001d6dc': '$\\in$',
+u'\U0001d6dd': '{\\mathbf{\\vartheta}}',
+u'\U0001d6de': '{\\mathbf{\\varkappa}}',
+u'\U0001d6df': '{\\mathbf{\\phi}}',
+u'\U0001d6e0': '{\\mathbf{\\varrho}}',
+u'\U0001d6e1': '{\\mathbf{\\varpi}}',
+u'\U0001d6e2': '$\\mathsl{\\Alpha}$',
+u'\U0001d6e3': '$\\mathsl{\\Beta}$',
+u'\U0001d6e4': '$\\mathsl{\\Gamma}$',
+u'\U0001d6e5': '$\\mathsl{\\Delta}$',
+u'\U0001d6e6': '$\\mathsl{\\Epsilon}$',
+u'\U0001d6e7': '$\\mathsl{\\Zeta}$',
+u'\U0001d6e8': '$\\mathsl{\\Eta}$',
+u'\U0001d6e9': '$\\mathsl{\\Theta}$',
+u'\U0001d6ea': '$\\mathsl{\\Iota}$',
+u'\U0001d6eb': '$\\mathsl{\\Kappa}$',
+u'\U0001d6ec': '$\\mathsl{\\Lambda}$',
+u'\U0001d6ed': '$M$',
+u'\U0001d6ee': '$N$',
+u'\U0001d6ef': '$\\mathsl{\\Xi}$',
+u'\U0001d6f0': '$O$',
+u'\U0001d6f1': '$\\mathsl{\\Pi}$',
+u'\U0001d6f2': '$\\mathsl{\\Rho}$',
+u'\U0001d6f3': '{\\mathsl{\\vartheta}}',
+u'\U0001d6f4': '$\\mathsl{\\Sigma}$',
+u'\U0001d6f5': '$\\mathsl{\\Tau}$',
+u'\U0001d6f6': '$\\mathsl{\\Upsilon}$',
+u'\U0001d6f7': '$\\mathsl{\\Phi}$',
+u'\U0001d6f8': '$\\mathsl{\\Chi}$',
+u'\U0001d6f9': '$\\mathsl{\\Psi}$',
+u'\U0001d6fa': '$\\mathsl{\\Omega}$',
+u'\U0001d6fb': '$\\mathsl{\\nabla}$',
+u'\U0001d6fc': '$\\mathsl{\\Alpha}$',
+u'\U0001d6fd': '$\\mathsl{\\Beta}$',
+u'\U0001d6fe': '$\\mathsl{\\Gamma}$',
+u'\U0001d6ff': '$\\mathsl{\\Delta}$',
+u'\U0001d700': '$\\mathsl{\\Epsilon}$',
+u'\U0001d701': '$\\mathsl{\\Zeta}$',
+u'\U0001d702': '$\\mathsl{\\Eta}$',
+u'\U0001d703': '$\\mathsl{\\Theta}$',
+u'\U0001d704': '$\\mathsl{\\Iota}$',
+u'\U0001d705': '$\\mathsl{\\Kappa}$',
+u'\U0001d706': '$\\mathsl{\\Lambda}$',
+u'\U0001d707': '$M$',
+u'\U0001d708': '$N$',
+u'\U0001d709': '$\\mathsl{\\Xi}$',
+u'\U0001d70a': '$O$',
+u'\U0001d70b': '$\\mathsl{\\Pi}$',
+u'\U0001d70c': '$\\mathsl{\\Rho}$',
+u'\U0001d70d': '$\\mathsl{\\varsigma}$',
+u'\U0001d70e': '$\\mathsl{\\Sigma}$',
+u'\U0001d70f': '$\\mathsl{\\Tau}$',
+u'\U0001d710': '$\\mathsl{\\Upsilon}$',
+u'\U0001d711': '$\\mathsl{\\Phi}$',
+u'\U0001d712': '$\\mathsl{\\Chi}$',
+u'\U0001d713': '$\\mathsl{\\Psi}$',
+u'\U0001d714': '$\\mathsl{\\Omega}$',
+u'\U0001d715': '$\\partial$',
+u'\U0001d716': '$\\in$',
+u'\U0001d717': '{\\mathsl{\\vartheta}}',
+u'\U0001d718': '{\\mathsl{\\varkappa}}',
+u'\U0001d719': '{\\mathsl{\\phi}}',
+u'\U0001d71a': '{\\mathsl{\\varrho}}',
+u'\U0001d71b': '{\\mathsl{\\varpi}}',
+u'\U0001d71c': '$\\mathbit{\\Alpha}$',
+u'\U0001d71d': '$\\mathbit{\\Beta}$',
+u'\U0001d71e': '$\\mathbit{\\Gamma}$',
+u'\U0001d71f': '$\\mathbit{\\Delta}$',
+u'\U0001d720': '$\\mathbit{\\Epsilon}$',
+u'\U0001d721': '$\\mathbit{\\Zeta}$',
+u'\U0001d722': '$\\mathbit{\\Eta}$',
+u'\U0001d723': '$\\mathbit{\\Theta}$',
+u'\U0001d724': '$\\mathbit{\\Iota}$',
+u'\U0001d725': '$\\mathbit{\\Kappa}$',
+u'\U0001d726': '$\\mathbit{\\Lambda}$',
+u'\U0001d727': '$M$',
+u'\U0001d728': '$N$',
+u'\U0001d729': '$\\mathbit{\\Xi}$',
+u'\U0001d72a': '$O$',
+u'\U0001d72b': '$\\mathbit{\\Pi}$',
+u'\U0001d72c': '$\\mathbit{\\Rho}$',
+u'\U0001d72d': '{\\mathbit{O}}',
+u'\U0001d72e': '$\\mathbit{\\Sigma}$',
+u'\U0001d72f': '$\\mathbit{\\Tau}$',
+u'\U0001d730': '$\\mathbit{\\Upsilon}$',
+u'\U0001d731': '$\\mathbit{\\Phi}$',
+u'\U0001d732': '$\\mathbit{\\Chi}$',
+u'\U0001d733': '$\\mathbit{\\Psi}$',
+u'\U0001d734': '$\\mathbit{\\Omega}$',
+u'\U0001d735': '$\\mathbit{\\nabla}$',
+u'\U0001d736': '$\\mathbit{\\Alpha}$',
+u'\U0001d737': '$\\mathbit{\\Beta}$',
+u'\U0001d738': '$\\mathbit{\\Gamma}$',
+u'\U0001d739': '$\\mathbit{\\Delta}$',
+u'\U0001d73a': '$\\mathbit{\\Epsilon}$',
+u'\U0001d73b': '$\\mathbit{\\Zeta}$',
+u'\U0001d73c': '$\\mathbit{\\Eta}$',
+u'\U0001d73d': '$\\mathbit{\\Theta}$',
+u'\U0001d73e': '$\\mathbit{\\Iota}$',
+u'\U0001d73f': '$\\mathbit{\\Kappa}$',
+u'\U0001d740': '$\\mathbit{\\Lambda}$',
+u'\U0001d741': '$M$',
+u'\U0001d742': '$N$',
+u'\U0001d743': '$\\mathbit{\\Xi}$',
+u'\U0001d744': '$O$',
+u'\U0001d745': '$\\mathbit{\\Pi}$',
+u'\U0001d746': '$\\mathbit{\\Rho}$',
+u'\U0001d747': '$\\mathbit{\\varsigma}$',
+u'\U0001d748': '$\\mathbit{\\Sigma}$',
+u'\U0001d749': '$\\mathbit{\\Tau}$',
+u'\U0001d74a': '$\\mathbit{\\Upsilon}$',
+u'\U0001d74b': '$\\mathbit{\\Phi}$',
+u'\U0001d74c': '$\\mathbit{\\Chi}$',
+u'\U0001d74d': '$\\mathbit{\\Psi}$',
+u'\U0001d74e': '$\\mathbit{\\Omega}$',
+u'\U0001d74f': '$\\partial$',
+u'\U0001d750': '$\\in$',
+u'\U0001d751': '{\\mathbit{\\vartheta}}',
+u'\U0001d752': '{\\mathbit{\\varkappa}}',
+u'\U0001d753': '{\\mathbit{\\phi}}',
+u'\U0001d754': '{\\mathbit{\\varrho}}',
+u'\U0001d755': '{\\mathbit{\\varpi}}',
+u'\U0001d756': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d757': '$\\mathsfbf{\\Beta}$',
+u'\U0001d758': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d759': '$\\mathsfbf{\\Delta}$',
+u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d75b': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d75c': '$\\mathsfbf{\\Eta}$',
+u'\U0001d75d': '$\\mathsfbf{\\Theta}$',
+u'\U0001d75e': '$\\mathsfbf{\\Iota}$',
+u'\U0001d75f': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d760': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d761': '$M$',
+u'\U0001d762': '$N$',
+u'\U0001d763': '$\\mathsfbf{\\Xi}$',
+u'\U0001d764': '$O$',
+u'\U0001d765': '$\\mathsfbf{\\Pi}$',
+u'\U0001d766': '$\\mathsfbf{\\Rho}$',
+u'\U0001d767': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d768': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d769': '$\\mathsfbf{\\Tau}$',
+u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d76b': '$\\mathsfbf{\\Phi}$',
+u'\U0001d76c': '$\\mathsfbf{\\Chi}$',
+u'\U0001d76d': '$\\mathsfbf{\\Psi}$',
+u'\U0001d76e': '$\\mathsfbf{\\Omega}$',
+u'\U0001d76f': '$\\mathsfbf{\\nabla}$',
+u'\U0001d770': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d771': '$\\mathsfbf{\\Beta}$',
+u'\U0001d772': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d773': '$\\mathsfbf{\\Delta}$',
+u'\U0001d774': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d775': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d776': '$\\mathsfbf{\\Eta}$',
+u'\U0001d777': '$\\mathsfbf{\\Theta}$',
+u'\U0001d778': '$\\mathsfbf{\\Iota}$',
+u'\U0001d779': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d77a': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d77b': '$M$',
+u'\U0001d77c': '$N$',
+u'\U0001d77d': '$\\mathsfbf{\\Xi}$',
+u'\U0001d77e': '$O$',
+u'\U0001d77f': '$\\mathsfbf{\\Pi}$',
+u'\U0001d780': '$\\mathsfbf{\\Rho}$',
+u'\U0001d781': '$\\mathsfbf{\\varsigma}$',
+u'\U0001d782': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d783': '$\\mathsfbf{\\Tau}$',
+u'\U0001d784': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d785': '$\\mathsfbf{\\Phi}$',
+u'\U0001d786': '$\\mathsfbf{\\Chi}$',
+u'\U0001d787': '$\\mathsfbf{\\Psi}$',
+u'\U0001d788': '$\\mathsfbf{\\Omega}$',
+u'\U0001d789': '$\\partial$',
+u'\U0001d78a': '$\\in$',
+u'\U0001d78b': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d78c': '{\\mathsfbf{\\varkappa}}',
+u'\U0001d78d': '{\\mathsfbf{\\phi}}',
+u'\U0001d78e': '{\\mathsfbf{\\varrho}}',
+u'\U0001d78f': '{\\mathsfbf{\\varpi}}',
+u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d791': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d793': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d796': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d798': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d79b': '$M$',
+u'\U0001d79c': '$N$',
+u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d79e': '$O$',
+u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$',
+u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d7b5': '$M$',
+u'\U0001d7b6': '$N$',
+u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d7b8': '$O$',
+u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$',
+u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7c3': '$\\partial$',
+u'\U0001d7c4': '$\\in$',
+u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}',
+u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}',
+u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}',
+u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}',
+u'\U0001d7ce': '$\\mathbf{0}$',
+u'\U0001d7cf': '$\\mathbf{1}$',
+u'\U0001d7d0': '$\\mathbf{2}$',
+u'\U0001d7d1': '$\\mathbf{3}$',
+u'\U0001d7d2': '$\\mathbf{4}$',
+u'\U0001d7d3': '$\\mathbf{5}$',
+u'\U0001d7d4': '$\\mathbf{6}$',
+u'\U0001d7d5': '$\\mathbf{7}$',
+u'\U0001d7d6': '$\\mathbf{8}$',
+u'\U0001d7d7': '$\\mathbf{9}$',
+u'\U0001d7d8': '$\\mathbb{0}$',
+u'\U0001d7d9': '$\\mathbb{1}$',
+u'\U0001d7da': '$\\mathbb{2}$',
+u'\U0001d7db': '$\\mathbb{3}$',
+u'\U0001d7dc': '$\\mathbb{4}$',
+u'\U0001d7dd': '$\\mathbb{5}$',
+u'\U0001d7de': '$\\mathbb{6}$',
+u'\U0001d7df': '$\\mathbb{7}$',
+u'\U0001d7e0': '$\\mathbb{8}$',
+u'\U0001d7e1': '$\\mathbb{9}$',
+u'\U0001d7e2': '$\\mathsf{0}$',
+u'\U0001d7e3': '$\\mathsf{1}$',
+u'\U0001d7e4': '$\\mathsf{2}$',
+u'\U0001d7e5': '$\\mathsf{3}$',
+u'\U0001d7e6': '$\\mathsf{4}$',
+u'\U0001d7e7': '$\\mathsf{5}$',
+u'\U0001d7e8': '$\\mathsf{6}$',
+u'\U0001d7e9': '$\\mathsf{7}$',
+u'\U0001d7ea': '$\\mathsf{8}$',
+u'\U0001d7eb': '$\\mathsf{9}$',
+u'\U0001d7ec': '$\\mathsfbf{0}$',
+u'\U0001d7ed': '$\\mathsfbf{1}$',
+u'\U0001d7ee': '$\\mathsfbf{2}$',
+u'\U0001d7ef': '$\\mathsfbf{3}$',
+u'\U0001d7f0': '$\\mathsfbf{4}$',
+u'\U0001d7f1': '$\\mathsfbf{5}$',
+u'\U0001d7f2': '$\\mathsfbf{6}$',
+u'\U0001d7f3': '$\\mathsfbf{7}$',
+u'\U0001d7f4': '$\\mathsfbf{8}$',
+u'\U0001d7f5': '$\\mathsfbf{9}$',
+u'\U0001d7f6': '$\\mathtt{0}$',
+u'\U0001d7f7': '$\\mathtt{1}$',
+u'\U0001d7f8': '$\\mathtt{2}$',
+u'\U0001d7f9': '$\\mathtt{3}$',
+u'\U0001d7fa': '$\\mathtt{4}$',
+u'\U0001d7fb': '$\\mathtt{5}$',
+u'\U0001d7fc': '$\\mathtt{6}$',
+u'\U0001d7fd': '$\\mathtt{7}$',
+u'\U0001d7fe': '$\\mathtt{8}$',
+u'\U0001d7ff': '$\\mathtt{9}$'}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/null.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A do-nothing Writer.
+"""
+
+from docutils import writers
+
+
+class Writer(writers.UnfilteredWriter):
+
+    supported = ('null',)
+    """Formats this writer supports."""
+
+    config_section = 'null writer'
+    config_section_dependencies = ('writers',)
+
+    def translate(self):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+PEP HTML Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import codecs
+import docutils
+from docutils import frontend, nodes, utils, writers
+from docutils.writers import html4css1
+
+
+class Writer(html4css1.Writer):
+
+    default_stylesheet = 'pep.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'PEP/HTML-Specific Options',
+        'For the PEP/HTML writer, the default value for the --stylesheet-path '
+        'option is "%s", and the default value for --template is "%s". '
+        'See HTML-Specific Options above.'
+        % (default_stylesheet_path, default_template_path),
+        (('Python\'s home URL.  Default is "http://www.python.org".',
+          ['--python-home'],
+          {'default': 'http://www.python.org', 'metavar': '<URL>'}),
+         ('Home URL prefix for PEPs.  Default is "." (current directory).',
+          ['--pep-home'],
+          {'default': '.', 'metavar': '<URL>'}),
+         # For testing.
+         (frontend.SUPPRESS_HELP,
+          ['--no-random'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_default_overrides = {'stylesheet_path': default_stylesheet_path,
+                                  'template': default_template_path,}
+
+    relative_path_settings = (html4css1.Writer.relative_path_settings
+                              + ('template',))
+
+    config_section = 'pep_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def interpolation_dict(self):
+        subs = html4css1.Writer.interpolation_dict(self)
+        settings = self.document.settings
+        pyhome = settings.python_home
+        subs['pyhome'] = pyhome
+        subs['pephome'] = settings.pep_home
+        if pyhome == '..':
+            subs['pepindex'] = '.'
+        else:
+            subs['pepindex'] = pyhome + '/dev/peps'
+        index = self.document.first_child_matching_class(nodes.field_list)
+        header = self.document[index]
+        self.pepnum = header[0][1].astext()
+        subs['pep'] = self.pepnum
+        if settings.no_random:
+            subs['banner'] = 0
+        else:
+            import random
+            subs['banner'] = random.randrange(64)
+        try:
+            subs['pepnum'] = '%04i' % int(self.pepnum)
+        except ValueError:
+            subs['pepnum'] = pepnum
+        self.title = header[1][1].astext()
+        subs['title'] = self.title
+        subs['body'] = ''.join(
+            self.body_pre_docinfo + self.docinfo + self.body)
+        return subs
+
+    def assemble_parts(self):
+        html4css1.Writer.assemble_parts(self)
+        self.parts['title'] = [self.title]
+        self.parts['pepnum'] = self.pepnum
+
+
+class HTMLTranslator(html4css1.HTMLTranslator):
+
+    def depart_field_list(self, node):
+        html4css1.HTMLTranslator.depart_field_list(self, node)
+        if 'rfc2822' in node['classes']:
+             self.body.append('<hr />\n')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,344 @@
+/*
+:Author: David Goodger
+:Contact: goodger@python.org
+:date: $Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) $
+:version: $Revision: 4564 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the PEP HTML output of Docutils.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.navigation {
+  width: 100% ;
+  background: #99ccff ;
+  margin-top: 0px ;
+  margin-bottom: 0px }
+
+.navigation .navicon {
+  width: 150px ;
+  height: 35px }
+
+.navigation .textlinks {
+  padding-left: 1em ;
+  text-align: left }
+
+.navigation td, .navigation th {
+  padding-left: 0em ;
+  padding-right: 0em ;
+  vertical-align: middle }
+
+.rfc2822 {
+  margin-top: 0.5em ;
+  margin-left: 0.5em ;
+  margin-right: 0.5em ;
+  margin-bottom: 0em }
+
+.rfc2822 td {
+  text-align: left }
+
+.rfc2822 th.field-name {
+  text-align: right ;
+  font-family: sans-serif ;
+  padding-right: 0.5em ;
+  font-weight: bold ;
+  margin-bottom: 0em }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+body {
+  margin: 0px ;
+  margin-bottom: 1em ;
+  padding: 0px }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+div.section {
+  margin-left: 1em ;
+  margin-right: 1em ;
+  margin-bottom: 1.5em }
+
+div.section div.section {
+  margin-left: 0em ;
+  margin-right: 0em ;
+  margin-top: 1.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.footer {
+  margin-left: 1em ;
+  margin-right: 1em }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1 {
+  font-family: sans-serif ;
+  font-size: large }
+
+h2 {
+  font-family: sans-serif ;
+  font-size: medium }
+
+h3 {
+  font-family: sans-serif ;
+  font-size: small }
+
+h4 {
+  font-family: sans-serif ;
+  font-style: italic ;
+  font-size: small }
+
+h5 {
+  font-family: sans-serif;
+  font-size: x-small }
+
+h6 {
+  font-family: sans-serif;
+  font-style: italic ;
+  font-size: x-small }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+td.num {
+  text-align: right }
+
+th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="%(encoding)s" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+This HTML is auto-generated.  DO NOT EDIT THIS FILE!  If you are writing a new
+PEP, see http://www.python.org/dev/peps/pep-0001 for instructions and links
+to templates.  DO NOT USE THIS HTML FILE AS YOUR TEMPLATE!
+-->
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
+  <meta name="generator" content="Docutils %(version)s: http://docutils.sourceforge.net/" />
+  <title>PEP %(pep)s -- %(title)s</title>
+  %(stylesheet)s
+</head>
+<body bgcolor="white">
+<table class="navigation" cellpadding="0" cellspacing="0"
+       width="100%%" border="0">
+<tr><td class="navicon" width="150" height="35">
+<a href="%(pyhome)s/" title="Python Home Page">
+<img src="%(pyhome)s/pics/PyBanner%(banner)03d.gif" alt="[Python]"
+ border="0" width="150" height="35" /></a></td>
+<td class="textlinks" align="left">
+[<b><a href="%(pyhome)s/">Python Home</a></b>]
+[<b><a href="%(pepindex)s/">PEP Index</a></b>]
+[<b><a href="%(pephome)s/pep-%(pepnum)s.txt">PEP Source</a></b>]
+</td></tr></table>
+<div class="document">
+%(body)s
+%(body_suffix)s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+# $Id: pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes indented pseudo-XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('pprint', 'pformat', 'pseudoxml')
+    """Formats this writer supports."""
+
+    config_section = 'pseudoxml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def translate(self):
+        self.output = self.document.pformat()
+
+    def supports(self, format):
+        """This writer supports all format-specific elements."""
+        return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,337 @@
+# $Id: __init__.py 4883 2007-01-16 01:51:28Z wiemann $
+# Authors: Chris Liechti <cliechti@gmx.net>;
+#          David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+S5/HTML Slideshow Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import re
+import docutils
+from docutils import frontend, nodes, utils
+from docutils.writers import html4css1
+from docutils.parsers.rst import directives
+
+themes_dir_path = utils.relative_path(
+    os.path.join(os.getcwd(), 'dummy'),
+    os.path.join(os.path.dirname(__file__), 'themes'))
+
+def find_theme(name):
+    # Where else to look for a theme?
+    # Check working dir?  Destination dir?  Config dir?  Plugins dir?
+    path = os.path.join(themes_dir_path, name)
+    if not os.path.isdir(path):
+        raise docutils.ApplicationError(
+            'Theme directory not found: %r (path: %r)' % (name, path))
+    return path
+
+
+class Writer(html4css1.Writer):
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'S5 Slideshow Specific Options',
+        'For the S5/HTML writer, the --no-toc-backlinks option '
+        '(defined in General Docutils Options above) is the default, '
+        'and should not be changed.',
+        (('Specify an installed S5 theme by name.  Overrides --theme-url.  '
+          'The default theme name is "default".  The theme files will be '
+          'copied into a "ui/<theme>" directory, in the same directory as the '
+          'destination file (output HTML).  Note that existing theme files '
+          'will not be overwritten (unless --overwrite-theme-files is used).',
+          ['--theme'],
+          {'default': 'default', 'metavar': '<name>',
+           'overrides': 'theme_url'}),
+         ('Specify an S5 theme URL.  The destination file (output HTML) will '
+          'link to this theme; nothing will be copied.  Overrides --theme.',
+          ['--theme-url'],
+          {'metavar': '<URL>', 'overrides': 'theme'}),
+         ('Allow existing theme files in the ``ui/<theme>`` directory to be '
+          'overwritten.  The default is not to overwrite theme files.',
+          ['--overwrite-theme-files'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
+          'overwrite any.  This is the default.',
+          ['--keep-theme-files'],
+          {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
+         ('Set the initial view mode to "slideshow" [default] or "outline".',
+          ['--view-mode'],
+          {'choices': ['slideshow', 'outline'], 'default': 'slideshow',
+           'metavar': '<mode>'}),
+         ('Normally hide the presentation controls in slideshow mode. '
+          'This is the default.',
+          ['--hidden-controls'],
+          {'action': 'store_true', 'default': True,
+           'validator': frontend.validate_boolean}),
+         ('Always show the presentation controls in slideshow mode.  '
+          'The default is to hide the controls.',
+          ['--visible-controls'],
+          {'dest': 'hidden_controls', 'action': 'store_false'}),
+         ('Enable the current slide indicator ("1 / 15").  '
+          'The default is to disable it.',
+          ['--current-slide'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Disable the current slide indicator.  This is the default.',
+          ['--no-current-slide'],
+          {'dest': 'current_slide', 'action': 'store_false'}),))
+
+    settings_default_overrides = {'toc_backlinks': 0}
+
+    config_section = 's5_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = S5HTMLTranslator
+
+
+class S5HTMLTranslator(html4css1.HTMLTranslator):
+
+    s5_stylesheet_template = """\
+<!-- configuration parameters -->
+<meta name="defaultView" content="%(view_mode)s" />
+<meta name="controlVis" content="%(control_visibility)s" />
+<!-- style sheet links -->
+<script src="%(path)s/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="%(path)s/slides.css"
+      type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="%(path)s/outline.css"
+      type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="%(path)s/print.css"
+      type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="%(path)s/opera.css"
+      type="text/css" media="projection" id="operaFix" />\n"""
+    # The script element must go in front of the link elements to
+    # avoid a flash of unstyled content (FOUC), reproducible with
+    # Firefox.
+
+    disable_current_slide = """
+<style type="text/css">
+#currentSlide {display: none;}
+</style>\n"""
+
+    layout_template = """\
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+%(header)s
+</div>
+<div id="footer">
+%(title)s%(footer)s
+</div>
+</div>\n"""
+# <div class="topleft"></div>
+# <div class="topright"></div>
+# <div class="bottomleft"></div>
+# <div class="bottomright"></div>
+
+    default_theme = 'default'
+    """Name of the default theme."""
+
+    base_theme_file = '__base__'
+    """Name of the file containing the name of the base theme."""
+
+    direct_theme_files = (
+        'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
+    """Names of theme files directly linked to in the output HTML"""
+
+    indirect_theme_files = (
+        's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
+    """Names of files used indirectly; imported or used by files in
+    `direct_theme_files`."""
+
+    required_theme_files = indirect_theme_files + direct_theme_files
+    """Names of mandatory theme files."""
+
+    def __init__(self, *args):
+        html4css1.HTMLTranslator.__init__(self, *args)
+        #insert S5-specific stylesheet and script stuff:
+        self.theme_file_path = None
+        self.setup_theme()
+        view_mode = self.document.settings.view_mode
+        control_visibility = ('visible', 'hidden')[self.document.settings
+                                                   .hidden_controls]
+        self.stylesheet.append(self.s5_stylesheet_template
+                               % {'path': self.theme_file_path,
+                                  'view_mode': view_mode,
+                                  'control_visibility': control_visibility})
+        if not self.document.settings.current_slide:
+            self.stylesheet.append(self.disable_current_slide)
+        self.add_meta('<meta name="version" content="S5 1.1" />\n')
+        self.s5_footer = []
+        self.s5_header = []
+        self.section_count = 0
+        self.theme_files_copied = None
+
+    def setup_theme(self):
+        if self.document.settings.theme:
+            self.copy_theme()
+        elif self.document.settings.theme_url:
+            self.theme_file_path = self.document.settings.theme_url
+        else:
+            raise docutils.ApplicationError(
+                'No theme specified for S5/HTML writer.')
+
+    def copy_theme(self):
+        """
+        Locate & copy theme files.
+
+        A theme may be explicitly based on another theme via a '__base__'
+        file.  The default base theme is 'default'.  Files are accumulated
+        from the specified theme, any base themes, and 'default'.
+        """
+        settings = self.document.settings
+        path = find_theme(settings.theme)
+        theme_paths = [path]
+        self.theme_files_copied = {}
+        required_files_copied = {}
+        # This is a link (URL) in HTML, so we use "/", not os.sep:
+        self.theme_file_path = '%s/%s' % ('ui', settings.theme)
+        if settings._destination:
+            dest = os.path.join(
+                os.path.dirname(settings._destination), 'ui', settings.theme)
+            if not os.path.isdir(dest):
+                os.makedirs(dest)
+        else:
+            # no destination, so we can't copy the theme
+            return
+        default = 0
+        while path:
+            for f in os.listdir(path):  # copy all files from each theme
+                if f == self.base_theme_file:
+                    continue            # ... except the "__base__" file
+                if ( self.copy_file(f, path, dest)
+                     and f in self.required_theme_files):
+                    required_files_copied[f] = 1
+            if default:
+                break                   # "default" theme has no base theme
+            # Find the "__base__" file in theme directory:
+            base_theme_file = os.path.join(path, self.base_theme_file)
+            # If it exists, read it and record the theme path:
+            if os.path.isfile(base_theme_file):
+                lines = open(base_theme_file).readlines()
+                for line in lines:
+                    line = line.strip()
+                    if line and not line.startswith('#'):
+                        path = find_theme(line)
+                        if path in theme_paths: # check for duplicates (cycles)
+                            path = None         # if found, use default base
+                        else:
+                            theme_paths.append(path)
+                        break
+                else:                   # no theme name found
+                    path = None         # use default base
+            else:                       # no base theme file found
+                path = None             # use default base
+            if not path:
+                path = find_theme(self.default_theme)
+                theme_paths.append(path)
+                default = 1
+        if len(required_files_copied) != len(self.required_theme_files):
+            # Some required files weren't found & couldn't be copied.
+            required = list(self.required_theme_files)
+            for f in required_files_copied.keys():
+                required.remove(f)
+            raise docutils.ApplicationError(
+                'Theme files not found: %s'
+                % ', '.join(['%r' % f for f in required]))
+
+    files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$')
+
+    def copy_file(self, name, source_dir, dest_dir):
+        """
+        Copy file `name` from `source_dir` to `dest_dir`.
+        Return 1 if the file exists in either `source_dir` or `dest_dir`.
+        """
+        source = os.path.join(source_dir, name)
+        dest = os.path.join(dest_dir, name)
+        if self.theme_files_copied.has_key(dest):
+            return 1
+        else:
+            self.theme_files_copied[dest] = 1
+        if os.path.isfile(source):
+            if self.files_to_skip_pattern.search(source):
+                return None
+            settings = self.document.settings
+            if os.path.exists(dest) and not settings.overwrite_theme_files:
+                settings.record_dependencies.add(dest)
+            else:
+                src_file = open(source, 'rb')
+                src_data = src_file.read()
+                src_file.close()
+                dest_file = open(dest, 'wb')
+                dest_dir = dest_dir.replace(os.sep, '/')
+                dest_file.write(src_data.replace(
+                    'ui/default', dest_dir[dest_dir.rfind('ui/'):]))
+                dest_file.close()
+                settings.record_dependencies.add(source)
+            return 1
+        if os.path.isfile(dest):
+            return 1
+
+    def depart_document(self, node):
+        header = ''.join(self.s5_header)
+        footer = ''.join(self.s5_footer)
+        title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
+        layout = self.layout_template % {'header': header,
+                                         'title': title,
+                                         'footer': footer}
+        self.fragment.extend(self.body)
+        self.body_prefix.extend(layout)
+        self.body_prefix.append('<div class="presentation">\n')
+        self.body_prefix.append(
+            self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
+        if not self.section_count:
+            self.body.append('</div>\n')
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        self.s5_footer.append('<h2>')
+        self.s5_footer.extend(self.body[start:])
+        self.s5_footer.append('</h2>')
+        del self.body[start:]
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = ['<div id="header">\n']
+        header.extend(self.body[start:])
+        header.append('\n</div>\n')
+        del self.body[start:]
+        self.s5_header.extend(header)
+
+    def visit_section(self, node):
+        if not self.section_count:
+            self.body.append('\n</div>\n')
+        self.section_count += 1
+        self.section_level += 1
+        if self.section_level > 1:
+            # dummy for matching div's
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+        else:
+            self.body.append(self.starttag(node, 'div', CLASS='slide'))
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.section):
+            level = self.section_level + self.initial_header_level - 1
+            if level == 1:
+                level = 2
+            tag = 'h%s' % level
+            self.body.append(self.starttag(node, tag, ''))
+            self.context.append('</%s>\n' % tag)
+        else:
+            html4css1.HTMLTranslator.visit_subtitle(self, node)
+
+    def visit_title(self, node):
+        html4css1.HTMLTranslator.visit_title(self, node)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+Except where otherwise noted (default/iepngfix.htc), all files in this
+directory have been released into the Public Domain.
+
+These files are based on files from S5 1.1, released into the Public
+Domain by Eric Meyer.  For further details, please see
+http://www.meyerweb.com/eric/tools/s5/credits.html.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+# base theme of this theme:
+big-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/*  list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,109 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #005; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Binary file buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+  if ((/\.png$/i).test(src)) {
+   filt(src, 'image');  // was 'scale'
+   src = blankImg;
+  } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+   var s = RegExp.$1;
+   style.backgroundImage = '';
+   filt(s, 'crop');
+  } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+	visibility: visible !important;
+	position: static !important;
+	page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,16 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+   outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+  display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.outline {display: inline ! important;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+   div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+  margin: 0; padding-left: 0.7em; white-space: nowrap;
+  font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+  color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+   DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+  font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.print {display: inline ! important;}
+
+/* The following rule keeps the layout stuff out of print.
+   Remove at your own risk! */
+.layout, .layout * {display: none !important;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+   The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer, 
+  html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,558 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+	if (!object.className) return false;
+	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+	if (!object) return false;
+	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+	if (!object) return;
+	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+	if (!object || hasClass(object, className)) return;
+	if (object.className) {
+		object.className += ' '+className;
+	} else {
+		object.className = className;
+	}
+}
+
+function GetElementsWithClassName(elementName,className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (var i = 0; i< allElements.length; i++) {
+		if (hasClass(allElements[i], className)) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+	if (element == null || element.nodeName=='BODY') return false;
+	else if (element.id == id) return true;
+	else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+	var result = "";
+	if (node.nodeType == 1) {
+		var children = node.childNodes;
+		for (var i = 0; i < children.length; ++i) {
+			result += nodeValue(children[i]);
+		}		
+	}
+	else if (node.nodeType == 3) {
+		result = node.nodeValue;
+	}
+	return(result);
+}
+
+function slideLabel() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var list = document.getElementById('jumplist');
+	smax = slideColl.length;
+	for (var n = 0; n < smax; n++) {
+		var obj = slideColl[n];
+
+		var did = 'slide' + n.toString();
+		if (obj.getAttribute('id')) {
+			slideIDs[n] = obj.getAttribute('id');
+		}
+		else {
+			obj.setAttribute('id',did);
+			slideIDs[n] = did;
+		}
+		if (isOp) continue;
+
+		var otext = '';
+		var menu = obj.firstChild;
+		if (!menu) continue; // to cope with empty slides
+		while (menu && menu.nodeType == 3) {
+			menu = menu.nextSibling;
+		}
+	 	if (!menu) continue; // to cope with slides with only text nodes
+
+		var menunodes = menu.childNodes;
+		for (var o = 0; o < menunodes.length; o++) {
+			otext += nodeValue(menunodes[o]);
+		}
+		list.options[list.length] = new Option(n + ' : '  + otext, n);
+	}
+}
+
+function currentSlide() {
+	var cs;
+	var footer_nodes;
+	var vis = 'visible';
+	if (document.getElementById) {
+		cs = document.getElementById('currentSlide');
+		footer_nodes = document.getElementById('footer').childNodes;
+	} else {
+		cs = document.currentSlide;
+		footer = document.footer.childNodes;
+	}
+	cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + 
+		'<span id="csSep">\/<\/span> ' + 
+		'<span id="csTotal">' + (smax-1) + '<\/span>';
+	if (snum == 0) {
+		vis = 'hidden';
+	}
+	cs.style.visibility = vis;
+	for (var i = 0; i < footer_nodes.length; i++) {
+		if (footer_nodes[i].nodeType == 1) {
+			footer_nodes[i].style.visibility = vis;
+		}
+	}		
+}
+
+function go(step) {
+	if (document.getElementById('slideProj').disabled || step == 0) return;
+	var jl = document.getElementById('jumplist');
+	var cid = slideIDs[snum];
+	var ce = document.getElementById(cid);
+	if (incrementals[snum].length > 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			removeClass(incrementals[snum][i], 'current');
+			removeClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (step != 'j') {
+		snum += step;
+		lmax = smax - 1;
+		if (snum > lmax) snum = lmax;
+		if (snum < 0) snum = 0;
+	} else
+		snum = parseInt(jl.value);
+	var nid = slideIDs[snum];
+	var ne = document.getElementById(nid);
+	if (!ne) {
+		ne = document.getElementById(slideIDs[0]);
+		snum = 0;
+	}
+	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+	if (incrementals[snum].length > 0 && incpos == 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			if (hasClass(incrementals[snum][i], 'current'))
+				incpos = i + 1;
+			else
+				addClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (incrementals[snum].length > 0 && incpos > 0)
+		addClass(incrementals[snum][incpos - 1], 'current');
+	ce.style.visibility = 'hidden';
+	ne.style.visibility = 'visible';
+	jl.selectedIndex = snum;
+	currentSlide();
+	number = 0;
+}
+
+function goTo(target) {
+	if (target >= smax || target == snum) return;
+	go(target - snum);
+}
+
+function subgo(step) {
+	if (step > 0) {
+		removeClass(incrementals[snum][incpos - 1],'current');
+		removeClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos],'current');
+		incpos++;
+	} else {
+		incpos--;
+		removeClass(incrementals[snum][incpos],'current');
+		addClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos - 1],'current');
+	}
+}
+
+function toggle() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	if (!slides.disabled) {
+		slides.disabled = true;
+		outline.disabled = false;
+		s5mode = false;
+		fontSize('1em');
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'visible';
+		}
+	} else {
+		slides.disabled = false;
+		outline.disabled = true;
+		s5mode = true;
+		fontScale();
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'hidden';
+		}
+		slideColl[snum].style.visibility = 'visible';
+	}
+}
+
+function showHide(action) {
+	var obj = GetElementsWithClassName('*','hideme')[0];
+	switch (action) {
+	case 's': obj.style.visibility = 'visible'; break;
+	case 'h': obj.style.visibility = 'hidden'; break;
+	case 'k':
+		if (obj.style.visibility != 'visible') {
+			obj.style.visibility = 'visible';
+		} else {
+			obj.style.visibility = 'hidden';
+		}
+	break;
+	}
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+	if (!key) {
+		key = event;
+		key.which = key.keyCode;
+	}
+	if (key.which == 84) {
+		toggle();
+		return;
+	}
+	if (s5mode) {
+		switch (key.which) {
+			case 10: // return
+			case 13: // enter
+				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+				if (key.target && isParentOrSelf(key.target, 'controls')) return;
+				if(number != undef) {
+					goTo(number);
+					break;
+				}
+			case 32: // spacebar
+			case 34: // page down
+			case 39: // rightkey
+			case 40: // downkey
+				if(number != undef) {
+					go(number);
+				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+					go(1);
+				} else {
+					subgo(1);
+				}
+				break;
+			case 33: // page up
+			case 37: // leftkey
+			case 38: // upkey
+				if(number != undef) {
+					go(-1 * number);
+				} else if (!incrementals[snum] || incpos <= 0) {
+					go(-1);
+				} else {
+					subgo(-1);
+				}
+				break;
+			case 36: // home
+				goTo(0);
+				break;
+			case 35: // end
+				goTo(smax-1);
+				break;
+			case 67: // c
+				showHide('k');
+				break;
+		}
+		if (key.which < 48 || key.which > 57) {
+			number = undef;
+		} else {
+			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+			if (key.target && isParentOrSelf(key.target, 'controls')) return;
+			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+		}
+	}
+	return false;
+}
+
+function clicker(e) {
+	number = undef;
+	var target;
+	if (window.event) {
+		target = window.event.srcElement;
+		e = window.event;
+	} else target = e.target;
+    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; 
+	if (!e.which || e.which == 1) {
+		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+			go(1);
+		} else {
+			subgo(1);
+		}
+	}
+}
+
+function findSlide(hash) {
+	var target = document.getElementById(hash);
+	if (target) {
+		for (var i = 0; i < slideIDs.length; i++) {
+			if (target.id == slideIDs[i]) return i;
+		}
+	}
+	return null;
+}
+
+function slideJump() {
+	if (window.location.hash == null || window.location.hash == '') {
+		currentSlide();
+		return;
+	}
+	if (window.location.hash == null) return;
+	var dest = null;
+	dest = findSlide(window.location.hash.slice(1));
+	if (dest == null) {
+		dest = 0;
+	}
+	go(dest - snum);
+}
+
+function fixLinks() {
+	var thisUri = window.location.href;
+	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+	var aelements = document.getElementsByTagName('A');
+	for (var i = 0; i < aelements.length; i++) {
+		var a = aelements[i].href;
+		var slideID = a.match('\#.+');
+		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+			var dest = findSlide(slideID[0].slice(1));
+			if (dest != null) {
+				if (aelements[i].addEventListener) {
+					aelements[i].addEventListener("click", new Function("e",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"if (e.preventDefault) e.preventDefault();"), true);
+				} else if (aelements[i].attachEvent) {
+					aelements[i].attachEvent("onclick", new Function("",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"event.returnValue = false;"));
+				}
+			}
+		}
+	}
+}
+
+function externalLinks() {
+	if (!document.getElementsByTagName) return;
+	var anchors = document.getElementsByTagName('a');
+	for (var i=0; i<anchors.length; i++) {
+		var anchor = anchors[i];
+		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+			anchor.target = '_blank';
+			addClass(anchor,'external');
+		}
+	}
+}
+
+function createControls() {
+	var controlsDiv = document.getElementById("controls");
+	if (!controlsDiv) return;
+	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+	var hideDiv, hideList = '';
+	if (controlVis == 'hidden') {
+		hideDiv = hider;
+	} else {
+		hideList = hider;
+	}
+	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+	'<div id="navLinks">' +
+	'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+	'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+	'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+	'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+	'<\/div><\/form>';
+	if (controlVis == 'hidden') {
+		var hidden = document.getElementById('navLinks');
+	} else {
+		var hidden = document.getElementById('jumplist');
+	}
+	addClass(hidden,'hideme');
+}
+
+function fontScale() {  // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+	if (!s5mode) return false;
+	var vScale = 22;  // both yield 32 (after rounding) at 1024x768
+	var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
+	if (window.innerHeight) {
+		var vSize = window.innerHeight;
+		var hSize = window.innerWidth;
+	} else if (document.documentElement.clientHeight) {
+		var vSize = document.documentElement.clientHeight;
+		var hSize = document.documentElement.clientWidth;
+	} else if (document.body.clientHeight) {
+		var vSize = document.body.clientHeight;
+		var hSize = document.body.clientWidth;
+	} else {
+		var vSize = 700;  // assuming 1024x768, minus chrome and such
+		var hSize = 1024; // these do not account for kiosk mode or Opera Show
+	}
+	var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+	fontSize(newSize + 'px');
+	if (isGe) {  // hack to counter incremental reflow bugs
+		var obj = document.getElementsByTagName('body')[0];
+		obj.style.display = 'none';
+		obj.style.display = 'block';
+	}
+}
+
+function fontSize(value) {
+	if (!(s5ss = document.getElementById('s5ss'))) {
+		if (!isIE) {
+			document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+			s5ss.setAttribute('media','screen, projection');
+			s5ss.setAttribute('id','s5ss');
+		} else {
+			document.createStyleSheet();
+			document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+		}
+	}
+	if (!isIE) {
+		while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+		s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+	} else {
+		document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+	}
+}
+
+function notOperaFix() {
+	slideCSS = document.getElementById('slideProj').href;
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	slides.setAttribute('media','screen');
+	outline.disabled = true;
+	if (isGe) {
+		slides.setAttribute('href','null');   // Gecko fix
+		slides.setAttribute('href',slideCSS); // Gecko fix
+	}
+	if (isIE && document.styleSheets && document.styleSheets[0]) {
+		document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+	}
+}
+
+function getIncrementals(obj) {
+	var incrementals = new Array();
+	if (!obj) 
+		return incrementals;
+	var children = obj.childNodes;
+	for (var i = 0; i < children.length; i++) {
+		var child = children[i];
+		if (hasClass(child, 'incremental')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'incremental');
+				for (var j = 0; j < child.childNodes.length; j++) {
+					if (child.childNodes[j].nodeType == 1) {
+						addClass(child.childNodes[j], 'incremental');
+					}
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+				removeClass(child,'incremental');
+			}
+		}
+		if (hasClass(child, 'show-first')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'show-first');
+				if (child.childNodes[isGe].nodeType == 1) {
+					removeClass(child.childNodes[isGe], 'incremental');
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+			}
+		}
+		incrementals = incrementals.concat(getIncrementals(child));
+	}
+	return incrementals;
+}
+
+function createIncrementals() {
+	var incrementals = new Array();
+	for (var i = 0; i < smax; i++) {
+		incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+	}
+	return incrementals;
+}
+
+function defaultCheck() {
+	var allMetas = document.getElementsByTagName('meta');
+	for (var i = 0; i< allMetas.length; i++) {
+		if (allMetas[i].name == 'defaultView') {
+			defaultView = allMetas[i].content;
+		}
+		if (allMetas[i].name == 'controlVis') {
+			controlVis = allMetas[i].content;
+		}
+	}
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+	if (!e) {
+		e = event;
+		e.which = e.keyCode;
+	}
+	try {
+		modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+	}
+	catch(e) {
+		modifierKey = false;
+	}
+	return modifierKey || e.which == 0;
+}
+
+function startup() {
+	defaultCheck();
+	if (!isOp) createControls();
+	slideLabel();
+	fixLinks();
+	externalLinks();
+	fontScale();
+	if (!isOp) {
+		notOperaFix();
+		incrementals = createIncrementals();
+		slideJump();
+		if (defaultView == 'outline') {
+			toggle();
+		}
+		document.onkeyup = keys;
+		document.onkeypress = trap;
+		document.onclick = clicker;
+	}
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+# base theme of this theme:
+medium-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,115 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+# base theme of this theme:
+small-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,116 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/roman.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+"""Convert to and from Roman numerals"""
+
+__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
+__version__ = "1.4"
+__date__ = "8 August 2001"
+__copyright__ = """Copyright (c) 2001 Mark Pilgrim
+
+This program is part of "Dive Into Python", a free Python tutorial for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Python 2.1.1 license, available at
+http://www.python.org/2.1.1/license.html
+"""
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+                   ('CM', 900),
+                   ('D',  500),
+                   ('CD', 400),
+                   ('C',  100),
+                   ('XC', 90),
+                   ('L',  50),
+                   ('XL', 40),
+                   ('X',  10),
+                   ('IX', 9),
+                   ('V',  5),
+                   ('IV', 4),
+                   ('I',  1))
+
+def toRoman(n):
+    """convert integer to Roman numeral"""
+    if not (0 < n < 5000):
+        raise OutOfRangeError, "number out of range (must be 1..4999)"
+    if int(n) <> n:
+        raise NotIntegerError, "decimals can not be converted"
+
+    result = ""
+    for numeral, integer in romanNumeralMap:
+        while n >= integer:
+            result += numeral
+            n -= integer
+    return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile("""
+    ^                   # beginning of string
+    M{0,4}              # thousands - 0 to 4 M's
+    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+                        #            or 500-800 (D, followed by 0 to 3 C's)
+    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+                        #        or 50-80 (L, followed by 0 to 3 X's)
+    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+                        #        or 5-8 (V, followed by 0 to 3 I's)
+    $                   # end of string
+    """ ,re.VERBOSE)
+
+def fromRoman(s):
+    """convert Roman numeral to integer"""
+    if not s:
+        raise InvalidRomanNumeralError, 'Input can not be blank'
+    if not romanNumeralPattern.search(s):
+        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+    result = 0
+    index = 0
+    for numeral, integer in romanNumeralMap:
+        while s[index:index+len(numeral)] == numeral:
+            result += integer
+            index += len(numeral)
+    return result
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/easy-install.pth	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+import sys; sys.__plen = len(sys.path)
+./setuptools-0.6c5-py2.5.egg
+./docutils-0.5-py2.5.egg
+./Jinja-1.2-py2.5-win32.egg
+./pygments-0.10-py2.5.egg
+./sphinx-0.5.1-py2.5.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/helium-antlib/doc/tools/setuptools-0.6c5-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/setuptools.pth	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+./setuptools-0.6c5-py2.5.egg 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/site.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,394 @@
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/tools/sphinx-build.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+#!python.exe
+# EASY-INSTALL-ENTRY-SCRIPT: 'Sphinx==0.5.1','console_scripts','sphinx-build'
+__requires__ = 'Sphinx==0.5.1'
+import sys
+from pkg_resources import load_entry_point
+
+sys.exit(
+   load_entry_point('Sphinx==0.5.1', 'console_scripts', 'sphinx-build')()
+)
Binary file buildframework/helium/external/helium-antlib/lib/commons-io-1.4.jar has changed
Binary file buildframework/helium/external/helium-antlib/lib/freemarker-2.3.13.jar has changed
Binary file buildframework/helium/external/helium-antlib/lib/jaxen-1.1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/lib/log4j-1.2.9.jar has changed
Binary file buildframework/helium/external/helium-antlib/lib/mail-1.4.1.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/macros.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,218 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : macros.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-macros" xmlns:au="org.apache.ant.antunit">
+    <description>Helium Antlib build macro.</description>
+    
+    <dirname property="helium.antlib.root.dir" file="${ant.file.build-macros}" />
+    <property name="build.temp.dir" location="${basedir}/../build" />
+    <property name="bin.dir" location="${basedir}/../bin" />
+
+    <path id="helium.antlib.classpath">
+        <fileset dir="${helium.antlib.root.dir}/lib" includes="*.jar" />
+        <fileset dir="${helium.antlib.root.dir}/antlibs" includes="*.jar" />
+    </path>
+    
+    <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="helium.antlib.classpath"/>
+    <taskdef resource="org/apache/ant/antunit/antlib.xml" uri="org.apache.ant.antunit" classpathref="helium.antlib.classpath"/>
+    
+    
+    <presetdef name="subantPreset">
+        <subant failonerror="true">
+            <resources refid="subant.build.files"/>
+        </subant>
+    </presetdef>
+    
+    
+    <macrodef name="compileModule">
+        <attribute name="name" />
+        <attribute name="dir" default="${helium.antlib.root.dir}" />
+        <sequential>
+            <mkdir dir="${build.temp.dir}/@{name}/classes" />
+            <javac srcdir="${basedir}/src" destdir="${build.temp.dir}/@{name}/classes"
+                   debug="true" source="1.6" target="1.6">
+                <classpath refid="helium.antlib.classpath" />
+                <classpath refid="helium.@{name}.classpath" />
+                <include name="**/*.java" />
+                <compilerarg value="-Xlint:unchecked" />
+                <compilerarg value="-Xlint:deprecation" />
+            </javac>
+        </sequential>
+    </macrodef>
+
+    
+    <macrodef name="jarModule">
+        <attribute name="name" />
+        <attribute name="dir" default="${helium.antlib.root.dir}" />
+        <attribute name="bindir" default="${bin.dir}" />
+        <sequential>
+            <echo>Packaging module @{name}</echo>
+            <mkdir dir="@{bindir}" />
+            <jar destfile="@{bindir}/helium-@{name}.jar">
+                <fileset dir="${build.temp.dir}/@{name}/classes" />
+                <fileset dir="${basedir}/src" includes="**/*.xml" />
+                <fileset dir="${basedir}/src" includes="**/*.*ftl" />
+
+                <manifest>
+                    <section name="common">
+                        <attribute name="Implementation-Title" value="@{name}" />
+                        <attribute name="Implementation-Vendor" value="Nokia" />
+                    </section>
+                </manifest>
+            </jar>
+        </sequential>
+    </macrodef>
+    
+
+    <macrodef name="testModule">
+        <attribute name="name" />
+        <attribute name="dir" default="${helium.antlib.root.dir}" />
+        <sequential>
+            <if>
+                <available type="dir" file="${basedir}/tests"/>
+                <then>
+                    <exec osfamily="windows" executable="cmd" dir="${basedir}/tests">
+                        <env key="ANT_LIB_HOME" path="${helium.antlib.root.dir}"/>
+                        <arg line="/c build.bat unittest" />
+                    </exec>
+                    <exec osfamily="unix" executable="./bld.sh" dir="${basedir}/tests">
+                        <env key="ANT_LIB_HOME" path="${helium.antlib.root.dir}"/>
+                        <arg line="unittest" />
+                    </exec>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+    
+    
+    <path id="emma.classpath">
+        <fileset dir="${helium.antlib.root.dir}\antlibs">
+            <include name="**/*.jar" />
+        </fileset>
+    </path>
+    <taskdef classpathref="emma.classpath" resource="emma_ant.properties" />
+ 
+    
+    <macrodef name="junitModule">
+        <attribute name="name" />
+        <attribute name="dir" default="${helium.antlib.root.dir}" />
+        <sequential>
+            <if>
+                <available type="dir" file="${basedir}/tests/src"/>
+                <then>
+                    <echo>JUnit test module @{name}</echo>
+                    <delete dir="${build.temp.dir}/@{name}/junit_classes"/>
+                    <mkdir dir="${build.temp.dir}/@{name}/junit_classes" />
+                    <javac srcdir="${basedir}/tests/src" destdir="${build.temp.dir}/@{name}/junit_classes" debug="true" source="1.5" target="1.5">
+                        <classpath refid="helium.antlib.classpath" />
+                        <classpath refid="helium.@{name}.classpath" />
+                        <include name="**/*.java" />
+                    </javac>
+                    
+                    <path id="build.classpath">
+                        <pathelement location="${build.temp.dir}/@{name}/classes" />
+                        <pathelement location="${build.temp.dir}/@{name}/junit_classes" />
+                    </path>
+                    
+                    <emma enabled="true">
+                        <instr instrpathref="build.classpath"  
+                        destdir="${build.temp.dir}/@{name}/emma/instrumented"  
+                        metadatafile="${build.temp.dir}/@{name}/metadata.emma"
+                        merge="true">
+                            <filter excludes="org.apache.log4j.*" />
+                        </instr>
+                    </emma>
+                    
+                    <junit fork="yes" printsummary="yes" haltonfailure="yes" showoutput="yes">
+                        <formatter type="brief" usefile="false"/>
+                        <jvmarg value="-Demma.coverage.out.file=${build.temp.dir}/@{name}/coverage.emma" />
+                        <jvmarg value="-Demma.coverage.out.merge=false" />
+                        <jvmarg value="-Dtestdir=${basedir}" />
+                        <classpath refid="helium.antlib.classpath" />
+                        <classpath refid="helium.@{name}.classpath" />
+                        <classpath>
+                            <pathelement path="${build.temp.dir}/@{name}/emma/instrumented"/>
+                            <pathelement path="${helium.antlib.root.dir}/antlibs/*.jar"/>
+                        </classpath>
+                        <batchtest fork="yes" todir="${build.temp.dir}/@{name}/junit_test">
+                            <fileset dir="${basedir}/tests/src">
+                                <include name="**/*Test*.java"/>
+                            </fileset>
+                        </batchtest>
+                    </junit>
+                    
+                    <emma enabled="true" >
+                        <report>
+                            <infileset dir="${build.temp.dir}/@{name}" includes="*.emma" />
+                            <txt outfile="${build.temp.dir}/@{name}/coverage.txt" />
+                            <html outfile="${build.temp.dir}/@{name}/coverage.html" />
+                        </report>
+                    </emma>
+                    <loadfile property="message" srcFile="${build.temp.dir}/@{name}/coverage.txt"/>
+                    <echo message="${message}"/>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+    
+    
+    <target name="compile">
+        <echo>Compiling ${ant.project.name}</echo>
+        <compileModule name="${name}"/>
+    </target>
+    
+    
+    <target name="jar">
+        <echo>Creating jar for ${ant.project.name}</echo>
+        <jarModule name="${name}"/>
+    </target>
+    
+    
+    <target name="build" depends="compile,jar">
+        <echo>${ant.project.name} is built.</echo>
+    </target>
+    
+    
+    <target name="clean">
+        <echo>Cleaning ${ant.project.name}</echo>
+        <delete dir="${build.temp.dir}/${name}/classes"/>
+        <delete file="${bin.dir}/helium-${name}.jar"/>
+    </target>
+    
+    
+    <target name="junit">
+        <junitModule name="${name}"/>
+    </target>
+    
+    
+    <target name="unittest">
+        <testModule name="${name}"/>
+    </target>
+    
+    
+    <target name="test" depends="junit,unittest">
+        <echo>${ant.project.name} tested.</echo>
+    </target>
+</project>
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-metadata">
+    <description>Helium Antlib metadata build file.</description>
+    
+    <import file="../macros.ant.xml"/>
+
+    <property name="name" value="metadata"/>
+    
+
+    <path id="helium.metadata.classpath">
+        <fileset dir="${helium.antlib.root.dir}/bin" includes="helium-core.jar"/>    
+        <fileset dir="${ant.file.helium-metadata}/../lib" includes="*.jar"/>
+    </path>
+
+</project>
+
+
Binary file buildframework/helium/external/helium-antlib/metadata/lib/ant-contrib-1.0b2.jar has changed
Binary file buildframework/helium/external/helium-antlib/metadata/lib/bsf-2.4.0.jar has changed
Binary file buildframework/helium/external/helium-antlib/metadata/lib/bsh-2.1b0-1.0.jar has changed
Binary file buildframework/helium/external/helium-antlib/metadata/lib/dom4j-1.6.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/metadata/lib/jakarta-oro-2.0.8.jar has changed
Binary file buildframework/helium/external/helium-antlib/metadata/lib/sqlitejdbc-v053.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="build-meta-data" default="build" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Build meta data</description>
+    
+    <target name="build" depends="compile-package, create-jar" />
+
+    <path id="bmd.lib.path">
+        <fileset dir="./lib" includes="*.jar"/>
+    </path>
+
+    <target name="compile-package">
+        <echo>Building build meta data</echo>
+        <mkdir dir="./build/classes" />
+        <javac srcdir="./src" destdir="./build/classes" debug="true" source="1.5" target="1.5">
+            <classpath refid="bmd.lib.path" />
+            <include name="**/*.java" />
+        </javac>
+    </target>
+
+    <target name="create-jar">
+        <echo>Packaging module build meta data</echo>
+        <mkdir dir="./bin" />
+        <jar destfile="./bin/bmd.jar">
+            <fileset dir="./build/classes" />
+            <fileset dir="./src/" includes="**/*.xml"/>
+            <manifest>
+                <section name="common">
+                    <attribute name="Implementation-Title" value="bmd" />
+                    <attribute name="Implementation-Vendor" value="Nokia" />
+                </section>
+            </manifest>
+        </jar>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/MetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata;
+
+import java.util.Iterator;
+
+import com.nokia.helium.metadata.db.MetaDataDb;
+
+
+
+/**
+ * Interface to add any plugins to write the database. Two ways to get
+ * the data, either the entire data could written by calling getEntries() method
+ * or using Iterator for large amount of entries to be written to the database. 
+ */
+public interface MetaDataInput {
+    
+    /**
+     * 
+     *  @param fileSet fileset to be added
+     * 
+     */
+    Iterator<MetaDataDb.LogEntry> iterator();
+    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/SQLFMPPLoader.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+package com.nokia.helium.metadata;
+
+import java.util.List;
+import java.util.Map;
+
+import fmpp.Engine;
+import fmpp.tdd.DataLoader;
+import freemarker.template.TemplateCollectionModel;
+import freemarker.template.TemplateModel;
+import freemarker.template.TemplateHashModel;
+import freemarker.template.TemplateSequenceModel;
+import freemarker.template.TemplateHashModelEx;
+import freemarker.template.SimpleHash;
+import freemarker.template.SimpleCollection;
+import freemarker.template.SimpleSequence;
+import freemarker.template.SimpleScalar;
+import freemarker.template.TemplateModelIterator;
+import com.nokia.helium.metadata.db.MetaDataDb;
+import org.apache.log4j.Logger;
+
+/**
+ * Utility class to access the data from the database and used by FMPP
+ * templates.
+ */ 
+public class SQLFMPPLoader implements DataLoader {
+    
+    //private ResultSet rs;
+    private static final int READ_LIMIT = 5000;
+
+    private static Logger log = Logger.getLogger(MetaDataDb.class);
+
+    private MetaDataDb metadataDb;
+
+
+    /**
+     * @see fmpp.tdd.DataLoader#load(fmpp.Engine, java.util.List)
+     */
+    public Object load(Engine engine, List args) throws Exception {
+        log.debug("args.size:" + args.size());
+        java.util.ListIterator iter = args.listIterator();
+        int argsSize = args.size();
+        if (argsSize < 1) {
+            throw new Exception("input DB path should be provided");
+        }
+
+        /* arg[0] - dbpath
+         */
+        metadataDb = new MetaDataDb((String) (args.get(0)));
+        
+        /*
+         * QueryModel (which supports hash, sequence, containers)
+         *  
+         */
+        return new QueryModel();
+    }
+
+    /*
+     * Internal class to handle the sql query and returns the data in either
+     * hash or sequence or containers.
+     */
+    private class QueryModel implements TemplateHashModel {
+
+        /*
+         * Gets the template model for the corresponding query
+         * @param query for which the model is returned.
+         * @return returns the template model for the query 
+         */
+        public TemplateModel get(String query) {
+            log.debug("QueryModel:" + query);
+            return new QueryTemplateModel(query);
+        }
+
+        /*
+         * This model will not be empty as new object is returned. So false is returned.
+         */
+        public boolean isEmpty() {
+            return false;
+        }
+    }
+
+    /*
+     * Template model makes request to metadata db class to get the data and present it
+     * based on hash, sequence or containers.
+     * Todo: avoid the calling of checkAndReadData for each of the function.
+     */    
+    private class QueryTemplateModel implements TemplateCollectionModel, TemplateHashModelEx,
+        TemplateSequenceModel {
+        
+        private Map<String, List<String>> indexMap;
+        private String query;
+        private boolean isDataRead;
+
+        /*
+         * Constructor for the query model
+         * @param query for which the template model needs to be returned.
+         */
+        public QueryTemplateModel(String query) {
+            log.debug("query in SQLTemplateModel" + query);
+            this.query = query;
+        }
+
+        /*
+         * HashModel interface. When the template requests as hash then 
+         * @param query for which the template model needs to be returned.
+         */
+        public TemplateModel get(String key) {
+            checkAndReadData();
+            log.debug("QueryModel:" + key);
+            List<String> dataList = indexMap.get(key);
+            log.debug("datalist size" + dataList.size());
+            if (dataList.size() ==  1 ) {
+                return new SimpleScalar((String)dataList.get(0));
+            }
+            return new SimpleSequence(dataList);
+        }
+
+        /*
+         * Read the data from database if it is not done already. Used
+         * by hash and sequence model only. 
+         */
+        private void checkAndReadData() {
+            if (!isDataRead) {
+                log.debug("isDataRead:" + isDataRead);
+                isDataRead = true;
+                indexMap = metadataDb.getIndexMap(query); 
+            }
+            log.debug("indexmap size" + indexMap.size());
+        }
+
+        /*
+         * HashModel interface. When the template requests as hash then 
+         * data is read from memory and the keys are returned.
+         * @return the keys of the primary key data (currently column 1) 
+         * read from db
+         */
+        public TemplateCollectionModel keys() {
+            checkAndReadData();
+            return new SimpleCollection(indexMap.keySet());
+        }
+
+        /*
+         * Return the size of the records read from db
+         * @return the size of the db records.
+         */
+        public int size() {
+            checkAndReadData();
+            return indexMap.size();
+            
+        }
+
+        /*
+         * Gets the record on a particular index
+         * @return the record as hash model.
+         */
+        public TemplateModel get(int index) {
+            List<Map<String, Object>> rowList = metadataDb.getRecords(query);
+            return new SimpleHash(rowList.get(index));
+        }
+
+        /*
+         * Gets the record on a particular index
+         * @return the record as hash model.
+         */
+        public boolean isEmpty() {
+            checkAndReadData();
+            return indexMap == null;
+        }
+
+        /*
+         * Gets the record on a particular index
+         * @return the record as hash model.
+         */
+        public TemplateCollectionModel values() {
+            checkAndReadData();
+            return new SimpleCollection(indexMap.values());
+        }
+
+        /*
+         * Provides data via collection interface.
+         * @return the iterator model from which the data is accessed.
+         */
+        public TemplateModelIterator iterator() {
+            log.debug("iterator constructor called");
+            return new SQLTemplateModelIterator(query);
+        }
+    }
+
+    /*
+     * Internal Iterator class which provides data as collection. 
+     */
+    private class SQLTemplateModelIterator implements TemplateModelIterator {
+        
+        private String query;
+        private List<Map<String, Object>> rowList;
+        private int currentOffsetIndex;
+        private int count;
+        private boolean finished;
+        
+        public SQLTemplateModelIterator(String query) {
+            this.query = query;
+        }
+        public TemplateModel next() {
+            SimpleHash simpleHash = null;
+            try {
+                log.debug("checking any more element");
+                if (rowList != null && (count >= rowList.size())) {
+                    finished = true;
+                }
+                log.debug("next:count:" + count);
+                simpleHash = new SimpleHash(rowList.get(count));
+                count ++;
+                return simpleHash;
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+            return null;
+        }
+
+        public boolean hasNext() {
+            if (rowList == null ||  READ_LIMIT <= count) {
+                if (!finished) {
+                    log.debug("getting records");
+                    rowList = metadataDb.getRecords(query, READ_LIMIT, currentOffsetIndex * READ_LIMIT);
+                    count = 0;
+                    log.debug("rowList.size : " + rowList.size());
+                    if (rowList.size() == 0) {
+                        finished = true;
+                    }
+                    currentOffsetIndex ++;
+                }
+            }
+            int rowListSize = rowList.size(); 
+            if (rowListSize < READ_LIMIT && rowListSize == count) {
+                finished = true;
+            }
+            return !finished;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="metadatarecord" classname="com.nokia.helium.metadata.ant.taskdefs.MetaDataRecord"/>
+    <!-- Type definition -->
+    <typedef name="textmetadatainput" classname="com.nokia.helium.metadata.ant.types.TextLogMetaDataInput"/>
+    <typedef name="antmetadatainput" classname="com.nokia.helium.metadata.ant.types.AntLogMetaDataInput"/>
+    <typedef name="abldmetadatainput" classname="com.nokia.helium.metadata.ant.types.AbldLogMetaDataInput"/>
+    <typedef name="sbsmetadatainput" classname="com.nokia.helium.metadata.ant.types.SBSLogMetaDataInput"/>
+    <typedef name="policymetadatainput" classname="com.nokia.helium.metadata.ant.types.PolicyLogMetaDataInput"/>
+    <typedef name="metadatafilterset" classname="com.nokia.helium.metadata.ant.types.MetaDataFilterSet"/>
+    <typedef name="metadatafilter" classname="com.nokia.helium.metadata.ant.types.MetaDataFilter"/>
+    
+    <typedef name="metadataHasSeverity" classname="com.nokia.helium.metadata.ant.conditions.MetaDataLogCondition"/>
+    <typedef name="metadataCountSeverity" classname="com.nokia.helium.metadata.ant.taskdefs.MetaDataLogCount"/>
+    <typedef name="metadatasource" classname="com.nokia.helium.metadata.ant.types.MetadataSource"/>
+</antlib>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/conditions/MetaDataLogCondition.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.conditions;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+import com.nokia.helium.metadata.db.MetaDataDb;
+
+import org.apache.tools.ant.BuildException;
+import com.nokia.helium.core.ant.types.ConditionType;
+
+/**
+ * This class implements a Ant Condition which report true if it finds any
+ * matching severity inside a database for an XML log.
+ * 
+ * Example:
+ * <pre>
+ * &lt;target name=&quot;fail-on-build-error&quot;&gt;
+ *   &lt;fail message=&quot;The build contains errors&quot;&gt;
+ *     &lt;hlm:metadataHasSeverity log=&quot;my.log&quot; db=&quot;my.db&quot; severity=&quot;error&quot;/&gt;
+ *   &lt;/fail&gt;
+ * &lt;/target&gt;
+ * </pre>
+ * 
+ * The condition will eval as true if the my.db contains error stored for my.log file.
+ * 
+ * @ant.type name="metadataHasSeverity" category="Metadata"
+ */
+public class MetaDataLogCondition extends ConditionType {
+
+    // The severity to count
+    private String severity;
+    private String logFile;
+    private File fileName;
+
+    /**
+     * Sets which severity will be counted.
+     * 
+     * @param severity
+     * @ant.required
+     */
+    public void setSeverity(String severity) {
+        this.severity = severity;
+    }
+
+    public void setDb(File file) {
+        fileName = file;
+    }
+    
+    public void setLog(String log) {
+        logFile = log;
+    }
+
+    /**
+     * Get the number of a particular severity.
+     * 
+     * @return the number of a particular severity.
+     */
+    public int getSeverity() {
+        if (fileName == null || !fileName.exists() || logFile == null) {
+            //this.log("Error: Log file does not exist " + fileName);
+            return -1;
+        }
+        if (severity == null)
+            throw new BuildException("'severity' attribute is not defined");
+
+        this.log("Looking for severity '" + severity + "' under '"
+                + fileName.getAbsolutePath() + "'");
+        
+        MetaDataDb.Priority prty = null;
+        if (severity.equalsIgnoreCase("ERROR")) {
+            prty = MetaDataDb.Priority.ERROR;
+        } else if (severity.equalsIgnoreCase("WARNING")) {
+            prty = MetaDataDb.Priority.WARNING;
+        } else if (severity.equalsIgnoreCase("FATAL")) {
+            prty = MetaDataDb.Priority.FATAL;
+        } else if (severity.equalsIgnoreCase("INFO")) {
+            prty = MetaDataDb.Priority.INFO;
+        } else if (severity.equalsIgnoreCase("REMARK")) {
+            prty = MetaDataDb.Priority.REMARK;
+        }
+        else
+            throw new BuildException("'severity' attribute is not valid");
+        
+        MetaDataDb db = new MetaDataDb(fileName.getAbsolutePath());
+        
+        String sql = "select count(data) as COUNT from metadata INNER JOIN logfiles ON logfiles.id=metadata.logpath_id where path like '%" + logFile + "%' and priority_id = " + prty.getValue();
+        
+        //System.out.println(sql);
+        List<Map<String, Object>> records = db.getRecords(sql);
+        for (Map<String, Object> map : records)
+        {
+            //System.out.println((Integer)map.get("COUNT"));
+            return (Integer)map.get("COUNT");
+        }
+
+        return 0;
+    }
+
+    /**
+     * This method open the defined file and count the number of message tags
+     * with their severity attribute matching the configured one.
+     * 
+     * @return if true if message with the defined severity have been found.
+     */
+    public boolean eval() {
+        int severity = getSeverity();
+        if (severity < 0) {
+            return false;
+        }
+        return severity > 0;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataLogCount.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import com.nokia.helium.metadata.ant.conditions.MetaDataLogCondition;
+
+/**
+ * This class sets a property to the number of matching severity inside a Metadata db for a log.
+ * Example:
+ * <pre>
+ *     &lt;hlm:metadataCountSeverity severity=&quot;error&quot; log=&quot;*_fixslashes_raptor.log&quot; db=&quot;${build.log.dir}/metadata.db&quot; property=&quot;fixslashes.error&quot;/&gt;
+ * </pre>
+
+ * @ant.task name="metadataCountSeverity" category="Metadata"
+ */
+public class MetaDataLogCount extends Task {
+
+    private File fileName;
+    private String logFile;
+    private String severity;
+    private String property;
+
+    /**
+     * File to be parsed.
+     * 
+     * @param filename
+     * @ant.required
+     */
+    public void setDb(File filename) {
+        fileName = filename;
+    }
+    
+    public void setLog(String log) {
+        logFile = log;
+    }
+    
+    /**
+     * Defines the severity name to be counted.
+     * 
+     * @param severity
+     * @ant.required
+     */
+    public void setSeverity(String severity) {
+        this.severity = severity;
+    }
+
+    /**
+     * Name of the property to be set.
+     * @param property the property name
+     * @ant.required
+     */
+    public void setProperty(String property) {
+        this.property = property;
+    }
+    
+    /**
+     *  Execute the task. Set the property with number of severities.  
+     * @throws BuildException
+     */
+    public void execute() {
+        if (property == null)
+            throw new BuildException("'property' attribute is not defined");
+        
+        MetaDataLogCondition cond = new MetaDataLogCondition();
+        cond.setDb(fileName);
+        cond.setLog(logFile);
+        cond.setSeverity(severity);
+        getProject().setNewProperty(property, "" + cond.getSeverity());
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataRecord.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.taskdefs;
+
+import com.nokia.helium.metadata.MetaDataInput;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import java.util.Vector;
+import java.util.Iterator;
+//import java.util.ArrayList;
+import org.apache.log4j.Logger;
+//import org.apache.tools.ant.types.FileSet;
+import com.nokia.helium.metadata.db.*;
+
+/**
+ * This task provide a way to record the data in the Database.
+ * 
+ * <pre>
+ * Example 1:
+ * &lt;metadatarecord database=&quot;compile_log.db&quot;&gt;
+ *     &lt;sbsmetadatainput&gt;
+ *     &lt;fileset casesensitive=&quot;false&quot; file=&quot;sbs.log.file&quot;/&gt
+ *         &lt;metadatafiltelistref refid=&quot;compilation&quot;/&gt;
+ *     &lt;/sbsmetadatainput&gt;
+ * &lt;/metadatarecord&gt;
+ * 
+ * Example 2:
+ * 
+ * &lt;metadatarecord database=&quot;metadata.db&quot;&gt;
+ *     &lt;antmetadatainput&gt;
+ *     &lt;fileset casesensitive=&quot;false&quot; file=&quot;${build.id}_ant_build.log&quot;/&gt
+ *         &lt;metadatafiltelistref refid=&quot;compilation&quot;/&gt;
+ *     &lt;/antmetadatainput&gt;
+ * &lt;/metadatarecord&gt;
+
+ * </pre>
+ * 
+ * @ant.task name="metadatarecord" category="Metadata"
+ */
+public class MetaDataRecord extends Task {
+
+    private static Logger log = Logger.getLogger(MetaDataRecord.class);
+
+    private String database;
+    
+    private boolean failOnError = true;
+
+    private Vector<MetaDataInput> metadataList = new Vector<MetaDataInput>();
+
+    /**
+     * Helper function to set the database parameter
+     * 
+     * @ant.required
+     */
+    public void setDatabase(String dbFile) {
+        database = dbFile;
+    }
+
+    public void setFailOnError(String failNotify) {
+        if (failNotify.equals("false")) {
+            failOnError = false;
+        }
+    }
+    /**
+     * Helper function to get the database
+     * 
+     */
+    public String getDatabase() {
+        return database;
+    }
+
+    /**
+     * Helper function to return the metadatalist
+     *  @return build metadata object
+     * 
+     */
+    public Vector<MetaDataInput> getMetaDataList() throws Exception {
+        if (metadataList.isEmpty()) {
+            throw new Exception("metadata list is empty");
+        }
+        return metadataList;
+    }
+
+    /**
+     * Helper function to add the metadatalist
+     *  @param build metadata list to add
+     * 
+     */
+    public void add(MetaDataInput interf) {
+        metadataList.add(interf);
+    }
+
+    
+    @Override
+    public void execute() {
+        MetaDataDb metadataDb = null;
+        try {
+            log.debug("Getting Contents to write to db: " + database);
+            log.debug("Initializing DB: " + database);
+            metadataDb = new MetaDataDb(database);
+            log.debug("Parsing the input and writing to DB");
+            for ( MetaDataInput metadataInput : metadataList ) {
+                boolean removed = false;
+                Iterator<MetaDataDb.LogEntry> inputIterator = metadataInput.iterator();
+                while (inputIterator.hasNext()) {
+                    MetaDataDb.LogEntry logEntry = inputIterator.next();
+                    if (!removed)
+                        metadataDb.removeLog(logEntry.getLogPath());
+                    removed = true;
+                    metadataDb.addLogEntry(logEntry);
+                }
+            }
+            log.debug("Successfully writen to DB");
+        } catch (BuildException ex1) {
+            if (failOnError) {
+                throw ex1;
+            }
+        } catch (Exception ex) {
+            if (failOnError) {
+                throw new BuildException("Failed during writing data to db");
+            }
+        } finally {
+            log.debug("finalizing DB: " + database);
+            if (metadataDb != null) {
+                metadataDb.finalizeDB();
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AbldLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.*;
+import org.apache.tools.ant.BuildException;
+import java.util.*;
+import org.apache.log4j.Logger;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+/**
+ * This Type is to specify and use the abld logparser type to parse and store the data.
+ *
+ * <pre>
+ * &lt;hlm:metadatafilterset id="abld.metadata.filter"&gt;
+ *    &lt;metadatafilterset filterfile="common.csv" /&gt;
+ * &lt;/hlm:metadatafilterset&gt;
+ * 
+ * &lt;hlm:abldmetadatainput&gt;
+ *    &lt;fileset dir="${project.dir}/../data/"&gt;
+ *        &lt;include name="*_compile*.log"/&gt;
+ *    &lt;/fileset&gt;
+ *    &lt;metadatafilterset refid="abld.metadata.filter" /&gt;
+ * &lt;/hlm:antmetadatainput&gt;
+ * </pre>
+ * 
+ * @ant.task name="abldmetadatainput" category="Metadata"
+ */
+public class AbldLogMetaDataInput extends TextLogMetaDataInput {
+
+    private Logger log = Logger.getLogger(AbldLogMetaDataInput.class);
+    
+    private Pattern abldFinishedPattern = Pattern.compile("^===\\s+.+\\s+finished.*");
+    private Pattern abldStartedPattern = Pattern.compile("^===\\s+(.+)\\s+started.*");
+    private Pattern abldComponentPattern = Pattern.compile("^===\\s+(.+?)\\s+==\\s+(.+)");
+    
+
+    private String currentComponent;
+    
+    private boolean entryCreated;
+
+    private boolean recordText;
+    
+    public AbldLogMetaDataInput() {
+    }
+
+    public boolean isEntryAvailable() {
+        String exceptions = "";
+        int currentFileIndex = getCurrentFileIndex();
+        int lineNumber = getLineNumber(); 
+        BufferedReader currentReader = getCurrentReader();
+        
+        log.debug("Getting next set of log entries for Abld Input");
+        //log.debug("currentFileIndex" + currentFileIndex);
+        List<File> fileList = getFileList();
+        int fileListSize = fileList.size();
+        log.debug("fileList.size" + fileListSize);
+        while (currentFileIndex < fileListSize) {
+            try {
+                //log.debug("currentfileindex while getting file name: " + currentFileIndex);
+                File currentFile = fileList.get(currentFileIndex);
+                if (currentReader == null) {
+                    lineNumber = 0;
+                    setLineNumber(lineNumber);
+                    log.debug("Current abld log file name:" + currentFile);
+                    log.info("Processing file: " + currentFile);
+                    currentReader = new BufferedReader(new FileReader(currentFile));
+                    setCurrentReader(currentReader);
+                }
+                String logText = null;
+                while ((logText = currentReader.readLine()) != null) {
+                    lineNumber ++;
+                    setLineNumber(lineNumber);
+                    logText = logText.replaceFirst("'^\\s*\\[.+?\\]\\s*", "");
+                    if (logText.startsWith("++ Finished at")) {
+                        //log.debug("matching finished regex");
+                        if (currentComponent != null && !entryCreated) {
+                            addEntry("DEFAULT", currentComponent, currentFile.toString(), 
+                                    0, "" );
+                            entryCreated = true;
+                            recordText = false;
+                            return true;
+                        }
+                        entryCreated = false;
+                    } else if (logText.startsWith("=== ")) {
+                        //log.debug("trying to match with finish pattern =======");
+                        Matcher finishMatch = abldFinishedPattern.matcher(logText);
+                        if (finishMatch.matches()) {
+                            if (currentComponent != null && !entryCreated) {
+                                addEntry("DEFAULT", currentComponent, currentFile.toString(), 
+                                        0, "" );
+                                entryCreated = true;
+                                recordText = false;
+                                return true;
+                            }
+                            entryCreated = false;
+                        } else {
+                            //log.debug("trying to match the start pattern");
+                            Matcher componentMatch = abldComponentPattern.matcher(logText);
+                            if (componentMatch.matches()) {
+                                //log.debug("matched abldComponentPattern");
+                                currentComponent = componentMatch.group(2);
+                                recordText = true;
+                            }
+
+                            Matcher startMatch = abldStartedPattern.matcher(logText);
+                            if (startMatch.matches()) {
+                                //log.debug("matched abldStartedPattern");
+                                currentComponent = startMatch.group(1);
+                                recordText = true;
+                            }
+                        }
+                    } else {
+                        if (recordText) {
+                            String severity = getSeverity(logText);
+                            if (severity != null) {
+                                //log.debug("severity:" + severity);
+                                //log.debug("currentFile:" + currentFile);
+                                //log.debug("lineNumber:" + lineNumber);
+                                //log.debug("logText:" + logText);
+                                entryCreated = true; 
+                                addEntry(severity, currentComponent, currentFile.toString(), 
+                                        lineNumber, logText );
+                                return true;
+                            }
+                        }
+                    }
+                }
+                currentReader.close();
+                currentReader = null;
+                setCurrentReader(currentReader);
+                currentFileIndex ++;
+                setCurrentFileIndex(currentFileIndex);
+                //log.debug("currentfileindex: " + currentFileIndex);
+                //log.debug("fileListSize: " + fileListSize);
+            } catch (Exception ex) {
+                log.debug("Exception in AbldLogMetadata", ex);
+               try {
+                   currentReader.close();
+               } catch ( IOException iex) {
+                   log.debug("Exception in closing reader");
+               }
+               currentReader = null;
+               setCurrentReader(null);
+               exceptions = exceptions + ex.getMessage() + "\n";
+               return false;
+            }
+        }
+        if (!exceptions.equals("")) {
+            throw new BuildException(exceptions);
+        }
+        return false;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AntLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.*;
+import org.apache.tools.ant.BuildException;
+import java.util.*;
+import org.apache.log4j.Logger;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+/**
+ * This Type is to specify and use the ant logparser type to parse and store the data.
+ *
+ * <pre>
+ * &lt;hlm:metadatafilterset id="ant.metadata.filter"&gt;
+ *    &lt;metadatafilterset filterfile="${project.dir}/../data/common.csv" /&gt;
+ * &lt;/hlm:metadatafilterset&gt;
+ * 
+ * &lt;hlm:antmetadatainput&gt;
+ *    &lt;fileset dir="${project.dir}/../data/"&gt;
+ *        &lt;include name="*zip*.log"/&gt;
+ *    &lt;/fileset&gt;
+ *    &lt;metadatafilterset refid="ant.metadata.filter" /&gt;
+ * &lt;/hlm:antmetadatainput&gt;
+ * </pre>
+ * 
+ * @ant.task name="textmetadatainput" category="Metadata"
+ */
+public class AntLogMetaDataInput extends TextLogMetaDataInput {
+
+    private Logger log = Logger.getLogger(AntLogMetaDataInput.class);
+    
+    private Pattern antTargetPattern = Pattern.compile("^([^\\s=\\[\\]]+):$");
+    
+    private String currentComponent;
+    
+    private boolean entryCreated;
+    
+    public AntLogMetaDataInput() {
+    }
+
+    public boolean isEntryAvailable() {
+        String exceptions = "";
+        int currentFileIndex = getCurrentFileIndex();
+        int lineNumber = getLineNumber(); 
+        BufferedReader currentReader = getCurrentReader();
+        log.debug("Getting next set of log entries for Ant Input");
+        //log.debug("currentFileIndex" + currentFileIndex);
+        List<File> fileList = getFileList();
+        //log.debug("is filelist empty" + fileList.isEmpty());
+        int fileListSize = fileList.size();
+        log.debug("fileList.size" + fileListSize);
+        while (currentFileIndex < fileListSize) {
+            try {
+                lineNumber ++;
+                setLineNumber(lineNumber);
+                log.debug("currentfileindex while getting file name: " + currentFileIndex);
+                File currentFile = fileList.get(currentFileIndex);
+                if (currentReader == null) {
+                    setLineNumber(0);
+                    log.debug("Current Text log file name:" + currentFile);
+                    log.info("Processing file: " + currentFile);
+                    currentReader = new BufferedReader(new FileReader(currentFile));
+                    setCurrentReader(currentReader);
+                }
+                String logText = "";
+                while ((logText = currentReader.readLine()) != null) {
+                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
+                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
+                    Matcher match = antTargetPattern.matcher(logText); 
+                    if (match.matches()) {
+                        if (currentComponent != null && !entryCreated) {
+                            addEntry("DEFAULT", currentComponent, currentFile.toString(), 
+                                    0, "" );
+                            entryCreated = true;
+                            return true;
+                        }
+                        entryCreated = false;
+                        currentComponent = match.group(1);
+                        //log.debug("currentComponent:" + currentComponent);
+                    }
+                    logText = logText.replaceFirst("^[ ]*\\[.+?\\][ ]*", "");
+                    String severity = getSeverity(logText);
+                    if (severity != null) {
+//                        log.debug("severity:" + severity);
+//                        log.debug("currentFile:" + currentFile);
+//                        log.debug("lineNumber:" + lineNumber);
+//                        log.debug("logText:" + logText);
+                        entryCreated = true;
+                        // If there is no current component which means
+                        // it is a redirected output, using file name as comp name
+                        if (currentComponent == null ) {
+                            currentComponent = currentFile.getName();
+                        }
+                        addEntry(severity, currentComponent, currentFile.toString(), 
+                                lineNumber, logText );
+                        logText = "";
+                        return true;
+                    }
+                }
+                currentReader.close();
+                currentReader = null;
+                setCurrentReader(currentReader);
+                currentFileIndex ++;
+                setCurrentFileIndex(currentFileIndex);
+                //log.debug("currentfileindex: " + currentFileIndex);
+                //log.debug("fileListSize: " + fileListSize);
+            } catch (Exception ex) {
+                log.debug("Exception in AntLogMetadata", ex);
+                try {
+                    currentReader.close();
+                } catch ( IOException iex) {
+                    log.debug("Exception in closing reader");
+                }
+                currentReader = null;
+                setCurrentReader(null);
+                exceptions = exceptions + ex.getMessage() + "\n";
+                return false;
+            }
+        }
+        if (!exceptions.equals("")) {
+            throw new BuildException(exceptions);
+        }
+        
+        return false;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/LogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import com.nokia.helium.metadata.MetaDataInput;
+import org.apache.tools.ant.BuildException;
+import com.nokia.helium.metadata.db.MetaDataDb;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+import java.util.Iterator;
+import java.util.regex.Pattern;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * Abstract base class to provide common functionality for the log parsing.
+ */
+public abstract class LogMetaDataInput extends DataType implements
+    MetaDataInput {
+
+    private static final String DEFAULT_COMPONENT_NAME = "general";
+
+    private static Logger log = Logger.getLogger(LogMetaDataInput.class);
+    
+    private Vector<FileSet> fileSetList = new Vector<FileSet>();
+    
+    private List<File> fileList;
+    private Vector<MetaDataFilterSet> metadataFilterSets = new Vector<MetaDataFilterSet>();
+    private Vector<MetaDataFilter> completeFilterList;
+
+    private Iterator<MetaDataDb.LogEntry> metadataInputIterator = new MetaDataInputIterator();
+
+    private List<MetaDataDb.LogEntry> logEntries = new ArrayList<MetaDataDb.LogEntry>();
+    
+    
+    public LogMetaDataInput() {
+        //initRecordInfo();
+    }
+
+    /**
+     * Adds the fileset (list of input log files to be processed).
+     *  @param fileSet fileset to be added
+     * 
+     */
+    public void add(FileSet fileSet) {
+        fileSetList.add(fileSet);
+    }   
+    
+    /**
+     * Adds the fileset (list of input log files to be processed).
+     *  @param fileSet fileset to be added
+     * 
+     */
+    public void add(MetaDataFilterSet metadataFilterSet) {
+        metadataFilterSets.add(metadataFilterSet);
+    } 
+
+    /**
+     * Helper function called by ant to create the new filter
+     */
+    public MetaDataFilterSet createMetaDataFilterSet() {
+        MetaDataFilterSet filterSet =  new MetaDataFilterSet();
+        add(filterSet);
+        return filterSet;
+    }
+    
+    private Vector<MetaDataFilter> getCompleteFilters()throws Exception {
+        Vector<MetaDataFilter> allFilter = new Vector<MetaDataFilter>();
+        for (MetaDataFilterSet filterSet : metadataFilterSets) {
+            allFilter.addAll(filterSet.getAllFilters());
+        }
+        return allFilter;
+    }
+
+    /**
+     * Updates the list of filelist from the input fileset.
+     *  @param fileSetList input fileset list
+     *  @return the matched files including the base dir. 
+     */
+    private List<File> getFileListFromFileSet() {
+        fileList = new ArrayList<File>();
+        for (FileSet fs : fileSetList) {
+            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+            String[] includedFiles = ds.getIncludedFiles();
+            for ( String file : includedFiles ) {
+                fileList.add(new File(ds.getBasedir(), file));
+                log.debug("includedfiles: " + file);
+            }
+        }
+        log.debug("fileList.size" + fileList.size());
+        return fileList;
+    }
+
+    private MetaDataDb.LogEntry getEntry()throws Exception {
+        if (logEntries != null && logEntries.size() > 0) {
+            return logEntries.remove(0);
+        } else {
+            throw new Exception("No entries found");
+        }
+    }
+
+    protected List<File> getFileList() {
+        return fileList;
+    }
+
+    abstract boolean isEntryAvailable() throws Exception ;
+    
+    protected String getSeverity(String logText) throws Exception {
+        try {
+            if (completeFilterList == null) {
+                completeFilterList = getCompleteFilters();
+            }
+            for ( MetaDataFilter filter : completeFilterList) {
+                Pattern pattern = filter.getPattern();
+                if ((pattern.matcher(logText)).matches()) {
+                    //log.debug("pattern matched");
+                    return filter.getPriority();
+                }
+            }
+        } catch (Exception ex) {
+            log.debug("Exception while getting severity", ex);
+            throw ex;
+        }
+        return null;
+    }
+
+    protected void addEntry(String priority, String component, String logPath, int lineNo, 
+            String logText) throws Exception {
+        //log.debug("adding entry to the list");
+        File logPathFile = new File(logPath.trim());
+        String baseDir = logPathFile.getParent();
+        //Note: Always the query should be in "/" format only, compatible for both linux / windows
+        String uniqueLogPath = baseDir + "/" +  logPathFile.getName();
+        logEntries.add(new MetaDataDb.LogEntry(
+                logText, priority, 
+                component, uniqueLogPath, lineNo));
+    }
+
+    protected boolean findAndAddEntries(String logTextInfo, String currentComponent, 
+            String logPath, int lineNumber)throws Exception {
+        boolean entryAdded = false; 
+        String[] logText = logTextInfo.split("\n");
+        String severity = null;
+        for (int i = 0; i < logText.length; i++) {
+            severity = getSeverity(logText[i]);
+            if ( severity != null) {
+                log.debug("found match: ----" + logText[i]);
+                addEntry(severity, currentComponent, logPath, 
+                        i + lineNumber, logText[i] );
+                if (!entryAdded) {
+                    entryAdded = true;
+                }
+            }
+        }
+        return entryAdded;
+    }    
+    public Iterator<MetaDataDb.LogEntry> iterator() {
+        return metadataInputIterator;
+    }
+
+    public class MetaDataInputIterator implements Iterator<MetaDataDb.LogEntry> {
+        public boolean hasNext() {
+            if (fileList == null) {
+                fileList = getFileListFromFileSet();
+                if (fileList.isEmpty()) {
+                    throw new BuildException(" No input found.");
+                }
+            }
+            if (logEntries.size() > 0) {
+                log.debug("returning from existing entries");
+                return true;
+            }
+            boolean retValue = false;
+            try {
+                retValue = isEntryAvailable();
+            } catch ( Exception ex) {
+                throw new BuildException("Exception in metadata input.");
+            }
+            return retValue;
+        }
+
+        public void remove() {
+        }
+        
+        public MetaDataDb.LogEntry next() {
+            //log.debug("getting next element: " + logEntry);
+            MetaDataDb.LogEntry entry = null;
+            try {
+                entry = getEntry();
+            } catch (Exception ex) {
+                log.debug("Exception while getting entry: ", ex);
+            }
+            return entry;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilter.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.metadata.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.log4j.Logger;
+import java.util.regex.Pattern;
+
+
+/**
+ * This class provides filter input to the metadata task.
+ * <pre>
+ * &lt;metadatafilter priority=&quot;error&quot; regex=&quot;&quot; description=&quot;&quot; /&gt;
+ * </pre>
+ * @ant.task name="metadatafilter" category="Metadata"
+ */
+public class MetaDataFilter extends DataType
+{
+
+    private Logger log = Logger.getLogger(MetaDataFilter.class);
+
+    private String priority;
+    private String regex;
+    private String description;
+    private Pattern pattern;
+    
+
+    /**
+     * Helper function called by ant to set the priority type
+     * @param priority type of priority for this input.
+     */
+    public void setPriority(String prty) throws Exception {
+        if (prty == null || prty.trim().length() == 0) {
+            throw new Exception(" Invalid Priority");
+        }
+        priority = prty;
+    }
+
+    /**
+     * Helper function to return the priority type
+     * @return priority type
+     */
+    public String getPriority() {
+        return priority;
+    }
+
+    /**
+     * Helper function called by ant to set the regex
+     * @param regx regular expression of the filter
+     */
+    public void setRegex(String regx) throws Exception {
+        if (regx == null || regx.trim().length() == 0) {
+            throw new Exception(" Invalid Regular expression");
+        }
+        regex = regx;
+        createPattern(regx);
+    }
+
+    /**
+     * Helper function to return the regex type
+     * @return regular expression of this filter
+     */
+    public String getRegex() {
+        return regex;
+    }    
+
+    /**
+     * Helper function called by ant to set the description type
+     * @param desc description associated with filter.
+     */
+    public void setDescription(String desc) {
+        description = desc;
+    }
+
+    /**
+     * Helper function to return the description associated with regular expression
+     * @return description associated with regex.
+     */
+    public String getDescription() {
+        return description;
+    }
+    
+    /**
+     * Internal function to create the pattern
+     * @regex for which the pattern is created.
+     */
+    private void createPattern(String regex) {
+        pattern = Pattern.compile(regex);
+    }
+    
+    public Pattern getPattern() {
+        return pattern;
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,216 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.*;
+import java.util.*;
+import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.types.DataType;
+import org.apache.log4j.Logger;
+import fmpp.models.CsvSequence;
+import freemarker.template.TemplateSequenceModel;
+
+
+/**
+ * This type contains set of filters to be used by the metadatarecord. Two options:
+ * <pre>
+ * Example 1:
+ * &lt;metadatafilterset id=&quot;common&quot; filterfile=&quot;filters.csv&quot; /&gt;
+ * 
+ * Example 2:
+ * &lt;metadatafilterset id=&quot;common&quot;/&gt;
+ *   &lt;metadatafilter priority=&quot;error&quot; regex=&quot;^make(?:\[\d+\])?:\s+.*\s+not\s+remade&quot; description=&quot;make error&quot; />
+ *   &lt;metadatafilter priority=&quot;error&quot;regex=&quot;&quot; description=&quot;&quot; /&gt; 
+ * &lt;metadatafilterset/&gt;
+ *
+ * Example 3:
+ * &lt;metadatafilterset refid=&quot;common&quot; /&gt;
+ * </pre>
+ * @ant.task name="metadatafilterset" category="Metadata"
+ */
+public class MetaDataFilterSet extends DataType
+{
+    private Vector<MetaDataFilter> filters = new Vector<MetaDataFilter>();
+    
+    private Vector<MetaDataFilterSet> filterSets = new Vector<MetaDataFilterSet>();
+    
+    private String filterFile;
+    
+    private Logger log = Logger.getLogger(MetaDataFilterSet.class);
+
+    /**
+     * Helper function called by ant to set the FilterFile
+     * @param FilterFile the csv file used by the filterset
+     */
+    public void setFilterFile(String file) throws Exception {
+        filterFile = file;
+        addCSVFromFile(file);
+    }
+
+    /**
+     * Helper function called to get FilterFile.
+     * @return filterfile used by this filterset
+     */
+    public String getFilterFile() {
+        return filterFile;
+    }
+
+    /**
+     * Helper function called to get filterlist.
+     * FilterSet can contain nested filterset, individual filter.
+     * Individual filter is created as nestedFilterSet and appended so that
+     * the precedence is maintained.
+     * @return All filters
+     */
+    public Vector<MetaDataFilter> getAllFilters()throws Exception {
+        Vector<MetaDataFilter> allFilters = new Vector<MetaDataFilter>();
+        //First look for filters associated with this set.
+        if (filters.size() > 0) {
+            allFilters.addAll(filters);
+            return allFilters;
+        }
+        // Then filters as reference in filterset
+        Reference refId = getRefid();
+        Object filterSetObject = null;
+        if (refId != null) {
+            try {
+                filterSetObject = refId.getReferencedObject();
+            } catch ( Exception ex) {
+                log.info("Reference id of the filter is not valid");
+                throw ex;
+            }
+            if (filterSetObject != null && filterSetObject instanceof MetaDataFilterSet) {
+                allFilters.addAll(((MetaDataFilterSet)filterSetObject).getAllFilters());
+                return allFilters;
+            }
+            throw new Exception ("filterset object is not instance of MetaDataFilterSet");
+        }
+        // Add any nested filtersets
+        for (MetaDataFilterSet filterSet : filterSets) {
+            allFilters.addAll(filterSet.getAllFilters());
+        }
+        
+        return removeInvalidFilters(allFilters);
+    }
+    
+    private Vector<MetaDataFilter> removeInvalidFilters(Vector<MetaDataFilter> filterList) {
+        ListIterator<MetaDataFilter> iter = filterList.listIterator();
+        while (iter.hasNext()) {
+            MetaDataFilter filter = iter.next();
+            String priority = filter.getPriority();
+            String regEx = filter.getRegex();
+            if (priority == null || regEx == null) {
+                log.info("Warning: invalid filter removed");
+                log.debug("Warning: some filter is invalid removing it");
+                iter.remove();
+            }
+        }
+        return filterList;
+        
+    }
+    
+    /**
+     * Helper function called by ant to create the new filter
+     */
+    public MetaDataFilter createMetaDataFilter() {
+        MetaDataFilter filter =  new MetaDataFilter();
+        add(filter);
+        return filter;
+    }
+
+    /**
+     * Helper function to add the created filter
+     * @param filter to be added to the filterset
+     */
+    public void add(MetaDataFilter filter) {
+        MetaDataFilterSet filterSet = createMetaDataFilterSet();
+        filterSet.getFilterList().add(filter);
+    }
+
+     Vector<MetaDataFilter> getFilterList() {
+         return filters;
+     }
+
+     /**
+     * Helper function called by ant to create the new filter
+     */
+    public MetaDataFilterSet createMetaDataFilterSet() {
+        MetaDataFilterSet filterSet =  new MetaDataFilterSet();
+        add(filterSet);
+        return filterSet;
+    }
+
+    /**
+     * Helper function to add the created filter
+     * @param filter to be added to the filterset
+     */
+    public void add(MetaDataFilterSet filterSet) {
+        if (filterSet != null) {
+            filterSets.add(filterSet);
+        }
+    }
+
+    
+    private void addCSVFromFile(String csvPath) throws Exception {
+        CsvSequence csvs = new CsvSequence();
+        csvs.setSeparator(',');
+        log.debug("filter file: " + filterFile);
+        try {
+            csvs.load(new FileReader(new File(filterFile)));
+        } catch (java.io.FileNotFoundException fex) {
+            log.error("File not found:" + filterFile);
+            throw fex;
+        } catch (fmpp.util.StringUtil.ParseException pex) {
+            log.error("parser exception");
+            throw pex;
+        } catch (java.io.IOException iex) {
+            log.error("I/O exception");
+            throw iex;
+        }
+        int size = 0;
+        try {
+            log.debug("filter CSV record size: " + csvs.size());
+                size = csvs.size();
+            } catch (Exception ex) {
+                log.info("Warning: filter parsing error");
+                log.debug("Exception in processing csv file");
+            }
+            for (int i = 0; i < size; i++) {
+                try {
+                    TemplateSequenceModel model = (TemplateSequenceModel) csvs
+                    .get(i);
+                    int modelSize = model.size();
+                    if (modelSize != 3 ) {
+                        log.debug("csv row size:" + size);
+                        throw new Exception("filter format is invalid");
+                    }
+                    MetaDataFilter filter = new MetaDataFilter();
+                    filter.setPriority(model.get(0).toString());
+                    filter.setRegex(model.get(1).toString());
+                    filter.setDescription(model.get(2).toString());
+                    filters.add(filter);
+                } catch (Exception ex) {
+                    log.info("Warning: filter parsing error");
+                    log.debug("Exception in processing csv file");
+                }
+            }
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetadataSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.helium.metadata.ant.types;
+
+import com.nokia.helium.core.LogSource;
+import com.nokia.helium.metadata.db.MetaDataDb;
+import org.apache.log4j.Logger;
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+
+/**
+ * This type define an input source that will be communicated to the notifiers.
+ * Not used, deprecated and an xml and html file is generated fof signal modules.
+ * @ant.type name="metadatasource" category="Metadata"
+ * @deprecated
+ * 
+ */
+public class MetadataSource extends LogSource {
+
+    private static Logger logger = Logger.getLogger(MetadataSource.class);
+
+    private String db;
+    private String log;
+    
+    public void setDb(String db) {
+        this.db = db;
+    }
+    
+    public String getDb() {
+        return db;
+    }
+    
+    public void setLog(String log) {
+        this.log = log;
+    }
+    
+    public String getLog() {
+        return log;
+    }
+    
+    public File getFilename()
+    {
+        MetaDataDb mdb = new MetaDataDb(db);
+
+        String sql = "select * from metadata INNER JOIN logfiles ON logfiles.id=metadata.logpath_id INNER JOIN priority ON priority.id=metadata.priority_id where priority='ERROR' and path like '%" + log + "'";
+        
+        List<Map<String, Object>> records = mdb.getRecords(sql);
+        
+        try {
+            File temp = File.createTempFile("templog.", ".xml");
+            temp.deleteOnExit();
+            BufferedWriter output = new BufferedWriter(new FileWriter(temp));
+            output.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<log filename=\"" + log + "\">\n<build>\n");
+            
+            for (Map<String, Object> map : records)
+            {
+                output.write("<message priority=\"error\"><![CDATA[" + map.get("data") + "]]></message>\n");
+            }
+            
+            output.write("</build>\n</log>");
+            output.close();
+            
+            return temp;
+        } catch (Exception ex) {
+            logger.info("Exception generating xml file for metadata");
+            logger.debug("Exception in metadata source", ex);
+        }
+        return null;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import java.util.*;
+import org.apache.log4j.Logger;
+import javax.xml.stream.XMLStreamReader;
+import java.util.regex.Pattern;
+
+
+/**
+ * This Type is to specify and use the policy logparsertype to 
+ * parse and store the data based on xmlstreamreader.
+ * <pre>
+ * &lt;hlm:metadatafilterset id="policy.metadata.filter"&gt;
+ *    &lt;metadatafilterset filterfile="common.csv" /&gt;
+ * &lt;/hlm:metadatafilterset&gt;
+ * 
+ * &lt;hlm:policymetadatainput&gt;
+ *    &lt;fileset dir="${project.dir}/../data/"&gt;
+ *        &lt;include name="*validate*policy*.log"/&gt;
+ *    &lt;/fileset&gt;
+ *    &lt;metadatafilterset refid="policy.metadata.filter" /&gt;
+ * &lt;/hlm:policymetadatainput&gt;
+ * </pre>
+ * @ant.task name="policymetadatainput" category="Metadata"
+ */
+public class PolicyLogMetaDataInput extends XMLLogMetaDataInput {
+
+    private Logger log = Logger.getLogger(XMLLogMetaDataInput.class);
+    
+    private Map<String, String> currentAttributeMap;
+    
+    
+    public PolicyLogMetaDataInput() {
+    }
+    
+
+    private Map<String, String> getAttributes(XMLStreamReader streamReader) {
+        int count = streamReader.getAttributeCount() ;
+        if (count > 0 ) {
+            Map<String, String> attributesMap = new HashMap<String, String>();
+            for (int i = 0 ; i < count ; i++) {
+                attributesMap.put(streamReader.getAttributeLocalName(i), 
+                        streamReader.getAttributeValue(i));
+            }
+            return attributesMap;
+        }
+        return null;
+    }
+
+   
+    
+    boolean startElement (XMLStreamReader streamReader) {
+        String tagName = streamReader.getLocalName();
+        //log.debug("startElement: " + tagName);
+        if (tagName.equalsIgnoreCase("error")) {
+            currentAttributeMap = getAttributes(streamReader);
+        }
+        return false;
+    }
+
+    boolean endElement(XMLStreamReader streamReader) throws Exception {
+        boolean retValue = false;
+        try {
+            String tagName = streamReader.getLocalName();
+            String priority = "ERROR";
+            log.debug("endElement: " + tagName);
+            if (tagName.equalsIgnoreCase("error")) {
+                log.debug("tagName matches error");
+                String errorType = currentAttributeMap.get("type");
+                log.debug("errorType:" + errorType);
+                if (errorType.equals("unknownstatus")) {
+                    addEntry(priority, "CSV validation", getCurrentFile().toString(), -1, currentAttributeMap.get("message") + 
+                            currentAttributeMap.get("value"));
+                    retValue = true;
+                } else if (errorType.equals("A") || errorType.equals("B") 
+                        || errorType.equals("C") || errorType.equals("D")) {
+                    int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL ;
+                    Pattern pattern = Pattern.compile("([\\\\/][^\\\\/]+?)$", flags);
+                    addEntry(priority, "Issues", getCurrentFile().toString(), -1, 
+                            errorType + "Found incorrect value for" + 
+                            pattern.matcher(currentAttributeMap.get("message")).replaceAll(""));
+                    retValue = true;
+                } else if (errorType.equals("missing")) {
+                    addEntry(priority, "Missing", getCurrentFile().toString(), -1, currentAttributeMap.get("message"));
+                    retValue = true;
+                } else if (errorType.equals("invalidencoding")) {
+                    addEntry(priority, "Incorrect policy files", getCurrentFile().toString(), -1,  currentAttributeMap.get("message"));
+                    retValue = true;
+                }
+            }
+        } catch (Exception ex) {
+            log.debug("exception in endelement",ex);
+            throw ex;
+        }
+        return retValue;
+    }
+
+    boolean characters (XMLStreamReader streamReader) {
+        return false;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/SBSLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.*;
+import java.util.*;
+//import javax.xml.parsers.SAXParser;
+//import javax.xml.parsers.SAXParserFactory;
+import org.apache.log4j.Logger;
+import javax.xml.stream.XMLStreamReader;
+
+
+/**
+ * This Type is to specify and use the sbs logparsertype to 
+ * parse and store the data based on xmlstreamreader.
+ * <pre>
+ * &lt;hlm:metadatafilterset id="sbs.metadata.filter"&gt;
+ *    &lt;metadatafilterset filterfile="common.csv" /&gt;
+ * &lt;/hlm:metadatafilterset&gt;
+ * 
+ * &lt;hlm:sbsmetadatainput&gt;
+ *    &lt;fileset dir="${project.dir}/../data/"&gt;
+ *        &lt;include name="*compile.log"/&gt;
+ *    &lt;/fileset&gt;
+ *    &lt;metadatafilterset refid="sbs.metadata.filter" /&gt;
+ * &lt;/hlm:sbsmetadatainput&gt;
+ * </pre>
+ * @ant.task name="sbsmetadatainput" category="Metadata"
+ */
+public class SBSLogMetaDataInput extends XMLLogMetaDataInput {
+
+    private Logger log = Logger.getLogger(SBSLogMetaDataInput.class);
+
+    private String currentComponent;
+    
+    private String logTextInfo = "";
+    
+    private int lineNumber;
+
+    private boolean recordText;
+    
+    
+    public SBSLogMetaDataInput() {
+    }
+    
+    private String getComponent(XMLStreamReader streamReader) {
+        int count = streamReader.getAttributeCount() ;
+        for (int i = 0 ; i < count ; i++) {
+            if ( streamReader.getAttributeLocalName(i).equals("bldinf") ) {
+                return streamReader.getAttributeValue(i);
+            }
+        }
+        return null;
+    }
+
+    public boolean characters (XMLStreamReader streamReader) {
+        if (recordText) {
+            logTextInfo += streamReader.getText();
+        }
+        return false;
+    }
+    
+    public boolean startElement (XMLStreamReader streamReader) throws Exception {
+        try {
+            String tagName = streamReader.getLocalName();
+            if (tagName.equalsIgnoreCase("buildlog")) {
+                log.debug("starting with buildlog");
+            }
+            if (tagName.equalsIgnoreCase("recipe") ) {
+                lineNumber = streamReader.getLocation().getLineNumber();
+                //log.debug(" startElement: receipe tag");
+                recordText = true;
+                //currentComponent = attributes.getValue("bldinf");
+                currentComponent = getComponent(streamReader);
+            } else if (tagName.equalsIgnoreCase("error")
+                    || tagName.equalsIgnoreCase("warning")) {
+                lineNumber = streamReader.getLocation().getLineNumber();
+                recordText = true;
+            } else if (tagName.equalsIgnoreCase("whatlog") ) {
+                currentComponent = getComponent(streamReader);
+            }
+        } catch (Exception ex) {
+            log.debug("exception in startelement",ex);
+            throw ex;
+        }
+        return false;
+    }
+
+
+    public boolean endElement(XMLStreamReader streamReader) throws Exception {
+        try {
+            String tagName = streamReader.getLocalName();
+            if (tagName.equalsIgnoreCase("recipe")) {
+                recordText = false;
+                if (logTextInfo != null) {
+                    //log.debug("endElement: lineNumber: " + lineNumber);
+                    boolean entryCreated = findAndAddEntries(logTextInfo, currentComponent,
+                            getCurrentFile().toString(), lineNumber);
+                    logTextInfo = "";
+                    if ( entryCreated) {
+                        //log.debug("Entry creating end element");
+                        return true;
+                    }
+                }
+            } else if (tagName.equalsIgnoreCase("error")
+                    || tagName.equalsIgnoreCase("warning")) {
+                recordText = false;
+                addEntry(tagName, "general", getCurrentFile().toString(), lineNumber, 
+                        logTextInfo);
+                logTextInfo = "";
+                return true;
+            } else if (tagName.equalsIgnoreCase("whatlog") ) {
+                addEntry("default", currentComponent, getCurrentFile().toString(), -1, 
+                        "");
+            }
+        } catch (Exception ex) {
+            log.debug("Exception while processing for sbs metadata input", ex);
+            throw ex;
+        }
+        return false;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/TextLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.*;
+import java.util.*;
+import org.apache.log4j.Logger;
+
+/**
+ * This Type is to specify and use the text logparser type to parse and store the data.
+ *
+ * <pre>
+ * &lt;hlm:metadatafilterset id="text_log_metadata_input"&gt;
+ *    &lt;metadatafilterset filterfile="${project.dir}/../data/common.csv" /&gt;
+ * &lt;/hlm:metadatafilterset&gt;
+ * 
+ * &lt;hlm:textmetadatainput&gt;
+ *    &lt;fileset dir="${project.dir}/../data/"&gt;
+ *        &lt;include name="*_fixslashes*.log"/&gt;
+ *    &lt;/fileset&gt;
+ *    &lt;metadatafilterset refid="text_log_metadata_input" /&gt;
+ * &lt;/hlm:textmetadatainput&gt;
+ * </pre>
+ * 
+ * @ant.task name="textmetadatainput" category="Metadata"
+ */
+public class TextLogMetaDataInput extends LogMetaDataInput {
+
+    private Logger log = Logger.getLogger(TextLogMetaDataInput.class);
+    
+    private int currentFileIndex;
+    
+    private int lineNumber;
+    
+    private BufferedReader currentReader;
+
+    public TextLogMetaDataInput() {
+        
+    }
+    
+    protected void setCurrentFileIndex(int fileIndex) {
+        currentFileIndex = fileIndex;
+    }
+
+    protected void setLineNumber(int lineNo) {
+        lineNumber = lineNo;
+    }
+
+    protected int getCurrentFileIndex() {
+        return currentFileIndex;
+    }
+    
+    protected int getLineNumber() {
+        return lineNumber;
+    }
+
+    protected void setCurrentReader(BufferedReader reader) {
+        currentReader = reader;
+    }
+    
+    protected BufferedReader getCurrentReader() {
+        return currentReader;
+    }
+
+    public boolean isEntryAvailable() throws Exception {
+        //Todo: Optimize the function so the most of the statements could
+        //be reused with other metadata input.
+        String exceptions = "";
+        //log.debug("Getting next set of log entries for Text Input");
+        //log.debug("currentFileIndex" + currentFileIndex);
+        List<File> fileList = getFileList();
+        //log.debug("is filelist empty" + fileList.isEmpty());
+        int fileListSize = fileList.size();
+        while (currentFileIndex < fileListSize) {
+            try {
+                //log.debug("currentfileindex while getting file name: " + currentFileIndex);
+                File currentFile = fileList.get(currentFileIndex);
+                if (currentReader == null) {
+                    lineNumber = 0;
+                    log.debug("Current Text log file name:" + currentFile);
+                    log.info("Processing file: " + currentFile);
+                    currentReader = new BufferedReader(new FileReader(currentFile));
+                }
+                String logText = null;
+                while ((logText = currentReader.readLine()) != null) {
+                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
+                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
+                    logText = logText.replaceFirst("^[ ]*\\[.+?\\][ ]*", "");
+                    String severity = getSeverity(logText);
+                    if (severity != null) {
+//                        log.debug("severity:" + severity);
+//                        log.debug("currentFile:" + currentFile);
+//                        log.debug("lineNumber:" + lineNumber);
+//                        log.debug("logText:" + logText);
+                        
+                        addEntry(severity, currentFile.getName(), currentFile.toString(), 
+                                lineNumber, logText );
+                        lineNumber ++;
+                        return true;
+                    }
+                    lineNumber ++;
+                }
+                currentReader.close();
+                currentReader = null;
+                currentFileIndex ++;
+            } catch (Exception ex) {
+                log.debug("Exception in TextLogMetadata", ex);
+                try {
+                    currentReader.close();
+                } catch ( IOException iex) {
+                    log.info("exception in closing reader");
+                    log.debug("Exception in closing reader", iex);
+                }
+                currentReader = null;
+                exceptions = exceptions + ex.getMessage() + "\n";
+                return false;
+            }
+        }
+        if (!exceptions.equals("")) {
+            throw new Exception(exceptions);
+        }
+        
+        return false;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/XMLLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.*;
+import java.util.*;
+//import javax.xml.parsers.SAXParser;
+//import javax.xml.parsers.SAXParserFactory;
+import org.apache.log4j.Logger;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+//import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.XMLEvent;
+
+
+/**
+ * This Type abstract base class for all the types based on
+ * XML processing.
+ */
+abstract class XMLLogMetaDataInput extends LogMetaDataInput {
+
+    private Logger log = Logger.getLogger(XMLLogMetaDataInput.class);
+
+    private XMLInputFactory xmlInputFactory;
+
+    private XMLStreamReader xmlStreamReader;
+    
+    private int currentFileIndex;
+    
+    public XMLLogMetaDataInput() {
+        try {
+            xmlInputFactory = XMLInputFactory.newInstance();
+            xmlInputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,Boolean.TRUE);
+            xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,Boolean.FALSE);
+            xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING , Boolean.TRUE);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+    
+
+    private void close() {
+        try {
+            if (xmlStreamReader != null) {
+                xmlStreamReader.close();
+                xmlStreamReader = null;
+            }
+        } catch (Exception ex) {
+            log.info("Exception whil closing xml stream" + ex.getMessage());
+            log.debug("exception while closing xml stream",ex);
+        }
+        
+    }
+   
+    protected File getCurrentFile() {
+        List<File> fileList = getFileList();
+        return fileList.get(currentFileIndex); 
+    }
+    
+    boolean isEntryAvailable() throws Exception {
+        //log.debug("Getting next set of log entries for xml Input");
+        //log.debug("currentFileIndex" + currentFileIndex);
+        int fileListSize = getFileList().size();
+        //log.debug("fileList.size" + fileListSize);
+
+        //if ( isEntryCreatedForRemainingText() ) {
+        //    log.debug("Entry creating from remaining text");
+        //    return true;
+        //}
+        try {
+            while (currentFileIndex < fileListSize) {
+                boolean entryCreated = false;
+                File currentFile = getCurrentFile();
+                    if (xmlStreamReader == null) {
+                        log.info("Processing file: " + currentFile);
+                        xmlStreamReader = xmlInputFactory.createXMLStreamReader(
+                                currentFile.toString(), new BufferedInputStream(new FileInputStream(currentFile)));
+                    //First the START_DOCUMENT is the first event directly pointed to.
+                    }
+                int eventType = xmlStreamReader.getEventType();
+                while (xmlStreamReader.hasNext()) {
+                    eventType = xmlStreamReader.next();
+                    switch (eventType) {
+                    case XMLEvent.START_ELEMENT:
+                        //log.debug("XMLEvent:START_ELEMENT");
+                        entryCreated = startElement(xmlStreamReader);
+                        break;
+                    case XMLEvent.END_ELEMENT:
+                        //log.debug("XMLEvent:END_ELEMENT");
+                        entryCreated = endElement(xmlStreamReader);
+                        //log.debug("XMLEvent:END_ELEMENT: entryCreated: " +entryCreated);
+                        break;
+                    case XMLEvent.PROCESSING_INSTRUCTION:
+                        //log.debug("XMLEvent:PI_DATA");
+                        //printPIData(xmlr);
+                        break;
+                    case XMLEvent.CHARACTERS:
+                        //log.debug("XMLEvent:chacacters");
+                        entryCreated = characters(xmlStreamReader);
+                        break;
+                    case XMLEvent.COMMENT:
+                        log.debug("XMLEvent:COMMENT");
+                        break;
+                    case XMLEvent.START_DOCUMENT:
+                        log.debug("XMLEvent:START_DOCUMENT");
+                        break;
+                    case XMLEvent.END_DOCUMENT:
+                        log.debug("XMLEvent:END_DOCUMENT");
+                        break;
+                    case XMLEvent.ENTITY_REFERENCE:
+                        log.debug("XMLEvent:ENTITY_REFERENCE");
+                        break;
+                    case XMLEvent.ATTRIBUTE:
+                        log.debug("XMLEvent:ATTRIBUTE");
+                        break;
+                    case XMLEvent.DTD:
+                        log.debug("XMLEvent:DTD");
+                        break;
+                    case XMLEvent.CDATA:
+                        log.debug("XMLEvent:CDATA");
+                        break;
+                    case XMLEvent.SPACE:
+                        log.debug("XMLEvent:chacacters");
+                        break;
+                    default:
+                        break;
+                    }
+                    if ( entryCreated) {
+                        return true; 
+                    }
+                }
+                if (xmlStreamReader != null) {
+                    close();
+                }
+                currentFileIndex ++;
+            }
+        } catch (Exception ex1 ) {
+            log.info("Exception processing xml stream: " + ex1.getMessage());
+            log.debug("exception while parsing the stream", ex1);
+            close();
+        }
+        return false;
+    }
+
+    
+    abstract boolean startElement (XMLStreamReader streamReader) throws Exception ;
+
+    abstract boolean endElement(XMLStreamReader streamReader) throws Exception;
+    
+    abstract boolean characters (XMLStreamReader streamReader);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/db/MetadataDb.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,510 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+package com.nokia.helium.metadata.db;
+
+import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+//import java.sql.DatabaseMetaData;
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.BuildException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * A database for storing metadata about build log information.
+ */
+public class MetaDataDb
+{
+    private static Logger log = Logger.getLogger(MetaDataDb.class);
+
+    private static final String DRIVER_CLASS_NAME = "org.sqlite.JDBC";
+
+    private static final String URL_PREFIX = "jdbc:sqlite:/";
+
+    private static final int LOG_ENTRY_CACHE_LIMIT = 500;
+
+    //private static final int RECORD_LIMIT recordLimit = 5000;
+    
+    private static final String[] INIT_TABLES = {
+        "CREATE TABLE metadata (priority_id INTEGER, component_id INTEGER, line_number INTEGER, data TEXT, logpath_id INTEGER)", 
+        "CREATE TABLE component (id INTEGER PRIMARY KEY,component TEXT, logPath_id INTEGER, UNIQUE (logPath_id,component))", 
+        "CREATE TABLE priority (id INTEGER PRIMARY KEY,priority TEXT)", 
+        "CREATE TABLE logfiles (id INTEGER PRIMARY KEY, path TEXT)"
+    };
+
+    private static final String INSERT_METADATA_ENTRY = "INSERT INTO metadata VALUES(?, ?, ?, ?, ?)";
+    private static final String INSERT_LOGENTRY = "INSERT or IGNORE INTO logfiles VALUES(?, ?)";
+    private static final String INSERT_PRIORITYENTRY = "INSERT INTO priority VALUES(?, ?)";
+    private static final String INSERT_COMPONENTENTRY = "INSERT or IGNORE INTO component VALUES((SELECT max(id) FROM component)+1, ?, ?) ";
+    
+    private String dbPath;
+
+    private String url;
+
+    private boolean statementsInitialized;
+
+    private Connection connection;
+
+    private Connection readConnection;
+
+    private PreparedStatement insertMetaDataEntryStmt;
+    private PreparedStatement insertLogEntryStmt;
+    private PreparedStatement insertComponentStmt;
+    
+    private int entryCacheSize;
+
+    /**
+     * Opens or creates a database and initialises the tables.
+     * 
+     * @param databasePath The path to the database
+     */
+    public MetaDataDb(String databasePath)
+    {
+        dbPath = databasePath;
+        url = URL_PREFIX + dbPath;
+        try
+        {
+            Class.forName(DRIVER_CLASS_NAME);
+        }
+        catch (java.lang.ClassNotFoundException e)
+        {
+            log.debug("No JDBC Driver found");
+            throw new BuildException("JDBC Driver could not be found");
+        }
+        
+        synchronized (MetaDataDb.class) {
+            // See if the database needs to be initialized
+            boolean initializeDatabase = false;
+            if (!new File(dbPath).exists())
+            {
+                initializeDatabase = true;
+            }
+    
+            try
+            {
+                initializeConnection();
+                connection.setAutoCommit(false);
+                if (initializeDatabase)
+                {
+                    Statement statement = connection.createStatement();
+                    //statement.setQueryTimeout(60);
+                    // Create tables
+                    for (int i = 0; i < INIT_TABLES.length; i++)
+                    {
+                        statement.addBatch(INIT_TABLES[i]);
+                    }
+    
+                    // Fill out the priority table
+                    Priority[] priorityValues = Priority.values();
+                    for (int i = 0; i < priorityValues.length; i++)
+                    {
+                        statement.addBatch("INSERT INTO priority (priority) VALUES (\""
+                                + priorityValues[i] + "\")");
+                    }
+                    statement.addBatch("create unique index logfile_unique_1 on logfiles (path)");
+                    //statement.addBatch("create unique index component_unique_1 on component (component)");
+    
+                    int[] returnCodes = statement.executeBatch();
+                    connection.commit();
+                    connection.setAutoCommit(false);
+                    statement.close();
+                    finalizeConnection();
+                }
+            }
+            catch (SQLException e)
+            {
+                log.debug("problem initializing database",e);
+                throw new BuildException("Problem initializing database");
+            }
+        }
+    }    
+
+    /** Levels of log entry types. */
+    public enum Priority
+    {
+        // The values assigned to these enums should match the 
+        // automatically assigned values created in the database table
+        FATAL(1), ERROR(2), WARNING(3), INFO(4), REMARK(5), DEFAULT(6);
+        private final int value;
+        Priority(int value)
+        {
+            this.value = value;
+        }
+        public int getValue() {
+            return value;
+        }
+
+        public  static Priority getPriorityEnum( int i ) {
+            final Priority[] values  = values();
+            return i >= 0 && i < values .length ? values[i] : FATAL;
+        }
+    };
+
+
+    public static class LogEntry
+    {
+        private String text;
+
+        private Priority priority;
+
+        private String component;
+        
+        private int lineNumber;
+        
+        private String logPath;
+        
+        public LogEntry(String text, Priority priority, String component, 
+                String logPath, int lineNumber)
+        {
+            this.text = text;
+            this.priority = priority;
+            this.component = component;
+            this.lineNumber = lineNumber;
+            this.logPath = logPath;
+        }
+
+        public LogEntry(String text, String priorityTxt, String component, String logPath, 
+                int lineNumber) throws Exception
+        {
+            Priority prty = null;
+            String prtyText = priorityTxt.trim().toLowerCase();
+            if (prtyText.equals("error")) {
+                prty = Priority.ERROR;
+            } else if (prtyText.equals("warning")) {
+                prty = Priority.WARNING;
+            } else if (prtyText.equals("fatal")) {
+                prty = Priority.FATAL;
+            } else if (prtyText.equals("info")) {
+                prty = Priority.INFO;
+            } else if (prtyText.equals("remark")) {
+                prty = Priority.REMARK;
+            } else if (prtyText.equals("default")) {
+                prty = Priority.DEFAULT;
+            } else {
+                log.debug("Error: priority " + prtyText + " is not acceptable by metadata and set to Error");
+                prty = Priority.ERROR;
+                //throw new Exception("priority should not be null");
+            }
+
+            this.logPath = logPath;
+            this.text = text;
+            priority = prty;
+            
+            this.component = component;
+            this.lineNumber = lineNumber;
+        }
+        
+        public String getLogPath()
+        {
+            return logPath;
+        }
+
+        
+        public int getLineNumber()
+        {
+            return lineNumber;
+        }
+        
+        public String getText()
+        {
+            return text;
+        }
+
+        public void setText(String text)
+        {
+            this.text = text;
+        }
+
+        public Priority getPriority()
+        {
+            return priority;
+        }
+
+        public void setPriority(Priority priority)
+        {
+            this.priority = priority;
+        }
+
+        public String getComponent()
+        {
+            return component;
+        }
+
+        public void setComponent(String component)
+        {
+            this.component = component;
+        }
+
+    }
+
+    public void initializeConnection() throws SQLException {
+        new File(dbPath).getParentFile().mkdirs();
+        connection = DriverManager.getConnection(url);
+    }
+
+
+    public void finalizeStatements() throws SQLException {
+        if (statementsInitialized) {
+            if ( entryCacheSize > 0) {
+                //log.debug("writing to database");
+                entryCacheSize = 0;
+                writeLogDataToDB();
+            }
+            insertLogEntryStmt.close();
+            insertComponentStmt.close();
+            insertMetaDataEntryStmt.close();
+        }
+    }
+    
+    private void finalizeConnection() throws SQLException {
+        if (connection != null) {
+            connection.close();
+        }
+    }
+
+    public void finalizeDB() {
+        try {
+            synchronized (MetaDataDb.class) {
+                finalizeStatements();
+                finalizeConnection();
+            }
+        } catch (SQLException ex) {
+            log.debug("exception while finalizing the db", ex);
+            //throw ex;
+        }
+    }
+    
+    /*
+     *  Todo: Further Optimize to merge with getRecords and also use
+     *  primary key instead of the first column as index. 
+     */
+    //Note: Always the query should be in "/" format only
+    public Map<String, List<String>> getIndexMap(String query) {
+        Map<String, List<String>> indexMap = new HashMap<String, List<String>>();
+        log.debug("sql query" + query);
+        try {
+            initializeConnection();
+            Statement stmt = connection.createStatement();
+            ResultSet rs = stmt.executeQuery(query);
+            ResultSetMetaData rsmd = rs.getMetaData();
+            int numberOfColumns = rsmd.getColumnCount();
+            if (rs.isBeforeFirst()) {
+                while (rs.next()) {
+                    List<String> dataList = new ArrayList<String>();
+                    String key = null;
+                    for (int i = 1; i <= numberOfColumns; i++) {
+                        String data = null;
+                        int type = rsmd.getColumnType(i);
+                        if (type == java.sql.Types.INTEGER ) {
+                            data = "" + rs.getInt(i);
+                        } else {
+                            data = rs.getString(i);
+                        }
+                        log.debug("data:" + data);
+                        if ( i == 1) {
+                            key = data;  
+                        } else {
+                            dataList.add(data);
+                        }
+                    }
+                    indexMap.put(key, dataList);
+                }
+            }
+            stmt.close();
+            finalizeConnection();
+        } catch (Exception ex) {
+            log.debug("Warning: Exception while getting the index map", ex);
+            //throw ex;
+        }
+        return indexMap;
+    }
+
+    //Note: Always the query should be in "/" format only
+    public List<Map<String, Object>> getRecords(String query) {
+        List<Map<String, Object>> rowList = new ArrayList<Map<String, Object>>();
+        log.debug("sql query" + query);
+        try {
+            initializeConnection();
+            Statement stmt = connection.createStatement();
+            ResultSet rs = stmt.executeQuery(query);
+            ResultSetMetaData rsmd = rs.getMetaData();
+
+            int numberOfColumns = rsmd.getColumnCount();
+            List<String> columnNames = new ArrayList<String>();
+            for (int i = 1; i <= numberOfColumns; i++) {
+                columnNames.add(rsmd.getColumnName(i));
+                log.debug("columnName:" + rsmd.getColumnName(i));
+            }
+
+            log.debug("resultSet MetaData column Count=" + numberOfColumns);
+            if (rs.isBeforeFirst()) {
+                while (rs.next()) {
+                    Map<String, Object> recordMap = new HashMap<String, Object>();
+                    log.debug("adding records");
+                    for (int i = 1; i <= numberOfColumns; i++) {
+                        int type = rsmd.getColumnType(i);
+                        String columnName = columnNames.get(i - 1);
+                        //log.debug("columnName:" + columnName);
+                        if (type == java.sql.Types.INTEGER ) {
+                            Integer data = new Integer(rs.getInt(i));
+                            recordMap.put(columnName, data);
+                            log.debug("data:" + data);
+                        } else {
+                            String data = rs.getString(i);
+                            recordMap.put(columnName, data );
+                            log.debug("data:" + data);
+                        }
+                    }
+                    rowList.add(recordMap);
+                }
+            }
+            stmt.close();
+            finalizeConnection();
+        } catch (Exception ex) {
+            log.debug("Warning: Exception while getting the record details", ex);
+            //throw ex;
+        }
+        return rowList;
+    }
+
+    public List<Map<String, Object>> getRecords(String query, int recordLimit, int offsetValue) {
+        String updatedQuery = query + " limit " + recordLimit + " offset " 
+            + offsetValue + ";";
+        return getRecords(updatedQuery);
+    }
+
+    /*
+     * Two ways to update the metadata table for log id and component id.
+     * 1. Get the last inserted record for metadata and update the individual
+     * id by multiple update calls.
+     * 2. Get all the ids and insert the record in metadata table. In this case
+     * all the ids should be present in respective table before te insertion is
+     * happened. The main reason why is done with 2. approach is that
+     * while executing prepared statement, the getGeneratedKey() (which returns
+     * the last inserted record, function cannot be executed during batch execution.
+     * @param entries - entries for which the log and component table needs to be updated.
+     */
+    private void updateIndexTables(LogEntry entry) throws SQLException
+    {
+        connection.setAutoCommit(false);
+        //log.debug("updating logpath: " + entry.getLogPath());
+        insertLogEntryStmt.setNull(1, 4);
+        insertLogEntryStmt.setString(2, entry.getLogPath());
+        insertLogEntryStmt.addBatch();
+        insertLogEntryStmt.executeBatch();
+        connection.commit();
+        readConnection = DriverManager.getConnection(url);
+        readConnection.setAutoCommit(false);
+        Statement stmt = readConnection.createStatement();
+        log.debug("exiting synchronization---2");
+        ResultSet rs = stmt.executeQuery("select id from logfiles where path='" +
+                entry.getLogPath().trim() + "'");
+        int logPathId = 0;
+        if ( rs.next()) {
+            logPathId = rs.getInt(1);
+        }
+        stmt.close();
+        readConnection.close();
+        log.debug("exiting synchronization---5");
+        insertComponentStmt.setNull(1, 4);
+        insertComponentStmt.setString(2, entry.getComponent());
+        insertComponentStmt.setInt(3, logPathId);
+        insertComponentStmt.addBatch();
+        insertComponentStmt.executeBatch();
+        connection.commit();
+        insertLogEntryStmt.clearBatch();
+        insertComponentStmt.clearBatch();
+    }
+
+    private void writeLogDataToDB() throws SQLException {
+        insertMetaDataEntryStmt.executeBatch();
+        connection.commit();
+        insertMetaDataEntryStmt.clearBatch();
+    }
+    
+    public void removeLog(String log) throws Exception
+    {
+        initializeConnection();
+        Statement stmt = connection.createStatement();
+        stmt.executeUpdate("DELETE FROM metadata WHERE logpath_id IN (SELECT id from metadata, logfiles WHERE logfiles.id=metadata.logpath_id and logfiles.path='" + log + "')");
+        stmt.close();
+    }
+    
+    public void addLogEntry(LogEntry entry) throws Exception
+    {
+       synchronized (MetaDataDb.class) {
+            try {
+                if (!statementsInitialized) {
+                    log.debug("initializing statements for JDBC");
+                    initializeConnection();
+                    insertMetaDataEntryStmt = connection.prepareStatement("INSERT INTO metadata VALUES(?, ?, ?, ?, ?)");
+                    insertLogEntryStmt = connection.prepareStatement("INSERT or IGNORE INTO logfiles VALUES(?, ?)");
+                    insertComponentStmt = connection.prepareStatement("INSERT or IGNORE INTO component VALUES(?, ?, ?) ");
+                    statementsInitialized = true;
+                }
+                log.debug("MetaDataDB:entry:priority: " + entry.getPriority());
+                connection.setAutoCommit(false);
+                updateIndexTables(entry);
+                if ( entry.getPriority() != Priority.DEFAULT) {
+                    readConnection = DriverManager.getConnection(url);
+                    Statement stmt = readConnection.createStatement();
+                    ResultSet rs = stmt.executeQuery("select id from logfiles where path='" +
+                            entry.getLogPath().trim() + "'");
+                    int logPathId = 0;
+                    if ( rs.next()) {
+                        logPathId = rs.getInt(1);
+                    }
+                    rs.close();
+                    stmt.close();
+                    insertMetaDataEntryStmt.setInt(5, logPathId);
+                    stmt = readConnection.createStatement();
+                    rs = stmt.executeQuery("select id from component where component='" + 
+                            entry.getComponent() + "' and logpath_id='" + logPathId + "'");
+                    int componentId = 0;
+                    if ( rs.next()) {
+                        componentId = rs.getInt(1);
+                    }
+                    rs.close();
+                    stmt.close();
+                    readConnection.close();
+                    insertMetaDataEntryStmt.setInt(1, entry.getPriority().getValue());
+                    insertMetaDataEntryStmt.setInt(2, componentId);
+                    insertMetaDataEntryStmt.setInt(3, entry.getLineNumber());
+                    insertMetaDataEntryStmt.setString(4, entry.getText());
+                    insertMetaDataEntryStmt.addBatch();
+                    entryCacheSize ++;
+                    if (entryCacheSize >= LOG_ENTRY_CACHE_LIMIT) {
+                        log.debug("writing data to database");
+                        writeLogDataToDB();
+                        entryCacheSize = 0;
+                    }
+                }
+            } catch (SQLException ex) {
+                log.debug(" Exception while writing the record");
+                throw ex;
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/log4j.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium Antlib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+            <appender-ref ref="FILE"/>
+            <appender-ref ref="CONSOLE"/>
+    </appender>
+
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="false" />
+    </filter>
+    </appender>
+
+
+    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
+        <param name="File" value="hlm_debug.log"/>
+        <param name="MaxFileSize" value="1024KB"/>
+        <param name="append" value="true"/>
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="true" />
+    </filter>
+
+    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
+
+    </appender>
+
+  <logger name="com.nokia" additivity="false">
+      <level value="DEBUG" />
+    <appender-ref ref="ASYNC" />
+  </logger>
+
+    <root>
+        <priority value="DEBUG"/>
+        <appender-ref ref="CONSOLE"/>
+    </root>
+</log4j:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/build_status.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<build-status>
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+<#assign priority_table = table_info['select * from priority'] >
+<#assign priority_ids = priority_table?keys>
+
+<#list priority_ids as priority>
+    <#assign priority_count = table_info['select count(data) as COUNT from metadata where priority_id = ${priority} and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+    <#if (priority_count >= 0)>
+        <${priority_table['${priority}']?lower_case} count= "${priority_count}">
+    </#if>
+</#list>
+</build-status>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/cc_summary.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+<#--
+============================================================================ 
+Name        : cc_summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+ 
+<h1>${ant['build.id']}</h1>
+
+<#if ant?keys?seq_contains('publish')>
+    <#if ant?keys?seq_contains('publish.dir.list')>
+        <h2>Publish locations</h2>
+        <p>
+        <#list ant['publish.dir.list']?split(',') as site>
+          <a href="${site}">${site}</a></br>
+        </#list>
+        </p>
+    <#else>
+        <#if ant?keys?seq_contains('publish.dir')>
+        <h2>Publish locations</h2>
+        <p><a href="${ant['publish.dir']}">${ant['publish.dir']}</a></p>
+        </#if>
+    </#if>
+</#if>
+
+<#assign ccm_logpath_table = table_info['select * from logfiles where path like \'%_ccm_get_input.log%\''] >
+
+<#assign logpath_id = ccm_logpath_table?keys>
+<#list logpath_id as logpath>
+<#assign metadata_ccm_records = table_info['select * from metadata where logpath_id = ${logpath} and (priority_id = (select id from priority where priority=\'ERROR\')  or priority_id = (select id from priority where priority=\'WARNING\'))'] >
+<h2>Synergy errors</h2>
+    <p>
+    <#list metadata_ccm_records as recordentry>
+        ${recordentry['data']}
+    </#list>
+    </p>
+</#list>
+
+<h2>Build errors</h2>
+<#assign compile_logpath_table = table_info['select * from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\')'] >
+<#assign colors = {'error': 'FF0000', 'critical': 'FF7000', 'warning': 'FFF000', 'remark': '0000FF'}/>
+
+<table border="1" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+    <th width="55%">Component</th>
+    <th width="15%">Errors</th>
+    <th width="15%">Criticals</th>
+    <th width="15%">Warnings</th>
+    <th width="15%">Notes</th>
+</tr>
+<#assign logpath_id = compile_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign component_table = table_info['select id, component from component where logPath_id=${logpath}'] >
+    <#assign component_ids = component_table?keys?sort >
+
+<#list component_ids as component_id>
+<tr>
+<td>"${component_table['${component_id}']}"</td>
+    <#list colors?keys as type>
+        <#assign count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and (priority_id = (select id from priority where priority like \"${type}\"))'][0]['COUNT']}" >
+        <#if ( count?number &gt; 0)>
+<td align="center" bgcolor="#${colors[type]}">${count}</td>
+        <#else>
+<td align="center">0</td>
+        </#if>
+    </#list>
+</tr>
+</#list>
+</#list>
+</table>
+
+<#assign rom_logpath_table = table_info['select * from logfiles where (path like \'%roms.log\')'] >
+<#assign logpath_id = rom_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign romlog_table = table_info['select * from metadata where logpath_id = ${logpath}'] >
+    <h2>ROMs ${rom_logpath_table['${logpath}']}</h2>
+        <p>
+    <#list romlog_table as recordentry>
+        ${recordentry['data']}<br/>
+    </#list>
+        </p>
+</#list>
+
+<#assign policy_logpath_table = table_info['select * from logfiles where (path like \'%validate_policy.xml\')'] >
+<#assign logpath_id = policy_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign policy_table = table_info['select * from metadata where logpath_id = ${logpath}'] >
+        <h2>Distribution Policy validation</h2>
+        <p>
+        <#list policy_table as recordentry>
+            ${recordentry['data']}<br/>
+        </#list>
+        </p>
+</#list>
+
+<#if ant?keys?seq_contains('diamonds.build.id')>
+<p>
+<h2>ATS Test Results</h2>
+    <a href="http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4" >http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4 </a>
+</p>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/cc_summary_metadata.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+<#--
+============================================================================ 
+Name        : cc_summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+ 
+<h1>${ant['build.id']}</h1>
+
+<#if ant?keys?seq_contains('publish')>
+    <#if ant?keys?seq_contains('publish.dir.list')>
+        <h2>Publish locations</h2>
+        <p>
+        <#list ant['publish.dir.list']?split(',') as site>
+          <a href="${site}">${site}</a></br>
+        </#list>
+        </p>
+    <#else>
+        <#if ant?keys?seq_contains('publish.dir')>
+        <h2>Publish locations</h2>
+        <p><a href="${ant['publish.dir']}">${ant['publish.dir']}</a></p>
+        </#if>
+    </#if>
+</#if>
+
+<#assign ccm_logpath_table = table_info['select * from logfiles where path like \'%_ccm_get_input.log%\''] >
+
+<#assign logpath_id = ccm_logpath_table?keys>
+<#list logpath_id as logpath>
+<#assign metadata_ccm_records = table_info['select * from metadata where logpath_id = ${logpath} and (priority_id = (select id from priority where priority=\'ERROR\')  or priority_id = (select id from priority where priority=\'WARNING\'))'] >
+<h2>Synergy errors</h2>
+    <p>
+    <#list metadata_ccm_records as recordentry>
+        ${recordentry['data']}
+    </#list>
+    </p>
+</#list>
+
+<h2>Build errors</h2>
+<#assign compile_logpath_table = table_info['select * from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\')'] >
+<#assign colors = {'error': 'FF0000', 'critical': 'FF7000', 'warning': 'FFF000', 'remark': '0000FF'}/>
+
+<table border="1" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+    <th width="55%">Component</th>
+    <th width="15%">Errors</th>
+    <th width="15%">Criticals</th>
+    <th width="15%">Warnings</th>
+    <th width="15%">Notes</th>
+</tr>
+<#assign logpath_id = compile_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign component_table = table_info['select id, component from component where logPath_id=${logpath}'] >
+    <#assign component_ids = component_table?keys?sort >
+
+<#list component_ids as component_id>
+<tr>
+<td>"${component_table['${component_id}']}"</td>
+    <#list colors?keys as type>
+        <#assign count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and (priority_id = (select id from priority where priority like \"${type}\"))'][0]['COUNT']}" >
+        <#if ( count?number &gt; 0)>
+<td align="center" bgcolor="#${colors[type]}">${count}</td>
+        <#else>
+<td align="center">0</td>
+        </#if>
+    </#list>
+</tr>
+</#list>
+</#list>
+</table>
+
+<#assign rom_logpath_table = table_info['select * from logfiles where (path like \'%roms.log\')'] >
+<#assign logpath_id = rom_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign romlog_table = table_info['select * from metadata where logpath_id = ${logpath}'] >
+    <h2>ROMs ${rom_logpath_table['${logpath}']}</h2>
+        <p>
+    <#list romlog_table as recordentry>
+        ${recordentry['data']}<br/>
+    </#list>
+        </p>
+</#list>
+
+<#assign policy_logpath_table = table_info['select * from logfiles where (path like \'%validate_policy.xml\')'] >
+<#assign logpath_id = policy_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign policy_table = table_info['select * from metadata where logpath_id = ${logpath}'] >
+        <h2>Distribution Policy validation</h2>
+        <p>
+        <#list policy_table as recordentry>
+            ${recordentry['data']}<br/>
+        </#list>
+        </p>
+</#list>
+
+<#if ant?keys?seq_contains('diamonds.build.id')>
+<p>
+<h2>ATS Test Results</h2>
+    <a href="http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4" >http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4 </a>
+</p>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/diamonds_faults.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+<#--
+============================================================================ 
+Name        : macro.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#setting number_format="0">
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+    <#assign priority_table = table_info['select * from priority'] >
+    <#assign logpath_table = table_info['select * from logfiles'] >
+    <#assign priority_ids = priority_table?keys>
+    <#assign logpath_id = logpath_table?keys>
+    <#assign components = table_info['select component from component where logPath_id=(select id from logfiles where path=\'${logpath}\')'] >
+    <faults>
+        <total severity="error">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'ERROR\') and logpath_id=(select id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        <total severity="warning">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        <total severity="warning_rvct_other">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        <!-- todo update to calculate the correct value -->
+        <total severity="warning_rvct_bad">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'REMARK\')'][0]['COUNT']}</total>
+    <#list components as component>
+        <component>
+            <name>${component['component']}</name>
+            <total severity="error">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'ERROR\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+            <total severity="warning">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+            <total severity="critical">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'REMARK\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        </component>
+    </#list>
+
+    
+    </faults>
+    <components>
+    <#list components as component>
+    <!-- all components -->
+        <component>${component['component']}</component>
+    </#list>
+    </components>
+<#assign schema_version=10/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/diamonds_macro.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<#--
+============================================================================ 
+Name        : macro.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#setting number_format="0">
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+    <#assign priority_table = table_info['select * from priority'] >
+    <#assign logpath_table = table_info['select * from logfiles'] >
+    <#assign priority_ids = priority_table?keys>
+    <#assign logpath_id = logpath_table?keys>
+    <#assign components = table_info['select component from component where logPath_id=(select id from logfiles where path=\'${logpath}\')'] >
+    <faults>
+        <total severity="error">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'ERROR\') and logpath_id=(select id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        <total severity="warning">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        <total severity="warning_rvct_other">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        <!-- todo update to calculate the correct value -->
+        <total severity="warning_rvct_bad">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'REMARK\')'][0]['COUNT']}</total>
+    <#list components as component>
+        <component>
+            <name>${component['component']}</name>
+            <total severity="error">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'ERROR\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+            <total severity="warning">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+            <total severity="critical">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'REMARK\') and logpath_id=(select logpath_id from logfiles where path=\'${logpath}\')'][0]['COUNT']}</total>
+        </component>
+    </#list>
+    </faults>
+    <components>
+    <#list components as component>
+    <!-- all components -->
+        <component>${component['component']}</component>
+    </#list>
+    </components>
+<#assign schema_version=10/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/email_new.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+
+<#assign error_count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority where priority like \'ERROR\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+    <!-- section -->
+    <#macro create_section title type>
+           <div id="foldername">
+               <h5>${title}</h5>
+               <p class="maintext">
+                   <!-- content span -->
+                   <span class="${type}"><#nested></span>
+               </p>
+           </div>
+       </#macro>
+<#if (error_count > 0)>
+        <span class="errormessage">
+            ${logfile}...FAIL<br/>
+    <#list table_info['select * from metadata where priority_id in (select id from priority where priority like \'ERROR\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'] as recordentry >
+            <ul>
+            ${recordentry['data']}<br/>
+            </ul>
+    </#list>
+        </span>
+<#else>
+    <span class="okmessage">${logfile}...OK<br/></span>
+</#if>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/macro/expand3.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,71 @@
+function __ToggleNode( divNode )
+{
+  var cntNode = document.getElementById(divNode.id.replace(/Img(.+)/, 'Content$1'));
+  
+  if(!cntNode) return;
+  
+  if(cntNode.style.display == 'none')
+  {
+    cntNode.style.display = 'block';
+    divNode.style.background = divNode.style.background.replace(/open./, 'close.');
+  }
+  else
+  {
+    cntNode.style.display = 'none';
+    divNode.style.background = divNode.style.background.replace(/close./, 'open.');
+  }
+  
+  return cntNode;
+}
+
+function __UpdateNode( divNode, dsp )
+{
+	var cntNode = document.getElementById(divNode.id.replace(/Img(.+)/, 'Content$1'));
+	
+	if(!cntNode) return;
+	
+	cntNode.style.display = dsp;
+	if(dsp == 'block')
+		divNode.style.background = divNode.style.background.replace(/open./, 'close.');
+	else
+		divNode.style.background = divNode.style.background.replace(/close./, 'open.');
+	
+	return cntNode;
+}
+
+function __ToggleChilds( divNode )
+{
+	var cntNode = __ToggleNode(divNode);
+	if(!cntNode) return;
+	var childs  = cntNode.getElementsByTagName('div');
+	
+	for(var i = 0; i != childs.length; ++i)
+		if(/Img/.test(childs[i].id))
+			__ToggleChilds(childs[i]);
+}
+
+function __UpdateChilds( divNode, dsp )
+{
+	var cntNode = __UpdateNode(divNode, dsp);
+	if(!cntNode) return;
+	var childs  = cntNode.getElementsByTagName('span');
+	
+	for(var i = 0; i != childs.length; ++i)
+		if(/Img/.test(childs[i].id))
+			__UpdateChilds(childs[i], dsp);
+}
+
+function ToggleNode( id )
+{ __ToggleNode(document.getElementById(id)); }
+
+function ShowContent( id )
+{ __UpdateNode(document.getElementById(id), 'block'); }
+
+function HideContent( id )
+{ __UpdateNode(document.getElementById(id), 'none'); }
+
+function ShowChilds( id )
+{ __UpdateChilds(document.getElementById(id), 'block'); }
+
+function HideChilds( id )
+{ __UpdateChilds(document.getElementById(id), 'none'); }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/macro/log3.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+/* Main components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+BODY { font-family: "Nokia Sans Regular", Tahoma; font-size: x-small; margin: 0em; padding: 0em; background: #EEEEFF; }
+A { color: #000000; text-decoration: none; }
+#mb, #s_mb { margin: 5px; padding: 0px; background: #DADAEE; border: 1px solid #2161B5; }
+.mc, .s_mc { margin: 3px; padding: 3px 2px; background: #FFFFFF; border: 1px solid #2161B5; }
+.mc h1, .s_mc h1 { padding-left: 5px; margin: 3px 0px; font-weight: bold; color: #2161B5; font-size: x-small; border-bottom: 1px solid #2161B5; }
+.s_tag { font-size: x-small; font-weight: bold; padding: 0px 5px 3px 5px; }
+.s_val { font-size: x-small }
+
+/* Header */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+#h_wrapper { }
+.h_elmt { color: #0036CC; padding: 5px; margin: 10px; }
+.h_title { font-family: "Nokia Large", "Tahoma"; font-size: xx-large; font-weight: bold; }
+.h_subtitle { font-size: x-small; font-weight: normal; }
+
+/* Footer */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+#f_wrapper { }
+.f_elmt { font-weight: normal; color: #0036CC; padding: 5px; margin: 10px 15px; border-top: solid 1px #0036CC; }
+.f_title { font-size: x-small; padding: 0px; margin: 0px; }
+.f_subtitle { font-size: xx-small; padding: 0px; margin: 0px; }
+
+/* Color cross images */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.cr_r, .cr_b, .cr_y { padding-left: 19px; padding-bottom: 2px; }
+.cr_r { background: url(../img/icons/delete_red.gif) no-repeat; }
+.cr_b { background: url(../img/icons/delete_blue.gif) no-repeat; }
+.cr_y { background: url(../img/icons/delete_yellow.gif) no-repeat; }
+
+/* Color check images */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.ch_g, .ch_b { padding-left: 19px; padding-bottom: 2px; }
+.ch_g { background: url(../img/icons/check_green.gif) no-repeat; }
+.ch_b { background: url(../img/icons/check_blue.gif) no-repeat; }
+
+/* Element icons */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.icn_dir, .icn_cpp, .icn_hpp, .icn_txt, .icn_inf, .icn_bin, .icn_xml, .icn_prj, .icn_mmp, .icn_iby, .icn_oby, .icn_spt, .icn_doc, .icn_xls, .icn_rss
+{ padding-left: 23px; padding-bottom: 2px; }
+.icn_dir { background: url(../img/icons/dir.gif) no-repeat; }
+.icn_cpp { background: url(../img/icons/cpp.gif) no-repeat; }
+.icn_hpp { background: url(../img/icons/hpp.gif) no-repeat; }
+.icn_txt { background: url(../img/icons/txt.gif) no-repeat; }
+.icn_inf { background: url(../img/icons/inf.gif) no-repeat; }
+.icn_bin { background: url(../img/icons/bin.gif) no-repeat; }
+.icn_xml { background: url(../img/icons/xml.gif) no-repeat; }
+.icn_prj { background: url(../img/icons/prj.gif) no-repeat; }
+.icn_mmp { background: url(../img/icons/mmp.gif) no-repeat; }
+.icn_iby { background: url(../img/icons/iby.gif) no-repeat; }
+.icn_oby { background: url(../img/icons/oby.gif) no-repeat; }
+.icn_spt { background: url(../img/icons/spt.gif) no-repeat; }
+.icn_doc { background: url(../img/icons/doc.gif) no-repeat; }
+.icn_xls { background: url(../img/icons/xls.gif) no-repeat; }
+.icn_rss { background: url(../img/icons/rss.gif) no-repeat; }
+
+/* Message counts */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.count_fatal_error, .count_error, .count_warning, .count_remark, .count_note, .count_default { text-align: center; padding: 0px 20px; width: 200px; }
+.gbl_count_fatal_error, .gbl_count_error, .gbl_count_warning, .gbl_count_remark, .gbl_count_note, .gbl_count_default, .count_critical, .gbl_count_critical , .count_info, .gbl_count_info{ text-align: center; padding: 0px 20px; margin: 0px 2px; }
+.count_fatal_error, .gbl_count_fatal_error { color: #EB320A; border: 1px solid #EB320A; background: #F5C2B9; }
+.count_error, .gbl_count_error { color: #EB320A; border: 1px solid #EB320A; background: #FFCC00; }
+.count_critical, .gbl_count_critical { color: #FF3200; border: 1px solid #FF3200; background: #FFF476; }
+.count_warning, .gbl_count_warning { color: #FFBA00; border: 1px solid #FFBA00; background: #FFF476; }
+.count_remark, .gbl_count_remark { color: #4EBE2C; border: 1px solid #4EBE2C; background: #EDEFFF; }
+.count_note, .gbl_count_note { color: #2161B5; border: 1px solid #2161B5; background: #EDEFFF; }
+.count_info, .gbl_count_info { color: #2161B5; border: 1px solid #2161B5; background: #EDEFFF; }
+.count_default, .gbl_count_default { color: #DADADA; border: 1px solid #DADADA; background: #FFFFFF; }
+
+/* Node components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.node_head { padding: 1px 0px 2px 0px; }
+.node_title { padding-left: 19px; }
+.node_info { float: right; margin-top: -18px; padding: 1px 0px; }
+.node_content { padding: 2px 0px 2px 3px; margin-bottom: 3px; border-top: 1px solid #EDEDED; border-bottom: 1px solid #EDEDED;border-left: 1px solid #EDEDED; }
+.node_action { font-size: xx-small; color: #999999; }
+
+/* C++ components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.code_sample { font-family: Anonymous, "Courier New"; font-size: x-small; padding: 3px 6px; border: 1px solid #BABABA; background: #EDEDED; }
+.code_kwd { color: #0000FF; }
+.code_smb { color: #AA11FF; }
+.code_pp  { color: #44AA11; }
+.code_cmt { color: #767676; }
+
+/* Error highlight */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.code_fatal_error { background-color: #F5C2B9; }
+.code_error { background-color: #FFCC00; }
+.code_critical { background-color: #FFDD00; }
+.code_warning { background-color: #FFF476; }
+
+/* Formatting components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.separator { margin-top: 5px; }
+.t_wrapper { width: 100%; }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/macro/logger.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+<#--
+============================================================================ 
+Name        : logger.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+
+<#macro helium_logger_html_head>
+    <style type="text/css">
+        <#include "log3.css"/>
+    </style>
+    <script type="text/javascript">
+        <#include "expand3.js"/>
+    </script>
+</#macro>
+
+
+<#global helium_node_id = 0>
+
+
+<#macro helium_logger_header title subtitle="">
+    <div id="h_wrapper">
+        <div class="h_elmt">
+              <div class="h_title">${title}</div>
+              <div class="h_subtitle">${subtitle}</div>
+        </div>
+      </div>
+</#macro>
+
+
+<!-- Renders a main body of content -->
+<#macro helium_logger_content title>
+    <#assign helium_node_id = helium_node_id + 1>
+    <div id="mb">
+        <div class="mc">
+            <h1>${title}</h1>                                   
+            <div class="node_head"></div>
+                <div id="Content${helium_node_id}">
+                    <div class="node_content">
+                        <#nested>
+                    </div>
+                </div>      
+            </div>      
+        </div>      
+    </div>
+</#macro>
+
+
+<#macro helium_logger_print type>
+    <#if type == "">
+        <code><#nested></code><br/>
+    <#else>
+        <code class="code_${type}"><#nested></code><br/>
+    </#if>
+</#macro>
+
+<#macro helium_message_box nodeid type count>
+    <#if (count > 0)>
+        <a href="javascript:ToggleNode('Img${nodeid}')">
+            <span class="node_${type}">
+                <span class="count_${type}">${count} ${type}s</span>
+            </span>
+        </a>
+    </#if>
+</#macro>
+
+<#macro helium_logger_node_head nodeid title>
+    <div class="node_head">                    
+        <a href="javascript:ToggleNode('Img${nodeid}')">
+            <span id="Img${nodeid}">
+                <span class="node_action">[X]</span><span class="node_title">${title}</span>
+            </span>
+        </a>
+        <a href="javascript:ShowChilds('Img${nodeid}')">
+                <span class="node_action">[Show All]</span>
+        </a>
+        <a href="javascript:HideChilds('Img${nodeid}')">
+                <span class="node_action">[Hide All]</span>
+        </a>        
+        <!-- error reporting managenent -->
+        <#nested>
+    </div>
+</#macro>
+
+
+<#macro helium_logger_node_content nodeid>
+    <div id="Content${nodeid}" style="display:none">
+        <div class="node_content">
+            <#nested>
+        </div>
+    </div>
+</#macro>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/readdata.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+<#--
+============================================================================ 
+Name        : bmd.macros.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<#macro helium_scanlog_entry >
+    <style type="text/css">
+        <#include "log3.css"/>
+    </style>
+    <script type="text/javascript">
+        <#include "expand3.js"/>
+    </script>
+</#macro>
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+<html>
+<body>
+<h1>Summary</h1>
+<table>
+<#assign priority_table = table_info['select * from priority'] >
+<#assign component_table = table_info['select id, component from component'] >
+<#assign logpath_table = table_info['select * from logfiles'] >
+<#assign priority_ids = priority_table?keys>
+<tr><td>Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<#assign quotes='\'' />
+<#list priority_ids as priority>
+<td>${priority_table['${priority}']}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+${table_info['select count(data) as COUNT from metadata where priority_id=${priority}'][0]['COUNT']}</td>
+</#list>
+</tr>
+</table>
+<h1>Listing based on Priority</h1>
+<table>
+<#list priority_ids as priority>
+<tr><td>priority_id:${priority}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<tr><td>&nbsp;</td></tr>
+<tr><td><h3>${priority_table['${priority}']}</h3></td></tr>
+
+<#list table_info['select * from metadata where priority_id=${priority}'] as recordentry >
+<tr><td>logtext:${recordentry['data']}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<td>lineNo:${recordentry['line_number']}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+</#list>
+</#list>
+</table>
+<h1>Listing based on Component</h1>
+<table>
+<#assign component_ids = component_table?keys>
+<#list component_ids as component>
+<tr><td>&nbsp;</td></tr>
+<tr><td><h3>${component_table['${component}']}</h3></td></tr>
+<#list table_info['select * from metadata where component_id=${component} order by priority_id'] as recordentry >
+<tr><td>priority:${priority_table["${recordentry['priority_id']}"]}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<td>logtext:${recordentry['data']}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<td>lineNo:${recordentry['line_number']}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+</#list>
+</#list>
+</table>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/summary.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,126 @@
+<#--
+============================================================================ 
+Name        : summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+
+<#include "/@macro/logger.ftl"/>
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+
+<head>
+    <title>
+<#assign mykey=loginfo.info.id>
+<#if (conv[mykey])?exists>
+${loginfo.info.id}
+</#if>
+build summary</title>
+    <@helium_logger_html_head/>
+</head>
+<body>
+
+<!--
+    Processing the Helium log summary.
+-->
+<#macro logentry text, severity>
+    <#assign conv={"error": "error", "warning": "warning"}>
+    <#if (conv['${severity}'])?exists>
+        <@helium_logger_print type="${conv[\"${severity}\"]}">${text}</@helium_logger_print>
+    <#else>
+        <@helium_logger_print type="">${text}</@helium_logger_print>
+    </#if>
+</#macro>
+
+<#macro logfile_severity logname, priority, count, helium_node_id>
+    <@helium_message_box nodeid="${helium_node_id}" type="${priority}"  count="${count}"?number />
+</#macro>
+
+
+<#macro logfile_entry_detail recordentry, helium_node_id>
+    <#if recordentry?keys?size &gt; 0 >
+        <@logentry "${recordentry['data']}", "${priority_table[\"${recordentry['priority_id']}\"]}"?lower_case />
+    </#if>
+</#macro>
+
+<!-- Call the macros to render the log contents. -->
+<#assign mykey=loginfo>
+<#if (conv[mykey])?exists>
+<@helium_logger_header title="${loginfo.info.id} build"/>
+
+<@helium_logger_content title="Build overview">
+    Time started: ${loginfo.info.startTime}<br/>
+    Build machine: ${loginfo.info.machine}<br/>
+    Is published?: ${loginfo.info.publish.status}<br/>
+    <#if loginfo.info.publish.status?string == true?string>
+        Published location: ${loginfo.info.publish.location}</br>
+    </#if>
+</@helium_logger_content>
+</#if>
+
+<@helium_logger_content title="Errors and warnings details">
+<#assign priority_table = table_info['select * from priority'] >
+<#assign logpath_table = table_info['select * from logfiles'] >
+<#assign priority_ids = priority_table?keys>
+<#assign logpath_id = logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign component_table = table_info['select id, component from component where logPath_id=${logpath}'] >
+    <#assign component_ids = component_table?keys?sort >
+    <#assign helium_node_id = helium_node_id + 1>
+    <#-- -->
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${logpath_table['${logpath}']}">
+        <#list priority_ids as priority>
+            <@logfile_severity "${logpath_table['${logpath}']}", "${priority_table['${priority}']}"?lower_case, 
+                "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and priority_id = ${priority}'][0]['COUNT']}", 
+                "${helium_node_id}" />
+        </#list>
+    </@helium_logger_node_head>
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <#list component_ids as component_id>
+            <#assign helium_node_id = helium_node_id + 1>
+            <@helium_logger_node_head nodeid="${helium_node_id}" title="${component_table['${component_id}']}">
+                <#list priority_ids as priority>
+                    <#assign priority_text = "${priority_table['${priority}']}"?lower_case>
+                    <#assign priority_count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and priority_id = ${priority} and component_id = ${component_id}'][0]['COUNT']}" >
+                    <@logfile_severity "${component_table['${component_id}']}", "${priority_text}", 
+                            "${priority_count}", 
+                            "${helium_node_id}" />
+                </#list>
+            </@helium_logger_node_head>
+            <@helium_logger_node_content nodeid="${helium_node_id}">
+            <#list priority_ids as priority>
+                <#list table_info['select * from metadata where logpath_id = ${logpath} and priority_id = ${priority} and component_id = ${component_id}'] as recordentry >
+                    <#-- <#if sublog?node_name == "logfile"> --> 
+                        <@logfile_entry_detail recordentry, "${helium_node_id}" />
+                    <#-- <#elseif sublog?node_name == "log">
+                        <@antlognode sublog/>
+                    </#if> -->
+                </#list>
+            </#list>
+            </@helium_logger_node_content>
+        </#list>
+    </@helium_logger_node_content>
+</#list>
+</@helium_logger_content>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+setenv COMPUTERNAME fasbs01
+module load java/1.6.0
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../core/lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-metadata.jar -lib ../../antlibs"
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib ..\lib -lib ..\..\lib -lib ..\..\core\lib -lib ..\..\bin\helium-core.jar -lib ..\..\bin\helium-metadata.jar -lib ..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-metadata-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib metadata tests.</description>
+    
+    <dirname property="metadata.unitest.dir" file="${ant.file.helium-antlib-metadata-unittest}" />
+    <property environment="env" />
+    <import file="../../../nokia/companyproperties.ant.xml" optional="true"/>
+    <import file="../../../../extensions/nokia/external/helium-nokia-antlib/companyproperties.ant.xml" optional="true"/>
+    <property name="metadata.output.dir" location="${diamonds.unitest.dir}/output" />
+    <property name="metadata.template.dir" location="${diamonds.unitest.dir}/../src/templates" />
+
+    <target name="unittest" depends="unittest-metadata"/>
+
+    <target name="unittest-metadata">
+        <au:antunit>
+            <fileset dir="." includes="**/test_*.ant.xml" />
+            <au:plainlistener logLevel="info"/>
+        </au:antunit>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/IDO_lcdo_tb92-ci_MCL.92.64_ant_build.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,129 @@
+zip-binaries:
+   [length] t:\output\temp_build_files\IDO_lcdo_tb92-ci_MCL.92.64_nonhw_binaries_includefile.txt does not exist
+
+ats-test:
+log file not exists
+log file not exists
+
+ats-aste:
+log file not exists
+log file not exists
+
+ido-zip-wa:
+     [echo] Zipping wa
+      [zip] Building zip: t:\output\src\IDO_lcdo_tb92-ci_MCL.92.64_sources.zip
+
+build-log-extracts:
+Converting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64.sysdef_GenxmlMerge.log...
+Converting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64__armv5_winscw_armv5.test_dfs_build.sbs_ant_output.log...
+Extracted log is uptodate: t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64__armv5_winscw_armv5.test_dfs_build_compile.log
+Converting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_ant_build.log...
+Converting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_bom.log...
+Extracted log is uptodate: t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_ccm_get_input.log
+Extracted log is uptodate: t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_validate-policy.log
+
+log-merge:
+[dependset] Warning: t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_bom.log.xml modified in the future.
+     [echo] Merging all *.log.xml files
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64.sysdef_GenxmlMerge.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64__armv5_winscw_armv5.test_dfs_build.sbs_ant_output.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64__armv5_winscw_armv5.test_dfs_build_compile.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_ant_build.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_bom.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_ccm_get_input.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_info.log.xml into summary.
+     [echo] Inserting t:\output\logs\IDO_lcdo_tb92-ci_MCL.92.64_validate-policy.log.xml into summary.
+
+render-log-summary:
+     [fmpp] File processed.
+
+build-log-summary:
+
+prep-publish:
+
+ido-publish-sites:
+   [script] Publishing \\vagrp006\GROUPS5\SP_IDO\LCDo\CI_builds
+   [script] execute
+      [IDO] data.drive.letter is already defined to E
+      [IDO] Build.drive: t:, the drive exists: true
+      [IDO] Build drive substing skipped
+      [IDO] data.drive.letter is already defined to E
+      [IDO] Category folder name: idos
+      [IDO] Type: ido
+      [IDO] Updated build.family to ido_lcdo_tb92-ci_sbs-ec_sbs-ec
+[IDO] Using S60 version: tb92
+Trying to override old definition of task http://www.nokia.com/helium:diskspaceMacro
+Trying to override old definition of task http://www.nokia.com/helium:diskspaceMacro
+
+prep-publish:
+    [mkdir] Created dir: \\vagrp006\GROUPS5\SP_IDO\LCDo\CI_builds\tb92-ci\MCL.92.64
+
+publish:
+     [copy] Copying 26 files to \\vagrp006\GROUPS5\SP_IDO\LCDo\CI_builds\tb92-ci\MCL.92.64
+     [echo] ERROR: There are 5214 changes in the publish directory. Uploading the changes again...
+
+ido-recopy:
+      [IDO] data.drive.letter is already defined to E
+      [IDO] Build.drive: t:, the drive exists: true
+      [IDO] Build drive substing skipped
+      [IDO] data.drive.letter is already defined to E
+      [IDO] Category folder name: idos
+      [IDO] Type: ido
+      [IDO] Updated build.family to ido_lcdo_tb92-ci_sbs-ec_sbs-ec
+[IDO] Using S60 version: tb92
+Trying to override old definition of task http://www.nokia.com/helium:diskspaceMacro
+Trying to override old definition of task http://www.nokia.com/helium:diskspaceMacro
+
+ido-create-ado-mapping:
+[hlm:referenceToFileMacro] Creating t:\output\temp_build_files\null903042207.txt using system.definition.files
+[hlm:referenceToFileMacro] E:\Build_E\idoconfiguration\running\common\sysdefs\build.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\LC_Domain\LC_Domain\btservices\layers.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\LC_Domain\LC_Domain\printing\layers.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\LC_Domain\LC_Domain\remoteconn\layers.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\LC_Domain\LC_Domain\usbservices\layers.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\LC_Domain_osext\LC_Domain_osext\btaudioadaptation_stub\layers.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\LC_Domain_osext\LC_Domain_osext\shortlinksrv\layers.sysdef.xml
+[hlm:referenceToFileMacro] E:\Build_E\ido_wa\IDO_lcdo_tb92-ci\SystemSW_Domain_OSExt\SystemSW_Domain_OSExt\devicesrv\layers.sysdef.xml
+
+ido-prep-copy:
+     [fmpp] File processed.
+
+all:
+   [delete] Deleting directory t:\sf\app\printing_old
+   [delete] Deleting directory t:\sf\mw\btservices_old
+   [delete] Deleting directory t:\sf\mw\usbservices_old
+   [delete] Deleting directory t:\sf\mw\remoteconn_old
+   [delete] Deleting directory t:\sf\os\devicesrv_old
+   [delete] Deleting directory t:\sf\adaptation\stubs\btaudioadaptation_stub_old
+   [delete] Deleting directory t:\sf\os\shortlinksrv_old
+     [fmpp] File processed.
+
+all:
+    [mkdir] Created dir: t:\sf\app\printing
+    [mkdir] Created dir: t:\sf\adaptation\stubs\btaudioadaptation_stub
+    [mkdir] Created dir: t:\sf\os\shortlinksrv
+    [mkdir] Created dir: t:\sf\mw\remoteconn
+    [mkdir] Created dir: t:\sf\os\devicesrv
+    [mkdir] Created dir: t:\sf\mw\btservices
+    [mkdir] Created dir: t:\sf\mw\usbservices
+     [copy] Copying 30 files to t:\sf\adaptation\stubs\btaudioadaptation_stub
+     [copy] Copying 359 files to t:\sf\os\shortlinksrv
+     [copy] Copying 496 files to t:\sf\app\printing
+     [copy] Copying 1584 files to t:\sf\mw\remoteconn
+     [copy] Copying 2341 files to t:\sf\mw\btservices
+     [copy] Copying 1767 files to t:\sf\mw\usbservices
+     [copy] Copying 6833 files to t:\sf\os\devicesrv
+
+IDO-additions.final:
+Deferred failure: Yes
+
+BUILD FAILED
+
+compileSignal: Expected result was 0, actual result was 1 : compile-signal
+E:\Build_E\idoconfiguration\running\common\ido-additions.ant.xml:110: if=pending.failure
+	at com.nokia.helium.core.ant.HeliumExecutor.executeTargets(HeliumExecutor.java:98)
+	at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
+	at org.apache.tools.ant.Main.runBuild(Main.java:698)
+	at org.apache.tools.ant.Main.startAnt(Main.java:199)
+	at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
+	at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/all_regex_type.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.5.3 [2009-03-12 release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<info>sbs: version 2.5.3 [2009-03-12 release]
+</info>
+<info>SBS_HOME E:/Build_E/ido-config-df/sbs</info>
+<info>Set-up E:/Build_E/ido-config-df/sbs/sbs_init.xml</info>
+<warning>E:/build_e/sbs_2.8.4/sbs/win32/mingw/bin/cpp.exe: </warning>
+<info>Command-line-arguments -s z:\output/build/canonical_system_definition_build.xml -k -c armv5 -j 4 -m z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_Makefile --filters=FilterHeliumLog -f z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_compile.log</info>
+<recipe name='resourcedependencies' target='z:/epoc32/build/camera/c_87f62b1af2e7d874/gscameraplugin_dll/gscameraplugin_resource_plugins_27.rpp.d' host='fawec012' layer='app_layer' component='' bldinf='z:/sf/app/camera/group/bld.inf' mmp='z:/sf/app/camera/camerauis/cameraapp/generic/GsCamcorderPlugin/group/gscameraplugin.mmp' config='armv5_udeb' platform='' phase='RESOURCE_DEPS' source=''>
+<![CDATA[
+mingw_make.exe: error
+test FATAL ERROR(S):abcd
+): Missing file:
+abcd FLEXlm error:
+ABLD ERROR: 1234
+BLDMAKE ERROR: 43543
+test FATAL ERROR 
+fatal error U1077 error occured
+test warning U4010
+Warning:
+WARNING:
+LINK : warning
+REMARK: 
+:10: warning: cannot find matching deallocation function
+INFO:
+make[10]: ***abcd
+make[10]: abcd not remade because of errors
+error: ((Internal fault)):
+ERROR,error: ((Internal fault):)$,
+ error given more than once in the same rule
+ERROR: build error
+ERROR EC95940: ec error
+Errors caused tool to abort. asdfasdf
+test no rule to make target
+ERROR,.*no rule to make.*,
+ERROR	testing
+100) : WARNING: TEST123
+MAKEDEF WARNING: TEST
+TEST 123 \\(10) : Warning: (400)
+BLDMAKE WARNING: bldm warning
+MAKEDEF WARNING: make warning
+atest(100) : warning C aasdfa
+testas 100: warning: test123
+usage Usage Warning: warn1
+abcd mwld.exe: abcd
+Command line warning abcd
+anything ERROR: bad relocation: test123
+10 warning in component1
+EventType: Error Source: SweepNTabcde
+WARNING,.EventType:\s+Error\s+Source:\s+SweepNT.*,
+WARN	test
+anything Command line warning D4025 : test
+REMARK: test remark anything
+EventType: Error Source: GNU Make.
+abcd :10: warning: cannot find matching deallocation function 100:note abcd
+INFO: any info match
+"abcd" 
+line 100+: Warning:', : warning 30:,
+"abcd , line 100: Error: 100abcd:. abcd
+line 10: Warning:\', r\': warning 10: abcd
+"abcd, line 100: Warning: 100 abcd: abcd",
+]]><time start='1238421421.153697000' elapsed='0.171' />
++ RV=0
++ set +x
+<status exit='ok' attempt='1' />
+</recipe>
+</buildlog>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/common.csv	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+priority,regex,description
+FATAL,.*mingw_make\.exe.*,
+ERROR,.*\): Missing file:.*, 
+ERROR,^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:.*,
+ERROR,.*Error:\s+.*,
+ERROR,.*is not recognized as an internal or external command.*,
+ERROR,^MISSING:.*,
+ERROR,.*FLEXlm error:.*,
+ERROR,.*(ABLD|BLDMAKE) ERROR:.*,
+ERROR,.*FATAL ERROR\(S\):.*,
+ERROR,.*fatal error U1077.*,
+ERROR,.*warning U4010,
+ERROR,^make(?:\[\d+\])?\: \*\*\*.*,
+ERROR,^make(?:\[\d+\])?:\s+.*\s+not\s+remade.*,
+ERROR,error: ((Internal fault):)$,
+ERROR,Exception: [A-Z0-9_]+.*,
+ERROR,.*target .* given more than once in the same rule.*,
+ERROR,^ERROR:.*,
+ERROR,^ERROR EC\d+:.*,
+ERROR,Errors caused tool to abort..*,
+ERROR,.*no rule to make.*,
+ERROR,^ERROR\t.*,
+REMARK,.*[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049).*,
+WARNING,^(\d+\))?\s.*WARNING:.*,
+WARNING,^MAKEDEF WARNING:.*,
+WARNING,.*\\\\(?)\(\d+\)\s:\sWarning:\s\(\d+\),
+WARNING,^(BLDMAKE |MAKEDEF )?WARNING:.*,
+WARNING,.*\(\d+\) : warning C.*,
+WARNING,.*\d+: warning:.*,
+WARNING,.*Usage Warning:.*,
+WARNING,.*mwld.exe:.*,
+WARNING,^Command line warning.*,
+WARNING,.*ERROR: bad relocation:.*,
+WARNING,^(\d+) warning.*,
+WARNING,.*EventType:\s+Error\s+Source:\s+SweepNT.*,
+WARNING,^WARN\t.*,
+WARNING,.*LINK : warning.*,
+REMARK,.*Command line warning D4025 : .*,
+REMARK,^REMARK: .*,
+REMARK,^EventType:\s+Error\s+Source:\s+GNU\s+Make.*,
+REMARK,".*:\d+: warning: cannot find matching deallocation function""r""((:\d+)*: note: ).*",
+INFO,^INFO:.*,
+ERROR,"\""(.*)\"" , line (\d+): (Error: +(.\d+.*?):.*)$",
+WARNING,"line \d+: Warning:', r':\s+warning\s+\w+:.*",
+WARNING,"\""(.*)\""\, line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)$",
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/dp.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+INFO:dp:*******************************************
+INFO:dp:*                                         *
+INFO:dp:*       Data package 2.0 creation         *
+INFO:dp:*                 iCreatorDP              *
+INFO:dp:*                    v0.8.7                 *
+INFO:dp:*                                         *
+INFO:dp:*******************************************
+ERROR:dp:${${product.list}.dp.wa}/Setting_files does not exist
+Result: 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/ido_abs_mcl_devlon70_robot_MCL.70.500_fixslashes_raptor.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+
+No changes to P:\sf\mw\svgt\svgtopt\SVG\SVGRecog\Group\SvgRecog.MMP
+ERROR: P:\sf\mw\svgt\svgt_plat\svgt_api\tsrc\group\Bld.inf: #1: // to the same name in \epoc32\include
+ERROR: P:\sf\mw\svgt\svgt_plat\svgt_api\tsrc\group\Bld.inf: #1: \agnmodel\inc\AGMCOMON.H
+ERROR: P:\sf\mw\svgt\svgt_plat\svgt_api\tsrc\group\Bld.inf: #1: \agnmodel\group\agnmodel.mmp
+ERROR: P:\sf\mw\svgt\svgt_plat\svgt_api\tsrc\group\Bld.inf: #1: \agnmodel\group\agsvexe.mmp
+PRINT ONLY -> Writing P:\sf\mw\svgt\svgt_plat\svgt_api\tsrc\group\Bld.inf
+No changes to P:\sf\mw\svgt\svgt_plat\svgt_api\tsrc\group\svgtmodule.mmp
+ERROR: P:\sf\mw\classicui\uifw\AvKon\odeconf\group\odeconf.mmp: #1: SOURCEPATH		..\src
+ERROR: P:\sf\mw\classicui\uifw\AvKon\odeconf\group\odeconf.mmp: #1: SOURCEPATH		..\data
+ERROR: P:\sf\mw\classicui\uifw\AvKon\odeconf\group\odeconf.mmp: #1: TARGETPATH      resource\apps
+ERROR: P:\sf\mw\classicui\uifw\AvKon\odeconf\group\odeconf.mmp: #1: TARGETPATH 	    \private\10003a3f\apps
+ERROR: P:\sf\mw\classicui\uifw\AvKon\odeconf\group\odeconf.mmp: #1: USERINCLUDE	   ..\inc
+PRINT ONLY -> Writing P:\sf\mw\classicui\uifw\AvKon\odeconf\group\odeconf.mmp
+No changes to P:\sf\mw\classicui\uifw\AvKon\odeconf\inc\odeconf.hrh
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1: _LIT( KAICal2ArabicSummaryLocationSeparator, " \x060c" );
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x0009 horizontal tab
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x000a new line
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x000b line tabulation (vertical
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x000c form feed
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x000d carriage return
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x2028 line separator
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1:  * \x2029 paragraph separator
+ERROR: P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh: #1: "\x0009\x000A\x000B\x000C\x000D\x2028\x2029" );
+PRINT ONLY -> Writing P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2constants.hrh
+No changes to P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\aicalendarplugin2uids.hrh
+No changes to P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\calendar.hrh
+No changes to P:\sf\app\homescreen\idlehomescreen\hsplugins\organizer\aiagendaplugin2\inc\CalendarVariant.hrh
+ERROR: P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh: #1: _LIT(KStandardPuncExclamatoryPoint, "\x0021");
+ERROR: P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh: #1: _LIT(KStandardPuncDotPoint, "\x002E");
+ERROR: P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh: #1: _LIT(KArabicPuncComma, "\x060C");
+ERROR: P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh: #1: _LIT(KArabicPuncSemicolon, "\x061B");
+ERROR: P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh: #1: _LIT(KArabicPuncQuestion, "\x061F");
+ERROR: P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh: #1: _LIT(KArabicPuncWaw, "\x0648");
+PRINT ONLY -> Writing P:\sf\mw\inputmethods\textinput\peninputgenerichwr\inc\peninputhwrarabic.hrh
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/ido_abs_mcl_devlon70_robot_MCL.70.500_info.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<info>
+                <id>ido_abs_mcl_devlon70_robot_MCL.70.500</id>
+                <number>500</number>
+                <startTime>2009-04-25T19:31:43</startTime>
+                <machine>FASYM011</machine>
+                <publish>
+                    <status>true</status>
+                    <location>\\fasamba\dfs\r1120_isis\NT\Build_and_Release\IDO_Statistics\ABS_Domain\Releases</location>
+                </publish>
+            </info>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/ido_abs_tb92-nightly_5.2.58_validate_policy.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+<?xml version="1.0"?>
+<policyvalidation>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\screensaver\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\screensaver\scrsaver\scrsaverplugins\ScreenSaverAnimPlugin\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\screensaver\scrsaver\scrsaverplugins\ScreenSaverGifAnimPlugin\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\screensaver\scrsaver\scrsaverplugins\SlideshowPlugin\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\applicationinterworkingfw\ServiceHandler\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_plat\alarm_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_plat\extended_notifiers_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\aiw_criteria_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\aiw_generic_parameter_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\aiw_service_handler_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\buttons_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\common_file_dialogs_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\context_pane_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\dialogs_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\document_handler_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\editors_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\form_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\grids_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\hierarchical_lists_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\indicators_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\information_preview_popup_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\lists_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\navigation_pane_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\notes_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\notifiers_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\options_menu_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\popups_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\screen_saver_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\scroller_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\setting_pages_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\sounds_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\status_pane_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\tabs_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\title_pane_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\title_pane_touch_observer_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\classicui_pub\tsrc\bc\apps\bctestlauncher\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\CommonAdapter\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\commonuis\CommonDialogs\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\commonuis\CommonUi\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\psln\Doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\AknGlobalUI\avkonstartupextplg\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\AknGlobalUI\Doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\AvKon\akncompamode\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\AvKon\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\AvKon\tsrc\bc\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\AvKon\tsrc\bc\script\codetest_script\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\classicui\uifw\EikStd\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\svgt\svgtopt\Doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\svgt\svgtopt\VGRenderer\Doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiresources\layouts\cdl\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiresources\pictographs\AknPictograph\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiresources\skins\AknSkins\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiresources\uigraphics\AknIcon\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiresources\uiresources_pub\pictograph_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiresources\uiresources_pub\skins_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\hapticsservices\tactilefeedback\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\graphicsuis\svgtviewer\SvgtViewerPlugin\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\helps\csxhelp\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiaccelerator\uiacceltk\hitchcock\coretoolkit\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiaccelerator\uiacceltk\hitchcock\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uiaccelerator\uiacceltk\hitchcock\Tracer\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\uitools\svgtencoder\svgtenc\standalone\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\ocrsrv\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\fep\aknfep\peninputplugins\peninputimeplugincn\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\inputmethods_pub\ptiengine_iti_api\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\textinput\peninputarc\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\textinput\peninputarc\utils\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\textinput\peninputcommonctrls\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\textinput\peninputhwrboxcn\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\inputmethods\textinput\ptienginev2\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\dictionary\userdict\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\charconvfw\Charconvplugin\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\charconvfw\Findutil\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\charconvfw\gamerecognizer\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\charconvfw\JPLangUtil\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\charconvfw\Localizer\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\charconvfw\SortUtil\doc" value="None"/>
+    <error type="missing" message="E:\Build_E\ido_wa\ido_abs_tb92-nightly\textandloc\textandloc_pub\directory_localizer_api\doc" value="None"/>
+</policyvalidation>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/receipe_lengthy_warn.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.5.3 [2009-03-12 release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<info>sbs: version 2.5.3 [2009-03-12 release]
+</info>
+<info>SBS_HOME E:/Build_E/ido-config-df/sbs</info>
+<info>Set-up E:/Build_E/ido-config-df/sbs/sbs_init.xml</info>
+<info>Command-line-arguments -s z:\output/build/canonical_system_definition_build.xml -k -c armv5 -j 4 -m z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_Makefile --filters=FilterHeliumLog -f z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_compile.log</info>
+<recipe name='win32compile2object' target='x:/epoc32/build/opensrv/c_672cbe451a1cdf8d/libgabble-convenience_dll/winscw/urel/gabble-connection.o' host='fawec103' layer='sf' component='opensrv' bldinf='x:/sf/mw/opensrv/group/bld.inf' mmp='x:/sf/mw/opensrv/telepathygabble/group/libgabble-convenience.mmp' config='winscw_urel' platform='winscw' phase='ALL' source='x:/sf/mw/opensrv/telepathygabble/src/gabble-connection.c'>
+<![CDATA[
++ mwccsym2.exe -c -align 4 -warnings on -w nohidevirtual,nounusedexpr -msgstyle gcc -enum int -str pool -exc ms -trigraphs on -cwd source -O4,s -runtime staticmulti -wchar_t off -nostdinc -gccdepends -MD -d __SYMBIAN32__ -d __CW32__ -d __WINS__ -d __WINSCW__ -d __SUPPORT_CPP_EXCEPTIONS__ -d _UNICODE -d SYMBIAN -d HAVE_CONFIG_H -d HAVE_ERRNO_H -d VERBOSE -d EMULATOR -d NDEBUG -d __DLL__ -i- -i x:/sf/mw/opensrv/telepathygabble/inc -i x:/sf/mw/opensrv/loudmouth/inc -i x:/epoc32/include -i x:/epoc32/include -i x:/epoc32/include/mw -i x:/epoc32/include/platform/mw -i x:/epoc32/include/platform -i x:/epoc32/include/platform/loc -i x:/epoc32/include/platform/mw/loc -i x:/epoc32/include/platform/loc/sc -i x:/epoc32/include/platform/mw/loc/sc -i x:/epoc32/include/stdapis -i x:/epoc32/include/stdapis/glib-2.0 -i x:/epoc32/include/stdapis/glib-2.0/glib -i x:/epoc32/include/stdapis/glib-2.0/gObject -i x:/epoc32/include/stdapis/openssl -i x:/epoc32/include/stdapis/stlport -i x:/epoc32/include/stdapis/dbus-1.0 -i x:/epoc32/include/stdapis/dbus-1.0/dbus -include bldvariant.hrh -o x:/epoc32/build/opensrv/c_672cbe451a1cdf8d/libgabble-convenience_dll/winscw/urel/gabble-connection.o x:/sf/mw/opensrv/telepathygabble/src/gabble-connection.c
+epoc32\include\e32def.h:315: warning: macro 'TRUE' redefined
+epoc32\include\e32def.h:315: warning: (included from:
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\pthread.h:40
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\glibconfig.h:46
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\glib\gtypes.h:30
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\glib\galloca.h:31
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\glib.h:43
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\gobject\gtype.h:28
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\gobject\gboxed.h:28
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\glib-2.0\glib-object.h:25
+epoc32\include\e32def.h:315: warning:   X:\epoc32\include\stdapis\dbus-1.0\dbus\dbus-glib.h:27
+epoc32\include\e32def.h:315: warning:   X:\sf\mw\opensrv\telepathygabble\src\gabble-connection.c:23)
+epoc32\include\stdapis\glib-2.0\glib\gmacros.h:163: warning:     (location of previous definition)
+epoc32\include\e32def.h:326: warning: macro 'FALSE' redefined
+epoc32\include\e32def.h:326: warning: (included from:
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\pthread.h:40
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\glibconfig.h:46
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\glib\gtypes.h:30
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\glib\galloca.h:31
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\glib.h:43
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\gobject\gtype.h:28
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\gobject\gboxed.h:28
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\glib-2.0\glib-object.h:25
+epoc32\include\e32def.h:326: warning:   X:\epoc32\include\stdapis\dbus-1.0\dbus\dbus-glib.h:27
+epoc32\include\e32def.h:326: warning:   X:\sf\mw\opensrv\telepathygabble\src\gabble-connection.c:23)
+epoc32\include\stdapis\glib-2.0\glib\gmacros.h:159: warning:     (location of previous definition)
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:85: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:132: warning: variable / argument 'return_value' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:132: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:182: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:233: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:280: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:331: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:380: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:429: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:476: warning: variable / argument 'return_value' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:476: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:522: warning: variable / argument 'return_value' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:522: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:566: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\inc\gabble-connection-glue.h:611: warning: variable / argument 'invocation_hint' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:197: warning: illegal empty declaration
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:197: warning: illegal empty declaration
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:430: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:430: warning: '@enum$4028gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:597: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:597: warning: '@enum$4028gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:630: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:630: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:638: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:638: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:646: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:646: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:656: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:656: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:663: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:663: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:672: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:672: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:681: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:681: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:689: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:689: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:697: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:697: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:705: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:705: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:713: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:713: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:723: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:723: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:731: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:731: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:741: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:741: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:751: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:751: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:760: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:760: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:769: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:769: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:779: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:779: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:789: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:789: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:799: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:799: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:809: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:809: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:819: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:819: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:829: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:829: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:839: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:839: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:848: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:848: warning: '@enum$2379gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:860: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:860: warning: '@enum$2645gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:869: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:869: warning: '@enum$2645gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:878: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:878: warning: '@enum$2645gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:887: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:887: warning: '@enum$2645gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:896: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:896: warning: '@enum$2645gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:905: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:905: warning: '@enum$2645gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:1273: warning: variable / argument 'handler' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:1273: warning: variable / argument 'connection' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:1304: warning: variable / argument 'where_the_object_was' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:1851: warning: variable / argument 'user_data' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:1904: warning: variable / argument 'factory' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:1956: warning: variable / argument 'factory' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2003: warning: variable / argument 'cache' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2500: warning: variable / argument 'handler' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2500: warning: variable / argument 'connection' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2584: warning: variable / argument 'handler' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2617: warning: variable / argument 'handler' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2653: warning: variable / argument 'lmssl' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2919: warning: variable / argument 'disco' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2919: warning: variable / argument 'request' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:2919: warning: variable / argument 'node' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3059: warning: variable / argument 'status' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3059: warning: variable / argument 'parms' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3092: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3092: warning: '@enum$4893gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3137: warning: variable / argument 'cache' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3170: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3170: warning: '@enum$4893gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3170: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3170: warning: '@enum$4893gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3320: warning: variable / argument 'error' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3647: warning: variable / argument 'error' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3766: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3766: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3778: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3778: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3819: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3819: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3836: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3836: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3992: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:3992: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4004: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4004: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4123: warning: variable / argument 'manager' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4123: warning: variable / argument 'handle' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4123: warning: variable / argument 'vcard' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4123: warning: variable / argument 'error' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4373: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4373: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4558: warning: variable / argument 'disco' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4558: warning: variable / argument 'request' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4558: warning: variable / argument 'jid' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4558: warning: variable / argument 'node' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4643: warning: variable / argument 'context' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4703: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4703: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4720: warning: illegal implicit conversion from 'unsigned int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4720: warning: '@enum$4009gabble_connection_c'
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:4963: warning: variable / argument 'time' is not used in function
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:5039: warning: illegal implicit conversion from 'int' to
+sf\mw\opensrv\telepathygabble\src\gabble-connection.c:5039: warning: '@enum$4229gabble_connection_c'
++ E:/build_e/sbs_272/sbs/win32/cygwin/bin/sed.exe 's#\\\\\(.\)#/\1#g;s#/ #\\\ #g;s#\([A-Za-z]:\)\\\\#\1/#g;1,1s#.*: .* \(.\)\?$#    x:/epoc32/build/opensrv/c_672cbe451a1cdf8d/libgabble-convenience_dll/winscw/urel/gabble-connection.o: x:/sf/mw/opensrv/telepathygabble/src/gabble-connection.c \1#' x:/epoc32/build/opensrv/c_672cbe451a1cdf8d/libgabble-convenience_dll/winscw/urel/gabble-connection.dep
+]]><time start='1245768194.876303000' elapsed='1.140' />
++ RV=0
++ set +x
+<status exit='ok' attempt='1' />
+</recipe>
+</buildlog>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/sample_abld.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,488 @@
+
+x:\>set
+ALLUSERSPROFILE=C:\Documents and Settings\All Users
+ANT_ARGS=-lib "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\helium-antlib\bin" -lib "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\tools\common\java\lib" -lib "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\antlibs" -lib "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\antlibs\internal" -lib "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\jep_1.6_2.5" -logger com.nokia.ant.HeliumLogger   -listener com.nokia.helium.diamonds.ant.HeliumListener  -listener com.nokia.ant.listener.internaldata.Listener  -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor  -listener com.nokia.ant.listener.TracingLogger
+ANT_CMD_LINE_ARGS=-Dhelium.dir "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium" -listener nokia.ant.XmlLogger -DXmlLogger.file E:\BUILD_E\ido-config-cc-svn\cruisecontrol/../robot/log.xml -Dcclastbuildtimestamp 20090702114112 "-Dcvstimestamp=2009-07-02 12:11:44 GMT" -Dbuildforced false -Dcclastgoodbuildtimestamp 20090606000000 -Dcctimestamp 20090702131144 -Dlabel build.33 -Dprojectname ido_abs_tb92-nightly -Dlastbuildsuccessful false -Dbuild.system ec-helium -Dconfiguration.dir E:\BUILD_E\ido-config-cc-svn\cruisecontrol/../idos/abs/branches/tb92-nightly -Dbuild.drive x: -Ds60.grace.cache E:\BUILD_E\ido-config-cc-svn\build/ido_abs_tb92-nightly_grace_cache.txt -Dskip.codescanner true -Dcc.output.dir E:\BUILD_E\ido-config-cc-svn\build -buildfile E:\BUILD_E\ido-config-cc-svn\cruisecontrol/config/wrapper.xml test-publish-prop ido-build
+ANT_HOME=C:\APPS\ant_1.7
+ANT_OPTS=-Xmx896M -Dlog4j.configuration=com/nokia/log4j.xml
+APPDATA=C:\Documents and Settings\varamana\Application Data
+APTLMHOST=@oupelic4.emea.nsn-net.net
+ARMLMD_LICENSE_FILE=8224@falic01.europe.nokia.com;8224@salmg01.nmp.nokia.com;
+ARMROOT=\
+ARMV5VER=:ARM/Thumb C/C++ Compiler, RVCT2.2 [Build 593]
+CCDIR=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl\
+CC_BAT=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl\real_cruisecontrol.bat
+CC_OPTS= -Ddashboard.config=E:\BUILD_E\ido-config-cc-svn\build\helium-dashboard-config.xml -Xms512m -Xmx1024m
+CLASSPATH=e:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl\lib;%CLASSPATH%
+CLIENTNAME=4GBD01728
+ClusterLog=C:\EESP\Cluster\cluster.log
+CMTHOME=C:\APPS\cmt
+CommonProgramFiles=C:\Program Files\Common Files
+COMPUTERNAME=FASYM011
+ComSpec=C:\EESP\system32\cmd.exe
+COPYCMD=/y
+CRUISE_PATH=C:\Apps\j2sdk_1.6.0_02\lib\tools.jar
+CTCHOME=C:\APPS\ctc
+DERBY_HOME=C:\APPS\j2sdk_1.6.0_02\JavaDB
+DIAMONDS_ANT_ARGS= -listener com.nokia.helium.diamonds.ant.HeliumListener
+EMAKEFLAGS=--no-print-directory --emake-volatile=.def,.info,.class,.mmp --emake-reg-roots=-\HKEY_CLASSES_ROOT
+EMAKE_CM=fawec001
+EMAKE_EMULATION=symbian
+EMAKE_ROOT=\;c:\apps
+EPOCROOT=\
+EXEC="C:\Apps\j2sdk_1.6.0_02\bin\java"  -Ddashboard.config=E:\BUILD_E\ido-config-cc-svn\build\helium-dashboard-config.xml -Xms512m -Xmx1024m -Djmx.remote.x.server.connection.timeout=-1 -Djmx.remote.x.client.connection.check.period=0 -jar "E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl\lib\cruisecontrol-launcher.jar" -webapppath E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl/webapps/cruisecontrol -dashboard E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl/webapps/dashboard -webport 8080 -rmiport 1099
+FILTERWHAT_FILE=\output\logs\about_what.log
+FLEXLM_BATCH=1
+FLEXLM_TIMEOUT=900000
+FP_NO_HOST_CHECK=NO
+HELIUM_CACHE_DIR=C:\DOCUME~1\varamana\LOCALS~1\Temp\2\helium\varamana
+HELIUM_HOME=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium
+HLM_ENABLE_MEM_TRACING=1
+HLM_MEM_TRACING_ANT_ARGS= -listener com.nokia.ant.listener.TracingLogger
+HOME=h:\
+HOMEDRIVE=C:
+HOMEPATH=\Documents and Settings\varamana
+include=C:\apps\msvc6\VC98\ATL\INCLUDE;C:\apps\msvc6\VC98\INCLUDE;C:\apps\msvc6\VC98\MFC\INCLUDE;C:\apps\msvc6\VC98\atl\include;C:\apps\msvc6\VC98\mfc\include;C:\apps\msvc6\VC98\include
+INTERNAL_DATA_ANT_ARGS= -listener com.nokia.ant.listener.internaldata.Listener
+JAVA_1_3_1_HOME=C:\APPS\j2sdk_1.3.1_06
+JAVA_HOME=C:\Apps\j2sdk_1.6.0_02
+JAVA_PATH="C:\Apps\j2sdk_1.6.0_02\bin\java"
+JEP_HOME=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\jep_1.6_2.5
+LAUNCHER=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl\lib\cruisecontrol-launcher.jar
+lib=C:\apps\msvc6\VC98\LIB;C:\apps\msvc6\VC98\MFC\LIB;C:\apps\msvc6\VC98\mfc\lib;C:\apps\msvc6\VC98\lib
+LIBDIR=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\CruiseControl\lib
+LM_LICENSE_FILE=C:\APPS\licenses\emea.dat;1700@saslmg02.nmp.nokia.com;C:\APPS\licenses\PCLint.dat;6969@saslmg04.nmp.nokia.com;
+LOGONSERVER=\\CAWDC101
+MSDevDir=C:\apps\msvc6\Common\msdev98
+MSVCDir=C:\apps\msvc6\VC98
+MSVC_ENV_BAT=c:\APPS\msvc6\VC98\Bin\VCVARS32.BAT
+MWCSym2Includes=C:\APPS\carbide\x86Build\Symbian_Support\MSL\MSL_C\MSL_Common\Include;C:\APPS\carbide\x86Build\Symbian_Support\MSL\MSL_C\MSL_Win32\Include;C:\APPS\carbide\x86Build\Symbian_Support\MSL\MSL_C\MSL_X86;C:\APPS\carbide\x86Build\Symbian_Support\MSL\MSL_C++\MSL_Common\Include;C:\APPS\carbide\x86Build\Symbian_Support\MSL\MSL_Extras\MSL_Common\Include;C:\APPS\carbide\x86Build\Symbian_Support\MSL\MSL_Extras\MSL_Win32\Include;C:\APPS\carbide\x86Build\Symbian_Support\Win32-x86 Support\Headers\Win32 SDK
+MWSym2Libraries=C:\APPS\carbide\x86Build\Symbian_Support\Win32-x86 Support\Libraries\Win32 SDK;C:\APPS\carbide\x86Build\Symbian_Support\Runtime\Runtime_x86\Runtime_Win32\Libs
+MWSym2LibraryFiles=MSL_All_MSE_Symbian_D.lib;gdi32.lib;user32.lib;kernel32.lib;
+NOKIA_LICENSE_FILE=C:\APPS\licenses\emea.dat;
+NUMBER_OF_PROCESSORS=4
+OS=Windows_NT
+Path=C:\apps\msvc6\Common\msdev98\BIN;C:\apps\msvc6\VC98\BIN;C:\apps\msvc6\Common\TOOLS\WINNT;C:\apps\msvc6\Common\TOOLS;e:\BUILD_E\ido-config-cc-svn\sbs\bin;e:\BUILD_E\slick-svn\bin;c:\ECloud\i686_win32\bin;C:\Program Files\HP\NCU;c:\apps\actperl\bin\;c:\apps\rvct22_593\bin;c:\apps\atool;\epoc32\tools;\epoc32\gcc\bin;c:\apps\ue;c:\apps\ccm65\bin;c:\apps\carbide\x86build\symbian_tools\command_line_tools;c:\apps\symdec;c:\apps\actpython\.;C:\Symbian\SITK\stat\bin;C:\Symbian\SITK;C:\Symbian\SITK\edgd\bin\;C:\Symbian\SITK\cbr;C:\Symbian\SITK\ucc\bin;C:\Symbian\SITK\ucc\SyncService\bin;C:\Symbian\SITK\ucc\TestDriverService\bin;C:\Symbian\SITK\sqlite-db-creator;C:\Symbian\SITK\testdriver\product;C:\Symbian\SITK\imgcheck;C:\Symbian\SITK\SystemModelGenerator;C:\Symbian\SITK/sbs/bin;;c:\program files\hp\ncu;c:\program files\windows resource kits\tools\;c:\eesp\system32;c:\eesp\system32\wbem;c:\apps\msvc6\common\tools\winnt;c:\apps\msvc6\common\msdev98\bin;c:\apps\msvc6\vc98\bin;c:\progra~1\winzip;c:\apps\wget;c:\apps\ant_1.7\bin;c:\apps\understand\bin\pc-win95;c:\etpwin\system32;c:\etpwin\system32\wbem;c:\apps\sbs\bin;c:\apps\pclint;c:\apps\cltools;c:\apps\codescanner;c:\apps\symrec;c:\apps\gracecli\bin;c:\apps\7zip;c:\apps\ctc;c:\apps\unzip;c:\apps\bc;c:\apps\cmt\;c:\apps\j2sdk_1.6.0_02;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\jep_1.6_2.5;\epoc32\tools;\epoc32\gcc\bin;\epoc32\tools\build;\epoc32\rombuild;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\tools\common\bin;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\unxutils;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\filedisk;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\info-zip;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\Subversion\bin;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\graphviz\bin;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\LSC_5.2;\tools;\tools\ncp_tools;C:\APPS\ctc;C:\EESP\system32;C:\EESP;C:\EESP\System32\Wbem\;C:\EESP\system32;C:\EESP;C:\EESP\System32\Wbem;C:\ETPWIN\system32;C:\ETPWIN;C:\ETPWIN\System32\Wbem
+PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.py;.pyw
+PERL=C:\APPS\actperl\bin\perl.exe
+PERL5LIB=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\tools\common\packages
+PID=8296
+ppd_tools=\tools\
+PROCESSOR_ARCHITECTURE=x86
+PROCESSOR_IDENTIFIER=x86 Family 15 Model 5 Stepping 10, AuthenticAMD
+PROCESSOR_LEVEL=15
+PROCESSOR_REVISION=050a
+ProgramFiles=C:\Program Files
+PROMPT=$P$G
+PYTHONPATH=E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\external\python\lib\2.5;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium\tools\common\python\lib;e:\BUILD_E\ido-config-cc-svn\sbs\python
+RVCT22BIN=C:\APPS\rvct22_593\bin
+RVCT22INC=C:\APPS\rvct22_593\include
+RVCT22LIB=C:\APPS\rvct22_593\lib
+RVCT22_ASMOPT=--licretry --fastlicense --sitelicense
+RVCT22_CCOPT=--licretry --fastlicense --sitelicense
+RVCT22_LINKOPT=--licretry --fastlicense --sitelicense
+SBS_HOME=e:\BUILD_E\ido-config-cc-svn\sbs
+SESSIONNAME=RDP-Tcp#22
+SIGNALING_ANT_ARGS= -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor
+SITK_PATHS=C:\Symbian\SITK\stat\bin;C:\Symbian\SITK;C:\Symbian\SITK\edgd\bin\;C:\Symbian\SITK\cbr;C:\Symbian\SITK\ucc\bin;C:\Symbian\SITK\ucc\SyncService\bin;C:\Symbian\SITK\ucc\TestDriverService\bin;C:\Symbian\SITK\sqlite-db-creator;C:\Symbian\SITK\testdriver\product;C:\Symbian\SITK\imgcheck;C:\Symbian\SITK\SystemModelGenerator;C:\Symbian\SITK/sbs/bin;
+spp_tools=\tools\
+SYMBIANBUILD_DEPENDENCYOFF=1
+SYMSEE_VERSION=9.1.0
+SystemDrive=C:
+SystemRoot=C:\EESP
+TEAM=xxxxxx
+TEMP=C:\DOCUME~1\varamana\LOCALS~1\Temp\2
+TESTED_ANT=C:\APPS\ant_1.7
+TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+TMP=C:\DOCUME~1\varamana\LOCALS~1\Temp\2
+USERDNSDOMAIN=noe.nokia.com
+USERDOMAIN=NOE
+USERNAME=varamana
+USERPROFILE=C:\Documents and Settings\varamana
+windir=C:\EESP
+_JAVACMD=C:\Apps\j2sdk_1.6.0_02\bin\java.exe
+_USE_CLASSPATH=yes
+
+x:\>emake --emake-build-label=ido_abs_tb92-nightly_5.2.33.dfs_build --emake-class=default --emake-priority=normal --emake-maxagents=0 --emake-job-limit=0 --emake-mem-limit=1000000000 --emake-history=merge --emake-annodetail=basic,history,file,waiting --emake-annofile=x:\output\logs\ido_abs_tb92-nightly_5.2.33.dfs_build.emake.anno.xml --emake-historyfile=x:/emake.data --emake-debug=g --emake-logfile=x:\output\logs\ido_abs_tb92-nightly_5.2.33.dfs_build.emake.g.dlog --emake-root=\;c:\apps;E:\BUILD_E\ido-config-cc-svn\helium-4.0.x_lat\helium --emake-autodepend=1 -k -i -f x:/dfs_build.make LOGBUILDTIME="" VERBOSE="" SAVESPACE="" dfs_build 
+WARNING EC1137: Unrecognized option '--no-print-directory' in EMAKEFLAGS.
+Starting build: 50896
+WARNING EC1137: Unrecognized option '--no-print-directory' in EMAKEFLAGS.
+===-------------------------------------------------
+=== dfs_build
+===-------------------------------------------------
+=== dfs_build started Thu Jul  2 13:13:58 2009
+emake -f dfs_build.make dfs_build-bldmake_bldfiles
+make[1]: Entering directory `x:/'
+=== dfs_build == \sf/os/graphics/group
+-- bldmake bldfiles 
+++ Started at Thu Jul  2 13:13:58 2009
++++ HiRes Start 1246536838.91662
+cd \sf/os/graphics/group && bldmake bldfiles   -keepgoing   
++++ HiRes End 1246536840.97909
+++ Finished at Thu Jul  2 13:14:01 2009
+=== dfs_build == \sf/os/textandloc/group
+-- bldmake bldfiles 
+++ Started at Thu Jul  2 13:13:58 2009
++++ HiRes Start 1246536839.05724
+cd \sf/os/textandloc/group && bldmake bldfiles   -keepgoing   
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
+WARNING: Should install MSVC6 Service Pack 3
++++ HiRes End 1246536842.55719
+++ Finished at Thu Jul  2 13:14:02 2009
+make[1]: Leaving directory `x:/'
+emake -f dfs_build.make dfs_build-abld_export
+make[1]: Entering directory `x:/'
+=== dfs_build == \sf/os/graphics/group
+-- abld export 
+++ Started at Thu Jul  2 13:14:02 2009
++++ HiRes Start 1246536843.01031
+cd \sf/os/graphics/group && abld export   -keepgoing   
+  emake -r  -k -f "\EPOC32\BUILD\sf\os\graphics\group\EXPORT.make" EXPORT VERBOSE=-s KEEPGOING=-k
+make[2]: Entering directory `X:/sf/os/graphics/group'
+copy "\sf\os\graphics\graphics_plat\openvg_binding_api\inc\vg\vgcontext.h" "\epoc32\include\platform\vg\vgcontext.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphics_plat\openvg_binding_api\inc\vg\vgcontext_symbian.h" "\epoc32\include\platform\vg\vgcontext_symbian.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphics_plat\m3g_core_api\inc\M3G\m3g_core.h" "\epoc32\include\platform\M3G\m3g_core.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\3d_opengl_es_1_1\group\opengles_nokia.iby" "\epoc32\rom\include\opengles_nokia.iby"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\2d_openvg_1_1\rom\openvg_nokia.iby" "\epoc32\rom\include\core\os\openvg_nokia.iby"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\group\egl_sw_gce.iby" "\epoc32\rom\include\egl_sw_gce.iby"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\group\egl_sw_nongce.iby" "\epoc32\rom\include\egl_sw_nongce.iby"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\products\egl\3.0\include\eglInternalApi.h" "\epoc32\include\platform\eglInternalApi.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\products\egl\3.0\include\oglcontextapi.h" "\epoc32\include\platform\oglContextApi.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\products\egl\3.0\include\ovgContextApi.h" "\epoc32\include\platform\ovgContextApi.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\products\egl\3.0\include\EGL\eglWrapper.h" "\epoc32\include\platform\EGL\eglWrapper.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\products\egl\3.0\src\symbian\eglsymbianpaniccodes.h" "\epoc32\include\platform\eglsymbianpaniccodes.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\libs\hg\3.1\hgDefs.h" "\epoc32\include\platform\hgDefs.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\egl\implementation\libs\hg\3.1\hgPublicDefs.h" "\epoc32\include\platform\hgPublicDefs.h"
+        1 file(s) copied.
+copy "\sf\os\graphics\graphicsaccelaration\vgi\rom\libvgi.iby" "\epoc32\rom\include\core\os\libvgi.iby"
+        1 file(s) copied.
+copy "\sf\os\graphics\m3g\m3gcore11\rom\m3gcore.iby" "\epoc32\rom\include\core\os\m3gcore.iby"
+        1 file(s) copied.
+make[2]: Leaving directory `X:/sf/os/graphics/group'
++++ HiRes End 1246536843.8853
+++ Finished at Thu Jul  2 13:14:03 2009
+=== dfs_build == \sf/os/textandloc/group
+-- abld export 
+++ Started at Thu Jul  2 13:14:02 2009
++++ HiRes Start 1246536843.04156
+cd \sf/os/textandloc/group && abld export   -keepgoing   
+  emake -r  -k -f "\EPOC32\BUILD\sf\os\textandloc\group\EXPORT.make" EXPORT VERBOSE=-s KEEPGOING=-k
+make[2]: Entering directory `X:/sf/os/textandloc/group'
+Creating \sf\os\textandloc\inc
+copy "\sf\os\textandloc\textandloc_plat\findutil_api\inc\FindUtil.h" "\epoc32\include\platform\FindUtil.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_plat\japanese_language_utilities_api\inc\jplangutil.h" "\epoc32\include\platform\mw\jplangutil.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_plat\character_conversion_nonpublic_api\inc\JapaneseCharConv.h" "\epoc32\include\platform\JapaneseCharConv.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_plat\sortutil_api\inc\SortUtil.h" "\epoc32\include\platform\SortUtil.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\GBK.H" "\epoc32\include\GBK.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\JISX0208.H" "\epoc32\include\JISX0208.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\GB2312.H" "\epoc32\include\GB2312.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\CharacterSetConverter.h" "\epoc32\include\CharacterSetConverter.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\CONVDATA.H" "\epoc32\include\CONVDATA.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\JISX0201.H" "\epoc32\include\JISX0201.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\UTF.H" "\epoc32\include\UTF.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\JISX0212.H" "\epoc32\include\JISX0212.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\CharacterSetConverter.inl" "\epoc32\include\CharacterSetConverter.inl"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\BIG5.H" "\epoc32\include\BIG5.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\CONVNAMES.H" "\epoc32\include\CONVNAMES.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\CHARCONV.H" "\epoc32\include\CHARCONV.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_api\inc\SHIFTJIS.H" "\epoc32\include\SHIFTJIS.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_plugin_provider_api\inc\CONVUTILS.H" "\epoc32\include\CONVUTILS.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\character_conversion_plugin_provider_api\inc\CONVGENERATEDCPP.H" "\epoc32\include\CONVGENERATEDCPP.H"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\directory_localizer_api\inc\DirectoryLocalizer.rh" "\epoc32\include\mw\DirectoryLocalizer.rh"
+        1 file(s) copied.
+copy "\sf\os\textandloc\textandloc_pub\directory_localizer_api\inc\CDirectoryLocalizer.h" "\epoc32\include\mw\CDirectoryLocalizer.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\localizer\rom\DirectoryLocalizer.iby" "\epoc32\rom\include\core\mw\directorylocalizer.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\localizer\rom\DirectoryLocalizerResources.iby" "\epoc32\rom\include\language\mw\directorylocalizerresources.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\localizer\loc\DirectoryLocalizer.loc" "\epoc32\include\platform\mw\loc\sc\directorylocalizer.loc"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1250.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1250.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1251.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1251.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1252.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1252.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1253.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1253.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1254.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1254.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1255.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1255.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1256.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1256.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1257.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1257.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win874.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win874.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\TIS_620.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\TIS_620.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\KOI8U.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\KOI8U.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\KOI8R.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\KOI8R.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1258.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\Win1258.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\iscii.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\iscii.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\EUCKR.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\EUCKR.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\iso2022kr.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\iso2022kr.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\ksc5601.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\ksc5601.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1250.snm" "\epoc32\data\z\Resource\charconv\Win1250.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1251.snm" "\epoc32\data\z\Resource\charconv\Win1251.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1252.snm" "\epoc32\data\z\Resource\charconv\Win1252.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1253.snm" "\epoc32\data\z\Resource\charconv\Win1253.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1254.snm" "\epoc32\data\z\Resource\charconv\Win1254.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1255.snm" "\epoc32\data\z\Resource\charconv\Win1255.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1256.snm" "\epoc32\data\z\Resource\charconv\Win1256.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1257.snm" "\epoc32\data\z\Resource\charconv\Win1257.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win874.snm" "\epoc32\data\z\Resource\charconv\Win874.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\TIS_620.snm" "\epoc32\data\z\Resource\charconv\TIS_620.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\KOI8U.snm" "\epoc32\data\z\Resource\charconv\KOI8U.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\KOI8R.snm" "\epoc32\data\z\Resource\charconv\KOI8R.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\Win1258.snm" "\epoc32\data\z\Resource\charconv\Win1258.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\iscii.snm" "\epoc32\data\z\Resource\charconv\iscii.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\EUCKR.snm" "\epoc32\data\z\Resource\charconv\EUCKR.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\iso2022kr.snm" "\epoc32\data\z\Resource\charconv\iso2022kr.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\Data\ksc5601.snm" "\epoc32\data\z\Resource\charconv\ksc5601.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\rom\CharConvPlugin.iby" "\epoc32\rom\include\core\mw\charconvplugin.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\rom\CharConvPluginPictograph.IBY" "\epoc32\rom\include\core\mw\charconvpluginpictograph.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\rom\CharConvPluginPictograph_Variant.iby" "\epoc32\rom\include\customer\mw\charconvpluginpictograph_Variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconvplugin\rom\CharConvPlugin_Variant.IBY" "\epoc32\rom\include\customer\mw\charconvplugin_Variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\findutil\rom\Findutil.iby" "\epoc32\rom\include\core\mw\findutil.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\findutil\rom\Findutil_Variant.iby" "\epoc32\rom\include\customer\mw\findutil_Variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\numbergrouping\rom\NumberGrouping.iby" "\epoc32\rom\include\core\mw\numbergrouping.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\numbergrouping\conf\numbergrouping.confml" "\epoc32\rom\config\confml_data\s60\numbergrouping.confml"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\numbergrouping\conf\numbergrouping_101F8775.crml" "\epoc32\rom\config\confml_data\s60\numbergrouping_101F8775.crml"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\gamerecognizer\rom\GameRecognizer.iby" "\epoc32\rom\include\core\mw\gamerecognizer.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\jplangutil\rom\JPLangUtil.iby" "\epoc32\rom\include\core\mw\jplangutil.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\sortutil\rom\Sortutil.iby" "\epoc32\rom\include\core\mw\sortutil.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\sortutil\rom\SortUtil_Variant.iby" "\epoc32\rom\include\customer\mw\sortutil_Variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\aknjapanesereading\rom\AknJapaneseReading.iby" "\epoc32\rom\include\core\mw\aknjapanesereading.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CNVTOOL.BAT" "\epoc32\tools\CNVTOOL.BAT"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\SNMTOOL.BAT" "\epoc32\tools\SNMTOOL.BAT"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CHARCONV.BAT" "\epoc32\tools\CHARCONV.BAT"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CHARCONV.PL" "\epoc32\tools\CHARCONV.PL"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CNVTOOL.PL" "\epoc32\tools\CNVTOOL.PL"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\SNMTOOL.PL" "\epoc32\tools\SNMTOOL.PL"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\PARSER.PM" "\epoc32\tools\PARSER.PM"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\WRITER.PM" "\epoc32\tools\WRITER.PM"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\UTF.PM" "\epoc32\tools\UTF.PM"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CHARCONV_EXE.IPR" "\epoc32\engdoc\tools\CHARCONV_EXE.IPR"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CHARCONV_PERLTOOLS.IPR" "\epoc32\engdoc\tools\CHARCONV_PERLTOOLS.IPR"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CNVAPI.RTF" "\epoc32\engdoc\charconv\CNVAPI.RTF"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\CNVTOOL.RTF" "\epoc32\engdoc\charconv\CNVTOOL.RTF"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\SNMTOOL.RTF" "\epoc32\engdoc\charconv\SNMTOOL.RTF"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\group\AUTODETECT.RTF" "\epoc32\engdoc\charconv\AUTODETECT.RTF"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\big5.dat" "\epoc32\tools\charconv\big5.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\cp1252.dat" "\epoc32\tools\charconv\cp1252.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\gb12345.dat" "\epoc32\tools\charconv\gb12345.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\gb2312.dat" "\epoc32\tools\charconv\gb2312.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\gbk.dat" "\epoc32\tools\charconv\gbk.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88591.dat" "\epoc32\tools\charconv\iso88591.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso885910.dat" "\epoc32\tools\charconv\iso885910.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso885913.dat" "\epoc32\tools\charconv\iso885913.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso885914.dat" "\epoc32\tools\charconv\iso885914.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso885915.dat" "\epoc32\tools\charconv\iso885915.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88592.dat" "\epoc32\tools\charconv\iso88592.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88593.dat" "\epoc32\tools\charconv\iso88593.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88594.dat" "\epoc32\tools\charconv\iso88594.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88595.dat" "\epoc32\tools\charconv\iso88595.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88596.dat" "\epoc32\tools\charconv\iso88596.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88597.dat" "\epoc32\tools\charconv\iso88597.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88598.dat" "\epoc32\tools\charconv\iso88598.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\iso88599.dat" "\epoc32\tools\charconv\iso88599.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\shiftjis.dat" "\epoc32\tools\charconv\shiftjis.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\shiftjisdirectmap.dat" "\epoc32\tools\charconv\shiftjisdirectmap.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\gsm7_turkish_single.dat" "\epoc32\tools\charconv\gsm7_turkish_single.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\turkish_locking_gsm7ext.dat" "\epoc32\tools\charconv\turkish_locking_gsm7ext.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\generateddat\turkish_locking_single.dat" "\epoc32\tools\charconv\turkish_locking_single.dat"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\include\PictographObserver.h" "\sf\os\textandloc\inc\PictographObserver.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\include\CnvPictographShared.h" "\sf\os\textandloc\inc\CnvPictographShared.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\include\CnvShiftJisDirectmap.h" "\sf\os\textandloc\inc\CnvShiftJisDirectmap.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\snm\basic.snm" "\epoc32\release\winscw\udeb\z\Resource\charconv\basic.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\data\snm\basic.snm" "\epoc32\data\z\Resource\charconv\basic.snm"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV.IBY" "\epoc32\rom\include\core\mw\charconv.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_CHINESE_SIMPLFIED.IBY" "\epoc32\rom\include\customer\mw\charconv_chinese_simplfied.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_CHINESE_TRADITIONAL.IBY" "\epoc32\rom\include\customer\mw\charconv_chinese_traditional.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_CODEPAGE.iby" "\epoc32\rom\include\core\mw\charconv_codepage.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_ISO8859X.IBY" "\epoc32\rom\include\core\mw\charconv_iso8859x.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_JAPANESE.IBY" "\epoc32\rom\include\customer\mw\charconv_japanese.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\Charconv_Pictographs_Variant.Iby" "\epoc32\rom\include\customer\mw\charconv_pictographs_variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\charconv_gsm7_turkish_Variant.iby" "\epoc32\rom\include\customer\mw\charconv_gsm7_turkish_Variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\charconv_gsm7_turkish_Variant.iby" "\epoc32\rom\include\charconv_gsm7_turkish_Variant.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV.IBY" "\epoc32\rom\include\charconv.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CharConv_All_Plugins.iby" "\epoc32\rom\include\charconv_all_plugins.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_CHINESE_SIMPLFIED.IBY" "\epoc32\rom\include\charconv_chinese_simplfied.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_CHINESE_TRADITIONAL.IBY" "\epoc32\rom\include\charconv_chinese_traditional.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_JAPANESE.IBY" "\epoc32\rom\include\charconv_japanese.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_CODEPAGE.iby" "\epoc32\rom\include\charconv_codepage.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\CHARCONV_ISO8859X.IBY" "\epoc32\rom\include\charconv_iso8859x.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\charconv\ongoing\rom\charconv_gsm7_turkish.iby" "\epoc32\rom\include\charconv_gsm7_turkish.iby"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\inlinetext\inc\inlinetextbase.h" "\epoc32\include\platform\mw\inlinetextbase.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\inlinetext\inc\inlinetextcompositesource.h" "\epoc32\include\platform\mw\inlinetextcompositesource.h"
+        1 file(s) copied.
+copy "\sf\os\textandloc\charconvfw\inlinetext\inc\inlinetextnomatchesindicatorsource.h" "\epoc32\include\platform\mw\inlinetextnomatchesindicatorsource.h"
+        1 file(s) copied.
+make[2]: Leaving directory `X:/sf/os/textandloc/group'
++++ HiRes End 1246536844.10405
+++ Finished at Thu Jul  2 13:14:04 2009
+make[1]: Leaving directory `x:/'
+emake -f dfs_build.make dfs_build-abld_makefile-tools
+make[1]: Entering directory `x:/'
+=== dfs_build == \sf/os/graphics/group
+-- abld makefile 
+++ Started at Thu Jul  2 13:14:05 2009
++++ HiRes Start 1246536845.63642
+cd \sf/os/graphics/group && abld makefile   -keepgoing   tools
+This project does not support platform or  program "TOOLS"
++++ HiRes End 1246536847.1364
+++ Finished at Thu Jul  2 13:14:07 2009
+=== dfs_build == \sf/os/textandloc/group
+-- abld makefile 
+++ Started at Thu Jul  2 13:14:05 2009
++++ HiRes Start 1246536845.6208
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/functionality/func_add_test.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,220 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : func_add_test.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-metadata-regex" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib metadata unittests.</description>
+    
+    <dirname property="project.dir" file="${ant.file.test-metadata-regex}" />
+
+    <path id="lib.path">
+        <fileset dir="${project.dir}/../../../bin" includes="*.jar"/>
+    </path>
+    
+    <taskdef resource="com/nokia/helium/metadata/ant/antlib.xml" classpathref="lib.path" uri="http://www.nokia.com/helium" />
+    <taskdef name="fmpp" classname="fmpp.tools.AntTask" classpathref="lib.path" onerror="report"/>
+
+
+    <hlm:metadatafilterset id="all-regex-filterfile">
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+    <target name="s60-clean-log">
+        <delete file="${project.dir}/../output/log_s60_filterfile.sqlite" failonerror="false"/>
+        <echo message="all regular expression validation" />
+        <echo message="database:${project.dir}/../output/log_s60_filterfile.sqlite" />
+        <hlm:metadatarecord database="${project.dir}/../output/log_s60_filterfile.sqlite">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="S60*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+
+    <hlm:metadatafilterset id="text_log_metadata_input">
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+
+    <target name="log_metadata_input">
+        <delete file="${project.dir}/../output/log_text_metadata_input.sqlite" failonerror="false" />
+        <echo message="text log metadata input validation" />
+        <echo message="database:${project.dir}/../output/log_text_metadata_input.sqlite" />
+        <hlm:metadatarecord database="${project.dir}/../output/log_text_metadata_input.sqlite">
+            <hlm:textmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*_fixslashes*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+    <target name="parallel_record_test">
+        <!-- <delete file="${project.dir}/../output/s60_parallel.sqlite" failonerror="false" /> -->
+        <!-- 
+        <parallel>
+            <sequential>
+                <echo message="sbs parallel input validation" />
+                <echo message="database:${project.dir}/../output/s60_parallel.db" />
+                <hlm:metadatarecord database="${project.dir}/../output/s60_parallel.sqlite">
+                    <hlm:sbsmetadatainput>
+                        <fileset dir="${project.dir}/../data/">
+                            <include  name="*s60_1.log"/>
+                        </fileset>
+                        <metadatafilterset refid="text_log_metadata_input" />
+                    </hlm:sbsmetadatainput>
+                </hlm:metadatarecord>
+            </sequential>
+            <sequential>
+                <echo message="sbs parallel input validation" />
+                <echo message="database:${project.dir}/../output/s60_parallel.sqlite" />
+                <hlm:metadatarecord database="${project.dir}/../output/s60_parallel.sqlite">
+                    <hlm:sbsmetadatainput>
+                        <fileset dir="${project.dir}/../data/">
+                            <include  name="*s60_2.log"/>
+                        </fileset>
+                        <metadatafilterset refid="text_log_metadata_input" />
+                    </hlm:sbsmetadatainput>
+                </hlm:metadatarecord>
+            </sequential>
+            <sequential>
+                <echo message="sbs parallel input validation" />
+                <echo message="database:${project.dir}/../output/s60_parallel.sqlite" />
+                <hlm:metadatarecord database="${project.dir}/../output/s60_parallel.sqlite">
+                    <hlm:sbsmetadatainput>
+                        <fileset dir="${project.dir}/../data/">
+                            <include  name="*s60_3.log"/>
+                        </fileset>
+                        <metadatafilterset refid="text_log_metadata_input" />
+                    </hlm:sbsmetadatainput>
+                </hlm:metadatarecord>
+            </sequential>
+        </parallel> -->
+        <fmpp sourceFile="${project.dir}/../../src/templates/scan2.html.ftl"
+                     outputfile="${project.dir}/../output/s60_scan2.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${project.dir}/../output/s60_parallel.sqlite
+                doc: xml(${project.dir}/../data/s60_info.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <hlm:generateBuildStatus dbfile="${project.dir}/../output/s60_parallel.sqlite" output-dir="${env.TEMP}" file="test-scanlog-metadata-1.log"/>
+    </target>
+
+
+    <target name="all_ido_logs">
+        <delete file="${project.dir}/../output/all_ido_logs.sqlite" failonerror="false" />
+        <echo message="text log metadata input validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/all_ido_logs.sqlite">
+            <hlm:textmetadatainput>
+                <fileset dir="${project.dir}/../data/ido_logs">
+                    <include  name="*.log"/>
+                    <exclude name="*_ant_*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:textmetadatainput>
+            <hlm:antmetadatainput>
+                <fileset dir="${project.dir}/../data/ido_logs">
+                    <include  name="*_ant_*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:antmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+    <target name="abld_ido_logs">
+        <delete file="${project.dir}/../output/abld_ido_logs.sqlite" failonerror="false" />
+        <echo message="text log metadata input validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/abld_ido_logs.sqlite">
+            <hlm:abldmetadatainput>
+                <fileset dir="${project.dir}/../data/ido_abld_logs">
+                    <include  name="*_compile*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+    <target name="ant_ido_logs">
+        <delete file="${project.dir}/../output/ant_ido_logs.sqlite" failonerror="false" />
+        <echo message="text log metadata input validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/ant_ido_logs.sqlite">
+            <hlm:antmetadatainput>
+                <fileset dir="${project.dir}/../data/ido_logs">
+                    <include  name="*_ant_*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:antmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+    <target name="readdata">
+        <delete file="${project.dir}/../output/readdata.html" failonerror="false" />
+        <fmpp sourceFile="${project.dir}/../../src/templates/readdata.xml.ftl"
+                     outputfile="${project.dir}/../output/readdata.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${project.dir}/../output/log_text_metadata_input.sqlite
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+    <target name="generate-summary">
+        <delete file="${project.dir}/../output/summary.html" failonerror="false" />
+        <fmpp sourceFile="${project.dir}/../../src/templates/summary.html.ftl"
+                     outputfile="${project.dir}/../output/summary.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${project.dir}/../output/all_ido_logs.sqlite
+                loginfo: xml(${project.dir}/../data/ido_logs/IDO_lcdo_tb92-ci_MCL.92.64_info.log.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+    <target name="generate-cc-summary">
+        <property name="build.id" value="100.test" />
+        <delete file="${project.dir}/../output/cc-summary.html" failonerror="false" />
+        <fmpp sourceFile="${project.dir}/../../src/templates/cc_summary.html.ftl"
+                     outputfile="${project.dir}/../output/cc-summary.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${project.dir}/../output/all_ido_logs.sqlite
+                loginfo: xml(${project.dir}/../data/ido_logs/IDO_lcdo_tb92-ci_MCL.92.64_info.log.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/functionality/test_regex.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,416 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_regex.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-metadata-regex" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib metadata unittests.</description>
+
+    <property environment="env" />
+    
+    <dirname property="project.dir" file="${ant.file.test-metadata-regex}" />
+
+    <path id="lib.path">
+        <fileset dir="${project.dir}/../../../bin" includes="*.jar"/>
+    </path>
+    
+    <taskdef resource="com/nokia/helium/metadata/ant/antlib.xml" classpathref="lib.path" uri="http://www.nokia.com/helium" />
+    <taskdef name="fmpp" classname="fmpp.tools.AntTask" classpathref="lib.path" onerror="report"/>
+
+    <property name="metadata-filterfile" value="${project.dir}/../data/common.csv"/>
+    <property name="metadata-log-files" value="${project.dir}/../data/*.log"/>
+    
+    <hlm:metadatafilterset id="all-regex-filterfile">
+        <metadatafilterset filterfile="${metadata-filterfile}" />
+    </hlm:metadatafilterset>
+
+
+    <!-- Check for all the regular expression defined in the filter file,
+    The log file contains text for matching regular expression.
+    -->
+    <target name="test-all-regex-filterfile">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_all_filterfile.sqlite"/>
+        <delete file="${metadata-read-db}" failonerror="false"/>
+        <echo message="all regular expression validation" />
+        <echo message="database:${metadata-read-db}" />
+        <!-- do some checks that files are present and raise asserts if not present-->
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+        
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*regex*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+
+        <!-- check we have created the DB file-->
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} metadata DB file was not created"/>
+    </target>
+
+    <!-- To verify some lengthy text for recipe tag from 
+    sbs metadata input.
+    -->
+    <target name="test-receipe-lengthy-text">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_lengthy_text.sqlite"/>
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <delete file="${metadata-read-db}" failonerror="false"/>
+        <echo message="all regular expression validation" />
+        <echo message="database:${metadata-read-db}" />
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="receipe*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} metadata DB file was not created"/>
+    </target>
+
+    <!--modify the errors so regex=".*warning U4010" description="mingw error" is no longer 
+    an error but a warning-->
+    <hlm:metadatafilterset id="all-regex-combined">
+        <metadatafilter priority="WARNING" regex=".*warning U4010" description="mingw error" />
+        <metadatafilterset filterfile="${metadata-filterfile}" />
+    </hlm:metadatafilterset>
+
+    <property name="metadata-all-db" value="${project.dir}/../output/log_all_combined.sqlite"/>
+
+    <target name="test-all-regex-combined">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_all_combined.sqlite"/>
+        <delete file="${metadata-read-db}" failonerror="false" />
+        <echo message="all regular expression validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*regex*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-combined" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+    </target>
+
+
+    <property name="metadata-error-db" value="${project.dir}/../output/log_error_combined.sqlite"/>
+
+    <!--create an invalid priority type, so contains message invalid 
+    priority and set to error as priority -->
+    <hlm:metadatafilterset id="all-regex-combined-error">
+        <metadatafilter priority="INCORRECT" regex=".*warning U4010" description="test error handling so incorrect priority" />
+        <metadatafilterset filterfile="${metadata-filterfile}" />
+    </hlm:metadatafilterset>
+
+    <!--create an invalid priority type, which contains warning invalid priority 
+    and continues with other data. 
+    -->
+    <target name="test-all-regex-combined-error">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_error_combined.sqlite"/>
+        <delete file="${metadata-read-db}" failonerror="false" />
+        <echo message="all regular expression validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}" >
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*regex*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-combined-error" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <!-- no need to check the DB file not present as it won't be-->
+    </target>
+
+    <!--try to add a different different filter type but not add the parameter so has an error-->
+    <hlm:metadatafilterset id="all-regex-combined-no-priority">
+        <metadatafilter regex=".*warning U4010" description="test error handling so incorrect priority" />
+        <metadatafilterset filterfile="${metadata-filterfile}" />
+    </hlm:metadatafilterset>
+
+    <!--try to add a different different filter type but not add the parameter so has an error-->
+    <target name="test-all-regex-combined-no-priority">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_error_combined.sqlite"/>
+        <delete file="${metadata-read-db}" failonerror="false" />
+        <echo message="all regular expression validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*regex*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-combined-no-priority" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <!-- no need to check the DB file not present as it won't be-->
+    </target>
+
+    <!--try to add a different different filter type but not add the parameter so has an error-->
+    <hlm:metadatafilterset id="all-regex-combined-no-regex">
+        <metadatafilter priority="INCORRECT" description="test error handling so incorrect priority" />
+        <metadatafilter priority="WARNING" description="test error handling so incorrect priority" />
+        <metadatafilterset filterfile="${metadata-filterfile}" />
+    </hlm:metadatafilterset>
+
+    <!--try to add a different different filter type but not add the parameter so has an error-->
+    <target name="test-all-regex-combined-no-regex">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_error_combined.sqlite"/>
+        <delete file="${metadata-read-db}" failonerror="false" />
+        <echo message="all regular expression validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*regex*.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-combined-no-regex" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <!-- no need to check the DB file not present as it won't be-->
+    </target>
+
+    <hlm:metadatafilterset id="text_log_metadata_input">
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+    <target name="test-text_log_metadata_input">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_text_metadata_input.sqlite"/>
+        <delete file="${metadata-read-db}" failonerror="false" />
+        <echo message="text log metadata input validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:textmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*_fixslashes*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+    </target>
+
+    <hlm:metadatafilterset id="abld_log_metadata_input">
+        <metadatafilter priority="WARNING" regex=".*warning U4010" description="mingw error" />
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+
+    <target name="test-abld_log_metadata_input">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_abld_metadata_input.sqlite"/>
+        <delete file="${project.dir}/../output/log_abld_metadata_input.sqlite" failonerror="false" />
+        <echo message="abld log metadata input validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:abldmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*sample_abld.log"/>
+                </fileset>
+                <metadatafilterset refid="abld_log_metadata_input" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+    </target>
+
+
+    <target name="test-policy_metadata_input">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_policy_metadata_input.sqlite"/>
+        <delete file="${metadata-policy-db}" failonerror="false" />
+        <echo message="policy metadata input validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:policymetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*policy*.log"/>
+                </fileset>
+            </hlm:policymetadatainput>
+        </hlm:metadatarecord>
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+    </target>
+
+    <hlm:metadatafilterset id="ant_log_metadata_input">
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+
+    <target name="test-ant_log_metadata_input">
+        <property name="metadata-read-db" value="${project.dir}/../output/log_ant_metadata_input.sqlite"/>
+        <delete file="${metadata-ant-db}" failonerror="false" />
+        <echo message="ant log metadata input validation" />
+        <echo message="database:${metadata-read-db}" />
+        <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
+        <mkdir dir="${project.dir}/../output"/>
+
+        <hlm:metadatarecord database="${metadata-read-db}">
+            <hlm:antmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*ant*.log"/>
+                </fileset>
+                <metadatafilterset refid="ant_log_metadata_input" />
+            </hlm:antmetadatainput>
+        </hlm:metadatarecord>
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+    </target>
+
+    <property name="metadata-read-ftl" value="${project.dir}/../../src/templates/readdata.xml.ftl"/>
+    <property name="metadata-read-output" value="${project.dir}/../output/readdata.html"/>
+
+    <target name="test-readdata" depends="test-text_log_metadata_input" >
+        <property name="metadata-template-dir" value="${project.dir}/../../src/templates/" />
+        <property name="metadata-output-dir" value="${project.dir}/../output" />
+        <property name="metadata-read-ftl" value="${metadata-template-dir}/readdata.xml.ftl"/>
+        <property name="metadata-read-db" value="${metadata-output-dir}/log_text_metadata_input.sqlite"/>
+        <property name="metadata-read-output" value="${metadata-output-dir}/readdata.html"/>
+        <delete file="${metadata-read-output}" failonerror="false" />
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+        <fmpp sourceFile="${metadata-template-dir}/readdata.xml.ftl"
+                     outputfile="${metadata-output-dir}/readdata.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${metadata-read-db}
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <fmpp sourceFile="${metadata-template-dir}/build_status.xml.ftl"
+                     outputfile="${metadata-output-dir}/build_status.xml">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${metadata-read-db}
+                logfile: ido_abs_mcl_devlon70_robot_MCL.70.500_fixslashes_raptor.log
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <fmpp sourceFile="${metadata-template-dir}/email_new.html.ftl"
+                     outputfile="${metadata-output-dir}/build_status.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${metadata-read-db}
+                logfile: ido_abs_mcl_devlon70_robot_MCL.70.500_fixslashes_raptor.log
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <au:assertFileExists file="${metadata-read-output}" message="${metadata-read-output} DB file was not created"/>
+    </target>
+
+
+    <target name="test-generate-summary" depends="test-text_log_metadata_input">
+        <property name="metadata-summary-ftl" value="${project.dir}/../../src/templates/summary.html.ftl"/>
+        <property name="metadata-summary-output" value="${project.dir}/../output/summary.html"/>
+        <property name="metadata-output-dir" value="${project.dir}/../output/" />
+        <delete file="${metadata-summary-output}" failonerror="false" />
+        <property name="metadata-read-db" value="${metadata-output-dir}/log_text_metadata_input.sqlite"/>
+        
+        <fmpp sourceFile="${metadata-summary-ftl}"
+                     outputfile="${metadata-summary-output}">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${metadata-read-db}
+                loginfo: xml(${project.dir}/../data/ido_abs_mcl_devlon70_robot_MCL.70.500_info.log)
+                ant: antProperties()
+            </data>
+        </fmpp>
+        
+        <!-- check we have created the files -->
+        <au:assertFileExists file="${metadata-read-db}" message="${metadata-read-db} DB file was not created"/>
+        <au:assertFileExists file="${metadata-summary-output}" message="${metadata-summary-output} summary output file was not created"/>
+    </target>
+    
+    <target name="test-countseverity">
+        <delete file="${project.dir}/../output/dp.sqlite" failonerror="false" />
+
+        <hlm:metadatarecord database="${project.dir}/../output/dp.sqlite">
+            <hlm:textmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="*_fixslashes*.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+
+        <hlm:metadataCountSeverity severity="error" log="_fixslashes_raptor.log" db="${project.dir}/../output/dp.sqlite" property="errors"/>
+        <au:assertTrue>
+            <equals arg1="${errors}" arg2="24"/>
+        </au:assertTrue>
+        <au:assertTrue>
+            <hlm:metadataHasSeverity severity="error" log="_fixslashes_raptor.log" db="${project.dir}/../output/dp.sqlite" />
+        </au:assertTrue>
+        <au:assertFalse>
+            <hlm:metadataHasSeverity severity="fatal" log="_fixslashes_raptor.log" db="${project.dir}/../output/dp.sqlite" />
+        </au:assertFalse>
+        
+        <hlm:metadatarecord database="${project.dir}/../output/dp.sqlite">
+            <hlm:textmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include name="dp.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        
+        <hlm:metadataCountSeverity severity="error" log="dp.log" db="${project.dir}/../output/dp.sqlite" property="errors2"/>
+        <au:assertTrue>
+            <equals arg1="${errors2}" arg2="1"/>
+        </au:assertTrue>
+        <au:assertTrue>
+            <hlm:metadataHasSeverity severity="error" log="dp.log" db="${project.dir}/../output/dp.sqlite" />
+        </au:assertTrue>
+        <au:assertFalse>
+            <hlm:metadataHasSeverity severity="fatal" log="dp.log" db="${project.dir}/../output/dp.sqlite" />
+        </au:assertFalse>
+    </target>
+    
+    <target name="test-metadata-ant" depends="test-ant_log_metadata_input, test-readdata,test-generate-summary  " />
+    <target name="test-metadata-abld" depends="test-abld_log_metadata_input, test-readdata,test-generate-summary  " />
+    <target name="test-metadata-policy" depends="test-policy_metadata_input, test-readdata,test-generate-summary  " />
+    <target name="test-metadata-text" depends="test-text_log_metadata_input, test-readdata,test-generate-summary  " />
+    <target name="test-metadata-all" depends="test-all-regex-filterfile, test-readdata,test-generate-summary  " />
+    <target name="test-metadata-combine" depends="test-all-regex-combined, test-readdata,test-generate-summary  " />
+           
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/output.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1336 @@
+Buildfile: functionality\test_regex.ant.xml
+
+test-readdata:
+     [fmpp] args.size:1
+     [fmpp] arg-list:E:\Build_E\eclipse_fasym013\helium-antlib-trunk\sf\metadata\tests\functionality/../output/log_all_filterfile.db
+     [fmpp] QueryModel:select * from priority
+     [fmpp] query in SQLTemplateModelselect * from priority
+     [fmpp] QueryModel:select * from component
+     [fmpp] query in SQLTemplateModelselect * from component
+     [fmpp] QueryModel:select * from logpath
+     [fmpp] query in SQLTemplateModelselect * from logpath
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect * from priority
+     [fmpp] data:0
+     [fmpp] data:''
+     [fmpp] data:1
+     [fmpp] data:ERROR
+     [fmpp] data:2
+     [fmpp] data:WARNING
+     [fmpp] data:3
+     [fmpp] data:CRITICAL
+     [fmpp] data:4
+     [fmpp] data:REMARK
+     [fmpp] indexmap size5
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:3
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select count(logText) as COUNT from metadata_table where priority_id=3
+     [fmpp] query in SQLTemplateModelselect count(logText) as COUNT from metadata_table where priority_id=3
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=3
+     [fmpp] data:2
+     [fmpp] indexmap size1
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=3
+     [fmpp] columnName:COUNT
+     [fmpp] resultSet MetaData column Count=1
+     [fmpp] adding records
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select count(logText) as COUNT from metadata_table where priority_id=2
+     [fmpp] query in SQLTemplateModelselect count(logText) as COUNT from metadata_table where priority_id=2
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=2
+     [fmpp] data:36
+     [fmpp] indexmap size1
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=2
+     [fmpp] columnName:COUNT
+     [fmpp] resultSet MetaData column Count=1
+     [fmpp] adding records
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select count(logText) as COUNT from metadata_table where priority_id=1
+     [fmpp] query in SQLTemplateModelselect count(logText) as COUNT from metadata_table where priority_id=1
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=1
+     [fmpp] data:32
+     [fmpp] indexmap size1
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=1
+     [fmpp] columnName:COUNT
+     [fmpp] resultSet MetaData column Count=1
+     [fmpp] adding records
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select count(logText) as COUNT from metadata_table where priority_id=0
+     [fmpp] query in SQLTemplateModelselect count(logText) as COUNT from metadata_table where priority_id=0
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=0
+     [fmpp] data:0
+     [fmpp] indexmap size1
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=0
+     [fmpp] columnName:COUNT
+     [fmpp] resultSet MetaData column Count=1
+     [fmpp] adding records
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select count(logText) as COUNT from metadata_table where priority_id=4
+     [fmpp] query in SQLTemplateModelselect count(logText) as COUNT from metadata_table where priority_id=4
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=4
+     [fmpp] data:12
+     [fmpp] indexmap size1
+     [fmpp] sql queryselect count(logText) as COUNT from metadata_table where priority_id=4
+     [fmpp] columnName:COUNT
+     [fmpp] resultSet MetaData column Count=1
+     [fmpp] adding records
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:3
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select * from metadata_table where priority_id=3
+     [fmpp] query in SQLTemplateModelselect * from metadata_table where priority_id=3
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] getting records
+     [fmpp] sql queryselect * from metadata_table where priority_id=3 limit 5000 offset 0;
+     [fmpp] columnName:component_id
+     [fmpp] columnName:priority_id
+     [fmpp] columnName:logText
+     [fmpp] columnName:lineNumber
+     [fmpp] columnName:logname_id
+     [fmpp] resultSet MetaData column Count=5
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] next:count:0
+     [fmpp] logtext:next:mingw_make.exe: error
+     [fmpp] checking any more element
+     [fmpp] isDataRead:false
+     [fmpp] sql queryselect * from component
+     [fmpp] data:0
+     [fmpp] data:z:/sf/app/camera/group/bld.inf
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:1
+     [fmpp] logtext:next:mingw_make.exe: error
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select * from metadata_table where priority_id=2
+     [fmpp] query in SQLTemplateModelselect * from metadata_table where priority_id=2
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] getting records
+     [fmpp] sql queryselect * from metadata_table where priority_id=2 limit 5000 offset 0;
+     [fmpp] columnName:component_id
+     [fmpp] columnName:priority_id
+     [fmpp] columnName:logText
+     [fmpp] columnName:lineNumber
+     [fmpp] columnName:logname_id
+     [fmpp] resultSet MetaData column Count=5
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] next:count:0
+     [fmpp] logtext:next:WARNING:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:1
+     [fmpp] logtext:next:LINK : warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:2
+     [fmpp] logtext:next::10: warning: cannot find matching deallocation function
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:3
+     [fmpp] logtext:next:100) : WARNING: TEST123
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:4
+     [fmpp] logtext:next:MAKEDEF WARNING: TEST
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:5
+     [fmpp] logtext:next:TEST 123 \\(10) : Warning: (400)
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:6
+     [fmpp] logtext:next:BLDMAKE WARNING: bldm warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:7
+     [fmpp] logtext:next:MAKEDEF WARNING: make warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:8
+     [fmpp] logtext:next:atest(100) : warning C aasdfa
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:9
+     [fmpp] logtext:next:testas 100: warning: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:10
+     [fmpp] logtext:next:usage Usage Warning: warn1
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:11
+     [fmpp] logtext:next:abcd mwld.exe: abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:12
+     [fmpp] logtext:next:Command line warning abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:13
+     [fmpp] logtext:next:anything ERROR: bad relocation: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:14
+     [fmpp] logtext:next:10 warning in component1
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:15
+     [fmpp] logtext:next:EventType: Error Source: SweepNTabcde
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:16
+     [fmpp] logtext:next:WARN	test
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:17
+     [fmpp] logtext:next:abcd :10: warning: cannot find matching deallocation function 100:note abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:18
+     [fmpp] logtext:next:WARNING:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:19
+     [fmpp] logtext:next:LINK : warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:20
+     [fmpp] logtext:next::10: warning: cannot find matching deallocation function
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:21
+     [fmpp] logtext:next:100) : WARNING: TEST123
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:22
+     [fmpp] logtext:next:MAKEDEF WARNING: TEST
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:23
+     [fmpp] logtext:next:TEST 123 \\(10) : Warning: (400)
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:24
+     [fmpp] logtext:next:BLDMAKE WARNING: bldm warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:25
+     [fmpp] logtext:next:MAKEDEF WARNING: make warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:26
+     [fmpp] logtext:next:atest(100) : warning C aasdfa
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:27
+     [fmpp] logtext:next:testas 100: warning: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:28
+     [fmpp] logtext:next:usage Usage Warning: warn1
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:29
+     [fmpp] logtext:next:abcd mwld.exe: abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:30
+     [fmpp] logtext:next:Command line warning abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:31
+     [fmpp] logtext:next:anything ERROR: bad relocation: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:32
+     [fmpp] logtext:next:10 warning in component1
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:33
+     [fmpp] logtext:next:EventType: Error Source: SweepNTabcde
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:34
+     [fmpp] logtext:next:WARN	test
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:35
+     [fmpp] logtext:next:abcd :10: warning: cannot find matching deallocation function 100:note abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select * from metadata_table where priority_id=1
+     [fmpp] query in SQLTemplateModelselect * from metadata_table where priority_id=1
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] getting records
+     [fmpp] sql queryselect * from metadata_table where priority_id=1 limit 5000 offset 0;
+     [fmpp] columnName:component_id
+     [fmpp] columnName:priority_id
+     [fmpp] columnName:logText
+     [fmpp] columnName:lineNumber
+     [fmpp] columnName:logname_id
+     [fmpp] resultSet MetaData column Count=5
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] next:count:0
+     [fmpp] logtext:next:test FATAL ERROR(S):abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:1
+     [fmpp] logtext:next:): Missing file:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:2
+     [fmpp] logtext:next:abcd FLEXlm error:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:3
+     [fmpp] logtext:next:ABLD ERROR: 1234
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:4
+     [fmpp] logtext:next:BLDMAKE ERROR: 43543
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:5
+     [fmpp] logtext:next:fatal error U1077 error occured
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:6
+     [fmpp] logtext:next:test warning U4010
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:7
+     [fmpp] logtext:next:make[10]: ***abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:8
+     [fmpp] logtext:next:make[10]: abcd not remade because of errors
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:9
+     [fmpp] logtext:next:ERROR: build error
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:10
+     [fmpp] logtext:next:ERROR EC95940: ec error
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:11
+     [fmpp] logtext:next:Errors caused tool to abort. asdfasdf
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:12
+     [fmpp] logtext:next:test no rule to make target
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:13
+     [fmpp] logtext:next:ERROR,.*no rule to make.*,
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:14
+     [fmpp] logtext:next:ERROR	testing
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:15
+     [fmpp] logtext:next:"abcd , line 100: Error: 100abcd:. abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:16
+     [fmpp] logtext:next:test FATAL ERROR(S):abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:17
+     [fmpp] logtext:next:): Missing file:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:18
+     [fmpp] logtext:next:abcd FLEXlm error:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:19
+     [fmpp] logtext:next:ABLD ERROR: 1234
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:20
+     [fmpp] logtext:next:BLDMAKE ERROR: 43543
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:21
+     [fmpp] logtext:next:fatal error U1077 error occured
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:22
+     [fmpp] logtext:next:test warning U4010
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:23
+     [fmpp] logtext:next:make[10]: ***abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:24
+     [fmpp] logtext:next:make[10]: abcd not remade because of errors
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:25
+     [fmpp] logtext:next:ERROR: build error
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:26
+     [fmpp] logtext:next:ERROR EC95940: ec error
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:27
+     [fmpp] logtext:next:Errors caused tool to abort. asdfasdf
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:28
+     [fmpp] logtext:next:test no rule to make target
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:29
+     [fmpp] logtext:next:ERROR,.*no rule to make.*,
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:30
+     [fmpp] logtext:next:ERROR	testing
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:31
+     [fmpp] logtext:next:"abcd , line 100: Error: 100abcd:. abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select * from metadata_table where priority_id=0
+     [fmpp] query in SQLTemplateModelselect * from metadata_table where priority_id=0
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] getting records
+     [fmpp] sql queryselect * from metadata_table where priority_id=0 limit 5000 offset 0;
+     [fmpp] columnName:component_id
+     [fmpp] columnName:priority_id
+     [fmpp] columnName:logText
+     [fmpp] columnName:lineNumber
+     [fmpp] columnName:logname_id
+     [fmpp] resultSet MetaData column Count=5
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select * from metadata_table where priority_id=4
+     [fmpp] query in SQLTemplateModelselect * from metadata_table where priority_id=4
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] getting records
+     [fmpp] sql queryselect * from metadata_table where priority_id=4 limit 5000 offset 0;
+     [fmpp] columnName:component_id
+     [fmpp] columnName:priority_id
+     [fmpp] columnName:logText
+     [fmpp] columnName:lineNumber
+     [fmpp] columnName:logname_id
+     [fmpp] resultSet MetaData column Count=5
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] next:count:0
+     [fmpp] logtext:next:REMARK: 
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:1
+     [fmpp] logtext:next:INFO:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:2
+     [fmpp] logtext:next:anything Command line warning D4025 : test
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:3
+     [fmpp] logtext:next:REMARK: test remark anything
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:4
+     [fmpp] logtext:next:EventType: Error Source: GNU Make.
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:5
+     [fmpp] logtext:next:INFO: any info match
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:6
+     [fmpp] logtext:next:REMARK: 
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:7
+     [fmpp] logtext:next:INFO:
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:8
+     [fmpp] logtext:next:anything Command line warning D4025 : test
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:9
+     [fmpp] logtext:next:REMARK: test remark anything
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:10
+     [fmpp] logtext:next:EventType: Error Source: GNU Make.
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] next:count:11
+     [fmpp] logtext:next:INFO: any info match
+     [fmpp] checking any more element
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] indexmap size1
+     [fmpp] indexmap size1
+     [fmpp] QueryModel:0
+     [fmpp] datalist size1
+     [fmpp] QueryModel:select * from metadata_table where component_id=0 order by priority_id
+     [fmpp] query in SQLTemplateModelselect * from metadata_table where component_id=0 order by priority_id
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] getting records
+     [fmpp] sql queryselect * from metadata_table where component_id=0 order by priority_id limit 5000 offset 0;
+     [fmpp] columnName:component_id
+     [fmpp] columnName:priority_id
+     [fmpp] columnName:logText
+     [fmpp] columnName:lineNumber
+     [fmpp] columnName:logname_id
+     [fmpp] resultSet MetaData column Count=5
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] adding records
+     [fmpp] next:count:0
+     [fmpp] logtext:next:test FATAL ERROR(S):abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:1
+     [fmpp] logtext:next:): Missing file:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:2
+     [fmpp] logtext:next:abcd FLEXlm error:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:3
+     [fmpp] logtext:next:ABLD ERROR: 1234
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:4
+     [fmpp] logtext:next:BLDMAKE ERROR: 43543
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:5
+     [fmpp] logtext:next:fatal error U1077 error occured
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:6
+     [fmpp] logtext:next:test warning U4010
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:7
+     [fmpp] logtext:next:make[10]: ***abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:8
+     [fmpp] logtext:next:make[10]: abcd not remade because of errors
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:9
+     [fmpp] logtext:next:ERROR: build error
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:10
+     [fmpp] logtext:next:ERROR EC95940: ec error
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:11
+     [fmpp] logtext:next:Errors caused tool to abort. asdfasdf
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:12
+     [fmpp] logtext:next:test no rule to make target
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:13
+     [fmpp] logtext:next:ERROR,.*no rule to make.*,
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:14
+     [fmpp] logtext:next:ERROR	testing
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:15
+     [fmpp] logtext:next:"abcd , line 100: Error: 100abcd:. abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:16
+     [fmpp] logtext:next:test FATAL ERROR(S):abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:17
+     [fmpp] logtext:next:): Missing file:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:18
+     [fmpp] logtext:next:abcd FLEXlm error:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:19
+     [fmpp] logtext:next:ABLD ERROR: 1234
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:20
+     [fmpp] logtext:next:BLDMAKE ERROR: 43543
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:21
+     [fmpp] logtext:next:fatal error U1077 error occured
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:22
+     [fmpp] logtext:next:test warning U4010
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:23
+     [fmpp] logtext:next:make[10]: ***abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:24
+     [fmpp] logtext:next:make[10]: abcd not remade because of errors
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:25
+     [fmpp] logtext:next:ERROR: build error
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:26
+     [fmpp] logtext:next:ERROR EC95940: ec error
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:27
+     [fmpp] logtext:next:Errors caused tool to abort. asdfasdf
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:28
+     [fmpp] logtext:next:test no rule to make target
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:29
+     [fmpp] logtext:next:ERROR,.*no rule to make.*,
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:30
+     [fmpp] logtext:next:ERROR	testing
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:31
+     [fmpp] logtext:next:"abcd , line 100: Error: 100abcd:. abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:1
+     [fmpp] datalist size1
+     [fmpp] next:count:32
+     [fmpp] logtext:next:WARNING:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:33
+     [fmpp] logtext:next:LINK : warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:34
+     [fmpp] logtext:next::10: warning: cannot find matching deallocation function
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:35
+     [fmpp] logtext:next:100) : WARNING: TEST123
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:36
+     [fmpp] logtext:next:MAKEDEF WARNING: TEST
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:37
+     [fmpp] logtext:next:TEST 123 \\(10) : Warning: (400)
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:38
+     [fmpp] logtext:next:BLDMAKE WARNING: bldm warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:39
+     [fmpp] logtext:next:MAKEDEF WARNING: make warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:40
+     [fmpp] logtext:next:atest(100) : warning C aasdfa
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:41
+     [fmpp] logtext:next:testas 100: warning: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:42
+     [fmpp] logtext:next:usage Usage Warning: warn1
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:43
+     [fmpp] logtext:next:abcd mwld.exe: abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:44
+     [fmpp] logtext:next:Command line warning abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:45
+     [fmpp] logtext:next:anything ERROR: bad relocation: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:46
+     [fmpp] logtext:next:10 warning in component1
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:47
+     [fmpp] logtext:next:EventType: Error Source: SweepNTabcde
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:48
+     [fmpp] logtext:next:WARN	test
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:49
+     [fmpp] logtext:next:abcd :10: warning: cannot find matching deallocation function 100:note abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:50
+     [fmpp] logtext:next:WARNING:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:51
+     [fmpp] logtext:next:LINK : warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:52
+     [fmpp] logtext:next::10: warning: cannot find matching deallocation function
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:53
+     [fmpp] logtext:next:100) : WARNING: TEST123
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:54
+     [fmpp] logtext:next:MAKEDEF WARNING: TEST
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:55
+     [fmpp] logtext:next:TEST 123 \\(10) : Warning: (400)
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:56
+     [fmpp] logtext:next:BLDMAKE WARNING: bldm warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:57
+     [fmpp] logtext:next:MAKEDEF WARNING: make warning
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:58
+     [fmpp] logtext:next:atest(100) : warning C aasdfa
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:59
+     [fmpp] logtext:next:testas 100: warning: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:60
+     [fmpp] logtext:next:usage Usage Warning: warn1
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:61
+     [fmpp] logtext:next:abcd mwld.exe: abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:62
+     [fmpp] logtext:next:Command line warning abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:63
+     [fmpp] logtext:next:anything ERROR: bad relocation: test123
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:64
+     [fmpp] logtext:next:10 warning in component1
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:65
+     [fmpp] logtext:next:EventType: Error Source: SweepNTabcde
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:66
+     [fmpp] logtext:next:WARN	test
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:67
+     [fmpp] logtext:next:abcd :10: warning: cannot find matching deallocation function 100:note abcd
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:2
+     [fmpp] datalist size1
+     [fmpp] next:count:68
+     [fmpp] logtext:next:mingw_make.exe: error
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:3
+     [fmpp] datalist size1
+     [fmpp] next:count:69
+     [fmpp] logtext:next:mingw_make.exe: error
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:3
+     [fmpp] datalist size1
+     [fmpp] next:count:70
+     [fmpp] logtext:next:REMARK: 
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:71
+     [fmpp] logtext:next:INFO:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:72
+     [fmpp] logtext:next:anything Command line warning D4025 : test
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:73
+     [fmpp] logtext:next:REMARK: test remark anything
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:74
+     [fmpp] logtext:next:EventType: Error Source: GNU Make.
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:75
+     [fmpp] logtext:next:INFO: any info match
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:76
+     [fmpp] logtext:next:REMARK: 
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:77
+     [fmpp] logtext:next:INFO:
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:78
+     [fmpp] logtext:next:anything Command line warning D4025 : test
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:79
+     [fmpp] logtext:next:REMARK: test remark anything
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:80
+     [fmpp] logtext:next:EventType: Error Source: GNU Make.
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] next:count:81
+     [fmpp] logtext:next:INFO: any info match
+     [fmpp] checking any more element
+     [fmpp] indexmap size5
+     [fmpp] QueryModel:4
+     [fmpp] datalist size1
+     [fmpp] File processed.
+
+BUILD SUCCESSFUL
+Total time: 1 second
Binary file buildframework/helium/external/helium-antlib/metadata/tests/output/all_ido_logs.db has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/output1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+Buildfile: functionality\test_regex.ant.xml
+
+test-readdata:
+     [fmpp] args.size:6
+     [fmpp] arg-list:E:\Build_E\eclipse_fasym013\helium-antlib-trunk\sf\metadata\tests\output\log_all_filterfile.db
+     [fmpp] arg-list:LOG_ALL_FILTERFILE
+     [fmpp] arg-list:10
+     [fmpp] arg-list:-1
+     [fmpp] arg-list:where priority='WARNING'
+     [fmpp] arg-list:true
+     [fmpp] offset-1
+     [fmpp] recordLimit10
+     [fmpp] Initializing the db
+     [fmpp] updating queries
+     [fmpp] adding table details
+     [fmpp] adding record size
+     [fmpp] updateQuery:-1
+     [fmpp] sqlquery:SELECT COUNT(*) AS COUNT FROM LOG_ALL_FILTERFILE where priority='WARNING'
+     [fmpp] record count:36
+     [fmpp] recordcount:36
+     [fmpp] updatequery:10
+     [fmpp] maxoffset:4
+     [fmpp] iterator constructor called
+     [fmpp] checking any more element
+     [fmpp] SQLTemplateModelIterator:offset:0
+     [fmpp] adding table details
+     [fmpp] adding record size
+     [fmpp] updateQuery:0
+     [fmpp] adding records
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 0;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:10
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 0;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:10
+     [fmpp] checking any more element
+     [fmpp] SQLTemplateModelIterator:offset:10
+     [fmpp] adding table details
+     [fmpp] adding record size
+     [fmpp] updateQuery:10
+     [fmpp] adding records
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 10;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:10
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 10;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:10
+     [fmpp] checking any more element
+     [fmpp] SQLTemplateModelIterator:offset:20
+     [fmpp] adding table details
+     [fmpp] adding record size
+     [fmpp] updateQuery:20
+     [fmpp] adding records
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 20;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:10
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 20;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:10
+     [fmpp] checking any more element
+     [fmpp] SQLTemplateModelIterator:offset:30
+     [fmpp] adding table details
+     [fmpp] adding record size
+     [fmpp] updateQuery:30
+     [fmpp] adding records
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 30;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:6
+     [fmpp] actual query:where priority='WARNING'
+     [fmpp] sql querySELECT * from LOG_ALL_FILTERFILE where priority='WARNING' limit 10 offset 30;
+     [fmpp] no. of columns from query result:3
+     [fmpp] record size in getRecords:6
+     [fmpp] checking any more element
+     [fmpp] File processed.
+
+BUILD SUCCESSFUL
+Total time: 0 seconds
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/test_metadata.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_metadata.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-metadata" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib metadata tests.</description>
+
+    <path id="lib.path">
+        <fileset dir="${basedir}/../../antlibs" includes="*.jar"/>
+    </path>
+    <taskdef resource="com/nokia/helium/metadata/ant/antlib.xml" uri="http://www.nokia.com/helium"
+             classpath="../../bin/helium-metadata.jar" />
+    <taskdef name="fmpp" classname="fmpp.tools.AntTask" classpathref="lib.path" onerror="report"/>
+
+
+    <target name="check-metadata">
+        <hlm:metadatarecord srcfile="${basedir}\data\gensis.txt" database="${basedir}\out.sqlite">
+            <fileset dir="data" includes="gensis.txt"/>
+            <hlm:textlogparser>
+                <!-- Single set defined by csv file 
+                <hlm:metadatafilterset filterFile="${basedir}\data\common.csv"/>-->
+                <!-- Set defined by nested single filter and another nested set -->
+                <hlm:metadatafilterset>
+                    <hlm:metadatafilter priority="error" regex=".*Warning: Could not find file.*" description="Test pattern for missing file."/>
+                    <!--<hlm:metadatafilterset>
+                        <hlm:metadatafilter priority="warning" regex="File not found" description="Test pattern for missing file."/>
+                    </hlm:metadatafilterset>-->
+                </hlm:metadatafilterset>
+            </hlm:textlogparser>
+        </hlm:metadatarecord>
+        <!--<au:assertLogContains text="Successfully executed codescanner"/>
+        <au:assertLogContains text="Output format: xml,html"/>
+        <au:assertFileExists file="${codescanner.output.dir}/problemIndex.xml"/>-->
+    </target>
+    
+    
+    <target name="render-scanlog">
+        <property name="build.logs.dir" value="${bmd.test.project.dir}/test_bmd" />
+        <fmpp sourceFile="${basedir}/../src/templates/readdata.xml.ftl"
+                      outputFile="${basedir}/readdata.xml">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${basedir}/../src/templates
+            </freemarkerLinks>
+            <data>
+                templatedir: "${basedir}/src/templates"
+                template: "components_status.xml.ftl"
+                dbPath: "tests/out.sqlite"
+                countOnly: "true"
+                tableName: "out"
+                queryString: "where priority='WARNING' or priority='error'"
+                limit: "500"
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/test_validity.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_diamonds.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-metadata-validity" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib diamonds unittests.</description>
+    
+    <dirname property="project.dir" file="${ant.file.test-metadata-validity}" />
+
+    <taskdef resource="com/nokia/helium/metadata/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <taskdef name="fmpp" classname="fmpp.tools.AntTask"  onerror="report"/>
+
+    <!--
+    <hlm:metadatafilterset id="all-regex-filterfile">
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+    <target name="test-all-regex-filterfile">
+        <echo message="all regular expression validation" />
+        <echo message="database:${project.dir}/../output/log_all_filterfile.sqlite" />
+        <hlm:metadatarecord database="${project.dir}/../output/log_all_filterfile.sqlite">
+            <fileset dir="${project.dir}/../data/">
+                <include  name="all*.log"/>
+            </fileset>
+           <hlm:saxlogparser>
+                <metadatafilterset refid="all-regex-filterfile" />
+           </hlm:saxlogparser>
+        </hlm:metadatarecord>
+    </target>
+
+    <hlm:metadatafilterset id="all-regex-combined">
+        <metadatafilter priority="WARNING" regex=".*warning U4010" description="mingw error" />
+        <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+    </hlm:metadatafilterset>
+
+    <target name="test-all-regex-combined">
+        <echo message="all regular expression validation" />
+        <echo message="database:${project.dir}/../output/log_all_combined.sqlite" />
+        <hlm:metadatarecord database="${project.dir}/../output/log_all_combined.sqlite">
+            <fileset dir="${project.dir}/../data/">
+                <include  name="all*.log"/>
+            </fileset>
+            <hlm:saxlogparser>
+                <metadatafilterset refid="all-regex-combined" />
+            </hlm:saxlogparser>
+        </hlm:metadatarecord>
+    </target>
+    -->
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-quality">
+    <description>Helium Antlib Quality build file.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="quality"/>
+    
+    <path id="helium.quality.classpath"/>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/demo/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib  -lib  %CD%\..\..\bin\helium-quality.jar -lib %CD%\..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/demo/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-quality-demo" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib quality demo.</description>
+
+    <taskdef resource="com/nokia/helium/quality/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <property name="codescanner.output.dir" location="./cs" />
+    <property name="codescanner.output.type" value="html" />
+    <property name="codescanner.config" location="./codescanner_config.xml" />
+    <path id="src.path">
+        <pathelement path="../tests/data/src" />
+        <pathelement path="../tests/data/src2" />
+    </path>
+
+    <target name="demo-codescanner">
+        <hlm:codescanner dest="${codescanner.output.dir}" format="${codescanner.output.type}" configuration="${codescanner.config}">
+            <path refid="src.path" />
+        </hlm:codescanner>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/demo/codescanner_config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : codescanner_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!-- This is a configuration file for Codescanner from Mobile Innovation Ltd. -->
+<codescannerConfig>
+    <sources>
+        <!-- source files matching any of the exclude patterns below will not be scanned -->
+
+        <!-- binary files -->
+        <exclude>.*\.jpg</exclude>
+        <exclude>.*\.wav</exclude>
+        <exclude>.*\.au</exclude>
+        <exclude>.*\.bmp</exclude>
+        <exclude>.*\.wbmp</exclude>
+        <exclude>.*\.gif</exclude>
+        <exclude>.*\.tif</exclude>
+        <exclude>.*\.exe</exclude>
+        <exclude>.*\.mp3</exclude>
+        <exclude>.*\.mpg</exclude>
+        <exclude>.*\.avi</exclude>
+        <exclude>.*\.raw</exclude>
+        <exclude>.*\.mbm</exclude>
+        <exclude>.*\.doc</exclude>
+        <exclude>.*\.xls</exclude>
+        <exclude>.*\.rtf</exclude>
+        <exclude>.*\.png</exclude>
+        <exclude>.*\.wmf</exclude>
+        <exclude>.*\\exclude.txt</exclude>
+
+        <!-- typical test directory names -->
+        <exclude>.*\\ts_.*</exclude>
+        <exclude>.*\\tsrc\\.*</exclude>
+        <exclude>.*\\test\\.*</exclude>
+        <exclude>.*\\.svn\\.*</exclude>
+    </sources>
+    <scripts>
+        <!-- Every element in this section corresponds to a Codescanner script -->
+        <!-- Every element has the following common attributes: -->
+        <!--    enable="true" or "false" -->
+        <!-- Some scripts have additional attributes or elements. -->
+
+        <accessArrayElementWithoutCheck enable="true"/>
+        <accessArrayElementWithoutCheck2 enable="true"/>
+        <activestart enable="true"/>
+        <activestop enable="true"/>
+        <arraypassing enable="true"/>
+        <arrayptrcleanup enable="true"/>
+        <assertdebuginvariant enable="true"/>
+        <baddefines enable="true"/>
+        <baseconstruct enable="true"/>
+        <callActiveObjectWithoutCheckingOrStopping enable="true"/>
+        <changenotification enable="true"/>
+        <cleanup enable="true"/>
+        <commentcode enable="true"/>
+        <connect enable="true"/>
+        <ConnectAndDontCloseMemberVariable enable="true"/>
+        <constnames enable="true"/>
+        <consttdescptr enable="true"/>
+        <controlornull enable="true"/>
+        <ctltargettype enable="true"/>
+        <debugrom enable="true"/>
+        <declarename enable="true"/>
+        <deleteMemberVariable enable="true"/>
+        <destructor enable="true"/>
+        <doubleSemiColon enable="true"/>
+        <driveletters enable="true"/>
+        <eikbuttons enable="true"/>
+        <eikonenvstatic enable="true"/>
+        <enummembers enable="true"/>
+        <enumnames enable="true"/>
+        <exportinline enable="true"/>
+        <exportpurevirtual enable="true"/>
+        <externaldriveletters enable="true"/>
+        <foff enable="true"/>
+        <forbiddenwords enable="true">
+            <!-- the following regular expression specifies the forbidden words detected by this script -->
+            <wordsRE>bad words</wordsRE>
+        </forbiddenwords>
+        <forgottoputptroncleanupstack enable="true"/>
+        <friend enable="true"/>
+        <goto enable="true"/>
+        <ifassignments enable="true"/>
+        <ifpreprocessor enable="true"/>
+        <intleaves enable="true"/>
+        <jmp enable="true"/>
+        <leave enable="true"/>
+        <LeaveNoError enable="true"/>
+        <leavingoperators enable="true"/>
+        <LFunctionCantLeave enable="true"/>
+        <!-- the length attribute specifies the largest number of characters permitted by this script -->
+        <longlines enable="true" length="160" />
+        <magicnumbers enable="true"/>
+        <mclassdestructor enable="true"/>
+        <memberlc enable="true"/>
+        <membervariablecallld enable="true"/>
+        <missingcclass enable="true"/>
+        <mmpsourcepath enable="true"/>
+        <multilangrsc enable="true"/>
+        <multipledeclarations enable="true"/>
+        <multipleinheritance enable="true"/>
+        <mydocs enable="true"/>
+        <namespace enable="true"/>
+        <newlreferences enable="true"/>
+        <noleavetrap enable="true"/>
+        <nonconsthbufc enable="true"/>
+        <nonconsttdesc enable="true"/>
+        <nonleavenew enable="true"/>
+        <nonunicodeskins enable="true"/>
+        <null enable="true"/>
+        <open enable="true"/>
+        <pointertoarrays enable="true"/>
+        <pragmadisable enable="true"/>
+        <pragmamessage enable="true"/>
+        <pragmaother enable="true"/>
+        <privateinheritance enable="true"/>
+        <pushaddrvar enable="true"/>
+        <pushmember enable="true"/>
+        <readresource enable="true"/>
+        <resourcesonheap enable="true"/>
+        <returndescriptoroutofscope enable="true"/>
+        <rfs enable="true"/>
+        <rssnames enable="true"/>
+        <stringliterals enable="true"/>
+        <stringsinresourcefiles enable="true"/>
+        <struct enable="true"/>
+        <tcclasses enable="true"/>
+        <tclassdestructor enable="true"/>
+        <todocomments enable="true"/>
+        <trapcleanup enable="true"/>
+        <trapeleave enable="true"/>
+        <traprunl enable="true"/>
+        <trspassing enable="true"/>
+        <uids enable="true"/>
+        <uncompressedaif enable="true"/>
+        <uncompressedbmp enable="true"/>
+        <unicodesource enable="true"/>
+        <userafter enable="true"/>
+        <userfree enable="true"/>
+        <userWaitForRequest enable="true"/>
+        <variablenames enable="true"/>
+        <voidparameter enable="true"/>
+        <worryingcomments enable="true">
+            <!-- the following regular expression specifies the worrying comments detected by this script -->
+            <worryRE>\!|\?|[Zz]{3}|kludge|workaround|\scrap|hack</worryRE>
+        </worryingcomments>
+    </scripts>
+    <severities>
+        <low enable="true"/>
+    </severities>
+    <categories>
+        <codereview enable="true"/>
+    </categories>
+</codescannerConfig>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/src/com/nokia/helium/quality/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="codescanner" classname="com.nokia.helium.quality.ant.taskdefs.CodeScanner" onerror="ignore"/>
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/src/com/nokia/helium/quality/ant/helium.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium.antlib.xml 
+Part of     : Helium Antlib 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-quality" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>    
+    <taskdef resource="com/nokia/helium/quality/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/src/com/nokia/helium/quality/ant/taskdefs/CodeScanner.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.quality.ant.taskdefs;
+
+import java.io.*;
+import java.util.Vector;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.taskdefs.ExecTask;
+
+/**
+ * This task executes codescanner - and writes the results to the output directory.
+ * Codescanner parses C++ code and flags any inconsistencies or errors in output files. 
+ * Configuration files are used to determine what passes and fails the checking e.g. maximum length of lines,
+ * whether 'C' type comments are allowed as well as C++ comments, does it adhere to the company coding 
+ * guidelines and much more. Every person writing any C++ code 
+ * should run codescanner on their code to ensure it follows the coding guidelines. The output logs 
+ * should have no errors and preferably no warnings before the code should be checked into SCM, e.g. synergy or SVN.
+ *
+ * Below is an example of how to use the target to run codescanner.
+ *
+ * <pre>
+ * &lt;property name="codescanner.output.dir" location="./cs" /&gt;
+ * &lt;property name="codescanner.output.type" value="html" /&gt;
+ * &lt;property name="codescanner.config" location="./codescanner_config.xml" /&gt;
+ *
+ * &lt;hlm:codescanner dest="${codescanner.output.dir}"
+ *      format="${codescanner.output.type}"
+ *      failonerror="true"
+ *      configuration="${codescanner.config}"&gt;
+ *      &lt;path refid="src.path"/&gt;
+ *  &lt;/hlm:codescanner&gt;
+ *  &lt;au:assertLogContains text="Successfully executed codescanner"/&gt;
+ *  &lt;au:assertLogContains text="Output format: xml,html"/&gt;
+ *  &lt;au:assertFileExists file="${codescanner.output.dir}/problemIndex.xml"/&gt;
+ * </pre>
+ * 
+ * @ant.task name="codescanner" category="Quality"
+ */
+public class CodeScanner extends Task {
+    private Vector<Path> paths = new Vector<Path>();
+    private File configuration;
+    private String dest;
+    private String format = "xml,html";
+    private boolean auto;
+    private File log;
+    private boolean failonerror;
+
+    /**
+     * This defines if the task should fails in case of error while 
+     * executing codescanner.
+     * 
+     * @param failonerror
+     * @ant.not-required Default is false for backward compatibility.
+     */
+    public void setFailonerror(boolean failonerror) {
+        this.failonerror = failonerror;
+    }
+
+    /**
+     * Add path datatype to the task.
+     * 
+     * @param path
+     */
+    public void add(Path path) {
+        paths.add(path);
+    }
+
+    /**
+     * Get dest attribute.
+     * 
+     */
+    public String getDest() {
+        return this.dest;
+    }
+
+    /**
+     * Set dest attribute.
+     * 
+     * @param dest
+     * @ant.required
+     */
+    public void setDest(String dest) {
+        this.dest = dest;
+    }
+
+    /**
+     * Get format attribute.
+     * 
+     */
+    public String getFormat() {
+        return this.format;
+    }
+
+    /**
+     * Set format attribute.
+     * 
+     * @param format
+     * @ant.not-required Default is xml,html
+     */
+    public void setFormat(String format) {
+        this.format = format;
+    }
+
+    /**
+     * Get configuration attribute.
+     * 
+     */
+    public File getConfiguration() {
+        return this.configuration;
+    }
+
+    /**
+     * Set configuration attribute.
+     * 
+     * @param configuration
+     * @ant.required
+     */
+    public void setConfiguration(File configuration) {
+        this.configuration = configuration;
+    }
+
+    /**
+     * Set auto attribute.
+     * 
+     * @param auto
+     * @ant.not-required Default is false.
+     */
+    public void setAuto(boolean auto) {
+        this.auto = auto;
+    }
+
+    /**
+     * Set log attribute.
+     * 
+     * @param log
+     * @ant.not-required
+     */
+    public void setLog(File log) {
+        this.log = log;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute() {
+        // creating the exec subtask
+        String osType = System.getProperty("os.name");
+        if (!osType.toLowerCase().startsWith("win")) {
+            this.log("CODESCANNER: run in windows only");
+            return;
+        }
+        ExecTask task = new ExecTask();
+        task.setProject(getProject());
+        task.setTaskName(this.getTaskName());
+        task.setFailonerror(failonerror);
+        task.setExecutable("codescanner");
+        task.setDir(new File("."));
+        if (dest == null) {
+            throw new BuildException("'dest' attribute must be defined");
+        }
+        if (configuration != null) {
+            if (!configuration.exists()) {
+                throw new BuildException("Could not find the file "
+                        + configuration);
+            } else {
+                task.createArg().setValue("-c");
+                task.createArg().setValue(configuration.getAbsolutePath());
+            }
+        } else {
+            throw new BuildException(
+                    "'configuration' attribute must be defined");
+        }
+        if (!format.contains("xml")) {
+           setFormat("xml," + format);
+        }
+        this.log("Output format: " + format);
+        // -t off
+        task.createArg().setValue("-t");
+        task.createArg().setValue(auto ? "on" : "off");
+
+        // -l log
+        if (log != null) {
+            this.log("Output log: " + log.getAbsolutePath());
+            task.createArg().setValue("-l");
+            task.createArg().setValue(log.getAbsolutePath());
+        }
+
+        // -o type
+        task.createArg().setValue("-o");
+        task.createArg().setValue(format);
+        if (paths.isEmpty()) {
+            throw new BuildException("No input directory defined");
+        }
+        // Getting the list of source dir to scan
+        Vector<String> srcs = new Vector<String>();
+        for (Path path : paths) {
+            if (path.isReference()) {
+                path = (Path) path.getRefid().getReferencedObject();
+            }
+            for (String apath : path.list()) {
+                srcs.add(apath);
+            }
+        }
+        for (int i = 0; i < srcs.size(); i++) {
+            if (i != srcs.size() - 1) {
+                task.createArg().setValue("-i");
+                task.createArg().setValue(srcs.elementAt(i));
+            } else {
+                task.createArg().setValue(srcs.elementAt(i));
+                task.createArg().setValue(dest.toString());
+            }
+        }
+        // output path
+        this.log("Output dir " + dest);
+
+        // Run codescanner
+        task.execute();
+        this.log("Successfully executed codescanner");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+module load java/1.6.0
+setenv ANT_ARGS "-lib ../../antlibs -lib ../../bin/helium-core.jar -lib ../../bin/helium-quality.jar -lib ../../lib" 
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib  -lib  %CD%\..\..\bin\helium-quality.jar -lib %CD%\..\..\antlibs
+ant %*
+endlocal
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium antlib quality tests.</description>
+    <target name="unittest" depends="unittest-quality" />
+
+    <target name="unittest-quality">
+        <au:antunit>
+            <fileset dir="." includes="test_*.ant.xml" />
+            <au:plainlistener logLevel="info" />
+        </au:antunit>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/codescanner_config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : codescanner_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!-- This is a configuration file for Codescanner from Mobile Innovation Ltd. -->
+<codescannerConfig>
+    <sources>
+        <!-- source files matching any of the exclude patterns below will not be scanned -->
+
+        <!-- binary files -->
+        <exclude>.*\.jpg</exclude>
+        <exclude>.*\.wav</exclude>
+        <exclude>.*\.au</exclude>
+        <exclude>.*\.bmp</exclude>
+        <exclude>.*\.wbmp</exclude>
+        <exclude>.*\.gif</exclude>
+        <exclude>.*\.tif</exclude>
+        <exclude>.*\.exe</exclude>
+        <exclude>.*\.mp3</exclude>
+        <exclude>.*\.mpg</exclude>
+        <exclude>.*\.avi</exclude>
+        <exclude>.*\.raw</exclude>
+        <exclude>.*\.mbm</exclude>
+        <exclude>.*\.doc</exclude>
+        <exclude>.*\.xls</exclude>
+        <exclude>.*\.rtf</exclude>
+        <exclude>.*\.png</exclude>
+        <exclude>.*\.wmf</exclude>
+        <exclude>.*\\exclude.txt</exclude>
+
+        <!-- typical test directory names -->
+        <exclude>.*\\ts_.*</exclude>
+        <exclude>.*\\tsrc\\.*</exclude>
+        <exclude>.*\\test\\.*</exclude>
+        <exclude>.*\\\.svn\\.*</exclude>
+    </sources>
+    <scripts>
+        <!-- Every element in this section corresponds to a Codescanner script -->
+        <!-- Every element has the following common attributes: -->
+        <!--    enable="true" or "false" -->
+        <!-- Some scripts have additional attributes or elements. -->
+
+        <accessArrayElementWithoutCheck enable="true"/>
+        <accessArrayElementWithoutCheck2 enable="true"/>
+        <activestart enable="true"/>
+        <activestop enable="true"/>
+        <arraypassing enable="true"/>
+        <arrayptrcleanup enable="true"/>
+        <assertdebuginvariant enable="true"/>
+        <baddefines enable="true"/>
+        <baseconstruct enable="true"/>
+        <callActiveObjectWithoutCheckingOrStopping enable="true"/>
+        <changenotification enable="true"/>
+        <cleanup enable="true"/>
+        <commentcode enable="true"/>
+        <connect enable="true"/>
+        <ConnectAndDontCloseMemberVariable enable="true"/>
+        <constnames enable="true"/>
+        <consttdescptr enable="true"/>
+        <controlornull enable="true"/>
+        <ctltargettype enable="true"/>
+        <debugrom enable="true"/>
+        <declarename enable="true"/>
+        <deleteMemberVariable enable="true"/>
+        <destructor enable="true"/>
+        <doubleSemiColon enable="true"/>
+        <driveletters enable="true"/>
+        <eikbuttons enable="true"/>
+        <eikonenvstatic enable="true"/>
+        <enummembers enable="true"/>
+        <enumnames enable="true"/>
+        <exportinline enable="true"/>
+        <exportpurevirtual enable="true"/>
+        <externaldriveletters enable="true"/>
+        <foff enable="true"/>
+        <forbiddenwords enable="true">
+            <!-- the following regular expression specifies the forbidden words detected by this script -->
+            <wordsRE>bad words</wordsRE>
+        </forbiddenwords>
+        <forgottoputptroncleanupstack enable="true"/>
+        <friend enable="true"/>
+        <goto enable="true"/>
+        <ifassignments enable="true"/>
+        <ifpreprocessor enable="true"/>
+        <intleaves enable="true"/>
+        <jmp enable="true"/>
+        <leave enable="true"/>
+        <LeaveNoError enable="true"/>
+        <leavingoperators enable="true"/>
+        <LFunctionCantLeave enable="true"/>
+        <!-- the length attribute specifies the largest number of characters permitted by this script -->
+        <longlines enable="true" length="160" />
+        <magicnumbers enable="true"/>
+        <mclassdestructor enable="true"/>
+        <memberlc enable="true"/>
+        <membervariablecallld enable="true"/>
+        <missingcclass enable="true"/>
+        <mmpsourcepath enable="true"/>
+        <multilangrsc enable="true"/>
+        <multipledeclarations enable="true"/>
+        <multipleinheritance enable="true"/>
+        <mydocs enable="true"/>
+        <namespace enable="true"/>
+        <newlreferences enable="true"/>
+        <noleavetrap enable="true"/>
+        <nonconsthbufc enable="true"/>
+        <nonconsttdesc enable="true"/>
+        <nonleavenew enable="true"/>
+        <nonunicodeskins enable="true"/>
+        <null enable="true"/>
+        <open enable="true"/>
+        <pointertoarrays enable="true"/>
+        <pragmadisable enable="true"/>
+        <pragmamessage enable="true"/>
+        <pragmaother enable="true"/>
+        <privateinheritance enable="true"/>
+        <pushaddrvar enable="true"/>
+        <pushmember enable="true"/>
+        <readresource enable="true"/>
+        <resourcesonheap enable="true"/>
+        <returndescriptoroutofscope enable="true"/>
+        <rfs enable="true"/>
+        <rssnames enable="true"/>
+        <stringliterals enable="true"/>
+        <stringsinresourcefiles enable="true"/>
+        <struct enable="true"/>
+        <tcclasses enable="true"/>
+        <tclassdestructor enable="true"/>
+        <todocomments enable="true"/>
+        <trapcleanup enable="true"/>
+        <trapeleave enable="true"/>
+        <traprunl enable="true"/>
+        <trspassing enable="true"/>
+        <uids enable="true"/>
+        <uncompressedaif enable="true"/>
+        <uncompressedbmp enable="true"/>
+        <unicodesource enable="true"/>
+        <userafter enable="true"/>
+        <userfree enable="true"/>
+        <userWaitForRequest enable="true"/>
+        <variablenames enable="true"/>
+        <voidparameter enable="true"/>
+        <worryingcomments enable="true">
+            <!-- the following regular expression specifies the worrying comments detected by this script -->
+            <worryRE>\!|\?|[Zz]{3}|kludge|workaround|\scrap|hack</worryRE>
+        </worryingcomments>
+    </scripts>
+    <severities>
+        <low enable="true"/>
+    </severities>
+    <categories>
+        <codereview enable="true"/>
+    </categories>
+</codescannerConfig>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/data/src/helloworld.cpp	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+int main (int argc, char **argv) {
+	return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/data/src2/helloworld.cpp	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+int main (int argc, char **argv) {
+	return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/test_codescanner.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_serializepath.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-quality" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib core serializepath tests.</description>
+
+    <taskdef resource="com/nokia/helium/quality/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <property name="codescanner.output.dir" location="./cs"/>
+    <property name="codescanner.output.type" value="html"  />
+    <property name="codescanner.config" location="${basedir}/codescanner_config.xml"  />
+    <path id="src.path">
+        <pathelement path="./data" />
+    </path>
+
+    <condition property="do.codescanner.test">
+        <os family="windows" />
+    </condition>
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <delete dir="${codescanner.output.dir}" failonerror="false" />
+        <mkdir dir="${codescanner.output.dir}" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${codescanner.output.dir}" failonerror="false" />
+    </target>
+
+    <target name="test-codescanner-linux" unless="do.codescanner.test">
+        <echo message="Codescanner supported only for windows" />
+    </target>
+
+    <!--
+     **************************************************************
+     ** test codescanner only for windows
+     **************************************************************
+    -->
+
+    <target name="test-codescanner" if="do.codescanner.test">
+        <hlm:codescanner dest="${codescanner.output.dir}"
+            format="${codescanner.output.type}"
+            configuration="${codescanner.config}">
+            <path refid="src.path"/>
+        </hlm:codescanner>
+        <au:assertLogContains text="Successfully executed codescanner"/>
+        <au:assertLogContains text="Output format: xml,html"/>
+        <au:assertLogContains text="data\src\exclude.txt"/>
+        <au:assertLogContains text="data\src2\exclude.txt"/>
+        <au:assertFileExists file="${codescanner.output.dir}/problemIndex.xml"/>
+    </target>
+
+    <!--
+     **************************************************************
+     ** test noargs
+     **************************************************************
+    -->
+    <target name="test-norargs" if="do.codescanner.test">
+        <au:expectfailure expectedMessage="'dest' attribute must be defined">
+            <hlm:codescanner/>
+        </au:expectfailure>
+    </target>
+
+    <!--
+     **************************************************************
+     ** test noconf
+     **************************************************************
+    -->
+    <target name="test-noconf" if="do.codescanner.test">
+        <au:expectfailure expectedMessage="'configuration' attribute must be defined">
+            <hlm:codescanner dest="${codescanner.output.dir}"/>
+        </au:expectfailure>
+    </target>
+
+    
+    <!--
+     **************************************************************
+     ** test noconf
+     **************************************************************
+    -->
+    <target name="test-codescanner-two-inputs" if="do.codescanner.test">
+        <path id="src.path.two.path">
+            <pathelement path="./data/src" />
+            <pathelement path="./data/src2" />
+        </path>
+        <hlm:codescanner dest="${codescanner.output.dir}"
+            format="${codescanner.output.type}"
+            configuration="${codescanner.config}">
+            <path refid="src.path.two.path"/>
+        </hlm:codescanner>
+        <au:assertLogContains text="Successfully executed codescanner"/>
+        <au:assertLogContains text="Output format: xml,html"/>
+        <au:assertLogContains text="data\src\exclude.txt"/>
+        <au:assertLogContains text="data\src2\exclude.txt"/>
+        <au:assertFileExists file="${codescanner.output.dir}/problemIndex.xml"/>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-scm">
+    <description>Helium Antlib SCM.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="scm"/>
+    
+    <path id="helium.scm.classpath">
+        <fileset dir="${helium.antlib.root.dir}/scm/lib" includes="*.jar"/>
+    </path>
+    
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/demo/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+ant -lib ..\..\bin -lib ..\..\lib -lib ..\lib %*
+endlocal
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/demo/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="demo" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib SCM demo.</description>
+
+    <taskdef name="scm" classname="com.nokia.helium.scm.ant.taskdefs.ScmTask" uri="http://www.nokia.com/helium" />
+    <typedef name="latestTag" classname="com.nokia.helium.scm.ant.types.LatestTag" uri="http://www.nokia.com/helium" />
+    <typedef name="tagSet" classname="com.nokia.helium.scm.ant.types.TagSet" uri="http://www.nokia.com/helium" />
+
+    <target name="setup">
+        <delete dir="./temp" failonerror="false" />
+        <unzip src="hg_test1.zip" dest="./temp" />
+        <unzip src="hg_test2.zip" dest="./temp" />
+        <unzip src="hg_test3.zip" dest="./temp" />
+        <property name="test1.dir" location="./temp/test1" />
+        <property name="test2.dir" location="./temp/test2" />
+        <property name="test3.dir" location="./temp/test3" />
+    </target>
+
+    <target name="get-status">
+        <hlm:scm verbose="true" scmUrl="scm:hg:${ant.file.demo}/../temp/test1">
+            <hlm:status>
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="**" />
+                    <exclude name="**/.hg/**" />
+                </fileset>
+            </hlm:status>
+        </hlm:scm>
+    </target>
+
+    <target name="demo-status">
+        <antcall target="get-status" />
+        <echo file="${ant.file.demo}/../temp/test1/not_in_repo.txt">Not in repo</echo>
+        <antcall target="get-status" />
+        <hlm:scm verbose="true" scmUrl="scm:hg:${ant.file.demo}/../temp/test1">
+            <hlm:add>
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="**" />
+                    <exclude name="**/.hg/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <antcall target="get-status" />
+    </target>
+
+    <target name="demo-diff" depends="setup">
+        <echo file="${ant.file.demo}/../temp/test1/not_in_repo.txt">Not in repo</echo>
+        <hlm:scm verbose="true" scmUrl="scm:hg:${ant.file.demo}/../temp/test1">
+            <hlm:add>
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="**" />
+                    <exclude name="**/.hg/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+
+        <hlm:scm verbose="true" scmUrl="scm:hg:${ant.file.demo}/../temp/test1">
+            <hlm:diff>
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="**" />
+                    <exclude name="**/.hg/**" />
+                </fileset>
+            </hlm:diff>
+        </hlm:scm>
+    </target>
+
+
+    <!--DEMO "checkout" -->
+    <target name="demo-checkout" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test3">
+            <!--Clone-->
+            <hlm:checkout baseDir="${temp.dir}/clones/clone" />
+
+            <!--Clone to revision '0'-->
+            <hlm:checkout baseDir="${temp.dir}/clones/clone_rev_0">
+                <hlm:revision name="0" />
+            </hlm:checkout>
+
+            <!--Clone to revision '1'-->
+            <hlm:checkout baseDir="${temp.dir}/clones/clone_rev_1">
+                <hlm:revision name="1" />
+            </hlm:checkout>
+        </hlm:scm>
+    </target>
+
+    <target name="demo-all" depends="setup">
+        <mkdir dir="${ant.file.demo}/../temp/cloned" />
+        <echo file="${ant.file.demo}/../temp/test1/not_in_repo.txt">Not in repo</echo>
+        <echo file="${ant.file.demo}/../temp/test1/not_in_repo2.txt">Not in repo2</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${test1.dir}">
+            <hlm:checkout baseDir="${ant.file.demo}/../temp/cloned" />
+            <hlm:add>
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="not_in_repo.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding not_in_repo.txt...">
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="not_in_repo.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:tag baseDir="${ant.file.demo}/../temp/test1" name="1.0.0" />
+            <hlm:add>
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="not_in_repo2.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding not_in_repo2.txt...">
+                <fileset dir="${ant.file.demo}/../temp/test1">
+                    <include name="not_in_repo2.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:tag baseDir="${ant.file.demo}/../temp/test1" name="1.0.1" />
+        </hlm:scm>
+
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${ant.file.demo}/../temp/cloned">
+            <hlm:pull baseDir="${ant.file.demo}/../temp/cloned" />
+            <hlm:update baseDir="${ant.file.demo}/../temp/cloned" />
+            <hlm:tags baseDir="${ant.file.demo}/../temp/cloned" reference="cloned.tags" />
+            <hlm:update baseDir="${ant.file.demo}/../temp/cloned">
+                <hlm:latestTag pattern="1.0.*">
+                    <hlm:tagSet refid="cloned.tags" />
+                </hlm:latestTag>
+            </hlm:update>
+        </hlm:scm>
+
+        <hlm:scm verbose="true" scmUrl="scm:hg:${ant.file.demo}/../temp/cloned">
+            <hlm:remove message="Nothing to remove...">
+                <fileset dir="${ant.file.demo}/../temp/cloned">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:remove>
+        </hlm:scm>
+
+    </target>
+
+    <target name="demo-export" depends="setup">
+        <mkdir dir="${ant.file.demo}/../temp/export" />
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${ant.file.demo}/../temp/test2">
+            <hlm:export baseDir="${ant.file.demo}/../temp/test2" destPath="${ant.file.demo}/../temp/export">
+                <tag name="2" />
+            </hlm:export>
+        </hlm:scm>
+    </target>
+
+    <!--DEMO "Tagging" -->
+    <target name="demo-tag" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkout baseDir="${temp.dir}/tag" />
+        </hlm:scm>
+
+        <echo file="${temp.dir}/tag/newfile.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/tag">
+            <hlm:add>
+                <fileset dir="${temp.dir}/tag">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/tag">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+
+            <hlm:tag baseDir="${temp.dir}/tag" name="tag_0.1" level="local" />
+            <hlm:tag baseDir="${temp.dir}/tag" name="tag_0.2" />
+
+        </hlm:scm>
+    </target>
+
+    <!--DEMO "Branch" -->
+    <target name="demo-branch" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkout baseDir="${temp.dir}/branch" revision="0" />
+        </hlm:scm>
+
+        <echo file="${temp.dir}/branch/newfile.txt">newly added</echo>
+        <echo file="${temp.dir}/branch/newfile2.txt">newly added</echo>
+        <echo file="${temp.dir}/branch/newfile3.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/branch">
+            <hlm:branch baseDir="${temp.dir}/branch" name="test_0.1" />
+            <hlm:add>
+                <fileset dir="${temp.dir}/branch">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/branch">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+    </target>
+
+    <!--DEMO "update" -->
+    <target name="demo-update" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+
+        <!--Create the first revision -->
+        <echo file="${temp.dir}/test1/not_in_repo1.txt">Not in repo1</echo>
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:add>
+                <fileset dir="${temp.dir}/test1">
+                    <include name="not_in_repo1.txt" />
+                    <exclude name="**/.hg/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkin message="Adding not_in_repo1.txt...">
+                <fileset dir="${temp.dir}/test1">
+                    <include name="not_in_repo1.txt" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+
+        <!--Create the second revision -->
+        <echo file="${temp.dir}/test1/not_in_repo2.txt">Not in repo2</echo>
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:add>
+                <fileset dir="${temp.dir}/test1">
+                    <include name="not_in_repo2.txt" />
+                    <exclude name="**/.hg/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkin message="Adding not_in_repo2.txt...">
+                <fileset dir="${temp.dir}/test1">
+                    <include name="not_in_repo2.txt" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+
+        <!-- Update to first revision -->
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:update baseDir="${temp.dir}/test1">
+                <hlm:revision name="0" />
+            </hlm:update>
+        </hlm:scm>
+
+    </target>
+
+    <!--DEMO "Change Log" -->
+    <target name="demo-changelog" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkout baseDir="${temp.dir}/changelog" />
+            <hlm:tag baseDir="${temp.dir}/changelog" name="tag_0.2" />
+            <hlm:branch baseDir="${temp.dir}/changelog" name="test_0.1" />
+        </hlm:scm>
+
+        <echo file="${temp.dir}/changelog/newfile.txt">newly added</echo>
+        <echo file="${temp.dir}/changelog/newfile2.txt">newly added</echo>
+        <echo file="${temp.dir}/changelog/newfile3.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/changelog">
+            <hlm:add>
+                <fileset dir="${temp.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:changelog basedir="${temp.dir}/changelog" startVersion="0" />
+        </hlm:scm>
+
+        <echo file="${temp.dir}/changelog/newfile4.txt">newly added</echo>
+        <echo file="${temp.dir}/changelog/newfile5.txt">newly added</echo>
+        <echo file="${temp.dir}/changelog/newfile6.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/changelog">
+            <hlm:add>
+                <fileset dir="${temp.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <!--hlm:changelog baseDir="${temp.dir}/changelog" numDays='1' /-->
+            <!--hlm:changelog baseDir="${temp.dir}/changelog" startDate="20090317 18:49:31" endDate="20090323 24:49:31" datePattern="yyyyMMdd HH:mm:ss" /-->
+            <!--hlm:changelog basedir="${temp.dir}/changelog" startVersion="0" /-->
+            <hlm:changelog basedir="${temp.dir}/changelog" startVersion="1" endVersion="2"/>
+            <!--hlm:changelog basedir="${temp.dir}/changelog" startVersion="1" endVersion="2" logOutput="xml" /-->
+        </hlm:scm>
+    </target>
+    
+    <!--DEMO "info" -->
+    <target name="demo-info" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkout baseDir="${temp.dir}/info" />            
+        </hlm:scm>
+
+        <echo file="${temp.dir}/info/newfile.txt">newly added</echo>
+        <echo file="${temp.dir}/info/newfile2.txt">newly added</echo>
+        <echo file="${temp.dir}/info/newfile3.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/info">
+            <hlm:add>
+                <fileset dir="${temp.dir}/info">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/info">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:info baseDir="${ant.file.demo}/../temp/info"/>
+        </hlm:scm>
+    </target>
+      
+    <!--DEMO "failonerror-false" -->
+    <target name="demo-failonerror-false" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />        
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkout baseDir="${temp.dir}/tag" />
+        </hlm:scm>        
+        <echo file="${temp.dir}/tag/newfile.txt">newly added</echo>        
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/tag" failonerror="false">
+            <hlm:add>
+                <fileset dir="${temp.dir}/tag">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/tag">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>            
+            <!-- Build should continue as failonerror="false" -->
+            <hlm:tag baseDir="${temp.dir}/tag" name="tag_0.2"/>
+            <hlm:tag baseDir="${temp.dir}/tag" name="tag_0.2"/>            
+        </hlm:scm>        
+        <echo> Build continue.... </echo>        
+    </target>
+    
+    <!--DEMO "failonerror-true" -->
+    <target name="demo-failonerror-true" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/test1">
+            <hlm:checkout baseDir="${temp.dir}/tag" />
+        </hlm:scm>
+        <echo file="${temp.dir}/tag/newfile.txt">newly added</echo>    
+        <hlm:scm verbose="false" scmUrl="scm:hg:${temp.dir}/tag" failonerror="true">
+            <hlm:add>
+                <fileset dir="${temp.dir}/tag">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${temp.dir}/tag">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>            
+            <!-- Build should fail as failonerror="true" -->
+            <hlm:tag baseDir="${temp.dir}/tag" name="tag_0.3"/>
+            <hlm:tag baseDir="${temp.dir}/tag" name="tag_0.3"/>
+        </hlm:scm>
+    </target>
+    
+</project>
Binary file buildframework/helium/external/helium-antlib/scm/demo/hg_test1.zip has changed
Binary file buildframework/helium/external/helium-antlib/scm/demo/hg_test2.zip has changed
Binary file buildframework/helium/external/helium-antlib/scm/demo/hg_test3.zip has changed
Binary file buildframework/helium/external/helium-antlib/scm/lib/maven-scm-api-1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/scm/lib/maven-scm-provider-hg-1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/scm/lib/maven-scm-provider-svn-commons-1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/scm/lib/maven-scm-provider-synergy-1.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/scm/lib/plexus-utils-1.5.6.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="scm" classname="com.nokia.helium.scm.ant.taskdefs.ScmTask" onerror="ignore"/>
+    <!-- Type definition -->
+    <typedef name="latestTag" classname="com.nokia.helium.scm.ant.types.LatestTag"/>
+    <typedef name="tagSet" classname="com.nokia.helium.scm.ant.types.TagSet"/>
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/helium.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium.antlib.xml 
+Part of     : Helium Antlib 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-scm" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>    
+    <taskdef resource="com/nokia/helium/scm/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/AddAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Adding a set of files into SCM control.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *   &lt;hlm:add&gt;
+ *      &lt;fileset dir="${repo.dir}/test1"&gt;
+ *         &lt;include name="**" /&gt;
+ *         &lt;exclude name="** /.${repo.type}/**" /&gt;
+ *      &lt;/fileset&gt;
+ *   &lt;/hlm:add&gt;
+ * &lt;/hlm:scm&gt;
+ *
+ * </pre>
+ * 
+ * @ant.type name="add" category="SCM"
+ */
+public class AddAction extends BaseDirectoryScmAction {
+
+    /**
+     * {@inheritDoc}
+     * @throws ScmException 
+     */
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+
+        AddScmResult result = scmManager.add(repository, getScmFileSet());
+
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM add action failed.");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/BaseDirectoryScmAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * Handles configuration of directory-based SCM task commands.
+ */
+public abstract class BaseDirectoryScmAction extends ScmAction {
+    private String basedir;
+
+    /**
+     * Only one fileset is valid because all the SCM commands work on just one
+     * Sdirectory.
+     */
+    private FileSet fileSet;
+
+    /**
+     * Get the basedir.
+     * 
+     * @return the basedir attribute as a string.
+     */
+    public String getBasedir() {
+        if (fileSet != null) {
+            return fileSet.getDir(getProject()).getAbsolutePath();
+        }
+        return basedir;
+    }
+
+    /**
+     * Location of the current checkout in most of the case.
+     * 
+     * @param basedir
+     *            the directory to use on the local machine
+     * 
+     * @ant.required
+     */
+    public void setBasedir(String basedir) {
+        this.basedir = basedir;
+    }
+
+    public void addFileset(FileSet set) {
+        fileSet = set;
+    }
+
+    public ScmFileSet getScmFileSet() {
+        ArrayList<File> files = new ArrayList<File>();
+        if (fileSet == null) {
+            if (basedir == null) {
+                throw new BuildException(
+                        "Need a fileset or basedir attribute to be defined.");
+            }
+            return new ScmFileSet(new File(basedir));
+        }
+        DirectoryScanner scanner = fileSet.getDirectoryScanner(getTask()
+                .getProject());
+        String[] fileNames = scanner.getIncludedFiles();
+        for (String fileName : fileNames) {
+            log("ScmFileSet: adding " + fileName, Project.MSG_DEBUG);
+            files.add(new File(fileName));
+        }
+        ScmFileSet scmFileSet = new ScmFileSet(fileSet.getDir(), files);
+        return scmFileSet;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/BranchAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.command.branch.BranchScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * This action will create new branch using a specific name.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *    &lt;hlm:branch baseDir="${repo.dir}/test1" name="test branch 1.0" /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="branch" category="SCM"
+ */
+public class BranchAction extends BaseDirectoryScmAction {
+
+    private String name;
+
+    /**
+     * Sets the branch name
+     * 
+     * @param name
+     * @ant.required
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute(ScmRepository repository) {
+
+        if (name == null)
+            throw new BuildException("'name' attribute is not defined.");
+
+        ScmManager scmManager = getTask().getScmManager();
+        BranchScmResult result;
+
+        try {
+            result = scmManager.branch(repository, getScmFileSet(), name);
+            if (!result.isSuccess()) {
+                throw new BuildException("SCM branch action error: "
+                        + result.getProviderMessage());
+            }
+            getTask().log(
+                    "Branch '" + name + "' has been created successfully.");
+        } catch (ScmException e) {
+            throw new BuildException("SCM Branch action failed: "
+                    + e.toString());
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ChangelogAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Iterator;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmRevision;
+import org.apache.maven.scm.ChangeSet;
+import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
+import org.apache.maven.scm.command.changelog.ChangeLogSet;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Get change log within a date range i.e startDate and endDate; 
+ * OR get change log of a number of days i.e numDays
+ * OR get change log within a range of starVersion and endVersion
+ * Parameters either startDate="20090317 18:49:31" endDate="20090318 24:49:31" datePattern="yyyyMMdd HH:mm:ss"
+ * Or numDays='1'
+ * Or startVersion="1" endVersion="2"
+ * Add logOutput="xml" to output log in xml format
+ * 
+ * <pre>
+ * &lt;hlm:scm verbose="false" scmUrl="scm:hg:${repo.dir}/changelog"&gt;
+ *     &lt;hlm:changelog basedir="${repo.dir}/changelog" startVersion="1" endVersion="2"/&gt;
+ *     &lt;hlm:changelog baseDir="${repo.dir}/changelog" numDays='1' /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="changelog" category="SCM"
+ */
+public class ChangelogAction extends BaseDirectoryScmAction {
+
+    private String startDate;
+
+    private String endDate;
+
+    private String datePattern;
+
+    private String logOutput;
+    
+    private int numDays;
+
+    private String startVersion;
+
+    private String endVersion;
+    private String xmlproperty;
+
+
+    /**
+     * Start version
+     * 
+     * @ant.not-required
+     */
+    public void setStartVersion(String startVersion) {
+        this.startVersion = startVersion;
+    }
+
+    /**
+     * End version
+     * 
+     * @ant.not-required
+     */
+    public void setEndVersion(String endVersion) {
+        this.endVersion = endVersion;
+    }
+
+    /**
+     * Start date
+     * 
+     * @ant.not-required
+     */
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    /**
+     * End date
+     * 
+     * @ant.not-required
+     */
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+
+    /**
+     * Number of days
+     * 
+     * @ant.not-required
+     */
+    public void setNumDays(int numDays) {
+        this.numDays = numDays;
+    }
+
+    /**
+     * Date pattern default is EEE MMM dd HH:mm:ss yyyy Z
+     * 
+     * @ant.not-required
+     */
+    public void setDatePattern(String datePattern) {
+        this.datePattern = datePattern;
+    }
+
+    /**
+     * Output pattern default is log output, to get xml output set logoutput=xml
+     * 
+     * @ant.not-required
+     */    
+    public void setLogOutput(String logOutput)
+    {
+        this.logOutput = logOutput;
+    }
+    
+    /**
+     * Output property for xml output of changeset list
+     * 
+     * @ant.not-required
+     */ 
+    public void setXMLProperty(String xmlproperty)
+    {
+        this.xmlproperty = xmlproperty;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void execute(ScmRepository repository) throws ScmException
+    {
+        ScmManager scmManager = getTask().getScmManager();
+        ScmRevision startRevision = new ScmRevision(startVersion);
+        ScmRevision endRevision = new ScmRevision(endVersion);
+
+        ChangeLogScmResult result;
+        Date start = null;
+        Date end = null;
+
+        if (numDays == 0 && (startDate != null || endDate != null) )
+        {
+            try {
+                SimpleDateFormat format = new SimpleDateFormat(datePattern);
+                start = format.parse(startDate);
+                end = format.parse(endDate);
+             }
+             catch (Exception e)
+             {
+                 throw new BuildException("Date Format not supported jash:" + e.getMessage());
+             }
+         }
+         else 
+         {
+             start = null;
+             end = null;
+         }
+        try
+        {
+        if (startVersion == null)
+            result = scmManager.changeLog(repository, getScmFileSet(), start, end, numDays, null, datePattern);
+        else
+            result = scmManager.changeLog(repository, getScmFileSet(), startRevision, endRevision, datePattern);
+        } catch (ScmException e) {
+            throw new BuildException(
+                    "Execution of SCM changelog action failed.");
+        }
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM changelog command unsuccessful.");
+        }
+        // Output changelog information
+        ChangeLogSet changelogSet = result.getChangeLog();
+        if (logOutput != null && logOutput.equals("xml"))
+        {
+            getTask().log(changelogSet.toXML());
+        }
+        else if (xmlproperty != null)
+        {
+            String output = "";
+            for (Object o : changelogSet.getChangeSets())
+            {
+                String revision = "";
+                ChangeSet c = (ChangeSet)o;
+                for (String x : c.toString().split("\n"))
+                {
+                    if (x.contains("revision:"))
+                        revision = x.replace("revision:", "");
+                }
+                
+                output = output + "<task><id>" + revision + "</id><synopsis>" + c.getComment() + "</synopsis><completed>" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(c.getDate()) + "</completed></task>";
+            }
+            
+            getProject().setProperty(xmlproperty, output);
+        }
+        else
+        {
+            Iterator iterator = changelogSet.getChangeSets().iterator();
+            while (iterator.hasNext())
+            {
+                getTask().log(iterator.next().toString());
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/CheckinAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Check in a specific set of files to the repository.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+ *    &lt;hlm:checkin message="Adding not_in_repo.txt..."&gt;
+ *        &lt;fileset dir="${repo.dir}/test1"&gt;
+ *            &lt;include name="not_in_repo.txt" /&gt;
+ *            &lt;exclude name="** /.${repo.type}/**" / &gt;
+ *        &lt;/fileset &gt;
+ *    &lt;/hlm:checkin &gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ * 
+ * @ant.type name="checkin" category="SCM"
+ */
+public class CheckinAction extends BaseDirectoryScmAction {
+    private String message;
+
+    public String getMessage() {
+        return message;
+    }
+
+    /**
+     * @param message
+     *            the message associated to the commit.
+     * @ant.required
+     */
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+
+        if (message == null)
+            throw new BuildException(
+                    "'message attribute has not been defined.'");
+
+        CheckInScmResult result;
+        try {
+            result = scmManager.checkIn(repository, getScmFileSet(), message);
+        } catch (ScmException e) {
+            throw new BuildException("SCM checkin action failed.");
+        }
+
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM checkin action failed.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/CheckoutAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+import org.apache.maven.scm.ScmRevision;
+import org.apache.maven.scm.ScmTag;
+
+import com.nokia.helium.scm.ant.types.Tag;
+import com.nokia.helium.scm.ant.types.Revision;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Checkout the defined project. Depending on the kind of repository used this
+ * can mean for example the cloning of a repository in the case of Mercurial or the copying of 
+ * a repository in the case of SVN.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test3"&gt;
+ *     &lt;hlm:checkout baseDir="${repo.dir}/cloned" /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="checkout" category="SCM"
+ */
+public class CheckoutAction extends BaseDirectoryScmAction {
+    private List<Tag> tags = new ArrayList<Tag>();
+    private List<Revision> revisions = new ArrayList<Revision>();
+
+    public Tag createTag() {
+        Tag tag = new Tag();
+        add(tag);
+        return tag;
+    }
+
+    public void add(Tag tag) {
+        tags.add(tag);
+    }
+
+    public Revision createRevision() {
+        Revision revision = new Revision();
+        add(revision);
+        return revision;
+    }
+
+    public void add(Revision revision) {
+        revisions.add(revision);
+    }
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+
+        if (tags.size() > 1)
+            throw new ScmException(
+                    "You can only specify one tag nested element.");
+
+        if (revisions.size() > 1)
+            throw new ScmException(
+                    "You can only specify one revision nested element.");
+
+        if ((tags.size() == 1) && (revisions.size() == 1)) {
+            throw new ScmException(
+                    "You can not specify nested element 'revision' and 'tag' together.");
+        }
+
+        CheckOutScmResult result;
+        try {
+            if (tags.size() == 1) {
+                result = scmManager.checkOut(repository, getScmFileSet(),
+                        new ScmTag(tags.get(0).getName()));
+            } else if (revisions.size() == 1) {
+                result = scmManager.checkOut(repository, getScmFileSet(),
+                        new ScmRevision(revisions.get(0).getName()));
+            } else {
+                result = scmManager.checkOut(repository, getScmFileSet());
+            }
+        } catch (ScmException e) {
+            throw new BuildException("SCM checkout action failed: " + e);
+        }
+
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM checkout action failed.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/DiffAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmRevision;
+import org.apache.maven.scm.command.diff.DiffScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Display the difference of the working copy with the latest copy in the
+ * configured scm url.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *    &lt;hlm:diff&gt;
+ *        &lt;fileset dir="${repo.dir}/test1"&gt;
+ *            &lt;include name="**" /&gt;
+ *            &lt;exclude name="** /.${repo.type}/**" /&gt;
+ *        &lt;/fileset&gt;
+ *    &lt;/hlm:diff&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="diff" category="SCM"
+ */
+public class DiffAction extends BaseDirectoryScmAction {
+    private String startVersion;
+    private String endVersion;
+
+    public String getStartVersion() {
+        return startVersion;
+    }
+
+    public void setStartVersion(String startVersion) {
+        this.startVersion = startVersion;
+    }
+
+    public String getEndVersion() {
+        return endVersion;
+    }
+
+    public void setEndVersion(String endVersion) {
+        this.endVersion = endVersion;
+    }
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+
+        ScmManager scmManager = getTask().getScmManager();
+        DiffScmResult result;
+
+        try {
+            result = scmManager.diff(repository, getScmFileSet(),
+                    new ScmRevision(startVersion), new ScmRevision(endVersion));
+        } catch (ScmException e) {
+            throw new BuildException("SCM diff action failed." + e.getMessage());
+        }
+
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM diff action failed."
+                    + result.getProviderMessage());
+        }
+
+        // Output diff information
+        log(result.getPatch());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ExportAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.command.export.ExportScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.scm.ant.types.Tag;
+
+/**
+ * Get a snapshot of a particular revision into a folder.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2"&gt;
+ *    &lt;hlm:export basedir="${repo.dir}/test2" destpath="${repo.dir}/export" /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="export" category="SCM"
+ */
+public class ExportAction extends BaseDirectoryScmAction {
+
+    private File destPath;
+    private List<Tag> tags = new ArrayList<Tag>();
+
+    /**
+     * Create a tag sub-element.
+     * @return the tag element.
+     */
+    public Tag createTag() {
+        Tag tag = new Tag();
+        add(tag);
+        return tag;
+    }
+
+    /**
+     * Add a tag.
+     * @param tag
+     */
+    public void add(Tag tag) {
+        tags.add(tag);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+
+        if (getDestPath() == null)
+            throw new ScmException("destPath attribute has not been provided.");
+
+        if (tags.size() > 1)
+            throw new ScmException(
+                    "You can only specify one tag nested element.");
+
+        ExportScmResult result;
+        try {
+            if (tags.size() == 0) {
+                getTask().log(
+                        "Exporting " + getScmFileSet().getBasedir() + " under "
+                                + getDestPath().getAbsolutePath() + ".");
+                result = scmManager.export(repository, getScmFileSet(),
+                        getDestPath().getAbsolutePath());
+            } else {
+                String t = tags.get(0).getName();
+                getTask().log(
+                        "Exporting revision " + t + " of "
+                                + getScmFileSet().getBasedir() + " under "
+                                + getDestPath().getAbsolutePath() + ".");
+                result = scmManager.export(repository, getScmFileSet(),
+                        new ScmTag(t), getDestPath().getAbsolutePath());
+            }
+        } catch (ScmException e) {
+            throw new BuildException("SCM export action failed: " + e);
+        }
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM export action failed: "
+                    + result.getProviderMessage());
+        }
+        // Dump created files.
+        for (Object file : result.getExportedFiles().toArray()) {
+            getTask().log(file.toString());
+        }
+    }
+
+    public File getDestPath() {
+        return destPath;
+    }
+
+    public void setDestPath(File destPath) {
+        this.destPath = destPath;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InfoAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.maven.scm.command.info.InfoScmResult;
+import com.nokia.maven.scm.manager.ExtendedScmManager;
+
+/**
+ * This action will display the global revision id for the repository.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *    &lt;hlm:checkout baseDir="${repo.dir}/info" /&gt;
+ *    &lt;hlm:info baseDir="${repo.dir}/info"/&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="info" category="SCM"
+ */ 
+public class InfoAction extends BaseDirectoryScmAction {
+
+    
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        InfoScmResult result;
+        try {
+            ExtendedScmManager scmManager = (ExtendedScmManager) getTask()
+                    .getScmManager();
+            result = scmManager.info(repository, new File(this.getBasedir()));
+            
+            if (!result.isSuccess()) {
+                throw new BuildException("SCM tags action error: "
+                        + result.getProviderMessage());
+            }
+            getTask().log(result.getRevision());
+            
+        } catch (ScmException e) {
+            throw new BuildException("SCM info action failed: "
+                    + e.getMessage());
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InitAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.provider.ScmProvider;
+import org.apache.maven.scm.repository.ScmRepository;
+
+import com.nokia.maven.scm.provider.ScmProviderExt;
+
+public class InitAction extends BaseDirectoryScmAction {
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+        ScmProvider provider = scmManager.getProviderByUrl(getTask().getScmUrl());
+
+        getTask().log("InitAction: " + repository);
+        ScmProviderExt providerExt = (ScmProviderExt) provider;
+        providerExt.init(repository);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/PullAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.maven.scm.command.pull.PullScmResult;
+import com.nokia.maven.scm.manager.ExtendedScmManager;
+
+/**
+ * Retrieve a set of changes from a remote database. This action is only
+ * supported in distributed SCM such as Mercurial or Git.
+ * 
+ * @ant.type name="pull" category="SCM"
+ */
+public class PullAction extends BaseDirectoryScmAction {
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        PullScmResult result;
+        try {
+            ExtendedScmManager scmManager = (ExtendedScmManager) getTask()
+                    .getScmManager();
+            result = scmManager.pull(repository, new File(this.getBasedir()));
+            if (!result.isSuccess()) {
+                throw new BuildException("SCM pull action error: "
+                        + result.getProviderMessage());
+            }
+        } catch (ScmException e) {
+            throw new BuildException("SCM pull action failed: "
+                    + e.getMessage());
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/RemoveAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.command.remove.RemoveScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Remove a set of file(s) from SCM control.
+ * 
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *    &lt;hlm:remove message="Nothing to remove..."&gt;
+ *        &lt;fileset dir="${repo.dir}/test1"&gt;
+ *            &lt;include name="not_in_repo.txt" /&gt;
+ *        &lt;/fileset&gt;
+ *    &lt;/hlm:remove&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="remove" category="SCM"
+ */
+public class RemoveAction extends BaseDirectoryScmAction {
+    private String message;
+
+    public String getMessage() {
+        return message;
+    }
+
+    /**
+     * @param message
+     *            the message associated to the change
+     * @ant.required
+     */
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        if (message == null)
+            throw new BuildException("message attribute has not been defined.");
+        // if (getBasedir() == null)
+        // throw new BuildException("basedir attribute has not been defined.");
+
+        ScmManager scmManager = getTask().getScmManager();
+        RemoveScmResult result;
+        try {
+            result = scmManager.remove(repository, getScmFileSet(), message);
+        } catch (ScmException e) {
+            throw new BuildException("SCM remove action failed: " + e);
+        }
+
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM remove action failed.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.ProjectComponent;
+
+public abstract class ScmAction extends ProjectComponent {
+    private ScmTask scmtask;
+
+    /**
+     * @return the task
+     */
+    public ScmTask getTask() {
+        return scmtask;
+    }
+
+    /**
+     * @param task
+     *            the task to set
+     */
+    public void setTask(ScmTask task) {
+        this.scmtask = task;
+    }
+
+    public String getName() {
+        String className = getClass().getName();
+        String commandName = className
+                .substring(className.lastIndexOf('.') + 1).toLowerCase();
+        return commandName;
+    }
+
+    /**
+     * This method needs to be implemented by your subclass.
+     * It is executed during the Task execute to achieve
+     * the relevant action.
+     * @param repository
+     * @throws ScmException
+     */
+    public abstract void execute(ScmRepository repository) throws ScmException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,249 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.maven.scm.manager.NoSuchScmProviderException;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.scm.repository.ScmRepositoryException;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+import com.nokia.maven.scm.manager.BasicExtendedScmManager;
+import com.nokia.maven.scm.manager.ExtendedScmManager;
+import com.nokia.maven.scm.provider.hg.HgScmProviderExt;
+
+/**
+ * This provides Ant support for a range of common SCM operations. They should work on 
+ * any Maven based SCM e.g. SVN, Mercurial, synergy.  The
+ * underlying SCM tool is defined by the URL format.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:hg:${pkg_detail.source}"&gt;
+ *    &lt;hlm:checkout basedir="${build.drive}${pkg_detail.dst}"/&gt;
+ *    &lt;hlm:tags basedir="${build.drive}${pkg_detail.dst}" reference="hg.tags.id${refid}"/&gt;
+ *    &lt;hlm:update basedir="${build.drive}${pkg_detail.dst}"&gt;
+ *        &lt;hlm:latestTag pattern="${pkg_detail.tag}"&gt;
+ *            &lt;hlm:tagSet refid="hg.tags.id${refid}" /&gt;
+ *        &lt;/hlm:latestTag&gt;
+ *    &lt;/hlm:update&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ * 
+ * @ant.task name="scm" category="SCM"
+ */
+public class ScmTask extends Task {
+
+    private ExtendedScmManager scmManager;
+
+    private String username;
+
+    private String password;
+
+    private String scmUrl;
+
+    private String basedir;
+
+    private List<ScmAction> actions = new ArrayList<ScmAction>();
+
+    private boolean verbose;
+    
+    private boolean failonerror = true;
+    
+
+    public ScmTask() {
+        setTaskName("scm");
+
+        scmManager = new BasicExtendedScmManager();
+
+        // Add all SCM providers we want to use
+        scmManager.setScmProvider("hg", new HgScmProviderExt());
+    }
+
+    public ScmManager getScmManager() {
+        return scmManager;
+    }
+
+    /**
+     * Set if the task should use verbose output on Maven SCM framework.
+     * 
+     * @param value
+     * @ant.not-required Default is false
+     */
+    public void setVerbose(boolean value) {
+        verbose = value;
+    }
+
+    /**
+     * Set the username, this field is required while user requires to be
+     * authenticated.
+     * 
+     * @param username
+     *            The user login
+     * @ant.not-required
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * Set the password, this field is required while user requires to be
+     * authenticated.
+     * 
+     * @param password
+     *            The user password
+     * @ant.not-required
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+    
+    /**
+     * Set if the build should keep going while any exception.
+     * 
+     * @param failonerror
+     * @ant.not-required Default is true
+     */
+    public void setFailonerror(boolean failonerror) {
+        this.failonerror = failonerror;
+    }
+
+    public String getScmUrl() {
+        return scmUrl;
+    }
+
+    /**
+     * Sets the SCM URL so the task knows what repository to use.
+     * 
+     * @param scmUrl
+     *            The URL to connect to
+     * @ant.required
+     */
+    public void setScmUrl(String scmUrl) {
+        this.scmUrl = scmUrl;
+    }
+
+    /**
+     * Add an SCM add action.
+     * 
+     * @param action
+     *            The add action.
+     * @ant.optional
+     */
+    public void addAdd(AddAction action) {
+        addAction(action);
+    }
+
+    public void addChangelog(ChangelogAction action) {
+        addAction(action);
+    }
+
+    public void addBranch(BranchAction action) {
+        addAction(action);
+    }
+
+    public void addCheckin(CheckinAction action) {
+        addAction(action);
+    }
+
+    public void addCheckout(CheckoutAction action) {
+        addAction(action);
+    }
+
+    public void addDiff(DiffAction action) {
+        addAction(action);
+    }
+
+    public void addRemove(RemoveAction action) {
+        addAction(action);
+    }
+
+    public void addStatus(StatusAction action) {
+        addAction(action);
+    }
+
+    public void addUpdate(UpdateAction action) {
+        addAction(action);
+    }
+
+    public ScmAction[] getActions() {
+        return (ScmAction[]) actions.toArray(new ScmAction[0]);
+    }
+
+    // Additional actions not supported by the core Maven API
+
+    public void addPull(PullAction action) {
+        addAction(action);
+    }
+
+    public void addTag(TagAction action) {
+        addAction(action);
+    }
+
+    public void addTags(TagsAction action) {
+        addAction(action);
+    }
+    
+    public void addInfo(InfoAction action) {
+        addAction(action);
+    }
+
+    public void addInit(InitAction action) {
+        addAction(action);
+    }
+
+    public void addExport(ExportAction action) {
+        addAction(action);
+    }
+
+    private void addAction(ScmAction action) {
+        action.setTask(this);
+        actions.add(action);
+    }
+
+    public void add(ScmAction action) {
+        addAction(action);
+    }
+
+    @Override
+    public final void execute() {        
+        try {
+            log("scm url: " + scmUrl);
+            ScmRepository repository = scmManager.makeScmRepository(scmUrl);
+            // Process all scm commands
+            for (ScmAction action : actions) {
+                action.execute(repository);
+            }
+        } catch (NoSuchScmProviderException ex) {
+            throw new BuildException("Could not find a provider.");
+        } catch (ScmRepositoryException ex) {
+            throw new BuildException(
+                    "Error while connecting to the repository: " + ex.getMessage());
+        } catch (Exception e) {
+          if ( failonerror ) {
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
+            }
+          else {
+            e.printStackTrace();
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/StatusAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.command.status.StatusScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Status will execute status action on the relevant repository, and reports
+ * basedir, or a specific set of file status.
+ *
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *    &lt;hlm:status&gt;
+ *       &lt;fileset dir="${repo.dir}/test1"&gt;
+ *          &lt;include name="**" /&gt;
+ *          &lt;exclude name="** /.${repo.type}/**" /&gt;
+ *       &lt;/fileset&gt;
+ *    &lt;/hlm:status&gt;
+ * &lt;/hlm:scm &gt;
+ *
+ * 
+ * @ant.type name="status" category="SCM"
+ */
+public class StatusAction extends BaseDirectoryScmAction {
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+
+        StatusScmResult result = scmManager.status(repository, getScmFileSet());
+
+        if (!result.isSuccess()) {
+            throw new BuildException("SCM status action failed: "
+                    + result.getProviderMessage());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.maven.scm.manager.ExtendedScmManager;
+
+/**
+ * This action will tag current repository revision using a specific name.
+ * 
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *     &lt;hlm:tag baseDir="${repo.dir}/test1" name="0.0.1" /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="tag" category="SCM"
+ */
+public class TagAction extends BaseDirectoryScmAction {
+    private String name;
+    private String level = "normal";
+
+    /**
+     * String that will be used to tag the current revision.
+     * 
+     * @param name
+     *            Name of the tag
+     * @ant.required
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * String that will be used to determine tag types, eg. local.
+     * 
+     * @param level
+     *            Level of the tag eg.local
+     * @ant.not-required
+     */
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        TagScmResult result;
+
+        if (name == null)
+            throw new BuildException("'name' attribute is not defined.");
+
+        if (getBasedir() == null)
+            throw new BuildException("'basedir' attribute is not defined.");
+
+        try {
+            ExtendedScmManager scmManager = (ExtendedScmManager) getTask()
+                    .getScmManager();
+            if (level.equals(new String("local"))) {
+                result = scmManager.tag(repository, new ScmFileSet(new File(
+                        getBasedir())), name, level);
+            } else {
+                result = scmManager.tag(repository, new ScmFileSet(new File(
+                        getBasedir())), name);
+            }
+
+            if (!result.isSuccess()) {
+                throw new BuildException("SCM tag action error: "
+                        + result.getProviderMessage());
+            }
+            getTask().log("Tag '" + name + "' has been created successfully.");
+        } catch (ScmException e) {
+            throw new BuildException("SCM tag action failed: " + e.toString());
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagsAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.scm.ant.types.TagSet;
+import com.nokia.maven.scm.command.tags.TagsScmResult;
+import com.nokia.maven.scm.manager.ExtendedScmManager;
+
+public class TagsAction extends BaseDirectoryScmAction {
+
+    private String reference;
+
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    @Override
+    public void execute(ScmRepository repository) throws ScmException {
+        TagsScmResult result;
+        try {
+            ExtendedScmManager scmManager = (ExtendedScmManager) getTask()
+                    .getScmManager();
+            result = scmManager.tags(repository, new File(this.getBasedir()));
+            if (!result.isSuccess()) {
+                throw new BuildException("SCM tags action error: "
+                        + result.getProviderMessage());
+            }
+
+            // Creating a TagSet
+            List<ScmTag> tags = result.getTags();
+            TagSet tagSet = new TagSet();
+            tagSet.setProject(getProject());
+            getTask().log("Tag list:");
+            for (ScmTag tag : tags) {
+                tagSet.createTag().setName(tag.getName());
+                getTask().log(" * " + tag.getName());
+            }
+            // Creating new reference
+            if (reference != null) {
+                getTask().log("Creating reference: " + reference);
+                getProject().addReference(reference, tagSet);
+            }
+
+        } catch (ScmException e) {
+            throw new BuildException("SCM tags action failed: "
+                    + e.getMessage());
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/UpdateAction.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.scm.ant.taskdefs;
+
+import java.util.List;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.tools.ant.BuildException;
+import org.apache.maven.scm.ScmRevision;
+
+import com.nokia.helium.scm.ant.types.Tag;
+import com.nokia.helium.scm.ant.types.Revision;
+
+/**
+ * Update the defined project for a specific revision or tag.
+ * 
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *     &lt;hlm:update basedir="${repo.dir}/test1" /&gt;
+ * &lt;/hlm:scm&gt;
+ *</pre>
+ *
+ * @ant.type name="update" category="SCM"
+ */
+public class UpdateAction extends BaseDirectoryScmAction {
+
+    private Tag tag;
+    private Revision revision;
+
+    public void add(Tag tag) {
+        this.tag = tag;
+    }
+
+    public Tag createTag() {
+        this.tag = new Tag();
+        return this.tag;
+    }
+
+    public void add(Revision revision) {
+        this.revision = revision;
+    }
+
+    public Revision createRevision() {
+        this.revision = new Revision();
+        return this.revision;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void execute(ScmRepository repository) throws ScmException {
+        ScmManager scmManager = getTask().getScmManager();
+
+        UpdateScmResult result;
+        try {
+            if (tag != null) {
+                result = scmManager.update(repository, getScmFileSet(),
+                        new ScmTag(tag.getName()));
+            } else if (revision != null) {
+                result = scmManager.update(repository, getScmFileSet(),
+                        new ScmRevision(revision.getName()));
+            } else {
+                result = scmManager.update(repository, getScmFileSet());
+            }
+
+            if (!result.isSuccess()) {
+                throw new BuildException("SCM update action error: "
+                        + result.getProviderMessage());
+            }
+
+            List<ScmFile> files = result.getUpdatedFiles();
+            for (ScmFile scmFile : files) {
+                getTask().log(scmFile.toString());
+            }
+        } catch (RuntimeException e) {
+            throw new BuildException("SCM update action failed: "
+                    + e.getMessage());
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/LatestTag.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.scm.ant.types;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+
+public class LatestTag extends Tag {
+
+    private String pattern;
+    private List<TagSet> tagSets = new ArrayList<TagSet>();
+    
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+    
+    public void add(TagSet tagSet) {
+        tagSets.add(tagSet);
+    }
+
+    @Override
+    public String getName() {
+        if (pattern == null)
+            throw new BuildException("'pattern' attribute has not been defined.");
+
+        List<Tag> tags = getCleanedList();
+        Collections.sort(tags, new TagComparator<Tag>(getPattern()));
+        
+        if (tags.isEmpty())
+            throw new BuildException("No tag found.");
+
+        getProject().log("Latest tag: " + tags.get(0).getName());
+        return tags.get(0).getName();
+    }
+
+    protected List<Tag> getCleanedList() {
+        Pattern pVer = getPattern();
+        List<Tag> tags = new ArrayList<Tag>();
+        for (Tag tag : getTags()) {
+            if (pVer.matcher(tag.getName()).matches()) {
+                tags.add(tag);
+            }
+        }
+        return tags;
+    }
+    
+    protected Pattern getPattern() {
+        // Quoting the current pattern
+        getProject().log("pattern: " + pattern, Project.MSG_DEBUG);
+        String qVer = pattern.replaceAll("([.\\:_()])", "\\\\$1");
+        getProject().log("quoted: " + qVer, Project.MSG_DEBUG);
+        // Replacing quoted \* into \d+
+        qVer = qVer.replaceAll("\\*", "(\\\\d+)");        
+        qVer = "^" + qVer + "$";
+        getProject().log("final: " + qVer, Project.MSG_DEBUG);
+        return Pattern.compile(qVer);
+    }
+    
+    protected List<Tag> getTags() {
+        List<Tag> tags = new ArrayList<Tag>();
+        for (TagSet ts : tagSets) {
+            if (ts.isReference()) {
+                ts = (TagSet)ts.getRefid().getReferencedObject(getProject());
+            }
+            for (Tag tag : ts.getTags()) {
+                tags.add(tag);
+            }
+        }
+        return tags;
+    }
+    
+    public class TagComparator<T extends Tag> implements Comparator<T> {
+        
+        // Pattern to match for the comparison
+        private Pattern pVer;
+        
+        public TagComparator(Pattern pattern) {
+            pVer = pattern;
+        }
+        
+        @Override
+        public int compare(T o1, T o2) {
+            getProject().log("Comparing: " + o1.getName() + ">" + o2.getName(), Project.MSG_DEBUG);
+            
+            if (o1.getName().equals(o2.getName()))
+                return 0;
+            Matcher m1 = pVer.matcher(o1.getName());
+            Matcher m2 = pVer.matcher(o2.getName());
+            m1.matches();
+            m2.matches();
+            int max = (m1.groupCount() > m2.groupCount()) ? m2.groupCount() : m1.groupCount();            
+            int i = 1;
+            while (i <= max) {
+                int i1 = Integer.decode(m1.group(i)).intValue();
+                int i2 = Integer.decode(m2.group(i)).intValue();
+                getProject().log("Comparing index " + i + ": " + i1 + " < " + i2, Project.MSG_DEBUG);
+                if (i1 != i2) {
+                    return i2 - i1;
+                }
+                i++;
+            }
+            return 0;
+        }
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Revision.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.scm.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+public class Revision extends DataType {
+
+    private String name;
+    
+    /**
+    * Sets the revision name  
+     *  
+     * @param name 
+     * @ant.required 
+     */
+     
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Tag.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.scm.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+public class Tag extends DataType {
+
+    private String name;
+    
+    /**
+    * Sets the tag name  
+     *  
+     * @param name
+     * @ant.required 
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/TagSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.scm.ant.types;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.types.DataType;
+
+public class TagSet extends DataType {
+
+    private List<Tag> tags = new ArrayList<Tag>();
+    
+    public void add(Tag tag) {
+        tags.add(tag);
+    }
+    
+    public Tag createTag() {
+        Tag tag = new Tag();
+        tags.add(tag);
+        return tag;
+    }
+    
+    public List<Tag> getTags() {
+        return new ArrayList<Tag>(tags);
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/info/AbstractInfoCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.maven.scm.command.info;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+
+public abstract class AbstractInfoCommand extends AbstractCommand
+{
+    
+    public InfoScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet,
+            CommandParameters parameters) throws ScmException
+    {
+        return executeInfoCommand(repository, fileSet, parameters);
+    }
+    
+    protected abstract InfoScmResult executeInfoCommand(ScmProviderRepository repository, ScmFileSet fileSetCommand, CommandParameters parameters) throws ScmException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/info/InfoScmResult.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.command.info;
+
+import org.apache.maven.scm.ScmResult;
+
+public class InfoScmResult extends ScmResult {
+    private String scmRevision = new String();
+    
+    public InfoScmResult(String commandLine, String providerMessage,
+            String commandOutput, boolean success) {
+        super(commandLine, providerMessage, commandOutput, success);
+    }
+
+    public InfoScmResult(String commandLine, String providerMessage,
+            String commandOutput, boolean success,
+            String scmRevision) {
+        super(commandLine, providerMessage, commandOutput, success);        
+        this.scmRevision = scmRevision;
+        }
+    
+    public String getRevision() {
+        return scmRevision;
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/init/InitScmResult.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.command.init;
+
+import org.apache.maven.scm.ScmResult;
+
+public class InitScmResult extends ScmResult {
+    public InitScmResult(String commandLine, String providerMessage,
+            String commandOutput, boolean success) {
+        super(commandLine, providerMessage, commandOutput, success);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/AbstractPullCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.maven.scm.command.pull;
+
+import org.apache.maven.scm.CommandParameter;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+
+public abstract class AbstractPullCommand extends AbstractCommand
+{
+    
+    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet,
+            CommandParameters parameters) throws ScmException
+    {
+        return executePullCommand(repository, fileSet, parameters.getScmVersion(CommandParameter.SCM_VERSION, new ScmTag("tip")));
+    }
+    
+    
+    protected abstract PullScmResult executePullCommand(ScmProviderRepository repository, ScmFileSet fileSet, ScmVersion scmVersion) throws ScmException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/PullScmResult.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.maven.scm.command.pull;
+
+import org.apache.maven.scm.ScmResult;
+
+public class PullScmResult extends ScmResult
+{
+    public PullScmResult( String commandLine, String providerMessage, String commandOutput, boolean success )
+    {
+        super( commandLine, providerMessage, commandOutput, success );
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/AbstractTagsCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.maven.scm.command.tags;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+
+public abstract class AbstractTagsCommand extends AbstractCommand
+{
+    
+    public TagsScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet,
+            CommandParameters parameters) throws ScmException
+    {
+        return executeTagsCommand(repository, fileSet, parameters);
+    }
+    
+    
+    protected abstract TagsScmResult executeTagsCommand(ScmProviderRepository repository, ScmFileSet fileSetCommand, CommandParameters parameters) throws ScmException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/TagsScmResult.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.command.tags;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmTag;
+
+public class TagsScmResult extends ScmResult {
+    private List<ScmTag> scmVersions = new ArrayList<ScmTag>();
+
+    public TagsScmResult(String commandLine, String providerMessage,
+            String commandOutput, boolean success) {
+        super(commandLine, providerMessage, commandOutput, success);
+    }
+
+    public TagsScmResult(String commandLine, String providerMessage,
+            String commandOutput, boolean success,
+            Enumeration<ScmTag> scmVersions) {
+        super(commandLine, providerMessage, commandOutput, success);
+        while (scmVersions.hasMoreElements()) {
+            ScmTag scmVersion = scmVersions.nextElement();
+            this.scmVersions.add(scmVersion);
+        }
+    }
+
+    public List<ScmTag> getTags() {
+        return scmVersions;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/BasicExtendedScmManager.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.manager;
+
+import java.io.File;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.manager.BasicScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+
+import com.nokia.maven.scm.command.pull.PullScmResult;
+import com.nokia.maven.scm.command.tags.TagsScmResult;
+import com.nokia.maven.scm.command.info.InfoScmResult;
+import com.nokia.maven.scm.provider.ScmProviderExt;
+
+public class BasicExtendedScmManager extends BasicScmManager implements
+        ExtendedScmManager {
+
+    @Override
+    public PullScmResult pull(ScmRepository repository, File path)
+            throws ScmException {
+        try {
+            ScmProviderExt provider = (ScmProviderExt) this
+                    .getProviderByRepository(repository);
+            return provider.pull(repository, path);
+        } catch (ClassCastException exc) {
+            throw new ScmException("The " + repository.getProvider().toString()
+                    + " does not support extended functionalities.");
+        }
+    }
+
+    @Override
+    public TagsScmResult tags(ScmRepository repository, File path) throws ScmException {
+        try {
+            ScmProviderExt provider = (ScmProviderExt) this
+                    .getProviderByRepository(repository);
+            return provider.tags(repository, new ScmFileSet(path), new CommandParameters());
+        } catch (ClassCastException exc) {
+            throw new ScmException("The " + repository.getProvider().toString()
+                    + " does not support extended functionalities.");
+        }
+    }
+    
+    @Override
+    public InfoScmResult info(ScmRepository repository, File path) throws ScmException {
+        try {
+            ScmProviderExt provider = (ScmProviderExt) this
+                    .getProviderByRepository(repository);
+            return provider.info(repository, new ScmFileSet(path), new CommandParameters());
+        } catch (ClassCastException exc) {
+            throw new ScmException("The " + repository.getProvider().toString()
+                    + " does not support extended functionalities.");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/ExtendedScmManager.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.manager;
+
+import java.io.File;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.repository.ScmRepository;
+
+import com.nokia.maven.scm.command.pull.PullScmResult;
+import com.nokia.maven.scm.command.tags.TagsScmResult;
+import com.nokia.maven.scm.command.info.InfoScmResult;
+
+/**
+ * Extended verison of the Maven ScmManager
+ */
+public interface ExtendedScmManager extends ScmManager
+{
+    String ROLE = ExtendedScmManager.class.getName();
+
+    /**
+     * Download changes from remote repository.
+     *
+     * @param repository  the source control system
+     * @param path     location of your local copy
+     * @return
+     * @throws ScmException if any
+     */
+    PullScmResult pull(ScmRepository repository, File path)
+        throws ScmException;
+
+    /**
+     * Get the tag list.
+     *
+     * @param repository  the source control system
+     * @param path     location of your local copy
+     * @return
+     * @throws ScmException if any
+     */
+    TagsScmResult tags(ScmRepository repository, File path)
+        throws ScmException;
+
+    /**
+     * Get the global revision number for the repository.
+     *
+     * @param repository  the source control system
+     * @param path     location of your local copy
+     * @return
+     * @throws ScmException if any
+     */
+    InfoScmResult info(ScmRepository repository, File path)
+        throws ScmException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/ScmProviderExt.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider;
+
+import java.io.File;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.repository.ScmRepository;
+
+import com.nokia.maven.scm.command.pull.PullScmResult;
+import com.nokia.maven.scm.command.tags.TagsScmResult;
+import com.nokia.maven.scm.command.info.InfoScmResult;
+
+public interface ScmProviderExt {
+
+    ScmResult init(ScmRepository repository) throws ScmException;
+
+    PullScmResult pull(ScmRepository repository, File path)
+            throws ScmException;
+
+    TagsScmResult tags(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException;
+
+    InfoScmResult info(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/HgScmProviderExt.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.maven.scm.provider.hg;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.nokia.maven.scm.provider.hg.command.log.HgChangeLogCommand;
+import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
+
+import org.apache.log4j.Logger;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.command.export.ExportScmResult;
+import org.apache.maven.scm.command.remove.RemoveScmResult;
+import org.apache.maven.scm.command.branch.BranchScmResult;
+import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgScmProvider;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.scm.repository.ScmRepositoryException;
+
+import com.nokia.maven.scm.command.pull.PullScmResult;
+import com.nokia.maven.scm.command.tags.TagsScmResult;
+import com.nokia.maven.scm.command.info.InfoScmResult;
+import com.nokia.maven.scm.provider.ScmProviderExt;
+import com.nokia.maven.scm.provider.hg.command.init.HgInitCommand;
+import com.nokia.maven.scm.provider.hg.command.pull.HgPullCommand;
+import com.nokia.maven.scm.provider.hg.command.remove.HgRemoveCommand;
+import com.nokia.maven.scm.provider.hg.command.tags.HgTagsCommand;
+import com.nokia.maven.scm.provider.hg.command.info.HgInfoCommand;
+import com.nokia.maven.scm.provider.hg.command.update.HgUpdateCommand;
+import com.nokia.maven.scm.provider.hg.command.checkout.HgCheckOutCommand;
+import com.nokia.maven.scm.provider.hg.command.export.HgExportCommand;
+import com.nokia.maven.scm.provider.hg.command.branch.HgBranchCommand;
+import com.nokia.maven.scm.provider.hg.command.tag.HgTagCommand;
+import com.nokia.maven.scm.provider.hg.repository.HgScmProviderRepository;
+
+public class HgScmProviderExt extends HgScmProvider implements ScmProviderExt {
+
+    private static Logger log = Logger.getLogger(HgScmProviderExt.class);
+    
+    public ScmResult init(ScmRepository repository) throws ScmException {
+        log.info("HgScmProviderExt.init()");
+
+        HgInitCommand command = new HgInitCommand();
+
+        return command.executeInitCommand(repository.getProviderRepository());
+    }
+
+    @Override
+    public CheckOutScmResult checkout(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+
+        HgCheckOutCommand command = new HgCheckOutCommand();
+        command.setLogger(getLogger());
+        return (CheckOutScmResult) command.executeCommand(repository, fileSet,
+                parameters);
+    }
+
+    @Override
+    public ChangeLogScmResult changelog(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+
+        HgChangeLogCommand command = new HgChangeLogCommand();
+        command.setLogger(getLogger());
+        return (ChangeLogScmResult) command.executeCommand(repository, fileSet,
+                parameters);
+    }
+
+    public PullScmResult pull(ScmRepository repository, File path)
+            throws ScmException {
+        HgPullCommand command = new HgPullCommand();
+        command.setLogger(getLogger());
+        return (PullScmResult) command.executeCommand(repository
+                .getProviderRepository(), new ScmFileSet(path),
+                new CommandParameters());
+    }
+
+    @Override
+    public UpdateScmResult update(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+        HgUpdateCommand command = new HgUpdateCommand();
+        command.setLogger(getLogger());
+        return (UpdateScmResult) command.executeCommand(repository, fileSet,
+                parameters);
+    }
+
+    public TagsScmResult tags(ScmRepository repository, ScmFileSet fileSet,
+            CommandParameters parameters) throws ScmException {
+        HgTagsCommand command = new HgTagsCommand();
+        command.setLogger(getLogger());
+        return (TagsScmResult) command.executeCommand(repository
+                .getProviderRepository(), fileSet, parameters);
+    }
+    
+    public InfoScmResult info(ScmRepository repository, ScmFileSet fileSet,
+            CommandParameters parameters) throws ScmException {
+        HgInfoCommand command = new HgInfoCommand();
+        command.setLogger(getLogger());
+        return (InfoScmResult) command.executeCommand(repository
+                .getProviderRepository(), fileSet, parameters);
+    }
+
+    @Override
+    public RemoveScmResult remove(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+        HgRemoveCommand command = new HgRemoveCommand();
+        command.setLogger(getLogger());
+        return (RemoveScmResult) command.execute(repository, fileSet,
+                parameters);
+    }
+
+    protected BranchScmResult branch(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+        HgBranchCommand command = new HgBranchCommand();
+        command.setLogger(getLogger());
+        return (BranchScmResult) command.execute(repository, fileSet,
+                parameters);
+    }
+
+    protected ExportScmResult export(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+        HgExportCommand command = new HgExportCommand();
+        command.setLogger(getLogger());
+        return (ExportScmResult) command.execute(repository, fileSet,
+                parameters);
+    }
+
+    @Override
+    public TagScmResult tag(ScmProviderRepository repository,
+            ScmFileSet fileSet, CommandParameters parameters)
+            throws ScmException {
+        HgTagCommand command = new HgTagCommand();
+        command.setLogger(getLogger());
+        return (TagScmResult) command.execute(repository, fileSet, parameters);
+    }
+
+    /* From official implementation */
+    private final class HgUrlParserResult {
+        private List<String> messages = new ArrayList<String>();
+        private ScmProviderRepository repository;
+        
+        public List<String> getMessages() {
+            return messages;
+        }
+        
+        public void setMessages(List<String> messages) {
+            this.messages = messages;
+        }
+        
+        public ScmProviderRepository getRepository() {
+            return repository;
+        }
+        
+        public void setRepository(ScmProviderRepository repository) {
+            this.repository = repository;
+        }
+        
+    }
+
+    private HgUrlParserResult parseScmUrl(String scmSpecificUrl) {
+        HgUrlParserResult result = new HgUrlParserResult();
+
+        URL url = null;
+        log.debug("HgScmProviderExt:parseScmUrl:" + scmSpecificUrl);
+        // try if it is an URL
+        try {
+            url = new URL(scmSpecificUrl);
+            HgScmProviderRepository repo = new HgScmProviderRepository(
+                    "file://localhost/");
+            repo.configure(url);
+            result.repository = repo;
+        } catch (MalformedURLException e) {
+            log.debug("HgScmProviderExt:parseScmUrl:MalformedURLException:"
+                    + e.getMessage());
+            // if the url is invalid then try a simple file. 
+            try {
+                result.setRepository(new HgScmProviderRepository(scmSpecificUrl));
+            } catch (Throwable et) {
+                log.debug("HgScmProviderExt:parseScmUrl:Throwable:"
+                        + et.getMessage());
+                result.getMessages().add("The filename provided is not valid: "
+                        + et.getMessage());
+                return result;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Overriding default implementation.
+     */
+    public List<String> validateScmUrl(String scmSpecificUrl, char delimiter) {
+        HgUrlParserResult result = parseScmUrl(scmSpecificUrl);
+        return result.messages;
+    }
+
+    /**
+     * Overriding default implementation.
+     */
+    public ScmProviderRepository makeProviderScmRepository(
+            String scmSpecificUrl, char delimiter)
+            throws ScmRepositoryException {
+        HgUrlParserResult result = parseScmUrl(scmSpecificUrl);
+
+        if (result.messages.size() > 0) {
+            throw new ScmRepositoryException("The scm url is invalid.",
+                    result.messages);
+        }
+        return result.repository;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/VersionChangeSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+ 
+package com.nokia.maven.scm.provider.hg;
+
+
+import org.apache.maven.scm.ChangeSet;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ChangeFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class VersionChangeSet extends ChangeSet
+{
+
+    private static final String DATE_PATTERN = "yyyy-MM-dd";
+    private static final String TIME_PATTERN = "HH:mm:ss";
+    private List<ScmVersion> scmVersionList;
+
+    /**
+     * Constructor used when attributes aren't available until later
+     */
+    public VersionChangeSet()
+    {
+        super();
+        scmVersionList = new ArrayList<ScmVersion>();
+    }
+
+    /**
+    * Setter for ScmVersion
+    */
+    public void setScmVersion(ScmVersion scmVersion) throws ScmException
+    {
+        scmVersionList.add(scmVersion);
+    }
+    
+    /**
+     * Getter for ChangeFile list.
+     *
+     * @return List of ScmVersion list.
+    */
+    public List<ScmVersion> getScmVersion()
+    {
+        return scmVersionList;
+    }
+    
+    /**
+    * Added tbranch\tag\revision and changed format to match "hg log --verbose" output. 
+    * File version has been removed, showing only file name
+    * @return String to output the VersionChangeSet result
+    */
+    @SuppressWarnings("unchecked")
+    @Override
+    public String toString()
+    {
+        String result = "";
+        for (ScmVersion versions : getScmVersion()) {
+           if (!versions.getName().equals("")) 
+           {
+               result += versions.getType().toLowerCase() + ":" + versions.getName() + "\n";
+            }
+        }
+        if (getAuthor() != null)
+            result += "user:" + getAuthor() + "\n";
+        if (getDate() != null)
+            result += "date:" + getDate() + "\n";
+        List<ChangeFile> files = getFiles();
+        if ( files.size() != 0 )
+        {
+            result += "files:";
+            for ( ChangeFile changeFile : files )
+            {
+                result += changeFile.getName() + " ";
+            }
+        }
+        if (!getComment().equals(""))
+            result += "\ndescription:" + getComment() + "\n";
+        return result;
+    }
+    
+     /**
+     * Provide the changelog entry as an XML snippet.
+     *
+     * @return a changelog-entry in xml format
+     * @task make sure comment doesn't contain CDATA tags - MAVEN114
+     */
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public String toXML()
+    {
+        StringBuffer buffer = new StringBuffer();
+
+        buffer.append( "\t<changelog-entry>\n" );
+
+        if ( getDate() != null )
+        {
+            buffer.append( "\t\t<date pattern=\"" + getDateFormatted() + "\">" )
+                .append( getDateFormatted() )
+                .append( "</date>\n" )
+                .append( "\t\t<time pattern=\"" + TIME_PATTERN + "\">" )
+                .append( getTimeFormatted() )
+                .append( "</time>\n" );
+        }
+
+        for (ScmVersion versions : getScmVersion()) {
+           if (!versions.getName().equals("")) 
+           {
+               buffer.append("\t\t<" + versions.getType().toLowerCase() + ">\n")
+                     .append("\t\t\t<name>")
+                     .append(versions.getName())
+                     .append("</name>\n");
+               buffer.append("\t\t</" + versions.getType().toLowerCase() + ">\n");
+            }
+        }
+
+        buffer.append( "\t\t<author><![CDATA[" )
+            .append( getAuthor() )
+            .append( "]]></author>\n" );
+        
+        List<ChangeFile> changeFiles = getFiles();
+        for ( ChangeFile changeFile :  changeFiles)
+        {
+            buffer.append( "\t\t<file>\n" )
+                .append( "\t\t\t<name>" )
+                .append( escapeValue( changeFile.getName() ) )
+                .append( "</name>\n" )
+                .append( "\t\t\t<revision>" )
+                .append( changeFile.getRevision() )
+                .append( "</revision>\n" );
+            buffer.append( "\t\t</file>\n" );
+        }
+        buffer.append( "\t\t<msg><![CDATA[" )
+            .append( removeCDataEnd( getComment() ) )
+            .append( "]]></msg>\n" );
+        buffer.append( "\t</changelog-entry>\n" );
+
+        return buffer.toString();
+    }
+
+     /**
+     * remove a <code>]]></code> from comments (replace it with <code>] ] ></code>).
+     *
+     * @param message The message to modify
+     * @return a clean string
+     */
+
+    private String removeCDataEnd( String message )
+    {
+        // check for invalid sequence ]]>
+        int endCdata;
+        while ( message != null && ( message.indexOf( "]]>" ) ) > -1 )
+        {
+            endCdata = message.indexOf( "]]>" );
+            message = message.substring( 0, endCdata ) + "] ] >" + message.substring( endCdata + 3, message.length() );
+        }
+        return message;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/branch/HgBranchCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.maven.scm.provider.hg.command.branch;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.branch.AbstractBranchCommand;
+import org.apache.maven.scm.command.branch.BranchScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Branch command to create a new branch
+ */
+public class HgBranchCommand
+    extends AbstractBranchCommand    
+{
+    /** {@inheritDoc} */
+    protected ScmResult executeBranchCommand( ScmProviderRepository repository, ScmFileSet fileSet, String name, String message )
+        throws ScmException
+    {
+        // Create command
+        File workingDir = fileSet.getBasedir();
+        List<String> branchCmd = new ArrayList<String>();
+        
+        //branch command
+        branchCmd.add("branch");
+        branchCmd.add(name);
+        
+        ScmResult branchResult = HgUtils.execute(workingDir, branchCmd.toArray(new String[branchCmd.size()]));
+
+        return new BranchScmResult(branchResult.getCommandLine(),
+                    branchResult.getProviderMessage(), branchResult
+                            .getCommandOutput(), branchResult.isSuccess());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider.hg.command.checkout;
+
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.ScmException;
+
+/**
+ */
+public class HgCheckOutCommand
+    extends org.apache.maven.scm.provider.hg.command.checkout.HgCheckOutCommand
+{
+    /** {@inheritDoc} */
+    protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+                                                        ScmVersion scmVersion )
+        throws ScmException
+    {
+           CheckOutScmResult result = super.executeCheckOutCommand(repo, fileSet, scmVersion);
+           if (result.getCheckedOutFiles().size() == 0 && !result.isSuccess() && result.getProviderMessage().contains("locate failed with exit code: 1.")) {
+               getLogger().info("Fixing locate calls which returns 1 when no files are found.");
+               result = new CheckOutScmResult(result.getCheckedOutFiles(), new ScmResult(result.getCommandLine(), result.getProviderMessage(), result.getCommandOutput(), true));
+           }
+           return result;
+    }
+       
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/export/HgExportCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider.hg.command.export;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.export.AbstractExportCommand;
+import org.apache.maven.scm.command.export.ExportScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+
+/**
+ * Implements the export command base on the Mercurial archiving functionality.
+ *
+ */
+public class HgExportCommand extends AbstractExportCommand {
+    @Override
+    protected ExportScmResult executeExportCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet,
+            ScmVersion version, String outputDir) throws ScmException {
+        File workingDir = fileSet.getBasedir();
+        File outputDirFile = new File(outputDir);
+        if (!outputDirFile.isDirectory()) {
+            throw new ScmException("Could not find directory: " + outputDirFile);
+        }
+        if (outputDirFile.list().length > 0) {
+            throw new ScmException("Output directory must be empty.");
+        }
+
+        // Create command
+        List<String> exportCmd = new ArrayList<String>();
+        exportCmd.add("archive");
+        exportCmd.add("--no-decode");
+        exportCmd.add("-t");
+        exportCmd.add("files");
+
+        // Which revision
+        exportCmd.add("-r");
+        exportCmd.add((version != null) ? version.getName() : "tip");
+
+        // Target dir
+        exportCmd.add(outputDirFile.getAbsolutePath());
+
+        getLogger().debug(
+                "hg:export:workingDir: " + workingDir.getAbsolutePath());
+        getLogger().debug(
+                "hg:export:outputDir: " + outputDirFile.getAbsolutePath());
+        ScmResult exportResult = HgUtils.execute(workingDir, exportCmd
+                .toArray(new String[exportCmd.size()]));
+
+        if (!exportResult.isSuccess()) {
+            return new ExportScmResult(exportResult.getCommandLine(),
+                    exportResult.getProviderMessage(), exportResult
+                            .getCommandOutput(), exportResult.isSuccess());
+        }
+
+        return new ExportScmResult(exportResult.getCommandLine(),
+                getFiles(outputDirFile));
+    }
+
+    protected List<String> getFiles(File dir) {
+        List<String> files = new ArrayList<String>();
+        for (File f : dir.listFiles()) {
+            if (f.isFile()) {
+                files.add(f.getAbsolutePath());
+            } else if (f.isDirectory()) {
+                files.addAll(getFiles(f));
+            }
+        }
+        return files;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/info/HgInfoCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider.hg.command.info;
+
+import java.io.File;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+
+import com.nokia.maven.scm.command.info.AbstractInfoCommand;
+import com.nokia.maven.scm.command.info.InfoScmResult;
+
+public class HgInfoCommand extends AbstractInfoCommand
+{
+    @Override
+    protected InfoScmResult executeInfoCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
+
+        File workingDir = fileSet.getBasedir();
+        // Update branch
+        String[] updateCmd = new String[] {
+            HgCommandConstants.REVNO_CMD
+        };
+        
+        HgInfoConsumer consumer = new HgInfoConsumer( getLogger() );
+        
+        ScmResult infoResult = HgUtils.execute(consumer , getLogger(), workingDir, updateCmd );
+
+        if ( !infoResult.isSuccess() )
+        {
+            return new InfoScmResult(infoResult.getCommandLine(), infoResult.getProviderMessage(), infoResult.getCommandOutput(), infoResult.isSuccess() );
+        }
+        
+        this.getLogger().info(infoResult.getCommandOutput());
+        return new InfoScmResult(infoResult.getCommandLine(), infoResult.getProviderMessage(), infoResult.getCommandOutput(), infoResult.isSuccess(), consumer.getRevision());
+        
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/info/HgInfoConsumer.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.maven.scm.provider.hg.command.info;
+
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.ScmFileStatus;
+
+public class HgInfoConsumer
+    extends HgConsumer
+{
+    private String scmRevision = new String();
+    public HgInfoConsumer( ScmLogger logger )
+    {
+        super( logger );
+    }
+
+    /** {@inheritDoc} */
+    public void doConsume( ScmFileStatus status, String trimmedLine )
+    {
+        String[] tagging = trimmedLine.split(" ");
+        if (tagging.length == 2) {
+            this.scmRevision = tagging[0];            
+            }
+    }
+    
+    public String getRevision()
+    {
+        return scmRevision;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/init/HgInitCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider.hg.command.init;
+
+import java.io.File;
+
+import org.apache.log4j.Logger;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.command.Command;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository;
+
+import com.nokia.maven.scm.command.init.InitScmResult;
+
+public class HgInitCommand extends AbstractCommand implements Command {
+    
+    private static Logger log = Logger.getLogger(HgInitCommand.class);
+
+    @Override
+    protected ScmResult executeCommand(ScmProviderRepository arg0,
+            ScmFileSet arg1, CommandParameters arg2) throws ScmException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public InitScmResult executeInitCommand(ScmProviderRepository repository)
+            throws ScmException {
+        // Get the directory in which to create a new repository. Only local
+        // filesystems supported.
+        log.info("executeInitCommand" + repository);
+        HgScmProviderRepository hgRepo = (HgScmProviderRepository) repository;
+        String uri = hgRepo.getURI();
+        String fileUri = uri.substring("scm:hg:file:/".length());
+        log.info(fileUri);
+        File hgRepoDir = new File(fileUri);
+
+        boolean workingDirReady = hgRepoDir.mkdirs();
+        if (!workingDirReady) {
+            throw new ScmException("Could not initiate test branch at: "
+                    + hgRepoDir);
+        }
+
+        // Create and run the command
+        String[] initCmd = new String[] { HgCommandConstants.INIT_CMD };
+        HgUtils.execute(new File("f:/hg"), initCmd);
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/log/HgChangeLogCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.maven.scm.provider.hg.command.log;
+
+
+import com.nokia.maven.scm.provider.hg.VersionChangeSet;
+
+import org.apache.maven.scm.ScmBranch;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.Command;
+import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
+import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
+import org.apache.maven.scm.command.changelog.ChangeLogSet;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+public class HgChangeLogCommand
+    extends AbstractChangeLogCommand
+    implements Command
+{
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Override
+    protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository scmProviderRepository,
+                                                          ScmFileSet fileSet, Date startDate, Date endDate,
+                                                          ScmBranch branch, String datePattern )
+        throws ScmException
+    {
+        String[] cmd = new String[] { HgCommandConstants.LOG_CMD, HgCommandConstants.VERBOSE_OPTION };
+        com.nokia.maven.scm.provider.hg.command.log.HgChangeLogConsumer consumer = new com.nokia.maven.scm.provider.hg.command.log.HgChangeLogConsumer( getLogger(), datePattern );
+        ScmResult result = HgUtils.execute( consumer, getLogger(), fileSet.getBasedir(), cmd );
+
+        List<VersionChangeSet> logEntries = consumer.getModifications();
+        List<VersionChangeSet> inRangeAndValid = new ArrayList<VersionChangeSet>();
+        startDate = startDate == null ? new Date( 0 ) : startDate; // From 1. Jan 1970
+        endDate = endDate == null ? new Date() : endDate; // Upto now
+
+        for ( VersionChangeSet logEntry : logEntries )
+        {
+            if ( logEntry.getFiles().size() > 0 )
+            {
+                if ( !logEntry.getDate().before( startDate ) && !logEntry.getDate().after( endDate ) )
+                {
+                    inRangeAndValid.add( logEntry );
+                }
+            }
+        }
+
+        ChangeLogSet changeLogSet = new ChangeLogSet( inRangeAndValid, startDate, endDate );
+        return new ChangeLogScmResult( changeLogSet, result );
+    }
+    
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Override
+    protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository repository, ScmFileSet fileSet,
+                                                      ScmVersion startVersion, ScmVersion endVersion,
+                                                      String datePattern )
+        throws ScmException
+    {
+        String param = "" + startVersion.getName() + ":" + ((endVersion.getName() != null) ? endVersion.getName() : "");
+        String[] cmd = new String[] { HgCommandConstants.LOG_CMD, HgCommandConstants.VERBOSE_OPTION, HgCommandConstants.REVISION_OPTION, param};
+        com.nokia.maven.scm.provider.hg.command.log.HgChangeLogConsumer consumer = new com.nokia.maven.scm.provider.hg.command.log.HgChangeLogConsumer( getLogger(), datePattern );
+        ScmResult result = HgUtils.execute( consumer, getLogger(), fileSet.getBasedir(), cmd );
+        List<VersionChangeSet> logEntries = consumer.getModifications();
+        Date startDate = new Date( 0 ); // From 1. Jan 1970
+        Date endDate = new Date(); // Upto now
+        ChangeLogSet changeLogSet = new ChangeLogSet(logEntries,startDate,endDate);
+        return new ChangeLogScmResult( changeLogSet, result );
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/log/HgChangeLogConsumer.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.maven.scm.provider.hg.command.log;
+
+import com.nokia.maven.scm.provider.hg.VersionChangeSet;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.ScmBranch;
+import org.apache.maven.scm.ScmRevision;
+import org.apache.maven.scm.ChangeFile;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.text.SimpleDateFormat;
+
+public class HgChangeLogConsumer extends HgConsumer {
+
+    private static final String TIME_PATTERN = "EEE MMM dd HH:mm:ss yyyy Z";
+
+    private static final String REVNO_TAG = "changeset: ";
+
+    private static final String TAG_BRANCH = "branch: ";
+
+    private static final String TAG_TAG = "tag: ";
+
+    private static final String AUTHOR_TAG = "user: ";
+
+    private static final String TIME_STAMP_TOKEN = "date: ";
+
+    private static final String MESSAGE_TOKEN = "description:";
+
+    private static final String MERGED_TOKEN = "merged: ";
+
+    private static final String FILES_TOKEN = "files: ";
+
+    private String prevLine = "";
+
+    private String prevPrevLine = "";
+
+    private ArrayList<VersionChangeSet> logEntries = new ArrayList<VersionChangeSet>();
+
+    private VersionChangeSet currentChange;
+
+    private VersionChangeSet lastChange;
+
+    private boolean isMergeEntry;
+
+    private String currentRevision;
+
+    private String currentTag; // don't know what to do with this
+
+    private String currentBranch;
+
+    private String userDatePattern;
+
+    private boolean spoolingComments;
+
+    private List<String> currentComment;
+
+    public HgChangeLogConsumer(ScmLogger logger, String userDatePattern) {
+        super(logger);
+        this.userDatePattern = userDatePattern;
+    }
+
+    public List<VersionChangeSet> getModifications() {
+        return logEntries;
+    }
+
+    /** {@inheritDoc} */
+    public void consumeLine(String line) {
+
+        // override default behavior which tries to pick through things for
+        // some standard messages. that
+        // does not apply here
+        doConsume(null, line);
+    }
+
+    /** {@inheritDoc} */
+    public void doConsume(ScmFileStatus status, String line) {
+        String tmpLine = line;
+        // If current status == null then this is a new entry
+        // If the line == "" and previous line was "", then this is also a new
+        // entry
+        if ((line.equals("") && (prevLine.equals("") && prevPrevLine.equals("")))
+                || currentComment == null) {
+            if (currentComment != null) {
+                StringBuffer comment = new StringBuffer();
+                int i = 0;
+                for (String eachComment : currentComment) {
+                    comment.append(eachComment);
+                    if (i + 1 < currentComment.size() - 1) {
+                        comment.append('\n');
+                    }
+                    i += 1;
+                }
+                currentChange.setComment(comment.toString());
+            }
+
+            spoolingComments = false;
+
+            // If last entry was part a merged entry
+            if (isMergeEntry && lastChange != null) {
+                String comment = lastChange.getComment();
+                comment += "\n[MAVEN]: Merged from "
+                        + currentChange.getAuthor();
+                comment += "\n[MAVEN]:    " + currentChange.getDateFormatted();
+                comment += "\n[MAVEN]:    " + currentChange.getComment();
+                lastChange.setComment(comment);
+            }
+
+            // Init a new changeset
+            currentChange = new VersionChangeSet();
+            currentChange.setFiles(new ArrayList<ChangeFile>());
+            logEntries.add(currentChange);
+
+            // Reset member vars
+            currentComment = new ArrayList<String>();
+            currentRevision = "";
+            isMergeEntry = false;
+        }
+
+        if (spoolingComments) {
+            currentComment.add(line);
+        } else if (line.startsWith(MESSAGE_TOKEN)) {
+            spoolingComments = true;
+        } else if (line.startsWith(MERGED_TOKEN)) {
+            // This is part of lastChange and is not a separate log entry
+            isMergeEntry = true;
+            logEntries.remove(currentChange);
+            if (logEntries.size() > 0) {
+                lastChange = logEntries.get(logEntries
+                        .size() - 1);
+            } else {
+                getLogger().warn("First entry was unexpectedly a merged entry");
+                lastChange = null;
+            }
+        } else if (line.startsWith(REVNO_TAG)) {
+            tmpLine = line.substring(REVNO_TAG.length()).trim();
+            currentRevision = tmpLine;
+            try {
+                currentChange.setScmVersion(new ScmRevision(tmpLine));
+            } catch (ScmException se) {
+                getLogger().warn(se.getMessage());
+            }
+        } else if (line.startsWith(TAG_TAG)) {
+            tmpLine = line.substring(TAG_TAG.length()).trim();
+            currentTag = tmpLine;
+            try {
+                currentChange.setScmVersion(new ScmTag(tmpLine));
+            } catch (ScmException se) {
+                getLogger().warn(se.getMessage());
+            }
+        } else if (line.startsWith(TAG_BRANCH)) {
+            tmpLine = line.substring(TAG_BRANCH.length()).trim();
+            currentBranch = tmpLine;
+            try {
+                currentChange.setScmVersion(new ScmBranch(tmpLine));
+            } catch (ScmException se) {
+                getLogger().warn(se.getMessage());
+            }
+        } else if (line.startsWith(AUTHOR_TAG)) {
+            tmpLine = line.substring(AUTHOR_TAG.length());
+            tmpLine = tmpLine.trim();
+            currentChange.setAuthor(tmpLine);
+        } else if (line.startsWith(TIME_STAMP_TOKEN)) {
+            tmpLine = line.substring(TIME_STAMP_TOKEN.length()).trim();
+            Date date = null;
+            try {
+                SimpleDateFormat format = new SimpleDateFormat(TIME_PATTERN);
+                date = format.parse(tmpLine);
+                currentChange.setDate(date);
+            } catch (Exception e) {
+                getLogger().warn(
+                        "Consumer Change Log Date Format not supported:"
+                                + e.getMessage());
+            }
+        } else if (line.startsWith(FILES_TOKEN)) {
+            tmpLine = line.substring(FILES_TOKEN.length()).trim();
+            String[] files = tmpLine.split(" ");
+            for (String eachFile : files) {
+                ChangeFile changeFile = new ChangeFile(eachFile, currentRevision);
+                currentChange.addFile(changeFile);
+            }
+        } else {
+            if (!line.equals("")) {
+                getLogger().warn("Could not figure out: " + line);
+            }
+        }
+
+        // record previous line
+        prevLine = line;
+        prevPrevLine = prevLine;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/pull/HgPullCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider.hg.command.pull;
+
+import java.io.File;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+
+import com.nokia.maven.scm.command.pull.AbstractPullCommand;
+import com.nokia.maven.scm.command.pull.PullScmResult;
+
+
+public class HgPullCommand extends AbstractPullCommand
+{
+
+    @Override
+    protected PullScmResult executePullCommand(ScmProviderRepository repository,
+            ScmFileSet fileSet, ScmVersion scmVersion) throws ScmException {
+
+        File workingDir = fileSet.getBasedir();
+
+        // Update branch
+        String[] updateCmd = new String[] {
+            HgCommandConstants.PULL_CMD,
+        };
+        ScmResult pullResult = HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), workingDir, updateCmd );
+
+        if ( !pullResult.isSuccess() )
+        {
+            return new PullScmResult(pullResult.getCommandLine(), pullResult.getProviderMessage(), pullResult.getCommandOutput(), pullResult.isSuccess() );
+        }
+        
+        this.getLogger().info(pullResult.getCommandOutput());
+        return new PullScmResult(pullResult.getCommandLine(), pullResult.getProviderMessage(), pullResult.getCommandOutput(), pullResult.isSuccess() );
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/remove/HgRemoveCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+
+package com.nokia.maven.scm.provider.hg.command.remove;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.Command;
+import org.apache.maven.scm.command.remove.AbstractRemoveCommand;
+import org.apache.maven.scm.command.remove.RemoveScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+import org.apache.maven.scm.provider.hg.command.remove.HgRemoveConsumer;
+
+import java.io.File;
+
+/**
+ * Branch version of the remove command, to fix the command line generation.
+ */
+public class HgRemoveCommand
+    extends AbstractRemoveCommand
+    implements Command
+{
+    /** {@inheritDoc} */
+    protected ScmResult executeRemoveCommand( ScmProviderRepository repository, ScmFileSet fileSet, String message )
+        throws ScmException
+    {
+
+        String[] command = new String[] { HgCommandConstants.REMOVE_CMD };
+        command = HgUtils.expandCommandLine( command, fileSet );
+
+        File workingDir = fileSet.getBasedir();
+        HgRemoveConsumer consumer = new HgRemoveConsumer( getLogger(), workingDir );
+
+        ScmResult result = HgUtils.execute( consumer, getLogger(), workingDir, command );
+        return new RemoveScmResult( consumer.getRemovedFiles(), result );
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/tag/HgTagCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+
+package com.nokia.maven.scm.provider.hg.command.tag;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.Command;
+import org.apache.maven.scm.command.tag.AbstractTagCommand;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.provider.hg.command.inventory.HgListConsumer;
+import org.apache.maven.scm.provider.hg.command.tag.HgTagConsumer;
+import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * Tag
+ * 
+ * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
+ * @version $Id: HgTagCommand.java 686566 2008-08-16 21:52:46Z olamy $
+ */
+public class HgTagCommand extends AbstractTagCommand implements Command {
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    protected ScmResult executeTagCommand(
+            ScmProviderRepository scmProviderRepository, ScmFileSet fileSet,
+            String tag, String level) throws ScmException {
+        if (tag == null || StringUtils.isEmpty(tag.trim())) {
+            throw new ScmException("tag must be specified");
+        }
+
+        if (fileSet.getFileList().size() != 0) {
+            throw new ScmException(
+                    "This provider doesn't support tagging subsets of a directory");
+        }
+
+        File workingDir = fileSet.getBasedir();
+
+        // build the command
+        String[] tagCmd;
+        if (level.equals(new String("local"))) {
+            tagCmd = new String[] { HgCommandConstants.TAG_CMD, "--local",
+                    HgCommandConstants.MESSAGE_OPTION,
+                    "[maven-scm] copy for tag " + tag, tag };
+        } else {
+            tagCmd = new String[] { HgCommandConstants.TAG_CMD,
+                    HgCommandConstants.MESSAGE_OPTION,
+                    "[maven-scm] copy for tag " + tag, tag };
+        }
+        // keep the command about in string form for reporting
+        StringBuffer cmd = joinCmd(tagCmd);
+
+        HgTagConsumer consumer = new HgTagConsumer(getLogger());
+        ScmResult result = HgUtils.execute(consumer, getLogger(), workingDir,
+                tagCmd);
+        HgScmProviderRepository repository = (HgScmProviderRepository) scmProviderRepository;
+        if (result.isSuccess()) {
+            // now push
+            // Push to parent branch if any
+            if (!repository.getURI().equals(
+                    fileSet.getBasedir().getAbsolutePath())) {
+                String[] pushCmd = new String[] { HgCommandConstants.PUSH_CMD,
+                        repository.getURI() };
+                result = HgUtils.execute(new HgConsumer(getLogger()),
+                        getLogger(), fileSet.getBasedir(), pushCmd);
+            }
+        } else {
+            throw new ScmException("Error while executing command "
+                    + cmd.toString());
+        }
+
+        // do an inventory to return the files tagged (all of them)
+        String[] listCmd = new String[] { HgCommandConstants.INVENTORY_CMD };
+        HgListConsumer listconsumer = new HgListConsumer(getLogger());
+        result = HgUtils.execute(listconsumer, getLogger(), fileSet
+                .getBasedir(), listCmd);
+        if (result.isSuccess()) {
+            List<ScmFile> files = listconsumer.getFiles();
+            ArrayList<ScmFile> fileList = new ArrayList<ScmFile>();
+            for (ScmFile scmFile : files) {
+                
+                if (!scmFile.getPath().endsWith(".hgtags")) {
+                    fileList
+                            .add(new ScmFile(scmFile.getPath(), ScmFileStatus.TAGGED));
+                }
+            }
+
+            return new TagScmResult(fileList, result);
+        } else {
+            throw new ScmException("Error while executing command "
+                    + cmd.toString());
+        }
+    }
+
+    private StringBuffer joinCmd(String[] cmds) {
+        StringBuffer result = new StringBuffer();
+        int i = 0;
+        for (String cmd : cmds) {
+            String s = cmd;
+            result.append(s);
+            if (i < cmds.length - 1) {
+                result.append(" ");
+            }
+            i += 1;
+        }
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/tags/HgTagsCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.maven.scm.provider.hg.command.tags;
+
+import java.io.File;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+
+import com.nokia.maven.scm.command.tags.AbstractTagsCommand;
+import com.nokia.maven.scm.command.tags.TagsScmResult;
+
+
+public class HgTagsCommand extends AbstractTagsCommand
+{
+
+    @Override
+    protected TagsScmResult executeTagsCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
+
+        File workingDir = fileSet.getBasedir();
+        // Update branch
+        String[] updateCmd = new String[] {
+            "tags",
+        };
+        HgTagsConsumer consumer = new HgTagsConsumer( getLogger() );
+        ScmResult tagsResult = HgUtils.execute(consumer , getLogger(), workingDir, updateCmd );
+
+        if ( !tagsResult.isSuccess() )
+        {
+            return new TagsScmResult(tagsResult.getCommandLine(), tagsResult.getProviderMessage(), tagsResult.getCommandOutput(), tagsResult.isSuccess() );
+        }
+        
+        this.getLogger().info(tagsResult.getCommandOutput());
+        return new TagsScmResult(tagsResult.getCommandLine(), tagsResult.getProviderMessage(), tagsResult.getCommandOutput(), tagsResult.isSuccess(), consumer.getTags());
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/tags/HgTagsConsumer.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.maven.scm.provider.hg.command.tags;
+
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmRevision;
+import org.apache.maven.scm.ScmTag;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+/**
+ */
+public class HgTagsConsumer
+    extends HgConsumer
+{
+
+    private Hashtable<ScmTag, ScmRevision> tagMapping = new Hashtable<ScmTag, ScmRevision>();
+
+    public HgTagsConsumer( ScmLogger logger )
+    {
+        super( logger );
+    }
+
+    /** {@inheritDoc} */
+    public void doConsume( ScmFileStatus status, String trimmedLine )
+    {
+        String[] tagging = trimmedLine.split("\\s+");
+        if (tagging.length == 2) {
+            tagMapping.put(new ScmTag( tagging[0] ), new ScmRevision( tagging[1] ));
+        }
+    }
+
+    public Enumeration<ScmTag> getTags()
+    {
+        return tagMapping.keys();
+    }
+
+    public Hashtable<ScmTag, ScmRevision> getMapping()
+    {
+        return tagMapping;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/update/HgUpdateCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.maven.scm.provider.hg.command.update;
+
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.provider.hg.command.diff.HgDiffConsumer;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.command.update.UpdateScmResultWithRevision;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.ScmException;
+import org.codehaus.plexus.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import java.io.File;
+
+/**
+ */
+public class HgUpdateCommand extends
+        org.apache.maven.scm.provider.hg.command.update.HgUpdateCommand {
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    protected UpdateScmResult executeUpdateCommand(ScmProviderRepository repo,
+            ScmFileSet fileSet, ScmVersion tag) throws ScmException {
+        File workingDir = fileSet.getBasedir();
+
+        // Update branch
+        String[] updateCmd = new String[] {
+                "update",
+                HgCommandConstants.REVISION_OPTION,
+                tag != null && !StringUtils.isEmpty(tag.getName()) ? tag
+                        .getName() : "tip" };
+        ScmResult updateResult = HgUtils.execute(new HgConsumer(getLogger()),
+                getLogger(), workingDir, updateCmd);
+
+        if (!updateResult.isSuccess()) {
+            return new UpdateScmResult(null, null, updateResult);
+        }
+
+        // Find changes from last revision
+        int currentRevision = HgUtils.getCurrentRevisionNumber(getLogger(),
+                workingDir);
+        int previousRevision = currentRevision - 1;
+        String[] diffCmd = new String[] { HgCommandConstants.DIFF_CMD,
+                HgCommandConstants.REVISION_OPTION, "" + previousRevision };
+        HgDiffConsumer diffConsumer = new HgDiffConsumer(getLogger(),
+                workingDir);
+        ScmResult diffResult = HgUtils.execute(diffConsumer, getLogger(),
+                workingDir, diffCmd);
+
+        // Now translate between diff and update file status
+        List<ScmFile> updatedFiles = new ArrayList<ScmFile>();
+        List changes = new ArrayList();
+        List<ScmFile> diffFiles = diffConsumer.getChangedFiles();
+        Map diffChanges = diffConsumer.getDifferences();
+        for (ScmFile diffFile : diffFiles) {
+            changes.add(diffChanges.get(diffFile.getPath()));
+            if (diffFile.getStatus() == ScmFileStatus.MODIFIED) {
+                updatedFiles.add(new ScmFile(diffFile.getPath(),ScmFileStatus.PATCHED));
+            } else {
+                updatedFiles.add(diffFile);
+            }
+        }
+
+        return new UpdateScmResultWithRevision(updatedFiles, changes, String
+                .valueOf(currentRevision), diffResult);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/repository/HgScmProviderRepository.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+package com.nokia.maven.scm.provider.hg.repository;
+
+import java.net.URL;
+
+/**
+ * Custom implementation use to patch official hg implementation. It uses the
+ * URL class for the URL parsing rather than using custom parsing.
+ */
+public class HgScmProviderRepository extends
+        org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository {
+    private URL orgUrl;
+    private String url;
+
+    /**
+     * Default constructor.
+     */
+    public HgScmProviderRepository(String url) {
+        super(url);
+        this.url = url;
+    }
+
+    /**
+     * This method is used to do the actual repository settings.
+     * 
+     * @param url
+     *            the url which points to the repo.
+     */
+    public void configure(URL url) {
+        orgUrl = url;
+        setHost(url.getHost());
+        if (url.getUserInfo() != null) {
+            String[] info = url.getUserInfo().split(":");
+            if (info.length == 2) {
+                setUser(info[0]);
+                setPassword(info[1]);
+            }
+        }
+        if (url.getPort() != -1) {
+            setPort(url.getPort());
+        }
+    }
+
+    public String getURI() {
+        return (orgUrl != null) ? orgUrl.toString() : url;
+    }
+
+    /**
+     * @return A message if the repository as an invalid URI, null if the URI
+     *         seems fine.
+     */
+    public String validateURI() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public String toString() {
+        return "Hg Repository Interpreted from: " + orgUrl + ":\nProtocol: "
+                + orgUrl.getProtocol() + "\nHost: " + getHost() + "\nPort: "
+                + getPort() + "\nUsername: " + getUser() + "\nPassword: "
+                + getPassword() + "\nPath: " + orgUrl.getPath();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/abstract_unittest_scmtask.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,622 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : abstract_unittest_scmtask.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="abstract-unittest-scmtask" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="org.apache.ant.antunit">
+    <description>Helium Antlib SCM abtract unittests.</description>
+    
+    <property name="repo.type" value="hg" />
+    <property name="temp.dir" location="${ant.file.abstract-unittest-scmtask}/../temp" />
+    <property name="repo.dir" location="${temp.dir}/repo/${repo.type}" />
+
+    <!-- Defining the features -->
+    <taskdef name="scm" classname="com.nokia.helium.scm.ant.taskdefs.ScmTask" uri="http://www.nokia.com/helium" />
+    <typedef name="latestTag" classname="com.nokia.helium.scm.ant.types.LatestTag" uri="http://www.nokia.com/helium" />
+    <typedef name="tagSet" classname="com.nokia.helium.scm.ant.types.TagSet" uri="http://www.nokia.com/helium" />
+
+
+    <target name="setUp">
+        <delete dir="${temp.dir}" failonerror="false" />
+        <mkdir dir="${temp.dir}" />
+        <mkdir dir="${repo.dir}" />
+        <unzip src="./data/${repo.type}_test1.zip" dest="${repo.dir}" />
+        <unzip src="./data/${repo.type}_test2.zip" dest="${repo.dir}" />
+        <unzip src="./data/${repo.type}_test3.zip" dest="${repo.dir}" />
+    </target>
+
+    <target name="tearDown">
+        <delete dir="${temp.dir}" />
+    </target>
+
+    <!--
+     **************************************************************
+     ** STATUS
+     **************************************************************
+    -->
+    <target name="test-status">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:status>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:status>
+        </hlm:scm>
+        <echo file="${repo.dir}/test1/not_in_repo.txt">Not in repo</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:status>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:status>
+        </hlm:scm>
+        <au:assertLogContains text="[not_in_repo.txt:unknown]" />
+    </target>
+
+    <!--
+     **************************************************************
+     ** DIFF
+     **************************************************************
+    -->
+    <target name="test-diff">
+        <echo file="${repo.dir}/test1/not_in_repo.txt">Not in repo</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:diff>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:diff>
+        </hlm:scm>
+        <au:assertLogContains text="+Not in repo" />
+    </target>
+
+
+    <!--
+     **************************************************************
+     ** ADD
+     **************************************************************
+    -->
+    <target name="test-add">
+        <echo file="${repo.dir}/test1/not_in_repo.txt">Not in repo</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <au:assertLogContains text="[not_in_repo.txt:added]" />
+    </target>
+
+    <!--
+     **************************************************************
+     ** CHECKOUT
+     **************************************************************
+    -->
+    <target name="test-checkout-tip">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test3">
+            <hlm:checkout baseDir="${repo.dir}/cloned" />
+        </hlm:scm>
+        <au:assertLogContains text="hg clone -r tip" />
+        <au:assertFileExists file="${repo.dir}/cloned/revision0.txt" />
+        <au:assertFileExists file="${repo.dir}/cloned/revision1.txt" />
+    </target>
+
+    <target name="test-checkout-revision">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test3">
+            <hlm:checkout baseDir="${repo.dir}/cloned">
+                <revision name="1" />
+            </hlm:checkout>
+        </hlm:scm>
+        <au:assertLogContains text="hg clone -r 1" />
+        <au:assertFileExists file="${repo.dir}/cloned/revision0.txt" />
+        <au:assertFileDoesntExist file="${repo.dir}/cloned/revision2.txt" />
+    </target>
+
+    <target name="test-checkout-revision-error">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test3">
+                <hlm:checkout baseDir="${repo.dir}/cloned" revision="3" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <!--
+     **************************************************************
+     ** CHECKIN
+     **************************************************************
+    -->
+    <target name="test-checkin-message-missing" depends="test-add">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:checkin>
+                    <fileset dir="${repo.dir}/test1">
+                        <include name="not_in_repo.txt" />
+                        <exclude name="**/.${repo.type}/**" />
+                    </fileset>
+                </hlm:checkin>
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-checkin" depends="test-add">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:checkin message="Adding not_in_repo.txt...">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="not_in_repo.txt" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+    </target>
+
+
+    <!--
+     **************************************************************
+     ** TAGGING
+     **************************************************************
+    -->
+
+    <target name="test-tag-name-missing" depends="test-checkin">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:tag baseDir="${repo.dir}/test1" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-tag-basedir-missing" depends="test-checkin">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:tag name="1.0.0" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-tag" depends="setUp">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:tag baseDir="${repo.dir}/test1" name="0.0.1" />
+        </hlm:scm>
+        <au:assertLogContains text="Tag '0.0.1' has been created successfully" />
+    </target>
+
+    <target name="test-tag-local" depends="setUp">
+        <echo file="${repo.dir}/test1/newfile.txt">newly added</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:tag baseDir="${repo.dir}/test1" name="0.0.2" level="local" />
+        </hlm:scm>
+        <au:assertLogContains text="Tag '0.0.2' has been created successfully" />
+    </target>
+
+    <!--
+     **************************************************************
+     ** Remove
+     **************************************************************
+    -->
+    <target name="test-remove-message-missing" depends="test-checkin">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:remove />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-remove-nothing" depends="test-checkin">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:remove message="Nothing to remove..." />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-remove" depends="test-checkin">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:remove message="Nothing to remove...">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="not_in_repo.txt" />
+                </fileset>
+            </hlm:remove>
+        </hlm:scm>
+        <au:assertFileDoesntExist file="${repo.dir}/test1/not_in_repo.txt" />
+    </target>
+
+
+    <!--
+     **************************************************************
+     ** Update
+     **************************************************************
+    -->
+    <target name="test-update-noarg" depends="test-checkin">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:update />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-update-basedir" depends="test-checkin">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:update basedir="${repo.dir}/test1" />
+        </hlm:scm>
+    </target>
+
+    <target name="test-update-basedir-tag" depends="test-checkin">
+        <echo file="${repo.dir}/test1/not_in_repo2.txt">Not in repo2</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:checkin message="Adding not_in_repo2.txt...">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="not_in_repo2.txt" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:update basedir="${repo.dir}/test1">
+                <hlm:tag name="0" />
+            </hlm:update>
+        </hlm:scm>
+        <au:assertFileDoesntExist file="${repo.dir}/test1/not_in_repo2.txt" />
+    </target>
+
+    <target name="test-update-basedir-revision" depends="test-checkin">
+        <echo file="${repo.dir}/test1/not_in_repo2.txt">Not in repo2</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:checkin message="Adding not_in_repo2.txt...">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="not_in_repo2.txt" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+        <echo file="${repo.dir}/test1/not_in_repo3.txt">Not in repo3</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="**" />
+                    <exclude name="**/.${repo.type}/**" />
+                </fileset>
+            </hlm:add>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:checkin message="Adding not_in_repo3.txt...">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="not_in_repo3.txt" />
+                </fileset>
+            </hlm:checkin>
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:update basedir="${repo.dir}/test1">
+                <hlm:revision name="0" />
+            </hlm:update>
+        </hlm:scm>
+        <au:assertFileDoesntExist file="${repo.dir}/test1/not_in_repo3.txt" />
+    </target>
+
+    <!--
+     **************************************************************
+     ** EXPORT
+     **************************************************************
+    -->
+    <target name="test-export-noarg">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+                <hlm:export />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-export-basedir">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+                <hlm:export basedir="${repo.dir}/test2" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-export-basedir-destPath">
+        <mkdir dir="${repo.dir}/export" />
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+            <hlm:export basedir="${repo.dir}/test2" destpath="${repo.dir}/export" />
+        </hlm:scm>
+    </target>
+
+    <target name="test-export-basedir-destPath-tag-rev1">
+        <mkdir dir="${repo.dir}/export" />
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+            <hlm:export basedir="${repo.dir}/test2" destpath="${repo.dir}/export">
+                <tag name="1" />
+            </hlm:export>
+        </hlm:scm>
+        <au:assertFileDoesntExist file="${repo.dir}/export/file3.txt" />
+    </target>
+
+    <target name="test-export-basedir-destPath-tag-rev2">
+        <mkdir dir="${repo.dir}/export" />
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+            <hlm:export basedir="${repo.dir}/test2" destpath="${repo.dir}/export">
+                <tag name="2" />
+            </hlm:export>
+        </hlm:scm>
+        <au:assertFileExists file="${repo.dir}/export/file3.txt" />
+    </target>
+
+    <target name="test-export-basedir-destPath-invalid-tag">
+        <mkdir dir="${repo.dir}/export" />
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+                <hlm:export basedir="${repo.dir}/test2" destpath="${repo.dir}/export">
+                    <tag name="1.0.0" />
+                </hlm:export>
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-export-basedir-destPath-2tags">
+        <mkdir dir="${repo.dir}/export" />
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test2">
+                <hlm:export basedir="${repo.dir}/test2" destpath="${repo.dir}/export">
+                    <tag name="1" />
+                    <tag name="2" />
+                </hlm:export>
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <!--
+     **************************************************************
+     ** Branch
+     **************************************************************
+    -->
+    <target name="test-branch-name-missing">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:branch />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-branch-basedir-missing">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:branch name="test branch" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-branch" depends="setUp">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:branch baseDir="${repo.dir}/test1" name="test branch 1.0" />
+        </hlm:scm>
+        <au:assertLogContains text="Branch 'test branch 1.0' has been created successfully." />
+    </target>
+
+    <!--
+     **************************************************************
+     ** Changelog
+     **************************************************************
+    -->
+    <target name="test-changelog-basedir-missing">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:changelog />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-changelog" depends="setUp">
+
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:checkout baseDir="${repo.dir}/changelog" />
+            <hlm:tag baseDir="${repo.dir}/changelog" name="tag_0.2" />
+            <hlm:branch baseDir="${repo.dir}/changelog" name="test_0.1" />
+        </hlm:scm>
+
+        <echo file="${repo.dir}/changelog/newfile.txt">newly added</echo>
+        <echo file="${repo.dir}/changelog/newfile2.txt">newly added</echo>
+        <echo file="${repo.dir}/changelog/newfile3.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:${repo.type}:${repo.dir}/changelog">
+            <hlm:add>
+                <fileset dir="${repo.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${repo.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:changelog baseDir="${repo.dir}/changelog" numDays='1' />
+        </hlm:scm>
+
+        <au:assertLogContains text="tag:tip" />
+        <au:assertLogContains text="branch:test_0.1" />
+        <au:assertLogContains text="files:newfile.txt newfile2.txt newfile3.txt" />
+        
+        <echo file="${repo.dir}/changelog/newfile4.txt">newly added</echo>
+        <echo file="${repo.dir}/changelog/newfile5.txt">newly added</echo>
+        <echo file="${repo.dir}/changelog/newfile6.txt">newly added</echo>
+
+        <hlm:scm verbose="false" scmUrl="scm:hg:${repo.dir}/changelog">
+            <hlm:add>
+                <fileset dir="${repo.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${repo.dir}/changelog">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:changelog basedir="${repo.dir}/changelog" startVersion="2" />
+        </hlm:scm>
+        <au:assertLogContains text="revision:2:" />
+        
+        <hlm:scm verbose="false" scmUrl="scm:hg:${repo.dir}/changelog">
+            <hlm:changelog basedir="${repo.dir}/changelog" startVersion="1" endVersion="2"/>
+        </hlm:scm>
+        <au:assertLogContains text="revision:1:" />
+        <au:assertLogContains text="revision:2:" />
+    </target>
+    
+    <!--
+     **************************************************************
+     ** Info
+     **************************************************************
+    -->
+    <target name="test-info-basedir-missing">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:info />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-info-command" depends="setUp">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">            
+            <hlm:checkout baseDir="${repo.dir}/info" /> 
+            <hlm:info baseDir="${repo.dir}/info"/>
+        </hlm:scm>
+
+        <au:assertLogContains text="hg id" />
+    </target>
+    
+    <target name="test-info-command-result" depends="setUp">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">            
+            <hlm:checkout baseDir="${repo.dir}/info" /> 
+            <hlm:info baseDir="${repo.dir}/info"/>
+        </hlm:scm>
+
+        <au:assertLogContains text="00000000000" />
+    </target>
+    
+    <target name="test-info-command-result-failur" depends="setUp">
+        <au:expectfailure>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">            
+                <hlm:checkout baseDir="${repo.dir}/info" /> 
+                <hlm:info baseDir="${repo.dir}/info"/>
+            </hlm:scm>
+            <au:assertLogContains text="00000000001" />
+        </au:expectfailure>
+    </target>
+    
+    <!--
+     **************************************************************
+     ** Keep Going (faile on error)
+     **************************************************************
+    -->
+    <target name="test-keepgoing-false" depends="setUp">
+        <echo file="${repo.dir}/test1/newfile.txt">newly added</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1" failonerror="false">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>
+            <hlm:tag baseDir="${repo.dir}/test1" name="0.0.2" />
+            <hlm:tag baseDir="${repo.dir}/test1" name="0.0.2" />            
+        </hlm:scm>
+        <echo> Build Continue... </echo>
+        <au:assertLogContains text="Build Continue..." />
+    </target>
+    
+    <target name="test-keepgoing-true" depends="setUp">
+        <au:expectfailure>
+            <echo file="${repo.dir}/test1/newfile.txt">newly added</echo>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1" failonerror="true">
+                <hlm:add>
+                    <fileset dir="${repo.dir}/test1">
+                        <include name="*.txt" />
+                    </fileset>
+                </hlm:add>
+                <hlm:checkin message="Adding files .....">
+                    <fileset dir="${repo.dir}/test1">
+                        <include name="*.txt" />
+                    </fileset>
+                </hlm:checkin>
+                <hlm:tag baseDir="${repo.dir}/test1" name="0.0.3" />
+                <hlm:tag baseDir="${repo.dir}/test1" name="0.0.3" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+    
+    <target name="test-keepgoing-true-default" depends="setUp">
+        <au:expectfailure>
+            <echo file="${repo.dir}/test1/newfile.txt">newly added</echo>
+            <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+                <hlm:add>
+                    <fileset dir="${repo.dir}/test1">
+                        <include name="*.txt" />
+                    </fileset>
+                </hlm:add>
+                <hlm:checkin message="Adding files .....">
+                    <fileset dir="${repo.dir}/test1">
+                        <include name="*.txt" />
+                    </fileset>
+                </hlm:checkin>
+                <hlm:tag baseDir="${repo.dir}/test1" name="0.0.3" />
+                <hlm:tag baseDir="${repo.dir}/test1" name="0.0.3" />
+            </hlm:scm>
+        </au:expectfailure>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+module load java/1.6.0
+module load mercurial
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-scm.jar -lib ../../antlibs"
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib %CD%\..\..\bin\helium-core.jar -lib %CD%\..\..\bin\helium-scm.jar -lib %CD%\..\..\antlibs
+ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib SCM unittests.</description>
+
+    <taskdef resource="org/apache/ant/antunit/antlib.xml" uri="org.apache.ant.antunit" />
+
+    <target name="unittest" depends="unittest-scm" />
+
+    <target name="unittest-scm">
+        <au:antunit>
+            <fileset dir="." includes="**/test_*.ant.xml" />
+            <au:plainlistener />
+        </au:antunit>
+    </target>
+
+</project>
Binary file buildframework/helium/external/helium-antlib/scm/tests/data/hg_test1.zip has changed
Binary file buildframework/helium/external/helium-antlib/scm/tests/data/hg_test2.zip has changed
Binary file buildframework/helium/external/helium-antlib/scm/tests/data/hg_test3.zip has changed
Binary file buildframework/helium/external/helium-antlib/scm/tests/data/svn_test1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/test_hg_scmtask.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_hg_scmtask.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-hg-scmtask" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="org.apache.ant.antunit">
+    <description>Helium Antlib SCM Mercurial unittest.</description>
+
+    <property name="repo.type" value="hg" />
+
+    <import file="abstract_unittest_scmtask.ant.xml"/>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-signaling">
+    <description>Helium Antlib signaling.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="signaling"/>
+    
+    <import file="../core/build.xml"/>
+    
+    <path id="helium.signaling.classpath">
+        <fileset dir="${helium.antlib.root.dir}/bin" includes="helium-core.jar"/>
+        <fileset dir="${helium.antlib.root.dir}/bin" includes="helium-signaling.jar"/>
+    </path>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/demo/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib  %CD%\..\..\bin\helium-core.jar -lib  %CD%\..\..\bin\helium-signaling.jar -lib %CD%\..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/demo/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-signal-demo" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib signal demo.</description>
+
+    <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <!-- Fail now signal -->
+    <hlm:notifierList id="testSignalNotifiers">
+        <hlm:executeTaskNotifier>
+            <echo>Signal name:   ${signal.name}</echo>
+            <echo>Signal status: ${signal.status}</echo>
+            <echo>Notifier input: ${signal.notifier.inputs}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+    <hlm:signalInput id="testSignalInput" failBuild="never">
+        <hlm:notifierListRef refid="testSignalNotifiers" />
+        <notifierInput file="build.xml" />
+    </hlm:signalInput>
+
+    <target name="demo-signal">
+        <hlm:signal name="testSignal">
+            <hlm:signalInput refid="testSignalInput">
+                <notifierInput file="build.bat" />
+            </hlm:signalInput>
+        </hlm:signal>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/Notifier.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.signal;
+
+import java.util.List;
+import org.apache.tools.ant.Project;
+import com.nokia.helium.signal.ant.types.NotifierInput;
+
+/**
+ * This interface describe what method a Notifier needs to implement.
+ * 
+ */
+public interface Notifier {
+
+    /**
+     * Setting the project.
+     * 
+     * @param project
+     */
+    void setProject(Project project);
+
+    /**
+     * Sends the data to the requested sender list with specified notifier
+     * 
+     * @param senderList
+     *            sends the data to the list of requested user.
+     */
+    void sendData(String signalName, boolean failStatus,
+            NotifierInput notifierInput);
+
+    /**
+     * Sends the data to the requested sender list with specified notifier
+     * 
+     * @deprecated
+     */    
+    void sendData(String signalName, boolean failStatus,
+            List<String> fileList);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalExceptionMessage.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:To print the message on the shell in case of build fails for deffered Signals. 
+*
+*/
+ 
+package com.nokia.helium.signal;
+
+
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.HlmExceptionHandler;
+import org.apache.log4j.Logger;
+
+/**
+ * Class to check the signal is present in the deferred and now signal list.
+ * Print the message on the shell "Build completed with errors and warnings".
+ * 
+ */
+
+public class SignalExceptionMessage implements HlmExceptionHandler {
+    private Logger log = Logger.getLogger(SignalExceptionMessage.class);
+    
+    /**
+     * Implements the Exception method to print the build completed message.
+     * @param project
+     * @param module
+     * @param e
+     */
+    public void handleException(Project project, String module, Exception e) {
+        
+        if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
+            log.info("Build completed with errors and warnings.");
+        }
+        
+        if (SignalStatusList.getNowSignalList().hasSignalInList()) {
+            log.info("Build completed with errors and warnings.");
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalNeverFailMessage.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: To print the message on the shell in case of build has errors
+* is user sets failbuild status to never in signal configuration file.
+*
+*/
+ 
+package com.nokia.helium.signal;
+
+
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.types.*;
+import org.apache.log4j.Logger;
+
+/**
+ * Class to check the signal is present in the never signal list.
+ * Print the message on the shell "Build completed with errors and warnings".
+ * 
+ */
+public class SignalNeverFailMessage extends HlmPostDefImpl
+{
+    private Logger log = Logger.getLogger(SignalNeverFailMessage.class); 
+    
+    /**
+     * Override execute method to print build completed message.
+     * @param prj
+     * @param module
+     * @param targetNames
+     */
+    
+    public void execute(Project prj, String module, String[] targetNames) {
+        
+        if (SignalStatusList.getNeverSignalList().hasSignalInList()) {
+            log.info("Build completed with errors and warnings.");
+        }
+        
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatus.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.signal;
+
+import java.util.Date;
+
+/**
+ * Signal data holder;
+ */
+public class SignalStatus {
+
+    // Signal attributes.
+    private String name;
+    private String message;
+    private String targetName;
+    private Date signalTimeStamp;
+
+    /**
+     * Deferred signal holder.
+     * 
+     * @param signalName
+     *            name of the signal been raised
+     * @param message
+     *            message for the user
+     * @param targetName
+     *            current target.
+     */
+    public SignalStatus(String signalName, String message, String targetName, Date signalDateAndTime) {
+        this.name = signalName;
+        this.message = message;
+        this.targetName = targetName;
+        this.signalTimeStamp = signalDateAndTime;
+        
+    }
+    /**
+     * Returns the signal message.
+     * @return
+     */
+    public String getMessage() {
+        return message;
+    }
+
+    /**
+     * Returns signal name.
+     * @return
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Returns target name.
+     * @return
+     */
+    public String getTargetName() {
+        return targetName;
+    }
+    
+    /**
+     * Returns signal date and time.
+     * @return
+     */
+    public Date getTimestamp() {
+        return signalTimeStamp;
+    }
+    
+    /**
+     * Converts signal status object to string.
+     */
+    public String toString() {
+        return name + ": " + message + " : " + targetName;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatusList.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.signal;
+
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class implements at storage for SignalStatus object.
+ * It cannot be instantiated, it must be used through the typed list:
+ * getDeferredSignalList, getNowSignalList, getNeverSignalList
+ *
+ */
+public final class SignalStatusList {
+    
+    private static SignalStatusList deferSignalList = new SignalStatusList();
+    private static SignalStatusList nowSignalList = new SignalStatusList();
+    private static SignalStatusList neverSignalList = new SignalStatusList();
+
+    private Vector<SignalStatus> signals = new Vector<SignalStatus>();
+    
+    private Logger log = Logger.getLogger(this.getClass());
+    
+    
+    private SignalStatusList() { }
+    
+    /**
+     * Get the list of stored SignalStatus object.
+     * @return a Vector of SignalStatus instances.
+     */
+    public Vector<SignalStatus>getSignalStatusList() {
+        return new Vector<SignalStatus>(signals);
+    }
+    
+    /**
+     * Add a SignalStatus object to the list.
+     * 
+     * @param status
+     *            a signal
+     */
+    public void addSignalStatus(SignalStatus status) {
+        log.debug("SignalStatusList:addSignalStatus:msg:" + status);
+        signals.add(status);
+    }
+
+    /**
+     * Converts the error list into a user readable message.
+     * 
+     * @return the error message.
+     */
+    public String getErrorMsg() {
+        StringBuffer statusBuffer = new StringBuffer();
+        for (SignalStatus signalStatus : signals) {
+            statusBuffer.append(signalStatus);
+            statusBuffer.append("\n");
+        }
+        log.debug("SignalStatusList:getErrorMsg:msg:" + statusBuffer.toString());
+        return statusBuffer.toString();
+    }
+
+    /**
+     * Check if it has any pending signals stored.
+     * 
+     * @return true if any signal are pending.
+     */
+    public boolean hasSignalInList() {
+        log.debug("SignalStatusList:hasDeferMsgInList:size:"
+                + signals.size());
+        return signals.size() > 0;
+    }
+
+    /**
+     * Clear all deferred signals.
+     */
+    public void clearStatusList() {
+        log.debug("SignalStatusList:clearStatusList:size1:"
+                + signals.size());
+        signals.clear();
+        log.debug("SignalStatusList:clearStatusList:size2:"
+                + signals.size());
+    }
+    
+    /*
+     * Returns the deferred signal list.
+     */
+    public static SignalStatusList getDeferredSignalList() {
+        return deferSignalList;
+    }
+    
+    /*
+     * Returns the now signal list.
+     */
+    public static SignalStatusList getNowSignalList() {
+        return nowSignalList;
+    }
+    
+    /*
+     * Returns the never signal list.
+     */
+    public static SignalStatusList getNeverSignalList() {
+        return neverSignalList;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalList.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,475 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.signal.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.SignalStatus;
+import com.nokia.helium.signal.SignalStatusList;
+import com.nokia.helium.core.LogSource;
+import com.nokia.helium.signal.ant.types.SignalListenerConfig;
+import com.nokia.helium.signal.ant.types.SignalInput;
+import com.nokia.helium.signal.ant.types.SignalNotifierInput;
+import com.nokia.helium.signal.ant.types.SignalConfig;
+import com.nokia.helium.signal.ant.types.NotifierInput;
+import com.nokia.helium.signal.ant.types.SignalNotifierList;
+import com.nokia.helium.signal.ant.types.TargetCondition;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+import java.util.HashMap;
+import java.util.Date;
+import java.util.Enumeration;
+import org.apache.log4j.Logger;
+
+/**
+ * Helper class to store the list of notifiers.
+ */
+public class SignalList {
+
+    // default id list name
+    public static final String DEFAULT_NOTIFIER_LIST_REFID = "defaultSignalInput";
+
+
+    private Hashtable<String, SignalListenerConfig> signalListenerConfigs = new Hashtable<String, SignalListenerConfig>();
+
+    private HashMap<String, List<SignalListenerConfig>> targetsMap = new HashMap<String, List<SignalListenerConfig>>();
+
+    private Hashtable<String, SignalConfig> signalConfigs = new Hashtable<String, SignalConfig>();
+
+    private HashMap<String, List<SignalConfig>> targetsConfigMap = new HashMap<String, List<SignalConfig>>();
+
+    private Project project;
+
+    private Logger log = Logger.getLogger(this.getClass());
+
+     /**
+     * Constructor
+     */
+    @SuppressWarnings("unchecked")
+    public SignalList(Project project) {
+        this.project = project;
+        Hashtable<String, Object> references = project.getReferences();
+        Enumeration<String> keyEnum = references.keys();
+        while (keyEnum.hasMoreElements()) {
+            String key = keyEnum.nextElement();
+            if (references.get(key) instanceof SignalListenerConfig) {
+                log.debug("SignalList: Found reference: " + key);
+                SignalListenerConfig config = (SignalListenerConfig) references
+                        .get(key);
+                config.setConfigId(key);
+                signalListenerConfigs.put(key, config);
+                String targetName = config.getTargetName();
+                List<SignalListenerConfig> list;
+                if (targetsMap.get(targetName) == null) {
+                    list = new ArrayList<SignalListenerConfig>();
+                } else {
+                    list = targetsMap.get(targetName);
+                }
+                list.add(config);
+                targetsMap.put(targetName, list);
+            }
+            if (references.get(key) instanceof SignalConfig) {
+                log.debug("SignalList: Found reference: " + key);
+                SignalConfig config = (SignalConfig) references.get(key);
+                config.setConfigId(key);
+                signalConfigs.put(key, config);
+                Set targetNameSet = config.getTargetNameSet();
+                Iterator iter = targetNameSet.iterator();
+                while (iter.hasNext()) {
+                    String targetName = (String) iter.next();
+                    List<SignalConfig> list;
+                    if (targetsConfigMap.get(targetName) == null)
+                    {
+                        list = new ArrayList<SignalConfig>();
+                    }
+                    else
+                    {
+                        list = targetsConfigMap.get(targetName);
+                    }
+                    list.add(config);
+                    targetsConfigMap.put(targetName, list);
+                }
+            }
+        }
+    }
+
+    public Project getProject() {
+        return project;
+    }
+
+    /**
+     * Returns the list of SignalConfig discovered.
+     * @return a Vector of SignalList objects.
+     */
+    public Vector<SignalListenerConfig> getSignalListenerConfigList() {
+        return new Vector<SignalListenerConfig>(signalListenerConfigs.values());
+    }
+
+    /**
+     * Check if targetName is defined is defined by a targetCondition.
+     * @param targetName the target name
+     * @return a boolean, true if found, false otherwise.
+     */
+    public boolean isTargetInSignalList(String targetName) {
+        return targetsMap.get(targetName) != null;
+    }
+
+    /**
+     * Return the list of signalConfig defining a target.
+     * @param targetName
+     * @return
+     */
+    public List<SignalListenerConfig> getSignalListenerConfig(String targetName) {
+        return targetsMap.get(targetName);
+    }
+
+    protected void sendNotifications(Vector<Notifier> notifierList, String signalName) {
+        sendNotifications(notifierList, signalName, false, null);
+    }
+
+    public void processForSignal(Project prj, SignalNotifierInput signalNotifierInput, String signalName, String targetName, 
+            String errorMessage, boolean failBuild) {
+        SignalInput signalInput = signalNotifierInput.getSignalInput();
+        Vector<Notifier> notifierList = signalInput.getSignalNotifierList();
+        if (notifierList == null) {
+            Object obj = (Object) prj
+                    .getReference(DEFAULT_NOTIFIER_LIST_REFID);
+            if (obj instanceof SignalNotifierList) {
+                notifierList = ((SignalNotifierList) obj)
+                        .getNotifierList();
+            }
+        }
+        NotifierInput notifierInput = signalNotifierInput.getNotifierInput();
+        sendNotifications(notifierList, signalName, failBuild,
+                notifierInput);
+        if (failBuild) {
+            String failStatus = "now";
+            if (signalInput != null) {
+                failStatus = signalInput.getFailBuild();
+            } else {
+                log.debug("Could not find config for signal: " + signalName);
+            }
+            if (failStatus == null || failStatus.equals("now")) {
+                SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
+                        errorMessage, targetName, new Date()));
+                throw new BuildException(new SignalStatus(signalName,
+                        errorMessage, targetName, new Date()).toString());
+            } else if (failStatus.equals("defer")) {
+                log.debug("SignalList:adding defer signal:");
+                log.info("Signal " + signalName + " will be deferred.");
+                SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
+                        signalName, errorMessage, targetName, new Date()));
+            } else if (failStatus.equals("never")) {
+                log.debug("SignalList:adding never signal:");
+                SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
+                        errorMessage, targetName, new Date()));
+            } else if (!failStatus.equals("never")) {
+                SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
+                        errorMessage, targetName, new Date()));
+                throw new BuildException(new SignalStatus(signalName,
+                        errorMessage, targetName, new Date()).toString());
+            } else {
+                log.info("Signal " + signalName
+                        + " set to be ignored by the configuration.");
+            }
+        }
+    }
+    /**
+     * Send notification using the notification list.
+     * 
+     * @param notifierList
+     */
+    protected void sendNotifications(Vector<Notifier> notifierList, String signalName,
+            boolean failStatus, NotifierInput notifierInput) {
+        if (notifierList == null) {
+            return;
+        }
+        for (Notifier notifier : notifierList) {
+            if (notifier != null) {
+                notifier.sendData(signalName, failStatus, notifierInput);
+            }
+        }
+    }
+
+    public boolean checkAndNotifyFailure(Target target, Project prj) {
+        String targetName = target.getName();
+        String signalName = "unknown";
+        boolean retValue = false;
+        
+        if (isTargetInSignalList(targetName)) {
+            retValue = true;
+            for (SignalListenerConfig config : getSignalListenerConfig(targetName))
+            {
+                TargetCondition targetCondition = config
+                        .getTargetCondition();
+                String errorMessage = null;
+                log.debug("targetcondition:" + targetCondition);
+                Condition condition = null;
+                if (targetCondition != null) {
+                    condition = getFailureCondition(targetCondition);
+                }
+                errorMessage = config.getErrorMessage();
+                String refid = config.getConfigId();
+                log.debug("refid:" + refid);
+                Object  configCurrent = prj.getReference(refid);
+                if (configCurrent != null && configCurrent instanceof SignalListenerConfig) {
+                    signalName = refid;
+                }
+                processForSignal(prj, config.getSignalNotifierInput(), signalName, 
+                        targetName, errorMessage, condition != null);
+                log.debug("SignalList:fail:signalName: " + signalName);
+            }
+        }
+        return retValue;
+    }
+    
+    private Condition getFailureCondition(TargetCondition targetCondition) {
+        Condition retCondition = null;
+        Vector<Condition> conditionList = targetCondition.getConditions();
+        for (Condition condition : conditionList) {
+            log.debug("SignalList:getErrorMessage:" + condition.eval());
+            if (condition.eval()) {
+                retCondition = condition;
+                break;
+            }
+        }
+        return retCondition;
+    }
+
+
+    
+    /**
+     * Returns the list of variables available in the VariableSet
+     * 
+     * @return variable list
+     */
+    public Vector<SignalConfig> getSignalConfigList() {
+        return new Vector<SignalConfig>(signalConfigs.values());
+    }
+
+    public boolean isTargetInSignalConfigList(String targetName) {
+        return targetsConfigMap.get(targetName) != null;
+    }
+
+    public List<SignalConfig> getSignalConfigs(String targetName) {
+        return targetsConfigMap.get(targetName);
+    }
+
+    /**
+     * Send signal notification by running configured notifiers.
+     * 
+     * @param targetName
+     */
+    public void sendSignal(String signalName, boolean failStatus)
+    {
+        log.debug("Sending signal for:" + signalName);
+        if (signalConfigs.containsKey(signalName)) {
+            SignalConfig config = signalConfigs.get(signalName);
+            sendNotify(config.getSignalInput().getSignalNotifierList(),
+                    signalName, failStatus, 
+                    getFileList(project,config.getLogSourceList(), config.getSourceType()));
+        } else if (project.getReference(DEFAULT_NOTIFIER_LIST_REFID) != null) {
+            // sending using default settings
+            sendNotify(((SignalInput) project
+                    .getReference(DEFAULT_NOTIFIER_LIST_REFID))
+                    .getSignalNotifierList(), signalName, failStatus,null);
+        }
+    }
+
+    protected void sendNotify(Vector<Notifier> notifierList, String signalName) {
+        sendNotify(notifierList, signalName, false, null);
+    }
+
+    /**
+     * Send notification using the notification list.
+     * 
+     * @param notifierList
+     */
+    @SuppressWarnings("deprecation")
+    protected void sendNotify(Vector<Notifier> notifierList, String signalName,
+            boolean failStatus, List<String> fileList) {
+        if (notifierList == null) {
+            return;
+        }
+        for (Notifier notifier : notifierList) {
+            if (notifier != null) {
+                notifier.sendData(signalName, failStatus, fileList);
+            }
+        }
+    }
+
+    /**
+     * Handle the signal, either fail now, or defer the failure.
+     * 
+     * @param targetName
+     *            , target where the failure happened.
+     * @param errMsg
+     *            , the error message
+     */
+    public void fail(String signalName, String targetName, String errorMessage)
+    {
+        String failStatus = "now";
+        if (signalConfigs.containsKey(signalName)) {
+            SignalConfig config = signalConfigs.get(signalName);
+            SignalInput si = config.getSignalInput();
+            log.debug("failStatus: " + si);
+            if (si != null) {
+                failStatus = si.getFailBuild();
+                
+            }
+        } else {
+            log.debug("Could not find config for signal: " + signalName);
+        }
+        log.debug("failStatus: " + failStatus);
+        if (failStatus == null || failStatus.equals("now")) {
+            SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
+                    errorMessage, targetName, new Date()));
+            throw new BuildException(new SignalStatus(signalName,
+                    errorMessage, targetName, new Date()).toString());
+        } else if (failStatus.equals("defer")) {
+            log.debug("SignalList1:adding defer signal:");
+            log.info("Signal " + signalName + " will be deferred.");
+            SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
+                    signalName, errorMessage, targetName, new Date()));
+        } else if (failStatus.equals("never")) {
+            log.debug("SignalList1:adding never signal:");
+            SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
+                    errorMessage, targetName, new Date()));
+        } else if (!failStatus.equals("never")) {
+            SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
+                    errorMessage, targetName, new Date()));
+            throw new BuildException(new SignalStatus(signalName,
+                    errorMessage, targetName, new Date()).toString());
+        } else {
+            log.info("Signal " + signalName
+                    + " set to be ignored by the configuration.");
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void checkAndNotify(Target target, Project prj) {
+        String targetName = target.getName();
+        String signalName = "unknown";
+        
+        if (isTargetInSignalConfigList(targetName)) {
+            for (SignalConfig config : getSignalConfigs(targetName))
+            {
+                Vector<Notifier> notifierList = null;
+                TargetCondition targetCondition = config
+                        .getTargetCondition(targetName);
+                String errorMessage = null;
+                String failStatus = null;
+                boolean buildFailed = false;
+                if (targetCondition != null) {
+                    List<String> fileList = getFileList(prj, config.getLogSourceList(),config.getSourceType());
+                    log.debug("targetcondition:" + targetCondition);
+                    Condition condition = getFailureCondition(targetName,
+                            targetCondition, fileList);
+                    errorMessage = targetCondition.getMessage();
+                    String refid = config.getConfigId();
+                    log.debug("refid:" + refid);
+                    Object  configCurrent = prj.getReference(refid);
+                    if (configCurrent != null && configCurrent instanceof SignalConfig) {
+                        signalName = refid;
+                    }
+                    log.debug("SignalList:fail:signalName: " + signalName);
+                    notifierList = config.getSignalInput().getSignalNotifierList();
+                    if (notifierList == null) {
+                        Object obj = (Object) prj
+                                .getReference(DEFAULT_NOTIFIER_LIST_REFID);
+                        if (obj instanceof SignalNotifierList) {
+                            notifierList = ((SignalNotifierList) obj)
+                                    .getNotifierList();
+                        }
+                    }
+                    failStatus = config.getSignalInput().getFailBuild();
+                    log.debug("SignalList:failStatus:" + failStatus);
+                    buildFailed = condition != null;
+                    sendNotify(notifierList, signalName, buildFailed,
+                            fileList);
+                }
+                if (buildFailed) {
+                    if (failStatus == null || failStatus.equals("now")) {
+                        SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
+                                errorMessage, targetName, new Date()));
+                        throw new BuildException(new SignalStatus(signalName,
+                                errorMessage, targetName, new Date()).toString());
+                    } else if (failStatus.equals("defer")) {
+                        log.debug("SignalList1:adding defer signal:");
+                        log.info("Signal " + signalName + " will be deferred.");
+                        SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
+                                signalName, errorMessage, targetName, new Date()));
+                    } else if (failStatus.equals("never")) {
+                        log.debug("SignalList1:adding never signal:");
+                        SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
+                                errorMessage, targetName, new Date()));
+                    } else if (!failStatus.equals("never")) {
+                        SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
+                                errorMessage, targetName, new Date()));
+                        throw new BuildException(new SignalStatus(signalName,
+                                errorMessage, targetName, new Date()).toString());
+                    } else {
+                        log.info("Signal " + signalName
+                                + " set to be ignored by the configuration.");
+                    }
+                }
+            }
+        }
+    }
+
+    private List<String> getFileList(Project project, Vector<LogSource>sourceList,
+            String sourceType) {
+        List<String> fileList = new ArrayList<String>();
+        if (sourceList != null) {
+            for (LogSource l : sourceList)
+            {
+                File file = l.getFilename();
+                if (file != null && file.exists()) {
+                    fileList.add(project.replaceProperties(file.toString()));
+                }
+                if (sourceType == null || !sourceType.equals("combined")) {
+                    break;
+                    }
+            }
+        }
+        return fileList;
+    }
+    
+    private Condition getFailureCondition(String targetName,
+            TargetCondition targetCondition, List<String> fileList) {
+        Condition retCondition = null;
+        
+        for (Condition condition : targetCondition.getConditions()) {
+            log.debug("SignalList:getErrorMessage:" + condition.eval());
+            if (condition.eval()) {
+                retCondition = condition;
+                break;
+            }
+        }
+        return retCondition;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalListener.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.signal.ant;
+
+import org.apache.tools.ant.BuildListener;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.log4j.Logger;
+
+/**
+ * Listener class that can connect to Ant and log information regarding to build
+ * times, number of errors and such. Data is sent to Diamonds server, where it
+ * is processed further.
+ * 
+ * This class is listening all build related events. It catches the build
+ * start-finish, target start-finish events of Ant and gather build start-end
+ * time, errors/warnings and store in BuildData class. Stored data will be
+ * exported to XML and uploaded to Diamonds server after each specific target.
+ * For example after target "create-bom" this class will upload all BOM data to
+ * Diamonds.
+ * 
+ * 
+ */
+public class SignalListener implements BuildListener {
+
+    public static final String MODULE_NAME = "signaling";
+    
+    private boolean initialized;
+
+    private SignalList signalList;
+
+    private Project project;
+
+    private Logger log = Logger.getLogger(this.getClass());
+
+    /**
+     * Ant call this function when build start.
+     */
+    public void buildStarted(BuildEvent event) {
+        project = event.getProject();
+    }
+
+    /**
+     * Triggered when a target starts.
+     */
+    public void targetStarted(BuildEvent event) {
+        if (project == null) {
+            project = event.getProject();
+        }
+    }
+
+    private void initialize() {
+        signalList = new SignalList(project);
+        //signalList1 = new SignalList(project);
+    }
+
+    /**
+     * Triggered when a target finishes.
+     */
+    public void targetFinished(BuildEvent event) {
+        if (!initialized) {
+            log.debug("Signaling: Initializing Signaling");
+            initialize();
+            initialized = true;
+        }
+        log.debug("Signaling:targetFinished:sendsignal: " + event.getTarget());
+        try {
+            //boolean status = signalList1.checkAndNotifyFailure(event.getTarget(),event.getProject());
+            //if (!status) {
+            signalList.checkAndNotifyFailure(event.getTarget(),event.getProject());
+            //}
+        } catch (Exception e) {
+            log.debug("SignalListenerException: ", e);
+            throw new BuildException(e.getMessage());
+        }
+    }
+
+    /**
+     * Triggered when the build finishes.
+     */
+    public void buildFinished(BuildEvent event) {
+    }
+
+    /**
+     * Triggered when a task starts.
+     */
+    public void taskStarted(BuildEvent event) {
+    }
+
+    /**
+     * Triggered when a task finishes.
+     */
+    public void taskFinished(BuildEvent event) {
+    }
+
+    /**
+     * Triggered when a build message is logged.
+     */
+    public void messageLogged(BuildEvent event) {
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="signal" classname="com.nokia.helium.signal.ant.taskdefs.Signal"/>
+    <taskdef name="clearDeferredFailures" classname="com.nokia.helium.signal.ant.taskdefs.ClearDeferredFailures"/>
+    
+    <!-- Type definition -->
+    <typedef name="hasDeferredFailure" classname="com.nokia.helium.signal.ant.conditions.DeferredFailureCondition"/>
+    <typedef name="signalInput" classname="com.nokia.helium.signal.ant.types.SignalInput"/> 
+    <typedef name="signalConfig" classname="com.nokia.helium.signal.ant.types.SignalConfig"/>
+    <typedef name="signalListenerConfig" classname="com.nokia.helium.signal.ant.types.SignalListenerConfig"/>
+    <typedef name="notifierList" classname="com.nokia.helium.signal.ant.types.SignalNotifierList"/>
+    <typedef name="emailNotifier" classname="com.nokia.helium.signal.ant.types.EMAILNotifier"/>
+    <typedef name="executeTaskNotifier" classname="com.nokia.helium.signal.ant.types.ExecuteTaskNotifier"/>
+    <typedef name="xmlsource" classname="com.nokia.helium.signal.ant.types.XmlSource"/>
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/conditions/DeferredFailureCondition.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.signal.ant.conditions;
+
+import org.apache.tools.ant.taskdefs.condition.Condition;
+import com.nokia.helium.signal.SignalStatus;
+import com.nokia.helium.signal.SignalStatusList;
+
+import org.apache.tools.ant.ProjectComponent;
+
+/**
+ * The hasDeferredFailure condition allows you to know if any diferred failure are pending,
+ * or simply if a specific kind of failure has been deferred.
+ *
+ * Check for any pending failure, e.g: 
+ * <pre>
+ * &lt;condition property="pending.failure"&gt;
+ *     &lt;hlm:hasDeferredFailure/&gt;
+ * &lt;/condition&gt;
+ * </pre>
+
+ * Check for a particular pending failure e.g:
+ * <pre>
+ * &lt;condition property="pending.compile.failure"&gt;
+ *     &lt;hlm:hasDeferredFailure name="compileSignal"/&gt;
+ * &lt;/condition&gt;
+ * </pre>
+ * @ant.type name="hasDeferredFailure" category="Signaling"
+ * 
+ */
+public class DeferredFailureCondition extends ProjectComponent implements
+        Condition {
+
+    private String name;
+
+    /**
+     * Set the signal name.
+     * @ant.not-required Ignored by default
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Evaluate to true if name is not defined and has any pending failure. Or
+     * if name is defined and has any pending failure with that particular
+     * signal name.
+     */
+    public boolean eval() {
+        if (name != null) {
+            getProject().log("Has deferred " + name + " failure?");
+            for (SignalStatus signal : SignalStatusList.getDeferredSignalList().getSignalStatusList()) {
+                if (signal.getName().equals(name)) {
+                    getProject().log("Failure " + name + " found.");
+                    return true;
+                }
+            }
+        } else {
+            getProject().log(
+                    "Deferred failure: "
+                            + ((SignalStatusList.getDeferredSignalList().hasSignalInList()) ? "Yes"
+                                    : "No"));
+            return SignalStatusList.getDeferredSignalList().hasSignalInList();
+        }
+        return false;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/helium.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-signal" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+
+    <typedef name="signalstatusdef" classname="com.nokia.helium.signal.ant.types.SignalStatusDef" uri="http://www.nokia.com/helium"/>
+    <typedef name="exceptionsignal" classname="com.nokia.helium.signal.ant.types.SignalExceptionHandler" uri="http://www.nokia.com/helium"/>
+    <typedef name="buildfailmessage" classname="com.nokia.helium.signal.SignalExceptionMessage" uri="http://www.nokia.com/helium"/>
+    <typedef name="buildneverfailmessage" classname="com.nokia.helium.signal.SignalNeverFailMessage" uri="http://www.nokia.com/helium"/>
+
+    <hlm:deflist id="helium-signaling.list">
+        <hlm:listenerdef classname="com.nokia.helium.signal.ant.SignalListener" />
+        <hlm:signalstatusdef/>
+        <hlm:exceptionsignal/>
+        <hlm:buildfailmessage/>
+        <hlm:buildneverfailmessage/>
+    </hlm:deflist>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/taskdefs/ClearDeferredFailures.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.signal.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import com.nokia.helium.signal.SignalStatusList;
+
+/**
+ * This class implements a task that clear all pending failure. It is quite
+ * useful for testing.
+ */
+public class ClearDeferredFailures extends Task {
+
+    /**
+     * Does the cleaning.
+     */
+    @Override
+    public void execute() {
+        log("Clearing all pending failures.");
+        SignalStatusList.getDeferredSignalList().clearStatusList();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/taskdefs/Signal.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.signal.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+//import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Target;
+import java.util.Vector;
+import com.nokia.helium.signal.ant.SignalList;
+import com.nokia.helium.signal.ant.types.SignalNotifierInput;
+import com.nokia.helium.signal.ant.types.SignalConfig;
+
+/**
+ * This task provide a way to raise a signal.
+ * If the provided result is different from 0 then the mentioned signal
+ * is raised.
+ * 
+ * You can emit a signal based from the signal task, its behavior will get defined by the
+ * nested signalInput element. e.g:
+ * <pre>
+ * &lt;target name=&quot;raise-signal&quot;&gt;
+ *   &lt;-- Some computation that sets result property --&gt;
+ *   &lt;property name=&quot;result&quot; value=&quot;1&quot;/&gt;
+ *   
+ *   &lt;hlm:signal name=&quot;compileSignal&quot; result=&quot;${result}&quot;&gt;
+ *       &lt;-- Let's refer to some existing signal input configuration --&gt;
+ *       &lt;hlm:signalInput refid=&quot;testDeferredSignalInput&quot; /&gt;
+ *   &lt;/hlm:signal&gt;
+ * &lt;/target&gt;
+ * </pre>
+
+ * The following usage of the task has now been depreciated. 
+ * <pre>
+ * &lt;target name=&quot;raise-signal&quot;&gt;
+ *   &lt;-- Some computation that sets result property --&gt;
+ *   &lt;property name=&quot;result&quot; value=&quot;1&quot;/&gt;
+ *   
+ *   &lt;hlm:signal name=&quot;compileSignal&quot; result=&quot;${result}&quot;/&gt;
+ * &lt;/target&gt;
+ * </pre>
+ * 
+ * The execution of the <code>signal</code> task will behave depending on the <code>compileSignal</code> configuration,
+ * if not defined the build will fail.
+ * 
+ * @ant.task name="signal" category="Signaling"
+ */
+public class Signal extends Task {
+
+    private String name;
+    private String message;
+    private Integer result;
+
+    private Vector<SignalNotifierInput> signalNotifierInputs = new Vector<SignalNotifierInput>();
+    
+    public String getMessage() {
+        return message;
+    }
+
+    /**
+     * Helper function called by ant to create the new signalinput
+     */
+    public SignalNotifierInput createSignalNotifierInput() {
+        SignalNotifierInput input =  new SignalNotifierInput();
+        add(input);
+        return input;
+    }
+
+    public SignalNotifierInput getSignalNotifierInput() {
+        return (SignalNotifierInput)signalNotifierInputs.elementAt(0);
+    }
+    /**
+     * Helper function to add the created signalinput
+     * @param filter to be added to the filterset
+     */
+    public void add(SignalNotifierInput input) {
+        signalNotifierInputs.add(input);
+    }
+    
+    
+    /**
+     * Error message.
+     * 
+     * @ant.not-required
+     */
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Signal name to emit.
+     * 
+     * @ant.required
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * integer value representing the number of errors.
+     * 
+     * @ant.required
+     */
+    public void setResult(int result) {
+        this.result = new Integer(result);
+    }
+
+    @Override
+    public void execute() {
+        if (name == null)
+            throw new BuildException("'name' attribute is not defined.");
+        if (result == null) {
+            result = new Integer(0);
+        }
+
+        SignalList signalList = new SignalList(getProject());
+        boolean failStatus = result.intValue() != 0; 
+        if (failStatus) {
+            // keep same message as earlier.
+            log(name
+                    + ": "
+                    + name
+                    + " signal failed. Expected result was 0, actual result was "
+                    + result);
+
+            if (message == null) {
+                message = "Expected result was 0, actual result was " + result;
+            }
+        }
+        
+        // notify the user
+        String targetName = "signalExceptionTarget";  
+        Target target = this.getOwningTarget();
+        if (target != null) {
+            targetName = target.getName();
+        }
+
+        if (signalNotifierInputs.isEmpty()) {
+            log(
+                "Configuring a signal based on signalConfig is now deprecated. Please consider using nested signalInput.",
+                Project.MSG_WARN);
+            
+            Object config = getProject().getReference(name);
+            if (config == null || !(config instanceof SignalConfig)) {
+                throw new BuildException("Could not find signal config for signal name: " + name);
+            }
+            signalList.sendSignal(getName(), result.intValue() != 0);
+            if (result.intValue() != 0) {
+                // keep same message as earlier.
+                log(name
+                        + ": "
+                        + name
+                        + " signal failed. Expected result was 0, actual result was "
+                        + result);
+
+                if (message == null) {
+                    message = "Expected result was 0, actual result was " + result;
+                }
+                signalList.fail(getName(), this.getOwningTarget().getName(), message);
+            }
+            
+        } else {
+            signalList.processForSignal(getProject(), getSignalNotifierInput(), getName(),
+                targetName, message, failStatus);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,322 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.signal.ant.types;
+
+import com.nokia.helium.core.EmailDataSender;
+import java.util.Iterator;
+import com.nokia.helium.core.PropertiesSource;
+import com.nokia.helium.core.TemplateInputSource;
+import com.nokia.helium.core.XMLTemplateSource;
+import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.SignalListener;
+import com.nokia.helium.core.TemplateProcessor;
+import com.nokia.helium.core.HlmAntLibException;
+import java.util.List;
+import java.util.Hashtable;
+import java.util.ArrayList;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.log4j.Logger;
+import java.io.File;
+
+/**
+ * The emailNotifier provides you an easy way to send a you and email containing
+ * the summary of a build failure.
+ * 
+ * @ant.type name="emailNotifier" category="Signaling"
+ */
+public class EMAILNotifier extends DataType implements Notifier {
+
+    private Logger log = Logger.getLogger(EmailDataSender.class);
+    private TemplateProcessor templateProcessor = new TemplateProcessor();
+    private File defaultTemplate;
+    private File templateSrc; // Deprecated    
+    private String title;
+    private String smtp;
+    private String ldap;
+    private String rootdn;
+    private String notifyWhen = "never";
+    private String from;
+    private String additionalRecipients;
+
+    /**
+     * Rendering the template, and sending the result through email.
+     * @deprecated
+     * @param signalName
+     *            - Name of the signal that has been raised.
+     */
+    @SuppressWarnings("unchecked")
+    public void sendData(String signalName, boolean failStatus,
+            List<String> fileList) {
+        if (notifyWhen != null
+                && (notifyWhen.equals("always") || (notifyWhen.equals("fail") && failStatus)
+                        || (notifyWhen.equals("pass") && !failStatus))) {
+            if (templateSrc == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "templateSrc attribute has not been defined.");
+            }
+
+            if (title == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "title attribute has not been defined.");
+            }
+
+            if (smtp == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "smtp attribute has not been defined.");
+            }
+
+            if (ldap == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "ldap attribute has not been defined.");
+            }
+
+            log.debug("Sending data by e-mail.");
+            File emailOutputFile;
+            try {
+                emailOutputFile = File.createTempFile("helium_", "email.html");
+                emailOutputFile.deleteOnExit();
+                log.debug("sending data by e-mail:outputDir: "
+                        + emailOutputFile.getAbsolutePath());
+
+                List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+                sourceList.add(new PropertiesSource("ant", getProject()
+                        .getProperties()));
+                Iterator iter = fileList.iterator();
+                String sourceBaseName = "doc";
+                int count = 0;
+                while (iter.hasNext()) {
+                    String srcFile = (String) iter.next();
+                    sourceList.add(new XMLTemplateSource(sourceBaseName + count, 
+                            new File(srcFile)));
+                    count++;
+                }
+                Hashtable<String, String> signalProperties = new Hashtable<String, String>();
+                signalProperties.put("signal.name", signalName);
+                signalProperties.put("signal.status", "" + failStatus);
+                sourceList.add(new PropertiesSource("signaling",
+                        signalProperties));
+
+                templateProcessor.convertTemplate(templateSrc, emailOutputFile,
+                        sourceList);
+                EmailDataSender emailSender;
+                if (rootdn != null)
+                {
+                    String[] to = null;
+                    if (additionalRecipients != null)
+                    {
+                        to = additionalRecipients.split(",");
+                    }
+                    emailSender = new EmailDataSender(to, smtp, ldap, rootdn);
+                }
+                else
+                {
+                    emailSender = new EmailDataSender(
+                        additionalRecipients, smtp, ldap);
+                }
+                if (from != null)
+                {
+                    emailSender.setFrom(from);
+                }
+                log.debug("EmailNotifier:arlist: " + additionalRecipients);
+                Project subProject = getProject().createSubProject();
+                subProject.setProperty("signal.name", signalName);
+                subProject.setProperty("signal.status", "" + failStatus);
+                emailSender.addCurrentUserToAddressList();
+                emailSender.sendData("signaling", emailOutputFile
+                        .getAbsolutePath(), "application/html", subProject
+                        .replaceProperties(title), null);
+            } catch (Exception e) {
+                log.debug("EmailNotifier:exception: ", e);
+            }
+        }
+    }
+            
+    
+    /**
+     * Rendering the template, and sending the result through email.
+     * 
+     * @param signalName
+     *            - Name of the signal that has been raised.
+     */
+
+    @SuppressWarnings("unchecked")
+    public void sendData(String signalName, boolean failStatus,
+            NotifierInput notifierInput) {
+        if (notifyWhen != null
+                && (notifyWhen.equals("always") || (notifyWhen.equals("fail") && failStatus)
+                        || (notifyWhen.equals("pass") && !failStatus))) {
+            if (title == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "title attribute has not been defined.");
+            }
+
+            if (smtp == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "smtp attribute has not been defined.");
+            }
+
+            if (ldap == null) {
+                throw new HlmAntLibException(SignalListener.MODULE_NAME,
+                        "ldap attribute has not been defined.");
+            }
+            log.debug("Sending data by e-mail.");
+                EmailDataSender emailSender;
+                if (rootdn != null)
+                {
+                    String[] to = null;
+                    if (additionalRecipients != null)
+                    {
+                        to = additionalRecipients.split(",");
+                    }
+                    emailSender = new EmailDataSender(to, smtp, ldap, rootdn);
+                }
+                else
+                {
+                    emailSender = new EmailDataSender(
+                        additionalRecipients, smtp, ldap);
+                }
+                if (from != null)
+                {
+                    emailSender.setFrom(from);
+                }
+                log.debug("EmailNotifier:arlist: " + additionalRecipients);
+                Project subProject = getProject().createSubProject();
+                subProject.setProperty("signal.name", signalName);
+                subProject.setProperty("signal.status", "" + failStatus);
+                
+                emailSender.addCurrentUserToAddressList();
+                String filePath = "";
+                File fileToSend = null;
+                if (notifierInput != null) {
+                    fileToSend = notifierInput.getFile(".html");
+                    if (fileToSend != null) {
+                        filePath = fileToSend.toString();
+                    }
+                    
+                } 
+                if (fileToSend == null) {
+                    File emailOutputFile;
+                    try {
+                        emailOutputFile = File.createTempFile("helium_", "email.html");
+                        emailOutputFile.deleteOnExit();
+                        log.debug("sending data by e-mail:outputDir: "
+                                + emailOutputFile.getAbsolutePath());
+
+                        List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
+                        sourceList.add(new PropertiesSource("ant", getProject()
+                                .getProperties()));
+                        Hashtable<String, String> signalProperties = new Hashtable<String, String>();
+                        signalProperties.put("signal.name", signalName);
+                        signalProperties.put("signal.status", "" + failStatus);
+                        sourceList.add(new PropertiesSource("signaling",
+                                signalProperties));
+
+                        templateProcessor.convertTemplate(defaultTemplate, emailOutputFile,
+                                sourceList);
+                        filePath = emailOutputFile.toString();
+                    } catch (Exception e) {
+                        log.debug("EmailNotifier:exception: ", e);
+                    }
+                }
+                emailSender.sendData("signaling", filePath, 
+                        "application/html", subProject
+                        .replaceProperties(title), null);
+        }
+    }
+
+    /**
+     * Set when the notifier should emit the massage. Possible values are: never, always, fail, pass.
+     * @ant.not-required Default is never.
+     */
+    public void setNotifyWhen(String ntfyWhen) {
+        notifyWhen = ntfyWhen;
+    }
+
+    public String getNotifyWhen() {
+        return notifyWhen;
+    }
+
+    /**
+     * Define the template source file to use while rendering the message.
+     * 
+     * @ant.required
+     */
+    public void setDefaultTemplate(File template) {
+        this.defaultTemplate = template;
+    }
+
+    /**
+     * Define the template source file to use while rendering the message.
+     * @deprecated
+     * @ant.required
+     */
+    public void setTemplateSrc(File template) {
+        this.templateSrc = template;
+    }
+    
+    /**
+     * The title of the email.
+     * 
+     * @ant.required
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+     * The STMP server address.
+     * 
+     * @ant.required
+     */
+    public void setSmtp(String smtp) {
+        this.smtp = smtp;
+    }
+    
+    /**
+     * Who the email is sent from.
+     * 
+     * @ant.not-required
+     */
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    /**
+     * Comma separated list of additional email addresses.
+     * 
+     * @ant.not-required
+     */
+    public void setAdditionalRecipients(String ar) {
+        this.additionalRecipients = ar;
+    }
+
+    /**
+     * The LDAP server URL.
+     * 
+     * @ant.required
+     */
+    public void setLdap(String ldap) {
+        this.ldap = ldap;
+    }
+    
+    public void setRootdn(String rootdn) {
+        this.rootdn = rootdn;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+package com.nokia.helium.signal.ant.types;
+
+import java.util.ArrayList;
+import java.util.Vector;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.signal.Notifier;
+
+/**
+ * This notifier allows you to execute a task sequence when a specific signal
+ * is raised.
+ * 
+ * Task are executed in a subproject, and the 'signal.name' property is set
+ * to the emit signal name. The 'signal.status' property will contains the 
+ * status of the signal. Finally the 'signal.notifier.inputs' property will
+ * contains the list of NotifierInput passed to this Notifier.
+ * 
+ * If an error occur during the execution of the task sequence it will get ignored.
+ * 
+ * E.g:
+ * <pre>
+ * &lt;hlm:executeTaskNotifier&gt;
+ *    &lt;echo&gt;Something goes wrong, signal ${signal.name} has been raised.&lt;/echo&gt;
+ * &lt;/hlm:executeTaskNotifier&gt;
+ * </pre>
+ * 
+ * @ant.type name="executeTaskNotifier" category="Signaling"
+ */
+@SuppressWarnings("deprecation")
+public class ExecuteTaskNotifier extends DataType implements Notifier,
+        TaskContainer {
+
+    private Logger log = Logger.getLogger(ExecuteTaskNotifier.class);
+    private List<Task> tasks = new ArrayList<Task>();
+
+    @SuppressWarnings("unchecked")
+    public void sendData(String signalName, boolean failStatus,
+            NotifierInput notifierInput) {
+        try {
+            // Configure the project
+            Project prj = getProject().createSubProject();
+            prj.initProperties();
+            prj.setInputHandler(getProject().getInputHandler());
+            for (BuildListener bl : (Vector<BuildListener>)getProject().getBuildListeners()) {
+                prj.addBuildListener(bl);
+            }
+            getProject().copyUserProperties(prj);
+            
+            
+            prj.setProperty("signal.name", signalName);
+            prj.setProperty("signal.status", "" + failStatus);
+            // Converting the list of inputs into a string.
+            String inputs = "";
+            if (notifierInput != null) {
+                inputs += notifierInput.getFile().toString();
+            }
+            prj.setProperty("signal.notifier.inputs", inputs);
+            for (Task task : tasks) {
+                log.debug("Executing task: " + task.getTaskName());
+                task.setProject(prj);
+                task.perform();
+            }
+        } catch (BuildException e) {
+            log.debug(e);
+        }
+    }
+
+    @Override
+    public void addTask(Task task) {
+        log.debug("Adding task: " + task.getTaskName());
+        tasks.add(task);
+    }
+
+    @Override
+    public void sendData(String signalName, boolean failStatus, List fileList) {        
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/FailBuildEnum.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enum class for the failbuild attribute.
+ */
+public class FailBuildEnum extends EnumeratedAttribute {
+
+    /**
+     * @return the list of allowed values.
+     */
+    @Override
+    public String[] getValues() {
+        String[] values = new String[3];
+        values[0] = "now";
+        values[1] = "defer";
+        values[2] = "never";
+        return values;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/LogSourceList.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.core.LogSource;
+
+import com.nokia.helium.core.HlmAntLibException;
+import com.nokia.helium.signal.ant.SignalListener;
+
+import java.util.Vector;
+
+    
+/**
+ * This type is used by the signalConfig to store a list of 
+ * LogSource that will get passed to the notifiers.
+ * 
+ * @ant.type name="sources" category="Signaling"
+ * 
+ */
+public class LogSourceList extends DataType {
+
+    private Vector<LogSource> sourceList = new Vector<LogSource>();
+    
+    private String type;
+    
+    /**
+     * Creates a type of LogSource.
+     * @return logsource which will be processed during signaling.
+     */
+    public LogSource createLogSource() {
+        LogSource source =  new LogSource();
+        add(source);
+        return source;
+    }
+    
+    /**
+     * Adding a logsource to signal config.
+     * @param logsource
+     */
+    public void add(LogSource logSource) {
+        sourceList.add(logSource);
+    }
+
+    public void setType(String sourcesType) {
+        type = sourcesType; 
+    }
+    /**
+     * Returns the list of logsource available 
+     * @return logsource list
+     */
+    public Vector<LogSource> getLogSourceList() {
+        if (sourceList.isEmpty()) {
+            throw new HlmAntLibException(SignalListener.MODULE_NAME, "notifierlist is empty.");
+        }
+        return sourceList;
+    }
+
+    public String getSourceType() {
+        return type;
+    }    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+
+import java.io.File;
+import java.util.Vector;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.log4j.Logger;
+
+/**
+ * Helper class to store the signal notifier info.
+ */
+public class NotifierInput extends DataType
+{
+
+    private File file;
+
+    //Different notifier could choose specific file
+    private String pattern = ".html";
+
+    private Vector<FileSet> fileSetList = new Vector<FileSet>();
+
+    private Logger log = Logger.getLogger(this.getClass());
+
+    /**
+     * Adds the fileset (list of input log files to be processed).
+     *  @param fileSet fileset to be added
+     * 
+     */
+    public void add(FileSet fileSet) {
+        fileSetList.add(fileSet);
+    }   
+
+    public File getFile() {
+        return getFile(pattern);
+    }
+    
+    /**
+     * Updates the list of filelist from the input fileset.
+     *  @param fileSetList input fileset list
+     *  @return the matched files including the base dir. 
+     */
+    public File getFile(String pattern) {
+        if (file != null) {
+            return file;
+        }
+        File fileFromList = null;
+        for (FileSet fs : fileSetList) {
+            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+            String[] includedFiles = ds.getIncludedFiles();
+            for ( String filePath : includedFiles ) {
+                if (filePath.matches(pattern)) {
+                    fileFromList = new File(ds.getBasedir(), filePath);
+                    log.debug("matched file for pattern: " + pattern + ":" + fileFromList);
+                    break;
+                }
+            }
+        }
+        return fileFromList;
+    }
+
+
+    /**
+     * Helper function called by ant to set the input file.
+     * @param inputFile input file for notifier
+     */
+    public void setFile(File inputFile) {
+        file = inputFile;
+    }
+
+    /**
+     * Helper function called by ant to get the file
+     * @return the input file for notifier.
+     */
+    public String getPattern() {
+        return pattern ;
+    }
+
+    /**
+     * Helper function called by ant to get the file
+     * @return the input file for notifier.
+     */
+    public void setPattern(String ptn) {
+        pattern = ptn;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SMSNotifier.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+
+import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.signal.Notifier;
+import java.util.List;
+
+public class SMSNotifier extends DataType implements Notifier {
+
+    public SMSNotifier() {
+    }
+    /**
+     * Sends the data to the requested sender list with specified notifier
+     * @param senderList sends the data to the list of requested user.
+     */
+    public void sendData(String signalName, boolean failStatus,
+            NotifierInput notifierInput) {
+    }
+
+    /**
+     * Sends the data to the requested sender list with specified notifier
+     * 
+     * @deprecated
+     *    sends the data to the list of requested user.
+     */
+    public void sendData(String signalName, boolean failStatus,
+            List<String> fileList) {
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalConfig.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.HlmAntLibException;
+import com.nokia.helium.core.ant.types.ReferenceType;
+import com.nokia.helium.core.LogSource;
+import com.nokia.helium.signal.ant.SignalListener;
+
+import java.util.Set;
+import java.util.Vector;
+import java.util.HashMap;
+
+/**
+ * Deprecated: This Ant type defines a signal configuration. Please use signalListenerConfig element or signal task nested element.
+ * E.g:
+ * <pre>
+ * &lt;hlm:signalConfig name="mySignal" &gt;
+ *    &lt;hlm:targetCondition name="some-target-name" message="some-target-name triggered a signal" &gt;
+ *         &lt;/available file="some-file.txt" /&gt;
+ *    &lt;/hlm:targetCondition&gt;
+ * &lt;/hlm:signalConfig&gt;
+ * </pre>
+ *
+ * @ant.type name="signalConfig" category="Signaling"
+ * @deprecated
+ */
+
+public class SignalConfig extends DataType
+{
+   
+    private Vector<ReferenceType> signalInputListRef = new Vector<ReferenceType>();
+    private HashMap<String, TargetCondition> targetConditionsMap = new HashMap<String, TargetCondition>();
+    private Vector<TargetCondition> targetConditions = new Vector<TargetCondition>();
+    
+    private Vector<LogSourceList> sourceList = new Vector<LogSourceList>();
+    
+    private String configID;
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void setProject(Project project) {
+        super.setProject(project);
+        getProject().log("signalConfig element is now deprecated. Please consider moving to signalListenerConfig element or" + 
+                " signal task nested element.", Project.MSG_WARN);
+    }
+    
+    /**
+     * Creates data type ReferenceType and adds to the vector.
+     * @return ReferenceType which is created and stored by the config.
+     */
+    public ReferenceType createInputRef() {
+        ReferenceType inputRef =  new ReferenceType();
+        add(inputRef);
+        return (ReferenceType)inputRef;
+    }
+
+    /**
+     * Adds the reference to the container.
+     * @param ReferenceType to be added to the container
+     */
+    public void add(ReferenceType input) {
+        if (input != null) {
+            signalInputListRef.add(input);
+        }
+    }
+
+
+    /**
+     * Creates data type of list of sources and adds to the sourcelist.
+     * @return sourcelist which is created and stored by the config.
+     */
+    public LogSourceList createSources() {
+        LogSourceList source =  new LogSourceList();
+        add(source);
+        return (LogSourceList)source;
+    }
+
+    /**
+     * Adds the source list to the container.
+     * @param source list to be added to the container
+     */
+    public void add(LogSourceList source) {
+        if (source != null) {
+            if (sourceList.isEmpty()) {
+                sourceList.add(source);
+            }
+        }
+    }
+    
+    public Vector<LogSource> getLogSourceList() {
+        Vector<LogSource> logSource = null;
+        if (!sourceList.isEmpty()) {
+            logSource = sourceList.elementAt(0).getLogSourceList();
+        }
+        return logSource;
+    }
+    
+    public String getSourceType() {
+        if (!sourceList.isEmpty()) {        
+            return sourceList.elementAt(0).getSourceType();
+        }
+        return "default";
+    }
+
+    /**
+     * Creates type target condition of type TargetCondition.
+     * @return ReferenceType which is created and stored by the config.
+     */
+    public TargetCondition createTargetCondition() {
+        TargetCondition condition =  new TargetCondition();
+        add(condition);
+        return (TargetCondition)condition;
+    }
+
+    /**
+     * Helper function to store the config id
+     * @param config id to store.
+     */    
+    public void setConfigId(String confID) {
+        configID = confID;
+    }
+
+    /**
+     * Helper function to return the config id
+     * @return The configuration id
+     */   
+    public String getConfigId() {
+        return configID;
+    }
+
+    /**
+     * Adds the TargetCondition reference to the container.
+     * @param TargetCondition to be added to the container, to be processed during signaling.
+     */    
+    public void add(TargetCondition condition) {
+        if (condition != null) {
+            targetConditions.add(condition);
+        }
+    }    
+
+    /**
+     * Gets the signal input of this config.
+     * @return signal input stored in the config, by dereferencing the input ref. 
+     */    
+    public SignalInput getSignalInput() {
+        if (signalInputListRef == null) {
+            throw new HlmAntLibException(SignalListener.MODULE_NAME,"signalInputList null exception");
+        }
+        ReferenceType inputRef = (ReferenceType)signalInputListRef.elementAt(0);
+        Object obj = inputRef.getReferencedObject();
+        if (obj instanceof SignalInput) {
+            return (SignalInput)obj;
+        }
+        throw new HlmAntLibException(SignalListener.MODULE_NAME,"input type is not of type SignalInput");
+    }
+
+    /**
+     * Helper function to return the TargetCondition matching the target name.
+     * @param String name of the target for which the TargetCondition is returned,
+     */    
+    public TargetCondition getTargetCondition(String targetName) {
+        if (targetConditionsMap.isEmpty()) {
+            initializeTargetConditionsMap();
+        }
+        return targetConditionsMap.get(targetName);
+    }
+
+    /**
+     * Helper function to return the complete target name set of the config.
+     * @return Set, full set of target names referred by this config.
+     * @throws HlmAntLibException
+     */    
+    public Set<String> getTargetNameSet() {
+        if (targetConditionsMap.isEmpty()) {
+            initializeTargetConditionsMap();
+        }
+        return targetConditionsMap.keySet();
+    }
+
+    /**
+     * Initializes the TargetConditionsMap, mapping target name with corresponding TargetCondition
+     * for fast lookup. 
+     */    
+    @SuppressWarnings("deprecation")
+    private void initializeTargetConditionsMap() {
+        java.util.ListIterator<TargetCondition> iter = targetConditions.listIterator();
+        while (iter.hasNext()) {
+            TargetCondition condition = iter.next();
+            String name = condition.getName();
+            if (name != null) {
+                targetConditionsMap.put(name, condition);
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionHandler.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Reference;
+import com.nokia.helium.core.ant.HlmExceptionHandler;
+import com.nokia.helium.signal.ant.taskdefs.*;
+import com.nokia.helium.signal.ant.SignalListener;
+import org.apache.log4j.Logger;
+
+
+/**
+ * Class to store the status of the signal of a particular target.
+ */
+public class SignalExceptionHandler implements HlmExceptionHandler
+{
+    private Logger log = Logger.getLogger(SignalListener.class);
+    
+    /**
+     * This post action will fail the build if any pending failure exists. 
+     * @throws BuildException
+     */
+    public void handleException(Project project, String module, Exception e) {
+        log.debug("SignalExceptionHandler:handleException: start");
+        String refId = project.getProperty("signals.buildexception.signalinput");
+        if (refId != null) {
+            Signal signal = new Signal();
+            SignalNotifierInput signalNotifierInput = new SignalNotifierInput(); 
+            signal.add(signalNotifierInput);
+            Reference ref = new Reference(project, refId);
+            SignalInput signalInput = signalNotifierInput.createSignalInput();
+            signalInput.setRefid(ref);
+            signal.setProject(project);
+            signal.setName("buildExceptionSignal");
+            signal.setMessage(e.getMessage());
+            signal.execute();
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,136 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+
+import java.util.Vector;
+
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.HlmAntLibException;
+import com.nokia.helium.core.ant.types.ReferenceType;
+import org.apache.log4j.Logger;
+
+import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.SignalListener;
+
+/**
+ * SignalInput class which is a type to store input for signals
+ * Signals..
+ * &lt;targetCondition&gt;
+ *    &lt;hasSeverity severity="error" file="${build.cache.log.dir}/signals/prep_work_status.xml" /&gt;
+ * &lt;/targetCondition&gt;
+ * 
+ */
+public class SignalInput extends DataType
+{
+    private Vector<ReferenceType> notifierListRef = new Vector<ReferenceType>();
+
+    private Vector<NotifierInput> notifierInputList = new Vector<NotifierInput>();
+
+    // By default it is configured to fail the build.
+    private String failBuild = "now";
+
+    private Logger log = Logger.getLogger(SignalInput.class);
+
+    
+    /**
+     * Helper function called by ant to set the failbuild type
+     * @param failBuild type of failure for this input.
+     */
+    public void setFailBuild(FailBuildEnum failInput) {
+        failBuild = failInput.getValue();
+    }
+
+    /**
+     * Helper function called by ant to set the failbuild type
+     * @param failBuild type of failure for this input.
+     */
+    public String getFailBuild() {
+        return failBuild;
+    }
+
+    /**
+     * Helper function called by ant to create a new notifier for
+     * this input.
+     * @return ReferenceType created ReferenceType.
+     */    
+    public NotifierInput createNotifierInput() {
+        NotifierInput notifierInput =  new NotifierInput();
+        add(notifierInput);
+        return notifierInput;
+    }
+
+    /**
+     * Adds the created notifier to the list
+     * @param ReferenceType notifier to be added to the list.
+     */    
+    public void add(NotifierInput notifierInput) {
+        if (notifierInput != null) {
+            notifierInputList.add(notifierInput);
+        }
+    }
+    
+    /**
+     * Helper function called by ant to create a new notifier for
+     * this input.
+     * @return ReferenceType created ReferenceType.
+     */    
+    public ReferenceType createNotifierListRef() {
+        ReferenceType notifierRef =  new ReferenceType();
+        add(notifierRef);
+        return notifierRef;
+    }
+
+    /**
+     * Adds the created notifier to the list
+     * @param ReferenceType notifier to be added to the list.
+     */    
+    public void add(ReferenceType notifier) {
+        if (notifier != null) {
+            notifierListRef.add(notifier);
+        }
+    }
+    
+    public Vector<NotifierInput> getNotifierInput() {
+        return notifierInputList;
+    }
+    
+    /**
+     * Gets the NotifierList associated with this input. If the
+     * notifier list reference is empty then it throws exception. 
+     * @return List of notifier associated with this input.
+     * @throws HlmAntLibException
+     */    
+    public Vector<Notifier> getSignalNotifierList() {
+        Vector<Notifier> notifierList = null;
+        if (notifierListRef != null) {
+            log.debug("getSignalNotifierList:list.size:" + notifierListRef.size());
+            for (ReferenceType notifierRef : notifierListRef) {
+                Object obj = notifierRef.getReferencedObject();
+                if (obj instanceof SignalNotifierList) {
+                    notifierList = ((SignalNotifierList)obj).getNotifierList();
+                    break;
+                }
+            }
+            return notifierList;
+        }
+        throw new HlmAntLibException(SignalListener.MODULE_NAME, "No notifierlist reference");
+    }    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalListenerConfig.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * This Ant type defines a signal input for listener based signals.
+ *
+ * E.g:
+ * <pre>
+ * &lt;hlm:signalListenerConfig id="prepSignal" target="prep-signal-test" message="some-target-name triggered a signal" &gt;
+ *    &lt;hlm:targetCondition  &gt;
+ *         &lt;/available file="some-file.txt" /&gt;
+ *    &lt;/hlm:targetCondition&gt;
+ *      &lt;signalInput refid="prepSignalInput" &gt;
+ *           &lt;notifierInput file = "${build.cache.log.dir}/signals/${build.id}_prep_status.html" /&gt;
+ *      &lt;/signalInput&gt;
+ *    
+ * &lt;/hlm:signalListenerConfig&gt;
+ * </pre>
+ *
+ * @ant.type name="signalListenerConfig" category="Signaling"
+ */
+
+public class SignalListenerConfig extends DataType
+{
+   
+    private Vector<SignalNotifierInput> signalNotifierInputs = new Vector<SignalNotifierInput>();
+
+    private String target;
+    
+    private String errMsg;
+
+    private Vector<TargetCondition> targetConditions = new Vector<TargetCondition>();
+        
+    private String configID;
+
+    public String getTargetName() {
+        return target;
+    }
+    
+    public String getErrorMessage() {
+        return errMsg;
+    }
+
+    /**
+     * Helper function to store the Name of the target for which
+     * the signal to be processed. 
+     * @param targetName to be stored.
+     */    
+    public void setTarget(String targetName) {
+        target = targetName;
+    }
+
+    /**
+     * Helper function to store the error message of
+     * @param errorMessage to be displayed after failure.
+     */        
+    public void setMessage(String errorMessage) {
+        errMsg = errorMessage;
+    }
+
+
+    /**
+     * Helper function called by ant to create the new signalinput
+     */
+    public SignalNotifierInput createSignalNotifierInput() {
+        SignalNotifierInput input =  new SignalNotifierInput();
+        add(input);
+        return input;
+    }
+
+    /**
+     * Helper function to add the created signalinput
+     * @param filter to be added to the filterset
+     */
+    public void add(SignalNotifierInput input) {
+        signalNotifierInputs.add(input);
+    }
+
+
+    /**
+     * Creates type target condition of type TargetCondition.
+     * @return ReferenceType which is created and stored by the config.
+     */
+    public TargetCondition createTargetCondition() {
+        TargetCondition condition =  new TargetCondition();
+        add(condition);
+        return condition;
+    }
+
+    /**
+     * Helper function to store the config id
+     * @param config id to store.
+     */    
+    public void setConfigId(String confID) {
+        configID = confID;
+    }
+
+    /**
+     * Helper function to return the config id
+     * @return The configuration id
+     */   
+    public String getConfigId() {
+        return configID;
+    }
+
+    /**
+     * Adds the TargetCondition reference to the container.
+     * @param TargetCondition to be added to the container, to be processed during signaling.
+     */    
+    public void add(TargetCondition condition) {
+        if (condition != null) {
+            targetConditions.add(condition);
+        }
+    }    
+
+    /**
+     * Helper function to return the Targetcondition matching the target name.
+     * @param String name of the target for which the targetcondition is returned,
+     */    
+    public TargetCondition getTargetCondition() {
+        if (targetConditions.isEmpty()) {
+            return null;
+        }
+        return targetConditions.get(0);
+    }
+
+    /**
+     * Helper function to return the Targetcondition matching the target name.
+     * @param String name of the target for which the targetcondition is returned,
+     */    
+    public SignalNotifierInput getSignalNotifierInput() {
+        if (signalNotifierInputs.isEmpty()) {
+            return null;
+        }
+        return signalNotifierInputs.get(0);
+    }
+
+    /**
+     * Helper function to return the complete target name set of the config.
+     * @return Set, full set of target names referred by this config.
+     * @throws HlmAntLibException
+     */    
+    //public Set<String> getTargetNameSet() {
+    //    if (targetConditionsMap.isEmpty()) {
+    //        initializeTargetConditionsMap();
+    //    }
+    //    return targetConditionsMap.keySet();
+    //}
+
+    /**
+     * Initializes the TargetConditionsMap, mapping target name with corresponding targetcondition
+     * for fast lookup. 
+     */    
+    //private void initializeTargetConditionsMap() {
+    //    for (TargetCondition condition : targetConditions) {
+    //        String name = condition.getName();
+    //        if (name != null) {
+    //            targetConditionsMap.put(name, condition);
+    //        }
+    //    }
+    //}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,116 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+
+import java.util.Vector;
+
+import org.apache.tools.ant.types.DataType;
+
+import org.apache.log4j.Logger;
+
+import org.apache.tools.ant.BuildException;
+
+
+/**
+ * SignalInput class which is a type to store input for signals
+ * Signals..
+ * &lt;targetCondition&gt;
+ *    &lt;hasSeverity severity="error" file="${build.cache.log.dir}/signals/prep_work_status.xml" /&gt;
+ * &lt;/targetCondition&gt;
+ * 
+ */
+public class SignalNotifierInput extends DataType
+{
+    private Vector<SignalInput> signalInputs = new Vector<SignalInput>();
+
+    private Vector<NotifierInput> notifierInputList = new Vector<NotifierInput>();
+
+    private Logger log = Logger.getLogger(SignalInput.class);
+
+    /**
+     * Helper function called by ant to create a new notifier for
+     * this input.
+     * @return ReferenceType created ReferenceType.
+     */    
+    public NotifierInput createNotifierInput() {
+        NotifierInput notifierInput =  new NotifierInput();
+        add(notifierInput);
+        return notifierInput;
+    }
+
+    /**
+     * Adds the created notifier to the list
+     * @param ReferenceType notifier to be added to the list.
+     */    
+    public void add(NotifierInput notifierInput) {
+        if (notifierInput != null) {
+            notifierInputList.add(notifierInput);
+        }
+    }
+
+    /**
+     * Helper function to add the created signalinput
+     * @param filter to be added to the filterset
+     */
+    public void add(SignalInput input) {
+        signalInputs.add(input);
+    }
+
+    /**
+     * Helper function called by ant to create the new signalinput
+     */
+    public SignalInput createSignalInput() {
+        SignalInput input =  new SignalInput();
+        add(input);
+        return input;
+    }
+
+    public NotifierInput getNotifierInput() {
+        NotifierInput input = null;
+        if (notifierInputList.size() > 1) {
+            throw new BuildException("One and only signal input can be defined");
+        }
+        if (!notifierInputList.isEmpty()) {
+            input = notifierInputList.elementAt(0);
+        }
+        return input;
+    }
+
+    /**
+     * Gets the signal input of this config.
+     * @return signal input stored in the config, by dereferencing the input ref. 
+     */    
+    public SignalInput getSignalInput() {
+        if (signalInputs.isEmpty()) {
+            throw new BuildException("No signal input in signal config, failed: ");
+        }
+        if (signalInputs.size() > 1) {
+            throw new BuildException("One and only signal input can be defined");
+        }
+
+        Object refObject =  signalInputs.elementAt(0).getRefid().getReferencedObject();
+        if (refObject == null) {
+            throw new BuildException("Signal Input Reference not exists");
+        }
+        
+        SignalInput signalInput = (SignalInput)refObject;
+        return signalInput;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.HlmAntLibException;
+import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.SignalListener;
+
+import java.util.Vector;
+
+    
+/**
+ * Helper class to store the list of notifiers.
+ *
+ * Example:
+ * <pre>
+ *   &lt;hlm:notifierList id="defaultSignalFailNotifier"&gt;
+ *       &lt;hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl" title="[signal] ${signal.name}"
+ *          smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="fail"&gt;
+ *       &lt;/hlm:emailNotifier&gt;
+ *   &lt;/hlm:notifierList&gt;
+ * </pre>
+ * @ant.task name="notifierList" category="Signaling" 
+ */
+public class SignalNotifierList extends DataType {
+
+    private Vector<Notifier> notifierlist = new Vector<Notifier>();
+    
+    /**
+     * Adding a Notifier.
+     * @param notifier
+     */
+    public void add(Notifier notifier) {
+        notifierlist.add(notifier);
+    }
+            
+    /**
+     * Returns the list of variables available in the VariableSet 
+     * @return variable list
+     * @throws HlmAntLibException
+     */
+    public Vector<Notifier> getNotifierList() {
+        if (notifierlist.isEmpty()) {
+            throw new HlmAntLibException(SignalListener.MODULE_NAME, "notifierlist is empty.");
+        }
+        return notifierlist;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.types.*;
+import org.apache.tools.ant.BuildException;
+import com.nokia.helium.signal.*;
+import com.nokia.helium.signal.ant.SignalListener;
+import org.apache.log4j.Logger;
+
+
+/**
+ * Class to store the status of the signal of a particular target.
+ */
+public class SignalStatusDef extends HlmPostDefImpl
+{
+    private Logger log = Logger.getLogger(SignalListener.class);
+    
+    /**
+     * This post action will fail the build if any pending failure exists. 
+     * @throws BuildException
+     */
+    public void execute(Project prj, String module, String[] targetNames) {
+        log.debug("SignalStatusDef:execute:");
+        if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
+            log.debug("SignalStatusDef:execute: Error message: " + SignalStatusList.getDeferredSignalList().getErrorMsg());
+            throw new BuildException(SignalStatusList.getDeferredSignalList().getErrorMsg());
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/TargetCondition.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+/**
+ * TargetCondition class which is a type to store the condition for generating
+ * Signals..
+ * &lt;targetCondition&gt;
+ *    &lt;hasSeverity severity="error" file="${build.cache.log.dir}/signals/prep_work_status.xml" /&gt;
+ * &lt;/targetCondition&gt;
+ */
+public class TargetCondition extends DataType {
+
+    private String name;
+    
+    private String errMsg;
+    
+    private Vector<Condition> conditionList = new Vector<Condition>();
+    
+    /**
+     * Constructor
+     */
+    public TargetCondition() {
+    }
+
+    /**
+     * Helper function to store the Name of the target for which
+     * the signal to be processed. 
+     * @param targetName to be stored.
+     */    
+    public void setName(String targetName) {
+        name = targetName;
+    }
+
+    /**
+     * Helper function to store the error message of
+     * @param errorMessage to be displayed after failure.
+     */        
+    public void setMessage(String errorMessage) {
+        errMsg = errorMessage;
+    }
+    
+    /**
+     * Add a given variable to the list 
+     * @param condition variable to add
+     */
+    public void add(Condition condition) {
+        conditionList.add(condition);
+    }
+
+    /**
+     * Gets the list of conditions to be checked for the signal config. 
+     * @return conditions variable for this configuration.
+     */
+    public Vector<Condition> getConditions() {
+        return conditionList;
+    }    
+    /**
+     * Helper function to return the Name of the target for which
+     * the signal to be processed. 
+     * @return name of the target of this targetcondition.
+     * @deprecated
+     */        
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Helper function to return the error message of this target condition.
+     * @return error message of this target condition.
+     * @deprecated
+     */        
+    public String getMessage() {
+        return errMsg;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/XmlSource.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.signal.ant.types;
+
+
+import java.io.File;
+
+import com.nokia.helium.core.LogSource;
+
+/**
+ * This type define an input source that will be communicated to the notifiers.
+ *
+ * @ant.type name="xmlsource" category="Signaling"
+ * 
+ */
+public class XmlSource extends LogSource {
+    private File fileName;
+
+    public File getFilename() {
+        if (fileName.exists()) {
+            return fileName;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * The filename of the input source.
+     * 
+     * @ant.required
+     */
+    public void setFilename(File filename) {
+        this.fileName = filename;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/templates/email.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <!-- section -->
+    <#macro create_section title type>
+           <div id="foldername">
+               <h5>${title}</h5>
+               <p class="maintext">
+                   <!-- content span -->
+                   <span class="${type}"><#nested></span>
+               </p>
+           </div>
+       </#macro>
+
+<#list doc.logSummary.log as lognode>
+    <#if (lognode.build[".//message[@priority='error']"]?size > 0)>
+        <span class="errormessage">
+            <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>                    
+            <ul>
+            <#list lognode.build[".//message[@priority='error']"] as message>
+                ${message}<br/>
+            </#list>
+            </ul>
+        </span>
+    <#else>
+        <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+    </#if>
+</#list>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/templates/email_default.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+      <span class="okmessage">${signaling['signal.name']} is finished.</span>
+    </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/templates/email_subject.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : email_subject.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+${ant["build.id"]}:${ant["env.COMPUTERNAME"]}: ${signalname} alert
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+module load java/1.6.0
+
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-signaling.jar -lib ../../antlibs"
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" -Dskip.diamonds=true $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%..\lib -lib %CD%\..\..\lib -lib %CD%\..\..\bin\helium-core.jar -lib %CD%\..\..\bin\helium-signaling.jar -lib %CD%\..\..\antlibs
+ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor -Dskip.diamonds=true %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-signaling-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib signaling tests.</description>
+
+    <property environment="env" />
+    <dirname property="signaling.test.project.dir" file="${ant.file.helium-antlib-signaling-unittest}" />
+    <property name="build.summary.file" location="${signaling.test.project.dir}/test_signal/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+    <property name="build.id" value="test_new_hlm"/>
+  
+    <property name="signaling.config.file" value="${signaling.test.project.dir}/test_signal/test_signaling_config.ant.xml" />
+    <property name="signaling.config.file" value="${signaling.test.project.dir}/test_signal/test_signaling_config.ant.xml" />
+
+    <import file="${signaling.test.project.dir}/test_signal/test_signaling.ant.xml" />
+    
+    <target name="unittest" depends="unittest-signaling,unittest-signaling-antunit" />
+
+    <target name="unittest-signaling">
+        <antcall target="test-all" />
+    </target>
+
+    <target name="unittest-signaling-antunit">
+        <au:antunit>
+            <au:plainlistener />
+            <fileset dir=".">
+                <include name="**/test_*.ant.xml" />
+                <exclude name="**/test_signaling.ant.xml" />
+            </fileset>
+        </au:antunit>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+package com.nokia.helium.signaling.tests;
+
+import org.junit.*;
+import static org.junit.Assert.*;
+import java.io.*;
+import java.util.*;
+import com.nokia.helium.signal.ant.types.*;
+import org.apache.tools.ant.Project;
+
+public class TestEmailSender {
+    
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+    
+    /**
+     * @throws Exception
+     */
+    @Test
+    public void test_simpleMergeNode() throws Exception {
+        EMAILNotifier en = new EMAILNotifier();
+        Project p = new Project();
+        p.setNewProperty("user.name", "test");
+        en.setProject(p);
+        en.setNotifyWhen("always");
+        en.setTitle("test");
+        en.setSmtp("test");
+        en.setLdap("test");
+        NotifierInput input = new NotifierInput();
+        input.setFile(new File(System.getProperty("testdir") + "/tests/test_signal/data/test.log_status.html"));
+        en.sendData("test", true, input);
+    }
+
+   
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/data/test.log_status.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from FASYM013.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on FASYM013</h1>
+      </div>
+
+    <!-- section -->
+        <span class="errormessage">
+            test.log...FAIL<br/>
+            <ul>
+            ERROR: an error<br/>
+            </ul>
+        </span>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/email.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <!-- section -->
+    <#macro create_section title type>
+           <div id="foldername">
+               <h5>${title}</h5>
+               <p class="maintext">
+                   <!-- content span -->
+                   <span class="${type}"><#nested></span>
+               </p>
+           </div>
+       </#macro>
+
+<#list doc.logSummary.log as lognode>
+    <#if (lognode.build[".//message[@priority='error']"]?size > 0)>
+        <span class="errormessage">
+            <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>                    
+            <ul>
+            <#list lognode.build[".//message[@priority='error']"] as message>
+                ${message}<br/>
+            </#list>
+            </ul>
+        </span>
+    <#else>
+        <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+    </#if>
+</#list>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/example.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+${ant['user.name']}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_hasdeferredfailure.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_hasdeferredfailure.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-hasdeferredfailure" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+    <description>
+        Test deferred failure signal
+    </description>
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+
+    <dirname property="project.dir.signalhasdefer" file="${ant.file.test-signaltask}" />
+    <property name="build.summary.file" location="${project.dir.signalhasdefer}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+
+    <property environment="env" />
+    <property name="email.input.file" location="${signaling.test.project.dir}/test_signal/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+
+    <!-- Deferred signal -->
+    <hlm:notifierList id="testDeferredSignalNotifiers">
+        <hlm:executeTaskNotifier>
+            <echo>Signal: ${signal.name}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+    <hlm:signalInput id="testDeferredSignalInput" failBuild="defer">
+        <hlm:notifierListRef refid="testDeferredSignalNotifiers"/>
+    </hlm:signalInput>
+
+    <!-- 
+    <hlm:signalConfig id="testDeferredSignal">
+        <hlm:inputRef refid="testDeferredSignalInput"/>
+    </hlm:signalConfig>
+    -->
+    <!-- Fail now signal -->
+    <hlm:notifierList id="testSignalNotifiers">
+        <hlm:executeTaskNotifier>
+            <echo>Signal: ${signal.name}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+    <hlm:signalInput id="testSignalInput" failBuild="now">
+        <hlm:notifierListRef refid="testSignalNotifiers"/>
+    </hlm:signalInput>
+
+    <!-- 
+    <hlm:signalConfig id="testSignal">
+        <hlm:inputRef refid="testSignalInput"/>        
+    </hlm:signalConfig>
+    -->
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <!-- cleaning deferred pending failures. -->
+        <hlm:clearDeferredFailures/>
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <!-- cleaning deferred pending failures. -->
+        <hlm:clearDeferredFailures/>
+    </target>
+
+    <target name="test-no-pending-failure">
+        <au:assertFalse>
+            <hlm:hasDeferredFailure/>
+        </au:assertFalse>
+    </target>
+
+    <target name="raise-signal">
+        <!-- This raise a  testSignal. -->
+        <hlm:signal name="testDeferredSignal" result="1" >
+            <signalNotifierInput>
+                <hlm:signalInput refid="testDeferredSignalInput" />
+            </signalNotifierInput>
+        </hlm:signal>
+    </target>
+
+    <target name="test-pending-failure" depends="raise-signal">
+        <au:assertTrue>
+            <hlm:hasDeferredFailure/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-pending-failure-named" depends="raise-signal">
+        <au:assertTrue>
+            <hlm:hasDeferredFailure name="testDeferredSignal"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-pending-failure-named-missing" depends="raise-signal">
+        <au:assertFalse>
+            <hlm:hasDeferredFailure name="testFooSignal"/>
+        </au:assertFalse>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaling.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,262 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_signaling.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-signaling" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Test all the helium signals
+    </description>
+
+    <dirname property="project.dir.signaling" file="${ant.file.test-signaling}" />
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <import file="test_signaling_config.ant.xml" />
+
+    <property name="build.summary.file" location="${project.dir.signaling}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+
+    <target name="target-valid-config1">
+        <echo message="valid configuration1" />
+    </target>
+
+    <target name="target-valid-config2">
+        <echo message="valid configuration2" />
+    </target>
+
+    <target name="target-valid-config3">
+        <echo message="valid configuration3" />
+    </target>
+
+    <target name="target-valid-config4">
+        <echo message="valid configuration4" />
+    </target>
+
+    <target name="target-valid-config5">
+        <echo message="valid configuration5" />
+    </target>
+
+    <target name="target-invalid-config1">
+        <echo message="invalid configuration1" />
+    </target>
+
+    <target name="target-invalid-config2">
+        <echo message="invalid configuration2" />
+    </target>
+
+    <target name="target-invalid-config3">
+        <echo message="invalid configuration3" />
+    </target>
+
+    <target name="target-invalid-config4">
+        <echo message="invalid configuration4" />
+    </target>
+
+    <target name="target-invalid-config5">
+        <echo message="invalid configuration5" />
+    </target>
+
+    <target name="target-invalid-config6">
+        <echo message="invalid configuration6" />
+    </target>
+
+    <target name="target-invalid-config7">
+        <echo message="invalid configuration7" />
+    </target>
+
+    <target name="target-invalid-config8">
+        <echo message="invalid configuration8" />
+    </target>
+
+    <target name="target-invalid-config9">
+        <echo message="invalid configuration9" />
+    </target>
+
+    <target name="test-case1">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config1" inheritRefs="true"/>
+    </target>
+
+    <target name="test-case2">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config2" inheritRefs="true" />
+    </target>
+
+    <target name="test-case3">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config3" inheritRefs="true" />
+    </target>
+
+    <target name="test-case4">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config4" inheritRefs="true" />
+    </target>
+
+    <target name="test-case5">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config5" inheritRefs="true" />
+    </target>
+
+    <target name="test-case6">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config1" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case7">
+        <echo message="testing when the named target is not exists, so signal" />
+        <antcall target="target-invalid-config2" inheritRefs="true" />
+    </target>
+
+    <target name="test-case8">
+        <!-- This test case is not valid anymore, now the attribute validation is done 
+    	     at Ant parsing level -->
+        <!--echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config3" inheritRefs="true" />
+        </au:expectfailure-->
+    </target>
+
+    <target name="test-case9">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config4" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case10">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config5" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case11">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config6" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case12">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config7" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case13">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config8" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case14">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config9" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <!-- functionality testing -->
+    <target name="fail-now-false-condition">
+        <echo message="fail-now-false-condition target: configured to fail now - false condition" />
+    </target>
+
+    <target name="fail-now-true-condition">
+        <echo message="fail-now-true-condition target: configured to fail now - true condition" />
+    </target>
+
+    <target name="fail-no-condition">
+        <echo message="fail-now-false-condition target: configured to fail now - true condition" />
+    </target>
+
+    <target name="fail-defer-false-condition">
+        <echo message="fail-defer-false-condition target: configured to fail later - false condition" />
+    </target>
+
+    <target name="fail-defer-true-condition">
+        <echo message="${number.of.errors}" />
+        <echo message="fail-defer-true-condition target: configured to fail later - true condition" />
+    </target>
+
+    <target name="fail-never-false-condition">
+        <echo message="fail-never-false-condition target: configured to fail never - false condition" />
+    </target>
+
+    <target name="fail-never-true-condition">
+        <echo message="fail-never-true-condition target: configured to fail never - true condition" />
+    </target>
+
+    <target name="test-fail-now-false-condition">
+        <antcall target="fail-now-false-condition" inheritRefs="true" />
+    </target>
+
+    <target name="compile-signal-test">
+        <au:expectfailure>
+            <echo message="compile-signal failure test" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-compile-signal-test">
+        <au:expectfailure>
+            <antcall target="compile-signal-test" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-fail-now-true-condition">
+        <au:expectfailure>
+            <antcall target="fail-now-true-condition" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-fail-no-condition" >
+        <antcall target="fail-no-condition" inheritRefs="true" />
+    </target>
+
+    <target name="test-fail-defer-false-condition">
+        <antcall target="fail-defer-false-condition" inheritRefs="true" />
+    </target>
+
+    <target name="test-fail-defer-true-condition">
+        <antcall target="fail-defer-true-condition" inheritRefs="true"/>
+        <au:assertTrue>
+            <hlm:hasDeferredFailure name="inputFailDefer"/>
+        </au:assertTrue>
+        <hlm:clearDeferredFailures/>
+    </target>
+
+    <target name="test-fail-never-false-condition">
+        <antcall target="fail-never-false-condition" inheritRefs="true" />
+    </target>
+
+    <target name="test-fail-never-true-condition">
+        <antcall target="fail-never-true-condition" inheritRefs="true" />
+    </target>
+
+
+    <target name="test-all" depends="test-fail-all, test-case-all,test-compile-signal-test" />
+    <target name="test-fail-all" depends="test-fail-now-false-condition, test-fail-now-true-condition,
+                test-fail-no-condition,test-fail-defer-false-condition, test-fail-defer-true-condition,
+                test-fail-never-false-condition, fail-never-false-condition, fail-never-true-condition" />
+    <target name="test-case-all" depends="test-case1, test-case2, test-case3, test-case4, test-case5, test-case6,
+                test-case7,test-case8,test-case9,test-case10,test-case11,test-case12,test-case13,test-case14" />
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaling_config.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,335 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_signaling.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-signaling-config" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        signalInput and notifierList test configuration
+    </description>
+    <dirname property="project.dir.signaling" file="${ant.file.test-signaling-config}" />
+
+    <property name="build.summary.file" location="${project.dir.signaling}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+    <taskdef resource="org/apache/tools/ant/types/conditions/antlib.xml" />
+    <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <hlm:notifierList id="defaultsignalnotifier">
+        <hlm:executeTaskNotifier>
+            <echo>Signal: ${signal.name}</echo>
+        </hlm:executeTaskNotifier>
+        <hlm:emailNotifier defaultTemplate="${project.dir.signaling}/email_default.html.ftl" title="[signal] ${signal.name}" smtp="${email.smtp.server}" ldap="${email.ldap.server}" from="I_EXT_HELIUM@nokia.com" />
+    </hlm:notifierList>
+
+    <hlm:notifierList id="compilesignalnotifier">
+        <hlm:executeTaskNotifier>
+            <echo>Signal: ${signal.name}</echo>
+        </hlm:executeTaskNotifier>
+        <hlm:emailNotifier defaultTemplate="${project.dir.signaling}/email_default.html.ftl" title="[signal] ${signal.name}" smtp="${email.smtp.server}" ldap="${email.ldap.server}" />
+    </hlm:notifierList>
+
+
+    <hlm:signalInput id="compilesignalinput" failbuild="now">
+        <hlm:notifierListRef refid="compilesignalnotifier" />
+    </hlm:signalInput>
+
+    <property name="number.of.errors" value="4" />
+
+    <hlm:signalInput id="fotasignalinput" failbuild="defer" />
+
+    <hlm:signalInput id="validSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultsignalnotifier" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="compileSignal" target="compile-signal-test" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <signalInput refid="compilesignalinput" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalInput id="publishsignalinput" failbuild="never" />
+
+    <hlm:signalInput id="input-fail-build-now" failbuild="now" />
+
+    <hlm:signalInput id="input-fail-build-defer" failbuild="defer" />
+    <hlm:signalInput id="input-fail-build-never" failbuild="never" />
+
+    <hlm:signalListenerConfig id="fotaSignal" target="fota" message="Fota execution finished">
+        <signalNotifierInput>
+            <signalInput refid="fotasignalinput" />
+        </signalNotifierInput>
+        <targetCondition  />
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="publishSignal" target="publish" message="Errors due to publish">
+        <signalNotifierInput>
+            <signalInput refid="publishsignalinput" />
+        </signalNotifierInput>
+        <targetCondition  />
+    </hlm:signalListenerConfig>
+    <!--hlm:signallist id="all-signals">
+        <hlm:notifierlistref refid="defaultsignalnotifier" />
+        <hlm:configref refid="compileSignal" />
+        <hlm:configref refid="fotaSignal" />
+    </hlm:signallist-->
+
+    <!--Invalid configurations -->
+    <hlm:notifierList id="invalid-notifier1" />
+
+    <hlm:notifierList id="invalid-notifier2">
+        <!--hlm:notifier type="test" senderlist="${env.username}" /-->
+    </hlm:notifierList>
+
+    <hlm:notifierList id="invalid-notifier3">
+        <!--hlm:notifier type="email" /-->
+    </hlm:notifierList>
+
+    <hlm:notifierList id="invalid-notifier4">
+        <!--hlm:notifier senderlist="${env.username}" /-->
+    </hlm:notifierList>
+
+
+    <hlm:signalInput id="invalid-input2" failbuild="never">
+        <hlm:notifierListRef refid="noreference" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="invalid-input3" failbuild="never">
+        <hlm:notifierListRef refid="invalid-notifier1" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="invalid-input4" failbuild="never">
+        <hlm:notifierListRef refid="invalid-notifier2" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="invalid-input5" failbuild="never">
+        <hlm:notifierListRef refid="invalid-notifier3" />
+    </hlm:signalInput>
+
+    <hlm:signalInput id="invalid-input6" failbuild="never">
+        <hlm:notifierListRef refid="invalid-notifier4" />
+    </hlm:signalInput>
+
+    <hlm:signalListenerConfig id="noreferenceSignal" target="target-invalid-config1" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <hlm:signalInput refid="noreference" />
+        </signalNotifierInput>
+        <targetCondition>
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="noTarget" target="no-target" message="Errors happened during compilation" >
+        <targetCondition />
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="invalidInputSignal" target="target-invalid-config4" message="Errors happened during compilation">
+        <!-- <hlm:signalInput refid="invalid-input2" /> -->
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="invalidInput3" target="target-invalid-config5" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <signalInput refid="invalid-input3" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="invalidInput4" target="target-invalid-config6" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <signalInput refid="invalid-input4" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="invalidInput5" target="target-invalid-config7" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <signalInput refid="invalid-input5" />
+        </signalNotifierInput>
+
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="invalidInput6" target="target-invalid-config8" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <signalInput refid="invalid-input6" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="invalidInput7" target="target-invalid-config9" message="Errors happened during compilation">
+        <signalNotifierInput>
+            <signalInput refid="invalid-input7" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validInput" target="test-valid-config1">
+        <targetCondition >
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validSignal1" target="target-valid-config2" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="validSignalInput" />
+        </signalNotifierInput>
+        <targetCondition>
+            <hlm:hasSeverity severity="error" file="${build.summary.file}" />
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validSignal2" target="target-valid-config3" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="validSignalInput" />
+        </signalNotifierInput>
+
+        <targetCondition >
+            <!-- <xml severity="error" file="./data/helium_minibuild_ido_compile.log.xml" /> -->
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validSignal3" target="target-valid-config4" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="validSignalInput" />
+        </signalNotifierInput>
+        <targetCondition >
+            <!-- <not><equals arg1="0" arg2="${number.of.error}"/></not> -->
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validSignal4" target="target-valid-config5" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="validSignalInput" />
+        </signalNotifierInput>
+        <targetCondition >
+            <!--<not><equals arg1="0" arg2="0"/></not> -->
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validSignal5" target="fail-now-false-condition" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-now" />
+        </signalNotifierInput>
+        <targetCondition>
+            <not>
+                <equals arg1="0" arg2="0" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="validSignal6" target="fail-now-true-condition" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-now" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="failNow" target="fail-no-condition" message="Errors during testing" >
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-never" />
+        </signalNotifierInput>
+        <targetCondition />
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="failbuildDefer" target="fail-defer-false-condition" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-defer" />
+        </signalNotifierInput>
+        <targetCondition >
+            <not>
+                <equals arg1="0" arg2="0" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="inputFailDefer" target="fail-defer-true-condition" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-defer" />
+        </signalNotifierInput>
+        <targetCondition>
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="inputFailNever1" target="fail-defer-never-condition" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-never" />
+        </signalNotifierInput>
+
+        <targetCondition>
+            <not>
+                <equals arg1="0" arg2="0" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <hlm:signalListenerConfig id="failbuildNever2" target="fail-never-true-condition" message="Errors during testing">
+        <signalNotifierInput>
+            <signalInput refid="input-fail-build-never" />
+        </signalNotifierInput>
+
+        <targetCondition  >
+            <not>
+                <equals arg1="0" arg2="${number.of.errors}" />
+            </not>
+        </targetCondition>
+    </hlm:signalListenerConfig>
+
+    <target name="test-wrong-type">
+        <au:expectfailure>
+            <hlm:signalInput id="invalid-input1" failbuild="wrong-type" />
+        </au:expectfailure>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaltask.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_signaltask.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-signaltask" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib Signal unittests.</description>
+    <dirname property="project.dir.signaltask" file="${ant.file.test-signaltask}" />
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <property environment="env" />
+    <property name="build.summary.file" location="${project.dir.signaltask}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+
+    <!-- Deferred signal -->
+    <hlm:notifierList id="testDeferredSignalNotifiers">
+        <hlm:executeTaskNotifier>
+            <echo>Signal: ${signal.name}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+    <hlm:signalInput id="testDeferredSignalInput" failBuild="defer">
+        <hlm:notifierListRef refid="testDeferredSignalNotifiers" />
+    </hlm:signalInput>
+
+    <!-- Fail now signal -->
+    <hlm:notifierList id="testSignalNotifiers">
+        <hlm:executeTaskNotifier>
+            <echo>Signal: ${signal.name}</echo>
+        </hlm:executeTaskNotifier>
+    </hlm:notifierList>
+
+    <hlm:signalInput id="testSignalInput" failBuild="now">
+        <hlm:notifierListRef refid="testSignalNotifiers" />
+    </hlm:signalInput>
+
+    <hlm:signalConfig id="testSignal">
+        <hlm:inputRef refid="testSignalInput" />
+    </hlm:signalConfig>
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <!-- cleaning deferred pending failures. -->
+        <hlm:clearDeferredFailures />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <!-- cleaning deferred pending failures. -->
+        <hlm:clearDeferredFailures />
+    </target>
+
+    <target name="raise-deferred-failure">
+        <!-- This raise a  testSignal. -->
+        <hlm:signal name="testDeferredSignal" result="1" message="message">
+            <signalNotifierInput>
+                <hlm:signalInput refid="testDeferredSignalInput" />
+            </signalNotifierInput>
+        </hlm:signal>
+    </target>
+
+    <target name="raise-failure-now">
+        <!-- This raise a  testSignal. -->
+        <hlm:signal name="testSignal" result="1" message="message">
+            <signalNotifierInput>
+                <hlm:signalInput refid="testSignalInput" />
+            </signalNotifierInput>
+        </hlm:signal>
+    </target>
+
+    <target name="raise-no-failure">
+        <!-- This raise a  testSignal. -->
+        <hlm:signal name="testSignal" result="0" message="message">
+            <signalNotifierInput>
+                <hlm:signalInput refid="testSignalInput" />
+            </signalNotifierInput>
+        </hlm:signal>
+    </target>
+
+    <target name="test-raise-no-failure" depends="raise-no-failure" />
+
+    <target name="test-raise-failure-now">
+        <!-- Should fail the build now -->
+        <au:expectfailure>
+            <antcall target="raise-failure-now" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-raise-deferred-failure">
+        <!-- This will not fail the build -->
+        <antcall target="raise-deferred-failure" />
+    </target>
+
+    <target name="test-raise-deferred-now-failure">
+        <!-- This will not fail the build -->
+        <antcall target="raise-deferred-failure" />
+        <!-- But next one should. -->
+        <au:expectfailure expectedMessage="testSignal: message : raise-failure-now">
+            <antcall target="raise-failure-now" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-no-args">
+        <!-- This raise a  testSignal. -->
+        <au:expectfailure expectedMessage="'name' attribute is not defined.">
+            <hlm:signal />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-name-args">
+        <hlm:signal name="testSignal" />
+    </target>
+
+    <target name="test-name-args-not-existing">
+        <au:expectfailure expectedMessage="Could not find signal config for signal name: testNonExistingSignal">
+            <hlm:signal name="testNonExistingSignal" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-too-many-nested-element">
+        <au:expectfailure expectedMessage="One and only signal input can be defined">
+            <hlm:signal name="testNonExistingSignal">
+                <signalNotifierInput>
+                    <hlm:signalInput refid="testSignalInput" />
+                    <hlm:signalInput refid="testSignalInput" />
+                </signalNotifierInput>
+            </hlm:signal>
+        </au:expectfailure>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/jep_1.6_2.5/README	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,132 @@
+	jepp - Java Embedded Python
+
+
+
+   Copyright (c) 2004, 2005, 2006 Mike Johnson.
+
+   This file is licenced under the the zlib/libpng License.
+
+   This software is provided 'as-is', without any express or implied
+   warranty. In no event will the authors be held liable for any
+   damages arising from the use of this software.
+   
+   Permission is granted to anyone to use this software for any
+   purpose, including commercial applications, and to alter it and
+   redistribute it freely, subject to the following restrictions:
+   
+       1. The origin of this software must not be misrepresented; you
+       must not claim that you wrote the original software. If you use
+       this software in a product, an acknowledgment in the product
+       documentation would be appreciated but is not required.
+   
+       2. Altered source versions must be plainly marked as such, and
+       must not be misrepresented as being the original software.
+   
+       3. This notice may not be removed or altered from any source
+       distribution.
+
+Comments welcome.
+
+	- Mike Johnson <mrjohnson0@users.sourceforge.net>
+
+
+    DEPENDENCIES
+        - Python version >= 2.2
+        - JNI >= 1.2 (untested, preferably 1.4)
+
+
+    BUILDING ON LINUX/UNIX
+        Simply ./configure && make && make install.
+
+
+    BUILDING ON MAC OS X
+        You'll need to:
+            - set JAVA_HOME to /Library/Java/Home *not* /usr.
+            - compile Python or download it using Fink.
+            - have installed the developer kits from Apple
+            - make a symlink from libjep.dynlib to /Library/Java/Extentions, like:
+                sudo ln -s `pwd`/.libs/libjep.dylib \
+                    /Library/Java/Extensions/libjep.jnilib
+
+                *** Make sure to use '.jnilib' for the symlink. ***
+
+              (This will get added to the install script Very Soon Now.)
+
+
+    AUTOMAKE 1.6
+        If you're using automake > 1.4, please run the `autogen.sh`
+script before running configure. This includes Mac OS X.
+
+    
+    WINDOWS
+        You'll need MSVC 6 and Python 2.3. I've compiled successfully
+against the ActiveState version. The project file expects Java in
+C:\j2sdk1.4.2_04 and Python in C:\Python2.3. If these aren't correct
+paths, you should edit the project settings.
+        Otherwise, the build is pretty normal. Notice there's no debug
+version. Feel free to add one if you like.
+        Also, you'll likely need to add -Djava.library.path='path to
+Release folder' for testing. Or copy and register the DLL in the
+System directory.
+
+
+    RUNNING ON *NIX - Preparing the libraries
+
+        Due to some (common) difficulties with Java and C projects
+that dlopen libraries, you'll need to set LD_PRELOAD environment
+variable. That's in addition to setting LD_LIBRARY_PATH if you've
+installed libjep into a directory not cached by ld.so.
+        For example, my tomcat startup.sh script starts with this:
+
+            #!/bin/sh
+            # java memory setting
+            export JAVA_OPTS='-Xmx64m'
+
+            # force system to load python
+            export LD_PRELOAD=/usr/lib/libpython2.3.so.1.0
+
+            # this is where my libjep.so is.
+            export LD_LIBRARY_PATH=/share/jepp/jep/.libs
+
+        Adding some heap memory is a good idea, too.
+        The libpython used here is whatever you've compiled jep
+against. If you don't know, try this command:
+
+            $ ldd .libs/libjep.so.1.0.0
+                < ... blah ... >
+            	libpython2.3.so.1.0 => /usr/lib/libpython2.3.so.1.0 (0x40023000)
+
+        That's the libpython you want to set in
+LD_PRELOAD. Unfortunately, this means you'll have to change this if
+you upgrade python. If it's the wrong library, it will most likely
+cause a crash. If it's not set you'll get an exception similar to:
+"Python Encountered: exceptions.ImportError:
+/usr/lib/python2.3/lib-dynload/datetime.so: undefined symbol:
+PyObject_GenericGetAttr".
+
+
+    RUNNING - Down to business
+
+        First, fire off the test.py script. We want to make sure
+you're fully setup. To start with, export LD_LIBRARY_PATH and
+LD_PRELOAD as in the section above. Then, start with:
+
+            java -classpath ../ jep.Test 0
+
+        A lot of early bugs in Jep didn't appear until the code is
+stressed a little. The above 0 argument is the number of additional
+threads to create. They all run through the test.py script in sub
+intepreters. Go ahead, throw some threads at it.
+
+            $ time java -classpath ../ jep.Test 3
+                real	0m0.344s
+                user	0m0.260s
+                sys	0m0.050s
+
+            $ time java -classpath ../ jep.Test 50
+                real	0m1.944s
+                user	0m1.850s
+                sys	0m0.100s
+
+        The test script isn't designed for speed but it runs quickly
+enough.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/jep_1.6_2.5/console.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+
+HISTFILE = '.jep'
+
+import traceback
+import jep
+from jep import *
+
+hasReadline = False
+
+try:
+    import readline
+
+    try:
+        hasReadline = True
+        import os
+        HISTFILE = '%s/.jep' % (os.environ['HOME'])
+        if(not os.access(HISTFILE, os.W_OK)):
+            os.open(HISTFILE, os.O_CREAT)
+        readline.read_history_file(HISTFILE)
+    except:
+        traceback.print_exc()
+        pass
+except:
+    print """
+    No readline available.
+    You may want to set the LD_PRELOAD environment variable, see the
+    README file for details.
+
+
+    i.e.: export LD_PRELOAD=/usr/lib/libpython2.3.so.1.0
+
+    If your platform really doesn't have readline, try this:
+    http://newcenturycomputers.net/projects/readline.html """
+
+
+PS1  = ">>> "
+PS2  = "... "
+
+
+def prompt(jep):
+    global hasReadline
+    
+    try:
+        line = None
+        while(1):
+            ran = True
+            try:
+                ran = jep.eval(line)
+            except:
+                traceback.print_exc()
+
+            try:
+                if(ran):
+                    line = raw_input(PS1)
+                else:
+                    line = raw_input(PS2)
+            except:
+                break
+
+    finally:
+        if(hasReadline):
+            readline.write_history_file(HISTFILE)
+
+
+if(__name__ == '__main__'):
+    Jep = findClass('jep.Jep')
+    jep = Jep(True)
+
+    # Pass argv to interactive prompt. We can't pass a Python object,
+    # but we can make a new one.
+    jep.eval("argv = %s" % argv)
+
+    try:
+        prompt(jep)
+    except:
+        traceback.print_exc()
+
+    print ''
+    jep.close()
Binary file buildframework/helium/external/jep_1.6_2.5/jep.dll has changed
Binary file buildframework/helium/external/jep_1.6_2.5/jep.jar has changed
Binary file buildframework/helium/external/jep_1.6_2.5/libjep.so has changed
Binary file buildframework/helium/external/jep_1.6_2.5/msvcr71.dll has changed
Binary file buildframework/helium/external/jep_1.6_2.5/msvcrt.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/bin/coverage.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+"A script for invoking coverage from the command line."
+
+import sys
+del sys.path[0] # Otherwise "import coverage" finds this file!
+import coverage
+
+coverage.the_coverage.command_line(sys.argv[1:])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/bin/epydoc	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+#!C:\APPS\actpython\python.exe
+#
+# Call the command line interface for Epydoc.
+#
+
+# Make sure that we don't get confused between an epydoc.py script and
+# the real epydoc package.
+import sys, os.path
+if os.path.exists(os.path.join(sys.path[0], 'epydoc.py')):
+    del sys.path[0]
+
+from epydoc.cli import cli
+cli()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/bin/nosetests-script.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+#!C:\APPS\ACTPYT~1\python.exe
+# EASY-INSTALL-ENTRY-SCRIPT: 'nose==0.10.4','console_scripts','nosetests'
+
+import sys
+from pkg_resources import load_entry_point
+
+sys.exit(
+   load_entry_point('nose==0.10.4', 'console_scripts', 'nosetests')()
+)
Binary file buildframework/helium/external/python/lib/2.5/4Suite_XML-1.0.2-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Amara-1.2.0.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Jinja-1.2-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Jinja2-2.0rc1-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/PyXML-0.8.4-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Pygments-0.10-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+Metadata-Version: 1.0
+Name: Sphinx
+Version: 0.5.1
+Summary: Python documentation generator
+Home-page: http://sphinx.pocoo.org/
+Author: Georg Brandl
+Author-email: georg@python.org
+License: BSD
+Download-URL: http://pypi.python.org/pypi/Sphinx
+Description: 
+        Sphinx is a tool that makes it easy to create intelligent and beautiful
+        documentation for Python projects (or other documents consisting of
+        multiple reStructuredText sources), written by Georg Brandl.
+        It was originally created to translate the new Python documentation,
+        but has now been cleaned up in the hope that it will be useful to many
+        other projects.
+        
+        Sphinx uses reStructuredText as its markup language, and many of its strengths
+        come from the power and straightforwardness of reStructuredText and its
+        parsing and translating suite, the Docutils.
+        
+        Although it is still under constant development, the following features
+        are already present, work fine and can be seen "in action" in the Python docs:
+        
+        * Output formats: HTML (including Windows HTML Help), plain text and LaTeX,
+        for printable PDF versions
+        * Extensive cross-references: semantic markup and automatic links
+        for functions, classes, glossary terms and similar pieces of information
+        * Hierarchical structure: easy definition of a document tree, with automatic
+        links to siblings, parents and children
+        * Automatic indices: general index as well as a module index
+        * Code handling: automatic highlighting using the Pygments highlighter
+        * Various extensions are available, e.g. for automatic testing of snippets
+        and inclusion of appropriately formatted docstrings.
+        
+Platform: any
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Console
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Utilities
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,216 @@
+AUTHORS
+CHANGES
+EXAMPLES
+LICENSE
+MANIFEST.in
+Makefile
+README
+TODO
+babel.cfg
+ez_setup.py
+setup.cfg
+setup.py
+sphinx-build.py
+sphinx-quickstart.py
+Sphinx.egg-info/PKG-INFO
+Sphinx.egg-info/SOURCES.txt
+Sphinx.egg-info/dependency_links.txt
+Sphinx.egg-info/entry_points.txt
+Sphinx.egg-info/not-zip-safe
+Sphinx.egg-info/requires.txt
+Sphinx.egg-info/top_level.txt
+doc/Makefile
+doc/builders.rst
+doc/changes.rst
+doc/concepts.rst
+doc/conf.py
+doc/config.rst
+doc/contents.rst
+doc/examples.rst
+doc/extensions.rst
+doc/glossary.rst
+doc/intro.rst
+doc/rest.rst
+doc/templating.rst
+doc/_static/sphinx.png
+doc/_templates/index.html
+doc/_templates/indexsidebar.html
+doc/_templates/layout.html
+doc/ext/appapi.rst
+doc/ext/autodoc.rst
+doc/ext/builderapi.rst
+doc/ext/coverage.rst
+doc/ext/doctest.rst
+doc/ext/ifconfig.rst
+doc/ext/intersphinx.rst
+doc/ext/math.rst
+doc/ext/refcounting.rst
+doc/ext/todo.rst
+doc/markup/code.rst
+doc/markup/desc.rst
+doc/markup/index.rst
+doc/markup/inline.rst
+doc/markup/misc.rst
+doc/markup/para.rst
+sphinx/__init__.py
+sphinx/_jinja.py
+sphinx/addnodes.py
+sphinx/application.py
+sphinx/builder.py
+sphinx/cmdline.py
+sphinx/config.py
+sphinx/environment.py
+sphinx/highlighting.py
+sphinx/htmlhelp.py
+sphinx/htmlwriter.py
+sphinx/latexwriter.py
+sphinx/linkcheck.py
+sphinx/quickstart.py
+sphinx/roles.py
+sphinx/search.py
+sphinx/setup_command.py
+sphinx/textwriter.py
+sphinx/directives/__init__.py
+sphinx/directives/code.py
+sphinx/directives/desc.py
+sphinx/directives/other.py
+sphinx/ext/__init__.py
+sphinx/ext/autodoc.py
+sphinx/ext/coverage.py
+sphinx/ext/doctest.py
+sphinx/ext/ifconfig.py
+sphinx/ext/intersphinx.py
+sphinx/ext/jsmath.py
+sphinx/ext/mathbase.py
+sphinx/ext/pngmath.py
+sphinx/ext/refcounting.py
+sphinx/ext/todo.py
+sphinx/locale/__init__.py
+sphinx/locale/__init__.pyc
+sphinx/locale/sphinx.pot
+sphinx/locale/cs/LC_MESSAGES/sphinx.js
+sphinx/locale/cs/LC_MESSAGES/sphinx.mo
+sphinx/locale/cs/LC_MESSAGES/sphinx.po
+sphinx/locale/de/LC_MESSAGES/sphinx.js
+sphinx/locale/de/LC_MESSAGES/sphinx.mo
+sphinx/locale/de/LC_MESSAGES/sphinx.po
+sphinx/locale/es/LC_MESSAGES/sphinx.js
+sphinx/locale/es/LC_MESSAGES/sphinx.mo
+sphinx/locale/es/LC_MESSAGES/sphinx.po
+sphinx/locale/fr/LC_MESSAGES/sphinx.js
+sphinx/locale/fr/LC_MESSAGES/sphinx.mo
+sphinx/locale/fr/LC_MESSAGES/sphinx.po
+sphinx/locale/ja/LC_MESSAGES/sphinx.js
+sphinx/locale/ja/LC_MESSAGES/sphinx.mo
+sphinx/locale/ja/LC_MESSAGES/sphinx.po
+sphinx/locale/nl/LC_MESSAGES/sphinx.js
+sphinx/locale/nl/LC_MESSAGES/sphinx.mo
+sphinx/locale/nl/LC_MESSAGES/sphinx.po
+sphinx/locale/pl/LC_MESSAGES/sphinx.js
+sphinx/locale/pl/LC_MESSAGES/sphinx.mo
+sphinx/locale/pl/LC_MESSAGES/sphinx.po
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
+sphinx/locale/sl/LC_MESSAGES/sphinx.js
+sphinx/locale/sl/LC_MESSAGES/sphinx.mo
+sphinx/locale/sl/LC_MESSAGES/sphinx.po
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
+sphinx/static/contents.png
+sphinx/static/default.css
+sphinx/static/doctools.js
+sphinx/static/file.png
+sphinx/static/jquery.js
+sphinx/static/minus.png
+sphinx/static/navigation.png
+sphinx/static/plus.png
+sphinx/static/rightsidebar.css
+sphinx/static/searchtools.js
+sphinx/static/sphinxdoc.css
+sphinx/static/stickysidebar.css
+sphinx/static/traditional.css
+sphinx/templates/defindex.html
+sphinx/templates/genindex-single.html
+sphinx/templates/genindex-split.html
+sphinx/templates/genindex.html
+sphinx/templates/layout.html
+sphinx/templates/modindex.html
+sphinx/templates/opensearch.xml
+sphinx/templates/page.html
+sphinx/templates/search.html
+sphinx/templates/changes/frameset.html
+sphinx/templates/changes/rstsource.html
+sphinx/templates/changes/versionchanges.html
+sphinx/texinputs/Makefile
+sphinx/texinputs/fncychap.sty
+sphinx/texinputs/howto.cls
+sphinx/texinputs/manual.cls
+sphinx/texinputs/python.ist
+sphinx/texinputs/sphinx.sty
+sphinx/texinputs/tabulary.sty
+sphinx/util/__init__.py
+sphinx/util/compat.py
+sphinx/util/console.py
+sphinx/util/jsdump.py
+sphinx/util/png.py
+sphinx/util/smartypants.py
+sphinx/util/stemmer.py
+sphinx/util/texescape.py
+tests/path.py
+tests/path.pyc
+tests/run.py
+tests/test_application.py
+tests/test_application.pyc
+tests/test_autodoc.py
+tests/test_autodoc.pyc
+tests/test_build.py
+tests/test_build.pyc
+tests/test_config.py
+tests/test_config.pyc
+tests/test_coverage.py
+tests/test_coverage.pyc
+tests/test_env.py
+tests/test_env.pyc
+tests/test_i18n.py
+tests/test_i18n.pyc
+tests/test_markup.py
+tests/test_markup.pyc
+tests/test_quickstart.py
+tests/test_quickstart.pyc
+tests/util.py
+tests/util.pyc
+tests/etree13/ElementPath.py
+tests/etree13/ElementPath.pyc
+tests/etree13/ElementTree.py
+tests/etree13/ElementTree.pyc
+tests/etree13/HTMLTreeBuilder.py
+tests/etree13/__init__.py
+tests/etree13/__init__.pyc
+tests/root/Makefile
+tests/root/autodoc.txt
+tests/root/conf.py
+tests/root/contents.txt
+tests/root/desc.txt
+tests/root/ext.py
+tests/root/ext.pyc
+tests/root/images.txt
+tests/root/img.gif
+tests/root/img.pdf
+tests/root/img.png
+tests/root/includes.txt
+tests/root/literal.inc
+tests/root/markup.txt
+tests/root/math.txt
+tests/root/wrongenc.inc
+tests/root/_static/README
+tests/root/_templates/layout.html
+tests/root/special/api.h
+tests/root/subdir/images.txt
+tests/root/subdir/img.png
+tests/root/subdir/include.inc
+tests/root/subdir/simg.png
+utils/check_sources.py
+utils/pylintrc
+utils/reindent.py
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+[console_scripts]
+sphinx-build = sphinx:main
+sphinx-quickstart = sphinx.quickstart:main
+
+[distutils.commands]
+build_sphinx = sphinx.setup_command:BuildDoc
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,3 @@
+Pygments>=0.8
+Jinja>=1.1
+docutils>=0.4
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+sphinx
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+"""
+    Sphinx
+    ~~~~~~
+
+    The Sphinx documentation toolchain.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+
+__revision__ = '$Revision$'
+__version__ = '0.5.1'
+__released__ = '0.5.1'
+
+
+def main(argv=sys.argv):
+    if sys.version_info[:3] < (2, 4, 0):
+        print >>sys.stderr, \
+              'Error: Sphinx requires at least Python 2.4 to run.'
+        return 1
+
+    try:
+        from sphinx import cmdline
+    except ImportError, err:
+        errstr = str(err)
+        if errstr.lower().startswith('no module named'):
+            whichmod = errstr[16:]
+            if whichmod.startswith('docutils'):
+                whichmod = 'Docutils library'
+            elif whichmod.startswith('jinja'):
+                whichmod = 'Jinja library'
+            elif whichmod == 'roman':
+                whichmod = 'roman module (which is distributed with Docutils)'
+            else:
+                whichmod += ' module'
+            print >>sys.stderr, \
+                  'Error: The %s cannot be found. Did you install Sphinx '\
+                  'and its dependencies correctly?' % whichmod
+            return 1
+        raise
+    return cmdline.main(argv)
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx._jinja
+    ~~~~~~~~~~~~~
+
+    Jinja glue.
+
+    :copyright: 2007-2008 by Georg Brandl, Horst Gutmann.
+    :license: BSD.
+"""
+
+import codecs
+from os import path
+
+from sphinx.util import mtimes_of_files
+from sphinx.application import TemplateBridge
+
+from jinja import Environment
+from jinja.loaders import BaseLoader
+from jinja.exceptions import TemplateNotFound
+
+
+def babel_extract(fileobj, keywords, comment_tags, options):
+    """
+    Simple extractor to get some basic Babel support.
+    """
+    env = Environment()
+    for lineno, sg, pl in env.get_translations_for_string(fileobj.read()):
+        yield lineno, None, (sg, pl), ''
+
+
+class SphinxFileSystemLoader(BaseLoader):
+    """
+    A loader that loads templates either relative to one of a list of given
+    paths, or from an absolute path.
+    """
+
+    def __init__(self, basepath, extpaths):
+        self.basepath = path.abspath(basepath)
+        self.extpaths = map(path.abspath, extpaths)
+        self.searchpaths = self.extpaths + [self.basepath]
+
+    def get_source(self, environment, name, parent):
+        name = name.replace('/', path.sep)
+        if name.startswith('!'):
+            name = name[1:]
+            if not path.exists(path.join(self.basepath, name)):
+                raise TemplateNotFound(name)
+            filename = path.join(self.basepath, name)
+        elif path.isabs(name):
+            if not path.exists(name):
+                raise TemplateNotFound(name)
+            filename = name
+        else:
+            for searchpath in self.searchpaths:
+                if path.exists(path.join(searchpath, name)):
+                    filename = path.join(searchpath, name)
+                    break
+            else:
+                raise TemplateNotFound(name)
+        f = codecs.open(filename, 'r', environment.template_charset)
+        try:
+            return f.read()
+        finally:
+            f.close()
+
+
+class TranslatorEnvironment(Environment):
+    class _Translator(object):
+        def __init__(self, translator):
+            self.trans = translator
+
+        def gettext(self, string):
+            return self.trans.ugettext(string)
+
+        def ngettext(self, singular, plural, n):
+            return self.trans.ungettext(singular, plural, n)
+
+    def __init__(self, *args, **kwargs):
+        self.translator = kwargs['translator']
+        del kwargs['translator']
+        super(TranslatorEnvironment, self).__init__(*args, **kwargs)
+
+    def get_translator(self, context):
+        return TranslatorEnvironment._Translator(self.translator)
+
+
+class BuiltinTemplates(TemplateBridge):
+    def init(self, builder):
+        self.templates = {}
+        base_templates_path = path.join(path.dirname(__file__), 'templates')
+        ext_templates_path = [path.join(builder.confdir, dir)
+                              for dir in builder.config.templates_path]
+        self.templates_path = [base_templates_path] + ext_templates_path
+        loader = SphinxFileSystemLoader(base_templates_path, ext_templates_path)
+        if builder.translator is not None:
+            self.jinja_env = TranslatorEnvironment(loader=loader,
+                    friendly_traceback=False, translator=builder.translator)
+        else:
+            self.jinja_env = Environment(loader=loader,
+                    # disable traceback, more likely that something
+                    # in the application is broken than in the templates
+                    friendly_traceback=False)
+
+    def newest_template_mtime(self):
+        return max(mtimes_of_files(self.templates_path, '.html'))
+
+    def render(self, template, context):
+        if template in self.templates:
+            return self.templates[template].render(context)
+        templateobj = self.templates[template] = \
+                      self.jinja_env.get_template(template)
+        return templateobj.render(context)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.addnodes
+    ~~~~~~~~~~~~~~~
+
+    Additional docutils nodes.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+# index markup
+class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass
+
+# description units (classdesc, funcdesc etc.)
+
+# parent node for signature and content
+class desc(nodes.Admonition, nodes.Element): pass
+
+# additional name parts (module name, class name)
+class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# compatibility alias
+desc_classname = desc_addname
+# return type (C); object type, e.g. -> annotation (Python)
+class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# main name of object
+class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# argument list
+class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement):
+    child_text_separator = ', '
+class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement):
+    child_text_separator = ', '
+    def astext(self):
+        return '[' + nodes.TextElement.astext(self) + ']'
+# annotation (not Python 3-style annotations)
+class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+# node for content
+class desc_content(nodes.General, nodes.Element): pass
+
+# \versionadded, \versionchanged, \deprecated
+class versionmodified(nodes.Admonition, nodes.TextElement): pass
+
+# seealso
+class seealso(nodes.Admonition, nodes.Element): pass
+
+# productionlist
+class productionlist(nodes.Admonition, nodes.Element): pass
+class production(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+# toc tree
+class toctree(nodes.General, nodes.Element): pass
+
+# centered
+class centered(nodes.Part, nodes.Element): pass
+
+# pending xref
+class pending_xref(nodes.Element): pass
+
+# compact paragraph -- never makes a <p>
+class compact_paragraph(nodes.paragraph): pass
+
+# for the ACKS list
+class acks(nodes.Element): pass
+
+# sets the highlighting language for literal blocks
+class highlightlang(nodes.Element): pass
+
+# like emphasis, but doesn't apply further text processors, e.g. smartypants
+class literal_emphasis(nodes.emphasis): pass
+
+# glossary
+class glossary(nodes.Element): pass
+
+# module declaration
+class module(nodes.Element): pass
+
+# start of a file, used in the LaTeX builder only
+class start_of_file(nodes.Element): pass
+
+# tabular column specification, used for the LaTeX writer
+class tabular_col_spec(nodes.Element): pass
+
+# meta directive -- same as docutils' standard meta node, but pickleable
+class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass
+
+# make them known to docutils. this is needed, because the HTML writer
+# will choke at some point if these are not added
+nodes._add_node_class_names("""index desc desc_content desc_signature desc_type
+      desc_addname desc_name desc_parameterlist desc_parameter desc_optional
+      centered versionmodified seealso productionlist production toctree
+      pending_xref compact_paragraph highlightlang literal_emphasis
+      glossary acks module start_of_file tabular_col_spec meta""".split())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/application.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,325 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.application
+    ~~~~~~~~~~~~~~~~~~
+
+    Sphinx application object.
+
+    Gracefully adapted from the TextPress system by Armin.
+
+
+    :copyright: 2008 by Georg Brandl, Armin Ronacher.
+    :license: BSD.
+"""
+
+import sys
+import posixpath
+from cStringIO import StringIO
+
+from docutils import nodes
+from docutils.parsers.rst import directives, roles
+
+import sphinx
+from sphinx.roles import xfileref_role, innernodetypes
+from sphinx.config import Config
+from sphinx.builder import builtin_builders, StandaloneHTMLBuilder
+from sphinx.directives import desc_directive, target_directive, additional_xref_types
+from sphinx.environment import SphinxStandaloneReader
+from sphinx.util.console import bold
+
+
+class SphinxError(Exception):
+    """
+    Base class for Sphinx errors that are shown to the user in a nicer
+    way than normal exceptions.
+    """
+    category = 'Sphinx error'
+
+class ExtensionError(SphinxError):
+    """Raised if something's wrong with the configuration."""
+    category = 'Extension error'
+
+    def __init__(self, message, orig_exc=None):
+        super(ExtensionError, self).__init__(message)
+        self.orig_exc = orig_exc
+
+    def __repr__(self):
+        if self.orig_exc:
+            return '%s(%r, %r)' % (self.__class__.__name__,
+                                   self.message, self.orig_exc)
+        return '%s(%r)' % (self.__class__.__name__, self.message)
+
+    def __str__(self):
+        parent_str = super(ExtensionError, self).__str__()
+        if self.orig_exc:
+            return '%s (exception: %s)' % (parent_str, self.orig_exc)
+        return parent_str
+
+
+# List of all known core events. Maps name to arguments description.
+events = {
+    'builder-inited': '',
+    'env-purge-doc': 'env, docname',
+    'source-read': 'docname, source text',
+    'doctree-read': 'the doctree before being pickled',
+    'missing-reference': 'env, node, contnode',
+    'doctree-resolved': 'doctree, docname',
+    'env-updated': 'env',
+    'html-page-context': 'pagename, context, doctree or None',
+    'build-finished': 'exception',
+}
+
+CONFIG_FILENAME = 'conf.py'
+
+class Sphinx(object):
+
+    def __init__(self, srcdir, confdir, outdir, doctreedir, buildername,
+                 confoverrides, status, warning=sys.stderr, freshenv=False):
+        self.next_listener_id = 0
+        self._listeners = {}
+        self.builderclasses = builtin_builders.copy()
+        self.builder = None
+
+        self.srcdir = srcdir
+        self.confdir = confdir
+        self.outdir = outdir
+        self.doctreedir = doctreedir
+
+        if status is None:
+            self._status = StringIO()
+            self.quiet = True
+        else:
+            self._status = status
+            self.quiet = False
+        if warning is None:
+            self._warning = StringIO()
+        else:
+            self._warning = warning
+        self._warncount = 0
+
+        self._events = events.copy()
+
+        # status code for command-line application
+        self.statuscode = 0
+
+        # read config
+        self.config = Config(confdir, CONFIG_FILENAME, confoverrides)
+
+        # load all extension modules
+        for extension in self.config.extensions:
+            self.setup_extension(extension)
+        # the config file itself can be an extension
+        if self.config.setup:
+            self.config.setup(self)
+
+        # now that we know all config values, collect them from conf.py
+        self.config.init_values()
+
+        if buildername is None:
+            print >>status, 'No builder selected, using default: html'
+            buildername = 'html'
+        if buildername not in self.builderclasses:
+            raise SphinxError('Builder name %s not registered' % buildername)
+
+        self.info(bold('Sphinx v%s, building %s' % (sphinx.__released__,
+                                                    buildername)))
+
+        builderclass = self.builderclasses[buildername]
+        self.builder = builderclass(self, freshenv=freshenv)
+        self.emit('builder-inited')
+
+    def build(self, all_files, filenames):
+        try:
+            if all_files:
+                self.builder.build_all()
+            elif filenames:
+                self.builder.build_specific(filenames)
+            else:
+                self.builder.build_update()
+        except Exception, err:
+            self.emit('build-finished', err)
+            raise
+        else:
+            self.emit('build-finished', None)
+
+    def warn(self, message):
+        self._warncount += 1
+        try:
+            self._warning.write('WARNING: %s\n' % message)
+        except UnicodeEncodeError:
+            encoding = getattr(self._warning, 'encoding', 'ascii')
+            self._warning.write(('WARNING: %s\n' % message).encode(encoding, 'replace'))
+
+    def info(self, message='', nonl=False):
+        try:
+            self._status.write(message)
+        except UnicodeEncodeError:
+            encoding = getattr(self._status, 'encoding', 'ascii')
+            self._status.write(message.encode(encoding, 'replace'))
+        if not nonl:
+            self._status.write('\n')
+        self._status.flush()
+
+    # general extensibility interface
+
+    def setup_extension(self, extension):
+        """Import and setup a Sphinx extension module."""
+        try:
+            mod = __import__(extension, None, None, ['setup'])
+        except ImportError, err:
+            raise ExtensionError('Could not import extension %s' % extension, err)
+        if hasattr(mod, 'setup'):
+            mod.setup(self)
+
+    def import_object(self, objname, source=None):
+        """Import an object from a 'module.name' string."""
+        try:
+            module, name = objname.rsplit('.', 1)
+        except ValueError, err:
+            raise ExtensionError('Invalid full object name %s' % objname +
+                                 (source and ' (needed for %s)' % source or ''), err)
+        try:
+            return getattr(__import__(module, None, None, [name]), name)
+        except ImportError, err:
+            raise ExtensionError('Could not import %s' % module +
+                                 (source and ' (needed for %s)' % source or ''), err)
+        except AttributeError, err:
+            raise ExtensionError('Could not find %s' % objname +
+                                 (source and ' (needed for %s)' % source or ''), err)
+
+    # event interface
+
+    def _validate_event(self, event):
+        event = intern(event)
+        if event not in self._events:
+            raise ExtensionError('Unknown event name: %s' % event)
+
+    def connect(self, event, callback):
+        self._validate_event(event)
+        listener_id = self.next_listener_id
+        if event not in self._listeners:
+            self._listeners[event] = {listener_id: callback}
+        else:
+            self._listeners[event][listener_id] = callback
+        self.next_listener_id += 1
+        return listener_id
+
+    def disconnect(self, listener_id):
+        for event in self._listeners.itervalues():
+            event.pop(listener_id, None)
+
+    def emit(self, event, *args):
+        result = []
+        if event in self._listeners:
+            for _, callback in self._listeners[event].iteritems():
+                result.append(callback(self, *args))
+        return result
+
+    def emit_firstresult(self, event, *args):
+        for result in self.emit(event, *args):
+            if result is not None:
+                return result
+        return None
+
+    # registering addon parts
+
+    def add_builder(self, builder):
+        if not hasattr(builder, 'name'):
+            raise ExtensionError('Builder class %s has no "name" attribute' % builder)
+        if builder.name in self.builderclasses:
+            raise ExtensionError('Builder %r already exists (in module %s)' % (
+                builder.name, self.builderclasses[builder.name].__module__))
+        self.builderclasses[builder.name] = builder
+
+    def add_config_value(self, name, default, rebuild_env):
+        if name in self.config.values:
+            raise ExtensionError('Config value %r already present' % name)
+        self.config.values[name] = (default, rebuild_env)
+
+    def add_event(self, name):
+        if name in self._events:
+            raise ExtensionError('Event %r already present' % name)
+        self._events[name] = ''
+
+    def add_node(self, node, **kwds):
+        nodes._add_node_class_names([node.__name__])
+        for key, val in kwds.iteritems():
+            try:
+                visit, depart = val
+            except ValueError:
+                raise ExtensionError('Value for key %r must be a (visit, depart) '
+                                     'function tuple' % key)
+            if key == 'html':
+                from sphinx.htmlwriter import HTMLTranslator as translator
+            elif key == 'latex':
+                from sphinx.latexwriter import LaTeXTranslator as translator
+            elif key == 'text':
+                from sphinx.textwriter import TextTranslator as translator
+            else:
+                # ignore invalid keys for compatibility
+                continue
+            setattr(translator, 'visit_'+node.__name__, visit)
+            if depart:
+                setattr(translator, 'depart_'+node.__name__, depart)
+
+    def add_directive(self, name, func, content, arguments, **options):
+        func.content = content
+        func.arguments = arguments
+        func.options = options
+        directives.register_directive(name, func)
+
+    def add_role(self, name, role):
+        roles.register_canonical_role(name, role)
+
+    def add_description_unit(self, directivename, rolename, indextemplate='',
+                             parse_node=None, ref_nodeclass=None):
+        additional_xref_types[directivename] = (rolename, indextemplate, parse_node)
+        directives.register_directive(directivename, desc_directive)
+        roles.register_canonical_role(rolename, xfileref_role)
+        if ref_nodeclass is not None:
+            innernodetypes[rolename] = ref_nodeclass
+
+    def add_crossref_type(self, directivename, rolename, indextemplate='',
+                          ref_nodeclass=None):
+        additional_xref_types[directivename] = (rolename, indextemplate, None)
+        directives.register_directive(directivename, target_directive)
+        roles.register_canonical_role(rolename, xfileref_role)
+        if ref_nodeclass is not None:
+            innernodetypes[rolename] = ref_nodeclass
+
+    def add_transform(self, transform):
+        SphinxStandaloneReader.transforms.append(transform)
+
+    def add_javascript(self, filename):
+        StandaloneHTMLBuilder.script_files.append(
+            posixpath.join('_static', filename))
+
+
+class TemplateBridge(object):
+    """
+    This class defines the interface for a "template bridge", that is, a class
+    that renders templates given a template name and a context.
+    """
+
+    def init(self, builder):
+        """
+        Called by the builder to initialize the template system.  *builder*
+        is the builder object; you'll probably want to look at the value of
+        ``builder.config.templates_path``.
+        """
+        raise NotImplementedError('must be implemented in subclasses')
+
+    def newest_template_mtime(self):
+        """
+        Called by the builder to determine if output files are outdated
+        because of template changes.  Return the mtime of the newest template
+        file that was changed.  The default implementation returns ``0``.
+        """
+        return 0
+
+    def render(self, template, context):
+        """
+        Called by the builder to render a *template* with a specified
+        context (a Python dictionary).
+        """
+        raise NotImplementedError('must be implemented in subclasses')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1272 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.builder
+    ~~~~~~~~~~~~~~
+
+    Builder classes for different output formats.
+
+    :copyright: 2007-2008 by Georg Brandl, Sebastian Wiesner, Horst Gutmann.
+    :license: BSD.
+"""
+
+import os
+import time
+import codecs
+import shutil
+import gettext
+import cPickle as pickle
+from os import path
+from cgi import escape
+
+from docutils import nodes
+from docutils.io import StringOutput, FileOutput, DocTreeInput
+from docutils.core import publish_parts
+from docutils.utils import new_document
+from docutils.frontend import OptionParser
+from docutils.readers.doctree import Reader as DoctreeReader
+
+from sphinx import addnodes, locale, __version__
+from sphinx.util import ensuredir, relative_uri, SEP, os_path, texescape, ustrftime
+from sphinx.htmlhelp import build_hhx
+from sphinx.htmlwriter import HTMLWriter, HTMLTranslator, SmartyPantsHTMLTranslator
+from sphinx.textwriter import TextWriter
+from sphinx.latexwriter import LaTeXWriter
+from sphinx.environment import BuildEnvironment, NoUri
+from sphinx.highlighting import PygmentsBridge
+from sphinx.util.console import bold, purple, darkgreen
+from sphinx.search import js_index
+
+try:
+    import json
+except ImportError:
+    try:
+        import simplejson as json
+    except ImportError:
+        json = None
+
+# side effect: registers roles and directives
+from sphinx import roles
+from sphinx import directives
+
+ENV_PICKLE_FILENAME = 'environment.pickle'
+LAST_BUILD_FILENAME = 'last_build'
+INVENTORY_FILENAME = 'objects.inv'
+
+
+class Builder(object):
+    """
+    Builds target formats from the reST sources.
+    """
+
+    # builder's name, for the -b command line options
+    name = ''
+
+    def __init__(self, app, env=None, freshenv=False):
+        self.srcdir = app.srcdir
+        self.confdir = app.confdir
+        self.outdir = app.outdir
+        self.doctreedir = app.doctreedir
+        if not path.isdir(self.doctreedir):
+            os.makedirs(self.doctreedir)
+
+        self.app = app
+        self.warn = app.warn
+        self.info = app.info
+        self.config = app.config
+
+        self.load_i18n()
+
+        # images that need to be copied over (source -> dest)
+        self.images = {}
+
+        # if None, this is set in load_env()
+        self.env = env
+        self.freshenv = freshenv
+
+        self.init()
+        self.load_env()
+
+    # helper methods
+
+    def init(self):
+        """Load necessary templates and perform initialization."""
+        raise NotImplementedError
+
+    def init_templates(self):
+        # Call this from init() if you need templates.
+        if self.config.template_bridge:
+            self.templates = self.app.import_object(
+                self.config.template_bridge, 'template_bridge setting')()
+        else:
+            from sphinx._jinja import BuiltinTemplates
+            self.templates = BuiltinTemplates()
+        self.templates.init(self)
+
+    def get_target_uri(self, docname, typ=None):
+        """
+        Return the target URI for a document name (typ can be used to qualify
+        the link characteristic for individual builders).
+        """
+        raise NotImplementedError
+
+    def get_relative_uri(self, from_, to, typ=None):
+        """
+        Return a relative URI between two source filenames. May raise environment.NoUri
+        if there's no way to return a sensible URI.
+        """
+        return relative_uri(self.get_target_uri(from_),
+                            self.get_target_uri(to, typ))
+
+    def get_outdated_docs(self):
+        """
+        Return an iterable of output files that are outdated, or a string describing
+        what an update build will build.
+        """
+        raise NotImplementedError
+
+    def status_iterator(self, iterable, summary, colorfunc=darkgreen):
+        l = -1
+        for item in iterable:
+            if l == -1:
+                self.info(bold(summary), nonl=1)
+                l = 0
+            self.info(colorfunc(item) + ' ', nonl=1)
+            yield item
+        if l == 0:
+            self.info()
+
+    supported_image_types = []
+
+    def post_process_images(self, doctree):
+        """
+        Pick the best candidate for all image URIs.
+        """
+        for node in doctree.traverse(nodes.image):
+            if '?' in node['candidates']:
+                # don't rewrite nonlocal image URIs
+                continue
+            if '*' not in node['candidates']:
+                for imgtype in self.supported_image_types:
+                    candidate = node['candidates'].get(imgtype, None)
+                    if candidate:
+                        break
+                else:
+                    self.warn('%s:%s: no matching candidate for image URI %r' %
+                              (node.source, getattr(node, 'lineno', ''), node['uri']))
+                    continue
+                node['uri'] = candidate
+            else:
+                candidate = node['uri']
+            if candidate not in self.env.images:
+                # non-existing URI; let it alone
+                continue
+            self.images[candidate] = self.env.images[candidate][1]
+
+    # build methods
+
+    def load_i18n(self):
+        """
+        Load translated strings from the configured localedirs if
+        enabled in the configuration.
+        """
+        self.translator = None
+        if self.config.language is not None:
+            self.info(bold('loading translations [%s]... ' % self.config.language),
+                      nonl=True)
+            locale_dirs = [path.join(path.dirname(__file__), 'locale')] + \
+                          [path.join(self.srcdir, x) for x in self.config.locale_dirs]
+            for dir_ in locale_dirs:
+                try:
+                    trans = gettext.translation('sphinx', localedir=dir_,
+                            languages=[self.config.language])
+                    if self.translator is None:
+                        self.translator = trans
+                    else:
+                        self.translator._catalog.update(trans.catalog)
+                except Exception:
+                    # Language couldn't be found in the specified path
+                    pass
+            if self.translator is not None:
+                self.info('done')
+            else:
+                self.info('locale not available')
+        if self.translator is None:
+            self.translator = gettext.NullTranslations()
+        self.translator.install(unicode=True)
+        locale.init()  # translate common labels
+
+    def load_env(self):
+        """Set up the build environment."""
+        if self.env:
+            return
+        if not self.freshenv:
+            try:
+                self.info(bold('loading pickled environment... '), nonl=True)
+                self.env = BuildEnvironment.frompickle(self.config,
+                    path.join(self.doctreedir, ENV_PICKLE_FILENAME))
+                self.info('done')
+            except Exception, err:
+                if type(err) is IOError and err.errno == 2:
+                    self.info('not found')
+                else:
+                    self.info('failed: %s' % err)
+                self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
+                self.env.find_files(self.config)
+        else:
+            self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
+            self.env.find_files(self.config)
+        self.env.set_warnfunc(self.warn)
+
+    def build_all(self):
+        """Build all source files."""
+        self.build(None, summary='all source files', method='all')
+
+    def build_specific(self, filenames):
+        """Only rebuild as much as needed for changes in the source_filenames."""
+        # bring the filenames to the canonical format, that is,
+        # relative to the source directory and without source_suffix.
+        dirlen = len(self.srcdir) + 1
+        to_write = []
+        suffix = self.config.source_suffix
+        for filename in filenames:
+            filename = path.abspath(filename)[dirlen:]
+            if filename.endswith(suffix):
+                filename = filename[:-len(suffix)]
+            filename = filename.replace(os.path.sep, SEP)
+            to_write.append(filename)
+        self.build(to_write, method='specific',
+                   summary='%d source files given on command '
+                   'line' % len(to_write))
+
+    def build_update(self):
+        """Only rebuild files changed or added since last build."""
+        to_build = self.get_outdated_docs()
+        if isinstance(to_build, str):
+            self.build(['__all__'], to_build)
+        else:
+            to_build = list(to_build)
+            self.build(to_build,
+                       summary='targets for %d source files that are '
+                       'out of date' % len(to_build))
+
+    def build(self, docnames, summary=None, method='update'):
+        if summary:
+            self.info(bold('building [%s]: ' % self.name), nonl=1)
+            self.info(summary)
+
+        updated_docnames = []
+        # while reading, collect all warnings from docutils
+        warnings = []
+        self.env.set_warnfunc(warnings.append)
+        self.info(bold('updating environment: '), nonl=1)
+        iterator = self.env.update(self.config, self.srcdir, self.doctreedir, self.app)
+        # the first item in the iterator is a summary message
+        self.info(iterator.next())
+        for docname in self.status_iterator(iterator, 'reading sources... ', purple):
+            updated_docnames.append(docname)
+            # nothing further to do, the environment has already done the reading
+        for warning in warnings:
+            if warning.strip():
+                self.warn(warning)
+        self.env.set_warnfunc(self.warn)
+
+        if updated_docnames:
+            # save the environment
+            self.info(bold('pickling environment... '), nonl=True)
+            self.env.topickle(path.join(self.doctreedir, ENV_PICKLE_FILENAME))
+            self.info('done')
+
+            # global actions
+            self.info(bold('checking consistency... '), nonl=True)
+            self.env.check_consistency()
+            self.info('done')
+        else:
+            if method == 'update' and not docnames:
+                self.info(bold('no targets are out of date.'))
+                return
+
+        # another indirection to support methods which don't build files
+        # individually
+        self.write(docnames, updated_docnames, method)
+
+        # finish (write static files etc.)
+        self.finish()
+        status = self.app.statuscode == 0 and 'succeeded' or 'finished with problems'
+        if self.app._warncount:
+            self.info(bold('build %s, %s warning%s.' %
+                           (status, self.app._warncount,
+                            self.app._warncount != 1 and 's' or '')))
+        else:
+            self.info(bold('build %s.' % status))
+
+    def write(self, build_docnames, updated_docnames, method='update'):
+        if build_docnames is None or build_docnames == ['__all__']:
+            # build_all
+            build_docnames = self.env.found_docs
+        if method == 'update':
+            # build updated ones as well
+            docnames = set(build_docnames) | set(updated_docnames)
+        else:
+            docnames = set(build_docnames)
+
+        # add all toctree-containing files that may have changed
+        for docname in list(docnames):
+            for tocdocname in self.env.files_to_rebuild.get(docname, []):
+                docnames.add(tocdocname)
+        docnames.add(self.config.master_doc)
+
+        self.info(bold('preparing documents... '), nonl=True)
+        self.prepare_writing(docnames)
+        self.info('done')
+
+        # write target files
+        warnings = []
+        self.env.set_warnfunc(warnings.append)
+        for docname in self.status_iterator(sorted(docnames),
+                                            'writing output... ', darkgreen):
+            doctree = self.env.get_and_resolve_doctree(docname, self)
+            self.write_doc(docname, doctree)
+        for warning in warnings:
+            if warning.strip():
+                self.warn(warning)
+        self.env.set_warnfunc(self.warn)
+
+    def prepare_writing(self, docnames):
+        raise NotImplementedError
+
+    def write_doc(self, docname, doctree):
+        raise NotImplementedError
+
+    def finish(self):
+        raise NotImplementedError
+
+
+class StandaloneHTMLBuilder(Builder):
+    """
+    Builds standalone HTML docs.
+    """
+    name = 'html'
+    copysource = True
+    out_suffix = '.html'
+    indexer_format = js_index
+    supported_image_types = ['image/svg+xml', 'image/png', 'image/gif',
+                             'image/jpeg']
+    searchindex_filename = 'searchindex.js'
+    add_header_links = True
+    add_definition_links = True
+
+    # This is a class attribute because it is mutated by Sphinx.add_javascript.
+    script_files = ['_static/jquery.js', '_static/doctools.js']
+
+    def init(self):
+        """Load templates."""
+        self.init_templates()
+        self.init_translator_class()
+        if self.config.html_file_suffix:
+            self.out_suffix = self.config.html_file_suffix
+
+        if self.config.language is not None:
+            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
+                               'LC_MESSAGES', 'sphinx.js')
+            if path.isfile(jsfile):
+                self.script_files.append('_static/translations.js')
+
+    def init_translator_class(self):
+        if self.config.html_translator_class:
+            self.translator_class = self.app.import_object(
+                self.config.html_translator_class, 'html_translator_class setting')
+        elif self.config.html_use_smartypants:
+            self.translator_class = SmartyPantsHTMLTranslator
+        else:
+            self.translator_class = HTMLTranslator
+
+    def render_partial(self, node):
+        """Utility: Render a lone doctree node."""
+        doc = new_document('<partial node>')
+        doc.append(node)
+        return publish_parts(
+            doc,
+            source_class=DocTreeInput,
+            reader=DoctreeReader(),
+            writer=HTMLWriter(self),
+            settings_overrides={'output_encoding': 'unicode'}
+        )
+
+    def prepare_writing(self, docnames):
+        from sphinx.search import IndexBuilder
+
+        self.indexer = IndexBuilder(self.env)
+        self.load_indexer(docnames)
+        self.docwriter = HTMLWriter(self)
+        self.docsettings = OptionParser(
+            defaults=self.env.settings,
+            components=(self.docwriter,)).get_default_values()
+
+        # format the "last updated on" string, only once is enough since it
+        # typically doesn't include the time of day
+        lufmt = self.config.html_last_updated_fmt
+        if lufmt is not None:
+            self.last_updated = ustrftime(lufmt or _('%b %d, %Y'))
+        else:
+            self.last_updated = None
+
+        logo = self.config.html_logo and \
+               path.basename(self.config.html_logo) or ''
+
+        favicon = self.config.html_favicon and \
+                  path.basename(self.config.html_favicon) or ''
+        if favicon and os.path.splitext(favicon)[1] != '.ico':
+            self.warn('html_favicon is not an .ico file')
+
+        if not isinstance(self.config.html_use_opensearch, basestring):
+            self.warn('html_use_opensearch config value must now be a string')
+
+        self.relations = self.env.collect_relations()
+
+        rellinks = []
+        if self.config.html_use_index:
+            rellinks.append(('genindex', _('General Index'), 'I', _('index')))
+        if self.config.html_use_modindex and self.env.modules:
+            rellinks.append(('modindex', _('Global Module Index'), 'M', _('modules')))
+
+        self.globalcontext = dict(
+            project = self.config.project,
+            release = self.config.release,
+            version = self.config.version,
+            last_updated = self.last_updated,
+            copyright = self.config.copyright,
+            master_doc = self.config.master_doc,
+            style = self.config.html_style,
+            use_opensearch = self.config.html_use_opensearch,
+            docstitle = self.config.html_title,
+            shorttitle = self.config.html_short_title,
+            show_sphinx = self.config.html_show_sphinx,
+            has_source = self.config.html_copy_source,
+            file_suffix = self.out_suffix,
+            script_files = self.script_files,
+            sphinx_version = __version__,
+            rellinks = rellinks,
+            builder = self.name,
+            parents = [],
+            logo = logo,
+            favicon = favicon,
+        )
+        self.globalcontext.update(self.config.html_context)
+
+    def get_doc_context(self, docname, body, metatags):
+        """Collect items for the template context of a page."""
+        # find out relations
+        prev = next = None
+        parents = []
+        rellinks = self.globalcontext['rellinks'][:]
+        related = self.relations.get(docname)
+        titles = self.env.titles
+        if related and related[2]:
+            try:
+                next = {'link': self.get_relative_uri(docname, related[2]),
+                        'title': self.render_partial(titles[related[2]])['title']}
+                rellinks.append((related[2], next['title'], 'N', _('next')))
+            except KeyError:
+                next = None
+        if related and related[1]:
+            try:
+                prev = {'link': self.get_relative_uri(docname, related[1]),
+                        'title': self.render_partial(titles[related[1]])['title']}
+                rellinks.append((related[1], prev['title'], 'P', _('previous')))
+            except KeyError:
+                # the relation is (somehow) not in the TOC tree, handle that gracefully
+                prev = None
+        while related and related[0]:
+            try:
+                parents.append(
+                    {'link': self.get_relative_uri(docname, related[0]),
+                     'title': self.render_partial(titles[related[0]])['title']})
+            except KeyError:
+                pass
+            related = self.relations.get(related[0])
+        if parents:
+            parents.pop() # remove link to the master file; we have a generic
+                          # "back to index" link already
+        parents.reverse()
+
+        # title rendered as HTML
+        title = titles.get(docname)
+        title = title and self.render_partial(title)['title'] or ''
+        # the name for the copied source
+        sourcename = self.config.html_copy_source and docname + '.txt' or ''
+
+        # metadata for the document
+        meta = self.env.metadata.get(docname)
+
+        return dict(
+            parents = parents,
+            prev = prev,
+            next = next,
+            title = title,
+            meta = meta,
+            body = body,
+            metatags = metatags,
+            rellinks = rellinks,
+            sourcename = sourcename,
+            toc = self.render_partial(self.env.get_toc_for(docname))['fragment'],
+            # only display a TOC if there's more than one item to show
+            display_toc = (self.env.toc_num_entries[docname] > 1),
+        )
+
+    def write_doc(self, docname, doctree):
+        self.post_process_images(doctree)
+        destination = StringOutput(encoding='utf-8')
+        doctree.settings = self.docsettings
+
+        self.imgpath = relative_uri(self.get_target_uri(docname), '_images')
+        self.docwriter.write(doctree, destination)
+        self.docwriter.assemble_parts()
+        body = self.docwriter.parts['fragment']
+        metatags = self.docwriter.clean_meta
+
+        ctx = self.get_doc_context(docname, body, metatags)
+        self.index_page(docname, doctree, ctx.get('title', ''))
+        self.handle_page(docname, ctx, event_arg=doctree)
+
+    def finish(self):
+        self.info(bold('writing additional files...'), nonl=1)
+
+        # the global general index
+
+        if self.config.html_use_index:
+            # the total count of lines for each index letter, used to distribute
+            # the entries into two columns
+            genindex = self.env.create_index(self)
+            indexcounts = []
+            for _, entries in genindex:
+                indexcounts.append(sum(1 + len(subitems)
+                                       for _, (_, subitems) in entries))
+
+            genindexcontext = dict(
+                genindexentries = genindex,
+                genindexcounts = indexcounts,
+                split_index = self.config.html_split_index,
+            )
+            self.info(' genindex', nonl=1)
+
+            if self.config.html_split_index:
+                self.handle_page('genindex', genindexcontext, 'genindex-split.html')
+                self.handle_page('genindex-all', genindexcontext, 'genindex.html')
+                for (key, entries), count in zip(genindex, indexcounts):
+                    ctx = {'key': key, 'entries': entries, 'count': count,
+                           'genindexentries': genindex}
+                    self.handle_page('genindex-' + key, ctx, 'genindex-single.html')
+            else:
+                self.handle_page('genindex', genindexcontext, 'genindex.html')
+
+        # the global module index
+
+        if self.config.html_use_modindex and self.env.modules:
+            # the sorted list of all modules, for the global module index
+            modules = sorted(((mn, (self.get_relative_uri('modindex', fn) +
+                                    '#module-' + mn, sy, pl, dep))
+                              for (mn, (fn, sy, pl, dep)) in
+                              self.env.modules.iteritems()),
+                             key=lambda x: x[0].lower())
+            # collect all platforms
+            platforms = set()
+            # sort out collapsable modules
+            modindexentries = []
+            letters = []
+            pmn = ''
+            num_toplevels = 0
+            num_collapsables = 0
+            cg = 0 # collapse group
+            fl = '' # first letter
+            for mn, (fn, sy, pl, dep) in modules:
+                pl = pl and pl.split(', ') or []
+                platforms.update(pl)
+                if fl != mn[0].lower() and mn[0] != '_':
+                    # heading
+                    modindexentries.append(['', False, 0, False,
+                                            mn[0].upper(), '', [], False])
+                    letters.append(mn[0].upper())
+                tn = mn.split('.')[0]
+                if tn != mn:
+                    # submodule
+                    if pmn == tn:
+                        # first submodule - make parent collapsable
+                        modindexentries[-1][1] = True
+                        num_collapsables += 1
+                    elif not pmn.startswith(tn):
+                        # submodule without parent in list, add dummy entry
+                        cg += 1
+                        modindexentries.append([tn, True, cg, False, '', '', [], False])
+                else:
+                    num_toplevels += 1
+                    cg += 1
+                modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl, dep])
+                pmn = mn
+                fl = mn[0].lower()
+            platforms = sorted(platforms)
+
+            # apply heuristics when to collapse modindex at page load:
+            # only collapse if number of toplevel modules is larger than
+            # number of submodules
+            collapse = len(modules) - num_toplevels < num_toplevels
+
+            modindexcontext = dict(
+                modindexentries = modindexentries,
+                platforms = platforms,
+                letters = letters,
+                collapse_modindex = collapse,
+            )
+            self.info(' modindex', nonl=1)
+            self.handle_page('modindex', modindexcontext, 'modindex.html')
+
+        # the search page
+        if self.name != 'htmlhelp':
+            self.info(' search', nonl=1)
+            self.handle_page('search', {}, 'search.html')
+
+        # additional pages from conf.py
+        for pagename, template in self.config.html_additional_pages.items():
+            self.info(' '+pagename, nonl=1)
+            self.handle_page(pagename, {}, template)
+
+        if self.config.html_use_opensearch and self.name != 'htmlhelp':
+            self.info(' opensearch', nonl=1)
+            fn = path.join(self.outdir, '_static', 'opensearch.xml')
+            self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
+
+        self.info()
+
+        # copy image files
+        if self.images:
+            self.info(bold('copying images...'), nonl=True)
+            ensuredir(path.join(self.outdir, '_images'))
+            for src, dest in self.images.iteritems():
+                self.info(' '+src, nonl=1)
+                shutil.copyfile(path.join(self.srcdir, src),
+                                path.join(self.outdir, '_images', dest))
+            self.info()
+
+        # copy static files
+        self.info(bold('copying static files... '), nonl=True)
+        ensuredir(path.join(self.outdir, '_static'))
+        # first, create pygments style file
+        f = open(path.join(self.outdir, '_static', 'pygments.css'), 'w')
+        f.write(PygmentsBridge('html', self.config.pygments_style).get_stylesheet())
+        f.close()
+        # then, copy translations JavaScript file
+        if self.config.language is not None:
+            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
+                               'LC_MESSAGES', 'sphinx.js')
+            if path.isfile(jsfile):
+                shutil.copyfile(jsfile, path.join(self.outdir, '_static',
+                                                  'translations.js'))
+        # then, copy over all user-supplied static files
+        staticdirnames = [path.join(path.dirname(__file__), 'static')] + \
+                         [path.join(self.confdir, spath)
+                          for spath in self.config.html_static_path]
+        for staticdirname in staticdirnames:
+            for filename in os.listdir(staticdirname):
+                if filename.startswith('.'):
+                    continue
+                fullname = path.join(staticdirname, filename)
+                targetname = path.join(self.outdir, '_static', filename)
+                if path.isfile(fullname):
+                    shutil.copyfile(fullname, targetname)
+                elif path.isdir(fullname):
+                    if filename in self.config.exclude_dirnames:
+                        continue
+                    if path.exists(targetname):
+                        shutil.rmtree(targetname)
+                    shutil.copytree(fullname, targetname)
+        # last, copy logo file (handled differently)
+        if self.config.html_logo:
+            logobase = path.basename(self.config.html_logo)
+            shutil.copyfile(path.join(self.confdir, self.config.html_logo),
+                            path.join(self.outdir, '_static', logobase))
+        self.info('done')
+
+        # dump the search index
+        self.handle_finish()
+
+    def get_outdated_docs(self):
+        if self.templates:
+            template_mtime = self.templates.newest_template_mtime()
+        else:
+            template_mtime = 0
+        for docname in self.env.found_docs:
+            if docname not in self.env.all_docs:
+                yield docname
+                continue
+            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
+            try:
+                targetmtime = path.getmtime(targetname)
+            except Exception:
+                targetmtime = 0
+            try:
+                srcmtime = max(path.getmtime(self.env.doc2path(docname)),
+                               template_mtime)
+                if srcmtime > targetmtime:
+                    yield docname
+            except EnvironmentError:
+                # source doesn't exist anymore
+                pass
+
+    def load_indexer(self, docnames):
+        keep = set(self.env.all_docs) - set(docnames)
+        try:
+            f = open(path.join(self.outdir, self.searchindex_filename), 'rb')
+            try:
+                self.indexer.load(f, self.indexer_format)
+            finally:
+                f.close()
+        except (IOError, OSError, ValueError):
+            if keep:
+                self.warn("search index couldn't be loaded, but not all documents "
+                          "will be built: the index will be incomplete.")
+        # delete all entries for files that will be rebuilt
+        self.indexer.prune(keep)
+
+    def index_page(self, pagename, doctree, title):
+        # only index pages with title
+        if self.indexer is not None and title:
+            self.indexer.feed(pagename, title, doctree)
+
+    # --------- these are overwritten by the serialization builder
+
+    def get_target_uri(self, docname, typ=None):
+        return docname + self.out_suffix
+
+    def handle_page(self, pagename, addctx, templatename='page.html',
+                    outfilename=None, event_arg=None):
+        ctx = self.globalcontext.copy()
+        # current_page_name is backwards compatibility
+        ctx['pagename'] = ctx['current_page_name'] = pagename
+
+        def pathto(otheruri, resource=False,
+                   baseuri=self.get_target_uri(pagename)):
+            if not resource:
+                otheruri = self.get_target_uri(otheruri)
+            return relative_uri(baseuri, otheruri)
+        ctx['pathto'] = pathto
+        ctx['hasdoc'] = lambda name: name in self.env.all_docs
+        ctx['customsidebar'] = self.config.html_sidebars.get(pagename)
+        ctx.update(addctx)
+
+        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
+
+        output = self.templates.render(templatename, ctx)
+        if not outfilename:
+            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
+        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
+        try:
+            f = codecs.open(outfilename, 'w', 'utf-8')
+            try:
+                f.write(output)
+            finally:
+                f.close()
+        except (IOError, OSError), err:
+            self.warn("Error writing file %s: %s" % (outfilename, err))
+        if self.copysource and ctx.get('sourcename'):
+            # copy the source file for the "show source" link
+            source_name = path.join(self.outdir, '_sources', os_path(ctx['sourcename']))
+            ensuredir(path.dirname(source_name))
+            shutil.copyfile(self.env.doc2path(pagename), source_name)
+
+    def handle_finish(self):
+        self.info(bold('dumping search index... '), nonl=True)
+        self.indexer.prune(self.env.all_docs)
+        f = open(path.join(self.outdir, self.searchindex_filename), 'wb')
+        try:
+            self.indexer.dump(f, self.indexer_format)
+        finally:
+            f.close()
+        self.info('done')
+
+        self.info(bold('dumping object inventory... '), nonl=True)
+        f = open(path.join(self.outdir, INVENTORY_FILENAME), 'w')
+        try:
+            f.write('# Sphinx inventory version 1\n')
+            f.write('# Project: %s\n' % self.config.project.encode('utf-8'))
+            f.write('# Version: %s\n' % self.config.version)
+            for modname, info in self.env.modules.iteritems():
+                f.write('%s mod %s\n' % (modname, self.get_target_uri(info[0])))
+            for refname, (docname, desctype) in self.env.descrefs.iteritems():
+                f.write('%s %s %s\n' % (refname, desctype, self.get_target_uri(docname)))
+        finally:
+            f.close()
+        self.info('done')
+
+
+class SerializingHTMLBuilder(StandaloneHTMLBuilder):
+    """
+    An abstract builder that serializes the HTML generated.
+    """
+    #: the serializing implementation to use.  Set this to a module that
+    #: implements a `dump`, `load`, `dumps` and `loads` functions
+    #: (pickle, simplejson etc.)
+    implementation = None
+
+    #: the filename for the global context file
+    globalcontext_filename = None
+
+    supported_image_types = ('image/svg+xml', 'image/png', 'image/gif',
+                             'image/jpeg')
+
+    def init(self):
+        self.init_translator_class()
+        self.templates = None   # no template bridge necessary
+
+    def get_target_uri(self, docname, typ=None):
+        if docname == 'index':
+            return ''
+        if docname.endswith(SEP + 'index'):
+            return docname[:-5] # up to sep
+        return docname + SEP
+
+    def handle_page(self, pagename, ctx, templatename='page.html',
+                    outfilename=None, event_arg=None):
+        ctx['current_page_name'] = pagename
+        sidebarfile = self.config.html_sidebars.get(pagename)
+        if sidebarfile:
+            ctx['customsidebar'] = sidebarfile
+
+        if not outfilename:
+            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
+
+        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
+
+        ensuredir(path.dirname(outfilename))
+        f = open(outfilename, 'wb')
+        try:
+            self.implementation.dump(ctx, f, 2)
+        finally:
+            f.close()
+
+        # if there is a source file, copy the source file for the
+        # "show source" link
+        if ctx.get('sourcename'):
+            source_name = path.join(self.outdir, '_sources',
+                                    os_path(ctx['sourcename']))
+            ensuredir(path.dirname(source_name))
+            shutil.copyfile(self.env.doc2path(pagename), source_name)
+
+    def handle_finish(self):
+        # dump the global context
+        outfilename = path.join(self.outdir, self.globalcontext_filename)
+        f = open(outfilename, 'wb')
+        try:
+            self.implementation.dump(self.globalcontext, f, 2)
+        finally:
+            f.close()
+
+        # super here to dump the search index
+        StandaloneHTMLBuilder.handle_finish(self)
+
+        # copy the environment file from the doctree dir to the output dir
+        # as needed by the web app
+        shutil.copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME),
+                        path.join(self.outdir, ENV_PICKLE_FILENAME))
+
+        # touch 'last build' file, used by the web application to determine
+        # when to reload its environment and clear the cache
+        open(path.join(self.outdir, LAST_BUILD_FILENAME), 'w').close()
+
+
+class PickleHTMLBuilder(SerializingHTMLBuilder):
+    """
+    A Builder that dumps the generated HTML into pickle files.
+    """
+    implementation = pickle
+    indexer_format = pickle
+    name = 'pickle'
+    out_suffix = '.fpickle'
+    globalcontext_filename = 'globalcontext.pickle'
+    searchindex_filename = 'searchindex.pickle'
+
+
+class JSONHTMLBuilder(SerializingHTMLBuilder):
+    """
+    A builder that dumps the generated HTML into JSON files.
+    """
+    implementation = json
+    indexer_format = json
+    name = 'json'
+    out_suffix = '.fjson'
+    globalcontext_filename = 'globalcontext.json'
+    searchindex_filename = 'searchindex.json'
+
+    def init(self):
+        if json is None:
+            from sphinx.application import SphinxError
+            raise SphinxError('The module simplejson (or json in Python >= 2.6) '
+                              'is not available. The JSONHTMLBuilder builder '
+                              'will not work.')
+        SerializingHTMLBuilder.init(self)
+
+
+class HTMLHelpBuilder(StandaloneHTMLBuilder):
+    """
+    Builder that also outputs Windows HTML help project, contents and index files.
+    Adapted from the original Doc/tools/prechm.py.
+    """
+    name = 'htmlhelp'
+
+    # don't copy the reST source
+    copysource = False
+    supported_image_types = ['image/png', 'image/gif', 'image/jpeg']
+
+    # don't add links
+    add_header_links = False
+    add_definition_links = False
+
+    def init(self):
+        StandaloneHTMLBuilder.init(self)
+        # the output files for HTML help must be .html only
+        self.out_suffix = '.html'
+
+    def handle_finish(self):
+        build_hhx(self, self.outdir, self.config.htmlhelp_basename)
+
+
+class LaTeXBuilder(Builder):
+    """
+    Builds LaTeX output to create PDF.
+    """
+    name = 'latex'
+    supported_image_types = ['application/pdf', 'image/png', 'image/gif',
+                             'image/jpeg']
+
+    def init(self):
+        self.docnames = []
+        self.document_data = []
+        texescape.init()
+
+    def get_outdated_docs(self):
+        return 'all documents' # for now
+
+    def get_target_uri(self, docname, typ=None):
+        if typ == 'token':
+            # token references are always inside production lists and must be
+            # replaced by \token{} in LaTeX
+            return '@token'
+        if docname not in self.docnames:
+            raise NoUri
+        else:
+            return ''
+
+    def init_document_data(self):
+        preliminary_document_data = map(list, self.config.latex_documents)
+        if not preliminary_document_data:
+            self.warn('No "latex_documents" config value found; no documents '
+                      'will be written.')
+            return
+        # assign subdirs to titles
+        self.titles = []
+        for entry in preliminary_document_data:
+            docname = entry[0]
+            if docname not in self.env.all_docs:
+                self.warn('"latex_documents" config value references unknown '
+                          'document %s' % docname)
+                continue
+            self.document_data.append(entry)
+            if docname.endswith(SEP+'index'):
+                docname = docname[:-5]
+            self.titles.append((docname, entry[2]))
+
+    def write(self, *ignored):
+        # first, assemble the "appendix" docs that are in every PDF
+        appendices = []
+        for fname in self.config.latex_appendices:
+            appendices.append(self.env.get_doctree(fname))
+
+        docwriter = LaTeXWriter(self)
+        docsettings = OptionParser(
+            defaults=self.env.settings,
+            components=(docwriter,)).get_default_values()
+
+        self.init_document_data()
+
+        for entry in self.document_data:
+            docname, targetname, title, author, docclass = entry[:5]
+            toctree_only = False
+            if len(entry) > 5:
+                toctree_only = entry[5]
+            destination = FileOutput(
+                destination_path=path.join(self.outdir, targetname),
+                encoding='utf-8')
+            self.info("processing " + targetname + "... ", nonl=1)
+            doctree = self.assemble_doctree(docname, toctree_only,
+                appendices=(docclass == 'manual') and appendices or [])
+            self.post_process_images(doctree)
+            self.info("writing... ", nonl=1)
+            doctree.settings = docsettings
+            doctree.settings.author = author
+            doctree.settings.title = title
+            doctree.settings.docname = docname
+            doctree.settings.docclass = docclass
+            docwriter.write(doctree, destination)
+            self.info("done")
+
+    def assemble_doctree(self, indexfile, toctree_only, appendices):
+        self.docnames = set([indexfile] + appendices)
+        self.info(darkgreen(indexfile) + " ", nonl=1)
+        def process_tree(docname, tree):
+            tree = tree.deepcopy()
+            for toctreenode in tree.traverse(addnodes.toctree):
+                newnodes = []
+                includefiles = map(str, toctreenode['includefiles'])
+                for includefile in includefiles:
+                    try:
+                        self.info(darkgreen(includefile) + " ", nonl=1)
+                        subtree = process_tree(includefile,
+                                               self.env.get_doctree(includefile))
+                        self.docnames.add(includefile)
+                    except Exception:
+                        self.warn('%s: toctree contains ref to nonexisting file %r' %
+                                  (docname, includefile))
+                    else:
+                        sof = addnodes.start_of_file()
+                        sof.children = subtree.children
+                        newnodes.append(sof)
+                toctreenode.parent.replace(toctreenode, newnodes)
+            return tree
+        tree = self.env.get_doctree(indexfile)
+        if toctree_only:
+            # extract toctree nodes from the tree and put them in a fresh document
+            new_tree = new_document('<latex output>')
+            new_sect = nodes.section()
+            new_sect += nodes.title(u'<Set title in conf.py>', u'<Set title in conf.py>')
+            new_tree += new_sect
+            for node in tree.traverse(addnodes.toctree):
+                new_sect += node
+            tree = new_tree
+        largetree = process_tree(indexfile, tree)
+        largetree.extend(appendices)
+        self.info()
+        self.info("resolving references...")
+        self.env.resolve_references(largetree, indexfile, self)
+        # resolve :ref:s to distant tex files -- we can't add a cross-reference,
+        # but append the document name
+        for pendingnode in largetree.traverse(addnodes.pending_xref):
+            docname = pendingnode['refdocname']
+            sectname = pendingnode['refsectname']
+            newnodes = [nodes.emphasis(sectname, sectname)]
+            for subdir, title in self.titles:
+                if docname.startswith(subdir):
+                    newnodes.append(nodes.Text(_(' (in '), _(' (in ')))
+                    newnodes.append(nodes.emphasis(title, title))
+                    newnodes.append(nodes.Text(')', ')'))
+                    break
+            else:
+                pass
+            pendingnode.replace_self(newnodes)
+        return largetree
+
+    def finish(self):
+        # copy image files
+        if self.images:
+            self.info(bold('copying images...'), nonl=1)
+            for src, dest in self.images.iteritems():
+                self.info(' '+src, nonl=1)
+                shutil.copyfile(path.join(self.srcdir, src),
+                                path.join(self.outdir, dest))
+            self.info()
+
+        # the logo is handled differently
+        if self.config.latex_logo:
+            logobase = path.basename(self.config.latex_logo)
+            shutil.copyfile(path.join(self.confdir, self.config.latex_logo),
+                            path.join(self.outdir, logobase))
+
+        self.info(bold('copying TeX support files... '), nonl=True)
+        staticdirname = path.join(path.dirname(__file__), 'texinputs')
+        for filename in os.listdir(staticdirname):
+            if not filename.startswith('.'):
+                shutil.copyfile(path.join(staticdirname, filename),
+                                path.join(self.outdir, filename))
+        self.info('done')
+
+
+class ChangesBuilder(Builder):
+    """
+    Write a summary with all versionadded/changed directives.
+    """
+    name = 'changes'
+
+    def init(self):
+        self.init_templates()
+
+    def get_outdated_docs(self):
+        return self.outdir
+
+    typemap = {
+        'versionadded': 'added',
+        'versionchanged': 'changed',
+        'deprecated': 'deprecated',
+    }
+
+    def write(self, *ignored):
+        version = self.config.version
+        libchanges = {}
+        apichanges = []
+        otherchanges = {}
+        if version not in self.env.versionchanges:
+            self.info(bold('no changes in this version.'))
+            return
+        self.info(bold('writing summary file...'))
+        for type, docname, lineno, module, descname, content in \
+                self.env.versionchanges[version]:
+            ttext = self.typemap[type]
+            context = content.replace('\n', ' ')
+            if descname and docname.startswith('c-api'):
+                if not descname:
+                    continue
+                if context:
+                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
+                else:
+                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
+                apichanges.append((entry, docname, lineno))
+            elif descname or module:
+                if not module:
+                    module = _('Builtins')
+                if not descname:
+                    descname = _('Module level')
+                if context:
+                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
+                else:
+                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
+                libchanges.setdefault(module, []).append((entry, docname, lineno))
+            else:
+                if not context:
+                    continue
+                entry = '<i>%s:</i> %s' % (ttext.capitalize(), context)
+                title = self.env.titles[docname].astext()
+                otherchanges.setdefault((docname, title), []).append(
+                    (entry, docname, lineno))
+
+        ctx = {
+            'project': self.config.project,
+            'version': version,
+            'docstitle': self.config.html_title,
+            'shorttitle': self.config.html_short_title,
+            'libchanges': sorted(libchanges.iteritems()),
+            'apichanges': sorted(apichanges),
+            'otherchanges': sorted(otherchanges.iteritems()),
+            'show_sphinx': self.config.html_show_sphinx,
+        }
+        f = open(path.join(self.outdir, 'index.html'), 'w')
+        try:
+            f.write(self.templates.render('changes/frameset.html', ctx))
+        finally:
+            f.close()
+        f = open(path.join(self.outdir, 'changes.html'), 'w')
+        try:
+            f.write(self.templates.render('changes/versionchanges.html', ctx))
+        finally:
+            f.close()
+
+        hltext = ['.. versionadded:: %s' % version,
+                  '.. versionchanged:: %s' % version,
+                  '.. deprecated:: %s' % version]
+
+        def hl(no, line):
+            line = '<a name="L%s"> </a>' % no + escape(line)
+            for x in hltext:
+                if x in line:
+                    line = '<span class="hl">%s</span>' % line
+                    break
+            return line
+
+        self.info(bold('copying source files...'))
+        for docname in self.env.all_docs:
+            f = open(self.env.doc2path(docname))
+            lines = f.readlines()
+            targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html'
+            ensuredir(path.dirname(targetfn))
+            f = codecs.open(targetfn, 'w', 'utf8')
+            try:
+                text = ''.join(hl(i+1, line) for (i, line) in enumerate(lines))
+                ctx = {'filename': self.env.doc2path(docname, None), 'text': text}
+                f.write(self.templates.render('changes/rstsource.html', ctx))
+            finally:
+                f.close()
+        shutil.copyfile(path.join(path.dirname(__file__), 'static', 'default.css'),
+                        path.join(self.outdir, 'default.css'))
+
+    def hl(self, text, version):
+        text = escape(text)
+        for directive in ['versionchanged', 'versionadded', 'deprecated']:
+            text = text.replace('.. %s:: %s' % (directive, version),
+                                '<b>.. %s:: %s</b>' % (directive, version))
+        return text
+
+    def finish(self):
+        pass
+
+
+class TextBuilder(Builder):
+    name = 'text'
+    out_suffix = '.txt'
+
+    def init(self):
+        pass
+
+    def get_outdated_docs(self):
+        for docname in self.env.found_docs:
+            if docname not in self.env.all_docs:
+                yield docname
+                continue
+            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
+            try:
+                targetmtime = path.getmtime(targetname)
+            except Exception:
+                targetmtime = 0
+            try:
+                srcmtime = path.getmtime(self.env.doc2path(docname))
+                if srcmtime > targetmtime:
+                    yield docname
+            except EnvironmentError:
+                # source doesn't exist anymore
+                pass
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def prepare_writing(self, docnames):
+        self.writer = TextWriter(self)
+
+    def write_doc(self, docname, doctree):
+        destination = StringOutput(encoding='utf-8')
+        self.writer.write(doctree, destination)
+        outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
+        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
+        try:
+            f = codecs.open(outfilename, 'w', 'utf-8')
+            try:
+                f.write(self.writer.output)
+            finally:
+                f.close()
+        except (IOError, OSError), err:
+            self.warn("Error writing file %s: %s" % (outfilename, err))
+
+    def finish(self):
+        pass
+
+
+# compatibility alias
+WebHTMLBuilder = PickleHTMLBuilder
+
+
+from sphinx.linkcheck import CheckExternalLinksBuilder
+
+builtin_builders = {
+    'html': StandaloneHTMLBuilder,
+    'pickle': PickleHTMLBuilder,
+    'json': JSONHTMLBuilder,
+    'web': PickleHTMLBuilder,
+    'htmlhelp': HTMLHelpBuilder,
+    'latex': LaTeXBuilder,
+    'text': TextBuilder,
+    'changes': ChangesBuilder,
+    'linkcheck': CheckExternalLinksBuilder,
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,186 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.cmdline
+    ~~~~~~~~~~~~~~
+
+    sphinx-build command-line handling.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import sys
+import getopt
+import traceback
+from os import path
+
+from docutils.utils import SystemMessage
+
+from sphinx import __version__
+from sphinx.application import Sphinx, SphinxError
+from sphinx.util import format_exception_cut_frames, save_traceback
+from sphinx.util.console import darkred, nocolor, color_terminal
+
+
+def usage(argv, msg=None):
+    if msg:
+        print >>sys.stderr, msg
+        print >>sys.stderr
+    print >>sys.stderr, """\
+Sphinx v%s
+Usage: %s [options] sourcedir outdir [filenames...]
+Options: -b <builder> -- builder to use; default is html
+         -a        -- write all files; default is to only write new and changed files
+         -E        -- don't use a saved environment, always read all files
+         -d <path> -- path for the cached environment and doctree files
+                      (default: outdir/.doctrees)
+         -c <path> -- path where configuration file (conf.py) is located
+                      (default: same as sourcedir)
+         -C        -- use no config file at all, only -D options
+         -D <setting=value> -- override a setting in configuration
+         -A <name=value>    -- pass a value into the templates, for HTML builder
+         -N        -- do not do colored output
+         -q        -- no output on stdout, just warnings on stderr
+         -Q        -- no output at all, not even warnings
+         -P        -- run Pdb on exception
+Modi:
+* without -a and without filenames, write new and changed files.
+* with -a, write all files.
+* with filenames, write these.""" % (__version__, argv[0])
+
+
+def main(argv):
+    if not sys.stdout.isatty() or not color_terminal():
+        # Windows' poor cmd box doesn't understand ANSI sequences
+        nocolor()
+
+    try:
+        opts, args = getopt.getopt(argv[1:], 'ab:d:c:CD:A:NEqP')
+        allopts = set(opt[0] for opt in opts)
+        srcdir = confdir = path.abspath(args[0])
+        if not path.isdir(srcdir):
+            print >>sys.stderr, 'Error: Cannot find source directory.'
+            return 1
+        if not path.isfile(path.join(srcdir, 'conf.py')) and \
+               '-c' not in allopts and '-C' not in allopts:
+            print >>sys.stderr, 'Error: Source directory doesn\'t contain conf.py file.'
+            return 1
+        outdir = path.abspath(args[1])
+        if not path.isdir(outdir):
+            print >>sys.stderr, 'Making output directory...'
+            os.makedirs(outdir)
+    except (IndexError, getopt.error):
+        usage(argv)
+        return 1
+
+    filenames = args[2:]
+    err = 0
+    for filename in filenames:
+        if not path.isfile(filename):
+            print >>sys.stderr, 'Cannot find file %r.' % filename
+            err = 1
+    if err:
+        return 1
+
+    buildername = all_files = None
+    freshenv = use_pdb = False
+    status = sys.stdout
+    warning = sys.stderr
+    confoverrides = {}
+    htmlcontext = {}
+    doctreedir = path.join(outdir, '.doctrees')
+    for opt, val in opts:
+        if opt == '-b':
+            buildername = val
+        elif opt == '-a':
+            if filenames:
+                usage(argv, 'Cannot combine -a option and filenames.')
+                return 1
+            all_files = True
+        elif opt == '-d':
+            doctreedir = path.abspath(val)
+        elif opt == '-c':
+            confdir = path.abspath(val)
+            if not path.isfile(path.join(confdir, 'conf.py')):
+                print >>sys.stderr, \
+                      'Error: Configuration directory doesn\'t contain conf.py file.'
+                return 1
+        elif opt == '-C':
+            confdir = None
+        elif opt == '-D':
+            try:
+                key, val = val.split('=')
+            except ValueError:
+                print >>sys.stderr, \
+                      'Error: -D option argument must be in the form name=value.'
+                return 1
+            try:
+                val = int(val)
+            except ValueError:
+                pass
+            confoverrides[key] = val
+        elif opt == '-A':
+            try:
+                key, val = val.split('=')
+            except ValueError:
+                print >>sys.stderr, \
+                      'Error: -A option argument must be in the form name=value.'
+                return 1
+            try:
+                val = int(val)
+            except ValueError:
+                pass
+            htmlcontext[key] = val
+        elif opt == '-N':
+            nocolor()
+        elif opt == '-E':
+            freshenv = True
+        elif opt == '-q':
+            status = None
+        elif opt == '-Q':
+            status = None
+            warning = None
+        elif opt == '-P':
+            use_pdb = True
+    confoverrides['html_context'] = htmlcontext
+
+    try:
+        app = Sphinx(srcdir, confdir, outdir, doctreedir, buildername,
+                     confoverrides, status, warning, freshenv)
+        app.build(all_files, filenames)
+        return app.statuscode
+    except KeyboardInterrupt:
+        if use_pdb:
+            import pdb
+            print >>sys.stderr, darkred('Interrupted while building, starting debugger:')
+            traceback.print_exc()
+            pdb.post_mortem(sys.exc_info()[2])
+        return 1
+    except Exception, err:
+        if use_pdb:
+            import pdb
+            print >>sys.stderr, darkred('Exception occurred while building, '
+                                        'starting debugger:')
+            traceback.print_exc()
+            pdb.post_mortem(sys.exc_info()[2])
+        else:
+            if isinstance(err, SystemMessage):
+                print >>sys.stderr, darkred('reST markup error:')
+                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
+            elif isinstance(err, SphinxError):
+                print >>sys.stderr, darkred('%s:' % err.category)
+                print >>sys.stderr, err
+            else:
+                print >>sys.stderr, darkred('Exception occurred:')
+                print >>sys.stderr, format_exception_cut_frames().rstrip()
+                tbpath = save_traceback()
+                print >>sys.stderr, darkred('The full traceback has been saved '
+                                            'in %s, if you want to report the '
+                                            'issue to the author.' % tbpath)
+                print >>sys.stderr, ('Please also report this if it was a user '
+                                     'error, so that a better error message '
+                                     'can be provided next time.')
+                print >>sys.stderr, ('Send reports to sphinx-dev@googlegroups.com. '
+                                     'Thanks!')
+            return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/config.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.config
+    ~~~~~~~~~~~~~
+
+    Build configuration file handling.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD license.
+"""
+
+import os
+from os import path
+
+
+class Config(object):
+    """Configuration file abstraction."""
+
+    # the values are: (default, needs fresh doctrees if changed)
+
+    # If you add a value here, don't forget to include it in the
+    # quickstart.py file template as well as in the docs!
+
+    config_values = dict(
+        # general options
+        project = ('Python', True),
+        copyright = ('', False),
+        version = ('', True),
+        release = ('', True),
+        today = ('', True),
+        today_fmt = (None, True),  # the real default is locale-dependent
+
+        language = (None, True),
+        locale_dirs = ([], True),
+
+        master_doc = ('contents', True),
+        source_suffix = ('.rst', True),
+        source_encoding = ('utf-8', True),
+        unused_docs = ([], True),
+        exclude_dirs = ([], True),
+        exclude_trees = ([], True),
+        exclude_dirnames = ([], True),
+        default_role = (None, True),
+        add_function_parentheses = (True, True),
+        add_module_names = (True, True),
+        show_authors = (False, True),
+        pygments_style = ('sphinx', False),
+        highlight_language = ('python', False),
+        templates_path = ([], False),
+        template_bridge = (None, False),
+        keep_warnings = (False, True),
+
+        # HTML options
+        html_title = (lambda self: '%s v%s documentation' %
+                                   (self.project, self.release),
+                      False),
+        html_short_title = (lambda self: self.html_title, False),
+        html_style = ('default.css', False),
+        html_logo = (None, False),
+        html_favicon = (None, False),
+        html_static_path = ([], False),
+        html_last_updated_fmt = (None, False),  # the real default is locale-dependent
+        html_use_smartypants = (True, False),
+        html_translator_class = (None, False),
+        html_sidebars = ({}, False),
+        html_additional_pages = ({}, False),
+        html_use_modindex = (True, False),
+        html_use_index = (True, False),
+        html_split_index = (False, False),
+        html_copy_source = (True, False),
+        html_use_opensearch = ('', False),
+        html_file_suffix = (None, False),
+        html_show_sphinx = (True, False),
+        html_context = ({}, False),
+
+        # HTML help only options
+        htmlhelp_basename = ('pydoc', False),
+
+        # LaTeX options
+        latex_documents = ([], False),
+        latex_logo = (None, False),
+        latex_appendices = ([], False),
+        latex_use_parts = (False, False),
+        latex_use_modindex = (True, False),
+        # paper_size and font_size are still separate values
+        # so that you can give them easily on the command line
+        latex_paper_size = ('letter', False),
+        latex_font_size = ('10pt', False),
+        latex_elements = ({}, False),
+        # now deprecated - use latex_elements
+        latex_preamble = ('', False),
+    )
+
+    def __init__(self, dirname, filename, overrides):
+        self.overrides = overrides
+        self.values = Config.config_values.copy()
+        config = {}
+        if dirname is not None:
+            config['__file__'] = path.join(dirname, filename)
+            olddir = os.getcwd()
+            try:
+                os.chdir(dirname)
+                execfile(config['__file__'], config)
+            finally:
+                os.chdir(olddir)
+        self._raw_config = config
+        # these two must be preinitialized because extensions can add their
+        # own config values
+        self.setup = config.get('setup', None)
+        self.extensions = config.get('extensions', [])
+
+    def init_values(self):
+        config = self._raw_config
+        config.update(self.overrides)
+        for name in config:
+            if name in self.values:
+                self.__dict__[name] = config[name]
+        del self._raw_config
+
+    def __getattr__(self, name):
+        if name.startswith('_'):
+            raise AttributeError(name)
+        if name not in self.values:
+            raise AttributeError('No such config value: %s' % name)
+        default = self.values[name][0]
+        if callable(default):
+            return default(self)
+        return default
+
+    def __getitem__(self, name):
+        return getattr(self, name)
+
+    def __setitem__(self, name, value):
+        setattr(self, name, value)
+
+    def __delitem__(self, name):
+        delattr(self, name)
+
+    def __contains__(self, name):
+        return name in self.values
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives
+    ~~~~~~~~~~~~~~~~~
+
+    Handlers for additional ReST directives.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from sphinx.directives.desc import *
+from sphinx.directives.code import *
+from sphinx.directives.other import *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.code
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import codecs
+from os import path
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+
+
+# ------ highlight directive --------------------------------------------------------
+
+def highlightlang_directive(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    if 'linenothreshold' in options:
+        try:
+            linenothreshold = int(options['linenothreshold'])
+        except Exception:
+            linenothreshold = 10
+    else:
+        linenothreshold = sys.maxint
+    return [addnodes.highlightlang(lang=arguments[0].strip(),
+                                   linenothreshold=linenothreshold)]
+
+highlightlang_directive.content = 0
+highlightlang_directive.arguments = (1, 0, 0)
+highlightlang_directive.options = {'linenothreshold': directives.unchanged}
+directives.register_directive('highlight', highlightlang_directive)
+directives.register_directive('highlightlang', highlightlang_directive) # old name
+
+
+# ------ code-block directive -------------------------------------------------------
+
+def codeblock_directive(name, arguments, options, content, lineno,
+                        content_offset, block_text, state, state_machine):
+    code = u'\n'.join(content)
+    literal = nodes.literal_block(code, code)
+    literal['language'] = arguments[0]
+    literal['linenos'] = 'linenos' in options
+    return [literal]
+
+codeblock_directive.content = 1
+codeblock_directive.arguments = (1, 0, 0)
+codeblock_directive.options = {'linenos': directives.flag}
+directives.register_directive('code-block', codeblock_directive)
+directives.register_directive('sourcecode', codeblock_directive)
+
+
+# ------ literalinclude directive ---------------------------------------------------
+
+def literalinclude_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    """Like .. include:: :literal:, but only warns if the include file is not found."""
+    if not state.document.settings.file_insertion_enabled:
+        return [state.document.reporter.warning('File insertion disabled', line=lineno)]
+    env = state.document.settings.env
+    rel_fn = arguments[0]
+    source_dir = path.dirname(path.abspath(state_machine.input_lines.source(
+        lineno - state_machine.input_offset - 1)))
+    fn = path.normpath(path.join(source_dir, rel_fn))
+
+    encoding = options.get('encoding', env.config.source_encoding)
+    try:
+        f = codecs.open(fn, 'r', encoding)
+        text = f.read()
+        f.close()
+    except (IOError, OSError):
+        retnode = state.document.reporter.warning(
+            'Include file %r not found or reading it failed' % arguments[0], line=lineno)
+    except UnicodeError:
+        retnode = state.document.reporter.warning(
+            'Encoding %r used for reading included file %r seems to '
+            'be wrong, try giving an :encoding: option' %
+            (encoding, arguments[0]))
+    else:
+        retnode = nodes.literal_block(text, text, source=fn)
+        retnode.line = 1
+        if options.get('language', ''):
+            retnode['language'] = options['language']
+        if 'linenos' in options:
+            retnode['linenos'] = True
+        state.document.settings.env.note_dependency(rel_fn)
+    return [retnode]
+
+literalinclude_directive.options = {'linenos': directives.flag,
+                                    'language': directives.unchanged,
+                                    'encoding': directives.encoding}
+literalinclude_directive.content = 0
+literalinclude_directive.arguments = (1, 0, 0)
+directives.register_directive('literalinclude', literalinclude_directive)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,592 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.desc
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import string
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.util import ws_re
+
+
+# ------ information units ---------------------------------------------------------
+
+def desc_index_text(desctype, module, name, add_modules):
+    if desctype == 'function':
+        if not module:
+            return _('%s() (built-in function)') % name
+        return _('%s() (in module %s)') % (name, module)
+    elif desctype == 'data':
+        if not module:
+            return _('%s (built-in variable)') % name
+        return _('%s (in module %s)') % (name, module)
+    elif desctype == 'class':
+        if not module:
+            return _('%s (built-in class)') % name
+        return _('%s (class in %s)') % (name, module)
+    elif desctype == 'exception':
+        return name
+    elif desctype == 'method':
+        try:
+            clsname, methname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s() (in module %s)') % (name, module)
+            else:
+                return '%s()' % name
+        if module and add_modules:
+            return _('%s() (%s.%s method)') % (methname, module, clsname)
+        else:
+            return _('%s() (%s method)') % (methname, clsname)
+    elif desctype == 'staticmethod':
+        try:
+            clsname, methname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s() (in module %s)') % (name, module)
+            else:
+                return '%s()' % name
+        if module and add_modules:
+            return _('%s() (%s.%s static method)') % (methname, module, clsname)
+        else:
+            return _('%s() (%s static method)') % (methname, clsname)
+    elif desctype == 'attribute':
+        try:
+            clsname, attrname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s (in module %s)') % (name, module)
+            else:
+                return name
+        if module and add_modules:
+            return _('%s (%s.%s attribute)') % (attrname, module, clsname)
+        else:
+            return _('%s (%s attribute)') % (attrname, clsname)
+    elif desctype == 'cfunction':
+        return _('%s (C function)') % name
+    elif desctype == 'cmember':
+        return _('%s (C member)') % name
+    elif desctype == 'cmacro':
+        return _('%s (C macro)') % name
+    elif desctype == 'ctype':
+        return _('%s (C type)') % name
+    elif desctype == 'cvar':
+        return _('%s (C variable)') % name
+    else:
+        raise ValueError('unhandled descenv: %s' % desctype)
+
+
+# ------ make field lists (like :param foo:) in desc bodies prettier
+
+_ = lambda x: x  # make gettext extraction in constants possible
+
+doc_fields_with_arg = {
+    'param': '%param',
+    'parameter': '%param',
+    'arg': '%param',
+    'argument': '%param',
+    'keyword': '%param',
+    'kwarg': '%param',
+    'kwparam': '%param',
+    'type': '%type',
+    'raises': _('Raises'),
+    'raise': 'Raises',
+    'exception': 'Raises',
+    'except': 'Raises',
+    'var': _('Variable'),
+    'ivar': 'Variable',
+    'cvar': 'Variable',
+    'returns': _('Returns'),
+    'return': 'Returns',
+}
+
+doc_fields_with_linked_arg = ('raises', 'raise', 'exception', 'except')
+
+doc_fields_without_arg = {
+    'returns': 'Returns',
+    'return': 'Returns',
+    'rtype': _('Return type'),
+}
+
+del _
+
+
+def _is_only_paragraph(node):
+    # determine if the node only contains one paragraph (and system messages)
+    if len(node) == 0:
+        return False
+    elif len(node) > 1:
+        for subnode in node[1:]:
+            if not isinstance(subnode, nodes.system_message):
+                return False
+    if isinstance(node[0], nodes.paragraph):
+        return True
+    return False
+
+
+def handle_doc_fields(node, env):
+    # don't traverse, only handle field lists that are immediate children
+    for child in node.children:
+        if not isinstance(child, nodes.field_list):
+            continue
+        params = None
+        param_nodes = {}
+        param_types = {}
+        new_list = nodes.field_list()
+        for field in child:
+            fname, fbody = field
+            try:
+                typ, obj = fname.astext().split(None, 1)
+                typdesc = _(doc_fields_with_arg[typ])
+                if _is_only_paragraph(fbody):
+                    children = fbody.children[0].children
+                else:
+                    children = fbody.children
+                if typdesc == '%param':
+                    if not params:
+                        pfield = nodes.field()
+                        pfield += nodes.field_name('', _('Parameters'))
+                        pfield += nodes.field_body()
+                        params = nodes.bullet_list()
+                        pfield[1] += params
+                        new_list += pfield
+                    dlitem = nodes.list_item()
+                    dlpar = nodes.paragraph()
+                    dlpar += nodes.emphasis(obj, obj)
+                    dlpar += nodes.Text(' -- ', ' -- ')
+                    dlpar += children
+                    param_nodes[obj] = dlpar
+                    dlitem += dlpar
+                    params += dlitem
+                elif typdesc == '%type':
+                    typenodes = fbody.children
+                    if _is_only_paragraph(fbody):
+                        typenodes = [nodes.Text(' (')] + \
+                                    typenodes[0].children + [nodes.Text(')')]
+                    param_types[obj] = typenodes
+                else:
+                    fieldname = typdesc + ' '
+                    nfield = nodes.field()
+                    nfieldname = nodes.field_name(fieldname, fieldname)
+                    nfield += nfieldname
+                    node = nfieldname
+                    if typ in doc_fields_with_linked_arg:
+                        node = addnodes.pending_xref(obj, reftype='obj',
+                                                     refcaption=False,
+                                                     reftarget=obj,
+                                                     modname=env.currmodule,
+                                                     classname=env.currclass)
+                        nfieldname += node
+                    node += nodes.Text(obj, obj)
+                    nfield += nodes.field_body()
+                    nfield[1] += fbody.children
+                    new_list += nfield
+            except (KeyError, ValueError):
+                fnametext = fname.astext()
+                try:
+                    typ = _(doc_fields_without_arg[fnametext])
+                except KeyError:
+                    # at least capitalize the field name
+                    typ = fnametext.capitalize()
+                fname[0] = nodes.Text(typ)
+                new_list += field
+        for param, type in param_types.iteritems():
+            if param in param_nodes:
+                param_nodes[param][1:1] = type
+        child.replace_self(new_list)
+
+
+# ------ functions to parse a Python or C signature and create desc_* nodes.
+
+py_sig_re = re.compile(
+    r'''^ ([\w.]*\.)?            # class name(s)
+          (\w+)  \s*             # thing name
+          (?: \((.*)\)           # optional arguments
+          (\s* -> \s* .*)? )? $  # optional return annotation
+          ''', re.VERBOSE)
+
+py_paramlist_re = re.compile(r'([\[\],])')  # split at '[', ']' and ','
+
+def parse_py_signature(signode, sig, desctype, module, env):
+    """
+    Transform a python signature into RST nodes.
+    Return (fully qualified name of the thing, classname if any).
+
+    If inside a class, the current class name is handled intelligently:
+    * it is stripped from the displayed name if present
+    * it is added to the full name (return value) if not present
+    """
+    m = py_sig_re.match(sig)
+    if m is None:
+        raise ValueError
+    classname, name, arglist, retann = m.groups()
+
+    if retann:
+        retann = u' \N{RIGHTWARDS ARROW} ' + retann.strip()[2:]
+
+    if env.currclass:
+        add_module = False
+        if classname and classname.startswith(env.currclass):
+            fullname = classname + name
+            # class name is given again in the signature
+            classname = classname[len(env.currclass):].lstrip('.')
+        elif classname:
+            # class name is given in the signature, but different
+            # (shouldn't happen)
+            fullname = env.currclass + '.' + classname + name
+        else:
+            # class name is not given in the signature
+            fullname = env.currclass + '.' + name
+    else:
+        add_module = True
+        fullname = classname and classname + name or name
+
+    if desctype == 'staticmethod':
+        signode += addnodes.desc_annotation('static ', 'static ')
+
+    if classname:
+        signode += addnodes.desc_addname(classname, classname)
+    # exceptions are a special case, since they are documented in the
+    # 'exceptions' module.
+    elif add_module and env.config.add_module_names and \
+           module and module != 'exceptions':
+        nodetext = module + '.'
+        signode += addnodes.desc_addname(nodetext, nodetext)
+
+    signode += addnodes.desc_name(name, name)
+    if not arglist:
+        if desctype in ('function', 'method', 'staticmethod'):
+            # for callables, add an empty parameter list
+            signode += addnodes.desc_parameterlist()
+        if retann:
+            signode += addnodes.desc_type(retann, retann)
+        return fullname, classname
+    signode += addnodes.desc_parameterlist()
+
+    stack = [signode[-1]]
+    for token in py_paramlist_re.split(arglist):
+        if token == '[':
+            opt = addnodes.desc_optional()
+            stack[-1] += opt
+            stack.append(opt)
+        elif token == ']':
+            try:
+                stack.pop()
+            except IndexError:
+                raise ValueError
+        elif not token or token == ',' or token.isspace():
+            pass
+        else:
+            token = token.strip()
+            stack[-1] += addnodes.desc_parameter(token, token)
+    if len(stack) != 1:
+        raise ValueError
+    if retann:
+        signode += addnodes.desc_type(retann, retann)
+    return fullname, classname
+
+
+c_sig_re = re.compile(
+    r'''^([^(]*?)          # return type
+        ([\w:]+)  \s*      # thing name (colon allowed for C++ class names)
+        (?: \((.*)\) )?    # optionally arguments
+        (\s+const)? $      # const specifier
+    ''', re.VERBOSE)
+c_funcptr_sig_re = re.compile(
+    r'''^([^(]+?)          # return type
+        (\( [^()]+ \)) \s* # name in parentheses
+        \( (.*) \)         # arguments
+        (\s+const)? $      # const specifier
+    ''', re.VERBOSE)
+c_funcptr_name_re = re.compile(r'^\(\s*\*\s*(.*?)\s*\)$')
+
+# RE to split at word boundaries
+wsplit_re = re.compile(r'(\W+)')
+
+# These C types aren't described in the reference, so don't try to create
+# a cross-reference to them
+stopwords = set(('const', 'void', 'char', 'int', 'long', 'FILE', 'struct'))
+
+def parse_c_type(node, ctype):
+    # add cross-ref nodes for all words
+    for part in filter(None, wsplit_re.split(ctype)):
+        tnode = nodes.Text(part, part)
+        if part[0] in string.letters+'_' and part not in stopwords:
+            pnode = addnodes.pending_xref(
+                '', reftype='ctype', reftarget=part, modname=None, classname=None)
+            pnode += tnode
+            node += pnode
+        else:
+            node += tnode
+
+def parse_c_signature(signode, sig, desctype):
+    """Transform a C (or C++) signature into RST nodes."""
+    # first try the function pointer signature regex, it's more specific
+    m = c_funcptr_sig_re.match(sig)
+    if m is None:
+        m = c_sig_re.match(sig)
+    if m is None:
+        raise ValueError('no match')
+    rettype, name, arglist, const = m.groups()
+
+    signode += addnodes.desc_type('', '')
+    parse_c_type(signode[-1], rettype)
+    try:
+        classname, funcname = name.split('::', 1)
+        classname += '::'
+        signode += addnodes.desc_addname(classname, classname)
+        signode += addnodes.desc_name(funcname, funcname)
+        # name (the full name) is still both parts
+    except ValueError:
+        signode += addnodes.desc_name(name, name)
+    # clean up parentheses from canonical name
+    m = c_funcptr_name_re.match(name)
+    if m:
+        name = m.group(1)
+    if not arglist:
+        if desctype == 'cfunction':
+            # for functions, add an empty parameter list
+            signode += addnodes.desc_parameterlist()
+        return name
+
+    paramlist = addnodes.desc_parameterlist()
+    arglist = arglist.replace('`', '').replace('\\ ', '') # remove markup
+    # this messes up function pointer types, but not too badly ;)
+    args = arglist.split(',')
+    for arg in args:
+        arg = arg.strip()
+        param = addnodes.desc_parameter('', '', noemph=True)
+        try:
+            ctype, argname = arg.rsplit(' ', 1)
+        except ValueError:
+            # no argument name given, only the type
+            parse_c_type(param, arg)
+        else:
+            parse_c_type(param, ctype)
+            param += nodes.emphasis(' '+argname, ' '+argname)
+        paramlist += param
+    signode += paramlist
+    if const:
+        signode += addnodes.desc_addname(const, const)
+    return name
+
+
+option_desc_re = re.compile(
+    r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)')
+
+def parse_option_desc(signode, sig):
+    """Transform an option description into RST nodes."""
+    count = 0
+    firstname = ''
+    for m in option_desc_re.finditer(sig):
+        optname, args = m.groups()
+        if count:
+            signode += addnodes.desc_addname(', ', ', ')
+        signode += addnodes.desc_name(optname, optname)
+        signode += addnodes.desc_addname(args, args)
+        if not count:
+            firstname = optname
+        count += 1
+    if not firstname:
+        raise ValueError
+    return firstname
+
+
+strip_backslash_re = re.compile(r'\\(?=[^\\])')
+
+def desc_directive(desctype, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    inode = addnodes.index(entries=[])
+    node = addnodes.desc()
+    node['desctype'] = desctype
+
+    noindex = ('noindex' in options)
+    node['noindex'] = noindex
+    # remove backslashes to support (dummy) escapes; helps Vim's highlighting
+    signatures = map(lambda s: strip_backslash_re.sub('', s.strip()),
+                     arguments[0].split('\n'))
+    names = []
+    clsname = None
+    module = options.get('module', env.currmodule)
+    for i, sig in enumerate(signatures):
+        # add a signature node for each signature in the current unit
+        # and add a reference target for it
+        sig = sig.strip()
+        signode = addnodes.desc_signature(sig, '')
+        signode['first'] = False
+        node.append(signode)
+        try:
+            if desctype in ('function', 'data', 'class', 'exception',
+                            'method', 'staticmethod', 'attribute'):
+                name, clsname = parse_py_signature(signode, sig, desctype, module, env)
+            elif desctype in ('cfunction', 'cmember', 'cmacro', 'ctype', 'cvar'):
+                name = parse_c_signature(signode, sig, desctype)
+            elif desctype == 'cmdoption':
+                optname = parse_option_desc(signode, sig)
+                if not noindex:
+                    targetname = optname.replace('/', '-')
+                    if env.currprogram:
+                        targetname = '-' + env.currprogram + targetname
+                    targetname = 'cmdoption' + targetname
+                    signode['ids'].append(targetname)
+                    state.document.note_explicit_target(signode)
+                    inode['entries'].append(
+                        ('pair', _('%scommand line option; %s') %
+                         ((env.currprogram and env.currprogram + ' ' or ''), sig),
+                         targetname, targetname))
+                    env.note_progoption(optname, targetname)
+                continue
+            elif desctype == 'describe':
+                signode.clear()
+                signode += addnodes.desc_name(sig, sig)
+                continue
+            else:
+                # another registered generic x-ref directive
+                rolename, indextemplate, parse_node = additional_xref_types[desctype]
+                if parse_node:
+                    fullname = parse_node(env, sig, signode)
+                else:
+                    signode.clear()
+                    signode += addnodes.desc_name(sig, sig)
+                    # normalize whitespace like xfileref_role does
+                    fullname = ws_re.sub('', sig)
+                if not noindex:
+                    targetname = '%s-%s' % (rolename, fullname)
+                    signode['ids'].append(targetname)
+                    state.document.note_explicit_target(signode)
+                    if indextemplate:
+                        indexentry = _(indextemplate) % (fullname,)
+                        indextype = 'single'
+                        colon = indexentry.find(':')
+                        if colon != -1:
+                            indextype = indexentry[:colon].strip()
+                            indexentry = indexentry[colon+1:].strip()
+                        inode['entries'].append((indextype, indexentry,
+                                                 targetname, targetname))
+                    env.note_reftarget(rolename, fullname, targetname)
+                # don't use object indexing below
+                continue
+        except ValueError, err:
+            # signature parsing failed
+            signode.clear()
+            signode += addnodes.desc_name(sig, sig)
+            continue             # we don't want an index entry here
+        # only add target and index entry if this is the first description of the
+        # function name in this desc block
+        if not noindex and name not in names:
+            fullname = (module and module + '.' or '') + name
+            # note target
+            if fullname not in state.document.ids:
+                signode['names'].append(fullname)
+                signode['ids'].append(fullname)
+                signode['first'] = (not names)
+                state.document.note_explicit_target(signode)
+                env.note_descref(fullname, desctype, lineno)
+            names.append(name)
+
+            indextext = desc_index_text(desctype, module, name,
+                                        env.config.add_module_names)
+            inode['entries'].append(('single', indextext, fullname, fullname))
+
+    subnode = addnodes.desc_content()
+    # needed for automatic qualification of members
+    clsname_set = False
+    if desctype in ('class', 'exception') and names:
+        env.currclass = names[0]
+        clsname_set = True
+    elif desctype in ('method', 'staticmethod', 'attribute') and \
+             clsname and not env.currclass:
+        env.currclass = clsname.strip('.')
+        clsname_set = True
+    # needed for association of version{added,changed} directives
+    if names:
+        env.currdesc = names[0]
+    state.nested_parse(content, content_offset, subnode)
+    handle_doc_fields(subnode, env)
+    if clsname_set:
+        env.currclass = None
+    env.currdesc = None
+    node.append(subnode)
+    return [inode, node]
+
+desc_directive.content = 1
+desc_directive.arguments = (1, 0, 1)
+desc_directive.options = {'noindex': directives.flag,
+                          'module': directives.unchanged}
+
+desctypes = [
+    # the Python ones
+    'function',
+    'data',
+    'class',
+    'method',
+    'staticmethod',
+    'attribute',
+    'exception',
+    # the C ones
+    'cfunction',
+    'cmember',
+    'cmacro',
+    'ctype',
+    'cvar',
+    # for command line options
+    'cmdoption',
+    # the generic one
+    'describe',
+    'envvar',
+]
+
+for _name in desctypes:
+    directives.register_directive(_name, desc_directive)
+
+_ = lambda x: x
+
+# Generic cross-reference types; they can be registered in the application;
+# the directives are either desc_directive or target_directive
+additional_xref_types = {
+    # directive name: (role name, index text, function to parse the desc node)
+    'envvar': ('envvar', _('environment variable; %s'), None),
+}
+
+del _
+
+
+# ------ target --------------------------------------------------------------------
+
+def target_directive(targettype, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    """Generic target for user-defined cross-reference types."""
+    env = state.document.settings.env
+    rolename, indextemplate, foo = additional_xref_types[targettype]
+    # normalize whitespace in fullname like xfileref_role does
+    fullname = ws_re.sub('', arguments[0].strip())
+    targetname = '%s-%s' % (rolename, fullname)
+    node = nodes.target('', '', ids=[targetname])
+    state.document.note_explicit_target(node)
+    ret = [node]
+    if indextemplate:
+        indexentry = indextemplate % (fullname,)
+        indextype = 'single'
+        colon = indexentry.find(':')
+        if colon != -1:
+            indextype = indexentry[:colon].strip()
+            indexentry = indexentry[colon+1:].strip()
+        inode = addnodes.index(entries=[(indextype, indexentry, targetname, targetname)])
+        ret.insert(0, inode)
+    env.note_reftarget(rolename, fullname, targetname)
+    return ret
+
+target_directive.content = 0
+target_directive.arguments = (1, 0, 1)
+
+# note, the target directive is not registered here, it is used by the application
+# when registering additional xref types
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,411 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.other
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import posixpath
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.locale import pairindextypes
+from sphinx.util import patfilter, ws_re, caption_ref_re
+from sphinx.util.compat import make_admonition
+
+
+# ------ the TOC tree ---------------------------------------------------------------
+
+def toctree_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    suffix = env.config.source_suffix
+    dirname = posixpath.dirname(env.docname)
+    glob = 'glob' in options
+
+    ret = []
+    subnode = addnodes.toctree()
+    includefiles = []
+    includetitles = {}
+    all_docnames = env.found_docs.copy()
+    # don't add the currently visited file in catch-all patterns
+    all_docnames.remove(env.docname)
+    for entry in content:
+        if not entry:
+            continue
+        if not glob:
+            # look for explicit titles and documents ("Some Title <document>").
+            m = caption_ref_re.match(entry)
+            if m:
+                docname = m.group(2)
+                includetitles[docname] = m.group(1)
+            else:
+                docname = entry
+            # remove suffixes (backwards compatibility)
+            if docname.endswith(suffix):
+                docname = docname[:-len(suffix)]
+            # absolutize filenames
+            docname = posixpath.normpath(posixpath.join(dirname, docname))
+            if docname not in env.found_docs:
+                ret.append(state.document.reporter.warning(
+                    'toctree references unknown document %r' % docname, line=lineno))
+            else:
+                includefiles.append(docname)
+        else:
+            patname = posixpath.normpath(posixpath.join(dirname, entry))
+            docnames = sorted(patfilter(all_docnames, patname))
+            for docname in docnames:
+                all_docnames.remove(docname) # don't include it again
+                includefiles.append(docname)
+            if not docnames:
+                ret.append(state.document.reporter.warning(
+                    'toctree glob pattern %r didn\'t match any documents' % entry,
+                    line=lineno))
+    subnode['includefiles'] = includefiles
+    subnode['includetitles'] = includetitles
+    subnode['maxdepth'] = options.get('maxdepth', -1)
+    subnode['glob'] = glob
+    ret.append(subnode)
+    return ret
+
+toctree_directive.content = 1
+toctree_directive.options = {'maxdepth': int, 'glob': directives.flag}
+directives.register_directive('toctree', toctree_directive)
+
+
+# ------ section metadata ----------------------------------------------------------
+
+def module_directive(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    modname = arguments[0].strip()
+    noindex = 'noindex' in options
+    env.currmodule = modname
+    env.note_module(modname, options.get('synopsis', ''),
+                    options.get('platform', ''),
+                    'deprecated' in options)
+    modulenode = addnodes.module()
+    modulenode['modname'] = modname
+    modulenode['synopsis'] = options.get('synopsis', '')
+    targetnode = nodes.target('', '', ids=['module-' + modname])
+    state.document.note_explicit_target(targetnode)
+    ret = [modulenode, targetnode]
+    if 'platform' in options:
+        modulenode['platform'] = options['platform']
+        node = nodes.paragraph()
+        node += nodes.emphasis('', _('Platforms: '))
+        node += nodes.Text(options['platform'], options['platform'])
+        ret.append(node)
+    # the synopsis isn't printed; in fact, it is only used in the modindex currently
+    if not noindex:
+        indextext = _('%s (module)') % modname
+        inode = addnodes.index(entries=[('single', indextext,
+                                         'module-' + modname, modname)])
+        ret.insert(0, inode)
+    return ret
+
+module_directive.arguments = (1, 0, 0)
+module_directive.options = {'platform': lambda x: x,
+                            'synopsis': lambda x: x,
+                            'noindex': directives.flag,
+                            'deprecated': directives.flag}
+directives.register_directive('module', module_directive)
+
+
+def currentmodule_directive(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    # This directive is just to tell people that we're documenting
+    # stuff in module foo, but links to module foo won't lead here.
+    env = state.document.settings.env
+    modname = arguments[0].strip()
+    if modname == 'None':
+        env.currmodule = None
+    else:
+        env.currmodule = modname
+    return []
+
+currentmodule_directive.arguments = (1, 0, 0)
+directives.register_directive('currentmodule', currentmodule_directive)
+
+
+def author_directive(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    # Show authors only if the show_authors option is on
+    env = state.document.settings.env
+    if not env.config.show_authors:
+        return []
+    para = nodes.paragraph()
+    emph = nodes.emphasis()
+    para += emph
+    if name == 'sectionauthor':
+        text = _('Section author: ')
+    elif name == 'moduleauthor':
+        text = _('Module author: ')
+    else:
+        text = _('Author: ')
+    emph += nodes.Text(text, text)
+    inodes, messages = state.inline_text(arguments[0], lineno)
+    emph.extend(inodes)
+    return [para] + messages
+
+author_directive.arguments = (1, 0, 1)
+directives.register_directive('sectionauthor', author_directive)
+directives.register_directive('moduleauthor', author_directive)
+
+
+def program_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    program = ws_re.sub('-', arguments[0].strip())
+    if program == 'None':
+        env.currprogram = None
+    else:
+        env.currprogram = program
+    return []
+
+program_directive.arguments = (1, 0, 1)
+directives.register_directive('program', program_directive)
+
+
+# ------ index markup --------------------------------------------------------------
+
+indextypes = [
+    'single', 'pair', 'triple',
+]
+
+def index_directive(name, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    arguments = arguments[0].split('\n')
+    env = state.document.settings.env
+    targetid = 'index-%s' % env.index_num
+    env.index_num += 1
+    targetnode = nodes.target('', '', ids=[targetid])
+    state.document.note_explicit_target(targetnode)
+    indexnode = addnodes.index()
+    indexnode['entries'] = ne = []
+    for entry in arguments:
+        entry = entry.strip()
+        for type in pairindextypes:
+            if entry.startswith(type+':'):
+                value = entry[len(type)+1:].strip()
+                value = pairindextypes[type] + '; ' + value
+                ne.append(('pair', value, targetid, value))
+                break
+        else:
+            for type in indextypes:
+                if entry.startswith(type+':'):
+                    value = entry[len(type)+1:].strip()
+                    ne.append((type, value, targetid, value))
+                    break
+            # shorthand notation for single entries
+            else:
+                for value in entry.split(','):
+                    value = value.strip()
+                    if not value:
+                        continue
+                    ne.append(('single', value, targetid, value))
+    return [indexnode, targetnode]
+
+index_directive.arguments = (1, 0, 1)
+directives.register_directive('index', index_directive)
+
+# ------ versionadded/versionchanged -----------------------------------------------
+
+def version_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    node = addnodes.versionmodified()
+    node['type'] = name
+    node['version'] = arguments[0]
+    if len(arguments) == 2:
+        inodes, messages = state.inline_text(arguments[1], lineno+1)
+        node.extend(inodes)
+        if content:
+            state.nested_parse(content, content_offset, node)
+        ret = [node] + messages
+    else:
+        ret = [node]
+    env = state.document.settings.env
+    env.note_versionchange(node['type'], node['version'], node, lineno)
+    return ret
+
+version_directive.arguments = (1, 1, 1)
+version_directive.content = 1
+
+directives.register_directive('deprecated', version_directive)
+directives.register_directive('versionadded', version_directive)
+directives.register_directive('versionchanged', version_directive)
+
+
+# ------ see also ------------------------------------------------------------------
+
+def seealso_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    ret = make_admonition(
+        addnodes.seealso, name, [_('See also')], options, content,
+        lineno, content_offset, block_text, state, state_machine)
+    if arguments:
+        argnodes, msgs = state.inline_text(arguments[0], lineno)
+        para = nodes.paragraph()
+        para += argnodes
+        para += msgs
+        ret[0].insert(1, para)
+    return ret
+
+seealso_directive.content = 1
+seealso_directive.arguments = (0, 1, 1)
+directives.register_directive('seealso', seealso_directive)
+
+
+# ------ production list (for the reference) ---------------------------------------
+
+token_re = re.compile('`([a-z_]+)`')
+
+def token_xrefs(text, env):
+    retnodes = []
+    pos = 0
+    for m in token_re.finditer(text):
+        if m.start() > pos:
+            txt = text[pos:m.start()]
+            retnodes.append(nodes.Text(txt, txt))
+        refnode = addnodes.pending_xref(m.group(1))
+        refnode['reftype'] = 'token'
+        refnode['reftarget'] = m.group(1)
+        refnode['modname'] = env.currmodule
+        refnode['classname'] = env.currclass
+        refnode += nodes.literal(m.group(1), m.group(1), classes=['xref'])
+        retnodes.append(refnode)
+        pos = m.end()
+    if pos < len(text):
+        retnodes.append(nodes.Text(text[pos:], text[pos:]))
+    return retnodes
+
+def productionlist_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    node = addnodes.productionlist()
+    messages = []
+    i = 0
+
+    for rule in arguments[0].split('\n'):
+        if i == 0 and ':' not in rule:
+            # production group
+            continue
+        i += 1
+        try:
+            name, tokens = rule.split(':', 1)
+        except ValueError:
+            break
+        subnode = addnodes.production()
+        subnode['tokenname'] = name.strip()
+        if subnode['tokenname']:
+            idname = 'grammar-token-%s' % subnode['tokenname']
+            if idname not in state.document.ids:
+                subnode['ids'].append(idname)
+            state.document.note_implicit_target(subnode, subnode)
+            env.note_reftarget('token', subnode['tokenname'], idname)
+        subnode.extend(token_xrefs(tokens, env))
+        node.append(subnode)
+    return [node] + messages
+
+productionlist_directive.content = 0
+productionlist_directive.arguments = (1, 0, 1)
+directives.register_directive('productionlist', productionlist_directive)
+
+
+# ------ glossary directive ---------------------------------------------------------
+
+def glossary_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    """Glossary with cross-reference targets for :term: roles."""
+    env = state.document.settings.env
+    node = addnodes.glossary()
+    state.nested_parse(content, content_offset, node)
+
+    # the content should be definition lists
+    dls = [child for child in node if isinstance(child, nodes.definition_list)]
+    # now, extract definition terms to enable cross-reference creation
+    for dl in dls:
+        dl['classes'].append('glossary')
+        for li in dl.children:
+            if not li.children or not isinstance(li[0], nodes.term):
+                continue
+            termtext = li.children[0].astext()
+            new_id = 'term-' + nodes.make_id(termtext)
+            if new_id in env.gloss_entries:
+                new_id = 'term-' + str(len(env.gloss_entries))
+            env.gloss_entries.add(new_id)
+            li[0]['names'].append(new_id)
+            li[0]['ids'].append(new_id)
+            state.document.settings.env.note_reftarget('term', termtext.lower(),
+                                                       new_id)
+            # add an index entry too
+            indexnode = addnodes.index()
+            indexnode['entries'] = [('single', termtext, new_id, termtext)]
+            li.insert(0, indexnode)
+    return [node]
+
+glossary_directive.content = 1
+glossary_directive.arguments = (0, 0, 0)
+directives.register_directive('glossary', glossary_directive)
+
+
+# ------ miscellaneous markup -------------------------------------------------------
+
+def centered_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    if not arguments:
+        return []
+    subnode = addnodes.centered()
+    inodes, messages = state.inline_text(arguments[0], lineno)
+    subnode.extend(inodes)
+    return [subnode] + messages
+
+centered_directive.arguments = (1, 0, 1)
+directives.register_directive('centered', centered_directive)
+
+
+def acks_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    node = addnodes.acks()
+    state.nested_parse(content, content_offset, node)
+    if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list):
+        return [state.document.reporter.warning('.. acks content is not a list',
+                                                line=lineno)]
+    return [node]
+
+acks_directive.content = 1
+acks_directive.arguments = (0, 0, 0)
+directives.register_directive('acks', acks_directive)
+
+
+def tabularcolumns_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    # support giving explicit tabulary column definition to latex
+    node = addnodes.tabular_col_spec()
+    node['spec'] = arguments[0]
+    return [node]
+
+tabularcolumns_directive.content = 0
+tabularcolumns_directive.arguments = (1, 0, 1)
+directives.register_directive('tabularcolumns', tabularcolumns_directive)
+
+
+# register the standard rst class directive under a different name
+
+try:
+    # docutils 0.4
+    from docutils.parsers.rst.directives.misc import class_directive
+    directives.register_directive('cssclass', class_directive)
+except ImportError:
+    try:
+        # docutils 0.5
+        from docutils.parsers.rst.directives.misc import Class
+        directives.register_directive('cssclass', Class)
+    except ImportError:
+        # whatever :)
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1387 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.environment
+    ~~~~~~~~~~~~~~~~~~
+
+    Global creation environment.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import os
+import time
+import heapq
+import types
+import imghdr
+import difflib
+import cPickle as pickle
+from os import path
+from glob import glob
+from string import uppercase
+from itertools import izip, groupby
+try:
+    import hashlib
+    md5 = hashlib.md5
+except ImportError:
+    # 2.4 compatibility
+    import md5
+    md5 = md5.new
+
+from docutils import nodes
+from docutils.io import FileInput, NullOutput
+from docutils.core import Publisher
+from docutils.utils import Reporter, relative_path
+from docutils.readers import standalone
+from docutils.parsers.rst import roles
+from docutils.parsers.rst.languages import en as english
+from docutils.parsers.rst.directives.html import MetaBody
+from docutils.writers import UnfilteredWriter
+from docutils.transforms import Transform
+from docutils.transforms.parts import ContentsFilter
+
+from sphinx import addnodes
+from sphinx.util import get_matching_docs, SEP, ustrftime
+from sphinx.directives import additional_xref_types
+
+default_settings = {
+    'embed_stylesheet': False,
+    'cloak_email_addresses': True,
+    'pep_base_url': 'http://www.python.org/dev/peps/',
+    'rfc_base_url': 'http://rfc.net/',
+    'input_encoding': 'utf-8',
+    'doctitle_xform': False,
+    'sectsubtitle_xform': False,
+}
+
+# This is increased every time an environment attribute is added
+# or changed to properly invalidate pickle files.
+ENV_VERSION = 26
+
+
+default_substitutions = set([
+    'version',
+    'release',
+    'today',
+])
+
+dummy_reporter = Reporter('', 4, 4)
+
+
+class RedirStream(object):
+    def __init__(self, writefunc):
+        self.writefunc = writefunc
+    def write(self, text):
+        if text.strip():
+            self.writefunc(text)
+
+
+class NoUri(Exception):
+    """Raised by get_relative_uri if there is no URI available."""
+    pass
+
+
+class DefaultSubstitutions(Transform):
+    """
+    Replace some substitutions if they aren't defined in the document.
+    """
+    # run before the default Substitutions
+    default_priority = 210
+
+    def apply(self):
+        config = self.document.settings.env.config
+        # only handle those not otherwise defined in the document
+        to_handle = default_substitutions - set(self.document.substitution_defs)
+        for ref in self.document.traverse(nodes.substitution_reference):
+            refname = ref['refname']
+            if refname in to_handle:
+                text = config[refname]
+                if refname == 'today' and not text:
+                    # special handling: can also specify a strftime format
+                    text = ustrftime(config.today_fmt or _('%B %d, %Y'))
+                ref.replace_self(nodes.Text(text, text))
+
+
+class MoveModuleTargets(Transform):
+    """
+    Move module targets to their nearest enclosing section title.
+    """
+    default_priority = 210
+
+    def apply(self):
+        for node in self.document.traverse(nodes.target):
+            if not node['ids']:
+                continue
+            if node['ids'][0].startswith('module-') and \
+                   node.parent.__class__ is nodes.section:
+                node.parent['ids'] = node['ids']
+                node.parent.remove(node)
+
+
+class HandleCodeBlocks(Transform):
+    """
+    Move doctest blocks out of blockquotes.
+    """
+    default_priority = 210
+
+    def apply(self):
+        for node in self.document.traverse(nodes.block_quote):
+            if len(node.children) == 1 and isinstance(node.children[0],
+                                                      nodes.doctest_block):
+                node.replace_self(node.children[0])
+
+class CitationReferences(Transform):
+    """
+    Handle citation references before the default docutils transform does.
+    """
+    default_priority = 619
+
+    def apply(self):
+        for citnode in self.document.traverse(nodes.citation_reference):
+            cittext = citnode.astext()
+            refnode = addnodes.pending_xref(cittext, reftype='citation',
+                                            reftarget=cittext)
+            refnode += nodes.Text('[' + cittext + ']')
+            citnode.parent.replace(citnode, refnode)
+
+
+class SphinxStandaloneReader(standalone.Reader):
+    """
+    Add our own transforms.
+    """
+    transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets,
+                  HandleCodeBlocks]
+
+    def get_transforms(self):
+        return standalone.Reader.get_transforms(self) + self.transforms
+
+
+class SphinxDummyWriter(UnfilteredWriter):
+    supported = ('html',)  # needed to keep "meta" nodes
+
+    def translate(self):
+        pass
+
+
+
+class SphinxContentsFilter(ContentsFilter):
+    """
+    Used with BuildEnvironment.add_toc_from() to discard cross-file links
+    within table-of-contents link nodes.
+    """
+    def visit_pending_xref(self, node):
+        text = node.astext()
+        self.parent.append(nodes.literal(text, text))
+        raise nodes.SkipNode
+
+
+class BuildEnvironment:
+    """
+    The environment in which the ReST files are translated.
+    Stores an inventory of cross-file targets and provides doctree
+    transformations to resolve links to them.
+    """
+
+    # --------- ENVIRONMENT PERSISTENCE ----------------------------------------
+
+    @staticmethod
+    def frompickle(config, filename):
+        picklefile = open(filename, 'rb')
+        try:
+            env = pickle.load(picklefile)
+        finally:
+            picklefile.close()
+        env.config.values = config.values
+        if env.version != ENV_VERSION:
+            raise IOError('env version not current')
+        return env
+
+    def topickle(self, filename):
+        # remove unpicklable attributes
+        warnfunc = self._warnfunc
+        self.set_warnfunc(None)
+        values = self.config.values
+        del self.config.values
+        picklefile = open(filename, 'wb')
+        # remove potentially pickling-problematic values from config
+        for key, val in vars(self.config).items():
+            if key.startswith('_') or \
+                   isinstance(val, types.ModuleType) or \
+                   isinstance(val, types.FunctionType) or \
+                   isinstance(val, (type, types.ClassType)):
+                del self.config[key]
+        try:
+            pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
+        finally:
+            picklefile.close()
+        # reset attributes
+        self.config.values = values
+        self.set_warnfunc(warnfunc)
+
+    # --------- ENVIRONMENT INITIALIZATION -------------------------------------
+
+    def __init__(self, srcdir, doctreedir, config):
+        self.doctreedir = doctreedir
+        self.srcdir = srcdir
+        self.config = config
+
+        # the application object; only set while update() runs
+        self.app = None
+
+        # the docutils settings for building
+        self.settings = default_settings.copy()
+        self.settings['env'] = self
+
+        # the function to write warning messages with
+        self._warnfunc = None
+
+        # this is to invalidate old pickles
+        self.version = ENV_VERSION
+
+        # All "docnames" here are /-separated and relative and exclude the source suffix.
+
+        self.found_docs = set()     # contains all existing docnames
+        self.all_docs = {}          # docname -> mtime at the time of build
+                                    # contains all built docnames
+        self.dependencies = {}      # docname -> set of dependent file names, relative to
+                                    # documentation root
+
+        # File metadata
+        self.metadata = {}          # docname -> dict of metadata items
+
+        # TOC inventory
+        self.titles = {}            # docname -> title node
+        self.tocs = {}              # docname -> table of contents nodetree
+        self.toc_num_entries = {}   # docname -> number of real entries
+                                    # used to determine when to show the TOC in a sidebar
+                                    # (don't show if it's only one item)
+        self.toctree_includes = {}  # docname -> list of toctree includefiles
+        self.files_to_rebuild = {}  # docname -> set of files (containing its TOCs)
+                                    # to rebuild too
+        self.glob_toctrees = set()  # docnames that have :glob: toctrees
+
+        # X-ref target inventory
+        self.descrefs = {}          # fullname -> docname, desctype
+        self.filemodules = {}       # docname -> [modules]
+        self.modules = {}           # modname -> docname, synopsis, platform, deprecated
+        self.labels = {}            # labelname -> docname, labelid, sectionname
+        self.anonlabels = {}        # labelname -> docname, labelid
+        self.progoptions = {}       # (program, name) -> docname, labelid
+        self.reftargets = {}        # (type, name) -> docname, labelid
+                                    # where type is term, token, envvar, citation
+
+        # Other inventories
+        self.indexentries = {}      # docname -> list of
+                                    # (type, string, target, aliasname)
+        self.versionchanges = {}    # version -> list of
+                                    # (type, docname, lineno, module, descname, content)
+        self.images = {}            # absolute path -> (docnames, unique filename)
+
+        # These are set while parsing a file
+        self.docname = None         # current document name
+        self.currmodule = None      # current module name
+        self.currclass = None       # current class name
+        self.currdesc = None        # current descref name
+        self.currprogram = None     # current program name
+        self.index_num = 0          # autonumber for index targets
+        self.gloss_entries = set()  # existing definition labels
+
+        # Some magically present labels
+        self.labels['genindex'] = ('genindex', '', _('Index'))
+        self.labels['modindex'] = ('modindex', '', _('Module Index'))
+        self.labels['search']   = ('search', '', _('Search Page'))
+
+    def set_warnfunc(self, func):
+        self._warnfunc = func
+        self.settings['warning_stream'] = RedirStream(func)
+
+    def warn(self, docname, msg, lineno=None):
+        if docname:
+            if lineno is None:
+                lineno = ''
+            self._warnfunc('%s:%s: %s' % (self.doc2path(docname), lineno, msg))
+        else:
+            self._warnfunc('GLOBAL:: ' + msg)
+
+    def clear_doc(self, docname):
+        """Remove all traces of a source file in the inventory."""
+        if docname in self.all_docs:
+            self.all_docs.pop(docname, None)
+            self.metadata.pop(docname, None)
+            self.dependencies.pop(docname, None)
+            self.titles.pop(docname, None)
+            self.tocs.pop(docname, None)
+            self.toc_num_entries.pop(docname, None)
+            self.toctree_includes.pop(docname, None)
+            self.filemodules.pop(docname, None)
+            self.indexentries.pop(docname, None)
+            self.glob_toctrees.discard(docname)
+
+            for subfn, fnset in self.files_to_rebuild.items():
+                fnset.discard(docname)
+                if not fnset:
+                    del self.files_to_rebuild[subfn]
+            for fullname, (fn, _) in self.descrefs.items():
+                if fn == docname:
+                    del self.descrefs[fullname]
+            for modname, (fn, _, _, _) in self.modules.items():
+                if fn == docname:
+                    del self.modules[modname]
+            for labelname, (fn, _, _) in self.labels.items():
+                if fn == docname:
+                    del self.labels[labelname]
+            for key, (fn, _) in self.reftargets.items():
+                if fn == docname:
+                    del self.reftargets[key]
+            for key, (fn, _) in self.progoptions.items():
+                if fn == docname:
+                    del self.progoptions[key]
+            for version, changes in self.versionchanges.items():
+                new = [change for change in changes if change[1] != docname]
+                changes[:] = new
+            for fullpath, (docs, _) in self.images.items():
+                docs.discard(docname)
+                if not docs:
+                    del self.images[fullpath]
+
+    def doc2path(self, docname, base=True, suffix=None):
+        """
+        Return the filename for the document name.
+        If base is True, return absolute path under self.srcdir.
+        If base is None, return relative path to self.srcdir.
+        If base is a path string, return absolute path under that.
+        If suffix is not None, add it instead of config.source_suffix.
+        """
+        suffix = suffix or self.config.source_suffix
+        if base is True:
+            return path.join(self.srcdir, docname.replace(SEP, path.sep)) + suffix
+        elif base is None:
+            return docname.replace(SEP, path.sep) + suffix
+        else:
+            return path.join(base, docname.replace(SEP, path.sep)) + suffix
+
+    def find_files(self, config):
+        """
+        Find all source files in the source dir and put them in self.found_docs.
+        """
+        exclude_dirs  = [d.replace(SEP, path.sep) for d in config.exclude_dirs]
+        exclude_trees = [d.replace(SEP, path.sep) for d in config.exclude_trees]
+        self.found_docs = set(get_matching_docs(
+            self.srcdir, config.source_suffix, exclude_docs=set(config.unused_docs),
+            exclude_dirs=exclude_dirs, exclude_trees=exclude_trees,
+            exclude_dirnames=['_sources'] + config.exclude_dirnames))
+
+    def get_outdated_files(self, config_changed):
+        """
+        Return (added, changed, removed) sets.
+        """
+        # clear all files no longer present
+        removed = set(self.all_docs) - self.found_docs
+
+        added = set()
+        changed = set()
+
+        if config_changed:
+            # config values affect e.g. substitutions
+            added = self.found_docs
+        else:
+            for docname in self.found_docs:
+                if docname not in self.all_docs:
+                    added.add(docname)
+                    continue
+                # if the doctree file is not there, rebuild
+                if not path.isfile(self.doc2path(docname, self.doctreedir,
+                                                 '.doctree')):
+                    changed.add(docname)
+                    continue
+                # check the mtime of the document
+                mtime = self.all_docs[docname]
+                newmtime = path.getmtime(self.doc2path(docname))
+                if newmtime > mtime:
+                    changed.add(docname)
+                    continue
+                # finally, check the mtime of dependencies
+                for dep in self.dependencies.get(docname, ()):
+                    try:
+                        # this will do the right thing when dep is absolute too
+                        deppath = path.join(self.srcdir, dep)
+                        if not path.isfile(deppath):
+                            changed.add(docname)
+                            break
+                        depmtime = path.getmtime(deppath)
+                        if depmtime > mtime:
+                            changed.add(docname)
+                            break
+                    except EnvironmentError:
+                        # give it another chance
+                        changed.add(docname)
+                        break
+
+        return added, changed, removed
+
+    def update(self, config, srcdir, doctreedir, app=None):
+        """(Re-)read all files new or changed since last update.  Yields a summary
+        and then docnames as it processes them.  Store all environment docnames
+        in the canonical format (ie using SEP as a separator in place of
+        os.path.sep)."""
+        config_changed = False
+        if self.config is None:
+            msg = '[new config] '
+            config_changed = True
+        else:
+            # check if a config value was changed that affects how doctrees are read
+            for key, descr in config.config_values.iteritems():
+                if not descr[1]:
+                    continue
+                if self.config[key] != config[key]:
+                    msg = '[config changed] '
+                    config_changed = True
+                    break
+            else:
+                msg = ''
+            # this value is not covered by the above loop because it is handled
+            # specially by the config class
+            if self.config.extensions != config.extensions:
+                msg = '[extensions changed] '
+                config_changed = True
+        # the source and doctree directories may have been relocated
+        self.srcdir = srcdir
+        self.doctreedir = doctreedir
+        self.find_files(config)
+
+        added, changed, removed = self.get_outdated_files(config_changed)
+
+        # if files were added or removed, all documents with globbed toctrees
+        # must be reread
+        if added or removed:
+            changed.update(self.glob_toctrees)
+
+        msg += '%s added, %s changed, %s removed' % (len(added), len(changed),
+                                                     len(removed))
+        yield msg
+
+        self.config = config
+        self.app = app
+
+        # clear all files no longer present
+        for docname in removed:
+            if app:
+                app.emit('env-purge-doc', self, docname)
+            self.clear_doc(docname)
+
+        # read all new and changed files
+        for docname in sorted(added | changed):
+            yield docname
+            self.read_doc(docname, app=app)
+
+        if config.master_doc not in self.all_docs:
+            self.warn(None, 'master file %s not found' %
+                      self.doc2path(config.master_doc))
+
+        self.app = None
+
+        # remove all non-existing images from inventory
+        for imgsrc in self.images.keys():
+            if not os.access(path.join(self.srcdir, imgsrc), os.R_OK):
+                del self.images[imgsrc]
+
+        if app:
+            app.emit('env-updated', self)
+
+
+    # --------- SINGLE FILE READING --------------------------------------------
+
+    def read_doc(self, docname, src_path=None, save_parsed=True, app=None):
+        """
+        Parse a file and add/update inventory entries for the doctree.
+        If srcpath is given, read from a different source file.
+        """
+        # remove all inventory entries for that file
+        if app:
+            app.emit('env-purge-doc', self, docname)
+        self.clear_doc(docname)
+
+        if src_path is None:
+            src_path = self.doc2path(docname)
+
+        if self.config.default_role:
+            role_fn, messages = roles.role(self.config.default_role, english,
+                                           0, dummy_reporter)
+            if role_fn:
+                roles._roles[''] = role_fn
+            else:
+                self.warn(docname, 'default role %s not found' %
+                          self.config.default_role)
+
+        self.docname = docname
+        self.settings['input_encoding'] = self.config.source_encoding
+
+        class SphinxSourceClass(FileInput):
+            def read(self):
+                data = FileInput.read(self)
+                if app:
+                    arg = [data]
+                    app.emit('source-read', docname, arg)
+                    data = arg[0]
+                return data
+
+        # publish manually
+        pub = Publisher(reader=SphinxStandaloneReader(),
+                        writer=SphinxDummyWriter(),
+                        source_class=SphinxSourceClass,
+                        destination_class=NullOutput)
+        pub.set_components(None, 'restructuredtext', None)
+        pub.process_programmatic_settings(None, self.settings, None)
+        pub.set_source(None, src_path)
+        pub.set_destination(None, None)
+        try:
+            pub.publish()
+            doctree = pub.document
+        except UnicodeError, err:
+            from sphinx.application import SphinxError
+            raise SphinxError(err.message)
+        self.filter_messages(doctree)
+        self.process_dependencies(docname, doctree)
+        self.process_images(docname, doctree)
+        self.process_metadata(docname, doctree)
+        self.create_title_from(docname, doctree)
+        self.note_labels_from(docname, doctree)
+        self.note_indexentries_from(docname, doctree)
+        self.note_citations_from(docname, doctree)
+        self.build_toc_from(docname, doctree)
+
+        # store time of reading, used to find outdated files
+        self.all_docs[docname] = time.time()
+
+        if app:
+            app.emit('doctree-read', doctree)
+
+        # make it picklable
+        doctree.reporter = None
+        doctree.transformer = None
+        doctree.settings.warning_stream = None
+        doctree.settings.env = None
+        doctree.settings.record_dependencies = None
+        for metanode in doctree.traverse(MetaBody.meta):
+            # docutils' meta nodes aren't picklable because the class is nested
+            metanode.__class__ = addnodes.meta
+
+        # cleanup
+        self.docname = None
+        self.currmodule = None
+        self.currclass = None
+        self.gloss_entries = set()
+
+        if save_parsed:
+            # save the parsed doctree
+            doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
+            dirname = path.dirname(doctree_filename)
+            if not path.isdir(dirname):
+                os.makedirs(dirname)
+            f = open(doctree_filename, 'wb')
+            try:
+                pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)
+            finally:
+                f.close()
+        else:
+            return doctree
+
+    def filter_messages(self, doctree):
+        """
+        Filter system messages from a doctree.
+        """
+        filterlevel = self.config.keep_warnings and 2 or 5
+        for node in doctree.traverse(nodes.system_message):
+            if node['level'] < filterlevel:
+                node.parent.remove(node)
+
+    def process_dependencies(self, docname, doctree):
+        """
+        Process docutils-generated dependency info.
+        """
+        deps = doctree.settings.record_dependencies
+        if not deps:
+            return
+        docdir = path.dirname(self.doc2path(docname, base=None))
+        for dep in deps.list:
+            dep = path.join(docdir, dep)
+            self.dependencies.setdefault(docname, set()).add(dep)
+
+    def process_images(self, docname, doctree):
+        """
+        Process and rewrite image URIs.
+        """
+        existing_names = set(v[1] for v in self.images.itervalues())
+        docdir = path.dirname(self.doc2path(docname, base=None))
+        for node in doctree.traverse(nodes.image):
+            # Map the mimetype to the corresponding image.  The writer may
+            # choose the best image from these candidates.  The special key * is
+            # set if there is only single candiate to be used by a writer.
+            # The special key ? is set for nonlocal URIs.
+            node['candidates'] = candidates = {}
+            imguri = node['uri']
+            if imguri.find('://') != -1:
+                self.warn(docname, 'Nonlocal image URI found: %s' % imguri, node.line)
+                candidates['?'] = imguri
+                continue
+            # imgpath is the image path *from srcdir*
+            imgpath = path.normpath(path.join(docdir, imguri))
+            # set imgpath as default URI
+            node['uri'] = imgpath
+            if imgpath.endswith(os.extsep + '*'):
+                for filename in glob(path.join(self.srcdir, imgpath)):
+                    new_imgpath = relative_path(self.srcdir, filename)
+                    if filename.lower().endswith('.pdf'):
+                        candidates['application/pdf'] = new_imgpath
+                    elif filename.lower().endswith('.svg'):
+                        candidates['image/svg+xml'] = new_imgpath
+                    else:
+                        try:
+                            f = open(filename, 'rb')
+                            try:
+                                imgtype = imghdr.what(f)
+                            finally:
+                                f.close()
+                        except (OSError, IOError):
+                            self.warn(docname, 'Image file %s not readable' % filename)
+                        if imgtype:
+                            candidates['image/' + imgtype] = new_imgpath
+            else:
+                candidates['*'] = imgpath
+            # map image paths to unique image names (so that they can be put
+            # into a single directory)
+            for imgpath in candidates.itervalues():
+                self.dependencies.setdefault(docname, set()).add(imgpath)
+                if not os.access(path.join(self.srcdir, imgpath), os.R_OK):
+                    self.warn(docname, 'Image file not readable: %s' % imgpath,
+                              node.line)
+                if imgpath in self.images:
+                    self.images[imgpath][0].add(docname)
+                    continue
+                uniquename = path.basename(imgpath)
+                base, ext = path.splitext(uniquename)
+                i = 0
+                while uniquename in existing_names:
+                    i += 1
+                    uniquename = '%s%s%s' % (base, i, ext)
+                self.images[imgpath] = (set([docname]), uniquename)
+                existing_names.add(uniquename)
+
+    def process_metadata(self, docname, doctree):
+        """
+        Process the docinfo part of the doctree as metadata.
+        """
+        self.metadata[docname] = md = {}
+        try:
+            docinfo = doctree[0]
+        except IndexError:
+            # probably an empty document
+            return
+        if docinfo.__class__ is not nodes.docinfo:
+            # nothing to see here
+            return
+        for node in docinfo:
+            if node.__class__ is nodes.author:
+                # handled specially by docutils
+                md['author'] = node.astext()
+            elif node.__class__ is nodes.field:
+                name, body = node
+                md[name.astext()] = body.astext()
+        del doctree[0]
+
+    def create_title_from(self, docname, document):
+        """
+        Add a title node to the document (just copy the first section title),
+        and store that title in the environment.
+        """
+        for node in document.traverse(nodes.section):
+            titlenode = nodes.title()
+            visitor = SphinxContentsFilter(document)
+            node[0].walkabout(visitor)
+            titlenode += visitor.get_entry_text()
+            self.titles[docname] = titlenode
+            return
+
+    def note_labels_from(self, docname, document):
+        for name, explicit in document.nametypes.iteritems():
+            if not explicit:
+                continue
+            labelid = document.nameids[name]
+            if labelid is None:
+                continue
+            node = document.ids[labelid]
+            if name.isdigit() or node.has_key('refuri') or \
+                   node.tagname.startswith('desc_'):
+                # ignore footnote labels, labels automatically generated from a
+                # link and description units
+                continue
+            if name in self.labels:
+                self.warn(docname, 'duplicate label %s, ' % name +
+                          'other instance in %s' % self.doc2path(self.labels[name][0]),
+                          node.line)
+            self.anonlabels[name] = docname, labelid
+            if node.tagname == 'section':
+                sectname = node[0].astext() # node[0] == title node
+            elif node.tagname == 'figure':
+                for n in node:
+                    if n.tagname == 'caption':
+                        sectname = n.astext()
+                        break
+                else:
+                    continue
+            else:
+                # anonymous-only labels
+                continue
+            self.labels[name] = docname, labelid, sectname
+
+    def note_indexentries_from(self, docname, document):
+        entries = self.indexentries[docname] = []
+        for node in document.traverse(addnodes.index):
+            entries.extend(node['entries'])
+
+    def note_citations_from(self, docname, document):
+        for node in document.traverse(nodes.citation):
+            label = node[0].astext()
+            if ('citation', label) in self.reftargets:
+                self.warn(docname, 'duplicate citation %s, ' % label +
+                          'other instance in %s' % self.doc2path(
+                    self.reftargets['citation', label][0]), node.line)
+            self.reftargets['citation', label] = (docname, node['ids'][0])
+
+    def note_toctree(self, docname, toctreenode):
+        """Note a TOC tree directive in a document and gather information about
+           file relations from it."""
+        if toctreenode['glob']:
+            self.glob_toctrees.add(docname)
+        includefiles = toctreenode['includefiles']
+        for includefile in includefiles:
+            # note that if the included file is rebuilt, this one must be
+            # too (since the TOC of the included file could have changed)
+            self.files_to_rebuild.setdefault(includefile, set()).add(docname)
+        self.toctree_includes.setdefault(docname, []).extend(includefiles)
+
+    def build_toc_from(self, docname, document):
+        """Build a TOC from the doctree and store it in the inventory."""
+        numentries = [0] # nonlocal again...
+
+        try:
+            maxdepth = int(self.metadata[docname].get('tocdepth', 0))
+        except ValueError:
+            maxdepth = 0
+
+        def build_toc(node, depth=1):
+            entries = []
+            for subnode in node:
+                if isinstance(subnode, addnodes.toctree):
+                    # just copy the toctree node which is then resolved
+                    # in self.get_and_resolve_doctree
+                    item = subnode.copy()
+                    entries.append(item)
+                    # do the inventory stuff
+                    self.note_toctree(docname, subnode)
+                    continue
+                if not isinstance(subnode, nodes.section):
+                    continue
+                title = subnode[0]
+                # copy the contents of the section title, but without references
+                # and unnecessary stuff
+                visitor = SphinxContentsFilter(document)
+                title.walkabout(visitor)
+                nodetext = visitor.get_entry_text()
+                if not numentries[0]:
+                    # for the very first toc entry, don't add an anchor
+                    # as it is the file's title anyway
+                    anchorname = ''
+                else:
+                    anchorname = '#' + subnode['ids'][0]
+                numentries[0] += 1
+                reference = nodes.reference('', '', refuri=docname,
+                                            anchorname=anchorname,
+                                            *nodetext)
+                para = addnodes.compact_paragraph('', '', reference)
+                item = nodes.list_item('', para)
+                if maxdepth == 0 or depth < maxdepth:
+                    item += build_toc(subnode, depth+1)
+                entries.append(item)
+            if entries:
+                return nodes.bullet_list('', *entries)
+            return []
+        toc = build_toc(document)
+        if toc:
+            self.tocs[docname] = toc
+        else:
+            self.tocs[docname] = nodes.bullet_list('')
+        self.toc_num_entries[docname] = numentries[0]
+
+    def get_toc_for(self, docname):
+        """Return a TOC nodetree -- for use on the same page only!"""
+        toc = self.tocs[docname].deepcopy()
+        for node in toc.traverse(nodes.reference):
+            node['refuri'] = node['anchorname']
+        return toc
+
+    # -------
+    # these are called from docutils directives and therefore use self.docname
+    #
+    def note_descref(self, fullname, desctype, line):
+        if fullname in self.descrefs:
+            self.warn(self.docname,
+                      'duplicate canonical description name %s, ' % fullname +
+                      'other instance in %s' % self.doc2path(self.descrefs[fullname][0]),
+                      line)
+        self.descrefs[fullname] = (self.docname, desctype)
+
+    def note_module(self, modname, synopsis, platform, deprecated):
+        self.modules[modname] = (self.docname, synopsis, platform, deprecated)
+        self.filemodules.setdefault(self.docname, []).append(modname)
+
+    def note_progoption(self, optname, labelid):
+        self.progoptions[self.currprogram, optname] = (self.docname, labelid)
+
+    def note_reftarget(self, type, name, labelid):
+        self.reftargets[type, name] = (self.docname, labelid)
+
+    def note_versionchange(self, type, version, node, lineno):
+        self.versionchanges.setdefault(version, []).append(
+            (type, self.docname, lineno, self.currmodule, self.currdesc, node.astext()))
+
+    def note_dependency(self, filename):
+        basename = path.dirname(self.doc2path(self.docname, base=None))
+        # this will do the right thing when filename is absolute too
+        filename = path.join(basename, filename)
+        self.dependencies.setdefault(self.docname, set()).add(filename)
+    # -------
+
+    # --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
+
+    def get_doctree(self, docname):
+        """Read the doctree for a file from the pickle and return it."""
+        doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
+        f = open(doctree_filename, 'rb')
+        try:
+            doctree = pickle.load(f)
+        finally:
+            f.close()
+        doctree.settings.env = self
+        doctree.reporter = Reporter(self.doc2path(docname), 2, 4,
+                                    stream=RedirStream(self._warnfunc))
+        return doctree
+
+
+    def get_and_resolve_doctree(self, docname, builder, doctree=None,
+                                prune_toctrees=True):
+        """Read the doctree from the pickle, resolve cross-references and
+           toctrees and return it."""
+        if doctree is None:
+            doctree = self.get_doctree(docname)
+
+        # resolve all pending cross-references
+        self.resolve_references(doctree, docname, builder)
+
+        # now, resolve all toctree nodes
+        for toctreenode in doctree.traverse(addnodes.toctree):
+            result = self.resolve_toctree(docname, builder, toctreenode,
+                                          prune=prune_toctrees)
+            if result is None:
+                toctreenode.replace_self([])
+            else:
+                toctreenode.replace_self(result)
+
+        return doctree
+
+    def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0,
+                        titles_only=False):
+        """
+        Resolve a *toctree* node into individual bullet lists with titles
+        as items, returning None (if no containing titles are found) or
+        a new node.
+
+        If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
+        to the value of the *maxdepth* option on the *toctree* node.
+        If *titles_only* is True, only toplevel document titles will be in the
+        resulting tree.
+        """
+
+        def _walk_depth(node, depth, maxdepth, titleoverrides):
+            """Utility: Cut a TOC at a specified depth."""
+            for subnode in node.children[:]:
+                if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)):
+                    subnode['classes'].append('toctree-l%d' % (depth-1))
+                    _walk_depth(subnode, depth, maxdepth, titleoverrides)
+                elif isinstance(subnode, nodes.bullet_list):
+                    if maxdepth > 0 and depth > maxdepth:
+                        subnode.parent.replace(subnode, [])
+                    else:
+                        _walk_depth(subnode, depth+1, maxdepth, titleoverrides)
+
+        def _entries_from_toctree(toctreenode, separate=False):
+            """Return TOC entries for a toctree node."""
+            includefiles = map(str, toctreenode['includefiles'])
+
+            entries = []
+            for includefile in includefiles:
+                try:
+                    toc = self.tocs[includefile].deepcopy()
+                    if not toc.children:
+                        # empty toc means: no titles will show up in the toctree
+                        self.warn(docname, 'toctree contains reference to document '
+                                  '%r that doesn\'t have a title: no link will be '
+                                  'generated' % includefile)
+                except KeyError:
+                    # this is raised if the included file does not exist
+                    self.warn(docname, 'toctree contains reference to nonexisting '
+                              'document %r' % includefile)
+                else:
+                    # if titles_only is given, only keep the main title and
+                    # sub-toctrees
+                    if titles_only:
+                        # delete everything but the toplevel title(s) and toctrees
+                        for toplevel in toc:
+                            # nodes with length 1 don't have any children anyway
+                            if len(toplevel) > 1:
+                                subtoctrees = toplevel.traverse(addnodes.toctree)
+                                toplevel[1][:] = subtoctrees
+                    # resolve all sub-toctrees
+                    for toctreenode in toc.traverse(addnodes.toctree):
+                        i = toctreenode.parent.index(toctreenode) + 1
+                        for item in _entries_from_toctree(toctreenode):
+                            toctreenode.parent.insert(i, item)
+                            i += 1
+                        toctreenode.parent.remove(toctreenode)
+                    if separate:
+                        entries.append(toc)
+                    else:
+                        entries.extend(toc.children)
+            return entries
+
+        maxdepth = maxdepth or toctree.get('maxdepth', -1)
+        titleoverrides = toctree.get('includetitles', {})
+
+        tocentries = _entries_from_toctree(toctree, separate=True)
+        if not tocentries:
+            return None
+
+        newnode = addnodes.compact_paragraph('', '', *tocentries)
+        newnode['toctree'] = True
+        # prune the tree to maxdepth and replace titles, also set level classes
+        _walk_depth(newnode, 1, prune and maxdepth or 0, titleoverrides)
+        # replace titles, if needed, and set the target paths in the
+        # toctrees (they are not known at TOC generation time)
+        for refnode in newnode.traverse(nodes.reference):
+            refnode['refuri'] = builder.get_relative_uri(
+                docname, refnode['refuri']) + refnode['anchorname']
+            if titleoverrides and not refnode['anchorname'] \
+                   and refnode['refuri'] in titleoverrides:
+                newtitle = titleoverrides[refnode['refuri']]
+                refnode.children = [nodes.Text(newtitle)]
+        return newnode
+
+    descroles = frozenset(('data', 'exc', 'func', 'class', 'const', 'attr', 'obj',
+                           'meth', 'cfunc', 'cmember', 'cdata', 'ctype', 'cmacro'))
+
+    def resolve_references(self, doctree, fromdocname, builder):
+        reftarget_roles = set(('token', 'term', 'citation'))
+        # add all custom xref types too
+        reftarget_roles.update(i[0] for i in additional_xref_types.values())
+
+        for node in doctree.traverse(addnodes.pending_xref):
+            contnode = node[0].deepcopy()
+            newnode = None
+
+            typ = node['reftype']
+            target = node['reftarget']
+
+            try:
+                if typ == 'ref':
+                    if node['refcaption']:
+                        # reference to anonymous label; the reference uses the supplied
+                        # link caption
+                        docname, labelid = self.anonlabels.get(target, ('',''))
+                        sectname = node.astext()
+                        if not docname:
+                            newnode = doctree.reporter.system_message(
+                                2, 'undefined label: %s' % target)
+                    else:
+                        # reference to the named label; the final node will contain the
+                        # section name after the label
+                        docname, labelid, sectname = self.labels.get(target, ('','',''))
+                        if not docname:
+                            newnode = doctree.reporter.system_message(
+                                2, 'undefined label: %s -- if you don\'t ' % target +
+                                'give a link caption the label must precede a section '
+                                'header.')
+                    if docname:
+                        newnode = nodes.reference('', '')
+                        innernode = nodes.emphasis(sectname, sectname)
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            # set more info in contnode in case the get_relative_uri call
+                            # raises NoUri, the builder will then have to resolve these
+                            contnode = addnodes.pending_xref('')
+                            contnode['refdocname'] = docname
+                            contnode['refsectname'] = sectname
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname)
+                            if labelid:
+                                newnode['refuri'] += '#' + labelid
+                        newnode.append(innernode)
+                elif typ == 'keyword':
+                    # keywords are referenced by named labels
+                    docname, labelid, _ = self.labels.get(target, ('','',''))
+                    if not docname:
+                        #self.warn(fromdocname, 'unknown keyword: %s' % target)
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ == 'option':
+                    progname = node['refprogram']
+                    docname, labelid = self.progoptions.get((progname, target), ('', ''))
+                    if not docname:
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ in reftarget_roles:
+                    docname, labelid = self.reftargets.get((typ, target), ('', ''))
+                    if not docname:
+                        if typ == 'term':
+                            self.warn(fromdocname, 'term not in glossary: %s' % target,
+                                      node.line)
+                        elif typ == 'citation':
+                            self.warn(fromdocname, 'citation not found: %s' % target,
+                                      node.line)
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname, typ) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ == 'mod':
+                    docname, synopsis, platform, deprecated = \
+                        self.modules.get(target, ('','','', ''))
+                    if not docname:
+                        newnode = builder.app.emit_firstresult('missing-reference',
+                                                               self, node, contnode)
+                        if not newnode:
+                            newnode = contnode
+                    elif docname == fromdocname:
+                        # don't link to self
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        newnode['refuri'] = builder.get_relative_uri(
+                            fromdocname, docname) + '#module-' + target
+                        newnode['reftitle'] = '%s%s%s' % (
+                            (platform and '(%s) ' % platform),
+                            synopsis, (deprecated and ' (deprecated)' or ''))
+                        newnode.append(contnode)
+                elif typ in self.descroles:
+                    # "descrefs"
+                    modname = node['modname']
+                    clsname = node['classname']
+                    searchorder = node.hasattr('refspecific') and 1 or 0
+                    name, desc = self.find_desc(modname, clsname,
+                                                target, typ, searchorder)
+                    if not desc:
+                        newnode = builder.app.emit_firstresult('missing-reference',
+                                                               self, node, contnode)
+                        if not newnode:
+                            newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if desc[0] == fromdocname:
+                            newnode['refid'] = name
+                        else:
+                            newnode['refuri'] = (
+                                builder.get_relative_uri(fromdocname, desc[0])
+                                + '#' + name)
+                        newnode['reftitle'] = name
+                        newnode.append(contnode)
+                else:
+                    raise RuntimeError('unknown xfileref node encountered: %s' % node)
+            except NoUri:
+                newnode = contnode
+            if newnode:
+                node.replace_self(newnode)
+
+        # allow custom references to be resolved
+        builder.app.emit('doctree-resolved', doctree, fromdocname)
+
+    def create_index(self, builder, _fixre=re.compile(r'(.*) ([(][^()]*[)])')):
+        """Create the real index from the collected index entries."""
+        new = {}
+
+        def add_entry(word, subword, dic=new):
+            entry = dic.get(word)
+            if not entry:
+                dic[word] = entry = [[], {}]
+            if subword:
+                add_entry(subword, '', dic=entry[1])
+            else:
+                try:
+                    entry[0].append(builder.get_relative_uri('genindex', fn)
+                                    + '#' + tid)
+                except NoUri:
+                    pass
+
+        for fn, entries in self.indexentries.iteritems():
+            # new entry types must be listed in directives/other.py!
+            for type, string, tid, alias in entries:
+                if type == 'single':
+                    try:
+                        entry, subentry = string.split(';', 1)
+                    except ValueError:
+                        entry, subentry = string, ''
+                    if not entry:
+                        self.warn(fn, 'invalid index entry %r' % string)
+                        continue
+                    add_entry(entry.strip(), subentry.strip())
+                elif type == 'pair':
+                    try:
+                        first, second = map(lambda x: x.strip(),
+                                            string.split(';', 1))
+                        if not first or not second:
+                            raise ValueError
+                    except ValueError:
+                        self.warn(fn, 'invalid pair index entry %r' % string)
+                        continue
+                    add_entry(first, second)
+                    add_entry(second, first)
+                elif type == 'triple':
+                    try:
+                        first, second, third = map(lambda x: x.strip(),
+                                                   string.split(';', 2))
+                        if not first or not second or not third:
+                            raise ValueError
+                    except ValueError:
+                        self.warn(fn, 'invalid triple index entry %r' % string)
+                        continue
+                    add_entry(first, second+' '+third)
+                    add_entry(second, third+', '+first)
+                    add_entry(third, first+' '+second)
+                else:
+                    self.warn(fn, 'unknown index entry type %r' % type)
+
+        newlist = new.items()
+        newlist.sort(key=lambda t: t[0].lower())
+
+        # fixup entries: transform
+        #   func() (in module foo)
+        #   func() (in module bar)
+        # into
+        #   func()
+        #     (in module foo)
+        #     (in module bar)
+        oldkey = ''
+        oldsubitems = None
+        i = 0
+        while i < len(newlist):
+            key, (targets, subitems) = newlist[i]
+            # cannot move if it hassubitems; structure gets too complex
+            if not subitems:
+                m = _fixre.match(key)
+                if m:
+                    if oldkey == m.group(1):
+                        # prefixes match: add entry as subitem of the previous entry
+                        oldsubitems.setdefault(m.group(2), [[], {}])[0].extend(targets)
+                        del newlist[i]
+                        continue
+                    oldkey = m.group(1)
+                else:
+                    oldkey = key
+            oldsubitems = subitems
+            i += 1
+
+        # group the entries by letter
+        def keyfunc((k, v), ltrs=uppercase+'_'):
+            # hack: mutate the subitems dicts to a list in the keyfunc
+            v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems())
+            # now calculate the key
+            letter = k[0].upper()
+            if letter in ltrs:
+                return letter
+            else:
+                # get all other symbols under one heading
+                return 'Symbols'
+        return [(key, list(group)) for (key, group) in groupby(newlist, keyfunc)]
+
+    def collect_relations(self):
+        relations = {}
+        getinc = self.toctree_includes.get
+        def collect(parents, docname, previous, next):
+            includes = getinc(docname)
+            # previous
+            if not previous:
+                # if no previous sibling, go to parent
+                previous = parents[0][0]
+            else:
+                # else, go to previous sibling, or if it has children, to
+                # the last of its children, or if that has children, to the
+                # last of those, and so forth
+                while 1:
+                    previncs = getinc(previous)
+                    if previncs:
+                        previous = previncs[-1]
+                    else:
+                        break
+            # next
+            if includes:
+                # if it has children, go to first of them
+                next = includes[0]
+            elif next:
+                # else, if next sibling, go to it
+                pass
+            else:
+                # else, go to the next sibling of the parent, if present,
+                # else the grandparent's sibling, if present, and so forth
+                for parname, parindex in parents:
+                    parincs = getinc(parname)
+                    if parincs and parindex + 1 < len(parincs):
+                        next = parincs[parindex+1]
+                        break
+                # else it will stay None
+            # same for children
+            if includes:
+                for subindex, args in enumerate(izip(includes, [None] + includes,
+                                                     includes[1:] + [None])):
+                    collect([(docname, subindex)] + parents, *args)
+            relations[docname] = [parents[0][0], previous, next]
+        collect([(None, 0)], self.config.master_doc, None, None)
+        return relations
+
+    def check_consistency(self):
+        """Do consistency checks."""
+
+        for docname in sorted(self.all_docs):
+            if docname not in self.files_to_rebuild:
+                if docname == self.config.master_doc:
+                    # the master file is not included anywhere ;)
+                    continue
+                self.warn(docname, 'document isn\'t included in any toctree')
+
+    # --------- QUERYING -------------------------------------------------------
+
+    def find_desc(self, modname, classname, name, type, searchorder=0):
+        """Find a description node matching "name", perhaps using
+           the given module and/or classname."""
+        # skip parens
+        if name[-2:] == '()':
+            name = name[:-2]
+
+        if not name:
+            return None, None
+
+        # don't add module and class names for C things
+        if type[0] == 'c' and type not in ('class', 'const'):
+            # skip trailing star and whitespace
+            name = name.rstrip(' *')
+            if name in self.descrefs and self.descrefs[name][1][0] == 'c':
+                return name, self.descrefs[name]
+            return None, None
+
+        newname = None
+        if searchorder == 1:
+            if modname and classname and \
+                   modname + '.' + classname + '.' + name in self.descrefs:
+                newname = modname + '.' + classname + '.' + name
+            elif modname and modname + '.' + name in self.descrefs:
+                newname = modname + '.' + name
+            elif name in self.descrefs:
+                newname = name
+        else:
+            if name in self.descrefs:
+                newname = name
+            elif modname and modname + '.' + name in self.descrefs:
+                newname = modname + '.' + name
+            elif modname and classname and \
+                     modname + '.' + classname + '.' + name in self.descrefs:
+                newname = modname + '.' + classname + '.' + name
+            # special case: builtin exceptions have module "exceptions" set
+            elif type == 'exc' and '.' not in name and \
+                 'exceptions.' + name in self.descrefs:
+                newname = 'exceptions.' + name
+            # special case: object methods
+            elif type in ('func', 'meth') and '.' not in name and \
+                 'object.' + name in self.descrefs:
+                newname = 'object.' + name
+        if newname is None:
+            return None, None
+        return newname, self.descrefs[newname]
+
+    def find_keyword(self, keyword, avoid_fuzzy=False, cutoff=0.6, n=20):
+        """
+        Find keyword matches for a keyword. If there's an exact match, just return
+        it, else return a list of fuzzy matches if avoid_fuzzy isn't True.
+
+        Keywords searched are: first modules, then descrefs.
+
+        Returns: None if nothing found
+                 (type, docname, anchorname) if exact match found
+                 list of (quality, type, docname, anchorname, description) if fuzzy
+        """
+
+        if keyword in self.modules:
+            docname, title, system, deprecated = self.modules[keyword]
+            return 'module', docname, 'module-' + keyword
+        if keyword in self.descrefs:
+            docname, ref_type = self.descrefs[keyword]
+            return ref_type, docname, keyword
+        # special cases
+        if '.' not in keyword:
+            # exceptions are documented in the exceptions module
+            if 'exceptions.'+keyword in self.descrefs:
+                docname, ref_type = self.descrefs['exceptions.'+keyword]
+                return ref_type, docname, 'exceptions.'+keyword
+            # special methods are documented as object methods
+            if 'object.'+keyword in self.descrefs:
+                docname, ref_type = self.descrefs['object.'+keyword]
+                return ref_type, docname, 'object.'+keyword
+
+        if avoid_fuzzy:
+            return
+
+        # find fuzzy matches
+        s = difflib.SequenceMatcher()
+        s.set_seq2(keyword.lower())
+
+        def possibilities():
+            for title, (fn, desc, _, _) in self.modules.iteritems():
+                yield ('module', fn, 'module-'+title, desc)
+            for title, (fn, desctype) in self.descrefs.iteritems():
+                yield (desctype, fn, title, '')
+
+        def dotsearch(string):
+            parts = string.lower().split('.')
+            for idx in xrange(0, len(parts)):
+                yield '.'.join(parts[idx:])
+
+        result = []
+        for type, docname, title, desc in possibilities():
+            best_res = 0
+            for part in dotsearch(title):
+                s.set_seq1(part)
+                if s.real_quick_ratio() >= cutoff and \
+                   s.quick_ratio() >= cutoff and \
+                   s.ratio() >= cutoff and \
+                   s.ratio() > best_res:
+                    best_res = s.ratio()
+            if best_res:
+                result.append((best_res, type, docname, title, desc))
+
+        return heapq.nlargest(n, result)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext
+    ~~~~~~~~~~
+
+    Contains Sphinx features not activated by default.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,655 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.autodoc
+    ~~~~~~~~~~~~~~~~~~
+
+    Automatically insert docstrings for functions, classes or whole modules into
+    the doctree, thus avoiding duplication between docstrings and documentation
+    for those who like elaborate docstrings.
+
+    :copyright: 2008 by Georg Brandl, Pauli Virtanen, Martin Hans.
+    :license: BSD.
+"""
+
+import re
+import sys
+import types
+import inspect
+import linecache
+from types import FunctionType, BuiltinMethodType, MethodType
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.statemachine import ViewList
+
+from sphinx.util import rpartition, nested_parse_with_titles
+from sphinx.directives.desc import py_sig_re
+
+try:
+    base_exception = BaseException
+except NameError:
+    base_exception = Exception
+
+_charset_re = re.compile(r'coding[:=]\s*([-\w.]+)')
+_module_charsets = {}
+
+
+class Options(object):
+    pass
+
+
+def is_static_method(obj):
+    """Check if the object given is a static method."""
+    if isinstance(obj, (FunctionType, classmethod)):
+        return True
+    elif isinstance(obj, BuiltinMethodType):
+        return obj.__self__ is not None
+    elif isinstance(obj, MethodType):
+        return obj.im_self is not None
+    return False
+
+
+class AutodocReporter(object):
+    """
+    A reporter replacement that assigns the correct source name
+    and line number to a system message, as recorded in a ViewList.
+    """
+    def __init__(self, viewlist, reporter):
+        self.viewlist = viewlist
+        self.reporter = reporter
+
+    def __getattr__(self, name):
+        return getattr(self.reporter, name)
+
+    def system_message(self, level, message, *children, **kwargs):
+        if 'line' in kwargs:
+            try:
+                source, line = self.viewlist.items[kwargs['line']]
+            except IndexError:
+                pass
+            else:
+                kwargs['source'] = source
+                kwargs['line'] = line
+        return self.reporter.system_message(level, message,
+                                            *children, **kwargs)
+
+    def debug(self, *args, **kwargs):
+        if self.reporter.debug_flag:
+            return self.system_message(0, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        return self.system_message(1, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        return self.system_message(2, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        return self.system_message(3, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        return self.system_message(4, *args, **kwargs)
+
+
+# Some useful event listener factories for autodoc-process-docstring.
+
+def cut_lines(pre, post=0, what=None):
+    """
+    Return a listener that removes the first *pre* and last *post*
+    lines of every docstring.  If *what* is a sequence of strings,
+    only docstrings of a type in *what* will be processed.
+
+    Use like this (e.g. in the ``setup()`` function of :file:`conf.py`)::
+
+       from sphinx.ext.autodoc import cut_lines
+       app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
+
+    This can (and should) be used in place of :confval:`automodule_skip_lines`.
+    """
+    def process(app, what_, name, obj, options, lines):
+        if what and what_ not in what:
+            return
+        del lines[:pre]
+        if post:
+            # remove one trailing blank line.
+            if lines and not lines[-1]:
+                lines.pop(-1)
+            del lines[-post:]
+        # make sure there is a blank line at the end
+        if lines and lines[-1]:
+            lines.append('')
+    return process
+
+def between(marker, what=None, keepempty=False):
+    """
+    Return a listener that only keeps lines between lines that match the
+    *marker* regular expression.  If no line matches, the resulting docstring
+    would be empty, so no change will be made unless *keepempty* is true.
+
+    If *what* is a sequence of strings, only docstrings of a type in *what* will
+    be processed.
+    """
+    marker_re = re.compile(marker)
+    def process(app, what_, name, obj, options, lines):
+        if what and what_ not in what:
+            return
+        deleted = 0
+        delete = True
+        orig_lines = lines[:]
+        for i, line in enumerate(orig_lines):
+            if delete:
+                lines.pop(i - deleted)
+                deleted += 1
+            if marker_re.match(line):
+                delete = not delete
+                if delete:
+                    lines.pop(i - deleted)
+                    deleted += 1
+        if not lines and not keepempty:
+            lines[:] = orig_lines
+        # make sure there is a blank line at the end
+        if lines and lines[-1]:
+            lines.append('')
+    return process
+
+
+def isdescriptor(x):
+    """Check if the object is some kind of descriptor."""
+    for item in '__get__', '__set__', '__delete__':
+        if callable(getattr(x, item, None)):
+            return True
+    return False
+
+
+def prepare_docstring(s):
+    """
+    Convert a docstring into lines of parseable reST.  Return it as a list of
+    lines usable for inserting into a docutils ViewList (used as argument
+    of nested_parse().)  An empty line is added to act as a separator between
+    this docstring and following content.
+    """
+    lines = s.expandtabs().splitlines()
+    # Find minimum indentation of any non-blank lines after first line.
+    margin = sys.maxint
+    for line in lines[1:]:
+        content = len(line.lstrip())
+        if content:
+            indent = len(line) - content
+            margin = min(margin, indent)
+    # Remove indentation.
+    if lines:
+        lines[0] = lines[0].lstrip()
+    if margin < sys.maxint:
+        for i in range(1, len(lines)): lines[i] = lines[i][margin:]
+    # Remove any leading blank lines.
+    while lines and not lines[0]:
+        lines.pop(0)
+    # make sure there is an empty line at the end
+    if lines and lines[-1]:
+        lines.append('')
+    return lines
+
+
+def get_module_charset(module):
+    """Return the charset of the given module (cached in _module_charsets)."""
+    if module in _module_charsets:
+        return _module_charsets[module]
+    try:
+        filename = __import__(module, None, None, ['foo']).__file__
+    except (ImportError, AttributeError):
+        return None
+    if filename[-4:].lower() in ('.pyc', '.pyo'):
+        filename = filename[:-1]
+    for line in [linecache.getline(filename, x) for x in (1, 2)]:
+        match = _charset_re.search(line)
+        if match is not None:
+            charset = match.group(1)
+            break
+    else:
+        charset = 'ascii'
+    _module_charsets[module] = charset
+    return charset
+
+
+class RstGenerator(object):
+    def __init__(self, options, document, lineno):
+        self.options = options
+        self.env = document.settings.env
+        self.reporter = document.reporter
+        self.lineno = lineno
+        self.filename_set = set()
+        self.warnings = []
+        self.result = ViewList()
+
+    def warn(self, msg):
+        self.warnings.append(self.reporter.warning(msg, line=self.lineno))
+
+    def get_doc(self, what, name, obj):
+        """Format and yield lines of the docstring(s) for the object."""
+        docstrings = []
+        if getattr(obj, '__doc__', None):
+            docstrings.append(obj.__doc__)
+        # skip some lines in module docstrings if configured
+        if what == 'module' and self.env.config.automodule_skip_lines and docstrings:
+            docstrings[0] = '\n'.join(docstrings[0].splitlines()
+                                      [self.env.config.automodule_skip_lines:])
+        # for classes, what the "docstring" is can be controlled via an option
+        if what in ('class', 'exception'):
+            content = self.env.config.autoclass_content
+            if content in ('both', 'init'):
+                initdocstring = getattr(obj, '__init__', None).__doc__
+                # for new-style classes, no __init__ means default __init__
+                if initdocstring == object.__init__.__doc__:
+                    initdocstring = None
+                if initdocstring:
+                    if content == 'init':
+                        docstrings = [initdocstring]
+                    else:
+                        docstrings.append(initdocstring)
+            # the default is only the class docstring
+
+        # decode the docstrings using the module's source encoding
+        charset = None
+        module = getattr(obj, '__module__', None)
+        if module is not None:
+            charset = get_module_charset(module)
+
+        for docstring in docstrings:
+            if isinstance(docstring, str):
+                if charset:
+                    docstring = docstring.decode(charset)
+                else:
+                    try:
+                        # try decoding with utf-8, should only work for real UTF-8
+                        docstring = docstring.decode('utf-8')
+                    except UnicodeError:
+                        # last resort -- can't fail
+                        docstring = docstring.decode('latin1')
+            docstringlines = prepare_docstring(docstring)
+            if self.env.app:
+                # let extensions preprocess docstrings
+                self.env.app.emit('autodoc-process-docstring',
+                                  what, name, obj, self.options, docstringlines)
+            for line in docstringlines:
+                yield line
+
+    def resolve_name(self, what, name):
+        """
+        Determine what module to import and what attribute to document.
+
+        Returns a tuple of: the full name, the module name, a path of
+        names to get via getattr, the signature and return annotation.
+        """
+        # first, parse the definition -- auto directives for classes and functions
+        # can contain a signature which is then used instead of an autogenerated one
+        try:
+            path, base, args, retann = py_sig_re.match(name).groups()
+        except:
+            self.warn('invalid signature for auto%s (%r)' % (what, name))
+            return
+        # fullname is the fully qualified name, base the name after the last dot
+        fullname = (path or '') + base
+
+        if what == 'module':
+            if args or retann:
+                self.warn('ignoring signature arguments and return annotation '
+                          'for automodule %s' % fullname)
+            return fullname, fullname, [], None, None
+
+        elif what in ('class', 'exception', 'function'):
+            if path:
+                mod = path.rstrip('.')
+            else:
+                mod = None
+                # if documenting a toplevel object without explicit module, it can
+                # be contained in another auto directive ...
+                if hasattr(self.env, 'autodoc_current_module'):
+                    mod = self.env.autodoc_current_module
+                # ... or in the scope of a module directive
+                if not mod:
+                    mod = self.env.currmodule
+            return fullname, mod, [base], args, retann
+
+        else:
+            if path:
+                mod_cls = path.rstrip('.')
+            else:
+                mod_cls = None
+                # if documenting a class-level object without path, there must be a
+                # current class, either from a parent auto directive ...
+                if hasattr(self.env, 'autodoc_current_class'):
+                    mod_cls = self.env.autodoc_current_class
+                # ... or from a class directive
+                if mod_cls is None:
+                    mod_cls = self.env.currclass
+                # ... if still None, there's no way to know
+                if mod_cls is None:
+                    return fullname, None, [], args, retann
+            mod, cls = rpartition(mod_cls, '.')
+            # if the module name is still missing, get it like above
+            if not mod and hasattr(self.env, 'autodoc_current_module'):
+                mod = self.env.autodoc_current_module
+            if not mod:
+                mod = self.env.currmodule
+            return fullname, mod, [cls, base], args, retann
+
+    def format_signature(self, what, name, obj, args, retann):
+        """
+        Return the signature of the object, formatted for display.
+        """
+        if what not in ('class', 'method', 'function'):
+            return ''
+
+        err = None
+        if args is not None:
+            # signature given explicitly
+            args = "(%s)" % args
+        else:
+            # try to introspect the signature
+            try:
+                args = None
+                getargs = True
+                if what == 'class':
+                    # for classes, the relevant signature is the __init__ method's
+                    obj = getattr(obj, '__init__', None)
+                    # classes without __init__ method, default __init__ or
+                    # __init__ written in C?
+                    if obj is None or obj is object.__init__ or not \
+                       (inspect.ismethod(obj) or inspect.isfunction(obj)):
+                        getargs = False
+                elif inspect.isbuiltin(obj) or inspect.ismethoddescriptor(obj):
+                    # can never get arguments of a C function or method
+                    getargs = False
+                if getargs:
+                    argspec = inspect.getargspec(obj)
+                    if what in ('class', 'method') and argspec[0] and \
+                           argspec[0][0] in ('cls', 'self'):
+                        del argspec[0][0]
+                    args = inspect.formatargspec(*argspec)
+            except Exception, e:
+                args = None
+                err = e
+
+        result = self.env.app.emit_firstresult('autodoc-process-signature', what,
+                                               name, obj, self.options, args, retann)
+        if result:
+            args, retann = result
+
+        if args is not None:
+            return '%s%s' % (args, retann or '')
+        elif err:
+            # re-raise the error for perusal of the handler in generate()
+            raise RuntimeError(err)
+        else:
+            return ''
+
+    def generate(self, what, name, members, add_content, indent=u'', check_module=False):
+        """
+        Generate reST for the object in self.result.
+        """
+        fullname, mod, objpath, args, retann = self.resolve_name(what, name)
+        if not mod:
+            # need a module to import
+            self.warn('don\'t know which module to import for autodocumenting %r '
+                      '(try placing a "module" or "currentmodule" directive in the '
+                      'document, or giving an explicit module name)' % fullname)
+            return
+
+        # the name to put into the generated directive -- doesn't contain the module
+        name_in_directive = '.'.join(objpath) or mod
+
+        # now, import the module and get object to document
+        try:
+            todoc = module = __import__(mod, None, None, ['foo'])
+            if hasattr(module, '__file__') and module.__file__:
+                modfile = module.__file__
+                if modfile[-4:].lower() in ('.pyc', '.pyo'):
+                    modfile = modfile[:-1]
+                self.filename_set.add(modfile)
+            else:
+                modfile = None  # e.g. for builtin and C modules
+            for part in objpath:
+                todoc = getattr(todoc, part)
+        except (ImportError, AttributeError), err:
+            self.warn('autodoc can\'t import/find %s %r, it reported error: "%s", '
+                      'please check your spelling and sys.path' %
+                      (what, str(fullname), err))
+            return
+
+        # check __module__ of object if wanted (for members not given explicitly)
+        if check_module:
+            if hasattr(todoc, '__module__'):
+                if todoc.__module__ != mod:
+                    return
+
+        # format the object's signature, if any
+        try:
+            sig = self.format_signature(what, name, todoc, args, retann)
+        except Exception, err:
+            self.warn('error while formatting signature for %s: %s' %
+                      (fullname, err))
+            sig = ''
+
+        # make sure that the result starts with an empty line.  This is
+        # necessary for some situations where another directive preprocesses
+        # reST and no starting newline is present
+        self.result.append(u'', '')
+
+        # now, create the directive header
+        directive = (what == 'method' and is_static_method(todoc)) \
+                    and 'staticmethod' or what
+        self.result.append(indent + u'.. %s:: %s%s' %
+                           (directive, name_in_directive, sig), '<autodoc>')
+        if what == 'module':
+            # Add some module-specific options
+            if self.options.synopsis:
+                self.result.append(indent + u'   :synopsis: ' + self.options.synopsis,
+                              '<autodoc>')
+            if self.options.platform:
+                self.result.append(indent + u'   :platform: ' + self.options.platform,
+                              '<autodoc>')
+            if self.options.deprecated:
+                self.result.append(indent + u'   :deprecated:', '<autodoc>')
+        else:
+            # Be explicit about the module, this is necessary since .. class:: doesn't
+            # support a prepended module name
+            self.result.append(indent + u'   :module: %s' % mod, '<autodoc>')
+        if self.options.noindex:
+            self.result.append(indent + u'   :noindex:', '<autodoc>')
+        self.result.append(u'', '<autodoc>')
+
+        if self.options.show_inheritance and what in ('class', 'exception'):
+            if len(todoc.__bases__):
+                bases = [b.__module__ == '__builtin__' and
+                         u':class:`%s`' % b.__name__ or
+                         u':class:`%s.%s`' % (b.__module__, b.__name__)
+                         for b in todoc.__bases__]
+                self.result.append(indent + u'   Bases: %s' % ', '.join(bases),
+                                   '<autodoc>')
+                self.result.append(u'', '<autodoc>')
+
+        # the module directive doesn't have content
+        if what != 'module':
+            indent += u'   '
+
+        if modfile:
+            sourcename = '%s:docstring of %s' % (modfile, fullname)
+        else:
+            sourcename = 'docstring of %s' % fullname
+
+        # add content from docstrings
+        for i, line in enumerate(self.get_doc(what, fullname, todoc)):
+            self.result.append(indent + line, sourcename, i)
+
+        # add source content, if present
+        if add_content:
+            for line, src in zip(add_content.data, add_content.items):
+                self.result.append(indent + line, src[0], src[1])
+
+        # document members?
+        if not members or what in ('function', 'method', 'attribute'):
+            return
+
+        # set current namespace for finding members
+        self.env.autodoc_current_module = mod
+        if objpath:
+            self.env.autodoc_current_class = objpath[0]
+
+        # add members, if possible
+        _all = members == ['__all__']
+        members_check_module = False
+        if _all:
+            # unqualified :members: given
+            if what == 'module':
+                if hasattr(todoc, '__all__'):
+                    members_check_module = False
+                    all_members = []
+                    for mname in todoc.__all__:
+                        try:
+                            all_members.append((mname, getattr(todoc, mname)))
+                        except AttributeError:
+                            self.warn('missing attribute mentioned in __all__: '
+                                      'module %s, attribute %s' %
+                                      (todoc.__name__, mname))
+                else:
+                    # for implicit module members, check __module__ to avoid
+                    # documenting imported objects
+                    members_check_module = True
+                    all_members = inspect.getmembers(todoc)
+            else:
+                if self.options.inherited_members:
+                    # getmembers() uses dir() which pulls in members from all
+                    # base classes
+                    all_members = inspect.getmembers(todoc)
+                else:
+                    # __dict__ contains only the members directly defined in the class
+                    all_members = sorted(todoc.__dict__.iteritems())
+        else:
+            all_members = [(mname, getattr(todoc, mname)) for mname in members]
+        for (membername, member) in all_members:
+            # ignore members whose name starts with _ by default
+            if _all and membername.startswith('_'):
+                continue
+
+            # ignore undocumented members if :undoc-members: is not given
+            doc = getattr(member, '__doc__', None)
+            skip = not self.options.undoc_members and not doc
+            # give the user a chance to decide whether this member should be skipped
+            if self.env.app:
+                # let extensions preprocess docstrings
+                skip_user = self.env.app.emit_firstresult(
+                    'autodoc-skip-member', what, membername, member, skip, self.options)
+                if skip_user is not None:
+                    skip = skip_user
+            if skip:
+                continue
+
+            if what == 'module':
+                if isinstance(member, (types.FunctionType,
+                                       types.BuiltinFunctionType)):
+                    memberwhat = 'function'
+                elif isinstance(member, types.ClassType) or \
+                     isinstance(member, type):
+                    if issubclass(member, base_exception):
+                        memberwhat = 'exception'
+                    else:
+                        memberwhat = 'class'
+                else:
+                    # XXX: todo -- attribute docs
+                    continue
+            else:
+                if callable(member):
+                    memberwhat = 'method'
+                elif isdescriptor(member):
+                    memberwhat = 'attribute'
+                else:
+                    # XXX: todo -- attribute docs
+                    continue
+            full_membername = fullname + '.' + membername
+            self.generate(memberwhat, full_membername, ['__all__'], None, indent,
+                          check_module=members_check_module)
+
+        self.env.autodoc_current_module = None
+        self.env.autodoc_current_class = None
+
+
+def _auto_directive(dirname, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    what = dirname[4:]  # strip "auto"
+    name = arguments[0]
+    genopt = Options()
+    members = options.get('members', [])
+    genopt.inherited_members = 'inherited-members' in options
+    if genopt.inherited_members and not members:
+        # :inherited-members: implies :members:
+        members = ['__all__']
+    genopt.undoc_members = 'undoc-members' in options
+    genopt.show_inheritance = 'show-inheritance' in options
+    genopt.noindex = 'noindex' in options
+    genopt.synopsis = options.get('synopsis', '')
+    genopt.platform = options.get('platform', '')
+    genopt.deprecated = 'deprecated' in options
+
+    generator = RstGenerator(genopt, state.document, lineno)
+    generator.generate(what, name, members, content)
+    if not generator.result:
+        return generator.warnings
+
+    # record all filenames as dependencies -- this will at least partially make
+    # automatic invalidation possible
+    for fn in generator.filename_set:
+        state.document.settings.env.note_dependency(fn)
+
+    # use a custom reporter that correctly assigns lines to source and lineno
+    old_reporter = state.memo.reporter
+    state.memo.reporter = AutodocReporter(generator.result, state.memo.reporter)
+    if dirname == 'automodule':
+        node = nodes.section()
+        nested_parse_with_titles(state, generator.result, node)
+    else:
+        node = nodes.paragraph()
+        state.nested_parse(generator.result, 0, node)
+    state.memo.reporter = old_reporter
+    return generator.warnings + node.children
+
+def auto_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+def automodule_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+def autoclass_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+
+def members_option(arg):
+    if arg is None:
+        return ['__all__']
+    return [x.strip() for x in arg.split(',')]
+
+
+def setup(app):
+    mod_options = {'members': members_option, 'undoc-members': directives.flag,
+                   'noindex': directives.flag, 'inherited-members': directives.flag,
+                   'show-inheritance': directives.flag, 'synopsis': lambda x: x,
+                   'platform': lambda x: x, 'deprecated': directives.flag}
+    cls_options = {'members': members_option, 'undoc-members': directives.flag,
+                   'noindex': directives.flag, 'inherited-members': directives.flag,
+                   'show-inheritance': directives.flag}
+    app.add_directive('automodule', automodule_directive,
+                      1, (1, 0, 1), **mod_options)
+    app.add_directive('autoclass', autoclass_directive,
+                      1, (1, 0, 1), **cls_options)
+    app.add_directive('autoexception', autoclass_directive,
+                      1, (1, 0, 1), **cls_options)
+    app.add_directive('autofunction', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    app.add_directive('automethod', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    app.add_directive('autoattribute', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    # deprecated: remove in some future version.
+    app.add_config_value('automodule_skip_lines', 0, True)
+    app.add_config_value('autoclass_content', 'class', True)
+    app.add_event('autodoc-process-docstring')
+    app.add_event('autodoc-process-signature')
+    app.add_event('autodoc-skip-member')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.coverage
+    ~~~~~~~~~~~~~~~~~~~
+
+    Check Python modules and C API for coverage.  Mostly written by Josip
+    Dzolonga for the Google Highly Open Participation contest.
+
+    :copyright: 2008 by Josip Dzolonga, Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import glob
+import inspect
+import cPickle as pickle
+from os import path
+
+from sphinx.builder import Builder
+
+
+# utility
+def write_header(f, text, char='-'):
+    f.write(text + '\n')
+    f.write(char * len(text) + '\n')
+
+def compile_regex_list(name, exps, warnfunc):
+    lst = []
+    for exp in exps:
+        try:
+            lst.append(re.compile(exp))
+        except Exception:
+            warnfunc('invalid regex %r in %s' % (exp, name))
+    return lst
+
+
+class CoverageBuilder(Builder):
+
+    name = 'coverage'
+
+    def init(self):
+        self.c_sourcefiles = []
+        for pattern in self.config.coverage_c_path:
+            pattern = path.join(self.srcdir, pattern)
+            self.c_sourcefiles.extend(glob.glob(pattern))
+
+        self.c_regexes = []
+        for (name, exp) in self.config.coverage_c_regexes.items():
+            try:
+                self.c_regexes.append((name, re.compile(exp)))
+            except Exception:
+                self.warn('invalid regex %r in coverage_c_regexes' % exp)
+
+        self.c_ignorexps = {}
+        for (name, exps) in self.config.coverage_ignore_c_items.iteritems():
+            self.c_ignorexps[name] = compile_regex_list('coverage_ignore_c_items',
+                                                        exps, self.warn)
+        self.mod_ignorexps = compile_regex_list('coverage_ignore_modules',
+                                                self.config.coverage_ignore_modules,
+                                                self.warn)
+        self.cls_ignorexps = compile_regex_list('coverage_ignore_classes',
+                                                self.config.coverage_ignore_classes,
+                                                self.warn)
+        self.fun_ignorexps = compile_regex_list('coverage_ignore_functions',
+                                                self.config.coverage_ignore_functions,
+                                                self.warn)
+
+    def get_outdated_docs(self):
+        return 'coverage overview'
+
+    def write(self, *ignored):
+        self.py_undoc = {}
+        self.build_py_coverage()
+        self.write_py_coverage()
+
+        self.c_undoc = {}
+        self.build_c_coverage()
+        self.write_c_coverage()
+
+    def build_c_coverage(self):
+        # Fetch all the info from the header files
+        for filename in self.c_sourcefiles:
+            undoc = []
+            f = open(filename, 'r')
+            try:
+                for line in f:
+                    for key, regex in self.c_regexes:
+                        match = regex.match(line)
+                        if match:
+                            name = match.groups()[0]
+                            if name not in self.env.descrefs:
+                                for exp in self.c_ignorexps.get(key, ()):
+                                    if exp.match(name):
+                                        break
+                                else:
+                                    undoc.append((key, name))
+                            continue
+            finally:
+                f.close()
+            if undoc:
+                self.c_undoc[filename] = undoc
+
+    def write_c_coverage(self):
+        output_file = path.join(self.outdir, 'c.txt')
+        op = open(output_file, 'w')
+        try:
+            write_header(op, 'Undocumented C API elements', '=')
+            op.write('\n')
+
+            for filename, undoc in self.c_undoc.iteritems():
+                write_header(op, filename)
+                for typ, name in undoc:
+                    op.write(' * %-50s [%9s]\n' % (name, typ))
+                op.write('\n')
+        finally:
+            op.close()
+
+    def build_py_coverage(self):
+        for mod_name in self.env.modules:
+            ignore = False
+            for exp in self.mod_ignorexps:
+                if exp.match(mod_name):
+                    ignore = True
+                    break
+            if ignore:
+                continue
+
+            try:
+                mod = __import__(mod_name, fromlist=['foo'])
+            except ImportError, err:
+                self.warn('module %s could not be imported: %s' % (mod_name, err))
+                self.py_undoc[mod_name] = {'error': err}
+                continue
+
+            funcs = []
+            classes = {}
+
+            for name, obj in inspect.getmembers(mod):
+                # diverse module attributes are ignored:
+                if name[0] == '_':
+                    # begins in an underscore
+                    continue
+                if not hasattr(obj, '__module__'):
+                    # cannot be attributed to a module
+                    continue
+                if obj.__module__ != mod_name:
+                    # is not defined in this module
+                    continue
+
+                full_name = '%s.%s' % (mod_name, name)
+
+                if inspect.isfunction(obj):
+                    if full_name not in self.env.descrefs:
+                        for exp in self.fun_ignorexps:
+                            if exp.match(name):
+                                break
+                        else:
+                            funcs.append(name)
+                elif inspect.isclass(obj):
+                    for exp in self.cls_ignorexps:
+                        if exp.match(name):
+                            break
+                    else:
+                        if full_name not in self.env.descrefs:
+                            # not documented at all
+                            classes[name] = []
+                            continue
+
+                        attrs = []
+
+                        for attr_name, attr in inspect.getmembers(obj, inspect.ismethod):
+                            if attr_name[0] == '_':
+                                # starts with an underscore, ignore it
+                                continue
+
+                            full_attr_name = '%s.%s' % (full_name, attr_name)
+                            if full_attr_name not in self.env.descrefs:
+                                attrs.append(attr_name)
+
+                        if attrs:
+                            # some attributes are undocumented
+                            classes[name] = attrs
+
+            self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes}
+
+    def write_py_coverage(self):
+        output_file = path.join(self.outdir, 'python.txt')
+        op = open(output_file, 'w')
+        failed = []
+        try:
+            write_header(op, 'Undocumented Python objects', '=')
+
+            keys = self.py_undoc.keys()
+            keys.sort()
+            for name in keys:
+                undoc = self.py_undoc[name]
+                if 'error' in undoc:
+                    failed.append((name, undoc['error']))
+                else:
+                    if not undoc['classes'] and not undoc['funcs']:
+                        continue
+
+                    write_header(op, name)
+                    if undoc['funcs']:
+                        op.write('Functions:\n')
+                        op.writelines(' * %s\n' % x for x in undoc['funcs'])
+                        op.write('\n')
+                    if undoc['classes']:
+                        op.write('Classes:\n')
+                        for name, methods in undoc['classes'].iteritems():
+                            if not methods:
+                                op.write(' * %s\n' % name)
+                            else:
+                                op.write(' * %s -- missing methods:\n' % name)
+                                op.writelines('   - %s\n' % x for x in methods)
+                        op.write('\n')
+
+            if failed:
+                write_header(op, 'Modules that failed to import')
+                op.writelines(' * %s -- %s\n' % x for x in failed)
+        finally:
+            op.close()
+
+    def finish(self):
+        # dump the coverage data to a pickle file too
+        picklepath = path.join(self.outdir, 'undoc.pickle')
+        dumpfile = open(picklepath, 'wb')
+        try:
+            pickle.dump((self.py_undoc, self.c_undoc), dumpfile)
+        finally:
+            dumpfile.close()
+
+
+def setup(app):
+    app.add_builder(CoverageBuilder)
+    app.add_config_value('coverage_ignore_modules', [], False)
+    app.add_config_value('coverage_ignore_functions', [], False)
+    app.add_config_value('coverage_ignore_classes', [], False)
+    app.add_config_value('coverage_c_path', [], False)
+    app.add_config_value('coverage_c_regexes', {}, False)
+    app.add_config_value('coverage_ignore_c_items', {}, False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,337 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.doctest
+    ~~~~~~~~~~~~~~~~~~
+
+    Mimic doctest by automatically executing code snippets and checking
+    their results.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import sys
+import time
+import codecs
+import StringIO
+from os import path
+# circumvent relative import
+doctest = __import__('doctest')
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx.builder import Builder
+from sphinx.util.console import bold
+
+blankline_re = re.compile(r'^\s*<BLANKLINE>', re.MULTILINE)
+doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE)
+
+# set up the necessary directives
+
+def test_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    # use ordinary docutils nodes for test code: they get special attributes
+    # so that our builder recognizes them, and the other builders are happy.
+    code = '\n'.join(content)
+    test = None
+    if name == 'doctest':
+        if '<BLANKLINE>' in code:
+            # convert <BLANKLINE>s to ordinary blank lines for presentation
+            test = code
+            code = blankline_re.sub('', code)
+        if doctestopt_re.search(code):
+            if not test:
+                test = code
+            code = doctestopt_re.sub('', code)
+    nodetype = nodes.literal_block
+    if name == 'testsetup' or 'hide' in options:
+        nodetype = nodes.comment
+    if arguments:
+        groups = [x.strip() for x in arguments[0].split(',')]
+    else:
+        groups = ['default']
+    node = nodetype(code, code, testnodetype=name, groups=groups)
+    node.line = lineno
+    if test is not None:
+        # only save if it differs from code
+        node['test'] = test
+    if name == 'testoutput':
+        # don't try to highlight output
+        node['language'] = 'none'
+    node['options'] = {}
+    if name in ('doctest', 'testoutput') and 'options' in options:
+        # parse doctest-like output comparison flags
+        option_strings = options['options'].replace(',', ' ').split()
+        for option in option_strings:
+            if (option[0] not in '+-' or option[1:] not in
+                doctest.OPTIONFLAGS_BY_NAME):
+                # XXX warn?
+                continue
+            flag = doctest.OPTIONFLAGS_BY_NAME[option[1:]]
+            node['options'][flag] = (option[0] == '+')
+    return [node]
+
+# need to have individual functions for each directive due to different
+# options they accept
+
+def testsetup_directive(*args):
+    return test_directive(*args)
+
+def doctest_directive(*args):
+    return test_directive(*args)
+
+def testcode_directive(*args):
+    return test_directive(*args)
+
+def testoutput_directive(*args):
+    return test_directive(*args)
+
+
+parser = doctest.DocTestParser()
+
+# helper classes
+
+class TestGroup(object):
+    def __init__(self, name):
+        self.name = name
+        self.setup = []
+        self.tests = []
+
+    def add_code(self, code):
+        if code.type == 'testsetup':
+            self.setup.append(code)
+        elif code.type == 'doctest':
+            self.tests.append([code])
+        elif code.type == 'testcode':
+            self.tests.append([code, None])
+        elif code.type == 'testoutput':
+            if self.tests and len(self.tests[-1]) == 2:
+                self.tests[-1][1] = code
+        else:
+            raise RuntimeError('invalid TestCode type')
+
+    def __repr__(self):
+        return 'TestGroup(name=%r, setup=%r, tests=%r)' % (
+            self.name, self.setup, self.tests)
+
+
+class TestCode(object):
+    def __init__(self, code, type, lineno, options=None):
+        self.code = code
+        self.type = type
+        self.lineno = lineno
+        self.options = options or {}
+
+    def __repr__(self):
+        return 'TestCode(%r, %r, %r, options=%r)' % (
+            self.code, self.type, self.lineno, self.options)
+
+
+class SphinxDocTestRunner(doctest.DocTestRunner):
+    def summarize(self, out, verbose=None):
+        io = StringIO.StringIO()
+        old_stdout = sys.stdout
+        sys.stdout = io
+        try:
+            res = doctest.DocTestRunner.summarize(self, verbose)
+        finally:
+            sys.stdout = old_stdout
+        out(io.getvalue())
+        return res
+
+# the new builder -- use sphinx-build.py -b doctest to run
+
+class DocTestBuilder(Builder):
+    """
+    Runs test snippets in the documentation.
+    """
+    name = 'doctest'
+
+    def init(self):
+        # default options
+        self.opt = doctest.DONT_ACCEPT_TRUE_FOR_1 | doctest.ELLIPSIS | \
+                   doctest.IGNORE_EXCEPTION_DETAIL
+
+        # HACK HACK HACK
+        # doctest compiles its snippets with type 'single'. That is nice
+        # for doctest examples but unusable for multi-statement code such
+        # as setup code -- to be able to use doctest error reporting with
+        # that code nevertheless, we monkey-patch the "compile" it uses.
+        doctest.compile = self.compile
+
+        self.type = 'single'
+
+        self.total_failures = 0
+        self.total_tries = 0
+        self.setup_failures = 0
+        self.setup_tries = 0
+
+        date = time.strftime('%Y-%m-%d %H:%M:%S')
+
+        self.outfile = codecs.open(path.join(self.outdir, 'output.txt'),
+                                   'w', encoding='utf-8')
+        self.outfile.write('''\
+Results of doctest builder run on %s
+==================================%s
+''' % (date, '='*len(date)))
+
+    def _out(self, text):
+        self.info(text, nonl=True)
+        self.outfile.write(text)
+
+    def _warn_out(self, text):
+        self.info(text, nonl=True)
+        if self.app.quiet:
+            self.warn(text)
+        self.outfile.write(text)
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def get_outdated_docs(self):
+        return self.env.found_docs
+
+    def finish(self):
+        # write executive summary
+        def s(v):
+            return v != 1 and 's' or ''
+        self._out('''
+Doctest summary
+===============
+%5d test%s
+%5d failure%s in tests
+%5d failure%s in setup code
+''' % (self.total_tries, s(self.total_tries),
+       self.total_failures, s(self.total_failures),
+       self.setup_failures, s(self.setup_failures)))
+        self.outfile.close()
+
+        if self.total_failures or self.setup_failures:
+            self.app.statuscode = 1
+
+        sys.path[0:0] = self.config.doctest_path
+
+    def write(self, build_docnames, updated_docnames, method='update'):
+        if build_docnames is None:
+            build_docnames = sorted(self.env.all_docs)
+
+        self.info(bold('running tests...'))
+        for docname in build_docnames:
+            # no need to resolve the doctree
+            doctree = self.env.get_doctree(docname)
+            self.test_doc(docname, doctree)
+
+    def test_doc(self, docname, doctree):
+        groups = {}
+        add_to_all_groups = []
+        self.setup_runner = SphinxDocTestRunner(verbose=False,
+                                                optionflags=self.opt)
+        self.test_runner = SphinxDocTestRunner(verbose=False,
+                                               optionflags=self.opt)
+        if self.config.doctest_test_doctest_blocks:
+            def condition(node):
+                return (isinstance(node, (nodes.literal_block, nodes.comment))
+                        and node.has_key('testnodetype')) or \
+                       isinstance(node, nodes.doctest_block)
+        else:
+            def condition(node):
+                return isinstance(node, (nodes.literal_block, nodes.comment)) \
+                        and node.has_key('testnodetype')
+        for node in doctree.traverse(condition):
+            source = node.has_key('test') and node['test'] or node.astext()
+            if not source:
+                self.warn('no code/output in %s block at %s:%s' %
+                          (node.get('testnodetype', 'doctest'),
+                           self.env.doc2path(docname), node.line))
+            code = TestCode(source, type=node.get('testnodetype', 'doctest'),
+                            lineno=node.line, options=node.get('options'))
+            node_groups = node.get('groups', ['default'])
+            if '*' in node_groups:
+                add_to_all_groups.append(code)
+                continue
+            for groupname in node_groups:
+                if groupname not in groups:
+                    groups[groupname] = TestGroup(groupname)
+                groups[groupname].add_code(code)
+        for code in add_to_all_groups:
+            for group in groups.itervalues():
+                group.add_code(code)
+        if not groups:
+            return
+
+        self._out('\nDocument: %s\n----------%s\n' % (docname, '-'*len(docname)))
+        for group in groups.itervalues():
+            self.test_group(group, self.env.doc2path(docname, base=None))
+        # Separately count results from setup code
+        res_f, res_t = self.setup_runner.summarize(self._out, verbose=False)
+        self.setup_failures += res_f
+        self.setup_tries += res_t
+        if self.test_runner.tries:
+            res_f, res_t = self.test_runner.summarize(self._out, verbose=True)
+            self.total_failures += res_f
+            self.total_tries += res_t
+
+    def compile(self, code, name, type, flags, dont_inherit):
+        return compile(code, name, self.type, flags, dont_inherit)
+
+    def test_group(self, group, filename):
+        ns = {}
+        examples = []
+        for setup in group.setup:
+            examples.append(doctest.Example(setup.code, '', lineno=setup.lineno))
+        if examples:
+            # simulate a doctest with the setup code
+            setup_doctest = doctest.DocTest(examples, {},
+                                            '%s (setup code)' % group.name,
+                                            filename, 0, None)
+            setup_doctest.globs = ns
+            old_f = self.setup_runner.failures
+            self.type = 'exec' # the snippet may contain multiple statements
+            self.setup_runner.run(setup_doctest, out=self._warn_out,
+                                  clear_globs=False)
+            if self.setup_runner.failures > old_f:
+                # don't run the group
+                return
+        for code in group.tests:
+            if len(code) == 1:
+                test = parser.get_doctest(code[0].code, {},
+                                          group.name, filename, code[0].lineno)
+                if not test.examples:
+                    continue
+                for example in test.examples:
+                    # apply directive's comparison options
+                    new_opt = code[0].options.copy()
+                    new_opt.update(example.options)
+                    example.options = new_opt
+                self.type = 'single' # ordinary doctests
+            else:
+                output = code[1] and code[1].code or ''
+                options = code[1] and code[1].options or {}
+                # disable <BLANKLINE> processing as it is not needed
+                options[doctest.DONT_ACCEPT_BLANKLINE] = True
+                example = doctest.Example(code[0].code, output,
+                                          lineno=code[0].lineno,
+                                          options=options)
+                test = doctest.DocTest([example], {}, group.name,
+                                       filename, code[0].lineno, None)
+                self.type = 'exec' # multiple statements again
+            # DocTest.__init__ copies the globs namespace, which we don't want
+            test.globs = ns
+            # also don't clear the globs namespace after running the doctest
+            self.test_runner.run(test, out=self._warn_out, clear_globs=False)
+
+
+def setup(app):
+    app.add_directive('testsetup', testsetup_directive, 1, (0, 1, 1))
+    app.add_directive('doctest', doctest_directive, 1, (0, 1, 1),
+                      hide=directives.flag, options=directives.unchanged)
+    app.add_directive('testcode', testcode_directive, 1, (0, 1, 1),
+                      hide=directives.flag)
+    app.add_directive('testoutput', testoutput_directive, 1, (0, 1, 1),
+                      hide=directives.flag, options=directives.unchanged)
+    app.add_builder(DocTestBuilder)
+    # this config value adds to sys.path
+    app.add_config_value('doctest_path', [], False)
+    app.add_config_value('doctest_test_doctest_blocks', 'default', False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.ifconfig
+    ~~~~~~~~~~~~~~~~~~~
+
+    Provides the ``ifconfig`` directive that allows to write documentation
+    that is included depending on configuration variables.
+
+    Usage::
+
+        .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
+
+           This stuff is only included in the built docs for unstable versions.
+
+    The argument for ``ifconfig`` is a plain Python expression, evaluated in the
+    namespace of the project configuration (that is, all variables from ``conf.py``
+    are available.)
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+
+class ifconfig(nodes.Element): pass
+
+
+def ifconfig_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    node = ifconfig()
+    node.line = lineno
+    node['expr'] = arguments[0]
+    state.nested_parse(content, content_offset, node)
+    return [node]
+
+
+def process_ifconfig_nodes(app, doctree, docname):
+    ns = app.config.__dict__.copy()
+    ns['builder'] = app.builder.name
+    for node in doctree.traverse(ifconfig):
+        try:
+            res = eval(node['expr'], ns)
+        except Exception, err:
+            # handle exceptions in a clean fashion
+            from traceback import format_exception_only
+            msg = ''.join(format_exception_only(err.__class__, err))
+            newnode = doctree.reporter.error('Exception occured in '
+                                             'ifconfig expression: \n%s' %
+                                             msg, base_node=node)
+            node.replace_self(newnode)
+        else:
+            if not res:
+                node.replace_self([])
+            else:
+                node.replace_self(node.children)
+
+
+def setup(app):
+    app.add_node(ifconfig)
+    app.add_directive('ifconfig', ifconfig_directive, 1, (1, 0, 1))
+    app.connect('doctree-resolved', process_ifconfig_nodes)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.intersphinx
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Insert links to Python objects documented in remote Sphinx documentation.
+
+    This works as follows:
+
+    * Each Sphinx HTML build creates a file named "objects.inv" that contains
+      a mapping from Python identifiers to URIs relative to the HTML set's root.
+
+    * Projects using the Intersphinx extension can specify links to such mapping
+      files in the `intersphinx_mapping` config value.  The mapping will then be
+      used to resolve otherwise missing references to Python objects into links
+      to the other documentation.
+
+    * By default, the mapping file is assumed to be at the same location as the
+      rest of the documentation; however, the location of the mapping file can
+      also be specified individually, e.g. if the docs should be buildable
+      without Internet access.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import time
+import urllib
+import posixpath
+from os import path
+
+from docutils import nodes
+
+from sphinx.builder import INVENTORY_FILENAME
+
+
+def fetch_inventory(app, uri, inv):
+    """Fetch, parse and return an intersphinx inventory file."""
+    invdata = {}
+    # both *uri* (base URI of the links to generate) and *inv* (actual
+    # location of the inventory file) can be local or remote URIs
+    localuri = uri.find('://') == -1
+    try:
+        if inv.find('://') != -1:
+            f = urllib.urlopen(inv)
+        else:
+            f = open(path.join(app.srcdir, inv))
+    except Exception, err:
+        app.warn('intersphinx inventory %r not fetchable due to '
+                 '%s: %s' % (inv, err.__class__, err))
+        return
+    try:
+        line = f.next()
+        if line.rstrip() != '# Sphinx inventory version 1':
+            raise ValueError('unknown or unsupported inventory version')
+        line = f.next()
+        projname = line.rstrip()[11:].decode('utf-8')
+        line = f.next()
+        version = line.rstrip()[11:]
+        for line in f:
+            name, type, location = line.rstrip().split(None, 2)
+            if localuri:
+                location = path.join(uri, location)
+            else:
+                location = posixpath.join(uri, location)
+            invdata[name] = (type, projname, version, location)
+        f.close()
+    except Exception, err:
+        app.warn('intersphinx inventory %r not readable due to '
+                 '%s: %s' % (inv, err.__class__, err))
+    else:
+        return invdata
+
+
+def load_mappings(app):
+    """Load all intersphinx mappings into the environment."""
+    now = int(time.time())
+    cache_time = now - app.config.intersphinx_cache_limit * 86400
+    env = app.builder.env
+    if not hasattr(env, 'intersphinx_cache'):
+        env.intersphinx_cache = {}
+    cache = env.intersphinx_cache
+    update = False
+    for uri, inv in app.config.intersphinx_mapping.iteritems():
+        # we can safely assume that the uri<->inv mapping is not changed
+        # during partial rebuilds since a changed intersphinx_mapping
+        # setting will cause a full environment reread
+        if not inv:
+            inv = posixpath.join(uri, INVENTORY_FILENAME)
+        # decide whether the inventory must be read: always read local
+        # files; remote ones only if the cache time is expired
+        if '://' not in inv or uri not in cache \
+               or cache[uri][0] < cache_time:
+            invdata = fetch_inventory(app, uri, inv)
+            cache[uri] = (now, invdata)
+            update = True
+    if update:
+        env.intersphinx_inventory = {}
+        for _, invdata in cache.itervalues():
+            if invdata:
+                env.intersphinx_inventory.update(invdata)
+
+
+def missing_reference(app, env, node, contnode):
+    """Attempt to resolve a missing reference via intersphinx references."""
+    type = node['reftype']
+    target = node['reftarget']
+    if type == 'mod':
+        type, proj, version, uri = env.intersphinx_inventory.get(target,
+                                                                 ('','','',''))
+        if type != 'mod':
+            return None
+        target = 'module-' + target   # for link anchor
+    else:
+        if target[-2:] == '()':
+            target = target[:-2]
+        target = target.rstrip(' *')
+        # special case: exceptions and object methods
+        if type == 'exc' and '.' not in target and \
+           'exceptions.' + target in env.intersphinx_inventory:
+            target = 'exceptions.' + target
+        elif type in ('func', 'meth') and '.' not in target and \
+           'object.' + target in env.intersphinx_inventory:
+            target = 'object.' + target
+        if target not in env.intersphinx_inventory:
+            return None
+        type, proj, version, uri = env.intersphinx_inventory[target]
+    print "Intersphinx hit:", target, uri
+    newnode = nodes.reference('', '')
+    newnode['refuri'] = uri + '#' + target
+    newnode['reftitle'] = '(in %s v%s)' % (proj, version)
+    newnode['class'] = 'external-xref'
+    newnode.append(contnode)
+    return newnode
+
+
+def setup(app):
+    app.add_config_value('intersphinx_mapping', {}, True)
+    app.add_config_value('intersphinx_cache_limit', 5, False)
+    app.connect('missing-reference', missing_reference)
+    app.connect('builder-inited', load_mappings)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.jsmath
+    ~~~~~~~~~~~~~~~~~
+
+    Set up everything for use of JSMath to display math in HTML
+    via JavaScript.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+from sphinx.application import ExtensionError
+from sphinx.ext.mathbase import setup as mathbase_setup
+
+
+def html_visit_math(self, node):
+    self.body.append(self.starttag(node, 'span', '', CLASS='math'))
+    self.body.append(self.encode(node['latex']) + '</span>')
+    raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+    if node['nowrap']:
+        self.body.append(self.starttag(node, 'div', CLASS='math'))
+        self.body.append(node['latex'])
+        self.body.append('</div>')
+        raise nodes.SkipNode
+    for i, part in enumerate(node['latex'].split('\n\n')):
+        part = self.encode(part)
+        if i == 0:
+            # necessary to e.g. set the id property correctly
+            if node['number']:
+                self.body.append('<span class="eqno">(%s)</span>' % node['number'])
+            self.body.append(self.starttag(node, 'div', CLASS='math'))
+        else:
+            # but only once!
+            self.body.append('<div class="math">')
+        if '&' in part or '\\\\' in part:
+            self.body.append('\\begin{split}' + part + '\\end{split}')
+        else:
+            self.body.append(part)
+        self.body.append('</div>\n')
+    raise nodes.SkipNode
+
+def builder_inited(app):
+    if not app.config.jsmath_path:
+        raise ExtensionError('jsmath_path config value must be set for the '
+                             'jsmath extension to work')
+    app.add_javascript(app.config.jsmath_path)
+
+
+def setup(app):
+    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+    app.add_config_value('jsmath_path', '', False)
+    app.connect('builder-inited', builder_inited)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.mathbase
+    ~~~~~~~~~~~~~~~~~~~
+
+    Set up math support in source files and LaTeX/text output.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+
+
+class math(nodes.Inline, nodes.TextElement):
+    pass
+
+class displaymath(nodes.Part, nodes.Element):
+    pass
+
+class eqref(nodes.Inline, nodes.TextElement):
+    pass
+
+
+def wrap_displaymath(math, label):
+    parts = math.split('\n\n')
+    ret = []
+    for i, part in enumerate(parts):
+        if label is not None and i == 0:
+            ret.append('\\begin{split}%s\\end{split}' % part +
+                       (label and '\\label{'+label+'}' or ''))
+        else:
+            ret.append('\\begin{split}%s\\end{split}\\notag' % part)
+    return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}'
+
+
+def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    latex = utils.unescape(text, restore_backslashes=True)
+    return [math(latex=latex)], []
+
+def eq_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    node = eqref('(?)', '(?)', target=text)
+    node['docname'] = inliner.document.settings.env.docname
+    return [node], []
+
+def math_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    latex = '\n'.join(content)
+    if arguments and arguments[0]:
+        latex = arguments[0] + '\n\n' + latex
+    node = displaymath()
+    node['latex'] = latex
+    node['label'] = options.get('label', None)
+    node['nowrap'] = 'nowrap' in options
+    node['docname'] = state.document.settings.env.docname
+    ret = [node]
+    if node['label']:
+        tnode = nodes.target('', '', ids=['equation-' + node['label']])
+        state.document.note_explicit_target(tnode)
+        ret.insert(0, tnode)
+    return ret
+
+
+def latex_visit_math(self, node):
+    self.body.append('$' + node['latex'] + '$')
+    raise nodes.SkipNode
+
+def latex_visit_displaymath(self, node):
+    if node['nowrap']:
+        self.body.append(node['latex'])
+    else:
+        label = node['label'] and node['docname'] + '-' + node['label'] or None
+        self.body.append(wrap_displaymath(node['latex'], label))
+    raise nodes.SkipNode
+
+def latex_visit_eqref(self, node):
+    self.body.append('\\eqref{%s-%s}' % (node['docname'], node['target']))
+    raise nodes.SkipNode
+
+
+def text_visit_math(self, node):
+    self.add_text(node['latex'])
+    raise nodes.SkipNode
+
+def text_visit_displaymath(self, node):
+    self.new_state()
+    self.add_text(node['latex'])
+    self.end_state()
+    raise nodes.SkipNode
+
+def text_visit_eqref(self, node):
+    self.add_text(node['target'])
+    raise nodes.SkipNode
+
+
+def html_visit_eqref(self, node):
+    self.body.append('<a href="#equation-%s">' % node['target'])
+
+def html_depart_eqref(self, node):
+    self.body.append('</a>')
+
+
+def number_equations(app, doctree, docname):
+    num = 0
+    numbers = {}
+    for node in doctree.traverse(displaymath):
+        if node['label'] is not None:
+            num += 1
+            node['number'] = num
+            numbers[node['label']] = num
+        else:
+            node['number'] = None
+    for node in doctree.traverse(eqref):
+        if node['target'] not in numbers:
+            continue
+        num = '(%d)' % numbers[node['target']]
+        node[0] = nodes.Text(num, num)
+
+
+def setup(app, htmlinlinevisitors, htmldisplayvisitors):
+    app.add_node(math,
+                 latex=(latex_visit_math, None),
+                 text=(text_visit_math, None),
+                 html=htmlinlinevisitors)
+    app.add_node(displaymath,
+                 latex=(latex_visit_displaymath, None),
+                 text=(text_visit_displaymath, None),
+                 html=htmldisplayvisitors)
+    app.add_node(eqref,
+                 latex=(latex_visit_eqref, None),
+                 text=(text_visit_eqref, None),
+                 html=(html_visit_eqref, html_depart_eqref))
+    app.add_role('math', math_role)
+    app.add_role('eq', eq_role)
+    app.add_directive('math', math_directive, 1, (0, 1, 1),
+                      label=directives.unchanged, nowrap=directives.flag)
+    app.connect('doctree-resolved', number_equations)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.pngmath
+    ~~~~~~~~~~~~~~~~~~
+
+    Render math in HTML via dvipng.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import shutil
+import tempfile
+import posixpath
+from os import path, getcwd, chdir
+from subprocess import Popen, PIPE
+try:
+    from hashlib import sha1 as sha
+except ImportError:
+    from sha import sha
+
+from docutils import nodes
+
+from sphinx.util import ensuredir
+from sphinx.util.png import read_png_depth, write_png_depth
+from sphinx.application import SphinxError
+from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath
+
+class MathExtError(SphinxError):
+    category = 'Math extension error'
+
+
+DOC_HEAD = r'''
+\documentclass[12pt]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage{amssymb}
+\usepackage{amsfonts}
+\usepackage{bm}
+\pagestyle{empty}
+'''
+
+DOC_BODY = r'''
+\begin{document}
+%s
+\end{document}
+'''
+
+DOC_BODY_PREVIEW = r'''
+\usepackage[active]{preview}
+\begin{document}
+\begin{preview}
+%s
+\end{preview}
+\end{document}
+'''
+
+depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]')
+
+def render_math(self, math):
+    """
+    Render the LaTeX math expression *math* using latex and dvipng.
+
+    Return the filename relative to the built document and the "depth",
+    that is, the distance of image bottom and baseline in pixels, if the
+    option to use preview_latex is switched on.
+
+    Error handling may seem strange, but follows a pattern: if LaTeX or
+    dvipng aren't available, only a warning is generated (since that enables
+    people on machines without these programs to at least build the rest
+    of the docs successfully).  If the programs are there, however, they
+    may not fail since that indicates a problem in the math source.
+    """
+    use_preview = self.builder.config.pngmath_use_preview
+
+    shasum = "%s.png" % sha(math.encode('utf-8')).hexdigest()
+    relfn = posixpath.join(self.builder.imgpath, 'math', shasum)
+    outfn = path.join(self.builder.outdir, '_images', 'math', shasum)
+    if path.isfile(outfn):
+        depth = read_png_depth(outfn)
+        return relfn, depth
+
+    latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
+    latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
+    if isinstance(latex, unicode):
+        latex = latex.encode('utf-8')
+
+    # use only one tempdir per build -- the use of a directory is cleaner
+    # than using temporary files, since we can clean up everything at once
+    # just removing the whole directory (see cleanup_tempdir)
+    if not hasattr(self.builder, '_mathpng_tempdir'):
+        tempdir = self.builder._mathpng_tempdir = tempfile.mkdtemp()
+    else:
+        tempdir = self.builder._mathpng_tempdir
+
+    tf = open(path.join(tempdir, 'math.tex'), 'w')
+    tf.write(latex)
+    tf.close()
+
+    # build latex command; old versions of latex don't have the
+    # --output-directory option, so we have to manually chdir to the
+    # temp dir to run it.
+    ltx_args = [self.builder.config.pngmath_latex, '--interaction=nonstopmode']
+    # add custom args from the config file
+    ltx_args.extend(self.builder.config.pngmath_latex_args)
+    ltx_args.append('math.tex')
+
+    curdir = getcwd()
+    chdir(tempdir)
+
+    try:
+        try:
+            p = Popen(ltx_args, stdout=PIPE, stderr=PIPE)
+        except OSError, err:
+            if err.errno != 2:   # No such file or directory
+                raise
+            if not hasattr(self.builder, '_mathpng_warned_latex'):
+                self.builder.warn('LaTeX command %r cannot be run (needed for math '
+                                  'display), check the pngmath_latex setting' %
+                                  self.builder.config.pngmath_latex)
+                self.builder._mathpng_warned_latex = True
+            return relfn, None
+    finally:
+        chdir(curdir)
+
+    stdout, stderr = p.communicate()
+    if p.returncode != 0:
+        raise MathExtError('latex exited with error:\n[stderr]\n%s\n[stdout]\n%s'
+                           % (stderr, stdout))
+
+    ensuredir(path.dirname(outfn))
+    # use some standard dvipng arguments
+    dvipng_args = [self.builder.config.pngmath_dvipng]
+    dvipng_args += ['-o', outfn, '-T', 'tight', '-z9']
+    # add custom ones from config value
+    dvipng_args.extend(self.builder.config.pngmath_dvipng_args)
+    if use_preview:
+        dvipng_args.append('--depth')
+    # last, the input file name
+    dvipng_args.append(path.join(tempdir, 'math.dvi'))
+    try:
+        p = Popen(dvipng_args, stdout=PIPE, stderr=PIPE)
+    except OSError, err:
+        if err.errno != 2:   # No such file or directory
+            raise
+        if not hasattr(self.builder, '_mathpng_warned_dvipng'):
+            self.builder.warn('dvipng command %r cannot be run (needed for math '
+                              'display), check the pngmath_dvipng setting' %
+                              self.builder.config.pngmath_dvipng)
+            self.builder._mathpng_warned_dvipng = True
+        return relfn, None
+    stdout, stderr = p.communicate()
+    if p.returncode != 0:
+        raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s'
+                           % (stderr, stdout))
+    depth = None
+    if use_preview:
+        for line in stdout.splitlines():
+            m = depth_re.match(line)
+            if m:
+                depth = int(m.group(1))
+                write_png_depth(outfn, depth)
+                break
+
+    return relfn, depth
+
+def cleanup_tempdir(app, exc):
+    if exc:
+        return
+    if not hasattr(app.builder, '_mathpng_tempdir'):
+        return
+    try:
+        shutil.rmtree(app.builder._mathpng_tempdir)
+    except Exception:
+        pass
+
+def html_visit_math(self, node):
+    try:
+        fname, depth = render_math(self, '$'+node['latex']+'$')
+    except MathExtError, exc:
+        sm = nodes.system_message(str(exc), type='WARNING', level=2,
+                                  backrefs=[], source=node['latex'])
+        sm.walkabout(self)
+        self.builder.warn('display latex %r: ' % node['latex'] + str(exc))
+        raise nodes.SkipNode
+    self.body.append('<img class="math" src="%s" alt="%s" %s/>' %
+                     (fname, self.encode(node['latex']).strip(),
+                      depth and 'style="vertical-align: %dpx" ' % (-depth) or ''))
+    raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+    if node['nowrap']:
+        latex = node['latex']
+    else:
+        latex = wrap_displaymath(node['latex'], None)
+    try:
+        fname, depth = render_math(self, latex)
+    except MathExtError, exc:
+        sm = nodes.system_message(str(exc), type='WARNING', level=2,
+                                  backrefs=[], source=node['latex'])
+        sm.walkabout(self)
+        self.builder.warn('inline latex %r: ' % node['latex'] + str(exc))
+        raise nodes.SkipNode
+    self.body.append(self.starttag(node, 'div', CLASS='math'))
+    self.body.append('<p>')
+    if node['number']:
+        self.body.append('<span class="eqno">(%s)</span>' % node['number'])
+    self.body.append('<img src="%s" alt="%s" />\n</div>' %
+                     (fname, self.encode(node['latex']).strip()))
+    self.body.append('</p>')
+    raise nodes.SkipNode
+
+
+def setup(app):
+    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+    app.add_config_value('pngmath_dvipng', 'dvipng', False)
+    app.add_config_value('pngmath_latex', 'latex', False)
+    app.add_config_value('pngmath_use_preview', False, False)
+    app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False)
+    app.add_config_value('pngmath_latex_args', [], False)
+    app.add_config_value('pngmath_latex_preamble', '', False)
+    app.connect('build-finished', cleanup_tempdir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.refcounting
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Supports reference count annotations for C API functions.  Based on
+    refcount.py and anno-api.py in the old Python documentation tools.
+
+    Usage: Set the `refcount_file` config value to the path to the reference
+    count data file.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from os import path
+from docutils import nodes
+
+from sphinx import addnodes
+
+
+# refcount annotation
+class refcount(nodes.emphasis): pass
+
+
+class RCEntry:
+    def __init__(self, name):
+        self.name = name
+        self.args = []
+        self.result_type = ''
+        self.result_refs = None
+
+
+class Refcounts(dict):
+    @classmethod
+    def fromfile(cls, filename):
+        d = cls()
+        fp = open(filename, 'r')
+        try:
+            for line in fp:
+                line = line.strip()
+                if line[:1] in ("", "#"):
+                    # blank lines and comments
+                    continue
+                parts = line.split(":", 4)
+                if len(parts) != 5:
+                    raise ValueError("Wrong field count in %r" % line)
+                function, type, arg, refcount, comment = parts
+                # Get the entry, creating it if needed:
+                try:
+                    entry = d[function]
+                except KeyError:
+                    entry = d[function] = RCEntry(function)
+                if not refcount or refcount == "null":
+                    refcount = None
+                else:
+                    refcount = int(refcount)
+                # Update the entry with the new parameter or the result information.
+                if arg:
+                    entry.args.append((arg, type, refcount))
+                else:
+                    entry.result_type = type
+                    entry.result_refs = refcount
+        finally:
+            fp.close()
+        return d
+
+    def add_refcount_annotations(self, app, doctree):
+        for node in doctree.traverse(addnodes.desc_content):
+            par = node.parent
+            if par['desctype'] != 'cfunction':
+                continue
+            if not par[0].has_key('names') or not par[0]['names']:
+                continue
+            entry = self.get(par[0]['names'][0])
+            if not entry:
+                continue
+            elif entry.result_type not in ("PyObject*", "PyVarObject*"):
+                continue
+            rc = 'Return value: '
+            if entry.result_refs is None:
+                rc += "Always NULL."
+            else:
+                rc += (entry.result_refs and "New" or "Borrowed") + " reference."
+            node.insert(0, refcount(rc, rc))
+
+
+def init_refcounts(app):
+    if app.config.refcount_file:
+        refcounts = Refcounts.fromfile(
+            path.join(app.srcdir, app.config.refcount_file))
+        app.connect('doctree-read', refcounts.add_refcount_annotations)
+
+
+def setup(app):
+    app.add_node(refcount)
+    app.add_config_value('refcount_file', '', True)
+    app.connect('builder-inited', init_refcounts)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.todo
+    ~~~~~~~~~~~~~~~
+
+    Allow todos to be inserted into your documentation.  Inclusion of todos can
+    be switched of by a configuration variable.  The todolist directive collects
+    all todos of your project and lists them along with a backlink to the
+    original location.
+
+    :copyright: 2008 Daniel Bültmann.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+from sphinx.util.compat import make_admonition
+
+class todo_node(nodes.Admonition, nodes.Element): pass
+class todolist(nodes.General, nodes.Element): pass
+
+
+def todo_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+
+    targetid = "todo-%s" % env.index_num
+    env.index_num += 1
+    targetnode = nodes.target('', '', ids=[targetid])
+
+    ad = make_admonition(todo_node, name, [_('Todo')], options, content, lineno,
+                         content_offset, block_text, state, state_machine)
+
+    # Attach a list of all todos to the environment,
+    # the todolist works with the collected todo nodes
+    if not hasattr(env, 'todo_all_todos'):
+        env.todo_all_todos = []
+    env.todo_all_todos.append({
+        'docname': env.docname,
+        'lineno': lineno,
+        'todo': ad[0].deepcopy(),
+        'target': targetnode,
+    })
+
+    return [targetnode] + ad
+
+
+def todolist_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    # Simply insert an empty todolist node which will be replaced later
+    # when process_todo_nodes is called
+    return [todolist('')]
+
+
+def process_todo_nodes(app, doctree, fromdocname):
+    if not app.config['todo_include_todos']:
+        for node in doctree.traverse(todo_node):
+            node.parent.remove(node)
+
+    # Replace all todolist nodes with a list of the collected todos.
+    # Augment each todo with a backlink to the original location.
+    env = app.builder.env
+
+    for node in doctree.traverse(todolist):
+        if not app.config['todo_include_todos']:
+            node.replace_self([])
+            continue
+
+        content = []
+
+        for todo_info in env.todo_all_todos:
+            para = nodes.paragraph()
+            filename = env.doc2path(todo_info['docname'], base=None)
+            description = (
+                _('(The original entry is located in %s, line %d and can be found ') %
+                (filename, todo_info['lineno']))
+            para += nodes.Text(description, description)
+
+            # Create a reference
+            newnode = nodes.reference('', '')
+            innernode = nodes.emphasis(_('here'), _('here'))
+            newnode['refdocname'] = todo_info['docname']
+            newnode['refuri'] = app.builder.get_relative_uri(
+                fromdocname, todo_info['docname'])
+            newnode['refuri'] += '#' + todo_info['target']['refid']
+            newnode.append(innernode)
+            para += newnode
+            para += nodes.Text('.)', '.)')
+
+            # Insert into the todolist
+            content.append(todo_info['todo'])
+            content.append(para)
+
+        node.replace_self(content)
+
+
+def purge_todos(app, env, docname):
+    if not hasattr(env, 'todo_all_todos'):
+        return
+    env.todo_all_todos = [todo for todo in env.todo_all_todos
+                          if todo['docname'] != docname]
+
+
+def visit_todo_node(self, node):
+    self.visit_admonition(node)
+
+def depart_todo_node(self, node):
+    self.depart_admonition(node)
+
+def setup(app):
+    app.add_config_value('todo_include_todos', False, False)
+
+    app.add_node(todolist)
+    app.add_node(todo_node,
+                 html=(visit_todo_node, depart_todo_node),
+                 latex=(visit_todo_node, depart_todo_node),
+                 text=(visit_todo_node, depart_todo_node))
+
+    app.add_directive('todo', todo_directive, 1, (0, 0, 1))
+    app.add_directive('todolist', todolist_directive, 0, (0, 0, 0))
+    app.connect('doctree-resolved', process_todo_nodes)
+    app.connect('env-purge-doc', purge_todos)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.highlighting
+    ~~~~~~~~~~~~~~~~~~~
+
+    Highlight code blocks using Pygments.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import cgi
+import re
+import parser
+
+from sphinx.util.texescape import tex_hl_escape_map
+
+try:
+    import pygments
+    from pygments import highlight
+    from pygments.lexers import PythonLexer, PythonConsoleLexer, CLexer, \
+         TextLexer, RstLexer
+    from pygments.lexers import get_lexer_by_name, guess_lexer
+    from pygments.formatters import HtmlFormatter, LatexFormatter
+    from pygments.filters import ErrorToken
+    from pygments.style import Style
+    from pygments.styles import get_style_by_name
+    from pygments.styles.friendly import FriendlyStyle
+    from pygments.token import Generic, Comment, Number
+except ImportError:
+    pygments = None
+else:
+    class SphinxStyle(Style):
+        """
+        Like friendly, but a bit darker to enhance contrast on the green
+        background.
+        """
+
+        background_color = '#eeffcc'
+        default_style = ''
+
+        styles = FriendlyStyle.styles
+        styles.update({
+            Generic.Output: '#333',
+            Comment: 'italic #408090',
+            Number: '#208050',
+        })
+
+    lexers = dict(
+        none = TextLexer(),
+        python = PythonLexer(),
+        pycon = PythonConsoleLexer(),
+        # the python3 option exists as of Pygments 0.12, but it doesn't
+        # do any harm in previous versions
+        pycon3 = PythonConsoleLexer(python3=True),
+        rest = RstLexer(),
+        c = CLexer(),
+    )
+    for _lexer in lexers.values():
+        _lexer.add_filter('raiseonerror')
+
+
+escape_hl_chars = {ord(u'@'): u'@PYGZat[]',
+                   ord(u'['): u'@PYGZlb[]',
+                   ord(u']'): u'@PYGZrb[]'}
+
+# used if Pygments is not available
+_LATEX_STYLES = r'''
+\newcommand\PYGZat{@}
+\newcommand\PYGZlb{[}
+\newcommand\PYGZrb{]}
+'''
+
+
+parsing_exceptions = (SyntaxError, UnicodeEncodeError)
+if sys.version_info < (2, 5):
+    # Python <= 2.4 raises MemoryError when parsing an
+    # invalid encoding cookie
+    parsing_exceptions += MemoryError,
+
+
+class PygmentsBridge(object):
+    def __init__(self, dest='html', stylename='sphinx'):
+        self.dest = dest
+        if not pygments:
+            return
+        if stylename == 'sphinx':
+            style = SphinxStyle
+        elif '.' in stylename:
+            module, stylename = stylename.rsplit('.', 1)
+            style = getattr(__import__(module, None, None, ['']), stylename)
+        else:
+            style = get_style_by_name(stylename)
+        self.hfmter = {False: HtmlFormatter(style=style),
+                       True: HtmlFormatter(style=style, linenos=True)}
+        self.lfmter = {False: LatexFormatter(style=style, commandprefix='PYG'),
+                       True: LatexFormatter(style=style, linenos=True,
+                                            commandprefix='PYG')}
+
+    def unhighlighted(self, source):
+        if self.dest == 'html':
+            return '<pre>' + cgi.escape(source) + '</pre>\n'
+        else:
+            # first, escape highlighting characters like Pygments does
+            source = source.translate(escape_hl_chars)
+            # then, escape all characters nonrepresentable in LaTeX
+            source = source.translate(tex_hl_escape_map)
+            return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \
+                   source + '\\end{Verbatim}\n'
+
+    def try_parse(self, src):
+        # Make sure it ends in a newline
+        src += '\n'
+
+        # Replace "..." by a mark which is also a valid python expression
+        # (Note, the highlighter gets the original source, this is only done
+        #  to allow "..." in code and still highlight it as Python code.)
+        mark = "__highlighting__ellipsis__"
+        src = src.replace("...", mark)
+
+        # lines beginning with "..." are probably placeholders for suite
+        src = re.sub(r"(?m)^(\s*)" + mark + "(.)", r"\1"+ mark + r"# \2", src)
+
+        # if we're using 2.5, use the with statement
+        if sys.version_info >= (2, 5):
+            src = 'from __future__ import with_statement\n' + src
+
+        if isinstance(src, unicode):
+            # Non-ASCII chars will only occur in string literals
+            # and comments.  If we wanted to give them to the parser
+            # correctly, we'd have to find out the correct source
+            # encoding.  Since it may not even be given in a snippet,
+            # just replace all non-ASCII characters.
+            src = src.encode('ascii', 'replace')
+
+        try:
+            parser.suite(src)
+        except parsing_exceptions:
+            return False
+        else:
+            return True
+
+    def highlight_block(self, source, lang, linenos=False):
+        if not pygments:
+            return self.unhighlighted(source)
+        if lang in ('py', 'python'):
+            if source.startswith('>>>'):
+                # interactive session
+                lexer = lexers['pycon']
+            else:
+                # maybe Python -- try parsing it
+                if self.try_parse(source):
+                    lexer = lexers['python']
+                else:
+                    return self.unhighlighted(source)
+        elif lang in ('python3', 'py3') and source.startswith('>>>'):
+            # for py3, recognize interactive sessions, but do not try parsing...
+            lexer = lexers['pycon3']
+        elif lang == 'guess':
+            try:
+                lexer = guess_lexer(source)
+            except Exception:
+                return self.unhighlighted(source)
+        else:
+            if lang in lexers:
+                lexer = lexers[lang]
+            else:
+                lexer = lexers[lang] = get_lexer_by_name(lang)
+                lexer.add_filter('raiseonerror')
+        try:
+            if self.dest == 'html':
+                return highlight(source, lexer, self.hfmter[bool(linenos)])
+            else:
+                hlsource = highlight(source, lexer, self.lfmter[bool(linenos)])
+                return hlsource.translate(tex_hl_escape_map)
+        except ErrorToken:
+            # this is most probably not the selected language,
+            # so let it pass unhighlighted
+            return self.unhighlighted(source)
+
+    def get_stylesheet(self):
+        if not pygments:
+            if self.dest == 'latex':
+                return _LATEX_STYLES
+            # no HTML styles needed
+            return ''
+        if self.dest == 'html':
+            return self.hfmter[0].get_style_defs()
+        else:
+            styledefs = self.lfmter[0].get_style_defs()
+            # workaround for Pygments < 0.12
+            if styledefs.startswith('\\newcommand\\at{@}'):
+                styledefs += _LATEX_STYLES
+            return styledefs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,220 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.htmlhelp
+    ~~~~~~~~~~~~~~~
+
+    Build HTML help support files.
+    Adapted from the original Doc/tools/prechm.py.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import cgi
+from os import path
+
+from docutils import nodes
+
+from sphinx import addnodes
+
+# Project file (*.hhp) template.  'outname' is the file basename (like
+# the pythlp in pythlp.hhp); 'version' is the doc version number (like
+# the 2.2 in Python 2.2).
+# The magical numbers in the long line under [WINDOWS] set most of the
+# user-visible features (visible buttons, tabs, etc).
+# About 0x10384e:  This defines the buttons in the help viewer.  The
+# following defns are taken from htmlhelp.h.  Not all possibilities
+# actually work, and not all those that work are available from the Help
+# Workshop GUI.  In particular, the Zoom/Font button works and is not
+# available from the GUI.  The ones we're using are marked with 'x':
+#
+#    0x000002   Hide/Show   x
+#    0x000004   Back        x
+#    0x000008   Forward     x
+#    0x000010   Stop
+#    0x000020   Refresh
+#    0x000040   Home        x
+#    0x000080   Forward
+#    0x000100   Back
+#    0x000200   Notes
+#    0x000400   Contents
+#    0x000800   Locate      x
+#    0x001000   Options     x
+#    0x002000   Print       x
+#    0x004000   Index
+#    0x008000   Search
+#    0x010000   History
+#    0x020000   Favorites
+#    0x040000   Jump 1
+#    0x080000   Jump 2
+#    0x100000   Zoom/Font   x
+#    0x200000   TOC Next
+#    0x400000   TOC Prev
+
+project_template = '''\
+[OPTIONS]
+Binary TOC=Yes
+Binary Index=No
+Compiled file=%(outname)s.chm
+Contents file=%(outname)s.hhc
+Default Window=%(outname)s
+Default topic=index.html
+Display compile progress=No
+Full text search stop list file=%(outname)s.stp
+Full-text search=Yes
+Index file=%(outname)s.hhk
+Language=0x409
+Title=%(title)s
+
+[WINDOWS]
+%(outname)s="%(title)s","%(outname)s.hhc","%(outname)s.hhk",\
+"index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0
+
+[FILES]
+'''
+
+contents_header = '''\
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<HTML>
+<HEAD>
+<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
+<!-- Sitemap 1.0 -->
+</HEAD><BODY>
+<OBJECT type="text/site properties">
+        <param name="Window Styles" value="0x801227">
+        <param name="ImageType" value="Folder">
+</OBJECT>
+<UL>
+'''
+
+contents_footer = '''\
+</UL></BODY></HTML>
+'''
+
+object_sitemap = '''\
+<OBJECT type="text/sitemap">
+    <param name="Name" value="%s">
+    <param name="Local" value="%s">
+</OBJECT>
+'''
+
+# List of words the full text search facility shouldn't index.  This
+# becomes file outname.stp.  Note that this list must be pretty small!
+# Different versions of the MS docs claim the file has a maximum size of
+# 256 or 512 bytes (including \r\n at the end of each line).
+# Note that "and", "or", "not" and "near" are operators in the search
+# language, so no point indexing them even if we wanted to.
+stopwords = """
+a  and  are  as  at
+be  but  by
+for
+if  in  into  is  it
+near  no  not
+of  on  or
+such
+that  the  their  then  there  these  they  this  to
+was  will  with
+""".split()
+
+
+def build_hhx(builder, outdir, outname):
+    builder.info('dumping stopword list...')
+    f = open(path.join(outdir, outname+'.stp'), 'w')
+    try:
+        for word in sorted(stopwords):
+            print >>f, word
+    finally:
+        f.close()
+
+    builder.info('writing project file...')
+    f = open(path.join(outdir, outname+'.hhp'), 'w')
+    try:
+        f.write(project_template % {'outname': outname,
+                                    'title': builder.config.html_title,
+                                    'version': builder.config.version,
+                                    'project': builder.config.project})
+        if not outdir.endswith(os.sep):
+            outdir += os.sep
+        olen = len(outdir)
+        for root, dirs, files in os.walk(outdir):
+            staticdir = (root == path.join(outdir, '_static'))
+            for fn in files:
+                if (staticdir and not fn.endswith('.js')) or fn.endswith('.html'):
+                    print >>f, path.join(root, fn)[olen:].replace(os.sep, '\\')
+    finally:
+        f.close()
+
+    builder.info('writing TOC file...')
+    f = open(path.join(outdir, outname+'.hhc'), 'w')
+    try:
+        f.write(contents_header)
+        # special books
+        f.write('<LI> ' + object_sitemap % (builder.config.html_short_title,
+                                            'index.html'))
+        if builder.config.html_use_modindex:
+            f.write('<LI> ' + object_sitemap % (_('Global Module Index'),
+                                                'modindex.html'))
+        # the TOC
+        tocdoc = builder.env.get_and_resolve_doctree(builder.config.master_doc, builder,
+                                                     prune_toctrees=False)
+        def write_toc(node, ullevel=0):
+            if isinstance(node, nodes.list_item):
+                f.write('<LI> ')
+                for subnode in node:
+                    write_toc(subnode, ullevel)
+            elif isinstance(node, nodes.reference):
+                link = node['refuri']
+                title = cgi.escape(node.astext()).replace('"','&quot;')
+                item = object_sitemap % (title, link)
+                f.write(item.encode('ascii', 'xmlcharrefreplace'))
+            elif isinstance(node, nodes.bullet_list):
+                if ullevel != 0:
+                    f.write('<UL>\n')
+                for subnode in node:
+                    write_toc(subnode, ullevel+1)
+                if ullevel != 0:
+                    f.write('</UL>\n')
+            elif isinstance(node, addnodes.compact_paragraph):
+                for subnode in node:
+                    write_toc(subnode, ullevel)
+        istoctree = lambda node: isinstance(node, addnodes.compact_paragraph) and \
+                    node.has_key('toctree')
+        for node in tocdoc.traverse(istoctree):
+            write_toc(node)
+        f.write(contents_footer)
+    finally:
+        f.close()
+
+    builder.info('writing index file...')
+    index = builder.env.create_index(builder)
+    f = open(path.join(outdir, outname+'.hhk'), 'w')
+    try:
+        f.write('<UL>\n')
+        def write_index(title, refs, subitems):
+            def write_param(name, value):
+                item = '    <param name="%s" value="%s">\n' % (name, value)
+                f.write(item.encode('ascii', 'xmlcharrefreplace'))
+            title = cgi.escape(title)
+            f.write('<LI> <OBJECT type="text/sitemap">\n')
+            write_param('Keyword', title)
+            if len(refs) == 0:
+                write_param('See Also', title)
+            elif len(refs) == 1:
+                write_param('Local', refs[0])
+            else:
+                for i, ref in enumerate(refs):
+                    write_param('Name', '[%d] %s' % (i, ref)) # XXX: better title?
+                    write_param('Local', ref)
+            f.write('</OBJECT>\n')
+            if subitems:
+                f.write('<UL> ')
+                for subitem in subitems:
+                    write_index(subitem[0], subitem[1], [])
+                f.write('</UL>')
+        for (key, group) in index:
+            for title, (refs, subitems) in group:
+                write_index(title, refs, subitems)
+        f.write('</UL>\n')
+    finally:
+        f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,457 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.htmlwriter
+    ~~~~~~~~~~~~~~~~~
+
+    docutils writers handling Sphinx' custom nodes.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import posixpath
+import os
+
+from docutils import nodes
+from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator
+
+from sphinx.locale import admonitionlabels, versionlabels
+from sphinx.highlighting import PygmentsBridge
+from sphinx.util.smartypants import sphinx_smarty_pants
+
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+
+class HTMLWriter(Writer):
+    def __init__(self, builder):
+        Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        # sadly, this is mostly copied from parent class
+        self.visitor = visitor = self.builder.translator_class(self.builder,
+                                                               self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
+                     'body_pre_docinfo', 'docinfo', 'body', 'fragment',
+                     'body_suffix', 'meta', 'title', 'subtitle', 'header',
+                     'footer', 'html_prolog', 'html_head', 'html_title',
+                     'html_subtitle', 'html_body', ):
+            setattr(self, attr, getattr(visitor, attr, None))
+        self.clean_meta = ''.join(visitor.meta[2:])
+
+
+class HTMLTranslator(BaseTranslator):
+    """
+    Our custom HTML translator.
+    """
+
+    def __init__(self, builder, *args, **kwds):
+        BaseTranslator.__init__(self, *args, **kwds)
+        self.highlighter = PygmentsBridge('html', builder.config.pygments_style)
+        self.no_smarty = 0
+        self.builder = builder
+        self.highlightlang = builder.config.highlight_language
+        self.highlightlinenothreshold = sys.maxint
+        self.protect_literal_text = 0
+
+    def visit_desc(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS=node['desctype']))
+    def depart_desc(self, node):
+        self.body.append('</dl>\n\n')
+
+    def visit_desc_signature(self, node):
+        # the id is set automatically
+        self.body.append(self.starttag(node, 'dt'))
+        # anchor for per-desc interactive data
+        if node.parent['desctype'] != 'describe' and node['ids'] and node['first']:
+            self.body.append('<!--[%s]-->' % node['ids'][0])
+        if node.parent['desctype'] in ('class', 'exception'):
+            self.body.append('%s ' % node.parent['desctype'])
+    def depart_desc_signature(self, node):
+        if node['ids'] and self.builder.add_definition_links:
+            self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] +
+                             u'title="%s">\u00B6</a>' %
+                             _('Permalink to this definition'))
+        self.body.append('</dt>\n')
+
+    def visit_desc_addname(self, node):
+        self.body.append(self.starttag(node, 'tt', '', CLASS='descclassname'))
+    def depart_desc_addname(self, node):
+        self.body.append('</tt>')
+
+    def visit_desc_type(self, node):
+        pass
+    def depart_desc_type(self, node):
+        pass
+
+    def visit_desc_name(self, node):
+        self.body.append(self.starttag(node, 'tt', '', CLASS='descname'))
+    def depart_desc_name(self, node):
+        self.body.append('</tt>')
+
+    def visit_desc_parameterlist(self, node):
+        self.body.append('<big>(</big>')
+        self.first_param = 1
+    def depart_desc_parameterlist(self, node):
+        self.body.append('<big>)</big>')
+
+    def visit_desc_parameter(self, node):
+        if not self.first_param:
+            self.body.append(', ')
+        else:
+            self.first_param = 0
+        if not node.hasattr('noemph'):
+            self.body.append('<em>')
+    def depart_desc_parameter(self, node):
+        if not node.hasattr('noemph'):
+            self.body.append('</em>')
+
+    def visit_desc_optional(self, node):
+        self.body.append('<span class="optional">[</span>')
+    def depart_desc_optional(self, node):
+        self.body.append('<span class="optional">]</span>')
+
+    def visit_desc_annotation(self, node):
+        self.body.append(self.starttag(node, 'em', CLASS='property'))
+    def depart_desc_annotation(self, node):
+        self.body.append('</em>')
+
+    def visit_desc_content(self, node):
+        self.body.append(self.starttag(node, 'dd', ''))
+    def depart_desc_content(self, node):
+        self.body.append('</dd>')
+
+    def visit_refcount(self, node):
+        self.body.append(self.starttag(node, 'em', '', CLASS='refcount'))
+    def depart_refcount(self, node):
+        self.body.append('</em>')
+
+    def visit_versionmodified(self, node):
+        self.body.append(self.starttag(node, 'p'))
+        text = versionlabels[node['type']] % node['version']
+        if len(node):
+            text += ': '
+        else:
+            text += '.'
+        self.body.append('<span class="versionmodified">%s</span>' % text)
+    def depart_versionmodified(self, node):
+        self.body.append('</p>\n')
+
+    # overwritten
+    def visit_reference(self, node):
+        BaseTranslator.visit_reference(self, node)
+        if node.hasattr('reftitle'):
+            # ugly hack to add a title attribute
+            starttag = self.body[-1]
+            if not starttag.startswith('<a '):
+                return
+            self.body[-1] = '<a title="%s"' % self.attval(node['reftitle']) + \
+                            starttag[2:]
+
+    # overwritten -- we don't want source comments to show up in the HTML
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    # overwritten
+    def visit_admonition(self, node, name=''):
+        self.body.append(self.starttag(
+            node, 'div', CLASS=('admonition ' + name)))
+        if name and name != 'seealso':
+            node.insert(0, nodes.title(name, admonitionlabels[name]))
+        self.set_first_last(node)
+
+    def visit_seealso(self, node):
+        self.visit_admonition(node, 'seealso')
+    def depart_seealso(self, node):
+        self.depart_admonition(node)
+
+    # overwritten for docutils 0.4
+    if hasattr(BaseTranslator, 'start_tag_with_title'):
+        def visit_section(self, node):
+            # the 0.5 version, to get the id attribute in the <div> tag
+            self.section_level += 1
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+
+        def visit_title(self, node):
+            # don't move the id attribute inside the <h> tag
+            BaseTranslator.visit_title(self, node, move_ids=0)
+
+    # overwritten
+    def visit_literal_block(self, node):
+        if node.rawsource != node.astext():
+            # most probably a parsed-literal block -- don't highlight
+            return BaseTranslator.visit_literal_block(self, node)
+        lang = self.highlightlang
+        linenos = node.rawsource.count('\n') >= self.highlightlinenothreshold - 1
+        if node.has_key('language'):
+            # code-block directives
+            lang = node['language']
+        if node.has_key('linenos'):
+            linenos = node['linenos']
+        highlighted = self.highlighter.highlight_block(node.rawsource, lang, linenos)
+        starttag = self.starttag(node, 'div', suffix='', CLASS='highlight-%s' % lang)
+        self.body.append(starttag + highlighted + '</div>\n')
+        raise nodes.SkipNode
+
+    def visit_doctest_block(self, node):
+        self.visit_literal_block(node)
+
+    # overwritten
+    def visit_literal(self, node):
+        if len(node.children) == 1 and \
+               node.children[0] in ('None', 'True', 'False'):
+            node['classes'].append('xref')
+        self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        self.protect_literal_text += 1
+    def depart_literal(self, node):
+        self.protect_literal_text -= 1
+        self.body.append('</tt>')
+
+    def visit_productionlist(self, node):
+        self.body.append(self.starttag(node, 'pre'))
+        names = []
+        for production in node:
+            names.append(production['tokenname'])
+        maxlen = max(len(name) for name in names)
+        for production in node:
+            if production['tokenname']:
+                lastname = production['tokenname'].ljust(maxlen)
+                self.body.append(self.starttag(production, 'strong', ''))
+                self.body.append(lastname + '</strong> ::= ')
+            else:
+                self.body.append('%s     ' % (' '*len(lastname)))
+            production.walkabout(self)
+            self.body.append('\n')
+        self.body.append('</pre>\n')
+        raise nodes.SkipNode
+    def depart_productionlist(self, node):
+        pass
+
+    def visit_production(self, node):
+        pass
+    def depart_production(self, node):
+        pass
+
+    def visit_centered(self, node):
+        self.body.append(self.starttag(node, 'p', CLASS="centered") + '<strong>')
+    def depart_centered(self, node):
+        self.body.append('</strong></p>')
+
+    def visit_compact_paragraph(self, node):
+        pass
+    def depart_compact_paragraph(self, node):
+        pass
+
+    def visit_highlightlang(self, node):
+        self.highlightlang = node['lang']
+        self.highlightlinenothreshold = node['linenothreshold']
+    def depart_highlightlang(self, node):
+        pass
+
+    # overwritten
+    def visit_image(self, node):
+        olduri = node['uri']
+        # rewrite the URI if the environment knows about it
+        if olduri in self.builder.images:
+            node['uri'] = posixpath.join(self.builder.imgpath,
+                                         self.builder.images[olduri])
+
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(os.path.join(self.builder.srcdir,
+                                                    olduri))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    print olduri
+                    pass
+                else:
+                    if not node.has_key('width'):
+                        node['width'] = str(im.size[0])
+                    if not node.has_key('height'):
+                        node['height'] = str(im.size[1])
+                    del im
+        BaseTranslator.visit_image(self, node)
+
+    def visit_toctree(self, node):
+        # this only happens when formatting a toc from env.tocs -- in this
+        # case we don't want to include the subtree
+        raise nodes.SkipNode
+
+    def visit_index(self, node):
+        raise nodes.SkipNode
+
+    def visit_tabular_col_spec(self, node):
+        raise nodes.SkipNode
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_acks(self, node):
+        pass
+    def depart_acks(self, node):
+        pass
+
+    def visit_module(self, node):
+        pass
+    def depart_module(self, node):
+        pass
+
+    def bulk_text_processor(self, text):
+        return text
+
+    # overwritten
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.protect_literal_text:
+            # moved here from base class's visit_literal to support
+            # more formatting in literal nodes
+            for token in self.words_and_spaces.findall(encoded):
+                if token.strip():
+                    # protect literal text from line wrapping
+                    self.body.append('<span class="pre">%s</span>' % token)
+                elif token in ' \n':
+                    # allow breaks at whitespace
+                    self.body.append(token)
+                else:
+                    # protect runs of multiple spaces; the last one can wrap
+                    self.body.append('&nbsp;' * (len(token)-1) + ' ')
+        else:
+            if self.in_mailto and self.settings.cloak_email_addresses:
+                encoded = self.cloak_email(encoded)
+            else:
+                encoded = self.bulk_text_processor(encoded)
+            self.body.append(encoded)
+
+    # these are all for docutils 0.5 compatibility
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+    def depart_note(self, node):
+        self.depart_admonition(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+    def depart_warning(self, node):
+        self.depart_admonition(node)
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    # these are only handled specially in the SmartyPantsHTMLTranslator
+    def visit_literal_emphasis(self, node):
+        return self.visit_emphasis(node)
+    def depart_literal_emphasis(self, node):
+        return self.depart_emphasis(node)
+
+    def depart_title(self, node):
+        close_tag = self.context[-1]
+        if self.builder.add_header_links and \
+               (close_tag.startswith('</h') or
+                close_tag.startswith('</a></h')) and \
+               node.parent.hasattr('ids') and node.parent['ids']:
+            aname = node.parent['ids'][0]
+            # add permalink anchor
+            self.body.append(u'<a class="headerlink" href="#%s" ' % aname +
+                             u'title="%s">\u00B6</a>' %
+                             _('Permalink to this headline'))
+        BaseTranslator.depart_title(self, node)
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
+
+
+class SmartyPantsHTMLTranslator(HTMLTranslator):
+    """
+    Handle ordinary text via smartypants, converting quotes and dashes
+    to the correct entities.
+    """
+
+    def __init__(self, *args, **kwds):
+        self.no_smarty = 0
+        HTMLTranslator.__init__(self, *args, **kwds)
+
+    def visit_literal(self, node):
+        self.no_smarty += 1
+        try:
+            # this raises SkipNode
+            HTMLTranslator.visit_literal(self, node)
+        finally:
+            self.no_smarty -= 1
+
+    def visit_literal_emphasis(self, node):
+        self.no_smarty += 1
+        self.visit_emphasis(node)
+
+    def depart_literal_emphasis(self, node):
+        self.depart_emphasis(node)
+        self.no_smarty -= 1
+
+    def visit_desc_signature(self, node):
+        self.no_smarty += 1
+        HTMLTranslator.visit_desc_signature(self, node)
+
+    def depart_desc_signature(self, node):
+        self.no_smarty -= 1
+        HTMLTranslator.depart_desc_signature(self, node)
+
+    def visit_productionlist(self, node):
+        self.no_smarty += 1
+        try:
+            HTMLTranslator.visit_productionlist(self, node)
+        finally:
+            self.no_smarty -= 1
+
+    def visit_option(self, node):
+        self.no_smarty += 1
+        HTMLTranslator.visit_option(self, node)
+    def depart_option(self, node):
+        self.no_smarty -= 1
+        HTMLTranslator.depart_option(self, node)
+
+    def bulk_text_processor(self, text):
+        if self.no_smarty <= 0:
+            return sphinx_smarty_pants(text)
+        return text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1192 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.latexwriter
+    ~~~~~~~~~~~~~~~~~~
+
+    Custom docutils writer for LaTeX.
+
+    Much of this code is adapted from Dave Kuhlman's "docpy" writer from his
+    docutils sandbox.
+
+    :copyright: 2007-2008 by Georg Brandl, Dave Kuhlman.
+    :license: BSD.
+"""
+
+import re
+import sys
+from os import path
+
+from docutils import nodes, writers
+from docutils.writers.latex2e import Babel
+
+from sphinx import addnodes
+from sphinx import highlighting
+from sphinx.locale import admonitionlabels, versionlabels
+from sphinx.util import ustrftime
+from sphinx.util.texescape import tex_escape_map
+from sphinx.util.smartypants import educateQuotesLatex
+
+HEADER = r'''%% Generated by Sphinx.
+\documentclass[%(papersize)s,%(pointsize)s%(classoptions)s]{%(docclass)s}
+%(inputenc)s
+%(fontenc)s
+%(babel)s
+%(fontpkg)s
+%(fncychap)s
+\usepackage{sphinx}
+%(preamble)s
+
+\title{%(title)s}
+\date{%(date)s}
+\release{%(release)s}
+\author{%(author)s}
+\newcommand{\sphinxlogo}{%(logo)s}
+\renewcommand{\releasename}{%(releasename)s}
+%(makeindex)s
+%(makemodindex)s
+'''
+
+BEGIN_DOC = r'''
+\begin{document}
+%(shorthandoff)s
+%(maketitle)s
+%(tableofcontents)s
+'''
+
+FOOTER = r'''
+%(footer)s
+\renewcommand{\indexname}{%(modindexname)s}
+%(printmodindex)s
+\renewcommand{\indexname}{%(indexname)s}
+%(printindex)s
+\end{document}
+'''
+
+
+class LaTeXWriter(writers.Writer):
+
+    supported = ('sphinxlatex',)
+
+    settings_spec = ('LaTeX writer options', '', (
+        ('Document name', ['--docname'], {'default': ''}),
+        ('Document class', ['--docclass'], {'default': 'manual'}),
+        ('Author', ['--author'], {'default': ''}),
+        ))
+    settings_defaults = {}
+
+    output = None
+
+    def __init__(self, builder):
+        writers.Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        visitor = LaTeXTranslator(self.document, self.builder)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+
+
+# Helper classes
+
+class ExtBabel(Babel):
+    def get_shorthandoff(self):
+        shortlang = self.language.split('_')[0]
+        if shortlang in ('de', 'sl', 'pt', 'es', 'nl', 'pl'):
+            return '\\shorthandoff{"}'
+        return ''
+
+    _ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy()
+    _ISO639_TO_BABEL['sl'] = 'slovene'
+
+
+class Table(object):
+    def __init__(self):
+        self.col = 0
+        self.colcount = 0
+        self.colspec = None
+        self.had_head = False
+        self.has_verbatim = False
+        self.caption = None
+
+
+class Desc(object):
+    def __init__(self, node):
+        self.env = LaTeXTranslator.desc_map.get(node['desctype'], 'describe')
+        self.type = self.cls = self.name = self.params = self.annotation = ''
+        self.count = 0
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+    sectionnames = ["part", "chapter", "section", "subsection",
+                    "subsubsection", "paragraph", "subparagraph"]
+
+    ignore_missing_images = False
+
+    default_elements = {
+        'docclass':        'manual',
+        'papersize':       'letterpaper',
+        'pointsize':       '10pt',
+        'classoptions':    '',
+        'inputenc':        '\\usepackage[utf8]{inputenc}',
+        'fontenc':         '\\usepackage[T1]{fontenc}',
+        'babel':           '\\usepackage{babel}',
+        'fontpkg':         '\\usepackage{times}',
+        'fncychap':        '\\usepackage[Bjarne]{fncychap}',
+        'preamble':        '',
+        'title':           '',
+        'date':            '',
+        'release':         '',
+        'author':          '',
+        'logo':            '',
+        'releasename':     'Release',
+        'makeindex':       '\\makeindex',
+        'makemodindex':    '\\makemodindex',
+        'shorthandoff':    '',
+        'maketitle':       '\\maketitle',
+        'tableofcontents': '\\tableofcontents',
+        'footer':          '',
+        'printmodindex':   '\\printmodindex',
+        'printindex':      '\\printindex',
+    }
+
+    def __init__(self, document, builder):
+        nodes.NodeVisitor.__init__(self, document)
+        self.builder = builder
+        self.body = []
+
+        # sort out some elements
+        papersize = builder.config.latex_paper_size + 'paper'
+        if papersize == 'paper': # e.g. command line "-D latex_paper_size="
+            papersize = 'letterpaper'
+
+        self.elements = self.default_elements.copy()
+        self.elements.update({
+            'docclass':     document.settings.docclass,
+            'papersize':    papersize,
+            'pointsize':    builder.config.latex_font_size,
+            # if empty, the title is set to the first section title
+            'title':        document.settings.title,
+            'date':         ustrftime(builder.config.today_fmt or _('%B %d, %Y')),
+            'release':      builder.config.release,
+            'author':       document.settings.author,
+            'releasename':  _('Release'),
+            'preamble':     builder.config.latex_preamble,
+            'modindexname': _('Module Index'),
+            'indexname':    _('Index'),
+        })
+        if builder.config.latex_logo:
+            self.elements['logo'] = '\\includegraphics{%s}\\par' % \
+                                    path.basename(builder.config.latex_logo)
+        if builder.config.language:
+            babel = ExtBabel(builder.config.language)
+            lang = babel.get_language()
+            if lang:
+                self.elements['classoptions'] += ',' + babel.get_language()
+            else:
+                self.builder.warn('no Babel option known for language %r' %
+                                  builder.config.language)
+            self.elements['shorthandoff'] = babel.get_shorthandoff()
+            self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}'
+        else:
+            self.elements['classoptions'] += ',english'
+        if not builder.config.latex_use_modindex:
+            self.elements['makemodindex'] = ''
+            self.elements['printmodindex'] = ''
+        # allow the user to override them all
+        self.elements.update(builder.config.latex_elements)
+
+        self.highlighter = highlighting.PygmentsBridge(
+            'latex', builder.config.pygments_style)
+        self.context = []
+        self.descstack = []
+        self.bibitems = []
+        self.table = None
+        self.next_table_colspec = None
+        self.highlightlang = builder.config.highlight_language
+        self.highlightlinenothreshold = sys.maxint
+        self.written_ids = set()
+        self.footnotestack = []
+        if self.elements['docclass'] == 'manual':
+            if builder.config.latex_use_parts:
+                self.top_sectionlevel = 0
+            else:
+                self.top_sectionlevel = 1
+        else:
+            self.top_sectionlevel = 2
+        self.next_section_target = None
+        # flags
+        self.verbatim = None
+        self.in_title = 0
+        self.in_production_list = 0
+        self.first_document = 1
+        self.this_is_the_title = 1
+        self.literal_whitespace = 0
+        self.no_contractions = 0
+
+    def astext(self):
+        return (HEADER % self.elements + self.highlighter.get_stylesheet() +
+                u''.join(self.body) + FOOTER % self.elements)
+
+    def visit_document(self, node):
+        self.footnotestack.append(self.collect_footnotes(node))
+        if self.first_document == 1:
+            # the first document is all the regular content ...
+            self.body.append(BEGIN_DOC % self.elements)
+            self.first_document = 0
+        elif self.first_document == 0:
+            # ... and all others are the appendices
+            self.body.append('\n\\appendix\n')
+            self.first_document = -1
+        # "- 1" because the level is increased before the title is visited
+        self.sectionlevel = self.top_sectionlevel - 1
+    def depart_document(self, node):
+        if self.bibitems:
+            widest_label = ""
+            for bi in self.bibitems:
+                if len(widest_label) < len(bi[0]):
+                    widest_label = bi[0]
+            self.body.append('\n\\begin{thebibliography}{%s}\n' % widest_label)
+            for bi in self.bibitems:
+                # cite_key: underscores must not be escaped
+                cite_key = bi[0].replace(r"\_", "_")
+                self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+            self.body.append('\\end{thebibliography}\n')
+            self.bibitems = []
+
+    def visit_start_of_file(self, node):
+        # This marks the begin of a new file; therefore the current module and
+        # class must be reset
+        self.body.append('\n\\resetcurrentobjects\n')
+        # and also, new footnotes
+        self.footnotestack.append(self.collect_footnotes(node))
+
+    def collect_footnotes(self, node):
+        fnotes = {}
+        def footnotes_under(n):
+            if isinstance(n, nodes.footnote):
+                yield n
+            else:
+                for c in n.children:
+                    if isinstance(c, addnodes.start_of_file):
+                        continue
+                    for k in footnotes_under(c):
+                        yield k
+        for fn in footnotes_under(node):
+            num = fn.children[0].astext().strip()
+            fnotes[num] = fn
+            fn.parent.remove(fn)
+        return fnotes
+
+    def depart_start_of_file(self, node):
+        self.footnotestack.pop()
+
+    def visit_highlightlang(self, node):
+        self.highlightlang = node['lang']
+        self.highlightlinenothreshold = node['linenothreshold']
+        raise nodes.SkipNode
+
+    def visit_section(self, node):
+        if not self.this_is_the_title:
+            self.sectionlevel += 1
+        self.body.append('\n\n')
+        if self.next_section_target:
+            self.body.append(r'\hypertarget{%s}{}' % self.next_section_target)
+            self.next_section_target = None
+        #if node.get('ids'):
+        #    for id in node['ids']:
+        #        if id not in self.written_ids:
+        #            self.body.append(r'\hypertarget{%s}{}' % id)
+        #            self.written_ids.add(id)
+    def depart_section(self, node):
+        self.sectionlevel = max(self.sectionlevel - 1, self.top_sectionlevel - 1)
+
+    def visit_problematic(self, node):
+        self.body.append(r'{\color{red}\bfseries{}')
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_topic(self, node):
+        self.body.append('\\setbox0\\vbox{\n'
+                         '\\begin{minipage}{0.95\\textwidth}\n')
+    def depart_topic(self, node):
+        self.body.append('\\end{minipage}}\n'
+                         '\\begin{center}\\setlength{\\fboxsep}{5pt}'
+                         '\\shadowbox{\\box0}\\end{center}\n')
+    visit_sidebar = visit_topic
+    depart_sidebar = depart_topic
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_productionlist(self, node):
+        self.body.append('\n\n\\begin{productionlist}\n')
+        self.in_production_list = 1
+    def depart_productionlist(self, node):
+        self.body.append('\\end{productionlist}\n\n')
+        self.in_production_list = 0
+
+    def visit_production(self, node):
+        if node['tokenname']:
+            self.body.append('\\production{%s}{' % self.encode(node['tokenname']))
+        else:
+            self.body.append('\\productioncont{')
+    def depart_production(self, node):
+        self.body.append('}\n')
+
+    def visit_transition(self, node):
+        self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n')
+    def depart_transition(self, node):
+        pass
+
+    def visit_title(self, node):
+        parent = node.parent
+        if isinstance(parent, addnodes.seealso):
+            # the environment already handles this
+            raise nodes.SkipNode
+        elif self.this_is_the_title:
+            if len(node.children) != 1 and not isinstance(node.children[0], nodes.Text):
+                self.builder.warn('document title is not a single Text node')
+            if not self.elements['title']:
+                # text needs to be escaped since it is inserted into
+                # the output literally
+                self.elements['title'] = node.astext().translate(tex_escape_map)
+            self.this_is_the_title = 0
+            raise nodes.SkipNode
+        elif isinstance(parent, nodes.section):
+            try:
+                self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel])
+            except IndexError:
+                from sphinx.application import SphinxError
+                raise SphinxError('too many nesting section levels for LaTeX, '
+                                  'at heading: %s' % node.astext())
+            self.context.append('}\n')
+        elif isinstance(parent, (nodes.topic, nodes.sidebar)):
+            self.body.append(r'\textbf{')
+            self.context.append('}\n\n\medskip\n\n')
+        elif isinstance(parent, nodes.Admonition):
+            self.body.append('{')
+            self.context.append('}\n')
+        elif isinstance(parent, nodes.table):
+            self.table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        else:
+            self.builder.warn('encountered title node not in section, topic, '
+                              'table, admonition or sidebar')
+            self.body.append('\\textbf{')
+            self.context.append('}\n')
+        self.in_title = 1
+    def depart_title(self, node):
+        self.in_title = 0
+        self.body.append(self.context.pop())
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        else:
+            self.context.append('')
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    desc_map = {
+        'function' : 'funcdesc',
+        'class': 'classdesc',
+        'method': 'methoddesc',
+        'staticmethod': 'staticmethoddesc',
+        'exception': 'excdesc',
+        'data': 'datadesc',
+        'attribute': 'memberdesc',
+        'opcode': 'opcodedesc',
+
+        'cfunction': 'cfuncdesc',
+        'cmember': 'cmemberdesc',
+        'cmacro': 'csimplemacrodesc',
+        'ctype': 'ctypedesc',
+        'cvar': 'cvardesc',
+
+        'describe': 'describe',
+        # and all others are 'describe' too
+    }
+
+    def visit_desc(self, node):
+        self.descstack.append(Desc(node))
+    def depart_desc(self, node):
+        d = self.descstack.pop()
+        self.body.append("\\end{%s}\n" % d.env)
+
+    def visit_desc_signature(self, node):
+        d = self.descstack[-1]
+        # reset these for every signature
+        d.type = d.cls = d.name = d.params = ''
+    def depart_desc_signature(self, node):
+        d = self.descstack[-1]
+        d.cls = d.cls.rstrip('.')
+        if node.parent['desctype'] != 'describe' and node['ids']:
+            hyper = '\\hypertarget{%s}{}' % node['ids'][0]
+        else:
+            hyper = ''
+        if d.count == 0:
+            t1 = "\n\n%s\\begin{%s}" % (hyper, d.env)
+        else:
+            t1 = "\n%s\\%sline" % (hyper, d.env[:-4])
+        d.count += 1
+        if d.env in ('funcdesc', 'classdesc', 'excclassdesc'):
+            t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env in ('datadesc', 'excdesc', 'csimplemacrodesc'):
+            t2 = "{%s}" % (d.name)
+        elif d.env in ('methoddesc', 'staticmethoddesc'):
+            if d.cls:
+                t2 = "[%s]{%s}{%s}" % (d.cls, d.name, d.params)
+            else:
+                t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env == 'memberdesc':
+            if d.cls:
+                t2 = "[%s]{%s}" % (d.cls, d.name)
+            else:
+                t2 = "{%s}" % d.name
+        elif d.env == 'cfuncdesc':
+            if d.cls:
+                # C++ class names
+                d.name = '%s::%s' % (d.cls, d.name)
+            t2 = "{%s}{%s}{%s}" % (d.type, d.name, d.params)
+        elif d.env == 'cmemberdesc':
+            try:
+                type, container = d.type.rsplit(' ', 1)
+                container = container.rstrip('.')
+            except ValueError:
+                container = ''
+                type = d.type
+            t2 = "{%s}{%s}{%s}" % (container, type, d.name)
+        elif d.env == 'cvardesc':
+            t2 = "{%s}{%s}" % (d.type, d.name)
+        elif d.env == 'ctypedesc':
+            t2 = "{%s}" % (d.name)
+        elif d.env == 'opcodedesc':
+            t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env == 'describe':
+            t2 = "{%s}" % d.name
+        self.body.append(t1 + t2)
+
+    def visit_desc_type(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].type = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_name(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].name = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_addname(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].cls = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_parameterlist(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].params = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_annotation(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].annotation = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_refcount(self, node):
+        self.body.append("\\emph{")
+    def depart_refcount(self, node):
+        self.body.append("}\\\\")
+
+    def visit_desc_content(self, node):
+        if node.children and not isinstance(node.children[0], nodes.paragraph):
+            # avoid empty desc environment which causes a formatting bug
+            self.body.append('~')
+    def depart_desc_content(self, node):
+        pass
+
+    def visit_seealso(self, node):
+        self.body.append("\n\n\\strong{%s:}\n\n" % admonitionlabels['seealso'])
+    def depart_seealso(self, node):
+        self.body.append("\n\n")
+
+    def visit_rubric(self, node):
+        if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
+            raise nodes.SkipNode
+        self.body.append('\\paragraph{')
+        self.context.append('}\n')
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_footnote(self, node):
+        pass
+    def depart_footnote(self, node):
+        pass
+
+    def visit_label(self, node):
+        if isinstance(node.parent, nodes.citation):
+            self.bibitems[-1][0] = node.astext()
+        raise nodes.SkipNode
+
+    def visit_tabular_col_spec(self, node):
+        self.next_table_colspec = node['spec']
+        raise nodes.SkipNode
+
+    def visit_table(self, node):
+        if self.table:
+            raise NotImplementedError('Nested tables are not supported.')
+        self.table = Table()
+        self.tablebody = []
+        # Redirect body output until table is finished.
+        self._body = self.body
+        self.body = self.tablebody
+    def depart_table(self, node):
+        self.body = self._body
+        if self.table.caption is not None:
+            self.body.append('\n\\begin{threeparttable}\n'
+                             '\\caption{%s}\n' % self.table.caption)
+        if self.table.has_verbatim:
+            self.body.append('\n\\begin{tabular}')
+        else:
+            self.body.append('\n\\begin{tabulary}{\\textwidth}')
+        if self.table.colspec:
+            self.body.append(self.table.colspec)
+        else:
+            if self.table.has_verbatim:
+                colwidth = 0.95 / self.table.colcount
+                colspec = ('p{%.3f\\textwidth}|' % colwidth) * self.table.colcount
+                self.body.append('{|' + colspec + '}\n')
+            else:
+                self.body.append('{|' + ('L|' * self.table.colcount) + '}\n')
+        self.body.extend(self.tablebody)
+        if self.table.has_verbatim:
+            self.body.append('\\end{tabular}\n\n')
+        else:
+            self.body.append('\\end{tabulary}\n\n')
+        if self.table.caption is not None:
+            self.body.append('\\end{threeparttable}\n\n')
+        self.table = None
+        self.tablebody = None
+
+    def visit_colspec(self, node):
+        self.table.colcount += 1
+    def depart_colspec(self, node):
+        pass
+
+    def visit_tgroup(self, node):
+        pass
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        if self.next_table_colspec:
+            self.table.colspec = '{%s}\n' % self.next_table_colspec
+        self.next_table_colspec = None
+        self.body.append('\\hline\n')
+        self.table.had_head = True
+    def depart_thead(self, node):
+        self.body.append('\\hline\n')
+
+    def visit_tbody(self, node):
+        if not self.table.had_head:
+            self.visit_thead(node)
+    def depart_tbody(self, node):
+        self.body.append('\\hline\n')
+
+    def visit_row(self, node):
+        self.table.col = 0
+    def depart_row(self, node):
+        self.body.append('\\\\\n')
+
+    def visit_entry(self, node):
+        if node.has_key('morerows') or node.has_key('morecols'):
+            raise NotImplementedError('Column or row spanning cells are '
+                                      'not implemented.')
+        if self.table.col > 0:
+            self.body.append(' & ')
+        self.table.col += 1
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header
+
+    def visit_acks(self, node):
+        # this is a list in the source, but should be rendered as a
+        # comma-separated list here
+        self.body.append('\n\n')
+        self.body.append(', '.join(n.astext() for n in node.children[0].children) + '.')
+        self.body.append('\n\n')
+        raise nodes.SkipNode
+
+    def visit_bullet_list(self, node):
+        self.body.append('\\begin{itemize}\n' )
+    def depart_bullet_list(self, node):
+        self.body.append('\\end{itemize}\n' )
+
+    def visit_enumerated_list(self, node):
+        self.body.append('\\begin{enumerate}\n' )
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{enumerate}\n' )
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append(r'\item {} ')
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_definition_list(self, node):
+        self.body.append('\\begin{description}\n')
+    def depart_definition_list(self, node):
+        self.body.append('\\end{description}\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        ctx = ']'
+        if node.has_key('ids') and node['ids']:
+            ctx += '\\hypertarget{%s}{}' % node['ids'][0]
+        self.body.append('\\item[')
+        self.context.append(ctx)
+    def depart_term(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_classifier(self, node):
+        self.body.append('{[}')
+    def depart_classifier(self, node):
+        self.body.append('{]}')
+
+    def visit_definition(self, node):
+        pass
+    def depart_definition(self, node):
+        self.body.append('\n')
+
+    def visit_field_list(self, node):
+        self.body.append('\\begin{quote}\\begin{description}\n')
+    def depart_field_list(self, node):
+        self.body.append('\\end{description}\\end{quote}\n')
+
+    def visit_field(self, node):
+        pass
+    def depart_field(self, node):
+        pass
+
+    visit_field_name = visit_term
+    depart_field_name = depart_term
+
+    visit_field_body = visit_definition
+    depart_field_body = depart_definition
+
+    def visit_paragraph(self, node):
+        self.body.append('\n')
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_centered(self, node):
+        self.body.append('\n\\begin{centering}')
+    def depart_centered(self, node):
+        self.body.append('\n\\end{centering}')
+
+    def visit_module(self, node):
+        modname = node['modname']
+        self.body.append('\n\\declaremodule[%s]{}{%s}' % (modname.replace('_', ''),
+                                                          self.encode(modname)))
+        self.body.append('\n\\modulesynopsis{%s}' % self.encode(node['synopsis']))
+        if node.has_key('platform'):
+            self.body.append('\\platform{%s}' % self.encode(node['platform']))
+    def depart_module(self, node):
+        pass
+
+    def latex_image_length(self, width_str):
+        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+        if not match:
+            # fallback
+            return width_str
+        res = width_str
+        amount, unit = match.groups()[:2]
+        if not unit or unit == "px":
+            # pixels: let LaTeX alone
+            return None
+        elif unit == "%":
+            res = "%.3f\\linewidth" % (float(amount) / 100.0)
+        return res
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = []
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            w = self.latex_image_length(attrs['width'])
+            if w:
+                include_graphics_options.append('width=%s' % w)
+        if attrs.has_key('height'):
+            h = self.latex_image_length(attrs['height'])
+            if h:
+                include_graphics_options.append('height=%s' % h)
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        if node['uri'] in self.builder.images:
+            uri = self.builder.images[node['uri']]
+        else:
+            # missing image!
+            if self.ignore_missing_images:
+                return
+            uri = node['uri']
+        if uri.find('://') != -1:
+            # ignore remote images
+            return
+        self.body.extend(pre)
+        options = ''
+        if include_graphics_options:
+            options = '[%s]' % ','.join(include_graphics_options)
+        self.body.append('\\includegraphics%s{%s}' % (options, uri))
+        self.body.extend(post)
+    def depart_image(self, node):
+        pass
+
+    def visit_figure(self, node):
+        if (not node.attributes.has_key('align') or
+            node.attributes['align'] == 'center'):
+            # centering does not add vertical space like center.
+            align = '\n\\centering'
+            align_end = ''
+        else:
+            # TODO non vertical space for other alignments.
+            align = '\\begin{flush%s}' % node.attributes['align']
+            align_end = '\\end{flush%s}' % node.attributes['align']
+        self.body.append('\\begin{figure}[htbp]%s\n' % align)
+        self.context.append('%s\\end{figure}\n' % align_end)
+    def depart_figure(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_caption(self, node):
+        self.body.append('\\caption{')
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_admonition(self, node):
+        self.body.append('\n\\begin{notice}{note}')
+    def depart_admonition(self, node):
+        self.body.append('\\end{notice}\n')
+
+    def _make_visit_admonition(name):
+        def visit_admonition(self, node):
+            self.body.append('\n\\begin{notice}{%s}{%s:}' %
+                             (name, admonitionlabels[name]))
+        return visit_admonition
+    def _depart_named_admonition(self, node):
+        self.body.append('\\end{notice}\n')
+
+    visit_attention = _make_visit_admonition('attention')
+    depart_attention = _depart_named_admonition
+    visit_caution = _make_visit_admonition('caution')
+    depart_caution = _depart_named_admonition
+    visit_danger = _make_visit_admonition('danger')
+    depart_danger = _depart_named_admonition
+    visit_error = _make_visit_admonition('error')
+    depart_error = _depart_named_admonition
+    visit_hint = _make_visit_admonition('hint')
+    depart_hint = _depart_named_admonition
+    visit_important = _make_visit_admonition('important')
+    depart_important = _depart_named_admonition
+    visit_note = _make_visit_admonition('note')
+    depart_note = _depart_named_admonition
+    visit_tip = _make_visit_admonition('tip')
+    depart_tip = _depart_named_admonition
+    visit_warning = _make_visit_admonition('warning')
+    depart_warning = _depart_named_admonition
+
+    def visit_versionmodified(self, node):
+        intro = versionlabels[node['type']] % node['version']
+        if node.children:
+            intro += ': '
+        else:
+            intro += '.'
+        self.body.append(intro)
+    def depart_versionmodified(self, node):
+        pass
+
+    def visit_target(self, node):
+        def add_target(id):
+            # indexing uses standard LaTeX index markup, so the targets
+            # will be generated differently
+            if not id.startswith('index-'):
+                self.body.append(r'\hypertarget{%s}{}' % id)
+
+        if node.has_key('refid') and node['refid'] not in self.written_ids:
+            parindex = node.parent.index(node)
+            try:
+                next = node.parent[parindex+1]
+                if isinstance(next, nodes.section):
+                    self.next_section_target = node['refid']
+                    return
+            except IndexError:
+                pass
+            add_target(node['refid'])
+            self.written_ids.add(node['refid'])
+    def depart_target(self, node):
+        pass
+
+    def visit_attribution(self, node):
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append('---')
+    def depart_attribution(self, node):
+        self.body.append('\n\\end{flushright}\n')
+
+    def visit_index(self, node, scre=re.compile(r';\s*')):
+        entries = node['entries']
+        for type, string, tid, _ in entries:
+            if type == 'single':
+                self.body.append(r'\index{%s}' % scre.sub('!', self.encode(string)))
+            elif type == 'pair':
+                parts = tuple(self.encode(x.strip()) for x in string.split(';', 1))
+                try:
+                    self.body.append(r'\indexii{%s}{%s}' % parts)
+                except TypeError:
+                    self.builder.warn('invalid pair index entry %r' % string)
+            elif type == 'triple':
+                parts = tuple(self.encode(x.strip()) for x in string.split(';', 2))
+                try:
+                    self.body.append(r'\indexiii{%s}{%s}{%s}' % parts)
+                except TypeError:
+                    self.builder.warn('invalid triple index entry %r' % string)
+            else:
+                self.builder.warn('unknown index entry type %s found' % type)
+        raise nodes.SkipNode
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        uri = node.get('refuri', '')
+        if self.in_title or not uri:
+            self.context.append('')
+        elif uri.startswith('mailto:') or uri.startswith('http:') or \
+             uri.startswith('https:') or uri.startswith('ftp:'):
+            self.body.append('\\href{%s}{' % self.encode(uri))
+            self.context.append('}')
+        elif uri.startswith('#'):
+            self.body.append('\\hyperlink{%s}{' % uri[1:])
+            self.context.append('}')
+        elif uri.startswith('@token'):
+            if self.in_production_list:
+                self.body.append('\\token{')
+            else:
+                self.body.append('\\grammartoken{')
+            self.context.append('}')
+        else:
+            self.builder.warn('unusable reference target found: %s' % uri)
+            self.context.append('')
+    def depart_reference(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_pending_xref(self, node):
+        pass
+    def depart_pending_xref(self, node):
+        pass
+
+    def visit_emphasis(self, node):
+        self.body.append(r'\emph{')
+    def depart_emphasis(self, node):
+        self.body.append('}')
+
+    def visit_literal_emphasis(self, node):
+        self.body.append(r'\emph{\texttt{')
+        self.no_contractions += 1
+    def depart_literal_emphasis(self, node):
+        self.body.append('}}')
+        self.no_contractions -= 1
+
+    def visit_strong(self, node):
+        self.body.append(r'\textbf{')
+    def depart_strong(self, node):
+        self.body.append('}')
+
+    def visit_title_reference(self, node):
+        self.body.append(r'\emph{')
+    def depart_title_reference(self, node):
+        self.body.append('}')
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        self.bibitems.append(['', ''])
+        self.context.append(len(self.body))
+    def depart_citation(self, node):
+        size = self.context.pop()
+        text = ''.join(self.body[size:])
+        del self.body[size:]
+        self.bibitems[-1][1] = text
+
+    def visit_citation_reference(self, node):
+        citeid = node.astext()
+        self.body.append('\\cite{%s}' % citeid)
+        raise nodes.SkipNode
+
+    def visit_literal(self, node):
+        content = self.encode(node.astext().strip())
+        if self.in_title:
+            self.body.append(r'\texttt{%s}' % content)
+        elif node.has_key('role') and node['role'] == 'samp':
+            self.body.append(r'\samp{%s}' % content)
+        else:
+            self.body.append(r'\code{%s}' % content)
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        num = node.astext().strip()
+        try:
+            fn = self.footnotestack[-1][num]
+        except (KeyError, IndexError):
+            raise nodes.SkipNode
+        self.body.append('\\footnote{')
+        fn.walkabout(self)
+        raise nodes.SkipChildren
+    def depart_footnote_reference(self, node):
+        self.body.append('}')
+
+    def visit_literal_block(self, node):
+        self.verbatim = ''
+    def depart_literal_block(self, node):
+        code = self.verbatim.rstrip('\n')
+        lang = self.highlightlang
+        linenos = code.count('\n') >= self.highlightlinenothreshold - 1
+        if node.has_key('language'):
+            # code-block directives
+            lang = node['language']
+        if node.has_key('linenos'):
+            linenos = node['linenos']
+        hlcode = self.highlighter.highlight_block(code, lang, linenos)
+        # workaround for Unicode issue
+        hlcode = hlcode.replace(u'€', u'@texteuro[]')
+        # must use original Verbatim environment and "tabular" environment
+        if self.table:
+            hlcode = hlcode.replace('\\begin{Verbatim}',
+                                    '\\begin{OriginalVerbatim}')
+            self.table.has_verbatim = True
+        # get consistent trailer
+        hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim}
+        hlcode = hlcode.rstrip() + '\n'
+        self.body.append('\n' + hlcode + '\\end{%sVerbatim}\n' %
+                         (self.table and 'Original' or ''))
+        self.verbatim = None
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    def visit_line_block(self, node):
+        """line-block:
+        * whitespace (including linebreaks) is significant
+        * inline markup is supported.
+        * serif typeface
+        """
+        self.body.append('{\\raggedright{}')
+        self.literal_whitespace = 1
+    def depart_line_block(self, node):
+        self.literal_whitespace = 0
+        # remove the last \\
+        del self.body[-1]
+        self.body.append('}\n')
+
+    def visit_line(self, node):
+        self._line_start = len(self.body)
+    def depart_line(self, node):
+        if self._line_start == len(self.body):
+            # no output in this line -- add a nonbreaking space, else the
+            # \\ command will give an error
+            self.body.append('~')
+        if self.table is not None:
+            self.body.append('\\newline\n')
+        else:
+            self.body.append('\\\\\n')
+
+    def visit_block_quote(self, node):
+        # If the block quote contains a single object and that object
+        # is a list, then generate a list not a block quote.
+        # This lets us indent lists.
+        done = 0
+        if len(node.children) == 1:
+            child = node.children[0]
+            if isinstance(child, nodes.bullet_list) or \
+                    isinstance(child, nodes.enumerated_list):
+                done = 1
+        if not done:
+            self.body.append('\\begin{quote}\n')
+    def depart_block_quote(self, node):
+        done = 0
+        if len(node.children) == 1:
+            child = node.children[0]
+            if isinstance(child, nodes.bullet_list) or \
+                    isinstance(child, nodes.enumerated_list):
+                done = 1
+        if not done:
+            self.body.append('\\end{quote}\n')
+
+    # option node handling copied from docutils' latex writer
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+    def depart_option(self, node):
+        # flag that the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.body.append('\\item [')
+        # flag for first option
+        self.context.append(0)
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.body.append('] ')
+
+    def visit_option_list(self, node):
+        self.body.append('\\begin{optionlist}{3cm}\n')
+    def depart_option_list(self, node):
+        self.body.append('\\end{optionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ostring = node.astext()
+        self.body.append(self.encode(ostring.replace('--', u'-{-}')))
+        raise nodes.SkipNode
+
+    def visit_description(self, node):
+        self.body.append( ' ' )
+    def depart_description(self, node):
+        pass
+
+    def visit_superscript(self, node):
+        self.body.append('$^{\\text{')
+    def depart_superscript(self, node):
+        self.body.append('}}$')
+
+    def visit_subscript(self, node):
+        self.body.append('$_{\\text{')
+    def depart_subscript(self, node):
+        self.body.append('}}$')
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_generated(self, node):
+        pass
+    def depart_generated(self, node):
+        pass
+
+    def visit_compound(self, node):
+        pass
+    def depart_compound(self, node):
+        pass
+
+    def visit_container(self, node):
+        pass
+    def depart_container(self, node):
+        pass
+
+    def visit_decoration(self, node):
+        pass
+    def depart_decoration(self, node):
+        pass
+
+    # text handling
+
+    def encode(self, text):
+        text = unicode(text).translate(tex_escape_map)
+        if self.literal_whitespace:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace(u'\n', u'~\\\\\n').replace(u' ', u'~')
+        if self.no_contractions:
+            text = text.replace('--', u'-{-}')
+        return text
+
+    def visit_Text(self, node):
+        if self.verbatim is not None:
+            self.verbatim += node.astext()
+        else:
+            text = self.encode(node.astext())
+            self.body.append(educateQuotesLatex(text))
+    def depart_Text(self, node):
+        pass
+
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    def visit_meta(self, node):
+        # only valid for HTML
+        raise nodes.SkipNode
+
+    def visit_system_message(self, node):
+        pass
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.linkcheck
+    ~~~~~~~~~~~~~~~~
+
+    The CheckExternalLinksBuilder class.
+
+    :copyright: 2008 by Georg Brandl, Thomas Lamb.
+    :license: BSD.
+"""
+
+import socket
+from os import path
+from urllib2 import build_opener, HTTPError
+
+from docutils import nodes
+
+from sphinx.builder import Builder
+from sphinx.util.console import purple, red, darkgreen
+
+# create an opener that will simulate a browser user-agent
+opener = build_opener()
+opener.addheaders = [('User-agent', 'Mozilla/5.0')]
+
+
+class CheckExternalLinksBuilder(Builder):
+    """
+    Checks for broken external links.
+    """
+    name = 'linkcheck'
+
+    def init(self):
+        self.good = set()
+        self.broken = {}
+        self.redirected = {}
+        # set a timeout for non-responding servers
+        socket.setdefaulttimeout(5.0)
+        # create output file
+        open(path.join(self.outdir, 'output.txt'), 'w').close()
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def get_outdated_docs(self):
+        return self.env.found_docs
+
+    def prepare_writing(self, docnames):
+        return
+
+    def write_doc(self, docname, doctree):
+        self.info()
+        for node in doctree.traverse(nodes.reference):
+            try:
+                self.check(node, docname)
+            except KeyError:
+                continue
+
+    def check(self, node, docname):
+        uri = node['refuri']
+
+        if '#' in uri:
+            uri = uri.split('#')[0]
+
+        if uri in self.good:
+            return
+
+        lineno = None
+        while lineno is None and node:
+            node = node.parent
+            lineno = node.line
+
+        if uri[0:5] == 'http:' or uri[0:6] == 'https:':
+            self.info(uri, nonl=1)
+
+            if uri in self.broken:
+                (r, s) = self.broken[uri]
+            elif uri in self.redirected:
+                (r, s) = self.redirected[uri]
+            else:
+                (r, s) = self.resolve(uri)
+
+            if r == 0:
+                self.info(' - ' + darkgreen('working'))
+                self.good.add(uri)
+            elif r == 2:
+                self.info(' - ' + red('broken: ') + s)
+                self.write_entry('broken', docname, lineno, uri + ': ' + s)
+                self.broken[uri] = (r, s)
+                if self.app.quiet:
+                    self.warn('%s:%s: broken link: %s' % (docname, lineno, uri))
+            else:
+                self.info(' - ' + purple('redirected') + ' to ' + s)
+                self.write_entry('redirected', docname, lineno, uri + ' to ' + s)
+                self.redirected[uri] = (r, s)
+        elif len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:':
+            return
+        else:
+            self.warn(uri + ' - ' + red('malformed!'))
+            self.write_entry('malformed', docname, lineno, uri)
+            if self.app.quiet:
+                self.warn('%s:%s: malformed link: %s' % (docname, lineno, uri))
+            self.app.statuscode = 1
+
+        if self.broken:
+            self.app.statuscode = 1
+
+    def write_entry(self, what, docname, line, uri):
+        output = open(path.join(self.outdir, 'output.txt'), 'a')
+        output.write("%s:%s: [%s] %s\n" % (self.env.doc2path(docname, None),
+                                           line, what, uri))
+        output.close()
+
+    def resolve(self, uri):
+        try:
+            f = opener.open(uri)
+            f.close()
+        except HTTPError, err:
+            #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'):
+            #    # Wikipedia blocks requests from urllib User-Agent
+            #    return (0, 0)
+            return (2, str(err))
+        except Exception, err:
+            return (2, str(err))
+        if f.url.rstrip('/') == uri.rstrip('/'):
+            return (0, 0)
+        else:
+            return (1, f.url)
+
+    def finish(self):
+        return
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.locale
+    ~~~~~~~~~~~~~
+
+    Locale utilities.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+_ = lambda x: x
+
+admonitionlabels = {
+    'attention': _('Attention'),
+    'caution':   _('Caution'),
+    'danger':    _('Danger'),
+    'error':     _('Error'),
+    'hint':      _('Hint'),
+    'important': _('Important'),
+    'note':      _('Note'),
+    'seealso':   _('See Also'),
+    'tip':       _('Tip'),
+    'warning':   _('Warning'),
+}
+
+versionlabels = {
+    'versionadded':   _('New in version %s'),
+    'versionchanged': _('Changed in version %s'),
+    'deprecated':     _('Deprecated since version %s'),
+}
+
+pairindextypes = {
+    'module':    _('module'),
+    'keyword':   _('keyword'),
+    'operator':  _('operator'),
+    'object':    _('object'),
+    'exception': _('exception'),
+    'statement': _('statement'),
+    'builtin':   _('built-in function'),
+}
+
+del _
+
+def init():
+    for dct in (admonitionlabels, versionlabels, pairindextypes):
+        for key in dct:
+            dct[key] = _(dct[key])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modul", "Preparing search...": "", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "hledej", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "", "Search Results": "V\u00fdsledky hled\u00e1n\u00ed"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,604 @@
+# Czech translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-10 11:43+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Pavel Kosina <pavel.kosina@gmail.com>\n"
+"Language-Team: Pavel Kosina <pavel.kosina@gmail.com>\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Rejstřík indexů"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "moduly"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "další"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "předchozí"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Vestavěné funkce"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Úroveň modulů"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+#, fuzzy
+msgid "Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+#, fuzzy
+msgid "Search Page"
+msgstr "Vyhledávací stránka"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Trvalý odkaz na tuto definici"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Trvalý odkaz na tento nadpis"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Vydání"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "promměná prostředí, %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[obrázek]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vestavěná funkce)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s() (vestavěná proměnná)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s() (vestavěná proměnná)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s() (třída v %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (metoda %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metoda %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (statická metoda %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statická metoda %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s() (atribut %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s() (atribut %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkce)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (Älen C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C typ)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C proměnná)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Vyvolá"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Proměnná"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Vrací"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Typ navrácené hodnoty"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sparametry příkazového řádku; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformy: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor sekce: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor modulu: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Viz také"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Výstraha"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Upozornění"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "NebezpeÄí"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Chyba"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Rada"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Důležité"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Poznámka"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Viz také"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Varování"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nové ve verzi %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Změněno ve verzi %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastaralé od verze %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "modul"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "klíÄové slovo"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operátor"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "výjimka"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "příkaz"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "vestavěná funkce"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+#, fuzzy
+msgid "Searching"
+msgstr "hledej"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "modul"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Výsledky hledání"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Přehled"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Rejstříky a tabulky:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Celkový obsah"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "seznam všech sekcí a podsekcí"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "prohledej tuto dokumentaci"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "rychlý přístup ke všem modulům"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "všechny funkce, třídy, termíny"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Plný index na jedné stránce"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Index podle písmene"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "může být obrovský"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigace"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Obsah"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Přechozí téma"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "předchozí kapitola"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Další téma"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "další kapitola"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Tato stránka"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Návrh změnu"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Ukázat zdroj"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Rychlé vyhledávání"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Hledání dle klíÄe"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "hledej"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Zadej jméno modulu, třídy nebo funkce."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Hledání uvnitř %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O těchto dokumentech"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Hledání"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Veškerá práva vyhrazena"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Naposledy aktualizováno dne %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Vytvořeno pomocí <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Nejpopulárnější moduly:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Zobrazit moduly dostupné na této platformě"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Zastaralé"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Prohledat %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Poznámka:</strong> Stránka, kterou hledáte, "
+"neexistuje.<br>Snažili jsme se najít nové umístění této stránky, ale "
+"nepovedlo se."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Toto je vyhledávací stránka. Zadejte klíÄová slova    do pole níže a "
+"klikněte na \"hledej\". \n"
+"Prohledávání funkcí  hledá automaticky všechna slova. Stránky obsahující"
+"    slov méně, nebudou nalezeny."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "hledej"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Nic jsme nenašli."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Změny ve verzi %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaticky generovaný seznam změn ve verzi %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Změny v knihovnách"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Změny API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostatní změny"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": "", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,601 @@
+# German translations for Sphinx.
+# Copyright (C) 2008 Translators.
+# This file is distributed under the same license as the Sphinx project.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-07 21:40+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Horst Gutmann <zerok@zerokspot.com>\n"
+"Language-Team: de <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d. %m. %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Allgemeiner Index"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Globaler Modulindex"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "Module"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "weiter"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "zurück"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Modulebene"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d. %m. %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Stichwortverzeichnis"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Suche"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Permalink zu dieser Definition"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Permalink zu dieser Ãœberschrift"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "Umgebungsvariable; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plattform: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[Bild]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (eingebaute Funktion)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in Modul %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (eingebaute Variable)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in Modul %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (eingebaute Klasse)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (Klasse in %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (Methode von %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (Methode von %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (statische Methode von %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statische Methode von %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (Attribut von %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (Attribut von %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-Funktion)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C-Member)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-Makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C-Typ)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-Variable)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Verursacht:"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Rückgabe"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Rückgabetyp"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parameter"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sKommandozeilenoption; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plattformen: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (Modul)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor des Abschnitts: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor des Moduls: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Siehe auch"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Achtung"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Vorsicht"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Gefahr"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Fehler"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Hinweis"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Wichtig"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Bemerkung"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Siehe auch"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tipp"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Warnung"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Neu in Version %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Geändert in Version %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Veraltet ab Version %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "Module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "Schlüsselwort"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "Operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "Objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "Exception"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "Statement"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "eingebaute Funktion"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Suchergebnisse ausblenden"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Suchen..."
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Suche wird vorbereitet..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "Modul, in "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Suchergebnisse"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig "
+"geschrieben und genügend Kategorien ausgewählt?"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Ãœbersicht"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indizes und Tabellen:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Vollständiges Inhaltsverzeichnis"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Liste aller Kapitel und Unterkapitel"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "Durchsuche diese Dokumentation"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "Schneller Zugriff auf alle Module"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "Alle Funktionen, Klassen, Begriffe"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Stichwortverzeichnis &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Gesamtes Stichwortverzeichnis auf einer Seite"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Stichwortverzeichnis nach Anfangsbuchstabe"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "kann groß sein"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Inhalt"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Vorheriges Thema"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "vorheriges Kapitel"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Nächstes Thema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "nächstes Kapitel"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Diese Seite"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Änderung vorschlagen"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Quelltext anzeigen"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Schnellsuche"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Stichwortsuche"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Los"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Gib einen Modul-, Klassen- oder Funktionsnamen an."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Ãœber diese Dokumentation"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Suche"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Zuletzt aktualisiert am %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Mit <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s "
+"erstellt."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Beliebteste Module:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Zeige nur Module, die auf diesen Plattformen verfügbar sind"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Veraltet"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Anmerkung:</strong> Du hast eine nicht länger gültige URL von "
+"diesem Server angefragt. Wir haben versucht dich auf die neue Adresse "
+"dieser Seite umzuleiten, aber dies muss nicht die richtige Seite sein."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Von hier aus kannst du die Dokumentation durchsuchen. Gib deine "
+"Suchbegriffe in das untenstehende Feld ein und klicke auf \"suchen\". "
+"Bitte beachte, dass die Suchfunktion automatisch nach all diesen Worten "
+"suchen wird. Seiten, die nicht alle Worte enthalten, werden nicht in der "
+"Ergebnisliste erscheinen."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "suchen"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Deine Suche ergab leider keine Treffer."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Änderungen in Version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch generierte Liste der Änderungen in Version %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Bibliotheksänderungen"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API-Änderungen"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere Änderungen"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"module, in ": "m\u00f3dulo", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado.  Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Search Results": "Resultados de la b\u00fasqueda"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,611 @@
+# Spanish translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Guillem Borrell <guillem@torroja.dmt.upm.es>\n"
+"Language-Team: es <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Ãndice General"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "siguiente"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+#, fuzzy
+msgid "Builtins"
+msgstr "Funciones de base"
+
+#: sphinx/builder.py:1131
+#, fuzzy
+msgid "Module level"
+msgstr "Módulos"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, fuzzy, python-format
+msgid "%B %d, %Y"
+msgstr "%d de %B de %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Ãndice de Módulos"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Página de Búsqueda"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Enlazar permanentemente con esta definición"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Enlazar permanentemente con este título"
+
+#: sphinx/latexwriter.py:172
+#, fuzzy
+msgid "Release"
+msgstr "Versión"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "variables de entorno; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plataforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[imagen]"
+
+#: sphinx/directives/desc.py:25
+#, fuzzy, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (función de base)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (en el módulo %s)"
+
+#: sphinx/directives/desc.py:29
+#, fuzzy, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (en el módulo %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (clase en %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s método)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s método)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s método estático)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s método estático)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atributo)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributo)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (función C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (miembro C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (tipo C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variable C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Muestra"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Devuelve"
+
+#: sphinx/directives/desc.py:116
+#, fuzzy
+msgid "Return type"
+msgstr "Tipo del argumento devuelto"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parámetros"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sOpciones en línea de comandos; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plataformas:"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor de la sección"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor del módulo"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Ver también"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Atención"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Prudencia"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Peligro"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Error"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Consejo"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Ver También"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Truco"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Advertencia"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nuevo en la versión %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Distinto en la versión %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde la versión %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "palabra clave"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operador"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objeto"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "excepción"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "sentencia"
+
+#: sphinx/locale/__init__.py:40
+#, fuzzy
+msgid "built-in function"
+msgstr "función de base"
+
+#: sphinx/static/doctools.js:174
+#, fuzzy
+msgid "Hide Search Matches"
+msgstr "Coincidencias de la búsqueda"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Buscando"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Preparando la búsqueda"
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "módulo"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Resultados de la búsqueda"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"La búsqueda no dio ningún resultado.  Por favor asegúrese que escribió "
+"todas las palabras correctamente y que ha seleccionado suficientes "
+"categorías"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su"
+" consulta"
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Resumen"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Ãndices y tablas:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Ãndice de contenidos completo"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Muestra todas las secciones"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "buscar en esta documentación"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "acceso rápido a todos los módulos"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "todas las funciones, clases, términos"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Ãndice completo en una página"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Ãndice alfabético"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "puede ser muy grande"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navegación"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Contenidos"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Tema anterior"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Capítulo anterior"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Próximo tema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "Próximo capítulo"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Esta página"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Sugerir una modificación"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Enseñar el código"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Búsqueda rápida"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Búsqueda por palabras clave"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Ir a"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Introducir en nombre de un módulo, clase o función"
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Sobre este documento"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Búsqueda"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Actualizado por última vez en %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Creado con <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Módulos más comunes:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Mostrar sólo los módulos disponibles en estas plataformas"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Nota:</strong> Has solicitado una dirección desactualizada a este"
+" servidor.  Hemos intentado redirigirte a la nueva dirección de la misma "
+"página pero puede no ser la correcta."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Este es el diálogo de búsqueda.  Introduce los términos en el diálogo "
+"siguiente y pulsa \"buscar\".  El asistente buscará automáticamente todas"
+" las palabras.  Las páginas que contengan menos palabras no aparecerán en"
+" la lista de resultados."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "buscar"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Tu consulta no obtuvo ningún resultado"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Cambios en la versión %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de cambios generada automáticamente en la versión %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Cambios en la biblioteca"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Cambios en la API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Otros cambios"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"module, in ": "module, dans", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Search Results": "R\u00e9sultats de la recherche"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,606 @@
+# French translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# David Larlet <larlet@gmail.com>, 2008.
+# Sebastien Douche <sdouche@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: larlet@gmail.com\n"
+"POT-Creation-Date: 2008-08-08 12:39+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Sébastien Douche <sdouche@gmail.com>\n"
+"Language-Team: French Translation Team <sphinx-dev@googlegroups.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Index général"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Index général des modules"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "suivant"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "précédent"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr "(dans"
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Fonctions de base"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Module"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d %B %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Index du module"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Page de recherche"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Lien permanent vers cette définition"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Lien permanent vers ce titre"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Version"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "variable d'environnement; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plateforme : %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (fonction de base)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (dans le module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (dans le module %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe de base)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe dans %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (méthode %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (méthode %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (méthode statique %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (méthode statique %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (attribut %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (attribut %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (fonction C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (membre C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (type C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variable C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Lève"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Retourne"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Type retourné"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Paramètres"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%soption de ligne de commande; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plateformes : "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Auteur de la section : "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Auteur du module : "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Auteur : "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Voir aussi"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "A faire"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(L'entrée orginale se trouve dans %s, à la ligne %d et peut être trouvé"
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "ici"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Attention"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Prudence"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Danger"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Erreur"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Indice"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Note"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Voir aussi"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Astuce"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Warning"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Introduit dans la version %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Modifié dans la version %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsolète depuis la version %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "mot-clé"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "opérateur"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objet"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "exception"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "état"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "fonction de base"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Cacher les résultats de la recherche"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "En cours de recherche"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Préparation de la recherche..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "module, dans"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", dans"
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Résultats de la recherche"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe "
+"des termes de recherche et que vous avez sélectionné suffisamment de "
+"catégories."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Résumé"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indices et tables :"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Table des matières complète"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "lister l'ensemble des sections et sous-sections"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "rechercher dans cette documentation"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "accès rapide à l'ensemble des modules"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "toutes les fonctions, classes, termes"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Index complet sur une seule page"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Indexer les pages par lettre"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "peut être énorme"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Table des matières"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Sujet précédent"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Chapitre précédent"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Sujet suivant"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "Chapitre suivant"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Cette page"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Suggérer une modification"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Montrer la source"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Recherche rapide"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Recherche par mot-clé"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Saisissez un nom de module, classe ou fonction."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Recherchez dans %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "À propos de ces documents"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Recherche"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Mis à jour le %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Créé avec <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Modules les plus utilisés :"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "N'afficher que les modules disponibles sur ces plateformes"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsolète"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Rechercher %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Note :</strong> Vous tentez d'accéder à une ancienne URL de ce "
+"serveur. Nous avons essayé de vous rediriger vers la nouvelle adresse de "
+"cette page, mais ce n'est peut-être pas la bonne."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Vous pouvez effectuer une recherche au sein des documents. Saisissez les "
+"termes\n"
+"    de votre recherche dans le champs ci-dessous et cliquez sur "
+"\"rechercher\". Notez que la fonctionnalité de recherche\n"
+"    va automatique chercher pour tous les mots. Les pages\n"
+"    contenant moins de mots n'apparaîtront pas dans la liste des "
+"résultats."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "rechercher"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Votre recherche n'a retourné aucun résultat"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Modifications dans la version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Liste auto-générée des modifications dans la version %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Modifications de la bibliothèque"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Modifications de l'API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Autres modifications"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"module, in ": "\u30e2\u30b8\u30e5\u30fc\u30eb", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Search Results": "\u691c\u7d22\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,595 @@
+# Japanese translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Yasushi Masuda <whosaysni@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Yasushi MASUDA <whosaysni@gmail.com>\n"
+"Language-Team: ja <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "ç·åˆç´¢å¼•"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "モジュールç·ç´¢å¼•"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "モジュール"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "次ã¸"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "å‰ã¸"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "組ã¿è¾¼ã¿"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "モジュールレベル"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "モジュール索引"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "検索ページ"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "ã“ã®å®šç¾©ã¸ã®ãƒ‘ーマリンク"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "ã“ã®ãƒ˜ãƒƒãƒ‰ãƒ©ã‚¤ãƒ³ã¸ã®ãƒ‘ーマリンク"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "リリース"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境変数; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "プラットフォーム: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[ç”»åƒ]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (組ã¿è¾¼ã¿é–¢æ•°)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s モジュール)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s モジュール)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s ã®ã‚¯ãƒ©ã‚¹)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s ã®é™çš„メソッド)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s ã®é™çš„メソッド)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s ã®å±žæ€§)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s ã®å±žæ€§)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C ã®é–¢æ•°)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C ã®ãƒ¡ãƒ³ãƒå¤‰æ•°)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C ã®ãƒžã‚¯ãƒ­)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C ã®ãƒ‡ãƒ¼ã‚¿åž‹)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C ã®å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "例外"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "変数"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "戻り値"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "戻り値ã®åž‹"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "パラメタ"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sコマンドラインオプション; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "プラットフォーム: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (モジュール)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "ã“ã®ç¯€ã®ä½œè€…: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "モジュールã®ä½œè€…: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "作者: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "å‚考"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "ã”用心"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "å±é™º"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "エラー"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "ヒント"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "ノート"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "å‚考"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "ã¡ãªã¿ã«"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§è¿½åŠ "
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§å¤‰æ›´"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§æ’¤å»ƒ"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "モジュール"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "キーワード"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "演算å­"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "オブジェクト"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "æ–‡"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "組ã¿è¾¼ã¿é–¢æ•°"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "検索çµæžœã‚’éš ã™"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "検索中"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "検索ã®æº–備中..."
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "モジュール"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "検索çµæžœ"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚検索ã—ãŸã„言葉を正ã—ã„ã¤ã¥ã‚Šã§å…¥åŠ›ã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€æ­£ã—ã„カテゴリã®æ¤œç´¢ã‚’è¡Œã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "検索ãŒçµ‚了ã—ã€æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒšãƒ¼ã‚¸ãŒ %s 個ã¿ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "概è¦"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "索引ã¨è¡¨ä¸€è¦§:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "ç·åˆç›®æ¬¡"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "ç« ï¼ç¯€ä¸€è¦§"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "ドキュメントを検索"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "全モジュール早見表"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "関数ã€ã‚¯ãƒ©ã‚¹ãŠã‚ˆã³ç”¨èªžç·è¦§"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "索引 &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "ç·ç´¢å¼•"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "頭文字別索引"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "大ãã„å ´åˆãŒã‚ã‚‹ã®ã§æ³¨æ„"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "目次"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "å‰ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "å‰ã®ç« ã¸"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "次ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "次ã®ç« ã¸"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "変更ã®ã‚µã‚¸ã‚§ã‚¹ãƒˆ"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "ソースコードを表示"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "クイック検索"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "キーワード検索"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "検索"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "モジュールã€ã‚¯ãƒ©ã‚¹ã€ã¾ãŸã¯é–¢æ•°åを入力ã—ã¦ãã ã•ã„"
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã¤ã„ã¦"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "検索"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "著作権"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最終更新: %(last_updated)s"
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s ã§ç”Ÿæˆã—ã¾ã—ãŸã€‚"
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "よãå‚ç…§ã•ã‚Œã¦ã„るモジュール:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "ã“ã®ãƒ—ラットフォームã§åˆ©ç”¨å¯èƒ½ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã ã‘を表示ã™ã‚‹"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "撤廃"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>注æ„:</strong> ã‚ãªãŸãŒè¡¨ç¤ºã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã¯å¤ã„ URL ã§ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«å¯¾å¿œã™ã‚‹æ–°ã—ã„ URL "
+"ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’試ã¿ã¾ã™ãŒã€é©åˆ‡ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã§ãªã„ã‹ã‚‚ã—ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’検索ã§ãã¾ã™ã€‚キーワードを下ã®ãƒœãƒƒã‚¯ã‚¹ã«å…¥åŠ›ã—ã¦ã€ã€Œæ¤œç´¢ã€ã‚’クリックã—ã¦ãã ã•ã„。入力ã•ã‚ŒãŸå…¨ã¦ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒšãƒ¼ã‚¸ãŒæ¤œç´¢ã•ã‚Œã¾ã™ã€‚一部ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã—ã‹å«ã¾ãªã„ページã¯æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "検索"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ï¼ˆã“ã®ãƒªã‚¹ãƒˆã¯è‡ªå‹•ç”Ÿæˆã•ã‚Œã¦ã„ã¾ã™ï¼‰"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "ライブラリã«é–¢ã™ã‚‹å¤‰æ›´"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API ã«é–¢ã™ã‚‹å¤‰æ›´"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "ãã®å¤šã®å¤‰æ›´"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"module, in ": "module", "Preparing search...": "Het zoeken wordt voorbereid", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op.  Controleer of alle woordencorrect gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": "", "Permalink to this headline": "Permanente link naar deze titel", "Searching": "Zoeken", "Permalink to this definition": "Permanente link naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen", "Search Results": "Zoekresultaten"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,603 @@
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: nl <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%b.%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Algemene index"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Globale Module-index"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "volgende"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "vorige"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Moduleniveau"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d. %B %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Module-index"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Zoekpagina"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Permanente link naar deze definitie"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Permanente link naar deze titel"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "Omgevingsvariabele; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platform: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[afbeelding]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (geïntegreerde functie)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in module %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasse in %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s methode)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s methode)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statische methode)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statische methode)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s attribuut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribuut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-functie)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C member)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-macro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C type)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-variabele)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Veroorzaakt"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variabele"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%scommandolijn optie; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformen: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Auteur van deze sectie: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Auteur van deze module: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Auteur: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Zie ook"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Let op!"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Pas op!"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Gevaar"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Fout"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Hint"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Belangrijk"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Notitie"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Zie Ook"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nieuw in versie %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Veranderd in versie %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Verouderd sinds versie %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "trefwoord"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "object"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "foutmelding"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "statement"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "geïntegreerde functie"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Zoekresultaten verbergen"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Zoeken"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Het zoeken wordt voorbereid"
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "module"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Zoekresultaten"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Uw zoekopdracht leverde geen resultaten op.  Controleer of alle "
+"woordencorrect gespeld zijn en dat u genoeg categoriën hebt geselecteerd."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Zoeken voltooid, %s pagina(s) gevonden."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Overzicht"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indices en tabellen:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Volledige inhoudstafel"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "geeft alle secties en subsecties weer"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "zoeken in deze documentatie"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "sneltoegang naar alle modules"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "alle functies, klasses en begrippen"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Volledige index op een pagina"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Index pagineerd per letter"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "kan heel groot zijn"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Inhoudstafel"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Vorig onderwerp"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Vorig hoofdstuk"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Volgend onderwerp"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "volgend hoofdstuk"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Deze Pagina"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Wijziging Voorstellen"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Broncode weergeven"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Snel zoeken"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Trefwoord opzoeken"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Geef de naam van een module, klasse of functie."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Zoeken in %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Over deze documenten"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Zoeken"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Laatste aanpassing op %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Populairste modules:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Enkel modules weergeven die op deze platformen beschikbaar zijn"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Verouderd"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Zoeken %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Opgelet:</strong> U heeft een verouderde URL aangevraagd op deze "
+"server. Wij hebben probeerd u door te verwijzen naar de nieuwe locatie "
+"van deze pagina,  maar dat is misschien niet gelukt."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Hier kan u de documenten doorzoeken.  Geef enkele trefwoorden\n"
+"    in het veld hieronder en klik \"zoeken\".  Merk op dat de zoekfunctie"
+"\n"
+"    steeds naar alle woorden zoekt.  Pagina's die minder woorden bevatten"
+"\n"
+"    zullen niet tussen de resultaten verschijnen."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "zoeken"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Uw zoekopdracht leverde geen resultaten op."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Veranderingen in versie %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch genereerde lijst van veranderingen in versie %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Veranderingen in de bibliotheek"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Veranderingen in de C-API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere veranderingen"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modu\u0142", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania", "Search Results": "Wyniki wyszukiwania"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,600 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-10 11:43+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Michał Kandulski <Michal.Kandulski@poczta.onet.pl>\n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
+"(n%100<10 || n%100>=20) ? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Indeks ogólny"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "moduły"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "dalej"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "wstecz"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Wbudowane"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Poziom modułu"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%B %d %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Wyszukiwanie"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Stały odnośnik do tej definicji"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Stały odnośnik do tego nagłówka"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Wydanie"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "zmienna środowiskowa; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[obrazek]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funkcja wbudowana)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (w module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (w module %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (w klasie %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metoda)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statyczna metoda)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statyczna metoda)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atrybut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atrybut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (funkcja C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (pole C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (makro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (typ C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (zmienna C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Wyrzuca"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Zmienna"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Zwraca"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Typ zwracany"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopcja linii komend; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformy: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moduł)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor rozdziału: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor modułu: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Zobacz także"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Ostrożnie"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Niebezpieczeństwo"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Podpowiedź"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Ważne"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Zobacz także"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Wskazówka"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nowe w wersji %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Zmienione w wersji %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Niezalecane od wersji %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "moduł"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "słowo kluczowe"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "obiekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "wyjÄ…tek"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "instrukcja"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "funkcja wbudowana"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Ukryj wyniki wyszukiwania"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Wyszukiwanie"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Przygotowanie wyszukiwania..."
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "moduł"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Wyniki wyszukiwania"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Nie znaleziono żadnych pasujących dokumentów. Upewnij się, że wszystkie "
+"słowa są poprawnie wpisane i że wybrałeś wystarczającąliczbę kategorii."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "PrzeglÄ…d"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indeksy i tablice:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Kompletny spis treści"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "wymień wszystkie rozdziały i podrozdziały"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "wyszukaj w dokumentacji"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "szybki dostęp do wszystkich modułów"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "wszystkie funkcje, klasy, terminy"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Cały indeks na jednej stronie"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Strony indeksu alfabetycznie"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "może być ogromny"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Spis treści"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Poprzedni temat"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "poprzedni rozdział"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Następny temat"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "następny rozdział"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Ta strona"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Zasugeruj zmianÄ™"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Pokaż źródło"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Szybkie wyszukiwanie"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Szukanie wg słowa kluczowego"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Szukaj"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Wprowadź nazwę modułu, klasy lub funkcji."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Szukaj pośród %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O tych dokumentach"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Szukaj"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ostatnia modyfikacja %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Utworzone przy pomocy <a href=\"http://sphinx.pocoo.org/\">Sphinx</a>'a "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Najbardziej popularne moduły:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Pokaż moduły dostępne tylko na tych platformach"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Niezalecane"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Przeszukaj %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Uwaga:</strong> Zażądano przedawnionego URL'a z tego serwera. "
+"Nastąpiła próba przekierowania do nowej lokalizacji, ale może ona być "
+"niewłaściwa."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Stąd możesz przeszukać dokumentację. Wprowadź szukane\n"
+"    słowa w poniższym okienku i kliknij \"Szukaj\". Zwróć uwagę, że\n"
+"    funkcja szukająca będzie automatycznie szukała wszystkich słów.     "
+"Strony nie zawierające wszystkich słów nie znajdą się na wynikowej     "
+"liście."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "Szukaj"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Nie znaleziono żadnych pasujących stron."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Zmiany w wesji %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatycznie wygenerowana lista zmian w wersji %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Zmiany w bibliotekach"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Zmiany w C API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Inne zmiany"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"module, in ": "m\u00f3dulo, em ", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa", "Search Results": "Resultados da Pesquisa"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,606 @@
+# Portuguese (Brazil) translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <roger.demetrescu@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n"
+"POT-Creation-Date: 2008-11-09 19:46+0100\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Roger Demetrescu <roger.demetrescu@gmail.com>\n"
+"Language-Team: pt_BR <roger.demetrescu@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Ãndice Geral"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "próximo"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr " (em "
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Internos"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Módulo"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Ãndice do Módulo"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Página de Pesquisa"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Link permanente para esta definição"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Link permanente para este título"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Versão"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "váriavel de ambiente; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plataforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[imagem]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (função interna)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (no módulo %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variável interna)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (no módulo %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe interna)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe em %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (método %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (método %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (método estático %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (método estático %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (atributo %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atributo %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (função C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (membro C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (tipo C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variável C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Levanta"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variável"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Retorna"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Tipo de retorno"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parâmetros"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopção de linha de comando; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plataformas: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor da seção: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor do módulo: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Veja também"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "Por fazer"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(A entrada original está localizada em %s, linha %d e pode ser encontrada "
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "aqui"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Atenção"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Cuidado"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Perigo"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Erro"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Veja Também"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Aviso"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Novo na versão %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Alterado na versão %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde a versão %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "palavra-chave"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operador"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objeto"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "exceção"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "comando"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "função interna"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Esconder Resultados da Pesquisa"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Pesquisando"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Preparando pesquisa..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "módulo, em "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", em "
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que"
+" todas as palavras foram digitadas corretamente e de que você tenha "
+"selecionado o mínimo de categorias."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+"Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o "
+"critério de pesquisa."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Visão geral"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Ãndices e tabelas:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Tabela de Conteúdo Completa"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Lista todas seções e subseções"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "Pesquisar esta documentação"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "acesso rápido para todos os módulos"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "todas funções, classes, termos"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Ãndice completo em uma página"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Paginas de índice por letra"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "pode ser enorme"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navegação"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Tabela de Conteúdo"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Tópico anterior"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "capítulo anterior"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Próximo tópico"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "próximo capítulo"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Esta Página"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Sugerir Alteração"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Exibir Fonte"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Pesquisa rápida"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Pesquisa de palavras-chave"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Ir"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Informe o nome de um módulo, classe ou função."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Pesquisar dentro de %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Sobre estes documentos"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Pesquisar"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Última atualização em %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Módulos mais populares:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Exibir somente módulos disponíveis nestas plataformas"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Pesquisar em %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Nota:</strong> Você requisitou uma URL desatualizada deste "
+"servidor. Tentamos redirecioná-lo para um novo endereço desta página, "
+"porém é possível que o mesmo não seja o correto."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"A partir daqui você pode pesquisar estes documentos. Preencha suas \n"
+"    palavras de pesquisa na caixa abaixo e clique em  \"pesquisar\". "
+"Observe que a função de pesquisa\n"
+"    irá pesquisar automaticamente por todas as palavras.\n"
+"    Páginas contendo menos palavras não irão aparecer na lista de "
+"resultado."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "pesquisar"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Sua pesquisa não encontrou nenhum resultado."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Alterações na Versão%(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de alterações na versão %(version)s gerada automaticamente"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Alterações na biblioteca"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Alterações na API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Outras alterações"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"module, in ": "modul, v ", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij Resultate Iskanja", "Search Results": "Rezultati Iskanja"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,597 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version:  Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Rok Garbas <rok.garbas@gmail.com>\n"
+"Language-Team: Rok Garbas <rok.garbas@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Splošni abecedni seznam"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "abecedni seznam"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Splošen Seznam Modulov"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "Moduli"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "naprej"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "nazaj"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr "(v "
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Vgrajeni deli"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Nivo modula"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d %B, %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Abecedni seznam"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Seznam modulov"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Iskalna stran"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Povezava na to definicijo"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Povezava na naslov"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Izdaja"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "globalna spremenljivka; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[slika]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vgrajene funkcije)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (vgrajene spremenljivke)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (v modulu %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (vgrajen razred)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (razred v %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metoda)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statiÄna metoda)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiÄna metoda)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atribut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkcija)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C Älan)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C tip)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C spremenljivka)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Javi"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Spremenljivka"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Vrne"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Vrne tip"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopcija komandne linije; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platforma:"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Avtor sekcije:"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Avtor modula:"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Avtor:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Poglej tudi"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "Naredi"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(Originalen vnos se nahajana v %s, vrstica %d in jo je moÄ poiskati "
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "tukaj"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Pozor"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Previdno"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Navarno"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Napaka"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Pomembno"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Opomba"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Poglej Tudi"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Opozorilo"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Novo v verziji %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Spemenjeno v verziji %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastarelo od verzije %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "modul"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "klluÄna beseda"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "izjema"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "izjava"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "vgrajene funkcije"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Skrij Resultate Iskanja"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "IÅ¡Äem"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Pripravljam iskanje..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "modul, v "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", v "
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Rezultati Iskanja"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Za vaše iskanje ni rezultatov. Prosimo preglejte ali so vse besede "
+"pravilno Ärkovane in ali ste izbrali dovolj kategorij."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Iskanje konÄano, najdeno %s strani, ki ustrezajo iskalnemu nizu."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Pregled"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Kazalo in tabele:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Popoln Seznam Vsebine"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "prikazi vse sekcije in podsekcije"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "isÄi po dokumentaciji"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "hiter dostop do vseh modulov"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "vse funkcije, rezredi, termini"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Seznam &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Poln indeks na eni strani"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Indeksiraj strani po Ärki"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "lahko je veliko"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Seznam Vsebine"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Prejšnja tema"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "prejšnje poglavje"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Naslednja tema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "naslednje poglavje"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Ta stran"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Predlagaj spremembo"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Prikaži izvorno kodo"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Hitro iskanje"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Iskanje po kljuÄniih besedah"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Potrdi"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Vnesi ime mudla, razreda ali funkcije."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "IÅ¡Äi med %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O teh dokumentih"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "IÅ¡Äi"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Vse pravice pridržane"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Vse pravice pridržane</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Vse pravice pridržane %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "ZadnjiÄ posodobljeno na %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Narejeno s <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Najbolj popularni moduli:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Prikaži module na razpolago na platformah"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Zastarelo"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "IÅ¡Äi %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Opomba:</strong> Vaš zahtevek za URL s tega streznika je "
+"zastaral. Poskušali smo vas preusmeriti na novo lokacijo, vendar utegne "
+"biti napaÄna."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"O tukaj lahko isÄete dokumente. Vnesite iskalni\n"
+"    niz v polje spodaj in pritisnite \"iÅ¡Äi\". Sproženo iskanje\n"
+"    bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n"
+"    vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "iÅ¡Äi"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Vaše iskanje ni imelo nobenega zadetka."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Spremembe v Verziji %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Avtomatsko generiran seznam sprememb v verziji %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Spremembe knjižnice"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API spremembe"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostale spremembe"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,589 @@
+# Translations template for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-11-27 18:39+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr ""
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr ""
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr ""
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr ""
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr ""
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr ""
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr ""
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr ""
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr ""
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr ""
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr ""
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr ""
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr ""
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr ""
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr ""
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr ""
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr ""
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr ""
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr ""
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr ""
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr ""
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr ""
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr ""
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr ""
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr ""
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr ""
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr ""
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr ""
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr ""
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr ""
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr ""
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr ""
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr ""
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr ""
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr ""
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr ""
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr ""
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr ""
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr ""
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr ""
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr ""
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr ""
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr ""
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr ""
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr ""
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr ""
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr ""
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr ""
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr ""
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr ""
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+
+#: sphinx/templates/search.html:7
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr ""
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr ""
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"module, in ": "", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Permalink to this definition": "", "Hide Search Matches": "", "Search Results": "\u641c\u5c0b\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,598 @@
+# Chinese (Taiwan) translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Fred Lin <gasolin@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-11-09 19:46+0100\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Fred Lin <gasolin@gmail.com>\n"
+"Language-Team: tw <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "總索引"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr ""
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "模組"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "下一é "
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "上一é "
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr ""
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "模組索引"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "æœå°‹é é¢"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr ""
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr ""
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "釋出"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境變數; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python 建議文件!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "å¹³å°ï¼š%s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[圖片]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (內建函å¼)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (在 %s 模組中)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (內建變數)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s() (在 %s 模組中)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (內建類別)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s 方法)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 方法)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s éœæ…‹æ–¹æ³•)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s éœæ…‹æ–¹æ³•)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s 屬性)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s 屬性)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C 函å¼)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C æˆå“¡)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C 巨集)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C 類別)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C 變數)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr ""
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "變數"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "返回"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "返回類別"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "åƒæ•¸"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%s命令列é¸é …; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "å¹³å°"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (模組)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Section 作者:"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "模組作者:"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "作者:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr ""
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "待辦"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "警示"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "å±éšª"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "錯誤"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "æ示"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "註解"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "å°æŠ€å·§"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "%s 版新功能"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "在 %s 版改變"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "%s 版後已移除"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "模組"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "é—œéµå­—"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "é‹ç®—å­"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "物件"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr ""
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "內建函å¼"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "æœå°‹ä¸­"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "準備æœå°‹..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "æœå°‹çµæžœ"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr ""
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr ""
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr ""
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr ""
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr ""
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "ç€è¦½"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "內容目錄"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "上一個主題"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "上一章"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "下一個主題"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "下一章"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "本é "
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr ""
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "顯示原始碼"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "快速æœå°‹"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "é—œéµå­—æœå°‹"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr ""
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "輸入一個模組ã€é¡žåˆ¥ã€æˆ–是函å¼å稱."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "在 %(docstitle)s 中æœå°‹"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "æœå°‹"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "版權所有"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最後更新日期是 %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr ""
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr ""
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "已移除"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "æœå°‹ %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+
+#: sphinx/templates/search.html:7
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "æœå°‹"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr ""
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API 改變"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "其他改變:"
+
+#~ msgid ""
+#~ "From here you can search these documents. Enter your search\n"
+#~ "    words into the box below and"
+#~ " click \"search\". Note that the "
+#~ "search\n"
+#~ "    function will automatically search for all of the words. Pages\n"
+#~ "    containing less words won't appear in the result list."
+#~ msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,533 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.quickstart
+    ~~~~~~~~~~~~~~~~~
+
+    Quickly setup documentation source to work with Sphinx.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys, os, time
+from os import path
+
+TERM_ENCODING = getattr(sys.stdin, 'encoding', None)
+
+from sphinx.util import make_filename
+from sphinx.util.console import purple, bold, red, turquoise, nocolor, color_terminal
+from sphinx.util.texescape import tex_escape_map
+
+
+PROMPT_PREFIX = '> '
+
+QUICKSTART_CONF = '''\
+# -*- coding: utf-8 -*-
+#
+# %(project)s documentation build configuration file, created by
+# sphinx-quickstart on %(now)s.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [%(extensions)s]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['%(dot)stemplates']
+
+# The suffix of source filenames.
+source_suffix = '%(suffix)s'
+
+# The encoding of source files.
+#source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = '%(master)s'
+
+# General information about the project.
+project = u'%(project)s'
+copyright = u'%(copyright)s'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '%(version)s'
+# The full version, including alpha/beta/rc tags.
+release = '%(release)s'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%%B %%d, %%Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = [%(exclude_trees)s]
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['%(dot)sstatic']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%%b %%d, %%Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = '%(project_fn)sdoc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('%(master)s', '%(project_fn)s.tex', ur'%(project_doc_texescaped)s',
+   ur'%(author_texescaped)s', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
+'''
+
+INTERSPHINX_CONFIG = '''
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {'http://docs.python.org/dev': None}
+'''
+
+MASTER_FILE = '''\
+.. %(project)s documentation master file, created by sphinx-quickstart on %(now)s.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to %(project)s's documentation!
+===========%(underline)s=================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
+'''
+
+MAKEFILE = '''\
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d %(rbuilddir)s/doctrees $(PAPEROPT_$(PAPER)) \
+$(SPHINXOPTS) %(rsrcdir)s
+
+.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
+
+help:
+\t@echo "Please use \\`make <target>' where <target> is one of"
+\t@echo "  html      to make standalone HTML files"
+\t@echo "  pickle    to make pickle files"
+\t@echo "  json      to make JSON files"
+\t@echo "  htmlhelp  to make HTML files and a HTML help project"
+\t@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+\t@echo "  changes   to make an overview over all changed/added/deprecated items"
+\t@echo "  linkcheck to check all external links for integrity"
+
+clean:
+\t-rm -rf %(rbuilddir)s/*
+
+html:
+\tmkdir -p %(rbuilddir)s/html %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) %(rbuilddir)s/html
+\t@echo
+\t@echo "Build finished. The HTML pages are in %(rbuilddir)s/html."
+
+pickle:
+\tmkdir -p %(rbuilddir)s/pickle %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) %(rbuilddir)s/pickle
+\t@echo
+\t@echo "Build finished; now you can process the pickle files."
+
+web: pickle
+
+json:
+\tmkdir -p %(rbuilddir)s/json %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) %(rbuilddir)s/json
+\t@echo
+\t@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+\tmkdir -p %(rbuilddir)s/htmlhelp %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) %(rbuilddir)s/htmlhelp
+\t@echo
+\t@echo "Build finished; now you can run HTML Help Workshop with the" \\
+\t      ".hhp project file in %(rbuilddir)s/htmlhelp."
+
+latex:
+\tmkdir -p %(rbuilddir)s/latex %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) %(rbuilddir)s/latex
+\t@echo
+\t@echo "Build finished; the LaTeX files are in %(rbuilddir)s/latex."
+\t@echo "Run \\`make all-pdf' or \\`make all-ps' in that directory to" \\
+\t      "run these through (pdf)latex."
+
+changes:
+\tmkdir -p %(rbuilddir)s/changes %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) %(rbuilddir)s/changes
+\t@echo
+\t@echo "The overview file is in %(rbuilddir)s/changes."
+
+linkcheck:
+\tmkdir -p %(rbuilddir)s/linkcheck %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) %(rbuilddir)s/linkcheck
+\t@echo
+\t@echo "Link check complete; look for any errors in the above output " \\
+\t      "or in %(rbuilddir)s/linkcheck/output.txt."
+'''
+
+
+def mkdir_p(dir):
+    if path.isdir(dir):
+        return
+    os.makedirs(dir)
+
+
+def is_path(x):
+    """Please enter a valid path name."""
+    return path.isdir(x) or not path.exists(x)
+
+def nonempty(x):
+    """Please enter some text."""
+    return len(x)
+
+def choice(*l):
+    def val(x):
+        return x in l
+    val.__doc__ = 'Please enter one of %s.' % ', '.join(l)
+    return val
+
+def boolean(x):
+    """Please enter either 'y' or 'n'."""
+    return x.upper() in ('Y', 'YES', 'N', 'NO')
+
+def suffix(x):
+    """Please enter a file suffix, e.g. '.rst' or '.txt'."""
+    return x[0:1] == '.' and len(x) > 1
+
+def ok(x):
+    return True
+
+
+def do_prompt(d, key, text, default=None, validator=nonempty):
+    while True:
+        if default:
+            prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default))
+        else:
+            prompt = purple(PROMPT_PREFIX + text + ': ')
+        x = raw_input(prompt)
+        if default and not x:
+            x = default
+        if x.decode('ascii', 'replace').encode('ascii', 'replace') != x:
+            if TERM_ENCODING:
+                x = x.decode(TERM_ENCODING)
+            else:
+                print turquoise('* Note: non-ASCII characters entered and terminal '
+                                'encoding unknown -- assuming UTF-8 or Latin-1.')
+                try:
+                    x = x.decode('utf-8')
+                except UnicodeDecodeError:
+                    x = x.decode('latin1')
+        if validator and not validator(x):
+            print red('* ' + validator.__doc__)
+            continue
+        break
+    d[key] = x
+
+
+def inner_main(args):
+    d = {}
+
+    if not sys.stdout.isatty() or not color_terminal():
+        nocolor()
+
+    print bold('Welcome to the Sphinx quickstart utility.')
+    print '''
+Please enter values for the following settings (just press Enter to
+accept a default value, if one is given in brackets).'''
+
+    print '''
+Enter the root path for documentation.'''
+    do_prompt(d, 'path', 'Root path for the documentation', '.', is_path)
+
+    while path.isfile(path.join(d['path'], 'conf.py')) or \
+          path.isfile(path.join(d['path'], 'source', 'conf.py')):
+        print
+        print bold('Error: an existing conf.py has been found in the '
+                   'selected root path.')
+        print 'sphinx-quickstart will not overwrite existing Sphinx projects.'
+        print
+        do_prompt(d, 'path', 'Please enter a new root path (or just Enter to exit)',
+                  '', is_path)
+        if not d['path']:
+            sys.exit(1)
+
+    print '''
+You have two options for placing the build directory for Sphinx output.
+Either, you use a directory ".build" within the root path, or you separate
+"source" and "build" directories within the root path.'''
+    do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n',
+              boolean)
+    print '''
+Inside the root directory, two more directories will be created; ".templates"
+for custom HTML templates and ".static" for custom stylesheets and other
+static files. Since the leading dot may be inconvenient for Windows users,
+you can enter another prefix (such as "_") to replace the dot.'''
+    do_prompt(d, 'dot', 'Name prefix for templates and static dir', '.', ok)
+
+    print '''
+The project name will occur in several places in the built documentation.'''
+    do_prompt(d, 'project', 'Project name')
+    do_prompt(d, 'author', 'Author name(s)')
+    print '''
+Sphinx has the notion of a "version" and a "release" for the
+software. Each version can have multiple releases. For example, for
+Python the version is something like 2.5 or 3.0, while the release is
+something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
+just set both to the same value.'''
+    do_prompt(d, 'version', 'Project version')
+    do_prompt(d, 'release', 'Project release', d['version'])
+    print '''
+The file name suffix for source files. Commonly, this is either ".txt"
+or ".rst".  Only files with this suffix are considered documents.'''
+    do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix)
+    print '''
+One document is special in that it is considered the top node of the
+"contents tree", that is, it is the root of the hierarchical structure
+of the documents. Normally, this is "index", but if your "index"
+document is a custom template, you can also set this to another filename.'''
+    do_prompt(d, 'master', 'Name of your master document (without suffix)',
+              'index')
+    print '''
+Please indicate if you want to use one of the following Sphinx extensions:'''
+    do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
+              'from modules (y/N)', 'n', boolean)
+    do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
+              'in doctest blocks (y/N)', 'n', boolean)
+    do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx documentation '
+              'of different projects (y/N)', 'n', boolean)
+    print '''
+If you are under Unix, a Makefile can be generated for you so that you
+only have to run e.g. `make html' instead of invoking sphinx-build
+directly.'''
+    do_prompt(d, 'makefile', 'Create Makefile? (Y/n)',
+              os.name == 'posix' and 'y' or 'n', boolean)
+
+    d['project_fn'] = make_filename(d['project'])
+    d['now'] = time.asctime()
+    d['underline'] = len(d['project']) * '='
+    d['extensions'] = ', '.join(
+        repr('sphinx.ext.' + name) for name in ('autodoc', 'doctest', 'intersphinx')
+        if d['ext_' + name].upper() in ('Y', 'YES'))
+    d['copyright'] = time.strftime('%Y') + ', ' + d['author']
+    d['author_texescaped'] = unicode(d['author']).translate(tex_escape_map)
+    d['project_doc'] = d['project'] + ' Documentation'
+    d['project_doc_texescaped'] = \
+        unicode(d['project'] + ' Documentation').translate(tex_escape_map)
+
+    if not path.isdir(d['path']):
+        mkdir_p(d['path'])
+
+    separate = d['sep'].upper() in ('Y', 'YES')
+    srcdir = separate and path.join(d['path'], 'source') or d['path']
+
+    mkdir_p(srcdir)
+    if separate:
+        builddir = path.join(d['path'], 'build')
+        d['exclude_trees'] = ''
+    else:
+        builddir = path.join(srcdir, d['dot'] + 'build')
+        d['exclude_trees'] = repr(d['dot'] + 'build')
+    mkdir_p(builddir)
+    mkdir_p(path.join(srcdir, d['dot'] + 'templates'))
+    mkdir_p(path.join(srcdir, d['dot'] + 'static'))
+
+    conf_text = QUICKSTART_CONF % d
+    if d['ext_intersphinx'].upper() in ('Y', 'YES'):
+        conf_text += INTERSPHINX_CONFIG
+
+    f = open(path.join(srcdir, 'conf.py'), 'w')
+    f.write(conf_text.encode('utf-8'))
+    f.close()
+
+    masterfile = path.join(srcdir, d['master'] + d['suffix'])
+    f = open(masterfile, 'w')
+    f.write((MASTER_FILE % d).encode('utf-8'))
+    f.close()
+
+    create_makefile = d['makefile'].upper() in ('Y', 'YES')
+    if create_makefile:
+        d['rsrcdir'] = separate and 'source' or '.'
+        d['rbuilddir'] = separate and 'build' or d['dot'] + 'build'
+        f = open(path.join(d['path'], 'Makefile'), 'w')
+        f.write((MAKEFILE % d).encode('utf-8'))
+        f.close()
+
+    print
+    print bold('Finished: An initial directory structure has been created.')
+    print '''
+You should now populate your master file %s and create other documentation
+source files. ''' % masterfile + (create_makefile and '''\
+Use the Makefile to build the docs, like so:
+   make builder
+''' or '''\
+Use the sphinx-build command to build the docs, like so:
+   sphinx-build -b builder %s %s
+''' % (srcdir, builddir)) + '''\
+where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
+'''
+
+
+def main(argv=sys.argv):
+    try:
+        return inner_main(argv)
+    except (KeyboardInterrupt, EOFError):
+        print
+        print '[Interrupted.]'
+        return
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,245 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.roles
+    ~~~~~~~~~~~~
+
+    Handlers for additional ReST roles.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+
+from docutils import nodes, utils
+from docutils.parsers.rst import roles
+
+from sphinx import addnodes
+from sphinx.util import ws_re, caption_ref_re
+
+
+generic_docroles = {
+    'command' : nodes.strong,
+    'dfn' : nodes.emphasis,
+    'guilabel' : nodes.strong,
+    'kbd' : nodes.literal,
+    'mailheader' : addnodes.literal_emphasis,
+    'makevar' : nodes.Text,
+    'manpage' : addnodes.literal_emphasis,
+    'mimetype' : addnodes.literal_emphasis,
+    'newsgroup' : addnodes.literal_emphasis,
+    'program' : nodes.strong,
+    'regexp' : nodes.literal,
+}
+
+for rolename, nodeclass in generic_docroles.iteritems():
+    roles.register_generic_role(rolename, nodeclass)
+
+
+def indexmarkup_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]):
+    env = inliner.document.settings.env
+    if not typ:
+        typ = env.config.default_role
+    else:
+        typ = typ.lower()
+    text = utils.unescape(etext)
+    targetid = 'index-%s' % env.index_num
+    env.index_num += 1
+    indexnode = addnodes.index()
+    targetnode = nodes.target('', '', ids=[targetid])
+    inliner.document.note_explicit_target(targetnode)
+    if typ == 'envvar':
+        indexnode['entries'] = [('single', text, targetid, text),
+                                ('single', _('environment variable; %s') % text,
+                                 targetid, text)]
+        xref_nodes = xfileref_role(typ, rawtext, etext, lineno, inliner,
+                                   options, content)[0]
+        return [indexnode, targetnode] + xref_nodes, []
+    elif typ == 'pep':
+        indexnode['entries'] = [('single',
+                                 _('Python Enhancement Proposals!PEP %s') % text,
+                                 targetid, 'PEP %s' % text)]
+        try:
+            pepnum = int(text)
+        except ValueError:
+            msg = inliner.reporter.error('invalid PEP number %s' % text, line=lineno)
+            prb = inliner.problematic(rawtext, rawtext, msg)
+            return [prb], [msg]
+        ref = inliner.document.settings.pep_base_url + 'pep-%04d' % pepnum
+        sn = nodes.strong('PEP '+text, 'PEP '+text)
+        rn = nodes.reference('', '', refuri=ref)
+        rn += sn
+        return [indexnode, targetnode, rn], []
+    elif typ == 'rfc':
+        indexnode['entries'] = [('single', 'RFC; RFC %s' % text,
+                                 targetid, 'RFC %s' % text)]
+        try:
+            rfcnum = int(text)
+        except ValueError:
+            msg = inliner.reporter.error('invalid RFC number %s' % text, line=lineno)
+            prb = inliner.problematic(rawtext, rawtext, msg)
+            return [prb], [msg]
+        ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+        sn = nodes.strong('RFC '+text, 'RFC '+text)
+        rn = nodes.reference('', '', refuri=ref)
+        rn += sn
+        return [indexnode, targetnode, rn], []
+
+roles.register_canonical_role('envvar', indexmarkup_role)
+roles.register_local_role('pep', indexmarkup_role)
+roles.register_local_role('rfc', indexmarkup_role)
+
+
+# default is `literal`
+innernodetypes = {
+    'ref': nodes.emphasis,
+    'term': nodes.emphasis,
+    'token': nodes.strong,
+    'envvar': nodes.strong,
+    'option': addnodes.literal_emphasis,
+}
+
+def _fix_parens(typ, text, env):
+    if typ in ('func', 'meth', 'cfunc'):
+        if text.endswith('()'):
+            # remove parentheses
+            text = text[:-2]
+        if env.config.add_function_parentheses:
+            # add them back to all occurrences if configured
+            text += '()'
+    return text
+
+def xfileref_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    env = inliner.document.settings.env
+    if not typ:
+        typ = env.config.default_role
+    else:
+        typ = typ.lower()
+    text = utils.unescape(text)
+    # if the first character is a bang, don't cross-reference at all
+    if text[0:1] == '!':
+        text = _fix_parens(typ, text[1:], env)
+        return [innernodetypes.get(typ, nodes.literal)(
+            rawtext, text, classes=['xref'])], []
+    # we want a cross-reference, create the reference node
+    pnode = addnodes.pending_xref(rawtext, reftype=typ, refcaption=False,
+                                  modname=env.currmodule, classname=env.currclass)
+    # we may need the line number for warnings
+    pnode.line = lineno
+    # the link title may differ from the target, but by default they are the same
+    title = target = text
+    titleistarget = True
+    # look if explicit title and target are given with `foo <bar>` syntax
+    brace = text.find('<')
+    if brace != -1:
+        titleistarget = False
+        pnode['refcaption'] = True
+        m = caption_ref_re.match(text)
+        if m:
+            target = m.group(2)
+            title = m.group(1)
+        else:
+            # fallback: everything after '<' is the target
+            target = text[brace+1:]
+            title = text[:brace]
+    # special target for Python object cross-references
+    if typ in ('data', 'exc', 'func', 'class', 'const', 'attr', 'meth', 'mod', 'obj'):
+        # fix-up parentheses in link title
+        if titleistarget:
+            title = title.lstrip('.')   # only has a meaning for the target
+            target = target.lstrip('~') # only has a meaning for the title
+            title = _fix_parens(typ, title, env)
+            # if the first character is a tilde, don't display the module/class
+            # parts of the contents
+            if title[0:1] == '~':
+                title = title[1:]
+                dot = title.rfind('.')
+                if dot != -1:
+                    title = title[dot+1:]
+        # remove parentheses from the target too
+        if target.endswith('()'):
+            target = target[:-2]
+        # if the first character is a dot, search more specific namespaces first
+        # else search builtins first
+        if target[0:1] == '.':
+            target = target[1:]
+            pnode['refspecific'] = True
+    # some other special cases for the target
+    elif typ == 'option':
+        program = env.currprogram
+        if titleistarget:
+            if ' ' in title and not (title.startswith('/') or title.startswith('-')):
+                program, target = re.split(' (?=-|--|/)', title, 1)
+                program = ws_re.sub('-', program)
+                target = target.strip()
+        elif ' ' in target:
+            program, target = re.split(' (?=-|--|/)', target, 1)
+            program = ws_re.sub('-', program)
+        pnode['refprogram'] = program
+    elif typ == 'term':
+        # normalize whitespace in definition terms (if the term reference is
+        # broken over a line, a newline will be in target)
+        target = ws_re.sub(' ', target).lower()
+    elif typ == 'ref':
+        # reST label names are always lowercased
+        target = ws_re.sub('', target).lower()
+    else:
+        # remove all whitespace to avoid referencing problems
+        target = ws_re.sub('', target)
+    pnode['reftarget'] = target
+    pnode += innernodetypes.get(typ, nodes.literal)(rawtext, title, classes=['xref'])
+    return [pnode], []
+
+
+def menusel_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    return [nodes.emphasis(
+        rawtext, utils.unescape(text).replace('-->', u'\N{TRIANGULAR BULLET}'))], []
+
+
+_litvar_re = re.compile('{([^}]+)}')
+
+def emph_literal_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    pos = 0
+    retnode = nodes.literal(role=typ.lower())
+    for m in _litvar_re.finditer(text):
+        if m.start() > pos:
+            txt = text[pos:m.start()]
+            retnode += nodes.Text(txt, txt)
+        retnode += nodes.emphasis(m.group(1), m.group(1))
+        pos = m.end()
+    if pos < len(text):
+        retnode += nodes.Text(text[pos:], text[pos:])
+    return [retnode], []
+
+
+specific_docroles = {
+    'data': xfileref_role,
+    'exc': xfileref_role,
+    'func': xfileref_role,
+    'class': xfileref_role,
+    'const': xfileref_role,
+    'attr': xfileref_role,
+    'meth': xfileref_role,
+    'obj': xfileref_role,
+    'cfunc' : xfileref_role,
+    'cmember': xfileref_role,
+    'cdata': xfileref_role,
+    'ctype': xfileref_role,
+    'cmacro': xfileref_role,
+
+    'mod': xfileref_role,
+
+    'keyword': xfileref_role,
+    'ref': xfileref_role,
+    'token': xfileref_role,
+    'term': xfileref_role,
+    'option': xfileref_role,
+
+    'menuselection': menusel_role,
+    'file': emph_literal_role,
+    'samp': emph_literal_role,
+}
+
+for rolename, func in specific_docroles.iteritems():
+    roles.register_canonical_role(rolename, func)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/search.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.search
+    ~~~~~~~~~~~~~
+
+    Create a search index for offline search.
+
+    :copyright: 2007-2008 by Armin Ronacher.
+    :license: BSD.
+"""
+import re
+import cPickle as pickle
+from cStringIO import StringIO
+
+from docutils.nodes import Text, NodeVisitor
+
+from sphinx.util.stemmer import PorterStemmer
+from sphinx.util import jsdump, rpartition
+
+
+word_re = re.compile(r'\w+(?u)')
+
+stopwords = set("""
+a  and  are  as  at
+be  but  by
+for
+if  in  into  is  it
+near  no  not
+of  on  or
+such
+that  the  their  then  there  these  they  this  to
+was  will  with
+""".split())
+
+
+class _JavaScriptIndex(object):
+    """
+    The search index as javascript file that calls a function
+    on the documentation search object to register the index.
+    """
+
+    PREFIX = 'Search.setIndex('
+    SUFFIX = ')'
+
+    def dumps(self, data):
+        return self.PREFIX + jsdump.dumps(data) + self.SUFFIX
+
+    def loads(self, s):
+        data = s[len(self.PREFIX):-len(self.SUFFIX)]
+        if not data or not s.startswith(self.PREFIX) or not \
+           s.endswith(self.SUFFIX):
+            raise ValueError('invalid data')
+        return jsdump.loads(data)
+
+    def dump(self, data, f):
+        f.write(self.dumps(data))
+
+    def load(self, f):
+        return self.loads(f.read())
+
+
+js_index = _JavaScriptIndex()
+
+
+class Stemmer(PorterStemmer):
+    """
+    All those porter stemmer implementations look hideous.
+    make at least the stem method nicer.
+    """
+
+    def stem(self, word):
+        word = word.lower()
+        return PorterStemmer.stem(self, word, 0, len(word) - 1)
+
+
+class WordCollector(NodeVisitor):
+    """
+    A special visitor that collects words for the `IndexBuilder`.
+    """
+
+    def __init__(self, document):
+        NodeVisitor.__init__(self, document)
+        self.found_words = []
+
+    def dispatch_visit(self, node):
+        if node.__class__ is Text:
+            self.found_words.extend(word_re.findall(node.astext()))
+
+
+class IndexBuilder(object):
+    """
+    Helper class that creates a searchindex based on the doctrees
+    passed to the `feed` method.
+    """
+    formats = {
+        'jsdump':   jsdump,
+        'pickle':   pickle
+    }
+
+    def __init__(self, env):
+        self.env = env
+        self._stemmer = Stemmer()
+        # filename -> title
+        self._titles = {}
+        # stemmed word -> set(filenames)
+        self._mapping = {}
+        # desctypes -> index
+        self._desctypes = {}
+
+    def load(self, stream, format):
+        """Reconstruct from frozen data."""
+        if isinstance(format, basestring):
+            format = self.formats[format]
+        frozen = format.load(stream)
+        # if an old index is present, we treat it as not existing.
+        if not isinstance(frozen, dict):
+            raise ValueError('old format')
+        index2fn = frozen['filenames']
+        self._titles = dict(zip(index2fn, frozen['titles']))
+        self._mapping = {}
+        for k, v in frozen['terms'].iteritems():
+            if isinstance(v, int):
+                self._mapping[k] = set([index2fn[v]])
+            else:
+                self._mapping[k] = set(index2fn[i] for i in v)
+        # no need to load keywords/desctypes
+
+    def dump(self, stream, format):
+        """Dump the frozen index to a stream."""
+        if isinstance(format, basestring):
+            format = self.formats[format]
+        format.dump(self.freeze(), stream)
+
+    def get_modules(self, fn2index):
+        rv = {}
+        for name, (doc, _, _, _) in self.env.modules.iteritems():
+            rv[name] = fn2index[doc]
+        return rv
+
+    def get_descrefs(self, fn2index):
+        rv = {}
+        dt = self._desctypes
+        for fullname, (doc, desctype) in self.env.descrefs.iteritems():
+            prefix, name = rpartition(fullname, '.')
+            pdict = rv.setdefault(prefix, {})
+            try:
+                i = dt[desctype]
+            except KeyError:
+                i = len(dt)
+                dt[desctype] = i
+            pdict[name] = (fn2index[doc], i)
+        return rv
+
+    def get_terms(self, fn2index):
+        rv = {}
+        for k, v in self._mapping.iteritems():
+            if len(v) == 1:
+                fn, = v
+                rv[k] = fn2index[fn]
+            else:
+                rv[k] = [fn2index[fn] for fn in v]
+        return rv
+
+    def freeze(self):
+        """Create a usable data structure for serializing."""
+        filenames = self._titles.keys()
+        titles = self._titles.values()
+        fn2index = dict((f, i) for (i, f) in enumerate(filenames))
+        return dict(
+            filenames=filenames,
+            titles=titles,
+            terms=self.get_terms(fn2index),
+            descrefs=self.get_descrefs(fn2index),
+            modules=self.get_modules(fn2index),
+            desctypes=dict((v, k) for (k, v) in self._desctypes.items()),
+        )
+
+    def prune(self, filenames):
+        """Remove data for all filenames not in the list."""
+        new_titles = {}
+        for filename in filenames:
+            if filename in self._titles:
+                new_titles[filename] = self._titles[filename]
+        self._titles = new_titles
+        for wordnames in self._mapping.itervalues():
+            wordnames.intersection_update(filenames)
+
+    def feed(self, filename, title, doctree):
+        """Feed a doctree to the index."""
+        self._titles[filename] = title
+
+        visitor = WordCollector(doctree)
+        doctree.walk(visitor)
+
+        def add_term(word, prefix='', stem=self._stemmer.stem):
+            word = stem(word)
+            if len(word) < 3 or word in stopwords or word.isdigit():
+                return
+            self._mapping.setdefault(prefix + word, set()).add(filename)
+
+        for word in word_re.findall(title):
+            add_term(word)
+
+        for word in visitor.found_words:
+            add_term(word)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.setup_command
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Setuptools/distutils commands to assist the building of sphinx
+    documentation.
+
+    :author: Sebastian Wiesner
+    :contact: basti.wiesner@gmx.net
+    :copyright: 2008 by Sebastian Wiesner.
+    :license: MIT.
+"""
+
+import sys
+import os
+from StringIO import StringIO
+from distutils.cmd import Command
+
+from sphinx.application import Sphinx
+from sphinx.util.console import darkred, nocolor
+
+
+class BuildDoc(Command):
+    """Distutils command to build Sphinx documentation."""
+
+    description = 'Build Sphinx documentation'
+    user_options = [
+        ('fresh-env', 'E', 'discard saved environment'),
+        ('all-files', 'a', 'build all files'),
+        ('source-dir=', 's', 'Source directory'),
+        ('build-dir=', None, 'Build directory'),
+        ('builder=', 'b', 'The builder to use. Defaults to "html"'),
+        ]
+    boolean_options = ['fresh-env', 'all-files']
+
+
+    def initialize_options(self):
+        self.fresh_env = self.all_files = False
+        self.source_dir = self.build_dir = None
+        self.conf_file_name = 'conf.py'
+        self.builder = 'html'
+
+    def finalize_options(self):
+        if self.source_dir is None:
+            if os.path.isdir('doc'):
+                for root, dirnames, filenames in os.walk('doc'):
+                    if 'conf.py' in filenames:
+                        self.source_dir = root
+                        self.announce('Using source directory %s' % root)
+                        break
+        self.ensure_dirname('source_dir')
+        self.source_dir = os.path.abspath(self.source_dir)
+
+        if self.build_dir is None:
+            build = self.get_finalized_command('build')
+            self.build_dir = os.path.join(build.build_base, 'sphinx')
+            self.mkpath(self.build_dir)
+        self.ensure_dirname('build_dir')
+        self.doctree_dir = os.path.join(self.build_dir, 'doctrees')
+        self.mkpath(self.doctree_dir)
+        self.builder_target_dir = os.path.join(self.build_dir, self.builder)
+        self.mkpath(self.builder_target_dir)
+
+    def run(self):
+        if not sys.stdout.isatty() or sys.platform == 'win32':
+            # Windows' poor cmd box doesn't understand ANSI sequences
+            nocolor()
+        if not self.verbose:
+            status_stream = StringIO()
+        else:
+            status_stream = sys.stdout
+        app = Sphinx(self.source_dir, self.source_dir,
+                     self.builder_target_dir, self.doctree_dir,
+                     self.builder, {}, status_stream,
+                     freshenv=self.fresh_env)
+
+        try:
+            if self.all_files:
+                app.builder.build_all()
+            else:
+                app.builder.build_update()
+        except Exception, err:
+            from docutils.utils import SystemMessage
+            if isinstance(err, SystemMessage):
+                sys.stderr, darkred('reST markup error:')
+                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
+            else:
+                raise
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,657 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    color: #fff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    color: #fff;
+    width: 100%;
+    line-height: 30px;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related a {
+    color: white;
+}
+
+/* ::: TOC :::: */
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: white;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    list-style: none;
+    color: white;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+    margin: -5px 10px 5px 10px;
+    padding: 10px;
+    line-height: 160%;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+    padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    padding: 5px 10px 5px 10px;
+    border-top: 1px solid #cbe7e5;
+    border-bottom: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    font-weight: bold;
+}
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+    background-color: #ffe4e4;
+    padding: 10px;
+    margin: 0 -20px 0 -20px;
+    border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* Sidebars */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    padding: 5px;
+    background-color: #efc;
+    color: #333;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 100%;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+img.math {
+    vertical-align: middle;
+}
+
+div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+img.logo {
+    border: 0;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width : 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,232 @@
+/// XXX: make it cross browser
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+ */
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {}
+}
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+}
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+}
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this)
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initModIndex();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can savely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[@id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[@id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlight');
+        });
+      }, 10);
+      $('<li class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
+          .appendTo($('.sidebar .this-page-menu'));
+    }
+  },
+
+  /**
+   * init the modindex toggle buttons
+   */
+  initModIndex : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      console.log($('tr.cg-' + idnum).toggle());
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('span.highlight').removeClass('highlight');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png has changed
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png has changed
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,16 @@
+/**
+ * Sphinx Doc Design -- Right Side Bar Overrides
+ */
+
+
+div.sphinxsidebar {
+    float: right;
+}
+
+div.bodywrapper {
+    margin: 0 230px 0 0;
+}
+
+div.inlinecomments {
+    right: 250px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,467 @@
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+  var textLower = text.toLowerCase();
+  var start = 0;
+  $.each(keywords, function() {
+    var i = textLower.indexOf(this.toLowerCase());
+    if (i > -1)
+      start = i;
+  });
+  start = Math.max(start - 120, 0);
+  var excerpt = ((start > 0) ? '...' : '') +
+  $.trim(text.substr(start, 240)) +
+  ((start + 240 - text.length) ? '...' : '');
+  var rv = $('<div class="context"></div>').text(excerpt);
+  $.each(hlwords, function() {
+    rv = rv.highlightText(this, 'highlight');
+  });
+  return rv;
+}
+
+/**
+ * Porter Stemmer
+ */
+var PorterStemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[@name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  /**
+   * Sets the index
+   */
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (var i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.setQuery(query);
+  },
+
+  query : function(query) {
+    // stem the searchterms and add them to the
+    // correct list
+    var stemmer = new PorterStemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    for (var i = 0; i < tmp.length; i++) {
+      // stem the word
+      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      // select the correct list
+      if (word[0] == '-') {
+        var toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        var toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$.contains(toAppend, word))
+        toAppend.push(word);
+    };
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    console.debug('SEARCH: searching for:');
+    console.info('required: ', searchterms);
+    console.info('excluded: ', excluded);
+
+    // prepare search
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+    var terms = this._index.terms;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
+    var desctypes = this._index.desctypes;
+    var fileMap = {};
+    var files = null;
+    var objectResults = [];
+    var regularResults = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          if (name.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            fullname = (prefix ? prefix + '.' : '') + name;
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+
+    // perform the search on the required terms
+    for (var i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) == null)
+        break;
+      if (files.length == undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (var j = 0; j < files.length; j++) {
+        var file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (var file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+        continue;
+
+      // ensure that none of the excluded terms is in the
+      // search result.
+      for (var i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            $.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it
+      // to the result list
+      if (valid)
+        regularResults.push([filenames[file], titles[file], '', null]);
+    }
+
+    // delete unused variables in order to not waste
+    // memory until list is retrieved completely
+    delete filenames, titles, terms;
+
+    // now sort the regular results descending by title
+    regularResults.sort(function(a, b) {
+      var left = a[1].toLowerCase();
+      var right = b[1].toLowerCase();
+      return (left > right) ? -1 : ((left < right) ? 1 : 0);
+    });
+
+    // combine both
+    var results = regularResults.concat(objectResults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        listItem.append($('<a/>').attr(
+          'href',
+          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+          highlightstring + item[2]).html(item[1]));
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.get('_sources/' + item[0] + '.txt', function(data) {
+            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+            Search.output.append(listItem);
+            listItem.slideDown(5, function() {
+              displayNextItem();
+            });
+          });
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  }
+}
+
+$(document).ready(function() {
+  Search.init();
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,557 @@
+/**
+ * Alternate Sphinx design
+ * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl.
+ */
+
+body {
+    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;
+    font-size: 14px;
+    letter-spacing: -0.01em;
+    line-height: 150%;
+    text-align: center;
+    /*background-color: #AFC1C4; */
+    background-color: #BFD1D4;
+    color: black;
+    padding: 0;
+    border: 1px solid #aaa;
+
+    margin: 0px 80px 0px 80px;
+    min-width: 740px;
+}
+
+a {
+    color: #CA7900;
+    text-decoration: none;
+}
+
+a:hover {
+    color: #2491CF;
+}
+
+pre {
+    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+    font-size: 0.95em;
+    letter-spacing: 0.015em;
+    padding: 0.5em;
+    border: 1px solid #ccc;
+    background-color: #f8f8f8;
+}
+
+td.linenos pre {
+    padding: 0.5em 0;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+cite, code, tt {
+    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+    font-size: 0.95em;
+    letter-spacing: 0.01em;
+}
+
+hr {
+    border: 1px solid #abc;
+    margin: 2em;
+}
+
+tt {
+    background-color: #f2f2f2;
+    border-bottom: 1px solid #ddd;
+    color: #333;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+    border: 0;
+}
+
+tt.descclassname {
+    background-color: transparent;
+    border: 0;
+}
+
+tt.xref {
+    background-color: transparent;
+    font-weight: bold;
+    border: 0;
+}
+
+a tt {
+    background-color: transparent;
+    font-weight: bold;
+    border: 0;
+    color: #CA7900;
+}
+
+a tt:hover {
+    color: #2491CF;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+pre {
+    line-height: 120%;
+}
+
+pre a {
+    color: inherit;
+    text-decoration: underline;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+div.document {
+    background-color: white;
+    text-align: left;
+    background-image: url(contents.png);
+    background-repeat: repeat-x;
+}
+
+/*
+div.documentwrapper {
+    width: 100%;
+}
+*/
+
+div.clearer {
+    clear: both;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    background-image: url(navigation.png);
+    height: 2em;
+    list-style: none;
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 0;
+    padding-left: 10px;
+}
+
+div.related ul li {
+    margin: 0;
+    padding: 0;
+    height: 2em;
+    float: left;
+}
+
+div.related ul li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related ul li a {
+    margin: 0;
+    padding: 0 5px 0 5px;
+    line-height: 1.75em;
+    color: #EE9816;
+}
+
+div.related ul li a:hover {
+    color: #3CA8E7;
+}
+
+div.body {
+    margin: 0;
+    padding: 0.5em 20px 20px 20px;
+}
+
+div.bodywrapper {
+    margin: 0 240px 0 0;
+    border-right: 1px solid #ccc;
+}
+
+div.body a {
+    text-decoration: underline;
+}
+
+div.sphinxsidebar {
+    margin: 0;
+    padding: 0.5em 15px 15px 0;
+    width: 210px;
+    float: right;
+    text-align: left;
+/*    margin-left: -100%; */
+}
+
+div.sphinxsidebar h4, div.sphinxsidebar h3 {
+    margin: 1em 0 0.5em 0;
+    font-size: 0.9em;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    border: 1px solid #86989B;
+    background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar ul {
+    padding-left: 1.5em;
+    margin-top: 7px;
+    list-style: none;
+    padding: 0;
+    line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+    list-style: square;
+    margin-left: 20px;
+}
+
+p {
+    margin: 0.8em 0 0.5em 0;
+}
+
+p.rubric {
+    font-weight: bold;
+}
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+div.quotebar {
+    background-color: #f8f8f8;
+    max-width: 250px;
+    float: right;
+    padding: 2px 7px;
+    border: 1px solid #ccc;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+div.topic {
+    background-color: #f8f8f8;
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+}
+
+h1 {
+    margin: 0;
+    padding: 0.7em 0 0.3em 0;
+    font-size: 1.5em;
+    color: #11557C;
+}
+
+h2 {
+    margin: 1.3em 0 0.2em 0;
+    font-size: 1.35em;
+    padding: 0;
+}
+
+h3 {
+    margin: 1em 0 -0.3em 0;
+    font-size: 1.2em;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+    color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+    display: none;
+    margin: 0 0 0 0.3em;
+    padding: 0 0.2em 0 0.2em;
+    color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+    display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+    color: #777;
+    background-color: #eee;
+}
+
+table {
+    border-collapse: collapse;
+    margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+    padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.footer {
+    background-color: #E3EFF1;
+    color: #86989B;
+    padding: 3px 8px 3px 0;
+    clear: both;
+    font-size: 0.8em;
+    text-align: right;
+}
+
+div.footer a {
+    color: #86989B;
+    text-decoration: underline;
+}
+
+div.pagination {
+    margin-top: 2em;
+    padding-top: 0.5em;
+    border-top: 1px solid black;
+    text-align: center;
+}
+
+div.sphinxsidebar ul.toc {
+    margin: 1em 0 1em 0;
+    padding: 0 0 0 0.5em;
+    list-style: none;
+}
+
+div.sphinxsidebar ul.toc li {
+    margin: 0.5em 0 0.5em 0;
+    font-size: 0.9em;
+    line-height: 130%;
+}
+
+div.sphinxsidebar ul.toc li p {
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar ul.toc ul {
+    margin: 0.2em 0 0.2em 0;
+    padding: 0 0 0 1.8em;
+}
+
+div.sphinxsidebar ul.toc ul li {
+    padding: 0;
+}
+
+div.admonition, div.warning {
+    font-size: 0.9em;
+    margin: 1em 0 0 0;
+    border: 1px solid #86989B;
+    background-color: #f7f7f7;
+}
+
+div.admonition p, div.warning p {
+    margin: 0.5em 1em 0.5em 1em;
+    padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+    margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+    margin: 0;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    border-bottom: 1px solid #86989B;
+    font-weight: bold;
+    background-color: #AFC1C4;
+}
+
+div.warning {
+    border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+    background-color: #CF0000;
+    border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+    margin: 0.1em 0.5em 0.5em 3em;
+    padding: 0;
+}
+
+div.versioninfo {
+    margin: 1em 0 0 0;
+    border: 1px solid #ccc;
+    background-color: #DDEAF0;
+    padding: 8px;
+    line-height: 1.3em;
+    font-size: 0.9em;
+}
+
+
+a.headerlink {
+    color: #c60f0f!important;
+    font-size: 1em;
+    margin-left: 6px;
+    padding: 0 4px 0 4px;
+    text-decoration: none!important;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #ccc;
+    color: white!important;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+img.math {
+    vertical-align: center;
+}
+
+div.math {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+img.logo {
+    border: 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+/**
+ * Sphinx Doc Design -- Sticky sidebar Overrides
+ */
+
+div.sphinxsidebar {
+    top: 30px;
+    left: 0px;
+    position: fixed;
+    margin: 0;
+    float: none;
+}
+
+div.related {
+    position: fixed;
+}
+
+div.documentwrapper {
+    margin-top: 30px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,700 @@
+/**
+ * Sphinx Doc Design -- traditional python.org style
+ */
+
+body {
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 230px 0 0;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    border: 1px solid #99ccff;
+    padding: 10px;
+    margin: 10px 15px 10px 0;
+}
+
+div.sphinxsidebar {
+    float: right;
+    margin-left: -100%;
+    width: 230px;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    clear: both;
+    width: 100%;
+    background-color: #99ccff;
+    padding: 9px 0 9px 0;
+    text-align: center;
+}
+
+div.related {
+    background-color: #99ccff;
+    color: #333;
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    border-bottom: 5px solid white;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+    font-weight: bold;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* ::: SIDEBAR :::: */
+div.sphinxsidebar h3 {
+    margin: 0;
+}
+
+div.sphinxsidebar h4 {
+    margin: 5px 0 0 0;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    margin-left: 15px;
+    padding: 0;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    border-top: 1px solid #aaa;
+    background-color: #ddd;
+    margin: 10px 0 0 -20px;
+    padding: 5px 0 5px 20px;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    /*border: 2px solid #05171e;
+    background-color: #092835;
+    color: white;*/
+    font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecommentswrapper {
+    float: right;
+    max-width: 40%;
+}
+
+div.commentmarker {
+    float: right;
+    background-image: url(style/comment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+    text-align: center;
+    padding-top: 3px;
+}
+
+div.nocommentmarker {
+    float: right;
+    background-image: url(style/nocomment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+}
+
+div.inlinecomments {
+    margin-left: 10px;
+    margin-bottom: 5px;
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 5px;
+}
+
+div.inlinecomment {
+    border-top: 1px solid #ccc;
+    padding-top: 5px;
+    margin-top: 5px;
+}
+
+.inlinecomments p {
+    margin: 5px 0 5px 0;
+}
+
+.inlinecomments .head {
+    font-weight: bold;
+}
+
+.inlinecomments .meta {
+    font-style: italic;
+}
+
+
+/* :::: COMMENTS :::: */
+
+div#comments h3 {
+    border-top: 1px solid #aaa;
+    padding: 5px 20px 5px 20px;
+    margin: 20px -20px 20px -20px;
+    background-color: #ddd;
+}
+
+/*
+div#comments {
+    background-color: #ccc;
+    margin: 40px -20px -30px -20px;
+    padding: 0 0 1px 0;
+}
+
+div#comments h4 {
+    margin: 30px 0 20px 0;
+    background-color: #aaa;
+    border-bottom: 1px solid #09232e;
+    color: #333;
+}
+
+div#comments form {
+    display: block;
+    margin: 0 0 0 20px;
+}
+
+div#comments textarea {
+    width: 98%;
+    height: 160px;
+}
+
+div#comments div.help {
+    margin: 20px 20px 10px 0;
+    background-color: #ccc;
+    color: #333;
+}
+
+div#comments div.help p {
+    margin: 0;
+    padding: 0 0 10px 0;
+}
+
+div#comments input, div#comments textarea {
+    font-family: 'Bitstream Vera Sans', 'Arial', sans-serif;
+    font-size: 13px;
+    color: black;
+    background-color: #aaa;
+    border: 1px solid #092835;
+}
+
+div#comments input[type="reset"],
+div#comments input[type="submit"] {
+    cursor: pointer;
+    font-weight: bold;
+    padding: 2px;
+    margin: 5px 5px 5px 0;
+    background-color: #666;
+    color: white;
+}
+
+div#comments div.comment {
+    margin: 10px 10px 10px 20px;
+    padding: 10px;
+    border: 1px solid #0f3646;
+    background-color: #aaa;
+    color: #333;
+}
+
+div#comments div.comment p {
+    margin: 5px 0 5px 0;
+}
+
+div#comments div.comment p.meta {
+    font-style: italic;
+    color: #444;
+    text-align: right;
+    margin: -5px 0 -5px 0;
+}
+
+div#comments div.comment h4 {
+    margin: -10px -10px 5px -10px;
+    padding: 3px;
+    font-size: 15px;
+    background-color: #888;
+    color: white;
+    border: 0;
+}
+
+div#comments div.comment pre,
+div#comments div.comment tt {
+    background-color: #ddd;
+    color: #111;
+    border: none;
+}
+
+div#comments div.comment a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div#comments div.comment blockquote {
+    margin: 10px;
+    padding: 10px;
+    border-left: 1px solid #0f3646;
+    /*border: 1px solid #0f3646;
+    background-color: #071c25;*/
+}
+
+div#comments em.important {
+    color: #d00;
+    font-weight: bold;
+    font-style: normal;
+}*/
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+    border: 1px solid #ccc;
+    background-color: white;
+    color: black;
+}
+
+div#suggest-changes-box textarea {
+    width: 99%;
+    height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+    background-image: url(style/preview.png);
+    padding: 0 20px 20px 20px;
+    margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.5em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+}
+
+/* :::: GENINDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a:link:active           { color: #ff0000; }
+a:link:hover            { background-color: #bbeeff; }
+a:visited:hover         { background-color: #bbeeff; }
+a:visited               { color: #551a8b; }
+a:link                  { color: #0000bb; }
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: avantgarde, sans-serif;
+    font-weight: bold;
+}
+
+div.body h1 { font-size: 180%; }
+div.body h2 { font-size: 150%; }
+div.body h3 { font-size: 120%; }
+div.body h4 { font-size: 120%; }
+
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 0 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dd {
+    margin-bottom: 10px;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 0 8px 2px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.refcount {
+    color: #060;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    font-family: monospace;
+    padding: 5px;
+    color: #00008b;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    font-family: monospace;
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 13px;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.documentwrapper {
+        width: 100%;
+    }
+
+    div.body {
+        margin: 0;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
+  "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+  <head>
+    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
+  </head>
+  <frameset cols="45%,*">
+    <frame name="main" src="changes.html">
+    <frame name="src" src="about:blank">
+  </frameset>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>{% trans filename=filename, docstitle=docstitle|e %}{{ filename }} &mdash; {{ docstitle }}{% endtrans %}</title>
+    <style type="text/css">
+      .hl { background-color: yellow }
+    </style>
+  </head>
+  <body style="font-size: 90%">
+    <pre>
+      {{ text }}
+    </pre>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+{% macro entries changes %}
+<ul>{% for entry, docname, lineno in changes %}
+<li><a href="rst/{{ docname }}.html#L{{ lineno-10 }}" target="src">{{ entry }}</a></li>
+{% endfor %}</ul>
+{% endmacro -%}
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <link rel="stylesheet" href="default.css">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
+  </head>
+  <body>
+    <div class="document">
+      <div class="body">
+    <h1>{% trans version=version|e %}Automatically generated list of changes in version {{ version }}{% endtrans %}</h1>
+    <h2>{{ _('Library changes') }}</h2>
+    {% for modname, changes in libchanges %}
+    <h4>{{ modname }}</h4>
+    {{ entries(changes) }}
+    {% endfor %}
+    <h2>{{ _('C API changes') }}</h2>
+    {{ entries(apichanges) }}
+    <h2>{{ _('Other changes') }}</h2>
+    {% for (fn, title), changes in otherchanges %}
+    <h4>{{ title }} <span style="font-size: 50%">({{ fn }})</span></h4>
+    {{ entries(changes) }}
+    {% endfor %}
+      </div>
+    </div>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+{% extends "layout.html" %}
+{% set title = _('Overview') %}
+{% block body %}
+  <h1>{{ docstitle|e }}</h1>
+  <p>
+    Welcome! This is
+    {% block description %}the documentation for {{ project|e }}
+    {{ release|e }}{% if last_updated %}, last updated {{ last_updated|e }}{% endif %}{% endblock %}.
+  </p>
+  {% block tables %}
+  <p><strong>{{ _('Indices and tables:') }}</strong></p>
+  <table class="contentstable" align="center"><tr>
+    <td width="50%">
+      <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">{{ _('Complete Table of Contents') }}</a><br>
+         <span class="linkdescr">{{ _('lists all sections and subsections') }}</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ _('Search Page') }}</a><br>
+         <span class="linkdescr">{{ _('search this documentation') }}</span></p>
+    </td><td width="50%">
+      <p class="biglink"><a class="biglink" href="{{ pathto("modindex") }}">{{ _('Global Module Index') }}</a><br>
+         <span class="linkdescr">{{ _('quick access to all modules') }}</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">{{ _('General Index') }}</a><br>
+         <span class="linkdescr">{{ _('all functions, classes, terms') }}</span></p>
+    </td></tr>
+  </table>
+  {% endblock %}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{% trans key=key %}Index &ndash; {{ key }}{% endtrans %}</h1>
+
+<table width="100%" class="indextable"><tr><td width="33%" valign="top">
+<dl>
+{%- set breakat = count // 2 %}
+{%- set numcols = 1 %}
+{%- set numitems = 0 %}
+{% for entryname, (links, subitems) in entries %}
+<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
+  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+  {%- else -%}
+{{ entryname|e }}
+  {%- endif -%}</dt>
+  {%- if subitems %}
+  <dd><dl>
+    {%- for subentryname, subentrylinks in subitems %}
+    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
+    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+    </dt>
+    {%- endfor %}
+  </dl></dd>
+  {%- endif -%}
+{%- set numitems = numitems + 1 + (subitems|length) -%}
+{%- if numcols < 2 and numitems > breakat -%}
+{%- set numcols = numcols+1 -%}
+</dl></td><td width="33%" valign="top"><dl>
+{%- endif -%}
+{%- endfor %}
+</dl></td></tr></table>
+
+{% endblock %}
+
+{% block sidebarrel %}
+   <h4>Index</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{{ _('Index') }}</h1>
+
+   <p>{{ _('Index pages by letter') }}:</p>
+
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong>
+                                               ({{ _('can be huge') }})</a></p>
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+   <h4>Index</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{{ _('Index') }}</h1>
+
+   {% for key, dummy in genindexentries -%}
+   <a href="#{{ key }}"><strong>{{ key }}</strong></a> {% if not loop.last %}| {% endif %}
+   {%- endfor %}
+
+   <hr />
+
+   {% for key, entries in genindexentries %}
+<h2 id="{{ key }}">{{ key }}</h2>
+<table width="100%" class="indextable"><tr><td width="33%" valign="top">
+<dl>
+{%- set breakat = genindexcounts[loop.index0] // 2 %}
+{%- set numcols = 1 %}
+{%- set numitems = 0 %}
+{% for entryname, (links, subitems) in entries %}
+<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
+  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+  {%- else -%}
+{{ entryname|e }}
+  {%- endif -%}</dt>
+  {%- if subitems %}
+  <dd><dl>
+    {%- for subentryname, subentrylinks in subitems %}
+    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
+    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+    </dt>
+    {%- endfor %}
+  </dl></dd>
+  {%- endif -%}
+{%- set numitems = numitems + 1 + (subitems|length) -%}
+{%- if numcols < 2 and numitems > breakat -%}
+{%- set numcols = numcols+1 -%}
+</dl></td><td width="33%" valign="top"><dl>
+{%- endif -%}
+{%- endfor %}
+</dl></td></tr></table>
+{% endfor %}
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+   <h4>{{ _('Index') }}</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,192 @@
+{%- block doctype -%}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+{%- endblock %}
+{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
+{%- macro relbar %}
+    <div class="related">
+      <h3>{{ _('Navigation') }}</h3>
+      <ul>
+        {%- for rellink in rellinks %}
+        <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
+          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags }}"
+             accesskey="{{ rellink[2] }}">{{ rellink[3] }}</a>
+          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
+        {%- endfor %}
+        {%- block rootrellink %}
+        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
+        {%- endblock %}
+        {%- for parent in parents %}
+          <li><a href="{{ parent.link|e }}" accesskey="U">{{ parent.title }}</a>{{ reldelim1 }}</li>
+        {%- endfor %}
+        {%- block relbaritems %} {% endblock %}
+      </ul>
+    </div>
+{%- endmacro %}
+{%- macro sidebar %}
+      {%- if builder != 'htmlhelp' %}
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+          {%- block sidebarlogo %}
+          {%- if logo %}
+            <p class="logo"><a href="{{ pathto(master_doc) }}">
+              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
+            </a></p>
+          {%- endif %}
+          {%- endblock %}
+          {%- block sidebartoc %}
+          {%- if display_toc %}
+            <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
+            {{ toc }}
+          {%- endif %}
+          {%- endblock %}
+          {%- block sidebarrel %}
+          {%- if prev %}
+            <h4>{{ _('Previous topic') }}</h4>
+            <p class="topless"><a href="{{ prev.link|e }}" title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
+          {%- endif %}
+          {%- if next %}
+            <h4>{{ _('Next topic') }}</h4>
+            <p class="topless"><a href="{{ next.link|e }}" title="{{ _('next chapter') }}">{{ next.title }}</a></p>
+          {%- endif %}
+          {%- endblock %}
+          {%- if sourcename %}
+            <h3>{{ _('This Page') }}</h3>
+            <ul class="this-page-menu">
+            {%- if builder == 'web' %}
+              <li><a href="#comments">Comments ({{ comments|length }} so far)</a></li>
+              <li><a href="{{ pathto('@edit/' + sourcename)|e }}">{{ _('Suggest Change') }}</a></li>
+              <li><a href="{{ pathto('@source/' + sourcename)|e }}">{{ _('Show Source') }}</a></li>
+            {%- elif builder == 'html' %}
+              <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}">{{ _('Show Source') }}</a></li>
+            {%- endif %}
+            </ul>
+          {%- endif %}
+          {%- if customsidebar %}
+          {{ rendertemplate(customsidebar) }}
+          {%- endif %}
+          {%- block sidebarsearch %}
+          {%- if pagename != "search" %}
+          <h3>{% if builder == 'web' %}{{ _('Keyword search')}}{% else %}{{ _('Quick search') }}{% endif %}</h3>
+            <form class="search" action="{{ pathto('search') }}" method="get">
+              <input type="text" name="q" size="18" /> <input type="submit" value="{{ _('Go') }}" />
+              <input type="hidden" name="check_keywords" value="yes" />
+              <input type="hidden" name="area" value="default" />
+            </form>
+            {%- if builder == 'web' %}
+            <p style="font-size: 90%">{{ _('Enter a module, class or function name.') }}</p>
+            {%- endif %}
+          {%- endif %}
+          {%- endblock %}
+        </div>
+      </div>
+      {%- endif %}
+{%- endmacro -%}
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    {{ metatags }}
+    {%- if builder != 'htmlhelp' %}
+      {%- set titlesuffix = " &mdash; " + docstitle|e %}
+    {%- endif %}
+    <title>{{ title|striptags }}{{ titlesuffix }}</title>
+    {%- if builder == 'web' %}
+    <link rel="stylesheet" href="{{ pathto('index') }}?do=stylesheet{%
+      if in_admin_panel %}&admin=yes{% endif %}" type="text/css" />
+    {%- for link, type, title in page_links %}
+    <link rel="alternate" type="{{ type|e(true) }}" title="{{ title|e(true) }}" href="{{ link|e(true) }}" />
+    {%- endfor %}
+    {%- else %}
+    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+    {%- endif %}
+    {%- if builder != 'htmlhelp' %}
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '{{ pathto("", 1) }}',
+        VERSION:     '{{ release|e }}',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '{{ file_suffix }}',
+        HAS_SOURCE:  {{ has_source|lower }}
+      };
+    </script>
+    {%- for scriptfile in script_files %}
+    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+    {%- endfor %}
+    {%- if use_opensearch %}
+    <link rel="search" type="application/opensearchdescription+xml"
+          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
+          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
+    {%- endif %}
+    {%- if favicon %}
+    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
+    {%- endif %}
+    {%- endif %}
+{%- block linktags %}
+    {%- if hasdoc('about') %}
+    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
+    {%- endif %}
+    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
+    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
+    {%- if hasdoc('copyright') %}
+    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
+    {%- endif %}
+    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
+    {%- if parents %}
+    <link rel="up" title="{{ parents[-1].title|striptags }}" href="{{ parents[-1].link|e }}" />
+    {%- endif %}
+    {%- if next %}
+    <link rel="next" title="{{ next.title|striptags }}" href="{{ next.link|e }}" />
+    {%- endif %}
+    {%- if prev %}
+    <link rel="prev" title="{{ prev.title|striptags }}" href="{{ prev.link|e }}" />
+    {%- endif %}
+{%- endblock %}
+{%- block extrahead %} {% endblock %}
+  </head>
+  <body>
+
+{%- block relbar1 %}{{ relbar() }}{% endblock %}
+
+{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
+
+{%- block document %}
+    <div class="document">
+      <div class="documentwrapper">
+      {%- if builder != 'htmlhelp' %}
+        <div class="bodywrapper">
+      {%- endif %}
+          <div class="body">
+            {% block body %} {% endblock %}
+          </div>
+      {%- if builder != 'htmlhelp' %}
+        </div>
+      {%- endif %}
+      </div>
+{%- endblock %}
+
+{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
+      <div class="clearer"></div>
+    </div>
+
+{%- block relbar2 %}{{ relbar() }}{% endblock %}
+
+{%- block footer %}
+    <div class="footer">
+    {%- if hasdoc('copyright') %}
+      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
+    {%- else %}
+      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
+    {%- endif %}
+    {%- if last_updated %}
+      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+    {%- endif %}
+    {%- if show_sphinx %}
+      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+    {%- endif %}
+    </div>
+{%- endblock %}
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+{% extends "layout.html" %}
+{% set title = _('Global Module Index') %}
+{% block extrahead %}
+{{ super() }}
+{% if builder != 'htmlhelp' and collapse_modindex %}
+    <script type="text/javascript">
+      DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX = true;
+    </script>
+{% endif %}
+{% endblock %}
+{% block body %}
+
+   <h1 id="global-module-index">{{ _('Global Module Index') }}</h1>
+{% if builder == 'web' and freqentries %}
+   <p>{{ _('Most popular modules:') }}</p>
+   <div class="modulecloud">
+   {%- for module in freqentries %}
+     <a href="../q/{{ module.name|e }}/" style="font-size: {{ module.size }}%">{{ module.name|e }}</a>
+   {%- endfor %}
+   </div>
+{% endif %}
+{% if builder == 'web' %}
+   <form class="pfform" action="" method="get">
+     {{ _('Show modules only available on these platforms') }}:<br>
+     {% for pl in platforms -%}
+     <input type="checkbox" name="pf" value="{{ pl }}" id="pl-{{ pl }}"
+            {%- if pl in showpf %} checked="checked"{% endif %}>
+     <label for="pl-{{ pl }}">{{ pl }}</label>
+     {% endfor %}
+     <input type="hidden" name="newpf" value="true">
+     <input type="submit" value="Apply">
+   </form>
+{% endif %}
+
+   {%- for letter in letters %}
+   <a href="#cap-{{ letter }}"><strong>{{ letter }}</strong></a> {% if not loop.last %}| {% endif %}
+   {%- endfor %}
+   <hr/>
+
+   <table width="100%" class="indextable" cellspacing="0" cellpadding="2">
+   {%- for modname, collapse, cgroup, indent, fname, synops, pform, dep in modindexentries %}
+   {%- if not modname -%}
+   <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
+   <tr class="cap"><td></td><td><a name="cap-{{ fname }}"><strong>{{ fname }}</strong></a></td><td></td></tr>
+   {%- else -%}
+   <tr{% if indent %} class="cg-{{ cgroup }}"{% endif %}>
+     <td>{% if collapse -%}
+       <img src="{{ pathto('_static/minus.png', 1) }}" id="toggle-{{ cgroup }}"
+            class="toggler" style="display: none" alt="-" />
+         {%- endif %}</td>
+     <td>{% if indent %}&nbsp;&nbsp;&nbsp;{% endif %}
+     {% if fname %}<a href="{{ fname }}">{% endif -%}
+     <tt class="xref">{{ modname|e }}</tt>
+     {%- if fname %}</a>{% endif %}
+   {%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
+   </td><td>{% if dep %}<strong>{{ _('Deprecated')}}:</strong>{% endif %}
+     <em>{{ synops|e }}</em></td></tr>
+   {%- endif -%}
+   {% endfor %}
+   </table>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+  <ShortName>{{ project|e }}</ShortName>
+  <Description>{% trans docstitle=docstitle|e %}Search {{ docstitle }}{% endtrans %}</Description>
+  <InputEncoding>utf-8</InputEncoding>
+  <Url type="text/html" method="get"
+       template="{{ use_opensearch }}/{{ pathto('search') }}?q={searchTerms}&amp;check_keywords=yes&amp;area=default"/>
+  <LongName>{{ docstitle|e }}</LongName>
+{% block extra %} {# Put e.g. an <Image> element here. #} {% endblock %}
+</OpenSearchDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,12 @@
+{% extends "layout.html" %}
+{% set page_links = [
+  (pathto('@rss/' + sourcename), 'application/rss+xml', 'Page Comments'),
+] %}
+{% block body %}
+  {% if oldurl %}
+  <div class="docwarning">
+    {% trans %}<strong>Note:</strong> You requested an out-of-date URL from this server. We've tried to redirect you to the new location of this page, but it may not be the right one.{% endtrans %}
+  </div>
+  {% endif %}
+  {{ body }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+{% extends "layout.html" %}
+{% set title = _('Search') %}
+{% set script_files = script_files + ['_static/searchtools.js'] %}
+{% block body %}
+  <h1 id="search-documentation">{{ _('Search') }}</h1>
+  <p>
+    {% trans %}From here you can search these documents. Enter your search
+    words into the box below and click "search". Note that the search
+    function will automatically search for all of the words. Pages
+    containing fewer words won't appear in the result list.{% endtrans %}
+  </p>
+  <form action="" method="get">
+    <input type="text" name="q" value="" />
+    <input type="submit" value="{{ _('search') }}" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  {% if search_performed %}
+    <h2>{{ _('Search Results') }}</h2>
+    {% if not search_results %}
+      <p>{{ _('Your search did not match any results.') }}</p>
+    {% endif %}
+  {% endif %}
+  <div id="search-results">
+  {% if search_results %}
+    <ul>
+    {% for href, caption, context in search_results %}
+      <li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
+        <div class="context">{{ context|e }}</div>
+      </li>
+    {% endfor %}
+    </ul>
+  {% endif %}
+  </div>
+{% endblock %}
+{% block footer %}
+  {{ super() }}
+  <script type="text/javascript" src="searchindex.js"></script>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+# Makefile for Sphinx LaTeX output
+
+ALLDOCS = $(basename $(wildcard *.tex))
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
+
+# Prefix for archive names
+ARCHIVEPRREFIX =
+
+all: $(ALLPDF)
+all-pdf: $(ALLPDF)
+all-dvi: $(ALLDVI)
+all-ps: all-dvi
+	for f in *.dvi; do dvips $$f; done
+
+zip: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+tar: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+bz2: tar
+	bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+# The number of LaTeX runs is quite conservative, but I don't expect it
+# to get run often, so the little extra time won't hurt.
+%.dvi: %.tex
+	latex '$<'
+	latex '$<'
+	latex '$<'
+	-makeindex -s python.ist '$(basename $<).idx'
+	-makeindex -s python.ist '$(basename mod$<).idx'
+	latex '$<'
+	latex '$<'
+
+%.pdf: %.tex
+	pdflatex '$<'
+	pdflatex '$<'
+	pdflatex '$<'
+	-makeindex -s python.ist '$(basename $<).idx'
+	-makeindex -s python.ist '$(basename mod$<).idx'
+	pdflatex '$<'
+	pdflatex '$<'
+
+clean:
+	rm -f *.pdf *.dvi *.ps
+	rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla
+
+.PHONY: all all-pdf all-dvi all-ps clean
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,683 @@
+%%% Copyright   Ulf A. Lindgren
+%%%
+%%% Note        Premission is granted to modify this file under
+%%%             the condition that it is saved using another
+%%%             file and package name.
+%%%
+%%% Revision    1.1 (1997)
+%%%
+%%%             Jan. 8th Modified package name base date option
+%%%             Jan. 22th Modified FmN and FmTi for error in book.cls
+%%%                  \MakeUppercase{#}->{\MakeUppercase#}
+%%%             Apr. 6th Modified Lenny option to prevent undesired 
+%%%                  skip of line.
+%%%             Nov. 8th Fixed \@chapapp for AMS
+%%%
+%%% Revision    1.2 (1998)
+%%%
+%%%             Feb. 11th Fixed appendix problem related to Bjarne
+%%%             Aug. 11th Fixed problem related to 11pt and 12pt 
+%%%                  suggested by Tomas Lundberg. THANKS!
+%%%
+%%% Revision    1.3 (2004)
+%%%             Sep. 20th problem with frontmatter, mainmatter and
+%%%                  backmatter, pointed out by Lapo Mori
+%%%
+%%% Revision    1.31 (2004)
+%%%             Sep. 21th problem with the Rejne definition streched text
+%%%                  caused ugly gaps in the vrule aligned with the title
+%%%                  text. Kindly pointed out to me by Hendri Adriaens
+%%%
+%%% Revision    1.32 (2005)
+%%%             Jun. 23th compatibility problem with the KOMA class 'scrbook.cls'
+%%%                  a remedy is a redefinition of '\@schapter' in
+%%%                  line with that used in KOMA. The problem was pointed
+%%%                  out to me by Mikkel Holm Olsen
+%%%
+%%% Revision    1.33 (2005)
+%%%             Aug. 9th misspelled ``TWELV'' corrected, the error was pointed
+%%%                  out to me by George Pearson
+%%%
+%%% Revision    1.34 (2007)
+%%%             Added an alternative to Lenny provided by Peter
+%%%             Osborne (2005-11-28)
+%%%             Corrected front, main and back matter, based on input
+%%%             from Bas van Gils (2006-04-24)
+%%%             Jul. 30th Added Bjornstrup option provided by Jean-Marc
+%%%             Francois (2007-01-05).
+%%%             Reverted to \MakeUppercase{#} see rev 1.1, solved
+%%%             problem with MakeUppercase and MakeLowercase pointed
+%%%             out by Marco Feuerstein  (2007-06-06) 
+
+
+%%% Last modified   Jul. 2007
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{fncychap}
+             [2007/07/30 v1.34
+                 LaTeX package (Revised chapters)]
+
+%%%% For conditional inclusion of color
+\newif\ifusecolor
+\usecolorfalse
+
+
+
+%%%% DEFINITION OF Chapapp variables
+\newcommand{\CNV}{\huge\bfseries}
+\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}}
+
+
+%%%% DEFINITION OF TheChapter variables
+\newcommand{\CNoV}{\huge\bfseries}
+\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}}
+
+\newif\ifUCN
+\UCNfalse
+\newif\ifLCN
+\LCNfalse
+\def\ChNameLowerCase{\LCNtrue\UCNfalse}
+\def\ChNameUpperCase{\UCNtrue\LCNfalse}
+\def\ChNameAsIs{\UCNfalse\LCNfalse}
+
+%%%%% Fix for AMSBook 971008
+
+\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}
+
+
+%%%%% Fix for Bjarne and appendix 980211
+
+\newif\ifinapp
+\inappfalse
+\renewcommand\appendix{\par
+  \setcounter{chapter}{0}%
+  \setcounter{section}{0}%
+  \inapptrue%
+  \renewcommand\@chapapp{\appendixname}%
+  \renewcommand\thechapter{\@Alph\c@chapter}}
+
+%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
+
+\@ifundefined{@mainmatter}{\newif\if@mainmatter \@mainmattertrue}{}
+
+%%%%%
+
+
+
+\newcommand{\FmN}[1]{%
+\ifUCN
+   {\MakeUppercase{#1}}\LCNfalse
+\else
+   \ifLCN
+      {\MakeLowercase{#1}}\UCNfalse
+   \else #1
+   \fi
+\fi}
+
+
+%%%% DEFINITION OF Title variables
+\newcommand{\CTV}{\Huge\bfseries}
+\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}}
+
+%%%% DEFINITION OF the basic rule width
+\newlength{\RW}
+\setlength{\RW}{1pt}
+\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}}
+
+\newif\ifUCT
+\UCTfalse
+\newif\ifLCT
+\LCTfalse
+\def\ChTitleLowerCase{\LCTtrue\UCTfalse}
+\def\ChTitleUpperCase{\UCTtrue\LCTfalse}
+\def\ChTitleAsIs{\UCTfalse\LCTfalse}
+\newcommand{\FmTi}[1]{%
+\ifUCT
+   {\MakeUppercase{#1}}\LCTfalse
+\else
+   \ifLCT
+      {\MakeLowercase{#1}}\UCTfalse
+   \else {#1}
+   \fi
+\fi}
+
+
+
+\newlength{\mylen}
+\newlength{\myhi}
+\newlength{\px}
+\newlength{\py}
+\newlength{\pyy}
+\newlength{\pxx}
+
+
+\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@}
+
+\newcommand{\DOCH}{%
+  \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+  \par\nobreak
+  \vskip 20\p@
+  }
+\newcommand{\DOTI}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+\newcommand{\DOTIS}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+
+%%%%%% SONNY DEF
+
+\DeclareOption{Sonny}{%
+  \ChNameVar{\Large\sf}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\Large\sf}
+  \ChRuleWidth{0.5pt}
+  \ChNameUpperCase
+  \renewcommand{\DOCH}{%
+    \raggedleft
+    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+    \par\nobreak
+    \vskip 40\p@}
+  \renewcommand{\DOTI}[1]{%
+    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
+    \vskip 5\p@
+    \CTV\FmTi{#1}\par\nobreak
+    \mghrulefill{\RW}\par\nobreak
+    \vskip 40\p@}
+  \renewcommand{\DOTIS}[1]{%
+    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
+    \vskip 5\p@
+    \CTV\FmTi{#1}\par\nobreak
+    \mghrulefill{\RW}\par\nobreak
+    \vskip 40\p@}
+}
+
+%%%%%% LENNY DEF
+
+\DeclareOption{Lenny}{%
+
+  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
+  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
+  \ChTitleVar{\Huge\bfseries\rm}
+  \ChRuleWidth{1pt}
+  \renewcommand{\DOCH}{%
+    \settowidth{\px}{\CNV\FmN{\@chapapp}}
+    \addtolength{\px}{2pt}
+    \settoheight{\py}{\CNV\FmN{\@chapapp}}
+    \addtolength{\py}{1pt}
+
+    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
+    \addtolength{\mylen}{1pt}
+    \settowidth{\pxx}{\CNoV\thechapter}
+    \addtolength{\pxx}{-1pt}
+
+    \settoheight{\pyy}{\CNoV\thechapter}
+    \addtolength{\pyy}{-2pt}
+    \setlength{\myhi}{\pyy}
+    \addtolength{\myhi}{-1\py}
+    \par
+    \parbox[b]{\textwidth}{%
+    \rule[\py]{\RW}{\myhi}%
+    \hskip -\RW%
+    \rule[\pyy]{\px}{\RW}%
+    \hskip -\px%
+    \raggedright%
+    \CNV\FmN{\@chapapp}\space\CNoV\thechapter%
+    \hskip1pt%
+    \mghrulefill{\RW}%
+    \rule{\RW}{\pyy}\par\nobreak%
+    \vskip -\baselineskip%
+    \vskip -\pyy%
+    \hskip \mylen%
+    \mghrulefill{\RW}\par\nobreak%
+    \vskip \pyy}%
+    \vskip 20\p@}
+ 
+
+  \renewcommand{\DOTI}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+
+  \renewcommand{\DOTIS}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+%%%%%% Peter Osbornes' version of LENNY DEF
+
+\DeclareOption{PetersLenny}{%
+
+% five new lengths 
+\newlength{\bl}                           %  bottom left   : orig \space
+\setlength{\bl}{6pt}
+\newcommand{\BL}[1]{\setlength{\bl}{#1}}
+\newlength{\br}                           %  bottom right  : orig 1pt
+\setlength{\br}{1pt}
+\newcommand{\BR}[1]{\setlength{\br}{#1}}
+\newlength{\tl}                           %  top left      : orig 2pt
+\setlength{\tl}{2pt}
+\newcommand{\TL}[1]{\setlength{\tl}{#1}}
+\newlength{\trr}                           %  top right      :orig 1pt 
+\setlength{\trr}{1pt}
+\newcommand{\TR}[1]{\setlength{\trr}{#1}}
+\newlength{\blrule}                           %  top right      :orig 1pt 
+\setlength{\trr}{0pt}
+\newcommand{\BLrule}[1]{\setlength{\blrule}{#1}}
+
+
+  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
+  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
+  \ChTitleVar{\Huge\bfseries\rm}
+  \ChRuleWidth{1pt}
+\renewcommand{\DOCH}{%
+
+
+%%%%%%%                                   tweaks for 1--9 and A--Z
+\ifcase\c@chapter\relax%
+\or\BL{-3pt}\TL{-4pt}\BR{0pt}\TR{-6pt}%1
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%2
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%3
+\or\BL{0pt}\TL{5pt}\BR{2pt}\TR{-4pt}%4
+\or\BL{0pt}\TL{3pt}\BR{2pt}\TR{-4pt}%5
+\or\BL{-1pt}\TL{0pt}\BR{2pt}\TR{-2pt}%6
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%7
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%8
+\or\BL{0pt}\TL{-3pt}\BR{-4pt}\TR{-2pt}%9
+\or\BL{-3pt}\TL{-3pt}\BR{2pt}\TR{-7pt}%10
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%11
+\or\BL{-6pt}\TL{-6pt}\BR{2pt}\TR{-7pt}%12
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%13
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%14
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%15
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%16
+\or\BL{-5pt}\TL{-3pt}\BR{-8pt}\TR{-6pt}%17
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%18
+\or\BL{-3pt}\TL{-3pt}\BR{-6pt}\TR{-9pt}%19
+\or\BL{0pt}\TL{0pt}\BR{0pt}\TR{-5pt}%20
+\fi
+
+\ifinapp\ifcase\c@chapter\relax%
+\or\BL{0pt}\TL{14pt}\BR{5pt}\TR{-19pt}%A
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}%B
+\or\BL{-3pt}\TL{-2pt}\BR{1pt}\TR{-6pt}\BLrule{0pt}%C
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}\BLrule{0pt}%D
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-3pt}%E
+\or\BL{0pt}\TL{-5pt}\BR{-10pt}\TR{-1pt}%F
+\or\BL{-3pt}\TL{0pt}\BR{0pt}\TR{-7pt}%G
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%H
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%I
+\or\BL{2pt}\TL{0pt}\BR{-3pt}\TR{1pt}%J
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%K
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-19pt}%L
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%M
+\or\BL{0pt}\TL{-5pt}\BR{-2pt}\TR{-1pt}%N
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%O
+\or\BL{0pt}\TL{-5pt}\BR{-9pt}\TR{-3pt}%P
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%Q
+\or\BL{0pt}\TL{-5pt}\BR{4pt}\TR{-8pt}%R
+\or\BL{-2pt}\TL{-2pt}\BR{-2pt}\TR{-7pt}%S
+\or\BL{-3pt}\TL{0pt}\BR{-5pt}\TR{4pt}\BLrule{8pt}%T
+\or\BL{-7pt}\TL{-11pt}\BR{-5pt}\TR{-7pt}\BLrule{0pt}%U
+\or\BL{-14pt}\TL{-5pt}\BR{-14pt}\TR{-1pt}\BLrule{14pt}%V
+\or\BL{-10pt}\TL{-9pt}\BR{-13pt}\TR{-3pt}\BLrule{7pt}%W
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%X
+\or\BL{-6pt}\TL{-4pt}\BR{-7pt}\TR{1pt}\BLrule{7pt}%Y
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%Z
+\fi\fi
+%%%%%%%
+    \settowidth{\px}{\CNV\FmN{\@chapapp}}
+    \addtolength{\px}{\tl}        %MOD change 2pt to \tl
+    \settoheight{\py}{\CNV\FmN{\@chapapp}}
+    \addtolength{\py}{1pt}
+
+    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
+    \addtolength{\mylen}{\trr}% MOD change 1pt to \tr
+    \settowidth{\pxx}{\CNoV\thechapter}
+    \addtolength{\pxx}{-1pt}
+
+    \settoheight{\pyy}{\CNoV\thechapter}
+    \addtolength{\pyy}{-2pt}
+    \setlength{\myhi}{\pyy}
+    \addtolength{\myhi}{-1\py}
+    \par
+    \parbox[b]{\textwidth}{%
+    \rule[\py]{\RW}{\myhi}%
+    \hskip -\RW%
+    \rule[\pyy]{\px}{\RW}% 
+    \hskip -\px%
+    \raggedright%
+    \CNV\FmN{\@chapapp}\rule{\blrule}{\RW}\hskip\bl\CNoV\thechapter%MOD 
+%    \CNV\FmN{\@chapapp}\space\CNoV\thechapter                     %ORIGINAL
+    \hskip\br%                           %MOD 1pt to \br
+    \mghrulefill{\RW}% 
+    \rule{\RW}{\pyy}\par\nobreak% 
+    \vskip -\baselineskip%
+    \vskip -\pyy%
+    \hskip \mylen%
+    \mghrulefill{\RW}\par\nobreak%
+    \vskip \pyy}%
+    \vskip 20\p@}
+ 
+
+  \renewcommand{\DOTI}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+
+  \renewcommand{\DOTIS}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+
+%
+
+
+%%%%%% BJORNSTRUP DEF
+
+\DeclareOption{Bjornstrup}{%
+  \usecolortrue
+  % pzc (Zapf Chancelery) is nice.  ppl (Palatino) is cool too.
+  \ChNumVar{\fontsize{76}{80}\usefont{OT1}{pzc}{m}{n}\selectfont}
+  \ChTitleVar{\raggedleft\Large\sffamily\bfseries}
+
+  \setlength{\myhi}{10pt}         % Space between grey box border and text
+  \setlength{\mylen}{\textwidth}
+  \addtolength{\mylen}{-2\myhi}
+  \renewcommand{\DOCH}{%
+    \settowidth{\py}{\CNoV\thechapter}
+    \addtolength{\py}{-10pt}      % Amount of space by which the
+%                                  % number is shifted right
+    \fboxsep=0pt%
+    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}%
+    \kern-\py\raise20pt%
+    \hbox{\color[gray]{.5}\CNoV\thechapter}\\%
+  }
+  
+  \renewcommand{\DOTI}[1]{%
+    \nointerlineskip\raggedright%
+    \fboxsep=\myhi%
+    \vskip-1ex%
+    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
+    \vskip 40\p@%
+  }
+
+  \renewcommand{\DOTIS}[1]{%
+    \fboxsep=0pt
+    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}\\%
+    \nointerlineskip\raggedright%
+    \fboxsep=\myhi%
+    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
+    \vskip 40\p@%
+  }
+}
+
+
+%%%%%%% GLENN DEF
+
+
+\DeclareOption{Glenn}{%
+  \ChNameVar{\bfseries\Large\sf}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\bfseries\Large\rm}
+  \ChRuleWidth{1pt}
+  \ChNameUpperCase
+  \ChTitleUpperCase
+  \renewcommand{\DOCH}{%
+    \settoheight{\myhi}{\CTV\FmTi{Test}}
+    \setlength{\py}{\baselineskip}
+    \addtolength{\py}{\RW}
+    \addtolength{\py}{\myhi}
+    \setlength{\pyy}{\py}
+    \addtolength{\pyy}{-1\RW}
+     
+    \raggedright
+    \CNV\FmN{\@chapapp}\space\CNoV\thechapter
+    \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak}
+
+  \renewcommand{\DOTI}[1]{%
+    \addtolength{\pyy}{-4pt}
+    \settoheight{\myhi}{\CTV\FmTi{#1}}
+    \addtolength{\myhi}{\py}
+    \addtolength{\myhi}{-1\RW}
+    \vskip -1\pyy
+    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
+    \raggedleft\CTV\FmTi{#1}\par\nobreak
+    \vskip 80\p@}
+
+\newlength{\backskip}
+  \renewcommand{\DOTIS}[1]{%
+%    \setlength{\py}{10pt}
+%    \setlength{\pyy}{\py}
+%    \addtolength{\pyy}{\RW}
+%    \setlength{\myhi}{\baselineskip}
+%    \addtolength{\myhi}{\pyy}
+%    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
+%    \addtolength{}{}
+%\vskip -1\baselineskip
+%    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
+%    \raggedleft\CTV\FmTi{#1}\par\nobreak
+%    \vskip 60\p@}
+%% Fix suggested by Tomas Lundberg
+    \setlength{\py}{25pt}  % eller vad man vill
+    \setlength{\pyy}{\py}
+    \setlength{\backskip}{\py}
+    \addtolength{\backskip}{2pt}
+    \addtolength{\pyy}{\RW}
+    \setlength{\myhi}{\baselineskip}
+    \addtolength{\myhi}{\pyy}
+    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
+    \vskip -1\backskip
+    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 3pt %
+    \raggedleft\CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+%%%%%%% CONNY DEF
+
+\DeclareOption{Conny}{%
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\centering\Huge\rm\bfseries}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\centering\Huge\rm}
+  \ChRuleWidth{2pt}
+
+  \renewcommand{\DOCH}{%
+    \mghrulefill{3\RW}\par\nobreak
+    \vskip -0.5\baselineskip
+    \mghrulefill{\RW}\par\nobreak
+    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+    \par\nobreak
+    \vskip -0.5\baselineskip
+   }
+  \renewcommand{\DOTI}[1]{%
+    \mghrulefill{\RW}\par\nobreak
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 60\p@
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \mghrulefill{\RW}\par\nobreak
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 60\p@
+    }
+  }
+
+%%%%%%% REJNE DEF
+
+\DeclareOption{Rejne}{%
+
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\centering\Large\rm}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\centering\Huge\rm}
+  \ChRuleWidth{1pt}
+  \renewcommand{\DOCH}{%
+    \settoheight{\py}{\CNoV\thechapter}
+    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
+    \addtolength{\py}{-1pt}
+    \CNV\FmN{\@chapapp}\par\nobreak
+    \vskip 20\p@
+    \setlength{\myhi}{2\baselineskip}
+    \setlength{\px}{\myhi}
+    \addtolength{\px}{-1\RW}
+    \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip
+    10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip 10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak
+     \vskip -3\p@% Added -2pt vskip to correct for streched text v1.31
+    }
+  \renewcommand{\DOTI}[1]{%
+    \setlength{\mylen}{\textwidth}
+    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
+    \addtolength{\mylen}{-2\RW}
+    {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule width\RW}\par\nobreak%
+    \vskip -3pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip}%
+    \vskip 60\p@% Added -2pt in vskip to correct for streched text v1.31
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \setlength{\py}{\fboxrule}
+    \setlength{\fboxrule}{\RW}
+    \setlength{\mylen}{\textwidth}
+    \addtolength{\mylen}{-2\RW}
+    \fbox{\parbox{\mylen}{\vskip 2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}} 
+    \setlength{\fboxrule}{\py}
+    \vskip 60\p@
+    }
+  }
+
+
+%%%%%%% BJARNE DEF
+
+\DeclareOption{Bjarne}{%
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\raggedleft\normalsize\rm}
+  \ChNumVar{\raggedleft \bfseries\Large}
+  \ChTitleVar{\raggedleft \Large\rm}
+  \ChRuleWidth{1pt}
+
+
+%% Note thechapter -> c@chapter fix appendix bug
+%% Fixed misspelled 12
+
+  \newcounter{AlphaCnt}
+  \newcounter{AlphaDecCnt}
+  \newcommand{\AlphaNo}{%
+    \ifcase\number\theAlphaCnt
+      \ifnum\c@chapter=0
+        ZERO\else{}\fi
+    \or ONE\or TWO\or THREE\or FOUR\or FIVE
+    \or SIX\or SEVEN\or EIGHT\or NINE\or TEN
+    \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN
+    \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi
+}
+
+  \newcommand{\AlphaDecNo}{%
+    \setcounter{AlphaDecCnt}{0}
+    \@whilenum\number\theAlphaCnt>0\do
+      {\addtocounter{AlphaCnt}{-10}
+       \addtocounter{AlphaDecCnt}{1}}
+     \ifnum\number\theAlphaCnt=0
+     \else
+       \addtocounter{AlphaDecCnt}{-1}
+       \addtocounter{AlphaCnt}{10}
+     \fi
+     
+     
+    \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or
+    FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi
+    }
+  \newcommand{\TheAlphaChapter}{%
+    
+    \ifinapp 
+      \thechapter
+    \else
+      \setcounter{AlphaCnt}{\c@chapter}
+      \ifnum\c@chapter<20
+        \AlphaNo
+      \else
+        \AlphaDecNo\AlphaNo
+      \fi
+    \fi
+    }  
+  \renewcommand{\DOCH}{%
+    \mghrulefill{\RW}\par\nobreak
+    \CNV\FmN{\@chapapp}\par\nobreak 
+    \CNoV\TheAlphaChapter\par\nobreak
+    \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak
+    \vskip 20\p@
+    }
+  \renewcommand{\DOTI}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+}
+
+\DeclareOption*{%
+  \PackageWarning{fancychapter}{unknown style option}
+  }
+
+\ProcessOptions* \relax
+
+\ifusecolor
+  \RequirePackage{color} 
+\fi
+\def\@makechapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright \normalfont
+    \ifnum \c@secnumdepth >\m@ne
+      \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
+        \DOCH
+      \fi
+    \fi
+    \interlinepenalty\@M
+    \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 060424
+      \DOTI{#1}%
+    \else%
+      \DOTIS{#1}%
+    \fi
+  }}
+
+
+%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32)
+
+%%OUT:
+%\def\@schapter#1{\if@twocolumn
+%                   \@topnewpage[\@makeschapterhead{#1}]%
+%                 \else
+%                   \@makeschapterhead{#1}%
+%                   \@afterheading
+%                 \fi}
+
+%%IN:
+\def\@schapter#1{%
+\if@twocolumn%
+  \@makeschapterhead{#1}%
+\else%
+  \@makeschapterhead{#1}%
+  \@afterheading%
+\fi}
+
+%%% End: To avoid problem with scrbook.cls (fncychap version 1.32)
+
+\def\@makeschapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright
+    \normalfont
+    \interlinepenalty\@M
+    \DOTIS{#1}
+    \vskip 40\p@
+  }}
+
+\endinput
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+%
+% howto.cls for Sphinx
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{howto}[2008/10/18 Document class (Sphinx HOWTO)]
+
+% Pass all given class options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ProcessOptions\relax
+\LoadClass[twoside]{article}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{
+  \rule{\textwidth}{1pt}
+  \ifsphinxpdfoutput
+    \begingroup
+    % This \def is required to deal with multi-line authors; it
+    % changes \\ to ', ' (comma-space), making it pass muster for
+    % generating document info in the PDF file.
+    \def\\{, }
+    \pdfinfo{
+      /Author (\@author)
+      /Title (\@title)
+    }
+    \endgroup
+  \fi
+  \begin{flushright}
+    \sphinxlogo%
+    {\rm\Huge\py@HeaderFamily \@title} \par
+    {\em\large\py@HeaderFamily \py@release\releaseinfo} \par
+    \vspace{25pt}
+    {\Large\py@HeaderFamily \@author} \par
+    \vspace{25pt}
+    \@date \par
+    \py@authoraddress \par
+  \end{flushright}
+  \@thanks
+  \setcounter{footnote}{0}
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+\let\py@OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}{
+  \begingroup
+    \parskip = 0mm
+    \py@OldTableofcontents
+  \endgroup
+  \rule{\textwidth}{1pt}
+  \vspace{12pt}
+}  
+
+\@ifundefined{fancyhf}{
+  \pagestyle{plain}}{
+  \pagestyle{normal}}		% start this way; change for
+\pagenumbering{arabic}		% ToC & chapters
+
+\thispagestyle{empty}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+%
+% manual.cls for Sphinx
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{manual}[2008/10/18 Document class (Sphinx manual)]
+
+% Pass all given class options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}
+\ProcessOptions\relax
+\LoadClass[twoside,openright]{report}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{1}
+
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{%
+  \begin{titlepage}%
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \rule{\textwidth}{1pt}%
+    \ifsphinxpdfoutput
+      \begingroup
+      % This \def is required to deal with multi-line authors; it
+      % changes \\ to ', ' (comma-space), making it pass muster for
+      % generating document info in the PDF file.
+      \def\\{, }
+      \pdfinfo{
+        /Author (\@author)
+        /Title (\@title)
+      }
+      \endgroup
+    \fi
+    \begin{flushright}%
+      \sphinxlogo%
+      {\rm\Huge\py@HeaderFamily \@title \par}%
+      {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par}
+      \vfill
+      {\LARGE\py@HeaderFamily \@author \par}
+      \vfill\vfill
+      {\large
+       \@date \par
+       \vfill
+       \py@authoraddress \par
+      }%
+    \end{flushright}%\par
+    \@thanks
+  \end{titlepage}%
+  \cleardoublepage%
+  \setcounter{footnote}{0}%
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+
+% Catch the end of the {abstract} environment, but here make sure the abstract
+% is followed by a blank page if the 'openright' option is used.
+%
+\let\py@OldEndAbstract=\endabstract
+\renewcommand{\endabstract}{
+  \if@openright
+    \ifodd\value{page}
+      \typeout{Adding blank page after the abstract.}
+      \vfil\pagebreak
+    \fi
+  \fi
+  \py@OldEndAbstract
+}
+
+% This wraps the \tableofcontents macro with all the magic to get the spacing
+% right and have the right number of pages if the 'openright' option has been
+% used.  This eliminates a fair amount of crud in the individual document files.
+%
+\let\py@OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}{%
+  \setcounter{page}{1}%
+  \pagebreak%
+  \pagestyle{plain}%
+  {%
+    \parskip = 0mm%
+    \py@OldTableofcontents%
+    \if@openright%
+      \ifodd\value{page}%
+        \typeout{Adding blank page after the table of contents.}%
+        \pagebreak\hspace{0pt}%
+      \fi%
+    \fi%
+    \cleardoublepage%
+  }%
+  \pagenumbering{arabic}%
+  \@ifundefined{fancyhf}{}{\pagestyle{normal}}%
+}
+
+% This is needed to get the width of the section # area wide enough in the
+% library reference.  Doing it here keeps it the same for all the manuals.
+%
+\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+line_max 100
+headings_flag 1
+heading_prefix "  \\bigletter "
+
+preamble "\\begin{theindex}
+\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}}
+
+"
+
+symhead_positive "{Symbols}"
+numhead_positive "{Numbers}"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,709 @@
+%
+% sphinx.sty
+%
+% Adapted from the old python.sty, mostly written by Fred Drake,
+% by Georg Brandl.
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{sphinx}[2008/05/01 LaTeX package (Sphinx markup)]
+
+\RequirePackage{textcomp}
+\RequirePackage{fancyhdr}
+\RequirePackage{fancybox}
+\RequirePackage{titlesec}
+\RequirePackage{tabulary}
+\RequirePackage{amsmath} % for \text
+\RequirePackage{makeidx}
+\RequirePackage{framed}
+\RequirePackage{color}
+\RequirePackage{fancyvrb}
+\RequirePackage{threeparttable}
+
+% Redefine these colors to your liking in the preamble.
+\definecolor{TitleColor}{rgb}{0.126,0.263,0.361}
+\definecolor{InnerLinkColor}{rgb}{0.208,0.374,0.486}
+\definecolor{OuterLinkColor}{rgb}{0.216,0.439,0.388}
+% Redefine these colors to something not white if you want to have colored
+% background and border for code examples.
+\definecolor{VerbatimColor}{rgb}{1,1,1}
+\definecolor{VerbatimBorderColor}{rgb}{1,1,1}
+
+% Uncomment these two lines to ignore the paper size and make the page 
+% size more like a typical published manual.
+%\renewcommand{\paperheight}{9in}
+%\renewcommand{\paperwidth}{8.5in}   % typical squarish manual
+%\renewcommand{\paperwidth}{7in}     % O'Reilly ``Programmming Python''
+
+% For graphicx, check if we are compiling under latex or pdflatex.
+\ifx\pdftexversion\undefined
+  \usepackage{graphicx}
+\else
+  \usepackage[pdftex]{graphicx}
+\fi
+
+% for PDF output, use colors and maximal compression
+\newif\ifsphinxpdfoutput\sphinxpdfoutputfalse
+\ifx\pdfoutput\undefined\else\ifcase\pdfoutput
+  \let\py@NormalColor\relax
+  \let\py@TitleColor\relax
+\else
+  \sphinxpdfoutputtrue
+  \input{pdfcolor}
+  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
+  \def\py@TitleColor{\color{TitleColor}}
+  \pdfcompresslevel=9
+\fi\fi
+
+% XeLaTeX can do colors, too
+\ifx\XeTeXrevision\undefined\else
+  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
+  \def\py@TitleColor{\color{TitleColor}}
+\fi
+
+% Increase printable page size (copied from fullpage.sty)
+\topmargin 0pt
+\advance \topmargin by -\headheight
+\advance \topmargin by -\headsep
+
+% attempt to work a little better for A4 users
+\textheight \paperheight
+\advance\textheight by -2in
+
+\oddsidemargin 0pt
+\evensidemargin 0pt
+%\evensidemargin -.25in  % for ``manual size'' documents
+\marginparwidth 0.5in
+
+\textwidth \paperwidth
+\advance\textwidth by -2in
+
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\parindent = 0mm
+\parskip = 2mm
+\hbadness = 5000                % don't print trivial gripes
+
+\pagestyle{empty}               % start this way; change for
+\pagenumbering{roman}           % ToC & chapters
+
+% Use this to set the font family for headers and other decor:
+\newcommand{\py@HeaderFamily}{\sffamily\bfseries}
+
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifundefined{fancyhf}{}{
+  % Use \pagestyle{normal} as the primary pagestyle for text.
+  \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
+    \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
+    \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
+    \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}}
+    \renewcommand{\headrulewidth}{0.4pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Update the plain style so we get the page number & footer line,
+  % but not a chapter or section title.  This is to keep the first
+  % page of a chapter and the blank page between chapters `clean.'
+  \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+}
+
+% Some custom font markup commands.
+%
+\newcommand{\strong}[1]{{\bf #1}}
+\newcommand{\code}[1]{\texttt{#1}}
+\newcommand{\bfcode}[1]{\code{\bfseries#1}}
+\newcommand{\samp}[1]{`\code{#1}'}
+\newcommand{\email}[1]{\textsf{#1}}
+
+\newcommand{\py@modulebadkey}{{--just-some-junk--}}
+
+% Redefine the Verbatim environment to allow border and background colors.
+% The original environment is still used for verbatims within tables.
+\let\OriginalVerbatim=\Verbatim
+\let\endOriginalVerbatim=\endVerbatim
+
+% Play with vspace to be able to keep the indentation.
+\newlength\distancetoright
+\newlength\leftsidespace
+\def\mycolorbox#1{%
+  \setlength\leftsidespace{\@totalleftmargin}%
+  \setlength\distancetoright{\textwidth}%
+  \advance\distancetoright -\@totalleftmargin %
+  \noindent\hspace*{\@totalleftmargin}%
+  \fcolorbox{VerbatimBorderColor}{VerbatimColor}{%
+  \begin{minipage}{\distancetoright}%
+    \smallskip%
+    \noindent\hspace*{-\leftsidespace}%
+    #1
+  \end{minipage}%
+  }%
+}
+\def\FrameCommand{\mycolorbox}
+
+\renewcommand{\Verbatim}[1][1]{%
+  % The list environement is needed to control perfectly the vertical
+  % space.
+  \list{}{%
+  \setlength\parskip{0pt}%
+  \setlength\itemsep{0ex}%
+  \setlength\topsep{0ex}%
+  \setlength\partopsep{0pt}%
+  \setlength\leftmargin{0pt}%
+  }%
+  \item\MakeFramed {\FrameRestore}%
+     \small%
+    \OriginalVerbatim[#1]%
+}
+\renewcommand{\endVerbatim}{%
+    \endOriginalVerbatim%
+  \endMakeFramed%
+  \endlist%
+}
+
+
+% Index-entry generation support.
+%
+
+% Command to generate two index entries (using subentries)
+\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
+
+% And three entries (using only one level of subentries)
+\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
+
+% And four (again, using only one level of subentries)
+\newcommand{\indexiv}[4]{
+\index{#1!#2 #3 #4}
+\index{#2!#3 #4, #1}
+\index{#3!#4, #1 #2}
+\index{#4!#1 #2 #3}
+}
+
+% support for the module index
+\newif\ifpy@UseModuleIndex
+\py@UseModuleIndexfalse
+
+\newcommand{\makemodindex}{
+  \newwrite\modindexfile
+  \openout\modindexfile=mod\jobname.idx
+  \py@UseModuleIndextrue
+}
+
+\newcommand{\printmodindex}{
+  \@input@{mod\jobname.ind}
+}
+
+% Add the defining entry for a module
+\newcommand{\py@modindex}[2]{%
+  \renewcommand{\py@thismodule}{#1}
+  \ifpy@UseModuleIndex%
+    \@ifundefined{py@modplat@\py@thismodulekey}{
+      \write\modindexfile{\protect\indexentry{#1@{\texttt{#1}}|hyperpage}{\thepage}}%
+    }{\write\modindexfile{\protect\indexentry{#1@{\texttt{#1 }%
+        \emph{(\platformof{\py@thismodulekey})}}|hyperpage}{\thepage}}%
+    }
+  \fi%
+}
+
+% "Current" keys
+\newcommand{\py@thisclass}{}
+\newcommand{\py@thismodule}{}
+\newcommand{\py@thismodulekey}{}
+\newcommand{\py@thismoduletype}{}
+\newcommand{\py@emptymodule}{}
+
+% \declaremodule[key]{type}{name}
+\newcommand{\declaremodule}[3][\py@modulebadkey]{
+  \renewcommand{\py@thismoduletype}{#2}
+  \ifx\py@modulebadkey#1
+    \renewcommand{\py@thismodulekey}{#3}
+  \else
+    \renewcommand{\py@thismodulekey}{#1}
+  \fi
+  \py@modindex{#3}{}
+  %\label{module-\py@thismodulekey}
+}
+
+% Record module platforms for the Module Index
+\newif\ifpy@ModPlatformFileIsOpen \py@ModPlatformFileIsOpenfalse
+\long\def\py@writeModPlatformFile#1{%
+  \protected@write\py@ModPlatformFile%
+    {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
+    {\string#1}%
+}
+\newcommand{\py@ModPlatformFilename}{\jobname.pla}
+\newcommand{\platform}[1]{
+  \ifpy@ModPlatformFileIsOpen\else
+    \newwrite\py@ModPlatformFile
+    \openout\py@ModPlatformFile=\py@ModPlatformFilename
+    \py@ModPlatformFileIsOpentrue
+  \fi
+  \py@writeModPlatformFile{\py@defplatform{\py@thismodulekey}{#1}}
+}
+\newcommand{\py@defplatform}[2]{\expandafter\def\csname py@modplat@#1\endcsname{#2}}
+\newcommand{\platformof}[1]{\csname py@modplat@#1\endcsname}
+
+\InputIfFileExists{\jobname.pla}{}{}
+
+% \moduleauthor{name}{email}
+\newcommand{\moduleauthor}[2]{}
+
+% \sectionauthor{name}{email}
+\newcommand{\sectionauthor}[2]{}
+
+% Ignore module synopsis.
+\newcommand{\modulesynopsis}[1]{}
+
+% Reset "current" objects.
+\newcommand{\resetcurrentobjects}{
+  \renewcommand{\py@thisclass}{}
+  \renewcommand{\py@thismodule}{}
+  \renewcommand{\py@thismodulekey}{}
+  \renewcommand{\py@thismoduletype}{}
+}
+
+% Augment the sectioning commands used to get our own font family in place,
+% and reset some internal data items:
+\titleformat{\section}{\Large\py@HeaderFamily}%
+            {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\subsection}{\large\py@HeaderFamily}%
+            {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\subsubsection}{\py@HeaderFamily}%
+            {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\paragraph}{\large\py@HeaderFamily}%
+            {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor}
+
+
+% Now for a lot of semantically-loaded environments that do a ton of magical
+% things to get the right formatting and index entries for the stuff in
+% Python modules and C API.
+
+
+% {fulllineitems} is used in one place in libregex.tex, but is really for
+% internal use in this file.
+%
+\newcommand{\py@itemnewline}[1]{%
+  \@tempdima\linewidth%
+  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
+}
+
+\newenvironment{fulllineitems}{
+  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
+                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
+                 \itemsep -\parsep
+                 \let\makelabel=\py@itemnewline}
+}{\end{list}}
+
+% \optional is mostly for use in the arguments parameters to the various
+% {*desc} environments defined below, but may be used elsewhere.  Known to
+% be used in the debugger chapter.
+%
+% Typical usage:
+%
+%     \begin{funcdesc}{myfunc}{reqparm\optional{, optparm}}
+%                                    ^^^       ^^^
+%                          No space here       No space here
+%
+% When a function has multiple optional parameters, \optional should be
+% nested, not chained.  This is right:
+%
+%     \begin{funcdesc}{myfunc}{\optional{parm1\optional{, parm2}}}
+%
+\let\py@badkey=\@undefined
+
+\newcommand{\optional}[1]{%
+  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+
+% This can be used when a function or method accepts an varying number 
+% of arguments, such as by using the *args syntax in the parameter list.
+\newcommand{\py@moreargs}{...}
+
+% This can be used when you don't want to document the parameters to a 
+% function or method, but simply state that it's an alias for
+% something else.
+\newcommand{\py@unspecified}{...}
+
+\newcommand{\py@varvars}[1]{{%
+    {\let\unspecified=\py@unspecified%
+      \let\moreargs=\py@moreargs%
+      \emph{#1}}}}
+
+\newlength{\py@argswidth}
+\newcommand{\py@sigparams}[1]{%
+  \parbox[t]{\py@argswidth}{\py@varvars{#1}\code{)}}}
+\newcommand{\py@sigline}[2]{%
+  \settowidth{\py@argswidth}{#1\code{(}}%
+  \addtolength{\py@argswidth}{-2\py@argswidth}%
+  \addtolength{\py@argswidth}{\textwidth}%
+  \item[#1\code{(}\py@sigparams{#2}]}
+
+% C functions ------------------------------------------------------------
+% \begin{cfuncdesc}[refcount]{type}{name}{arglist}
+% Note that the [refcount] slot should only be filled in by
+% tools/anno-api.py; it pulls the value from the refcounts database.
+\newcommand{\cfuncline}[3]{
+  \py@sigline{\code{#1 \bfcode{#2}}}{#3}%
+}
+\newenvironment{cfuncdesc}[3]{
+  \begin{fulllineitems}
+    \cfuncline{#1}{#2}{#3}
+}{\end{fulllineitems}}
+
+% C variables ------------------------------------------------------------
+% \begin{cvardesc}{type}{name}
+\newenvironment{cvardesc}[2]{
+  \begin{fulllineitems}
+    \item[\code{#1 \bfcode{#2}}]
+}{\end{fulllineitems}}
+
+% C data types -----------------------------------------------------------
+% \begin{ctypedesc}[index name]{typedef name}
+\newenvironment{ctypedesc}[2][\py@badkey]{
+  \begin{fulllineitems}
+    \item[\bfcode{#2}]
+}{\end{fulllineitems}}
+
+% C type fields ----------------------------------------------------------
+% \begin{cmemberdesc}{container type}{ctype}{membername}
+\newcommand{\cmemberline}[3]{
+  \item[\code{#2 \bfcode{#3}}]
+}
+\newenvironment{cmemberdesc}[3]{
+  \begin{fulllineitems}
+    \cmemberline{#1}{#2}{#3}
+}{\end{fulllineitems}}
+
+% Funky macros -----------------------------------------------------------
+% \begin{csimplemacrodesc}{name}
+% -- "simple" because it has no args; NOT for constant definitions!
+\newenvironment{csimplemacrodesc}[1]{
+  \begin{fulllineitems}
+    \item[\bfcode{#1}]
+}{\end{fulllineitems}}
+
+% simple functions (not methods) -----------------------------------------
+% \begin{funcdesc}{name}{args}
+\newcommand{\funcline}[2]{%
+  \py@sigline{\bfcode{#1}}{#2}}
+\newenvironment{funcdesc}[2]{
+  \begin{fulllineitems}
+    \funcline{#1}{#2}
+}{\end{fulllineitems}}
+
+% classes ----------------------------------------------------------------
+% \begin{classdesc}{name}{constructor args}
+\newcommand{\classline}[2]{
+  \py@sigline{\strong{class }\bfcode{#1}}{#2}}
+\newenvironment{classdesc}[2]{
+  % Using \renewcommand doesn't work for this, for unknown reasons:
+  \global\def\py@thisclass{#1}
+  \begin{fulllineitems}
+    \classline{#1}{#2}
+}{\end{fulllineitems}}
+
+% \begin{excclassdesc}{name}{constructor args}
+% but indexes as an exception
+\newenvironment{excclassdesc}[2]{
+  % Using \renewcommand doesn't work for this, for unknown reasons:
+  \global\def\py@thisclass{#1}
+  \begin{fulllineitems}
+    \py@sigline{\strong{exception }\bfcode{#1}}{#2}%
+}{\end{fulllineitems}}
+
+% There is no corresponding {excclassdesc*} environment.  To describe
+% a class exception without parameters, use the {excdesc} environment.
+
+
+\let\py@classbadkey=\@undefined
+
+% object method ----------------------------------------------------------
+% \begin{methoddesc}[classname]{methodname}{args}
+\newcommand{\methodline}[3][\@undefined]{
+  \py@sigline{\bfcode{#2}}{#3}}
+\newenvironment{methoddesc}[3][\@undefined]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \methodline{#2}{#3}
+    \else
+      \def\py@thisclass{#1}
+      \methodline{#2}{#3}
+    \fi
+}{\end{fulllineitems}}
+
+% static method ----------------------------------------------------------
+% \begin{staticmethoddesc}[classname]{methodname}{args}
+\newcommand{\staticmethodline}[3][\@undefined]{
+  \py@sigline{static \bfcode{#2}}{#3}}
+\newenvironment{staticmethoddesc}[3][\@undefined]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \staticmethodline{#2}{#3}
+    \else
+      \def\py@thisclass{#1}
+      \staticmethodline{#2}{#3}
+    \fi
+}{\end{fulllineitems}}
+
+% object data attribute --------------------------------------------------
+% \begin{memberdesc}[classname]{membername}
+\newcommand{\memberline}[2][\py@classbadkey]{%
+  \ifx\@undefined#1\relax
+    \item[\bfcode{#2}]
+  \else
+    \item[\bfcode{#2}]
+  \fi
+}
+\newenvironment{memberdesc}[2][\py@classbadkey]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \memberline{#2}
+    \else
+      \def\py@thisclass{#1}
+      \memberline{#2}
+    \fi
+}{\end{fulllineitems}}
+
+% For exceptions: --------------------------------------------------------
+% \begin{excdesc}{name}
+%  -- for constructor information, use excclassdesc instead
+\newenvironment{excdesc}[1]{
+  \begin{fulllineitems}
+    \item[\strong{exception }\bfcode{#1}]
+}{\end{fulllineitems}}
+
+% Module data or constants: ----------------------------------------------
+% \begin{datadesc}{name}
+\newcommand{\dataline}[1]{%
+  \item[\bfcode{#1}]\nopagebreak}
+\newenvironment{datadesc}[1]{
+  \begin{fulllineitems}
+    \dataline{#1}
+}{\end{fulllineitems}}
+
+% bytecode instruction ---------------------------------------------------
+% \begin{opcodedesc}{name}{var}
+% -- {var} may be {}
+\newenvironment{opcodedesc}[2]{
+  \begin{fulllineitems}
+    \item[\bfcode{#1}\quad\emph{#2}]
+}{\end{fulllineitems}}
+
+% generic description ----------------------------------------------------
+\newcommand{\descline}[1]{%
+  \item[\bfcode{#1}]\nopagebreak%
+}
+\newenvironment{describe}[1]{
+  \begin{fulllineitems}
+    \descline{#1}
+}{\end{fulllineitems}}
+
+% This version is being checked in for the historical record; it shows
+% how I've managed to get some aspects of this to work.  It will not
+% be used in practice, so a subsequent revision will change things
+% again.  This version has problems, but shows how to do something
+% that proved more tedious than I'd expected, so I don't want to lose
+% the example completely.
+%
+\newcommand{\grammartoken}[1]{\texttt{#1}}
+\newenvironment{productionlist}[1][\py@badkey]{
+  \def\optional##1{{\Large[}##1{\Large]}}
+  \def\production##1##2{\code{##1}&::=&\code{##2}\\}
+  \def\productioncont##1{& &\code{##1}\\}
+  \def\token##1{##1}
+  \let\grammartoken=\token
+  \parindent=2em
+  \indent
+  \begin{tabular}{lcl}
+}{%
+  \end{tabular}
+}
+
+% Notices / Admonitions
+%
+\newlength{\py@noticelength}
+
+\newcommand{\py@heavybox}{
+  \setlength{\fboxrule}{1pt}
+  \setlength{\fboxsep}{7pt}
+  \setlength{\py@noticelength}{\linewidth}
+  \addtolength{\py@noticelength}{-2\fboxsep}
+  \addtolength{\py@noticelength}{-2\fboxrule}
+  \setlength{\shadowsize}{3pt}
+  \Sbox
+  \minipage{\py@noticelength}
+}
+\newcommand{\py@endheavybox}{
+  \endminipage
+  \endSbox
+  \fbox{\TheSbox}
+}
+
+% Some are quite plain:
+\newcommand{\py@noticestart@note}{}
+\newcommand{\py@noticeend@note}{}
+\newcommand{\py@noticestart@hint}{}
+\newcommand{\py@noticeend@hint}{}
+\newcommand{\py@noticestart@important}{}
+\newcommand{\py@noticeend@important}{}
+\newcommand{\py@noticestart@tip}{}
+\newcommand{\py@noticeend@tip}{}
+
+% Others gets more visible distinction:
+\newcommand{\py@noticestart@warning}{\py@heavybox}
+\newcommand{\py@noticeend@warning}{\py@endheavybox}
+\newcommand{\py@noticestart@caution}{\py@heavybox}
+\newcommand{\py@noticeend@caution}{\py@endheavybox}
+\newcommand{\py@noticestart@attention}{\py@heavybox}
+\newcommand{\py@noticeend@attention}{\py@endheavybox}
+\newcommand{\py@noticestart@danger}{\py@heavybox}
+\newcommand{\py@noticeend@danger}{\py@endheavybox}
+\newcommand{\py@noticestart@error}{\py@heavybox}
+\newcommand{\py@noticeend@error}{\py@endheavybox}
+
+\newenvironment{notice}[2]{
+  \def\py@noticetype{#1}
+  \csname py@noticestart@#1\endcsname
+  \par\strong{#2}
+}{\csname py@noticeend@\py@noticetype\endcsname}
+
+% Allow the release number to be specified independently of the
+% \date{}.  This allows the date to reflect the document's date and
+% release to specify the release that is documented.
+%
+\newcommand{\py@release}{}
+\newcommand{\version}{}
+\newcommand{\shortversion}{}
+\newcommand{\releaseinfo}{}
+\newcommand{\releasename}{Release}
+\newcommand{\release}[1]{%
+  \renewcommand{\py@release}{\releasename\space\version}%
+  \renewcommand{\version}{#1}}
+\newcommand{\setshortversion}[1]{%
+  \renewcommand{\shortversion}{#1}}
+\newcommand{\setreleaseinfo}[1]{%
+  \renewcommand{\releaseinfo}{#1}}
+
+% Allow specification of the author's address separately from the
+% author's name.  This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\py@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+%
+\@ifundefined{ChTitleVar}{}{
+  \ChNameVar{\raggedleft\normalsize\py@HeaderFamily}
+  \ChNumVar{\raggedleft \bfseries\Large\py@HeaderFamily}
+  \ChTitleVar{\raggedleft \rm\Huge\py@HeaderFamily}
+  % This creates chapter heads without the leading \vspace*{}:
+  \def\@makechapterhead#1{%
+    {\parindent \z@ \raggedright \normalfont
+      \ifnum \c@secnumdepth >\m@ne
+        \DOCH
+      \fi
+      \interlinepenalty\@M
+      \DOTI{#1}
+    }
+  }
+}
+
+% Redefine description environment so that it is usable inside fulllineitems.
+%
+\renewcommand{\description}{%
+  \list{}{\labelwidth\z@%
+          \itemindent-\leftmargin%
+	  \labelsep5pt%
+          \let\makelabel=\descriptionlabel}}
+
+% Definition lists; requested by AMK for HOWTO documents.  Probably useful
+% elsewhere as well, so keep in in the general style support.
+%
+\newenvironment{definitions}{%
+  \begin{description}%
+  \def\term##1{\item[##1]\mbox{}\\*[0mm]}
+}{%
+  \end{description}%
+}
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
+
+
+% The following is stuff copied from docutils' latex writer.
+%
+\newcommand{\optionlistlabel}[1]{\bf #1 \hfill}
+\newenvironment{optionlist}[1]
+{\begin{list}{}
+  {\setlength{\labelwidth}{#1}
+   \setlength{\rightmargin}{1cm}
+   \setlength{\leftmargin}{\rightmargin}
+   \addtolength{\leftmargin}{\labelwidth}
+   \addtolength{\leftmargin}{\labelsep}
+   \renewcommand{\makelabel}{\optionlistlabel}}
+}{\end{list}}
+
+\newlength{\lineblockindentation}
+\setlength{\lineblockindentation}{2.5em}
+\newenvironment{lineblock}[1]
+{\begin{list}{}
+  {\setlength{\partopsep}{\parskip}
+   \addtolength{\partopsep}{\baselineskip}
+   \topsep0pt\itemsep0.15\baselineskip\parsep0pt
+   \leftmargin#1}
+ \raggedright}
+{\end{list}}
+
+% Redefine includgraphics for avoiding images larger than the screen size
+% If the size is not specified.
+\let\py@Oldincludegraphics\includegraphics
+
+\newbox\image@box%
+\newdimen\image@width%
+\renewcommand\includegraphics[2][\@empty]{%
+  \ifx#1\@empty%
+    \setbox\image@box=\hbox{\py@Oldincludegraphics{#2}}%
+    \image@width\wd\image@box%
+    \ifdim \image@width>\linewidth%
+      \setbox\image@box=\hbox{\py@Oldincludegraphics[width=\linewidth]{#2}}%
+    \fi%
+    \box\image@box%
+  \else%
+    \py@Oldincludegraphics[#1]{#2}%
+  \fi%
+}
+
+
+% Fix the index and bibliography environments to add an entry to the Table of
+% Contents; this is much nicer than just having to jump to the end of the book
+% and flip around, especially with multiple indexes.
+%
+\let\py@OldTheindex=\theindex
+\renewcommand{\theindex}{
+  \cleardoublepage
+  \phantomsection
+  \py@OldTheindex
+  \addcontentsline{toc}{chapter}{\indexname}
+}
+
+\let\py@OldThebibliography=\thebibliography
+\renewcommand{\thebibliography}[1]{
+  \cleardoublepage
+  \phantomsection
+  \py@OldThebibliography{1}
+  \addcontentsline{toc}{chapter}{\bibname}
+}
+
+% Include hyperref last.
+\RequirePackage[colorlinks,breaklinks,
+                linkcolor=InnerLinkColor,filecolor=OuterLinkColor,
+                menucolor=OuterLinkColor,pagecolor=OuterLinkColor,
+                urlcolor=OuterLinkColor]{hyperref}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,449 @@
+%%
+%% This is file `tabulary.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabulary.dtx  (with options: `package')
+%% DRAFT VERSION
+%%
+%% File `tabulary.dtx'.
+%% Copyright (C) 1995 1996 2003 David Carlisle
+%% This file may be distributed under the terms of the LPPL.
+%% See 00readme.txt for details.
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tabulary}
+          [2007/10/02 v0.9 tabulary package (DPC)]
+\RequirePackage{array}
+\catcode`\Z=14
+\DeclareOption{debugshow}{\catcode`\Z=9\relax}
+\ProcessOptions
+\def\arraybackslash{\let\\=\@arraycr}
+\def\@finalstrut#1{%
+  \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1}
+\newcount\TY@count
+\def\tabulary{%
+  \let\TY@final\tabular
+  \let\endTY@final\endtabular
+  \TY@tabular}
+\def\TY@tabular#1{%
+  \edef\TY@{\@currenvir}%
+  {\ifnum0=`}\fi
+  \@ovxx\TY@linewidth
+  \@ovyy\TY@tablewidth
+  \count@\z@
+  \@tempswatrue
+  \@whilesw\if@tempswa\fi{%
+  \advance\count@\@ne
+  \expandafter\ifx\csname TY@F\the\count@\endcsname\relax
+    \@tempswafalse
+  \else
+    \expandafter\let\csname TY@SF\the\count@\expandafter\endcsname
+                     \csname TY@F\the\count@\endcsname
+    \global\expandafter\let\csname TY@F\the\count@\endcsname\relax
+    \expandafter\let\csname TY@S\the\count@\expandafter\endcsname
+                     \csname TY@\the\count@\endcsname
+  \fi}%
+    \global\TY@count\@ne
+    \TY@width\xdef{0pt}%
+    \global\TY@tablewidth\z@
+    \global\TY@linewidth#1\relax
+Z\message{^^J^^JTable^^J%
+Z        Target Width: \the\TY@linewidth^^J%
+Z        \string\tabcolsep: \the\tabcolsep\space
+Z        \string\arrayrulewidth: \the\arrayrulewidth\space
+Z        \string\doublerulesep: \the\doublerulesep^^J%
+Z        \string\tymin: \the\tymin\space
+Z        \string\tymax: \the\tymax^^J}%
+    \let\@classz\TY@classz
+    \let\verb\TX@verb
+    \toks@{}\TY@get@body}
+\let\TY@@mkpream\@mkpream
+\def\TY@mkpream{%
+    \def\@addamp{%
+      \if@firstamp \@firstampfalse \else
+      \global\advance\TY@count\@ne
+      \edef\@preamble{\@preamble &}\fi
+      \TY@width\xdef{0pt}}%
+    \def\@acol{%
+      \TY@subwidth\col@sep
+      \@addtopreamble{\hskip\col@sep}}%
+    \let\@arrayrule\TY@arrayrule
+    \let\@classvi\TY@classvi
+    \def\@classv{\save@decl
+      \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+      \sbox\z@{\d@llarbegin\@nextchar\d@llarend}%
+      \TY@subwidth{\wd\z@}%
+      \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+      \prepnext@tok}%
+  \global\let\@mkpream\TY@@mkpream
+  \TY@@mkpream}
+\def\TY@arrayrule{%
+  \TY@subwidth\arrayrulewidth
+  \@addtopreamble \vline}
+\def\TY@classvi{\ifcase \@lastchclass
+  \@acol \or
+  \TY@subwidth\doublerulesep
+  \@addtopreamble{\hskip \doublerulesep}\or
+  \@acol \or
+  \@classvii
+  \fi}
+\def\TY@tab{%
+  \setbox\z@\hbox\bgroup
+  \let\[$\let\]$%
+  \let\equation$\let\endequation$%
+    \col@sep\tabcolsep
+    \let\d@llarbegin\begingroup\let\d@llarend\endgroup
+    \let\@mkpream\TY@mkpream
+      \def\multicolumn##1##2##3{\multispan##1\relax}%
+    \CT@start\TY@tabarray}
+\def\TY@tabarray{\@ifnextchar[{\TY@array}{\@array[t]}}
+\def\TY@array[#1]{\@array[t]}
+\def\TY@width#1{%
+  \expandafter#1\csname TY@\the\TY@count\endcsname}
+\def\TY@subwidth#1{%
+  \TY@width\dimen@
+  \advance\dimen@-#1\relax
+  \TY@width\xdef{\the\dimen@}%
+  \global\advance\TY@linewidth-#1\relax}
+\def\endtabulary{%
+  \gdef\@halignto{}%
+  \expandafter\TY@tab\the\toks@
+  \crcr\omit
+  {\xdef\TY@save@row{}%
+     \loop
+    \advance\TY@count\m@ne
+    \ifnum\TY@count>\z@
+    \xdef\TY@save@row{\TY@save@row&\omit}%
+    \repeat}\TY@save@row
+  \endarray\global\setbox1=\lastbox\setbox0=\vbox{\unvbox1
+    \unskip\global\setbox1=\lastbox}\egroup
+  \dimen@\TY@linewidth
+  \divide\dimen@\TY@count
+  \ifdim\dimen@<\tymin
+    \TY@warn{tymin too large (\the\tymin), resetting to \the\dimen@}%
+    \tymin\dimen@
+  \fi
+  \setbox\tw@=\hbox{\unhbox\@ne
+    \loop
+\@tempdima=\lastskip
+\ifdim\@tempdima>\z@
+Z   \message{ecs=\the\@tempdima^^J}%
+   \global\advance\TY@linewidth-\@tempdima
+\fi
+    \unskip
+    \setbox\tw@=\lastbox
+    \ifhbox\tw@
+Z     \message{Col \the\TY@count: Initial=\the\wd\tw@\space}%
+      \ifdim\wd\tw@>\tymax
+        \wd\tw@\tymax
+Z       \message{> max\space}%
+Z     \else
+Z       \message{ \@spaces\space}%
+      \fi
+  \TY@width\dimen@
+Z \message{\the\dimen@\space}%
+  \advance\dimen@\wd\tw@
+Z \message{Final=\the\dimen@\space}%
+   \TY@width\xdef{\the\dimen@}%
+      \ifdim\dimen@<\tymin
+Z        \message{< tymin}%
+         \global\advance\TY@linewidth-\dimen@
+         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
+                                                        {\the\dimen@}%
+       \else
+      \expandafter\ifx\csname TY@F\the\TY@count\endcsname\z@
+Z        \message{***}%
+         \global\advance\TY@linewidth-\dimen@
+         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
+                                                        {\the\dimen@}%
+        \else
+Z        \message{> tymin}%
+         \global\advance\TY@tablewidth\dimen@
+         \global\expandafter\let\csname TY@F\the\TY@count\endcsname
+                                                               \maxdimen
+       \fi\fi
+       \advance\TY@count\m@ne
+    \repeat}%
+    \TY@checkmin
+    \TY@checkmin
+    \TY@checkmin
+    \TY@checkmin
+    \TY@count\z@
+    \let\TY@box\TY@box@v
+  {\expandafter\TY@final\the\toks@\endTY@final}%
+  \count@\z@
+  \@tempswatrue
+  \@whilesw\if@tempswa\fi{%
+  \advance\count@\@ne
+  \expandafter\ifx\csname TY@SF\the\count@\endcsname\relax
+    \@tempswafalse
+  \else
+    \global\expandafter\let\csname TY@F\the\count@\expandafter\endcsname
+                   \csname TY@SF\the\count@\endcsname
+    \global\expandafter\let\csname TY@\the\count@\expandafter\endcsname
+                   \csname TY@S\the\count@\endcsname
+  \fi}%
+  \TY@linewidth\@ovxx
+  \TY@tablewidth\@ovyy
+    \ifnum0=`{\fi}}
+\def\TY@checkmin{%
+  \let\TY@checkmin\relax
+\ifdim\TY@tablewidth>\z@
+  \Gscale@div\TY@ratio\TY@linewidth\TY@tablewidth
+ \ifdim\TY@tablewidth <\linewidth
+   \def\TY@ratio{1}%
+ \fi
+\else
+  \TY@warn{No suitable columns!}%
+  \def\TY@ratio{1}%
+\fi
+\count@\z@
+Z \message{^^JLine Width: \the\TY@linewidth,
+Z             Natural Width: \the\TY@tablewidth,
+Z             Ratio: \TY@ratio^^J}%
+\@tempdima\z@
+\loop
+\ifnum\count@<\TY@count
+\advance\count@\@ne
+  \ifdim\csname TY@F\the\count@\endcsname>\tymin
+    \dimen@\csname TY@\the\count@\endcsname
+    \dimen@\TY@ratio\dimen@
+    \ifdim\dimen@<\tymin
+Z     \message{Column \the\count@\space ->}%
+      \global\expandafter\let\csname TY@F\the\count@\endcsname\tymin
+      \global\advance\TY@linewidth-\tymin
+      \global\advance\TY@tablewidth-\csname TY@\the\count@\endcsname
+      \let\TY@checkmin\TY@@checkmin
+    \else
+      \expandafter\xdef\csname TY@F\the\count@\endcsname{\the\dimen@}%
+      \advance\@tempdima\csname TY@F\the\count@\endcsname
+    \fi
+  \fi
+Z \dimen@\csname TY@F\the\count@\endcsname\message{\the\dimen@, }%
+\repeat
+Z \message{^^JTotal:\the\@tempdima^^J}%
+}
+\let\TY@@checkmin\TY@checkmin
+\newdimen\TY@linewidth
+\def\tyformat{\everypar{{\nobreak\hskip\z@skip}}}
+\newdimen\tymin
+\tymin=10pt
+\newdimen\tymax
+\tymax=2\textwidth
+\def\@testpach{\@chclass
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+  \ifnum \@lastchclass=7 5 \else
+   \ifnum \@lastchclass=8 \tw@ \else
+    \ifnum \@lastchclass=9 \thr@@
+   \else \z@
+   \ifnum \@lastchclass = 10 \else
+   \edef\@nextchar{\expandafter\string\@nextchar}%
+   \@chnum
+   \if \@nextchar c\z@ \else
+    \if \@nextchar l\@ne \else
+     \if \@nextchar r\tw@ \else
+   \if \@nextchar C7 \else
+    \if \@nextchar L8 \else
+     \if \@nextchar R9 \else
+     \if \@nextchar J10 \else
+   \z@ \@chclass
+   \if\@nextchar |\@ne \else
+    \if \@nextchar !6 \else
+     \if \@nextchar @7 \else
+      \if \@nextchar <8 \else
+       \if \@nextchar >9 \else
+  10
+  \@chnum
+  \if \@nextchar m\thr@@\else
+   \if \@nextchar p4 \else
+    \if \@nextchar b5 \else
+   \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi\fi \fi \fi\fi \fi
+     \fi  \fi  \fi  \fi  \fi  \fi \fi \fi \fi \fi \fi}
+\def\TY@classz{%
+  \@classx
+  \@tempcnta\count@
+  \ifx\TY@box\TY@box@v
+    \global\advance\TY@count\@ne
+  \fi
+  \let\centering c%
+  \let\raggedright\noindent
+  \let\raggedleft\indent
+  \let\arraybackslash\relax
+  \prepnext@tok
+  \ifnum\@chnum<4
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \ifnum\@chnum=6
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \@addtopreamble{%
+    \ifcase\@chnum
+      \hfil \d@llarbegin\insert@column\d@llarend \hfil \or
+      \kern\z@
+       \d@llarbegin \insert@column \d@llarend \hfil \or
+      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or
+      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
+      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \d@llarbegin \insert@column \d@llarend \or% dubious "s" case
+      \TY@box\centering\or
+      \TY@box\raggedright\or
+      \TY@box\raggedleft\or
+      \TY@box\relax
+    \fi}\prepnext@tok}
+\def\TY@box#1{%
+  \ifx\centering#1%
+      \hfil \d@llarbegin\insert@column\d@llarend \hfil \else
+  \ifx\raggedright#1%
+        \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+      \d@llarbegin \insert@column \d@llarend \hfil \else
+  \ifx\raggedleft#1%
+      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \else
+  \ifx\relax#1%
+       \d@llarbegin \insert@column \d@llarend
+  \fi  \fi  \fi  \fi}
+\def\TY@box@v#1{%
+      \vtop \@startpbox{\csname TY@F\the\TY@count\endcsname}%
+              #1\arraybackslash\tyformat
+                              \insert@column\@endpbox}
+\newdimen\TY@tablewidth
+\def\Gscale@div#1#2#3{%
+  \setlength\dimen@{#3}%
+  \ifdim\dimen@=\z@
+    \PackageError{graphics}{Division by 0}\@eha
+    \dimen@#2%
+  \fi
+  \edef\@tempd{\the\dimen@}%
+  \setlength\dimen@{#2}%
+  \count@65536\relax
+  \ifdim\dimen@<\z@
+    \dimen@-\dimen@
+    \count@-\count@
+  \fi
+  \loop
+    \ifdim\dimen@<8192\p@
+      \dimen@\tw@\dimen@
+      \divide\count@\tw@
+  \repeat
+  \dimen@ii=\@tempd\relax
+  \divide\dimen@ii\count@
+  \divide\dimen@\dimen@ii
+  \edef#1{\strip@pt\dimen@}}
+\long\def\TY@get@body#1\end
+  {\toks@\expandafter{\the\toks@#1}\TY@find@end}
+\def\TY@find@end#1{%
+  \def\@tempa{#1}%
+  \ifx\@tempa\TY@\def\@tempa{\end{#1}}\expandafter\@tempa
+  \else\toks@\expandafter
+    {\the\toks@\end{#1}}\expandafter\TY@get@body\fi}
+\def\TY@warn{%
+  \PackageWarning{tabulary}}
+\catcode`\Z=11
+\AtBeginDocument{
+\@ifpackageloaded{colortbl}{%
+\expandafter\def\expandafter\@mkpream\expandafter#\expandafter1%
+  \expandafter{%
+    \expandafter\let\expandafter\CT@setup\expandafter\relax
+    \expandafter\let\expandafter\CT@color\expandafter\relax
+    \expandafter\let\expandafter\CT@do@color\expandafter\relax
+    \expandafter\let\expandafter\color\expandafter\relax
+    \expandafter\let\expandafter\CT@column@color\expandafter\relax
+    \expandafter\let\expandafter\CT@row@color\expandafter\relax
+    \@mkpream{#1}}
+\let\TY@@mkpream\@mkpream
+\def\TY@classz{%
+  \@classx
+  \@tempcnta\count@
+  \ifx\TY@box\TY@box@v
+    \global\advance\TY@count\@ne
+  \fi
+  \let\centering c%
+  \let\raggedright\noindent
+  \let\raggedleft\indent
+  \let\arraybackslash\relax
+  \prepnext@tok
+\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil
+  \ifnum\@chnum<4
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \ifnum\@chnum=6
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \@addtopreamble{%
+    \setbox\z@\hbox\bgroup\bgroup
+    \ifcase\@chnum
+      \hskip\stretch{.5}\kern\z@
+      \d@llarbegin\insert@column\d@llarend\hskip\stretch{.5}\or
+      \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<
+       \d@llarbegin \insert@column \d@llarend \hfill \or
+      \hfill\kern\z@ \d@llarbegin \insert@column \d@llarend \or
+      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
+      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \d@llarbegin \insert@column \d@llarend \or% dubious s case
+      \TY@box\centering\or
+      \TY@box\raggedright\or
+      \TY@box\raggedleft\or
+      \TY@box\relax
+    \fi
+ \egroup\egroup
+\begingroup
+  \CT@setup
+  \CT@column@color
+  \CT@row@color
+  \CT@do@color
+\endgroup
+        \@tempdima\ht\z@
+        \advance\@tempdima\minrowclearance
+        \vrule\@height\@tempdima\@width\z@
+\unhbox\z@
+}\prepnext@tok}%
+    \def\TY@arrayrule{%
+      \TY@subwidth\arrayrulewidth
+      \@addtopreamble{{\CT@arc@\vline}}}%
+    \def\TY@classvi{\ifcase \@lastchclass
+      \@acol \or
+      \TY@subwidth\doublerulesep
+      \ifx\CT@drsc@\relax
+        \@addtopreamble{\hskip\doublerulesep}%
+      \else
+        \@addtopreamble{{\CT@drsc@\vrule\@width\doublerulesep}}%
+      \fi\or
+      \@acol \or
+      \@classvii
+      \fi}%
+}{%
+\let\CT@start\relax
+}
+}
+{\uccode`\*=`\ %
+\uppercase{\gdef\TX@verb{%
+  \leavevmode\null\TX@vwarn
+  {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
+  \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
+    \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
+\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
+\begingroup
+\catcode`\*=\catcode`\#
+\catcode`\#=12
+\gdef\TX@vfirst{%
+  \if\@tempa#%
+    \def\@tempb{\TX@v@#}%
+  \else
+    \let\@tempb\TX@v@
+    \if\@tempa\space~\else\@tempa\fi
+  \fi
+  \@tempb}
+\gdef\TX@v@*1 *2{%
+  \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
+\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
+\endgroup
+\def\TX@vwarn{%
+  \@warning{\noexpand\verb may be unreliable inside tabularx/y}%
+  \global\let\TX@vwarn\@empty}
+\endinput
+%%
+%% End of file `tabulary.sty'.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,679 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.textwriter
+    ~~~~~~~~~~~~~~~~~
+
+    Custom docutils writer for plain text.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import textwrap
+
+from docutils import nodes, writers
+
+from sphinx import addnodes
+from sphinx.locale import admonitionlabels, versionlabels
+
+
+class TextWriter(writers.Writer):
+    supported = ('text',)
+    settings_spec = ('No options here.', '', ())
+    settings_defaults = {}
+
+    output = None
+
+    def __init__(self, builder):
+        writers.Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        visitor = TextTranslator(self.document, self.builder)
+        self.document.walkabout(visitor)
+        self.output = visitor.body
+
+# monkey-patch...
+new_wordsep_re = re.compile(
+        r'(\s+|'                                  # any whitespace
+        r'(?<=\s)(?::[a-z-]+:)?`\S+|'             # interpreted text start
+        r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|'   # hyphenated words
+        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
+textwrap.TextWrapper.wordsep_re = new_wordsep_re
+
+MAXWIDTH = 70
+STDINDENT = 3
+
+
+class TextTranslator(nodes.NodeVisitor):
+    sectionchars = '*=-~"+'
+
+    def __init__(self, document, builder):
+        nodes.NodeVisitor.__init__(self, document)
+
+        self.states = [[]]
+        self.stateindent = [0]
+        self.sectionlevel = 0
+        self.table = None
+
+    def add_text(self, text):
+        self.states[-1].append((-1, text))
+    def new_state(self, indent=STDINDENT):
+        self.states.append([])
+        self.stateindent.append(indent)
+    def end_state(self, wrap=True, end=[''], first=None):
+        content = self.states.pop()
+        maxindent = sum(self.stateindent)
+        indent = self.stateindent.pop()
+        result = []
+        toformat = []
+        def do_format():
+            if not toformat:
+                return
+            if wrap:
+                res = textwrap.wrap(''.join(toformat), width=MAXWIDTH-maxindent)
+            else:
+                res = ''.join(toformat).splitlines()
+            if end:
+                res += end
+            result.append((indent, res))
+        for itemindent, item in content:
+            if itemindent == -1:
+                toformat.append(item)
+            else:
+                do_format()
+                result.append((indent + itemindent, item))
+                toformat = []
+        do_format()
+        if first is not None and result:
+            itemindent, item = result[0]
+            if item:
+                result.insert(0, (itemindent - indent, [first + item[0]]))
+                result[1] = (itemindent, item[1:])
+        self.states[-1].extend(result)
+
+    def visit_document(self, node):
+        self.new_state(0)
+    def depart_document(self, node):
+        self.end_state()
+        self.body = '\n'.join(line and (' '*indent + line)
+                              for indent, lines in self.states[0]
+                              for line in lines)
+        # XXX header/footer?
+
+    def visit_highlightlang(self, node):
+        raise nodes.SkipNode
+
+    def visit_section(self, node):
+        self._title_char = self.sectionchars[self.sectionlevel]
+        self.sectionlevel += 1
+    def depart_section(self, node):
+        self.sectionlevel -= 1
+
+    def visit_topic(self, node):
+        self.new_state(0)
+    def depart_topic(self, node):
+        self.end_state()
+
+    visit_sidebar = visit_topic
+    depart_sidebar = depart_topic
+
+    def visit_rubric(self, node):
+        self.new_state(0)
+        self.add_text('-[ ')
+    def depart_rubric(self, node):
+        self.add_text(' ]-')
+        self.end_state()
+
+    def visit_compound(self, node):
+        pass
+    def depart_compound(self, node):
+        pass
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_title(self, node):
+        if isinstance(node.parent, nodes.Admonition):
+            self.add_text(node.astext()+': ')
+            raise nodes.SkipNode
+        self.new_state(0)
+    def depart_title(self, node):
+        if isinstance(node.parent, nodes.section):
+            char = self._title_char
+        else:
+            char = '^'
+        text = ''.join(x[1] for x in self.states.pop() if x[0] == -1)
+        self.stateindent.pop()
+        self.states[-1].append((0, ['', text, '%s' % (char * len(text)), '']))
+
+    def visit_subtitle(self, node):
+        pass
+    def depart_subtitle(self, node):
+        pass
+
+    def visit_attribution(self, node):
+        self.add_text('-- ')
+    def depart_attribution(self, node):
+        pass
+
+    def visit_module(self, node):
+        if node.has_key('platform'):
+            self.new_state(0)
+            self.add_text(_('Platform: %s') % node['platform'])
+            self.end_state()
+        raise nodes.SkipNode
+
+    def visit_desc(self, node):
+        pass
+    def depart_desc(self, node):
+        pass
+
+    def visit_desc_signature(self, node):
+        self.new_state(0)
+        if node.parent['desctype'] in ('class', 'exception'):
+            self.add_text('%s ' % node.parent['desctype'])
+    def depart_desc_signature(self, node):
+        # XXX: wrap signatures in a way that makes sense
+        self.end_state(wrap=False, end=None)
+
+    def visit_desc_name(self, node):
+        pass
+    def depart_desc_name(self, node):
+        pass
+
+    def visit_desc_addname(self, node):
+        pass
+    def depart_desc_addname(self, node):
+        pass
+
+    def visit_desc_type(self, node):
+        pass
+    def depart_desc_type(self, node):
+        pass
+
+    def visit_desc_parameterlist(self, node):
+        self.add_text('(')
+        self.first_param = 1
+    def depart_desc_parameterlist(self, node):
+        self.add_text(')')
+
+    def visit_desc_parameter(self, node):
+        if not self.first_param:
+            self.add_text(', ')
+        else:
+            self.first_param = 0
+        self.add_text(node.astext())
+        raise nodes.SkipNode
+
+    def visit_desc_optional(self, node):
+        self.add_text('[')
+    def depart_desc_optional(self, node):
+        self.add_text(']')
+
+    def visit_desc_annotation(self, node):
+        pass
+    def depart_desc_annotation(self, node):
+        pass
+
+    def visit_refcount(self, node):
+        pass
+    def depart_refcount(self, node):
+        pass
+
+    def visit_desc_content(self, node):
+        self.new_state()
+        self.add_text('\n')
+    def depart_desc_content(self, node):
+        self.end_state()
+
+    def visit_figure(self, node):
+        self.new_state()
+    def depart_figure(self, node):
+        self.end_state()
+
+    def visit_caption(self, node):
+        pass
+    def depart_caption(self, node):
+        pass
+
+    def visit_productionlist(self, node):
+        self.new_state()
+        names = []
+        for production in node:
+            names.append(production['tokenname'])
+        maxlen = max(len(name) for name in names)
+        for production in node:
+            if production['tokenname']:
+                self.add_text(production['tokenname'].ljust(maxlen) + ' ::=')
+                lastname = production['tokenname']
+            else:
+                self.add_text('%s    ' % (' '*len(lastname)))
+            self.add_text(production.astext() + '\n')
+        self.end_state(wrap=False)
+        raise nodes.SkipNode
+
+    def visit_seealso(self, node):
+        self.new_state()
+    def depart_seealso(self, node):
+        self.end_state(first='')
+
+    def visit_footnote(self, node):
+        self._footnote = node.children[0].astext().strip()
+        self.new_state(len(self._footnote) + 3)
+    def depart_footnote(self, node):
+        self.end_state(first='[%s] ' % self._footnote)
+
+    def visit_citation(self, node):
+        if len(node) and isinstance(node[0], nodes.label):
+            self._citlabel = node[0].astext()
+        else:
+            self._citlabel = ''
+        self.new_state(len(self._citlabel) + 3)
+    def depart_citation(self, node):
+        self.end_state(first='[%s] ' % self._citlabel)
+
+    def visit_label(self, node):
+        raise nodes.SkipNode
+
+    # XXX: option list could use some better styling
+
+    def visit_option_list(self, node):
+        pass
+    def depart_option_list(self, node):
+        pass
+
+    def visit_option_list_item(self, node):
+        self.new_state(0)
+    def depart_option_list_item(self, node):
+        self.end_state()
+
+    def visit_option_group(self, node):
+        self._firstoption = True
+    def depart_option_group(self, node):
+        self.add_text('     ')
+
+    def visit_option(self, node):
+        if self._firstoption:
+            self._firstoption = False
+        else:
+            self.add_text(', ')
+    def depart_option(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        pass
+    def depart_option_string(self, node):
+        pass
+
+    def visit_option_argument(self, node):
+        self.add_text(node['delimiter'])
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_description(self, node):
+        pass
+    def depart_description(self, node):
+        pass
+
+    def visit_tabular_col_spec(self, node):
+        raise nodes.SkipNode
+
+    def visit_colspec(self, node):
+        self.table[0].append(node['colwidth'])
+        raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        pass
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        pass
+    def depart_thead(self, node):
+        pass
+
+    def visit_tbody(self, node):
+        self.table.append('sep')
+    def depart_tbody(self, node):
+        pass
+
+    def visit_row(self, node):
+        self.table.append([])
+    def depart_row(self, node):
+        pass
+
+    def visit_entry(self, node):
+        if node.has_key('morerows') or node.has_key('morecols'):
+            raise NotImplementedError('Column or row spanning cells are '
+                                      'not implemented.')
+        self.new_state(0)
+    def depart_entry(self, node):
+        text = '\n'.join('\n'.join(x[1]) for x in self.states.pop())
+        self.stateindent.pop()
+        self.table[-1].append(text)
+
+    def visit_table(self, node):
+        if self.table:
+            raise NotImplementedError('Nested tables are not supported.')
+        self.new_state(0)
+        self.table = [[]]
+    def depart_table(self, node):
+        lines = self.table[1:]
+        fmted_rows = []
+        colwidths = self.table[0]
+        realwidths = colwidths[:]
+        separator = 0
+        # don't allow paragraphs in table cells for now
+        for line in lines:
+            if line == 'sep':
+                separator = len(fmted_rows)
+            else:
+                cells = []
+                for i, cell in enumerate(line):
+                    par = textwrap.wrap(cell, width=colwidths[i])
+                    if par:
+                        maxwidth = max(map(len, par))
+                    else:
+                        maxwidth = 0
+                    realwidths[i] = max(realwidths[i], maxwidth)
+                    cells.append(par)
+                fmted_rows.append(cells)
+
+        def writesep(char='-'):
+            out = ['+']
+            for width in realwidths:
+                out.append(char * (width+2))
+                out.append('+')
+            self.add_text(''.join(out) + '\n')
+
+        def writerow(row):
+            lines = map(None, *row)
+            for line in lines:
+                out = ['|']
+                for i, cell in enumerate(line):
+                    if cell:
+                        out.append(' ' + cell.ljust(realwidths[i]+1))
+                    else:
+                        out.append(' ' * (realwidths[i] + 2))
+                    out.append('|')
+                self.add_text(''.join(out) + '\n')
+
+        for i, row in enumerate(fmted_rows):
+            if separator and i == separator:
+                writesep('=')
+            else:
+                writesep('-')
+            writerow(row)
+        writesep('-')
+        self.table = None
+        self.end_state(wrap=False)
+
+    def visit_acks(self, node):
+        self.new_state(0)
+        self.add_text(', '.join(n.astext() for n in node.children[0].children) + '.')
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        self.add_text(_('[image]'))
+        raise nodes.SkipNode
+
+    def visit_transition(self, node):
+        indent = sum(self.stateindent)
+        self.new_state(0)
+        self.add_text('=' * (MAXWIDTH - indent))
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_bullet_list(self, node):
+        self._list_counter = -1
+    def depart_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        self._list_counter = 0
+    def depart_enumerated_list(self, node):
+        pass
+
+    def visit_definition_list(self, node):
+        self._list_counter = -2
+    def depart_definition_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        if self._list_counter == -1:
+            # bullet list
+            self.new_state(2)
+        elif self._list_counter == -2:
+            # definition list
+            pass
+        else:
+            # enumerated list
+            self._list_counter += 1
+            self.new_state(len(str(self._list_counter)) + 2)
+    def depart_list_item(self, node):
+        if self._list_counter == -1:
+            self.end_state(first='* ', end=None)
+        elif self._list_counter == -2:
+            pass
+        else:
+            self.end_state(first='%s. ' % self._list_counter, end=None)
+
+    def visit_definition_list_item(self, node):
+        self._li_has_classifier = len(node) >= 2 and \
+                                  isinstance(node[1], nodes.classifier)
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.new_state(0)
+    def depart_term(self, node):
+        if not self._li_has_classifier:
+            self.end_state(end=None)
+
+    def visit_classifier(self, node):
+        self.add_text(' : ')
+    def depart_classifier(self, node):
+        self.end_state(end=None)
+
+    def visit_definition(self, node):
+        self.new_state()
+    def depart_definition(self, node):
+        self.end_state()
+
+    def visit_field_list(self, node):
+        pass
+    def depart_field_list(self, node):
+        pass
+
+    def visit_field(self, node):
+        pass
+    def depart_field(self, node):
+        pass
+
+    def visit_field_name(self, node):
+        self.new_state(0)
+    def depart_field_name(self, node):
+        self.add_text(':')
+        self.end_state(end=None)
+
+    def visit_field_body(self, node):
+        self.new_state()
+    def depart_field_body(self, node):
+        self.end_state()
+
+    def visit_centered(self, node):
+        pass
+    def depart_centered(self, node):
+        pass
+
+    def visit_admonition(self, node):
+        self.new_state(0)
+    def depart_admonition(self, node):
+        self.end_state()
+
+    def _visit_admonition(self, node):
+        self.new_state(2)
+    def _make_depart_admonition(name):
+        def depart_admonition(self, node):
+            self.end_state(first=admonitionlabels[name] + ': ')
+        return depart_admonition
+
+    visit_attention = _visit_admonition
+    depart_attention = _make_depart_admonition('attention')
+    visit_caution = _visit_admonition
+    depart_caution = _make_depart_admonition('caution')
+    visit_danger = _visit_admonition
+    depart_danger = _make_depart_admonition('danger')
+    visit_error = _visit_admonition
+    depart_error = _make_depart_admonition('error')
+    visit_hint = _visit_admonition
+    depart_hint = _make_depart_admonition('hint')
+    visit_important = _visit_admonition
+    depart_important = _make_depart_admonition('important')
+    visit_note = _visit_admonition
+    depart_note = _make_depart_admonition('note')
+    visit_tip = _visit_admonition
+    depart_tip = _make_depart_admonition('tip')
+    visit_warning = _visit_admonition
+    depart_warning = _make_depart_admonition('warning')
+
+    def visit_versionmodified(self, node):
+        self.new_state(0)
+        if node.children:
+            self.add_text(versionlabels[node['type']] % node['version'] + ': ')
+        else:
+            self.add_text(versionlabels[node['type']] % node['version'] + '.')
+    def depart_versionmodified(self, node):
+        self.end_state()
+
+    def visit_literal_block(self, node):
+        self.new_state()
+    def depart_literal_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_doctest_block(self, node):
+        self.new_state(0)
+    def depart_doctest_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_line_block(self, node):
+        self.new_state(0)
+    def depart_line_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_line(self, node):
+        pass
+    def depart_line(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.new_state()
+    def depart_block_quote(self, node):
+        self.end_state()
+
+    def visit_compact_paragraph(self, node):
+        pass
+    def depart_compact_paragraph(self, node):
+        pass
+
+    def visit_paragraph(self, node):
+        if not isinstance(node.parent, nodes.Admonition) or \
+               isinstance(node.parent, addnodes.seealso):
+            self.new_state(0)
+    def depart_paragraph(self, node):
+        if not isinstance(node.parent, nodes.Admonition) or \
+               isinstance(node.parent, addnodes.seealso):
+            self.end_state()
+
+    def visit_target(self, node):
+        raise nodes.SkipNode
+
+    def visit_index(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_pending_xref(self, node):
+        pass
+    def depart_pending_xref(self, node):
+        pass
+
+    def visit_reference(self, node):
+        pass
+    def depart_reference(self, node):
+        pass
+
+    def visit_emphasis(self, node):
+        self.add_text('*')
+    def depart_emphasis(self, node):
+        self.add_text('*')
+
+    def visit_literal_emphasis(self, node):
+        self.add_text('*')
+    def depart_literal_emphasis(self, node):
+        self.add_text('*')
+
+    def visit_strong(self, node):
+        self.add_text('**')
+    def depart_strong(self, node):
+        self.add_text('**')
+
+    def visit_title_reference(self, node):
+        self.add_text('*')
+    def depart_title_reference(self, node):
+        self.add_text('*')
+
+    def visit_literal(self, node):
+        self.add_text('``')
+    def depart_literal(self, node):
+        self.add_text('``')
+
+    def visit_subscript(self, node):
+        self.add_text('_')
+    def depart_subscript(self, node):
+        pass
+
+    def visit_superscript(self, node):
+        self.add_text('^')
+    def depart_superscript(self, node):
+        pass
+
+    def visit_footnote_reference(self, node):
+        self.add_text('[%s]' % node.astext())
+        raise nodes.SkipNode
+
+    def visit_citation_reference(self, node):
+        self.add_text('[%s]' % node.astext())
+        raise nodes.SkipNode
+
+    def visit_Text(self, node):
+        self.add_text(node.astext())
+    def depart_Text(self, node):
+        pass
+
+    def visit_problematic(self, node):
+        self.add_text('>>')
+    def depart_problematic(self, node):
+        self.add_text('<<')
+
+    def visit_system_message(self, node):
+        self.new_state(0)
+        self.add_text('<SYSTEM MESSAGE: %s>' % node.astext())
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    def visit_meta(self, node):
+        # only valid for HTML
+        raise nodes.SkipNode
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,284 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util
+    ~~~~~~~~~~~
+
+    Utility functions for Sphinx.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import re
+import sys
+import time
+import fnmatch
+import tempfile
+import traceback
+from os import path
+
+
+# Generally useful regular expressions.
+ws_re = re.compile(r'\s+')
+caption_ref_re = re.compile(r'^([^<]+?)\s*<(.+)>$')
+
+
+# SEP separates path elements in the canonical file names
+#
+# Define SEP as a manifest constant, not so much because we expect it to change
+# in the future as to avoid the suspicion that a stray "/" in the code is a
+# hangover from more *nix-oriented origins.
+SEP = "/"
+
+def os_path(canonicalpath):
+    return canonicalpath.replace(SEP, os.path.sep)
+
+
+def relative_uri(base, to):
+    """Return a relative URL from ``base`` to ``to``."""
+    b2 = base.split(SEP)
+    t2 = to.split(SEP)
+    # remove common segments
+    for x, y in zip(b2, t2):
+        if x != y:
+            break
+        b2.pop(0)
+        t2.pop(0)
+    return ('..' + SEP) * (len(b2)-1) + SEP.join(t2)
+
+
+def ensuredir(path):
+    """Ensure that a path exists."""
+    try:
+        os.makedirs(path)
+    except OSError, err:
+        if not err.errno == 17:
+            raise
+
+
+def walk(top, topdown=True, followlinks=False):
+    """
+    Backport of os.walk from 2.6, where the followlinks argument was added.
+    """
+    names = os.listdir(top)
+
+    dirs, nondirs = [], []
+    for name in names:
+        if path.isdir(path.join(top, name)):
+            dirs.append(name)
+        else:
+            nondirs.append(name)
+
+    if topdown:
+        yield top, dirs, nondirs
+    for name in dirs:
+        fullpath = path.join(top, name)
+        if followlinks or not path.islink(fullpath):
+            for x in walk(fullpath, topdown, followlinks):
+                yield x
+    if not topdown:
+        yield top, dirs, nondirs
+
+
+def get_matching_docs(dirname, suffix, exclude_docs=(), exclude_dirs=(),
+                      exclude_trees=(), exclude_dirnames=()):
+    """
+    Get all file names (without suffix) matching a suffix in a
+    directory, recursively.
+
+    Exclude docs in *exclude_docs*, exclude dirs in *exclude_dirs*,
+    prune dirs in *exclude_trees*, prune dirnames in *exclude_dirnames*.
+    """
+    pattern = '*' + suffix
+    # dirname is a normalized absolute path.
+    dirname = path.normpath(path.abspath(dirname))
+    dirlen = len(dirname) + 1    # exclude slash
+    for root, dirs, files in walk(dirname, followlinks=True):
+        if root[dirlen:] in exclude_dirs:
+            continue
+        if root[dirlen:] in exclude_trees:
+            del dirs[:]
+            continue
+        dirs.sort()
+        files.sort()
+        for prunedir in exclude_dirnames:
+            if prunedir in dirs:
+                dirs.remove(prunedir)
+        for sfile in files:
+            if not fnmatch.fnmatch(sfile, pattern):
+                continue
+            qualified_name = path.join(root[dirlen:], sfile[:-len(suffix)])
+            qualified_name = qualified_name.replace(os.path.sep, SEP)
+            if qualified_name in exclude_docs:
+                continue
+            yield qualified_name
+
+
+def mtimes_of_files(dirnames, suffix):
+    for dirname in dirnames:
+        for root, dirs, files in os.walk(dirname):
+            for sfile in files:
+                if sfile.endswith(suffix):
+                    try:
+                        yield path.getmtime(path.join(root, sfile))
+                    except EnvironmentError:
+                        pass
+
+
+def shorten_result(text='', keywords=[], maxlen=240, fuzz=60):
+    if not text:
+        text = ''
+    text_low = text.lower()
+    beg = -1
+    for k in keywords:
+        i = text_low.find(k.lower())
+        if (i > -1 and i < beg) or beg == -1:
+            beg = i
+    excerpt_beg = 0
+    if beg > fuzz:
+        for sep in ('.', ':', ';', '='):
+            eb = text.find(sep, beg - fuzz, beg - 1)
+            if eb > -1:
+                eb += 1
+                break
+        else:
+            eb = beg - fuzz
+        excerpt_beg = eb
+    if excerpt_beg < 0:
+        excerpt_beg = 0
+    msg = text[excerpt_beg:beg+maxlen]
+    if beg > fuzz:
+        msg = '... ' + msg
+    if beg < len(text)-maxlen:
+        msg = msg + ' ...'
+    return msg
+
+
+class attrdict(dict):
+    def __getattr__(self, key):
+        return self[key]
+    def __setattr__(self, key, val):
+        self[key] = val
+    def __delattr__(self, key):
+        del self[key]
+
+
+def fmt_ex(ex):
+    """Format a single line with an exception description."""
+    return traceback.format_exception_only(ex.__class__, ex)[-1].strip()
+
+
+def rpartition(s, t):
+    """Similar to str.rpartition from 2.5, but doesn't return the separator."""
+    i = s.rfind(t)
+    if i != -1:
+        return s[:i], s[i+len(t):]
+    return '', s
+
+
+def format_exception_cut_frames(x=1):
+    """
+    Format an exception with traceback, but only the last x frames.
+    """
+    typ, val, tb = sys.exc_info()
+    #res = ['Traceback (most recent call last):\n']
+    res = []
+    tbres = traceback.format_tb(tb)
+    res += tbres[-x:]
+    res += traceback.format_exception_only(typ, val)
+    return ''.join(res)
+
+
+def save_traceback():
+    """
+    Save the current exception's traceback in a temporary file.
+    """
+    exc = traceback.format_exc()
+    fd, path = tempfile.mkstemp('.log', 'sphinx-err-')
+    os.write(fd, exc)
+    os.close(fd)
+    return path
+
+
+def _translate_pattern(pat):
+    """
+    Translate a shell-style glob pattern to a regular expression.
+
+    Adapted from the fnmatch module, but enhanced so that single stars don't
+    match slashes.
+    """
+    i, n = 0, len(pat)
+    res = ''
+    while i < n:
+        c = pat[i]
+        i += 1
+        if c == '*':
+            if i < n and pat[i] == '*':
+                # double star matches slashes too
+                i += 1
+                res = res + '.*'
+            else:
+                # single star doesn't match slashes
+                res = res + '[^/]*'
+        elif c == '?':
+            # question mark doesn't match slashes too
+            res = res + '[^/]'
+        elif c == '[':
+            j = i
+            if j < n and pat[j] == '!':
+                j += 1
+            if j < n and pat[j] == ']':
+                j += 1
+            while j < n and pat[j] != ']':
+                j += 1
+            if j >= n:
+                res = res + '\\['
+            else:
+                stuff = pat[i:j].replace('\\', '\\\\')
+                i = j + 1
+                if stuff[0] == '!':
+                    # negative pattern mustn't match slashes too
+                    stuff = '^/' + stuff[1:]
+                elif stuff[0] == '^':
+                    stuff = '\\' + stuff
+                res = '%s[%s]' % (res, stuff)
+        else:
+            res += re.escape(c)
+    return res + '$'
+
+
+_pat_cache = {}
+
+def patfilter(names, pat):
+    """
+    Return the subset of the list NAMES that match PAT.
+    Adapted from fnmatch module.
+    """
+    result = []
+    if pat not in _pat_cache:
+        _pat_cache[pat] = re.compile(_translate_pattern(pat))
+    match = _pat_cache[pat].match
+    return filter(match, names)
+
+
+no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
+
+def make_filename(string):
+    return no_fn_re.sub('', string)
+
+
+def nested_parse_with_titles(state, content, node):
+    # hack around title style bookkeeping
+    surrounding_title_styles = state.memo.title_styles
+    surrounding_section_level = state.memo.section_level
+    state.memo.title_styles = []
+    state.memo.section_level = 0
+    state.nested_parse(content, 0, node, match_titles=1)
+    state.memo.title_styles = surrounding_title_styles
+    state.memo.section_level = surrounding_section_level
+
+
+def ustrftime(format, *args):
+    # strftime for unicode strings
+    return time.strftime(unicode(format).encode('utf-8'), *args).decode('utf-8')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.compat
+    ~~~~~~~~~~~~~~~~~~
+
+    Stuff for docutils compatibility.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+
+# function missing in 0.5 SVN
+def make_admonition(node_class, name, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    #if not content:
+    #    error = state_machine.reporter.error(
+    #        'The "%s" admonition is empty; content required.' % (name),
+    #        nodes.literal_block(block_text, block_text), line=lineno)
+    #    return [error]
+    text = '\n'.join(content)
+    admonition_node = node_class(text)
+    if arguments:
+        title_text = arguments[0]
+        textnodes, messages = state.inline_text(title_text, lineno)
+        admonition_node += nodes.title(title_text, '', *textnodes)
+        admonition_node += messages
+        if options.has_key('class'):
+            classes = options['class']
+        else:
+            classes = ['admonition-' + nodes.make_id(title_text)]
+        admonition_node['classes'] += classes
+    state.nested_parse(content, content_offset, admonition_node)
+    return [admonition_node]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.console
+    ~~~~~~~~~~~~~~~~~~~
+
+    Format colored console output.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+
+codes = {}
+
+def get_terminal_width():
+    """Borrowed from the py lib."""
+    try:
+        import os, termios, fcntl, struct
+        call = fcntl.ioctl(0, termios.TIOCGWINSZ, "\000"*8)
+        height, width = struct.unpack("hhhh", call)[:2]
+        terminal_width = width
+    except (SystemExit, KeyboardInterrupt):
+        raise
+    except:
+        # FALLBACK
+        terminal_width = int(os.environ.get('COLUMNS', 80))-1
+    return terminal_width
+
+_tw = get_terminal_width()
+
+def print_and_backspace(text, func):
+    if not codes:
+        # if no coloring, don't output fancy backspaces
+        func(text)
+    else:
+        func(text.ljust(_tw) + _tw * "\b")
+
+def color_terminal():
+    if 'COLORTERM' in os.environ:
+        return True
+    term = os.environ.get('TERM', 'dumb').lower()
+    if 'xterm' in term or 'color' in term:
+        return True
+    return False
+
+
+def nocolor():
+    codes.clear()
+
+def coloron():
+    codes.update(_orig_codes)
+
+def colorize(name, text):
+    return codes.get(name, '') + text + codes.get('reset', '')
+
+def create_color_func(name):
+    def inner(text):
+        return colorize(name, text)
+    globals()[name] = inner
+
+_attrs = {
+    'reset':     '39;49;00m',
+    'bold':      '01m',
+    'faint':     '02m',
+    'standout':  '03m',
+    'underline': '04m',
+    'blink':     '05m',
+}
+
+for _name, _value in _attrs.items():
+    codes[_name] = '\x1b[' + _value
+
+_colors = [
+    ('black',     'darkgray'),
+    ('darkred',   'red'),
+    ('darkgreen', 'green'),
+    ('brown',     'yellow'),
+    ('darkblue',  'blue'),
+    ('purple',    'fuchsia'),
+    ('turquoise', 'teal'),
+    ('lightgray', 'white'),
+]
+
+for i, (dark, light) in enumerate(_colors):
+    codes[dark] = '\x1b[%im' % (i+30)
+    codes[light] = '\x1b[%i;01m' % (i+30)
+
+_orig_codes = codes.copy()
+
+for _name in codes:
+    create_color_func(_name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.jsdump
+    ~~~~~~~~~~~~~~~~~~
+
+    This module implements a simple JavaScript serializer.
+    Uses the basestring encode function from simplejson.
+
+    :copyright: 2008 by Armin Ronacher, Bob Ippolito, Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+
+_str_re  = re.compile(r'"(\\\\|\\"|[^"])*"')
+_int_re  = re.compile(r'\d+')
+_name_re = re.compile(r'[a-zA-Z]\w*')
+_nameonly_re = re.compile(r'[a-zA-Z]\w*$')
+
+# escape \, ", control characters and everything outside ASCII
+ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
+ESCAPE_DICT = {
+    '\\': '\\\\',
+    '"': '\\"',
+    '\b': '\\b',
+    '\f': '\\f',
+    '\n': '\\n',
+    '\r': '\\r',
+    '\t': '\\t',
+}
+
+ESCAPED = re.compile(r'\\u.{4}|\\.')
+
+
+def encode_string(s):
+    def replace(match):
+        s = match.group(0)
+        try:
+            return ESCAPE_DICT[s]
+        except KeyError:
+            n = ord(s)
+            if n < 0x10000:
+                return '\\u%04x' % (n,)
+            else:
+                # surrogate pair
+                n -= 0x10000
+                s1 = 0xd800 | ((n >> 10) & 0x3ff)
+                s2 = 0xdc00 | (n & 0x3ff)
+                return '\\u%04x\\u%04x' % (s1, s2)
+    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
+
+def decode_string(s):
+    return ESCAPED.sub(lambda m: eval('u"'+m.group()+'"'), s)
+
+
+reswords = set("""\
+abstract   else   instanceof   switch
+boolean   enum   int   synchronized
+break   export   interface   this
+byte   extends   long   throw
+case   false   native   throws
+catch   final   new   transient
+char   finally   null   true
+class   float   package   try
+const   for   private   typeof
+continue   function   protected   var
+debugger   goto   public   void
+default   if   return   volatile
+delete   implements   short   while
+do   import   static   with
+double   in   super""".split())
+
+def dumps(obj, key=False):
+    if key:
+        if not isinstance(obj, basestring):
+            obj = str(obj)
+        if _nameonly_re.match(obj) and obj not in reswords:
+            return obj  # return it as a bare word
+        else:
+            return encode_string(obj)
+    if obj is None:
+        return 'null'
+    elif obj is True or obj is False:
+        return obj and 'true' or 'false'
+    elif isinstance(obj, (int, long, float)):
+        return str(obj)
+    elif isinstance(obj, dict):
+        return '{%s}' % ','.join('%s:%s' % (
+            dumps(key, True),
+            dumps(value)
+        ) for key, value in obj.iteritems())
+    elif isinstance(obj, (tuple, list, set)):
+        return '[%s]' % ','.join(dumps(x) for x in obj)
+    elif isinstance(obj, basestring):
+        return encode_string(obj)
+    raise TypeError(type(obj))
+
+def dump(obj, f):
+    f.write(dumps(obj))
+
+
+def loads(x):
+    """Loader that can read the JS subset the indexer produces."""
+    nothing = object()
+    i = 0
+    n = len(x)
+    stack = []
+    obj = nothing
+    key = False
+    keys = []
+    while i < n:
+        c = x[i]
+        if c == '{':
+            obj = {}
+            stack.append(obj)
+            key = True
+            keys.append(nothing)
+            i += 1
+        elif c == '[':
+            obj = []
+            stack.append(obj)
+            key = False
+            keys.append(nothing)
+            i += 1
+        elif c in '}]':
+            if key:
+                if keys[-1] is not nothing:
+                    raise ValueError("unfinished dict")
+                # empty dict
+                key = False
+            oldobj = stack.pop()
+            keys.pop()
+            if stack:
+                obj = stack[-1]
+                if isinstance(obj, dict):
+                    if keys[-1] is nothing:
+                        raise ValueError("invalid key object", oldobj)
+                    obj[keys[-1]] = oldobj
+                else:
+                    obj.append(oldobj)
+            else:
+                break
+            i += 1
+        elif c == ',':
+            if key:
+                raise ValueError("multiple keys")
+            if isinstance(obj, dict):
+                key = True
+            i += 1
+        elif c == ':':
+            if not isinstance(obj, dict):
+                raise ValueError("colon in list")
+            i += 1
+            if not key:
+                raise ValueError("multiple values")
+            key = False
+        else:
+            m = _str_re.match(x, i)
+            if m:
+                y = decode_string(m.group()[1:-1])
+            else:
+                m = _int_re.match(x, i)
+                if m:
+                    y = int(m.group())
+                else:
+                    m = _name_re.match(x, i)
+                    if m:
+                        y = m.group()
+                        if y == 'true':
+                            y = True
+                        elif y == 'false':
+                            y = False
+                        elif y == 'null':
+                            y = None
+                        elif not key:
+                            raise ValueError("bareword as value")
+                    else:
+                        raise ValueError("read error at pos %d" % i)
+            i = m.end()
+            if isinstance(obj, dict):
+                if key:
+                    keys[-1] = y
+                else:
+                    obj[keys[-1]] = y
+                    key = False
+            else:
+                obj.append(y)
+    if obj is nothing:
+        raise ValueError("nothing loaded from string")
+    return obj
+
+def load(f):
+    return loads(f.read())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.png
+    ~~~~~~~~~~~~~~~
+
+    PNG image manipulation helpers.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import struct
+import binascii
+
+LEN_IEND = 12
+LEN_DEPTH = 22
+
+DEPTH_CHUNK_LEN = struct.pack('!i', 10)
+DEPTH_CHUNK_START = 'tEXtDepth\x00'
+IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
+
+
+def read_png_depth(filename):
+    """
+    Read the special tEXt chunk indicating the depth from a PNG file.
+    """
+    result = None
+    f = open(filename, 'rb')
+    try:
+        f.seek(- (LEN_IEND + LEN_DEPTH), 2)
+        depthchunk = f.read(LEN_DEPTH)
+        if not depthchunk.startswith(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START):
+            # either not a PNG file or not containing the depth chunk
+            return None
+        result = struct.unpack('!i', depthchunk[14:18])[0]
+    finally:
+        f.close()
+    return result
+
+
+def write_png_depth(filename, depth):
+    """
+    Write the special tEXt chunk indicating the depth to a PNG file.
+    The chunk is placed immediately before the special IEND chunk.
+    """
+    data = struct.pack('!i', depth)
+    f = open(filename, 'r+b')
+    try:
+        # seek to the beginning of the IEND chunk
+        f.seek(-LEN_IEND, 2)
+        # overwrite it with the depth chunk
+        f.write(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START + data)
+        # calculate the checksum over chunk name and data
+        f.write(struct.pack('!i', binascii.crc32(DEPTH_CHUNK_START + data)))
+        # replace the IEND chunk
+        f.write(IEND_CHUNK)
+    finally:
+        f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,303 @@
+r"""
+This is based on SmartyPants.py by `Chad Miller`_.
+
+Copyright and License
+=====================
+
+SmartyPants_ license::
+
+    Copyright (c) 2003 John Gruber
+    (http://daringfireball.net/)
+    All rights reserved.
+
+    Redistribution and use 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 "SmartyPants" nor the names of its contributors
+        may be used to endorse or promote products derived from this
+        software without specific prior written permission.
+
+    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.
+
+
+smartypants.py license::
+
+    smartypants.py is a derivative work of SmartyPants.
+
+    Redistribution and use 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.
+
+    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.
+
+.. _Chad Miller: http://web.chad.org/
+"""
+
+import re
+
+
+def sphinx_smarty_pants(t):
+    t = t.replace('&quot;', '"')
+    t = educateDashesOldSchool(t)
+    t = educateQuotes(t)
+    t = t.replace('"', '&quot;')
+    return t
+
+# Constants for quote education.
+
+punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]"""
+close_class = r"""[^\ \t\r\n\[\{\(\-]"""
+dec_dashes = r"""&#8211;|&#8212;"""
+
+# Special case if the very first character is a quote
+# followed by punctuation at a non-word-break. Close the quotes by brute force:
+single_quote_start_re = re.compile(r"""^'(?=%s\\B)""" % (punct_class,))
+double_quote_start_re = re.compile(r"""^"(?=%s\\B)""" % (punct_class,))
+
+# Special case for double sets of quotes, e.g.:
+#   <p>He said, "'Quoted' words in a larger quote."</p>
+double_quote_sets_re = re.compile(r""""'(?=\w)""")
+single_quote_sets_re = re.compile(r"""'"(?=\w)""")
+
+# Special case for decade abbreviations (the '80s):
+decade_abbr_re = re.compile(r"""\b'(?=\d{2}s)""")
+
+# Get most opening double quotes:
+opening_double_quotes_regex = re.compile(r"""
+                (
+                        \s          |   # a whitespace char, or
+                        &nbsp;      |   # a non-breaking space entity, or
+                        --          |   # dashes, or
+                        &[mn]dash;  |   # named dash entities
+                        %s          |   # or decimal entities
+                        &\#x201[34];    # or hex
+                )
+                "                 # the quote
+                (?=\w)            # followed by a word character
+                """ % (dec_dashes,), re.VERBOSE)
+
+# Double closing quotes:
+closing_double_quotes_regex = re.compile(r"""
+                #(%s)?   # character that indicates the quote should be closing
+                "
+                (?=\s)
+                """ % (close_class,), re.VERBOSE)
+
+closing_double_quotes_regex_2 = re.compile(r"""
+                (%s)   # character that indicates the quote should be closing
+                "
+                """ % (close_class,), re.VERBOSE)
+
+# Get most opening single quotes:
+opening_single_quotes_regex = re.compile(r"""
+                (
+                        \s          |   # a whitespace char, or
+                        &nbsp;      |   # a non-breaking space entity, or
+                        --          |   # dashes, or
+                        &[mn]dash;  |   # named dash entities
+                        %s          |   # or decimal entities
+                        &\#x201[34];    # or hex
+                )
+                '                 # the quote
+                (?=\w)            # followed by a word character
+                """ % (dec_dashes,), re.VERBOSE)
+
+closing_single_quotes_regex = re.compile(r"""
+                (%s)
+                '
+                (?!\s | s\b | \d)
+                """ % (close_class,), re.VERBOSE)
+
+closing_single_quotes_regex_2 = re.compile(r"""
+                (%s)
+                '
+                (\s | s\b)
+                """ % (close_class,), re.VERBOSE)
+
+def educateQuotes(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with "educated" curly quote HTML entities.
+
+    Example input:  "Isn't this fun?"
+    Example output: &#8220;Isn&#8217;t this fun?&#8221;
+    """
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break. Close the quotes by brute force:
+    s = single_quote_start_re.sub("&#8217;", s)
+    s = double_quote_start_re.sub("&#8221;", s)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    s = double_quote_sets_re.sub("&#8220;&#8216;", s)
+    s = single_quote_sets_re.sub("&#8216;&#8220;", s)
+
+    # Special case for decade abbreviations (the '80s):
+    s = decade_abbr_re.sub("&#8217;", s)
+
+    s = opening_single_quotes_regex.sub(r"\1&#8216;", s)
+    s = closing_single_quotes_regex.sub(r"\1&#8217;", s)
+    s = closing_single_quotes_regex_2.sub(r"\1&#8217;\2", s)
+
+    # Any remaining single quotes should be opening ones:
+    s = s.replace("'", "&#8216;")
+
+    s = opening_double_quotes_regex.sub(r"\1&#8220;", s)
+    s = closing_double_quotes_regex.sub(r"&#8221;", s)
+    s = closing_double_quotes_regex_2.sub(r"\1&#8221;", s)
+
+    # Any remaining quotes should be opening ones.
+    return s.replace('"', "&#8220;")
+
+
+def educateQuotesLatex(s, dquotes=("``", "''")):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with double quotes corrected to LaTeX quotes.
+
+    Example input:  "Isn't this fun?"
+    Example output: ``Isn't this fun?'';
+    """
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break. Close the quotes by brute force:
+    s = single_quote_start_re.sub("\x04", s)
+    s = double_quote_start_re.sub("\x02", s)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    s = double_quote_sets_re.sub("\x01\x03", s)
+    s = single_quote_sets_re.sub("\x03\x01", s)
+
+    # Special case for decade abbreviations (the '80s):
+    s = decade_abbr_re.sub("\x04", s)
+
+    s = opening_single_quotes_regex.sub("\\1\x03", s)
+    s = closing_single_quotes_regex.sub("\\1\x04", s)
+    s = closing_single_quotes_regex_2.sub("\\1\x04\\2", s)
+
+    # Any remaining single quotes should be opening ones:
+    s = s.replace("'", "\x03")
+
+    s = opening_double_quotes_regex.sub("\\1\x01", s)
+    s = closing_double_quotes_regex.sub("\x02", s)
+    s = closing_double_quotes_regex_2.sub("\\1\x02", s)
+
+    # Any remaining quotes should be opening ones.
+    s = s.replace('"', "\x01")
+
+    # Finally, replace all helpers with quotes.
+    return s.replace("\x01", dquotes[0]).replace("\x02", dquotes[1]).\
+           replace("\x03", "`").replace("\x04", "'")
+
+
+def educateBackticks(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with ``backticks'' -style double quotes
+        translated into HTML curly quote entities.
+    Example input:  ``Isn't this fun?''
+    Example output: &#8220;Isn't this fun?&#8221;
+    """
+    return s.replace("``", "&#8220;").replace("''", "&#8221;")
+
+
+def educateSingleBackticks(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with `backticks' -style single quotes
+        translated into HTML curly quote entities.
+
+    Example input:  `Isn't this fun?'
+    Example output: &#8216;Isn&#8217;t this fun?&#8217;
+    """
+    return s.replace('`', "&#8216;").replace("'", "&#8217;")
+
+
+def educateDashesOldSchool(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with each instance of "--" translated to
+        an en-dash HTML entity, and each "---" translated to
+        an em-dash HTML entity.
+    """
+    return s.replace('---', "&#8212;").replace('--', "&#8211;")
+
+
+def educateDashesOldSchoolInverted(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with each instance of "--" translated to
+        an em-dash HTML entity, and each "---" translated to
+        an en-dash HTML entity. Two reasons why: First, unlike the
+        en- and em-dash syntax supported by
+        EducateDashesOldSchool(), it's compatible with existing
+        entries written before SmartyPants 1.1, back when "--" was
+        only used for em-dashes.  Second, em-dashes are more
+        common than en-dashes, and so it sort of makes sense that
+        the shortcut should be shorter to type. (Thanks to Aaron
+        Swartz for the idea.)
+    """
+    return s.replace('---', "&#8211;").replace('--', "&#8212;")
+
+
+
+def educateEllipses(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with each instance of "..." translated to
+        an ellipsis HTML entity.
+
+    Example input:  Huh...?
+    Example output: Huh&#8230;?
+    """
+    return s.replace('...', "&#8230;").replace('. . .', "&#8230;")
+
+
+__author__ = "Chad Miller <smartypantspy@chad.org>"
+__version__ = "1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400"
+__url__ = "http://wiki.chad.org/SmartyPantsPy"
+__description__ = \
+    "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries in pyblosxom"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,343 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.stemmer
+    ~~~~~~~~~~~~~~~~~~~
+
+    Porter Stemming Algorithm
+
+    This is the Porter stemming algorithm, ported to Python from the
+    version coded up in ANSI C by the author. It may be be regarded
+    as canonical, in that it follows the algorithm presented in
+
+    Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
+    no. 3, pp 130-137,
+
+    only differing from it at the points maked --DEPARTURE-- below.
+
+    See also http://www.tartarus.org/~martin/PorterStemmer
+
+    The algorithm as described in the paper could be exactly replicated
+    by adjusting the points of DEPARTURE, but this is barely necessary,
+    because (a) the points of DEPARTURE are definitely improvements, and
+    (b) no encoding of the Porter stemmer I have seen is anything like
+    as exact as this version, even with the points of DEPARTURE!
+
+    Release 1: January 2001
+
+    :copyright: 2001 by Vivake Gupta <v@nano.com>.
+    :license: Public Domain ("can be used free of charge for any purpose").
+"""
+
+class PorterStemmer(object):
+
+    def __init__(self):
+        """The main part of the stemming algorithm starts here.
+        b is a buffer holding a word to be stemmed. The letters are in b[k0],
+        b[k0+1] ... ending at b[k]. In fact k0 = 0 in this demo program. k is
+        readjusted downwards as the stemming progresses. Zero termination is
+        not in fact used in the algorithm.
+
+        Note that only lower case sequences are stemmed. Forcing to lower case
+        should be done before stem(...) is called.
+        """
+
+        self.b = ""  # buffer for word to be stemmed
+        self.k = 0
+        self.k0 = 0
+        self.j = 0   # j is a general offset into the string
+
+    def cons(self, i):
+        """cons(i) is TRUE <=> b[i] is a consonant."""
+        if self.b[i] == 'a' or self.b[i] == 'e' or self.b[i] == 'i' \
+            or self.b[i] == 'o' or self.b[i] == 'u':
+            return 0
+        if self.b[i] == 'y':
+            if i == self.k0:
+                return 1
+            else:
+                return (not self.cons(i - 1))
+        return 1
+
+    def m(self):
+        """m() measures the number of consonant sequences between k0 and j.
+        if c is a consonant sequence and v a vowel sequence, and <..>
+        indicates arbitrary presence,
+
+           <c><v>       gives 0
+           <c>vc<v>     gives 1
+           <c>vcvc<v>   gives 2
+           <c>vcvcvc<v> gives 3
+           ....
+        """
+        n = 0
+        i = self.k0
+        while 1:
+            if i > self.j:
+                return n
+            if not self.cons(i):
+                break
+            i = i + 1
+        i = i + 1
+        while 1:
+            while 1:
+                if i > self.j:
+                    return n
+                if self.cons(i):
+                    break
+                i = i + 1
+            i = i + 1
+            n = n + 1
+            while 1:
+                if i > self.j:
+                    return n
+                if not self.cons(i):
+                    break
+                i = i + 1
+            i = i + 1
+
+    def vowelinstem(self):
+        """vowelinstem() is TRUE <=> k0,...j contains a vowel"""
+        for i in range(self.k0, self.j + 1):
+            if not self.cons(i):
+                return 1
+        return 0
+
+    def doublec(self, j):
+        """doublec(j) is TRUE <=> j,(j-1) contain a double consonant."""
+        if j < (self.k0 + 1):
+            return 0
+        if (self.b[j] != self.b[j-1]):
+            return 0
+        return self.cons(j)
+
+    def cvc(self, i):
+        """cvc(i) is TRUE <=> i-2,i-1,i has the form consonant - vowel - consonant
+        and also if the second c is not w,x or y. this is used when trying to
+        restore an e at the end of a short  e.g.
+
+           cav(e), lov(e), hop(e), crim(e), but
+           snow, box, tray.
+        """
+        if i < (self.k0 + 2) or not self.cons(i) or self.cons(i-1) or not self.cons(i-2):
+            return 0
+        ch = self.b[i]
+        if ch == 'w' or ch == 'x' or ch == 'y':
+            return 0
+        return 1
+
+    def ends(self, s):
+        """ends(s) is TRUE <=> k0,...k ends with the string s."""
+        length = len(s)
+        if s[length - 1] != self.b[self.k]: # tiny speed-up
+            return 0
+        if length > (self.k - self.k0 + 1):
+            return 0
+        if self.b[self.k-length+1:self.k+1] != s:
+            return 0
+        self.j = self.k - length
+        return 1
+
+    def setto(self, s):
+        """setto(s) sets (j+1),...k to the characters in the string s, readjusting k."""
+        length = len(s)
+        self.b = self.b[:self.j+1] + s + self.b[self.j+length+1:]
+        self.k = self.j + length
+
+    def r(self, s):
+        """r(s) is used further down."""
+        if self.m() > 0:
+            self.setto(s)
+
+    def step1ab(self):
+        """step1ab() gets rid of plurals and -ed or -ing. e.g.
+
+           caresses  ->  caress
+           ponies    ->  poni
+           ties      ->  ti
+           caress    ->  caress
+           cats      ->  cat
+
+           feed      ->  feed
+           agreed    ->  agree
+           disabled  ->  disable
+
+           matting   ->  mat
+           mating    ->  mate
+           meeting   ->  meet
+           milling   ->  mill
+           messing   ->  mess
+
+           meetings  ->  meet
+        """
+        if self.b[self.k] == 's':
+            if self.ends("sses"):
+                self.k = self.k - 2
+            elif self.ends("ies"):
+                self.setto("i")
+            elif self.b[self.k - 1] != 's':
+                self.k = self.k - 1
+        if self.ends("eed"):
+            if self.m() > 0:
+                self.k = self.k - 1
+        elif (self.ends("ed") or self.ends("ing")) and self.vowelinstem():
+            self.k = self.j
+            if self.ends("at"):   self.setto("ate")
+            elif self.ends("bl"): self.setto("ble")
+            elif self.ends("iz"): self.setto("ize")
+            elif self.doublec(self.k):
+                self.k = self.k - 1
+                ch = self.b[self.k]
+                if ch == 'l' or ch == 's' or ch == 'z':
+                    self.k = self.k + 1
+            elif (self.m() == 1 and self.cvc(self.k)):
+                self.setto("e")
+
+    def step1c(self):
+        """step1c() turns terminal y to i when there is another vowel in the stem."""
+        if (self.ends("y") and self.vowelinstem()):
+            self.b = self.b[:self.k] + 'i' + self.b[self.k+1:]
+
+    def step2(self):
+        """step2() maps double suffices to single ones.
+        so -ization ( = -ize plus -ation) maps to -ize etc. note that the
+        string before the suffix must give m() > 0.
+        """
+        if self.b[self.k - 1] == 'a':
+            if self.ends("ational"):   self.r("ate")
+            elif self.ends("tional"):  self.r("tion")
+        elif self.b[self.k - 1] == 'c':
+            if self.ends("enci"):      self.r("ence")
+            elif self.ends("anci"):    self.r("ance")
+        elif self.b[self.k - 1] == 'e':
+            if self.ends("izer"):      self.r("ize")
+        elif self.b[self.k - 1] == 'l':
+            if self.ends("bli"):       self.r("ble") # --DEPARTURE--
+            # To match the published algorithm, replace this phrase with
+            #   if self.ends("abli"):      self.r("able")
+            elif self.ends("alli"):    self.r("al")
+            elif self.ends("entli"):   self.r("ent")
+            elif self.ends("eli"):     self.r("e")
+            elif self.ends("ousli"):   self.r("ous")
+        elif self.b[self.k - 1] == 'o':
+            if self.ends("ization"):   self.r("ize")
+            elif self.ends("ation"):   self.r("ate")
+            elif self.ends("ator"):    self.r("ate")
+        elif self.b[self.k - 1] == 's':
+            if self.ends("alism"):     self.r("al")
+            elif self.ends("iveness"): self.r("ive")
+            elif self.ends("fulness"): self.r("ful")
+            elif self.ends("ousness"): self.r("ous")
+        elif self.b[self.k - 1] == 't':
+            if self.ends("aliti"):     self.r("al")
+            elif self.ends("iviti"):   self.r("ive")
+            elif self.ends("biliti"):  self.r("ble")
+        elif self.b[self.k - 1] == 'g': # --DEPARTURE--
+            if self.ends("logi"):      self.r("log")
+        # To match the published algorithm, delete this phrase
+
+    def step3(self):
+        """step3() dels with -ic-, -full, -ness etc. similar strategy to step2."""
+        if self.b[self.k] == 'e':
+            if self.ends("icate"):     self.r("ic")
+            elif self.ends("ative"):   self.r("")
+            elif self.ends("alize"):   self.r("al")
+        elif self.b[self.k] == 'i':
+            if self.ends("iciti"):     self.r("ic")
+        elif self.b[self.k] == 'l':
+            if self.ends("ical"):      self.r("ic")
+            elif self.ends("ful"):     self.r("")
+        elif self.b[self.k] == 's':
+            if self.ends("ness"):      self.r("")
+
+    def step4(self):
+        """step4() takes off -ant, -ence etc., in context <c>vcvc<v>."""
+        if self.b[self.k - 1] == 'a':
+            if self.ends("al"): pass
+            else: return
+        elif self.b[self.k - 1] == 'c':
+            if self.ends("ance"): pass
+            elif self.ends("ence"): pass
+            else: return
+        elif self.b[self.k - 1] == 'e':
+            if self.ends("er"): pass
+            else: return
+        elif self.b[self.k - 1] == 'i':
+            if self.ends("ic"): pass
+            else: return
+        elif self.b[self.k - 1] == 'l':
+            if self.ends("able"): pass
+            elif self.ends("ible"): pass
+            else: return
+        elif self.b[self.k - 1] == 'n':
+            if self.ends("ant"): pass
+            elif self.ends("ement"): pass
+            elif self.ends("ment"): pass
+            elif self.ends("ent"): pass
+            else: return
+        elif self.b[self.k - 1] == 'o':
+            if self.ends("ion") and (self.b[self.j] == 's' \
+                or self.b[self.j] == 't'): pass
+            elif self.ends("ou"): pass
+            # takes care of -ous
+            else: return
+        elif self.b[self.k - 1] == 's':
+            if self.ends("ism"): pass
+            else: return
+        elif self.b[self.k - 1] == 't':
+            if self.ends("ate"): pass
+            elif self.ends("iti"): pass
+            else: return
+        elif self.b[self.k - 1] == 'u':
+            if self.ends("ous"): pass
+            else: return
+        elif self.b[self.k - 1] == 'v':
+            if self.ends("ive"): pass
+            else: return
+        elif self.b[self.k - 1] == 'z':
+            if self.ends("ize"): pass
+            else: return
+        else:
+            return
+        if self.m() > 1:
+            self.k = self.j
+
+    def step5(self):
+        """step5() removes a final -e if m() > 1, and changes -ll to -l if
+        m() > 1.
+        """
+        self.j = self.k
+        if self.b[self.k] == 'e':
+            a = self.m()
+            if a > 1 or (a == 1 and not self.cvc(self.k-1)):
+                self.k = self.k - 1
+        if self.b[self.k] == 'l' and self.doublec(self.k) and self.m() > 1:
+            self.k = self.k -1
+
+    def stem(self, p, i, j):
+        """In stem(p,i,j), p is a char pointer, and the string to be stemmed
+        is from p[i] to p[j] inclusive. Typically i is zero and j is the
+        offset to the last character of a string, (p[j+1] == '\0'). The
+        stemmer adjusts the characters p[i] ... p[j] and returns the new
+        end-point of the string, k. Stemming never increases word length, so
+        i <= k <= j. To turn the stemmer into a module, declare 'stem' as
+        extern, and delete the remainder of this file.
+        """
+        # copy the parameters into statics
+        self.b = p
+        self.k = j
+        self.k0 = i
+        if self.k <= self.k0 + 1:
+            return self.b # --DEPARTURE--
+
+        # With this line, strings of length 1 or 2 don't go through the
+        # stemming process, although no mention is made of this in the
+        # published algorithm. Remove the line to match the published
+        # algorithm.
+
+        self.step1ab()
+        self.step1c()
+        self.step2()
+        self.step3()
+        self.step4()
+        self.step5()
+        return self.b[self.k0:self.k+1]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.texescape
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    TeX escaping helper.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+tex_replacements = [
+    # map TeX special chars
+    (u'$', ur'\$'),
+    (u'%', ur'\%'),
+    (u'&', ur'\&'),
+    (u'#', ur'\#'),
+    (u'_', ur'\_'),
+    (u'{', ur'\{'),
+    (u'}', ur'\}'),
+    (u'[', ur'{[}'),
+    (u']', ur'{]}'),
+    (u'`', ur'{}`'),
+    (u'\\',ur'\textbackslash{}'),
+    (u'~', ur'\textasciitilde{}'),
+    (u'<', ur'\textless{}'),
+    (u'>', ur'\textgreater{}'),
+    (u'^', ur'\textasciicircum{}'),
+    # map special Unicode characters to TeX commands
+    (u'¶', ur'\P{}'),
+    (u'§', ur'\S{}'),
+    (u'€', ur'\texteuro{}'),
+    (u'∞', ur'\(\infty\)'),
+    (u'±', ur'\(\pm\)'),
+    (u'→', ur'\(\rightarrow\)'),
+    (u'‣', ur'\(\rightarrow\)'),
+    # used to separate -- in options
+    (u'', ur'{}'),
+    # map some special Unicode characters to similar ASCII ones
+    (u'─', ur'-'),
+    (u'⎽', ur'\_'),
+    (u'╲', ur'\textbackslash{}'),
+    (u'│', ur'|'),
+    (u'ℯ', ur'e'),
+    (u'â…ˆ', ur'i'),
+    (u'â‚', ur'1'),
+    (u'â‚‚', ur'2'),
+    # map Greek alphabet
+    (u'α', ur'\(\alpha\)'),
+    (u'β', ur'\(\beta\)'),
+    (u'γ', ur'\(\gamma\)'),
+    (u'δ', ur'\(\delta\)'),
+    (u'ε', ur'\(\epsilon\)'),
+    (u'ζ', ur'\(\zeta\)'),
+    (u'η', ur'\(\eta\)'),
+    (u'θ', ur'\(\theta\)'),
+    (u'ι', ur'\(\iota\)'),
+    (u'κ', ur'\(\kappa\)'),
+    (u'λ', ur'\(\lambda\)'),
+    (u'μ', ur'\(\mu\)'),
+    (u'ν', ur'\(\nu\)'),
+    (u'ξ', ur'\(\xi\)'),
+    (u'ο', ur'o'),
+    (u'Ï€', ur'\(\pi\)'),
+    (u'Ï', ur'\(\rho\)'),
+    (u'σ', ur'\(\sigma\)'),
+    (u'Ï„', ur'\(\tau\)'),
+    (u'Ï…', u'\\(\\upsilon\\)'),
+    (u'φ', ur'\(\phi\)'),
+    (u'χ', ur'\(\chi\)'),
+    (u'ψ', ur'\(\psi\)'),
+    (u'ω', ur'\(\omega\)'),
+    (u'Α', ur'A'),
+    (u'Î’', ur'B'),
+    (u'Γ', ur'\(\Gamma\)'),
+    (u'Δ', ur'\(\Delta\)'),
+    (u'Ε', ur'E'),
+    (u'Ζ', ur'Z'),
+    (u'Η', ur'H'),
+    (u'Θ', ur'\(\Theta\)'),
+    (u'Ι', ur'I'),
+    (u'Κ', ur'K'),
+    (u'Λ', ur'\(\Lambda\)'),
+    (u'Μ', ur'M'),
+    (u'Î', ur'N'),
+    (u'Ξ', ur'\(\Xi\)'),
+    (u'Ο', ur'O'),
+    (u'Π', ur'\(\Pi\)'),
+    (u'Ρ', ur'P'),
+    (u'Σ', ur'\(\Sigma\)'),
+    (u'Τ', ur'T'),
+    (u'Î¥', u'\\(\\Upsilon\\)'),
+    (u'Φ', ur'\(\Phi\)'),
+    (u'Χ', ur'X'),
+    (u'Ψ', ur'\(\Psi\)'),
+    (u'Ω', ur'\(\Omega\)'),
+    (u'Ω', ur'\(\Omega\)'),
+]
+
+tex_escape_map = {}
+tex_hl_escape_map = {}
+_new_cmd_chars = {ord(u'\\'): u'@', ord(u'{'): u'[', ord(u'}'): u']'}
+
+def init():
+    for a, b in tex_replacements:
+        tex_escape_map[ord(a)] = b
+
+    for a, b in tex_replacements:
+        if a in u'[]{}\\': continue
+        tex_hl_escape_map[ord(a)] = b.translate(_new_cmd_chars)
Binary file buildframework/helium/external/python/lib/2.5/coverage-2.85-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: docutils
+Version: 0.5
+Summary: Docutils -- Python Documentation Utilities
+Home-page: http://docutils.sourceforge.net/
+Author: David Goodger
+Author-email: goodger@python.org
+License: public domain, Python, BSD, GPL (see COPYING.txt)
+Description: Docutils is a modular system for processing documentation
+        into useful formats, such as HTML, XML, and LaTeX.  For
+        input Docutils supports reStructuredText, an easy-to-read,
+        what-you-see-is-what-you-get plaintext markup syntax.
+Platform: OS-independent
+Classifier: Development Status :: 3 - Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: Intended Audience :: Other Audience
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: Public Domain
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: BSD License
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Software Development :: Documentation
+Classifier: Topic :: Text Processing
+Classifier: Natural Language :: English
+Classifier: Natural Language :: Afrikaans
+Classifier: Natural Language :: Esperanto
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Italian
+Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovak
+Classifier: Natural Language :: Spanish
+Classifier: Natural Language :: Swedish
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,482 @@
+BUGS.txt
+COPYING.txt
+FAQ.txt
+HISTORY.txt
+MANIFEST.in
+README.txt
+RELEASE-NOTES.txt
+THANKS.txt
+install.py
+setup.py
+docs/index.txt
+docs/api/cmdline-tool.txt
+docs/api/publisher.txt
+docs/api/runtime-settings.txt
+docs/dev/distributing.txt
+docs/dev/enthought-plan.txt
+docs/dev/enthought-rfp.txt
+docs/dev/hacking.txt
+docs/dev/policies.txt
+docs/dev/pysource.dtd
+docs/dev/pysource.txt
+docs/dev/release.txt
+docs/dev/repository.txt
+docs/dev/semantics.txt
+docs/dev/testing.txt
+docs/dev/todo.txt
+docs/dev/website.txt
+docs/dev/rst/alternatives.txt
+docs/dev/rst/problems.txt
+docs/howto/html-stylesheets.txt
+docs/howto/i18n.txt
+docs/howto/rst-directives.txt
+docs/howto/rst-roles.txt
+docs/howto/security.txt
+docs/peps/pep-0256.txt
+docs/peps/pep-0257.txt
+docs/peps/pep-0258.txt
+docs/peps/pep-0287.txt
+docs/ref/doctree.txt
+docs/ref/docutils.dtd
+docs/ref/soextblx.dtd
+docs/ref/transforms.txt
+docs/ref/rst/definitions.txt
+docs/ref/rst/directives.txt
+docs/ref/rst/introduction.txt
+docs/ref/rst/restructuredtext.txt
+docs/ref/rst/roles.txt
+docs/user/Makefile.docutils-update
+docs/user/config.txt
+docs/user/emacs.txt
+docs/user/latex.txt
+docs/user/links.txt
+docs/user/mailing-lists.txt
+docs/user/slide-shows.txt
+docs/user/tools.txt
+docs/user/images/big-black.png
+docs/user/images/big-white.png
+docs/user/images/default.png
+docs/user/images/happy_monkey.png
+docs/user/images/medium-black.png
+docs/user/images/medium-white.png
+docs/user/images/rsp-all.png
+docs/user/images/rsp-breaks.png
+docs/user/images/rsp-covers.png
+docs/user/images/rsp-cuts.png
+docs/user/images/rsp-empty.png
+docs/user/images/rsp-objects.png
+docs/user/images/rsp.svg
+docs/user/images/s5-files.png
+docs/user/images/s5-files.svg
+docs/user/images/small-black.png
+docs/user/images/small-white.png
+docs/user/rst/cheatsheet.txt
+docs/user/rst/demo.txt
+docs/user/rst/quickref.html
+docs/user/rst/quickstart.txt
+docs/user/rst/images/ball1.gif
+docs/user/rst/images/biohazard.png
+docs/user/rst/images/title.png
+docutils/__init__.py
+docutils/core.py
+docutils/docutils.conf
+docutils/examples.py
+docutils/frontend.py
+docutils/io.py
+docutils/nodes.py
+docutils/statemachine.py
+docutils/urischemes.py
+docutils/utils.py
+docutils/languages/__init__.py
+docutils/languages/af.py
+docutils/languages/ca.py
+docutils/languages/cs.py
+docutils/languages/de.py
+docutils/languages/en.py
+docutils/languages/eo.py
+docutils/languages/es.py
+docutils/languages/fi.py
+docutils/languages/fr.py
+docutils/languages/he.py
+docutils/languages/it.py
+docutils/languages/ja.py
+docutils/languages/nl.py
+docutils/languages/pt_br.py
+docutils/languages/ru.py
+docutils/languages/sk.py
+docutils/languages/sv.py
+docutils/languages/zh_cn.py
+docutils/languages/zh_tw.py
+docutils/parsers/__init__.py
+docutils/parsers/null.py
+docutils/parsers/rst/__init__.py
+docutils/parsers/rst/roles.py
+docutils/parsers/rst/states.py
+docutils/parsers/rst/tableparser.py
+docutils/parsers/rst/directives/__init__.py
+docutils/parsers/rst/directives/admonitions.py
+docutils/parsers/rst/directives/body.py
+docutils/parsers/rst/directives/html.py
+docutils/parsers/rst/directives/images.py
+docutils/parsers/rst/directives/misc.py
+docutils/parsers/rst/directives/parts.py
+docutils/parsers/rst/directives/references.py
+docutils/parsers/rst/directives/tables.py
+docutils/parsers/rst/include/README.txt
+docutils/parsers/rst/include/isoamsa.txt
+docutils/parsers/rst/include/isoamsb.txt
+docutils/parsers/rst/include/isoamsc.txt
+docutils/parsers/rst/include/isoamsn.txt
+docutils/parsers/rst/include/isoamso.txt
+docutils/parsers/rst/include/isoamsr.txt
+docutils/parsers/rst/include/isobox.txt
+docutils/parsers/rst/include/isocyr1.txt
+docutils/parsers/rst/include/isocyr2.txt
+docutils/parsers/rst/include/isodia.txt
+docutils/parsers/rst/include/isogrk1.txt
+docutils/parsers/rst/include/isogrk2.txt
+docutils/parsers/rst/include/isogrk3.txt
+docutils/parsers/rst/include/isogrk4-wide.txt
+docutils/parsers/rst/include/isogrk4.txt
+docutils/parsers/rst/include/isolat1.txt
+docutils/parsers/rst/include/isolat2.txt
+docutils/parsers/rst/include/isomfrk-wide.txt
+docutils/parsers/rst/include/isomfrk.txt
+docutils/parsers/rst/include/isomopf-wide.txt
+docutils/parsers/rst/include/isomopf.txt
+docutils/parsers/rst/include/isomscr-wide.txt
+docutils/parsers/rst/include/isomscr.txt
+docutils/parsers/rst/include/isonum.txt
+docutils/parsers/rst/include/isopub.txt
+docutils/parsers/rst/include/isotech.txt
+docutils/parsers/rst/include/mmlalias.txt
+docutils/parsers/rst/include/mmlextra-wide.txt
+docutils/parsers/rst/include/mmlextra.txt
+docutils/parsers/rst/include/s5defs.txt
+docutils/parsers/rst/include/xhtml1-lat1.txt
+docutils/parsers/rst/include/xhtml1-special.txt
+docutils/parsers/rst/include/xhtml1-symbol.txt
+docutils/parsers/rst/languages/__init__.py
+docutils/parsers/rst/languages/af.py
+docutils/parsers/rst/languages/ca.py
+docutils/parsers/rst/languages/cs.py
+docutils/parsers/rst/languages/de.py
+docutils/parsers/rst/languages/en.py
+docutils/parsers/rst/languages/eo.py
+docutils/parsers/rst/languages/es.py
+docutils/parsers/rst/languages/fi.py
+docutils/parsers/rst/languages/fr.py
+docutils/parsers/rst/languages/he.py
+docutils/parsers/rst/languages/it.py
+docutils/parsers/rst/languages/ja.py
+docutils/parsers/rst/languages/nl.py
+docutils/parsers/rst/languages/pt_br.py
+docutils/parsers/rst/languages/ru.py
+docutils/parsers/rst/languages/sk.py
+docutils/parsers/rst/languages/sv.py
+docutils/parsers/rst/languages/zh_cn.py
+docutils/parsers/rst/languages/zh_tw.py
+docutils/readers/__init__.py
+docutils/readers/doctree.py
+docutils/readers/pep.py
+docutils/readers/standalone.py
+docutils/readers/python/__init__.py
+docutils/readers/python/moduleparser.py
+docutils/readers/python/pynodes.py
+docutils/transforms/__init__.py
+docutils/transforms/components.py
+docutils/transforms/frontmatter.py
+docutils/transforms/misc.py
+docutils/transforms/parts.py
+docutils/transforms/peps.py
+docutils/transforms/references.py
+docutils/transforms/universal.py
+docutils/transforms/writer_aux.py
+docutils/writers/__init__.py
+docutils/writers/docutils_xml.py
+docutils/writers/null.py
+docutils/writers/pseudoxml.py
+docutils/writers/html4css1/__init__.py
+docutils/writers/html4css1/html4css1.css
+docutils/writers/html4css1/template.txt
+docutils/writers/latex2e/__init__.py
+docutils/writers/latex2e/latex2e.tex
+docutils/writers/newlatex2e/__init__.py
+docutils/writers/newlatex2e/base.tex
+docutils/writers/newlatex2e/notes.txt
+docutils/writers/newlatex2e/tests.txt
+docutils/writers/newlatex2e/unicode_map.py
+docutils/writers/pep_html/__init__.py
+docutils/writers/pep_html/pep.css
+docutils/writers/pep_html/template.txt
+docutils/writers/s5_html/__init__.py
+docutils/writers/s5_html/themes/README.txt
+docutils/writers/s5_html/themes/big-black/__base__
+docutils/writers/s5_html/themes/big-black/framing.css
+docutils/writers/s5_html/themes/big-black/pretty.css
+docutils/writers/s5_html/themes/big-white/framing.css
+docutils/writers/s5_html/themes/big-white/pretty.css
+docutils/writers/s5_html/themes/default/blank.gif
+docutils/writers/s5_html/themes/default/framing.css
+docutils/writers/s5_html/themes/default/iepngfix.htc
+docutils/writers/s5_html/themes/default/opera.css
+docutils/writers/s5_html/themes/default/outline.css
+docutils/writers/s5_html/themes/default/pretty.css
+docutils/writers/s5_html/themes/default/print.css
+docutils/writers/s5_html/themes/default/s5-core.css
+docutils/writers/s5_html/themes/default/slides.css
+docutils/writers/s5_html/themes/default/slides.js
+docutils/writers/s5_html/themes/medium-black/__base__
+docutils/writers/s5_html/themes/medium-black/pretty.css
+docutils/writers/s5_html/themes/medium-white/framing.css
+docutils/writers/s5_html/themes/medium-white/pretty.css
+docutils/writers/s5_html/themes/small-black/__base__
+docutils/writers/s5_html/themes/small-black/pretty.css
+docutils/writers/s5_html/themes/small-white/framing.css
+docutils/writers/s5_html/themes/small-white/pretty.css
+extras/optparse.py
+extras/roman.py
+extras/textwrap.py
+extras/docutils.egg-info/PKG-INFO
+extras/docutils.egg-info/SOURCES.txt
+extras/docutils.egg-info/dependency_links.txt
+extras/docutils.egg-info/top_level.txt
+licenses/docutils.conf
+licenses/gpl.txt
+licenses/python-2-1-1.txt
+licenses/python-2-2.txt
+licenses/python-2-3.txt
+test/DocutilsTestSupport.py
+test/alltests.py
+test/coverage.sh
+test/docutils.conf
+test/docutils_difflib.py
+test/package_unittest.py
+test/test_dependencies.py
+test/test_functional.py
+test/test_io.py
+test/test_language.py
+test/test_nodes.py
+test/test_pickle.py
+test/test_publisher.py
+test/test_settings.py
+test/test_statemachine.py
+test/test_traversals.py
+test/test_utils.py
+test/test_viewlist.py
+test/data/config_1.txt
+test/data/config_2.txt
+test/data/config_error_handler.txt
+test/data/config_list.txt
+test/data/config_list_2.txt
+test/data/config_old.txt
+test/data/csv_data.txt
+test/data/csv_dep.txt
+test/data/dependencies.txt
+test/data/full-template.txt
+test/data/include.txt
+test/data/raw.txt
+test/data/stylesheet.txt
+test/functional/README.txt
+test/functional/expected/compact_lists.html
+test/functional/expected/dangerous.html
+test/functional/expected/field_name_limit.html
+test/functional/expected/latex_docinfo.tex
+test/functional/expected/misc_rst_html4css1.html
+test/functional/expected/pep_html.html
+test/functional/expected/standalone_rst_html4css1.html
+test/functional/expected/standalone_rst_latex.tex
+test/functional/expected/standalone_rst_pseudoxml.txt
+test/functional/expected/standalone_rst_s5_html_1.html
+test/functional/expected/standalone_rst_s5_html_2.html
+test/functional/expected/ui/default/blank.gif
+test/functional/expected/ui/default/framing.css
+test/functional/expected/ui/default/iepngfix.htc
+test/functional/expected/ui/default/opera.css
+test/functional/expected/ui/default/outline.css
+test/functional/expected/ui/default/pretty.css
+test/functional/expected/ui/default/print.css
+test/functional/expected/ui/default/s5-core.css
+test/functional/expected/ui/default/slides.css
+test/functional/expected/ui/default/slides.js
+test/functional/expected/ui/small-black/blank.gif
+test/functional/expected/ui/small-black/framing.css
+test/functional/expected/ui/small-black/iepngfix.htc
+test/functional/expected/ui/small-black/opera.css
+test/functional/expected/ui/small-black/outline.css
+test/functional/expected/ui/small-black/pretty.css
+test/functional/expected/ui/small-black/print.css
+test/functional/expected/ui/small-black/s5-core.css
+test/functional/expected/ui/small-black/slides.css
+test/functional/expected/ui/small-black/slides.js
+test/functional/input/compact_lists.txt
+test/functional/input/dangerous.txt
+test/functional/input/field_list.txt
+test/functional/input/latex_docinfo.txt
+test/functional/input/pep_html.txt
+test/functional/input/simple.txt
+test/functional/input/standalone_rst_html4css1.txt
+test/functional/input/standalone_rst_latex.txt
+test/functional/input/standalone_rst_newlatex.txt
+test/functional/input/standalone_rst_pseudoxml.txt
+test/functional/input/standalone_rst_s5_html.txt
+test/functional/input/data/custom_roles.txt
+test/functional/input/data/errors.txt
+test/functional/input/data/header_footer.txt
+test/functional/input/data/latex.txt
+test/functional/input/data/latex2e.txt
+test/functional/input/data/list_table.txt
+test/functional/input/data/nonalphanumeric.txt
+test/functional/input/data/standard.txt
+test/functional/input/data/table_colspan.txt
+test/functional/input/data/table_complex.txt
+test/functional/input/data/table_rowspan.txt
+test/functional/input/data/unicode.txt
+test/functional/output/README.txt
+test/functional/tests/_default.py
+test/functional/tests/_standalone_rst_defaults.py
+test/functional/tests/compact_lists.py
+test/functional/tests/dangerous.py
+test/functional/tests/field_name_limit.py
+test/functional/tests/latex_docinfo.py
+test/functional/tests/misc_rst_html4css1.py
+test/functional/tests/pep_html.py
+test/functional/tests/standalone_rst_html4css1.py
+test/functional/tests/standalone_rst_latex.py
+test/functional/tests/standalone_rst_pseudoxml.py
+test/functional/tests/standalone_rst_s5_html_1.py
+test/functional/tests/standalone_rst_s5_html_2.py
+test/test_parsers/__init__.py
+test/test_parsers/test_rst/__init__.py
+test/test_parsers/test_rst/test_SimpleTableParser.py
+test/test_parsers/test_rst/test_TableParser.py
+test/test_parsers/test_rst/test_block_quotes.py
+test/test_parsers/test_rst/test_bullet_lists.py
+test/test_parsers/test_rst/test_citations.py
+test/test_parsers/test_rst/test_comments.py
+test/test_parsers/test_rst/test_definition_lists.py
+test/test_parsers/test_rst/test_doctest_blocks.py
+test/test_parsers/test_rst/test_east_asian_text.py
+test/test_parsers/test_rst/test_enumerated_lists.py
+test/test_parsers/test_rst/test_field_lists.py
+test/test_parsers/test_rst/test_footnotes.py
+test/test_parsers/test_rst/test_functions.py
+test/test_parsers/test_rst/test_inline_markup.py
+test/test_parsers/test_rst/test_interpreted.py
+test/test_parsers/test_rst/test_line_blocks.py
+test/test_parsers/test_rst/test_literal_blocks.py
+test/test_parsers/test_rst/test_option_lists.py
+test/test_parsers/test_rst/test_outdenting.py
+test/test_parsers/test_rst/test_paragraphs.py
+test/test_parsers/test_rst/test_section_headers.py
+test/test_parsers/test_rst/test_substitutions.py
+test/test_parsers/test_rst/test_tables.py
+test/test_parsers/test_rst/test_targets.py
+test/test_parsers/test_rst/test_transitions.py
+test/test_parsers/test_rst/includes/include9.txt
+test/test_parsers/test_rst/test_directives/__init__.py
+test/test_parsers/test_rst/test_directives/empty.txt
+test/test_parsers/test_rst/test_directives/include 11.txt
+test/test_parsers/test_rst/test_directives/include1.txt
+test/test_parsers/test_rst/test_directives/include10.txt
+test/test_parsers/test_rst/test_directives/include12.txt
+test/test_parsers/test_rst/test_directives/include13.txt
+test/test_parsers/test_rst/test_directives/include2.txt
+test/test_parsers/test_rst/test_directives/include3.txt
+test/test_parsers/test_rst/test_directives/include8.txt
+test/test_parsers/test_rst/test_directives/raw1.txt
+test/test_parsers/test_rst/test_directives/test_admonitions.py
+test/test_parsers/test_rst/test_directives/test_block_quotes.py
+test/test_parsers/test_rst/test_directives/test_class.py
+test/test_parsers/test_rst/test_directives/test_compound.py
+test/test_parsers/test_rst/test_directives/test_container.py
+test/test_parsers/test_rst/test_directives/test_contents.py
+test/test_parsers/test_rst/test_directives/test_date.py
+test/test_parsers/test_rst/test_directives/test_decorations.py
+test/test_parsers/test_rst/test_directives/test_default_role.py
+test/test_parsers/test_rst/test_directives/test_figures.py
+test/test_parsers/test_rst/test_directives/test_images.py
+test/test_parsers/test_rst/test_directives/test_include.py
+test/test_parsers/test_rst/test_directives/test_line_blocks.py
+test/test_parsers/test_rst/test_directives/test_meta.py
+test/test_parsers/test_rst/test_directives/test_parsed_literals.py
+test/test_parsers/test_rst/test_directives/test_raw.py
+test/test_parsers/test_rst/test_directives/test_replace.py
+test/test_parsers/test_rst/test_directives/test_role.py
+test/test_parsers/test_rst/test_directives/test_rubrics.py
+test/test_parsers/test_rst/test_directives/test_sectnum.py
+test/test_parsers/test_rst/test_directives/test_sidebars.py
+test/test_parsers/test_rst/test_directives/test_tables.py
+test/test_parsers/test_rst/test_directives/test_target_notes.py
+test/test_parsers/test_rst/test_directives/test_test_directives.py
+test/test_parsers/test_rst/test_directives/test_title.py
+test/test_parsers/test_rst/test_directives/test_topics.py
+test/test_parsers/test_rst/test_directives/test_unicode.py
+test/test_parsers/test_rst/test_directives/test_unknown.py
+test/test_parsers/test_rst/test_directives/utf-16.csv
+test/test_parsers/test_rst/test_directives/includes/include4.txt
+test/test_parsers/test_rst/test_directives/includes/include5.txt
+test/test_parsers/test_rst/test_directives/includes/more/include6.txt
+test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
+test/test_readers/__init__.py
+test/test_readers/test_pep/__init__.py
+test/test_readers/test_pep/test_inline_markup.py
+test/test_readers/test_pep/test_rfc2822.py
+test/test_readers/test_python/__init__.py
+test/test_readers/test_python/showast
+test/test_readers/test_python/showdoc
+test/test_readers/test_python/showparse
+test/test_readers/test_python/showtok
+test/test_readers/test_python/test_functions.py
+test/test_readers/test_python/test_parser.py
+test/test_readers/test_python/test_token_parser.py
+test/test_transforms/__init__.py
+test/test_transforms/test___init__.py
+test/test_transforms/test_class.py
+test/test_transforms/test_contents.py
+test/test_transforms/test_docinfo.py
+test/test_transforms/test_doctitle.py
+test/test_transforms/test_expose_internals.py
+test/test_transforms/test_filter.py
+test/test_transforms/test_footnotes.py
+test/test_transforms/test_hyperlinks.py
+test/test_transforms/test_messages.py
+test/test_transforms/test_peps.py
+test/test_transforms/test_sectnum.py
+test/test_transforms/test_strip_comments.py
+test/test_transforms/test_substitutions.py
+test/test_transforms/test_target_notes.py
+test/test_transforms/test_transitions.py
+test/test_transforms/test_writer_aux.py
+test/test_writers/__init__.py
+test/test_writers/test_docutils_xml.py
+test/test_writers/test_html4css1_misc.py
+test/test_writers/test_html4css1_parts.py
+test/test_writers/test_html4css1_template.py
+test/test_writers/test_latex2e.py
+test/test_writers/test_null.py
+test/test_writers/test_pseudoxml.py
+test/test_writers/test_s5.py
+tools/buildhtml.py
+tools/docutils.conf
+tools/quicktest.py
+tools/rst2html.py
+tools/rst2latex.py
+tools/rst2newlatex.py
+tools/rst2pseudoxml.py
+tools/rst2s5.py
+tools/rst2xml.py
+tools/rstpep2html.py
+tools/dev/README.txt
+tools/dev/create_unimap.py
+tools/dev/profile_docutils.py
+tools/dev/unicode2rstsubs.py
+tools/editors/README.txt
+tools/editors/emacs/README.txt
+tools/editors/emacs/docutils.conf
+tools/editors/emacs/rst.el
+tools/editors/emacs/tests/Makefile
+tools/editors/emacs/tests/README.txt
+tools/editors/emacs/tests/tests-adjust-section.el
+tools/editors/emacs/tests/tests-basic.el
+tools/editors/emacs/tests/tests-runner.el
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='html', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2latex.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='latex', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2newlatex.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX using
+the new LaTeX writer.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources. This writer is EXPERIMENTAL and should not be used '
+               'in a production environment. ' + default_description)
+
+publish_cmdline(writer_name='newlatex2e', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing pseudo-XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates pseudo-XML from standalone reStructuredText '
+               'sources (for testing purposes).  ' + default_description)
+
+publish_cmdline(description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2s5.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Chris Liechti <cliechti@gmx.net>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML slides using
+the S5 template system.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates S5 (X)HTML slideshow documents from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='s5', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2xml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing Docutils XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates Docutils-native XML from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='xml', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+#!C:\Python25\python.exe
+
+# $Id: rstpep2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML from PEP
+(Python Enhancement Proposal) documents.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML from reStructuredText-format PEP files.  '
+               + default_description)
+
+publish_cmdline(reader_name='pep', writer_name='pep_html',
+                description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+docutils
+roman
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,204 @@
+# $Id: __init__.py 4801 2006-11-12 18:02:08Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the Docutils (Python Documentation Utilities) package.
+
+Package Structure
+=================
+
+Modules:
+
+- __init__.py: Contains component base classes, exception classes, and
+  Docutils version information.
+
+- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
+  functions.
+
+- frontend.py: Runtime settings (command-line interface, configuration files)
+  processing, for Docutils front-ends.
+
+- io.py: Provides a uniform API for low-level input and output.
+
+- nodes.py: Docutils document tree (doctree) node class library.
+
+- statemachine.py: A finite state machine specialized for
+  regular-expression-based text filters.
+
+- urischemes.py: Contains a complete mapping of known URI addressing
+  scheme names to descriptions.
+
+- utils.py: Contains the ``Reporter`` system warning class and miscellaneous
+  utilities.
+
+Subpackages:
+
+- languages: Language-specific mappings of terms.
+
+- parsers: Syntax-specific input parser modules or packages.
+
+- readers: Context-specific input handlers which understand the data
+  source and manage a parser.
+
+- transforms: Modules used by readers and writers to modify DPS
+  doctrees.
+
+- writers: Format-specific output translators.
+"""
+
+__docformat__ = 'reStructuredText'
+
+__version__ = '0.5'
+"""``major.minor.micro`` version number.  The micro number is bumped for API
+changes, for new functionality, and for interim project releases.  The minor
+number is bumped whenever there is a significant project release.  The major
+number will be bumped when the project is feature-complete, and perhaps if
+there is a major change in the design."""
+
+__version_details__ = 'snapshot 2007-11-01, r5461'
+"""Extra version details (e.g. 'snapshot 2005-05-29, r3410', 'repository',
+'release'), modified automatically & manually."""
+
+class ApplicationError(StandardError): pass
+class DataError(ApplicationError): pass
+
+
+class SettingsSpec:
+
+    """
+    Runtime setting specification base class.
+
+    SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
+    """
+
+    settings_spec = ()
+    """Runtime settings specification.  Override in subclasses.
+
+    Defines runtime settings and associated command-line options, as used by
+    `docutils.frontend.OptionParser`.  This is a tuple of:
+
+    - Option group title (string or `None` which implies no group, just a list
+      of single options).
+
+    - Description (string or `None`).
+
+    - A sequence of option tuples.  Each consists of:
+
+      - Help text (string)
+
+      - List of option strings (e.g. ``['-Q', '--quux']``).
+
+      - Dictionary of keyword arguments sent to the OptionParser/OptionGroup
+        ``add_option`` method.
+
+        Runtime setting names are derived implicitly from long option names
+        ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
+        'dest' keyword argument.
+
+        Most settings will also have a 'validator' keyword & function.  The
+        validator function validates setting values (from configuration files
+        and command-line option arguments) and converts them to appropriate
+        types.  For example, the ``docutils.frontend.validate_boolean``
+        function, **required by all boolean settings**, converts true values
+        ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off',
+        'no', 'false', and '') to 0.  Validators need only be set once per
+        setting.  See the `docutils.frontend.validate_*` functions.
+
+        See the optparse docs for more details.
+
+    - More triples of group title, description, options, as many times as
+      needed.  Thus, `settings_spec` tuples can be simply concatenated.
+    """
+
+    settings_defaults = None
+    """A dictionary of defaults for settings not in `settings_spec` (internal
+    settings, intended to be inaccessible by command-line and config file).
+    Override in subclasses."""
+
+    settings_default_overrides = None
+    """A dictionary of auxiliary defaults, to override defaults for settings
+    defined in other components.  Override in subclasses."""
+
+    relative_path_settings = ()
+    """Settings containing filesystem paths.  Override in subclasses.
+    Settings listed here are to be interpreted relative to the current working
+    directory."""
+
+    config_section = None
+    """The name of the config file section specific to this component
+    (lowercase, no brackets).  Override in subclasses."""
+
+    config_section_dependencies = None
+    """A list of names of config file sections that are to be applied before
+    `config_section`, in order (from general to specific).  In other words,
+    the settings in `config_section` are to be overlaid on top of the settings
+    from these sections.  The "general" section is assumed implicitly.
+    Override in subclasses."""
+
+
+class TransformSpec:
+
+    """
+    Runtime transform specification base class.
+
+    TransformSpec subclass objects used by `docutils.transforms.Transformer`.
+    """
+
+    def get_transforms(self):
+        """Transforms required by this class.  Override in subclasses."""
+        if self.default_transforms != ():
+            import warnings
+            warnings.warn('default_transforms attribute deprecated.\n'
+                          'Use get_transforms() method instead.',
+                          DeprecationWarning)
+            return list(self.default_transforms)
+        return []
+
+    # Deprecated; for compatibility.
+    default_transforms = ()
+
+    unknown_reference_resolvers = ()
+    """List of functions to try to resolve unknown references.  Unknown
+    references have a 'refname' attribute which doesn't correspond to any
+    target in the document.  Called when the transforms in
+    `docutils.tranforms.references` are unable to find a correct target.  The
+    list should contain functions which will try to resolve unknown
+    references, with the following signature::
+
+        def reference_resolver(node):
+            '''Returns boolean: true if resolved, false if not.'''
+
+    If the function is able to resolve the reference, it should also remove
+    the 'refname' attribute and mark the node as resolved::
+
+        del node['refname']
+        node.resolved = 1
+
+    Each function must have a "priority" attribute which will affect the order
+    the unknown_reference_resolvers are run::
+
+        reference_resolver.priority = 100
+
+    Override in subclasses."""
+
+
+class Component(SettingsSpec, TransformSpec):
+
+    """Base class for Docutils components."""
+
+    component_type = None
+    """Name of the component type ('reader', 'parser', 'writer').  Override in
+    subclasses."""
+
+    supported = ()
+    """Names for this component.  Override in subclasses."""
+
+    def supports(self, format):
+        """
+        Is `format` supported by this component?
+
+        To be used by transforms to ask the dependent component if it supports
+        a certain input context or output format.
+        """
+        return format in self.supported
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/core.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,613 @@
+# $Id: core.py 5033 2007-03-21 19:51:22Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Calling the ``publish_*`` convenience functions (or instantiating a
+`Publisher` object) with component names will result in default
+behavior.  For custom behavior (setting component options), create
+custom component objects first, and pass *them* to
+``publish_*``/`Publisher`.  See `The Docutils Publisher`_.
+
+.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import pprint
+from types import StringType
+from docutils import __version__, __version_details__, SettingsSpec
+from docutils import frontend, io, utils, readers, writers
+from docutils.frontend import OptionParser
+from docutils.transforms import Transformer
+import docutils.readers.doctree
+
+
+class Publisher:
+
+    """
+    A facade encapsulating the high-level logic of a Docutils system.
+    """
+
+    def __init__(self, reader=None, parser=None, writer=None,
+                 source=None, source_class=io.FileInput,
+                 destination=None, destination_class=io.FileOutput,
+                 settings=None):
+        """
+        Initial setup.  If any of `reader`, `parser`, or `writer` are not
+        specified, the corresponding ``set_...`` method should be called with
+        a component name (`set_reader` sets the parser as well).
+        """
+
+        self.document = None
+        """The document tree (`docutils.nodes` objects)."""
+
+        self.reader = reader
+        """A `docutils.readers.Reader` instance."""
+
+        self.parser = parser
+        """A `docutils.parsers.Parser` instance."""
+
+        self.writer = writer
+        """A `docutils.writers.Writer` instance."""
+
+        for component in 'reader', 'parser', 'writer':
+            assert not isinstance(getattr(self, component), StringType), \
+                   ('passed string as "%s" parameter; use "%s_name" instead'
+                    % (getattr(self, component), component, component))
+
+        self.source = source
+        """The source of input data, a `docutils.io.Input` instance."""
+
+        self.source_class = source_class
+        """The class for dynamically created source objects."""
+
+        self.destination = destination
+        """The destination for docutils output, a `docutils.io.Output`
+        instance."""
+
+        self.destination_class = destination_class
+        """The class for dynamically created destination objects."""
+
+        self.settings = settings
+        """An object containing Docutils settings as instance attributes.
+        Set by `self.process_command_line()` or `self.get_settings()`."""
+
+    def set_reader(self, reader_name, parser, parser_name):
+        """Set `self.reader` by name."""
+        reader_class = readers.get_reader_class(reader_name)
+        self.reader = reader_class(parser, parser_name)
+        self.parser = self.reader.parser
+
+    def set_writer(self, writer_name):
+        """Set `self.writer` by name."""
+        writer_class = writers.get_writer_class(writer_name)
+        self.writer = writer_class()
+
+    def set_components(self, reader_name, parser_name, writer_name):
+        if self.reader is None:
+            self.set_reader(reader_name, self.parser, parser_name)
+        if self.parser is None:
+            if self.reader.parser is None:
+                self.reader.set_parser(parser_name)
+            self.parser = self.reader.parser
+        if self.writer is None:
+            self.set_writer(writer_name)
+
+    def setup_option_parser(self, usage=None, description=None,
+                            settings_spec=None, config_section=None,
+                            **defaults):
+        if config_section:
+            if not settings_spec:
+                settings_spec = SettingsSpec()
+            settings_spec.config_section = config_section
+            parts = config_section.split()
+            if len(parts) > 1 and parts[-1] == 'application':
+                settings_spec.config_section_dependencies = ['applications']
+        #@@@ Add self.source & self.destination to components in future?
+        option_parser = OptionParser(
+            components=(self.parser, self.reader, self.writer, settings_spec),
+            defaults=defaults, read_config_files=1,
+            usage=usage, description=description)
+        return option_parser
+
+    def get_settings(self, usage=None, description=None,
+                     settings_spec=None, config_section=None, **defaults):
+        """
+        Set and return default settings (overrides in `defaults` dict).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        Explicitly setting `self.settings` disables command line option
+        processing from `self.publish()`.
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        self.settings = option_parser.get_default_values()
+        return self.settings
+
+    def process_programmatic_settings(self, settings_spec,
+                                      settings_overrides,
+                                      config_section):
+        if self.settings is None:
+            defaults = (settings_overrides or {}).copy()
+            # Propagate exceptions by default when used programmatically:
+            defaults.setdefault('traceback', 1)
+            self.get_settings(settings_spec=settings_spec,
+                              config_section=config_section,
+                              **defaults)
+
+    def process_command_line(self, argv=None, usage=None, description=None,
+                             settings_spec=None, config_section=None,
+                             **defaults):
+        """
+        Pass an empty list to `argv` to avoid reading `sys.argv` (the
+        default).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        if argv is None:
+            argv = sys.argv[1:]
+        self.settings = option_parser.parse_args(argv)
+
+    def set_io(self, source_path=None, destination_path=None):
+        if self.source is None:
+            self.set_source(source_path=source_path)
+        if self.destination is None:
+            self.set_destination(destination_path=destination_path)
+
+    def set_source(self, source=None, source_path=None):
+        if source_path is None:
+            source_path = self.settings._source
+        else:
+            self.settings._source = source_path
+        self.source = self.source_class(
+            source=source, source_path=source_path,
+            encoding=self.settings.input_encoding)
+
+    def set_destination(self, destination=None, destination_path=None):
+        if destination_path is None:
+            destination_path = self.settings._destination
+        else:
+            self.settings._destination = destination_path
+        self.destination = self.destination_class(
+            destination=destination, destination_path=destination_path,
+            encoding=self.settings.output_encoding,
+            error_handler=self.settings.output_encoding_error_handler)
+
+    def apply_transforms(self):
+        self.document.transformer.populate_from_components(
+            (self.source, self.reader, self.reader.parser, self.writer,
+             self.destination))
+        self.document.transformer.apply_transforms()
+
+    def publish(self, argv=None, usage=None, description=None,
+                settings_spec=None, settings_overrides=None,
+                config_section=None, enable_exit_status=None):
+        """
+        Process command line options and arguments (if `self.settings` not
+        already set), run `self.reader` and then `self.writer`.  Return
+        `self.writer`'s output.
+        """
+        exit = None
+        try:
+            if self.settings is None:
+                self.process_command_line(
+                    argv, usage, description, settings_spec, config_section,
+                    **(settings_overrides or {}))
+            self.set_io()
+            self.document = self.reader.read(self.source, self.parser,
+                                             self.settings)
+            self.apply_transforms()
+            output = self.writer.write(self.document, self.destination)
+            self.writer.assemble_parts()
+        except SystemExit, error:
+            exit = 1
+            exit_status = error.code
+        except Exception, error:
+            if not self.settings:       # exception too early to report nicely
+                raise
+            if self.settings.traceback: # Propagate exceptions?
+                self.debugging_dumps()
+                raise
+            self.report_Exception(error)
+            exit = 1
+            exit_status = 1
+        self.debugging_dumps()
+        if (enable_exit_status and self.document
+            and (self.document.reporter.max_level
+                 >= self.settings.exit_status_level)):
+            sys.exit(self.document.reporter.max_level + 10)
+        elif exit:
+            sys.exit(exit_status)
+        return output
+
+    def debugging_dumps(self):
+        if not self.document:
+            return
+        if self.settings.dump_settings:
+            print >>sys.stderr, '\n::: Runtime settings:'
+            print >>sys.stderr, pprint.pformat(self.settings.__dict__)
+        if self.settings.dump_internals:
+            print >>sys.stderr, '\n::: Document internals:'
+            print >>sys.stderr, pprint.pformat(self.document.__dict__)
+        if self.settings.dump_transforms:
+            print >>sys.stderr, '\n::: Transforms applied:'
+            print >>sys.stderr, (' (priority, transform class, '
+                                 'pending node details, keyword args)')
+            print >>sys.stderr, pprint.pformat(
+                [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
+                  pending and pending.details, kwargs)
+                 for priority, xclass, pending, kwargs
+                 in self.document.transformer.applied])
+        if self.settings.dump_pseudo_xml:
+            print >>sys.stderr, '\n::: Pseudo-XML:'
+            print >>sys.stderr, self.document.pformat().encode(
+                'raw_unicode_escape')
+
+    def report_Exception(self, error):
+        if isinstance(error, utils.SystemMessage):
+            self.report_SystemMessage(error)
+        elif isinstance(error, UnicodeError):
+            self.report_UnicodeError(error)
+        else:
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__, error)
+            print >>sys.stderr, ("""\
+Exiting due to error.  Use "--traceback" to diagnose.
+Please report errors to <docutils-users@lists.sf.net>.
+Include "--traceback" output, Docutils version (%s [%s]),
+Python version (%s), your OS type & version, and the
+command line used.""" % (__version__, __version_details__,
+                         sys.version.split()[0]))
+
+    def report_SystemMessage(self, error):
+        print >>sys.stderr, ('Exiting due to level-%s (%s) system message.'
+                             % (error.level,
+                                utils.Reporter.levels[error.level]))
+
+    def report_UnicodeError(self, error):
+        sys.stderr.write(
+            '%s: %s\n'
+            '\n'
+            'The specified output encoding (%s) cannot\n'
+            'handle all of the output.\n'
+            'Try setting "--output-encoding-error-handler" to\n'
+            '\n'
+            '* "xmlcharrefreplace" (for HTML & XML output);\n'
+            % (error.__class__.__name__, error,
+               self.settings.output_encoding))
+        try:
+            data = error.object[error.start:error.end]
+            sys.stderr.write(
+                '  the output will contain "%s" and should be usable.\n'
+                '* "backslashreplace" (for other output formats, Python 2.3+);\n'
+                '  look for "%s" in the output.\n'
+                % (data.encode('ascii', 'xmlcharrefreplace'),
+                   data.encode('ascii', 'backslashreplace')))
+        except AttributeError:
+            sys.stderr.write('  the output should be usable as-is.\n')
+        sys.stderr.write(
+            '* "replace"; look for "?" in the output.\n'
+            '\n'
+            '"--output-encoding-error-handler" is currently set to "%s".\n'
+            '\n'
+            'Exiting due to error.  Use "--traceback" to diagnose.\n'
+            'If the advice above doesn\'t eliminate the error,\n'
+            'please report it to <docutils-users@lists.sf.net>.\n'
+            'Include "--traceback" output, Docutils version (%s),\n'
+            'Python version (%s), your OS type & version, and the\n'
+            'command line used.\n'
+            % (self.settings.output_encoding_error_handler,
+               __version__, sys.version.split()[0]))
+
+default_usage = '%prog [options] [<source> [<destination>]]'
+default_description = ('Reads from <source> (default is stdin) and writes to '
+                       '<destination> (default is stdout).  See '
+                       '<http://docutils.sf.net/docs/user/config.html> for '
+                       'the full reference.')
+
+def publish_cmdline(reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    writer=None, writer_name='pseudoxml',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=1, argv=None,
+                    usage=default_usage, description=default_description):
+    """
+    Set up & run a `Publisher` for command-line-based file I/O (input and
+    output file paths taken automatically from the command line).  Return the
+    encoded string output also.
+
+    Parameters: see `publish_programmatically` for the remainder.
+
+    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
+    - `usage`: Usage string, output if there's a problem parsing the command
+      line.
+    - `description`: Program description, output for the "--help" option
+      (along with command-line option descriptions).
+    """
+    pub = Publisher(reader, parser, writer, settings=settings)
+    pub.set_components(reader_name, parser_name, writer_name)
+    output = pub.publish(
+        argv, usage, description, settings_spec, settings_overrides,
+        config_section=config_section, enable_exit_status=enable_exit_status)
+    return output
+
+def publish_file(source=None, source_path=None,
+                 destination=None, destination_path=None,
+                 reader=None, reader_name='standalone',
+                 parser=None, parser_name='restructuredtext',
+                 writer=None, writer_name='pseudoxml',
+                 settings=None, settings_spec=None, settings_overrides=None,
+                 config_section=None, enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with file-like I/O.
+    Return the encoded string output also.
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.FileInput, source=source, source_path=source_path,
+        destination_class=io.FileOutput,
+        destination=destination, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_string(source, source_path=None, destination_path=None,
+                   reader=None, reader_name='standalone',
+                   parser=None, parser_name='restructuredtext',
+                   writer=None, writer_name='pseudoxml',
+                   settings=None, settings_spec=None,
+                   settings_overrides=None, config_section=None,
+                   enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.  Return
+    the encoded string or Unicode string output.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_string(..., settings_overrides={'output_encoding': 'unicode'})
+
+    Similarly for Unicode string input (`source`)::
+
+        publish_string(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.StringInput, source=source, source_path=source_path,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_parts(source, source_path=None, source_class=io.StringInput,
+                  destination_path=None,
+                  reader=None, reader_name='standalone',
+                  parser=None, parser_name='restructuredtext',
+                  writer=None, writer_name='pseudoxml',
+                  settings=None, settings_spec=None,
+                  settings_overrides=None, config_section=None,
+                  enable_exit_status=None):
+    """
+    Set up & run a `Publisher`, and return a dictionary of document parts.
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.  For programmatic use with string I/O.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's how::
+
+        publish_parts(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source=source, source_path=source_path, source_class=source_class,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return pub.writer.parts
+
+def publish_doctree(source, source_path=None,
+                    source_class=io.StringInput,
+                    reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.
+    Return the document tree.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's one way::
+
+        publish_doctree(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    pub = Publisher(reader=reader, parser=parser, writer=None,
+                    settings=settings,
+                    source_class=source_class,
+                    destination_class=io.NullOutput)
+    pub.set_components(reader_name, parser_name, 'null')
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(None, None)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return pub.document
+
+def publish_from_doctree(document, destination_path=None,
+                         writer=None, writer_name='pseudoxml',
+                         settings=None, settings_spec=None,
+                         settings_overrides=None, config_section=None,
+                         enable_exit_status=None):
+    """
+    Set up & run a `Publisher` to render from an existing document
+    tree data structure, for programmatic use with string I/O.  Return
+    the encoded string output.
+
+    Note that document.settings is overridden; if you want to use the settings
+    of the original `document`, pass settings=document.settings.
+
+    Also, new document.transformer and document.reporter objects are
+    generated.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_from_doctree(
+            ..., settings_overrides={'output_encoding': 'unicode'})
+
+    Parameters: `document` is a `docutils.nodes.document` object, an existing
+    document tree.
+
+    Other parameters: see `publish_programmatically`.
+    """
+    reader = docutils.readers.doctree.Reader(parser_name='null')
+    pub = Publisher(reader, None, writer,
+                    source=io.DocTreeInput(document),
+                    destination_class=io.StringOutput, settings=settings)
+    if not writer and writer_name:
+        pub.set_writer(writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_destination(None, destination_path)
+    return pub.publish(enable_exit_status=enable_exit_status)
+
+def publish_programmatically(source_class, source, source_path,
+                             destination_class, destination, destination_path,
+                             reader, reader_name,
+                             parser, parser_name,
+                             writer, writer_name,
+                             settings, settings_spec,
+                             settings_overrides, config_section,
+                             enable_exit_status):
+    """
+    Set up & run a `Publisher` for custom programmatic use.  Return the
+    encoded string output and the Publisher object.
+
+    Applications should not need to call this function directly.  If it does
+    seem to be necessary to call this function directly, please write to the
+    Docutils-develop mailing list
+    <http://docutils.sf.net/docs/user/mailing-lists.html#docutils-develop>.
+
+    Parameters:
+
+    * `source_class` **required**: The class for dynamically created source
+      objects.  Typically `io.FileInput` or `io.StringInput`.
+
+    * `source`: Type depends on `source_class`:
+
+      - If `source_class` is `io.FileInput`: Either a file-like object
+        (must have 'read' and 'close' methods), or ``None``
+        (`source_path` is opened).  If neither `source` nor
+        `source_path` are supplied, `sys.stdin` is used.
+
+      - If `source_class` is `io.StringInput` **required**: The input
+        string, either an encoded 8-bit string (set the
+        'input_encoding' setting to the correct encoding) or a Unicode
+        string (set the 'input_encoding' setting to 'unicode').
+
+    * `source_path`: Type depends on `source_class`:
+
+      - `io.FileInput`: Path to the input file, opened if no `source`
+        supplied.
+
+      - `io.StringInput`: Optional.  Path to the file or object that produced
+        `source`.  Only used for diagnostic output.
+
+    * `destination_class` **required**: The class for dynamically created
+      destination objects.  Typically `io.FileOutput` or `io.StringOutput`.
+
+    * `destination`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Either a file-like object (must have 'write' and
+        'close' methods), or ``None`` (`destination_path` is opened).  If
+        neither `destination` nor `destination_path` are supplied,
+        `sys.stdout` is used.
+
+      - `io.StringOutput`: Not used; pass ``None``.
+
+    * `destination_path`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Path to the output file.  Opened if no `destination`
+        supplied.
+
+      - `io.StringOutput`: Path to the file or object which will receive the
+        output; optional.  Used for determining relative paths (stylesheets,
+        source links, etc.).
+
+    * `reader`: A `docutils.readers.Reader` object.
+
+    * `reader_name`: Name or alias of the Reader class to be instantiated if
+      no `reader` supplied.
+
+    * `parser`: A `docutils.parsers.Parser` object.
+
+    * `parser_name`: Name or alias of the Parser class to be instantiated if
+      no `parser` supplied.
+
+    * `writer`: A `docutils.writers.Writer` object.
+
+    * `writer_name`: Name or alias of the Writer class to be instantiated if
+      no `writer` supplied.
+
+    * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
+      dotted-attribute access to runtime settings.  It's the end result of the
+      `SettingsSpec`, config file, and option processing.  If `settings` is
+      passed, it's assumed to be complete and no further setting/config/option
+      processing is done.
+
+    * `settings_spec`: A `docutils.SettingsSpec` subclass or object.  Provides
+      extra application-specific settings definitions independently of
+      components.  In other words, the application becomes a component, and
+      its settings data is processed along with that of the other components.
+      Used only if no `settings` specified.
+
+    * `settings_overrides`: A dictionary containing application-specific
+      settings defaults that override the defaults of other components.
+      Used only if no `settings` specified.
+
+    * `config_section`: A string, the name of the configuration file section
+      for this application.  Overrides the ``config_section`` attribute
+      defined by `settings_spec`.  Used only if no `settings` specified.
+
+    * `enable_exit_status`: Boolean; enable exit status at end of processing?
+    """
+    pub = Publisher(reader, parser, writer, settings=settings,
+                    source_class=source_class,
+                    destination_class=destination_class)
+    pub.set_components(reader_name, parser_name, writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(destination, destination_path)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return output, pub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/examples.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+# $Id: examples.py 4800 2006-11-12 18:02:01Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module contains practical examples of Docutils client code.
+
+Importing this module from client code is not recommended; its contents are
+subject to change in future Docutils releases.  Instead, it is recommended
+that you copy and paste the parts you need into your own code, modifying as
+necessary.
+"""
+
+from docutils import core, io
+
+
+def html_parts(input_string, source_path=None, destination_path=None,
+               input_encoding='unicode', doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns a dictionary of HTML document parts.
+
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.
+
+    Parameters:
+
+    - `input_string`: A multi-line text string; required.
+    - `source_path`: Path to the source file or object.  Optional, but useful
+      for diagnostic output (system messages).
+    - `destination_path`: Path to the file or object which will receive the
+      output; optional.  Used for determining relative paths (stylesheets,
+      source links, etc.).
+    - `input_encoding`: The encoding of `input_string`.  If it is an encoded
+      8-bit string, provide the correct encoding.  If it is a Unicode string,
+      use "unicode", the default.
+    - `doctitle`: Disable the promotion of a lone top-level section title to
+      document title (and subsequent section title to document subtitle
+      promotion); enabled by default.
+    - `initial_header_level`: The initial level for header elements (e.g. 1
+      for "<h1>").
+    """
+    overrides = {'input_encoding': input_encoding,
+                 'doctitle_xform': doctitle,
+                 'initial_header_level': initial_header_level}
+    parts = core.publish_parts(
+        source=input_string, source_path=source_path,
+        destination_path=destination_path,
+        writer_name='html', settings_overrides=overrides)
+    return parts
+
+def html_body(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', output_encoding='unicode',
+              doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns an HTML fragment as a string.
+
+    The return value is the contents of the <body> element.
+
+    Parameters (see `html_parts()` for the remainder):
+
+    - `output_encoding`: The desired encoding of the output.  If a Unicode
+      string is desired, use the default value of "unicode" .
+    """
+    parts = html_parts(
+        input_string=input_string, source_path=source_path,
+        destination_path=destination_path,
+        input_encoding=input_encoding, doctitle=doctitle,
+        initial_header_level=initial_header_level)
+    fragment = parts['html_body']
+    if output_encoding != 'unicode':
+        fragment = fragment.encode(output_encoding)
+    return fragment
+
+def internals(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', settings_overrides=None):
+    """
+    Return the document tree and publisher, for exploring Docutils internals.
+
+    Parameters: see `html_parts()`.
+    """
+    if settings_overrides:
+        overrides = settings_overrides.copy()
+    else:
+        overrides = {}
+    overrides['input_encoding'] = input_encoding
+    output, pub = core.publish_programmatically(
+        source_class=io.StringInput, source=input_string,
+        source_path=source_path,
+        destination_class=io.NullOutput, destination=None,
+        destination_path=destination_path,
+        reader=None, reader_name='standalone',
+        parser=None, parser_name='restructuredtext',
+        writer=None, writer_name='null',
+        settings=None, settings_spec=None, settings_overrides=overrides,
+        config_section=None, enable_exit_status=None)
+    return pub.writer.document, pub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/frontend.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,756 @@
+# $Id: frontend.py 4913 2007-02-12 04:05:20Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Command-line and common processing for Docutils front-end tools.
+
+Exports the following classes:
+
+* `OptionParser`: Standard Docutils command-line processing.
+* `Option`: Customized version of `optparse.Option`; validation support.
+* `Values`: Runtime settings; objects are simple structs
+  (``object.attribute``).  Supports cumulative list settings (attributes).
+* `ConfigParser`: Standard Docutils config file processing.
+
+Also exports the following functions:
+
+* Option callbacks: `store_multiple`, `read_config_file`.
+* Setting validators: `validate_encoding`,
+  `validate_encoding_error_handler`,
+  `validate_encoding_and_error_handler`, `validate_boolean`,
+  `validate_threshold`, `validate_colon_separated_string_list`,
+  `validate_dependency_file`.
+* `make_paths_absolute`.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os
+import os.path
+import sys
+import types
+import warnings
+import ConfigParser as CP
+import codecs
+import docutils
+import docutils.utils
+import docutils.nodes
+try:
+    import optparse
+    from optparse import SUPPRESS_HELP
+except ImportError:
+    import optik as optparse
+    from optik import SUPPRESS_HELP
+
+
+def store_multiple(option, opt, value, parser, *args, **kwargs):
+    """
+    Store multiple values in `parser.values`.  (Option callback.)
+
+    Store `None` for each attribute named in `args`, and store the value for
+    each key (attribute name) in `kwargs`.
+    """
+    for attribute in args:
+        setattr(parser.values, attribute, None)
+    for key, value in kwargs.items():
+        setattr(parser.values, key, value)
+
+def read_config_file(option, opt, value, parser):
+    """
+    Read a configuration file during option processing.  (Option callback.)
+    """
+    try:
+        new_settings = parser.get_config_file_settings(value)
+    except ValueError, error:
+        parser.error(error)
+    parser.values.update(new_settings, parser)
+
+def validate_encoding(setting, value, option_parser,
+                      config_parser=None, config_section=None):
+    try:
+        codecs.lookup(value)
+    except LookupError:
+        raise (LookupError('setting "%s": unknown encoding: "%s"'
+                           % (setting, value)),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_error_handler(setting, value, option_parser,
+                                    config_parser=None, config_section=None):
+    try:
+        codecs.lookup_error(value)
+    except AttributeError:              # prior to Python 2.3
+        if value not in ('strict', 'ignore', 'replace', 'xmlcharrefreplace'):
+            raise (LookupError(
+                'unknown encoding error handler: "%s" (choices: '
+                '"strict", "ignore", "replace", or "xmlcharrefreplace")' % value),
+                   None, sys.exc_info()[2])
+    except LookupError:
+        raise (LookupError(
+            'unknown encoding error handler: "%s" (choices: '
+            '"strict", "ignore", "replace", "backslashreplace", '
+            '"xmlcharrefreplace", and possibly others; see documentation for '
+            'the Python ``codecs`` module)' % value),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_and_error_handler(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    """
+    Side-effect: if an error handler is included in the value, it is inserted
+    into the appropriate place as if it was a separate setting/option.
+    """
+    if ':' in value:
+        encoding, handler = value.split(':')
+        validate_encoding_error_handler(
+            setting + '_error_handler', handler, option_parser,
+            config_parser, config_section)
+        if config_parser:
+            config_parser.set(config_section, setting + '_error_handler',
+                              handler)
+        else:
+            setattr(option_parser.values, setting + '_error_handler', handler)
+    else:
+        encoding = value
+    validate_encoding(setting, encoding, option_parser,
+                      config_parser, config_section)
+    return encoding
+
+def validate_boolean(setting, value, option_parser,
+                     config_parser=None, config_section=None):
+    if isinstance(value, types.UnicodeType):
+        try:
+            return option_parser.booleans[value.strip().lower()]
+        except KeyError:
+            raise (LookupError('unknown boolean value: "%s"' % value),
+                   None, sys.exc_info()[2])
+    return value
+
+def validate_nonnegative_int(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    value = int(value)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+def validate_threshold(setting, value, option_parser,
+                       config_parser=None, config_section=None):
+    try:
+        return int(value)
+    except ValueError:
+        try:
+            return option_parser.thresholds[value.lower()]
+        except (KeyError, AttributeError):
+            raise (LookupError('unknown threshold: %r.' % value),
+                   None, sys.exc_info[2])
+
+def validate_colon_separated_string_list(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if isinstance(value, types.UnicodeType):
+        value = value.split(':')
+    else:
+        last = value.pop()
+        value.extend(last.split(':'))
+    return value
+
+def validate_url_trailing_slash(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if not value:
+        return './'
+    elif value.endswith('/'):
+        return value
+    else:
+        return value + '/'
+
+def validate_dependency_file(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    try:
+        return docutils.utils.DependencyList(value)
+    except IOError:
+        return docutils.utils.DependencyList(None)
+
+def validate_strip_class(setting, value, option_parser,
+                         config_parser=None, config_section=None):
+    if config_parser:                   # validate all values
+        class_values = value
+    else:                               # just validate the latest value
+        class_values = [value[-1]]
+    for class_value in class_values:
+        normalized = docutils.nodes.make_id(class_value)
+        if class_value != normalized:
+            raise ValueError('invalid class value %r (perhaps %r?)'
+                             % (class_value, normalized))
+    return value
+
+def make_paths_absolute(pathdict, keys, base_path=None):
+    """
+    Interpret filesystem path settings relative to the `base_path` given.
+
+    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
+    `OptionParser.relative_path_settings`.
+    """
+    if base_path is None:
+        base_path = os.getcwd()
+    for key in keys:
+        if pathdict.has_key(key):
+            value = pathdict[key]
+            if isinstance(value, types.ListType):
+                value = [make_one_path_absolute(base_path, path)
+                         for path in value]
+            elif value:
+                value = make_one_path_absolute(base_path, value)
+            pathdict[key] = value
+
+def make_one_path_absolute(base_path, path):
+    return os.path.abspath(os.path.join(base_path, path))
+
+
+class Values(optparse.Values):
+
+    """
+    Updates list attributes by extension rather than by replacement.
+    Works in conjunction with the `OptionParser.lists` instance attribute.
+    """
+
+    def __init__(self, *args, **kwargs):
+        optparse.Values.__init__(self, *args, **kwargs)
+        if (not hasattr(self, 'record_dependencies')
+            or self.record_dependencies is None):
+            # Set up dependency list, in case it is needed.
+            self.record_dependencies = docutils.utils.DependencyList()
+
+    def update(self, other_dict, option_parser):
+        if isinstance(other_dict, Values):
+            other_dict = other_dict.__dict__
+        other_dict = other_dict.copy()
+        for setting in option_parser.lists.keys():
+            if (hasattr(self, setting) and other_dict.has_key(setting)):
+                value = getattr(self, setting)
+                if value:
+                    value += other_dict[setting]
+                    del other_dict[setting]
+        self._update_loose(other_dict)
+
+    def copy(self):
+        """Return a shallow copy of `self`."""
+        return self.__class__(defaults=self.__dict__)
+
+
+class Option(optparse.Option):
+
+    ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
+
+    def process(self, opt, value, values, parser):
+        """
+        Call the validator function on applicable settings and
+        evaluate the 'overrides' option.
+        Extends `optparse.Option.process`.
+        """
+        result = optparse.Option.process(self, opt, value, values, parser)
+        setting = self.dest
+        if setting:
+            if self.validator:
+                value = getattr(values, setting)
+                try:
+                    new_value = self.validator(setting, value, parser)
+                except Exception, error:
+                    raise (optparse.OptionValueError(
+                        'Error in option "%s":\n    %s: %s'
+                        % (opt, error.__class__.__name__, error)),
+                           None, sys.exc_info()[2])
+                setattr(values, setting, new_value)
+            if self.overrides:
+                setattr(values, self.overrides, None)
+        return result
+
+
+class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
+
+    """
+    Parser for command-line and library use.  The `settings_spec`
+    specification here and in other Docutils components are merged to build
+    the set of command-line options and runtime settings for this process.
+
+    Common settings (defined below) and component-specific settings must not
+    conflict.  Short options are reserved for common settings, and components
+    are restrict to using long options.
+    """
+
+    standard_config_files = [
+        '/etc/docutils.conf',           # system-wide
+        './docutils.conf',              # project-specific
+        '~/.docutils']                  # user-specific
+    """Docutils configuration files, using ConfigParser syntax.  Filenames
+    will be tilde-expanded later.  Later files override earlier ones."""
+
+    threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
+    """Possible inputs for for --report and --halt threshold values."""
+
+    thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
+    """Lookup table for --report and --halt threshold values."""
+
+    booleans={'1': 1, 'on': 1, 'yes': 1, 'true': 1,
+              '0': 0, 'off': 0, 'no': 0, 'false': 0, '': 0}
+    """Lookup table for boolean configuration file settings."""
+
+    if hasattr(codecs, 'backslashreplace_errors'):
+        default_error_encoding_error_handler = 'backslashreplace'
+    else:
+        default_error_encoding_error_handler = 'replace'
+
+    settings_spec = (
+        'General Docutils Options',
+        None,
+        (('Specify the document title as metadata.',
+          ['--title'], {}),
+         ('Include a "Generated by Docutils" credit and link.',
+          ['--generator', '-g'], {'action': 'store_true',
+                                  'validator': validate_boolean}),
+         ('Do not include a generator credit.',
+          ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
+         ('Include the date at the end of the document (UTC).',
+          ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
+                             'dest': 'datestamp'}),
+         ('Include the time & date (UTC).',
+          ['--time', '-t'], {'action': 'store_const',
+                             'const': '%Y-%m-%d %H:%M UTC',
+                             'dest': 'datestamp'}),
+         ('Do not include a datestamp of any kind.',
+          ['--no-datestamp'], {'action': 'store_const', 'const': None,
+                               'dest': 'datestamp'}),
+         ('Include a "View document source" link.',
+          ['--source-link', '-s'], {'action': 'store_true',
+                                    'validator': validate_boolean}),
+         ('Use <URL> for a source link; implies --source-link.',
+          ['--source-url'], {'metavar': '<URL>'}),
+         ('Do not include a "View document source" link.',
+          ['--no-source-link'],
+          {'action': 'callback', 'callback': store_multiple,
+           'callback_args': ('source_link', 'source_url')}),
+         ('Link from section headers to TOC entries.  (default)',
+          ['--toc-entry-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
+           'default': 'entry'}),
+         ('Link from section headers to the top of the TOC.',
+          ['--toc-top-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
+         ('Disable backlinks to the table of contents.',
+          ['--no-toc-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_false'}),
+         ('Link from footnotes/citations to references. (default)',
+          ['--footnote-backlinks'],
+          {'action': 'store_true', 'default': 1,
+           'validator': validate_boolean}),
+         ('Disable backlinks from footnotes and citations.',
+          ['--no-footnote-backlinks'],
+          {'dest': 'footnote_backlinks', 'action': 'store_false'}),
+         ('Enable section numbering.  (default)',
+          ['--section-numbering'],
+          {'action': 'store_true', 'dest': 'sectnum_xform',
+           'default': 1, 'validator': validate_boolean}),
+         ('Disable section numbering.',
+          ['--no-section-numbering'],
+          {'action': 'store_false', 'dest': 'sectnum_xform'}),
+         ('Remove comment elements from the document tree.',
+          ['--strip-comments'],
+          {'action': 'store_true', 'validator': validate_boolean}),
+         ('Leave comment elements in the document tree. (default)',
+          ['--leave-comments'],
+          {'action': 'store_false', 'dest': 'strip_comments'}),
+         ('Remove all elements with classes="<class>" from the document tree. '
+          '(Multiple-use option.)',
+          ['--strip-elements-with-class'],
+          {'action': 'append', 'dest': 'strip_elements_with_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Remove all classes="<class>" attributes from elements in the '
+          'document tree. (Multiple-use option.)',
+          ['--strip-class'],
+          {'action': 'append', 'dest': 'strip_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Report system messages at or higher than <level>: "info" or "1", '
+          '"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
+          ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
+                               'dest': 'report_level', 'metavar': '<level>',
+                               'validator': validate_threshold}),
+         ('Report all system messages.  (Same as "--report=1".)',
+          ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
+                                'dest': 'report_level'}),
+         ('Report no system messages.  (Same as "--report=5".)',
+          ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
+                              'dest': 'report_level'}),
+         ('Halt execution at system messages at or above <level>.  '
+          'Levels as in --report.  Default: 4 (severe).',
+          ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
+                       'default': 4, 'metavar': '<level>',
+                       'validator': validate_threshold}),
+         ('Halt at the slightest problem.  Same as "--halt=info".',
+          ['--strict'], {'action': 'store_const', 'const': 'info',
+                         'dest': 'halt_level'}),
+         ('Enable a non-zero exit status for non-halting system messages at '
+          'or above <level>.  Default: 5 (disabled).',
+          ['--exit-status'], {'choices': threshold_choices,
+                              'dest': 'exit_status_level',
+                              'default': 5, 'metavar': '<level>',
+                              'validator': validate_threshold}),
+         ('Enable debug-level system messages and diagnostics.',
+          ['--debug'], {'action': 'store_true', 'validator': validate_boolean}),
+         ('Disable debug output.  (default)',
+          ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
+         ('Send the output of system messages to <file>.',
+          ['--warnings'], {'dest': 'warning_stream', 'metavar': '<file>'}),
+         ('Enable Python tracebacks when Docutils is halted.',
+          ['--traceback'], {'action': 'store_true', 'default': None,
+                            'validator': validate_boolean}),
+         ('Disable Python tracebacks.  (default)',
+          ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
+         ('Specify the encoding and optionally the '
+          'error handler of input text.  Default: <locale-dependent>:strict.',
+          ['--input-encoding', '-i'],
+          {'metavar': '<name[:handler]>',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for undecodable characters.  '
+          'Choices: "strict" (default), "ignore", and "replace".',
+          ['--input-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify the text encoding and optionally the error handler for '
+          'output.  Default: UTF-8:strict.',
+          ['--output-encoding', '-o'],
+          {'metavar': '<name[:handler]>', 'default': 'utf-8',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify error handler for unencodable output characters; '
+          '"strict" (default), "ignore", "replace", '
+          '"xmlcharrefreplace", "backslashreplace" (Python 2.3+).',
+          ['--output-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify text encoding and error handler for error output.  '
+          'Default: ASCII:%s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding', '-e'],
+          {'metavar': '<name[:handler]>', 'default': 'ascii',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for unencodable characters in '
+          'error output.  Default: %s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding-error-handler'],
+          {'default': default_error_encoding_error_handler,
+           'validator': validate_encoding_error_handler}),
+         ('Specify the language (as 2-letter code).  Default: en.',
+          ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
+                                 'metavar': '<name>'}),
+         ('Write output file dependencies to <file>.',
+          ['--record-dependencies'],
+          {'metavar': '<file>', 'validator': validate_dependency_file,
+           'default': None}),           # default set in Values class
+         ('Read configuration settings from <file>, if it exists.',
+          ['--config'], {'metavar': '<file>', 'type': 'string',
+                         'action': 'callback', 'callback': read_config_file}),
+         ("Show this program's version number and exit.",
+          ['--version', '-V'], {'action': 'version'}),
+         ('Show this help message and exit.',
+          ['--help', '-h'], {'action': 'help'}),
+         # Typically not useful for non-programmatical use:
+         (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
+         (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': 'id'}),
+         # Hidden options, for development use only:
+         (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--expose-internal-attribute'],
+          {'action': 'append', 'dest': 'expose_internals',
+           'validator': validate_colon_separated_string_list}),
+         (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
+         ))
+    """Runtime settings and command-line options common to all Docutils front
+    ends.  Setting specs specific to individual Docutils components are also
+    used (see `populate_from_components()`)."""
+
+    settings_defaults = {'_disable_config': None,
+                         '_source': None,
+                         '_destination': None,
+                         '_config_files': None}
+    """Defaults for settings that don't have command-line option equivalents."""
+
+    relative_path_settings = ('warning_stream',)
+
+    config_section = 'general'
+
+    version_template = ('%%prog (Docutils %s [%s])'
+                        % (docutils.__version__, docutils.__version_details__))
+    """Default version message."""
+
+    def __init__(self, components=(), defaults=None, read_config_files=None,
+                 *args, **kwargs):
+        """
+        `components` is a list of Docutils components each containing a
+        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
+        default overrides.
+        """
+
+        self.lists = {}
+        """Set of list-type settings."""
+
+        self.config_files = []
+        """List of paths of applied configuration files."""
+
+        optparse.OptionParser.__init__(
+            self, option_class=Option, add_help_option=None,
+            formatter=optparse.TitledHelpFormatter(width=78),
+            *args, **kwargs)
+        if not self.version:
+            self.version = self.version_template
+        # Make an instance copy (it will be modified):
+        self.relative_path_settings = list(self.relative_path_settings)
+        self.components = (self,) + tuple(components)
+        self.populate_from_components(self.components)
+        self.set_defaults_from_dict(defaults or {})
+        if read_config_files and not self.defaults['_disable_config']:
+            try:
+                config_settings = self.get_standard_config_settings()
+            except ValueError, error:
+                self.error(error)
+            self.set_defaults_from_dict(config_settings.__dict__)
+
+    def populate_from_components(self, components):
+        """
+        For each component, first populate from the `SettingsSpec.settings_spec`
+        structure, then from the `SettingsSpec.settings_defaults` dictionary.
+        After all components have been processed, check for and populate from
+        each component's `SettingsSpec.settings_default_overrides` dictionary.
+        """
+        for component in components:
+            if component is None:
+                continue
+            settings_spec = component.settings_spec
+            self.relative_path_settings.extend(
+                component.relative_path_settings)
+            for i in range(0, len(settings_spec), 3):
+                title, description, option_spec = settings_spec[i:i+3]
+                if title:
+                    group = optparse.OptionGroup(self, title, description)
+                    self.add_option_group(group)
+                else:
+                    group = self        # single options
+                for (help_text, option_strings, kwargs) in option_spec:
+                    option = group.add_option(help=help_text, *option_strings,
+                                              **kwargs)
+                    if kwargs.get('action') == 'append':
+                        self.lists[option.dest] = 1
+                if component.settings_defaults:
+                    self.defaults.update(component.settings_defaults)
+        for component in components:
+            if component and component.settings_default_overrides:
+                self.defaults.update(component.settings_default_overrides)
+
+    def get_standard_config_files(self):
+        """Return list of config files, from environment or standard."""
+        try:
+            config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
+        except KeyError:
+            config_files = self.standard_config_files
+
+        # If 'HOME' is not set, expandvars() requires the 'pwd' module which is
+        # not available under certain environments, for example, within
+        # mod_python.  The publisher ends up in here, and we need to publish
+        # from within mod_python.  Therefore we need to avoid expanding when we
+        # are in those environments.
+        expand = os.path.expanduser
+        if 'HOME' not in os.environ:
+            try:
+                import pwd
+            except ImportError:
+                expand = lambda x: x
+        return [expand(f) for f in config_files if f.strip()]
+
+    def get_standard_config_settings(self):
+        settings = Values()
+        for filename in self.get_standard_config_files():
+            settings.update(self.get_config_file_settings(filename), self)
+        return settings
+
+    def get_config_file_settings(self, config_file):
+        """Returns a dictionary containing appropriate config file settings."""
+        parser = ConfigParser()
+        parser.read(config_file, self)
+        self.config_files.extend(parser._files)
+        base_path = os.path.dirname(config_file)
+        applied = {}
+        settings = Values()
+        for component in self.components:
+            if not component:
+                continue
+            for section in (tuple(component.config_section_dependencies or ())
+                            + (component.config_section,)):
+                if applied.has_key(section):
+                    continue
+                applied[section] = 1
+                settings.update(parser.get_section(section), self)
+        make_paths_absolute(
+            settings.__dict__, self.relative_path_settings, base_path)
+        return settings.__dict__
+
+    def check_values(self, values, args):
+        """Store positional arguments as runtime settings."""
+        values._source, values._destination = self.check_args(args)
+        make_paths_absolute(values.__dict__, self.relative_path_settings,
+                            os.getcwd())
+        values._config_files = self.config_files
+        return values
+
+    def check_args(self, args):
+        source = destination = None
+        if args:
+            source = args.pop(0)
+            if source == '-':           # means stdin
+                source = None
+        if args:
+            destination = args.pop(0)
+            if destination == '-':      # means stdout
+                destination = None
+        if args:
+            self.error('Maximum 2 arguments allowed.')
+        if source and source == destination:
+            self.error('Do not specify the same file for both source and '
+                       'destination.  It will clobber the source file.')
+        return source, destination
+
+    def set_defaults_from_dict(self, defaults):
+        self.defaults.update(defaults)
+
+    def get_default_values(self):
+        """Needed to get custom `Values` instances."""
+        defaults = Values(self.defaults)
+        defaults._config_files = self.config_files
+        return defaults
+
+    def get_option_by_dest(self, dest):
+        """
+        Get an option by its dest.
+
+        If you're supplying a dest which is shared by several options,
+        it is undefined which option of those is returned.
+
+        A KeyError is raised if there is no option with the supplied
+        dest.
+        """
+        for group in self.option_groups + [self]:
+            for option in group.option_list:
+                if option.dest == dest:
+                    return option
+        raise KeyError('No option with dest == %r.' % dest)
+
+
+class ConfigParser(CP.ConfigParser):
+
+    old_settings = {
+        'pep_stylesheet': ('pep_html writer', 'stylesheet'),
+        'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
+        'pep_template': ('pep_html writer', 'template')}
+    """{old setting: (new section, new setting)} mapping, used by
+    `handle_old_config`, to convert settings from the old [options] section."""
+
+    old_warning = """
+The "[option]" section is deprecated.  Support for old-format configuration
+files may be removed in a future Docutils release.  Please revise your
+configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
+section "Old-Format Configuration Files".
+"""
+
+    not_utf8_error = """\
+Unable to read configuration file "%s": content not encoded as UTF-8.
+Skipping "%s" configuration file.
+"""
+
+    def __init__(self, *args, **kwargs):
+        CP.ConfigParser.__init__(self, *args, **kwargs)
+
+        self._files = []
+        """List of paths of configuration files read."""
+
+    def read(self, filenames, option_parser):
+        if type(filenames) in (types.StringType, types.UnicodeType):
+            filenames = [filenames]
+        for filename in filenames:
+            try:
+                # Config files must be UTF-8-encoded:
+                fp = codecs.open(filename, 'r', 'utf-8')
+            except IOError:
+                continue
+            try:
+                CP.ConfigParser.readfp(self, fp, filename)
+            except UnicodeDecodeError:
+                sys.stderr.write(self.not_utf8_error % (filename, filename))
+                fp.close()
+                continue
+            fp.close()
+            self._files.append(filename)
+            if self.has_section('options'):
+                self.handle_old_config(filename)
+            self.validate_settings(filename, option_parser)
+
+    def handle_old_config(self, filename):
+        warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
+                               filename, 0)
+        options = self.get_section('options')
+        if not self.has_section('general'):
+            self.add_section('general')
+        for key, value in options.items():
+            if self.old_settings.has_key(key):
+                section, setting = self.old_settings[key]
+                if not self.has_section(section):
+                    self.add_section(section)
+            else:
+                section = 'general'
+                setting = key
+            if not self.has_option(section, setting):
+                self.set(section, setting, value)
+        self.remove_section('options')
+
+    def validate_settings(self, filename, option_parser):
+        """
+        Call the validator function and implement overrides on all applicable
+        settings.
+        """
+        for section in self.sections():
+            for setting in self.options(section):
+                try:
+                    option = option_parser.get_option_by_dest(setting)
+                except KeyError:
+                    continue
+                if option.validator:
+                    value = self.get(section, setting, raw=1)
+                    try:
+                        new_value = option.validator(
+                            setting, value, option_parser,
+                            config_parser=self, config_section=section)
+                    except Exception, error:
+                        raise (ValueError(
+                            'Error in config file "%s", section "[%s]":\n'
+                            '    %s: %s\n        %s = %s'
+                            % (filename, section, error.__class__.__name__,
+                               error, setting, value)), None, sys.exc_info()[2])
+                    self.set(section, setting, new_value)
+                if option.overrides:
+                    self.set(section, option.overrides, None)
+
+    def optionxform(self, optionstr):
+        """
+        Transform '-' to '_' so the cmdline form of option names can be used.
+        """
+        return optionstr.lower().replace('-', '_')
+
+    def get_section(self, section):
+        """
+        Return a given section as a dictionary (empty if the section
+        doesn't exist).
+        """
+        section_dict = {}
+        if self.has_section(section):
+            for option in self.options(section):
+                section_dict[option] = self.get(section, option, raw=1)
+        return section_dict
+
+
+class ConfigDeprecationWarning(DeprecationWarning):
+    """Warning for deprecated configuration file features."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/io.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,412 @@
+# $Id: io.py 4750 2006-09-16 21:32:29Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+I/O classes provide a uniform API for low-level input and output.  Subclasses
+will exist for a variety of input/output mechanisms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+try:
+    import locale
+except:
+    pass
+import re
+from types import UnicodeType
+from docutils import TransformSpec
+
+
+class Input(TransformSpec):
+
+    """
+    Abstract base class for input wrappers.
+    """
+
+    component_type = 'input'
+
+    default_source_path = None
+
+    def __init__(self, source=None, source_path=None, encoding=None,
+                 error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the input source."""
+
+        self.error_handler = error_handler
+        """Text decoding error handler."""
+
+        self.source = source
+        """The source of input data."""
+
+        self.source_path = source_path
+        """A text reference to the source."""
+
+        if not source_path:
+            self.source_path = self.default_source_path
+
+        self.successful_encoding = None
+        """The encoding that successfully decoded the source data."""
+
+    def __repr__(self):
+        return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
+                                                  self.source_path)
+
+    def read(self):
+        raise NotImplementedError
+
+    def decode(self, data):
+        """
+        Decode a string, `data`, heuristically.
+        Raise UnicodeError if unsuccessful.
+
+        The client application should call ``locale.setlocale`` at the
+        beginning of processing::
+
+            locale.setlocale(locale.LC_ALL, '')
+        """
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'input encoding is "unicode" '
+                'but input is not a unicode object')
+        if isinstance(data, UnicodeType):
+            # Accept unicode even if self.encoding != 'unicode'.
+            return data
+        if self.encoding:
+            # We believe the user/application when the encoding is
+            # explicitly given.
+            encodings = [self.encoding]
+        else:
+            data_encoding = self.determine_encoding_from_data(data)
+            if data_encoding:
+                # If the data declares its encoding (explicitly or via a BOM),
+                # we believe it.
+                encodings = [data_encoding]
+            else:
+                # Apply heuristics only if no encoding is explicitly given and
+                # no BOM found.  Start with UTF-8, because that only matches
+                # data that *IS* UTF-8:
+                encodings = ['utf-8']
+                try:
+                    # for Python 2.2 compatibility
+                    encodings.append(locale.nl_langinfo(locale.CODESET))
+                except:
+                    pass
+                try:
+                    encodings.append(locale.getlocale()[1])
+                except:
+                    pass
+                try:
+                    encodings.append(locale.getdefaultlocale()[1])
+                except:
+                    pass
+                # fallback encoding:
+                encodings.append('latin-1')
+        error = None
+        error_details = ''
+        for enc in encodings:
+            if not enc:
+                continue
+            try:
+                decoded = unicode(data, enc, self.error_handler)
+                self.successful_encoding = enc
+                # Return decoded, removing BOMs.
+                return decoded.replace(u'\ufeff', u'')
+            except (UnicodeError, LookupError), error:
+                pass
+        if error is not None:
+            error_details = '\n(%s: %s)' % (error.__class__.__name__, error)
+        raise UnicodeError(
+            'Unable to decode input data.  Tried the following encodings: '
+            '%s.%s'
+            % (', '.join([repr(enc) for enc in encodings if enc]),
+               error_details))
+
+    coding_slug = re.compile("coding[:=]\s*([-\w.]+)")
+    """Encoding declaration pattern."""
+
+    byte_order_marks = (('\xef\xbb\xbf', 'utf-8'),
+                        ('\xfe\xff', 'utf-16-be'),
+                        ('\xff\xfe', 'utf-16-le'),)
+    """Sequence of (start_bytes, encoding) tuples to for encoding detection.
+    The first bytes of input data are checked against the start_bytes strings.
+    A match indicates the given encoding."""
+
+    def determine_encoding_from_data(self, data):
+        """
+        Try to determine the encoding of `data` by looking *in* `data`.
+        Check for a byte order mark (BOM) or an encoding declaration.
+        """
+        # check for a byte order mark:
+        for start_bytes, encoding in self.byte_order_marks:
+            if data.startswith(start_bytes):
+                return encoding
+        # check for an encoding declaration pattern in first 2 lines of file:
+        for line in data.splitlines()[:2]:
+            match = self.coding_slug.search(line)
+            if match:
+                return match.group(1)
+        return None
+
+
+class Output(TransformSpec):
+
+    """
+    Abstract base class for output wrappers.
+    """
+
+    component_type = 'output'
+
+    default_destination_path = None
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the output destination."""
+
+        self.error_handler = error_handler or 'strict'
+        """Text encoding error handler."""
+
+        self.destination = destination
+        """The destination for output data."""
+
+        self.destination_path = destination_path
+        """A text reference to the destination."""
+
+        if not destination_path:
+            self.destination_path = self.default_destination_path
+
+    def __repr__(self):
+        return ('%s: destination=%r, destination_path=%r'
+                % (self.__class__, self.destination, self.destination_path))
+
+    def write(self, data):
+        """`data` is a Unicode string, to be encoded by `self.encode`."""
+        raise NotImplementedError
+
+    def encode(self, data):
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'the encoding given is "unicode" but the output is not '
+                'a Unicode string')
+            return data
+        if not isinstance(data, UnicodeType):
+            # Non-unicode (e.g. binary) output.
+            return data
+        else:
+            try:
+                return data.encode(self.encoding, self.error_handler)
+            except (LookupError, ValueError):
+                # LookupError is raised if there are unencodable chars
+                # in data and the error_handler isn't found. In old
+                # Python versions, ValueError is raised.
+                if self.error_handler == 'xmlcharrefreplace':
+                    # We are using xmlcharrefreplace with a Python
+                    # version that doesn't support it (2.1, 2.2, or
+                    # IronPython 1.0) so we emulate its behavior.
+                    return ''.join([self.xmlcharref_encode(char)
+                                    for char in data])
+                else:
+                    raise
+
+    def xmlcharref_encode(self, char):
+        """Emulate Python 2.3's 'xmlcharrefreplace' encoding error handler."""
+        try:
+            return char.encode(self.encoding, 'strict')
+        except UnicodeError:
+            return '&#%i;' % ord(char)
+
+
+class FileInput(Input):
+
+    """
+    Input for single, simple file-like objects.
+    """
+
+    def __init__(self, source=None, source_path=None,
+                 encoding=None, error_handler='strict',
+                 autoclose=1, handle_io_errors=1):
+        """
+        :Parameters:
+            - `source`: either a file-like object (which is read directly), or
+              `None` (which implies `sys.stdin` if no `source_path` given).
+            - `source_path`: a path to a file, which is opened and then read.
+            - `encoding`: the expected text encoding of the input file.
+            - `error_handler`: the encoding error handler to use.
+            - `autoclose`: close automatically after read (boolean); always
+              false if `sys.stdin` is the source.
+            - `handle_io_errors`: summarize I/O errors here, and exit?
+        """
+        Input.__init__(self, source, source_path, encoding, error_handler)
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if source is None:
+            if source_path:
+                try:
+                    self.source = open(source_path)
+                except IOError, error:
+                    if not handle_io_errors:
+                        raise
+                    print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                                    error)
+                    print >>sys.stderr, (
+                        'Unable to open source file for reading (%r).  Exiting.'
+                        % source_path)
+                    sys.exit(1)
+            else:
+                self.source = sys.stdin
+                self.autoclose = None
+        if not source_path:
+            try:
+                self.source_path = self.source.name
+            except AttributeError:
+                pass
+
+    def read(self):
+        """
+        Read and decode a single file and return the data (Unicode string).
+        """
+        try:
+            data = self.source.read()
+        finally:
+            if self.autoclose:
+                self.close()
+        return self.decode(data)
+
+    def close(self):
+        self.source.close()
+
+
+class FileOutput(Output):
+
+    """
+    Output for single, simple file-like objects.
+    """
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict', autoclose=1,
+                 handle_io_errors=1):
+        """
+        :Parameters:
+            - `destination`: either a file-like object (which is written
+              directly) or `None` (which implies `sys.stdout` if no
+              `destination_path` given).
+            - `destination_path`: a path to a file, which is opened and then
+              written.
+            - `autoclose`: close automatically after write (boolean); always
+              false if `sys.stdout` is the destination.
+        """
+        Output.__init__(self, destination, destination_path,
+                        encoding, error_handler)
+        self.opened = 1
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if destination is None:
+            if destination_path:
+                self.opened = None
+            else:
+                self.destination = sys.stdout
+                self.autoclose = None
+        if not destination_path:
+            try:
+                self.destination_path = self.destination.name
+            except AttributeError:
+                pass
+
+    def open(self):
+        try:
+            self.destination = open(self.destination_path, 'w')
+        except IOError, error:
+            if not self.handle_io_errors:
+                raise
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                            error)
+            print >>sys.stderr, ('Unable to open destination file for writing '
+                                 '(%r).  Exiting.' % self.destination_path)
+            sys.exit(1)
+        self.opened = 1
+
+    def write(self, data):
+        """Encode `data`, write it to a single file, and return it."""
+        output = self.encode(data)
+        if not self.opened:
+            self.open()
+        try:
+            self.destination.write(output)
+        finally:
+            if self.autoclose:
+                self.close()
+        return output
+
+    def close(self):
+        self.destination.close()
+        self.opened = None
+
+
+class StringInput(Input):
+
+    """
+    Direct string input.
+    """
+
+    default_source_path = '<string>'
+
+    def read(self):
+        """Decode and return the source string."""
+        return self.decode(self.source)
+
+
+class StringOutput(Output):
+
+    """
+    Direct string output.
+    """
+
+    default_destination_path = '<string>'
+
+    def write(self, data):
+        """Encode `data`, store it in `self.destination`, and return it."""
+        self.destination = self.encode(data)
+        return self.destination
+
+
+class NullInput(Input):
+
+    """
+    Degenerate input: read nothing.
+    """
+
+    default_source_path = 'null input'
+
+    def read(self):
+        """Return a null string."""
+        return u''
+
+
+class NullOutput(Output):
+
+    """
+    Degenerate output: write nothing.
+    """
+
+    default_destination_path = 'null output'
+
+    def write(self, data):
+        """Do nothing ([don't even] send data to the bit bucket)."""
+        pass
+
+
+class DocTreeInput(Input):
+
+    """
+    Adapter for document tree input.
+
+    The document tree must be passed in the ``source`` parameter.
+    """
+
+    default_source_path = 'doctree input'
+
+    def read(self):
+        """Return the document tree."""
+        return self.source
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    module = __import__(language_code, globals(), locals())
+    _languages[language_code] = module
+    return module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/af.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisasie',
+      'address': 'Adres',
+      'contact': 'Kontak',
+      'version': 'Weergawe',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Kopiereg',
+      'dedication': 'Opdrag',
+      'abstract': 'Opsomming',
+      'attention': 'Aandag!',
+      'caution': 'Wees versigtig!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Wenk',
+      'important': 'Belangrik',
+      'note': 'Nota',
+      'tip': 'Tip', # hint and tip both have the same translation: wenk
+      'warning': 'Waarskuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisasie': 'organization',
+      'adres': 'address',
+      'kontak': 'contact',
+      'weergawe': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'kopiereg': 'copyright',
+      'opdrag': 'dedication',
+      'opsomming': 'abstract'}
+"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ca.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autors',
+      'organization': u'Organitzaci\u00F3',
+      'address': u'Adre\u00E7a',
+      'contact': u'Contacte',
+      'version': u'Versi\u00F3',
+      'revision': u'Revisi\u00F3',
+      'status': u'Estat',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F2ria',
+      'abstract': u'Resum',
+      'attention': u'Atenci\u00F3!',
+      'caution': u'Compte!',
+      'danger': u'PERILL!',
+      'error': u'Error',
+      'hint': u'Suggeriment',
+      'important': u'Important',
+      'note': u'Nota',
+      'tip': u'Consell',
+      'warning': u'Av\u00EDs',
+      'contents': u'Contingut'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autors': 'authors',
+      u'organitzaci\u00F3': 'organization',
+      u'adre\u00E7a': 'address',
+      u'contacte': 'contact',
+      u'versi\u00F3': 'version',
+      u'revisi\u00F3': 'revision',
+      u'estat': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F2ria': 'dedication',
+      u'resum': 'abstract'}
+"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/cs.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Auto\u0159i',
+      'organization': u'Organizace',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verze',
+      'revision': u'Revize',
+      'status': u'Stav',
+      'date': u'Datum',
+      'copyright': u'Copyright',
+      'dedication': u'V\u011Bnov\u00E1n\u00ED',
+      'abstract': u'Abstrakt',
+      'attention': u'Pozor!',
+      'caution': u'Opatrn\u011B!',
+      'danger': u'!NEBEZPE\u010C\u00CD!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u016Fle\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varov\u00E1n\u00ED',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'auto\u0159i': 'authors',
+      u'organizace': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verze': 'version',
+      u'revize': 'revision',
+      u'stav': 'status',
+      u'datum': 'date',
+      u'copyright': 'copyright',
+      u'v\u011Bnov\u00E1n\u00ED': 'dedication',
+      u'abstrakt': 'abstract'}
+"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/de.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: de.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Gunnar Schwant <g.schwant@gmx.de>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author': 'Autor',
+    'authors': 'Autoren',
+    'organization': 'Organisation',
+    'address': 'Adresse',
+    'contact': 'Kontakt',
+    'version': 'Version',
+    'revision': 'Revision',
+    'status': 'Status',
+    'date': 'Datum',
+    'dedication': 'Widmung',
+    'copyright': 'Copyright',
+    'abstract': 'Zusammenfassung',
+    'attention': 'Achtung!',
+    'caution': 'Vorsicht!',
+    'danger': '!GEFAHR!',
+    'error': 'Fehler',
+    'hint': 'Hinweis',
+    'important': 'Wichtig',
+    'note': 'Bemerkung',
+    'tip': 'Tipp',
+    'warning': 'Warnung',
+    'contents': 'Inhalt'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    'autor': 'author',
+    'autoren': 'authors',
+    'organisation': 'organization',
+    'adresse': 'address',
+    'kontakt': 'contact',
+    'version': 'version',
+    'revision': 'revision',
+    'status': 'status',
+    'datum': 'date',
+    'copyright': 'copyright',
+    'widmung': 'dedication',
+    'zusammenfassung': 'abstract'}
+"""German (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/en.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Author',
+      'authors': 'Authors',
+      'organization': 'Organization',
+      'address': 'Address',
+      'contact': 'Contact',
+      'version': 'Version',
+      'revision': 'Revision',
+      'status': 'Status',
+      'date': 'Date',
+      'copyright': 'Copyright',
+      'dedication': 'Dedication',
+      'abstract': 'Abstract',
+      'attention': 'Attention!',
+      'caution': 'Caution!',
+      'danger': '!DANGER!',
+      'error': 'Error',
+      'hint': 'Hint',
+      'important': 'Important',
+      'note': 'Note',
+      'tip': 'Tip',
+      'warning': 'Warning',
+      'contents': 'Contents'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author': 'author',
+      'authors': 'authors',
+      'organization': 'organization',
+      'address': 'address',
+      'contact': 'contact',
+      'version': 'version',
+      'revision': 'revision',
+      'status': 'status',
+      'date': 'date',
+      'copyright': 'copyright',
+      'dedication': 'dedication',
+      'abstract': 'abstract'}
+"""English (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/eo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'A\u016dtoro',
+      'authors': u'A\u016dtoroj',
+      'organization': u'Organizo',
+      'address': u'Adreso',
+      'contact': u'Kontakto',
+      'version': u'Versio',
+      'revision': u'Revido',
+      'status': u'Stato',
+      'date': u'Dato',
+      # 'copyright': u'Kopirajto',
+      'copyright': u'A\u016dtorrajto',
+      'dedication': u'Dedi\u0109o',
+      'abstract': u'Resumo',
+      'attention': u'Atentu!',
+      'caution': u'Zorgu!',
+      'danger': u'DAN\u011cERO!',
+      'error': u'Eraro',
+      'hint': u'Spuro',
+      'important': u'Grava',
+      'note': u'Noto',
+      'tip': u'Helpeto',
+      'warning': u'Averto',
+      'contents': u'Enhavo'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'a\u016dtoro': 'author',
+      'a\u016dtoroj': 'authors',
+      'organizo': 'organization',
+      'adreso': 'address',
+      'kontakto': 'contact',
+      'versio': 'version',
+      'revido': 'revision',
+      'stato': 'status',
+      'dato': 'date',
+      'a\u016dtorrajto': 'copyright',
+      'dedi\u0109o': 'dedication',
+      'resumo': 'abstract'}
+"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/es.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4572 2006-05-25 20:48:37Z richieadler $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organizaci\u00f3n',
+      'address': u'Direcci\u00f3n',
+      'contact': u'Contacto',
+      'version': u'Versi\u00f3n',
+      'revision': u'Revisi\u00f3n',
+      'status': u'Estado',
+      'date': u'Fecha',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicatoria',
+      'abstract': u'Resumen',
+      'attention': u'\u00a1Atenci\u00f3n!',
+      'caution': u'\u00a1Precauci\u00f3n!',
+      'danger': u'\u00a1PELIGRO!',
+      'error': u'Error',
+      'hint': u'Sugerencia',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Consejo',
+      'warning': u'Advertencia',
+      'contents': u'Contenido'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organizaci\u00f3n': 'organization',
+      u'direcci\u00f3n': 'address',
+      u'contacto': 'contact',
+      u'versi\u00f3n': 'version',
+      u'revisi\u00f3n': 'revision',
+      u'estado': 'status',
+      u'fecha': 'date',
+      u'copyright': 'copyright',
+      u'dedicatoria': 'dedication',
+      u'resumen': 'abstract'}
+"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fi.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      u'author': u'Tekij\u00e4',
+      u'authors': u'Tekij\u00e4t',
+      u'organization': u'Yhteis\u00f6',
+      u'address': u'Osoite',
+      u'contact': u'Yhteystiedot',
+      u'version': u'Versio',
+      u'revision': u'Vedos',
+      u'status': u'Tila',
+      u'date': u'P\u00e4iv\u00e4ys',
+      u'copyright': u'Tekij\u00e4noikeudet',
+      u'dedication': u'Omistuskirjoitus',
+      u'abstract': u'Tiivistelm\u00e4',
+      u'attention': u'Huomio!',
+      u'caution': u'Varo!',
+      u'danger': u'!VAARA!',
+      u'error': u'Virhe',
+      u'hint': u'Vihje',
+      u'important': u'T\u00e4rke\u00e4\u00e4',
+      u'note': u'Huomautus',
+      u'tip': u'Neuvo',
+      u'warning': u'Varoitus',
+      u'contents': u'Sis\u00e4llys'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'tekij\u00e4': u'author',
+      u'tekij\u00e4t': u'authors',
+      u'yhteis\u00f6': u'organization',
+      u'osoite': u'address',
+      u'yhteystiedot': u'contact',
+      u'versio': u'version',
+      u'vedos': u'revision',
+      u'tila': u'status',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'tekij\u00e4noikeudet': u'copyright',
+      u'omistuskirjoitus': u'dedication',
+      u'tiivistelm\u00e4': u'abstract'}
+"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fr.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Stefane Fermigier <sf@fermigier.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'author': u'Auteur',
+      u'authors': u'Auteurs',
+      u'organization': u'Organisation',
+      u'address': u'Adresse',
+      u'contact': u'Contact',
+      u'version': u'Version',
+      u'revision': u'R\u00e9vision',
+      u'status': u'Statut',
+      u'date': u'Date',
+      u'copyright': u'Copyright',
+      u'dedication': u'D\u00e9dicace',
+      u'abstract': u'R\u00e9sum\u00e9',
+      u'attention': u'Attention!',
+      u'caution': u'Avertissement!',
+      u'danger': u'!DANGER!',
+      u'error': u'Erreur',
+      u'hint': u'Indication',
+      u'important': u'Important',
+      u'note': u'Note',
+      u'tip': u'Astuce',
+      u'warning': u'Avis',
+      u'contents': u'Sommaire'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'auteur': u'author',
+      u'auteurs': u'authors',
+      u'organisation': u'organization',
+      u'adresse': u'address',
+      u'contact': u'contact',
+      u'version': u'version',
+      u'r\u00e9vision': u'revision',
+      u'statut': u'status',
+      u'date': u'date',
+      u'copyright': u'copyright',
+      u'd\u00e9dicace': u'dedication',
+      u'r\u00e9sum\u00e9': u'abstract'}
+"""French (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/he.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Hebrew-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u05de\u05d7\u05d1\u05e8',
+      'authors': u'\u05de\u05d7\u05d1\u05e8\u05d9',
+      'organization': u'\u05d0\u05e8\u05d2\u05d5\u05df',
+      'address': u'\u05db\u05ea\u05d5\u05d1\u05ea',
+      'contact':  u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8',
+      'version': u'\u05d2\u05e8\u05e1\u05d4',
+      'revision': u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4',
+      'status': u'\u05e1\u05d8\u05d8\u05d5\u05e1',
+      'date': u'\u05ea\u05d0\u05e8\u05d9\u05da',
+      'copyright': u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea',
+      'dedication': u'\u05d4\u05e7\u05d3\u05e9\u05d4',
+      'abstract': u'\u05ea\u05e7\u05e6\u05d9\u05e8',
+      'attention': u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1',
+      'caution': u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea',
+      'danger': u'\u05e1\u05db\u05e0\u05d4',
+      'error': u'\u05e9\u05d2\u05d9\u05d0\u05d4' ,
+      'hint': u'\u05e8\u05de\u05d6',
+      'important': u'\u05d7\u05e9\u05d5\u05d1',
+      'note': u'\u05d4\u05e2\u05e8\u05d4',
+      'tip': u'\u05d8\u05d9\u05e4',
+      'warning': u'\u05d0\u05d6\u05d4\u05e8\u05d4',
+      'contents': u'\u05ea\u05d5\u05db\u05df'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'\u05de\u05d7\u05d1\u05e8': 'author',
+      u'\u05de\u05d7\u05d1\u05e8\u05d9': 'authors',
+      u'\u05d0\u05e8\u05d2\u05d5\u05df': 'organization',
+      u'\u05db\u05ea\u05d5\u05d1\u05ea': 'address',
+      u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8': 'contact',
+      u'\u05d2\u05e8\u05e1\u05d4': 'version',
+      u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4': 'revision',
+      u'\u05e1\u05d8\u05d8\u05d5\u05e1': 'status',
+      u'\u05ea\u05d0\u05e8\u05d9\u05da': 'date',
+      u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea': 'copyright',
+      u'\u05d4\u05e7\u05d3\u05e9\u05d4': 'dedication',
+      u'\u05ea\u05e7\u05e6\u05d9\u05e8': 'abstract'}
+"""Hebrew to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/it.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Nicola Larosa <docutils@tekNico.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Italian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Autore',
+      'authors': 'Autori',
+      'organization': 'Organizzazione',
+      'address': 'Indirizzo',
+      'contact': 'Contatti',
+      'version': 'Versione',
+      'revision': 'Revisione',
+      'status': 'Status',
+      'date': 'Data',
+      'copyright': 'Copyright',
+      'dedication': 'Dedica',
+      'abstract': 'Riassunto',
+      'attention': 'Attenzione!',
+      'caution': 'Cautela!',
+      'danger': '!PERICOLO!',
+      'error': 'Errore',
+      'hint': 'Suggerimento',
+      'important': 'Importante',
+      'note': 'Nota',
+      'tip': 'Consiglio',
+      'warning': 'Avvertenza',
+      'contents': 'Indice'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'autore': 'author',
+      'autori': 'authors',
+      'organizzazione': 'organization',
+      'indirizzo': 'address',
+      'contatto': 'contact',
+      'versione': 'version',
+      'revisione': 'revision',
+      'status': 'status',
+      'data': 'date',
+      'copyright': 'copyright',
+      'dedica': 'dedication',
+      'riassunto': 'abstract'}
+"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ja.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Hisashi Morita <hisashim@kt.rim.or.jp>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'著者',
+      'authors': u'著者',
+      'organization': u'組織',
+      'address': u'ä½æ‰€',
+      'contact': u'連絡先',
+      'version': u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
+      'revision': u'リビジョン',
+      'status': u'ステータス',
+      'date': u'日付',
+      'copyright': u'著作権',
+      'dedication': u'献辞',
+      'abstract': u'概è¦',
+      'attention': u'注目!',
+      'caution': u'注æ„!',
+      'danger': u'!å±é™º!',
+      'error': u'エラー',
+      'hint': u'ヒント',
+      'important': u'é‡è¦',
+      'note': u'備考',
+      'tip': u'通報',
+      'warning': u'警告',
+      'contents': u'目次'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'著者': 'author',
+      u' n/a': 'authors',
+      u'組織': 'organization',
+      u'ä½æ‰€': 'address',
+      u'連絡先': 'contact',
+      u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³': 'version',
+      u'リビジョン': 'revision',
+      u'ステータス': 'status',
+      u'日付': 'date',
+      u'著作権': 'copyright',
+      u'献辞': 'dedication',
+      u'概è¦': 'abstract'}
+"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/nl.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisatie',
+      'address': 'Adres',
+      'contact': 'Contact',
+      'version': 'Versie',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Copyright',
+      'dedication': 'Toewijding',
+      'abstract': 'Samenvatting',
+      'attention': 'Attentie!',
+      'caution': 'Let op!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Hint',
+      'important': 'Belangrijk',
+      'note': 'Opmerking',
+      'tip': 'Tip',
+      'warning': 'Waarschuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisatie': 'organization',
+      'adres': 'address',
+      'contact': 'contact',
+      'versie': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'copyright': 'copyright',
+      'toewijding': 'dedication',
+      'samenvatting': 'abstract'}
+"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,60 @@
+# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organiza\u00E7\u00E3o',
+      'address': u'Endere\u00E7o',
+      'contact': u'Contato',
+      'version': u'Vers\u00E3o',
+      'revision': u'Revis\u00E3o',
+      'status': u'Estado',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F3ria',
+      'abstract': u'Resumo',
+      'attention': u'Atten\u00E7\u00E3o!',
+      'caution': u'Cuidado!',
+      'danger': u'PERIGO!',
+      'error': u'Erro',
+      'hint': u'Sugest\u00E3o',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Dica',
+      'warning': u'Aviso',
+      'contents': u'Sum\u00E1rio'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organiza\u00E7\u00E3o': 'organization',
+      u'endere\u00E7o': 'address',
+      u'contato': 'contact',
+      u'vers\u00E3o': 'version',
+      u'revis\u00E3o': 'revision',
+      u'estado': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F3ria': 'dedication',
+      u'resumo': 'abstract'}
+"""Brazilian Portuguese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ru.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'abstract': u'\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f',
+      u'address': u'\u0410\u0434\u0440\u0435\u0441',
+      u'attention': u'\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!',
+      u'author': u'\u0410\u0432\u0442\u043e\u0440',
+      u'authors': u'\u0410\u0432\u0442\u043e\u0440\u044b',
+      u'caution': u'\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e!',
+      u'contact': u'\u041a\u043e\u043d\u0442\u0430\u043a\u0442',
+      u'contents':
+      u'\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435',
+      u'copyright': u'\u041f\u0440\u0430\u0432\u0430 '
+      u'\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f',
+      u'danger': u'\u041e\u041f\u0410\u0421\u041d\u041e!',
+      u'date': u'\u0414\u0430\u0442\u0430',
+      u'dedication':
+      u'\u041f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435',
+      u'error': u'\u041e\u0448\u0438\u0431\u043a\u0430',
+      u'hint': u'\u0421\u043e\u0432\u0435\u0442',
+      u'important': u'\u0412\u0430\u0436\u043d\u043e',
+      u'note': u'\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435',
+      u'organization':
+      u'\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f',
+      u'revision': u'\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f',
+      u'status': u'\u0421\u0442\u0430\u0442\u0443\u0441',
+      u'tip': u'\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430',
+      u'version': u'\u0412\u0435\u0440\u0441\u0438\u044f',
+      u'warning': u'\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436'
+      u'\u0434\u0435\u043d\u0438\u0435'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f': u'abstract',
+      u'\u0430\u0434\u0440\u0435\u0441': u'address',
+      u'\u0430\u0432\u0442\u043e\u0440': u'author',
+      u'\u0430\u0432\u0442\u043e\u0440\u044b': u'authors',
+      u'\u043a\u043e\u043d\u0442\u0430\u043a\u0442': u'contact',
+      u'\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u043f\u0438\u0440\u043e'
+      u'\u0432\u0430\u043d\u0438\u044f': u'copyright',
+      u'\u0434\u0430\u0442\u0430': u'date',
+      u'\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435':
+      u'dedication',
+      u'\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f':
+      u'organization',
+      u'\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f': u'revision',
+      u'\u0441\u0442\u0430\u0442\u0443\u0441': u'status',
+      u'\u0432\u0435\u0440\u0441\u0438\u044f': u'version'}
+"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators =  [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sk.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autori',
+      'organization': u'Organiz\u00E1cia',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verzia',
+      'revision': u'Rev\u00EDzia',
+      'status': u'Stav',
+      'date': u'D\u00E1tum',
+      'copyright': u'Copyright',
+      'dedication': u'Venovanie',
+      'abstract': u'Abstraktne',
+      'attention': u'Pozor!',
+      'caution': u'Opatrne!',
+      'danger': u'!NEBEZPE\u010cENSTVO!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u00F4le\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varovanie',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autori': 'authors',
+      u'organiz\u00E1cia': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verzia': 'version',
+      u'rev\u00EDzia': 'revision',
+      u'stav': 'status',
+      u'd\u00E1tum': 'date',
+      u'copyright': 'copyright',
+      u'venovanie': 'dedication',
+      u'abstraktne': 'abstract'}
+"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sv.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author':       u'F\u00f6rfattare',
+    'authors':      u'F\u00f6rfattare',
+    'organization': u'Organisation',
+    'address':      u'Adress',
+    'contact':      u'Kontakt',
+    'version':      u'Version',
+    'revision':     u'Revision',
+    'status':       u'Status',
+    'date':         u'Datum',
+    'copyright':    u'Copyright',
+    'dedication':   u'Dedikation',
+    'abstract':     u'Sammanfattning',
+    'attention':    u'Observera!',
+    'caution':      u'Varning!',
+    'danger':       u'FARA!',
+    'error':        u'Fel',
+    'hint':         u'V\u00e4gledning',
+    'important':    u'Viktigt',
+    'note':         u'Notera',
+    'tip':          u'Tips',
+    'warning':      u'Varning',
+    'contents':     u'Inneh\u00e5ll' }
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    # 'Author' and 'Authors' identical in Swedish; assume the plural:
+    u'f\u00f6rfattare': 'authors',
+    u' n/a':            'author',
+    u'organisation':    'organization',
+    u'adress':          'address',
+    u'kontakt':         'contact',
+    u'version':         'version',
+    u'revision':        'revision',
+    u'status':          'status',
+    u'datum':           'date',
+    u'copyright':       'copyright',
+    u'dedikation':      'dedication', 
+    u'sammanfattning':  'abstract' }
+"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Pan Junyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features
+of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'作者',
+      'authors': u'作者群',
+      'organization': u'组织',
+      'address': u'地å€',
+      'contact': u'è”ç³»',
+      'version': u'版本',
+      'revision': u'修订',
+      'status': u'状æ€',
+      'date': u'日期',
+      'copyright': u'版æƒ',
+      'dedication': u'献辞',
+      'abstract': u'摘è¦',
+      'attention': u'注æ„',
+      'caution': u'å°å¿ƒ',
+      'danger': u'å±é™©',
+      'error': u'错误',
+      'hint': u'æ示',
+      'important': u'é‡è¦',
+      'note': u'注解',
+      'tip': u'技巧',
+      'warning': u'警告',
+      'contents': u'目录',
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'作者': 'author',
+      u'作者群': 'authors',
+      u'组织': 'organization',
+      u'地å€': 'address',
+      u'è”ç³»': 'contact',
+      u'版本': 'version',
+      u'修订': 'revision',
+      u'状æ€': 'status',
+      u'时间': 'date',
+      u'版æƒ': 'copyright',
+      u'献辞': 'dedication',
+      u'摘è¦': 'abstract'}
+"""Simplified Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # 'ï¼›'
+                     u'\uff0c', # ','
+                     u'\u3001', # 'ã€'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Joe YS Jaw <joeysj@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u4f5c\u8005', # '作者' <-- Chinese word
+      'authors': u'\u4f5c\u8005\u7fa4', # '作者群',
+      'organization': u'\u7d44\u7e54', # '組織',
+      'address': u'\u5730\u5740', # '地å€',
+      'contact': u'\u9023\u7d61', # '連絡',
+      'version': u'\u7248\u672c', # '版本',
+      'revision': u'\u4fee\u8a02', # '修訂',
+      'status': u'\u72c0\u614b', # '狀態',
+      'date': u'\u65e5\u671f', # '日期',
+      'copyright': u'\u7248\u6b0a', # '版權',
+      'dedication': u'\u984c\u737b', # 'é¡Œç»',
+      'abstract': u'\u6458\u8981', # '摘è¦',
+      'attention': u'\u6ce8\u610f\uff01', # '注æ„ï¼',
+      'caution': u'\u5c0f\u5fc3\uff01', # 'å°å¿ƒï¼',
+      'danger': u'\uff01\u5371\u96aa\uff01', # 'ï¼å±éšªï¼',
+      'error': u'\u932f\u8aa4', # '錯誤',
+      'hint': u'\u63d0\u793a', # 'æ示',
+      'important': u'\u91cd\u8981', # '注æ„ï¼',
+      'note': u'\u8a3b\u91cb', # '註釋',
+      'tip': u'\u79d8\u8a23', # '秘訣',
+      'warning': u'\u8b66\u544a', # '警告',
+      'contents': u'\u76ee\u9304' # '目錄'
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author (translation required)': 'author',
+      'authors (translation required)': 'authors',
+      'organization (translation required)': 'organization',
+      'address (translation required)': 'address',
+      'contact (translation required)': 'contact',
+      'version (translation required)': 'version',
+      'revision (translation required)': 'revision',
+      'status (translation required)': 'status',
+      'date (translation required)': 'date',
+      'copyright (translation required)': 'copyright',
+      'dedication (translation required)': 'dedication',
+      'abstract (translation required)': 'abstract'}
+"""Traditional Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # 'ï¼›'
+                     u'\uff0c', # ','
+                     u'\u3001', # 'ã€'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/nodes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1801 @@
+# $Id: nodes.py 5033 2007-03-21 19:51:22Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils document tree element class library.
+
+Classes in CamelCase are abstract base classes or auxiliary classes. The one
+exception is `Text`, for a text (PCDATA) node; uppercase is used to
+differentiate from element classes.  Classes in lower_case_with_underscores
+are element classes, matching the XML element generic identifiers in the DTD_.
+
+The position of each node (the level at which it can occur) is significant and
+is represented by abstract base classes (`Root`, `Structural`, `Body`,
+`Inline`, etc.).  Certain transformations will be easier because we can use
+``isinstance(node, base_class)`` to determine the position of the node in the
+hierarchy.
+
+.. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import warnings
+from types import IntType, SliceType, StringType, UnicodeType, \
+     TupleType, ListType, ClassType, TypeType
+from UserString import UserString
+
+
+# ==============================
+#  Functional Node Base Classes
+# ==============================
+
+class Node:
+
+    """Abstract base class of nodes in a document tree."""
+
+    parent = None
+    """Back-reference to the Node immediately containing this Node."""
+
+    document = None
+    """The `document` node at the root of the tree containing this Node."""
+
+    source = None
+    """Path or description of the input source which generated this Node."""
+
+    line = None
+    """The line number (1-based) of the beginning of this Node in `source`."""
+
+    def __nonzero__(self):
+        """
+        Node instances are always true, even if they're empty.  A node is more
+        than a simple container.  Its boolean "truth" does not depend on
+        having one or more subnodes in the doctree.
+
+        Use `len()` to check node length.  Use `None` to represent a boolean
+        false value.
+        """
+        return 1
+
+    def __str__(self):
+        return self.__unicode__().encode('raw_unicode_escape')
+
+    def __unicode__(self):
+        # Override in subclass.
+        raise NotImplementedError
+
+    def asdom(self, dom=None):
+        """Return a DOM **fragment** representation of this Node."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        return self._dom_node(domroot)
+
+    def pformat(self, indent='    ', level=0):
+        """
+        Return an indented pseudo-XML representation, for test purposes.
+
+        Override in subclasses.
+        """
+        raise NotImplementedError
+
+    def copy(self):
+        """Return a copy of self."""
+        raise NotImplementedError
+
+    def deepcopy(self):
+        """Return a deep copy of self (also copying children)."""
+        raise NotImplementedError
+
+    def setup_child(self, child):
+        child.parent = self
+        if self.document:
+            child.document = self.document
+            if child.source is None:
+                child.source = self.document.current_source
+            if child.line is None:
+                child.line = self.document.current_line
+
+    def walk(self, visitor):
+        """
+        Traverse a tree of `Node` objects, calling the
+        `dispatch_visit()` method of `visitor` when entering each
+        node.  (The `walkabout()` method is similar, except it also
+        calls the `dispatch_departure()` method before exiting each
+        node.)
+
+        This tree traversal supports limited in-place tree
+        modifications.  Replacing one node with one or more nodes is
+        OK, as is removing an element.  However, if the node removed
+        or replaced occurs after the current node, the old node will
+        still be traversed, and any new nodes will not.
+
+        Within ``visit`` methods (and ``depart`` methods for
+        `walkabout()`), `TreePruningException` subclasses may be raised
+        (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` implementation for each `Node` subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        stop = 0
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walk calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except (SkipChildren, SkipNode):
+                return stop
+            except SkipDeparture:           # not applicable; ignore
+                pass
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walk(visitor):
+                        stop = 1
+                        break
+            except SkipSiblings:
+                pass
+        except StopTraversal:
+            stop = 1
+        return stop
+
+    def walkabout(self, visitor):
+        """
+        Perform a tree traversal similarly to `Node.walk()` (which
+        see), except also call the `dispatch_departure()` method
+        before exiting each node.
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` and ``depart`` implementation for each `Node`
+        subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        call_depart = 1
+        stop = 0
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except SkipNode:
+                return stop
+            except SkipDeparture:
+                call_depart = 0
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walkabout(visitor):
+                        stop = 1
+                        break
+            except SkipSiblings:
+                pass
+        except SkipChildren:
+            pass
+        except StopTraversal:
+            stop = 1
+        if call_depart:
+            visitor.document.reporter.debug(
+                'docutils.nodes.Node.walkabout calling dispatch_departure '
+                'for %s' % self.__class__.__name__)
+            visitor.dispatch_departure(self)
+        return stop
+
+    def traverse(self, condition=None,
+                 include_self=1, descend=1, siblings=0, ascend=0):
+        """
+        Return an iterable containing
+
+        * self (if include_self is true)
+        * all descendants in tree traversal order (if descend is true)
+        * all siblings (if siblings is true) and their descendants (if
+          also descend is true)
+        * the siblings of the parent (if ascend is true) and their
+          descendants (if also descend is true), and so on
+
+        If `condition` is not None, the iterable contains only nodes
+        for which ``condition(node)`` is true.  If `condition` is a
+        node class ``cls``, it is equivalent to a function consisting
+        of ``return isinstance(node, cls)``.
+
+        If ascend is true, assume siblings to be true as well.
+
+        For example, given the following tree::
+
+            <paragraph>
+                <emphasis>      <--- emphasis.traverse() and
+                    <strong>    <--- strong.traverse() are called.
+                        Foo
+                    Bar
+                <reference name="Baz" refid="baz">
+                    Baz
+
+        Then list(emphasis.traverse()) equals ::
+
+            [<emphasis>, <strong>, <#text: Foo>, <#text: Bar>]
+
+        and list(strong.traverse(ascend=1)) equals ::
+
+            [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>]
+        """
+        r = []
+        if ascend:
+            siblings=1
+        # Check if `condition` is a class (check for TypeType for Python
+        # implementations that use only new-style classes, like PyPy).
+        if isinstance(condition, (ClassType, TypeType)):
+            node_class = condition
+            def condition(node, node_class=node_class):
+                return isinstance(node, node_class)
+        if include_self and (condition is None or condition(self)):
+            r.append(self)
+        if descend and len(self.children):
+            for child in self:
+                r.extend(child.traverse(
+                    include_self=1, descend=1, siblings=0, ascend=0,
+                    condition=condition))
+        if siblings or ascend:
+            node = self
+            while node.parent:
+                index = node.parent.index(node)
+                for sibling in node.parent[index+1:]:
+                    r.extend(sibling.traverse(include_self=1, descend=descend,
+                                              siblings=0, ascend=0,
+                                              condition=condition))
+                if not ascend:
+                    break
+                else:
+                    node = node.parent
+        return r
+
+    def next_node(self, condition=None,
+                  include_self=0, descend=1, siblings=0, ascend=0):
+        """
+        Return the first node in the iterable returned by traverse(),
+        or None if the iterable is empty.
+
+        Parameter list is the same as of traverse.  Note that
+        include_self defaults to 0, though.
+        """
+        iterable = self.traverse(condition=condition,
+                                 include_self=include_self, descend=descend,
+                                 siblings=siblings, ascend=ascend)
+        try:
+            return iterable[0]
+        except IndexError:
+            return None
+
+class Text(Node, UserString):
+
+    """
+    Instances are terminal nodes (leaves) containing text only; no child
+    nodes or attributes.  Initialize by passing a string to the constructor.
+    Access the text itself with the `astext` method.
+    """
+
+    tagname = '#text'
+
+    children = ()
+    """Text nodes have no children, and cannot have children."""
+
+    def __init__(self, data, rawsource=''):
+        UserString.__init__(self, data)
+
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+    def __repr__(self):
+        data = repr(self.data)
+        if len(data) > 70:
+            data = repr(self.data[:64] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def __len__(self):
+        return len(self.data)
+
+    def shortrepr(self):
+        data = repr(self.data)
+        if len(data) > 20:
+            data = repr(self.data[:16] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def _dom_node(self, domroot):
+        return domroot.createTextNode(self.data)
+
+    def astext(self):
+        return self.data
+
+    def __unicode__(self):
+        return self.data
+
+    def copy(self):
+        return self.__class__(self.data)
+
+    def deepcopy(self):
+        return self.copy()
+
+    def pformat(self, indent='    ', level=0):
+        result = []
+        indent = indent * level
+        for line in self.data.splitlines():
+            result.append(indent + line + '\n')
+        return ''.join(result)
+
+
+class Element(Node):
+
+    """
+    `Element` is the superclass to all specific elements.
+
+    Elements contain attributes and child nodes.  Elements emulate
+    dictionaries for attributes, indexing by attribute name (a string).  To
+    set the attribute 'att' to 'value', do::
+
+        element['att'] = 'value'
+
+    There are two special attributes: 'ids' and 'names'.  Both are
+    lists of unique identifiers, and names serve as human interfaces
+    to IDs.  Names are case- and whitespace-normalized (see the
+    fully_normalize_name() function), and IDs conform to the regular
+    expression ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function).
+
+    Elements also emulate lists for child nodes (element nodes and/or text
+    nodes), indexing by integer.  To get the first child node, use::
+
+        element[0]
+
+    Elements may be constructed using the ``+=`` operator.  To add one new
+    child node to element, do::
+
+        element += node
+
+    This is equivalent to ``element.append(node)``.
+
+    To add a list of multiple child nodes at once, use the same ``+=``
+    operator::
+
+        element += [node1, node2]
+
+    This is equivalent to ``element.extend([node1, node2])``.
+    """
+
+    list_attributes = ('ids', 'classes', 'names', 'dupnames', 'backrefs')
+    """List attributes, automatically initialized to empty lists for
+    all nodes."""
+
+    tagname = None
+    """The element generic identifier. If None, it is set as an instance
+    attribute to the name of the class."""
+
+    child_text_separator = '\n\n'
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', *children, **attributes):
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+        self.children = []
+        """List of child nodes (elements and/or `Text`)."""
+
+        self.extend(children)           # maintain parent info
+
+        self.attributes = {}
+        """Dictionary of attribute {name: value}."""
+
+        # Initialize list attributes.
+        for att in self.list_attributes:
+            self.attributes[att] = []
+
+        for att, value in attributes.items():
+            att = att.lower()
+            if att in self.list_attributes:
+                # mutable list; make a copy for this node
+                self.attributes[att] = value[:]
+            else:
+                self.attributes[att] = value
+
+        if self.tagname is None:
+            self.tagname = self.__class__.__name__
+
+    def _dom_node(self, domroot):
+        element = domroot.createElement(self.tagname)
+        for attribute, value in self.attlist():
+            if isinstance(value, ListType):
+                value = ' '.join([serial_escape('%s' % v) for v in value])
+            element.setAttribute(attribute, '%s' % value)
+        for child in self.children:
+            element.appendChild(child._dom_node(domroot))
+        return element
+
+    def __repr__(self):
+        data = ''
+        for c in self.children:
+            data += c.shortrepr()
+            if len(data) > 60:
+                data = data[:56] + ' ...'
+                break
+        if self['names']:
+            return '<%s "%s": %s>' % (self.__class__.__name__,
+                                      '; '.join(self['names']), data)
+        else:
+            return '<%s: %s>' % (self.__class__.__name__, data)
+
+    def shortrepr(self):
+        if self['names']:
+            return '<%s "%s"...>' % (self.__class__.__name__,
+                                     '; '.join(self['names']))
+        else:
+            return '<%s...>' % self.tagname
+
+    def __unicode__(self):
+        if self.children:
+            return u'%s%s%s' % (self.starttag(),
+                                ''.join([unicode(c) for c in self.children]),
+                                self.endtag())
+        else:
+            return self.emptytag()
+
+    def starttag(self):
+        parts = [self.tagname]
+        for name, value in self.attlist():
+            if value is None:           # boolean attribute
+                parts.append(name)
+            elif isinstance(value, ListType):
+                values = [serial_escape('%s' % v) for v in value]
+                parts.append('%s="%s"' % (name, ' '.join(values)))
+            else:
+                parts.append('%s="%s"' % (name, value))
+        return '<%s>' % ' '.join(parts)
+
+    def endtag(self):
+        return '</%s>' % self.tagname
+
+    def emptytag(self):
+        return u'<%s/>' % ' '.join([self.tagname] +
+                                    ['%s="%s"' % (n, v)
+                                     for n, v in self.attlist()])
+
+    def __len__(self):
+        return len(self.children)
+
+    def __getitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            return self.attributes[key]
+        elif isinstance(key, IntType):
+            return self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            return self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __setitem__(self, key, item):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            self.attributes[str(key)] = item
+        elif isinstance(key, IntType):
+            self.setup_child(item)
+            self.children[key] = item
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            for node in item:
+                self.setup_child(node)
+            self.children[key.start:key.stop] = item
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __delitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            del self.attributes[key]
+        elif isinstance(key, IntType):
+            del self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            del self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a simple '
+                              'slice, or an attribute name string')
+
+    def __add__(self, other):
+        return self.children + other
+
+    def __radd__(self, other):
+        return other + self.children
+
+    def __iadd__(self, other):
+        """Append a node or a list of nodes to `self.children`."""
+        if isinstance(other, Node):
+            self.append(other)
+        elif other is not None:
+            self.extend(other)
+        return self
+
+    def astext(self):
+        return self.child_text_separator.join(
+              [child.astext() for child in self.children])
+
+    def non_default_attributes(self):
+        atts = {}
+        for key, value in self.attributes.items():
+            if self.is_not_default(key):
+                atts[key] = value
+        return atts
+
+    def attlist(self):
+        attlist = self.non_default_attributes().items()
+        attlist.sort()
+        return attlist
+
+    def get(self, key, failobj=None):
+        return self.attributes.get(key, failobj)
+
+    def hasattr(self, attr):
+        return self.attributes.has_key(attr)
+
+    def delattr(self, attr):
+        if self.attributes.has_key(attr):
+            del self.attributes[attr]
+
+    def setdefault(self, key, failobj=None):
+        return self.attributes.setdefault(key, failobj)
+
+    has_key = hasattr
+
+    def append(self, item):
+        self.setup_child(item)
+        self.children.append(item)
+
+    def extend(self, item):
+        for node in item:
+            self.append(node)
+
+    def insert(self, index, item):
+        if isinstance(item, Node):
+            self.setup_child(item)
+            self.children.insert(index, item)
+        elif item is not None:
+            self[index:index] = item
+
+    def pop(self, i=-1):
+        return self.children.pop(i)
+
+    def remove(self, item):
+        self.children.remove(item)
+
+    def index(self, item):
+        return self.children.index(item)
+
+    def is_not_default(self, key):
+        if self[key] == [] and key in self.list_attributes:
+            return 0
+        else:
+            return 1
+
+    def update_basic_atts(self, dict):
+        """
+        Update basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') from node or dictionary `dict`.
+        """
+        if isinstance(dict, Node):
+            dict = dict.attributes
+        for att in ('ids', 'classes', 'names', 'dupnames'):
+            for value in dict.get(att, []):
+                if not value in self[att]:
+                    self[att].append(value)
+
+    def clear(self):
+        self.children = []
+
+    def replace(self, old, new):
+        """Replace one child `Node` with another child or children."""
+        index = self.index(old)
+        if isinstance(new, Node):
+            self.setup_child(new)
+            self[index] = new
+        elif new is not None:
+            self[index:index+1] = new
+
+    def replace_self(self, new):
+        """
+        Replace `self` node with `new`, where `new` is a node or a
+        list of nodes.
+        """
+        update = new
+        if not isinstance(new, Node):
+            # `new` is a list; update first child.
+            try:
+                update = new[0]
+            except IndexError:
+                update = None
+        if isinstance(update, Element):
+            update.update_basic_atts(self)
+        else:
+            # `update` is a Text node or `new` is an empty list.
+            # Assert that we aren't losing any attributes.
+            for att in ('ids', 'names', 'classes', 'dupnames'):
+                assert not self[att], \
+                       'Losing "%s" attribute: %s' % (att, self[att])
+        self.parent.replace(self, new)
+
+    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
+        """
+        Return the index of the first child whose class exactly matches.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
+          classes. If a tuple, any of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self[index], c):
+                    return index
+        return None
+
+    def first_child_not_matching_class(self, childclass, start=0,
+                                       end=sys.maxint):
+        """
+        Return the index of the first child whose class does *not* match.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
+          classes. If a tuple, none of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self.children[index], c):
+                    break
+            else:
+                return index
+        return None
+
+    def pformat(self, indent='    ', level=0):
+        return ''.join(['%s%s\n' % (indent * level, self.starttag())] +
+                       [child.pformat(indent, level+1)
+                        for child in self.children])
+
+    def copy(self):
+        return self.__class__(**self.attributes)
+
+    def deepcopy(self):
+        copy = self.copy()
+        copy.extend([child.deepcopy() for child in self.children])
+        return copy
+
+    def set_class(self, name):
+        """Add a new class to the "classes" attribute."""
+        warnings.warn('docutils.nodes.Element.set_class deprecated; '
+                      "append to Element['classes'] list attribute directly",
+                      DeprecationWarning, stacklevel=2)
+        assert ' ' not in name
+        self['classes'].append(name.lower())
+
+    def note_referenced_by(self, name=None, id=None):
+        """Note that this Element has been referenced by its name
+        `name` or id `id`."""
+        self.referenced = 1
+        # Element.expect_referenced_by_* dictionaries map names or ids
+        # to nodes whose ``referenced`` attribute is set to true as
+        # soon as this node is referenced by the given name or id.
+        # Needed for target propagation.
+        by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
+        by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
+        if by_name:
+            assert name is not None
+            by_name.referenced = 1
+        if by_id:
+            assert id is not None
+            by_id.referenced = 1
+
+
+class TextElement(Element):
+
+    """
+    An element which directly contains text.
+
+    Its children are all `Text` or `Inline` subclass nodes.  You can
+    check whether an element's context is inline simply by checking whether
+    its immediate parent is a `TextElement` instance (including subclasses).
+    This is handy for nodes like `image` that can appear both inline and as
+    standalone body elements.
+
+    If passing children to `__init__()`, make sure to set `text` to
+    ``''`` or some other suitable value.
+    """
+
+    child_text_separator = ''
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        if text != '':
+            textnode = Text(text)
+            Element.__init__(self, rawsource, textnode, *children,
+                              **attributes)
+        else:
+            Element.__init__(self, rawsource, *children, **attributes)
+
+
+class FixedTextElement(TextElement):
+
+    """An element which directly contains preformatted text."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        TextElement.__init__(self, rawsource, text, *children, **attributes)
+        self.attributes['xml:space'] = 'preserve'
+
+
+# ========
+#  Mixins
+# ========
+
+class Resolvable:
+
+    resolved = 0
+
+
+class BackLinkable:
+
+    def add_backref(self, refid):
+        self['backrefs'].append(refid)
+
+
+# ====================
+#  Element Categories
+# ====================
+
+class Root: pass
+
+class Titular: pass
+
+class PreBibliographic:
+    """Category of Node which may occur before Bibliographic Nodes."""
+
+class Bibliographic: pass
+
+class Decorative(PreBibliographic): pass
+
+class Structural: pass
+
+class Body: pass
+
+class General(Body): pass
+
+class Sequential(Body):
+    """List-like elements."""
+
+class Admonition(Body): pass
+
+class Special(Body):
+    """Special internal body elements."""
+
+class Invisible(PreBibliographic):
+    """Internal elements that don't appear in output."""
+
+class Part: pass
+
+class Inline: pass
+
+class Referential(Resolvable): pass
+
+
+class Targetable(Resolvable):
+
+    referenced = 0
+
+    indirect_reference_name = None
+    """Holds the whitespace_normalized_name (contains mixed case) of a target.
+    Required for MoinMoin/reST compatibility."""
+
+
+class Labeled:
+    """Contains a `label` as its first element."""
+
+
+# ==============
+#  Root Element
+# ==============
+
+class document(Root, Structural, Element):
+
+    """
+    The document root element.
+
+    Do not instantiate this class directly; use
+    `docutils.utils.new_document()` instead.
+    """
+
+    def __init__(self, settings, reporter, *args, **kwargs):
+        Element.__init__(self, *args, **kwargs)
+
+        self.current_source = None
+        """Path to or description of the input source being processed."""
+
+        self.current_line = None
+        """Line number (1-based) of `current_source`."""
+
+        self.settings = settings
+        """Runtime settings data record."""
+
+        self.reporter = reporter
+        """System message generator."""
+
+        self.indirect_targets = []
+        """List of indirect target nodes."""
+
+        self.substitution_defs = {}
+        """Mapping of substitution names to substitution_definition nodes."""
+
+        self.substitution_names = {}
+        """Mapping of case-normalized substitution names to case-sensitive
+        names."""
+
+        self.refnames = {}
+        """Mapping of names to lists of referencing nodes."""
+
+        self.refids = {}
+        """Mapping of ids to lists of referencing nodes."""
+
+        self.nameids = {}
+        """Mapping of names to unique id's."""
+
+        self.nametypes = {}
+        """Mapping of names to hyperlink type (boolean: True => explicit,
+        False => implicit."""
+
+        self.ids = {}
+        """Mapping of ids to nodes."""
+
+        self.footnote_refs = {}
+        """Mapping of footnote labels to lists of footnote_reference nodes."""
+
+        self.citation_refs = {}
+        """Mapping of citation labels to lists of citation_reference nodes."""
+
+        self.autofootnotes = []
+        """List of auto-numbered footnote nodes."""
+
+        self.autofootnote_refs = []
+        """List of auto-numbered footnote_reference nodes."""
+
+        self.symbol_footnotes = []
+        """List of symbol footnote nodes."""
+
+        self.symbol_footnote_refs = []
+        """List of symbol footnote_reference nodes."""
+
+        self.footnotes = []
+        """List of manually-numbered footnote nodes."""
+
+        self.citations = []
+        """List of citation nodes."""
+
+        self.autofootnote_start = 1
+        """Initial auto-numbered footnote number."""
+
+        self.symbol_footnote_start = 0
+        """Initial symbol footnote symbol index."""
+
+        self.id_start = 1
+        """Initial ID number."""
+
+        self.parse_messages = []
+        """System messages generated while parsing."""
+
+        self.transform_messages = []
+        """System messages generated while applying transforms."""
+
+        import docutils.transforms
+        self.transformer = docutils.transforms.Transformer(self)
+        """Storage for transforms to be applied to this document."""
+
+        self.decoration = None
+        """Document's `decoration` node."""
+
+        self.document = self
+
+    def __getstate__(self):
+        """
+        Return dict with unpicklable references removed.
+        """
+        state = self.__dict__.copy()
+        state['reporter'] = None
+        state['transformer'] = None
+        return state
+
+    def asdom(self, dom=None):
+        """Return a DOM representation of this document."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        domroot.appendChild(self._dom_node(domroot))
+        return domroot
+
+    def set_id(self, node, msgnode=None):
+        for id in node['ids']:
+            if self.ids.has_key(id) and self.ids[id] is not node:
+                msg = self.reporter.severe('Duplicate ID: "%s".' % id)
+                if msgnode != None:
+                    msgnode += msg
+        if not node['ids']:
+            for name in node['names']:
+                id = self.settings.id_prefix + make_id(name)
+                if id and not self.ids.has_key(id):
+                    break
+            else:
+                id = ''
+                while not id or self.ids.has_key(id):
+                    id = (self.settings.id_prefix +
+                          self.settings.auto_id_prefix + str(self.id_start))
+                    self.id_start += 1
+            node['ids'].append(id)
+        self.ids[id] = node
+        return id
+
+    def set_name_id_map(self, node, id, msgnode=None, explicit=None):
+        """
+        `self.nameids` maps names to IDs, while `self.nametypes` maps names to
+        booleans representing hyperlink type (True==explicit,
+        False==implicit).  This method updates the mappings.
+
+        The following state transition table shows how `self.nameids` ("ids")
+        and `self.nametypes` ("types") change with new input (a call to this
+        method), and what actions are performed ("implicit"-type system
+        messages are INFO/1, and "explicit"-type system messages are ERROR/3):
+
+        ====  =====  ========  ========  =======  ====  =====  =====
+         Old State    Input          Action        New State   Notes
+        -----------  --------  -----------------  -----------  -----
+        ids   types  new type  sys.msg.  dupname  ids   types
+        ====  =====  ========  ========  =======  ====  =====  =====
+        -     -      explicit  -         -        new   True
+        -     -      implicit  -         -        new   False
+        None  False  explicit  -         -        new   True
+        old   False  explicit  implicit  old      new   True
+        None  True   explicit  explicit  new      None  True
+        old   True   explicit  explicit  new,old  None  True   [#]_
+        None  False  implicit  implicit  new      None  False
+        old   False  implicit  implicit  new,old  None  False
+        None  True   implicit  implicit  new      None  True
+        old   True   implicit  implicit  new      old   True
+        ====  =====  ========  ========  =======  ====  =====  =====
+
+        .. [#] Do not clear the name-to-id map or invalidate the old target if
+           both old and new targets are external and refer to identical URIs.
+           The new target is invalidated regardless.
+        """
+        for name in node['names']:
+            if self.nameids.has_key(name):
+                self.set_duplicate_name_id(node, id, name, msgnode, explicit)
+            else:
+                self.nameids[name] = id
+                self.nametypes[name] = explicit
+
+    def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
+        old_id = self.nameids[name]
+        old_explicit = self.nametypes[name]
+        self.nametypes[name] = old_explicit or explicit
+        if explicit:
+            if old_explicit:
+                level = 2
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    if node.has_key('refuri'):
+                        refuri = node['refuri']
+                        if old_node['names'] \
+                               and old_node.has_key('refuri') \
+                               and old_node['refuri'] == refuri:
+                            level = 1   # just inform if refuri's identical
+                    if level > 1:
+                        dupname(old_node, name)
+                        self.nameids[name] = None
+                msg = self.reporter.system_message(
+                    level, 'Duplicate explicit target name: "%s".' % name,
+                    backrefs=[id], base_node=node)
+                if msgnode != None:
+                    msgnode += msg
+                dupname(node, name)
+            else:
+                self.nameids[name] = id
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    dupname(old_node, name)
+        else:
+            if old_id is not None and not old_explicit:
+                self.nameids[name] = None
+                old_node = self.ids[old_id]
+                dupname(old_node, name)
+            dupname(node, name)
+        if not explicit or (not old_explicit and old_id is not None):
+            msg = self.reporter.info(
+                'Duplicate implicit target name: "%s".' % name,
+                backrefs=[id], base_node=node)
+            if msgnode != None:
+                msgnode += msg
+
+    def has_name(self, name):
+        return self.nameids.has_key(name)
+
+    # "note" here is an imperative verb: "take note of".
+    def note_implicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=None)
+
+    def note_explicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=1)
+
+    def note_refname(self, node):
+        self.refnames.setdefault(node['refname'], []).append(node)
+
+    def note_refid(self, node):
+        self.refids.setdefault(node['refid'], []).append(node)
+
+    def note_indirect_target(self, target):
+        self.indirect_targets.append(target)
+        if target['names']:
+            self.note_refname(target)
+
+    def note_anonymous_target(self, target):
+        self.set_id(target)
+
+    def note_autofootnote(self, footnote):
+        self.set_id(footnote)
+        self.autofootnotes.append(footnote)
+
+    def note_autofootnote_ref(self, ref):
+        self.set_id(ref)
+        self.autofootnote_refs.append(ref)
+
+    def note_symbol_footnote(self, footnote):
+        self.set_id(footnote)
+        self.symbol_footnotes.append(footnote)
+
+    def note_symbol_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.symbol_footnote_refs.append(ref)
+
+    def note_footnote(self, footnote):
+        self.set_id(footnote)
+        self.footnotes.append(footnote)
+
+    def note_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.footnote_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_citation(self, citation):
+        self.citations.append(citation)
+
+    def note_citation_ref(self, ref):
+        self.set_id(ref)
+        self.citation_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_substitution_def(self, subdef, def_name, msgnode=None):
+        name = whitespace_normalize_name(def_name)
+        if self.substitution_defs.has_key(name):
+            msg = self.reporter.error(
+                  'Duplicate substitution definition name: "%s".' % name,
+                  base_node=subdef)
+            if msgnode != None:
+                msgnode += msg
+            oldnode = self.substitution_defs[name]
+            dupname(oldnode, name)
+        # keep only the last definition:
+        self.substitution_defs[name] = subdef
+        # case-insensitive mapping:
+        self.substitution_names[fully_normalize_name(name)] = name
+
+    def note_substitution_ref(self, subref, refname):
+        subref['refname'] = whitespace_normalize_name(refname)
+
+    def note_pending(self, pending, priority=None):
+        self.transformer.add_pending(pending, priority)
+
+    def note_parse_message(self, message):
+        self.parse_messages.append(message)
+
+    def note_transform_message(self, message):
+        self.transform_messages.append(message)
+
+    def note_source(self, source, offset):
+        self.current_source = source
+        if offset is None:
+            self.current_line = offset
+        else:
+            self.current_line = offset + 1
+
+    def copy(self):
+        return self.__class__(self.settings, self.reporter,
+                              **self.attributes)
+
+    def get_decoration(self):
+        if not self.decoration:
+            self.decoration = decoration()
+            index = self.first_child_not_matching_class(Titular)
+            if index is None:
+                self.append(self.decoration)
+            else:
+                self.insert(index, self.decoration)
+        return self.decoration
+
+
+# ================
+#  Title Elements
+# ================
+
+class title(Titular, PreBibliographic, TextElement): pass
+class subtitle(Titular, PreBibliographic, TextElement): pass
+class rubric(Titular, TextElement): pass
+
+
+# ========================
+#  Bibliographic Elements
+# ========================
+
+class docinfo(Bibliographic, Element): pass
+class author(Bibliographic, TextElement): pass
+class authors(Bibliographic, Element): pass
+class organization(Bibliographic, TextElement): pass
+class address(Bibliographic, FixedTextElement): pass
+class contact(Bibliographic, TextElement): pass
+class version(Bibliographic, TextElement): pass
+class revision(Bibliographic, TextElement): pass
+class status(Bibliographic, TextElement): pass
+class date(Bibliographic, TextElement): pass
+class copyright(Bibliographic, TextElement): pass
+
+
+# =====================
+#  Decorative Elements
+# =====================
+
+class decoration(Decorative, Element):
+
+    def get_header(self):
+        if not len(self.children) or not isinstance(self.children[0], header):
+            self.insert(0, header())
+        return self.children[0]
+
+    def get_footer(self):
+        if not len(self.children) or not isinstance(self.children[-1], footer):
+            self.append(footer())
+        return self.children[-1]
+
+
+class header(Decorative, Element): pass
+class footer(Decorative, Element): pass
+
+
+# =====================
+#  Structural Elements
+# =====================
+
+class section(Structural, Element): pass
+
+
+class topic(Structural, Element):
+
+    """
+    Topics are terminal, "leaf" mini-sections, like block quotes with titles,
+    or textual figures.  A topic is just like a section, except that it has no
+    subsections, and it doesn't have to conform to section placement rules.
+
+    Topics are allowed wherever body elements (list, table, etc.) are allowed,
+    but only at the top level of a section or document.  Topics cannot nest
+    inside topics, sidebars, or body elements; you can't have a topic inside a
+    table, list, block quote, etc.
+    """
+
+
+class sidebar(Structural, Element):
+
+    """
+    Sidebars are like miniature, parallel documents that occur inside other
+    documents, providing related or reference material.  A sidebar is
+    typically offset by a border and "floats" to the side of the page; the
+    document's main text may flow around it.  Sidebars can also be likened to
+    super-footnotes; their content is outside of the flow of the document's
+    main text.
+
+    Sidebars are allowed wherever body elements (list, table, etc.) are
+    allowed, but only at the top level of a section or document.  Sidebars
+    cannot nest inside sidebars, topics, or body elements; you can't have a
+    sidebar inside a table, list, block quote, etc.
+    """
+
+
+class transition(Structural, Element): pass
+
+
+# ===============
+#  Body Elements
+# ===============
+
+class paragraph(General, TextElement): pass
+class compound(General, Element): pass
+class container(General, Element): pass
+class bullet_list(Sequential, Element): pass
+class enumerated_list(Sequential, Element): pass
+class list_item(Part, Element): pass
+class definition_list(Sequential, Element): pass
+class definition_list_item(Part, Element): pass
+class term(Part, TextElement): pass
+class classifier(Part, TextElement): pass
+class definition(Part, Element): pass
+class field_list(Sequential, Element): pass
+class field(Part, Element): pass
+class field_name(Part, TextElement): pass
+class field_body(Part, Element): pass
+
+
+class option(Part, Element):
+
+    child_text_separator = ''
+
+
+class option_argument(Part, TextElement):
+
+    def astext(self):
+        return self.get('delimiter', ' ') + TextElement.astext(self)
+
+
+class option_group(Part, Element):
+
+    child_text_separator = ', '
+
+
+class option_list(Sequential, Element): pass
+
+
+class option_list_item(Part, Element):
+
+    child_text_separator = '  '
+
+
+class option_string(Part, TextElement): pass
+class description(Part, Element): pass
+class literal_block(General, FixedTextElement): pass
+class doctest_block(General, FixedTextElement): pass
+class line_block(General, Element): pass
+
+
+class line(Part, TextElement):
+
+    indent = None
+
+
+class block_quote(General, Element): pass
+class attribution(Part, TextElement): pass
+class attention(Admonition, Element): pass
+class caution(Admonition, Element): pass
+class danger(Admonition, Element): pass
+class error(Admonition, Element): pass
+class important(Admonition, Element): pass
+class note(Admonition, Element): pass
+class tip(Admonition, Element): pass
+class hint(Admonition, Element): pass
+class warning(Admonition, Element): pass
+class admonition(Admonition, Element): pass
+class comment(Special, Invisible, FixedTextElement): pass
+class substitution_definition(Special, Invisible, TextElement): pass
+class target(Special, Invisible, Inline, TextElement, Targetable): pass
+class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
+class citation(General, BackLinkable, Element, Labeled, Targetable): pass
+class label(Part, TextElement): pass
+class figure(General, Element): pass
+class caption(Part, TextElement): pass
+class legend(Part, Element): pass
+class table(General, Element): pass
+class tgroup(Part, Element): pass
+class colspec(Part, Element): pass
+class thead(Part, Element): pass
+class tbody(Part, Element): pass
+class row(Part, Element): pass
+class entry(Part, Element): pass
+
+
+class system_message(Special, BackLinkable, PreBibliographic, Element):
+
+    """
+    System message element.
+
+    Do not instantiate this class directly; use
+    ``document.reporter.info/warning/error/severe()`` instead.
+    """
+
+    def __init__(self, message=None, *children, **attributes):
+        if message:
+            p = paragraph('', message)
+            children = (p,) + children
+        try:
+            Element.__init__(self, '', *children, **attributes)
+        except:
+            print 'system_message: children=%r' % (children,)
+            raise
+
+    def astext(self):
+        line = self.get('line', '')
+        return u'%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
+                                       self['level'], Element.astext(self))
+
+
+class pending(Special, Invisible, Element):
+
+    """
+    The "pending" element is used to encapsulate a pending operation: the
+    operation (transform), the point at which to apply it, and any data it
+    requires.  Only the pending operation's location within the document is
+    stored in the public document tree (by the "pending" object itself); the
+    operation and its data are stored in the "pending" object's internal
+    instance attributes.
+
+    For example, say you want a table of contents in your reStructuredText
+    document.  The easiest way to specify where to put it is from within the
+    document, with a directive::
+
+        .. contents::
+
+    But the "contents" directive can't do its work until the entire document
+    has been parsed and possibly transformed to some extent.  So the directive
+    code leaves a placeholder behind that will trigger the second phase of its
+    processing, something like this::
+
+        <pending ...public attributes...> + internal attributes
+
+    Use `document.note_pending()` so that the
+    `docutils.transforms.Transformer` stage of processing can run all pending
+    transforms.
+    """
+
+    def __init__(self, transform, details=None,
+                 rawsource='', *children, **attributes):
+        Element.__init__(self, rawsource, *children, **attributes)
+
+        self.transform = transform
+        """The `docutils.transforms.Transform` class implementing the pending
+        operation."""
+
+        self.details = details or {}
+        """Detail data (dictionary) required by the pending operation."""
+
+    def pformat(self, indent='    ', level=0):
+        internals = [
+              '.. internal attributes:',
+              '     .transform: %s.%s' % (self.transform.__module__,
+                                          self.transform.__name__),
+              '     .details:']
+        details = self.details.items()
+        details.sort()
+        for key, value in details:
+            if isinstance(value, Node):
+                internals.append('%7s%s:' % ('', key))
+                internals.extend(['%9s%s' % ('', line)
+                                  for line in value.pformat().splitlines()])
+            elif value and isinstance(value, ListType) \
+                  and isinstance(value[0], Node):
+                internals.append('%7s%s:' % ('', key))
+                for v in value:
+                    internals.extend(['%9s%s' % ('', line)
+                                      for line in v.pformat().splitlines()])
+            else:
+                internals.append('%7s%s: %r' % ('', key, value))
+        return (Element.pformat(self, indent, level)
+                + ''.join([('    %s%s\n' % (indent * level, line))
+                           for line in internals]))
+
+    def copy(self):
+        return self.__class__(self.transform, self.details, self.rawsource,
+                              **self.attributes)
+
+
+class raw(Special, Inline, PreBibliographic, FixedTextElement):
+
+    """
+    Raw data that is to be passed untouched to the Writer.
+    """
+
+    pass
+
+
+# =================
+#  Inline Elements
+# =================
+
+class emphasis(Inline, TextElement): pass
+class strong(Inline, TextElement): pass
+class literal(Inline, TextElement): pass
+class reference(General, Inline, Referential, TextElement): pass
+class footnote_reference(Inline, Referential, TextElement): pass
+class citation_reference(Inline, Referential, TextElement): pass
+class substitution_reference(Inline, TextElement): pass
+class title_reference(Inline, TextElement): pass
+class abbreviation(Inline, TextElement): pass
+class acronym(Inline, TextElement): pass
+class superscript(Inline, TextElement): pass
+class subscript(Inline, TextElement): pass
+
+
+class image(General, Inline, Element):
+
+    def astext(self):
+        return self.get('alt', '')
+
+
+class inline(Inline, TextElement): pass
+class problematic(Inline, TextElement): pass
+class generated(Inline, TextElement): pass
+
+
+# ========================================
+#  Auxiliary Classes, Functions, and Data
+# ========================================
+
+node_class_names = """
+    Text
+    abbreviation acronym address admonition attention attribution author
+        authors
+    block_quote bullet_list
+    caption caution citation citation_reference classifier colspec comment
+        compound contact container copyright
+    danger date decoration definition definition_list definition_list_item
+        description docinfo doctest_block document
+    emphasis entry enumerated_list error
+    field field_body field_list field_name figure footer
+        footnote footnote_reference
+    generated
+    header hint
+    image important inline
+    label legend line line_block list_item literal literal_block
+    note
+    option option_argument option_group option_list option_list_item
+        option_string organization
+    paragraph pending problematic
+    raw reference revision row rubric
+    section sidebar status strong subscript substitution_definition
+        substitution_reference subtitle superscript system_message
+    table target tbody term tgroup thead tip title title_reference topic
+        transition
+    version
+    warning""".split()
+"""A list of names of all concrete Node subclasses."""
+
+
+class NodeVisitor:
+
+    """
+    "Visitor" pattern [GoF95]_ abstract superclass implementation for
+    document tree traversals.
+
+    Each node class has corresponding methods, doing nothing by
+    default; override individual methods for specific and useful
+    behaviour.  The `dispatch_visit()` method is called by
+    `Node.walk()` upon entering a node.  `Node.walkabout()` also calls
+    the `dispatch_departure()` method before exiting a node.
+
+    The dispatch methods call "``visit_`` + node class name" or
+    "``depart_`` + node class name", resp.
+
+    This is a base class for visitors whose ``visit_...`` & ``depart_...``
+    methods should be implemented for *all* node types encountered (such as
+    for `docutils.writers.Writer` subclasses).  Unimplemented methods will
+    raise exceptions.
+
+    For sparse traversals, where only certain node types are of interest,
+    subclass `SparseNodeVisitor` instead.  When (mostly or entirely) uniform
+    processing is desired, subclass `GenericNodeVisitor`.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    optional = ()
+    """
+    Tuple containing node class names (as strings).
+
+    No exception will be raised if writers do not implement visit
+    or departure functions for these node classes.
+
+    Used to ensure transitional compatibility with existing 3rd-party writers.
+    """
+
+    def __init__(self, document):
+        self.document = document
+
+    def dispatch_visit(self, node):
+        """
+        Call self."``visit_`` + node class name" with `node` as
+        parameter.  If the ``visit_...`` method does not exist, call
+        self.unknown_visit.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'visit_' + node_name, self.unknown_visit)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def dispatch_departure(self, node):
+        """
+        Call self."``depart_`` + node class name" with `node` as
+        parameter.  If the ``depart_...`` method does not exist, call
+        self.unknown_departure.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'depart_' + node_name, self.unknown_departure)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def unknown_visit(self, node):
+        """
+        Called when entering unknown `Node` types.
+
+        Raise an exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s visiting unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+    def unknown_departure(self, node):
+        """
+        Called before exiting unknown `Node` types.
+
+        Raise exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s departing unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+
+class SparseNodeVisitor(NodeVisitor):
+
+    """
+    Base class for sparse traversals, where only certain node types are of
+    interest.  When ``visit_...`` & ``depart_...`` methods should be
+    implemented for *all* node types (such as for `docutils.writers.Writer`
+    subclasses), subclass `NodeVisitor` instead.
+    """
+
+
+class GenericNodeVisitor(NodeVisitor):
+
+    """
+    Generic "Visitor" abstract superclass, for simple traversals.
+
+    Unless overridden, each ``visit_...`` method calls `default_visit()`, and
+    each ``depart_...`` method (when using `Node.walkabout()`) calls
+    `default_departure()`. `default_visit()` (and `default_departure()`) must
+    be overridden in subclasses.
+
+    Define fully generic visitors by overriding `default_visit()` (and
+    `default_departure()`) only. Define semi-generic visitors by overriding
+    individual ``visit_...()`` (and ``depart_...()``) methods also.
+
+    `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
+    be overridden for default behavior.
+    """
+
+    def default_visit(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+    def default_departure(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+def _call_default_visit(self, node):
+    self.default_visit(node)
+
+def _call_default_departure(self, node):
+    self.default_departure(node)
+
+def _nop(self, node):
+    pass
+
+def _add_node_class_names(names):
+    """Save typing with dynamic assignments:"""
+    for _name in names:
+        setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
+        setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
+        setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
+        setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
+
+_add_node_class_names(node_class_names)
+
+
+class TreeCopyVisitor(GenericNodeVisitor):
+
+    """
+    Make a complete copy of a tree or branch, including element attributes.
+    """
+
+    def __init__(self, document):
+        GenericNodeVisitor.__init__(self, document)
+        self.parent_stack = []
+        self.parent = []
+
+    def get_tree_copy(self):
+        return self.parent[0]
+
+    def default_visit(self, node):
+        """Copy the current node, and make it the new acting parent."""
+        newnode = node.copy()
+        self.parent.append(newnode)
+        self.parent_stack.append(self.parent)
+        self.parent = newnode
+
+    def default_departure(self, node):
+        """Restore the previous acting parent."""
+        self.parent = self.parent_stack.pop()
+
+
+class TreePruningException(Exception):
+
+    """
+    Base class for `NodeVisitor`-related tree pruning exceptions.
+
+    Raise subclasses from within ``visit_...`` or ``depart_...`` methods
+    called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
+    the tree traversed.
+    """
+
+    pass
+
+
+class SkipChildren(TreePruningException):
+
+    """
+    Do not visit any children of the current node.  The current node's
+    siblings and ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipSiblings(TreePruningException):
+
+    """
+    Do not visit any more siblings (to the right) of the current node.  The
+    current node's children and its ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipNode(TreePruningException):
+
+    """
+    Do not visit the current node's children, and do not call the current
+    node's ``depart_...`` method.
+    """
+
+    pass
+
+
+class SkipDeparture(TreePruningException):
+
+    """
+    Do not call the current node's ``depart_...`` method.  The current node's
+    children and siblings are not affected.
+    """
+
+    pass
+
+
+class NodeFound(TreePruningException):
+
+    """
+    Raise to indicate that the target of a search has been found.  This
+    exception must be caught by the client; it is not caught by the traversal
+    code.
+    """
+
+    pass
+
+
+class StopTraversal(TreePruningException):
+
+    """
+    Stop the traversal alltogether.  The current node's ``depart_...`` method
+    is not affected.  The parent nodes ``depart_...`` methods are also called
+    as usual.  No other nodes are visited.  This is an alternative to
+    NodeFound that does not cause exception handling to trickle up to the
+    caller.
+    """
+
+    pass
+
+
+def make_id(string):
+    """
+    Convert `string` into an identifier and return it.
+
+    Docutils identifiers will conform to the regular expression
+    ``[a-z](-?[a-z0-9]+)*``.  For CSS compatibility, identifiers (the "class"
+    and "id" attributes) should have no underscores, colons, or periods.
+    Hyphens may be used.
+
+    - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
+
+          ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
+          followed by any number of letters, digits ([0-9]), hyphens ("-"),
+          underscores ("_"), colons (":"), and periods (".").
+
+    - However the `CSS1 spec`_ defines identifiers based on the "name" token,
+      a tighter interpretation ("flex" tokenizer notation; "latin1" and
+      "escape" 8-bit characters have been replaced with entities)::
+
+          unicode     \\[0-9a-f]{1,4}
+          latin1      [&iexcl;-&yuml;]
+          escape      {unicode}|\\[ -~&iexcl;-&yuml;]
+          nmchar      [-a-z0-9]|{latin1}|{escape}
+          name        {nmchar}+
+
+    The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
+    or periods ("."), therefore "class" and "id" attributes should not contain
+    these characters. They should be replaced with hyphens ("-"). Combined
+    with HTML's requirements (the first character must be a letter; no
+    "unicode", "latin1", or "escape" characters), this results in the
+    ``[a-z](-?[a-z0-9]+)*`` pattern.
+
+    .. _HTML 4.01 spec: http://www.w3.org/TR/html401
+    .. _CSS1 spec: http://www.w3.org/TR/REC-CSS1
+    """
+    id = _non_id_chars.sub('-', ' '.join(string.lower().split()))
+    id = _non_id_at_ends.sub('', id)
+    return str(id)
+
+_non_id_chars = re.compile('[^a-z0-9]+')
+_non_id_at_ends = re.compile('^[-0-9]+|-+$')
+
+def dupname(node, name):
+    node['dupnames'].append(name)
+    node['names'].remove(name)
+    # Assume that this method is referenced, even though it isn't; we
+    # don't want to throw unnecessary system_messages.
+    node.referenced = 1
+
+def fully_normalize_name(name):
+    """Return a case- and whitespace-normalized name."""
+    return ' '.join(name.lower().split())
+
+def whitespace_normalize_name(name):
+    """Return a whitespace-normalized name."""
+    return ' '.join(name.split())
+
+def serial_escape(value):
+    """Escape string values that are elements of a list, for serialization."""
+    return value.replace('\\', r'\\').replace(' ', r'\ ')
+
+# 
+#
+# Local Variables:
+# indent-tabs-mode: nil
+# sentence-end-double-space: t
+# fill-column: 78
+# End:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils parser modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import Component
+
+
+class Parser(Component):
+
+    component_type = 'parser'
+    config_section = 'parsers'
+
+    def parse(self, inputstring, document):
+        """Override to parse `inputstring` into document tree `document`."""
+        raise NotImplementedError('subclass must override this method')
+
+    def setup_parse(self, inputstring, document):
+        """Initial parse setup.  Call at start of `self.parse()`."""
+        self.inputstring = inputstring
+        self.document = document
+        document.reporter.attach_observer(document.note_parse_message)
+
+    def finish_parse(self):
+        """Finalize parse details.  Call at end of `self.parse()`."""
+        self.document.reporter.detach_observer(
+            self.document.note_parse_message)
+
+
+_parser_aliases = {
+      'restructuredtext': 'rst',
+      'rest': 'rst',
+      'restx': 'rst',
+      'rtxt': 'rst',}
+
+def get_parser_class(parser_name):
+    """Return the Parser class from the `parser_name` module."""
+    parser_name = parser_name.lower()
+    if _parser_aliases.has_key(parser_name):
+        parser_name = _parser_aliases[parser_name]
+    module = __import__(parser_name, globals(), locals())
+    return module.Parser
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/null.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""A do-nothing parser."""
+
+from docutils import parsers
+
+
+class Parser(parsers.Parser):
+
+    """A do-nothing parser."""
+
+    supported = ('null',)
+
+    config_section = 'null parser'
+    config_section_dependencies = ('parsers',)
+
+    def parse(self, inputstring, document):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,367 @@
+# $Id: __init__.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
+the reStructuredText parser.
+
+
+Usage
+=====
+
+1. Create a parser::
+
+       parser = docutils.parsers.rst.Parser()
+
+   Several optional arguments may be passed to modify the parser's behavior.
+   Please see `Customizing the Parser`_ below for details.
+
+2. Gather input (a multi-line string), by reading a file or the standard
+   input::
+
+       input = sys.stdin.read()
+
+3. Create a new empty `docutils.nodes.document` tree::
+
+       document = docutils.utils.new_document(source, settings)
+
+   See `docutils.utils.new_document()` for parameter details.
+
+4. Run the parser, populating the document tree::
+
+       parser.parse(input, document)
+
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a state machine, examining its
+input one line at a time. To understand how the parser works, please first
+become familiar with the `docutils.statemachine` module, then see the
+`states` module.
+
+
+Customizing the Parser
+----------------------
+
+Anything that isn't already customizable is that way simply because that type
+of customizability hasn't been implemented yet.  Patches welcome!
+
+When instantiating an object of the `Parser` class, two parameters may be
+passed: ``rfc2822`` and ``inliner``.  Pass ``rfc2822=1`` to enable an initial
+RFC-2822 style header block, parsed as a "field_list" element (with "class"
+attribute set to "rfc2822").  Currently this is the only body-level element
+which is customizable without subclassing.  (Tip: subclass `Parser` and change
+its "state_classes" and "initial_state" attributes to refer to new classes.
+Contact the author if you need more details.)
+
+The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
+It handles inline markup recognition.  A common extension is the addition of
+further implicit hyperlinks, like "RFC 2822".  This can be done by subclassing
+`states.Inliner`, adding a new method for the implicit markup, and adding a
+``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
+subclass.  See `states.Inliner.implicit_inline()` for details.  Explicit
+inline markup can be customized in a `states.Inliner` subclass via the
+``patterns.initial`` and ``dispatch`` attributes (and new methods as
+appropriate).
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils.parsers
+import docutils.statemachine
+from docutils.parsers.rst import states
+from docutils import frontend, nodes
+
+
+class Parser(docutils.parsers.Parser):
+
+    """The reStructuredText parser."""
+
+    supported = ('restructuredtext', 'rst', 'rest', 'restx', 'rtxt', 'rstx')
+    """Aliases this parser supports."""
+
+    settings_spec = (
+        'reStructuredText Parser Options',
+        None,
+        (('Recognize and link to standalone PEP references (like "PEP 258").',
+          ['--pep-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for PEP references '
+          '(default "http://www.python.org/dev/peps/").',
+          ['--pep-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.python.org/dev/peps/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Template for PEP file part of URL. (default "pep-%04d")',
+          ['--pep-file-url-template'],
+          {'metavar': '<URL>', 'default': 'pep-%04d'}),
+         ('Recognize and link to standalone RFC references (like "RFC 822").',
+          ['--rfc-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for RFC references (default "http://www.faqs.org/rfcs/").',
+          ['--rfc-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.faqs.org/rfcs/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Set number of spaces for tab expansion (default 8).',
+          ['--tab-width'],
+          {'metavar': '<width>', 'type': 'int', 'default': 8,
+           'validator': frontend.validate_nonnegative_int}),
+         ('Remove spaces before footnote references.',
+          ['--trim-footnote-reference-space'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Leave spaces before footnote references.',
+          ['--leave-footnote-reference-space'],
+          {'action': 'store_false', 'dest': 'trim_footnote_reference_space'}),
+         ('Disable directives that insert the contents of external file '
+          '("include" & "raw"); replaced with a "warning" system message.',
+          ['--no-file-insertion'],
+          {'action': 'store_false', 'default': 1,
+           'dest': 'file_insertion_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable directives that insert the contents of external file '
+          '("include" & "raw").  Enabled by default.',
+          ['--file-insertion-enabled'],
+          {'action': 'store_true'}),
+         ('Disable the "raw" directives; replaced with a "warning" '
+          'system message.',
+          ['--no-raw'],
+          {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable the "raw" directive.  Enabled by default.',
+          ['--raw-enabled'],
+          {'action': 'store_true'}),))
+
+    config_section = 'restructuredtext parser'
+    config_section_dependencies = ('parsers',)
+
+    def __init__(self, rfc2822=None, inliner=None):
+        if rfc2822:
+            self.initial_state = 'RFC2822Body'
+        else:
+            self.initial_state = 'Body'
+        self.state_classes = states.state_classes
+        self.inliner = inliner
+
+    def parse(self, inputstring, document):
+        """Parse `inputstring` and populate `document`, a document tree."""
+        self.setup_parse(inputstring, document)
+        self.statemachine = states.RSTStateMachine(
+              state_classes=self.state_classes,
+              initial_state=self.initial_state,
+              debug=document.reporter.debug_flag)
+        inputlines = docutils.statemachine.string2lines(
+              inputstring, tab_width=document.settings.tab_width,
+              convert_whitespace=1)
+        self.statemachine.run(inputlines, document, inliner=self.inliner)
+        self.finish_parse()
+
+
+class DirectiveError(Exception):
+
+    """
+    Store a message and a system message level.
+
+    To be thrown from inside directive code.
+
+    Do not instantiate directly -- use `Directive.directive_error()`
+    instead!
+    """
+
+    def __init__(self, level, message):
+        """
+        Initialize with message `message`.  `level` is a system message level.
+        """
+        Exception.__init__(self)
+        self.level = level
+        self.message = message
+
+
+class Directive:
+
+    """
+    Base class for reStructuredText directives.
+
+    The following attributes may be set by subclasses.  They are
+    interpreted by the directive parser (which runs the directive
+    class):
+
+    - `required_arguments`: The number of required arguments (default:
+      0).
+
+    - `optional_arguments`: The number of optional arguments (default:
+      0).
+
+    - `final_argument_whitespace`: A boolean, indicating if the final
+      argument may contain whitespace (default: False).
+
+    - `option_spec`: A dictionary, mapping known option names to
+      conversion functions such as `int` or `float` (default: {}, no
+      options).  Several conversion functions are defined in the
+      directives/__init__.py module.
+
+      Option conversion functions take a single parameter, the option
+      argument (a string or ``None``), validate it and/or convert it
+      to the appropriate form.  Conversion functions may raise
+      `ValueError` and `TypeError` exceptions.
+
+    - `has_content`: A boolean; True if content is allowed.  Client
+      code must handle the case where content is required but not
+      supplied (an empty content list will be supplied).
+
+    Arguments are normally single whitespace-separated words.  The
+    final argument may contain whitespace and/or newlines if
+    `final_argument_whitespace` is True.
+
+    If the form of the arguments is more complex, specify only one
+    argument (either required or optional) and set
+    `final_argument_whitespace` to True; the client code must do any
+    context-sensitive parsing.
+
+    When a directive implementation is being run, the directive class
+    is instantiated, and the `run()` method is executed.  During
+    instantiation, the following instance variables are set:
+
+    - ``name`` is the directive type or name (string).
+
+    - ``arguments`` is the list of positional arguments (strings).
+
+    - ``options`` is a dictionary mapping option names (strings) to
+      values (type depends on option conversion functions; see
+      `option_spec` above).
+
+    - ``content`` is a list of strings, the directive content line by line.
+
+    - ``lineno`` is the line number of the first line of the directive.
+
+    - ``content_offset`` is the line offset of the first line of the content from
+      the beginning of the current input.  Used when initiating a nested parse.
+
+    - ``block_text`` is a string containing the entire directive.
+
+    - ``state`` is the state which called the directive function.
+
+    - ``state_machine`` is the state machine which controls the state which called
+      the directive function.
+
+    Directive functions return a list of nodes which will be inserted
+    into the document tree at the point where the directive was
+    encountered.  This can be an empty list if there is nothing to
+    insert.
+
+    For ordinary directives, the list must contain body elements or
+    structural elements.  Some directives are intended specifically
+    for substitution definitions, and must return a list of `Text`
+    nodes and/or inline elements (suitable for inline insertion, in
+    place of the substitution reference).  Such directives must verify
+    substitution definition context, typically using code like this::
+
+        if not isinstance(state, states.SubstitutionDef):
+            error = state_machine.reporter.error(
+                'Invalid context: the "%s" directive can only be used '
+                'within a substitution definition.' % (name),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+    """
+
+    # There is a "Creating reStructuredText Directives" how-to at
+    # <http://docutils.sf.net/docs/howto/rst-directives.html>.  If you
+    # update this docstring, please update the how-to as well.
+
+    required_arguments = 0
+    """Number of required directive arguments."""
+
+    optional_arguments = 0
+    """Number of optional arguments after the required arguments."""
+
+    final_argument_whitespace = False
+    """May the final argument contain whitespace?"""
+
+    option_spec = None
+    """Mapping of option names to validator functions."""
+
+    has_content = False
+    """May the directive have content?"""
+
+    def __init__(self, name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine):
+        self.name = name
+        self.arguments = arguments
+        self.options = options
+        self.content = content
+        self.lineno = lineno
+        self.content_offset = content_offset
+        self.block_text = block_text
+        self.state = state
+        self.state_machine = state_machine
+
+    def run(self):
+        raise NotImplementedError('Must override run() is subclass.')
+
+    # Directive errors:
+
+    def directive_error(self, level, message):
+        """
+        Return a DirectiveError suitable for being thrown as an exception.
+
+        Call "raise self.directive_error(level, message)" from within
+        a directive implementation to return one single system message
+        at level `level`, which automatically gets the directive block
+        and the line number added.
+
+        You'd often use self.error(message) instead, which will
+        generate an ERROR-level directive error.
+        """
+        return DirectiveError(level, message)
+
+    def debug(self, message):
+        return self.directive_error(0, message)
+
+    def info(self, message):
+        return self.directive_error(1, message)
+
+    def warning(self, message):
+        return self.directive_error(2, message)
+
+    def error(self, message):
+        return self.directive_error(3, message)
+
+    def severe(self, message):
+        return self.directive_error(4, message)
+
+    # Convenience methods:
+
+    def assert_has_content(self):
+        """
+        Throw an ERROR-level DirectiveError if the directive doesn't
+        have contents.
+        """
+        if not self.content:
+            raise self.error('Content block expected for the "%s" directive; '
+                             'none found.' % self.name)
+
+
+def convert_directive_function(directive_fn):
+    """
+    Define & return a directive class generated from `directive_fn`.
+
+    `directive_fn` uses the old-style, functional interface.
+    """
+
+    class FunctionalDirective(Directive):
+
+        option_spec = getattr(directive_fn, 'options', None)
+        has_content = getattr(directive_fn, 'content', False)
+        _argument_spec = getattr(directive_fn, 'arguments', (0, 0, False))
+        required_arguments, optional_arguments, final_argument_whitespace \
+            = _argument_spec
+
+        def run(self):
+            return directive_fn(
+                self.name, self.arguments, self.options, self.content,
+                self.lineno, self.content_offset, self.block_text,
+                self.state, self.state_machine)
+
+    # Return new-style directive.
+    return FunctionalDirective
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,367 @@
+# $Id: __init__.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains directive implementation modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import codecs
+from docutils import nodes
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+_directive_registry = {
+      'attention': ('admonitions', 'Attention'),
+      'caution': ('admonitions', 'Caution'),
+      'danger': ('admonitions', 'Danger'),
+      'error': ('admonitions', 'Error'),
+      'important': ('admonitions', 'Important'),
+      'note': ('admonitions', 'Note'),
+      'tip': ('admonitions', 'Tip'),
+      'hint': ('admonitions', 'Hint'),
+      'warning': ('admonitions', 'Warning'),
+      'admonition': ('admonitions', 'Admonition'),
+      'sidebar': ('body', 'Sidebar'),
+      'topic': ('body', 'Topic'),
+      'line-block': ('body', 'LineBlock'),
+      'parsed-literal': ('body', 'ParsedLiteral'),
+      'rubric': ('body', 'Rubric'),
+      'epigraph': ('body', 'Epigraph'),
+      'highlights': ('body', 'Highlights'),
+      'pull-quote': ('body', 'PullQuote'),
+      'compound': ('body', 'Compound'),
+      'container': ('body', 'Container'),
+      #'questions': ('body', 'question_list'),
+      'table': ('tables', 'RSTTable'),
+      'csv-table': ('tables', 'CSVTable'),
+      'list-table': ('tables', 'ListTable'),
+      'image': ('images', 'Image'),
+      'figure': ('images', 'Figure'),
+      'contents': ('parts', 'Contents'),
+      'sectnum': ('parts', 'Sectnum'),
+      'header': ('parts', 'Header'),
+      'footer': ('parts', 'Footer'),
+      #'footnotes': ('parts', 'footnotes'),
+      #'citations': ('parts', 'citations'),
+      'target-notes': ('references', 'TargetNotes'),
+      'meta': ('html', 'Meta'),
+      #'imagemap': ('html', 'imagemap'),
+      'raw': ('misc', 'Raw'),
+      'include': ('misc', 'Include'),
+      'replace': ('misc', 'Replace'),
+      'unicode': ('misc', 'Unicode'),
+      'class': ('misc', 'Class'),
+      'role': ('misc', 'Role'),
+      'default-role': ('misc', 'DefaultRole'),
+      'title': ('misc', 'Title'),
+      'date': ('misc', 'Date'),
+      'restructuredtext-test-directive': ('misc', 'TestDirective'),}
+"""Mapping of directive name to (module name, class name).  The
+directive name is canonical & must be lowercase.  Language-dependent
+names are defined in the ``language`` subpackage."""
+
+_directives = {}
+"""Cache of imported directives."""
+
+def directive(directive_name, language_module, document):
+    """
+    Locate and return a directive function from its language-dependent name.
+    If not found in the current language, check English.  Return None if the
+    named directive cannot be found.
+    """
+    normname = directive_name.lower()
+    messages = []
+    msg_text = []
+    if _directives.has_key(normname):
+        return _directives[normname], messages
+    canonicalname = None
+    try:
+        canonicalname = language_module.directives[normname]
+    except AttributeError, error:
+        msg_text.append('Problem retrieving directive entry from language '
+                        'module %r: %s.' % (language_module, error))
+    except KeyError:
+        msg_text.append('No directive entry for "%s" in module "%s".'
+                        % (directive_name, language_module.__name__))
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.directives[normname]
+            msg_text.append('Using English fallback for directive "%s".'
+                            % directive_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical directive name.'
+                            % directive_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+    if msg_text:
+        message = document.reporter.info(
+            '\n'.join(msg_text), line=document.current_line)
+        messages.append(message)
+    try:
+        modulename, classname = _directive_registry[canonicalname]
+    except KeyError:
+        # Error handling done by caller.
+        return None, messages
+    try:
+        module = __import__(modulename, globals(), locals())
+    except ImportError, detail:
+        messages.append(document.reporter.error(
+            'Error importing directive module "%s" (directive "%s"):\n%s'
+            % (modulename, directive_name, detail),
+            line=document.current_line))
+        return None, messages
+    try:
+        directive = getattr(module, classname)
+        _directives[normname] = directive
+    except AttributeError:
+        messages.append(document.reporter.error(
+            'No directive class "%s" in module "%s" (directive "%s").'
+            % (classname, modulename, directive_name),
+            line=document.current_line))
+        return None, messages
+    return directive, messages
+
+def register_directive(name, directive):
+    """
+    Register a nonstandard application-defined directive function.
+    Language lookups are not needed for such functions.
+    """
+    _directives[name] = directive
+
+def flag(argument):
+    """
+    Check for a valid flag option (no argument) and return ``None``.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if an argument is found.
+    """
+    if argument and argument.strip():
+        raise ValueError('no argument is allowed; "%s" supplied' % argument)
+    else:
+        return None
+
+def unchanged_required(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        return argument  # unchanged!
+
+def unchanged(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    No argument implies empty string ("").
+    """
+    if argument is None:
+        return u''
+    else:
+        return argument  # unchanged!
+
+def path(argument):
+    """
+    Return the path argument unwrapped (with newlines removed).
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        path = ''.join([s.strip() for s in argument.splitlines()])
+        return path
+
+def uri(argument):
+    """
+    Return the URI argument with whitespace removed.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        uri = ''.join(argument.split())
+        return uri
+
+def nonnegative_int(argument):
+    """
+    Check for a nonnegative integer argument; raise ``ValueError`` if not.
+    (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
+
+def get_measure(argument, units):
+    """
+    Check for a positive argument of one of the units and return a
+    normalized string of the form "<value><unit>" (without space in
+    between).
+    
+    To be called from directive option conversion functions.
+    """
+    match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
+    try:
+        assert match is not None
+        float(match.group(1))
+    except (AssertionError, ValueError):
+        raise ValueError(
+            'not a positive measure of one of the following units:\n%s'
+            % ' '.join(['"%s"' % i for i in units]))
+    return match.group(1) + match.group(2)
+
+def length_or_unitless(argument):
+    return get_measure(argument, length_units + [''])
+
+def length_or_percentage_or_unitless(argument):
+    return get_measure(argument, length_units + ['%', ''])
+
+def class_option(argument):
+    """
+    Convert the argument into a list of ID-compatible strings and return it.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    names = argument.split()
+    class_names = []
+    for name in names:
+        class_name = nodes.make_id(name)
+        if not class_name:
+            raise ValueError('cannot make "%s" into a class name' % name)
+        class_names.append(class_name)
+    return class_names
+
+unicode_pattern = re.compile(
+    r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
+
+def unicode_code(code):
+    r"""
+    Convert a Unicode character code to a Unicode character.
+    (Directive option conversion function.)
+
+    Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
+    ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
+    numeric character entities (e.g. ``&#x262E;``).  Other text remains as-is.
+
+    Raise ValueError for illegal Unicode code values.
+    """
+    try:
+        if code.isdigit():                  # decimal number
+            return unichr(int(code))
+        else:
+            match = unicode_pattern.match(code)
+            if match:                       # hex number
+                value = match.group(1) or match.group(2)
+                return unichr(int(value, 16))
+            else:                           # other text
+                return code
+    except OverflowError, detail:
+        raise ValueError('code too large (%s)' % detail)
+
+def single_char_or_unicode(argument):
+    """
+    A single character is returned as-is.  Unicode characters codes are
+    converted as in `unicode_code`.  (Directive option conversion function.)
+    """
+    char = unicode_code(argument)
+    if len(char) > 1:
+        raise ValueError('%r invalid; must be a single character or '
+                         'a Unicode code' % char)
+    return char
+
+def single_char_or_whitespace_or_unicode(argument):
+    """
+    As with `single_char_or_unicode`, but "tab" and "space" are also supported.
+    (Directive option conversion function.)
+    """
+    if argument == 'tab':
+        char = '\t'
+    elif argument == 'space':
+        char = ' '
+    else:
+        char = single_char_or_unicode(argument)
+    return char
+
+def positive_int(argument):
+    """
+    Converts the argument into an integer.  Raises ValueError for negative,
+    zero, or non-integer values.  (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 1:
+        raise ValueError('negative or zero value; must be positive')
+    return value
+
+def positive_int_list(argument):
+    """
+    Converts a space- or comma-separated list of values into a Python list
+    of integers.
+    (Directive option conversion function.)
+
+    Raises ValueError for non-positive-integer values.
+    """
+    if ',' in argument:
+        entries = argument.split(',')
+    else:
+        entries = argument.split()
+    return [positive_int(entry) for entry in entries]
+
+def encoding(argument):
+    """
+    Verfies the encoding argument by lookup.
+    (Directive option conversion function.)
+
+    Raises ValueError for unknown encodings.
+    """
+    try:
+        codecs.lookup(argument)
+    except LookupError:
+        raise ValueError('unknown encoding: "%s"' % argument)
+    return argument
+
+def choice(argument, values):
+    """
+    Directive option utility function, supplied to enable options whose
+    argument must be a member of a finite set of possible values (must be
+    lower case).  A custom conversion function must be written to use it.  For
+    example::
+
+        from docutils.parsers.rst import directives
+
+        def yesno(argument):
+            return directives.choice(argument, ('yes', 'no'))
+
+    Raise ``ValueError`` if no argument is found or if the argument's value is
+    not valid (not an entry in the supplied list).
+    """
+    try:
+        value = argument.lower().strip()
+    except AttributeError:
+        raise ValueError('must supply an argument; choose from %s'
+                         % format_values(values))
+    if value in values:
+        return value
+    else:
+        raise ValueError('"%s" unknown; choose from %s'
+                         % (argument, format_values(values)))
+
+def format_values(values):
+    return '%s, or "%s"' % (', '.join(['"%s"' % s for s in values[:-1]]),
+                            values[-1])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+# $Id: admonitions.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Admonition directives.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states, directives
+from docutils import nodes
+
+
+class BaseAdmonition(Directive):
+
+    required_arguments = 0
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {}
+    has_content = True
+
+    node_class = None
+    """Subclasses must set this to the appropriate admonition node class."""
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        admonition_node = self.node_class(text)
+        if self.arguments:
+            title_text = self.arguments[0]
+            textnodes, messages = self.state.inline_text(title_text,
+                                                         self.lineno)
+            admonition_node += nodes.title(title_text, '', *textnodes)
+            admonition_node += messages
+            if self.options.has_key('class'):
+                classes = self.options['class']
+            else:
+                classes = ['admonition-' + nodes.make_id(title_text)]
+            admonition_node['classes'] += classes
+        self.state.nested_parse(self.content, self.content_offset,
+                                admonition_node)
+        return [admonition_node]
+
+
+class Admonition(BaseAdmonition):
+
+    required_arguments = 1
+    option_spec = {'class': directives.class_option}
+    node_class = nodes.admonition
+
+
+class Attention(BaseAdmonition):
+
+    node_class = nodes.attention
+
+
+class Caution(BaseAdmonition):
+
+    node_class = nodes.caution
+
+
+class Danger(BaseAdmonition):
+
+    node_class = nodes.danger
+
+
+class Error(BaseAdmonition):
+
+    node_class = nodes.error
+
+
+class Hint(BaseAdmonition):
+
+    node_class = nodes.hint
+
+
+class Important(BaseAdmonition):
+
+    node_class = nodes.important
+
+
+class Note(BaseAdmonition):
+
+    node_class = nodes.note
+
+
+class Tip(BaseAdmonition):
+
+    node_class = nodes.tip
+
+
+class Warning(BaseAdmonition):
+
+    node_class = nodes.warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,192 @@
+# $Id: body.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for additional body elements.
+
+See `docutils.parsers.rst.directives` for API details.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.roles import set_classes
+
+
+class BasePseudoSection(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    node_class = None
+    """Node class to be used (must be set in subclasses)."""
+
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        self.assert_has_content()
+        title_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(title_text, self.lineno)
+        titles = [nodes.title(title_text, '', *textnodes)]
+        # Sidebar uses this code.
+        if self.options.has_key('subtitle'):
+            textnodes, more_messages = self.state.inline_text(
+                self.options['subtitle'], self.lineno)
+            titles.append(nodes.subtitle(self.options['subtitle'], '',
+                                         *textnodes))
+            messages.extend(more_messages)
+        text = '\n'.join(self.content)
+        node = self.node_class(text, *(titles + messages))
+        node['classes'] += self.options.get('class', [])
+        if text:
+            self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Topic(BasePseudoSection):
+
+    node_class = nodes.topic
+
+
+class Sidebar(BasePseudoSection):
+
+    node_class = nodes.sidebar
+
+    option_spec = BasePseudoSection.option_spec.copy()
+    option_spec['subtitle'] = directives.unchanged_required
+
+    def run(self):
+        if isinstance(self.state_machine.node, nodes.sidebar):
+            raise self.error('The "%s" directive may not be used within a '
+                             'sidebar element.' % self.name)
+        return BasePseudoSection.run(self)
+
+
+class LineBlock(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        block = nodes.line_block(classes=self.options.get('class', []))
+        node_list = [block]
+        for line_text in self.content:
+            text_nodes, messages = self.state.inline_text(
+                line_text.strip(), self.lineno + self.content_offset)
+            line = nodes.line(line_text, '', *text_nodes)
+            if line_text.strip():
+                line.indent = len(line_text) - len(line_text.lstrip())
+            block += line
+            node_list.extend(messages)
+            self.content_offset += 1
+        self.state.nest_line_block_lines(block)
+        return node_list
+
+
+class ParsedLiteral(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        set_classes(self.options)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        text_nodes, messages = self.state.inline_text(text, self.lineno)
+        node = nodes.literal_block(text, '', *text_nodes, **self.options)
+        node.line = self.content_offset + 1
+        return [node] + messages
+
+
+class Rubric(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+
+    def run(self):
+        set_classes(self.options)
+        rubric_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(rubric_text, self.lineno)
+        rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options)
+        return [rubric] + messages
+
+
+class BlockQuote(Directive):
+
+    has_content = True
+    classes = []
+
+    def run(self):
+        self.assert_has_content()
+        elements = self.state.block_quote(self.content, self.content_offset)
+        for element in elements:
+            if isinstance(element, nodes.block_quote):
+                element['classes'] += self.classes
+        return elements
+
+
+class Epigraph(BlockQuote):
+
+    classes = ['epigraph']
+
+
+class Highlights(BlockQuote):
+
+    classes = ['highlights']
+
+
+class PullQuote(BlockQuote):
+
+    classes = ['pull-quote']
+
+
+class Compound(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        node = nodes.compound(text)
+        node['classes'] += self.options.get('class', [])
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Container(Directive):
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        try:
+            if self.arguments:
+                classes = directives.class_option(self.arguments[0])
+            else:
+                classes = []
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node = nodes.container(text)
+        node['classes'].extend(classes)
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+# $Id: html.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for typically HTML-specific constructs.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states
+from docutils.transforms import components
+
+
+class MetaBody(states.SpecializedBody):
+
+    class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
+        """HTML-specific "meta" element."""
+        pass
+
+    def field_marker(self, match, context, next_state):
+        """Meta element."""
+        node, blank_finish = self.parsemeta(match)
+        self.parent += node
+        return [], next_state, []
+
+    def parsemeta(self, match):
+        name = self.parse_field_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        node = self.meta()
+        pending = nodes.pending(components.Filter,
+                                {'component': 'writer',
+                                 'format': 'html',
+                                 'nodes': [node]})
+        node['content'] = ' '.join(indented)
+        if not indented:
+            line = self.state_machine.line
+            msg = self.reporter.info(
+                  'No content for meta tag "%s".' % name,
+                  nodes.literal_block(line, line),
+                  line=self.state_machine.abs_line_number())
+            return msg, blank_finish
+        tokens = name.split()
+        try:
+            attname, val = utils.extract_name_value(tokens[0])[0]
+            node[attname.lower()] = val
+        except utils.NameValueError:
+            node['name'] = tokens[0]
+        for token in tokens[1:]:
+            try:
+                attname, val = utils.extract_name_value(token)[0]
+                node[attname.lower()] = val
+            except utils.NameValueError, detail:
+                line = self.state_machine.line
+                msg = self.reporter.error(
+                      'Error parsing meta tag attribute "%s": %s.'
+                      % (token, detail), nodes.literal_block(line, line),
+                      line=self.state_machine.abs_line_number())
+                return msg, blank_finish
+        self.document.note_pending(pending)
+        return pending, blank_finish
+
+
+class Meta(Directive):
+
+    has_content = True
+
+    SMkwargs = {'state_classes': (MetaBody,)}
+
+    def run(self):
+        self.assert_has_content()
+        node = nodes.Element()
+        new_line_offset, blank_finish = self.state.nested_list_parse(
+            self.content, self.content_offset, node,
+            initial_state='MetaBody', blank_finish=1,
+            state_machine_kwargs=self.SMkwargs)
+        if (new_line_offset - self.content_offset) != len(self.content):
+            # incomplete parse of block?
+            error = self.state_machine.reporter.error(
+                'Invalid meta directive.',
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            node += error
+        return node.children
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,160 @@
+# $Id: images.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for figures and simple images.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives, states
+from docutils.nodes import fully_normalize_name, whitespace_normalize_name
+from docutils.parsers.rst.roles import set_classes
+
+try:
+    import Image as PIL                        # PIL
+except ImportError:
+    PIL = None
+
+
+class Image(Directive):
+
+    align_h_values = ('left', 'center', 'right')
+    align_v_values = ('top', 'middle', 'bottom')
+    align_values = align_v_values + align_h_values
+
+    def align(argument):
+        # This is not callable as self.align.  We cannot make it a
+        # staticmethod because we're saving an unbound method in
+        # option_spec below.
+        return directives.choice(argument, Image.align_values)
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'alt': directives.unchanged,
+                   'height': directives.length_or_unitless,
+                   'width': directives.length_or_percentage_or_unitless,
+                   'scale': directives.nonnegative_int,
+                   'align': align,
+                   'target': directives.unchanged_required,
+                   'class': directives.class_option}
+
+    def run(self):
+        if self.options.has_key('align'):
+            if isinstance(self.state, states.SubstitutionDef):
+                # Check for align_v_values.
+                if self.options['align'] not in self.align_v_values:
+                    raise self.error(
+                        'Error in "%s" directive: "%s" is not a valid value '
+                        'for the "align" option within a substitution '
+                        'definition.  Valid values for "align" are: "%s".'
+                        % (self.name, self.options['align'],
+                           '", "'.join(self.align_v_values)))
+            elif self.options['align'] not in self.align_h_values:
+                raise self.error(
+                    'Error in "%s" directive: "%s" is not a valid value for '
+                    'the "align" option.  Valid values for "align" are: "%s".'
+                    % (self.name, self.options['align'],
+                       '", "'.join(self.align_h_values)))
+        messages = []
+        reference = directives.uri(self.arguments[0])
+        self.options['uri'] = reference
+        reference_node = None
+        if self.options.has_key('target'):
+            block = states.escape2null(
+                self.options['target']).splitlines()
+            block = [line for line in block]
+            target_type, data = self.state.parse_target(
+                block, self.block_text, self.lineno)
+            if target_type == 'refuri':
+                reference_node = nodes.reference(refuri=data)
+            elif target_type == 'refname':
+                reference_node = nodes.reference(
+                    refname=fully_normalize_name(data),
+                    name=whitespace_normalize_name(data))
+                reference_node.indirect_reference_name = data
+                self.state.document.note_refname(reference_node)
+            else:                           # malformed target
+                messages.append(data)       # data is a system message
+            del self.options['target']
+        set_classes(self.options)
+        image_node = nodes.image(self.block_text, **self.options)
+        if reference_node:
+            reference_node += image_node
+            return messages + [reference_node]
+        else:
+            return messages + [image_node]
+
+
+class Figure(Image):
+
+    def align(argument):
+        return directives.choice(argument, Figure.align_h_values)
+
+    def figwidth_value(argument):
+        if argument.lower() == 'image':
+            return 'image'
+        else:
+            return directives.nonnegative_int(argument)
+
+    option_spec = Image.option_spec.copy()
+    option_spec['figwidth'] = figwidth_value
+    option_spec['figclass'] = directives.class_option
+    option_spec['align'] = align
+    has_content = True
+
+    def run(self):
+        figwidth = self.options.get('figwidth')
+        if figwidth:
+            del self.options['figwidth']
+        figclasses = self.options.get('figclass')
+        if figclasses:
+            del self.options['figclass']
+        align = self.options.get('align')
+        if align:
+            del self.options['align']
+        (image_node,) = Image.run(self)
+        if isinstance(image_node, nodes.system_message):
+            return [image_node]
+        figure_node = nodes.figure('', image_node)
+        if figwidth == 'image':
+            if PIL and self.state.document.settings.file_insertion_enabled:
+                # PIL doesn't like Unicode paths:
+                try:
+                    i = PIL.open(str(image_node['uri']))
+                except (IOError, UnicodeError):
+                    pass
+                else:
+                    self.state.document.settings.record_dependencies.add(
+                        image_node['uri'])
+                    figure_node['width'] = i.size[0]
+        elif figwidth is not None:
+            figure_node['width'] = figwidth
+        if figclasses:
+            figure_node['classes'] += figclasses
+        if align:
+            figure_node['align'] = align
+        if self.content:
+            node = nodes.Element()          # anonymous container for parsing
+            self.state.nested_parse(self.content, self.content_offset, node)
+            first_node = node[0]
+            if isinstance(first_node, nodes.paragraph):
+                caption = nodes.caption(first_node.rawsource, '',
+                                        *first_node.children)
+                figure_node += caption
+            elif not (isinstance(first_node, nodes.comment)
+                      and len(first_node) == 0):
+                error = self.state_machine.reporter.error(
+                      'Figure caption must be a paragraph or empty comment.',
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                return [figure_node, error]
+            if len(node) > 1:
+                figure_node += nodes.legend('', *node[1:])
+        return [figure_node]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,462 @@
+# $Id: misc.py 5015 2007-03-12 20:25:40Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dethe Elza
+# Copyright: This module has been placed in the public domain.
+
+"""Miscellaneous directives."""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os.path
+import re
+import time
+from docutils import io, nodes, statemachine, utils
+from docutils.parsers.rst import Directive, convert_directive_function
+from docutils.parsers.rst import directives, roles, states
+from docutils.transforms import misc
+
+
+class Include(Directive):
+
+    """
+    Include content read from a separate source file.
+
+    Content may be parsed by the parser, or included as a literal
+    block.  The encoding of the included file can be specified.  Only
+    a part of the given file argument may be included by specifying
+    text to match before and/or after the text to be used.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'literal': directives.flag,
+                   'encoding': directives.encoding,
+                   'start-after': directives.unchanged_required,
+                   'end-before': directives.unchanged_required}
+
+    standard_include_path = os.path.join(os.path.dirname(states.__file__),
+                                         'include')
+
+    def run(self):
+        """Include a reST file as part of the content of this reST file."""
+        if not self.state.document.settings.file_insertion_enabled:
+            raise self.warning('"%s" directive disabled.' % self.name)
+        source = self.state_machine.input_lines.source(
+            self.lineno - self.state_machine.input_offset - 1)
+        source_dir = os.path.dirname(os.path.abspath(source))
+        path = directives.path(self.arguments[0])
+        if path.startswith('<') and path.endswith('>'):
+            path = os.path.join(self.standard_include_path, path[1:-1])
+        path = os.path.normpath(os.path.join(source_dir, path))
+        path = utils.relative_path(None, path)
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        try:
+            self.state.document.settings.record_dependencies.add(path)
+            include_file = io.FileInput(
+                source_path=path, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler),
+                handle_io_errors=None)
+        except IOError, error:
+            raise self.severe('Problems with "%s" directive path:\n%s: %s.'
+                              % (self.name, error.__class__.__name__, error))
+        try:
+            include_text = include_file.read()
+        except UnicodeError, error:
+            raise self.severe(
+                'Problem with "%s" directive:\n%s: %s'
+                % (self.name, error.__class__.__name__, error))
+        # start-after/end-before: no restrictions on newlines in match-text,
+        # and no restrictions on matching inside lines vs. line boundaries
+        after_text = self.options.get('start-after', None)
+        if after_text:
+            # skip content in include_text before *and incl.* a matching text
+            after_index = include_text.find(after_text)
+            if after_index < 0:
+                raise self.severe('Problem with "start-after" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            include_text = include_text[after_index + len(after_text):]
+        before_text = self.options.get('end-before', None)
+        if before_text:
+            # skip content in include_text after *and incl.* a matching text
+            before_index = include_text.find(before_text)
+            if before_index < 0:
+                raise self.severe('Problem with "end-before" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            include_text = include_text[:before_index]
+        if self.options.has_key('literal'):
+            literal_block = nodes.literal_block(include_text, include_text,
+                                                source=path)
+            literal_block.line = 1
+            return [literal_block]
+        else:
+            include_lines = statemachine.string2lines(include_text,
+                                                      convert_whitespace=1)
+            self.state_machine.insert_input(include_lines, path)
+            return []
+
+
+class Raw(Directive):
+
+    """
+    Pass through content unchanged
+
+    Content is included in output based on type argument
+
+    Content may be included inline (content section of directive) or
+    imported from a file or url.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding}
+    has_content = True
+
+    def run(self):
+        if (not self.state.document.settings.raw_enabled
+            or (not self.state.document.settings.file_insertion_enabled
+                and (self.options.has_key('file')
+                     or self.options.has_key('url')))):
+            raise self.warning('"%s" directive disabled.' % self.name)
+        attributes = {'format': ' '.join(self.arguments[0].lower().split())}
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        if self.content:
+            if self.options.has_key('file') or self.options.has_key('url'):
+                raise self.error(
+                    '"%s" directive may not both specify an external file '
+                    'and have content.' % self.name)
+            text = '\n'.join(self.content)
+        elif self.options.has_key('file'):
+            if self.options.has_key('url'):
+                raise self.error(
+                    'The "file" and "url" options may not be simultaneously '
+                    'specified for the "%s" directive.' % self.name)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            path = os.path.normpath(os.path.join(source_dir,
+                                                 self.options['file']))
+            path = utils.relative_path(None, path)
+            try:
+                self.state.document.settings.record_dependencies.add(path)
+                raw_file = io.FileInput(
+                    source_path=path, encoding=encoding,
+                    error_handler=(self.state.document.settings.\
+                                   input_encoding_error_handler),
+                    handle_io_errors=None)
+            except IOError, error:
+                raise self.severe('Problems with "%s" directive path:\n%s.'
+                                  % (self.name, error))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(
+                    'Problem with "%s" directive:\n%s: %s'
+                    % (self.name, error.__class__.__name__, error))
+            attributes['source'] = path
+        elif self.options.has_key('url'):
+            source = self.options['url']
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            try:
+                raw_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError), error:
+                raise self.severe(
+                    'Problems with "%s" directive URL "%s":\n%s.'
+                    % (self.name, self.options['url'], error))
+            raw_file = io.StringInput(
+                source=raw_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(
+                    'Problem with "%s" directive:\n%s: %s'
+                    % (self.name, error.__class__.__name__, error))
+            attributes['source'] = source
+        else:
+            # This will always fail because there is no content.
+            self.assert_has_content()
+        raw_node = nodes.raw('', text, **attributes)
+        return [raw_node]
+
+
+class Replace(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        element = nodes.Element(text)
+        self.state.nested_parse(self.content, self.content_offset,
+                                element)
+        if ( len(element) != 1
+             or not isinstance(element[0], nodes.paragraph)):
+            messages = []
+            for node in element:
+                if isinstance(node, nodes.system_message):
+                    node['backrefs'] = []
+                    messages.append(node)
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive: may contain a single paragraph '
+                'only.' % (self.name), line=self.lineno)
+            messages.append(error)
+            return messages
+        else:
+            return element[0].children
+
+
+class Unicode(Directive):
+
+    r"""
+    Convert Unicode character codes (numbers) to characters.  Codes may be
+    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
+    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
+    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
+    ignored.  Spaces are ignored, and any other text remains as-is.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'trim': directives.flag,
+                   'ltrim': directives.flag,
+                   'rtrim': directives.flag}
+
+    comment_pattern = re.compile(r'( |\n|^)\.\. ')
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        substitution_definition = self.state_machine.node
+        if self.options.has_key('trim'):
+            substitution_definition.attributes['ltrim'] = 1
+            substitution_definition.attributes['rtrim'] = 1
+        if self.options.has_key('ltrim'):
+            substitution_definition.attributes['ltrim'] = 1
+        if self.options.has_key('rtrim'):
+            substitution_definition.attributes['rtrim'] = 1
+        codes = self.comment_pattern.split(self.arguments[0])[0].split()
+        element = nodes.Element()
+        for code in codes:
+            try:
+                decoded = directives.unicode_code(code)
+            except ValueError, err:
+                raise self.error(
+                    'Invalid character code: %s\n%s: %s'
+                    % (code, err.__class__.__name__, err))
+            element += nodes.Text(decoded)
+        return element.children
+
+
+class Class(Directive):
+
+    """
+    Set a "class" attribute on the directive content or the next element.
+    When applied to the next element, a "pending" element is inserted, and a
+    transform does the work later.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        try:
+            class_value = directives.class_option(self.arguments[0])
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node_list = []
+        if self.content:
+            container = nodes.Element()
+            self.state.nested_parse(self.content, self.content_offset,
+                                    container)
+            for node in container:
+                node['classes'].extend(class_value)
+            node_list.extend(container.children)
+        else:
+            pending = nodes.pending(
+                misc.ClassAttribute,
+                {'class': class_value, 'directive': self.name},
+                self.block_text)
+            self.state_machine.document.note_pending(pending)
+            node_list.append(pending)
+        return node_list
+
+
+class Role(Directive):
+
+    has_content = True
+
+    argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
+                                  % ((states.Inliner.simplename,) * 2))
+
+    def run(self):
+        """Dynamically create and register a custom interpreted text role."""
+        if self.content_offset > self.lineno or not self.content:
+            raise self.error('"%s" directive requires arguments on the first '
+                             'line.' % self.name)
+        args = self.content[0]
+        match = self.argument_pattern.match(args)
+        if not match:
+            raise self.error('"%s" directive arguments not valid role names: '
+                             '"%s".' % (self.name, args))
+        new_role_name = match.group(1)
+        base_role_name = match.group(3)
+        messages = []
+        if base_role_name:
+            base_role, messages = roles.role(
+                base_role_name, self.state_machine.language, self.lineno,
+                self.state.reporter)
+            if base_role is None:
+                error = self.state.reporter.error(
+                    'Unknown interpreted text role "%s".' % base_role_name,
+                    nodes.literal_block(self.block_text, self.block_text),
+                    line=self.lineno)
+                return messages + [error]
+        else:
+            base_role = roles.generic_custom_role
+        assert not hasattr(base_role, 'arguments'), (
+            'Supplemental directive arguments for "%s" directive not '
+            'supported (specified by "%r" role).' % (self.name, base_role))
+        try:
+            converted_role = convert_directive_function(base_role)
+            (arguments, options, content, content_offset) = (
+                self.state.parse_directive_block(
+                self.content[1:], self.content_offset, converted_role,
+                option_presets={}))
+        except states.MarkupError, detail:
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive:\n%s.' % (self.name, detail),
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        if not options.has_key('class'):
+            try:
+                options['class'] = directives.class_option(new_role_name)
+            except ValueError, detail:
+                error = self.state_machine.reporter.error(
+                    'Invalid argument for "%s" directive:\n%s.'
+                    % (self.name, detail), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return messages + [error]
+        role = roles.CustomRole(new_role_name, base_role, options, content)
+        roles.register_local_role(new_role_name, role)
+        return messages
+
+
+class DefaultRole(Directive):
+
+    """Set the default interpreted text role."""
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = False
+
+    def run(self):
+        if not self.arguments:
+            if roles._roles.has_key(''):
+                # restore the "default" default role
+                del roles._roles['']
+            return []
+        role_name = self.arguments[0]
+        role, messages = roles.role(role_name, self.state_machine.language,
+                                    self.lineno, self.state.reporter)
+        if role is None:
+            error = self.state.reporter.error(
+                'Unknown interpreted text role "%s".' % role_name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        roles._roles[''] = role
+        # @@@ should this be local to the document, not the parser?
+        return messages
+
+
+class Title(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+
+    def run(self):
+        self.state_machine.document['title'] = self.arguments[0]
+        return []
+
+
+class Date(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        format = '\n'.join(self.content) or '%Y-%m-%d'
+        text = time.strftime(format)
+        return [nodes.Text(text)]
+
+
+class TestDirective(Directive):
+
+    """This directive is useful only for testing purposes."""
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'option': directives.unchanged_required}
+    has_content = True
+
+    def run(self):
+        if self.content:
+            text = '\n'.join(self.content)
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content:' % (self.name, self.arguments, self.options),
+                nodes.literal_block(text, text), line=self.lineno)
+        else:
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content: None' % (self.name, self.arguments, self.options),
+                line=self.lineno)
+        return [info]
+
+# Old-style, functional definition:
+#
+# def directive_test_function(name, arguments, options, content, lineno,
+#                             content_offset, block_text, state, state_machine):
+#     """This directive is useful only for testing purposes."""
+#     if content:
+#         text = '\n'.join(content)
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content:' % (name, arguments, options),
+#             nodes.literal_block(text, text), line=lineno)
+#     else:
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content: None' % (name, arguments, options), line=lineno)
+#     return [info]
+#
+# directive_test_function.arguments = (0, 1, 1)
+# directive_test_function.options = {'option': directives.unchanged_required}
+# directive_test_function.content = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,123 @@
+# $Id: parts.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, languages
+from docutils.transforms import parts
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class Contents(Directive):
+
+    """
+    Table of contents.
+
+    The table of contents is generated in two passes: initial parse and
+    transform.  During the initial parse, a 'pending' element is generated
+    which acts as a placeholder, storing the TOC title and any options
+    internally.  At a later stage in the processing, the 'pending' element is
+    replaced by a 'topic' element, a title and the table of contents proper.
+    """
+
+    backlinks_values = ('top', 'entry', 'none')
+
+    def backlinks(arg):
+        value = directives.choice(arg, Contents.backlinks_values)
+        if value == 'none':
+            return None
+        else:
+            return value
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'depth': directives.nonnegative_int,
+                   'local': directives.flag,
+                   'backlinks': backlinks,
+                   'class': directives.class_option}
+    
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        document = self.state_machine.document
+        language = languages.get_language(document.settings.language_code)
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            messages = []
+            if self.options.has_key('local'):
+                title = None
+            else:
+                title = nodes.title('', language.labels['contents'])
+        topic = nodes.topic(classes=['contents'])
+        topic['classes'] += self.options.get('class', [])
+        if self.options.has_key('local'):
+            topic['classes'].append('local')
+        if title:
+            name = title.astext()
+            topic += title
+        else:
+            name = language.labels['contents']
+        name = nodes.fully_normalize_name(name)
+        if not document.has_name(name):
+            topic['names'].append(name)
+        document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents, rawsource=self.block_text)
+        pending.details.update(self.options)
+        document.note_pending(pending)
+        topic += pending
+        return [topic] + messages
+
+
+class Sectnum(Directive):
+
+    """Automatic section numbering."""
+
+    option_spec = {'depth': int,
+                   'start': int,
+                   'prefix': directives.unchanged_required,
+                   'suffix': directives.unchanged_required}
+
+    def run(self):
+        pending = nodes.pending(parts.SectNum)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        return [pending]
+
+
+class Header(Directive):
+
+    """Contents of document header."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        header = self.state_machine.document.get_decoration().get_header()
+        self.state.nested_parse(self.content, self.content_offset, header)
+        return []
+
+
+class Footer(Directive):
+
+    """Contents of document footer."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        footer = self.state_machine.document.get_decoration().get_footer()
+        self.state.nested_parse(self.content, self.content_offset, footer)
+        return []
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+# $Id: references.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for references and targets.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import references
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class TargetNotes(Directive):
+
+    """Target footnote generation."""
+
+    option_spec = {'class': directives.class_option}
+
+    def run(self):
+        pending = nodes.pending(references.TargetNotes)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        nodelist = [pending]
+        return nodelist
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,444 @@
+# $Id: tables.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; David Priest
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for table elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os.path
+from docutils import io, nodes, statemachine, utils
+from docutils.utils import SystemMessagePropagation
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+try:
+    import csv                          # new in Python 2.3
+except ImportError:
+    csv = None
+
+
+class Table(Directive):
+
+    """
+    Generic table base class.
+    """
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def make_title(self):
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            title = None
+            messages = []
+        return title, messages
+
+    def process_header_option(self):
+        source = self.state_machine.get_source(self.lineno - 1)
+        table_head = []
+        max_header_cols = 0
+        if self.options.has_key('header'):   # separate table header in option
+            rows, max_header_cols = self.parse_csv_data_into_rows(
+                self.options['header'].split('\n'), self.HeaderDialect(),
+                source)
+            table_head.extend(rows)
+        return table_head, max_header_cols
+
+    def check_table_dimensions(self, rows, header_rows, stub_columns):
+        if len(rows) < header_rows:
+            error = self.state_machine.reporter.error(
+                '%s header row(s) specified but only %s row(s) of data '
+                'supplied ("%s" directive).'
+                % (header_rows, len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        if len(rows) == header_rows > 0:
+            error = self.state_machine.reporter.error(
+                'Insufficient data supplied (%s row(s)); no data remaining '
+                'for table body, required by "%s" directive.'
+                % (len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        for row in rows:
+            if len(row) < stub_columns:
+                error = self.state_machine.reporter.error(
+                    '%s stub column(s) specified but only %s columns(s) of '
+                    'data supplied ("%s" directive).' %
+                    (stub_columns, len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            if len(row) == stub_columns > 0:
+                error = self.state_machine.reporter.error(
+                    'Insufficient data supplied (%s columns(s)); no data remaining '
+                    'for table body, required by "%s" directive.'
+                    % (len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+
+    def get_column_widths(self, max_cols):
+        if self.options.has_key('widths'):
+            col_widths = self.options['widths']
+            if len(col_widths) != max_cols:
+                error = self.state_machine.reporter.error(
+                    '"%s" widths do not match the number of columns in table '
+                    '(%s).' % (self.name, max_cols), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+        elif max_cols:
+            col_widths = [100 // max_cols] * max_cols
+        else:
+            error = self.state_machine.reporter.error(
+                'No table data detected in CSV file.', nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return col_widths
+
+    def extend_short_rows_with_empty_cells(self, columns, parts):
+        for part in parts:
+            for row in part:
+                if len(row) < columns:
+                    row.extend([(0, 0, 0, [])] * (columns - len(row)))
+
+
+class RSTTable(Table):
+
+    def run(self):
+        if not self.content:
+            warning = self.state_machine.reporter.warning(
+                'Content block expected for the "%s" directive; none found.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [warning]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        if len(node) != 1 or not isinstance(node[0], nodes.table):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: exactly '
+                'one table expected.' % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table_node = node[0]
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+
+class CSVTable(Table):
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'header': directives.unchanged,
+                   'widths': directives.positive_int_list,
+                   'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding,
+                   'class': directives.class_option,
+                   # field delimiter char
+                   'delim': directives.single_char_or_whitespace_or_unicode,
+                   # treat whitespace after delimiter as significant
+                   'keepspace': directives.flag,
+                   # text field quote/unquote char:
+                   'quote': directives.single_char_or_unicode,
+                   # char used to escape delim & quote as-needed:
+                   'escape': directives.single_char_or_unicode,}
+
+    if csv:
+
+        class DocutilsDialect(csv.Dialect):
+
+            """CSV dialect for `csv_table` directive."""
+
+            delimiter = ','
+            quotechar = '"'
+            doublequote = True
+            skipinitialspace = True
+            lineterminator = '\n'
+            quoting = csv.QUOTE_MINIMAL
+
+            def __init__(self, options):
+                if options.has_key('delim'):
+                    self.delimiter = str(options['delim'])
+                if options.has_key('keepspace'):
+                    self.skipinitialspace = False
+                if options.has_key('quote'):
+                    self.quotechar = str(options['quote'])
+                if options.has_key('escape'):
+                    self.doublequote = False
+                    self.escapechar = str(options['escape'])
+                csv.Dialect.__init__(self)
+
+
+        class HeaderDialect(csv.Dialect):
+
+            """CSV dialect to use for the "header" option data."""
+
+            delimiter = ','
+            quotechar = '"'
+            escapechar = '\\'
+            doublequote = False
+            skipinitialspace = True
+            lineterminator = '\n'
+            quoting = csv.QUOTE_MINIMAL
+
+    def check_requirements(self):
+        if not csv:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is not compatible with this version of '
+                'Python (%s).  Requires the "csv" module, new in Python 2.3.'
+                % (self.name, sys.version.split()[0]), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+
+    def run(self):
+        try:
+            if (not self.state.document.settings.file_insertion_enabled
+                and (self.options.has_key('file')
+                     or self.options.has_key('url'))):
+                warning = self.state_machine.reporter.warning(
+                    'File and URL access deactivated; ignoring "%s" '
+                    'directive.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return [warning]
+            self.check_requirements()
+            title, messages = self.make_title()
+            csv_data, source = self.get_csv_data()
+            table_head, max_header_cols = self.process_header_option()
+            rows, max_cols = self.parse_csv_data_into_rows(
+                csv_data, self.DocutilsDialect(self.options), source)
+            max_cols = max(max_cols, max_header_cols)
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(rows, header_rows, stub_columns)
+            table_head.extend(rows[:header_rows])
+            table_body = rows[header_rows:]
+            col_widths = self.get_column_widths(max_cols)
+            self.extend_short_rows_with_empty_cells(max_cols,
+                                                    (table_head, table_body))
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        except csv.Error, detail:
+            error = self.state_machine.reporter.error(
+                'Error with CSV data in "%s" directive:\n%s'
+                % (self.name, detail), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table = (col_widths, table_head, table_body)
+        table_node = self.state.build_table(table, self.content_offset,
+                                            stub_columns)
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def get_csv_data(self):
+        """
+        Get CSV data from the directive content, from an external
+        file, or from a URL reference.
+        """
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        if self.content:
+            # CSV data is from directive content.
+            if self.options.has_key('file') or self.options.has_key('url'):
+                error = self.state_machine.reporter.error(
+                    '"%s" directive may not both specify an external file and'
+                    ' have content.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source = self.content.source(0)
+            csv_data = self.content
+        elif self.options.has_key('file'):
+            # CSV data is from an external file.
+            if self.options.has_key('url'):
+                error = self.state_machine.reporter.error(
+                      'The "file" and "url" options may not be simultaneously'
+                      ' specified for the "%s" directive.' % self.name,
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            source = os.path.normpath(os.path.join(source_dir,
+                                                   self.options['file']))
+            source = utils.relative_path(None, source)
+            try:
+                self.state.document.settings.record_dependencies.add(source)
+                csv_file = io.FileInput(
+                    source_path=source, encoding=encoding,
+                    error_handler=(self.state.document.settings.\
+                                   input_encoding_error_handler),
+                    handle_io_errors=None)
+                csv_data = csv_file.read().splitlines()
+            except IOError, error:
+                severe = self.state_machine.reporter.severe(
+                    'Problems with "%s" directive path:\n%s.'
+                    % (self.name, error), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(severe)
+        elif self.options.has_key('url'):
+            # CSV data is from a URL.
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            source = self.options['url']
+            try:
+                csv_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError, ValueError), error:
+                severe = self.state_machine.reporter.severe(
+                      'Problems with "%s" directive URL "%s":\n%s.'
+                      % (self.name, self.options['url'], error),
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(severe)
+            csv_file = io.StringInput(
+                source=csv_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            csv_data = csv_file.read().splitlines()
+        else:
+            error = self.state_machine.reporter.warning(
+                'The "%s" directive requires content; none supplied.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return csv_data, source
+
+    def parse_csv_data_into_rows(self, csv_data, dialect, source):
+        # csv.py doesn't do Unicode; encode temporarily as UTF-8
+        csv_reader = csv.reader([(line.encode('utf-8') + '\n')
+                                for line in csv_data],
+                                dialect=dialect)
+        rows = []
+        max_cols = 0
+        for row in csv_reader:
+            row_data = []
+            for cell in row:
+                # decode UTF-8 back to Unicode
+                cell_text = unicode(cell, 'utf-8')
+                cell_data = (0, 0, 0, statemachine.StringList(
+                    cell_text.splitlines(), source=source))
+                row_data.append(cell_data)
+            rows.append(row_data)
+            max_cols = max(max_cols, len(row))
+        return rows, max_cols
+
+
+class ListTable(Table):
+
+    """
+    Implement tables whose data is encoded as a uniform two-level bullet list.
+    For further ideas, see
+    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
+    """ 
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'widths': directives.positive_int_list,
+                   'class': directives.class_option}
+
+    def run(self):
+        if not self.content:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is empty; content required.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return [error]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        try:
+            num_cols, col_widths = self.check_list_content(node)
+            table_data = [[item.children for item in row_list[0]]
+                          for row_list in node[0]]
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(table_data, header_rows, stub_columns)
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        table_node = self.build_table_from_list(table_data, col_widths,
+                                                header_rows, stub_columns)
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def check_list_content(self, node):
+        if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: '
+                'exactly one bullet list expected.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            raise SystemMessagePropagation(error)
+        list_node = node[0]
+        # Check for a uniform two-level bullet list:
+        for item_index in range(len(list_node)):
+            item = list_node[item_index]
+            if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
+                error = self.state_machine.reporter.error(
+                    'Error parsing content block for the "%s" directive: '
+                    'two-level bullet list expected, but row %s does not '
+                    'contain a second-level bullet list.'
+                    % (self.name, item_index + 1), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            elif item_index:
+                # ATTN pychecker users: num_cols is guaranteed to be set in the
+                # "else" clause below for item_index==0, before this branch is
+                # triggered.
+                if len(item[0]) != num_cols:
+                    error = self.state_machine.reporter.error(
+                        'Error parsing content block for the "%s" directive: '
+                        'uniform two-level bullet list expected, but row %s '
+                        'does not contain the same number of items as row 1 '
+                        '(%s vs %s).'
+                        % (self.name, item_index + 1, len(item[0]), num_cols),
+                        nodes.literal_block(self.block_text, self.block_text),
+                        line=self.lineno)
+                    raise SystemMessagePropagation(error)
+            else:
+                num_cols = len(item[0])
+        col_widths = self.get_column_widths(num_cols)
+        return num_cols, col_widths
+
+    def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns):
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(col_widths))
+        table += tgroup
+        for col_width in col_widths:
+            colspec = nodes.colspec(colwidth=col_width)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        rows = []
+        for row in table_data:
+            row_node = nodes.row()
+            for cell in row:
+                entry = nodes.entry()
+                entry += cell
+                row_node += entry
+            rows.append(row_node)
+        if header_rows:
+            thead = nodes.thead()
+            thead.extend(rows[:header_rows])
+            tgroup += thead
+        tbody = nodes.tbody()
+        tbody.extend(rows[header_rows:])
+        tgroup += tbody
+        return table
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,17 @@
+============================================
+ ``docutils/parsers/rst/include`` Directory
+============================================
+
+This directory contains standard data files intended for inclusion in
+reStructuredText documents.  To access these files, use the "include"
+directive with the special syntax for standard "include" data files,
+angle brackets around the file name::
+
+    .. include:: <isonum.txt>
+
+See the documentation for the `"include" directive`__ and
+`reStructuredText Standard Substitution Definition Sets`__ for
+details.
+
+__ http://docutils.sf.net/docs/ref/rst/directives.html#include
+__ http://docutils.sf.net/docs/ref/rst/substitutions.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,162 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angzarr|  unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+.. |cirmid|   unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
+.. |cudarrl|  unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
+.. |cudarrr|  unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+.. |cularr|   unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |cularrp|  unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+.. |curarr|   unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |curarrm|  unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
+.. |Darr|     unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr2|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |ddarr|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
+.. |dfisht|   unicode:: U+0297F .. DOWN FISH TAIL
+.. |dHar|     unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |dharl|    unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |dharr|    unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |dlarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |drarr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |duarr|    unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |duhar|    unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
+.. |erarr|    unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |harrcir|  unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+.. |harrw|    unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |hoarr|    unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
+.. |imof|     unicode:: U+022B7 .. IMAGE OF
+.. |lAarr|    unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |Larr|     unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |larr2|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |larrbfs|  unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |larrfs|   unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
+.. |larrhk|   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |larrlp|   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |larrpl|   unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
+.. |larrsim|  unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
+.. |larrtl|   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |lAtail|   unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
+.. |latail|   unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
+.. |lBarr|    unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
+.. |lbarr|    unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
+.. |ldca|     unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+.. |ldrdhar|  unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
+.. |ldsh|     unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
+.. |lfisht|   unicode:: U+0297C .. LEFT FISH TAIL
+.. |lHar|     unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |lhard|    unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |lharu|    unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |lharul|   unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |llarr|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |llhard|   unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |loarr|    unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
+.. |lrarr|    unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrarr2|   unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrhar|    unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhar2|   unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhard|   unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |lsh|      unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
+.. |luruhar|  unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+.. |Map|      unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
+.. |map|      unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |midcir|   unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
+.. |mumap|    unicode:: U+022B8 .. MULTIMAP
+.. |nearhk|   unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
+.. |neArr|    unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
+.. |nearr|    unicode:: U+02197 .. NORTH EAST ARROW
+.. |nesear|   unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |nhArr|    unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nharr|    unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nlArr|    unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nlarr|    unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nrArr|    unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrarr|    unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nrarrc|   unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
+.. |nrarrw|   unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
+.. |nvHarr|   unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvlArr|   unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvrArr|   unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nwarhk|   unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
+.. |nwArr|    unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
+.. |nwarr|    unicode:: U+02196 .. NORTH WEST ARROW
+.. |nwnear|   unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
+.. |olarr|    unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |orarr|    unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |origof|   unicode:: U+022B6 .. ORIGINAL OF
+.. |rAarr|    unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rarr|     unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |rarr2|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rarrap|   unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+.. |rarrbfs|  unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |rarrc|    unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
+.. |rarrfs|   unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
+.. |rarrhk|   unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |rarrlp|   unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |rarrpl|   unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
+.. |rarrsim|  unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+.. |Rarrtl|   unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+.. |rarrtl|   unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |rarrw|    unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |rAtail|   unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
+.. |ratail|   unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
+.. |RBarr|    unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |rBarr|    unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |rbarr|    unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |rdca|     unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+.. |rdldhar|  unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |rdsh|     unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
+.. |rfisht|   unicode:: U+0297D .. RIGHT FISH TAIL
+.. |rHar|     unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |rhard|    unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rharu|    unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rharul|   unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |rlarr|    unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlarr2|   unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlhar|    unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rlhar2|   unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |roarr|    unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
+.. |rrarr|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rsh|      unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |ruluhar|  unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+.. |searhk|   unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |seArr|    unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
+.. |searr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |seswar|   unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |simrarr|  unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+.. |slarr|    unicode:: U+02190 .. LEFTWARDS ARROW
+.. |srarr|    unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |swarhk|   unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |swArr|    unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
+.. |swarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |swnwar|   unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
+.. |Uarr|     unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr2|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+.. |udarr|    unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |udhar|    unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |ufisht|   unicode:: U+0297E .. UP FISH TAIL
+.. |uHar|     unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |uharl|    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |uharr|    unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |uuarr|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |vArr|     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |varr|     unicode:: U+02195 .. UP DOWN ARROW
+.. |xhArr|    unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |xharr|    unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |xlArr|    unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |xlarr|    unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |xmap|     unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |xrArr|    unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |xrarr|    unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |zigrarr|  unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,126 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ac|       unicode:: U+0223E .. INVERTED LAZY S
+.. |acE|      unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
+.. |amalg|    unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
+.. |barvee|   unicode:: U+022BD .. NOR
+.. |Barwed|   unicode:: U+02306 .. PERSPECTIVE
+.. |barwed|   unicode:: U+02305 .. PROJECTIVE
+.. |bsolb|    unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
+.. |Cap|      unicode:: U+022D2 .. DOUBLE INTERSECTION
+.. |capand|   unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
+.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
+.. |capcap|   unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+.. |capcup|   unicode:: U+02A47 .. INTERSECTION ABOVE UNION
+.. |capdot|   unicode:: U+02A40 .. INTERSECTION WITH DOT
+.. |caps|     unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
+.. |ccaps|    unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
+.. |ccups|    unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
+.. |ccupssm|  unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+.. |coprod|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Cup|      unicode:: U+022D3 .. DOUBLE UNION
+.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
+.. |cupcap|   unicode:: U+02A46 .. UNION ABOVE INTERSECTION
+.. |cupcup|   unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
+.. |cupdot|   unicode:: U+0228D .. MULTISET MULTIPLICATION
+.. |cupor|    unicode:: U+02A45 .. UNION WITH LOGICAL OR
+.. |cups|     unicode:: U+0222A U+0FE00 .. UNION with serifs
+.. |cuvee|    unicode:: U+022CE .. CURLY LOGICAL OR
+.. |cuwed|    unicode:: U+022CF .. CURLY LOGICAL AND
+.. |Dagger|   unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger|   unicode:: U+02020 .. DAGGER
+.. |diam|     unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |divonx|   unicode:: U+022C7 .. DIVISION TIMES
+.. |eplus|    unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
+.. |hercon|   unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
+.. |intcal|   unicode:: U+022BA .. INTERCALATE
+.. |iprod|    unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |loplus|   unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
+.. |lotimes|  unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+.. |lthree|   unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |ltimes|   unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |midast|   unicode:: U+0002A .. ASTERISK
+.. |minusb|   unicode:: U+0229F .. SQUARED MINUS
+.. |minusd|   unicode:: U+02238 .. DOT MINUS
+.. |minusdu|  unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
+.. |ncap|     unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
+.. |ncup|     unicode:: U+02A42 .. UNION WITH OVERBAR
+.. |oast|     unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |ocir|     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |odash|    unicode:: U+0229D .. CIRCLED DASH
+.. |odiv|     unicode:: U+02A38 .. CIRCLED DIVISION SIGN
+.. |odot|     unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |odsold|   unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+.. |ofcir|    unicode:: U+029BF .. CIRCLED BULLET
+.. |ogt|      unicode:: U+029C1 .. CIRCLED GREATER-THAN
+.. |ohbar|    unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
+.. |olcir|    unicode:: U+029BE .. CIRCLED WHITE BULLET
+.. |olt|      unicode:: U+029C0 .. CIRCLED LESS-THAN
+.. |omid|     unicode:: U+029B6 .. CIRCLED VERTICAL BAR
+.. |ominus|   unicode:: U+02296 .. CIRCLED MINUS
+.. |opar|     unicode:: U+029B7 .. CIRCLED PARALLEL
+.. |operp|    unicode:: U+029B9 .. CIRCLED PERPENDICULAR
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |osol|     unicode:: U+02298 .. CIRCLED DIVISION SLASH
+.. |Otimes|   unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+.. |ovbar|    unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
+.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+.. |plusb|    unicode:: U+0229E .. SQUARED PLUS
+.. |pluscir|  unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
+.. |plusdo|   unicode:: U+02214 .. DOT PLUS
+.. |plusdu|   unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
+.. |pluse|    unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
+.. |plussim|  unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
+.. |plustwo|  unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |race|     unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
+.. |roplus|   unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
+.. |rotimes|  unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+.. |rthree|   unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |rtimes|   unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |sdotb|    unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |setmn|    unicode:: U+02216 .. SET MINUS
+.. |simplus|  unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
+.. |smashp|   unicode:: U+02A33 .. SMASH PRODUCT
+.. |solb|     unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
+.. |sqcap|    unicode:: U+02293 .. SQUARE CAP
+.. |sqcaps|   unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
+.. |sqcup|    unicode:: U+02294 .. SQUARE CUP
+.. |sqcups|   unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
+.. |ssetmn|   unicode:: U+02216 .. SET MINUS
+.. |sstarf|   unicode:: U+022C6 .. STAR OPERATOR
+.. |subdot|   unicode:: U+02ABD .. SUBSET WITH DOT
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |supdot|   unicode:: U+02ABE .. SUPERSET WITH DOT
+.. |timesb|   unicode:: U+022A0 .. SQUARED TIMES
+.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
+.. |timesd|   unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |tridot|   unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
+.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
+.. |triplus|  unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
+.. |trisb|    unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
+.. |tritime|  unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
+.. |uplus|    unicode:: U+0228E .. MULTISET UNION
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |wedbar|   unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
+.. |wreath|   unicode:: U+02240 .. WREATH PRODUCT
+.. |xcap|     unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |xcirc|    unicode:: U+025EF .. LARGE CIRCLE
+.. |xcup|     unicode:: U+022C3 .. N-ARY UNION
+.. |xdtri|    unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |xodot|    unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |xoplus|   unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |xotime|   unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |xsqcup|   unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |xuplus|   unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |xutri|    unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |xvee|     unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |xwedge|   unicode:: U+022C0 .. N-ARY LOGICAL AND
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |dlcorn|  unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |drcorn|  unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |gtlPar|  unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
+.. |langd|   unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
+.. |lbrke|   unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
+.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |lceil|   unicode:: U+02308 .. LEFT CEILING
+.. |lfloor|  unicode:: U+0230A .. LEFT FLOOR
+.. |lmoust|  unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lpargt|  unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
+.. |lparlt|  unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
+.. |ltrPar|  unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
+.. |rangd|   unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
+.. |rbrke|   unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
+.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |rceil|   unicode:: U+02309 .. RIGHT CEILING
+.. |rfloor|  unicode:: U+0230B .. RIGHT FLOOR
+.. |rmoust|  unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |rpargt|  unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
+.. |ulcorn|  unicode:: U+0231C .. TOP LEFT CORNER
+.. |urcorn|  unicode:: U+0231D .. TOP RIGHT CORNER
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |gnap|     unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gnE|      unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |gne|      unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gnsim|    unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
+.. |gvnE|     unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |lnap|     unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lnE|      unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |lne|      unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lnsim|    unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
+.. |lvnE|     unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |nap|      unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |napE|     unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
+.. |napid|    unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
+.. |ncong|    unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
+.. |nequiv|   unicode:: U+02262 .. NOT IDENTICAL TO
+.. |ngE|      unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |nge|      unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |nges|     unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |nGg|      unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
+.. |ngsim|    unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |nGt|      unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
+.. |ngt|      unicode:: U+0226F .. NOT GREATER-THAN
+.. |nGtv|     unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |nlE|      unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nle|      unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nles|     unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nLl|      unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
+.. |nlsim|    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |nLt|      unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
+.. |nlt|      unicode:: U+0226E .. NOT LESS-THAN
+.. |nltri|    unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |nltrie|   unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |nLtv|     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |nmid|     unicode:: U+02224 .. DOES NOT DIVIDE
+.. |npar|     unicode:: U+02226 .. NOT PARALLEL TO
+.. |npr|      unicode:: U+02280 .. DOES NOT PRECEDE
+.. |nprcue|   unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |npre|     unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nrtri|    unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |nrtrie|   unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nsc|      unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsccue|   unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |nsce|     unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsim|     unicode:: U+02241 .. NOT TILDE
+.. |nsime|    unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsmid|    unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nspar|    unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsqsube|  unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |nsqsupe|  unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |nsubE|    unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsube|    unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsup|     unicode:: U+02285 .. NOT A SUPERSET OF
+.. |nsupE|    unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |nsupe|    unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |ntgl|     unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |ntlg|     unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |nvap|     unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
+.. |nVDash|   unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |nVdash|   unicode:: U+022AE .. DOES NOT FORCE
+.. |nvDash|   unicode:: U+022AD .. NOT TRUE
+.. |nvdash|   unicode:: U+022AC .. DOES NOT PROVE
+.. |nvge|     unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
+.. |nvgt|     unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
+.. |nvle|     unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
+.. |nvlt|     unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
+.. |nvltrie|  unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
+.. |nvrtrie|  unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
+.. |nvsim|    unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
+.. |parsim|   unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
+.. |prnap|    unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |prnE|     unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |prnsim|   unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |rnmid|    unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+.. |scnap|    unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |scnE|     unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |scnsim|   unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |simne|    unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+.. |solbar|   unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
+.. |subnE|    unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |subne|    unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |supnE|    unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |supne|    unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |vnsub|    unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |vnsup|    unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |vsubnE|   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsubne|   unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupnE|   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupne|   unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |ange|     unicode:: U+029A4 .. ANGLE WITH UNDERBAR
+.. |angmsd|   unicode:: U+02221 .. MEASURED ANGLE
+.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+.. |angrtvb|  unicode:: U+022BE .. RIGHT ANGLE WITH ARC
+.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
+.. |bbrk|     unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+.. |bemptyv|  unicode:: U+029B0 .. REVERSED EMPTY SET
+.. |beth|     unicode:: U+02136 .. BET SYMBOL
+.. |boxbox|   unicode:: U+029C9 .. TWO JOINED SQUARES
+.. |bprime|   unicode:: U+02035 .. REVERSED PRIME
+.. |bsemi|    unicode:: U+0204F .. REVERSED SEMICOLON
+.. |cemptyv|  unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
+.. |cirE|     unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+.. |cirscir|  unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+.. |comp|     unicode:: U+02201 .. COMPLEMENT
+.. |daleth|   unicode:: U+02138 .. DALET SYMBOL
+.. |demptyv|  unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
+.. |ell|      unicode:: U+02113 .. SCRIPT SMALL L
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |emptyv|   unicode:: U+02205 .. EMPTY SET
+.. |gimel|    unicode:: U+02137 .. GIMEL SYMBOL
+.. |iiota|    unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |imath|    unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |inodot|   unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |jmath|    unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |jnodot|   unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
+.. |lltri|    unicode:: U+025FA .. LOWER LEFT TRIANGLE
+.. |lrtri|    unicode:: U+022BF .. RIGHT TRIANGLE
+.. |mho|      unicode:: U+02127 .. INVERTED OHM SIGN
+.. |nang|     unicode:: U+02220 U+020D2 .. ANGLE with vertical line
+.. |nexist|   unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |oS|       unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |planck|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |plankv|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
+.. |range|    unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |sbsol|    unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
+.. |tbrk|     unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |ultri|    unicode:: U+025F8 .. UPPER LEFT TRIANGLE
+.. |urtri|    unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
+.. |vprime|   unicode:: U+02032 .. PRIME
+.. |vzigzag|  unicode:: U+0299A .. VERTICAL ZIGZAG LINE
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,191 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |apE|      unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
+.. |ape|      unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |apid|     unicode:: U+0224B .. TRIPLE TILDE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Barv|     unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
+.. |bcong|    unicode:: U+0224C .. ALL EQUAL TO
+.. |bepsi|    unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |bowtie|   unicode:: U+022C8 .. BOWTIE
+.. |bsim|     unicode:: U+0223D .. REVERSED TILDE
+.. |bsime|    unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
+.. |bump|     unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpE|    unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
+.. |bumpe|    unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |cire|     unicode:: U+02257 .. RING EQUAL TO
+.. |Colon|    unicode:: U+02237 .. PROPORTION
+.. |Colone|   unicode:: U+02A74 .. DOUBLE COLON EQUAL
+.. |colone|   unicode:: U+02254 .. COLON EQUALS
+.. |congdot|  unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
+.. |csub|     unicode:: U+02ACF .. CLOSED SUBSET
+.. |csube|    unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
+.. |csup|     unicode:: U+02AD0 .. CLOSED SUPERSET
+.. |csupe|    unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
+.. |cuepr|    unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |cuesc|    unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |cupre|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Dashv|    unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |dashv|    unicode:: U+022A3 .. LEFT TACK
+.. |easter|   unicode:: U+02A6E .. EQUALS WITH ASTERISK
+.. |ecir|     unicode:: U+02256 .. RING IN EQUAL TO
+.. |ecolon|   unicode:: U+02255 .. EQUALS COLON
+.. |eDDot|    unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |eDot|     unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |efDot|    unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |eg|       unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
+.. |egs|      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |egsdot|   unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+.. |el|       unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
+.. |els|      unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |elsdot|   unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+.. |equest|   unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |equivDD|  unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
+.. |erDot|    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |esdot|    unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |Esim|     unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
+.. |esim|     unicode:: U+02242 .. MINUS TILDE
+.. |fork|     unicode:: U+022D4 .. PITCHFORK
+.. |forkv|    unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
+.. |frown|    unicode:: U+02322 .. FROWN
+.. |gap|      unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gE|       unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |gEl|      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gel|      unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |ges|      unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gescc|    unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |gesdot|   unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |gesdoto|  unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+.. |gesl|     unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
+.. |gesles|   unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+.. |Gg|       unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gl|       unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gla|      unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
+.. |glE|      unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+.. |glj|      unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
+.. |gsdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gsim|     unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gsime|    unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
+.. |gsiml|    unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+.. |Gt|       unicode:: U+0226B .. MUCH GREATER-THAN
+.. |gtcc|     unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
+.. |gtcir|    unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
+.. |gtdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtquest|  unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
+.. |gtrarr|   unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
+.. |homtht|   unicode:: U+0223B .. HOMOTHETIC
+.. |lap|      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lat|      unicode:: U+02AAB .. LARGER THAN
+.. |late|     unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
+.. |lates|    unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
+.. |ldot|     unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lE|       unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |lEg|      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |leg|      unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |les|      unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lescc|    unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |lesdot|   unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |lesdoto|  unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+.. |lesg|     unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
+.. |lesges|   unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+.. |lg|       unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lgE|      unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+.. |Ll|       unicode:: U+022D8 .. VERY MUCH LESS-THAN
+.. |lsim|     unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |lsime|    unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
+.. |lsimg|    unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+.. |Lt|       unicode:: U+0226A .. MUCH LESS-THAN
+.. |ltcc|     unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
+.. |ltcir|    unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
+.. |ltdot|    unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |ltlarr|   unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
+.. |ltquest|  unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
+.. |ltrie|    unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |mcomma|   unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
+.. |mDDot|    unicode:: U+0223A .. GEOMETRIC PROPORTION
+.. |mid|      unicode:: U+02223 .. DIVIDES
+.. |mlcp|     unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
+.. |models|   unicode:: U+022A7 .. MODELS
+.. |mstpos|   unicode:: U+0223E .. INVERTED LAZY S
+.. |Pr|       unicode:: U+02ABB .. DOUBLE PRECEDES
+.. |pr|       unicode:: U+0227A .. PRECEDES
+.. |prap|     unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |prcue|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |prE|      unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
+.. |pre|      unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |prsim|    unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |prurel|   unicode:: U+022B0 .. PRECEDES UNDER RELATION
+.. |ratio|    unicode:: U+02236 .. RATIO
+.. |rtrie|    unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+.. |samalg|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Sc|       unicode:: U+02ABC .. DOUBLE SUCCEEDS
+.. |sc|       unicode:: U+0227B .. SUCCEEDS
+.. |scap|     unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |sccue|    unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |scE|      unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
+.. |sce|      unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |scsim|    unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |sdote|    unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
+.. |sfrown|   unicode:: U+02322 .. FROWN
+.. |simg|     unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
+.. |simgE|    unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+.. |siml|     unicode:: U+02A9D .. SIMILAR OR LESS-THAN
+.. |simlE|    unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+.. |smid|     unicode:: U+02223 .. DIVIDES
+.. |smile|    unicode:: U+02323 .. SMILE
+.. |smt|      unicode:: U+02AAA .. SMALLER THAN
+.. |smte|     unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
+.. |smtes|    unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
+.. |spar|     unicode:: U+02225 .. PARALLEL TO
+.. |sqsub|    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsube|   unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsup|    unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupe|   unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |ssmile|   unicode:: U+02323 .. SMILE
+.. |Sub|      unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subE|     unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |subedot|  unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
+.. |submult|  unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
+.. |subplus|  unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
+.. |subrarr|  unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
+.. |subsim|   unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
+.. |subsub|   unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
+.. |subsup|   unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
+.. |Sup|      unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supdsub|  unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+.. |supE|     unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supedot|  unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+.. |suphsol|  unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
+.. |suphsub|  unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
+.. |suplarr|  unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
+.. |supmult|  unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
+.. |supplus|  unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
+.. |supsim|   unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
+.. |supsub|   unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
+.. |supsup|   unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
+.. |thkap|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thksim|   unicode:: U+0223C .. TILDE OPERATOR
+.. |topfork|  unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
+.. |trie|     unicode:: U+0225C .. DELTA EQUAL TO
+.. |twixt|    unicode:: U+0226C .. BETWEEN
+.. |Vbar|     unicode:: U+02AEB .. DOUBLE UP TACK
+.. |vBar|     unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
+.. |vBarv|    unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
+.. |VDash|    unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |Vdash|    unicode:: U+022A9 .. FORCES
+.. |vDash|    unicode:: U+022A8 .. TRUE
+.. |vdash|    unicode:: U+022A2 .. RIGHT TACK
+.. |Vdashl|   unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |vltri|    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vprop|    unicode:: U+0221D .. PROPORTIONAL TO
+.. |vrtri|    unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vvdash|   unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
+.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
+.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
+.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
+.. |boxH|  unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
+.. |boxh|  unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
+.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
+.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
+.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
+.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
+.. |boxV|  unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
+.. |boxv|  unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
+.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
+.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Acy|    unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
+.. |acy|    unicode:: U+00430 .. CYRILLIC SMALL LETTER A
+.. |Bcy|    unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
+.. |bcy|    unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
+.. |CHcy|   unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
+.. |chcy|   unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
+.. |Dcy|    unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
+.. |dcy|    unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
+.. |Ecy|    unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
+.. |ecy|    unicode:: U+0044D .. CYRILLIC SMALL LETTER E
+.. |Fcy|    unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
+.. |fcy|    unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
+.. |Gcy|    unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
+.. |gcy|    unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
+.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
+.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
+.. |Icy|    unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
+.. |icy|    unicode:: U+00438 .. CYRILLIC SMALL LETTER I
+.. |IEcy|   unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
+.. |iecy|   unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
+.. |IOcy|   unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
+.. |iocy|   unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
+.. |Jcy|    unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
+.. |jcy|    unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
+.. |Kcy|    unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
+.. |kcy|    unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
+.. |KHcy|   unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
+.. |khcy|   unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
+.. |Lcy|    unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
+.. |lcy|    unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
+.. |Mcy|    unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
+.. |mcy|    unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
+.. |Ncy|    unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
+.. |ncy|    unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
+.. |numero| unicode:: U+02116 .. NUMERO SIGN
+.. |Ocy|    unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
+.. |ocy|    unicode:: U+0043E .. CYRILLIC SMALL LETTER O
+.. |Pcy|    unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
+.. |pcy|    unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
+.. |Rcy|    unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
+.. |rcy|    unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
+.. |Scy|    unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
+.. |scy|    unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
+.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
+.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
+.. |SHcy|   unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
+.. |shcy|   unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
+.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
+.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
+.. |Tcy|    unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
+.. |tcy|    unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
+.. |TScy|   unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
+.. |tscy|   unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
+.. |Ucy|    unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
+.. |ucy|    unicode:: U+00443 .. CYRILLIC SMALL LETTER U
+.. |Vcy|    unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
+.. |vcy|    unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
+.. |YAcy|   unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
+.. |yacy|   unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
+.. |Ycy|    unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
+.. |ycy|    unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
+.. |YUcy|   unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
+.. |yucy|   unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
+.. |Zcy|    unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
+.. |zcy|    unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
+.. |ZHcy|   unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
+.. |zhcy|   unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |DJcy|   unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
+.. |djcy|   unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
+.. |DScy|   unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
+.. |dscy|   unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
+.. |DZcy|   unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
+.. |dzcy|   unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
+.. |GJcy|   unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
+.. |gjcy|   unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
+.. |Iukcy|  unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |iukcy|  unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
+.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
+.. |Jukcy|  unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
+.. |jukcy|  unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
+.. |KJcy|   unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
+.. |kjcy|   unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
+.. |LJcy|   unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
+.. |ljcy|   unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
+.. |NJcy|   unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
+.. |njcy|   unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
+.. |TSHcy|  unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
+.. |tshcy|  unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
+.. |Ubrcy|  unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
+.. |ubrcy|  unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
+.. |YIcy|   unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
+.. |yicy|   unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
+.. |breve| unicode:: U+002D8 .. BREVE
+.. |caron| unicode:: U+002C7 .. CARON
+.. |cedil| unicode:: U+000B8 .. CEDILLA
+.. |circ|  unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |die|   unicode:: U+000A8 .. DIAERESIS
+.. |dot|   unicode:: U+002D9 .. DOT ABOVE
+.. |grave| unicode:: U+00060 .. GRAVE ACCENT
+.. |macr|  unicode:: U+000AF .. MACRON
+.. |ogon|  unicode:: U+002DB .. OGONEK
+.. |ring|  unicode:: U+002DA .. RING ABOVE
+.. |tilde| unicode:: U+002DC .. SMALL TILDE
+.. |uml|   unicode:: U+000A8 .. DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Agr|  unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |agr|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |Bgr|  unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |bgr|  unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |Dgr|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |dgr|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Egr|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |egr|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |Ggr|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |ggr|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Igr|  unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |igr|  unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |Kgr|  unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kgr|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Lgr|  unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lgr|  unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |Mgr|  unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mgr|  unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |Ngr|  unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |ngr|  unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Ogr|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |ogr|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Pgr|  unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pgr|  unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |Rgr|  unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rgr|  unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |Sgr|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sgr|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |Tgr|  unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tgr|  unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |Ugr|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |ugr|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xgr|  unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xgr|  unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zgr|  unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zgr|  unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacgr|  unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
+.. |aacgr|  unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
+.. |Eacgr|  unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
+.. |eacgr|  unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
+.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
+.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
+.. |Iacgr|  unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
+.. |iacgr|  unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
+.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+.. |Idigr|  unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+.. |idigr|  unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
+.. |Oacgr|  unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
+.. |oacgr|  unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
+.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
+.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
+.. |Uacgr|  unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
+.. |uacgr|  unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
+.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+.. |Udigr|  unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+.. |udigr|  unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alpha|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |beta|   unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |chi|    unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Delta|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |epsi|   unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsis|  unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsiv|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |eta|    unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Gamma|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |iota|   unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |kappa|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |mu|     unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nu|     unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Omega|  unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|  unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Phi|    unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|    unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phis|   unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phiv|   unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |Pi|     unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|     unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|    unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Psi|    unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|    unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |rho|    unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |rhov|   unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |Sigma|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |tau|    unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |Theta|  unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|  unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |Upsi|   unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |upsi|   unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xi|     unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|     unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |zeta|   unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.alpha|  unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
+.. |b.beta|   unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
+.. |b.chi|    unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
+.. |b.Delta|  unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
+.. |b.delta|  unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
+.. |b.epsi|   unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
+.. |b.epsiv|  unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
+.. |b.eta|    unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
+.. |b.Gamma|  unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
+.. |b.gamma|  unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |b.iota|   unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
+.. |b.kappa|  unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
+.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
+.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
+.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
+.. |b.mu|     unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
+.. |b.nu|     unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
+.. |b.Omega|  unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
+.. |b.omega|  unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
+.. |b.Phi|    unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
+.. |b.phi|    unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
+.. |b.phiv|   unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
+.. |b.Pi|     unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
+.. |b.pi|     unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
+.. |b.piv|    unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
+.. |b.Psi|    unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
+.. |b.psi|    unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
+.. |b.rho|    unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
+.. |b.rhov|   unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
+.. |b.Sigma|  unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
+.. |b.sigma|  unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
+.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
+.. |b.tau|    unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
+.. |b.Theta|  unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
+.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
+.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
+.. |b.Upsi|   unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
+.. |b.upsi|   unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
+.. |b.Xi|     unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
+.. |b.xi|     unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
+.. |b.zeta|   unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,128 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
+.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
+.. |Amacr|  unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
+.. |amacr|  unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
+.. |Aogon|  unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
+.. |aogon|  unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
+.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
+.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
+.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
+.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
+.. |Ccirc|  unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+.. |ccirc|  unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
+.. |Cdot|   unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
+.. |cdot|   unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
+.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
+.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
+.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
+.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
+.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
+.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
+.. |Edot|   unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
+.. |edot|   unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
+.. |Emacr|  unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
+.. |emacr|  unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
+.. |ENG|    unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
+.. |eng|    unicode:: U+0014B .. LATIN SMALL LETTER ENG
+.. |Eogon|  unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
+.. |eogon|  unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
+.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
+.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
+.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
+.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
+.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
+.. |Gcirc|  unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+.. |gcirc|  unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
+.. |Gdot|   unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
+.. |gdot|   unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
+.. |Hcirc|  unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+.. |hcirc|  unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
+.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
+.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
+.. |Idot|   unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
+.. |IJlig|  unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
+.. |ijlig|  unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
+.. |Imacr|  unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
+.. |imacr|  unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
+.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |Iogon|  unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
+.. |iogon|  unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
+.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
+.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
+.. |Jcirc|  unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+.. |jcirc|  unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
+.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
+.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
+.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
+.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
+.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
+.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
+.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
+.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
+.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
+.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
+.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
+.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
+.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
+.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
+.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
+.. |napos|  unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
+.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
+.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
+.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
+.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |Omacr|  unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
+.. |omacr|  unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
+.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
+.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
+.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
+.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
+.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
+.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
+.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
+.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
+.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
+.. |Scirc|  unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+.. |scirc|  unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
+.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
+.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
+.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
+.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
+.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
+.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
+.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
+.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
+.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
+.. |Umacr|  unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
+.. |umacr|  unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
+.. |Uogon|  unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
+.. |uogon|  unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
+.. |Uring|  unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
+.. |uring|  unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
+.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
+.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
+.. |Wcirc|  unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+.. |wcirc|  unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
+.. |Ycirc|  unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+.. |ycirc|  unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
+.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
+.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
+.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
+.. |Zdot|   unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
+.. |zdot|   unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
+.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
+.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
+.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
+.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
+.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
+.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
+.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
+.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
+.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
+.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
+.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
+.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
+.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
+.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
+.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
+.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
+.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
+.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
+.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
+.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
+.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
+.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
+.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
+.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
+.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
+.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
+.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
+.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
+.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
+.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
+.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
+.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
+.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
+.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
+.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
+.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
+.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
+.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
+.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
+.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
+.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
+.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,13 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
+.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
+.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
+.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
+.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
+.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
+.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
+.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
+.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
+.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
+.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
+.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
+.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
+.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
+.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
+.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
+.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
+.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
+.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
+.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
+.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
+.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
+.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
+.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
+.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
+.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
+.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
+.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
+.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
+.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
+.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
+.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
+.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,17 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |amp|    unicode:: U+00026 .. AMPERSAND
+.. |apos|   unicode:: U+00027 .. APOSTROPHE
+.. |ast|    unicode:: U+0002A .. ASTERISK
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |bsol|   unicode:: U+0005C .. REVERSE SOLIDUS
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |colon|  unicode:: U+0003A .. COLON
+.. |comma|  unicode:: U+0002C .. COMMA
+.. |commat| unicode:: U+00040 .. COMMERCIAL AT
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |darr|   unicode:: U+02193 .. DOWNWARDS ARROW
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
+.. |equals| unicode:: U+0003D .. EQUALS SIGN
+.. |excl|   unicode:: U+00021 .. EXCLAMATION MARK
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
+.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
+.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |half|   unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
+.. |hyphen| unicode:: U+02010 .. HYPHEN
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |larr|   unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lcub|   unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lowbar| unicode:: U+0005F .. LOW LINE
+.. |lpar|   unicode:: U+00028 .. LEFT PARENTHESIS
+.. |lsqb|   unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |num|    unicode:: U+00023 .. NUMBER SIGN
+.. |ohm|    unicode:: U+02126 .. OHM SIGN
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |percnt| unicode:: U+00025 .. PERCENT SIGN
+.. |period| unicode:: U+0002E .. FULL STOP
+.. |plus|   unicode:: U+0002B .. PLUS SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |quest|  unicode:: U+0003F .. QUESTION MARK
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |rarr|   unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rcub|   unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |rpar|   unicode:: U+00029 .. RIGHT PARENTHESIS
+.. |rsqb|   unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |semi|   unicode:: U+0003B .. SEMICOLON
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sol|    unicode:: U+0002F .. SOLIDUS
+.. |sung|   unicode:: U+0266A .. EIGHTH NOTE
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |trade|  unicode:: U+02122 .. TRADE MARK SIGN
+.. |uarr|   unicode:: U+02191 .. UPWARDS ARROW
+.. |verbar| unicode:: U+0007C .. VERTICAL LINE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |blank|  unicode:: U+02423 .. OPEN BOX
+.. |blk12|  unicode:: U+02592 .. MEDIUM SHADE
+.. |blk14|  unicode:: U+02591 .. LIGHT SHADE
+.. |blk34|  unicode:: U+02593 .. DARK SHADE
+.. |block|  unicode:: U+02588 .. FULL BLOCK
+.. |bull|   unicode:: U+02022 .. BULLET
+.. |caret|  unicode:: U+02041 .. CARET INSERTION POINT
+.. |check|  unicode:: U+02713 .. CHECK MARK
+.. |cir|    unicode:: U+025CB .. WHITE CIRCLE
+.. |clubs|  unicode:: U+02663 .. BLACK CLUB SUIT
+.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
+.. |cross|  unicode:: U+02717 .. BALLOT X
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |dash|   unicode:: U+02010 .. HYPHEN
+.. |diams|  unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
+.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
+.. |dtri|   unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |dtrif|  unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
+.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |female| unicode:: U+02640 .. FEMALE SIGN
+.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
+.. |fflig|  unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
+.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
+.. |filig|  unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
+.. |flat|   unicode:: U+0266D .. MUSIC FLAT SIGN
+.. |fllig|  unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
+.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
+.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
+.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
+.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
+.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
+.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
+.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
+.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
+.. |hairsp| unicode:: U+0200A .. HAIR SPACE
+.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
+.. |incare| unicode:: U+02105 .. CARE OF
+.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |lhblk|  unicode:: U+02584 .. LOWER HALF BLOCK
+.. |loz|    unicode:: U+025CA .. LOZENGE
+.. |lozf|   unicode:: U+029EB .. BLACK LOZENGE
+.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |ltri|   unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |ltrif|  unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |male|   unicode:: U+02642 .. MALE SIGN
+.. |malt|   unicode:: U+02720 .. MALTESE CROSS
+.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |mldr|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |natur|  unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |nldr|   unicode:: U+02025 .. TWO DOT LEADER
+.. |numsp|  unicode:: U+02007 .. FIGURE SPACE
+.. |phone|  unicode:: U+0260E .. BLACK TELEPHONE
+.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
+.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rect|   unicode:: U+025AD .. WHITE RECTANGLE
+.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |rtri|   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |rtrif|  unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |rx|     unicode:: U+0211E .. PRESCRIPTION TAKE
+.. |sext|   unicode:: U+02736 .. SIX POINTED BLACK STAR
+.. |sharp|  unicode:: U+0266F .. MUSIC SHARP SIGN
+.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
+.. |squ|    unicode:: U+025A1 .. WHITE SQUARE
+.. |squf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |star|   unicode:: U+02606 .. WHITE STAR
+.. |starf|  unicode:: U+02605 .. BLACK STAR
+.. |target| unicode:: U+02316 .. POSITION INDICATOR
+.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |uhblk|  unicode:: U+02580 .. UPPER HALF BLOCK
+.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
+.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
+.. |utri|   unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |utrif|  unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,168 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acd|      unicode:: U+0223F .. SINE WAVE
+.. |aleph|    unicode:: U+02135 .. ALEF SYMBOL
+.. |And|      unicode:: U+02A53 .. DOUBLE LOGICAL AND
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |andand|   unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
+.. |andd|     unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
+.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
+.. |andv|     unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
+.. |ang90|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angrt|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angsph|   unicode:: U+02222 .. SPHERICAL ANGLE
+.. |angst|    unicode:: U+0212B .. ANGSTROM SIGN
+.. |ap|       unicode:: U+02248 .. ALMOST EQUAL TO
+.. |apacir|   unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |awint|    unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
+.. |becaus|   unicode:: U+02235 .. BECAUSE
+.. |bernou|   unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bne|      unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
+.. |bnequiv|  unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
+.. |bNot|     unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
+.. |bnot|     unicode:: U+02310 .. REVERSED NOT SIGN
+.. |bottom|   unicode:: U+022A5 .. UP TACK
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Cconint|  unicode:: U+02230 .. VOLUME INTEGRAL
+.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
+.. |compfn|   unicode:: U+02218 .. RING OPERATOR
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |Conint|   unicode:: U+0222F .. SURFACE INTEGRAL
+.. |conint|   unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |ctdot|    unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |cwint|    unicode:: U+02231 .. CLOCKWISE INTEGRAL
+.. |cylcty|   unicode:: U+0232D .. CYLINDRICITY
+.. |disin|    unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
+.. |Dot|      unicode:: U+000A8 .. DIAERESIS
+.. |DotDot|   unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
+.. |dsol|     unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
+.. |dtdot|    unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
+.. |dwangle|  unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
+.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |epar|     unicode:: U+022D5 .. EQUAL AND PARALLEL TO
+.. |eparsl|   unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fltns|    unicode:: U+025B1 .. WHITE PARALLELOGRAM
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hamilt|   unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |iff|      unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |iinfin|   unicode:: U+029DC .. INCOMPLETE INFINITY
+.. |imped|    unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
+.. |Int|      unicode:: U+0222C .. DOUBLE INTEGRAL
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |isindot|  unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
+.. |isinE|    unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
+.. |isins|    unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinsv|   unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinv|    unicode:: U+02208 .. ELEMENT OF
+.. |lagran|   unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Lang|     unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |lbbrk|    unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |loang|    unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
+.. |lobrk|    unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |lopar|    unicode:: U+02985 .. LEFT WHITE PARENTHESIS
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |mnplus|   unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |nedot|    unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
+.. |nhpar|    unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |nis|      unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |nisd|     unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
+.. |niv|      unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Not|      unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
+.. |notinE|   unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
+.. |notinva|  unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notinvb|  unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
+.. |notinvc|  unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
+.. |notni|    unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notniva|  unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notnivb|  unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
+.. |notnivc|  unicode:: U+022FD .. CONTAINS WITH OVERBAR
+.. |nparsl|   unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
+.. |npart|    unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
+.. |npolint|  unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
+.. |nvinfin|  unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
+.. |olcross|  unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
+.. |Or|       unicode:: U+02A54 .. DOUBLE LOGICAL OR
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |ord|      unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
+.. |order|    unicode:: U+02134 .. SCRIPT SMALL O
+.. |oror|     unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
+.. |orslope|  unicode:: U+02A57 .. SLOPING LARGE OR
+.. |orv|      unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
+.. |par|      unicode:: U+02225 .. PARALLEL TO
+.. |parsl|    unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |permil|   unicode:: U+02030 .. PER MILLE SIGN
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |pertenk|  unicode:: U+02031 .. PER TEN THOUSAND SIGN
+.. |phmmat|   unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
+.. |profline| unicode:: U+02312 .. ARC
+.. |profsurf| unicode:: U+02313 .. SEGMENT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |qint|     unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |qprime|   unicode:: U+02057 .. QUADRUPLE PRIME
+.. |quatint|  unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |Rang|     unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rbbrk|    unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
+.. |roang|    unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
+.. |robrk|    unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |ropar|    unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
+.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |simdot|   unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
+.. |sime|     unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+.. |square|   unicode:: U+025A1 .. WHITE SQUARE
+.. |squarf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |strns|    unicode:: U+000AF .. MACRON
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |tdot|     unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |tint|     unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |topbot|   unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
+.. |topcir|   unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
+.. |tprime|   unicode:: U+02034 .. TRIPLE PRIME
+.. |utdot|    unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
+.. |uwangle|  unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
+.. |vangrt|   unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
+.. |veeeq|    unicode:: U+0225A .. EQUIANGULAR TO
+.. |Verbar|   unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |wedgeq|   unicode:: U+02259 .. ESTIMATES
+.. |xnis|     unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,554 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angle|                           unicode:: U+02220 .. ANGLE
+.. |ApplyFunction|                   unicode:: U+02061 .. FUNCTION APPLICATION
+.. |approx|                          unicode:: U+02248 .. ALMOST EQUAL TO
+.. |approxeq|                        unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |Assign|                          unicode:: U+02254 .. COLON EQUALS
+.. |backcong|                        unicode:: U+0224C .. ALL EQUAL TO
+.. |backepsilon|                     unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |backprime|                       unicode:: U+02035 .. REVERSED PRIME
+.. |backsim|                         unicode:: U+0223D .. REVERSED TILDE
+.. |backsimeq|                       unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |Backslash|                       unicode:: U+02216 .. SET MINUS
+.. |barwedge|                        unicode:: U+02305 .. PROJECTIVE
+.. |Because|                         unicode:: U+02235 .. BECAUSE
+.. |because|                         unicode:: U+02235 .. BECAUSE
+.. |Bernoullis|                      unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |between|                         unicode:: U+0226C .. BETWEEN
+.. |bigcap|                          unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |bigcirc|                         unicode:: U+025EF .. LARGE CIRCLE
+.. |bigcup|                          unicode:: U+022C3 .. N-ARY UNION
+.. |bigodot|                         unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |bigoplus|                        unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |bigotimes|                       unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |bigsqcup|                        unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |bigstar|                         unicode:: U+02605 .. BLACK STAR
+.. |bigtriangledown|                 unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |bigtriangleup|                   unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |biguplus|                        unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |bigvee|                          unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |bigwedge|                        unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |bkarow|                          unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |blacklozenge|                    unicode:: U+029EB .. BLACK LOZENGE
+.. |blacksquare|                     unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |blacktriangle|                   unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |blacktriangledown|               unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |blacktriangleleft|               unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |blacktriangleright|              unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |bot|                             unicode:: U+022A5 .. UP TACK
+.. |boxminus|                        unicode:: U+0229F .. SQUARED MINUS
+.. |boxplus|                         unicode:: U+0229E .. SQUARED PLUS
+.. |boxtimes|                        unicode:: U+022A0 .. SQUARED TIMES
+.. |Breve|                           unicode:: U+002D8 .. BREVE
+.. |bullet|                          unicode:: U+02022 .. BULLET
+.. |Bumpeq|                          unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpeq|                          unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |CapitalDifferentialD|            unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |Cayleys|                         unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Cedilla|                         unicode:: U+000B8 .. CEDILLA
+.. |CenterDot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |centerdot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |checkmark|                       unicode:: U+02713 .. CHECK MARK
+.. |circeq|                          unicode:: U+02257 .. RING EQUAL TO
+.. |circlearrowleft|                 unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |circlearrowright|                unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |circledast|                      unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |circledcirc|                     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |circleddash|                     unicode:: U+0229D .. CIRCLED DASH
+.. |CircleDot|                       unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |circledR|                        unicode:: U+000AE .. REGISTERED SIGN
+.. |circledS|                        unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |CircleMinus|                     unicode:: U+02296 .. CIRCLED MINUS
+.. |CirclePlus|                      unicode:: U+02295 .. CIRCLED PLUS
+.. |CircleTimes|                     unicode:: U+02297 .. CIRCLED TIMES
+.. |ClockwiseContourIntegral|        unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |CloseCurlyDoubleQuote|           unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |CloseCurlyQuote|                 unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |clubsuit|                        unicode:: U+02663 .. BLACK CLUB SUIT
+.. |coloneq|                         unicode:: U+02254 .. COLON EQUALS
+.. |complement|                      unicode:: U+02201 .. COMPLEMENT
+.. |complexes|                       unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Congruent|                       unicode:: U+02261 .. IDENTICAL TO
+.. |ContourIntegral|                 unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |Coproduct|                       unicode:: U+02210 .. N-ARY COPRODUCT
+.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |CupCap|                          unicode:: U+0224D .. EQUIVALENT TO
+.. |curlyeqprec|                     unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |curlyeqsucc|                     unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |curlyvee|                        unicode:: U+022CE .. CURLY LOGICAL OR
+.. |curlywedge|                      unicode:: U+022CF .. CURLY LOGICAL AND
+.. |curvearrowleft|                  unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |curvearrowright|                 unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |dbkarow|                         unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |ddagger|                         unicode:: U+02021 .. DOUBLE DAGGER
+.. |ddotseq|                         unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |Del|                             unicode:: U+02207 .. NABLA
+.. |DiacriticalAcute|                unicode:: U+000B4 .. ACUTE ACCENT
+.. |DiacriticalDot|                  unicode:: U+002D9 .. DOT ABOVE
+.. |DiacriticalDoubleAcute|          unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |DiacriticalGrave|                unicode:: U+00060 .. GRAVE ACCENT
+.. |DiacriticalTilde|                unicode:: U+002DC .. SMALL TILDE
+.. |Diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamondsuit|                     unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |DifferentialD|                   unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |digamma|                         unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |div|                             unicode:: U+000F7 .. DIVISION SIGN
+.. |divideontimes|                   unicode:: U+022C7 .. DIVISION TIMES
+.. |doteq|                           unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |doteqdot|                        unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |DotEqual|                        unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |dotminus|                        unicode:: U+02238 .. DOT MINUS
+.. |dotplus|                         unicode:: U+02214 .. DOT PLUS
+.. |dotsquare|                       unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |doublebarwedge|                  unicode:: U+02306 .. PERSPECTIVE
+.. |DoubleContourIntegral|           unicode:: U+0222F .. SURFACE INTEGRAL
+.. |DoubleDot|                       unicode:: U+000A8 .. DIAERESIS
+.. |DoubleDownArrow|                 unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |DoubleLeftArrow|                 unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |DoubleLeftRightArrow|            unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |DoubleLeftTee|                   unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |DoubleLongLeftArrow|             unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |DoubleLongLeftRightArrow|        unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |DoubleLongRightArrow|            unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightArrow|                unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightTee|                  unicode:: U+022A8 .. TRUE
+.. |DoubleUpArrow|                   unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |DoubleUpDownArrow|               unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |DoubleVerticalBar|               unicode:: U+02225 .. PARALLEL TO
+.. |DownArrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Downarrow|                       unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |downarrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |DownArrowUpArrow|                unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |downdownarrows|                  unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |downharpoonleft|                 unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |downharpoonright|                unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |DownLeftVector|                  unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownRightVector|                 unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownTee|                         unicode:: U+022A4 .. DOWN TACK
+.. |DownTeeArrow|                    unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |drbkarow|                        unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |Element|                         unicode:: U+02208 .. ELEMENT OF
+.. |emptyset|                        unicode:: U+02205 .. EMPTY SET
+.. |eqcirc|                          unicode:: U+02256 .. RING IN EQUAL TO
+.. |eqcolon|                         unicode:: U+02255 .. EQUALS COLON
+.. |eqsim|                           unicode:: U+02242 .. MINUS TILDE
+.. |eqslantgtr|                      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |eqslantless|                     unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |EqualTilde|                      unicode:: U+02242 .. MINUS TILDE
+.. |Equilibrium|                     unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |Exists|                          unicode:: U+02203 .. THERE EXISTS
+.. |expectation|                     unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |ExponentialE|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |exponentiale|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |fallingdotseq|                   unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |ForAll|                          unicode:: U+02200 .. FOR ALL
+.. |Fouriertrf|                      unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |geq|                             unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |geqq|                            unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |geqslant|                        unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gg|                              unicode:: U+0226B .. MUCH GREATER-THAN
+.. |ggg|                             unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gnapprox|                        unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gneq|                            unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gneqq|                           unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |GreaterEqual|                    unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |GreaterEqualLess|                unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |GreaterFullEqual|                unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |GreaterLess|                     unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |GreaterSlantEqual|               unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |GreaterTilde|                    unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gtrapprox|                       unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gtrdot|                          unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtreqless|                       unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |gtreqqless|                      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gtrless|                         unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gtrsim|                          unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gvertneqq|                       unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |Hacek|                           unicode:: U+002C7 .. CARON
+.. |hbar|                            unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |heartsuit|                       unicode:: U+02665 .. BLACK HEART SUIT
+.. |HilbertSpace|                    unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hksearow|                        unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |hkswarow|                        unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |hookleftarrow|                   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |hookrightarrow|                  unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |hslash|                          unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |HumpDownHump|                    unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |HumpEqual|                       unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |iiiint|                          unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |iiint|                           unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |Im|                              unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ImaginaryI|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |imagline|                        unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |imagpart|                        unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Implies|                         unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |in|                              unicode:: U+02208 .. ELEMENT OF
+.. |integers|                        unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
+.. |Integral|                        unicode:: U+0222B .. INTEGRAL
+.. |intercal|                        unicode:: U+022BA .. INTERCALATE
+.. |Intersection|                    unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |intprod|                         unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |InvisibleComma|                  unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |InvisibleTimes|                  unicode:: U+02062 .. INVISIBLE TIMES
+.. |langle|                          unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |Laplacetrf|                      unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lbrace|                          unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |lbrack|                          unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |LeftAngleBracket|                unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |LeftArrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |Leftarrow|                       unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |leftarrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |LeftArrowBar|                    unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftArrowRightArrow|             unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftarrowtail|                   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |LeftCeiling|                     unicode:: U+02308 .. LEFT CEILING
+.. |LeftDoubleBracket|               unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |LeftDownVector|                  unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftFloor|                       unicode:: U+0230A .. LEFT FLOOR
+.. |leftharpoondown|                 unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |leftharpoonup|                   unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leftleftarrows|                  unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |LeftRightArrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |Leftrightarrow|                  unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |leftrightarrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |leftrightarrows|                 unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftrightharpoons|               unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |leftrightsquigarrow|             unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |LeftTee|                         unicode:: U+022A3 .. LEFT TACK
+.. |LeftTeeArrow|                    unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |leftthreetimes|                  unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |LeftTriangle|                    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |LeftTriangleEqual|               unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |LeftUpVector|                    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftVector|                      unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leq|                             unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |leqq|                            unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |leqslant|                        unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lessapprox|                      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lessdot|                         unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lesseqgtr|                       unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |lesseqqgtr|                      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |LessEqualGreater|                unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |LessFullEqual|                   unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |LessGreater|                     unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lessgtr|                         unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lesssim|                         unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |LessSlantEqual|                  unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |LessTilde|                       unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |ll|                              unicode:: U+0226A .. MUCH LESS-THAN
+.. |llcorner|                        unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |Lleftarrow|                      unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |lmoustache|                      unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lnapprox|                        unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lneq|                            unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lneqq|                           unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |LongLeftArrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |Longleftarrow|                   unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |longleftarrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |LongLeftRightArrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |Longleftrightarrow|              unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |longleftrightarrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |longmapsto|                      unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |LongRightArrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |Longrightarrow|                  unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |longrightarrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |looparrowleft|                   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |looparrowright|                  unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |LowerLeftArrow|                  unicode:: U+02199 .. SOUTH WEST ARROW
+.. |LowerRightArrow|                 unicode:: U+02198 .. SOUTH EAST ARROW
+.. |lozenge|                         unicode:: U+025CA .. LOZENGE
+.. |lrcorner|                        unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |Lsh|                             unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lvertneqq|                       unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |maltese|                         unicode:: U+02720 .. MALTESE CROSS
+.. |mapsto|                          unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |measuredangle|                   unicode:: U+02221 .. MEASURED ANGLE
+.. |Mellintrf|                       unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |MinusPlus|                       unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |mp|                              unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |multimap|                        unicode:: U+022B8 .. MULTIMAP
+.. |napprox|                         unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |natural|                         unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |naturals|                        unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |nearrow|                         unicode:: U+02197 .. NORTH EAST ARROW
+.. |NegativeMediumSpace|             unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThickSpace|              unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThinSpace|               unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeVeryThinSpace|           unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NestedGreaterGreater|            unicode:: U+0226B .. MUCH GREATER-THAN
+.. |NestedLessLess|                  unicode:: U+0226A .. MUCH LESS-THAN
+.. |nexists|                         unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |ngeq|                            unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |ngeqq|                           unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |ngeqslant|                       unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |ngtr|                            unicode:: U+0226F .. NOT GREATER-THAN
+.. |nLeftarrow|                      unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nleftarrow|                      unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nLeftrightarrow|                 unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nleftrightarrow|                 unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nleq|                            unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nleqq|                           unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nleqslant|                       unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nless|                           unicode:: U+0226E .. NOT LESS-THAN
+.. |NonBreakingSpace|                unicode:: U+000A0 .. NO-BREAK SPACE
+.. |NotCongruent|                    unicode:: U+02262 .. NOT IDENTICAL TO
+.. |NotDoubleVerticalBar|            unicode:: U+02226 .. NOT PARALLEL TO
+.. |NotElement|                      unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |NotEqual|                        unicode:: U+02260 .. NOT EQUAL TO
+.. |NotEqualTilde|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NotExists|                       unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |NotGreater|                      unicode:: U+0226F .. NOT GREATER-THAN
+.. |NotGreaterEqual|                 unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |NotGreaterFullEqual|             unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |NotGreaterGreater|               unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |NotGreaterLess|                  unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |NotGreaterSlantEqual|            unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |NotGreaterTilde|                 unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |NotHumpDownHump|                 unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |NotLeftTriangle|                 unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |NotLeftTriangleEqual|            unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |NotLess|                         unicode:: U+0226E .. NOT LESS-THAN
+.. |NotLessEqual|                    unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |NotLessGreater|                  unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |NotLessLess|                     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |NotLessSlantEqual|               unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |NotLessTilde|                    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |NotPrecedes|                     unicode:: U+02280 .. DOES NOT PRECEDE
+.. |NotPrecedesEqual|                unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotPrecedesSlantEqual|           unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |NotReverseElement|               unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |NotRightTriangle|                unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |NotRightTriangleEqual|           unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |NotSquareSubsetEqual|            unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |NotSquareSupersetEqual|          unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |NotSubset|                       unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |NotSubsetEqual|                  unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |NotSucceeds|                     unicode:: U+02281 .. DOES NOT SUCCEED
+.. |NotSucceedsEqual|                unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotSucceedsSlantEqual|           unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |NotSuperset|                     unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |NotSupersetEqual|                unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |NotTilde|                        unicode:: U+02241 .. NOT TILDE
+.. |NotTildeEqual|                   unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |NotTildeFullEqual|               unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |NotTildeTilde|                   unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |NotVerticalBar|                  unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nparallel|                       unicode:: U+02226 .. NOT PARALLEL TO
+.. |nprec|                           unicode:: U+02280 .. DOES NOT PRECEDE
+.. |npreceq|                         unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nRightarrow|                     unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrightarrow|                     unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nshortmid|                       unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nshortparallel|                  unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsimeq|                          unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsubset|                         unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |nsubseteq|                       unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsubseteqq|                      unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsucc|                           unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsucceq|                         unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsupset|                         unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |nsupseteq|                       unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |nsupseteqq|                      unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |ntriangleleft|                   unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |ntrianglelefteq|                 unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |ntriangleright|                  unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |ntrianglerighteq|                unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nwarrow|                         unicode:: U+02196 .. NORTH WEST ARROW
+.. |oint|                            unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |OpenCurlyDoubleQuote|            unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |OpenCurlyQuote|                  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |orderof|                         unicode:: U+02134 .. SCRIPT SMALL O
+.. |parallel|                        unicode:: U+02225 .. PARALLEL TO
+.. |PartialD|                        unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |pitchfork|                       unicode:: U+022D4 .. PITCHFORK
+.. |PlusMinus|                       unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pm|                              unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |Poincareplane|                   unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |prec|                            unicode:: U+0227A .. PRECEDES
+.. |precapprox|                      unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |preccurlyeq|                     unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Precedes|                        unicode:: U+0227A .. PRECEDES
+.. |PrecedesEqual|                   unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |PrecedesSlantEqual|              unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |PrecedesTilde|                   unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |preceq|                          unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |precnapprox|                     unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |precneqq|                        unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |precnsim|                        unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |precsim|                         unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |primes|                          unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Proportion|                      unicode:: U+02237 .. PROPORTION
+.. |Proportional|                    unicode:: U+0221D .. PROPORTIONAL TO
+.. |propto|                          unicode:: U+0221D .. PROPORTIONAL TO
+.. |quaternions|                     unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |questeq|                         unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |rangle|                          unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rationals|                       unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |rbrace|                          unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rbrack|                          unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |Re|                              unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |realine|                         unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |realpart|                        unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |reals|                           unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |ReverseElement|                  unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |ReverseEquilibrium|              unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |ReverseUpEquilibrium|            unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |RightAngleBracket|               unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |RightArrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |Rightarrow|                      unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rightarrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |RightArrowBar|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightArrowLeftArrow|             unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightarrowtail|                  unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |RightCeiling|                    unicode:: U+02309 .. RIGHT CEILING
+.. |RightDoubleBracket|              unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |RightDownVector|                 unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightFloor|                      unicode:: U+0230B .. RIGHT FLOOR
+.. |rightharpoondown|                unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rightharpoonup|                  unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rightleftarrows|                 unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightleftharpoons|               unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rightrightarrows|                unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rightsquigarrow|                 unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |RightTee|                        unicode:: U+022A2 .. RIGHT TACK
+.. |RightTeeArrow|                   unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |rightthreetimes|                 unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |RightTriangle|                   unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |RightTriangleEqual|              unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |RightUpVector|                   unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightVector|                     unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |risingdotseq|                    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |rmoustache|                      unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |Rrightarrow|                     unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rsh|                             unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |searrow|                         unicode:: U+02198 .. SOUTH EAST ARROW
+.. |setminus|                        unicode:: U+02216 .. SET MINUS
+.. |ShortDownArrow|                  unicode:: U+02193 .. DOWNWARDS ARROW
+.. |ShortLeftArrow|                  unicode:: U+02190 .. LEFTWARDS ARROW
+.. |shortmid|                        unicode:: U+02223 .. DIVIDES
+.. |shortparallel|                   unicode:: U+02225 .. PARALLEL TO
+.. |ShortRightArrow|                 unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |ShortUpArrow|                    unicode:: U+02191 .. UPWARDS ARROW
+.. |simeq|                           unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |SmallCircle|                     unicode:: U+02218 .. RING OPERATOR
+.. |smallsetminus|                   unicode:: U+02216 .. SET MINUS
+.. |spadesuit|                       unicode:: U+02660 .. BLACK SPADE SUIT
+.. |Sqrt|                            unicode:: U+0221A .. SQUARE ROOT
+.. |sqsubset|                        unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsubseteq|                      unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsupset|                        unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupseteq|                      unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |Square|                          unicode:: U+025A1 .. WHITE SQUARE
+.. |SquareIntersection|              unicode:: U+02293 .. SQUARE CAP
+.. |SquareSubset|                    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |SquareSubsetEqual|               unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |SquareSuperset|                  unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |SquareSupersetEqual|             unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |SquareUnion|                     unicode:: U+02294 .. SQUARE CUP
+.. |Star|                            unicode:: U+022C6 .. STAR OPERATOR
+.. |straightepsilon|                 unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |straightphi|                     unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Subset|                          unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subset|                          unicode:: U+02282 .. SUBSET OF
+.. |subseteq|                        unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subseteqq|                       unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |SubsetEqual|                     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subsetneq|                       unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |subsetneqq|                      unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |succ|                            unicode:: U+0227B .. SUCCEEDS
+.. |succapprox|                      unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |succcurlyeq|                     unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |Succeeds|                        unicode:: U+0227B .. SUCCEEDS
+.. |SucceedsEqual|                   unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |SucceedsSlantEqual|              unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |SucceedsTilde|                   unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |succeq|                          unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |succnapprox|                     unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |succneqq|                        unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |succnsim|                        unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |succsim|                         unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |SuchThat|                        unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Sum|                             unicode:: U+02211 .. N-ARY SUMMATION
+.. |Superset|                        unicode:: U+02283 .. SUPERSET OF
+.. |SupersetEqual|                   unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Supset|                          unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supset|                          unicode:: U+02283 .. SUPERSET OF
+.. |supseteq|                        unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |supseteqq|                       unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supsetneq|                       unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |supsetneqq|                      unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |swarrow|                         unicode:: U+02199 .. SOUTH WEST ARROW
+.. |Therefore|                       unicode:: U+02234 .. THEREFORE
+.. |therefore|                       unicode:: U+02234 .. THEREFORE
+.. |thickapprox|                     unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thicksim|                        unicode:: U+0223C .. TILDE OPERATOR
+.. |ThinSpace|                       unicode:: U+02009 .. THIN SPACE
+.. |Tilde|                           unicode:: U+0223C .. TILDE OPERATOR
+.. |TildeEqual|                      unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |TildeFullEqual|                  unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |TildeTilde|                      unicode:: U+02248 .. ALMOST EQUAL TO
+.. |toea|                            unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |tosa|                            unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |triangle|                        unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |triangledown|                    unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |triangleleft|                    unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |trianglelefteq|                  unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |triangleq|                       unicode:: U+0225C .. DELTA EQUAL TO
+.. |triangleright|                   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |trianglerighteq|                 unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |TripleDot|                       unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |twoheadleftarrow|                unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |twoheadrightarrow|               unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |ulcorner|                        unicode:: U+0231C .. TOP LEFT CORNER
+.. |Union|                           unicode:: U+022C3 .. N-ARY UNION
+.. |UnionPlus|                       unicode:: U+0228E .. MULTISET UNION
+.. |UpArrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |Uparrow|                         unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uparrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |UpArrowDownArrow|                unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |UpDownArrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |Updownarrow|                     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |updownarrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |UpEquilibrium|                   unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |upharpoonleft|                   unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |upharpoonright|                  unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |UpperLeftArrow|                  unicode:: U+02196 .. NORTH WEST ARROW
+.. |UpperRightArrow|                 unicode:: U+02197 .. NORTH EAST ARROW
+.. |upsilon|                         unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |UpTee|                           unicode:: U+022A5 .. UP TACK
+.. |UpTeeArrow|                      unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |upuparrows|                      unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |urcorner|                        unicode:: U+0231D .. TOP RIGHT CORNER
+.. |varepsilon|                      unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |varkappa|                        unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |varnothing|                      unicode:: U+02205 .. EMPTY SET
+.. |varphi|                          unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |varpi|                           unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |varpropto|                       unicode:: U+0221D .. PROPORTIONAL TO
+.. |varrho|                          unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |varsigma|                        unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |varsubsetneq|                    unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsubsetneqq|                   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneq|                    unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneqq|                   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vartheta|                        unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |vartriangleleft|                 unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vartriangleright|                unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vee|                             unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |vee|                             unicode:: U+02228 .. LOGICAL OR
+.. |Vert|                            unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |vert|                            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalBar|                     unicode:: U+02223 .. DIVIDES
+.. |VerticalTilde|                   unicode:: U+02240 .. WREATH PRODUCT
+.. |VeryThinSpace|                   unicode:: U+0200A .. HAIR SPACE
+.. |Wedge|                           unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |wedge|                           unicode:: U+02227 .. LOGICAL AND
+.. |wp|                              unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |wr|                              unicode:: U+02240 .. WREATH PRODUCT
+.. |zeetrf|                          unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |aopf|                    unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |bopf|                    unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
+.. |copf|                    unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |dopf|                    unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |eopf|                    unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |fopf|                    unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
+.. |gopf|                    unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |hopf|                    unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |iopf|                    unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |jopf|                    unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
+.. |kopf|                    unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |lopf|                    unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |mopf|                    unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |nopf|                    unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |oopf|                    unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |popf|                    unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |qopf|                    unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |ropf|                    unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |sopf|                    unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |topf|                    unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |uopf|                    unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |vopf|                    unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
+.. |wopf|                    unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
+.. |xopf|                    unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
+.. |yopf|                    unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |zopf|                    unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+.. Definitions of interpreted text roles (classes) for S5/HTML data.
+.. This data file has been placed in the public domain.
+
+.. Colours
+   =======
+
+.. role:: black
+.. role:: gray
+.. role:: silver
+.. role:: white
+
+.. role:: maroon
+.. role:: red
+.. role:: magenta
+.. role:: fuchsia
+.. role:: pink
+.. role:: orange
+.. role:: yellow
+.. role:: lime
+.. role:: green
+.. role:: olive
+.. role:: teal
+.. role:: cyan
+.. role:: aqua
+.. role:: blue
+.. role:: navy
+.. role:: purple
+
+
+.. Text Sizes
+   ==========
+
+.. role:: huge
+.. role:: big
+.. role:: small
+.. role:: tiny
+
+
+.. Display in Slides (Presentation Mode) Only
+   ==========================================
+
+.. role:: slide
+   :class: slide-display
+
+
+.. Display in Outline Mode Only
+   ============================
+
+.. role:: outline
+
+
+.. Display in Print Only
+   =====================
+
+.. role:: print
+
+
+.. Display in Handout Mode Only
+   ============================
+
+.. role:: handout
+
+
+.. Incremental Display
+   ===================
+
+.. role:: incremental
+.. default-role:: incremental
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |acute|  unicode:: U+000B4 .. ACUTE ACCENT
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |cedil|  unicode:: U+000B8 .. CEDILLA
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |macr|   unicode:: U+000AF .. MACRON
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |uml|    unicode:: U+000A8 .. DIAERESIS
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |bdquo|  unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |circ|   unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |euro|   unicode:: U+020AC .. EURO SIGN
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lrm|    unicode:: U+0200E .. LEFT-TO-RIGHT MARK
+.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |permil| unicode:: U+02030 .. PER MILLE SIGN
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rlm|    unicode:: U+0200F .. RIGHT-TO-LEFT MARK
+.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sbquo|  unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |tilde|  unicode:: U+002DC .. SMALL TILDE
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |zwj|    unicode:: U+0200D .. ZERO WIDTH JOINER
+.. |zwnj|   unicode:: U+0200C .. ZERO WIDTH NON-JOINER
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,130 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alefsym|  unicode:: U+02135 .. ALEF SYMBOL
+.. |Alpha|    unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |alpha|    unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Beta|     unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |beta|     unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |bull|     unicode:: U+02022 .. BULLET
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Chi|      unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |chi|      unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |clubs|    unicode:: U+02663 .. BLACK CLUB SUIT
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |crarr|    unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr|     unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Delta|    unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|    unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |diams|    unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |Epsilon|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |epsilon|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |Eta|      unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eta|      unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |frasl|    unicode:: U+02044 .. FRACTION SLASH
+.. |Gamma|    unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|    unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |hearts|   unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |Iota|     unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |iota|     unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |Kappa|    unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kappa|    unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |Lambda|   unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda|   unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |larr|     unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lceil|    unicode:: U+02308 .. LEFT CEILING
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |lfloor|   unicode:: U+0230A .. LEFT FLOOR
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |loz|      unicode:: U+025CA .. LOZENGE
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |Mu|       unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mu|       unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |Nu|       unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |nu|       unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |oline|    unicode:: U+0203E .. OVERLINE
+.. |Omega|    unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|    unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Omicron|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |omicron|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |Phi|      unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|      unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Pi|       unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|       unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|      unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |Psi|      unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|      unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rarr|     unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rceil|    unicode:: U+02309 .. RIGHT CEILING
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfloor|   unicode:: U+0230B .. RIGHT FLOOR
+.. |Rho|      unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rho|      unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |Sigma|    unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|    unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmaf|   unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |spades|   unicode:: U+02660 .. BLACK SPADE SUIT
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Tau|      unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tau|      unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |Theta|    unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|    unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |trade|    unicode:: U+02122 .. TRADE MARK SIGN
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr|     unicode:: U+02191 .. UPWARDS ARROW
+.. |upsih|    unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |Upsilon|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |upsilon|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |Xi|       unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|       unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zeta|     unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zeta|     unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    try:
+        module = __import__(language_code, globals(), locals())
+    except ImportError:
+        return None
+    _languages[language_code] = module
+    return module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'aandag': 'attention',
+      'versigtig': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'wenk': 'hint',
+      'belangrik': 'important',
+      'nota': 'note',
+      'tip': 'tip', # hint and tip both have the same translation: wenk
+      'waarskuwing': 'warning',
+      'vermaning': 'admonition',
+      'kantstreep': 'sidebar',
+      'onderwerp': 'topic',
+      'lynblok': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubriek': 'rubric',
+      'epigraaf': 'epigraph',
+      'hoogtepunte': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'vrae': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'beeldkaart': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'insluiting': 'include',
+      'rou': 'raw',
+      'vervang': 'replace',
+      'unicode': 'unicode', # should this be translated? unikode
+      'datum': 'date',
+      'klas': 'class',
+      'role (translation required)': 'role',
+      'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnote': 'footnotes',
+      #'aanhalings': 'citations',
+      'teikennotas': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Afrikaans name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    'afkorting': 'abbreviation',
+    'ab': 'abbreviation',
+    'akroniem': 'acronym',
+    'ac': 'acronym',
+    'indeks': 'index',
+    'i': 'index',
+    'voetskrif': 'subscript',
+    'sub': 'subscript',
+    'boskrif': 'superscript',
+    'sup': 'superscript',
+    'titelverwysing': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-verwysing': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-verwysing': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'sterk': 'strong',
+    'literal (translation required)': 'literal',
+    'benoemde verwysing': 'named-reference',
+    'anonieme verwysing': 'anonymous-reference',
+    'voetnootverwysing': 'footnote-reference',
+    'aanhalingverwysing': 'citation-reference',
+    'vervangingsverwysing': 'substitution-reference',
+    'teiken': 'target',
+    'uri-verwysing': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'rou': 'raw',}
+"""Mapping of Afrikaans role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,121 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atenci\u00F3': 'attention',
+      u'compte': 'caution',
+      u'perill': 'danger',
+      u'error': 'error',
+      u'suggeriment': 'hint',
+      u'important': 'important',
+      u'nota': 'note',
+      u'consell': 'tip',
+      u'av\u00EDs': 'warning',
+      u'advertiment': 'admonition',
+      u'nota-al-marge': 'sidebar',
+      u'nota-marge': 'sidebar',
+      u'tema': 'topic',
+      u'bloc-de-l\u00EDnies': 'line-block',
+      u'bloc-l\u00EDnies': 'line-block',
+      u'literal-analitzat': 'parsed-literal',
+      u'r\u00FAbrica': 'rubric',
+      u'ep\u00EDgraf': 'epigraph',
+      u'sumari': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'compost': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      u'taula': 'table',
+      u'taula-csv': 'csv-table',
+      u'taula-llista': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imatge': 'image',
+      u'figura': 'figure',
+      u'inclou': 'include',
+      u'incloure': 'include',
+      u'cru': 'raw',
+      u'reempla\u00E7a': 'replace',
+      u'reempla\u00E7ar': 'replace',
+      u'unicode': 'unicode',
+      u'data': 'date',
+      u'classe': 'class',
+      u'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'contingut': 'contents',
+      u'numsec': 'sectnum',
+      u'numeraci\u00F3-de-seccions': 'sectnum',
+      u'numeraci\u00F3-seccions': 'sectnum',
+      u'cap\u00E7alera': 'header',
+      u'peu-de-p\u00E0gina': 'footer',
+      u'peu-p\u00E0gina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'notes-amb-destinacions': 'target-notes',
+      u'notes-destinacions': 'target-notes',
+      u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
+"""Catalan name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abreviatura': 'abbreviation',
+    u'abreviaci\u00F3': 'abbreviation',
+    u'abrev': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acr\u00F2nim': 'acronym',
+    u'ac': 'acronym',
+    u'\u00EDndex': 'index',
+    u'i': 'index',
+    u'sub\u00EDndex': 'subscript',
+    u'sub': 'subscript',
+    u'super\u00EDndex': 'superscript',
+    u'sup': 'superscript',
+    u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
+    u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
+    u't\u00EDtol': 'title-reference',
+    u't': 'title-reference',
+    u'refer\u00E8ncia-a-pep': 'pep-reference',
+    u'refer\u00E8ncia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'refer\u00E8ncia-a-rfc': 'rfc-reference',
+    u'refer\u00E8ncia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'\u00E8mfasi': 'emphasis',
+    u'destacat': 'strong',
+    u'literal': 'literal',
+    u'refer\u00E8ncia-amb-nom': 'named-reference',
+    u'refer\u00E8ncia-nom': 'named-reference',
+    u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
+    u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-a-cita': 'citation-reference',
+    u'refer\u00E8ncia-cita': 'citation-reference',
+    u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
+    u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
+    u'destinaci\u00F3': 'target',
+    u'refer\u00E8ncia-a-uri': 'uri-reference',
+    u'refer\u00E8ncia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'cru': 'raw',}
+"""Mapping of Catalan role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'pozor': 'attention',
+      u'caution (translation required)': 'caution', # jak rozlisit caution a warning?
+      u'nebezpe\u010D\u00ED': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\u016Fle\u017Eit\u00E9': 'important',
+      u'pozn\u00E1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varov\u00E1n\u00ED': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\u00E9ma': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'odd\u00EDl': 'rubric',
+      u'moto': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta (translation required)': 'meta',
+      #'imagemap': 'imagemap',
+      u'image (translation required)': 'image',   # obrazek
+      u'figure (translation required)': 'figure', # a tady?
+      u'include (translation required)': 'include',
+      u'raw (translation required)': 'raw',
+      u'replace (translation required)': 'replace',
+      u'unicode (translation required)': 'unicode',
+      u'datum': 'date',
+      u't\u0159\u00EDda': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'sectnum (translation required)': 'sectnum',
+      u'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Czech name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbreviation (translation required)': 'abbreviation',
+    u'ab (translation required)': 'abbreviation',
+    u'acronym (translation required)': 'acronym',
+    u'ac (translation required)': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'subscript (translation required)': 'subscript',
+    u'sub (translation required)': 'subscript',
+    u'superscript (translation required)': 'superscript',
+    u'sup (translation required)': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'emphasis (translation required)': 'emphasis',
+    u'strong (translation required)': 'strong',
+    u'literal (translation required)': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Czech role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+# $Id: de.py 5174 2007-05-31 00:01:52Z wiemann $
+# Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
+#          Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'achtung': 'attention',
+      'vorsicht': 'caution',
+      'gefahr': 'danger',
+      'fehler': 'error',
+      'hinweis': 'hint',
+      'wichtig': 'important',
+      'notiz': 'note',
+      'tipp': 'tip',
+      'warnung': 'warning',
+      'ermahnung': 'admonition',
+      'kasten': 'sidebar',
+      'seitenkasten': 'sidebar',
+      'thema': 'topic',
+      'zeilen-block': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubrik': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote', # kasten too ?
+      'zusammengesetzt': 'compound',
+      'verbund': 'compound',
+      u'container (translation required)': 'container',
+      #'fragen': 'questions',
+      'tabelle': 'table',
+      'csv-tabelle': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'bild': 'image',
+      'abbildung': 'figure',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',
+      u'einf\xfcgen': 'include',
+      'ersetzung': 'replace',
+      'ersetzen': 'replace',
+      'ersetze': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rolle': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'inhalt': 'contents',
+      'kapitel-nummerierung': 'sectnum',
+      'abschnitts-nummerierung': 'sectnum',
+      u'linkziel-fu\xdfnoten': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'fu\xdfnoten': 'footnotes',
+      #'zitate': 'citations',
+      }
+"""German name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abk\xfcrzung': 'abbreviation',
+      'akronym': 'acronym',
+      'index': 'index',
+      'tiefgestellt': 'subscript',
+      'hochgestellt': 'superscript',
+      'titel-referenz': 'title-reference',
+      'pep-referenz': 'pep-reference',
+      'rfc-referenz': 'rfc-reference',
+      'betonung': 'emphasis',
+      'fett': 'strong',
+      u'w\xf6rtlich': 'literal',
+      'benannte-referenz': 'named-reference',
+      'unbenannte-referenz': 'anonymous-reference',
+      u'fu\xdfnoten-referenz': 'footnote-reference',
+      'zitat-referenz': 'citation-reference',
+      'ersetzungs-referenz': 'substitution-reference',
+      'ziel': 'target',
+      'uri-referenz': 'uri-reference',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',}
+"""Mapping of German role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention': 'attention',
+      'caution': 'caution',
+      'danger': 'danger',
+      'error': 'error',
+      'hint': 'hint',
+      'important': 'important',
+      'note': 'note',
+      'tip': 'tip',
+      'warning': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'image': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+      'class': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      'contents': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'subscript': 'subscript',
+    'sub': 'subscript',
+    'superscript': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atentu': 'attention',
+      u'zorgu': 'caution',
+      u'dangxero': 'danger',
+      u'dan\u011dero': 'danger',
+      u'eraro': 'error',
+      u'spuro': 'hint',
+      u'grava': 'important',
+      u'noto': 'note',
+      u'helpeto': 'tip',
+      u'averto': 'warning',
+      u'admono': 'admonition',
+      u'flankteksto': 'sidebar',
+      u'temo': 'topic',
+      u'linea-bloko': 'line-block',
+      u'analizota-literalo': 'parsed-literal',
+      u'rubriko': 'rubric',
+      u'epigrafo': 'epigraph',
+      u'elstarajxoj': 'highlights',
+      u'elstara\u0135oj': 'highlights',
+      u'ekstera-citajxo': 'pull-quote',
+      u'ekstera-cita\u0135o': 'pull-quote',
+      u'kombinajxo': 'compound',
+      u'kombina\u0135o': 'compound',
+      u'tekstingo': 'container',
+      u'enhavilo': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabelo': 'table',
+      u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
+      u'tabelo-csv': 'csv-table',
+      u'tabelo-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'bildo': 'image',
+      u'figuro': 'figure',
+      u'inkludi': 'include',
+      u'senanaliza': 'raw',
+      u'anstatauxi': 'replace',
+      u'anstata\u016di': 'replace',
+      u'unicode': 'unicode',
+      u'dato': 'date',
+      u'klaso': 'class',
+      u'rolo': 'role',
+      u'preterlasita-rolo': 'default-role',
+      u'titolo': 'title',
+      u'enhavo': 'contents',
+      u'seknum': 'sectnum',
+      u'sekcia-numerado': 'sectnum',
+      u'kapsekcio': 'header',
+      u'piedsekcio': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'celaj-notoj': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Esperanto name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'mallongigo': 'abbreviation',
+    u'mall': 'abbreviation',
+    u'komenclitero': 'acronym',
+    u'kl': 'acronym',
+    u'indekso': 'index',
+    u'i': 'index',
+    u'subskribo': 'subscript',
+    u'sub': 'subscript',
+    u'supraskribo': 'superscript',
+    u'sup': 'superscript',
+    u'titola-referenco': 'title-reference',
+    u'titolo': 'title-reference',
+    u't': 'title-reference',
+    u'pep-referenco': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'rfc-referenco': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'emfazo': 'emphasis',
+    u'forta': 'strong',
+    u'litera': 'literal',
+    u'nomita-referenco': 'named-reference',
+    u'nenomita-referenco': 'anonymous-reference',
+    u'piednota-referenco': 'footnote-reference',
+    u'citajxo-referenco': 'citation-reference',
+    u'cita\u0135o-referenco': 'citation-reference',
+    u'anstatauxa-referenco': 'substitution-reference',
+    u'anstata\u016da-referenco': 'substitution-reference',
+    u'celo': 'target',
+    u'uri-referenco': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'senanaliza': 'raw',
+}
+"""Mapping of Esperanto role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'atenci\u00f3n': 'attention',
+      u'atencion': 'attention',
+      u'precauci\u00f3n': 'caution',
+      u'precaucion': 'caution',
+      u'peligro': 'danger',
+      u'error': 'error',
+      u'sugerencia': 'hint',
+      u'importante': 'important',
+      u'nota': 'note',
+      u'consejo': 'tip',
+      u'advertencia': 'warning',
+      u'exhortacion': 'admonition',
+      u'exhortaci\u00f3n': 'admonition',
+      u'nota-al-margen': 'sidebar',
+      u'tema': 'topic',
+      u'bloque-de-lineas': 'line-block',
+      u'bloque-de-l\u00edneas': 'line-block',
+      u'literal-evaluado': 'parsed-literal',
+      u'firma': 'rubric',
+      u'ep\u00edgrafe': 'epigraph',
+      u'epigrafe': 'epigraph',
+      u'destacado': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'combinacion': 'compound',
+      u'combinaci\u00f3n': 'compound',
+      u'contenedor': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabla': 'table',
+      u'tabla-vsc': 'csv-table',
+      u'tabla-csv': 'csv-table',
+      u'tabla-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imagen': 'image',
+      u'figura': 'figure',
+      u'incluir': 'include',
+      u'sin-analisis': 'raw',
+      u'sin-an\u00e1lisis': 'raw',
+      u'reemplazar': 'replace',
+      u'unicode': 'unicode',
+      u'fecha': 'date',
+      u'clase': 'class',
+      u'rol': 'role',
+      u'rol-por-omision': 'default-role',
+      u'rol-por-omisi\u00f3n': 'default-role',
+      u'titulo': 'title',
+      u't\u00edtulo': 'title',
+      u'contenido': 'contents',
+      u'numseccion': 'sectnum',
+      u'numsecci\u00f3n': 'sectnum',
+      u'numeracion-seccion': 'sectnum',
+      u'numeraci\u00f3n-secci\u00f3n': 'sectnum',
+      u'notas-destino': 'target-notes',
+      u'cabecera': 'header',
+      u'pie': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Spanish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    u'abreviatura': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acronimo': 'acronym',
+    u'acronimo': 'acronym',
+    u'ac': 'acronym',
+    u'indice': 'index',
+    u'i': 'index',
+    u'subindice': 'subscript',
+    u'sub\u00edndice': 'subscript',
+    u'superindice': 'superscript',
+    u'super\u00edndice': 'superscript',
+    u'referencia-titulo': 'title-reference',
+    u'titulo': 'title-reference',
+    u't': 'title-reference',
+    u'referencia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'referencia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'enfasis': 'emphasis',
+    u'\u00e9nfasis': 'emphasis',
+    u'destacado': 'strong',
+    u'literal': 'literal',              # "literal" is also a word in Spanish :-)
+    u'referencia-con-nombre': 'named-reference',
+    u'referencia-anonima': 'anonymous-reference',
+    u'referencia-an\u00f3nima': 'anonymous-reference',
+    u'referencia-nota-al-pie': 'footnote-reference',
+    u'referencia-cita': 'citation-reference',
+    u'referencia-sustitucion': 'substitution-reference',
+    u'referencia-sustituci\u00f3n': 'substitution-reference',
+    u'destino': 'target',
+    u'referencia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'sin-analisis': 'raw',
+    u'sin-an\u00e1lisis': 'raw',
+}
+"""Mapping of Spanish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'huomio': u'attention',
+      u'varo': u'caution',
+      u'vaara': u'danger',
+      u'virhe': u'error',
+      u'vihje': u'hint',
+      u't\u00e4rke\u00e4\u00e4': u'important',
+      u'huomautus': u'note',
+      u'neuvo': u'tip',
+      u'varoitus': u'warning',
+      u'kehotus': u'admonition',
+      u'sivupalkki': u'sidebar',
+      u'aihe': u'topic',
+      u'rivi': u'line-block',
+      u'tasalevyinen': u'parsed-literal',
+      u'ohje': u'rubric',
+      u'epigraafi': u'epigraph',
+      u'kohokohdat': u'highlights',
+      u'lainaus': u'pull-quote',
+      u'taulukko': u'table',
+      u'csv-taulukko': u'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'kysymykset': u'questions',
+      u'meta': u'meta',
+      #u'kuvakartta': u'imagemap',
+      u'kuva': u'image',
+      u'kaavio': u'figure',
+      u'sis\u00e4llyt\u00e4': u'include',
+      u'raaka': u'raw',
+      u'korvaa': u'replace',
+      u'unicode': u'unicode',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'luokka': u'class',
+      u'rooli': u'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'sis\u00e4llys': u'contents',
+      u'kappale': u'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'alaviitteet': u'footnotes',
+      #u'viitaukset': u'citations',
+      u'target-notes (translation required)': u'target-notes'}
+"""Finnish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'lyhennys': u'abbreviation',
+    u'akronyymi': u'acronym',
+    u'kirjainsana': u'acronym',
+    u'hakemisto': u'index',
+    u'luettelo': u'index',
+    u'alaindeksi': u'subscript',
+    u'indeksi': u'subscript',
+    u'yl\u00e4indeksi': u'superscript',
+    u'title-reference (translation required)': u'title-reference',
+    u'title (translation required)': u'title-reference',
+    u'pep-reference (translation required)': u'pep-reference',
+    u'rfc-reference (translation required)': u'rfc-reference',
+    u'korostus': u'emphasis',
+    u'vahvistus': u'strong',
+    u'tasalevyinen': u'literal',
+    u'named-reference (translation required)': u'named-reference',
+    u'anonymous-reference (translation required)': u'anonymous-reference',
+    u'footnote-reference (translation required)': u'footnote-reference',
+    u'citation-reference (translation required)': u'citation-reference',
+    u'substitution-reference (translation required)': u'substitution-reference',
+    u'kohde': u'target',
+    u'uri-reference (translation required)': u'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Finnish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Authors: David Goodger <goodger@python.org>; William Dode
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'attention': 'attention',
+      u'pr\u00E9caution': 'caution',
+      u'danger': 'danger',
+      u'erreur': 'error',
+      u'conseil': 'hint',
+      u'important': 'important',
+      u'note': 'note',
+      u'astuce': 'tip',
+      u'avertissement': 'warning',
+      u'admonition': 'admonition',
+      u'encadr\u00E9': 'sidebar',
+      u'sujet': 'topic',
+      u'bloc-textuel': 'line-block',
+      u'bloc-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'code-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'intertitre': 'rubric',
+      u'exergue': 'epigraph',
+      u'\u00E9pigraphe': 'epigraph',
+      u'chapeau': 'highlights',
+      u'accroche': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qr': 'questions',
+      #u'faq': 'questions',
+      u'tableau': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'm\u00E9ta': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'image': 'image',
+      u'figure': 'figure',
+      u'inclure': 'include',
+      u'brut': 'raw',
+      u'remplacer': 'replace',
+      u'remplace': 'replace',
+      u'unicode': 'unicode',
+      u'date': 'date',
+      u'classe': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'titre (translation required)': 'title',
+      u'sommaire': 'contents',
+      u'table-des-mati\u00E8res': 'contents',
+      u'sectnum': 'sectnum',
+      u'section-num\u00E9rot\u00E9e': 'sectnum',
+      u'liens': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      }
+"""French name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abr\u00E9viation': 'abbreviation',
+      u'acronyme': 'acronym',
+      u'sigle': 'acronym',
+      u'index': 'index',
+      u'indice': 'subscript',
+      u'ind': 'subscript',
+      u'exposant': 'superscript',
+      u'exp': 'superscript',
+      u'titre-r\u00E9f\u00E9rence': 'title-reference',
+      u'titre': 'title-reference',
+      u'pep-r\u00E9f\u00E9rence': 'pep-reference',
+      u'rfc-r\u00E9f\u00E9rence': 'rfc-reference',
+      u'emphase': 'emphasis',
+      u'fort': 'strong',
+      u'litt\u00E9ral': 'literal',
+      u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference',
+      u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference',
+      u'note-r\u00E9f\u00E9rence': 'footnote-reference',
+      u'citation-r\u00E9f\u00E9rence': 'citation-reference',
+      u'substitution-r\u00E9f\u00E9rence': 'substitution-reference',
+      u'lien': 'target',
+      u'uri-r\u00E9f\u00E9rence': 'uri-reference',
+      u'brut': 'raw',}
+"""Mapping of French role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1': 'attention',
+      u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea': 'caution',
+      u'\u05e1\u05db\u05e0\u05d4': 'danger',
+      u'\u05e9\u05d2\u05d9\u05d0\u05d4' : 'error',
+      u'\u05e8\u05de\u05d6': 'hint',
+      u'\u05d7\u05e9\u05d5\u05d1': 'important',
+      u'\u05d4\u05e2\u05e8\u05d4': 'note',
+      u'\u05d8\u05d9\u05e4': 'tip',
+      u'\u05d0\u05d6\u05d4\u05e8\u05d4': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'\u05ea\u05de\u05d5\u05e0\u05d4': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+       u'\u05e1\u05d2\u05e0\u05d5\u05df': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      u'\u05ea\u05d5\u05db\u05df': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    u'\u05ea\u05d7\u05ea\u05d9': 'subscript',
+    'sub': 'subscript',
+    u'\u05e2\u05d9\u05dc\u05d9': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Authors: Nicola Larosa <docutils@tekNico.net>;
+#          Lele Gaifax <lele@seldati.it>
+# Copyright: This module has been placed in the public domain.
+
+# Beware: the italian translation of the reStructuredText documentation
+# at http://docit.bice.dyndns.org/static/ReST, in particular
+# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
+# to be synced with the content of this file.
+
+"""
+Italian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'attenzione': 'attention',
+      'cautela': 'caution',
+      'pericolo': 'danger',
+      'errore': 'error',
+      'suggerimento': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'consiglio': 'tip',
+      'avvertenza': 'warning',
+      'ammonizione': 'admonition',
+      'riquadro': 'sidebar',
+      'argomento': 'topic',
+      'blocco-di-righe': 'line-block',
+      'blocco-interpretato': 'parsed-literal',
+      'rubrica': 'rubric',
+      'epigrafe': 'epigraph',
+      'punti-salienti': 'highlights',
+      'estratto-evidenziato': 'pull-quote',
+      'composito': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'tabella': 'table',
+      'tabella-csv': 'csv-table',
+      'tabella-elenco': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'immagine': 'image',
+      'figura': 'figure',
+      'includi': 'include',
+      'grezzo': 'raw',
+      'sostituisci': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'ruolo': 'role',
+      'ruolo-predefinito': 'default-role',
+      'titolo': 'title',
+      'indice': 'contents',
+      'contenuti': 'contents',
+      'seznum': 'sectnum',
+      'sezioni-autonumerate': 'sectnum',
+      'annota-riferimenti-esterni': 'target-notes',
+      'intestazione': 'header',
+      'piede-pagina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Italian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      'abbreviazione': 'abbreviation',
+      'acronimo': 'acronym',
+      'indice': 'index',
+      'deponente': 'subscript',
+      'esponente': 'superscript',
+      'riferimento-titolo': 'title-reference',
+      'riferimento-pep': 'pep-reference',
+      'riferimento-rfc': 'rfc-reference',
+      'enfasi': 'emphasis',
+      'forte': 'strong',
+      'letterale': 'literal',
+      'riferimento-con-nome': 'named-reference',
+      'riferimento-anonimo': 'anonymous-reference',
+      'riferimento-nota': 'footnote-reference',
+      'riferimento-citazione': 'citation-reference',
+      'riferimento-sostituzione': 'substitution-reference',
+      'destinazione': 'target',
+      'riferimento-uri': 'uri-reference',
+      'grezzo': 'raw',}
+"""Mapping of Italian role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# Corrections to these translations are welcome!
+# é–“é•ã„ãŒã‚ã‚Œã°ã€ã©ã†ãžæ­£ã—ã„翻訳を教ãˆã¦ä¸‹ã•ã„。
+
+directives = {
+    # language-dependent: fixed
+    u'注目': 'attention',
+    u'注æ„': 'caution',
+    u'å±é™º': 'danger',
+    u'エラー': 'error',
+    u'ヒント': 'hint',
+    u'é‡è¦': 'important',
+    u'備考': 'note',
+    u'通報': 'tip',
+    u'警告': 'warning',
+    u'戒告': 'admonition',
+    u'サイドãƒãƒ¼': 'sidebar',
+    u'トピック': 'topic',
+    u'ラインブロック': 'line-block',
+    u'パーズドリテラル': 'parsed-literal',
+    u'ルブリック': 'rubric',
+    u'エピグラフ': 'epigraph',
+    u'題言': 'epigraph',
+    u'ãƒã‚¤ãƒ©ã‚¤ãƒˆ': 'highlights',
+    u'見所': 'highlights',
+    u'プルクオート': 'pull-quote',
+    u'åˆæˆ': 'compound',
+    u'コンテナー': 'container',
+    u'容器': 'container',
+    u'表': 'table',
+    u'csv表': 'csv-table',
+    u'リスト表': 'list-table',
+    #u'質å•': 'questions',
+    #u'å•ç­”': 'questions',
+    #u'faq': 'questions',
+    u'メタ': 'meta',
+    #u'イメージマプ': 'imagemap',
+    u'イメージ': 'image',
+    u'ç”»åƒ': 'image',
+    u'フィグア': 'figure',
+    u'図版': 'figure',
+    u'インクルード': 'include',
+    u'å«ã‚€': 'include',
+    u'組ã¿è¾¼ã¿': 'include',
+    u'生': 'raw',
+    u'原': 'raw',
+    u'æ›ãˆã‚‹': 'replace',
+    u'å–ã‚Šæ›ãˆã‚‹': 'replace',
+    u'掛ã‘替ãˆã‚‹': 'replace',
+    u'ユニコード': 'unicode',
+    u'日付': 'date',
+    u'クラス': 'class',
+    u'ロール': 'role',
+    u'å½¹': 'role',
+    u'ディフォルトロール': 'default-role',
+    u'既定役': 'default-role',
+    u'タイトル': 'title',
+    u'é¡Œ': 'title',                    # é¡Œå 件å
+    u'目次': 'contents',
+    u'節数': 'sectnum',
+    u'ヘッダ': 'header',
+    u'フッタ': 'footer',
+    #u'脚注': 'footnotes',             # 脚註?
+    #u'サイテーション': 'citations',   # 出典 引証 引用
+    u'ターゲットノート': 'target-notes', # 的注 的脚注
+    }
+"""Japanese name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'ç•¥': 'abbreviation',
+    u'頭字語': 'acronym',
+    u'インデックス': 'index',
+    u'索引': 'index',
+    u'添字': 'subscript',
+    u'下付': 'subscript',
+    u'下': 'subscript',
+    u'上付': 'superscript',
+    u'上': 'superscript',
+    u'é¡Œå‚ç…§': 'title-reference',
+    u'pepå‚ç…§': 'pep-reference',
+    u'rfcå‚ç…§': 'rfc-reference',
+    u'強調': 'emphasis',
+    u'å¼·ã„': 'strong',
+    u'リテラル': 'literal',
+    u'整形済ã¿': 'literal',
+    u'å付å‚ç…§': 'named-reference',
+    u'ç„¡åå‚ç…§': 'anonymous-reference',
+    u'脚注å‚ç…§': 'footnote-reference',
+    u'出典å‚ç…§': 'citation-reference',
+    u'代入å‚ç…§': 'substitution-reference',
+    u'çš„': 'target',
+    u'uriå‚ç…§': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'生': 'raw',}
+"""Mapping of Japanese role names to canonical role names for interpreted
+text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,108 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attentie': 'attention',
+      'let-op': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'hint': 'hint',
+      'belangrijk': 'important',
+      'opmerking': 'note',
+      'tip': 'tip',
+      'waarschuwing': 'warning',
+      'aanmaning': 'admonition',
+      'katern': 'sidebar',
+      'onderwerp': 'topic',
+      'lijn-blok': 'line-block',
+      'letterlijk-ontleed': 'parsed-literal',
+      'rubriek': 'rubric',
+      'opschrift': 'epigraph',
+      'hoogtepunten': 'highlights',
+      'pull-quote': 'pull-quote', # Dutch printers use the english term
+      'samenstelling': 'compound',
+      'verbinding': 'compound',
+      u'container (translation required)': 'container',
+      #'vragen': 'questions',
+      'tabel': 'table',
+      'csv-tabel': 'csv-table',
+      'lijst-tabel': 'list-table',
+      #'veelgestelde-vragen': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'opnemen': 'include',
+      'onbewerkt': 'raw',
+      'vervang': 'replace',
+      'vervanging': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'sectie-nummering': 'sectnum',
+      'hoofdstuk-nummering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnoten': 'footnotes',
+      #'citaten': 'citations',
+      'verwijzing-voetnoten': 'target-notes',
+      'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
+"""Dutch name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'afkorting': 'abbreviation',
+    # 'ab': 'abbreviation',
+    'acroniem': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'inferieur': 'subscript',
+    'inf': 'subscript',
+    'superieur': 'superscript',
+    'sup': 'superscript',
+    'titel-referentie': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-referentie': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-referentie': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'extra': 'strong',
+    'extra-nadruk': 'strong',
+    'vet': 'strong',
+    'letterlijk': 'literal',
+    'benoemde-referentie': 'named-reference',
+    'anonieme-referentie': 'anonymous-reference',
+    'voetnoot-referentie': 'footnote-reference',
+    'citaat-referentie': 'citation-reference',
+    'substitie-reference': 'substitution-reference',
+    'verwijzing': 'target',
+    'uri-referentie': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'onbewerkt': 'raw',}
+"""Mapping of Dutch role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'aten\u00E7\u00E3o': 'attention',
+      'cuidado': 'caution',
+      'perigo': 'danger',
+      'erro': 'error',
+      u'sugest\u00E3o': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'dica': 'tip',
+      'aviso': 'warning',
+      u'exorta\u00E7\u00E3o': 'admonition',
+      'barra-lateral': 'sidebar',
+      u't\u00F3pico': 'topic',
+      'bloco-de-linhas': 'line-block',
+      'literal-interpretado': 'parsed-literal',
+      'rubrica': 'rubric',
+      u'ep\u00EDgrafo': 'epigraph',
+      'destaques': 'highlights',
+      u'cita\u00E7\u00E3o-destacada': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'perguntas': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'imagem': 'image',
+      'figura': 'figure',
+      u'inclus\u00E3o': 'include',
+      'cru': 'raw',
+      u'substitui\u00E7\u00E3o': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'\u00EDndice': 'contents',
+      'numsec': 'sectnum',
+      u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'notas-de-rorap\u00E9': 'footnotes',
+      #u'cita\u00E7\u00F5es': 'citations',
+      u'links-no-rodap\u00E9': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Brazilian Portuguese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbrevia\u00E7\u00E3o': 'abbreviation',
+    'ab': 'abbreviation',
+    u'acr\u00F4nimo': 'acronym',
+    'ac': 'acronym',
+    u'\u00EDndice-remissivo': 'index',
+    'i': 'index',
+    'subscrito': 'subscript',
+    'sub': 'subscript',
+    'sobrescrito': 'superscript',
+    'sob': 'superscript',
+    u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference',
+    u't\u00EDtulo': 'title-reference',
+    't': 'title-reference',
+    u'refer\u00EAncia-a-pep': 'pep-reference',
+    'pep': 'pep-reference',
+    u'refer\u00EAncia-a-rfc': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    u'\u00EAnfase': 'emphasis',
+    'forte': 'strong',
+    'literal': 'literal',               # translation required?
+    u'refer\u00EAncia-por-nome': 'named-reference',
+    u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference',
+    u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference',
+    u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference',
+    u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference',
+    'alvo': 'target',
+    u'refer\u00EAncia-a-uri': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'cru': 'raw',}
+"""Mapping of Brazilian Portuguese role names to canonical role names
+for interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+directives = {
+ u'\u0431\u043b\u043e\u043a-\u0441\u0442\u0440\u043e\u043a': u'line-block',
+ u'meta': u'meta',
+ u'\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439-\u043b\u0438\u0442\u0435\u0440\u0430\u043b':
+ u'parsed-literal',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f-\u0446\u0438\u0442\u0430\u0442\u0430':
+ u'pull-quote',
+ u'compound (translation required)': 'compound',
+ u'container (translation required)': 'container',
+ u'table (translation required)': 'table',
+ u'csv-table (translation required)': 'csv-table',
+ u'list-table (translation required)': 'list-table',
+ u'\u0441\u044b\u0440\u043e\u0439': u'raw',
+ u'\u0437\u0430\u043c\u0435\u043d\u0430': u'replace',
+ u'\u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f-\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430-restructuredtext':
+ u'restructuredtext-test-directive',
+ u'\u0446\u0435\u043b\u0435\u0432\u044b\u0435-\u0441\u043d\u043e\u0441\u043a\u0438': 
+ u'target-notes',
+ u'unicode': u'unicode',
+ u'\u0434\u0430\u0442\u0430': u'date',
+ u'\u0431\u043e\u043a\u043e\u0432\u0430\u044f-\u043f\u043e\u043b\u043e\u0441\u0430':
+ u'sidebar',
+ u'\u0432\u0430\u0436\u043d\u043e': u'important',
+ u'\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c': u'include',
+ u'\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435': u'attention',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': u'highlights',
+ u'\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'admonition',
+ u'\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435':
+ u'image',
+ u'\u043a\u043b\u0430\u0441\u0441': u'class',
+ u'role (translation required)': 'role',
+ u'default-role (translation required)': 'default-role',
+ u'title (translation required)': 'title',
+ u'\u043d\u043e\u043c\u0435\u0440-\u0440\u0430\u0437\u0434\u0435\u043b\u0430':
+ u'sectnum',
+ u'\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f-\u0440\u0430\u0437'
+ u'\u0434\u0435\u043b\u043e\u0432': u'sectnum',
+ u'\u043e\u043f\u0430\u0441\u043d\u043e': u'danger',
+ u'\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e': u'caution',
+ u'\u043e\u0448\u0438\u0431\u043a\u0430': u'error',
+ u'\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430': u'tip',
+ u'\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d'
+ u'\u0438\u0435': u'warning',
+ u'\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'note',
+ u'\u0440\u0438\u0441\u0443\u043d\u043e\u043a': u'figure',
+ u'\u0440\u0443\u0431\u0440\u0438\u043a\u0430': u'rubric',
+ u'\u0441\u043e\u0432\u0435\u0442': u'hint',
+ u'\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435': u'contents',
+ u'\u0442\u0435\u043c\u0430': u'topic',
+ u'\u044d\u043f\u0438\u0433\u0440\u0430\u0444': u'epigraph',
+ u'header (translation required)': 'header',
+ u'footer (translation required)': 'footer',}
+"""Russian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ u'\u0430\u043a\u0440\u043e\u043d\u0438\u043c': 'acronym',
+ u'\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'anonymous-reference',
+ u'\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e': 'literal',
+ u'\u0432\u0435\u0440\u0445\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'superscript',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': 'emphasis',
+ u'\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'named-reference',
+ u'\u0438\u043d\u0434\u0435\u043a\u0441': 'index',
+ u'\u043d\u0438\u0436\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'subscript',
+ u'\u0441\u0438\u043b\u044c\u043d\u043e\u0435-\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435':
+  'strong',
+ u'\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435':
+  'abbreviation',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u0430':
+  'substitution-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-pep': 'pep-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-rfc': 'rfc-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-uri': 'uri-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435':
+  'title-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0441\u043d\u043e\u0441\u043a\u0443':
+  'footnote-reference',
+ u'\u0446\u0438\u0442\u0430\u0442\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'citation-reference',
+ u'\u0446\u0435\u043b\u044c': 'target',
+ u'raw (translation required)': 'raw',}
+"""Mapping of Russian role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,91 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'pozor': 'attention',
+      u'opatrne': 'caution',
+      u'nebezpe\xe8enstvo': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\xf4le\x9eit\xe9': 'important',
+      u'pozn\xe1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varovanie': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\xe9ma': 'topic',
+      u'blok-riadkov': 'line-block',
+      u'parsed-literal': 'parsed-literal',
+      u'rubric (translation required)': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qa': 'questions',
+      #u'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      #u'imagemap': 'imagemap',
+      u'obr\xe1zok': 'image',
+      u'tvar': 'figure',
+      u'vlo\x9ei\x9d': 'include',
+      u'raw (translation required)': 'raw',
+      u'nahradi\x9d': 'replace',
+      u'unicode': 'unicode',
+      u'd\u00E1tum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'\xe8as\x9d': 'sectnum',
+      u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum',
+      u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes': 'footnotes',
+      #u'citations': 'citations',
+      }
+"""Slovak name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'raw (translation required)': 'raw',}
+"""Mapping of Slovak role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'observera': 'attention',
+      u'caution (translation required)': 'caution',
+      u'fara': 'danger',
+      u'fel': 'error',
+      u'v\u00e4gledning': 'hint',
+      u'viktigt': 'important',
+      u'notera': 'note',
+      u'tips': 'tip',
+      u'varning': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u'\u00e4mne': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'mellanrubrik': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      # u'fr\u00e5gor': 'questions',
+      # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/:
+      # u'fr\u00e5gor-och-svar': 'questions',
+      # u'vanliga-fr\u00e5gor': 'questions',  
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      # u'bildkarta': 'imagemap',   # FIXME: Translation might be too literal.
+      u'bild': 'image',
+      u'figur': 'figure',
+      u'inkludera': 'include',   
+      u'r\u00e5': 'raw',            # FIXME: Translation might be too literal.
+      u'ers\u00e4tt': 'replace', 
+      u'unicode': 'unicode',
+      u'datum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'inneh\u00e5ll': 'contents',
+      u'sektionsnumrering': 'sectnum',
+      u'target-notes (translation required)': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      # u'fotnoter': 'footnotes',
+      # u'citeringar': 'citations',
+      }
+"""Swedish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'r\u00e5': 'raw',}
+"""Mapping of Swedish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Panjunyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'注æ„': 'attention',
+      u'å°å¿ƒ': 'caution',
+      u'å±é™©': 'danger',
+      u'错误': 'error',
+      u'æ示': 'hint',
+      u'é‡è¦': 'important',
+      u'注解': 'note',
+      u'技巧': 'tip',
+      u'警告': 'warning',
+      u'å¿ å‘Š': 'admonition',
+      u'侧框': 'sidebar',
+      u'主题': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'醒目': 'rubric',
+      u'é“­æ–‡': 'epigraph',
+      u'è¦ç‚¹': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'å¤åˆ': 'compound',
+      u'容器': 'container',
+      #u'questions (translation required)': 'questions',
+      u'表格': 'table',
+      u'csv表格': 'csv-table',
+      u'列表表格': 'list-table',
+      #u'qa (translation required)': 'questions',
+      #u'faq (translation required)': 'questions',
+      u'元数æ®': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'图片': 'image',
+      u'图例': 'figure',
+      u'包å«': 'include',
+      u'原文': 'raw',
+      u'代替': 'replace',
+      u'统一ç ': 'unicode',
+      u'日期': 'date',
+      u'类型': 'class',
+      u'角色': 'role',
+      u'默认角色': 'default-role',
+      u'标题': 'title',
+      u'目录': 'contents',
+      u'章节åºå·': 'sectnum',
+      u'题头': 'header',
+      u'页脚': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Simplified Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'缩写': 'abbreviation',
+    u'简称': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'下标': 'subscript',
+    u'上标': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'强调': 'emphasis',
+    u'加粗': 'strong',
+    u'å­—é¢': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Simplified Chinese role names to canonical role names
+for interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention (translation required)': 'attention',
+      'caution (translation required)': 'caution',
+      'danger (translation required)': 'danger',
+      'error (translation required)': 'error',
+      'hint (translation required)': 'hint',
+      'important (translation required)': 'important',
+      'note (translation required)': 'note',
+      'tip (translation required)': 'tip',
+      'warning (translation required)': 'warning',
+      'admonition (translation required)': 'admonition',
+      'sidebar (translation required)': 'sidebar',
+      'topic (translation required)': 'topic',
+      'line-block (translation required)': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubric (translation required)': 'rubric',
+      'epigraph (translation required)': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions (translation required)': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      #'qa (translation required)': 'questions',
+      #'faq (translation required)': 'questions',
+      'meta (translation required)': 'meta',
+      #'imagemap (translation required)': 'imagemap',
+      'image (translation required)': 'image',
+      'figure (translation required)': 'figure',
+      'include (translation required)': 'include',
+      'raw (translation required)': 'raw',
+      'replace (translation required)': 'replace',
+      'unicode (translation required)': 'unicode',
+      u'日期': 'date',
+      'class (translation required)': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'contents (translation required)': 'contents',
+      'sectnum (translation required)': 'sectnum',
+      'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes (translation required)': 'footnotes',
+      #'citations (translation required)': 'citations',
+      'target-notes (translation required)': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Traditional Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation (translation required)': 'abbreviation',
+    'ab (translation required)': 'abbreviation',
+    'acronym (translation required)': 'acronym',
+    'ac (translation required)': 'acronym',
+    'index (translation required)': 'index',
+    'i (translation required)': 'index',
+    'subscript (translation required)': 'subscript',
+    'sub (translation required)': 'subscript',
+    'superscript (translation required)': 'superscript',
+    'sup (translation required)': 'superscript',
+    'title-reference (translation required)': 'title-reference',
+    'title (translation required)': 'title-reference',
+    't (translation required)': 'title-reference',
+    'pep-reference (translation required)': 'pep-reference',
+    'pep (translation required)': 'pep-reference',
+    'rfc-reference (translation required)': 'rfc-reference',
+    'rfc (translation required)': 'rfc-reference',
+    'emphasis (translation required)': 'emphasis',
+    'strong (translation required)': 'strong',
+    'literal (translation required)': 'literal',
+    'named-reference (translation required)': 'named-reference',
+    'anonymous-reference (translation required)': 'anonymous-reference',
+    'footnote-reference (translation required)': 'footnote-reference',
+    'citation-reference (translation required)': 'citation-reference',
+    'substitution-reference (translation required)': 'substitution-reference',
+    'target (translation required)': 'target',
+    'uri-reference (translation required)': 'uri-reference',
+    'uri (translation required)': 'uri-reference',
+    'url (translation required)': 'uri-reference',
+    'raw (translation required)': 'raw',}
+"""Mapping of Traditional Chinese role names to canonical role names for
+interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,346 @@
+# $Id: roles.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Edward Loper <edloper@gradient.cis.upenn.edu>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines standard interpreted text role functions, a registry for
+interpreted text roles, and an API for adding to and retrieving from the
+registry.
+
+The interface for interpreted role functions is as follows::
+
+    def role_fn(name, rawtext, text, lineno, inliner,
+                options={}, content=[]):
+        code...
+
+    # Set function attributes for customization:
+    role_fn.options = ...
+    role_fn.content = ...
+
+Parameters:
+
+- ``name`` is the local name of the interpreted text role, the role name
+  actually used in the document.
+
+- ``rawtext`` is a string containing the entire interpreted text construct.
+  Return it as a ``problematic`` node linked to a system message if there is a
+  problem.
+
+- ``text`` is the interpreted text content, with backslash escapes converted
+  to nulls (``\x00``).
+
+- ``lineno`` is the line number where the interpreted text beings.
+
+- ``inliner`` is the Inliner object that called the role function.
+  It defines the following useful attributes: ``reporter``,
+  ``problematic``, ``memo``, ``parent``, ``document``.
+
+- ``options``: A dictionary of directive options for customization, to be
+  interpreted by the role function.  Used for additional attributes for the
+  generated elements and other functionality.
+
+- ``content``: A list of strings, the directive content for customization
+  ("role" directive).  To be interpreted by the role function.
+
+Function attributes for customization, interpreted by the "role" directive:
+
+- ``options``: A dictionary, mapping known option names to conversion
+  functions such as `int` or `float`.  ``None`` or an empty dict implies no
+  options to parse.  Several directive option conversion functions are defined
+  in the `directives` module.
+
+  All role functions implicitly support the "class" option, unless disabled
+  with an explicit ``{'class': None}``.
+
+- ``content``: A boolean; true if content is allowed.  Client code must handle
+  the case where content is required but not supplied (an empty content list
+  will be supplied).
+
+Note that unlike directives, the "arguments" function attribute is not
+supported for role customization.  Directive arguments are handled by the
+"role" directive itself.
+
+Interpreted role functions return a tuple of two values:
+
+- A list of nodes which will be inserted into the document tree at the
+  point where the interpreted role was encountered (can be an empty
+  list).
+
+- A list of system messages, which will be inserted into the document tree
+  immediately after the end of the current inline block (can also be empty).
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+DEFAULT_INTERPRETED_ROLE = 'title-reference'
+"""
+The canonical name of the default interpreted role.  This role is used
+when no role is specified for a piece of interpreted text.
+"""
+
+_role_registry = {}
+"""Mapping of canonical role names to role functions.  Language-dependent role
+names are defined in the ``language`` subpackage."""
+
+_roles = {}
+"""Mapping of local or language-dependent interpreted text role names to role
+functions."""
+
+def role(role_name, language_module, lineno, reporter):
+    """
+    Locate and return a role function from its language-dependent name, along
+    with a list of system messages.  If the role is not found in the current
+    language, check English.  Return a 2-tuple: role function (``None`` if the
+    named role cannot be found) and a list of system messages.
+    """
+    normname = role_name.lower()
+    messages = []
+    msg_text = []
+
+    if _roles.has_key(normname):
+        return _roles[normname], messages
+
+    if role_name:
+        canonicalname = None
+        try:
+            canonicalname = language_module.roles[normname]
+        except AttributeError, error:
+            msg_text.append('Problem retrieving role entry from language '
+                            'module %r: %s.' % (language_module, error))
+        except KeyError:
+            msg_text.append('No role entry for "%s" in module "%s".'
+                            % (role_name, language_module.__name__))
+    else:
+        canonicalname = DEFAULT_INTERPRETED_ROLE
+
+    # If we didn't find it, try English as a fallback.
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.roles[normname]
+            msg_text.append('Using English fallback for role "%s".'
+                            % role_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical role name.'
+                            % role_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+
+    # Collect any messages that we generated.
+    if msg_text:
+        message = reporter.info('\n'.join(msg_text), line=lineno)
+        messages.append(message)
+
+    # Look the role up in the registry, and return it.
+    if _role_registry.has_key(canonicalname):
+        role_fn = _role_registry[canonicalname]
+        register_local_role(normname, role_fn)
+        return role_fn, messages
+    else:
+        return None, messages # Error message will be generated by caller.
+
+def register_canonical_role(name, role_fn):
+    """
+    Register an interpreted text role by its canonical name.
+
+    :Parameters:
+      - `name`: The canonical name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _role_registry[name] = role_fn
+
+def register_local_role(name, role_fn):
+    """
+    Register an interpreted text role by its local or language-dependent name.
+
+    :Parameters:
+      - `name`: The local or language-dependent name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _roles[name] = role_fn
+
+def set_implicit_options(role_fn):
+    """
+    Add customization options to role functions, unless explicitly set or
+    disabled.
+    """
+    if not hasattr(role_fn, 'options') or role_fn.options is None:
+        role_fn.options = {'class': directives.class_option}
+    elif not role_fn.options.has_key('class'):
+        role_fn.options['class'] = directives.class_option
+
+def register_generic_role(canonical_name, node_class):
+    """For roles which simply wrap a given `node_class` around the text."""
+    role = GenericRole(canonical_name, node_class)
+    register_canonical_role(canonical_name, role)
+
+
+class GenericRole:
+
+    """
+    Generic interpreted text role, where the interpreted text is simply
+    wrapped with the provided node class.
+    """
+
+    def __init__(self, role_name, node_class):
+        self.name = role_name
+        self.node_class = node_class
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        set_classes(options)
+        return [self.node_class(rawtext, utils.unescape(text), **options)], []
+
+
+class CustomRole:
+
+    """
+    Wrapper for custom interpreted text roles.
+    """
+
+    def __init__(self, role_name, base_role, options={}, content=[]):
+        self.name = role_name
+        self.base_role = base_role
+        self.options = None
+        if hasattr(base_role, 'options'):
+            self.options = base_role.options
+        self.content = None
+        if hasattr(base_role, 'content'):
+            self.content = base_role.content
+        self.supplied_options = options
+        self.supplied_content = content
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        opts = self.supplied_options.copy()
+        opts.update(options)
+        cont = list(self.supplied_content)
+        if cont and content:
+            cont += '\n'
+        cont.extend(content)
+        return self.base_role(role, rawtext, text, lineno, inliner,
+                              options=opts, content=cont)
+
+
+def generic_custom_role(role, rawtext, text, lineno, inliner,
+                        options={}, content=[]):
+    """"""
+    # Once nested inline markup is implemented, this and other methods should
+    # recursively call inliner.nested_parse().
+    set_classes(options)
+    return [nodes.inline(rawtext, utils.unescape(text), **options)], []
+
+generic_custom_role.options = {'class': directives.class_option}
+
+
+######################################################################
+# Define and register the standard roles:
+######################################################################
+
+register_generic_role('abbreviation', nodes.abbreviation)
+register_generic_role('acronym', nodes.acronym)
+register_generic_role('emphasis', nodes.emphasis)
+register_generic_role('literal', nodes.literal)
+register_generic_role('strong', nodes.strong)
+register_generic_role('subscript', nodes.subscript)
+register_generic_role('superscript', nodes.superscript)
+register_generic_role('title-reference', nodes.title_reference)
+
+def pep_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        pepnum = int(text)
+        if pepnum < 0 or pepnum > 9999:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'PEP number must be a number from 0 to 9999; "%s" is invalid.'
+            % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.pep_reference; so this is correct:
+    ref = (inliner.document.settings.pep_base_url
+           + inliner.document.settings.pep_file_url_template % pepnum)
+    set_classes(options)
+    return [nodes.reference(rawtext, 'PEP ' + utils.unescape(text), refuri=ref,
+                            **options)], []
+
+register_canonical_role('pep-reference', pep_reference_role)
+
+def rfc_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        rfcnum = int(text)
+        if rfcnum <= 0:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'RFC number must be a number greater than or equal to 1; '
+            '"%s" is invalid.' % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.rfc_reference, so this is correct:
+    ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+    set_classes(options)
+    node = nodes.reference(rawtext, 'RFC ' + utils.unescape(text), refuri=ref,
+                           **options)
+    return [node], []
+
+register_canonical_role('rfc-reference', rfc_reference_role)
+
+def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    if not options.has_key('format'):
+        msg = inliner.reporter.error(
+            'No format (Writer name) is associated with this role: "%s".\n'
+            'The "raw" role cannot be used directly.\n'
+            'Instead, use the "role" directive to create a new role with '
+            'an associated format.' % role, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    set_classes(options)
+    node = nodes.raw(rawtext, utils.unescape(text, 1), **options)
+    return [node], []
+
+raw_role.options = {'format': directives.unchanged}
+
+register_canonical_role('raw', raw_role)
+
+
+######################################################################
+# Register roles that are currently unimplemented.
+######################################################################
+
+def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}):
+    msg = inliner.reporter.error(
+        'Interpreted text role "%s" not implemented.' % role, line=lineno)
+    prb = inliner.problematic(rawtext, rawtext, msg)
+    return [prb], [msg]
+
+register_canonical_role('index', unimplemented_role)
+register_canonical_role('named-reference', unimplemented_role)
+register_canonical_role('anonymous-reference', unimplemented_role)
+register_canonical_role('uri-reference', unimplemented_role)
+register_canonical_role('footnote-reference', unimplemented_role)
+register_canonical_role('citation-reference', unimplemented_role)
+register_canonical_role('substitution-reference', unimplemented_role)
+register_canonical_role('target', unimplemented_role)
+
+# This should remain unimplemented, for testing purposes:
+register_canonical_role('restructuredtext-unimplemented-role',
+                        unimplemented_role)
+
+
+def set_classes(options):
+    """
+    Auxiliary function to set options['classes'] and delete
+    options['class'].
+    """
+    if options.has_key('class'):
+        assert not options.has_key('classes')
+        options['classes'] = options['class']
+        del options['class']
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2988 @@
+# $Id: states.py 4824 2006-12-09 00:59:23Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the ``docutils.parsers.restructuredtext.states`` module, the core of
+the reStructuredText parser.  It defines the following:
+
+:Classes:
+    - `RSTStateMachine`: reStructuredText parser's entry point.
+    - `NestedStateMachine`: recursive StateMachine.
+    - `RSTState`: reStructuredText State superclass.
+    - `Inliner`: For parsing inline markup.
+    - `Body`: Generic classifier of the first line of a block.
+    - `SpecializedBody`: Superclass for compound element members.
+    - `BulletList`: Second and subsequent bullet_list list_items
+    - `DefinitionList`: Second+ definition_list_items.
+    - `EnumeratedList`: Second+ enumerated_list list_items.
+    - `FieldList`: Second+ fields.
+    - `OptionList`: Second+ option_list_items.
+    - `RFC2822List`: Second+ RFC2822-style fields.
+    - `ExtensionOptions`: Parses directive option fields.
+    - `Explicit`: Second+ explicit markup constructs.
+    - `SubstitutionDef`: For embedded directives in substitution definitions.
+    - `Text`: Classifier of second line of a text block.
+    - `SpecializedText`: Superclass for continuation lines of Text-variants.
+    - `Definition`: Second line of potential definition_list_item.
+    - `Line`: Second line of overlined section title or transition marker.
+    - `Struct`: An auxiliary collection class.
+
+:Exception classes:
+    - `MarkupError`
+    - `ParserError`
+    - `MarkupMismatch`
+
+:Functions:
+    - `escape2null()`: Return a string, escape-backslashes converted to nulls.
+    - `unescape()`: Return a string, nulls removed or restored to backslashes.
+
+:Attributes:
+    - `state_classes`: set of State classes used with `RSTStateMachine`.
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a recursive state machine,
+examining its input one line at a time.  To understand how the parser works,
+please first become familiar with the `docutils.statemachine` module.  In the
+description below, references are made to classes defined in this module;
+please see the individual classes for details.
+
+Parsing proceeds as follows:
+
+1. The state machine examines each line of input, checking each of the
+   transition patterns of the state `Body`, in order, looking for a match.
+   The implicit transitions (blank lines and indentation) are checked before
+   any others.  The 'text' transition is a catch-all (matches anything).
+
+2. The method associated with the matched transition pattern is called.
+
+   A. Some transition methods are self-contained, appending elements to the
+      document tree (`Body.doctest` parses a doctest block).  The parser's
+      current line index is advanced to the end of the element, and parsing
+      continues with step 1.
+
+   B. Other transition methods trigger the creation of a nested state machine,
+      whose job is to parse a compound construct ('indent' does a block quote,
+      'bullet' does a bullet list, 'overline' does a section [first checking
+      for a valid section header], etc.).
+
+      - In the case of lists and explicit markup, a one-off state machine is
+        created and run to parse contents of the first item.
+
+      - A new state machine is created and its initial state is set to the
+        appropriate specialized state (`BulletList` in the case of the
+        'bullet' transition; see `SpecializedBody` for more detail).  This
+        state machine is run to parse the compound element (or series of
+        explicit markup elements), and returns as soon as a non-member element
+        is encountered.  For example, the `BulletList` state machine ends as
+        soon as it encounters an element which is not a list item of that
+        bullet list.  The optional omission of inter-element blank lines is
+        enabled by this nested state machine.
+
+      - The current line index is advanced to the end of the elements parsed,
+        and parsing continues with step 1.
+
+   C. The result of the 'text' transition depends on the next line of text.
+      The current state is changed to `Text`, under which the second line is
+      examined.  If the second line is:
+
+      - Indented: The element is a definition list item, and parsing proceeds
+        similarly to step 2.B, using the `DefinitionList` state.
+
+      - A line of uniform punctuation characters: The element is a section
+        header; again, parsing proceeds as in step 2.B, and `Body` is still
+        used.
+
+      - Anything else: The element is a paragraph, which is examined for
+        inline markup and appended to the parent element.  Processing
+        continues with step 1.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import re
+import roman
+from types import TupleType, FunctionType, MethodType
+from docutils import nodes, statemachine, utils, urischemes
+from docutils import ApplicationError, DataError
+from docutils.statemachine import StateMachineWS, StateWS
+from docutils.nodes import fully_normalize_name as normalize_name
+from docutils.nodes import whitespace_normalize_name
+from docutils.utils import escape2null, unescape, column_width
+import docutils.parsers.rst
+from docutils.parsers.rst import directives, languages, tableparser, roles
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+class MarkupError(DataError): pass
+class UnknownInterpretedRoleError(DataError): pass
+class InterpretedRoleNotImplementedError(DataError): pass
+class ParserError(ApplicationError): pass
+class MarkupMismatch(Exception): pass
+
+
+class Struct:
+
+    """Stores data attributes for dotted-attribute access."""
+
+    def __init__(self, **keywordargs):
+        self.__dict__.update(keywordargs)
+
+
+class RSTStateMachine(StateMachineWS):
+
+    """
+    reStructuredText's master StateMachine.
+
+    The entry point to reStructuredText parsing is the `run()` method.
+    """
+
+    def run(self, input_lines, document, input_offset=0, match_titles=1,
+            inliner=None):
+        """
+        Parse `input_lines` and modify the `document` node in place.
+
+        Extend `StateMachineWS.run()`: set up parse-global data and
+        run the StateMachine.
+        """
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.match_titles = match_titles
+        if inliner is None:
+            inliner = Inliner()
+        inliner.init_customizations(document.settings)
+        self.memo = Struct(document=document,
+                           reporter=document.reporter,
+                           language=self.language,
+                           title_styles=[],
+                           section_level=0,
+                           section_bubble_up_kludge=0,
+                           inliner=inliner)
+        self.document = document
+        self.attach_observer(document.note_source)
+        self.reporter = self.memo.reporter
+        self.node = document
+        results = StateMachineWS.run(self, input_lines, input_offset,
+                                     input_source=document['source'])
+        assert results == [], 'RSTStateMachine.run() results should be empty!'
+        self.node = self.memo = None    # remove unneeded references
+
+
+class NestedStateMachine(StateMachineWS):
+
+    """
+    StateMachine run from within other StateMachine runs, to parse nested
+    document structures.
+    """
+
+    def run(self, input_lines, input_offset, memo, node, match_titles=1):
+        """
+        Parse `input_lines` and populate a `docutils.nodes.document` instance.
+
+        Extend `StateMachineWS.run()`: set up document-wide data.
+        """
+        self.match_titles = match_titles
+        self.memo = memo
+        self.document = memo.document
+        self.attach_observer(self.document.note_source)
+        self.reporter = memo.reporter
+        self.language = memo.language
+        self.node = node
+        results = StateMachineWS.run(self, input_lines, input_offset)
+        assert results == [], ('NestedStateMachine.run() results should be '
+                               'empty!')
+        return results
+
+
+class RSTState(StateWS):
+
+    """
+    reStructuredText State superclass.
+
+    Contains methods used by all State subclasses.
+    """
+
+    nested_sm = NestedStateMachine
+
+    def __init__(self, state_machine, debug=0):
+        self.nested_sm_kwargs = {'state_classes': state_classes,
+                                 'initial_state': 'Body'}
+        StateWS.__init__(self, state_machine, debug)
+
+    def runtime_init(self):
+        StateWS.runtime_init(self)
+        memo = self.state_machine.memo
+        self.memo = memo
+        self.reporter = memo.reporter
+        self.inliner = memo.inliner
+        self.document = memo.document
+        self.parent = self.state_machine.node
+
+    def goto_line(self, abs_line_offset):
+        """
+        Jump to input line `abs_line_offset`, ignoring jumps past the end.
+        """
+        try:
+            self.state_machine.goto_line(abs_line_offset)
+        except EOFError:
+            pass
+
+    def no_match(self, context, transitions):
+        """
+        Override `StateWS.no_match` to generate a system message.
+
+        This code should never be run.
+        """
+        self.reporter.severe(
+            'Internal error: no transition pattern match.  State: "%s"; '
+            'transitions: %s; context: %s; current line: %r.'
+            % (self.__class__.__name__, transitions, context,
+               self.state_machine.line),
+            line=self.state_machine.abs_line_number())
+        return context, None, []
+
+    def bof(self, context):
+        """Called at beginning of file."""
+        return [], []
+
+    def nested_parse(self, block, input_offset, node, match_titles=0,
+                     state_machine_class=None, state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs
+        block_length = len(block)
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        state_machine.unlink()
+        new_offset = state_machine.abs_line_offset()
+        # No `block.parent` implies disconnected -- lines aren't in sync:
+        if block.parent and (len(block) - block_length) != 0:
+            # Adjustment for block if modified in nested parse:
+            self.state_machine.next_line(len(block) - block_length)
+        return new_offset
+
+    def nested_list_parse(self, block, input_offset, node, initial_state,
+                          blank_finish,
+                          blank_finish_state=None,
+                          extra_settings={},
+                          match_titles=0,
+                          state_machine_class=None,
+                          state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`. Also keep track of optional intermediate blank lines and the
+        required final one.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs.copy()
+        state_machine_kwargs['initial_state'] = initial_state
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        if blank_finish_state is None:
+            blank_finish_state = initial_state
+        state_machine.states[blank_finish_state].blank_finish = blank_finish
+        for key, value in extra_settings.items():
+            setattr(state_machine.states[initial_state], key, value)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        blank_finish = state_machine.states[blank_finish_state].blank_finish
+        state_machine.unlink()
+        return state_machine.abs_line_offset(), blank_finish
+
+    def section(self, title, source, style, lineno, messages):
+        """Check for a valid subsection and create one if it checks out."""
+        if self.check_subsection(source, style, lineno):
+            self.new_subsection(title, lineno, messages)
+
+    def check_subsection(self, source, style, lineno):
+        """
+        Check for a valid subsection header.  Return 1 (true) or None (false).
+
+        When a new section is reached that isn't a subsection of the current
+        section, back up the line count (use ``previous_line(-x)``), then
+        ``raise EOFError``.  The current StateMachine will finish, then the
+        calling StateMachine can re-examine the title.  This will work its way
+        back up the calling chain until the correct section level isreached.
+
+        @@@ Alternative: Evaluate the title, store the title info & level, and
+        back up the chain until that level is reached.  Store in memo? Or
+        return in results?
+
+        :Exception: `EOFError` when a sibling or supersection encountered.
+        """
+        memo = self.memo
+        title_styles = memo.title_styles
+        mylevel = memo.section_level
+        try:                            # check for existing title style
+            level = title_styles.index(style) + 1
+        except ValueError:              # new title style
+            if len(title_styles) == memo.section_level: # new subsection
+                title_styles.append(style)
+                return 1
+            else:                       # not at lowest level
+                self.parent += self.title_inconsistent(source, lineno)
+                return None
+        if level <= mylevel:            # sibling or supersection
+            memo.section_level = level   # bubble up to parent section
+            if len(style) == 2:
+                memo.section_bubble_up_kludge = 1
+            # back up 2 lines for underline title, 3 for overline title
+            self.state_machine.previous_line(len(style) + 1)
+            raise EOFError              # let parent section re-evaluate
+        if level == mylevel + 1:        # immediate subsection
+            return 1
+        else:                           # invalid subsection
+            self.parent += self.title_inconsistent(source, lineno)
+            return None
+
+    def title_inconsistent(self, sourcetext, lineno):
+        error = self.reporter.severe(
+            'Title level inconsistent:', nodes.literal_block('', sourcetext),
+            line=lineno)
+        return error
+
+    def new_subsection(self, title, lineno, messages):
+        """Append new subsection to document tree. On return, check level."""
+        memo = self.memo
+        mylevel = memo.section_level
+        memo.section_level += 1
+        section_node = nodes.section()
+        self.parent += section_node
+        textnodes, title_messages = self.inline_text(title, lineno)
+        titlenode = nodes.title(title, '', *textnodes)
+        name = normalize_name(titlenode.astext())
+        section_node['names'].append(name)
+        section_node += titlenode
+        section_node += messages
+        section_node += title_messages
+        self.document.note_implicit_target(section_node, section_node)
+        offset = self.state_machine.line_offset + 1
+        absoffset = self.state_machine.abs_line_offset() + 1
+        newabsoffset = self.nested_parse(
+              self.state_machine.input_lines[offset:], input_offset=absoffset,
+              node=section_node, match_titles=1)
+        self.goto_line(newabsoffset)
+        if memo.section_level <= mylevel: # can't handle next section?
+            raise EOFError              # bubble up to supersection
+        # reset section_level; next pass will detect it properly
+        memo.section_level = mylevel
+
+    def paragraph(self, lines, lineno):
+        """
+        Return a list (paragraph & messages) & a boolean: literal_block next?
+        """
+        data = '\n'.join(lines).rstrip()
+        if re.search(r'(?<!\\)(\\\\)*::$', data):
+            if len(data) == 2:
+                return [], 1
+            elif data[-3] in ' \n':
+                text = data[:-3].rstrip()
+            else:
+                text = data[:-1]
+            literalnext = 1
+        else:
+            text = data
+            literalnext = 0
+        textnodes, messages = self.inline_text(text, lineno)
+        p = nodes.paragraph(data, '', *textnodes)
+        p.line = lineno
+        return [p] + messages, literalnext
+
+    def inline_text(self, text, lineno):
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+        """
+        return self.inliner.parse(text, lineno, self.memo, self.parent)
+
+    def unindent_warning(self, node_name):
+        return self.reporter.warning(
+            '%s ends without a blank line; unexpected unindent.' % node_name,
+            line=(self.state_machine.abs_line_number() + 1))
+
+
+def build_regexp(definition, compile=1):
+    """
+    Build, compile and return a regular expression based on `definition`.
+
+    :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
+        where "parts" is a list of regular expressions and/or regular
+        expression definitions to be joined into an or-group.
+    """
+    name, prefix, suffix, parts = definition
+    part_strings = []
+    for part in parts:
+        if type(part) is TupleType:
+            part_strings.append(build_regexp(part, None))
+        else:
+            part_strings.append(part)
+    or_group = '|'.join(part_strings)
+    regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
+    if compile:
+        return re.compile(regexp, re.UNICODE)
+    else:
+        return regexp
+
+
+class Inliner:
+
+    """
+    Parse inline markup; call the `parse()` method.
+    """
+
+    def __init__(self):
+        self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
+        """List of (pattern, bound method) tuples, used by
+        `self.implicit_inline`."""
+
+    def init_customizations(self, settings):
+        """Setting-based customizations; run when parsing begins."""
+        if settings.pep_references:
+            self.implicit_dispatch.append((self.patterns.pep,
+                                           self.pep_reference))
+        if settings.rfc_references:
+            self.implicit_dispatch.append((self.patterns.rfc,
+                                           self.rfc_reference))
+
+    def parse(self, text, lineno, memo, parent):
+        # Needs to be refactored for nested inline markup.
+        # Add nested_parse() method?
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+
+        Using `self.patterns.initial`, a pattern which matches start-strings
+        (emphasis, strong, interpreted, phrase reference, literal,
+        substitution reference, and inline target) and complete constructs
+        (simple reference, footnote reference), search for a candidate.  When
+        one is found, check for validity (e.g., not a quoted '*' character).
+        If valid, search for the corresponding end string if applicable, and
+        check it for validity.  If not found or invalid, generate a warning
+        and ignore the start-string.  Implicit inline markup (e.g. standalone
+        URIs) is found last.
+        """
+        self.reporter = memo.reporter
+        self.document = memo.document
+        self.language = memo.language
+        self.parent = parent
+        pattern_search = self.patterns.initial.search
+        dispatch = self.dispatch
+        remaining = escape2null(text)
+        processed = []
+        unprocessed = []
+        messages = []
+        while remaining:
+            match = pattern_search(remaining)
+            if match:
+                groups = match.groupdict()
+                method = dispatch[groups['start'] or groups['backquote']
+                                  or groups['refend'] or groups['fnend']]
+                before, inlines, remaining, sysmessages = method(self, match,
+                                                                 lineno)
+                unprocessed.append(before)
+                messages += sysmessages
+                if inlines:
+                    processed += self.implicit_inline(''.join(unprocessed),
+                                                      lineno)
+                    processed += inlines
+                    unprocessed = []
+            else:
+                break
+        remaining = ''.join(unprocessed) + remaining
+        if remaining:
+            processed += self.implicit_inline(remaining, lineno)
+        return processed, messages
+
+    openers = '\'"([{<'
+    closers = '\'")]}>'
+    start_string_prefix = (r'((?<=^)|(?<=[-/: \n%s]))' % re.escape(openers))
+    end_string_suffix = (r'((?=$)|(?=[-/:.,;!? \n\x00%s]))'
+                         % re.escape(closers))
+    non_whitespace_before = r'(?<![ \n])'
+    non_whitespace_escape_before = r'(?<![ \n\x00])'
+    non_whitespace_after = r'(?![ \n])'
+    # Alphanumerics with isolated internal [-._] chars (i.e. not 2 together):
+    simplename = r'(?:(?!_)\w)+(?:[-._](?:(?!_)\w)+)*'
+    # Valid URI characters (see RFC 2396 & RFC 2732);
+    # final \x00 allows backslash escapes in URIs:
+    uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
+    # Delimiter indicating the end of a URI (not part of the URI):
+    uri_end_delim = r"""[>]"""
+    # Last URI character; same as uric but no punctuation:
+    urilast = r"""[_~*/=+a-zA-Z0-9]"""
+    # End of a URI (either 'urilast' or 'uric followed by a
+    # uri_end_delim'):
+    uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals()
+    emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
+    email_pattern = r"""
+          %(emailc)s+(?:\.%(emailc)s+)*   # name
+          (?<!\x00)@                      # at
+          %(emailc)s+(?:\.%(emailc)s*)*   # host
+          %(uri_end)s                     # final URI char
+          """
+    parts = ('initial_inline', start_string_prefix, '',
+             [('start', '', non_whitespace_after,  # simple start-strings
+               [r'\*\*',                # strong
+                r'\*(?!\*)',            # emphasis but not strong
+                r'``',                  # literal
+                r'_`',                  # inline internal target
+                r'\|(?!\|)']            # substitution reference
+               ),
+              ('whole', '', end_string_suffix, # whole constructs
+               [# reference name & end-string
+                r'(?P<refname>%s)(?P<refend>__?)' % simplename,
+                ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
+                 [r'[0-9]+',               # manually numbered
+                  r'\#(%s)?' % simplename, # auto-numbered (w/ label?)
+                  r'\*',                   # auto-symbol
+                  r'(?P<citationlabel>%s)' % simplename] # citation reference
+                 )
+                ]
+               ),
+              ('backquote',             # interpreted text or phrase reference
+               '(?P<role>(:%s:)?)' % simplename, # optional role
+               non_whitespace_after,
+               ['`(?!`)']               # but not literal
+               )
+              ]
+             )
+    patterns = Struct(
+          initial=build_regexp(parts),
+          emphasis=re.compile(non_whitespace_escape_before
+                              + r'(\*)' + end_string_suffix),
+          strong=re.compile(non_whitespace_escape_before
+                            + r'(\*\*)' + end_string_suffix),
+          interpreted_or_phrase_ref=re.compile(
+              r"""
+              %(non_whitespace_escape_before)s
+              (
+                `
+                (?P<suffix>
+                  (?P<role>:%(simplename)s:)?
+                  (?P<refend>__?)?
+                )
+              )
+              %(end_string_suffix)s
+              """ % locals(), re.VERBOSE | re.UNICODE),
+          embedded_uri=re.compile(
+              r"""
+              (
+                (?:[ \n]+|^)            # spaces or beginning of line/string
+                <                       # open bracket
+                %(non_whitespace_after)s
+                ([^<>\x00]+)            # anything but angle brackets & nulls
+                %(non_whitespace_before)s
+                >                       # close bracket w/o whitespace before
+              )
+              $                         # end of string
+              """ % locals(), re.VERBOSE),
+          literal=re.compile(non_whitespace_before + '(``)'
+                             + end_string_suffix),
+          target=re.compile(non_whitespace_escape_before
+                            + r'(`)' + end_string_suffix),
+          substitution_ref=re.compile(non_whitespace_escape_before
+                                      + r'(\|_{0,2})'
+                                      + end_string_suffix),
+          email=re.compile(email_pattern % locals() + '$', re.VERBOSE),
+          uri=re.compile(
+                (r"""
+                %(start_string_prefix)s
+                (?P<whole>
+                  (?P<absolute>           # absolute URI
+                    (?P<scheme>             # scheme (http, ftp, mailto)
+                      [a-zA-Z][a-zA-Z0-9.+-]*
+                    )
+                    :
+                    (
+                      (                       # either:
+                        (//?)?                  # hierarchical URI
+                        %(uric)s*               # URI characters
+                        %(uri_end)s             # final URI char
+                      )
+                      (                       # optional query
+                        \?%(uric)s*
+                        %(uri_end)s
+                      )?
+                      (                       # optional fragment
+                        \#%(uric)s*
+                        %(uri_end)s
+                      )?
+                    )
+                  )
+                |                       # *OR*
+                  (?P<email>              # email address
+                    """ + email_pattern + r"""
+                  )
+                )
+                %(end_string_suffix)s
+                """) % locals(), re.VERBOSE),
+          pep=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (
+                  (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
+                |
+                  (PEP\s+(?P<pepnum2>\d+))      # reference by name
+                )
+                %(end_string_suffix)s""" % locals(), re.VERBOSE),
+          rfc=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (RFC(-|\s+)?(?P<rfcnum>\d+))
+                %(end_string_suffix)s""" % locals(), re.VERBOSE))
+
+    def quoted_start(self, match):
+        """Return 1 if inline markup start-string is 'quoted', 0 if not."""
+        string = match.string
+        start = match.start()
+        end = match.end()
+        if start == 0:                  # start-string at beginning of text
+            return 0
+        prestart = string[start - 1]
+        try:
+            poststart = string[end]
+            if self.openers.index(prestart) \
+                  == self.closers.index(poststart):   # quoted
+                return 1
+        except IndexError:              # start-string at end of text
+            return 1
+        except ValueError:              # not quoted
+            pass
+        return 0
+
+    def inline_obj(self, match, lineno, end_pattern, nodeclass,
+                   restore_backslashes=0):
+        string = match.string
+        matchstart = match.start('start')
+        matchend = match.end('start')
+        if self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [], '')
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            text = unescape(endmatch.string[:endmatch.start(1)],
+                            restore_backslashes)
+            textend = matchend + endmatch.end(1)
+            rawsource = unescape(string[matchstart:textend], 1)
+            return (string[:matchstart], [nodeclass(rawsource, text)],
+                    string[textend:], [], endmatch.group(1))
+        msg = self.reporter.warning(
+              'Inline %s start-string without end-string.'
+              % nodeclass.__name__, line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        rawsource = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, rawsource, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg], ''
+
+    def problematic(self, text, rawsource, message):
+        msgid = self.document.set_id(message, self.parent)
+        problematic = nodes.problematic(rawsource, text, refid=msgid)
+        prbid = self.document.set_id(problematic)
+        message.add_backref(prbid)
+        return problematic
+
+    def emphasis(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.emphasis, nodes.emphasis)
+        return before, inlines, remaining, sysmessages
+
+    def strong(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.strong, nodes.strong)
+        return before, inlines, remaining, sysmessages
+
+    def interpreted_or_phrase_ref(self, match, lineno):
+        end_pattern = self.patterns.interpreted_or_phrase_ref
+        string = match.string
+        matchstart = match.start('backquote')
+        matchend = match.end('backquote')
+        rolestart = match.start('role')
+        role = match.group('role')
+        position = ''
+        if role:
+            role = role[1:-1]
+            position = 'prefix'
+        elif self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [])
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            textend = matchend + endmatch.end()
+            if endmatch.group('role'):
+                if role:
+                    msg = self.reporter.warning(
+                        'Multiple roles in interpreted text (both '
+                        'prefix and suffix present; only one allowed).',
+                        line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                role = endmatch.group('suffix')[1:-1]
+                position = 'suffix'
+            escaped = endmatch.string[:endmatch.start(1)]
+            rawsource = unescape(string[matchstart:textend], 1)
+            if rawsource[-1:] == '_':
+                if role:
+                    msg = self.reporter.warning(
+                          'Mismatch: both interpreted text role %s and '
+                          'reference suffix.' % position, line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                return self.phrase_ref(string[:matchstart], string[textend:],
+                                       rawsource, escaped, unescape(escaped))
+            else:
+                rawsource = unescape(string[rolestart:textend], 1)
+                nodelist, messages = self.interpreted(rawsource, escaped, role,
+                                                      lineno)
+                return (string[:rolestart], nodelist,
+                        string[textend:], messages)
+        msg = self.reporter.warning(
+              'Inline interpreted text or phrase reference start-string '
+              'without end-string.', line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, text, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg]
+
+    def phrase_ref(self, before, after, rawsource, escaped, text):
+        match = self.patterns.embedded_uri.search(escaped)
+        if match:
+            text = unescape(escaped[:match.start(0)])
+            uri_text = match.group(2)
+            uri = ''.join(uri_text.split())
+            uri = self.adjust_uri(uri)
+            if uri:
+                target = nodes.target(match.group(1), refuri=uri)
+            else:
+                raise ApplicationError('problem with URI: %r' % uri_text)
+            if not text:
+                text = uri
+        else:
+            target = None
+        refname = normalize_name(text)
+        reference = nodes.reference(rawsource, text,
+                                    name=whitespace_normalize_name(text))
+        node_list = [reference]
+        if rawsource[-2:] == '__':
+            if target:
+                reference['refuri'] = uri
+            else:
+                reference['anonymous'] = 1
+        else:
+            if target:
+                reference['refuri'] = uri
+                target['names'].append(refname)
+                self.document.note_explicit_target(target, self.parent)
+                node_list.append(target)
+            else:
+                reference['refname'] = refname
+                self.document.note_refname(reference)
+        return before, node_list, after, []
+
+    def adjust_uri(self, uri):
+        match = self.patterns.email.match(uri)
+        if match:
+            return 'mailto:' + uri
+        else:
+            return uri
+
+    def interpreted(self, rawsource, text, role, lineno):
+        role_fn, messages = roles.role(role, self.language, lineno,
+                                       self.reporter)
+        if role_fn:
+            nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
+            return nodes, messages + messages2
+        else:
+            msg = self.reporter.error(
+                'Unknown interpreted text role "%s".' % role,
+                line=lineno)
+            return ([self.problematic(rawsource, rawsource, msg)],
+                    messages + [msg])
+
+    def literal(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.literal, nodes.literal,
+              restore_backslashes=1)
+        return before, inlines, remaining, sysmessages
+
+    def inline_internal_target(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.target, nodes.target)
+        if inlines and isinstance(inlines[0], nodes.target):
+            assert len(inlines) == 1
+            target = inlines[0]
+            name = normalize_name(target.astext())
+            target['names'].append(name)
+            self.document.note_explicit_target(target, self.parent)
+        return before, inlines, remaining, sysmessages
+
+    def substitution_reference(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.substitution_ref,
+              nodes.substitution_reference)
+        if len(inlines) == 1:
+            subref_node = inlines[0]
+            if isinstance(subref_node, nodes.substitution_reference):
+                subref_text = subref_node.astext()
+                self.document.note_substitution_ref(subref_node, subref_text)
+                if endstring[-1:] == '_':
+                    reference_node = nodes.reference(
+                        '|%s%s' % (subref_text, endstring), '')
+                    if endstring[-2:] == '__':
+                        reference_node['anonymous'] = 1
+                    else:
+                        reference_node['refname'] = normalize_name(subref_text)
+                        self.document.note_refname(reference_node)
+                    reference_node += subref_node
+                    inlines = [reference_node]
+        return before, inlines, remaining, sysmessages
+
+    def footnote_reference(self, match, lineno):
+        """
+        Handles `nodes.footnote_reference` and `nodes.citation_reference`
+        elements.
+        """
+        label = match.group('footnotelabel')
+        refname = normalize_name(label)
+        string = match.string
+        before = string[:match.start('whole')]
+        remaining = string[match.end('whole'):]
+        if match.group('citationlabel'):
+            refnode = nodes.citation_reference('[%s]_' % label,
+                                               refname=refname)
+            refnode += nodes.Text(label)
+            self.document.note_citation_ref(refnode)
+        else:
+            refnode = nodes.footnote_reference('[%s]_' % label)
+            if refname[0] == '#':
+                refname = refname[1:]
+                refnode['auto'] = 1
+                self.document.note_autofootnote_ref(refnode)
+            elif refname == '*':
+                refname = ''
+                refnode['auto'] = '*'
+                self.document.note_symbol_footnote_ref(
+                      refnode)
+            else:
+                refnode += nodes.Text(label)
+            if refname:
+                refnode['refname'] = refname
+                self.document.note_footnote_ref(refnode)
+            if utils.get_trim_footnote_ref_space(self.document.settings):
+                before = before.rstrip()
+        return (before, [refnode], remaining, [])
+
+    def reference(self, match, lineno, anonymous=None):
+        referencename = match.group('refname')
+        refname = normalize_name(referencename)
+        referencenode = nodes.reference(
+            referencename + match.group('refend'), referencename,
+            name=whitespace_normalize_name(referencename))
+        if anonymous:
+            referencenode['anonymous'] = 1
+        else:
+            referencenode['refname'] = refname
+            self.document.note_refname(referencenode)
+        string = match.string
+        matchstart = match.start('whole')
+        matchend = match.end('whole')
+        return (string[:matchstart], [referencenode], string[matchend:], [])
+
+    def anonymous_reference(self, match, lineno):
+        return self.reference(match, lineno, anonymous=1)
+
+    def standalone_uri(self, match, lineno):
+        if not match.group('scheme') or urischemes.schemes.has_key(
+              match.group('scheme').lower()):
+            if match.group('email'):
+                addscheme = 'mailto:'
+            else:
+                addscheme = ''
+            text = match.group('whole')
+            unescaped = unescape(text, 0)
+            return [nodes.reference(unescape(text, 1), unescaped,
+                                    refuri=addscheme + unescaped)]
+        else:                   # not a valid scheme
+            raise MarkupMismatch
+
+    def pep_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('pep-'):
+            pepnum = int(match.group('pepnum1'))
+        elif text.startswith('PEP'):
+            pepnum = int(match.group('pepnum2'))
+        else:
+            raise MarkupMismatch
+        ref = (self.document.settings.pep_base_url
+               + self.document.settings.pep_file_url_template % pepnum)
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    rfc_url = 'rfc%d.html'
+
+    def rfc_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('RFC'):
+            rfcnum = int(match.group('rfcnum'))
+            ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum
+        else:
+            raise MarkupMismatch
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    def implicit_inline(self, text, lineno):
+        """
+        Check each of the patterns in `self.implicit_dispatch` for a match,
+        and dispatch to the stored method for the pattern.  Recursively check
+        the text before and after the match.  Return a list of `nodes.Text`
+        and inline element nodes.
+        """
+        if not text:
+            return []
+        for pattern, method in self.implicit_dispatch:
+            match = pattern.search(text)
+            if match:
+                try:
+                    # Must recurse on strings before *and* after the match;
+                    # there may be multiple patterns.
+                    return (self.implicit_inline(text[:match.start()], lineno)
+                            + method(match, lineno) +
+                            self.implicit_inline(text[match.end():], lineno))
+                except MarkupMismatch:
+                    pass
+        return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
+
+    dispatch = {'*': emphasis,
+                '**': strong,
+                '`': interpreted_or_phrase_ref,
+                '``': literal,
+                '_`': inline_internal_target,
+                ']_': footnote_reference,
+                '|': substitution_reference,
+                '_': reference,
+                '__': anonymous_reference}
+
+
+def _loweralpha_to_int(s, _zero=(ord('a')-1)):
+    return ord(s) - _zero
+
+def _upperalpha_to_int(s, _zero=(ord('A')-1)):
+    return ord(s) - _zero
+
+def _lowerroman_to_int(s):
+    return roman.fromRoman(s.upper())
+
+
+class Body(RSTState):
+
+    """
+    Generic classifier of the first line of a block.
+    """
+
+    double_width_pad_char = tableparser.TableParser.double_width_pad_char
+    """Padding character for East Asian double-width text."""
+
+    enum = Struct()
+    """Enumerated list parsing information."""
+
+    enum.formatinfo = {
+          'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
+          'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
+          'period': Struct(prefix='', suffix='.', start=0, end=-1)}
+    enum.formats = enum.formatinfo.keys()
+    enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
+                      'lowerroman', 'upperroman'] # ORDERED!
+    enum.sequencepats = {'arabic': '[0-9]+',
+                         'loweralpha': '[a-z]',
+                         'upperalpha': '[A-Z]',
+                         'lowerroman': '[ivxlcdm]+',
+                         'upperroman': '[IVXLCDM]+',}
+    enum.converters = {'arabic': int,
+                       'loweralpha': _loweralpha_to_int,
+                       'upperalpha': _upperalpha_to_int,
+                       'lowerroman': _lowerroman_to_int,
+                       'upperroman': roman.fromRoman}
+
+    enum.sequenceregexps = {}
+    for sequence in enum.sequences:
+        enum.sequenceregexps[sequence] = re.compile(
+              enum.sequencepats[sequence] + '$')
+
+    grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
+    """Matches the top (& bottom) of a full table)."""
+
+    simple_table_top_pat = re.compile('=+( +=+)+ *$')
+    """Matches the top of a simple table."""
+
+    simple_table_border_pat = re.compile('=+[ =]*$')
+    """Matches the bottom & header bottom of a simple table."""
+
+    pats = {}
+    """Fragments of patterns used by transitions."""
+
+    pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
+    pats['alpha'] = '[a-zA-Z]'
+    pats['alphanum'] = '[a-zA-Z0-9]'
+    pats['alphanumplus'] = '[a-zA-Z0-9_-]'
+    pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
+                    '|%(upperroman)s|#)' % enum.sequencepats)
+    pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
+    # @@@ Loosen up the pattern?  Allow Unicode?
+    pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats
+    pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
+    pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
+    pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
+
+    for format in enum.formats:
+        pats[format] = '(?P<%s>%s%s%s)' % (
+              format, re.escape(enum.formatinfo[format].prefix),
+              pats['enum'], re.escape(enum.formatinfo[format].suffix))
+
+    patterns = {
+          'bullet': ur'[-+*\u2022\u2023\u2043]( +|$)',
+          'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
+          'field_marker': r':(?![: ])([^:\\]|\\.)*(?<! ):( +|$)',
+          'option_marker': r'%(option)s(, %(option)s)*(  +| ?$)' % pats,
+          'doctest': r'>>>( +|$)',
+          'line_block': r'\|( +|$)',
+          'grid_table_top': grid_table_top_pat,
+          'simple_table_top': simple_table_top_pat,
+          'explicit_markup': r'\.\.( +|$)',
+          'anonymous': r'__( +|$)',
+          'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
+          'text': r''}
+    initial_transitions = (
+          'bullet',
+          'enumerator',
+          'field_marker',
+          'option_marker',
+          'doctest',
+          'line_block',
+          'grid_table_top',
+          'simple_table_top',
+          'explicit_markup',
+          'anonymous',
+          'line',
+          'text')
+
+    def indent(self, match, context, next_state):
+        """Block quote."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        elements = self.block_quote(indented, line_offset)
+        self.parent += elements
+        if not blank_finish:
+            self.parent += self.unindent_warning('Block quote')
+        return context, next_state, []
+
+    def block_quote(self, indented, line_offset):
+        elements = []
+        while indented:
+            (blockquote_lines,
+             attribution_lines,
+             attribution_offset,
+             indented,
+             new_line_offset) = self.split_attribution(indented, line_offset)
+            blockquote = nodes.block_quote()
+            self.nested_parse(blockquote_lines, line_offset, blockquote)
+            elements.append(blockquote)
+            if attribution_lines:
+                attribution, messages = self.parse_attribution(
+                    attribution_lines, attribution_offset)
+                blockquote += attribution
+                elements += messages
+            line_offset = new_line_offset
+            while indented and not indented[0]:
+                indented = indented[1:]
+                line_offset += 1
+        return elements
+
+    # U+2014 is an em-dash:
+    attribution_pattern = re.compile(ur'(---?(?!-)|\u2014) *(?=[^ \n])')
+
+    def split_attribution(self, indented, line_offset):
+        """
+        Check for a block quote attribution and split it off:
+
+        * First line after a blank line must begin with a dash ("--", "---",
+          em-dash; matches `self.attribution_pattern`).
+        * Every line after that must have consistent indentation.
+        * Attributions must be preceded by block quote content.
+
+        Return a tuple of: (block quote content lines, content offset,
+        attribution lines, attribution offset, remaining indented lines).
+        """
+        blank = None
+        nonblank_seen = False
+        for i in range(len(indented)):
+            line = indented[i].rstrip()
+            if line:
+                if nonblank_seen and blank == i - 1: # last line blank
+                    match = self.attribution_pattern.match(line)
+                    if match:
+                        attribution_end, indent = self.check_attribution(
+                            indented, i)
+                        if attribution_end:
+                            a_lines = indented[i:attribution_end]
+                            a_lines.trim_left(match.end(), end=1)
+                            a_lines.trim_left(indent, start=1)
+                            return (indented[:i], a_lines,
+                                    i, indented[attribution_end:],
+                                    line_offset + attribution_end)
+                nonblank_seen = True
+            else:
+                blank = i
+        else:
+            return (indented, None, None, None, None)
+
+    def check_attribution(self, indented, attribution_start):
+        """
+        Check attribution shape.
+        Return the index past the end of the attribution, and the indent.
+        """
+        indent = None
+        i = attribution_start + 1
+        for i in range(attribution_start + 1, len(indented)):
+            line = indented[i].rstrip()
+            if not line:
+                break
+            if indent is None:
+                indent = len(line) - len(line.lstrip())
+            elif len(line) - len(line.lstrip()) != indent:
+                return None, None       # bad shape; not an attribution
+        else:
+            # return index of line after last attribution line:
+            i += 1
+        return i, (indent or 0)
+
+    def parse_attribution(self, indented, line_offset):
+        text = '\n'.join(indented).rstrip()
+        lineno = self.state_machine.abs_line_number() + line_offset
+        textnodes, messages = self.inline_text(text, lineno)
+        node = nodes.attribution(text, '', *textnodes)
+        node.line = lineno
+        return node, messages
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        bulletlist = nodes.bullet_list()
+        self.parent += bulletlist
+        bulletlist['bullet'] = match.string[0]
+        i, blank_finish = self.list_item(match.end())
+        bulletlist += i
+        offset = self.state_machine.line_offset + 1   # next line
+        new_line_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=bulletlist, initial_state='BulletList',
+              blank_finish=blank_finish)
+        self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Bullet list')
+        return [], next_state, []
+
+    def list_item(self, indent):
+        if self.state_machine.line[indent:]:
+            indented, line_offset, blank_finish = (
+                self.state_machine.get_known_indented(indent))
+        else:
+            indented, indent, line_offset, blank_finish = (
+                self.state_machine.get_first_known_indented(indent))
+        listitem = nodes.list_item('\n'.join(indented))
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=listitem)
+        return listitem, blank_finish
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated List Item"""
+        format, sequence, text, ordinal = self.parse_enumerator(match)
+        if not self.is_enumerated_list_item(ordinal, sequence, format):
+            raise statemachine.TransitionCorrection('text')
+        enumlist = nodes.enumerated_list()
+        self.parent += enumlist
+        if sequence == '#':
+            enumlist['enumtype'] = 'arabic'
+        else:
+            enumlist['enumtype'] = sequence
+        enumlist['prefix'] = self.enum.formatinfo[format].prefix
+        enumlist['suffix'] = self.enum.formatinfo[format].suffix
+        if ordinal != 1:
+            enumlist['start'] = ordinal
+            msg = self.reporter.info(
+                'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
+                % (text, ordinal), line=self.state_machine.abs_line_number())
+            self.parent += msg
+        listitem, blank_finish = self.list_item(match.end())
+        enumlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=enumlist, initial_state='EnumeratedList',
+              blank_finish=blank_finish,
+              extra_settings={'lastordinal': ordinal,
+                              'format': format,
+                              'auto': sequence == '#'})
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Enumerated list')
+        return [], next_state, []
+
+    def parse_enumerator(self, match, expected_sequence=None):
+        """
+        Analyze an enumerator and return the results.
+
+        :Return:
+            - the enumerator format ('period', 'parens', or 'rparen'),
+            - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
+            - the text of the enumerator, stripped of formatting, and
+            - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
+              ``None`` is returned for invalid enumerator text).
+
+        The enumerator format has already been determined by the regular
+        expression match. If `expected_sequence` is given, that sequence is
+        tried first. If not, we check for Roman numeral 1. This way,
+        single-character Roman numerals (which are also alphabetical) can be
+        matched. If no sequence has been matched, all sequences are checked in
+        order.
+        """
+        groupdict = match.groupdict()
+        sequence = ''
+        for format in self.enum.formats:
+            if groupdict[format]:       # was this the format matched?
+                break                   # yes; keep `format`
+        else:                           # shouldn't happen
+            raise ParserError('enumerator format not matched')
+        text = groupdict[format][self.enum.formatinfo[format].start
+                                 :self.enum.formatinfo[format].end]
+        if text == '#':
+            sequence = '#'
+        elif expected_sequence:
+            try:
+                if self.enum.sequenceregexps[expected_sequence].match(text):
+                    sequence = expected_sequence
+            except KeyError:            # shouldn't happen
+                raise ParserError('unknown enumerator sequence: %s'
+                                  % sequence)
+        elif text == 'i':
+            sequence = 'lowerroman'
+        elif text == 'I':
+            sequence = 'upperroman'
+        if not sequence:
+            for sequence in self.enum.sequences:
+                if self.enum.sequenceregexps[sequence].match(text):
+                    break
+            else:                       # shouldn't happen
+                raise ParserError('enumerator sequence not matched')
+        if sequence == '#':
+            ordinal = 1
+        else:
+            try:
+                ordinal = self.enum.converters[sequence](text)
+            except roman.InvalidRomanNumeralError:
+                ordinal = None
+        return format, sequence, text, ordinal
+
+    def is_enumerated_list_item(self, ordinal, sequence, format):
+        """
+        Check validity based on the ordinal value and the second line.
+
+        Return true iff the ordinal is valid and the second line is blank,
+        indented, or starts with the next enumerator or an auto-enumerator.
+        """
+        if ordinal is None:
+            return None
+        try:
+            next_line = self.state_machine.next_line()
+        except EOFError:              # end of input lines
+            self.state_machine.previous_line()
+            return 1
+        else:
+            self.state_machine.previous_line()
+        if not next_line[:1].strip():   # blank or indented
+            return 1
+        result = self.make_enumerator(ordinal + 1, sequence, format)
+        if result:
+            next_enumerator, auto_enumerator = result
+            try:
+                if ( next_line.startswith(next_enumerator) or
+                     next_line.startswith(auto_enumerator) ):
+                    return 1
+            except TypeError:
+                pass
+        return None
+
+    def make_enumerator(self, ordinal, sequence, format):
+        """
+        Construct and return the next enumerated list item marker, and an
+        auto-enumerator ("#" instead of the regular enumerator).
+
+        Return ``None`` for invalid (out of range) ordinals.
+        """ #"
+        if sequence == '#':
+            enumerator = '#'
+        elif sequence == 'arabic':
+            enumerator = str(ordinal)
+        else:
+            if sequence.endswith('alpha'):
+                if ordinal > 26:
+                    return None
+                enumerator = chr(ordinal + ord('a') - 1)
+            elif sequence.endswith('roman'):
+                try:
+                    enumerator = roman.toRoman(ordinal)
+                except roman.RomanError:
+                    return None
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+            if sequence.startswith('lower'):
+                enumerator = enumerator.lower()
+            elif sequence.startswith('upper'):
+                enumerator = enumerator.upper()
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+        formatinfo = self.enum.formatinfo[format]
+        next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix
+                           + ' ')
+        auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' '
+        return next_enumerator, auto_enumerator
+
+    def field_marker(self, match, context, next_state):
+        """Field list item."""
+        field_list = nodes.field_list()
+        self.parent += field_list
+        field, blank_finish = self.field(match)
+        field_list += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=field_list, initial_state='FieldList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Field list')
+        return [], next_state, []
+
+    def field(self, match):
+        name = self.parse_field_marker(match)
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        field_node = nodes.field()
+        field_node.line = lineno
+        name_nodes, name_messages = self.inline_text(name, lineno)
+        field_node += nodes.field_name(name, '', *name_nodes)
+        field_body = nodes.field_body('\n'.join(indented), *name_messages)
+        field_node += field_body
+        if indented:
+            self.parse_field_body(indented, line_offset, field_body)
+        return field_node, blank_finish
+
+    def parse_field_marker(self, match):
+        """Extract & return field name from a field marker match."""
+        field = match.group()[1:]        # strip off leading ':'
+        field = field[:field.rfind(':')] # strip off trailing ':' etc.
+        return field
+
+    def parse_field_body(self, indented, offset, node):
+        self.nested_parse(indented, input_offset=offset, node=node)
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        optionlist = nodes.option_list()
+        try:
+            listitem, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            # This shouldn't happen; pattern won't match.
+            msg = self.reporter.error(
+                'Invalid option list marker: %s' % message, line=lineno)
+            self.parent += msg
+            indented, indent, line_offset, blank_finish = \
+                  self.state_machine.get_first_known_indented(match.end())
+            elements = self.block_quote(indented, line_offset)
+            self.parent += elements
+            if not blank_finish:
+                self.parent += self.unindent_warning('Option list')
+            return [], next_state, []
+        self.parent += optionlist
+        optionlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=optionlist, initial_state='OptionList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Option list')
+        return [], next_state, []
+
+    def option_list_item(self, match):
+        offset = self.state_machine.abs_line_offset()
+        options = self.parse_option_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        if not indented:                # not an option list item
+            self.goto_line(offset)
+            raise statemachine.TransitionCorrection('text')
+        option_group = nodes.option_group('', *options)
+        description = nodes.description('\n'.join(indented))
+        option_list_item = nodes.option_list_item('', option_group,
+                                                  description)
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=description)
+        return option_list_item, blank_finish
+
+    def parse_option_marker(self, match):
+        """
+        Return a list of `node.option` and `node.option_argument` objects,
+        parsed from an option marker match.
+
+        :Exception: `MarkupError` for invalid option markers.
+        """
+        optlist = []
+        optionstrings = match.group().rstrip().split(', ')
+        for optionstring in optionstrings:
+            tokens = optionstring.split()
+            delimiter = ' '
+            firstopt = tokens[0].split('=')
+            if len(firstopt) > 1:
+                # "--opt=value" form
+                tokens[:1] = firstopt
+                delimiter = '='
+            elif (len(tokens[0]) > 2
+                  and ((tokens[0].startswith('-')
+                        and not tokens[0].startswith('--'))
+                       or tokens[0].startswith('+'))):
+                # "-ovalue" form
+                tokens[:1] = [tokens[0][:2], tokens[0][2:]]
+                delimiter = ''
+            if len(tokens) > 1 and (tokens[1].startswith('<')
+                                    and tokens[-1].endswith('>')):
+                # "-o <value1 value2>" form; join all values into one token
+                tokens[1:] = [' '.join(tokens[1:])]
+            if 0 < len(tokens) <= 2:
+                option = nodes.option(optionstring)
+                option += nodes.option_string(tokens[0], tokens[0])
+                if len(tokens) > 1:
+                    option += nodes.option_argument(tokens[1], tokens[1],
+                                                    delimiter=delimiter)
+                optlist.append(option)
+            else:
+                raise MarkupError(
+                    'wrong number of option tokens (=%s), should be 1 or 2: '
+                    '"%s"' % (len(tokens), optionstring),
+                    self.state_machine.abs_line_number() + 1)
+        return optlist
+
+    def doctest(self, match, context, next_state):
+        data = '\n'.join(self.state_machine.get_text_block())
+        self.parent += nodes.doctest_block(data, data)
+        return [], next_state, []
+
+    def line_block(self, match, context, next_state):
+        """First line of a line block."""
+        block = nodes.line_block()
+        self.parent += block
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        block += line
+        self.parent += messages
+        if not blank_finish:
+            offset = self.state_machine.line_offset + 1   # next line
+            new_line_offset, blank_finish = self.nested_list_parse(
+                  self.state_machine.input_lines[offset:],
+                  input_offset=self.state_machine.abs_line_offset() + 1,
+                  node=block, initial_state='LineBlock',
+                  blank_finish=0)
+            self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.reporter.warning(
+                'Line block ends without a blank line.',
+                line=(self.state_machine.abs_line_number() + 1))
+        if len(block):
+            if block[0].indent is None:
+                block[0].indent = 0
+            self.nest_line_block_lines(block)
+        return [], next_state, []
+
+    def line_block_line(self, match, lineno):
+        """Return one line element of a line_block."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        text = u'\n'.join(indented)
+        text_nodes, messages = self.inline_text(text, lineno)
+        line = nodes.line(text, '', *text_nodes)
+        if match.string.rstrip() != '|': # not empty
+            line.indent = len(match.group(1)) - 1
+        return line, messages, blank_finish
+
+    def nest_line_block_lines(self, block):
+        for index in range(1, len(block)):
+            if block[index].indent is None:
+                block[index].indent = block[index - 1].indent
+        self.nest_line_block_segment(block)
+
+    def nest_line_block_segment(self, block):
+        indents = [item.indent for item in block]
+        least = min(indents)
+        new_items = []
+        new_block = nodes.line_block()
+        for item in block:
+            if item.indent > least:
+                new_block.append(item)
+            else:
+                if len(new_block):
+                    self.nest_line_block_segment(new_block)
+                    new_items.append(new_block)
+                    new_block = nodes.line_block()
+                new_items.append(item)
+        if len(new_block):
+            self.nest_line_block_segment(new_block)
+            new_items.append(new_block)
+        block[:] = new_items
+
+    def grid_table_top(self, match, context, next_state):
+        """Top border of a full table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_grid_table,
+                              tableparser.GridTableParser)
+
+    def simple_table_top(self, match, context, next_state):
+        """Top border of a simple table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_simple_table,
+                              tableparser.SimpleTableParser)
+
+    def table_top(self, match, context, next_state,
+                  isolate_function, parser_class):
+        """Top border of a generic table."""
+        nodelist, blank_finish = self.table(isolate_function, parser_class)
+        self.parent += nodelist
+        if not blank_finish:
+            msg = self.reporter.warning(
+                'Blank line required after table.',
+                line=self.state_machine.abs_line_number() + 1)
+            self.parent += msg
+        return [], next_state, []
+
+    def table(self, isolate_function, parser_class):
+        """Parse a table."""
+        block, messages, blank_finish = isolate_function()
+        if block:
+            try:
+                parser = parser_class()
+                tabledata = parser.parse(block)
+                tableline = (self.state_machine.abs_line_number() - len(block)
+                             + 1)
+                table = self.build_table(tabledata, tableline)
+                nodelist = [table] + messages
+            except tableparser.TableMarkupError, detail:
+                nodelist = self.malformed_table(
+                    block, ' '.join(detail.args)) + messages
+        else:
+            nodelist = messages
+        return nodelist, blank_finish
+
+    def isolate_grid_table(self):
+        messages = []
+        blank_finish = 1
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            messages.append(self.reporter.error('Unexpected indentation.',
+                                                source=source, line=lineno))
+            blank_finish = 0
+        block.disconnect()
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        width = len(block[0].strip())
+        for i in range(len(block)):
+            block[i] = block[i].strip()
+            if block[i][0] not in '+|': # check left edge
+                blank_finish = 0
+                self.state_machine.previous_line(len(block) - i)
+                del block[i:]
+                break
+        if not self.grid_table_top_pat.match(block[-1]): # find bottom
+            blank_finish = 0
+            # from second-last to third line of table:
+            for i in range(len(block) - 2, 1, -1):
+                if self.grid_table_top_pat.match(block[i]):
+                    self.state_machine.previous_line(len(block) - i + 1)
+                    del block[i+1:]
+                    break
+            else:
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        for i in range(len(block)):     # check right edge
+            if len(block[i]) != width or block[i][-1] not in '+|':
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        return block, messages, blank_finish
+
+    def isolate_simple_table(self):
+        start = self.state_machine.line_offset
+        lines = self.state_machine.input_lines
+        limit = len(lines) - 1
+        toplen = len(lines[start].strip())
+        pattern_match = self.simple_table_border_pat.match
+        found = 0
+        found_at = None
+        i = start + 1
+        while i <= limit:
+            line = lines[i]
+            match = pattern_match(line)
+            if match:
+                if len(line.strip()) != toplen:
+                    self.state_machine.next_line(i - start)
+                    messages = self.malformed_table(
+                        lines[start:i+1], 'Bottom/header table border does '
+                        'not match top border.')
+                    return [], messages, i == limit or not lines[i+1].strip()
+                found += 1
+                found_at = i
+                if found == 2 or i == limit or not lines[i+1].strip():
+                    end = i
+                    break
+            i += 1
+        else:                           # reached end of input_lines
+            if found:
+                extra = ' or no blank line after table bottom'
+                self.state_machine.next_line(found_at - start)
+                block = lines[start:found_at+1]
+            else:
+                extra = ''
+                self.state_machine.next_line(i - start - 1)
+                block = lines[start:]
+            messages = self.malformed_table(
+                block, 'No bottom table border found%s.' % extra)
+            return [], messages, not extra
+        self.state_machine.next_line(end - start)
+        block = lines[start:end+1]
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        return block, [], end == limit or not lines[end+1].strip()
+
+    def malformed_table(self, block, detail=''):
+        block.replace(self.double_width_pad_char, '')
+        data = '\n'.join(block)
+        message = 'Malformed table.'
+        lineno = self.state_machine.abs_line_number() - len(block) + 1
+        if detail:
+            message += '\n' + detail
+        error = self.reporter.error(message, nodes.literal_block(data, data),
+                                    line=lineno)
+        return [error]
+
+    def build_table(self, tabledata, tableline, stub_columns=0):
+        colwidths, headrows, bodyrows = tabledata
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(colwidths))
+        table += tgroup
+        for colwidth in colwidths:
+            colspec = nodes.colspec(colwidth=colwidth)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        if headrows:
+            thead = nodes.thead()
+            tgroup += thead
+            for row in headrows:
+                thead += self.build_table_row(row, tableline)
+        tbody = nodes.tbody()
+        tgroup += tbody
+        for row in bodyrows:
+            tbody += self.build_table_row(row, tableline)
+        return table
+
+    def build_table_row(self, rowdata, tableline):
+        row = nodes.row()
+        for cell in rowdata:
+            if cell is None:
+                continue
+            morerows, morecols, offset, cellblock = cell
+            attributes = {}
+            if morerows:
+                attributes['morerows'] = morerows
+            if morecols:
+                attributes['morecols'] = morecols
+            entry = nodes.entry(**attributes)
+            row += entry
+            if ''.join(cellblock):
+                self.nested_parse(cellblock, input_offset=tableline+offset,
+                                  node=entry)
+        return row
+
+
+    explicit = Struct()
+    """Patterns and constants used for explicit markup recognition."""
+
+    explicit.patterns = Struct(
+          target=re.compile(r"""
+                            (
+                              _               # anonymous target
+                            |               # *OR*
+                              (?!_)           # no underscore at the beginning
+                              (?P<quote>`?)   # optional open quote
+                              (?![ `])        # first char. not space or
+                                              # backquote
+                              (?P<name>       # reference name
+                                .+?
+                              )
+                              %(non_whitespace_escape_before)s
+                              (?P=quote)      # close quote if open quote used
+                            )
+                            (?<!(?<!\x00):) # no unescaped colon at end
+                            %(non_whitespace_escape_before)s
+                            [ ]?            # optional space
+                            :               # end of reference name
+                            ([ ]+|$)        # followed by whitespace
+                            """ % vars(Inliner), re.VERBOSE),
+          reference=re.compile(r"""
+                               (
+                                 (?P<simple>%(simplename)s)_
+                               |                  # *OR*
+                                 `                  # open backquote
+                                 (?![ ])            # not space
+                                 (?P<phrase>.+?)    # hyperlink phrase
+                                 %(non_whitespace_escape_before)s
+                                 `_                 # close backquote,
+                                                    # reference mark
+                               )
+                               $                  # end of string
+                               """ % vars(Inliner), re.VERBOSE | re.UNICODE),
+          substitution=re.compile(r"""
+                                  (
+                                    (?![ ])          # first char. not space
+                                    (?P<name>.+?)    # substitution text
+                                    %(non_whitespace_escape_before)s
+                                    \|               # close delimiter
+                                  )
+                                  ([ ]+|$)           # followed by whitespace
+                                  """ % vars(Inliner), re.VERBOSE),)
+
+    def footnote(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        footnote = nodes.footnote('\n'.join(indented))
+        footnote.line = lineno
+        if name[0] == '#':              # auto-numbered
+            name = name[1:]             # autonumber label
+            footnote['auto'] = 1
+            if name:
+                footnote['names'].append(name)
+            self.document.note_autofootnote(footnote)
+        elif name == '*':               # auto-symbol
+            name = ''
+            footnote['auto'] = '*'
+            self.document.note_symbol_footnote(footnote)
+        else:                           # manually numbered
+            footnote += nodes.label('', label)
+            footnote['names'].append(name)
+            self.document.note_footnote(footnote)
+        if name:
+            self.document.note_explicit_target(footnote, footnote)
+        else:
+            self.document.set_id(footnote, footnote)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=footnote)
+        return [footnote], blank_finish
+
+    def citation(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        citation = nodes.citation('\n'.join(indented))
+        citation.line = lineno
+        citation += nodes.label('', label)
+        citation['names'].append(name)
+        self.document.note_citation(citation)
+        self.document.note_explicit_target(citation, citation)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=citation)
+        return [citation], blank_finish
+
+    def hyperlink_target(self, match):
+        pattern = self.explicit.patterns.target
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(
+              match.end(), until_blank=1, strip_indent=0)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        escaped = block[0]
+        blockindex = 0
+        while 1:
+            targetmatch = pattern.match(escaped)
+            if targetmatch:
+                break
+            blockindex += 1
+            try:
+                escaped += block[blockindex]
+            except IndexError:
+                raise MarkupError('malformed hyperlink target.', lineno)
+        del block[:blockindex]
+        block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
+        target = self.make_target(block, blocktext, lineno,
+                                  targetmatch.group('name'))
+        return [target], blank_finish
+
+    def make_target(self, block, block_text, lineno, target_name):
+        target_type, data = self.parse_target(block, block_text, lineno)
+        if target_type == 'refname':
+            target = nodes.target(block_text, '', refname=normalize_name(data))
+            target.indirect_reference_name = data
+            self.add_target(target_name, '', target, lineno)
+            self.document.note_indirect_target(target)
+            return target
+        elif target_type == 'refuri':
+            target = nodes.target(block_text, '')
+            self.add_target(target_name, data, target, lineno)
+            return target
+        else:
+            return data
+
+    def parse_target(self, block, block_text, lineno):
+        """
+        Determine the type of reference of a target.
+
+        :Return: A 2-tuple, one of:
+
+            - 'refname' and the indirect reference name
+            - 'refuri' and the URI
+            - 'malformed' and a system_message node
+        """
+        if block and block[-1].strip()[-1:] == '_': # possible indirect target
+            reference = ' '.join([line.strip() for line in block])
+            refname = self.is_reference(reference)
+            if refname:
+                return 'refname', refname
+        reference = ''.join([''.join(line.split()) for line in block])
+        return 'refuri', unescape(reference)
+
+    def is_reference(self, reference):
+        match = self.explicit.patterns.reference.match(
+            whitespace_normalize_name(reference))
+        if not match:
+            return None
+        return unescape(match.group('simple') or match.group('phrase'))
+
+    def add_target(self, targetname, refuri, target, lineno):
+        target.line = lineno
+        if targetname:
+            name = normalize_name(unescape(targetname))
+            target['names'].append(name)
+            if refuri:
+                uri = self.inliner.adjust_uri(refuri)
+                if uri:
+                    target['refuri'] = uri
+                else:
+                    raise ApplicationError('problem with URI: %r' % refuri)
+            self.document.note_explicit_target(target, self.parent)
+        else:                       # anonymous target
+            if refuri:
+                target['refuri'] = refuri
+            target['anonymous'] = 1
+            self.document.note_anonymous_target(target)
+
+    def substitution_def(self, match):
+        pattern = self.explicit.patterns.substitution
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          strip_indent=0)
+        blocktext = (match.string[:match.end()] + '\n'.join(block))
+        block.disconnect()
+        escaped = escape2null(block[0].rstrip())
+        blockindex = 0
+        while 1:
+            subdefmatch = pattern.match(escaped)
+            if subdefmatch:
+                break
+            blockindex += 1
+            try:
+                escaped = escaped + ' ' + escape2null(block[blockindex].strip())
+            except IndexError:
+                raise MarkupError('malformed substitution definition.',
+                                  lineno)
+        del block[:blockindex]          # strip out the substitution marker
+        block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
+        if not block[0]:
+            del block[0]
+            offset += 1
+        while block and not block[-1].strip():
+            block.pop()
+        subname = subdefmatch.group('name')
+        substitution_node = nodes.substitution_definition(blocktext)
+        substitution_node.line = lineno
+        if not block:
+            msg = self.reporter.warning(
+                'Substitution definition "%s" missing contents.' % subname,
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        block[0] = block[0].strip()
+        substitution_node['names'].append(
+            nodes.whitespace_normalize_name(subname))
+        new_abs_offset, blank_finish = self.nested_list_parse(
+              block, input_offset=offset, node=substitution_node,
+              initial_state='SubstitutionDef', blank_finish=blank_finish)
+        i = 0
+        for node in substitution_node[:]:
+            if not (isinstance(node, nodes.Inline) or
+                    isinstance(node, nodes.Text)):
+                self.parent += substitution_node[i]
+                del substitution_node[i]
+            else:
+                i += 1
+        for node in substitution_node.traverse(nodes.Element):
+            if self.disallowed_inside_substitution_definitions(node):
+                pformat = nodes.literal_block('', node.pformat().rstrip())
+                msg = self.reporter.error(
+                    'Substitution definition contains illegal element:',
+                    pformat, nodes.literal_block(blocktext, blocktext),
+                    line=lineno)
+                return [msg], blank_finish
+        if len(substitution_node) == 0:
+            msg = self.reporter.warning(
+                  'Substitution definition "%s" empty or invalid.'
+                  % subname,
+                  nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        self.document.note_substitution_def(
+            substitution_node, subname, self.parent)
+        return [substitution_node], blank_finish
+
+    def disallowed_inside_substitution_definitions(self, node):
+        if (node['ids'] or
+            isinstance(node, nodes.reference) and node.get('anonymous') or
+            isinstance(node, nodes.footnote_reference) and node.get('auto')):
+            return 1
+        else:
+            return 0
+
+    def directive(self, match, **option_presets):
+        """Returns a 2-tuple: list of nodes, and a "blank finish" boolean."""
+        type_name = match.group(1)
+        directive_class, messages = directives.directive(
+            type_name, self.memo.language, self.document)
+        self.parent += messages
+        if directive_class:
+            return self.run_directive(
+                directive_class, match, type_name, option_presets)
+        else:
+            return self.unknown_directive(type_name)
+
+    def run_directive(self, directive, match, type_name, option_presets):
+        """
+        Parse a directive then run its directive function.
+
+        Parameters:
+
+        - `directive`: The class implementing the directive.  Must be
+          a subclass of `rst.Directive`.
+
+        - `match`: A regular expression match object which matched the first
+          line of the directive.
+
+        - `type_name`: The directive name, as used in the source text.
+
+        - `option_presets`: A dictionary of preset options, defaults for the
+          directive options.  Currently, only an "alt" option is passed by
+          substitution definitions (value: the substitution name), which may
+          be used by an embedded image directive.
+
+        Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
+        """
+        if isinstance(directive, (FunctionType, MethodType)):
+            from docutils.parsers.rst import convert_directive_function
+            directive = convert_directive_function(directive)
+        lineno = self.state_machine.abs_line_number()
+        initial_line_offset = self.state_machine.line_offset
+        indented, indent, line_offset, blank_finish \
+                  = self.state_machine.get_first_known_indented(match.end(),
+                                                                strip_top=0)
+        block_text = '\n'.join(self.state_machine.input_lines[
+            initial_line_offset : self.state_machine.line_offset + 1])
+        try:
+            arguments, options, content, content_offset = (
+                self.parse_directive_block(indented, line_offset,
+                                           directive, option_presets))
+        except MarkupError, detail:
+            error = self.reporter.error(
+                'Error in "%s" directive:\n%s.' % (type_name,
+                                                   ' '.join(detail.args)),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error], blank_finish
+        directive_instance = directive(
+            type_name, arguments, options, content, lineno,
+            content_offset, block_text, self, self.state_machine)
+        try:
+            result = directive_instance.run()
+        except docutils.parsers.rst.DirectiveError, directive_error:
+            msg_node = self.reporter.system_message(directive_error.level,
+                                                    directive_error.message)
+            msg_node += nodes.literal_block(block_text, block_text)
+            msg_node['line'] = lineno
+            result = [msg_node]
+        assert isinstance(result, list), \
+               'Directive "%s" must return a list of nodes.' % type_name
+        for i in range(len(result)):
+            assert isinstance(result[i], nodes.Node), \
+                   ('Directive "%s" returned non-Node object (index %s): %r'
+                    % (type_name, i, result[i]))
+        return (result,
+                blank_finish or self.state_machine.is_next_line_blank())
+
+    def parse_directive_block(self, indented, line_offset, directive,
+                              option_presets):
+        option_spec = directive.option_spec
+        has_content = directive.has_content
+        if indented and not indented[0].strip():
+            indented.trim_start()
+            line_offset += 1
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if indented and (directive.required_arguments
+                         or directive.optional_arguments
+                         or option_spec):
+            for i in range(len(indented)):
+                if not indented[i].strip():
+                    break
+            else:
+                i += 1
+            arg_block = indented[:i]
+            content = indented[i+1:]
+            content_offset = line_offset + i + 1
+        else:
+            content = indented
+            content_offset = line_offset
+            arg_block = []
+        while content and not content[0].strip():
+            content.trim_start()
+            content_offset += 1
+        if option_spec:
+            options, arg_block = self.parse_directive_options(
+                option_presets, option_spec, arg_block)
+            if arg_block and not (directive.required_arguments
+                                  or directive.optional_arguments):
+                raise MarkupError('no arguments permitted; blank line '
+                                  'required before content block')
+        else:
+            options = {}
+        if directive.required_arguments or directive.optional_arguments:
+            arguments = self.parse_directive_arguments(
+                directive, arg_block)
+        else:
+            arguments = []
+        if content and not has_content:
+            raise MarkupError('no content permitted')
+        return (arguments, options, content, content_offset)
+
+    def parse_directive_options(self, option_presets, option_spec, arg_block):
+        options = option_presets.copy()
+        for i in range(len(arg_block)):
+            if arg_block[i][:1] == ':':
+                opt_block = arg_block[i:]
+                arg_block = arg_block[:i]
+                break
+        else:
+            opt_block = []
+        if opt_block:
+            success, data = self.parse_extension_options(option_spec,
+                                                         opt_block)
+            if success:                 # data is a dict of options
+                options.update(data)
+            else:                       # data is an error string
+                raise MarkupError(data)
+        return options, arg_block
+
+    def parse_directive_arguments(self, directive, arg_block):
+        required = directive.required_arguments
+        optional = directive.optional_arguments
+        arg_text = '\n'.join(arg_block)
+        arguments = arg_text.split()
+        if len(arguments) < required:
+            raise MarkupError('%s argument(s) required, %s supplied'
+                              % (required, len(arguments)))
+        elif len(arguments) > required + optional:
+            if directive.final_argument_whitespace:
+                arguments = arg_text.split(None, required + optional - 1)
+            else:
+                raise MarkupError(
+                    'maximum %s argument(s) allowed, %s supplied'
+                    % (required + optional, len(arguments)))
+        return arguments
+
+    def parse_extension_options(self, option_spec, datalines):
+        """
+        Parse `datalines` for a field list containing extension options
+        matching `option_spec`.
+
+        :Parameters:
+            - `option_spec`: a mapping of option name to conversion
+              function, which should raise an exception on bad input.
+            - `datalines`: a list of input strings.
+
+        :Return:
+            - Success value, 1 or 0.
+            - An option dictionary on success, an error string on failure.
+        """
+        node = nodes.field_list()
+        newline_offset, blank_finish = self.nested_list_parse(
+              datalines, 0, node, initial_state='ExtensionOptions',
+              blank_finish=1)
+        if newline_offset != len(datalines): # incomplete parse of block
+            return 0, 'invalid option block'
+        try:
+            options = utils.extract_extension_options(node, option_spec)
+        except KeyError, detail:
+            return 0, ('unknown option: "%s"' % detail.args[0])
+        except (ValueError, TypeError), detail:
+            return 0, ('invalid option value: %s' % ' '.join(detail.args))
+        except utils.ExtensionOptionError, detail:
+            return 0, ('invalid option data: %s' % ' '.join(detail.args))
+        if blank_finish:
+            return 1, options
+        else:
+            return 0, 'option data incompletely parsed'
+
+    def unknown_directive(self, type_name):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(0, strip_indent=0)
+        text = '\n'.join(indented)
+        error = self.reporter.error(
+              'Unknown directive type "%s".' % type_name,
+              nodes.literal_block(text, text), line=lineno)
+        return [error], blank_finish
+
+    def comment(self, match):
+        if not match.string[match.end():].strip() \
+              and self.state_machine.is_next_line_blank(): # an empty comment?
+            return [nodes.comment()], 1 # "A tiny but practical wart."
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        text = '\n'.join(indented)
+        return [nodes.comment(text, text)], blank_finish
+
+    explicit.constructs = [
+          (footnote,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[
+                      (                 # footnote label:
+                          [0-9]+          # manually numbered footnote
+                        |               # *OR*
+                          \#              # anonymous auto-numbered footnote
+                        |               # *OR*
+                          \#%s            # auto-number ed?) footnote label
+                        |               # *OR*
+                          \*              # auto-symbol footnote
+                      )
+                      \]
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (citation,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[(%s)\]          # citation label
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (hyperlink_target,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      _                 # target indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (substitution_def,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \|                # substitution indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (directive,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      (%s)              # directive name
+                      [ ]?              # optional space
+                      ::                # directive delimiter
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def explicit_construct(self, match):
+        """Determine which explicit construct this is, parse & return it."""
+        errors = []
+        for method, pattern in self.explicit.constructs:
+            expmatch = pattern.match(match.string)
+            if expmatch:
+                try:
+                    return method(self, expmatch)
+                except MarkupError, (message, lineno): # never reached?
+                    errors.append(self.reporter.warning(message, line=lineno))
+                    break
+        nodelist, blank_finish = self.comment(match)
+        return nodelist + errors, blank_finish
+
+    def explicit_list(self, blank_finish):
+        """
+        Create a nested state machine for a series of explicit markup
+        constructs (including anonymous hyperlink targets).
+        """
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=self.parent, initial_state='Explicit',
+              blank_finish=blank_finish,
+              match_titles=self.state_machine.match_titles)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Explicit markup')
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def anonymous_target(self, match):
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish \
+              = self.state_machine.get_first_known_indented(match.end(),
+                                                            until_blank=1)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        target = self.make_target(block, blocktext, lineno, '')
+        return [target], blank_finish
+
+    def line(self, match, context, next_state):
+        """Section title overline or transition marker."""
+        if self.state_machine.match_titles:
+            return [match.string], 'Line', []
+        elif match.string.strip() == '::':
+            raise statemachine.TransitionCorrection('text')
+        elif len(match.string.strip()) < 4:
+            msg = self.reporter.info(
+                'Unexpected possible title overline or transition.\n'
+                "Treating it as ordinary text because it's so short.",
+                line=self.state_machine.abs_line_number())
+            self.parent += msg
+            raise statemachine.TransitionCorrection('text')
+        else:
+            blocktext = self.state_machine.line
+            msg = self.reporter.severe(
+                  'Unexpected section title or transition.',
+                  nodes.literal_block(blocktext, blocktext),
+                  line=self.state_machine.abs_line_number())
+            self.parent += msg
+            return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Titles, definition lists, paragraphs."""
+        return [match.string], 'Text', []
+
+
+class RFC2822Body(Body):
+
+    """
+    RFC2822 headers are only valid as the first constructs in documents.  As
+    soon as anything else appears, the `Body` state should take over.
+    """
+
+    patterns = Body.patterns.copy()     # can't modify the original
+    patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
+    initial_transitions = [(name, 'Body')
+                           for name in Body.initial_transitions]
+    initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        fieldlist = nodes.field_list(classes=['rfc2822'])
+        self.parent += fieldlist
+        field, blank_finish = self.rfc2822_field(match)
+        fieldlist += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=fieldlist, initial_state='RFC2822List',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning(
+                  'RFC2822-style field list')
+        return [], next_state, []
+
+    def rfc2822_field(self, match):
+        name = match.string[:match.string.find(':')]
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        fieldnode = nodes.field()
+        fieldnode += nodes.field_name(name, name)
+        fieldbody = nodes.field_body('\n'.join(indented))
+        fieldnode += fieldbody
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=fieldbody)
+        return fieldnode, blank_finish
+
+
+class SpecializedBody(Body):
+
+    """
+    Superclass for second and subsequent compound element members.  Compound
+    elements are lists and list-like constructs.
+
+    All transition methods are disabled (redefined as `invalid_input`).
+    Override individual methods in subclasses to re-enable.
+
+    For example, once an initial bullet list item, say, is recognized, the
+    `BulletList` subclass takes over, with a "bullet_list" node as its
+    container.  Upon encountering the initial bullet list item, `Body.bullet`
+    calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
+    starts up a nested parsing session with `BulletList` as the initial state.
+    Only the ``bullet`` transition method is enabled in `BulletList`; as long
+    as only bullet list items are encountered, they are parsed and inserted
+    into the container.  The first construct which is *not* a bullet list item
+    triggers the `invalid_input` method, which ends the nested parse and
+    closes the container.  `BulletList` needs to recognize input that is
+    invalid in the context of a bullet list, which means everything *other
+    than* bullet list items, so it inherits the transition list created in
+    `Body`.
+    """
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        self.state_machine.previous_line() # back up so parent SM can reassess
+        raise EOFError
+
+    indent = invalid_input
+    bullet = invalid_input
+    enumerator = invalid_input
+    field_marker = invalid_input
+    option_marker = invalid_input
+    doctest = invalid_input
+    line_block = invalid_input
+    grid_table_top = invalid_input
+    simple_table_top = invalid_input
+    explicit_markup = invalid_input
+    anonymous = invalid_input
+    line = invalid_input
+    text = invalid_input
+
+
+class BulletList(SpecializedBody):
+
+    """Second and subsequent bullet_list list_items."""
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        if match.string[0] != self.parent['bullet']:
+            # different bullet: new list
+            self.invalid_input()
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class DefinitionList(SpecializedBody):
+
+    """Second and subsequent definition_list_items."""
+
+    def text(self, match, context, next_state):
+        """Definition lists."""
+        return [match.string], 'Definition', []
+
+
+class EnumeratedList(SpecializedBody):
+
+    """Second and subsequent enumerated_list list_items."""
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated list item."""
+        format, sequence, text, ordinal = self.parse_enumerator(
+              match, self.parent['enumtype'])
+        if ( format != self.format
+             or (sequence != '#' and (sequence != self.parent['enumtype']
+                                      or self.auto
+                                      or ordinal != (self.lastordinal + 1)))
+             or not self.is_enumerated_list_item(ordinal, sequence, format)):
+            # different enumeration: new list
+            self.invalid_input()
+        if sequence == '#':
+            self.auto = 1
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        self.lastordinal = ordinal
+        return [], next_state, []
+
+
+class FieldList(SpecializedBody):
+
+    """Second and subsequent field_list fields."""
+
+    def field_marker(self, match, context, next_state):
+        """Field list field."""
+        field, blank_finish = self.field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class OptionList(SpecializedBody):
+
+    """Second and subsequent option_list option_list_items."""
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        try:
+            option_list_item, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            self.invalid_input()
+        self.parent += option_list_item
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class RFC2822List(SpecializedBody, RFC2822Body):
+
+    """Second and subsequent RFC2822-style field_list fields."""
+
+    patterns = RFC2822Body.patterns
+    initial_transitions = RFC2822Body.initial_transitions
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        field, blank_finish = self.rfc2822_field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], 'RFC2822List', []
+
+    blank = SpecializedBody.invalid_input
+
+
+class ExtensionOptions(FieldList):
+
+    """
+    Parse field_list fields for extension options.
+
+    No nested parsing is done (including inline markup parsing).
+    """
+
+    def parse_field_body(self, indented, offset, node):
+        """Override `Body.parse_field_body` for simpler parsing."""
+        lines = []
+        for line in list(indented) + ['']:
+            if line.strip():
+                lines.append(line)
+            elif lines:
+                text = '\n'.join(lines)
+                node += nodes.paragraph(text, text)
+                lines = []
+
+
+class LineBlock(SpecializedBody):
+
+    """Second and subsequent lines of a line_block."""
+
+    blank = SpecializedBody.invalid_input
+
+    def line_block(self, match, context, next_state):
+        """New line of line block."""
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        self.parent += line
+        self.parent.parent += messages
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class Explicit(SpecializedBody):
+
+    """Second and subsequent explicit markup construct."""
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    blank = SpecializedBody.invalid_input
+
+
+class SubstitutionDef(Body):
+
+    """
+    Parser for the contents of a substitution_definition element.
+    """
+
+    patterns = {
+          'embedded_directive': re.compile(r'(%s)::( +|$)'
+                                           % Inliner.simplename, re.UNICODE),
+          'text': r''}
+    initial_transitions = ['embedded_directive', 'text']
+
+    def embedded_directive(self, match, context, next_state):
+        nodelist, blank_finish = self.directive(match,
+                                                alt=self.parent['names'][0])
+        self.parent += nodelist
+        if not self.state_machine.at_eof():
+            self.blank_finish = blank_finish
+        raise EOFError
+
+    def text(self, match, context, next_state):
+        if not self.state_machine.at_eof():
+            self.blank_finish = self.state_machine.is_next_line_blank()
+        raise EOFError
+
+
+class Text(RSTState):
+
+    """
+    Classifier of second line of a text block.
+
+    Could be a paragraph, a definition list item, or a title.
+    """
+
+    patterns = {'underline': Body.patterns['line'],
+                'text': r''}
+    initial_transitions = [('underline', 'Body'), ('text', 'Body')]
+
+    def blank(self, match, context, next_state):
+        """End of paragraph."""
+        paragraph, literalnext = self.paragraph(
+              context, self.state_machine.abs_line_number() - 1)
+        self.parent += paragraph
+        if literalnext:
+            self.parent += self.literal_block()
+        return [], 'Body', []
+
+    def eof(self, context):
+        if context:
+            self.blank(None, context, None)
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlist = nodes.definition_list()
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        definitionlist += definitionlistitem
+        self.parent += definitionlist
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=definitionlist, initial_state='DefinitionList',
+              blank_finish=blank_finish, blank_finish_state='Definition')
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Definition list')
+        return [], 'Body', []
+
+    def underline(self, match, context, next_state):
+        """Section title."""
+        lineno = self.state_machine.abs_line_number()
+        title = context[0].rstrip()
+        underline = match.string.rstrip()
+        source = title + '\n' + underline
+        messages = []
+        if column_width(title) > len(underline):
+            if len(underline) < 4:
+                if self.state_machine.match_titles:
+                    msg = self.reporter.info(
+                        'Possible title underline, too short for the title.\n'
+                        "Treating it as ordinary text because it's so short.",
+                        line=lineno)
+                    self.parent += msg
+                raise statemachine.TransitionCorrection('text')
+            else:
+                blocktext = context[0] + '\n' + self.state_machine.line
+                msg = self.reporter.warning(
+                    'Title underline too short.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                messages.append(msg)
+        if not self.state_machine.match_titles:
+            blocktext = context[0] + '\n' + self.state_machine.line
+            msg = self.reporter.severe(
+                'Unexpected section title.',
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            self.parent += messages
+            self.parent += msg
+            return [], next_state, []
+        style = underline[0]
+        context[:] = []
+        self.section(title, source, style, lineno - 1, messages)
+        return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Paragraph."""
+        startline = self.state_machine.abs_line_number() - 1
+        msg = None
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            msg = self.reporter.error('Unexpected indentation.',
+                                      source=source, line=lineno)
+        lines = context + list(block)
+        paragraph, literalnext = self.paragraph(lines, startline)
+        self.parent += paragraph
+        self.parent += msg
+        if literalnext:
+            try:
+                self.state_machine.next_line()
+            except EOFError:
+                pass
+            self.parent += self.literal_block()
+        return [], next_state, []
+
+    def literal_block(self):
+        """Return a list of nodes."""
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_indented()
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if not indented:
+            return self.quoted_literal_block()
+        data = '\n'.join(indented)
+        literal_block = nodes.literal_block(data, data)
+        literal_block.line = offset + 1
+        nodelist = [literal_block]
+        if not blank_finish:
+            nodelist.append(self.unindent_warning('Literal block'))
+        return nodelist
+
+    def quoted_literal_block(self):
+        abs_line_offset = self.state_machine.abs_line_offset()
+        offset = self.state_machine.line_offset
+        parent_node = nodes.Element()
+        new_abs_offset = self.nested_parse(
+            self.state_machine.input_lines[offset:],
+            input_offset=abs_line_offset, node=parent_node, match_titles=0,
+            state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
+                                  'initial_state': 'QuotedLiteralBlock'})
+        self.goto_line(new_abs_offset)
+        return parent_node.children
+
+    def definition_list_item(self, termline):
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        definitionlistitem = nodes.definition_list_item(
+            '\n'.join(termline + list(indented)))
+        lineno = self.state_machine.abs_line_number() - 1
+        definitionlistitem.line = lineno
+        termlist, messages = self.term(termline, lineno)
+        definitionlistitem += termlist
+        definition = nodes.definition('', *messages)
+        definitionlistitem += definition
+        if termline[0][-2:] == '::':
+            definition += self.reporter.info(
+                  'Blank line missing before literal block (after the "::")? '
+                  'Interpreted as a definition list item.', line=line_offset+1)
+        self.nested_parse(indented, input_offset=line_offset, node=definition)
+        return definitionlistitem, blank_finish
+
+    classifier_delimiter = re.compile(' +: +')
+
+    def term(self, lines, lineno):
+        """Return a definition_list's term and optional classifiers."""
+        assert len(lines) == 1
+        text_nodes, messages = self.inline_text(lines[0], lineno)
+        term_node = nodes.term()
+        node_list = [term_node]
+        for i in range(len(text_nodes)):
+            node = text_nodes[i]
+            if isinstance(node, nodes.Text):
+                parts = self.classifier_delimiter.split(node.rawsource)
+                if len(parts) == 1:
+                    node_list[-1] += node
+                else:
+                    
+                    node_list[-1] += nodes.Text(parts[0].rstrip())
+                    for part in parts[1:]:
+                        classifier_node = nodes.classifier('', part)
+                        node_list.append(classifier_node)
+            else:
+                node_list[-1] += node
+        return node_list, messages
+
+
+class SpecializedText(Text):
+
+    """
+    Superclass for second and subsequent lines of Text-variants.
+
+    All transition methods are disabled. Override individual methods in
+    subclasses to re-enable.
+    """
+
+    def eof(self, context):
+        """Incomplete construct."""
+        return []
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        raise EOFError
+
+    blank = invalid_input
+    indent = invalid_input
+    underline = invalid_input
+    text = invalid_input
+
+
+class Definition(SpecializedText):
+
+    """Second line of potential definition_list_item."""
+
+    def eof(self, context):
+        """Not a definition."""
+        self.state_machine.previous_line(2) # so parent SM can reassess
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        self.parent += definitionlistitem
+        self.blank_finish = blank_finish
+        return [], 'DefinitionList', []
+
+
+class Line(SpecializedText):
+
+    """
+    Second line of over- & underlined section title or transition marker.
+    """
+
+    eofcheck = 1                        # @@@ ???
+    """Set to 0 while parsing sections, so that we don't catch the EOF."""
+
+    def eof(self, context):
+        """Transition marker at end of section or document."""
+        marker = context[0].strip()
+        if self.memo.section_bubble_up_kludge:
+            self.memo.section_bubble_up_kludge = 0
+        elif len(marker) < 4:
+            self.state_correction(context)
+        if self.eofcheck:               # ignore EOFError with sections
+            lineno = self.state_machine.abs_line_number() - 1
+            transition = nodes.transition(rawsource=context[0])
+            transition.line = lineno
+            self.parent += transition
+        self.eofcheck = 1
+        return []
+
+    def blank(self, match, context, next_state):
+        """Transition marker."""
+        lineno = self.state_machine.abs_line_number() - 1
+        marker = context[0].strip()
+        if len(marker) < 4:
+            self.state_correction(context)
+        transition = nodes.transition(rawsource=marker)
+        transition.line = lineno
+        self.parent += transition
+        return [], 'Body', []
+
+    def text(self, match, context, next_state):
+        """Potential over- & underlined title."""
+        lineno = self.state_machine.abs_line_number() - 1
+        overline = context[0]
+        title = match.string
+        underline = ''
+        try:
+            underline = self.state_machine.next_line()
+        except EOFError:
+            blocktext = overline + '\n' + title
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Incomplete section title.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        source = '%s\n%s\n%s' % (overline, title, underline)
+        overline = overline.rstrip()
+        underline = underline.rstrip()
+        if not self.transitions['underline'][0].match(underline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Missing matching underline for section title overline.',
+                    nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        elif overline != underline:
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                      'Title overline & underline mismatch.',
+                      nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        title = title.rstrip()
+        messages = []
+        if column_width(title) > len(overline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.warning(
+                      'Title overline too short.',
+                      nodes.literal_block(source, source), line=lineno)
+                messages.append(msg)
+        style = (overline[0], underline[0])
+        self.eofcheck = 0               # @@@ not sure this is correct
+        self.section(title.lstrip(), source, style, lineno + 1, messages)
+        self.eofcheck = 1
+        return [], 'Body', []
+
+    indent = text                       # indented title
+
+    def underline(self, match, context, next_state):
+        overline = context[0]
+        blocktext = overline + '\n' + self.state_machine.line
+        lineno = self.state_machine.abs_line_number() - 1
+        if len(overline.rstrip()) < 4:
+            self.short_overline(context, blocktext, lineno, 1)
+        msg = self.reporter.error(
+              'Invalid section title or transition marker.',
+              nodes.literal_block(blocktext, blocktext), line=lineno)
+        self.parent += msg
+        return [], 'Body', []
+
+    def short_overline(self, context, blocktext, lineno, lines=1):
+        msg = self.reporter.info(
+            'Possible incomplete section title.\nTreating the overline as '
+            "ordinary text because it's so short.", line=lineno)
+        self.parent += msg
+        self.state_correction(context, lines)
+
+    def state_correction(self, context, lines=1):
+        self.state_machine.previous_line(lines)
+        context[:] = []
+        raise statemachine.StateCorrection('Body', 'text')
+
+
+class QuotedLiteralBlock(RSTState):
+
+    """
+    Nested parse handler for quoted (unindented) literal blocks.
+
+    Special-purpose.  Not for inclusion in `state_classes`.
+    """
+
+    patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
+                'text': r''}
+    initial_transitions = ('initial_quoted', 'text')
+
+    def __init__(self, state_machine, debug=0):
+        RSTState.__init__(self, state_machine, debug)
+        self.messages = []
+        self.initial_lineno = None
+
+    def blank(self, match, context, next_state):
+        if context:
+            raise EOFError
+        else:
+            return context, next_state, []
+
+    def eof(self, context):
+        if context:
+            text = '\n'.join(context)
+            literal_block = nodes.literal_block(text, text)
+            literal_block.line = self.initial_lineno
+            self.parent += literal_block
+        else:
+            self.parent += self.reporter.warning(
+                'Literal block expected; none found.',
+                line=self.state_machine.abs_line_number())
+            self.state_machine.previous_line()
+        self.parent += self.messages
+        return []
+
+    def indent(self, match, context, next_state):
+        assert context, ('QuotedLiteralBlock.indent: context should not '
+                         'be empty!')
+        self.messages.append(
+            self.reporter.error('Unexpected indentation.',
+                                line=self.state_machine.abs_line_number()))
+        self.state_machine.previous_line()
+        raise EOFError
+
+    def initial_quoted(self, match, context, next_state):
+        """Match arbitrary quote character on the first line only."""
+        self.remove_transition('initial_quoted')
+        quote = match.string[0]
+        pattern = re.compile(re.escape(quote))
+        # New transition matches consistent quotes only:
+        self.add_transition('quoted',
+                            (pattern, self.quoted, self.__class__.__name__))
+        self.initial_lineno = self.state_machine.abs_line_number()
+        return [match.string], next_state, []
+
+    def quoted(self, match, context, next_state):
+        """Match consistent quotes on subsequent lines."""
+        context.append(match.string)
+        return context, next_state, []
+
+    def text(self, match, context, next_state):
+        if context:
+            self.messages.append(
+                self.reporter.error('Inconsistent literal block quoting.',
+                                    line=self.state_machine.abs_line_number()))
+            self.state_machine.previous_line()
+        raise EOFError
+
+
+state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
+                 OptionList, LineBlock, ExtensionOptions, Explicit, Text,
+                 Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List)
+"""Standard set of State classes used to start `RSTStateMachine`."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,525 @@
+# $Id: tableparser.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines table parser classes,which parse plaintext-graphic tables
+and produce a well-formed data structure suitable for building a CALS table.
+
+:Classes:
+    - `GridTableParser`: Parse fully-formed tables represented with a grid.
+    - `SimpleTableParser`: Parse simple tables, delimited by top & bottom
+      borders.
+
+:Exception class: `TableMarkupError`
+
+:Function:
+    `update_dict_of_lists()`: Merge two dictionaries containing list values.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import DataError
+
+
+class TableMarkupError(DataError): pass
+
+
+class TableParser:
+
+    """
+    Abstract superclass for the common parts of the syntax-specific parsers.
+    """
+
+    head_body_separator_pat = None
+    """Matches the row separator between head rows and body rows."""
+
+    double_width_pad_char = '\x00'
+    """Padding character for East Asian double-width text."""
+
+    def parse(self, block):
+        """
+        Analyze the text `block` and return a table data structure.
+
+        Given a plaintext-graphic table in `block` (list of lines of text; no
+        whitespace padding), parse the table, construct and return the data
+        necessary to construct a CALS table or equivalent.
+
+        Raise `TableMarkupError` if there is any problem with the markup.
+        """
+        self.setup(block)
+        self.find_head_body_sep()
+        self.parse_table()
+        structure = self.structure_from_cells()
+        return structure
+
+    def find_head_body_sep(self):
+        """Look for a head/body row separator line; store the line index."""
+        for i in range(len(self.block)):
+            line = self.block[i]
+            if self.head_body_separator_pat.match(line):
+                if self.head_body_sep:
+                    raise TableMarkupError(
+                        'Multiple head/body row separators in table (at line '
+                        'offset %s and %s); only one allowed.'
+                        % (self.head_body_sep, i))
+                else:
+                    self.head_body_sep = i
+                    self.block[i] = line.replace('=', '-')
+        if self.head_body_sep == 0 or self.head_body_sep == (len(self.block)
+                                                             - 1):
+            raise TableMarkupError('The head/body row separator may not be '
+                                   'the first or last line of the table.')
+
+
+class GridTableParser(TableParser):
+
+    """
+    Parse a grid table using `parse()`.
+
+    Here's an example of a grid table::
+
+        +------------------------+------------+----------+----------+
+        | Header row, column 1   | Header 2   | Header 3 | Header 4 |
+        +========================+============+==========+==========+
+        | body row 1, column 1   | column 2   | column 3 | column 4 |
+        +------------------------+------------+----------+----------+
+        | body row 2             | Cells may span columns.          |
+        +------------------------+------------+---------------------+
+        | body row 3             | Cells may  | - Table cells       |
+        +------------------------+ span rows. | - contain           |
+        | body row 4             |            | - body elements.    |
+        +------------------------+------------+---------------------+
+
+    Intersections use '+', row separators use '-' (except for one optional
+    head/body row separator, which uses '='), and column separators use '|'.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure::
+
+        ([24, 12, 10, 10],
+         [[(0, 0, 1, ['Header row, column 1']),
+           (0, 0, 1, ['Header 2']),
+           (0, 0, 1, ['Header 3']),
+           (0, 0, 1, ['Header 4'])]],
+         [[(0, 0, 3, ['body row 1, column 1']),
+           (0, 0, 3, ['column 2']),
+           (0, 0, 3, ['column 3']),
+           (0, 0, 3, ['column 4'])],
+          [(0, 0, 5, ['body row 2']),
+           (0, 2, 5, ['Cells may span columns.']),
+           None,
+           None],
+          [(0, 0, 7, ['body row 3']),
+           (1, 0, 7, ['Cells may', 'span rows.', '']),
+           (1, 1, 7, ['- Table cells', '- contain', '- body elements.']),
+           None],
+          [(0, 0, 9, ['body row 4']), None, None, None]])
+
+    The first item is a list containing column widths (colspecs). The second
+    item is a list of head rows, and the third is a list of body rows. Each
+    row contains a list of cells. Each cell is either None (for a cell unused
+    because of another cell's span), or a tuple. A cell tuple contains four
+    items: the number of extra rows used by the cell in a vertical span
+    (morerows); the number of extra columns used by the cell in a horizontal
+    span (morecols); the line offset of the first line of the cell contents;
+    and the cell contents, a list of lines of text.
+    """
+
+    head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it may be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        self.bottom = len(block) - 1
+        self.right = len(block[0]) - 1
+        self.head_body_sep = None
+        self.done = [-1] * len(block[0])
+        self.cells = []
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        Start with a queue of upper-left corners, containing the upper-left
+        corner of the table itself. Trace out one rectangular cell, remember
+        it, and add its upper-right and lower-left corners to the queue of
+        potential upper-left corners of further cells. Process the queue in
+        top-to-bottom order, keeping track of how much of each text column has
+        been seen.
+
+        We'll end up knowing all the row and column boundaries, cell positions
+        and their dimensions.
+        """
+        corners = [(0, 0)]
+        while corners:
+            top, left = corners.pop(0)
+            if top == self.bottom or left == self.right \
+                  or top <= self.done[left]:
+                continue
+            result = self.scan_cell(top, left)
+            if not result:
+                continue
+            bottom, right, rowseps, colseps = result
+            update_dict_of_lists(self.rowseps, rowseps)
+            update_dict_of_lists(self.colseps, colseps)
+            self.mark_done(top, left, bottom, right)
+            cellblock = self.block.get_2D_block(top + 1, left + 1,
+                                                bottom, right)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            self.cells.append((top, left, bottom, right, cellblock))
+            corners.extend([(top, right), (bottom, left)])
+            corners.sort()
+        if not self.check_parse_complete():
+            raise TableMarkupError('Malformed table; parse incomplete.')
+
+    def mark_done(self, top, left, bottom, right):
+        """For keeping track of how much of each text column has been seen."""
+        before = top - 1
+        after = bottom - 1
+        for col in range(left, right):
+            assert self.done[col] == before
+            self.done[col] = after
+
+    def check_parse_complete(self):
+        """Each text column should have been completely seen."""
+        last = self.bottom - 1
+        for col in range(self.right):
+            if self.done[col] != last:
+                return None
+        return 1
+
+    def scan_cell(self, top, left):
+        """Starting at the top-left corner, start tracing out a cell."""
+        assert self.block[top][left] == '+'
+        result = self.scan_right(top, left)
+        return result
+
+    def scan_right(self, top, left):
+        """
+        Look for the top-right corner of the cell, and make note of all column
+        boundaries ('+').
+        """
+        colseps = {}
+        line = self.block[top]
+        for i in range(left + 1, self.right + 1):
+            if line[i] == '+':
+                colseps[i] = [top]
+                result = self.scan_down(top, left, i)
+                if result:
+                    bottom, rowseps, newcolseps = result
+                    update_dict_of_lists(colseps, newcolseps)
+                    return bottom, i, rowseps, colseps
+            elif line[i] != '-':
+                return None
+        return None
+
+    def scan_down(self, top, left, right):
+        """
+        Look for the bottom-right corner of the cell, making note of all row
+        boundaries.
+        """
+        rowseps = {}
+        for i in range(top + 1, self.bottom + 1):
+            if self.block[i][right] == '+':
+                rowseps[i] = [right]
+                result = self.scan_left(top, left, i, right)
+                if result:
+                    newrowseps, colseps = result
+                    update_dict_of_lists(rowseps, newrowseps)
+                    return i, rowseps, colseps
+            elif self.block[i][right] != '|':
+                return None
+        return None
+
+    def scan_left(self, top, left, bottom, right):
+        """
+        Noting column boundaries, look for the bottom-left corner of the cell.
+        It must line up with the starting point.
+        """
+        colseps = {}
+        line = self.block[bottom]
+        for i in range(right - 1, left, -1):
+            if line[i] == '+':
+                colseps[i] = [bottom]
+            elif line[i] != '-':
+                return None
+        if line[left] != '+':
+            return None
+        result = self.scan_up(top, left, bottom, right)
+        if result is not None:
+            rowseps = result
+            return rowseps, colseps
+        return None
+
+    def scan_up(self, top, left, bottom, right):
+        """
+        Noting row boundaries, see if we can return to the starting point.
+        """
+        rowseps = {}
+        for i in range(bottom - 1, top, -1):
+            if self.block[i][left] == '+':
+                rowseps[i] = [left]
+            elif self.block[i][left] != '|':
+                return None
+        return rowseps
+
+    def structure_from_cells(self):
+        """
+        From the data collected by `scan_cell()`, convert to the final data
+        structure.
+        """
+        rowseps = self.rowseps.keys()   # list of row boundaries
+        rowseps.sort()
+        rowindex = {}
+        for i in range(len(rowseps)):
+            rowindex[rowseps[i]] = i    # row boundary -> row number mapping
+        colseps = self.colseps.keys()   # list of column boundaries
+        colseps.sort()
+        colindex = {}
+        for i in range(len(colseps)):
+            colindex[colseps[i]] = i    # column boundary -> col number map
+        colspecs = [(colseps[i] - colseps[i - 1] - 1)
+                    for i in range(1, len(colseps))] # list of column widths
+        # prepare an empty table with the correct number of rows & columns
+        onerow = [None for i in range(len(colseps) - 1)]
+        rows = [onerow[:] for i in range(len(rowseps) - 1)]
+        # keep track of # of cells remaining; should reduce to zero
+        remaining = (len(rowseps) - 1) * (len(colseps) - 1)
+        for top, left, bottom, right, block in self.cells:
+            rownum = rowindex[top]
+            colnum = colindex[left]
+            assert rows[rownum][colnum] is None, (
+                  'Cell (row %s, column %s) already used.'
+                  % (rownum + 1, colnum + 1))
+            morerows = rowindex[bottom] - rownum - 1
+            morecols = colindex[right] - colnum - 1
+            remaining -= (morerows + 1) * (morecols + 1)
+            # write the cell into the table
+            rows[rownum][colnum] = (morerows, morecols, top + 1, block)
+        assert remaining == 0, 'Unused cells remaining.'
+        if self.head_body_sep:          # separate head rows from body rows
+            numheadrows = rowindex[self.head_body_sep]
+            headrows = rows[:numheadrows]
+            bodyrows = rows[numheadrows:]
+        else:
+            headrows = []
+            bodyrows = rows
+        return (colspecs, headrows, bodyrows)
+
+
+class SimpleTableParser(TableParser):
+
+    """
+    Parse a simple table using `parse()`.
+
+    Here's an example of a simple table::
+
+        =====  =====
+        col 1  col 2
+        =====  =====
+        1      Second column of row 1.
+        2      Second column of row 2.
+               Second line of paragraph.
+        3      - Second column of row 3.
+
+               - Second item in bullet
+                 list (row 3, column 2).
+        4 is a span
+        ------------
+        5
+        =====  =====
+
+    Top and bottom borders use '=', column span underlines use '-', column
+    separation is indicated with spaces.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure, whose interpretation is the same as for
+    `GridTableParser`::
+
+        ([5, 25],
+         [[(0, 0, 1, ['col 1']),
+           (0, 0, 1, ['col 2'])]],
+         [[(0, 0, 3, ['1']),
+           (0, 0, 3, ['Second column of row 1.'])],
+          [(0, 0, 4, ['2']),
+           (0, 0, 4, ['Second column of row 2.',
+                      'Second line of paragraph.'])],
+          [(0, 0, 6, ['3']),
+           (0, 0, 6, ['- Second column of row 3.',
+                      '',
+                      '- Second item in bullet',
+                      '  list (row 3, column 2).'])],
+          [(0, 1, 10, ['4 is a span'])],
+          [(0, 0, 12, ['5']),
+           (0, 0, 12, [''])]])
+    """
+
+    head_body_separator_pat = re.compile('=[ =]*$')
+    span_pat = re.compile('-[ -]*$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it will be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        # Convert top & bottom borders to column span underlines:
+        self.block[0] = self.block[0].replace('=', '-')
+        self.block[-1] = self.block[-1].replace('=', '-')
+        self.head_body_sep = None
+        self.columns = []
+        self.border_end = None
+        self.table = []
+        self.done = [-1] * len(block[0])
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        First determine the column boundaries from the top border, then
+        process rows.  Each row may consist of multiple lines; accumulate
+        lines until a row is complete.  Call `self.parse_row` to finish the
+        job.
+        """
+        # Top border must fully describe all table columns.
+        self.columns = self.parse_columns(self.block[0], 0)
+        self.border_end = self.columns[-1][1]
+        firststart, firstend = self.columns[0]
+        offset = 1                      # skip top border
+        start = 1
+        text_found = None
+        while offset < len(self.block):
+            line = self.block[offset]
+            if self.span_pat.match(line):
+                # Column span underline or border; row is complete.
+                self.parse_row(self.block[start:offset], start,
+                               (line.rstrip(), offset))
+                start = offset + 1
+                text_found = None
+            elif line[firststart:firstend].strip():
+                # First column not blank, therefore it's a new row.
+                if text_found and offset != start:
+                    self.parse_row(self.block[start:offset], start)
+                start = offset
+                text_found = 1
+            elif not text_found:
+                start = offset + 1
+            offset += 1
+
+    def parse_columns(self, line, offset):
+        """
+        Given a column span underline, return a list of (begin, end) pairs.
+        """
+        cols = []
+        end = 0
+        while 1:
+            begin = line.find('-', end)
+            end = line.find(' ', begin)
+            if begin < 0:
+                break
+            if end < 0:
+                end = len(line)
+            cols.append((begin, end))
+        if self.columns:
+            if cols[-1][1] != self.border_end:
+                raise TableMarkupError('Column span incomplete at line '
+                                       'offset %s.' % offset)
+            # Allow for an unbounded rightmost column:
+            cols[-1] = (cols[-1][0], self.columns[-1][1])
+        return cols
+
+    def init_row(self, colspec, offset):
+        i = 0
+        cells = []
+        for start, end in colspec:
+            morecols = 0
+            try:
+                assert start == self.columns[i][0]
+                while end != self.columns[i][1]:
+                    i += 1
+                    morecols += 1
+            except (AssertionError, IndexError):
+                raise TableMarkupError('Column span alignment problem at '
+                                       'line offset %s.' % (offset + 1))
+            cells.append([0, morecols, offset, []])
+            i += 1
+        return cells
+
+    def parse_row(self, lines, start, spanline=None):
+        """
+        Given the text `lines` of a row, parse it and append to `self.table`.
+
+        The row is parsed according to the current column spec (either
+        `spanline` if provided or `self.columns`).  For each column, extract
+        text from each line, and check for text in column margins.  Finally,
+        adjust for insigificant whitespace.
+        """
+        if not (lines or spanline):
+            # No new row, just blank lines.
+            return
+        if spanline:
+            columns = self.parse_columns(*spanline)
+            span_offset = spanline[1]
+        else:
+            columns = self.columns[:]
+            span_offset = start
+        self.check_columns(lines, start, columns)
+        row = self.init_row(columns, start)
+        for i in range(len(columns)):
+            start, end = columns[i]
+            cellblock = lines.get_2D_block(0, start, len(lines), end)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            row[i][3] = cellblock
+        self.table.append(row)
+
+    def check_columns(self, lines, first_line, columns):
+        """
+        Check for text in column margins and text overflow in the last column.
+        Raise TableMarkupError if anything but whitespace is in column margins.
+        Adjust the end value for the last column if there is text overflow.
+        """
+        # "Infinite" value for a dummy last column's beginning, used to
+        # check for text overflow:
+        columns.append((sys.maxint, None))
+        lastcol = len(columns) - 2
+        for i in range(len(columns) - 1):
+            start, end = columns[i]
+            nextstart = columns[i+1][0]
+            offset = 0
+            for line in lines:
+                if i == lastcol and line[end:].strip():
+                    text = line[start:].rstrip()
+                    new_end = start + len(text)
+                    columns[i] = (start, new_end)
+                    main_start, main_end = self.columns[-1]
+                    if new_end > main_end:
+                        self.columns[-1] = (main_start, new_end)
+                elif line[end:nextstart].strip():
+                    raise TableMarkupError('Text in column margin at line '
+                                           'offset %s.' % (first_line + offset))
+                offset += 1
+        columns.pop()
+
+    def structure_from_cells(self):
+        colspecs = [end - start for start, end in self.columns]
+        first_body_row = 0
+        if self.head_body_sep:
+            for i in range(len(self.table)):
+                if self.table[i][0][2] > self.head_body_sep:
+                    first_body_row = i
+                    break
+        return (colspecs, self.table[:first_body_row],
+                self.table[first_body_row:])
+
+
+def update_dict_of_lists(master, newdata):
+    """
+    Extend the list values of `master` with those from `newdata`.
+
+    Both parameters must be dictionaries containing list values.
+    """
+    for key, values in newdata.items():
+        master.setdefault(key, []).extend(values)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+# $Id: __init__.py 4974 2007-03-01 18:06:52Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import utils, parsers, Component
+from docutils.transforms import universal
+
+
+class Reader(Component):
+
+    """
+    Abstract base class for docutils Readers.
+
+    Each reader module or package must export a subclass also called 'Reader'.
+
+    The two steps of a Reader's responsibility are `scan()` and
+    `parse()`.  Call `read()` to process a document.
+    """
+
+    component_type = 'reader'
+    config_section = 'readers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Decorations,
+            universal.ExposeInternals,
+            universal.StripComments,]
+
+    def __init__(self, parser=None, parser_name=None):
+        """
+        Initialize the Reader instance.
+
+        Several instance attributes are defined with dummy initial values.
+        Subclasses may use these attributes as they wish.
+        """
+
+        self.parser = parser
+        """A `parsers.Parser` instance shared by all doctrees.  May be left
+        unspecified if the document source determines the parser."""
+
+        if parser is None and parser_name:
+            self.set_parser(parser_name)
+
+        self.source = None
+        """`docutils.io` IO object, source of input data."""
+
+        self.input = None
+        """Raw text input; either a single string or, for more complex cases,
+        a collection of strings."""
+
+    def set_parser(self, parser_name):
+        """Set `self.parser` by name."""
+        parser_class = parsers.get_parser_class(parser_name)
+        self.parser = parser_class()
+
+    def read(self, source, parser, settings):
+        self.source = source
+        if not self.parser:
+            self.parser = parser
+        self.settings = settings
+        self.input = self.source.read()
+        self.parse()
+        return self.document
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        self.parser.parse(self.input, document)
+        document.current_source = document.current_line = None
+
+    def new_document(self):
+        """Create and return a new empty document tree (root node)."""
+        document = utils.new_document(self.source.source_path, self.settings)
+        return document
+
+
+class ReReader(Reader):
+
+    """
+    A reader which rereads an existing document tree (e.g. a
+    deserializer).
+
+    Often used in conjunction with `writers.UnfilteredWriter`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  They have already been applied
+        # by the reader which originally created the document.
+        return Component.get_transforms(self)
+
+
+_reader_aliases = {}
+
+def get_reader_class(reader_name):
+    """Return the Reader class from the `reader_name` module."""
+    reader_name = reader_name.lower()
+    if _reader_aliases.has_key(reader_name):
+        reader_name = _reader_aliases[reader_name]
+    module = __import__(reader_name, globals(), locals())
+    return module.Reader
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/doctree.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+# $Id: doctree.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""Reader for existing document trees."""
+
+from docutils import readers, utils, transforms
+
+
+class Reader(readers.ReReader):
+
+    """
+    Adapt the Reader API for an existing document tree.
+
+    The existing document tree must be passed as the ``source`` parameter to
+    the `docutils.core.Publisher` initializer, wrapped in a
+    `docutils.io.DocTreeInput` object::
+
+        pub = docutils.core.Publisher(
+            ..., source=docutils.io.DocTreeInput(document), ...)
+
+    The original document settings are overridden; if you want to use the
+    settings of the original document, pass ``settings=document.settings`` to
+    the Publisher call above.
+    """
+
+    supported = ('doctree',)
+
+    config_section = 'doctree reader'
+    config_section_dependencies = ('readers',)
+
+    def parse(self):
+        """
+        No parsing to do; refurbish the document tree instead.
+        Overrides the inherited method.
+        """
+        self.document = self.input
+        # Create fresh Transformer object, to be populated from Writer
+        # component.
+        self.document.transformer = transforms.Transformer(self.document)
+        # Replace existing settings object with new one.
+        self.document.settings = self.settings
+        # Create fresh Reporter object because it is dependent on
+        # (new) settings.
+        self.document.reporter = utils.new_reporter(
+            self.document.get('source', ''), self.document.settings)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/pep.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+# $Id: pep.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Python Enhancement Proposal (PEP) Reader.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.readers import standalone
+from docutils.transforms import peps, references, misc, frontmatter
+from docutils.parsers import rst
+
+
+class Reader(standalone.Reader):
+
+    supported = ('pep',)
+    """Contexts this reader supports."""
+
+    settings_spec = (
+        'PEP Reader Option Defaults',
+        'The --pep-references and --rfc-references options (for the '
+        'reStructuredText parser) are on by default.',
+        ())
+
+    config_section = 'pep reader'
+    config_section_dependencies = ('readers', 'standalone reader')
+
+    def get_transforms(self):
+        transforms = standalone.Reader.get_transforms(self)
+        # We have PEP-specific frontmatter handling.
+        transforms.remove(frontmatter.DocTitle)
+        transforms.remove(frontmatter.SectionSubTitle)
+        transforms.remove(frontmatter.DocInfo)
+        transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes])
+        return transforms
+
+    settings_default_overrides = {'pep_references': 1, 'rfc_references': 1}
+
+    inliner_class = rst.states.Inliner
+
+    def __init__(self, parser=None, parser_name=None):
+        """`parser` should be ``None``."""
+        if parser is None:
+            parser = rst.Parser(rfc2822=1, inliner=self.inliner_class())
+        standalone.Reader.__init__(self, parser, '')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,127 @@
+# $Id: __init__.py 4813 2006-11-13 03:41:08Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains the Python Source Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import docutils.readers
+from docutils.readers.python import moduleparser
+from docutils import parsers
+from docutils import nodes
+from docutils.readers.python import pynodes
+from docutils import readers
+
+class Reader(docutils.readers.Reader):
+
+    config_section = 'python reader'
+    config_section_dependencies = ('readers',)
+
+    default_parser = 'restructuredtext'
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        module_section = moduleparser.parse_module(self.input,
+                                                   self.source.source_path)
+        module_section.walk(DocformatVisitor(self.document))
+        visitor = DocstringFormattingVisitor(
+            document=document,
+            default_parser=self.default_parser)
+        module_section.walk(visitor)
+        self.document.append(module_section)
+
+
+class DocformatVisitor(nodes.SparseNodeVisitor):
+
+    """
+    This sets docformat attributes in a module.  Wherever an assignment
+    to __docformat__ is found, we look for the enclosing scope -- a class,
+    a module, or a function -- and set the docformat attribute there.
+
+    We can't do this during the DocstringFormattingVisitor walking,
+    because __docformat__ may appear below a docstring in that format
+    (typically below the module docstring).
+    """
+
+    def visit_attribute(self, node):
+        assert isinstance(node[0], pynodes.object_name)
+        name = node[0][0].data
+        if name != '__docformat__':
+            return
+        value = None
+        for child in children:
+            if isinstance(child, pynodes.expression_value):
+                value = child[0].data
+                break
+        assert value.startswith("'") or value.startswith('"'), "__docformat__ must be assigned a string literal (not %s); line: %s" % (value, node['lineno'])
+        name = name[1:-1]
+        looking_in = node.parent
+        while not isinstance(looking_in, (pynodes.module_section,
+                                          pynodes.function_section,
+                                          pynodes.class_section)):
+            looking_in = looking_in.parent
+        looking_in['docformat'] = name
+
+
+class DocstringFormattingVisitor(nodes.SparseNodeVisitor):
+
+    def __init__(self, document, default_parser):
+        self.document = document
+        self.default_parser = default_parser
+        self.parsers = {}
+
+    def visit_docstring(self, node):
+        text = node[0].data
+        docformat = self.find_docformat(node)
+        del node[0]
+        node['docformat'] = docformat
+        parser = self.get_parser(docformat)
+        parser.parse(text, self.document)
+        for child in self.document.children:
+            node.append(child)
+        self.document.current_source = self.document.current_line = None
+        del self.document[:]
+
+    def get_parser(self, parser_name):
+        """
+        Get a parser based on its name.  We reuse parsers during this
+        visitation, so parser instances are cached.
+        """
+        parser_name = parsers._parser_aliases.get(parser_name, parser_name)
+        if not self.parsers.has_key(parser_name):
+            cls = parsers.get_parser_class(parser_name)
+            self.parsers[parser_name] = cls()
+        return self.parsers[parser_name]
+
+    def find_docformat(self, node):
+        """
+        Find the __docformat__ closest to this node (i.e., look in the
+        class or module)
+        """
+        while node:
+            if node.get('docformat'):
+                return node['docformat']
+            node = node.parent
+        return self.default_parser
+
+
+if __name__ == '__main__':
+    try:
+        import locale
+        locale.setlocale(locale.LC_ALL, '')
+    except:
+        pass
+
+    from docutils.core import publish_cmdline, default_description
+
+    description = ('Generates pseudo-XML from Python modules '
+                   '(for testing purposes).  ' + default_description)
+
+    publish_cmdline(description=description,
+                    reader=Reader())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,758 @@
+# $Id: moduleparser.py 4813 2006-11-13 03:41:08Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Parser for Python modules.
+
+The `parse_module()` function takes a module's text and file name,
+runs it through the module parser (using compiler.py and tokenize.py)
+and produces a parse tree of the source code, using the nodes as found
+in pynodes.py.  For example, given this module (x.py)::
+
+    # comment
+
+    '''Docstring'''
+
+    '''Additional docstring'''
+
+    __docformat__ = 'reStructuredText'
+
+    a = 1
+    '''Attribute docstring'''
+
+    class C(Super):
+
+        '''C's docstring'''
+
+        class_attribute = 1
+        '''class_attribute's docstring'''
+
+        def __init__(self, text=None):
+            '''__init__'s docstring'''
+
+            self.instance_attribute = (text * 7
+                                       + ' whaddyaknow')
+            '''instance_attribute's docstring'''
+
+
+    def f(x,                            # parameter x
+          y=a*5,                        # parameter y
+          *args):                       # parameter args
+        '''f's docstring'''
+        return [x + item for item in args]
+
+    f.function_attribute = 1
+    '''f.function_attribute's docstring'''
+
+The module parser will produce this module documentation tree::
+
+    <module_section filename="test data">
+        <docstring>
+            Docstring
+        <docstring lineno="5">
+            Additional docstring
+        <attribute lineno="7">
+	    <object_name>
+	        __docformat__
+            <expression_value lineno="7">
+                'reStructuredText'
+        <attribute lineno="9">
+	    <object_name>
+	        a
+            <expression_value lineno="9">
+                1
+            <docstring lineno="10">
+                Attribute docstring
+        <class_section lineno="12">
+	    <object_name>
+	        C
+            <class_base>
+	        Super
+            <docstring lineno="12">
+                C's docstring
+            <attribute lineno="16">
+	        <object_name>
+		    class_attribute
+                <expression_value lineno="16">
+                    1
+                <docstring lineno="17">
+                    class_attribute's docstring
+            <method_section lineno="19">
+	        <object_name>
+		    __init__
+                <docstring lineno="19">
+                    __init__'s docstring
+                <parameter_list lineno="19">
+                    <parameter lineno="19">
+		        <object_name>
+			    self
+                    <parameter lineno="19">
+		        <object_name>
+			    text
+                        <parameter_default lineno="19">
+                            None
+                <attribute lineno="22">
+		    <object_name>
+		        self.instance_attribute
+                    <expression_value lineno="22">
+                        (text * 7 + ' whaddyaknow')
+                    <docstring lineno="24">
+                        instance_attribute's docstring
+        <function_section lineno="27">
+	    <object_name>
+	        f
+            <docstring lineno="27">
+                f's docstring
+            <parameter_list lineno="27">
+                <parameter lineno="27">
+		    <object_name>
+		        x
+                    <comment>
+                        # parameter x
+                <parameter lineno="27">
+		    <object_name>
+		        y
+                    <parameter_default lineno="27">
+                        a * 5
+                    <comment>
+                        # parameter y
+                <parameter excess_positional="1" lineno="27">
+		    <object_name>
+		        args
+                    <comment>
+                        # parameter args
+        <attribute lineno="33">
+	    <object_name>
+	        f.function_attribute
+            <expression_value lineno="33">
+                1
+            <docstring lineno="34">
+                f.function_attribute's docstring
+
+(Comments are not implemented yet.)
+
+compiler.parse() provides most of what's needed for this doctree, and
+"tokenize" can be used to get the rest.  We can determine the line
+number from the compiler.parse() AST, and the TokenParser.rhs(lineno)
+method provides the rest.
+
+The Docutils Python reader component will transform this module doctree into a
+Python-specific Docutils doctree, and then a "stylist transform" will
+further transform it into a generic doctree.  Namespaces will have to be
+compiled for each of the scopes, but I'm not certain at what stage of
+processing.
+
+It's very important to keep all docstring processing out of this, so that it's
+a completely generic and not tool-specific.
+
+::
+
+> Why perform all of those transformations?  Why not go from the AST to a
+> generic doctree?  Or, even from the AST to the final output?
+
+I want the docutils.readers.python.moduleparser.parse_module() function to
+produce a standard documentation-oriented tree that can be used by any tool.
+We can develop it together without having to compromise on the rest of our
+design (i.e., HappyDoc doesn't have to be made to work like Docutils, and
+vice-versa).  It would be a higher-level version of what compiler.py provides.
+
+The Python reader component transforms this generic AST into a Python-specific
+doctree (it knows about modules, classes, functions, etc.), but this is
+specific to Docutils and cannot be used by HappyDoc or others.  The stylist
+transform does the final layout, converting Python-specific structures
+("class" sections, etc.) into a generic doctree using primitives (tables,
+sections, lists, etc.).  This generic doctree does *not* know about Python
+structures any more.  The advantage is that this doctree can be handed off to
+any of the output writers to create any output format we like.
+
+The latter two transforms are separate because I want to be able to have
+multiple independent layout styles (multiple runtime-selectable "stylist
+transforms").  Each of the existing tools (HappyDoc, pydoc, epydoc, Crystal,
+etc.) has its own fixed format.  I personally don't like the tables-based
+format produced by these tools, and I'd like to be able to customize the
+format easily.  That's the goal of stylist transforms, which are independent
+from the Reader component itself.  One stylist transform could produce
+HappyDoc-like output, another could produce output similar to module docs in
+the Python library reference manual, and so on.
+
+It's for exactly this reason::
+
+>> It's very important to keep all docstring processing out of this, so that
+>> it's a completely generic and not tool-specific.
+
+... but it goes past docstring processing.  It's also important to keep style
+decisions and tool-specific data transforms out of this module parser.
+
+
+Issues
+======
+
+* At what point should namespaces be computed?  Should they be part of the
+  basic AST produced by the ASTVisitor walk, or generated by another tree
+  traversal?
+
+* At what point should a distinction be made between local variables &
+  instance attributes in __init__ methods?
+
+* Docstrings are getting their lineno from their parents.  Should the
+  TokenParser find the real line no's?
+
+* Comments: include them?  How and when?  Only full-line comments, or
+  parameter comments too?  (See function "f" above for an example.)
+
+* Module could use more docstrings & refactoring in places.
+
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import compiler
+import compiler.ast
+import tokenize
+import token
+from compiler.consts import OP_ASSIGN
+from compiler.visitor import ASTVisitor
+from types import StringType, UnicodeType, TupleType
+from docutils.readers.python import pynodes
+from docutils.nodes import Text
+
+
+def parse_module(module_text, filename):
+    """Return a module documentation tree from `module_text`."""
+    ast = compiler.parse(module_text)
+    token_parser = TokenParser(module_text)
+    visitor = ModuleVisitor(filename, token_parser)
+    compiler.walk(ast, visitor, walker=visitor)
+    return visitor.module
+
+class BaseVisitor(ASTVisitor):
+
+    def __init__(self, token_parser):
+        ASTVisitor.__init__(self)
+        self.token_parser = token_parser
+        self.context = []
+        self.documentable = None
+
+    def default(self, node, *args):
+        self.documentable = None
+        #print 'in default (%s)' % node.__class__.__name__
+        #ASTVisitor.default(self, node, *args)
+
+    def default_visit(self, node, *args):
+        #print 'in default_visit (%s)' % node.__class__.__name__
+        ASTVisitor.default(self, node, *args)
+
+
+class DocstringVisitor(BaseVisitor):
+
+    def visitDiscard(self, node):
+        if self.documentable:
+            self.visit(node.expr)
+
+    def visitConst(self, node):
+        if self.documentable:
+            if type(node.value) in (StringType, UnicodeType):
+                self.documentable.append(make_docstring(node.value, node.lineno))
+            else:
+                self.documentable = None
+
+    def visitStmt(self, node):
+        self.default_visit(node)
+
+
+class AssignmentVisitor(DocstringVisitor):
+
+    def visitAssign(self, node):
+        visitor = AttributeVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        if visitor.attributes:
+            self.context[-1].extend(visitor.attributes)
+        if len(visitor.attributes) == 1:
+            self.documentable = visitor.attributes[0]
+        else:
+            self.documentable = None
+
+
+class ModuleVisitor(AssignmentVisitor):
+
+    def __init__(self, filename, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.filename = filename
+        self.module = None
+
+    def visitModule(self, node):
+        self.module = module = pynodes.module_section()
+        module['filename'] = self.filename
+        append_docstring(module, node.doc, node.lineno)
+        self.context.append(module)
+        self.documentable = module
+        self.visit(node.node)
+        self.context.pop()
+
+    def visitImport(self, node):
+        self.context[-1] += make_import_group(names=node.names,
+                                              lineno=node.lineno)
+        self.documentable = None
+
+    def visitFrom(self, node):
+        self.context[-1].append(
+            make_import_group(names=node.names, from_name=node.modname,
+                              lineno=node.lineno))
+        self.documentable = None
+
+    def visitFunction(self, node):
+        visitor = FunctionVisitor(self.token_parser,
+                                  function_class=pynodes.function_section)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+    def visitClass(self, node):
+        visitor = ClassVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.klass)
+
+
+class AttributeVisitor(BaseVisitor):
+
+    def __init__(self, token_parser):
+        BaseVisitor.__init__(self, token_parser)
+        self.attributes = pynodes.class_attribute_section()
+
+    def visitAssign(self, node):
+        # Don't visit the expression itself, just the attribute nodes:
+        for child in node.nodes:
+            self.dispatch(child)
+        expression_text = self.token_parser.rhs(node.lineno)
+        expression = pynodes.expression_value()
+        expression.append(Text(expression_text))
+        for attribute in self.attributes:
+            attribute.append(expression)
+
+    def visitAssName(self, node):
+        self.attributes.append(make_attribute(node.name,
+                                              lineno=node.lineno))
+
+    def visitAssTuple(self, node):
+        attributes = self.attributes
+        self.attributes = []
+        self.default_visit(node)
+        n = pynodes.attribute_tuple()
+        n.extend(self.attributes)
+        n['lineno'] = self.attributes[0]['lineno']
+        attributes.append(n)
+        self.attributes = attributes
+        #self.attributes.append(att_tuple)
+
+    def visitAssAttr(self, node):
+        self.default_visit(node, node.attrname)
+
+    def visitGetattr(self, node, suffix):
+        self.default_visit(node, node.attrname + '.' + suffix)
+
+    def visitName(self, node, suffix):
+        self.attributes.append(make_attribute(node.name + '.' + suffix,
+                                              lineno=node.lineno))
+
+
+class FunctionVisitor(DocstringVisitor):
+
+    in_function = 0
+
+    def __init__(self, token_parser, function_class):
+        DocstringVisitor.__init__(self, token_parser)
+        self.function_class = function_class
+
+    def visitFunction(self, node):
+        if self.in_function:
+            self.documentable = None
+            # Don't bother with nested function definitions.
+            return
+        self.in_function = 1
+        self.function = function = make_function_like_section(
+            name=node.name,
+            lineno=node.lineno,
+            doc=node.doc,
+            function_class=self.function_class)
+        self.context.append(function)
+        self.documentable = function
+        self.parse_parameter_list(node)
+        self.visit(node.code)
+        self.context.pop()
+
+    def parse_parameter_list(self, node):
+        parameters = []
+        special = []
+        argnames = list(node.argnames)
+        if node.kwargs:
+            special.append(make_parameter(argnames[-1], excess_keyword=1))
+            argnames.pop()
+        if node.varargs:
+            special.append(make_parameter(argnames[-1],
+                                          excess_positional=1))
+            argnames.pop()
+        defaults = list(node.defaults)
+        defaults = [None] * (len(argnames) - len(defaults)) + defaults
+        function_parameters = self.token_parser.function_parameters(
+            node.lineno)
+        #print >>sys.stderr, function_parameters
+        for argname, default in zip(argnames, defaults):
+            if type(argname) is TupleType:
+                parameter = pynodes.parameter_tuple()
+                for tuplearg in argname:
+                    parameter.append(make_parameter(tuplearg))
+                argname = normalize_parameter_name(argname)
+            else:
+                parameter = make_parameter(argname)
+            if default:
+                n_default = pynodes.parameter_default()
+                n_default.append(Text(function_parameters[argname]))
+                parameter.append(n_default)
+            parameters.append(parameter)
+        if parameters or special:
+            special.reverse()
+            parameters.extend(special)
+            parameter_list = pynodes.parameter_list()
+            parameter_list.extend(parameters)
+            self.function.append(parameter_list)
+
+
+class ClassVisitor(AssignmentVisitor):
+
+    in_class = 0
+
+    def __init__(self, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.bases = []
+
+    def visitClass(self, node):
+        if self.in_class:
+            self.documentable = None
+            # Don't bother with nested class definitions.
+            return
+        self.in_class = 1
+        #import mypdb as pdb
+        #pdb.set_trace()
+        for base in node.bases:
+            self.visit(base)
+        self.klass = klass = make_class_section(node.name, self.bases,
+                                                doc=node.doc,
+                                                lineno=node.lineno)
+        self.context.append(klass)
+        self.documentable = klass
+        self.visit(node.code)
+        self.context.pop()
+
+    def visitGetattr(self, node, suffix=None):
+        if suffix:
+            name = node.attrname + '.' + suffix
+        else:
+            name = node.attrname
+        self.default_visit(node, name)
+
+    def visitName(self, node, suffix=None):
+        if suffix:
+            name = node.name + '.' + suffix
+        else:
+            name = node.name
+        self.bases.append(name)
+
+    def visitFunction(self, node):
+        if node.name == '__init__':
+            visitor = InitMethodVisitor(self.token_parser,
+                                        function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        else:
+            visitor = FunctionVisitor(self.token_parser,
+                                      function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+
+class InitMethodVisitor(FunctionVisitor, AssignmentVisitor): pass
+
+
+class TokenParser:
+
+    def __init__(self, text):
+        self.text = text + '\n\n'
+        self.lines = self.text.splitlines(1)
+        self.generator = tokenize.generate_tokens(iter(self.lines).next)
+        self.next()
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        self.token = self.generator.next()
+        self.type, self.string, self.start, self.end, self.line = self.token
+        return self.token
+
+    def goto_line(self, lineno):
+        while self.start[0] < lineno:
+            self.next()
+        return token
+
+    def rhs(self, lineno):
+        """
+        Return a whitespace-normalized expression string from the right-hand
+        side of an assignment at line `lineno`.
+        """
+        self.goto_line(lineno)
+        while self.string != '=':
+            self.next()
+        self.stack = None
+        while self.type != token.NEWLINE and self.string != ';':
+            if self.string == '=' and not self.stack:
+                self.tokens = []
+                self.stack = []
+                self._type = None
+                self._string = None
+                self._backquote = 0
+            else:
+                self.note_token()
+            self.next()
+        self.next()
+        text = ''.join(self.tokens)
+        return text.strip()
+
+    closers = {')': '(', ']': '[', '}': '{'}
+    openers = {'(': 1, '[': 1, '{': 1}
+    del_ws_prefix = {'.': 1, '=': 1, ')': 1, ']': 1, '}': 1, ':': 1, ',': 1}
+    no_ws_suffix = {'.': 1, '=': 1, '(': 1, '[': 1, '{': 1}
+
+    def note_token(self):
+        if self.type == tokenize.NL:
+            return
+        del_ws = self.del_ws_prefix.has_key(self.string)
+        append_ws = not self.no_ws_suffix.has_key(self.string)
+        if self.openers.has_key(self.string):
+            self.stack.append(self.string)
+            if (self._type == token.NAME
+                or self.closers.has_key(self._string)):
+                del_ws = 1
+        elif self.closers.has_key(self.string):
+            assert self.stack[-1] == self.closers[self.string]
+            self.stack.pop()
+        elif self.string == '`':
+            if self._backquote:
+                del_ws = 1
+                assert self.stack[-1] == '`'
+                self.stack.pop()
+            else:
+                append_ws = 0
+                self.stack.append('`')
+            self._backquote = not self._backquote
+        if del_ws and self.tokens and self.tokens[-1] == ' ':
+            del self.tokens[-1]
+        self.tokens.append(self.string)
+        self._type = self.type
+        self._string = self.string
+        if append_ws:
+            self.tokens.append(' ')
+
+    def function_parameters(self, lineno):
+        """
+        Return a dictionary mapping parameters to defaults
+        (whitespace-normalized strings).
+        """
+        self.goto_line(lineno)
+        while self.string != 'def':
+            self.next()
+        while self.string != '(':
+            self.next()
+        name = None
+        default = None
+        parameter_tuple = None
+        self.tokens = []
+        parameters = {}
+        self.stack = [self.string]
+        self.next()
+        while 1:
+            if len(self.stack) == 1:
+                if parameter_tuple:
+                    # Just encountered ")".
+                    #print >>sys.stderr, 'parameter_tuple: %r' % self.tokens
+                    name = ''.join(self.tokens).strip()
+                    self.tokens = []
+                    parameter_tuple = None
+                if self.string in (')', ','):
+                    if name:
+                        if self.tokens:
+                            default_text = ''.join(self.tokens).strip()
+                        else:
+                            default_text = None
+                        parameters[name] = default_text
+                        self.tokens = []
+                        name = None
+                        default = None
+                    if self.string == ')':
+                        break
+                elif self.type == token.NAME:
+                    if name and default:
+                        self.note_token()
+                    else:
+                        assert name is None, (
+                            'token=%r name=%r parameters=%r stack=%r'
+                            % (self.token, name, parameters, self.stack))
+                        name = self.string
+                        #print >>sys.stderr, 'name=%r' % name
+                elif self.string == '=':
+                    assert name is not None, 'token=%r' % (self.token,)
+                    assert default is None, 'token=%r' % (self.token,)
+                    assert self.tokens == [], 'token=%r' % (self.token,)
+                    default = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                elif name:
+                    self.note_token()
+                elif self.string == '(':
+                    parameter_tuple = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                    self.note_token()
+                else:                   # ignore these tokens:
+                    assert (self.string in ('*', '**', '\n') 
+                            or self.type == tokenize.COMMENT), (
+                        'token=%r' % (self.token,))
+            else:
+                self.note_token()
+            self.next()
+        return parameters
+
+
+def make_docstring(doc, lineno):
+    n = pynodes.docstring()
+    if lineno:
+        # Really, only module docstrings don't have a line
+        # (@@: but maybe they should)
+        n['lineno'] = lineno
+    n.append(Text(doc))
+    return n
+
+def append_docstring(node, doc, lineno):
+    if doc:
+        node.append(make_docstring(doc, lineno))
+
+def make_class_section(name, bases, lineno, doc):
+    n = pynodes.class_section()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    for base in bases:
+        b = pynodes.class_base()
+        b.append(make_object_name(base))
+        n.append(b)
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_object_name(name):
+    n = pynodes.object_name()
+    n.append(Text(name))
+    return n
+
+def make_function_like_section(name, lineno, doc, function_class):
+    n = function_class()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_import_group(names, lineno, from_name=None):
+    n = pynodes.import_group()
+    n['lineno'] = lineno
+    if from_name:
+        n_from = pynodes.import_from()
+        n_from.append(Text(from_name))
+        n.append(n_from)
+    for name, alias in names:
+        n_name = pynodes.import_name()
+        n_name.append(Text(name))
+        if alias:
+            n_alias = pynodes.import_alias()
+            n_alias.append(Text(alias))
+            n_name.append(n_alias)
+        n.append(n_name)
+    return n
+
+def make_class_attribute(name, lineno):
+    n = pynodes.class_attribute()
+    n['lineno'] = lineno
+    n.append(Text(name))
+    return n
+
+def make_attribute(name, lineno):
+    n = pynodes.attribute()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    return n
+
+def make_parameter(name, excess_keyword=0, excess_positional=0):
+    """
+    excess_keyword and excess_positional must be either 1 or 0, and
+    not both of them can be 1.
+    """
+    n = pynodes.parameter()
+    n.append(make_object_name(name))
+    assert not excess_keyword or not excess_positional
+    if excess_keyword:
+        n['excess_keyword'] = 1
+    if excess_positional:
+        n['excess_positional'] = 1
+    return n
+
+def trim_docstring(text):
+    """
+    Trim indentation and blank lines from docstring text & return it.
+
+    See PEP 257.
+    """
+    if not text:
+        return text
+    # Convert tabs to spaces (following the normal Python rules)
+    # and split into a list of lines:
+    lines = text.expandtabs().splitlines()
+    # Determine minimum indentation (first line doesn't count):
+    indent = sys.maxint
+    for line in lines[1:]:
+        stripped = line.lstrip()
+        if stripped:
+            indent = min(indent, len(line) - len(stripped))
+    # Remove indentation (first line is special):
+    trimmed = [lines[0].strip()]
+    if indent < sys.maxint:
+        for line in lines[1:]:
+            trimmed.append(line[indent:].rstrip())
+    # Strip off trailing and leading blank lines:
+    while trimmed and not trimmed[-1]:
+        trimmed.pop()
+    while trimmed and not trimmed[0]:
+        trimmed.pop(0)
+    # Return a single string:
+    return '\n'.join(trimmed)
+
+def normalize_parameter_name(name):
+    """
+    Converts a tuple like ``('a', ('b', 'c'), 'd')`` into ``'(a, (b, c), d)'``
+    """
+    if type(name) is TupleType:
+        return '(%s)' % ', '.join([normalize_parameter_name(n) for n in name])
+    else:
+        return name
+
+if __name__ == '__main__':
+    import sys
+    args = sys.argv[1:]
+    if args[0] == '-v':
+        filename = args[1]
+        module_text = open(filename).read()
+        ast = compiler.parse(module_text)
+        visitor = compiler.visitor.ExampleASTVisitor()
+        compiler.walk(ast, visitor, walker=visitor, verbose=1)
+    else:
+        filename = args[0]
+        content = open(filename).read()
+        print parse_module(content, filename).pformat()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+#! /usr/bin/env python
+# $Id: pynodes.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+from docutils import nodes
+from docutils.nodes import Element, TextElement, Structural, Inline, Part, \
+     Text
+import types
+
+# This is the parent class of all the other pynode classes:
+class PythonStructural(Structural): pass
+
+# =====================
+#  Structural Elements
+# =====================
+
+class module_section(PythonStructural, Element): pass    
+class class_section(PythonStructural, Element): pass
+class class_base(PythonStructural, Element): pass
+class method_section(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+class function_section(PythonStructural, Element): pass
+class class_attribute_section(PythonStructural, Element): pass
+class class_attribute(PythonStructural, Element): pass
+class expression_value(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+
+# Structural Support Elements
+# ---------------------------
+
+class parameter_list(PythonStructural, Element): pass
+class parameter_tuple(PythonStructural, Element): pass
+class parameter_default(PythonStructural, TextElement): pass
+class import_group(PythonStructural, TextElement): pass
+class import_from(PythonStructural, TextElement): pass
+class import_name(PythonStructural, TextElement): pass
+class import_alias(PythonStructural, TextElement): pass
+class docstring(PythonStructural, Element): pass
+
+# =================
+#  Inline Elements
+# =================
+
+# These elements cannot become references until the second
+# pass.  Initially, we'll use "reference" or "name".
+
+class object_name(PythonStructural, TextElement): pass
+class parameter_list(PythonStructural, TextElement): pass
+class parameter(PythonStructural, TextElement): pass
+class parameter_default(PythonStructural, TextElement): pass
+class class_attribute(PythonStructural, TextElement): pass
+class attribute_tuple(PythonStructural, TextElement): pass
+
+# =================
+#  Unused Elements
+# =================
+
+# These were part of the model, and maybe should be in the future, but
+# aren't now.
+#class package_section(PythonStructural, Element): pass
+#class module_attribute_section(PythonStructural, Element): pass
+#class instance_attribute_section(PythonStructural, Element): pass
+#class module_attribute(PythonStructural, TextElement): pass
+#class instance_attribute(PythonStructural, TextElement): pass
+#class exception_class(PythonStructural, TextElement): pass
+#class warning_class(PythonStructural, TextElement): pass
+
+
+# Collect all the classes we've written above
+def install_node_class_names():
+    node_class_names = []
+    for name, var in globals().items():
+        if (type(var) is types.ClassType
+            and issubclass(var, PythonStructural) \
+            and name.lower() == name):
+            node_class_names.append(var.tagname or name)
+    # Register the new node names with GenericNodeVisitor and
+    # SpecificNodeVisitor:
+    nodes._add_node_class_names(node_class_names)
+install_node_class_names()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/standalone.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+# $Id: standalone.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Standalone file Reader for the reStructuredText markup syntax.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import frontend, readers
+from docutils.transforms import frontmatter, references, misc
+
+
+class Reader(readers.Reader):
+
+    supported = ('standalone',)
+    """Contexts this reader supports."""
+
+    document = None
+    """A single document tree."""
+
+    settings_spec = (
+        'Standalone Reader',
+        None,
+        (('Disable the promotion of a lone top-level section title to '
+          'document title (and subsequent section title to document '
+          'subtitle promotion; enabled by default).',
+          ['--no-doc-title'],
+          {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Disable the bibliographic field list transform (enabled by '
+          'default).',
+          ['--no-doc-info'],
+          {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Activate the promotion of lone subsection titles to '
+          'section subtitles (disabled by default).',
+          ['--section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0,
+           'validator': frontend.validate_boolean}),
+         ('Deactivate the promotion of lone subsection titles.',
+          ['--no-section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_false'}),
+         ))
+
+    config_section = 'standalone reader'
+    config_section_dependencies = ('readers',)
+
+    def get_transforms(self):
+        return readers.Reader.get_transforms(self) + [
+            references.Substitutions,
+            references.PropagateTargets,
+            frontmatter.DocTitle,
+            frontmatter.SectionSubTitle,
+            frontmatter.DocInfo,
+            references.AnonymousHyperlinks,
+            references.IndirectHyperlinks,
+            references.Footnotes,
+            references.ExternalTargets,
+            references.InternalTargets,
+            references.DanglingReferences,
+            misc.Transitions,
+            ]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/statemachine.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1490 @@
+# $Id: statemachine.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A finite state machine specialized for regular-expression-based text filters,
+this module defines the following classes:
+
+- `StateMachine`, a state machine
+- `State`, a state superclass
+- `StateMachineWS`, a whitespace-sensitive version of `StateMachine`
+- `StateWS`, a state superclass for use with `StateMachineWS`
+- `SearchStateMachine`, uses `re.search()` instead of `re.match()`
+- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()`
+- `ViewList`, extends standard Python lists.
+- `StringList`, string-specific ViewList.
+
+Exception classes:
+
+- `StateMachineError`
+- `UnknownStateError`
+- `DuplicateStateError`
+- `UnknownTransitionError`
+- `DuplicateTransitionError`
+- `TransitionPatternNotFound`
+- `TransitionMethodNotFound`
+- `UnexpectedIndentationError`
+- `TransitionCorrection`: Raised to switch to another transition.
+- `StateCorrection`: Raised to switch to another state & transition.
+
+Functions:
+
+- `string2lines()`: split a multi-line string into a list of one-line strings
+
+
+How To Use This Module
+======================
+(See the individual classes, methods, and attributes for details.)
+
+1. Import it: ``import statemachine`` or ``from statemachine import ...``.
+   You will also need to ``import re``.
+
+2. Derive a subclass of `State` (or `StateWS`) for each state in your state
+   machine::
+
+       class MyState(statemachine.State):
+
+   Within the state's class definition:
+
+   a) Include a pattern for each transition, in `State.patterns`::
+
+          patterns = {'atransition': r'pattern', ...}
+
+   b) Include a list of initial transitions to be set up automatically, in
+      `State.initial_transitions`::
+
+          initial_transitions = ['atransition', ...]
+
+   c) Define a method for each transition, with the same name as the
+      transition pattern::
+
+          def atransition(self, match, context, next_state):
+              # do something
+              result = [...]  # a list
+              return context, next_state, result
+              # context, next_state may be altered
+
+      Transition methods may raise an `EOFError` to cut processing short.
+
+   d) You may wish to override the `State.bof()` and/or `State.eof()` implicit
+      transition methods, which handle the beginning- and end-of-file.
+
+   e) In order to handle nested processing, you may wish to override the
+      attributes `State.nested_sm` and/or `State.nested_sm_kwargs`.
+
+      If you are using `StateWS` as a base class, in order to handle nested
+      indented blocks, you may wish to:
+
+      - override the attributes `StateWS.indent_sm`,
+        `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or
+        `StateWS.known_indent_sm_kwargs`;
+      - override the `StateWS.blank()` method; and/or
+      - override or extend the `StateWS.indent()`, `StateWS.known_indent()`,
+        and/or `StateWS.firstknown_indent()` methods.
+
+3. Create a state machine object::
+
+       sm = StateMachine(state_classes=[MyState, ...],
+                         initial_state='MyState')
+
+4. Obtain the input text, which needs to be converted into a tab-free list of
+   one-line strings. For example, to read text from a file called
+   'inputfile'::
+
+       input_string = open('inputfile').read()
+       input_lines = statemachine.string2lines(input_string)
+
+5. Run the state machine on the input text and collect the results, a list::
+
+       results = sm.run(input_lines)
+
+6. Remove any lingering circular references::
+
+       sm.unlink()
+"""
+
+__docformat__ = 'restructuredtext'
+
+import sys
+import re
+import types
+import unicodedata
+
+
+class StateMachine:
+
+    """
+    A finite state machine for text filters using regular expressions.
+
+    The input is provided in the form of a list of one-line strings (no
+    newlines). States are subclasses of the `State` class. Transitions consist
+    of regular expression patterns and transition methods, and are defined in
+    each state.
+
+    The state machine is started with the `run()` method, which returns the
+    results of processing in a list.
+    """
+
+    def __init__(self, state_classes, initial_state, debug=0):
+        """
+        Initialize a `StateMachine` object; add state objects.
+
+        Parameters:
+
+        - `state_classes`: a list of `State` (sub)classes.
+        - `initial_state`: a string, the class name of the initial state.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.input_lines = None
+        """`StringList` of input lines (without newlines).
+        Filled by `self.run()`."""
+
+        self.input_offset = 0
+        """Offset of `self.input_lines` from the beginning of the file."""
+
+        self.line = None
+        """Current input line."""
+
+        self.line_offset = -1
+        """Current input line offset from beginning of `self.input_lines`."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        self.initial_state = initial_state
+        """The name of the initial state (key to `self.states`)."""
+
+        self.current_state = initial_state
+        """The name of the current state (key to `self.states`)."""
+
+        self.states = {}
+        """Mapping of {state_name: State_object}."""
+
+        self.add_states(state_classes)
+
+        self.observers = []
+        """List of bound methods or functions to call whenever the current
+        line changes.  Observers are called with one argument, ``self``.
+        Cleared at the end of `run()`."""
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        for state in self.states.values():
+            state.unlink()
+        self.states = None
+
+    def run(self, input_lines, input_offset=0, context=None,
+            input_source=None):
+        """
+        Run the state machine on `input_lines`. Return results (a list).
+
+        Reset `self.line_offset` and `self.current_state`. Run the
+        beginning-of-file transition. Input one line at a time and check for a
+        matching transition. If a match is found, call the transition method
+        and possibly change the state. Store the context returned by the
+        transition method to be passed on to the next transition matched.
+        Accumulate the results returned by the transition methods in a list.
+        Run the end-of-file transition. Finally, return the accumulated
+        results.
+
+        Parameters:
+
+        - `input_lines`: a list of strings without newlines, or `StringList`.
+        - `input_offset`: the line offset of `input_lines` from the beginning
+          of the file.
+        - `context`: application-specific storage.
+        - `input_source`: name or path of source of `input_lines`.
+        """
+        self.runtime_init()
+        if isinstance(input_lines, StringList):
+            self.input_lines = input_lines
+        else:
+            self.input_lines = StringList(input_lines, source=input_source)
+        self.input_offset = input_offset
+        self.line_offset = -1
+        self.current_state = self.initial_state
+        if self.debug:
+            print >>sys.stderr, (
+                '\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
+                % (self.line_offset, '\n| '.join(self.input_lines)))
+        transitions = None
+        results = []
+        state = self.get_state()
+        try:
+            if self.debug:
+                print >>sys.stderr, ('\nStateMachine.run: bof transition')
+            context, result = state.bof(context)
+            results.extend(result)
+            while 1:
+                try:
+                    try:
+                        self.next_line()
+                        if self.debug:
+                            source, offset = self.input_lines.info(
+                                self.line_offset)
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: line (source=%r, '
+                                'offset=%r):\n| %s'
+                                % (source, offset, self.line))
+                        context, next_state, result = self.check_line(
+                            context, state, transitions)
+                    except EOFError:
+                        if self.debug:
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: %s.eof transition'
+                                % state.__class__.__name__)
+                        result = state.eof(context)
+                        results.extend(result)
+                        break
+                    else:
+                        results.extend(result)
+                except TransitionCorrection, exception:
+                    self.previous_line() # back up for another try
+                    transitions = (exception.args[0],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: TransitionCorrection to '
+                              'state "%s", transition %s.'
+                              % (state.__class__.__name__, transitions[0]))
+                    continue
+                except StateCorrection, exception:
+                    self.previous_line() # back up for another try
+                    next_state = exception.args[0]
+                    if len(exception.args) == 1:
+                        transitions = None
+                    else:
+                        transitions = (exception.args[1],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: StateCorrection to state '
+                              '"%s", transition %s.'
+                              % (next_state, transitions[0]))
+                else:
+                    transitions = None
+                state = self.get_state(next_state)
+        except:
+            if self.debug:
+                self.error()
+            raise
+        self.observers = []
+        return results
+
+    def get_state(self, next_state=None):
+        """
+        Return current state object; set it first if `next_state` given.
+
+        Parameter `next_state`: a string, the name of the next state.
+
+        Exception: `UnknownStateError` raised if `next_state` unknown.
+        """
+        if next_state:
+            if self.debug and next_state != self.current_state:
+                print >>sys.stderr, \
+                      ('\nStateMachine.get_state: Changing state from '
+                       '"%s" to "%s" (input line %s).'
+                       % (self.current_state, next_state,
+                          self.abs_line_number()))
+            self.current_state = next_state
+        try:
+            return self.states[self.current_state]
+        except KeyError:
+            raise UnknownStateError(self.current_state)
+
+    def next_line(self, n=1):
+        """Load `self.line` with the `n`'th next line and return it."""
+        try:
+            try:
+                self.line_offset += n
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def is_next_line_blank(self):
+        """Return 1 if the next line is blank or non-existant."""
+        try:
+            return not self.input_lines[self.line_offset + 1].strip()
+        except IndexError:
+            return 1
+
+    def at_eof(self):
+        """Return 1 if the input is at or past end-of-file."""
+        return self.line_offset >= len(self.input_lines) - 1
+
+    def at_bof(self):
+        """Return 1 if the input is at or before beginning-of-file."""
+        return self.line_offset <= 0
+
+    def previous_line(self, n=1):
+        """Load `self.line` with the `n`'th previous line and return it."""
+        self.line_offset -= n
+        if self.line_offset < 0:
+            self.line = None
+        else:
+            self.line = self.input_lines[self.line_offset]
+        self.notify_observers()
+        return self.line
+
+    def goto_line(self, line_offset):
+        """Jump to absolute line offset `line_offset`, load and return it."""
+        try:
+            try:
+                self.line_offset = line_offset - self.input_offset
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def get_source(self, line_offset):
+        """Return source of line at absolute line offset `line_offset`."""
+        return self.input_lines.source(line_offset - self.input_offset)
+
+    def abs_line_offset(self):
+        """Return line offset of current line, from beginning of file."""
+        return self.line_offset + self.input_offset
+
+    def abs_line_number(self):
+        """Return line number of current line (counting from 1)."""
+        return self.line_offset + self.input_offset + 1
+
+    def insert_input(self, input_lines, source):
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 2,
+                                StringList(input_lines, source))
+
+    def get_text_block(self, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        try:
+            block = self.input_lines.get_text_block(self.line_offset,
+                                                    flush_left)
+            self.next_line(len(block) - 1)
+            return block
+        except UnexpectedIndentationError, error:
+            block, source, lineno = error
+            self.next_line(len(block) - 1) # advance to last line of block
+            raise
+
+    def check_line(self, context, state, transitions=None):
+        """
+        Examine one line of input for a transition match & execute its method.
+
+        Parameters:
+
+        - `context`: application-dependent storage.
+        - `state`: a `State` object, the current state.
+        - `transitions`: an optional ordered list of transition names to try,
+          instead of ``state.transition_order``.
+
+        Return the values returned by the transition method:
+
+        - context: possibly modified from the parameter `context`;
+        - next state name (`State` subclass name);
+        - the result output of the transition, a list.
+
+        When there is no match, ``state.no_match()`` is called and its return
+        value is returned.
+        """
+        if transitions is None:
+            transitions =  state.transition_order
+        state_correction = None
+        if self.debug:
+            print >>sys.stderr, (
+                  '\nStateMachine.check_line: state="%s", transitions=%r.'
+                  % (state.__class__.__name__, transitions))
+        for name in transitions:
+            pattern, method, next_state = state.transitions[name]
+            match = self.match(pattern)
+            if match:
+                if self.debug:
+                    print >>sys.stderr, (
+                          '\nStateMachine.check_line: Matched transition '
+                          '"%s" in state "%s".'
+                          % (name, state.__class__.__name__))
+                return method(match, context, next_state)
+        else:
+            if self.debug:
+                print >>sys.stderr, (
+                      '\nStateMachine.check_line: No match in state "%s".'
+                      % state.__class__.__name__)
+            return state.no_match(context, transitions)
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression match.
+
+        Parameter `pattern`: an `re` compiled regular expression.
+        """
+        return pattern.match(self.line)
+
+    def add_state(self, state_class):
+        """
+        Initialize & add a `state_class` (`State` subclass) object.
+
+        Exception: `DuplicateStateError` raised if `state_class` was already
+        added.
+        """
+        statename = state_class.__name__
+        if self.states.has_key(statename):
+            raise DuplicateStateError(statename)
+        self.states[statename] = state_class(self, self.debug)
+
+    def add_states(self, state_classes):
+        """
+        Add `state_classes` (a list of `State` subclasses).
+        """
+        for state_class in state_classes:
+            self.add_state(state_class)
+
+    def runtime_init(self):
+        """
+        Initialize `self.states`.
+        """
+        for state in self.states.values():
+            state.runtime_init()
+
+    def error(self):
+        """Report error details."""
+        type, value, module, line, function = _exception_data()
+        print >>sys.stderr, '%s: %s' % (type, value)
+        print >>sys.stderr, 'input line %s' % (self.abs_line_number())
+        print >>sys.stderr, ('module %s, line %s, function %s'
+                             % (module, line, function))
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes two
+        arguments, the source and offset of the current line.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self):
+        for observer in self.observers:
+            try:
+                info = self.input_lines.info(self.line_offset)
+            except IndexError:
+                info = (None, None)
+            observer(*info)
+
+
+class State:
+
+    """
+    State superclass. Contains a list of transitions, and transition methods.
+
+    Transition methods all have the same signature. They take 3 parameters:
+
+    - An `re` match object. ``match.string`` contains the matched input line,
+      ``match.start()`` gives the start index of the match, and
+      ``match.end()`` gives the end index.
+    - A context object, whose meaning is application-defined (initial value
+      ``None``). It can be used to store any information required by the state
+      machine, and the retured context is passed on to the next transition
+      method unchanged.
+    - The name of the next state, a string, taken from the transitions list;
+      normally it is returned unchanged, but it may be altered by the
+      transition method if necessary.
+
+    Transition methods all return a 3-tuple:
+
+    - A context object, as (potentially) modified by the transition method.
+    - The next state name (a return value of ``None`` means no state change).
+    - The processing result, a list, which is accumulated by the state
+      machine.
+
+    Transition methods may raise an `EOFError` to cut processing short.
+
+    There are two implicit transitions, and corresponding transition methods
+    are defined: `bof()` handles the beginning-of-file, and `eof()` handles
+    the end-of-file. These methods have non-standard signatures and return
+    values. `bof()` returns the initial context and results, and may be used
+    to return a header string, or do any other processing needed. `eof()`
+    should handle any remaining context and wrap things up; it returns the
+    final processing result.
+
+    Typical applications need only subclass `State` (or a subclass), set the
+    `patterns` and `initial_transitions` class attributes, and provide
+    corresponding transition methods. The default object initialization will
+    take care of constructing the list of transitions.
+    """
+
+    patterns = None
+    """
+    {Name: pattern} mapping, used by `make_transition()`. Each pattern may
+    be a string or a compiled `re` pattern. Override in subclasses.
+    """
+
+    initial_transitions = None
+    """
+    A list of transitions to initialize when a `State` is instantiated.
+    Each entry is either a transition name string, or a (transition name, next
+    state name) pair. See `make_transitions()`. Override in subclasses.
+    """
+
+    nested_sm = None
+    """
+    The `StateMachine` class for handling nested processing.
+
+    If left as ``None``, `nested_sm` defaults to the class of the state's
+    controlling state machine. Override it in subclasses to avoid the default.
+    """
+
+    nested_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `nested_sm` constructor.
+
+    Two keys must have entries in the dictionary:
+
+    - Key 'state_classes' must be set to a list of `State` classes.
+    - Key 'initial_state' must be set to the name of the initial state class.
+
+    If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the
+    class of the current state, and 'initial_state' defaults to the name of
+    the class of the current state. Override in subclasses to avoid the
+    defaults.
+    """
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `State` object; make & add initial transitions.
+
+        Parameters:
+
+        - `statemachine`: the controlling `StateMachine` object.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.transition_order = []
+        """A list of transition names in search order."""
+
+        self.transitions = {}
+        """
+        A mapping of transition names to 3-tuples containing
+        (compiled_pattern, transition_method, next_state_name). Initialized as
+        an instance attribute dynamically (instead of as a class attribute)
+        because it may make forward references to patterns and methods in this
+        or other classes.
+        """
+
+        self.add_initial_transitions()
+
+        self.state_machine = state_machine
+        """A reference to the controlling `StateMachine` object."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        if self.nested_sm is None:
+            self.nested_sm = self.state_machine.__class__
+        if self.nested_sm_kwargs is None:
+            self.nested_sm_kwargs = {'state_classes': [self.__class__],
+                                     'initial_state': self.__class__.__name__}
+
+    def runtime_init(self):
+        """
+        Initialize this `State` before running the state machine; called from
+        `self.state_machine.run()`.
+        """
+        pass
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        self.state_machine = None
+
+    def add_initial_transitions(self):
+        """Make and add transitions listed in `self.initial_transitions`."""
+        if self.initial_transitions:
+            names, transitions = self.make_transitions(
+                  self.initial_transitions)
+            self.add_transitions(names, transitions)
+
+    def add_transitions(self, names, transitions):
+        """
+        Add a list of transitions to the start of the transition list.
+
+        Parameters:
+
+        - `names`: a list of transition names.
+        - `transitions`: a mapping of names to transition tuples.
+
+        Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`.
+        """
+        for name in names:
+            if self.transitions.has_key(name):
+                raise DuplicateTransitionError(name)
+            if not transitions.has_key(name):
+                raise UnknownTransitionError(name)
+        self.transition_order[:0] = names
+        self.transitions.update(transitions)
+
+    def add_transition(self, name, transition):
+        """
+        Add a transition to the start of the transition list.
+
+        Parameter `transition`: a ready-made transition 3-tuple.
+
+        Exception: `DuplicateTransitionError`.
+        """
+        if self.transitions.has_key(name):
+            raise DuplicateTransitionError(name)
+        self.transition_order[:0] = [name]
+        self.transitions[name] = transition
+
+    def remove_transition(self, name):
+        """
+        Remove a transition by `name`.
+
+        Exception: `UnknownTransitionError`.
+        """
+        try:
+            del self.transitions[name]
+            self.transition_order.remove(name)
+        except:
+            raise UnknownTransitionError(name)
+
+    def make_transition(self, name, next_state=None):
+        """
+        Make & return a transition tuple based on `name`.
+
+        This is a convenience function to simplify transition creation.
+
+        Parameters:
+
+        - `name`: a string, the name of the transition pattern & method. This
+          `State` object must have a method called '`name`', and a dictionary
+          `self.patterns` containing a key '`name`'.
+        - `next_state`: a string, the name of the next `State` object for this
+          transition. A value of ``None`` (or absent) implies no state change
+          (i.e., continue with the same state).
+
+        Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`.
+        """
+        if next_state is None:
+            next_state = self.__class__.__name__
+        try:
+            pattern = self.patterns[name]
+            if not hasattr(pattern, 'match'):
+                pattern = re.compile(pattern)
+        except KeyError:
+            raise TransitionPatternNotFound(
+                  '%s.patterns[%r]' % (self.__class__.__name__, name))
+        try:
+            method = getattr(self, name)
+        except AttributeError:
+            raise TransitionMethodNotFound(
+                  '%s.%s' % (self.__class__.__name__, name))
+        return (pattern, method, next_state)
+
+    def make_transitions(self, name_list):
+        """
+        Return a list of transition names and a transition mapping.
+
+        Parameter `name_list`: a list, where each entry is either a transition
+        name string, or a 1- or 2-tuple (transition name, optional next state
+        name).
+        """
+        stringtype = type('')
+        names = []
+        transitions = {}
+        for namestate in name_list:
+            if type(namestate) is stringtype:
+                transitions[namestate] = self.make_transition(namestate)
+                names.append(namestate)
+            else:
+                transitions[namestate[0]] = self.make_transition(*namestate)
+                names.append(namestate[0])
+        return names, transitions
+
+    def no_match(self, context, transitions):
+        """
+        Called when there is no match from `StateMachine.check_line()`.
+
+        Return the same values returned by transition methods:
+
+        - context: unchanged;
+        - next state name: ``None``;
+        - empty result list.
+
+        Override in subclasses to catch this event.
+        """
+        return context, None, []
+
+    def bof(self, context):
+        """
+        Handle beginning-of-file. Return unchanged `context`, empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return context, []
+
+    def eof(self, context):
+        """
+        Handle end-of-file. Return empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return []
+
+    def nop(self, match, context, next_state):
+        """
+        A "do nothing" transition method.
+
+        Return unchanged `context` & `next_state`, empty result. Useful for
+        simple state changes (actionless transitions).
+        """
+        return context, next_state, []
+
+
+class StateMachineWS(StateMachine):
+
+    """
+    `StateMachine` subclass specialized for whitespace recognition.
+
+    There are three methods provided for extracting indented text blocks:
+    
+    - `get_indented()`: use when the indent is unknown.
+    - `get_known_indented()`: use when the indent is known for all lines.
+    - `get_first_known_indented()`: use when only the first line's indent is
+      known.
+    """
+
+    def get_indented(self, until_blank=0, strip_indent=1):
+        """
+        Return a block of indented lines of text, and info.
+
+        Extract an indented block where the indent is unknown for all lines.
+
+        :Parameters:
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip common leading indent if true (1,
+              default).
+
+        :Return:
+            - the indented block (a list of lines of text),
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent)
+        if indented:
+            self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, indent, offset, blank_finish
+
+    def get_known_indented(self, indent, until_blank=0, strip_indent=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for all lines.
+        Starting with the current line, extract the entire text block with at
+        least `indent` indentation (which must be whitespace, except for the
+        first line).
+
+        :Parameters:
+            - `indent`: The number of indent columns/characters.
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+
+        :Return:
+            - the indented block,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              block_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, offset, blank_finish
+
+    def get_first_known_indented(self, indent, until_blank=0, strip_indent=1,
+                                 strip_top=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for the first line
+        and unknown for all other lines.
+
+        :Parameters:
+            - `indent`: The first line's indent (# of columns/characters).
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+            - `strip_top`: Strip blank lines from the beginning of the block.
+
+        :Return:
+            - the indented block,
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              first_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        if strip_top:
+            while indented and not indented[0].strip():
+                indented.trim_start()
+                offset += 1
+        return indented, indent, offset, blank_finish
+
+
+class StateWS(State):
+
+    """
+    State superclass specialized for whitespace (blank lines & indents).
+
+    Use this class with `StateMachineWS`.  The transitions 'blank' (for blank
+    lines) and 'indent' (for indented text blocks) are added automatically,
+    before any other transitions.  The transition method `blank()` handles
+    blank lines and `indent()` handles nested indented blocks.  Indented
+    blocks trigger a new state machine to be created by `indent()` and run.
+    The class of the state machine to be created is in `indent_sm`, and the
+    constructor keyword arguments are in the dictionary `indent_sm_kwargs`.
+
+    The methods `known_indent()` and `firstknown_indent()` are provided for
+    indented blocks where the indent (all lines' and first line's only,
+    respectively) is known to the transition method, along with the attributes
+    `known_indent_sm` and `known_indent_sm_kwargs`.  Neither transition method
+    is triggered automatically.
+    """
+
+    indent_sm = None
+    """
+    The `StateMachine` class handling indented text blocks.
+
+    If left as ``None``, `indent_sm` defaults to the value of
+    `State.nested_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `indent_sm` constructor.
+
+    If left as ``None``, `indent_sm_kwargs` defaults to the value of
+    `State.nested_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm = None
+    """
+    The `StateMachine` class handling known-indented text blocks.
+
+    If left as ``None``, `known_indent_sm` defaults to the value of
+    `indent_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `known_indent_sm` constructor.
+
+    If left as ``None``, `known_indent_sm_kwargs` defaults to the value of
+    `indent_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    ws_patterns = {'blank': ' *$',
+                   'indent': ' +'}
+    """Patterns for default whitespace transitions.  May be overridden in
+    subclasses."""
+
+    ws_initial_transitions = ('blank', 'indent')
+    """Default initial whitespace transitions, added before those listed in
+    `State.initial_transitions`.  May be overridden in subclasses."""
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `StateSM` object; extends `State.__init__()`.
+
+        Check for indent state machine attributes, set defaults if not set.
+        """
+        State.__init__(self, state_machine, debug)
+        if self.indent_sm is None:
+            self.indent_sm = self.nested_sm
+        if self.indent_sm_kwargs is None:
+            self.indent_sm_kwargs = self.nested_sm_kwargs
+        if self.known_indent_sm is None:
+            self.known_indent_sm = self.indent_sm
+        if self.known_indent_sm_kwargs is None:
+            self.known_indent_sm_kwargs = self.indent_sm_kwargs
+
+    def add_initial_transitions(self):
+        """
+        Add whitespace-specific transitions before those defined in subclass.
+
+        Extends `State.add_initial_transitions()`.
+        """
+        State.add_initial_transitions(self)
+        if self.patterns is None:
+            self.patterns = {}
+        self.patterns.update(self.ws_patterns)
+        names, transitions = self.make_transitions(
+            self.ws_initial_transitions)
+        self.add_transitions(names, transitions)
+
+    def blank(self, match, context, next_state):
+        """Handle blank lines. Does nothing. Override in subclasses."""
+        return self.nop(match, context, next_state)
+
+    def indent(self, match, context, next_state):
+        """
+        Handle an indented text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for indented blocks
+        (`self.indent_sm`).
+        """
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def known_indent(self, match, context, next_state):
+        """
+        Handle a known-indent text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def first_known_indent(self, match, context, next_state):
+        """
+        Handle an indented text block (first line's indent known).
+
+        Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+
+class _SearchOverride:
+
+    """
+    Mix-in class to override `StateMachine` regular expression behavior.
+
+    Changes regular expression matching, from the default `re.match()`
+    (succeeds only if the pattern matches at the start of `self.line`) to
+    `re.search()` (succeeds if the pattern matches anywhere in `self.line`).
+    When subclassing a `StateMachine`, list this class **first** in the
+    inheritance list of the class definition.
+    """
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression search.
+
+        Overrides `StateMachine.match()`.
+
+        Parameter `pattern`: `re` compiled regular expression.
+        """
+        return pattern.search(self.line)
+
+
+class SearchStateMachine(_SearchOverride, StateMachine):
+    """`StateMachine` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class SearchStateMachineWS(_SearchOverride, StateMachineWS):
+    """`StateMachineWS` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class ViewList:
+
+    """
+    List with extended functionality: slices of ViewList objects are child
+    lists, linked to their parents. Changes made to a child list also affect
+    the parent list.  A child list is effectively a "view" (in the SQL sense)
+    of the parent list.  Changes to parent lists, however, do *not* affect
+    active child lists.  If a parent list is changed, any active child lists
+    should be recreated.
+
+    The start and end of the slice can be trimmed using the `trim_start()` and
+    `trim_end()` methods, without affecting the parent list.  The link between
+    child and parent lists can be broken by calling `disconnect()` on the
+    child list.
+
+    Also, ViewList objects keep track of the source & offset of each item. 
+    This information is accessible via the `source()`, `offset()`, and
+    `info()` methods.
+    """
+
+    def __init__(self, initlist=None, source=None, items=None,
+                 parent=None, parent_offset=None):
+        self.data = []
+        """The actual list of data, flattened from various sources."""
+
+        self.items = []
+        """A list of (source, offset) pairs, same length as `self.data`: the
+        source of each line and the offset of each line from the beginning of
+        its source."""
+
+        self.parent = parent
+        """The parent list."""
+
+        self.parent_offset = parent_offset
+        """Offset of this list from the beginning of the parent list."""
+
+        if isinstance(initlist, ViewList):
+            self.data = initlist.data[:]
+            self.items = initlist.items[:]
+        elif initlist is not None:
+            self.data = list(initlist)
+            if items:
+                self.items = items
+            else:
+                self.items = [(source, i) for i in range(len(initlist))]
+        assert len(self.data) == len(self.items), 'data mismatch'
+
+    def __str__(self):
+        return str(self.data)
+
+    def __repr__(self):
+        return '%s(%s, items=%s)' % (self.__class__.__name__,
+                                     self.data, self.items)
+
+    def __lt__(self, other): return self.data <  self.__cast(other)
+    def __le__(self, other): return self.data <= self.__cast(other)
+    def __eq__(self, other): return self.data == self.__cast(other)
+    def __ne__(self, other): return self.data != self.__cast(other)
+    def __gt__(self, other): return self.data >  self.__cast(other)
+    def __ge__(self, other): return self.data >= self.__cast(other)
+    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
+
+    def __cast(self, other):
+        if isinstance(other, ViewList):
+            return other.data
+        else:
+            return other
+
+    def __contains__(self, item): return item in self.data
+    def __len__(self): return len(self.data)
+
+    # The __getitem__()/__setitem__() methods check whether the index
+    # is a slice first, since native list objects start supporting
+    # them directly in Python 2.3 (no exception is raised when
+    # indexing a list with a slice object; they just work).
+
+    def __getitem__(self, i):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1),  'cannot handle slice with stride'
+            return self.__class__(self.data[i.start:i.stop],
+                                  items=self.items[i.start:i.stop],
+                                  parent=self, parent_offset=i.start)
+        else:
+            return self.data[i]
+
+    def __setitem__(self, i, item):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1), 'cannot handle slice with stride'
+            if not isinstance(item, ViewList):
+                raise TypeError('assigning non-ViewList to ViewList slice')
+            self.data[i.start:i.stop] = item.data
+            self.items[i.start:i.stop] = item.items
+            assert len(self.data) == len(self.items), 'data mismatch'
+            if self.parent:
+                self.parent[i.start + self.parent_offset
+                            : i.stop + self.parent_offset] = item
+        else:
+            self.data[i] = item
+            if self.parent:
+                self.parent[i + self.parent_offset] = item
+
+    def __delitem__(self, i):
+        try:
+            del self.data[i]
+            del self.items[i]
+            if self.parent:
+                del self.parent[i + self.parent_offset]
+        except TypeError:
+            assert i.step is None, 'cannot handle slice with stride'
+            del self.data[i.start:i.stop]
+            del self.items[i.start:i.stop]
+            if self.parent:
+                del self.parent[i.start + self.parent_offset
+                                : i.stop + self.parent_offset]
+
+    def __add__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(self.data + other.data,
+                                  items=(self.items + other.items))
+        else:
+            raise TypeError('adding non-ViewList to a ViewList')
+
+    def __radd__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(other.data + self.data,
+                                  items=(other.items + self.items))
+        else:
+            raise TypeError('adding ViewList to a non-ViewList')
+
+    def __iadd__(self, other):
+        if isinstance(other, ViewList):
+            self.data += other.data
+        else:
+            raise TypeError('argument to += must be a ViewList')
+        return self
+
+    def __mul__(self, n):
+        return self.__class__(self.data * n, items=(self.items * n))
+
+    __rmul__ = __mul__
+
+    def __imul__(self, n):
+        self.data *= n
+        self.items *= n
+        return self
+
+    def extend(self, other):
+        if not isinstance(other, ViewList):
+            raise TypeError('extending a ViewList with a non-ViewList')
+        if self.parent:
+            self.parent.insert(len(self.data) + self.parent_offset, other)
+        self.data.extend(other.data)
+        self.items.extend(other.items)
+
+    def append(self, item, source=None, offset=0):
+        if source is None:
+            self.extend(item)
+        else:
+            if self.parent:
+                self.parent.insert(len(self.data) + self.parent_offset, item,
+                                   source, offset)
+            self.data.append(item)
+            self.items.append((source, offset))
+
+    def insert(self, i, item, source=None, offset=0):
+        if source is None:
+            if not isinstance(item, ViewList):
+                raise TypeError('inserting non-ViewList with no source given')
+            self.data[i:i] = item.data
+            self.items[i:i] = item.items
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item)
+        else:
+            self.data.insert(i, item)
+            self.items.insert(i, (source, offset))
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item,
+                                   source, offset)
+
+    def pop(self, i=-1):
+        if self.parent:
+            index = (len(self.data) + i) % len(self.data)
+            self.parent.pop(index + self.parent_offset)
+        self.items.pop(i)
+        return self.data.pop(i)
+
+    def trim_start(self, n=1):
+        """
+        Remove items from the start of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[:n]
+        del self.items[:n]
+        if self.parent:
+            self.parent_offset += n
+
+    def trim_end(self, n=1):
+        """
+        Remove items from the end of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[-n:]
+        del self.items[-n:]
+
+    def remove(self, item):
+        index = self.index(item)
+        del self[index]
+
+    def count(self, item): return self.data.count(item)
+    def index(self, item): return self.data.index(item)
+
+    def reverse(self):
+        self.data.reverse()
+        self.items.reverse()
+        self.parent = None
+
+    def sort(self, *args):
+        tmp = zip(self.data, self.items)
+        tmp.sort(*args)
+        self.data = [entry[0] for entry in tmp]
+        self.items = [entry[1] for entry in tmp]
+        self.parent = None
+
+    def info(self, i):
+        """Return source & offset for index `i`."""
+        try:
+            return self.items[i]
+        except IndexError:
+            if i == len(self.data):     # Just past the end
+                return self.items[i - 1][0], None
+            else:
+                raise
+
+    def source(self, i):
+        """Return source for index `i`."""
+        return self.info(i)[0]
+
+    def offset(self, i):
+        """Return offset for index `i`."""
+        return self.info(i)[1]
+
+    def disconnect(self):
+        """Break link between this list and parent list."""
+        self.parent = None
+
+
+class StringList(ViewList):
+
+    """A `ViewList` with string-specific methods."""
+
+    def trim_left(self, length, start=0, end=sys.maxint):
+        """
+        Trim `length` characters off the beginning of each item, in-place,
+        from index `start` to `end`.  No whitespace-checking is done on the
+        trimmed text.  Does not affect slice parent.
+        """
+        self.data[start:end] = [line[length:]
+                                for line in self.data[start:end]]
+
+    def get_text_block(self, start, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        end = start
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if not line.strip():
+                break
+            if flush_left and (line[0] == ' '):
+                source, offset = self.info(end)
+                raise UnexpectedIndentationError(self[start:end], source,
+                                                 offset + 1)
+            end += 1
+        return self[start:end]
+
+    def get_indented(self, start=0, until_blank=0, strip_indent=1,
+                     block_indent=None, first_indent=None):
+        """
+        Extract and return a StringList of indented lines of text.
+
+        Collect all lines with indentation, determine the minimum indentation,
+        remove the minimum indentation from all indented lines (unless
+        `strip_indent` is false), and return them. All lines up to but not
+        including the first unindented line will be returned.
+
+        :Parameters:
+          - `start`: The index of the first line to examine.
+          - `until_blank`: Stop collecting at the first blank line if true.
+          - `strip_indent`: Strip common leading indent if true (default).
+          - `block_indent`: The indent of the entire block, if known.
+          - `first_indent`: The indent of the first line, if known.
+
+        :Return:
+          - a StringList of indented lines with mininum indent removed;
+          - the amount of the indent;
+          - a boolean: did the indented block finish with a blank line or EOF?
+        """
+        indent = block_indent           # start with None if unknown
+        end = start
+        if block_indent is not None and first_indent is None:
+            first_indent = block_indent
+        if first_indent is not None:
+            end += 1
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if line and (line[0] != ' '
+                         or (block_indent is not None
+                             and line[:block_indent].strip())):
+                # Line not indented or insufficiently indented.
+                # Block finished properly iff the last indented line blank:
+                blank_finish = ((end > start)
+                                and not self.data[end - 1].strip())
+                break
+            stripped = line.lstrip()
+            if not stripped:            # blank line
+                if until_blank:
+                    blank_finish = 1
+                    break
+            elif block_indent is None:
+                line_indent = len(line) - len(stripped)
+                if indent is None:
+                    indent = line_indent
+                else:
+                    indent = min(indent, line_indent)
+            end += 1
+        else:
+            blank_finish = 1            # block ends at end of lines
+        block = self[start:end]
+        if first_indent is not None and block:
+            block.data[0] = block.data[0][first_indent:]
+        if indent and strip_indent:
+            block.trim_left(indent, start=(first_indent is not None))
+        return block, indent or 0, blank_finish
+
+    def get_2D_block(self, top, left, bottom, right, strip_indent=1):
+        block = self[top:bottom]
+        indent = right
+        for i in range(len(block.data)):
+            block.data[i] = line = block.data[i][left:right].rstrip()
+            if line:
+                indent = min(indent, len(line) - len(line.lstrip()))
+        if strip_indent and 0 < indent < right:
+            block.data = [line[indent:] for line in block.data]
+        return block
+
+    def pad_double_width(self, pad_char):
+        """
+        Pad all double-width characters in self by appending `pad_char` to each.
+        For East Asian language support.
+        """
+        if hasattr(unicodedata, 'east_asian_width'):
+            east_asian_width = unicodedata.east_asian_width
+        else:
+            return                      # new in Python 2.4
+        for i in range(len(self.data)):
+            line = self.data[i]
+            if isinstance(line, types.UnicodeType):
+                new = []
+                for char in line:
+                    new.append(char)
+                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
+                        new.append(pad_char)
+                self.data[i] = ''.join(new)
+
+    def replace(self, old, new):
+        """Replace all occurrences of substring `old` with `new`."""
+        for i in range(len(self.data)):
+            self.data[i] = self.data[i].replace(old, new)
+
+
+class StateMachineError(Exception): pass
+class UnknownStateError(StateMachineError): pass
+class DuplicateStateError(StateMachineError): pass
+class UnknownTransitionError(StateMachineError): pass
+class DuplicateTransitionError(StateMachineError): pass
+class TransitionPatternNotFound(StateMachineError): pass
+class TransitionMethodNotFound(StateMachineError): pass
+class UnexpectedIndentationError(StateMachineError): pass
+
+
+class TransitionCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another transition.
+
+    Raise with one argument, the new transition name.
+    """
+
+
+class StateCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another state.
+
+    Raise with one or two arguments: new state name, and an optional new
+    transition name.
+    """
+
+
+def string2lines(astring, tab_width=8, convert_whitespace=0,
+                 whitespace=re.compile('[\v\f]')):
+    """
+    Return a list of one-line strings with tabs expanded, no newlines, and
+    trailing whitespace stripped.
+
+    Each tab is expanded with between 1 and `tab_width` spaces, so that the
+    next character's index becomes a multiple of `tab_width` (8 by default).
+
+    Parameters:
+
+    - `astring`: a multi-line string.
+    - `tab_width`: the number of columns between tab stops.
+    - `convert_whitespace`: convert form feeds and vertical tabs to spaces?
+    """
+    if convert_whitespace:
+        astring = whitespace.sub(' ', astring)
+    return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]
+
+def _exception_data():
+    """
+    Return exception information:
+
+    - the exception's class name;
+    - the exception object;
+    - the name of the file containing the offending code;
+    - the line number of the offending code;
+    - the function name of the offending code.
+    """
+    type, value, traceback = sys.exc_info()
+    while traceback.tb_next:
+        traceback = traceback.tb_next
+    code = traceback.tb_frame.f_code
+    return (type.__name__, value, code.co_filename, traceback.tb_lineno,
+            code.co_name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,172 @@
+# $Id: __init__.py 4975 2007-03-01 18:08:32Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains modules for standard tree transforms available
+to Docutils components. Tree transforms serve a variety of purposes:
+
+- To tie up certain syntax-specific "loose ends" that remain after the
+  initial parsing of the input plaintext. These transforms are used to
+  supplement a limited syntax.
+
+- To automate the internal linking of the document tree (hyperlink
+  references, footnote references, etc.).
+
+- To extract useful information from the document tree. These
+  transforms may be used to construct (for example) indexes and tables
+  of contents.
+
+Each transform is an optional step that a Docutils component may
+choose to perform on the parsed document.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import languages, ApplicationError, TransformSpec
+
+
+class TransformError(ApplicationError): pass
+
+
+class Transform:
+
+    """
+    Docutils transform component abstract base class.
+    """
+
+    default_priority = None
+    """Numerical priority of this transform, 0 through 999 (override)."""
+
+    def __init__(self, document, startnode=None):
+        """
+        Initial setup for in-place document transforms.
+        """
+
+        self.document = document
+        """The document tree to transform."""
+
+        self.startnode = startnode
+        """Node from which to begin the transform.  For many transforms which
+        apply to the document as a whole, `startnode` is not set (i.e. its
+        value is `None`)."""
+
+        self.language = languages.get_language(
+            document.settings.language_code)
+        """Language module local to this document."""
+
+    def apply(self, **kwargs):
+        """Override to apply the transform to the document tree."""
+        raise NotImplementedError('subclass must override this method')
+
+
+class Transformer(TransformSpec):
+
+    """
+    Stores transforms (`Transform` classes) and applies them to document
+    trees.  Also keeps track of components by component type name.
+    """
+
+    def __init__(self, document):
+        self.transforms = []
+        """List of transforms to apply.  Each item is a 3-tuple:
+        ``(priority string, transform class, pending node or None)``."""
+
+        self.unknown_reference_resolvers = []
+        """List of hook functions which assist in resolving references"""
+
+        self.document = document
+        """The `nodes.document` object this Transformer is attached to."""
+
+        self.applied = []
+        """Transforms already applied, in order."""
+
+        self.sorted = 0
+        """Boolean: is `self.tranforms` sorted?"""
+
+        self.components = {}
+        """Mapping of component type name to component object.  Set by
+        `self.populate_from_components()`."""
+
+        self.serialno = 0
+        """Internal serial number to keep track of the add order of
+        transforms."""
+
+    def add_transform(self, transform_class, priority=None, **kwargs):
+        """
+        Store a single transform.  Use `priority` to override the default.
+        `kwargs` is a dictionary whose contents are passed as keyword
+        arguments to the `apply` method of the transform.  This can be used to
+        pass application-specific data to the transform instance.
+        """
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, None, kwargs))
+        self.sorted = 0
+
+    def add_transforms(self, transform_list):
+        """Store multiple transforms, with default priorities."""
+        for transform_class in transform_list:
+            priority_string = self.get_priority_string(
+                transform_class.default_priority)
+            self.transforms.append(
+                (priority_string, transform_class, None, {}))
+        self.sorted = 0
+
+    def add_pending(self, pending, priority=None):
+        """Store a transform with an associated `pending` node."""
+        transform_class = pending.transform
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, pending, {}))
+        self.sorted = 0
+
+    def get_priority_string(self, priority):
+        """
+        Return a string, `priority` combined with `self.serialno`.
+
+        This ensures FIFO order on transforms with identical priority.
+        """
+        self.serialno += 1
+        return '%03d-%03d' % (priority, self.serialno)
+
+    def populate_from_components(self, components):
+        """
+        Store each component's default transforms, with default priorities.
+        Also, store components by type name in a mapping for later lookup.
+        """
+        for component in components:
+            if component is None:
+                continue
+            self.add_transforms(component.get_transforms())
+            self.components[component.component_type] = component
+        self.sorted = 0
+        # Set up all of the reference resolvers for this transformer. Each
+        # component of this transformer is able to register its own helper
+        # functions to help resolve references.
+        unknown_reference_resolvers = []
+        for i in components:
+            unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
+        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
+        decorated_list.sort()
+        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
+
+    def apply_transforms(self):
+        """Apply all of the stored transforms, in priority order."""
+        self.document.reporter.attach_observer(
+            self.document.note_transform_message)
+        while self.transforms:
+            if not self.sorted:
+                # Unsorted initially, and whenever a transform is added.
+                self.transforms.sort()
+                self.transforms.reverse()
+                self.sorted = 1
+            priority, transform_class, pending, kwargs = self.transforms.pop()
+            transform = transform_class(self.document, startnode=pending)
+            transform.apply(**kwargs)
+            self.applied.append((priority, transform_class, pending, kwargs))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/components.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+# $Id: components.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils component-related transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+
+
+class Filter(Transform):
+
+    """
+    Include or exclude elements which depend on a specific Docutils component.
+
+    For use with `nodes.pending` elements.  A "pending" element's dictionary
+    attribute ``details`` must contain the keys "component" and "format".  The
+    value of ``details['component']`` must match the type name of the
+    component the elements depend on (e.g. "writer").  The value of
+    ``details['format']`` is the name of a specific format or context of that
+    component (e.g. "html").  If the matching Docutils component supports that
+    format or context, the "pending" element is replaced by the contents of
+    ``details['nodes']`` (a list of nodes); otherwise, the "pending" element
+    is removed.
+
+    For example, the reStructuredText "meta" directive creates a "pending"
+    element containing a "meta" element (in ``pending.details['nodes']``).
+    Only writers (``pending.details['component'] == 'writer'``) supporting the
+    "html" format (``pending.details['format'] == 'html'``) will include the
+    "meta" element; it will be deleted from the output of all other writers.
+    """
+
+    default_priority = 780
+
+    def apply(self):
+        pending = self.startnode
+        component_type = pending.details['component'] # 'reader' or 'writer'
+        format = pending.details['format']
+        component = self.document.transformer.components[component_type]
+        if component.supports(format):
+            pending.replace_self(pending.details['nodes'])
+        else:
+            pending.parent.remove(pending)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,512 @@
+# $Id: frontmatter.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger, Ueli Schlaepfer <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to the front matter of a document or a section
+(information found before the main text):
+
+- `DocTitle`: Used to transform a lone top level section's title to
+  the document title, promote a remaining lone top-level section's
+  title to the document subtitle, and determine the document's title
+  metadata (document['title']) based on the document title and/or the
+  "title" setting.
+
+- `SectionSubTitle`: Used to transform a lone subsection into a
+  subtitle.
+
+- `DocInfo`: Used to transform a bibliographic field list into docinfo
+  elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class TitlePromoter(Transform):
+
+    """
+    Abstract base class for DocTitle and SectionSubTitle transforms.
+    """
+
+    def promote_title(self, node):
+        """
+        Transform the following tree::
+
+            <node>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                ...
+
+        `node` is normally a document.
+        """
+        # `node` must not have a title yet.
+        assert not (len(node) and isinstance(node[0], nodes.title))
+        section, index = self.candidate_index(node)
+        if index is None:
+            return None
+        # Transfer the section's attributes to the node:
+        node.attributes.update(section.attributes)
+        # setup_child is called automatically for all nodes.
+        node[:] = (section[:1]        # section title
+                   + node[:index]     # everything that was in the
+                                      # node before the section
+                   + section[1:])     # everything that was in the section
+        assert isinstance(node[0], nodes.title)
+        return 1
+
+    def promote_subtitle(self, node):
+        """
+        Transform the following node tree::
+
+            <node>
+                <title>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                <subtitle>
+                ...
+        """
+        subsection, index = self.candidate_index(node)
+        if index is None:
+            return None
+        subtitle = nodes.subtitle()
+        # Transfer the subsection's attributes to the new subtitle:
+        # This causes trouble with list attributes!  To do: Write a
+        # test case which catches direct access to the `attributes`
+        # dictionary and/or write a test case which shows problems in
+        # this particular case.
+        subtitle.attributes.update(subsection.attributes)
+        # We're losing the subtitle's attributes here!  To do: Write a
+        # test case which shows this behavior.
+        # Transfer the contents of the subsection's title to the
+        # subtitle:
+        subtitle[:] = subsection[0][:]
+        node[:] = (node[:1]       # title
+                   + [subtitle]
+                   # everything that was before the section:
+                   + node[1:index]
+                   # everything that was in the subsection:
+                   + subsection[1:])
+        return 1
+
+    def candidate_index(self, node):
+        """
+        Find and return the promotion candidate and its index.
+
+        Return (None, None) if no valid candidate was found.
+        """
+        index = node.first_child_not_matching_class(
+            nodes.PreBibliographic)
+        if index is None or len(node) > (index + 1) or \
+               not isinstance(node[index], nodes.section):
+            return None, None
+        else:
+            return node[index], index
+
+
+class DocTitle(TitlePromoter):
+
+    """
+    In reStructuredText_, there is no way to specify a document title
+    and subtitle explicitly. Instead, we can supply the document title
+    (and possibly the subtitle as well) implicitly, and use this
+    two-step transform to "raise" or "promote" the title(s) (and their
+    corresponding section contents) to the document level.
+
+    1. If the document contains a single top-level section as its
+       first non-comment element, the top-level section's title
+       becomes the document's title, and the top-level section's
+       contents become the document's immediate contents. The lone
+       top-level section header must be the first non-comment element
+       in the document.
+
+       For example, take this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           A paragraph.
+
+       Once parsed, it looks like this::
+
+           <document>
+               <section names="top-level title">
+                   <title>
+                       Top-Level Title
+                   <paragraph>
+                       A paragraph.
+
+       After running the DocTitle transform, we have::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <paragraph>
+                   A paragraph.
+
+    2. If step 1 successfully determines the document title, we
+       continue by checking for a subtitle.
+
+       If the lone top-level section itself contains a single
+       second-level section as its first non-comment element, that
+       section's title is promoted to the document's subtitle, and
+       that section's contents become the document's immediate
+       contents. Given this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           Second-Level Title
+           ~~~~~~~~~~~~~~~~~~
+
+           A paragraph.
+
+       After parsing and running the Section Promotion transform, the
+       result is::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <subtitle names="second-level title">
+                   Second-Level Title
+               <paragraph>
+                   A paragraph.
+
+       (Note that the implicit hyperlink target generated by the
+       "Second-Level Title" is preserved on the "subtitle" element
+       itself.)
+
+    Any comment elements occurring before the document title or
+    subtitle are accumulated and inserted as the first body elements
+    after the title(s).
+
+    This transform also sets the document's metadata title
+    (document['title']).
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    """
+
+    default_priority = 320
+
+    def set_metadata(self):
+        """
+        Set document['title'] metadata title from the following
+        sources, listed in order of priority:
+
+        * Existing document['title'] attribute.
+        * "title" setting.
+        * Document title node (as promoted by promote_title).
+        """
+        if not self.document.hasattr('title'):
+            if self.document.settings.title is not None:
+                self.document['title'] = self.document.settings.title
+            elif len(self.document) and isinstance(self.document[0], nodes.title):
+                self.document['title'] = self.document[0].astext()
+
+    def apply(self):
+        if getattr(self.document.settings, 'doctitle_xform', 1):
+            # promote_(sub)title defined in TitlePromoter base class.
+            if self.promote_title(self.document):
+                # If a title has been promoted, also try to promote a
+                # subtitle.
+                self.promote_subtitle(self.document)
+        # Set document['title'].
+        self.set_metadata()
+
+
+class SectionSubTitle(TitlePromoter):
+
+    """
+    This works like document subtitles, but for sections.  For example, ::
+
+        <section>
+            <title>
+                Title
+            <section>
+                <title>
+                    Subtitle
+                ...
+
+    is transformed into ::
+
+        <section>
+            <title>
+                Title
+            <subtitle>
+                Subtitle
+            ...
+
+    For details refer to the docstring of DocTitle.
+    """
+
+    default_priority = 350
+
+    def apply(self):
+        if not getattr(self.document.settings, 'sectsubtitle_xform', 1):
+            return
+        for section in self.document.traverse(nodes.section):
+            # On our way through the node tree, we are deleting
+            # sections, but we call self.promote_subtitle for those
+            # sections nonetheless.  To do: Write a test case which
+            # shows the problem and discuss on Docutils-develop.
+            self.promote_subtitle(section)
+
+
+class DocInfo(Transform):
+
+    """
+    This transform is specific to the reStructuredText_ markup syntax;
+    see "Bibliographic Fields" in the `reStructuredText Markup
+    Specification`_ for a high-level description. This transform
+    should be run *after* the `DocTitle` transform.
+
+    Given a field list as the first non-comment element after the
+    document title and subtitle (if present), registered bibliographic
+    field names are transformed to the corresponding DTD elements,
+    becoming child elements of the "docinfo" element (except for a
+    dedication and/or an abstract, which become "topic" elements after
+    "docinfo").
+
+    For example, given this document fragment after parsing::
+
+        <document>
+            <title>
+                Document Title
+            <field_list>
+                <field>
+                    <field_name>
+                        Author
+                    <field_body>
+                        <paragraph>
+                            A. Name
+                <field>
+                    <field_name>
+                        Status
+                    <field_body>
+                        <paragraph>
+                            $RCSfile$
+            ...
+
+    After running the bibliographic field list transform, the
+    resulting document tree would look like this::
+
+        <document>
+            <title>
+                Document Title
+            <docinfo>
+                <author>
+                    A. Name
+                <status>
+                    frontmatter.py
+            ...
+
+    The "Status" field contained an expanded RCS keyword, which is
+    normally (but optionally) cleaned up by the transform. The sole
+    contents of the field body must be a paragraph containing an
+    expanded RCS keyword of the form "$keyword: expansion text $". Any
+    RCS keyword can be processed in any bibliographic field. The
+    dollar signs and leading RCS keyword name are removed. Extra
+    processing is done for the following RCS keywords:
+
+    - "RCSfile" expands to the name of the file in the RCS or CVS
+      repository, which is the name of the source file with a ",v"
+      suffix appended. The transform will remove the ",v" suffix.
+
+    - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC
+      time zone). The RCS Keywords transform will extract just the
+      date itself and transform it to an ISO 8601 format date, as in
+      "2000-12-31".
+
+      (Since the source file for this text is itself stored under CVS,
+      we can't show an example of the "Date" RCS keyword because we
+      can't prevent any RCS keywords used in this explanation from
+      being expanded. Only the "RCSfile" keyword is stable; its
+      expansion text changes only if the file name changes.)
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    .. _reStructuredText Markup Specification:
+       http://docutils.sf.net/docs/ref/rst/restructuredtext.html
+    """
+
+    default_priority = 340
+
+    biblio_nodes = {
+          'author': nodes.author,
+          'authors': nodes.authors,
+          'organization': nodes.organization,
+          'address': nodes.address,
+          'contact': nodes.contact,
+          'version': nodes.version,
+          'revision': nodes.revision,
+          'status': nodes.status,
+          'date': nodes.date,
+          'copyright': nodes.copyright,
+          'dedication': nodes.topic,
+          'abstract': nodes.topic}
+    """Canonical field name (lowcased) to node class name mapping for
+    bibliographic fields (field_list)."""
+
+    def apply(self):
+        if not getattr(self.document.settings, 'docinfo_xform', 1):
+            return
+        document = self.document
+        index = document.first_child_not_matching_class(
+              nodes.PreBibliographic)
+        if index is None:
+            return
+        candidate = document[index]
+        if isinstance(candidate, nodes.field_list):
+            biblioindex = document.first_child_not_matching_class(
+                  (nodes.Titular, nodes.Decorative))
+            nodelist = self.extract_bibliographic(candidate)
+            del document[index]         # untransformed field list (candidate)
+            document[biblioindex:biblioindex] = nodelist
+
+    def extract_bibliographic(self, field_list):
+        docinfo = nodes.docinfo()
+        bibliofields = self.language.bibliographic_fields
+        labels = self.language.labels
+        topics = {'dedication': None, 'abstract': None}
+        for field in field_list:
+            try:
+                name = field[0][0].astext()
+                normedname = nodes.fully_normalize_name(name)
+                if not (len(field) == 2 and bibliofields.has_key(normedname)
+                        and self.check_empty_biblio_field(field, name)):
+                    raise TransformError
+                canonical = bibliofields[normedname]
+                biblioclass = self.biblio_nodes[canonical]
+                if issubclass(biblioclass, nodes.TextElement):
+                    if not self.check_compound_biblio_field(field, name):
+                        raise TransformError
+                    utils.clean_rcs_keywords(
+                          field[1][0], self.rcs_keyword_substitutions)
+                    docinfo.append(biblioclass('', '', *field[1][0]))
+                elif issubclass(biblioclass, nodes.authors):
+                    self.extract_authors(field, name, docinfo)
+                elif issubclass(biblioclass, nodes.topic):
+                    if topics[canonical]:
+                        field[-1] += self.document.reporter.warning(
+                            'There can only be one "%s" field.' % name,
+                            base_node=field)
+                        raise TransformError
+                    title = nodes.title(name, labels[canonical])
+                    topics[canonical] = biblioclass(
+                        '', title, classes=[canonical], *field[1].children)
+                else:
+                    docinfo.append(biblioclass('', *field[1].children))
+            except TransformError:
+                if len(field[-1]) == 1 \
+                       and isinstance(field[-1][0], nodes.paragraph):
+                    utils.clean_rcs_keywords(
+                        field[-1][0], self.rcs_keyword_substitutions)
+                docinfo.append(field)
+        nodelist = []
+        if len(docinfo) != 0:
+            nodelist.append(docinfo)
+        for name in ('dedication', 'abstract'):
+            if topics[name]:
+                nodelist.append(topics[name])
+        return nodelist
+
+    def check_empty_biblio_field(self, field, name):
+        if len(field[-1]) < 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract empty bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    def check_compound_biblio_field(self, field, name):
+        if len(field[-1]) > 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract compound bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        if not isinstance(field[-1][0], nodes.paragraph):
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract bibliographic field "%s" containing '
+                  'anything other than a single paragraph.' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    rcs_keyword_substitutions = [
+          (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+'
+                      r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'),
+          (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),]
+
+    def extract_authors(self, field, name, docinfo):
+        try:
+            if len(field[1]) == 1:
+                if isinstance(field[1][0], nodes.paragraph):
+                    authors = self.authors_from_one_paragraph(field)
+                elif isinstance(field[1][0], nodes.bullet_list):
+                    authors = self.authors_from_bullet_list(field)
+                else:
+                    raise TransformError
+            else:
+                authors = self.authors_from_paragraphs(field)
+            authornodes = [nodes.author('', '', *author)
+                           for author in authors if author]
+            if len(authornodes) >= 1:
+                docinfo.append(nodes.authors('', *authornodes))
+            else:
+                raise TransformError
+        except TransformError:
+            field[-1] += self.document.reporter.warning(
+                  'Bibliographic field "%s" incompatible with extraction: '
+                  'it must contain either a single paragraph (with authors '
+                  'separated by one of "%s"), multiple paragraphs (one per '
+                  'author), or a bullet list with one paragraph (one author) '
+                  'per item.'
+                  % (name, ''.join(self.language.author_separators)),
+                  base_node=field)
+            raise
+
+    def authors_from_one_paragraph(self, field):
+        text = field[1][0].astext().strip()
+        if not text:
+            raise TransformError
+        for authorsep in self.language.author_separators:
+            authornames = text.split(authorsep)
+            if len(authornames) > 1:
+                break
+        authornames = [author.strip() for author in authornames]
+        authors = [[nodes.Text(author)] for author in authornames if author]
+        return authors
+
+    def authors_from_bullet_list(self, field):
+        authors = []
+        for item in field[1][0]:
+            if len(item) != 1 or not isinstance(item[0], nodes.paragraph):
+                raise TransformError
+            authors.append(item[0].children)
+        if not authors:
+            raise TransformError
+        return authors
+
+    def authors_from_paragraphs(self, field):
+        for item in field[1]:
+            if not isinstance(item, nodes.paragraph):
+                raise TransformError
+        authors = [item.children for item in field[1]]
+        return authors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/misc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,143 @@
+# $Id: misc.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import Transform, TransformError
+
+
+class CallBack(Transform):
+
+    """
+    Inserts a callback into a document.  The callback is called when the
+    transform is applied, which is determined by its priority.
+
+    For use with `nodes.pending` elements.  Requires a ``details['callback']``
+    entry, a bound method or function which takes one parameter: the pending
+    node.  Other data can be stored in the ``details`` attribute or in the
+    object hosting the callback method.
+    """
+
+    default_priority = 990
+
+    def apply(self):
+        pending = self.startnode
+        pending.details['callback'](pending)
+        pending.parent.remove(pending)
+
+
+class ClassAttribute(Transform):
+
+    """
+    Move the "class" attribute specified in the "pending" node into the
+    immediately following non-comment element.
+    """
+
+    default_priority = 210
+
+    def apply(self):
+        pending = self.startnode
+        parent = pending.parent
+        child = pending
+        while parent:
+            # Check for appropriate following siblings:
+            for index in range(parent.index(child) + 1, len(parent)):
+                element = parent[index]
+                if (isinstance(element, nodes.Invisible) or
+                    isinstance(element, nodes.system_message)):
+                    continue
+                element['classes'] += pending.details['class']
+                pending.parent.remove(pending)
+                return
+            else:
+                # At end of section or container; apply to sibling
+                child = parent
+                parent = parent.parent
+        error = self.document.reporter.error(
+            'No suitable element following "%s" directive'
+            % pending.details['directive'],
+            nodes.literal_block(pending.rawsource, pending.rawsource),
+            line=pending.line)
+        pending.replace_self(error)
+
+
+class Transitions(Transform):
+
+    """
+    Move transitions at the end of sections up the tree.  Complain
+    on transitions after a title, at the beginning or end of the
+    document, and after another transition.
+
+    For example, transform this::
+
+        <section>
+            ...
+            <transition>
+        <section>
+            ...
+
+    into this::
+
+        <section>
+            ...
+        <transition>
+        <section>
+            ...
+    """
+
+    default_priority = 830
+
+    def apply(self):
+        for node in self.document.traverse(nodes.transition):
+            self.visit_transition(node)
+
+    def visit_transition(self, node):
+        index = node.parent.index(node)
+        error = None
+        if (index == 0 or
+            isinstance(node.parent[0], nodes.title) and
+            (index == 1 or
+             isinstance(node.parent[1], nodes.subtitle) and
+             index == 2)):
+            assert (isinstance(node.parent, nodes.document) or
+                    isinstance(node.parent, nodes.section))
+            error = self.document.reporter.error(
+                'Document or section may not begin with a transition.',
+                line=node.line)
+        elif isinstance(node.parent[index - 1], nodes.transition):
+            error = self.document.reporter.error(
+                'At least one body element must separate transitions; '
+                'adjacent transitions are not allowed.', line=node.line)
+        if error:
+            # Insert before node and update index.
+            node.parent.insert(index, error)
+            index += 1
+        assert index < len(node.parent)
+        if index != len(node.parent) - 1:
+            # No need to move the node.
+            return
+        # Node behind which the transition is to be moved.
+        sibling = node
+        # While sibling is the last node of its parent.
+        while index == len(sibling.parent) - 1:
+            sibling = sibling.parent
+            # If sibling is the whole document (i.e. it has no parent).
+            if sibling.parent is None:
+                # Transition at the end of document.  Do not move the
+                # transition up, and place an error behind.
+                error = self.document.reporter.error(
+                    'Document may not end with a transition.',
+                    line=node.line)
+                node.parent.insert(node.parent.index(node) + 1, error)
+                return
+            index = sibling.parent.index(sibling)
+        # Remove the original transition node.
+        node.parent.remove(node)
+        # Insert the transition after the sibling.
+        sibling.parent.insert(index + 1, node)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/parts.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,164 @@
+# $Id: parts.py 4891 2007-01-22 08:35:57Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class SectNum(Transform):
+
+    """
+    Automatically assigns numbers to the titles of document sections.
+
+    It is possible to limit the maximum section level for which the numbers
+    are added.  For those sections that are auto-numbered, the "autonum"
+    attribute is set, informing the contents table generator that a different
+    form of the TOC should be used.
+    """
+
+    default_priority = 710
+    """Should be applied before `Contents`."""
+
+    def apply(self):
+        self.maxdepth = self.startnode.details.get('depth', sys.maxint)
+        self.startvalue = self.startnode.details.get('start', 1)
+        self.prefix = self.startnode.details.get('prefix', '')
+        self.suffix = self.startnode.details.get('suffix', '')
+        self.startnode.parent.remove(self.startnode)
+        if self.document.settings.sectnum_xform:
+            self.update_section_numbers(self.document)
+
+    def update_section_numbers(self, node, prefix=(), depth=0):
+        depth += 1
+        if prefix:
+            sectnum = 1
+        else:
+            sectnum = self.startvalue
+        for child in node:
+            if isinstance(child, nodes.section):
+                numbers = prefix + (str(sectnum),)
+                title = child[0]
+                # Use &nbsp; for spacing:
+                generated = nodes.generated(
+                    '', (self.prefix + '.'.join(numbers) + self.suffix
+                         +  u'\u00a0' * 3),
+                    classes=['sectnum'])
+                title.insert(0, generated)
+                title['auto'] = 1
+                if depth < self.maxdepth:
+                    self.update_section_numbers(child, numbers, depth)
+                sectnum += 1
+
+
+class Contents(Transform):
+
+    """
+    This transform generates a table of contents from the entire document tree
+    or from a single branch.  It locates "section" elements and builds them
+    into a nested bullet list, which is placed within a "topic" created by the
+    contents directive.  A title is either explicitly specified, taken from
+    the appropriate language module, or omitted (local table of contents).
+    The depth may be specified.  Two-way references between the table of
+    contents and section titles are generated (requires Writer support).
+
+    This transform requires a startnode, which which contains generation
+    options and provides the location for the generated table of contents (the
+    startnode is replaced by the table of contents "topic").
+    """
+
+    default_priority = 720
+
+    def apply(self):
+        details = self.startnode.details
+        if details.has_key('local'):
+            startnode = self.startnode.parent.parent
+            while not (isinstance(startnode, nodes.section)
+                       or isinstance(startnode, nodes.document)):
+                # find the ToC root: a direct ancestor of startnode
+                startnode = startnode.parent
+        else:
+            startnode = self.document
+        self.toc_id = self.startnode.parent['ids'][0]
+        if details.has_key('backlinks'):
+            self.backlinks = details['backlinks']
+        else:
+            self.backlinks = self.document.settings.toc_backlinks
+        contents = self.build_contents(startnode)
+        if len(contents):
+            self.startnode.replace_self(contents)
+        else:
+            self.startnode.parent.parent.remove(self.startnode.parent)
+
+    def build_contents(self, node, level=0):
+        level += 1
+        sections = [sect for sect in node if isinstance(sect, nodes.section)]
+        entries = []
+        autonum = 0
+        depth = self.startnode.details.get('depth', sys.maxint)
+        for section in sections:
+            title = section[0]
+            auto = title.get('auto')    # May be set by SectNum.
+            entrytext = self.copy_and_filter(title)
+            reference = nodes.reference('', '', refid=section['ids'][0],
+                                        *entrytext)
+            ref_id = self.document.set_id(reference)
+            entry = nodes.paragraph('', '', reference)
+            item = nodes.list_item('', entry)
+            if ( self.backlinks in ('entry', 'top')
+                 and title.next_node(nodes.reference) is None):
+                if self.backlinks == 'entry':
+                    title['refid'] = ref_id
+                elif self.backlinks == 'top':
+                    title['refid'] = self.toc_id
+            if level < depth:
+                subsects = self.build_contents(section, level)
+                item += subsects
+            entries.append(item)
+        if entries:
+            contents = nodes.bullet_list('', *entries)
+            if auto:
+                contents['classes'].append('auto-toc')
+            return contents
+        else:
+            return []
+
+    def copy_and_filter(self, node):
+        """Return a copy of a title, with references, images, etc. removed."""
+        visitor = ContentsFilter(self.document)
+        node.walkabout(visitor)
+        return visitor.get_entry_text()
+
+
+class ContentsFilter(nodes.TreeCopyVisitor):
+
+    def get_entry_text(self):
+        return self.get_tree_copy().children
+
+    def visit_citation_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        if node.hasattr('alt'):
+            self.parent.append(nodes.Text(node['alt']))
+        raise nodes.SkipNode
+
+    def ignore_node_but_process_children(self, node):
+        raise nodes.SkipDeparture
+
+    visit_interpreted = ignore_node_but_process_children
+    visit_problematic = ignore_node_but_process_children
+    visit_reference = ignore_node_but_process_children
+    visit_target = ignore_node_but_process_children
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/peps.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,304 @@
+# $Id: peps.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for PEP processing.
+
+- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
+  field list, but some entries get processed.
+- `Contents`: Auto-inserts a table of contents.
+- `PEPZero`: Special processing for PEP 0.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils, languages
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+from docutils.transforms import parts, references, misc
+
+
+class Headers(Transform):
+
+    """
+    Process fields in a PEP's initial RFC-2822 header.
+    """
+
+    default_priority = 360
+
+    pep_url = 'pep-%04d'
+    pep_cvs_url = ('http://svn.python.org/view/*checkout*'
+                   '/peps/trunk/pep-%04d.txt')
+    rcs_keyword_substitutions = (
+          (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),)
+
+    def apply(self):
+        if not len(self.document):
+            # @@@ replace these DataErrors with proper system messages
+            raise DataError('Document tree is empty.')
+        header = self.document[0]
+        if not isinstance(header, nodes.field_list) or \
+              'rfc2822' not in header['classes']:
+            raise DataError('Document does not begin with an RFC-2822 '
+                            'header; it is not a PEP.')
+        pep = None
+        for field in header:
+            if field[0].astext().lower() == 'pep': # should be the first field
+                value = field[1].astext()
+                try:
+                    pep = int(value)
+                    cvs_url = self.pep_cvs_url % pep
+                except ValueError:
+                    pep = value
+                    cvs_url = None
+                    msg = self.document.reporter.warning(
+                        '"PEP" header must contain an integer; "%s" is an '
+                        'invalid value.' % pep, base_node=field)
+                    msgid = self.document.set_id(msg)
+                    prb = nodes.problematic(value, value or '(none)',
+                                            refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    if len(field[1]):
+                        field[1][0][:] = [prb]
+                    else:
+                        field[1] += nodes.paragraph('', '', prb)
+                break
+        if pep is None:
+            raise DataError('Document does not contain an RFC-2822 "PEP" '
+                            'header.')
+        if pep == 0:
+            # Special processing for PEP 0.
+            pending = nodes.pending(PEPZero)
+            self.document.insert(1, pending)
+            self.document.note_pending(pending)
+        if len(header) < 2 or header[1][0].astext().lower() != 'title':
+            raise DataError('No title!')
+        for field in header:
+            name = field[0].astext().lower()
+            body = field[1]
+            if len(body) > 1:
+                raise DataError('PEP header field body contains multiple '
+                                'elements:\n%s' % field.pformat(level=1))
+            elif len(body) == 1:
+                if not isinstance(body[0], nodes.paragraph):
+                    raise DataError('PEP header field body may only contain '
+                                    'a single paragraph:\n%s'
+                                    % field.pformat(level=1))
+            elif name == 'last-modified':
+                date = time.strftime(
+                      '%d-%b-%Y',
+                      time.localtime(os.stat(self.document['source'])[8]))
+                if cvs_url:
+                    body += nodes.paragraph(
+                        '', '', nodes.reference('', date, refuri=cvs_url))
+            else:
+                # empty
+                continue
+            para = body[0]
+            if name == 'author':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node))
+            elif name == 'discussions-to':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node, pep))
+            elif name in ('replaces', 'replaced-by', 'requires'):
+                newbody = []
+                space = nodes.Text(' ')
+                for refpep in re.split(',?\s+', body.astext()):
+                    pepno = int(refpep)
+                    newbody.append(nodes.reference(
+                        refpep, refpep,
+                        refuri=(self.document.settings.pep_base_url
+                                + self.pep_url % pepno)))
+                    newbody.append(space)
+                para[:] = newbody[:-1] # drop trailing space
+            elif name == 'last-modified':
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+                if cvs_url:
+                    date = para.astext()
+                    para[:] = [nodes.reference('', date, refuri=cvs_url)]
+            elif name == 'content-type':
+                pep_type = para.astext()
+                uri = self.document.settings.pep_base_url + self.pep_url % 12
+                para[:] = [nodes.reference('', pep_type, refuri=uri)]
+            elif name == 'version' and len(body):
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+
+
+class Contents(Transform):
+
+    """
+    Insert an empty table of contents topic and a transform placeholder into
+    the document after the RFC 2822 header.
+    """
+
+    default_priority = 380
+
+    def apply(self):
+        language = languages.get_language(self.document.settings.language_code)
+        name = language.labels['contents']
+        title = nodes.title('', name)
+        topic = nodes.topic('', title, classes=['contents'])
+        name = nodes.fully_normalize_name(name)
+        if not self.document.has_name(name):
+            topic['names'].append(name)
+        self.document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents)
+        topic += pending
+        self.document.insert(1, topic)
+        self.document.note_pending(pending)
+
+
+class TargetNotes(Transform):
+
+    """
+    Locate the "References" section, insert a placeholder for an external
+    target footnote insertion transform at the end, and schedule the
+    transform to run immediately.
+    """
+
+    default_priority = 520
+
+    def apply(self):
+        doc = self.document
+        i = len(doc) - 1
+        refsect = copyright = None
+        while i >= 0 and isinstance(doc[i], nodes.section):
+            title_words = doc[i][0].astext().lower().split()
+            if 'references' in title_words:
+                refsect = doc[i]
+                break
+            elif 'copyright' in title_words:
+                copyright = i
+            i -= 1
+        if not refsect:
+            refsect = nodes.section()
+            refsect += nodes.title('', 'References')
+            doc.set_id(refsect)
+            if copyright:
+                # Put the new "References" section before "Copyright":
+                doc.insert(copyright, refsect)
+            else:
+                # Put the new "References" section at end of doc:
+                doc.append(refsect)
+        pending = nodes.pending(references.TargetNotes)
+        refsect.append(pending)
+        self.document.note_pending(pending, 0)
+        pending = nodes.pending(misc.CallBack,
+                                details={'callback': self.cleanup_callback})
+        refsect.append(pending)
+        self.document.note_pending(pending, 1)
+
+    def cleanup_callback(self, pending):
+        """
+        Remove an empty "References" section.
+
+        Called after the `references.TargetNotes` transform is complete.
+        """
+        if len(pending.parent) == 2:    # <title> and <pending>
+            pending.parent.parent.remove(pending.parent)
+
+
+class PEPZero(Transform):
+
+    """
+    Special processing for PEP 0.
+    """
+
+    default_priority =760
+
+    def apply(self):
+        visitor = PEPZeroSpecial(self.document)
+        self.document.walk(visitor)
+        self.startnode.parent.remove(self.startnode)
+
+
+class PEPZeroSpecial(nodes.SparseNodeVisitor):
+
+    """
+    Perform the special processing needed by PEP 0:
+
+    - Mask email addresses.
+
+    - Link PEP numbers in the second column of 4-column tables to the PEPs
+      themselves.
+    """
+
+    pep_url = Headers.pep_url
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        node.replace_self(mask_email(node))
+
+    def visit_field_list(self, node):
+        if 'rfc2822' in node['classes']:
+            raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        self.pep_table = node['cols'] == 4
+        self.entry = 0
+
+    def visit_colspec(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2:
+            node['classes'].append('num')
+
+    def visit_row(self, node):
+        self.entry = 0
+
+    def visit_entry(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2 and len(node) == 1:
+            node['classes'].append('num')
+            p = node[0]
+            if isinstance(p, nodes.paragraph) and len(p) == 1:
+                text = p.astext()
+                try:
+                    pep = int(text)
+                    ref = (self.document.settings.pep_base_url
+                           + self.pep_url % pep)
+                    p[0] = nodes.reference(text, text, refuri=ref)
+                except ValueError:
+                    pass
+
+
+non_masked_addresses = ('peps@python.org',
+                        'python-list@python.org',
+                        'python-dev@python.org')
+
+def mask_email(ref, pepno=None):
+    """
+    Mask the email address in `ref` and return a replacement node.
+
+    `ref` is returned unchanged if it contains no email address.
+
+    For email addresses such as "user@host", mask the address as "user at
+    host" (text) to thwart simple email address harvesters (except for those
+    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
+    return a reference including a default email subject.
+    """
+    if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'):
+        if ref['refuri'][8:] in non_masked_addresses:
+            replacement = ref[0]
+        else:
+            replacement_text = ref.astext().replace('@', '&#32;&#97;t&#32;')
+            replacement = nodes.raw('', replacement_text, format='html')
+        if pepno is None:
+            return replacement
+        else:
+            ref['refuri'] += '?subject=PEP%%20%s' % pepno
+            ref[:] = [replacement]
+            return ref
+    else:
+        return ref
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/references.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,896 @@
+# $Id: references.py 5018 2007-03-12 21:39:31Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for resolving references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class PropagateTargets(Transform):
+
+    """
+    Propagate empty internal targets to the next element.
+
+    Given the following nodes::
+
+        <target ids="internal1" names="internal1">
+        <target anonymous="1" ids="id1">
+        <target ids="internal2" names="internal2">
+        <paragraph>
+            This is a test.
+
+    PropagateTargets propagates the ids and names of the internal
+    targets preceding the paragraph to the paragraph itself::
+
+        <target refid="internal1">
+        <target anonymous="1" refid="id1">
+        <target refid="internal2">
+        <paragraph ids="internal2 id1 internal1" names="internal2 internal1">
+            This is a test.
+    """
+
+    default_priority = 260
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            # Only block-level targets without reference (like ".. target:"):
+            if (isinstance(target.parent, nodes.TextElement) or
+                (target.hasattr('refid') or target.hasattr('refuri') or
+                 target.hasattr('refname'))):
+                continue
+            assert len(target) == 0, 'error: block-level target has children'
+            next_node = target.next_node(ascend=1)
+            # Do not move names and ids into Invisibles (we'd lose the
+            # attributes) or different Targetables (e.g. footnotes).
+            if (next_node is not None and
+                ((not isinstance(next_node, nodes.Invisible) and
+                  not isinstance(next_node, nodes.Targetable)) or
+                 isinstance(next_node, nodes.target))):
+                next_node['ids'].extend(target['ids'])
+                next_node['names'].extend(target['names'])
+                # Set defaults for next_node.expect_referenced_by_name/id.
+                if not hasattr(next_node, 'expect_referenced_by_name'):
+                    next_node.expect_referenced_by_name = {}
+                if not hasattr(next_node, 'expect_referenced_by_id'):
+                    next_node.expect_referenced_by_id = {}
+                for id in target['ids']:
+                    # Update IDs to node mapping.
+                    self.document.ids[id] = next_node
+                    # If next_node is referenced by id ``id``, this
+                    # target shall be marked as referenced.
+                    next_node.expect_referenced_by_id[id] = target
+                for name in target['names']:
+                    next_node.expect_referenced_by_name[name] = target
+                # If there are any expect_referenced_by_... attributes
+                # in target set, copy them to next_node.
+                next_node.expect_referenced_by_name.update(
+                    getattr(target, 'expect_referenced_by_name', {}))
+                next_node.expect_referenced_by_id.update(
+                    getattr(target, 'expect_referenced_by_id', {}))
+                # Set refid to point to the first former ID of target
+                # which is now an ID of next_node.
+                target['refid'] = target['ids'][0]
+                # Clear ids and names; they have been moved to
+                # next_node.
+                target['ids'] = []
+                target['names'] = []
+                self.document.note_refid(target)
+
+
+class AnonymousHyperlinks(Transform):
+
+    """
+    Link anonymous references to targets.  Given::
+
+        <paragraph>
+            <reference anonymous="1">
+                internal
+            <reference anonymous="1">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+
+    Corresponding references are linked via "refid" or resolved via "refuri"::
+
+        <paragraph>
+            <reference anonymous="1" refid="id1">
+                text
+            <reference anonymous="1" refuri="http://external">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+    """
+
+    default_priority = 440
+
+    def apply(self):
+        anonymous_refs = []
+        anonymous_targets = []
+        for node in self.document.traverse(nodes.reference):
+            if node.get('anonymous'):
+                anonymous_refs.append(node)
+        for node in self.document.traverse(nodes.target):
+            if node.get('anonymous'):
+                anonymous_targets.append(node)
+        if len(anonymous_refs) \
+              != len(anonymous_targets):
+            msg = self.document.reporter.error(
+                  'Anonymous hyperlink mismatch: %s references but %s '
+                  'targets.\nSee "backrefs" attribute for IDs.'
+                  % (len(anonymous_refs), len(anonymous_targets)))
+            msgid = self.document.set_id(msg)
+            for ref in anonymous_refs:
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            return
+        for ref, target in zip(anonymous_refs, anonymous_targets):
+            target.referenced = 1
+            while 1:
+                if target.hasattr('refuri'):
+                    ref['refuri'] = target['refuri']
+                    ref.resolved = 1
+                    break
+                else:
+                    if not target['ids']:
+                        # Propagated target.
+                        target = self.document.ids[target['refid']]
+                        continue
+                    ref['refid'] = target['ids'][0]
+                    self.document.note_refid(ref)
+                    break
+
+
+class IndirectHyperlinks(Transform):
+
+    """
+    a) Indirect external references::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refname="direct external">
+
+       The "refuri" attribute is migrated back to all indirect targets
+       from the final direct target (i.e. a target not referring to
+       another indirect target)::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refuri="http://indirect">
+
+       Once the attribute is migrated, the preexisting "refname" attribute
+       is dropped.
+
+    b) Indirect internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refname="indirect internal">
+                   indirect internal
+           <target id="id2" name="indirect internal 2"
+               refname="final target">
+           <target id="id3" name="indirect internal"
+               refname="indirect internal 2">
+
+       Targets which indirectly refer to an internal target become one-hop
+       indirect (their "refid" attributes are directly set to the internal
+       target's "id"). References which indirectly refer to an internal
+       target become direct internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refid="id1">
+                   indirect internal
+           <target id="id2" name="indirect internal 2" refid="id1">
+           <target id="id3" name="indirect internal" refid="id1">
+    """
+
+    default_priority = 460
+
+    def apply(self):
+        for target in self.document.indirect_targets:
+            if not target.resolved:
+                self.resolve_indirect_target(target)
+            self.resolve_indirect_references(target)
+
+    def resolve_indirect_target(self, target):
+        refname = target.get('refname')
+        if refname is None:
+            reftarget_id = target['refid']
+        else:
+            reftarget_id = self.document.nameids.get(refname)
+            if not reftarget_id:
+                # Check the unknown_reference_resolvers
+                for resolver_function in \
+                        self.document.transformer.unknown_reference_resolvers:
+                    if resolver_function(target):
+                        break
+                else:
+                    self.nonexistent_indirect_target(target)
+                return
+        reftarget = self.document.ids[reftarget_id]
+        reftarget.note_referenced_by(id=reftarget_id)
+        if isinstance(reftarget, nodes.target) \
+               and not reftarget.resolved and reftarget.hasattr('refname'):
+            if hasattr(target, 'multiply_indirect'):
+                #and target.multiply_indirect):
+                #del target.multiply_indirect
+                self.circular_indirect_reference(target)
+                return
+            target.multiply_indirect = 1
+            self.resolve_indirect_target(reftarget) # multiply indirect
+            del target.multiply_indirect
+        if reftarget.hasattr('refuri'):
+            target['refuri'] = reftarget['refuri']
+            if target.has_key('refid'):
+                del target['refid']
+        elif reftarget.hasattr('refid'):
+            target['refid'] = reftarget['refid']
+            self.document.note_refid(target)
+        else:
+            if reftarget['ids']:
+                target['refid'] = reftarget_id
+                self.document.note_refid(target)
+            else:
+                self.nonexistent_indirect_target(target)
+                return
+        if refname is not None:
+            del target['refname']
+        target.resolved = 1
+
+    def nonexistent_indirect_target(self, target):
+        if self.document.nameids.has_key(target['refname']):
+            self.indirect_target_error(target, 'which is a duplicate, and '
+                                       'cannot be used as a unique reference')
+        else:
+            self.indirect_target_error(target, 'which does not exist')
+
+    def circular_indirect_reference(self, target):
+        self.indirect_target_error(target, 'forming a circular reference')
+
+    def indirect_target_error(self, target, explanation):
+        naming = ''
+        reflist = []
+        if target['names']:
+            naming = '"%s" ' % target['names'][0]
+        for name in target['names']:
+            reflist.extend(self.document.refnames.get(name, []))
+        for id in target['ids']:
+            reflist.extend(self.document.refids.get(id, []))
+        naming += '(id="%s")' % target['ids'][0]
+        msg = self.document.reporter.error(
+              'Indirect hyperlink target %s refers to target "%s", %s.'
+              % (naming, target['refname'], explanation), base_node=target)
+        msgid = self.document.set_id(msg)
+        for ref in utils.uniq(reflist):
+            prb = nodes.problematic(
+                  ref.rawsource, ref.rawsource, refid=msgid)
+            prbid = self.document.set_id(prb)
+            msg.add_backref(prbid)
+            ref.replace_self(prb)
+        target.resolved = 1
+
+    def resolve_indirect_references(self, target):
+        if target.hasattr('refid'):
+            attname = 'refid'
+            call_method = self.document.note_refid
+        elif target.hasattr('refuri'):
+            attname = 'refuri'
+            call_method = None
+        else:
+            return
+        attval = target[attname]
+        for name in target['names']:
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+        for id in target['ids']:
+            reflist = self.document.refids.get(id, [])
+            if reflist:
+                target.note_referenced_by(id=id)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refid']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+
+
+class ExternalTargets(Transform):
+
+    """
+    Given::
+
+        <paragraph>
+            <reference refname="direct external">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+
+    The "refname" attribute is replaced by the direct "refuri" attribute::
+
+        <paragraph>
+            <reference refuri="http://direct">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+    """
+
+    default_priority = 640
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if target.hasattr('refuri'):
+                refuri = target['refuri']
+                for name in target['names']:
+                    reflist = self.document.refnames.get(name, [])
+                    if reflist:
+                        target.note_referenced_by(name=name)
+                    for ref in reflist:
+                        if ref.resolved:
+                            continue
+                        del ref['refname']
+                        ref['refuri'] = refuri
+                        ref.resolved = 1
+
+
+class InternalTargets(Transform):
+
+    default_priority = 660
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if not target.hasattr('refuri') and not target.hasattr('refid'):
+                self.resolve_reference_ids(target)
+
+    def resolve_reference_ids(self, target):
+        """
+        Given::
+
+            <paragraph>
+                <reference refname="direct internal">
+                    direct internal
+            <target id="id1" name="direct internal">
+
+        The "refname" attribute is replaced by "refid" linking to the target's
+        "id"::
+
+            <paragraph>
+                <reference refid="id1">
+                    direct internal
+            <target id="id1" name="direct internal">
+        """
+        for name in target['names']:
+            refid = self.document.nameids[name]
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref['refid'] = refid
+                ref.resolved = 1
+
+
+class Footnotes(Transform):
+
+    """
+    Assign numbers to autonumbered footnotes, and resolve links to footnotes,
+    citations, and their references.
+
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refname="footnote">
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2">
+            <footnote auto="1" id="id3">
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote">
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Auto-numbered footnotes have attribute ``auto="1"`` and no label.
+    Auto-numbered footnote_references have no reference text (they're
+    empty elements). When resolving the numbering, a ``label`` element
+    is added to the beginning of the ``footnote``, and reference text
+    to the ``footnote_reference``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refid="footnote">
+                    2
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2" refid="id3">
+                    1
+            <footnote auto="1" id="id3" backrefs="id2">
+                <label>
+                    1
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote" backrefs="id1">
+                <label>
+                    2
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Note that the footnotes are not in the same order as the references.
+
+    The labels and reference text are added to the auto-numbered ``footnote``
+    and ``footnote_reference`` elements.  Footnote elements are backlinked to
+    their references via "refids" attributes.  References are assigned "id"
+    and "refid" attributes.
+
+    After adding labels and reference text, the "auto" attributes can be
+    ignored.
+    """
+
+    default_priority = 620
+
+    autofootnote_labels = None
+    """Keep track of unlabeled autonumbered footnotes."""
+
+    symbols = [
+          # Entries 1-4 and 6 below are from section 12.51 of
+          # The Chicago Manual of Style, 14th edition.
+          '*',                          # asterisk/star
+          u'\u2020',                    # dagger &dagger;
+          u'\u2021',                    # double dagger &Dagger;
+          u'\u00A7',                    # section mark &sect;
+          u'\u00B6',                    # paragraph mark (pilcrow) &para;
+                                        # (parallels ['||'] in CMoS)
+          '#',                          # number sign
+          # The entries below were chosen arbitrarily.
+          u'\u2660',                    # spade suit &spades;
+          u'\u2665',                    # heart suit &hearts;
+          u'\u2666',                    # diamond suit &diams;
+          u'\u2663',                    # club suit &clubs;
+          ]
+
+    def apply(self):
+        self.autofootnote_labels = []
+        startnum = self.document.autofootnote_start
+        self.document.autofootnote_start = self.number_footnotes(startnum)
+        self.number_footnote_references(startnum)
+        self.symbolize_footnotes()
+        self.resolve_footnotes_and_citations()
+
+    def number_footnotes(self, startnum):
+        """
+        Assign numbers to autonumbered footnotes.
+
+        For labeled autonumbered footnotes, copy the number over to
+        corresponding footnote references.
+        """
+        for footnote in self.document.autofootnotes:
+            while 1:
+                label = str(startnum)
+                startnum += 1
+                if not self.document.nameids.has_key(label):
+                    break
+            footnote.insert(0, nodes.label('', label))
+            for name in footnote['names']:
+                for ref in self.document.footnote_refs.get(name, []):
+                    ref += nodes.Text(label)
+                    ref.delattr('refname')
+                    assert len(footnote['ids']) == len(ref['ids']) == 1
+                    ref['refid'] = footnote['ids'][0]
+                    footnote.add_backref(ref['ids'][0])
+                    self.document.note_refid(ref)
+                    ref.resolved = 1
+            if not footnote['names'] and not footnote['dupnames']:
+                footnote['names'].append(label)
+                self.document.note_explicit_target(footnote, footnote)
+                self.autofootnote_labels.append(label)
+        return startnum
+
+    def number_footnote_references(self, startnum):
+        """Assign numbers to autonumbered footnote references."""
+        i = 0
+        for ref in self.document.autofootnote_refs:
+            if ref.resolved or ref.hasattr('refid'):
+                continue
+            try:
+                label = self.autofootnote_labels[i]
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many autonumbered footnote references: only %s '
+                      'corresponding footnotes available.'
+                      % len(self.autofootnote_labels), base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.autofootnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refname'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            ref += nodes.Text(label)
+            id = self.document.nameids[label]
+            footnote = self.document.ids[id]
+            ref['refid'] = id
+            self.document.note_refid(ref)
+            assert len(ref['ids']) == 1
+            footnote.add_backref(ref['ids'][0])
+            ref.resolved = 1
+            i += 1
+
+    def symbolize_footnotes(self):
+        """Add symbols indexes to "[*]"-style footnotes and references."""
+        labels = []
+        for footnote in self.document.symbol_footnotes:
+            reps, index = divmod(self.document.symbol_footnote_start,
+                                 len(self.symbols))
+            labeltext = self.symbols[index] * (reps + 1)
+            labels.append(labeltext)
+            footnote.insert(0, nodes.label('', labeltext))
+            self.document.symbol_footnote_start += 1
+            self.document.set_id(footnote)
+        i = 0
+        for ref in self.document.symbol_footnote_refs:
+            try:
+                ref += nodes.Text(labels[i])
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many symbol footnote references: only %s '
+                      'corresponding footnotes available.' % len(labels),
+                      base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.symbol_footnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refid'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            footnote = self.document.symbol_footnotes[i]
+            assert len(footnote['ids']) == 1
+            ref['refid'] = footnote['ids'][0]
+            self.document.note_refid(ref)
+            footnote.add_backref(ref['ids'][0])
+            i += 1
+
+    def resolve_footnotes_and_citations(self):
+        """
+        Link manually-labeled footnotes and citations to/from their
+        references.
+        """
+        for footnote in self.document.footnotes:
+            for label in footnote['names']:
+                if self.document.footnote_refs.has_key(label):
+                    reflist = self.document.footnote_refs[label]
+                    self.resolve_references(footnote, reflist)
+        for citation in self.document.citations:
+            for label in citation['names']:
+                if self.document.citation_refs.has_key(label):
+                    reflist = self.document.citation_refs[label]
+                    self.resolve_references(citation, reflist)
+
+    def resolve_references(self, note, reflist):
+        assert len(note['ids']) == 1
+        id = note['ids'][0]
+        for ref in reflist:
+            if ref.resolved:
+                continue
+            ref.delattr('refname')
+            ref['refid'] = id
+            assert len(ref['ids']) == 1
+            note.add_backref(ref['ids'][0])
+            ref.resolved = 1
+        note.resolved = 1
+
+
+class CircularSubstitutionDefinitionError(Exception): pass
+
+
+class Substitutions(Transform):
+
+    """
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                The
+                <substitution_reference refname="biohazard">
+                    biohazard
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+
+    The ``substitution_reference`` will simply be replaced by the
+    contents of the corresponding ``substitution_definition``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                The
+                <image alt="biohazard" uri="biohazard.png">
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+    """
+
+    default_priority = 220
+    """The Substitutions transform has to be applied very early, before
+    `docutils.tranforms.frontmatter.DocTitle` and others."""
+
+    def apply(self):
+        defs = self.document.substitution_defs
+        normed = self.document.substitution_names
+        subreflist = self.document.traverse(nodes.substitution_reference)
+        nested = {}
+        for ref in subreflist:
+            refname = ref['refname']
+            key = None
+            if defs.has_key(refname):
+                key = refname
+            else:
+                normed_name = refname.lower()
+                if normed.has_key(normed_name):
+                    key = normed[normed_name]
+            if key is None:
+                msg = self.document.reporter.error(
+                      'Undefined substitution referenced: "%s".'
+                      % refname, base_node=ref)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            else:
+                subdef = defs[key]
+                parent = ref.parent
+                index = parent.index(ref)
+                if  (subdef.attributes.has_key('ltrim')
+                     or subdef.attributes.has_key('trim')):
+                    if index > 0 and isinstance(parent[index - 1],
+                                                nodes.Text):
+                        parent.replace(parent[index - 1],
+                                       parent[index - 1].rstrip())
+                if  (subdef.attributes.has_key('rtrim')
+                     or subdef.attributes.has_key('trim')):
+                    if  (len(parent) > index + 1
+                         and isinstance(parent[index + 1], nodes.Text)):
+                        parent.replace(parent[index + 1],
+                                       parent[index + 1].lstrip())
+                subdef_copy = subdef.deepcopy()
+                try:
+                    # Take care of nested substitution references:
+                    for nested_ref in subdef_copy.traverse(
+                          nodes.substitution_reference):
+                        nested_name = normed[nested_ref['refname'].lower()]
+                        if nested_name in nested.setdefault(nested_name, []):
+                            raise CircularSubstitutionDefinitionError
+                        else:
+                            nested[nested_name].append(key)
+                            subreflist.append(nested_ref)
+                except CircularSubstitutionDefinitionError:
+                    parent = ref.parent
+                    if isinstance(parent, nodes.substitution_definition):
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition detected:',
+                            nodes.literal_block(parent.rawsource,
+                                                parent.rawsource),
+                            line=parent.line, base_node=parent)
+                        parent.replace_self(msg)
+                    else:
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition referenced: "%s".'
+                            % refname, base_node=ref)
+                        msgid = self.document.set_id(msg)
+                        prb = nodes.problematic(
+                            ref.rawsource, ref.rawsource, refid=msgid)
+                        prbid = self.document.set_id(prb)
+                        msg.add_backref(prbid)
+                        ref.replace_self(prb)
+                else:
+                    ref.replace_self(subdef_copy.children)
+
+
+class TargetNotes(Transform):
+
+    """
+    Creates a footnote for each external target in the text, and corresponding
+    footnote references after each reference.
+    """
+
+    default_priority = 540
+    """The TargetNotes transform has to be applied after `IndirectHyperlinks`
+    but before `Footnotes`."""
+
+
+    def __init__(self, document, startnode):
+        Transform.__init__(self, document, startnode=startnode)
+
+        self.classes = startnode.details.get('class', [])
+
+    def apply(self):
+        notes = {}
+        nodelist = []
+        for target in self.document.traverse(nodes.target):
+            # Only external targets.
+            if not target.hasattr('refuri'):
+                continue
+            names = target['names']
+            refs = []
+            for name in names:
+                refs.extend(self.document.refnames.get(name, []))
+            if not refs:
+                continue
+            footnote = self.make_target_footnote(target['refuri'], refs,
+                                                 notes)
+            if not notes.has_key(target['refuri']):
+                notes[target['refuri']] = footnote
+                nodelist.append(footnote)
+        # Take care of anonymous references.
+        for ref in self.document.traverse(nodes.reference):
+            if not ref.get('anonymous'):
+                continue
+            if ref.hasattr('refuri'):
+                footnote = self.make_target_footnote(ref['refuri'], [ref],
+                                                     notes)
+                if not notes.has_key(ref['refuri']):
+                    notes[ref['refuri']] = footnote
+                    nodelist.append(footnote)
+        self.startnode.replace_self(nodelist)
+
+    def make_target_footnote(self, refuri, refs, notes):
+        if notes.has_key(refuri):  # duplicate?
+            footnote = notes[refuri]
+            assert len(footnote['names']) == 1
+            footnote_name = footnote['names'][0]
+        else:                           # original
+            footnote = nodes.footnote()
+            footnote_id = self.document.set_id(footnote)
+            # Use uppercase letters and a colon; they can't be
+            # produced inside names by the parser.
+            footnote_name = 'TARGET_NOTE: ' + footnote_id
+            footnote['auto'] = 1
+            footnote['names'] = [footnote_name]
+            footnote_paragraph = nodes.paragraph()
+            footnote_paragraph += nodes.reference('', refuri, refuri=refuri)
+            footnote += footnote_paragraph
+            self.document.note_autofootnote(footnote)
+            self.document.note_explicit_target(footnote, footnote)
+        for ref in refs:
+            if isinstance(ref, nodes.target):
+                continue
+            refnode = nodes.footnote_reference(
+                refname=footnote_name, auto=1)
+            refnode['classes'] += self.classes
+            self.document.note_autofootnote_ref(refnode)
+            self.document.note_footnote_ref(refnode)
+            index = ref.parent.index(ref) + 1
+            reflist = [refnode]
+            if not utils.get_trim_footnote_ref_space(self.document.settings):
+                if self.classes:
+                    reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
+                else:
+                    reflist.insert(0, nodes.Text(' '))
+            ref.parent.insert(index, reflist)
+        return footnote
+
+
+class DanglingReferences(Transform):
+
+    """
+    Check for dangling references (incl. footnote & citation) and for
+    unreferenced targets.
+    """
+
+    default_priority = 850
+
+    def apply(self):
+        visitor = DanglingReferencesVisitor(
+            self.document,
+            self.document.transformer.unknown_reference_resolvers)
+        self.document.walk(visitor)
+        # *After* resolving all references, check for unreferenced
+        # targets:
+        for target in self.document.traverse(nodes.target):
+            if not target.referenced:
+                if target.get('anonymous'):
+                    # If we have unreferenced anonymous targets, there
+                    # is already an error message about anonymous
+                    # hyperlink mismatch; no need to generate another
+                    # message.
+                    continue
+                if target['names']:
+                    naming = target['names'][0]
+                elif target['ids']:
+                    naming = target['ids'][0]
+                else:
+                    # Hack: Propagated targets always have their refid
+                    # attribute set.
+                    naming = target['refid']
+                self.document.reporter.info(
+                    'Hyperlink target "%s" is not referenced.'
+                    % naming, base_node=target)
+
+
+class DanglingReferencesVisitor(nodes.SparseNodeVisitor):
+    
+    def __init__(self, document, unknown_reference_resolvers):
+        nodes.SparseNodeVisitor.__init__(self, document)
+        self.document = document
+        self.unknown_reference_resolvers = unknown_reference_resolvers
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        if node.resolved or not node.hasattr('refname'):
+            return
+        refname = node['refname']
+        id = self.document.nameids.get(refname)
+        if id is None:
+            for resolver_function in self.unknown_reference_resolvers:
+                if resolver_function(node):
+                    break
+            else:
+                if self.document.nameids.has_key(refname):
+                    msg = self.document.reporter.error(
+                        'Duplicate target name, cannot be used as a unique '
+                        'reference: "%s".' % (node['refname']), base_node=node)
+                else:
+                    msg = self.document.reporter.error(
+                        'Unknown target name: "%s".' % (node['refname']),
+                        base_node=node)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      node.rawsource, node.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                node.replace_self(prb)
+        else:
+            del node['refname']
+            node['refid'] = id
+            self.document.ids[id].note_referenced_by(id=id)
+            node.resolved = 1
+
+    visit_footnote_reference = visit_citation_reference = visit_reference
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/universal.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,203 @@
+# $Id: universal.py 4913 2007-02-12 04:05:20Z goodger $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms needed by most or all documents:
+
+- `Decorations`: Generate a document's header & footer.
+- `Messages`: Placement of system messages stored in
+  `nodes.document.transform_messages`.
+- `TestMessages`: Like `Messages`, used on test runs.
+- `FinalReferences`: Resolve remaining references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import sys
+import time
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class Decorations(Transform):
+
+    """
+    Populate a document's decoration element (header, footer).
+    """
+
+    default_priority = 820
+
+    def apply(self):
+        header_nodes = self.generate_header()
+        if header_nodes:
+            decoration = self.document.get_decoration()
+            header = decoration.get_header()
+            header.extend(header_nodes)
+        footer_nodes = self.generate_footer()
+        if footer_nodes:
+            decoration = self.document.get_decoration()
+            footer = decoration.get_footer()
+            footer.extend(footer_nodes)
+
+    def generate_header(self):
+        return None
+
+    def generate_footer(self):
+        # @@@ Text is hard-coded for now.
+        # Should be made dynamic (language-dependent).
+        settings = self.document.settings
+        if settings.generator or settings.datestamp or settings.source_link \
+               or settings.source_url:
+            text = []
+            if settings.source_link and settings._source \
+                   or settings.source_url:
+                if settings.source_url:
+                    source = settings.source_url
+                else:
+                    source = utils.relative_path(settings._destination,
+                                                 settings._source)
+                text.extend([
+                    nodes.reference('', 'View document source',
+                                    refuri=source),
+                    nodes.Text('.\n')])
+            if settings.datestamp:
+                datestamp = time.strftime(settings.datestamp, time.gmtime())
+                text.append(nodes.Text('Generated on: ' + datestamp + '.\n'))
+            if settings.generator:
+                text.extend([
+                    nodes.Text('Generated by '),
+                    nodes.reference('', 'Docutils', refuri=
+                                    'http://docutils.sourceforge.net/'),
+                    nodes.Text(' from '),
+                    nodes.reference('', 'reStructuredText', refuri='http://'
+                                    'docutils.sourceforge.net/rst.html'),
+                    nodes.Text(' source.\n')])
+            return [nodes.paragraph('', '', *text)]
+        else:
+            return None
+
+
+class ExposeInternals(Transform):
+
+    """
+    Expose internal attributes if ``expose_internals`` setting is set.
+    """
+
+    default_priority = 840
+
+    def not_Text(self, node):
+        return not isinstance(node, nodes.Text)
+
+    def apply(self):
+        if self.document.settings.expose_internals:
+            for node in self.document.traverse(self.not_Text):
+                for att in self.document.settings.expose_internals:
+                    value = getattr(node, att, None)
+                    if value is not None:
+                        node['internal:' + att] = value
+
+
+class Messages(Transform):
+
+    """
+    Place any system messages generated after parsing into a dedicated section
+    of the document.
+    """
+
+    default_priority = 860
+
+    def apply(self):
+        unfiltered = self.document.transform_messages
+        threshold = self.document.reporter.report_level
+        messages = []
+        for msg in unfiltered:
+            if msg['level'] >= threshold and not msg.parent:
+                messages.append(msg)
+        if messages:
+            section = nodes.section(classes=['system-messages'])
+            # @@@ get this from the language module?
+            section += nodes.title('', 'Docutils System Messages')
+            section += messages
+            self.document.transform_messages[:] = []
+            self.document += section
+
+
+class FilterMessages(Transform):
+
+    """
+    Remove system messages below verbosity threshold.
+    """
+
+    default_priority = 870
+
+    def apply(self):
+        for node in self.document.traverse(nodes.system_message):
+            if node['level'] < self.document.reporter.report_level:
+                node.parent.remove(node)
+
+
+class TestMessages(Transform):
+
+    """
+    Append all post-parse system messages to the end of the document.
+
+    Used for testing purposes.
+    """
+
+    default_priority = 880
+
+    def apply(self):
+        for msg in self.document.transform_messages:
+            if not msg.parent:
+                self.document += msg
+
+
+class StripComments(Transform):
+
+    """
+    Remove comment elements from the document tree (only if the
+    ``strip_comments`` setting is enabled).
+    """
+
+    default_priority = 740
+
+    def apply(self):
+        if self.document.settings.strip_comments:
+            for node in self.document.traverse(nodes.comment):
+                node.parent.remove(node)
+
+
+class StripClassesAndElements(Transform):
+
+    """
+    Remove from the document tree all elements with classes in
+    `self.document.settings.strip_elements_with_classes` and all "classes"
+    attribute values in `self.document.settings.strip_classes`.
+    """
+
+    default_priority = 750
+
+    def apply(self):
+        if not (self.document.settings.strip_elements_with_classes
+                or self.document.settings.strip_classes):
+            return
+        # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
+        self.strip_elements = dict(
+            [(key, None)
+             for key in (self.document.settings.strip_elements_with_classes
+                         or [])])
+        self.strip_classes = dict(
+            [(key, None) for key in (self.document.settings.strip_classes
+                                     or [])])
+        for node in self.document.traverse(self.check_classes):
+            node.parent.remove(node)
+
+    def check_classes(self, node):
+        if isinstance(node, nodes.Element):
+            for class_value in node['classes'][:]:
+                if class_value in self.strip_classes:
+                    node['classes'].remove(class_value)
+                if class_value in self.strip_elements:
+                    return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+# $Id: writer_aux.py 5174 2007-05-31 00:01:52Z wiemann $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Auxiliary transforms mainly to be used by Writer components.
+
+This module is called "writer_aux" because otherwise there would be
+conflicting imports like this one::
+
+    from docutils import writers
+    from docutils.transforms import writers
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils, languages
+from docutils.transforms import Transform
+
+
+class Compound(Transform):
+
+    """
+    Flatten all compound paragraphs.  For example, transform ::
+
+        <compound>
+            <paragraph>
+            <literal_block>
+            <paragraph>
+
+    into ::
+
+        <paragraph>
+        <literal_block classes="continued">
+        <paragraph classes="continued">
+    """
+
+    default_priority = 910
+
+    def apply(self):
+        for compound in self.document.traverse(nodes.compound):
+            first_child = 1
+            for child in compound:
+                if first_child:
+                    if not isinstance(child, nodes.Invisible):
+                        first_child = 0
+                else:
+                    child['classes'].append('continued')
+            # Substitute children for compound.
+            compound.replace_self(compound[:])
+
+
+class Admonitions(Transform):
+
+    """
+    Transform specific admonitions, like this:
+
+        <note>
+            <paragraph>
+                 Note contents ...
+
+    into generic admonitions, like this::
+
+        <admonition classes="note">
+            <title>
+                Note
+            <paragraph>
+                Note contents ...
+
+    The admonition title is localized.
+    """
+
+    default_priority = 920
+
+    def apply(self):
+        lcode = self.document.settings.language_code
+        language = languages.get_language(lcode)
+        for node in self.document.traverse(nodes.Admonition):
+            node_name = node.__class__.__name__
+            # Set class, so that we know what node this admonition came from.
+            node['classes'].append(node_name)
+            if not isinstance(node, nodes.admonition):
+                # Specific admonition.  Transform into a generic admonition.
+                admonition = nodes.admonition(node.rawsource, *node.children,
+                                              **node.attributes)
+                title = nodes.title('', language.labels[node_name])
+                admonition.insert(0, title)
+                node.replace_self(admonition)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/urischemes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,136 @@
+# $Id: urischemes.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+`schemes` is a dictionary with lowercase URI addressing schemes as
+keys and descriptions as values. It was compiled from the index at
+http://www.iana.org/assignments/uri-schemes (revised 2005-11-28)
+and an older list at http://www.w3.org/Addressing/schemes.html.
+"""
+
+# Many values are blank and should be filled in with useful descriptions.
+
+schemes = {
+      'about': 'provides information on Navigator',
+      'acap': 'Application Configuration Access Protocol; RFC 2244',
+      'addbook': "To add vCard entries to Communicator's Address Book",
+      'afp': 'Apple Filing Protocol',
+      'afs': 'Andrew File System global file names',
+      'aim': 'AOL Instant Messenger',
+      'callto': 'for NetMeeting links',
+      'castanet': 'Castanet Tuner URLs for Netcaster',
+      'chttp': 'cached HTTP supported by RealPlayer',
+      'cid': 'content identifier; RFC 2392',
+      'crid': 'TV-Anytime Content Reference Identifier; RFC 4078',
+      'data': ('allows inclusion of small data items as "immediate" data; '
+               'RFC 2397'),
+      'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518',
+      'dict': 'dictionary service protocol; RFC 2229',
+      'dns': 'Domain Name System resources',
+      'eid': ('External ID; non-URL data; general escape mechanism to allow '
+              'access to information for applications that are too '
+              'specialized to justify their own schemes'),
+      'fax': ('a connection to a terminal that can handle telefaxes '
+              '(facsimiles); RFC 2806'),
+      'feed' : 'NetNewsWire feed',
+      'file': 'Host-specific file names; RFC 1738',
+      'finger': '',
+      'freenet': '',
+      'ftp': 'File Transfer Protocol; RFC 1738',
+      'go': 'go; RFC 3368',
+      'gopher': 'The Gopher Protocol',
+      'gsm-sms': ('Global System for Mobile Communications Short Message '
+                  'Service'),
+      'h323': ('video (audiovisual) communication on local area networks; '
+               'RFC 3508'),
+      'h324': ('video and audio communications over low bitrate connections '
+               'such as POTS modem connections'),
+      'hdl': 'CNRI handle system',
+      'hnews': 'an HTTP-tunneling variant of the NNTP news protocol',
+      'http': 'Hypertext Transfer Protocol; RFC 2616',
+      'https': 'HTTP over SSL; RFC 2818',
+      'hydra': 'SubEthaEdit URI.  See http://www.codingmonkeys.de/subethaedit.',
+      'iioploc': 'Internet Inter-ORB Protocol Location?',
+      'ilu': 'Inter-Language Unification',
+      'im': 'Instant Messaging; RFC 3860',
+      'imap': 'Internet Message Access Protocol; RFC 2192',
+      'info': 'Information Assets with Identifiers in Public Namespaces',
+      'ior': 'CORBA interoperable object reference',
+      'ipp': 'Internet Printing Protocol; RFC 3510',
+      'irc': 'Internet Relay Chat',
+      'iris.beep': 'iris.beep; RFC 3983',
+      'iseek' : 'See www.ambrosiasw.com;  a little util for OS X.',
+      'jar': 'Java archive',
+      'javascript': ('JavaScript code; evaluates the expression after the '
+                     'colon'),
+      'jdbc': 'JDBC connection URI.',
+      'ldap': 'Lightweight Directory Access Protocol',
+      'lifn': '',
+      'livescript': '',
+      'lrq': '',
+      'mailbox': 'Mail folder access',
+      'mailserver': 'Access to data available from mail servers',
+      'mailto': 'Electronic mail address; RFC 2368',
+      'md5': '',
+      'mid': 'message identifier; RFC 2392',
+      'mocha': '',
+      'modem': ('a connection to a terminal that can handle incoming data '
+                'calls; RFC 2806'),
+      'mtqp': 'Message Tracking Query Protocol; RFC 3887',
+      'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656',
+      'news': 'USENET news; RFC 1738',
+      'nfs': 'Network File System protocol; RFC 2224',
+      'nntp': 'USENET news using NNTP access; RFC 1738',
+      'opaquelocktoken': 'RFC 2518',
+      'phone': '',
+      'pop': 'Post Office Protocol; RFC 2384',
+      'pop3': 'Post Office Protocol v3',
+      'pres': 'Presence; RFC 3859',
+      'printer': '',
+      'prospero': 'Prospero Directory Service; RFC 4157',
+      'rdar' : ('URLs found in Darwin source '
+                '(http://www.opensource.apple.com/darwinsource/).'),
+      'res': '',
+      'rtsp': 'real time streaming protocol; RFC 2326',
+      'rvp': '',
+      'rwhois': '',
+      'rx': 'Remote Execution',
+      'sdp': '',
+      'service': 'service location; RFC 2609',
+      'shttp': 'secure hypertext transfer protocol',
+      'sip': 'Session Initiation Protocol; RFC 3261',
+      'sips': 'secure session intitiaion protocol; RFC 3261',
+      'smb': 'SAMBA filesystems.',
+      'snews': 'For NNTP postings via SSL',
+      'snmp': 'Simple Network Management Protocol; RFC 4088',
+      'soap.beep': 'RFC 3288',
+      'soap.beeps': 'RFC 3288',
+      'ssh': 'Reference to interactive sessions via ssh.',
+      't120': 'real time data conferencing (audiographics)',
+      'tag': 'RFC 4151',
+      'tcp': '',
+      'tel': ('a connection to a terminal that handles normal voice '
+              'telephone calls, a voice mailbox or another voice messaging '
+              'system or a service that can be operated using DTMF tones; '
+              'RFC 2806.'),
+      'telephone': 'telephone',
+      'telnet': 'Reference to interactive sessions; RFC 4248',
+      'tftp': 'Trivial File Transfer Protocol; RFC 3617',
+      'tip': 'Transaction Internet Protocol; RFC 2371',
+      'tn3270': 'Interactive 3270 emulation sessions',
+      'tv': '',
+      'urn': 'Uniform Resource Name; RFC 2141',
+      'uuid': '',
+      'vemmi': 'versatile multimedia interface; RFC 2122',
+      'videotex': '',
+      'view-source': 'displays HTML code that was generated with JavaScript',
+      'wais': 'Wide Area Information Servers; RFC 4156',
+      'whodp': '',
+      'whois++': 'Distributed directory service.',
+      'x-man-page': ('Opens man page in Terminal.app on OS X '
+                     '(see macosxhints.com)'),
+      'xmlrpc.beep': 'RFC 3529',
+      'xmlrpc.beeps': 'RFC 3529',
+      'z39.50r': 'Z39.50 Retrieval; RFC 2056',
+      'z39.50s': 'Z39.50 Session; RFC 2056',}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/utils.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,593 @@
+# $Id: utils.py 5040 2007-04-03 17:41:59Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous utilities for the documentation utilities.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import os.path
+import types
+import warnings
+import unicodedata
+from types import StringType, UnicodeType
+from docutils import ApplicationError, DataError
+from docutils import nodes
+
+
+class SystemMessage(ApplicationError):
+
+    def __init__(self, system_message, level):
+        Exception.__init__(self, system_message.astext())
+        self.level = level
+
+
+class SystemMessagePropagation(ApplicationError): pass
+
+
+class Reporter:
+
+    """
+    Info/warning/error reporter and ``system_message`` element generator.
+
+    Five levels of system messages are defined, along with corresponding
+    methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`.
+
+    There is typically one Reporter object per process.  A Reporter object is
+    instantiated with thresholds for reporting (generating warnings) and
+    halting processing (raising exceptions), a switch to turn debug output on
+    or off, and an I/O stream for warnings.  These are stored as instance
+    attributes.
+
+    When a system message is generated, its level is compared to the stored
+    thresholds, and a warning or error is generated as appropriate.  Debug
+    messages are produced iff the stored debug switch is on, independently of
+    other thresholds.  Message output is sent to the stored warning stream if
+    not set to ''.
+
+    The Reporter class also employs a modified form of the "Observer" pattern
+    [GoF95]_ to track system messages generated.  The `attach_observer` method
+    should be called before parsing, with a bound method or function which
+    accepts system messages.  The observer can be removed with
+    `detach_observer`, and another added in its place.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    levels = 'DEBUG INFO WARNING ERROR SEVERE'.split()
+    """List of names for system message levels, indexed by level."""
+
+    # system message level constants:
+    (DEBUG_LEVEL,
+     INFO_LEVEL,
+     WARNING_LEVEL,
+     ERROR_LEVEL,
+     SEVERE_LEVEL) = range(5)
+
+    def __init__(self, source, report_level, halt_level, stream=None,
+                 debug=0, encoding='ascii', error_handler='replace'):
+        """
+        :Parameters:
+            - `source`: The path to or description of the source data.
+            - `report_level`: The level at or above which warning output will
+              be sent to `stream`.
+            - `halt_level`: The level at or above which `SystemMessage`
+              exceptions will be raised, halting execution.
+            - `debug`: Show debug (level=0) system messages?
+            - `stream`: Where warning output is sent.  Can be file-like (has a
+              ``.write`` method), a string (file name, opened for writing),
+              '' (empty string, for discarding all stream messages) or
+              `None` (implies `sys.stderr`; default).
+            - `encoding`: The encoding for stderr output.
+            - `error_handler`: The error handler for stderr output encoding.
+        """
+
+        self.source = source
+        """The path to or description of the source data."""
+
+        self.encoding = encoding
+        """The character encoding for the stderr output."""
+
+        self.error_handler = error_handler
+        """The character encoding error handler."""
+
+        self.debug_flag = debug
+        """Show debug (level=0) system messages?"""
+
+        self.report_level = report_level
+        """The level at or above which warning output will be sent
+        to `self.stream`."""
+
+        self.halt_level = halt_level
+        """The level at or above which `SystemMessage` exceptions
+        will be raised, halting execution."""
+
+        if stream is None:
+            stream = sys.stderr
+        elif type(stream) in (StringType, UnicodeType):
+            # Leave stream untouched if it's ''.
+            if stream != '':
+                if type(stream) == StringType:
+                    stream = open(stream, 'w')
+                elif type(stream) == UnicodeType:
+                    stream = open(stream.encode(), 'w')
+
+        self.stream = stream
+        """Where warning output is sent."""
+
+        self.observers = []
+        """List of bound methods or functions to call with each system_message
+        created."""
+
+        self.max_level = -1
+        """The highest level system message generated so far."""
+
+    def set_conditions(self, category, report_level, halt_level,
+                       stream=None, debug=0):
+        warnings.warn('docutils.utils.Reporter.set_conditions deprecated; '
+                      'set attributes via configuration settings or directly',
+                      DeprecationWarning, stacklevel=2)
+        self.report_level = report_level
+        self.halt_level = halt_level
+        if stream is None:
+            stream = sys.stderr
+        self.stream = stream
+        self.debug_flag = debug
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes one
+        argument, a `nodes.system_message` instance.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self, message):
+        for observer in self.observers:
+            observer(message)
+
+    def system_message(self, level, message, *children, **kwargs):
+        """
+        Return a system_message object.
+
+        Raise an exception or generate a warning if appropriate.
+        """
+        attributes = kwargs.copy()
+        if kwargs.has_key('base_node'):
+            source, line = get_source_line(kwargs['base_node'])
+            del attributes['base_node']
+            if source is not None:
+                attributes.setdefault('source', source)
+            if line is not None:
+                attributes.setdefault('line', line)
+        attributes.setdefault('source', self.source)
+        msg = nodes.system_message(message, level=level,
+                                   type=self.levels[level],
+                                   *children, **attributes)
+        if self.stream and (level >= self.report_level
+                            or self.debug_flag and level == self.DEBUG_LEVEL):
+            msgtext = msg.astext().encode(self.encoding, self.error_handler)
+            print >>self.stream, msgtext
+        if level >= self.halt_level:
+            raise SystemMessage(msg, level)
+        if level > self.DEBUG_LEVEL or self.debug_flag:
+            self.notify_observers(msg)
+        self.max_level = max(level, self.max_level)
+        return msg
+
+    def debug(self, *args, **kwargs):
+        """
+        Level-0, "DEBUG": an internal reporting issue. Typically, there is no
+        effect on the processing. Level-0 system messages are handled
+        separately from the others.
+        """
+        if self.debug_flag:
+            return self.system_message(self.DEBUG_LEVEL, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        """
+        Level-1, "INFO": a minor issue that can be ignored. Typically there is
+        no effect on processing, and level-1 system messages are not reported.
+        """
+        return self.system_message(self.INFO_LEVEL, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        """
+        Level-2, "WARNING": an issue that should be addressed. If ignored,
+        there may be unpredictable problems with the output.
+        """
+        return self.system_message(self.WARNING_LEVEL, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        """
+        Level-3, "ERROR": an error that should be addressed. If ignored, the
+        output will contain errors.
+        """
+        return self.system_message(self.ERROR_LEVEL, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        """
+        Level-4, "SEVERE": a severe error that must be addressed. If ignored,
+        the output will contain severe errors. Typically level-4 system
+        messages are turned into exceptions which halt processing.
+        """
+        return self.system_message(self.SEVERE_LEVEL, *args, **kwargs)
+
+
+class ExtensionOptionError(DataError): pass
+class BadOptionError(ExtensionOptionError): pass
+class BadOptionDataError(ExtensionOptionError): pass
+class DuplicateOptionError(ExtensionOptionError): pass
+
+
+def extract_extension_options(field_list, options_spec):
+    """
+    Return a dictionary mapping extension option names to converted values.
+
+    :Parameters:
+        - `field_list`: A flat field list without field arguments, where each
+          field body consists of a single paragraph only.
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `ValueError` for invalid option values (raised by the conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+        - `DuplicateOptionError` for duplicate options.
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = extract_options(field_list)
+    option_dict = assemble_option_dict(option_list, options_spec)
+    return option_dict
+
+def extract_options(field_list):
+    """
+    Return a list of option (name, value) pairs from field names & bodies.
+
+    :Parameter:
+        `field_list`: A flat field list, where each field name is a single
+        word and each field body consists of a single paragraph only.
+
+    :Exceptions:
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = []
+    for field in field_list:
+        if len(field[0].astext().split()) != 1:
+            raise BadOptionError(
+                'extension option field name may not contain multiple words')
+        name = str(field[0].astext().lower())
+        body = field[1]
+        if len(body) == 0:
+            data = None
+        elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \
+              or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text):
+            raise BadOptionDataError(
+                  'extension option field body may contain\n'
+                  'a single paragraph only (option "%s")' % name)
+        else:
+            data = body[0][0].astext()
+        option_list.append((name, data))
+    return option_list
+
+def assemble_option_dict(option_list, options_spec):
+    """
+    Return a mapping of option names to values.
+
+    :Parameters:
+        - `option_list`: A list of (name, value) pairs (the output of
+          `extract_options()`).
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `DuplicateOptionError` for duplicate options.
+        - `ValueError` for invalid option values (raised by conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+    """
+    options = {}
+    for name, value in option_list:
+        convertor = options_spec[name]  # raises KeyError if unknown
+        if convertor is None:
+            raise KeyError(name)        # or if explicitly disabled
+        if options.has_key(name):
+            raise DuplicateOptionError('duplicate option "%s"' % name)
+        try:
+            options[name] = convertor(value)
+        except (ValueError, TypeError), detail:
+            raise detail.__class__('(option: "%s"; value: %r)\n%s'
+                                   % (name, value, ' '.join(detail.args)))
+    return options
+
+
+class NameValueError(DataError): pass
+
+
+def extract_name_value(line):
+    """
+    Return a list of (name, value) from a line of the form "name=value ...".
+
+    :Exception:
+        `NameValueError` for invalid input (missing name, missing data, bad
+        quotes, etc.).
+    """
+    attlist = []
+    while line:
+        equals = line.find('=')
+        if equals == -1:
+            raise NameValueError('missing "="')
+        attname = line[:equals].strip()
+        if equals == 0 or not attname:
+            raise NameValueError(
+                  'missing attribute name before "="')
+        line = line[equals+1:].lstrip()
+        if not line:
+            raise NameValueError(
+                  'missing value after "%s="' % attname)
+        if line[0] in '\'"':
+            endquote = line.find(line[0], 1)
+            if endquote == -1:
+                raise NameValueError(
+                      'attribute "%s" missing end quote (%s)'
+                      % (attname, line[0]))
+            if len(line) > endquote + 1 and line[endquote + 1].strip():
+                raise NameValueError(
+                      'attribute "%s" end quote (%s) not followed by '
+                      'whitespace' % (attname, line[0]))
+            data = line[1:endquote]
+            line = line[endquote+1:].lstrip()
+        else:
+            space = line.find(' ')
+            if space == -1:
+                data = line
+                line = ''
+            else:
+                data = line[:space]
+                line = line[space+1:].lstrip()
+        attlist.append((attname.lower(), data))
+    return attlist
+
+def new_reporter(source_path, settings):
+    """
+    Return a new Reporter object.
+
+    :Parameters:
+        `source` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.
+    """
+    reporter = Reporter(
+        source_path, settings.report_level, settings.halt_level,
+        stream=settings.warning_stream, debug=settings.debug,
+        encoding=settings.error_encoding,
+        error_handler=settings.error_encoding_error_handler)
+    return reporter
+
+def new_document(source_path, settings=None):
+    """
+    Return a new empty document object.
+
+    :Parameters:
+        `source_path` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.  If none provided, a default set will be used.
+    """
+    from docutils import frontend
+    if settings is None:
+        settings = frontend.OptionParser().get_default_values()
+    reporter = new_reporter(source_path, settings)
+    document = nodes.document(settings, reporter, source=source_path)
+    document.note_source(source_path, -1)
+    return document
+
+def clean_rcs_keywords(paragraph, keyword_substitutions):
+    if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text):
+        textnode = paragraph[0]
+        for pattern, substitution in keyword_substitutions:
+            match = pattern.search(textnode.data)
+            if match:
+                textnode.data = pattern.sub(substitution, textnode.data)
+                return
+
+def relative_path(source, target):
+    """
+    Build and return a path to `target`, relative to `source` (both files).
+
+    If there is no common prefix, return the absolute path to `target`.
+    """
+    source_parts = os.path.abspath(source or 'dummy_file').split(os.sep)
+    target_parts = os.path.abspath(target).split(os.sep)
+    # Check first 2 parts because '/dir'.split('/') == ['', 'dir']:
+    if source_parts[:2] != target_parts[:2]:
+        # Nothing in common between paths.
+        # Return absolute path, using '/' for URLs:
+        return '/'.join(target_parts)
+    source_parts.reverse()
+    target_parts.reverse()
+    while (source_parts and target_parts
+           and source_parts[-1] == target_parts[-1]):
+        # Remove path components in common:
+        source_parts.pop()
+        target_parts.pop()
+    target_parts.reverse()
+    parts = ['..'] * (len(source_parts) - 1) + target_parts
+    return '/'.join(parts)
+
+def get_stylesheet_reference(settings, relative_to=None):
+    """
+    Retrieve a stylesheet reference from the settings object.
+    """
+    if settings.stylesheet_path:
+        assert not settings.stylesheet, \
+               'stylesheet and stylesheet_path are mutually exclusive.'
+        if relative_to == None:
+            relative_to = settings._destination
+        return relative_path(relative_to, settings.stylesheet_path)
+    else:
+        return settings.stylesheet
+
+def get_trim_footnote_ref_space(settings):
+    """
+    Return whether or not to trim footnote space.
+
+    If trim_footnote_reference_space is not None, return it.
+
+    If trim_footnote_reference_space is None, return False unless the
+    footnote reference style is 'superscript'.
+    """
+    if settings.trim_footnote_reference_space is None:
+        return hasattr(settings, 'footnote_references') and \
+               settings.footnote_references == 'superscript'
+    else:
+        return settings.trim_footnote_reference_space
+
+def get_source_line(node):
+    """
+    Return the "source" and "line" attributes from the `node` given or from
+    its closest ancestor.
+    """
+    while node:
+        if node.source or node.line:
+            return node.source, node.line
+        node = node.parent
+    return None, None
+
+def escape2null(text):
+    """Return a string with escape-backslashes converted to nulls."""
+    parts = []
+    start = 0
+    while 1:
+        found = text.find('\\', start)
+        if found == -1:
+            parts.append(text[start:])
+            return ''.join(parts)
+        parts.append(text[start:found])
+        parts.append('\x00' + text[found+1:found+2])
+        start = found + 2               # skip character after escape
+
+def unescape(text, restore_backslashes=0):
+    """
+    Return a string with nulls removed or restored to backslashes.
+    Backslash-escaped spaces are also removed.
+    """
+    if restore_backslashes:
+        return text.replace('\x00', '\\')
+    else:
+        for sep in ['\x00 ', '\x00\n', '\x00']:
+            text = ''.join(text.split(sep))
+        return text
+
+east_asian_widths = {'W': 2,   # Wide
+                     'F': 2,   # Full-width (wide)
+                     'Na': 1,  # Narrow
+                     'H': 1,   # Half-width (narrow)
+                     'N': 1,   # Neutral (not East Asian, treated as narrow)
+                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
+                               # narrow otherwise, but that doesn't work)
+"""Mapping of result codes from `unicodedata.east_asian_width()` to character
+column widths."""
+
+def east_asian_column_width(text):
+    if isinstance(text, types.UnicodeType):
+        total = 0
+        for c in text:
+            total += east_asian_widths[unicodedata.east_asian_width(c)]
+        return total
+    else:
+        return len(text)
+
+if hasattr(unicodedata, 'east_asian_width'):
+    column_width = east_asian_column_width
+else:
+    column_width = len
+
+def uniq(L):
+     r = []
+     for item in L:
+         if not item in r:
+             r.append(item)
+     return r
+
+
+class DependencyList:
+
+    """
+    List of dependencies, with file recording support.
+
+    Note that the output file is not automatically closed.  You have
+    to explicitly call the close() method.
+    """
+
+    def __init__(self, output_file=None, dependencies=[]):
+        """
+        Initialize the dependency list, automatically setting the
+        output file to `output_file` (see `set_output()`) and adding
+        all supplied dependencies.
+        """
+        self.set_output(output_file)
+        for i in dependencies:
+            self.add(i)
+
+    def set_output(self, output_file):
+        """
+        Set the output file and clear the list of already added
+        dependencies.
+
+        `output_file` must be a string.  The specified file is
+        immediately overwritten.
+
+        If output_file is '-', the output will be written to stdout.
+        If it is None, no file output is done when calling add().
+        """
+        self.list = []
+        if output_file == '-':
+            self.file = sys.stdout
+        elif output_file:
+            self.file = open(output_file, 'w')
+        else:
+            self.file = None
+
+    def add(self, filename):
+        """
+        If the dependency `filename` has not already been added,
+        append it to self.list and print it to self.file if self.file
+        is not None.
+        """
+        if not filename in self.list:
+            self.list.append(filename)
+            if self.file is not None:
+                print >>self.file, filename
+
+    def close(self):
+        """
+        Close the output file.
+        """
+        self.file.close()
+        self.file = None
+
+    def __repr__(self):
+        if self.file:
+            output_file = self.file.name
+        else:
+            output_file = None
+        return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+# $Id: __init__.py 4913 2007-02-12 04:05:20Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Writer modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import os.path
+import docutils
+from docutils import languages, Component
+from docutils.transforms import universal
+
+
+class Writer(Component):
+
+    """
+    Abstract base class for docutils Writers.
+
+    Each writer module or package must export a subclass also called 'Writer'.
+    Each writer must support all standard node types listed in
+    `docutils.nodes.node_class_names`.
+
+    The `write()` method is the main entry point.
+    """
+
+    component_type = 'writer'
+    config_section = 'writers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Messages,
+            universal.FilterMessages,
+            universal.StripClassesAndElements,]
+
+    document = None
+    """The document to write (Docutils doctree); set by `write`."""
+
+    output = None
+    """Final translated form of `document` (Unicode string for text, binary
+    string for other forms); set by `translate`."""
+
+    language = None
+    """Language module for the document; set by `write`."""
+
+    destination = None
+    """`docutils.io` Output object; where to write the document.
+    Set by `write`."""
+
+    def __init__(self):
+
+        # Currently only used by HTML writer for output fragments:
+        self.parts = {}
+        """Mapping of document part names to fragments of `self.output`.
+        Values are Unicode strings; encoding is up to the client.  The 'whole'
+        key should contain the entire document output.
+        """
+
+    def write(self, document, destination):
+        """
+        Process a document into its final form.
+
+        Translate `document` (a Docutils document tree) into the Writer's
+        native format, and write it out to its `destination` (a
+        `docutils.io.Output` subclass object).
+
+        Normally not overridden or extended in subclasses.
+        """
+        self.document = document
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.destination = destination
+        self.translate()
+        output = self.destination.write(self.output)
+        return output
+
+    def translate(self):
+        """
+        Do final translation of `self.document` into `self.output`.  Called
+        from `write`.  Override in subclasses.
+
+        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
+        combination with a call to `docutils.nodes.Node.walk()` or
+        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
+        support all standard elements (listed in
+        `docutils.nodes.node_class_names`) and possibly non-standard elements
+        used by the current Reader as well.
+        """
+        raise NotImplementedError('subclass must override this method')
+
+    def assemble_parts(self):
+        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
+        self.parts['whole'] = self.output
+        self.parts['encoding'] = self.document.settings.output_encoding
+        self.parts['version'] = docutils.__version__
+
+
+class UnfilteredWriter(Writer):
+
+    """
+    A writer that passes the document tree on unchanged (e.g. a
+    serializer.)
+
+    Documents written by UnfilteredWriters are typically reused at a
+    later date using a subclass of `readers.ReReader`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  When the document is reused
+        # later, the then-used writer will add the appropriate
+        # transforms.
+        return Component.get_transforms(self)
+
+
+_writer_aliases = {
+      'html': 'html4css1',
+      'latex': 'latex2e',
+      'pprint': 'pseudoxml',
+      'pformat': 'pseudoxml',
+      'pdf': 'rlpdf',
+      'xml': 'docutils_xml',
+      's5': 's5_html'}
+
+def get_writer_class(writer_name):
+    """Return the Writer class from the `writer_name` module."""
+    writer_name = writer_name.lower()
+    if _writer_aliases.has_key(writer_name):
+        writer_name = _writer_aliases[writer_name]
+    module = __import__(writer_name, globals(), locals())
+    return module.Writer
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+# $Id: docutils_xml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes Docutils XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils
+from docutils import frontend, writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('xml',)
+    """Formats this writer supports."""
+
+    settings_spec = (
+        '"Docutils XML" Writer Options',
+        'Warning: the --newlines and --indents options may adversely affect '
+        'whitespace; use them only for reading convenience.',
+        (('Generate XML with newlines before and after tags.',
+          ['--newlines'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Generate XML with indents and newlines.',
+          ['--indents'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Omit the DOCTYPE declaration.',
+          ['--no-doctype'],
+          {'dest': 'doctype_declaration', 'default': 1,
+           'action': 'store_false', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    config_section = 'docutils_xml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    xml_declaration = '<?xml version="1.0" encoding="%s"?>\n'
+    #xml_stylesheet = '<?xml-stylesheet type="text/xsl" href="%s"?>\n'
+    doctype = (
+        '<!DOCTYPE document PUBLIC'
+        ' "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML"'
+        ' "http://docutils.sourceforge.net/docs/ref/docutils.dtd">\n')
+    generator = '<!-- Generated by Docutils %s -->\n'
+
+    def translate(self):
+        settings = self.document.settings
+        indent = newline = ''
+        if settings.newlines:
+            newline = '\n'
+        if settings.indents:
+            newline = '\n'
+            indent = '    '
+        output_prefix = []
+        if settings.xml_declaration:
+            output_prefix.append(
+                self.xml_declaration % settings.output_encoding)
+        if settings.doctype_declaration:
+            output_prefix.append(self.doctype)
+        output_prefix.append(self.generator % docutils.__version__)
+        docnode = self.document.asdom().childNodes[0]
+        self.output = (''.join(output_prefix)
+                       + docnode.toprettyxml(indent, newline))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1538 @@
+# $Id: __init__.py 5314 2007-07-05 12:45:43Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple HyperText Markup Language document tree Writer.
+
+The output conforms to the XHTML version 1.0 Transitional DTD
+(*almost* strict).  The output contains a minimum of formatting
+information.  The cascading style sheet "html4css1.css" is required
+for proper viewing with a modern graphical browser.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import time
+import re
+from types import ListType
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+import docutils
+from docutils import frontend, nodes, utils, writers, languages
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('html', 'html4css1', 'xhtml')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'html4css1.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = (
+        'HTML-Specific Options',
+        None,
+        (('Specify the template file (UTF-8 encoded).  Default is "%s".'
+          % default_template_path,
+          ['--template'],
+          {'default': default_template_path, 'metavar': '<file>'}),
+        ('Specify a stylesheet URL, used verbatim.  Overrides '
+          '--stylesheet-path.',
+          ['--stylesheet'],
+          {'metavar': '<URL>', 'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  The path is adjusted relative to the output HTML '
+          'file.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Embed the stylesheet in the output HTML file.  The stylesheet '
+          'file must be accessible during processing (--stylesheet-path is '
+          'recommended).  This is the default.',
+          ['--embed-stylesheet'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Link to the stylesheet in the output HTML file.  Default: '
+          'embed the stylesheet, do not link to it.',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
+         ('Specify the initial header level.  Default is 1 for "<h1>".  '
+          'Does not affect document title & subtitle (see --no-doc-title).',
+          ['--initial-header-level'],
+          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
+           'metavar': '<level>'}),
+         ('Specify the maximum width (in characters) for one-column field '
+          'names.  Longer field names will span an entire row of the table '
+          'used to render the field list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--field-name-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Specify the maximum width (in characters) for options in option '
+          'lists.  Longer options will span an entire row of the table used '
+          'to render the option list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--option-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "brackets".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Remove extra vertical whitespace between items of "simple" bullet '
+          'lists and enumerated lists.  Default: enabled.',
+          ['--compact-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple bullet and enumerated lists.',
+          ['--no-compact-lists'],
+          {'dest': 'compact_lists', 'action': 'store_false'}),
+         ('Remove extra vertical whitespace between items of simple field '
+          'lists.  Default: enabled.',
+          ['--compact-field-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple field lists.',
+          ['--no-compact-field-lists'],
+          {'dest': 'compact_field_lists', 'action': 'store_false'}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Obfuscate email addresses to confuse harvesters while still '
+          'keeping email links usable with standards-compliant browsers.',
+          ['--cloak-email-addresses'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'html4css1 writer'
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = (
+        'head_prefix', 'head', 'stylesheet', 'body_prefix',
+        'body_pre_docinfo', 'docinfo', 'body', 'body_suffix',
+        'title', 'subtitle', 'header', 'footer', 'meta', 'fragment',
+        'html_prolog', 'html_head', 'html_title', 'html_subtitle',
+        'html_body')
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [writer_aux.Admonitions]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def translate(self):
+        self.visitor = visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+        self.output = self.apply_template()
+
+    def apply_template(self):
+        template_file = open(self.document.settings.template)
+        template = unicode(template_file.read(), 'utf-8')
+        template_file.close()
+        subs = self.interpolation_dict()
+        return template % subs
+
+    def interpolation_dict(self):
+        subs = {}
+        settings = self.document.settings
+        for attr in self.visitor_attributes:
+            subs[attr] = ''.join(getattr(self, attr)).rstrip('\n')
+        subs['encoding'] = settings.output_encoding
+        subs['version'] = docutils.__version__
+        return subs
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+class HTMLTranslator(nodes.NodeVisitor):
+
+    """
+    This HTML writer has been optimized to produce visually compact
+    lists (less vertical whitespace).  HTML's mixed content models
+    allow list items to contain "<li><p>body elements</p></li>" or
+    "<li>just text</li>" or even "<li>text<p>and body
+    elements</p>combined</li>", each with different effects.  It would
+    be best to stick with strict body elements in list items, but they
+    affect vertical spacing in browsers (although they really
+    shouldn't).
+
+    Here is an outline of the optimization:
+
+    - Check for and omit <p> tags in "simple" lists: list items
+      contain either a single paragraph, a nested simple list, or a
+      paragraph followed by a nested simple list.  This means that
+      this list can be compact:
+
+          - Item 1.
+          - Item 2.
+
+      But this list cannot be compact:
+
+          - Item 1.
+
+            This second paragraph forces space between list items.
+
+          - Item 2.
+
+    - In non-list contexts, omit <p> tags on a paragraph if that
+      paragraph is the only child of its parent (footnotes & citations
+      are allowed a label first).
+
+    - Regardless of the above, in definitions, table cells, field bodies,
+      option descriptions, and list items, mark the first child with
+      'class="first"' and the last child with 'class="last"'.  The stylesheet
+      sets the margins (top & bottom respectively) to 0 for these elements.
+
+    The ``no_compact_lists`` setting (``--no-compact-lists`` command-line
+    option) disables list whitespace optimization.
+    """
+
+    xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n'
+    doctype = (
+        '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
+    head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"'
+                            ' xml:lang="%s" lang="%s">\n<head>\n')
+    content_type = ('<meta http-equiv="Content-Type"'
+                    ' content="text/html; charset=%s" />\n')
+    generator = ('<meta name="generator" content="Docutils %s: '
+                 'http://docutils.sourceforge.net/" />\n')
+    stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n'
+    embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n'
+    words_and_spaces = re.compile(r'\S+| +|\n')
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        lcode = settings.language_code
+        self.language = languages.get_language(lcode)
+        self.meta = [self.content_type % settings.output_encoding,
+                     self.generator % docutils.__version__]
+        self.head_prefix = []
+        self.html_prolog = []
+        if settings.xml_declaration:
+            self.head_prefix.append(self.xml_declaration
+                                    % settings.output_encoding)
+            # encoding not interpolated:
+            self.html_prolog.append(self.xml_declaration)
+        self.head_prefix.extend([self.doctype,
+                                 self.head_prefix_template % (lcode, lcode)])
+        self.html_prolog.append(self.doctype)
+        self.head = self.meta[:]
+        stylesheet = utils.get_stylesheet_reference(settings)
+        self.stylesheet = []
+        if stylesheet:
+            if settings.embed_stylesheet:
+                stylesheet = utils.get_stylesheet_reference(
+                    settings, os.path.join(os.getcwd(), 'dummy'))
+                settings.record_dependencies.add(stylesheet)
+                stylesheet_text = open(stylesheet).read()
+                self.stylesheet = [self.embedded_stylesheet % stylesheet_text]
+            else:
+                self.stylesheet = [self.stylesheet_link
+                                   % self.encode(stylesheet)]
+        self.body_prefix = ['</head>\n<body>\n']
+        # document title, subtitle display
+        self.body_pre_docinfo = []
+        # author, date, etc.
+        self.docinfo = []
+        self.body = []
+        self.fragment = []
+        self.body_suffix = ['</body>\n</html>\n']
+        self.section_level = 0
+        self.initial_header_level = int(settings.initial_header_level)
+        # A heterogenous stack used in conjunction with the tree traversal.
+        # Make sure that the pops correspond to the pushes:
+        self.context = []
+        self.topic_classes = []
+        self.colspecs = []
+        self.compact_p = 1
+        self.compact_simple = None
+        self.compact_field_list = None
+        self.in_docinfo = None
+        self.in_sidebar = None
+        self.title = []
+        self.subtitle = []
+        self.header = []
+        self.footer = []
+        self.html_head = [self.content_type] # charset not interpolated
+        self.html_title = []
+        self.html_subtitle = []
+        self.html_body = []
+        self.in_document_title = 0
+        self.in_mailto = 0
+        self.author_in_authors = None
+
+    def astext(self):
+        return ''.join(self.head_prefix + self.head
+                       + self.stylesheet + self.body_prefix
+                       + self.body_pre_docinfo + self.docinfo
+                       + self.body + self.body_suffix)
+
+    def encode(self, text):
+        """Encode special characters in `text` & return."""
+        # @@@ A codec to do these and all other HTML entities would be nice.
+        text = text.replace("&", "&amp;")
+        text = text.replace("<", "&lt;")
+        text = text.replace('"', "&quot;")
+        text = text.replace(">", "&gt;")
+        text = text.replace("@", "&#64;") # may thwart some address harvesters
+        # Replace the non-breaking space character with the HTML entity:
+        text = text.replace(u'\u00a0', "&nbsp;")
+        return text
+
+    def cloak_mailto(self, uri):
+        """Try to hide a mailto: URL from harvesters."""
+        # Encode "@" using a URL octet reference (see RFC 1738).
+        # Further cloaking with HTML entities will be done in the
+        # `attval` function.
+        return uri.replace('@', '%40')
+
+    def cloak_email(self, addr):
+        """Try to hide the link text of a email link from harversters."""
+        # Surround at-signs and periods with <span> tags.  ("@" has
+        # already been encoded to "&#64;" by the `encode` method.)
+        addr = addr.replace('&#64;', '<span>&#64;</span>')
+        addr = addr.replace('.', '<span>&#46;</span>')
+        return addr
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, HTML encode, and return attribute value text."""
+        encoded = self.encode(whitespace.sub(' ', text))
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            # Cloak at-signs ("%40") and periods with HTML entities.
+            encoded = encoded.replace('%40', '&#37;&#52;&#48;')
+            encoded = encoded.replace('.', '&#46;')
+        return encoded
+
+    def starttag(self, node, tagname, suffix='\n', empty=0, **attributes):
+        """
+        Construct and return a start tag given a node (id & class attributes
+        are extracted), tag name, and optional attributes.
+        """
+        tagname = tagname.lower()
+        prefix = []
+        atts = {}
+        ids = []
+        for (name, value) in attributes.items():
+            atts[name.lower()] = value
+        classes = node.get('classes', [])
+        if atts.has_key('class'):
+            classes.append(atts['class'])
+        if classes:
+            atts['class'] = ' '.join(classes)
+        assert not atts.has_key('id')
+        ids.extend(node.get('ids', []))
+        if atts.has_key('ids'):
+            ids.extend(atts['ids'])
+            del atts['ids']
+        if ids:
+            atts['id'] = ids[0]
+            for id in ids[1:]:
+                # Add empty "span" elements for additional IDs.  Note
+                # that we cannot use empty "a" elements because there
+                # may be targets inside of references, but nested "a"
+                # elements aren't allowed in XHTML (even if they do
+                # not all have a "href" attribute).
+                if empty:
+                    # Empty tag.  Insert target right in front of element.
+                    prefix.append('<span id="%s"></span>' % id)
+                else:
+                    # Non-empty tag.  Place the auxiliary <span> tag
+                    # *inside* the element, as the first child.
+                    suffix += '<span id="%s"></span>' % id
+        attlist = atts.items()
+        attlist.sort()
+        parts = [tagname]
+        for name, value in attlist:
+            # value=None was used for boolean attributes without
+            # value, but this isn't supported by XHTML.
+            assert value is not None
+            if isinstance(value, ListType):
+                values = [unicode(v) for v in value]
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(' '.join(values))))
+            else:
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(unicode(value))))
+        if empty:
+            infix = ' /'
+        else:
+            infix = ''
+        return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix
+
+    def emptytag(self, node, tagname, suffix='\n', **attributes):
+        """Construct and return an XML-compatible empty tag."""
+        return self.starttag(node, tagname, suffix, empty=1, **attributes)
+
+    def set_class_on_child(self, node, class_, index=0):
+        """
+        Set class `class_` on the visible child no. index of `node`.
+        Do nothing if node has fewer children than `index`.
+        """
+        children = [n for n in node if not isinstance(n, nodes.Invisible)]
+        try:
+            child = children[index]
+        except IndexError:
+            return
+        child['classes'].append(class_)
+
+    def set_first_last(self, node):
+        self.set_class_on_child(node, 'first', 0)
+        self.set_class_on_child(node, 'last', -1)
+
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            encoded = self.cloak_email(encoded)
+        self.body.append(encoded)
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_abbreviation(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'abbr', ''))
+
+    def depart_abbreviation(self, node):
+        self.body.append('</abbr>')
+
+    def visit_acronym(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'acronym', ''))
+
+    def depart_acronym(self, node):
+        self.body.append('</acronym>')
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address', meta=None)
+        self.body.append(self.starttag(node, 'pre', CLASS='address'))
+
+    def depart_address(self, node):
+        self.body.append('\n</pre>\n')
+        self.depart_docinfo_item()
+
+    def visit_admonition(self, node):
+        self.body.append(self.starttag(node, 'div'))
+        self.set_first_last(node)
+
+    def depart_admonition(self, node=None):
+        self.body.append('</div>\n')
+
+    attribution_formats = {'dash': ('&mdash;', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.context.append(suffix)
+        self.body.append(
+            self.starttag(node, 'p', prefix, CLASS='attribution'))
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '</p>\n')
+
+    def visit_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            if self.author_in_authors:
+                self.body.append('\n<br />')
+        else:
+            self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            self.author_in_authors += 1
+        else:
+            self.depart_docinfo_item()
+
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors')
+        self.author_in_authors = 0      # initialize counter
+
+    def depart_authors(self, node):
+        self.depart_docinfo_item()
+        self.author_in_authors = None
+
+    def visit_block_quote(self, node):
+        self.body.append(self.starttag(node, 'blockquote'))
+
+    def depart_block_quote(self, node):
+        self.body.append('</blockquote>\n')
+
+    def check_simple_list(self, node):
+        """Check for a simple list that can be rendered compactly."""
+        visitor = SimpleListChecker(self.document)
+        try:
+            node.walk(visitor)
+        except nodes.NodeFound:
+            return None
+        else:
+            return 1
+
+    def is_compactable(self, node):
+        return ('compact' in node['classes']
+                or (self.settings.compact_lists
+                    and 'open' not in node['classes']
+                    and (self.compact_simple
+                         or self.topic_classes == ['contents']
+                         or self.check_simple_list(node))))
+
+    def visit_bullet_list(self, node):
+        atts = {}
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = 'simple'
+        self.body.append(self.starttag(node, 'ul', **atts))
+
+    def depart_bullet_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ul>\n')
+
+    def visit_caption(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
+
+    def depart_caption(self, node):
+        self.body.append('</p>\n')
+
+    def visit_citation(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils citation',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def depart_citation(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_citation_reference(self, node):
+        href = '#' + node['refid']
+        self.body.append(self.starttag(
+            node, 'a', '[', CLASS='citation-reference', href=href))
+
+    def depart_citation_reference(self, node):
+        self.body.append(']</a>')
+
+    def visit_classifier(self, node):
+        self.body.append(' <span class="classifier-delimiter">:</span> ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+    def depart_classifier(self, node):
+        self.body.append('</span>')
+
+    def visit_colspec(self, node):
+        self.colspecs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        node.parent.stubs.append(node.attributes.get('stub'))
+
+    def depart_colspec(self, node):
+        pass
+
+    def write_colspecs(self):
+        width = 0
+        for node in self.colspecs:
+            width += node['colwidth']
+        for node in self.colspecs:
+            colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
+            self.body.append(self.emptytag(node, 'col',
+                                           width='%i%%' % colwidth))
+        self.colspecs = []
+
+    def visit_comment(self, node,
+                      sub=re.compile('-(?=-)').sub):
+        """Escape double-dashes in comment text."""
+        self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='compound'))
+        if len(node) > 1:
+            node[0]['classes'].append('compound-first')
+            node[-1]['classes'].append('compound-last')
+            for child in node[1:-1]:
+                child['classes'].append('compound-middle')
+
+    def depart_compound(self, node):
+        self.body.append('</div>\n')
+
+    def visit_container(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='container'))
+
+    def depart_container(self, node):
+        self.body.append('</div>\n')
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact', meta=None)
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item()
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item()
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        self.body.append('</dt>\n')
+        self.body.append(self.starttag(node, 'dd', ''))
+        self.set_first_last(node)
+
+    def depart_definition(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_definition_list(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS='docutils'))
+
+    def depart_definition_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append(self.starttag(node, 'td', ''))
+        self.set_first_last(node)
+
+    def depart_description(self, node):
+        self.body.append('</td>')
+
+    def visit_docinfo(self, node):
+        self.context.append(len(self.body))
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docinfo',
+                                       frame="void", rules="none"))
+        self.body.append('<col class="docinfo-name" />\n'
+                         '<col class="docinfo-content" />\n'
+                         '<tbody valign="top">\n')
+        self.in_docinfo = 1
+
+    def depart_docinfo(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.in_docinfo = None
+        start = self.context.pop()
+        self.docinfo = self.body[start:]
+        self.body = []
+
+    def visit_docinfo_item(self, node, name, meta=1):
+        if meta:
+            meta_tag = '<meta name="%s" content="%s" />\n' \
+                       % (name, self.attval(node.astext()))
+            self.add_meta(meta_tag)
+        self.body.append(self.starttag(node, 'tr', ''))
+        self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
+                         % self.language.labels[name])
+        if len(node):
+            if isinstance(node[0], nodes.Element):
+                node[0]['classes'].append('first')
+            if isinstance(node[-1], nodes.Element):
+                node[-1]['classes'].append('last')
+
+    def depart_docinfo_item(self):
+        self.body.append('</td></tr>\n')
+
+    def visit_doctest_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
+
+    def depart_doctest_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_document(self, node):
+        self.head.append('<title>%s</title>\n'
+                         % self.encode(node.get('title', '')))
+
+    def depart_document(self, node):
+        self.fragment.extend(self.body)
+        self.body_prefix.append(self.starttag(node, 'div', CLASS='document'))
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+        assert not self.context, 'len(context) = %s' % len(self.context)
+
+    def visit_emphasis(self, node):
+        self.body.append('<em>')
+
+    def depart_emphasis(self, node):
+        self.body.append('</em>')
+
+    def visit_entry(self, node):
+        atts = {'class': []}
+        if isinstance(node.parent.parent, nodes.thead):
+            atts['class'].append('head')
+        if node.parent.parent.parent.stubs[node.parent.column]:
+            # "stubs" list is an attribute of the tgroup element
+            atts['class'].append('stub')
+        if atts['class']:
+            tagname = 'th'
+            atts['class'] = ' '.join(atts['class'])
+        else:
+            tagname = 'td'
+            del atts['class']
+        node.parent.column += 1
+        if node.has_key('morerows'):
+            atts['rowspan'] = node['morerows'] + 1
+        if node.has_key('morecols'):
+            atts['colspan'] = node['morecols'] + 1
+            node.parent.column += node['morecols']
+        self.body.append(self.starttag(node, tagname, '', **atts))
+        self.context.append('</%s>\n' % tagname.lower())
+        if len(node) == 0:              # empty cell
+            self.body.append('&nbsp;')
+        self.set_first_last(node)
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_enumerated_list(self, node):
+        """
+        The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
+        CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
+        usable.
+        """
+        atts = {}
+        if node.has_key('start'):
+            atts['start'] = node['start']
+        if node.has_key('enumtype'):
+            atts['class'] = node['enumtype']
+        # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
+        # single "format" attribute? Use CSS2?
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = (atts.get('class', '') + ' simple').strip()
+        self.body.append(self.starttag(node, 'ol', **atts))
+
+    def depart_enumerated_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ol>\n')
+
+    def visit_field(self, node):
+        self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
+
+    def depart_field(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_field_body(self, node):
+        self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
+        self.set_class_on_child(node, 'first', 0)
+        field = node.parent
+        if (self.compact_field_list or
+            isinstance(field.parent, nodes.docinfo) or
+            field.parent.index(field) == len(field.parent) - 1):
+            # If we are in a compact list, the docinfo, or if this is
+            # the last field of the field list, do not add vertical
+            # space after last element.
+            self.set_class_on_child(node, 'last', -1)
+
+    def depart_field_body(self, node):
+        self.body.append('</td>\n')
+
+    def visit_field_list(self, node):
+        self.context.append((self.compact_field_list, self.compact_p))
+        self.compact_p = None
+        if 'compact' in node['classes']:
+            self.compact_field_list = 1
+        elif (self.settings.compact_field_lists
+              and 'open' not in node['classes']):
+            self.compact_field_list = 1
+        if self.compact_field_list:
+            for field in node:
+                field_body = field[-1]
+                assert isinstance(field_body, nodes.field_body)
+                children = [n for n in field_body
+                            if not isinstance(n, nodes.Invisible)]
+                if not (len(children) == 0 or
+                        len(children) == 1 and
+                        isinstance(children[0], nodes.paragraph)):
+                    self.compact_field_list = 0
+                    break
+        self.body.append(self.starttag(node, 'table', frame='void',
+                                       rules='none',
+                                       CLASS='docutils field-list'))
+        self.body.append('<col class="field-name" />\n'
+                         '<col class="field-body" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_field_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.compact_field_list, self.compact_p = self.context.pop()
+
+    def visit_field_name(self, node):
+        atts = {}
+        if self.in_docinfo:
+            atts['class'] = 'docinfo-name'
+        else:
+            atts['class'] = 'field-name'
+        if ( self.settings.field_name_limit
+             and len(node.astext()) > self.settings.field_name_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'th', '', **atts))
+
+    def depart_field_name(self, node):
+        self.body.append(':</th>')
+        self.body.append(self.context.pop())
+
+    def visit_figure(self, node):
+        atts = {'class': 'figure'}
+        if node.get('width'):
+            atts['style'] = 'width: %spx' % node['width']
+        if node.get('align'):
+            atts['align'] = node['align']
+        self.body.append(self.starttag(node, 'div', **atts))
+
+    def depart_figure(self, node):
+        self.body.append('</div>\n')
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = [self.starttag(node, 'div', CLASS='footer'),
+                  '<hr class="footer" />\n']
+        footer.extend(self.body[start:])
+        footer.append('\n</div>\n')
+        self.footer.extend(footer)
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils footnote',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def footnote_backrefs(self, node):
+        backlinks = []
+        backrefs = node['backrefs']
+        if self.settings.footnote_backlinks and backrefs:
+            if len(backrefs) == 1:
+                self.context.append('')
+                self.context.append('</a>')
+                self.context.append('<a class="fn-backref" href="#%s">'
+                                    % backrefs[0])
+            else:
+                i = 1
+                for backref in backrefs:
+                    backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
+                                     % (backref, i))
+                    i += 1
+                self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
+                self.context += ['', '']
+        else:
+            self.context.append('')
+            self.context += ['', '']
+        # If the node does not only consist of a label.
+        if len(node) > 1:
+            # If there are preceding backlinks, we do not set class
+            # 'first', because we need to retain the top-margin.
+            if not backlinks:
+                node[1]['classes'].append('first')
+            node[-1]['classes'].append('last')
+
+    def depart_footnote(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_footnote_reference(self, node):
+        href = '#' + node['refid']
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        else:
+            assert format == 'superscript'
+            suffix = '<sup>'
+            self.context.append('</sup>')
+        self.body.append(self.starttag(node, 'a', suffix,
+                                       CLASS='footnote-reference', href=href))
+
+    def depart_footnote_reference(self, node):
+        self.body.append(self.context.pop() + '</a>')
+
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = [self.starttag(node, 'div', CLASS='header')]
+        header.extend(self.body[start:])
+        header.append('\n<hr class="header"/>\n</div>\n')
+        self.body_prefix.extend(header)
+        self.header.extend(header)
+        del self.body[start:]
+
+    def visit_image(self, node):
+        atts = {}
+        atts['src'] = node['uri']
+        if node.has_key('width'):
+            atts['width'] = node['width']
+        if node.has_key('height'):
+            atts['height'] = node['height']
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(str(atts['src']))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    pass
+                else:
+                    if not atts.has_key('width'):
+                        atts['width'] = str(im.size[0])
+                    if not atts.has_key('height'):
+                        atts['height'] = str(im.size[1])
+                    del im
+            for att_name in 'width', 'height':
+                if atts.has_key(att_name):
+                    match = re.match(r'([0-9.]+)(\S*)$', atts[att_name])
+                    assert match
+                    atts[att_name] = '%s%s' % (
+                        float(match.group(1)) * (float(node['scale']) / 100),
+                        match.group(2))
+        style = []
+        for att_name in 'width', 'height':
+            if atts.has_key(att_name):
+                if re.match(r'^[0-9.]+$', atts[att_name]):
+                    # Interpret unitless values as pixels.
+                    atts[att_name] += 'px'
+                style.append('%s: %s;' % (att_name, atts[att_name]))
+                del atts[att_name]
+        if style:
+            atts['style'] = ' '.join(style)
+        atts['alt'] = node.get('alt', atts['src'])
+        if (isinstance(node.parent, nodes.TextElement) or
+            (isinstance(node.parent, nodes.reference) and
+             not isinstance(node.parent.parent, nodes.TextElement))):
+            # Inline context or surrounded by <a>...</a>.
+            suffix = ''
+        else:
+            suffix = '\n'
+        if node.has_key('align'):
+            if node['align'] == 'center':
+                # "align" attribute is set in surrounding "div" element.
+                self.body.append('<div align="center" class="align-center">')
+                self.context.append('</div>\n')
+                suffix = ''
+            else:
+                # "align" attribute is set in "img" element.
+                atts['align'] = node['align']
+                self.context.append('')
+            atts['class'] = 'align-%s' % node['align']
+        else:
+            self.context.append('')
+        self.body.append(self.emptytag(node, 'img', suffix, **atts))
+
+    def depart_image(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_inline(self, node):
+        self.body.append(self.starttag(node, 'span', ''))
+
+    def depart_inline(self, node):
+        self.body.append('</span>')
+
+    def visit_label(self, node):
+        # Context added in footnote_backrefs.
+        self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
+                                       CLASS='label'))
+
+    def depart_label(self, node):
+        # Context added in footnote_backrefs.
+        self.body.append(']%s</td><td>%s' % (self.context.pop(), self.context.pop()))
+
+    def visit_legend(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='legend'))
+
+    def depart_legend(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line(self, node):
+        self.body.append(self.starttag(node, 'div', suffix='', CLASS='line'))
+        if not len(node):
+            self.body.append('<br />')
+
+    def depart_line(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line_block(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='line-block'))
+
+    def depart_line_block(self, node):
+        self.body.append('</div>\n')
+
+    def visit_list_item(self, node):
+        self.body.append(self.starttag(node, 'li', ''))
+        if len(node):
+            node[0]['classes'].append('first')
+
+    def depart_list_item(self, node):
+        self.body.append('</li>\n')
+
+    def visit_literal(self, node):
+        """Process text to prevent tokens from wrapping."""
+        self.body.append(
+            self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        text = node.astext()
+        for token in self.words_and_spaces.findall(text):
+            if token.strip():
+                # Protect text like "--an-option" from bad line wrapping:
+                self.body.append('<span class="pre">%s</span>'
+                                 % self.encode(token))
+            elif token in ('\n', ' '):
+                # Allow breaks at whitespace:
+                self.body.append(token)
+            else:
+                # Protect runs of multiple spaces; the last space can wrap:
+                self.body.append('&nbsp;' * (len(token) - 1) + ' ')
+        self.body.append('</tt>')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_literal_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
+
+    def depart_literal_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_meta(self, node):
+        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
+        self.add_meta(meta)
+
+    def depart_meta(self, node):
+        pass
+
+    def add_meta(self, tag):
+        self.meta.append(tag)
+        self.head.append(tag)
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            self.body.append(', ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+
+    def depart_option(self, node):
+        self.body.append('</span>')
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        self.body.append(node.get('delimiter', ' '))
+        self.body.append(self.starttag(node, 'var', ''))
+
+    def depart_option_argument(self, node):
+        self.body.append('</var>')
+
+    def visit_option_group(self, node):
+        atts = {}
+        if ( self.settings.option_limit
+             and len(node.astext()) > self.settings.option_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(
+            self.starttag(node, 'td', CLASS='option-group', **atts))
+        self.body.append('<kbd>')
+        self.context.append(0)          # count number of options
+
+    def depart_option_group(self, node):
+        self.context.pop()
+        self.body.append('</kbd></td>\n')
+        self.body.append(self.context.pop())
+
+    def visit_option_list(self, node):
+        self.body.append(
+              self.starttag(node, 'table', CLASS='docutils option-list',
+                            frame="void", rules="none"))
+        self.body.append('<col class="option" />\n'
+                         '<col class="description" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_option_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+
+    def visit_option_list_item(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+
+    def depart_option_list_item(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_option_string(self, node):
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item()
+
+    def should_be_compact_paragraph(self, node):
+        """
+        Determine if the <p> tags around paragraph ``node`` can be omitted.
+        """
+        if (isinstance(node.parent, nodes.document) or
+            isinstance(node.parent, nodes.compound)):
+            # Never compact paragraphs in document or compound.
+            return 0
+        for key, value in node.attlist():
+            if (node.is_not_default(key) and
+                not (key == 'classes' and value in
+                     ([], ['first'], ['last'], ['first', 'last']))):
+                # Attribute which needs to survive.
+                return 0
+        first = isinstance(node.parent[0], nodes.label) # skip label
+        for child in node.parent.children[first:]:
+            # only first paragraph can be compact
+            if isinstance(child, nodes.Invisible):
+                continue
+            if child is node:
+                break
+            return 0
+        parent_length = len([n for n in node.parent if not isinstance(
+            n, (nodes.Invisible, nodes.label))])
+        if ( self.compact_simple
+             or self.compact_field_list
+             or self.compact_p and parent_length == 1):
+            return 1
+        return 0
+
+    def visit_paragraph(self, node):
+        if self.should_be_compact_paragraph(node):
+            self.context.append('')
+        else:
+            self.body.append(self.starttag(node, 'p', ''))
+            self.context.append('</p>\n')
+
+    def depart_paragraph(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_problematic(self, node):
+        if node.hasattr('refid'):
+            self.body.append('<a href="#%s">' % node['refid'])
+            self.context.append('</a>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
+
+    def depart_problematic(self, node):
+        self.body.append('</span>')
+        self.body.append(self.context.pop())
+
+    def visit_raw(self, node):
+        if 'html' in node.get('format', '').split():
+            t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div'
+            if node['classes']:
+                self.body.append(self.starttag(node, t, suffix=''))
+            self.body.append(node.astext())
+            if node['classes']:
+                self.body.append('</%s>' % t)
+        # Keep non-HTML raw text out of output:
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        atts = {'class': 'reference'}
+        if node.has_key('refuri'):
+            atts['href'] = node['refuri']
+            if ( self.settings.cloak_email_addresses
+                 and atts['href'].startswith('mailto:')):
+                atts['href'] = self.cloak_mailto(atts['href'])
+                self.in_mailto = 1
+            atts['class'] += ' external'
+        else:
+            assert node.has_key('refid'), \
+                   'References must have "refuri" or "refid" attribute.'
+            atts['href'] = '#' + node['refid']
+            atts['class'] += ' internal'
+        if not isinstance(node.parent, nodes.TextElement):
+            assert len(node) == 1 and isinstance(node[0], nodes.image)
+            atts['class'] += ' image-reference'
+        self.body.append(self.starttag(node, 'a', '', **atts))
+
+    def depart_reference(self, node):
+        self.body.append('</a>')
+        if not isinstance(node.parent, nodes.TextElement):
+            self.body.append('\n')
+        self.in_mailto = 0
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision', meta=None)
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item()
+
+    def visit_row(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+        node.column = 0
+
+    def depart_row(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_rubric(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='rubric'))
+
+    def depart_rubric(self, node):
+        self.body.append('</p>\n')
+
+    def visit_section(self, node):
+        self.section_level += 1
+        self.body.append(
+            self.starttag(node, 'div', CLASS='section'))
+
+    def depart_section(self, node):
+        self.section_level -= 1
+        self.body.append('</div>\n')
+
+    def visit_sidebar(self, node):
+        self.body.append(
+            self.starttag(node, 'div', CLASS='sidebar'))
+        self.set_first_last(node)
+        self.in_sidebar = 1
+
+    def depart_sidebar(self, node):
+        self.body.append('</div>\n')
+        self.in_sidebar = None
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status', meta=None)
+
+    def depart_status(self, node):
+        self.depart_docinfo_item()
+
+    def visit_strong(self, node):
+        self.body.append('<strong>')
+
+    def depart_strong(self, node):
+        self.body.append('</strong>')
+
+    def visit_subscript(self, node):
+        self.body.append(self.starttag(node, 'sub', ''))
+
+    def depart_subscript(self, node):
+        self.body.append('</sub>')
+
+    def visit_substitution_definition(self, node):
+        """Internal only."""
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.starttag(node, 'p', '',
+                                           CLASS='sidebar-subtitle'))
+            self.context.append('</p>\n')
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
+            self.context.append('</h2>\n')
+            self.in_document_title = len(self.body)
+        elif isinstance(node.parent, nodes.section):
+            tag = 'h%s' % (self.section_level + self.initial_header_level - 1)
+            self.body.append(
+                self.starttag(node, tag, '', CLASS='section-subtitle') +
+                self.starttag({}, 'span', '', CLASS='section-subtitle'))
+            self.context.append('</span></%s>\n' % tag)
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.subtitle = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_subtitle.extend(self.body)
+            del self.body[:]
+
+    def visit_superscript(self, node):
+        self.body.append(self.starttag(node, 'sup', ''))
+
+    def depart_superscript(self, node):
+        self.body.append('</sup>')
+
+    def visit_system_message(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
+        self.body.append('<p class="system-message-title">')
+        backref_text = ''
+        if len(node['backrefs']):
+            backrefs = node['backrefs']
+            if len(backrefs) == 1:
+                backref_text = ('; <em><a href="#%s">backlink</a></em>'
+                                % backrefs[0])
+            else:
+                i = 1
+                backlinks = []
+                for backref in backrefs:
+                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
+                    i += 1
+                backref_text = ('; <em>backlinks: %s</em>'
+                                % ', '.join(backlinks))
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        self.body.append('System Message: %s/%s '
+                         '(<tt class="docutils">%s</tt>%s)%s</p>\n'
+                         % (node['type'], node['level'],
+                            self.encode(node['source']), line, backref_text))
+
+    def depart_system_message(self, node):
+        self.body.append('</div>\n')
+
+    def visit_table(self, node):
+        self.body.append(
+            self.starttag(node, 'table', CLASS='docutils', border="1"))
+
+    def depart_table(self, node):
+        self.body.append('</table>\n')
+
+    def visit_target(self, node):
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            self.body.append(self.starttag(node, 'span', '', CLASS='target'))
+            self.context.append('</span>')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n' or ''
+        self.body.append(self.starttag(node, 'tbody', valign='top'))
+
+    def depart_tbody(self, node):
+        self.body.append('</tbody>\n')
+
+    def visit_term(self, node):
+        self.body.append(self.starttag(node, 'dt', ''))
+
+    def depart_term(self, node):
+        """
+        Leave the end tag to `self.visit_definition()`, in case there's a
+        classifier.
+        """
+        pass
+
+    def visit_tgroup(self, node):
+        # Mozilla needs <colgroup>:
+        self.body.append(self.starttag(node, 'colgroup'))
+        # Appended by thead or tbody:
+        self.context.append('</colgroup>\n')
+        node.stubs = []
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n'
+        # There may or may not be a <thead>; this is for <tbody> to use:
+        self.context.append('')
+        self.body.append(self.starttag(node, 'thead', valign='bottom'))
+
+    def depart_thead(self, node):
+        self.body.append('</thead>\n')
+
+    def visit_title(self, node):
+        """Only 6 section levels are supported by HTML."""
+        check_id = 0
+        close_tag = '</p>\n'
+        if isinstance(node.parent, nodes.topic):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='topic-title first'))
+        elif isinstance(node.parent, nodes.sidebar):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='sidebar-title'))
+        elif isinstance(node.parent, nodes.Admonition):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='admonition-title'))
+        elif isinstance(node.parent, nodes.table):
+            self.body.append(
+                  self.starttag(node, 'caption', ''))
+            close_tag = '</caption>\n'
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
+            close_tag = '</h1>\n'
+            self.in_document_title = len(self.body)
+        else:
+            assert isinstance(node.parent, nodes.section)
+            h_level = self.section_level + self.initial_header_level - 1
+            atts = {}
+            if (len(node.parent) >= 2 and
+                isinstance(node.parent[1], nodes.subtitle)):
+                atts['CLASS'] = 'with-subtitle'
+            self.body.append(
+                  self.starttag(node, 'h%s' % h_level, '', **atts))
+            atts = {}
+            if node.hasattr('refid'):
+                atts['class'] = 'toc-backref'
+                atts['href'] = '#' + node['refid']
+            if atts:
+                self.body.append(self.starttag({}, 'a', '', **atts))
+                close_tag = '</a></h%s>\n' % (h_level)
+            else:
+                close_tag = '</h%s>\n' % (h_level)
+        self.context.append(close_tag)
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.title = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_title.extend(self.body)
+            del self.body[:]
+
+    def visit_title_reference(self, node):
+        self.body.append(self.starttag(node, 'cite', ''))
+
+    def depart_title_reference(self, node):
+        self.body.append('</cite>')
+
+    def visit_topic(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='topic'))
+        self.topic_classes = node['classes']
+
+    def depart_topic(self, node):
+        self.body.append('</div>\n')
+        self.topic_classes = []
+
+    def visit_transition(self, node):
+        self.body.append(self.emptytag(node, 'hr', CLASS='docutils'))
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version', meta=None)
+
+    def depart_version(self, node):
+        self.depart_docinfo_item()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+
+class SimpleListChecker(nodes.GenericNodeVisitor):
+
+    """
+    Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+    Here "simple" means a list item containing nothing other than a single
+    paragraph, a simple list, or a paragraph followed by a simple list.
+    """
+
+    def default_visit(self, node):
+        raise nodes.NodeFound
+
+    def visit_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        children = []
+        for child in node.children:
+            if not isinstance(child, nodes.Invisible):
+                children.append(child)
+        if (children and isinstance(children[0], nodes.paragraph)
+            and (isinstance(children[-1], nodes.bullet_list)
+                 or isinstance(children[-1], nodes.enumerated_list))):
+            children.pop()
+        if len(children) <= 1:
+            return
+        else:
+            raise nodes.NodeFound
+
+    def visit_paragraph(self, node):
+        raise nodes.SkipNode
+
+    def invisible_visit(self, node):
+        """Invisible nodes should be ignored."""
+        raise nodes.SkipNode
+
+    visit_comment = invisible_visit
+    visit_substitution_definition = invisible_visit
+    visit_target = invisible_visit
+    visit_pending = invisible_visit
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,273 @@
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+%(head_prefix)s
+%(head)s
+%(stylesheet)s
+%(body_prefix)s
+%(body_pre_docinfo)s
+%(docinfo)s
+%(body)s
+%(body_suffix)s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2177 @@
+# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $
+# Author: Engelbert Gruber <grubert@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# code contributions from several people included, thanks to all.
+# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
+#
+# convention deactivate code by two # e.g. ##.
+
+import sys
+import time
+import re
+import string
+from types import ListType
+from docutils import frontend, nodes, languages, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+
+from docutils.transforms.references import DanglingReferencesVisitor
+
+class Writer(writers.Writer):
+
+    supported = ('latex','latex2e')
+    """Formats this writer supports."""
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'The LaTeX "--output-encoding" default is "latin-1:strict".',
+        (('Specify documentclass.  Default is "article".',
+          ['--documentclass'],
+          {'default': 'article', }),
+         ('Specify document options.  Multiple options can be given, '
+          'separated by commas.  Default is "10pt,a4paper".',
+          ['--documentoptions'],
+          {'default': '10pt,a4paper', }),
+         ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). '
+          'Default: no, uses figures.',
+          ['--use-latex-footnotes'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "superscript".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Use LaTeX citations. '
+          'Default: no, uses figures which might get mixed with images.',
+          ['--use-latex-citations'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Specify a stylesheet file. The file will be "input" by latex in '
+          'the document header.  Default is no stylesheet ("").  '
+          'Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.',
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet'}),
+         ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) '
+          'supports only one ToC per document, but docutils does not know of '
+          'pagenumbers. LaTeX table of contents also means LaTeX generates '
+          'sectionnumbers.',
+          ['--use-latex-toc'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Add parts on top of the section hierarchy.',
+          ['--use-part-section'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Let LaTeX print author and date, do not show it in docutils '
+          'document info.',
+          ['--use-latex-docinfo'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Use LaTeX abstract environment for the documents abstract.'
+          'Per default the abstract is an unnumbered section.',
+          ['--use-latex-abstract'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Color of any hyperlinks embedded in text '
+          '(default: "blue", "0" to disable).',
+          ['--hyperlink-color'], {'default': 'blue'}),
+         ('Enable compound enumerators for nested enumerated lists '
+          '(e.g. "1.2.a.ii").  Default: disabled.',
+          ['--compound-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compound enumerators for nested enumerated lists.  This is '
+          'the default.',
+          ['--no-compound-enumerators'],
+          {'action': 'store_false', 'dest': 'compound_enumerators'}),
+         ('Enable section ("." subsection ...) prefixes for compound '
+          'enumerators.  This has no effect without --compound-enumerators.  '
+          'Default: disabled.',
+          ['--section-prefix-for-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable section prefixes for compound enumerators.  '
+          'This is the default.',
+          ['--no-section-prefix-for-enumerators'],
+          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
+         ('Set the separator between section number and enumerator '
+          'for compound enumerated lists.  Default is "-".',
+          ['--section-enumerator-separator'],
+          {'default': '-', 'metavar': '<char>'}),
+         ('When possibile, use verbatim for literal-blocks. '
+          'Default is to always use the mbox environment.',
+          ['--use-verbatim-when-possible'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Table style. "standard" with horizontal and vertical lines, '
+          '"booktabs" (LaTeX booktabs style) only horizontal lines '
+          'above and below the table and below the header or "nolines".  '
+          'Default: "standard"',
+          ['--table-style'],
+          {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard',
+           'metavar': '<format>'}),
+         ('LaTeX graphicx package option. '
+          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
+          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
+          'Default is no option.',
+          ['--graphicx-option'],
+          {'default': ''}),
+         ('LaTeX font encoding. '
+          'Possible values are "T1", "OT1", "" or some other fontenc option. '
+          'The font encoding influences available symbols, e.g. "<<" as one '
+          'character. Default is "" which leads to package "ae" (a T1 '
+          'emulation using CM fonts).',
+          ['--font-encoding'],
+          {'default': ''}),
+         ('Per default the latex-writer puts the reference title into '
+          'hyperreferences. Specify "ref*" or "pageref*" to get the section '
+          'number or the page number.',
+          ['--reference-label'],
+          {'default': None, }),
+         ('Specify style and database for bibtex, for example '
+          '"--use-bibtex=mystyle,mydb1,mydb2".',
+          ['--use-bibtex'],
+          {'default': None, }),
+          ),)
+
+    settings_defaults = {'output_encoding': 'latin-1'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'latex2e writer'
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = ("head_prefix", "head", 
+            "body_prefix", "body", "body_suffix")
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        # copy parts 
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+"""
+Notes on LaTeX
+--------------
+
+* LaTeX does not support multiple tocs in one document.
+  (might be no limitation except for docutils documentation)
+
+  The "minitoc" latex package can produce per-chapter tocs in
+  book and report document classes.
+
+* width
+
+  * linewidth - width of a line in the local environment
+  * textwidth - the width of text on the page
+
+  Maybe always use linewidth ?
+
+  *Bug* inside a minipage a (e.g. Sidebar) the linewidth is
+        not changed, needs fix in docutils so that tables
+        are not too wide.
+
+        So we add locallinewidth set it initially and
+        on entering sidebar and reset on exit.
+"""
+
+class Babel:
+    """Language specifics for LaTeX."""
+    # country code by a.schlock.
+    # partly manually converted from iso and babel stuff, dialects and some
+    _ISO639_TO_BABEL = {
+        'no': 'norsk',     #XXX added by hand ( forget about nynorsk?)
+        'gd': 'scottish',  #XXX added by hand
+        'hu': 'magyar',    #XXX added by hand
+        'pt': 'portuguese',#XXX added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',  #XXX rather than german
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    def __init__(self,lang):
+        self.language = lang
+        # pdflatex does not produce double quotes for ngerman in tt.
+        self.double_quote_replacment = None
+        if re.search('^de',self.language):
+            #self.quotes = ("\"`", "\"'")
+            self.quotes = ('{\\glqq}', '{\\grqq}')
+            self.double_quote_replacment = "{\\dq}"
+        elif re.search('^it',self.language):
+            self.quotes = ("``", "''")
+            self.double_quote_replacment = r'{\char`\"}'
+        else:
+            self.quotes = ("``", "''")
+        self.quote_index = 0
+
+    def next_quote(self):
+        q = self.quotes[self.quote_index]
+        self.quote_index = (self.quote_index+1)%2
+        return q
+
+    def quote_quotes(self,text):
+        t = None
+        for part in text.split('"'):
+            if t == None:
+                t = part
+            else:
+                t += self.next_quote() + part
+        return t
+
+    def double_quotes_in_tt (self,text):
+        if not self.double_quote_replacment:
+            return text
+        return text.replace('"', self.double_quote_replacment)
+
+    def get_language(self):
+        if self._ISO639_TO_BABEL.has_key(self.language):
+            return self._ISO639_TO_BABEL[self.language]
+        else:
+            # support dialects.
+            l = self.language.split("_")[0]
+            if self._ISO639_TO_BABEL.has_key(l):
+                return self._ISO639_TO_BABEL[l]
+        return None
+
+
+latex_headings = {
+        'optionlist_environment' : [
+              '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n'
+              '\\newenvironment{optionlist}[1]\n'
+              '{\\begin{list}{}\n'
+              '  {\\setlength{\\labelwidth}{#1}\n'
+              '   \\setlength{\\rightmargin}{1cm}\n'
+              '   \\setlength{\\leftmargin}{\\rightmargin}\n'
+              '   \\addtolength{\\leftmargin}{\\labelwidth}\n'
+              '   \\addtolength{\\leftmargin}{\\labelsep}\n'
+              '   \\renewcommand{\\makelabel}{\\optionlistlabel}}\n'
+              '}{\\end{list}}\n',
+              ],
+        'lineblock_environment' : [
+            '\\newlength{\\lineblockindentation}\n'
+            '\\setlength{\\lineblockindentation}{2.5em}\n'
+            '\\newenvironment{lineblock}[1]\n'
+            '{\\begin{list}{}\n'
+            '  {\\setlength{\\partopsep}{\\parskip}\n'
+            '   \\addtolength{\\partopsep}{\\baselineskip}\n'
+            '   \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n'
+            '   \\leftmargin#1}\n'
+            ' \\raggedright}\n'
+            '{\\end{list}}\n'
+            ],
+        'footnote_floats' : [
+            '% begin: floats for footnotes tweaking.\n',
+            '\\setlength{\\floatsep}{0.5em}\n',
+            '\\setlength{\\textfloatsep}{\\fill}\n',
+            '\\addtolength{\\textfloatsep}{3em}\n',
+            '\\renewcommand{\\textfraction}{0.5}\n',
+            '\\renewcommand{\\topfraction}{0.5}\n',
+            '\\renewcommand{\\bottomfraction}{0.5}\n',
+            '\\setcounter{totalnumber}{50}\n',
+            '\\setcounter{topnumber}{50}\n',
+            '\\setcounter{bottomnumber}{50}\n',
+            '% end floats for footnotes\n',
+            ],
+        'some_commands' : [
+            '% some commands, that could be overwritten in the style file.\n'
+            '\\newcommand{\\rubric}[1]'
+            '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n'
+            '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n'
+            '% end of "some commands"\n',
+            ]
+        }
+
+class DocumentClass:
+    """Details of a LaTeX document class."""
+
+    def __init__(self, document_class, with_part=False):
+        self.document_class = document_class
+        self._with_part = with_part
+
+    def section(self, level):
+        """ Return the section name at the given level for the specific
+            document class.
+
+            Level is 1,2,3..., as level 0 is the title."""
+
+        sections = [ 'section', 'subsection', 'subsubsection', 
+                     'paragraph', 'subparagraph' ]
+        if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'):
+            sections.insert(0, 'chapter')
+        if self._with_part:
+            sections.insert(0, 'part')
+        if level <= len(sections):
+            return sections[level-1]
+        else:
+            return sections[-1]
+
+class Table:
+    """ Manage a table while traversing.
+        Maybe change to a mixin defining the visit/departs, but then
+        class Table internal variables are in the Translator.
+
+        Table style might be 
+        
+        * standard: horizontal and vertical lines
+        * booktabs (requires booktabs latex package): only horizontal lines
+        * nolines, borderless : no lines
+    """
+    def __init__(self,latex_type,table_style):
+        self._latex_type = latex_type
+        self._table_style = table_style
+        self._open = 0
+        # miscellaneous attributes
+        self._attrs = {}
+        self._col_width = []
+        self._rowspan = []
+        self.stubs = []
+
+    def open(self):
+        self._open = 1
+        self._col_specs = []
+        self.caption = None
+        self._attrs = {}
+        self._in_head = 0 # maybe context with search
+    def close(self):
+        self._open = 0
+        self._col_specs = None
+        self.caption = None
+        self._attrs = {}
+        self.stubs = []
+    def is_open(self):
+        return self._open
+
+    def set_table_style(self, table_style):
+        if not table_style in ('standard','booktabs','borderless','nolines'):
+            return
+        self._table_style = table_style
+
+    def used_packages(self):
+        if self._table_style == 'booktabs':
+            return '\\usepackage{booktabs}\n'
+        return ''
+    def get_latex_type(self):
+        return self._latex_type
+
+    def set(self,attr,value):
+        self._attrs[attr] = value
+    def get(self,attr):
+        if self._attrs.has_key(attr):
+            return self._attrs[attr]
+        return None
+    def get_vertical_bar(self):
+        if self._table_style == 'standard':
+            return '|'
+        return ''
+    # horizontal lines are drawn below a row, because we.
+    def get_opening(self):
+        if self._latex_type == 'longtable':
+            # otherwise longtable might move before paragraph and subparagraph
+            prefix = '\\leavevmode\n'
+        else:
+            prefix = ''
+        return '%s\\begin{%s}[c]' % (prefix, self._latex_type)
+    def get_closing(self):
+        line = ""
+        if self._table_style == 'booktabs':
+            line = '\\bottomrule\n'
+        elif self._table_style == 'standard':
+            lines = '\\hline\n'
+        return '%s\\end{%s}' % (line,self._latex_type)
+
+    def visit_colspec(self, node):
+        self._col_specs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        self.stubs.append(node.attributes.get('stub'))
+
+    def get_colspecs(self):
+        """
+        Return column specification for longtable.
+
+        Assumes reST line length being 80 characters.
+        Table width is hairy.
+
+        === ===
+        ABC DEF
+        === ===
+
+        usually gets to narrow, therefore we add 1 (fiddlefactor).
+        """
+        width = 80
+
+        total_width = 0.0
+        # first see if we get too wide.
+        for node in self._col_specs:
+            colwidth = float(node['colwidth']+1) / width
+            total_width += colwidth
+        self._col_width = []
+        self._rowspan = []
+        # donot make it full linewidth
+        factor = 0.93
+        if total_width > 1.0:
+            factor /= total_width
+        bar = self.get_vertical_bar()
+        latex_table_spec = ""
+        for node in self._col_specs:
+            colwidth = factor * float(node['colwidth']+1) / width
+            self._col_width.append(colwidth+0.005)
+            self._rowspan.append(0)
+            latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005)
+        return latex_table_spec+bar
+
+    def get_column_width(self):
+        """ return columnwidth for current cell (not multicell)
+        """
+        return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1]
+
+    def visit_thead(self):
+        self._in_thead = 1
+        if self._table_style == 'standard':
+            return ['\\hline\n']
+        elif self._table_style == 'booktabs':
+            return ['\\toprule\n']
+        return []
+    def depart_thead(self):
+        a = []
+        #if self._table_style == 'standard':
+        #    a.append('\\hline\n')
+        if self._table_style == 'booktabs':
+            a.append('\\midrule\n')
+        if self._latex_type == 'longtable':
+            a.append('\\endhead\n')
+        # for longtable one could add firsthead, foot and lastfoot
+        self._in_thead = 0
+        return a
+    def visit_row(self):
+        self._cell_in_row = 0
+    def depart_row(self):
+        res = [' \\\\\n']
+        self._cell_in_row = None  # remove cell counter
+        for i in range(len(self._rowspan)):
+            if (self._rowspan[i]>0):
+                self._rowspan[i] -= 1
+
+        if self._table_style == 'standard':
+            rowspans = []
+            for i in range(len(self._rowspan)):
+                if (self._rowspan[i]<=0):
+                    rowspans.append(i+1)
+            if len(rowspans)==len(self._rowspan):
+                res.append('\\hline\n')
+            else:
+                cline = ''
+                rowspans.reverse()
+                # TODO merge clines
+                while 1:
+                    try:
+                        c_start = rowspans.pop()
+                    except:
+                        break
+                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
+                res.append(cline)
+        return res
+
+    def set_rowspan(self,cell,value):
+        try:
+            self._rowspan[cell] = value
+        except:
+            pass
+    def get_rowspan(self,cell):
+        try:
+            return self._rowspan[cell]
+        except:
+            return 0
+    def get_entry_number(self):
+        return self._cell_in_row
+    def visit_entry(self):
+        self._cell_in_row += 1
+    def is_stub_column(self):
+        if len(self.stubs) >= self._cell_in_row:
+            return self.stubs[self._cell_in_row-1]
+        return False
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+
+    # When options are given to the documentclass, latex will pass them
+    # to other packages, as done with babel.
+    # Dummy settings might be taken from document settings
+    
+    # Templates
+    # ---------
+    
+    latex_head = '\\documentclass[%s]{%s}\n'
+    linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n'
+    stylesheet = '\\input{%s}\n'
+    # add a generated on day , machine by user using docutils version.
+    generator = '% generated by Docutils <http://docutils.sourceforge.net/>\n'
+    # Config setting defaults
+    # -----------------------
+
+    # use latex tableofcontents or let docutils do it.
+    use_latex_toc = 0
+
+    # TODO: use mixins for different implementations.
+    # list environment for docinfo. else tabularx
+    use_optionlist_for_docinfo = 0 # NOT YET IN USE
+
+    # Use compound enumerations (1.A.1.)
+    compound_enumerators = 0
+
+    # If using compound enumerations, include section information.
+    section_prefix_for_enumerators = 0
+
+    # This is the character that separates the section ("." subsection ...)
+    # prefix from the regular list enumerator.
+    section_enumerator_separator = '-'
+
+    # default link color
+    hyperlink_color = "blue"
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
+        self.use_latex_toc = settings.use_latex_toc
+        self.use_latex_docinfo = settings.use_latex_docinfo
+        self.use_latex_footnotes = settings.use_latex_footnotes
+        self._use_latex_citations = settings.use_latex_citations
+        self._reference_label = settings.reference_label
+        self.hyperlink_color = settings.hyperlink_color
+        self.compound_enumerators = settings.compound_enumerators
+        self.font_encoding = settings.font_encoding
+        self.section_prefix_for_enumerators = (
+            settings.section_prefix_for_enumerators)
+        self.section_enumerator_separator = (
+            settings.section_enumerator_separator.replace('_', '\\_'))
+        if self.hyperlink_color == '0':
+            self.hyperlink_color = 'black'
+            self.colorlinks = 'false'
+        else:
+            self.colorlinks = 'true'
+
+        if self.settings.use_bibtex:
+            self.bibtex = self.settings.use_bibtex.split(",",1)
+            # TODO avoid errors on not declared citations.
+        else:
+            self.bibtex = None
+        # language: labels, bibliographic_fields, and author_separators.
+        # to allow writing labes for specific languages.
+        self.language = languages.get_language(settings.language_code)
+        self.babel = Babel(settings.language_code)
+        self.author_separator = self.language.author_separators[0]
+        self.d_options = self.settings.documentoptions
+        if self.babel.get_language():
+            self.d_options += ',%s' % self.babel.get_language()
+
+        self.d_class = DocumentClass(settings.documentclass, 
+                                     settings.use_part_section)
+        # object for a table while proccessing.
+        self.table_stack = []
+        self.active_table = Table('longtable',settings.table_style)
+
+        # HACK.  Should have more sophisticated typearea handling.
+        if settings.documentclass.find('scr') == -1:
+            self.typearea = '\\usepackage[DIV12]{typearea}\n'
+        else:
+            if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1:
+                self.typearea = '\\typearea{12}\n'
+            else:
+                self.typearea = ''
+
+        if self.font_encoding == 'OT1':
+            fontenc_header = ''
+        elif self.font_encoding == '':
+            fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n'
+        else:
+            fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,)
+        if self.latex_encoding.startswith('utf8'):
+            input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n'
+        else:
+            input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding
+        if self.settings.graphicx_option == '':
+            self.graphicx_package = '\\usepackage{graphicx}\n'
+        elif self.settings.graphicx_option.lower() == 'auto':
+            self.graphicx_package = '\n'.join(
+                ('%Check if we are compiling under latex or pdflatex',
+                 '\\ifx\\pdftexversion\\undefined',
+                 '  \\usepackage{graphicx}',
+                 '\\else',
+                 '  \\usepackage[pdftex]{graphicx}',
+                 '\\fi\n'))
+        else:
+            self.graphicx_package = (
+                '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option)
+
+        self.head_prefix = [
+              self.latex_head % (self.d_options,self.settings.documentclass),
+              '\\usepackage{babel}\n',     # language is in documents settings.
+              fontenc_header,
+              '\\usepackage{shortvrb}\n',  # allows verb in footnotes.
+              input_encoding,
+              # * tabularx: for docinfo, automatic width of columns, always on one page.
+              '\\usepackage{tabularx}\n',
+              '\\usepackage{longtable}\n',
+              self.active_table.used_packages(),
+              # possible other packages.
+              # * fancyhdr
+              # * ltxtable is a combination of tabularx and longtable (pagebreaks).
+              #   but ??
+              #
+              # extra space between text in tables and the line above them
+              '\\setlength{\\extrarowheight}{2pt}\n',
+              '\\usepackage{amsmath}\n',   # what fore amsmath.
+              self.graphicx_package,
+              '\\usepackage{color}\n',
+              '\\usepackage{multirow}\n',
+              '\\usepackage{ifthen}\n',   # before hyperref!
+              self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
+              self.typearea,
+              self.generator,
+              # latex lengths
+              '\\newlength{\\admonitionwidth}\n',
+              '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n'
+              # width for docinfo tablewidth
+              '\\newlength{\\docinfowidth}\n',
+              '\\setlength{\\docinfowidth}{0.9\\textwidth}\n'
+              # linewidth of current environment, so tables are not wider
+              # than the sidebar: using locallinewidth seems to defer evaluation
+              # of linewidth, this is fixing it.
+              '\\newlength{\\locallinewidth}\n',
+              # will be set later.
+              ]
+        self.head_prefix.extend( latex_headings['optionlist_environment'] )
+        self.head_prefix.extend( latex_headings['lineblock_environment'] )
+        self.head_prefix.extend( latex_headings['footnote_floats'] )
+        self.head_prefix.extend( latex_headings['some_commands'] )
+        ## stylesheet is last: so it might be possible to overwrite defaults.
+        stylesheet = utils.get_stylesheet_reference(settings)
+        if stylesheet:
+            settings.record_dependencies.add(stylesheet)
+            self.head_prefix.append(self.stylesheet % (stylesheet))
+
+        if self.linking: # and maybe check for pdf
+            self.pdfinfo = [ ]
+            self.pdfauthor = None
+            # pdftitle, pdfsubject, pdfauthor, pdfkeywords, 
+            # pdfcreator, pdfproducer
+        else:
+            self.pdfinfo = None
+        # NOTE: Latex wants a date and an author, rst puts this into
+        #   docinfo, so normally we do not want latex author/date handling.
+        # latex article has its own handling of date and author, deactivate.
+        # self.astext() adds \title{...} \author{...} \date{...}, even if the
+        # "..." are empty strings.
+        self.head = [ ]
+        # separate title, so we can appen subtitle.
+        self.title = ''
+        # if use_latex_docinfo: collects lists of author/organization/contact/address lines
+        self.author_stack = []
+        self.date = ''
+
+        self.body_prefix = ['\\raggedbottom\n']
+        self.body = []
+        self.body_suffix = ['\n']
+        self.section_level = 0
+        self.context = []
+        self.topic_classes = []
+        # column specification for tables
+        self.table_caption = None
+        
+        # Flags to encode
+        # ---------------
+        # verbatim: to tell encode not to encode.
+        self.verbatim = 0
+        # insert_newline: to tell encode to replace blanks by "~".
+        self.insert_none_breaking_blanks = 0
+        # insert_newline: to tell encode to add latex newline.
+        self.insert_newline = 0
+        # mbox_newline: to tell encode to add mbox and newline.
+        self.mbox_newline = 0
+        # inside citation reference labels underscores dont need to be escaped.
+        self.inside_citation_reference_label = 0
+
+        # Stack of section counters so that we don't have to use_latex_toc.
+        # This will grow and shrink as processing occurs.
+        # Initialized for potential first-level sections.
+        self._section_number = [0]
+
+        # The current stack of enumerations so that we can expand
+        # them into a compound enumeration.  
+        self._enumeration_counters = []
+
+        # The maximum number of enumeration counters we've used.
+        # If we go beyond this number, we need to create a new
+        # counter; otherwise, just reuse an old one.
+        self._max_enumeration_counters = 0
+
+        self._bibitems = []
+
+        # docinfo.
+        self.docinfo = None
+        # inside literal block: no quote mangling.
+        self.literal_block = 0
+        self.literal_block_stack = []
+        self.literal = 0
+        # true when encoding in math mode
+        self.mathmode = 0
+
+    def to_latex_encoding(self,docutils_encoding):
+        """
+        Translate docutils encoding name into latex's.
+
+        Default fallback method is remove "-" and "_" chars from docutils_encoding.
+
+        """
+        tr = {  "iso-8859-1": "latin1",     # west european
+                "iso-8859-2": "latin2",     # east european
+                "iso-8859-3": "latin3",     # esperanto, maltese
+                "iso-8859-4": "latin4",     # north european,scandinavian, baltic
+                "iso-8859-5": "iso88595",   # cyrillic (ISO)
+                "iso-8859-9": "latin5",     # turkish
+                "iso-8859-15": "latin9",    # latin9, update to latin1.
+                "mac_cyrillic": "maccyr",   # cyrillic (on Mac)
+                "windows-1251": "cp1251",   # cyrillic (on Windows)
+                "koi8-r": "koi8-r",         # cyrillic (Russian)
+                "koi8-u": "koi8-u",         # cyrillic (Ukrainian)
+                "windows-1250": "cp1250",   #
+                "windows-1252": "cp1252",   #
+                "us-ascii": "ascii",        # ASCII (US)
+                # unmatched encodings
+                #"": "applemac",
+                #"": "ansinew",  # windows 3.1 ansi
+                #"": "ascii",    # ASCII encoding for the range 32--127.
+                #"": "cp437",    # dos latine us
+                #"": "cp850",    # dos latin 1
+                #"": "cp852",    # dos latin 2
+                #"": "decmulti",
+                #"": "latin10",
+                #"iso-8859-6": ""   # arabic
+                #"iso-8859-7": ""   # greek
+                #"iso-8859-8": ""   # hebrew
+                #"iso-8859-10": ""   # latin6, more complete iso-8859-4
+             }
+        if tr.has_key(docutils_encoding.lower()):
+            return tr[docutils_encoding.lower()]
+        # convert: latin-1 and utf-8 and similar things
+        return docutils_encoding.replace("_", "").replace("-", "").lower()
+
+    def language_label(self, docutil_label):
+        return self.language.labels[docutil_label]
+
+    latex_equivalents = {
+        u'\u00A0' : '~',
+        u'\u2013' : '{--}',
+        u'\u2014' : '{---}',
+        u'\u2018' : '`',
+        u'\u2019' : '\'',
+        u'\u201A' : ',',
+        u'\u201C' : '``',
+        u'\u201D' : '\'\'',
+        u'\u201E' : ',,',
+        u'\u2020' : '{\\dag}',
+        u'\u2021' : '{\\ddag}',
+        u'\u2026' : '{\\dots}',
+        u'\u2122' : '{\\texttrademark}',
+        u'\u21d4' : '{$\\Leftrightarrow$}',
+        # greek alphabet ?
+    }
+
+    def unicode_to_latex(self,text):
+        # see LaTeX codec
+        # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
+        # Only some special chracters are translated, for documents with many
+        # utf-8 chars one should use the LaTeX unicode package.
+        for uchar in self.latex_equivalents.keys():
+            text = text.replace(uchar,self.latex_equivalents[uchar])
+        return text
+
+    def ensure_math(self, text):
+        if not self.__dict__.has_key('ensure_math_re'):
+            chars = {
+                # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div
+                'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' ,
+                # also latin5 and latin9
+                }
+            self.ensure_math_re = re.compile('([%s])' % chars['latin1'])
+        text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text)
+        return text
+
+    def encode(self, text):
+        """
+        Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return
+        """
+        # Escaping with a backslash does not help with backslashes, ~ and ^.
+
+        #     < > are only available in math-mode or tt font. (really ?)
+        #     $ starts math- mode.
+        # AND quotes
+        if self.verbatim:
+            return text
+        # compile the regexps once. do it here so one can see them.
+        #
+        # first the braces.
+        if not self.__dict__.has_key('encode_re_braces'):
+            self.encode_re_braces = re.compile(r'([{}])')
+        text = self.encode_re_braces.sub(r'{\\\1}',text)
+        if not self.__dict__.has_key('encode_re_bslash'):
+            # find backslash: except in the form '{\{}' or '{\}}'.
+            self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
+        # then the backslash: except in the form from line above:
+        # either '{\{}' or '{\}}'.
+        text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
+
+        # then dollar
+        text = text.replace("$", '{\\$}')
+        if not ( self.literal_block or self.literal or self.mathmode ):
+            # the vertical bar: in mathmode |,\vert or \mid
+            #   in textmode \textbar
+            text = text.replace("|", '{\\textbar}')
+            text = text.replace("<", '{\\textless}')
+            text = text.replace(">", '{\\textgreater}')
+        # then
+        text = text.replace("&", '{\\&}')
+        # the ^:
+        # * verb|^| does not work in mbox.
+        # * mathmode has wedge. hat{~} would also work.
+        # text = text.replace("^", '{\\ensuremath{^\\wedge}}')
+        text = text.replace("^", '{\\textasciicircum}')
+        text = text.replace("%", '{\\%}')
+        text = text.replace("#", '{\\#}')
+        text = text.replace("~", '{\\textasciitilde}')
+        # Separate compound characters, e.g. "--" to "-{}-".  (The
+        # actual separation is done later; see below.)
+        separate_chars = '-'
+        if self.literal_block or self.literal:
+            # In monospace-font, we also separate ",,", "``" and "''"
+            # and some other characters which can't occur in
+            # non-literal text.
+            separate_chars += ',`\'"<>'
+            # pdflatex does not produce doublequotes for ngerman.
+            text = self.babel.double_quotes_in_tt(text)
+            if self.font_encoding == 'OT1':
+                # We're using OT1 font-encoding and have to replace
+                # underscore by underlined blank, because this has
+                # correct width.
+                text = text.replace('_', '{\\underline{ }}')
+                # And the tt-backslash doesn't work in OT1, so we use
+                # a mirrored slash.
+                text = text.replace('\\textbackslash', '\\reflectbox{/}')
+            else:
+                text = text.replace('_', '{\\_}')
+        else:
+            text = self.babel.quote_quotes(text)
+            if not self.inside_citation_reference_label:
+                text = text.replace("_", '{\\_}')
+        for char in separate_chars * 2:
+            # Do it twice ("* 2") becaues otherwise we would replace
+            # "---" by "-{}--".
+            text = text.replace(char + char, char + '{}' + char)
+        if self.insert_newline or self.literal_block:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace("\n", '~\\\\\n')
+        elif self.mbox_newline:
+            if self.literal_block:
+                closings = "}" * len(self.literal_block_stack)
+                openings = "".join(self.literal_block_stack)
+            else:
+                closings = ""
+                openings = ""
+            text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings))
+        text = text.replace('[', '{[}').replace(']', '{]}')
+        if self.insert_none_breaking_blanks:
+            text = text.replace(' ', '~')
+        if self.latex_encoding != 'utf8':
+            text = self.unicode_to_latex(text)
+            text = self.ensure_math(text)
+        return text
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, encode, and return attribute value text."""
+        return self.encode(whitespace.sub(' ', text))
+
+    def astext(self):
+        if self.pdfinfo is not None and self.pdfauthor:
+            self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor)
+        if self.pdfinfo:
+            pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n'
+        else:
+            pdfinfo = ''
+        head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \
+               (self.title,
+                ' \\and\n'.join(['~\\\\\n'.join(author_lines)
+                                 for author_lines in self.author_stack]),
+                self.date)
+        return ''.join(self.head_prefix + [head] + self.head + [pdfinfo]
+                        + self.body_prefix  + self.body + self.body_suffix)
+
+    def visit_Text(self, node):
+        self.body.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address')
+
+    def depart_address(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_admonition(self, node, name=''):
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
+        if name:
+            self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
+        self.body.append('\\vspace{2mm}\n')
+
+
+    def depart_admonition(self, node=None):
+        self.body.append('}}\n') # end parbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_author(self, node):
+        self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_authors(self, node):
+        # not used: visit_author is called anyway for each author.
+        pass
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.body.append( '\\begin{quote}\n')
+
+    def depart_block_quote(self, node):
+        self.body.append( '\\end{quote}\n')
+
+    def visit_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            if self.use_latex_toc:
+                raise nodes.SkipNode
+            self.body.append( '\\begin{list}{}{}\n' )
+        else:
+            self.body.append( '\\begin{itemize}\n' )
+
+    def depart_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            self.body.append( '\\end{list}\n' )
+        else:
+            self.body.append( '\\end{itemize}\n' )
+
+    # Imperfect superscript/subscript handling: mathmode italicizes
+    # all letters by default.
+    def visit_superscript(self, node):
+        self.body.append('$^{')
+        self.mathmode = 1
+
+    def depart_superscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_subscript(self, node):
+        self.body.append('$_{')
+        self.mathmode = 1
+
+    def depart_subscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_caption(self, node):
+        self.body.append( '\\caption{' )
+
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_title_reference(self, node):
+        self.body.append( '\\titlereference{' )
+
+    def depart_title_reference(self, node):
+        self.body.append( '}' )
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        if self._use_latex_citations:
+            self.context.append(len(self.body))
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_citation(self, node):
+        if self._use_latex_citations:
+            size = self.context.pop()
+            label = self.body[size]
+            text = ''.join(self.body[size+1:])
+            del self.body[size:]
+            self._bibitems.append([label, text])
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('\\cite{')
+            self.inside_citation_reference_label = 1
+        else:
+            href = ''
+            if node.has_key('refid'):
+                href = node['refid']
+            elif node.has_key('refname'):
+                href = self.document.nameids[node['refname']]
+            self.body.append('[\\hyperlink{%s}{' % href)
+
+    def depart_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('}')
+            self.inside_citation_reference_label = 0
+        else:
+            self.body.append('}]')
+
+    def visit_classifier(self, node):
+        self.body.append( '(\\textbf{' )
+
+    def depart_classifier(self, node):
+        self.body.append( '})\n' )
+
+    def visit_colspec(self, node):
+        self.active_table.visit_colspec(node)
+
+    def depart_colspec(self, node):
+        pass
+
+    def visit_comment(self, node):
+        # Escape end of line by a new comment start in comment text.
+        self.body.append('%% %s \n' % node.astext().replace('\n', '\n% '))
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact')
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_container(self, node):
+        pass
+
+    def depart_container(self, node):
+        pass
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        pass
+
+    def depart_definition(self, node):
+        self.body.append('\n')
+
+    def visit_definition_list(self, node):
+        self.body.append( '\\begin{description}\n' )
+
+    def depart_definition_list(self, node):
+        self.body.append( '\\end{description}\n' )
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append( ' ' )
+
+    def depart_description(self, node):
+        pass
+
+    def visit_docinfo(self, node):
+        self.docinfo = []
+        self.docinfo.append('%' + '_'*75 + '\n')
+        self.docinfo.append('\\begin{center}\n')
+        self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n')
+
+    def depart_docinfo(self, node):
+        self.docinfo.append('\\end{tabularx}\n')
+        self.docinfo.append('\\end{center}\n')
+        self.body = self.docinfo + self.body
+        # clear docinfo, so field names are no longer appended.
+        self.docinfo = None
+
+    def visit_docinfo_item(self, node, name):
+        if name == 'author':
+            if not self.pdfinfo == None:
+                if not self.pdfauthor:
+                    self.pdfauthor = self.attval(node.astext())
+                else:
+                    self.pdfauthor += self.author_separator + self.attval(node.astext())
+        if self.use_latex_docinfo:
+            if name in ('author', 'organization', 'contact', 'address'):
+                # We attach these to the last author.  If any of them precedes
+                # the first author, put them in a separate "author" group (for
+                # no better semantics).
+                if name == 'author' or not self.author_stack:
+                    self.author_stack.append([])
+                if name == 'address':   # newlines are meaningful
+                    self.insert_newline = 1
+                    text = self.encode(node.astext())
+                    self.insert_newline = 0
+                else:
+                    text = self.attval(node.astext())
+                self.author_stack[-1].append(text)
+                raise nodes.SkipNode
+            elif name == 'date':
+                self.date = self.attval(node.astext())
+                raise nodes.SkipNode
+        self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name))
+        if name == 'address':
+            self.insert_newline = 1
+            self.docinfo.append('{\\raggedright\n')
+            self.context.append(' } \\\\\n')
+        else:
+            self.context.append(' \\\\\n')
+        self.context.append(self.docinfo)
+        self.context.append(len(self.body))
+
+    def depart_docinfo_item(self, node):
+        size = self.context.pop()
+        dest = self.context.pop()
+        tail = self.context.pop()
+        tail = self.body[size:] + [tail]
+        del self.body[size:]
+        dest.extend(tail)
+        # for address we did set insert_newline
+        self.insert_newline = 0
+
+    def visit_doctest_block(self, node):
+        self.body.append( '\\begin{verbatim}' )
+        self.verbatim = 1
+
+    def depart_doctest_block(self, node):
+        self.body.append( '\\end{verbatim}\n' )
+        self.verbatim = 0
+
+    def visit_document(self, node):
+        self.body_prefix.append('\\begin{document}\n')
+        # titled document?
+        if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title):
+            self.body_prefix.append('\\maketitle\n')
+            # alternative use titlepage environment.
+            # \begin{titlepage}
+            # ...
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+    def depart_document(self, node):
+        # TODO insertion point of bibliography should none automatic.
+        if self._use_latex_citations and len(self._bibitems)>0:
+            if not self.bibtex:
+                widest_label = ""
+                for bi in self._bibitems:
+                    if len(widest_label)<len(bi[0]):
+                        widest_label = bi[0]
+                self.body.append('\n\\begin{thebibliography}{%s}\n'%widest_label)
+                for bi in self._bibitems:
+                    # cite_key: underscores must not be escaped
+                    cite_key = bi[0].replace(r"{\_}","_")
+                    self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+                self.body.append('\\end{thebibliography}\n')
+            else:
+                self.body.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0])
+                self.body.append('\\bibliography{%s}\n' % self.bibtex[1])
+
+        self.body_suffix.append('\\end{document}\n')
+
+    def visit_emphasis(self, node):
+        self.body.append('\\emph{')
+        self.literal_block_stack.append('\\emph{')
+
+    def depart_emphasis(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_entry(self, node):
+        self.active_table.visit_entry()
+        # cell separation
+        if self.active_table.get_entry_number() == 1:
+            # if the firstrow is a multirow, this actually is the second row.
+            # this gets hairy if rowspans follow each other.
+            if self.active_table.get_rowspan(0):
+                count = 0
+                while self.active_table.get_rowspan(count):
+                    count += 1
+                    self.body.append(' & ')
+                self.active_table.visit_entry() # increment cell count
+        else:
+            self.body.append(' & ')
+
+        # multi{row,column}
+        # IN WORK BUG TODO HACK continues here
+        # multirow in LaTeX simply will enlarge the cell over several rows
+        # (the following n if n is positive, the former if negative).
+        if node.has_key('morerows') and node.has_key('morecols'):
+            raise NotImplementedError('Cells that '
+            'span multiple rows *and* columns are not supported, sorry.')
+        if node.has_key('morerows'):
+            count = node['morerows'] + 1
+            self.active_table.set_rowspan(self.active_table.get_entry_number()-1,count)
+            self.body.append('\\multirow{%d}{%s}{' % \
+                    (count,self.active_table.get_column_width()))
+            self.context.append('}')
+            # BUG following rows must have empty cells.
+        elif node.has_key('morecols'):
+            # the vertical bar before column is missing if it is the first column.
+            # the one after always.
+            if self.active_table.get_entry_number() == 1:
+                bar1 = self.active_table.get_vertical_bar()
+            else:
+                bar1 = ''
+            count = node['morecols'] + 1
+            self.body.append('\\multicolumn{%d}{%sl%s}{' % \
+                    (count, bar1, self.active_table.get_vertical_bar()))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+        # header / not header
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        elif self.active_table.is_stub_column():
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header / not header
+        self.body.append(self.context.pop()) # multirow/column
+        # if following row is spanned from above.
+        if self.active_table.get_rowspan(self.active_table.get_entry_number()):
+           self.body.append(' & ')
+           self.active_table.visit_entry() # increment cell count
+
+    def visit_row(self, node):
+        self.active_table.visit_row()
+
+    def depart_row(self, node):
+        self.body.extend(self.active_table.depart_row())
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.
+        # This allows to set the style and starting value
+        # and unlimited nesting.
+        enum_style = {'arabic':'arabic',
+                'loweralpha':'alph',
+                'upperalpha':'Alph',
+                'lowerroman':'roman',
+                'upperroman':'Roman' }
+        enum_suffix = ""
+        if node.has_key('suffix'):
+            enum_suffix = node['suffix']
+        enum_prefix = ""
+        if node.has_key('prefix'):
+            enum_prefix = node['prefix']
+        if self.compound_enumerators:
+            pref = ""
+            if self.section_prefix_for_enumerators and self.section_level:
+                for i in range(self.section_level):
+                    pref += '%d.' % self._section_number[i]
+                pref = pref[:-1] + self.section_enumerator_separator
+                enum_prefix += pref
+            for ctype, cname in self._enumeration_counters:
+                enum_prefix += '\\%s{%s}.' % (ctype, cname)
+        enum_type = "arabic"
+        if node.has_key('enumtype'):
+            enum_type = node['enumtype']
+        if enum_style.has_key(enum_type):
+            enum_type = enum_style[enum_type]
+
+        counter_name = "listcnt%d" % len(self._enumeration_counters)
+        self._enumeration_counters.append((enum_type, counter_name))
+        # If we haven't used this counter name before, then create a
+        # new counter; otherwise, reset & reuse the old counter.
+        if len(self._enumeration_counters) > self._max_enumeration_counters:
+            self._max_enumeration_counters = len(self._enumeration_counters)
+            self.body.append('\\newcounter{%s}\n' % counter_name)
+        else:
+            self.body.append('\\setcounter{%s}{0}\n' % counter_name)
+            
+        self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \
+            (enum_prefix,enum_type,counter_name,enum_suffix))
+        self.body.append('{\n')
+        self.body.append('\\usecounter{%s}\n' % counter_name)
+        # set start after usecounter, because it initializes to zero.
+        if node.has_key('start'):
+            self.body.append('\\addtocounter{%s}{%d}\n' \
+                    % (counter_name,node['start']-1))
+        ## set rightmargin equal to leftmargin
+        self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
+        self.body.append('}\n')
+
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{list}\n')
+        self._enumeration_counters.pop()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_field(self, node):
+        # real output is done in siblings: _argument, _body, _name
+        pass
+
+    def depart_field(self, node):
+        self.body.append('\n')
+        ##self.body.append('%[depart_field]\n')
+
+    def visit_field_argument(self, node):
+        self.body.append('%[visit_field_argument]\n')
+
+    def depart_field_argument(self, node):
+        self.body.append('%[depart_field_argument]\n')
+
+    def visit_field_body(self, node):
+        # BUG by attach as text we loose references.
+        if self.docinfo:
+            self.docinfo.append('%s \\\\\n' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        # BUG: what happens if not docinfo
+
+    def depart_field_body(self, node):
+        self.body.append( '\n' )
+
+    def visit_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\begin{quote}\n')
+            self.body.append('\\begin{description}\n')
+
+    def depart_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\end{description}\n')
+            self.body.append('\\end{quote}\n')
+
+    def visit_field_name(self, node):
+        # BUG this duplicates docinfo_item
+        if self.docinfo:
+            self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        else:
+            self.body.append('\\item [')
+
+    def depart_field_name(self, node):
+        if not self.docinfo:
+            self.body.append(':]')
+
+    def visit_figure(self, node):
+        if (not node.attributes.has_key('align') or
+            node.attributes['align'] == 'center'):
+            # centering does not add vertical space like center.
+            align = '\n\\centering'
+            align_end = ''
+        else:
+            # TODO non vertical space for other alignments.
+            align = '\\begin{flush%s}' % node.attributes['align']
+            align_end = '\\end{flush%s}' % node.attributes['align']
+        self.body.append( '\\begin{figure}[htbp]%s\n' % align )
+        self.context.append( '%s\\end{figure}\n' % align_end )
+
+    def depart_figure(self, node):
+        self.body.append( self.context.pop() )
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = (['\n\\begin{center}\small\n']
+                  + self.body[start:] + ['\n\\end{center}\n'])
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        if self.use_latex_footnotes:
+            num,text = node.astext().split(None,1)
+            num = self.encode(num.strip())
+            self.body.append('\\footnotetext['+num+']')
+            self.body.append('{')
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_footnote(self, node):
+        if self.use_latex_footnotes:
+            self.body.append('}\n')
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            self.body.append("\\footnotemark["+self.encode(node.astext())+"]")
+            raise nodes.SkipNode
+        href = ''
+        if node.has_key('refid'):
+            href = node['refid']
+        elif node.has_key('refname'):
+            href = self.document.nameids[node['refname']]
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        elif format == 'superscript':
+            suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
+            self.context.append('}')
+        else:                           # shouldn't happen
+            raise AssertionError('Illegal footnote reference format.')
+        self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
+
+    def depart_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            return
+        self.body.append('}%s' % self.context.pop())
+
+    # footnote/citation label
+    def label_delim(self, node, bracket, superscript):
+        if isinstance(node.parent, nodes.footnote):
+            if self.use_latex_footnotes:
+                raise nodes.SkipNode
+            if self.settings.footnote_references == 'brackets':
+                self.body.append(bracket)
+            else:
+                self.body.append(superscript)
+        else:
+            assert isinstance(node.parent, nodes.citation)
+            if not self._use_latex_citations:
+                self.body.append(bracket)
+
+    def visit_label(self, node):
+        self.label_delim(node, '[', '$^{')
+
+    def depart_label(self, node):
+        self.label_delim(node, ']', '}$')
+
+    # elements generated by the framework e.g. section numbers.
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        self.body_prefix.append('\n\\verb|begin_header|\n')
+        self.body_prefix.extend(self.body[start:])
+        self.body_prefix.append('\n\\verb|end_header|\n')
+        del self.body[start:]
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def latex_image_length(self, width_str):
+        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+        if not match:
+            # fallback
+            return width_str
+        res = width_str
+        amount, unit = match.groups()[:2]
+        if unit == "px":
+            # LaTeX does not know pixels but points
+            res = "%spt" % amount
+        elif unit == "%":
+            res = "%.3f\\linewidth" % (float(amount)/100.0)
+        return res
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        # Add image URI to dependency list, assuming that it's
+        # referring to a local file.
+        self.settings.record_dependencies.add(attrs['uri'])
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = []
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            include_graphics_options.append('width=%s' % (
+                            self.latex_image_length(attrs['width']), ))
+        if attrs.has_key('height'):
+            include_graphics_options.append('height=%s' % (
+                            self.latex_image_length(attrs['height']), ))
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        self.body.extend( pre )
+        options = ''
+        if len(include_graphics_options)>0:
+            options = '[%s]' % (','.join(include_graphics_options))
+        self.body.append( '\\includegraphics%s{%s}' % (
+                            options, attrs['uri'] ) )
+        self.body.extend( post )
+
+    def depart_image(self, node):
+        pass
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_interpreted(self, node):
+        # @@@ Incomplete, pending a proper implementation on the
+        # Parser/Reader end.
+        self.visit_literal(node)
+
+    def depart_interpreted(self, node):
+        self.depart_literal(node)
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_line(self, node):
+        self.body.append('\item[] ')
+
+    def depart_line(self, node):
+        self.body.append('\n')
+
+    def visit_line_block(self, node):
+        if isinstance(node.parent, nodes.line_block):
+            self.body.append('\\item[] \n'
+                             '\\begin{lineblock}{\\lineblockindentation}\n')
+        else:
+            self.body.append('\n\\begin{lineblock}{0em}\n')
+
+    def depart_line_block(self, node):
+        self.body.append('\\end{lineblock}\n')
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append('\\item {} ')
+
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_literal(self, node):
+        self.literal = 1
+        self.body.append('\\texttt{')
+
+    def depart_literal(self, node):
+        self.body.append('}')
+        self.literal = 0
+
+    def visit_literal_block(self, node):
+        """
+        Render a literal-block.
+
+        Literal blocks are used for "::"-prefixed literal-indented
+        blocks of text, where the inline markup is not recognized,
+        but are also the product of the parsed-literal directive,
+        where the markup is respected.
+        """
+        # In both cases, we want to use a typewriter/monospaced typeface.
+        # For "real" literal-blocks, we can use \verbatim, while for all
+        # the others we must use \mbox.
+        #
+        # We can distinguish between the two kinds by the number of
+        # siblings that compose this node: if it is composed by a
+        # single element, it's surely either a real one or a
+        # parsed-literal that does not contain any markup.
+        #
+        if not self.active_table.is_open():
+            # no quote inside tables, to avoid vertical space between
+            # table border and literal block.
+            # BUG: fails if normal text preceeds the literal block.
+            self.body.append('\\begin{quote}')
+            self.context.append('\\end{quote}\n')
+        else:
+            self.body.append('\n')
+            self.context.append('\n')
+        if (self.settings.use_verbatim_when_possible and (len(node) == 1)
+              # in case of a parsed-literal containing just a "**bold**" word:
+              and isinstance(node[0], nodes.Text)):
+            self.verbatim = 1
+            self.body.append('\\begin{verbatim}\n')
+        else:
+            self.literal_block = 1
+            self.insert_none_breaking_blanks = 1
+            self.body.append('{\\ttfamily \\raggedright \\noindent\n')
+            # * obey..: is from julien and never worked for me (grubert).
+            #   self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n')
+
+    def depart_literal_block(self, node):
+        if self.verbatim:
+            self.body.append('\n\\end{verbatim}\n')
+            self.verbatim = 0
+        else:
+            self.body.append('\n}')
+            self.insert_none_breaking_blanks = 0
+            self.literal_block = 0
+            # obey end: self.body.append('}\n')
+        self.body.append(self.context.pop())
+
+    def visit_meta(self, node):
+        self.body.append('[visit_meta]\n')
+        # BUG maybe set keywords for pdf
+        ##self.head.append(self.starttag(node, 'meta', **node.attributes))
+
+    def depart_meta(self, node):
+        self.body.append('[depart_meta]\n')
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+
+    def depart_note(self, node):
+        self.depart_admonition()
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+
+    def depart_option(self, node):
+        # flag tha the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.body.append('\\item [')
+        # flag for first option
+        self.context.append(0)
+
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.body.append('] ')
+
+    def visit_option_list(self, node):
+        self.body.append('\\begin{optionlist}{3cm}\n')
+
+    def depart_option_list(self, node):
+        self.body.append('\\end{optionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ##self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+        pass
+
+    def depart_option_string(self, node):
+        ##self.body.append('</span>')
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_paragraph(self, node):
+        index = node.parent.index(node)
+        if not ('contents' in self.topic_classes or
+                (isinstance(node.parent, nodes.compound) and
+                 index > 0 and
+                 not isinstance(node.parent[index - 1], nodes.paragraph) and
+                 not isinstance(node.parent[index - 1], nodes.compound))):
+            self.body.append('\n')
+
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_problematic(self, node):
+        self.body.append('{\\color{red}\\bfseries{}')
+
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        # BUG: hash_char "#" is trouble some in LaTeX.
+        # mbox and other environment do not like the '#'.
+        hash_char = '\\#'
+        if node.has_key('refuri'):
+            href = node['refuri'].replace('#',hash_char)
+        elif node.has_key('refid'):
+            href = hash_char + node['refid']
+        elif node.has_key('refname'):
+            href = hash_char + self.document.nameids[node['refname']]
+        else:
+            raise AssertionError('Unknown reference.')
+        self.body.append('\\href{%s}{' % href)
+        if self._reference_label and not node.has_key('refuri'):
+            self.body.append('\\%s{%s}}' % (self._reference_label,
+                        href.replace(hash_char, '')))
+            raise nodes.SkipNode
+
+    def depart_reference(self, node):
+        self.body.append('}')
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision')
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_section(self, node):
+        self.section_level += 1
+        # Initialize counter for potential subsections:
+        self._section_number.append(0)
+        # Counter for this section's level (initialized by parent section):
+        self._section_number[self.section_level - 1] += 1
+
+    def depart_section(self, node):
+        # Remove counter for potential subsections:
+        self._section_number.pop()
+        self.section_level -= 1
+
+    def visit_sidebar(self, node):
+        # BUG:  this is just a hack to make sidebars render something
+        self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n')
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
+
+    def depart_sidebar(self, node):
+        self.body.append('}}}\n') # end parbox colorbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+
+    attribution_formats = {'dash': ('---', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append(prefix)
+        self.context.append(suffix)
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '\n')
+        self.body.append('\\end{flushright}\n')
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status')
+
+    def depart_status(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_strong(self, node):
+        self.body.append('\\textbf{')
+        self.literal_block_stack.append('\\textbf{')
+
+    def depart_strong(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.document):
+            self.title = self.title + \
+                '\\\\\n\\large{%s}\n' % self.encode(node.astext())
+            raise nodes.SkipNode
+        elif isinstance(node.parent, nodes.section):
+            self.body.append('\\textbf{')
+            self.context.append('}\\vspace{0.2cm}\n\n\\noindent ')
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_system_message(self, node):
+        pass
+
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def visit_table(self, node):
+        if self.active_table.is_open():
+            self.table_stack.append(self.active_table)
+            # nesting longtable does not work (e.g. 2007-04-18)
+            self.active_table = Table('tabular',self.settings.table_style)
+        self.active_table.open()
+        for cl in node['classes']:
+            self.active_table.set_table_style(cl)
+        self.body.append('\n' + self.active_table.get_opening())
+
+    def depart_table(self, node):
+        self.body.append(self.active_table.get_closing() + '\n')
+        self.active_table.close()
+        if len(self.table_stack)>0:
+            self.active_table = self.table_stack.pop()
+        else:
+            self.active_table.set_table_style(self.settings.table_style)
+
+    def visit_target(self, node):
+        # BUG: why not (refuri or refid or refname) means not footnote ?
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}{' % id)
+            self.context.append('}' * len(node['ids']))
+        elif node.get("refid"):
+            self.body.append('\\hypertarget{%s}{' % node.get("refid"))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        # BUG write preamble if not yet done (colspecs not [])
+        # for tables without heads.
+        if not self.active_table.get('preamble written'):
+            self.visit_thead(None)
+            # self.depart_thead(None)
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.body.append('\\item[{')
+
+    def depart_term(self, node):
+        # definition list term.
+        # \leavevmode results in a line break if the term is followed by a item list.
+        self.body.append('}] \leavevmode ')
+
+    def visit_tgroup(self, node):
+        #self.body.append(self.starttag(node, 'colgroup'))
+        #self.context.append('</colgroup>\n')
+        pass
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.body.append('{%s}\n' % self.active_table.get_colspecs())
+        if self.active_table.caption:
+            self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption)
+        self.active_table.set('preamble written',1)
+        # TODO longtable supports firsthead and lastfoot too.
+        self.body.extend(self.active_table.visit_thead())
+
+    def depart_thead(self, node):
+        # the table header written should be on every page
+        # => \endhead
+        self.body.extend(self.active_table.depart_thead())
+        # and the firsthead => \endfirsthead
+        # BUG i want a "continued from previous page" on every not
+        # firsthead, but then we need the header twice.
+        #
+        # there is a \endfoot and \endlastfoot too.
+        # but we need the number of columns to
+        # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns)
+        # self.body.append('\\hline\n\\endfoot\n')
+        # self.body.append('\\hline\n')
+        # self.body.append('\\endlastfoot\n')
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    def bookmark(self, node):
+        """Append latex href and pdfbookmarks for titles.
+        """
+        if node.parent['ids']:
+            for id in node.parent['ids']:
+                self.body.append('\\hypertarget{%s}{}\n' % id)
+            if not self.use_latex_toc:
+                # BUG level depends on style. pdflatex allows level 0 to 3
+                # ToC would be the only on level 0 so i choose to decrement the rest.
+                # "Table of contents" bookmark to see the ToC. To avoid this
+                # we set all zeroes to one.
+                l = self.section_level
+                if l>0:
+                    l = l-1
+                # pdftex does not like "_" subscripts in titles
+                text = self.encode(node.astext())
+                for id in node.parent['ids']:
+                    self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \
+                                     (l, text, id))
+
+    def visit_title(self, node):
+        """Section and other titles."""
+
+        if isinstance(node.parent, nodes.topic):
+            # the table of contents.
+            self.bookmark(node)
+            if ('contents' in self.topic_classes
+            and self.use_latex_toc):
+                self.body.append('\\renewcommand{\\contentsname}{')
+                self.context.append('}\n\\tableofcontents\n\n\\bigskip\n')
+            elif ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+                raise nodes.SkipNode
+            else: # or section titles before the table of contents.
+                # BUG: latex chokes on center environment with 
+                # "perhaps a missing item", therefore we use hfill.
+                self.body.append('\\subsubsection*{~\\hfill ')
+                # the closing brace for subsection.
+                self.context.append('\\hfill ~}\n')
+        # TODO: for admonition titles before the first section
+        # either specify every possible node or ... ?
+        elif isinstance(node.parent, nodes.sidebar) \
+        or isinstance(node.parent, nodes.admonition):
+            self.body.append('\\textbf{\\large ')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.table):
+            # caption must be written after column spec
+            self.active_table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        elif self.section_level == 0:
+            # document title
+            self.title = self.encode(node.astext())
+            if not self.pdfinfo == None:
+                self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) )
+            raise nodes.SkipNode
+        else:
+            self.body.append('\n\n')
+            self.body.append('%' + '_' * 75)
+            self.body.append('\n\n')
+            self.bookmark(node)
+
+            if self.use_latex_toc:
+                section_star = ""
+            else:
+                section_star = "*"
+
+            section_name = self.d_class.section(self.section_level)
+            self.body.append('\\%s%s{' % (section_name, section_star))
+            # MAYBE postfix paragraph and subparagraph with \leavemode to
+            # ensure floatables stay in the section and text starts on a new line.
+            self.context.append('}\n')
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        for id in node.parent['ids']:
+            self.body.append('\\label{%s}\n' % id)
+
+    def visit_topic(self, node):
+        self.topic_classes = node['classes']
+        if ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+            self.body.append('\\begin{abstract}\n')
+
+    def depart_topic(self, node):
+        if ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+            self.body.append('\\end{abstract}\n')
+        self.topic_classes = []
+        if 'contents' in node['classes'] and self.use_latex_toc:
+            pass
+        else:
+            self.body.append('\n')
+
+    def visit_inline(self, node): # titlereference
+        classes = node.get('classes', ['Unknown', ])
+        for cls in classes:
+            self.body.append( '\\docutilsrole%s{' % cls)
+        self.context.append('}'*len(classes))
+
+    def depart_inline(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_rubric(self, node):
+        self.body.append('\\rubric{')
+        self.context.append('}\n')
+
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_transition(self, node):
+        self.body.append('\n\n')
+        self.body.append('%' + '_' * 75)
+        self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}')
+        self.body.append('\n\n')
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version')
+
+    def depart_version(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+
+    def depart_warning(self, node):
+        self.depart_admonition()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+#    def unknown_visit(self, node):
+#    def default_visit(self, node):
+
+# vim: set ts=4 et ai :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+% latex include file for docutils latex writer
+% --------------------------------------------
+%
+% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $
+%
+% This is included at the end of the latex header in the generated file,
+% to allow overwriting defaults, although this could get hairy.
+% Generated files should process well standalone too, LaTeX might give a
+% message about a missing file.
+
+% donot indent first line of paragraph.
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt plus 2pt minus 1pt}
+
+% sloppy
+% ------
+% Less strict (opposite to default fussy) space size between words. Therefore
+% less hyphenation.
+\sloppy
+
+% fonts
+% -----
+% times for pdf generation, gives smaller pdf files.
+%
+% But in standard postscript fonts: courier and times/helvetica do not fit.
+% Maybe use pslatex.
+\usepackage{times}
+
+% pagestyle
+% ---------
+% headings might put section titles in the page heading, but not if
+% the table of contents is done by docutils.
+% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt}
+% should be set too.
+%\pagestyle{plain}
+%
+% or use fancyhdr (untested !)
+%\usepackage{fancyhdr}
+%\pagestyle{fancy}
+%\addtolength{\headheight}{\\baselineskip}
+%\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
+%\renewcommand{\subsectionmark}[1]{\markright{#1}}
+%\fancyhf{}
+%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
+%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
+%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
+%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
+%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
+
+% geometry 
+% --------
+% = papersizes and margins
+%\geometry{a4paper,twoside,tmargin=1.5cm,
+%          headheight=1cm,headsep=0.75cm}
+
+% Do section number display
+% -------------------------
+%\makeatletter
+%\def\@seccntformat#1{}
+%\makeatother
+% no numbers in toc
+%\renewcommand{\numberline}[1]{}
+
+
+% change maketitle
+% ----------------
+%\renewcommand{\maketitle}{
+%  \begin{titlepage}
+%    \begin{center}
+%    \textsf{TITLE \@title} \\
+%       Date: \today
+%    \end{center}
+%  \end{titlepage}
+%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,825 @@
+# $Id: __init__.py 5174 2007-05-31 00:01:52Z wiemann $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+# Thanks to Engelbert Gruber and various contributors for the original
+# LaTeX writer, some code and many ideas of which have been used for
+# this writer.
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import os.path
+from types import ListType
+
+import docutils
+from docutils import nodes, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('newlatex', 'newlatex2e')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'base.tex'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'Note that this LaTeX writer is still EXPERIMENTAL and not '
+        'feature-complete. ',
+        (('Specify a stylesheet file.  The path is used verbatim to include '
+          'the file.  Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Specify a user stylesheet file.  See --stylesheet.',
+          ['--user-stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'user_stylesheet_path'}),
+         ('Specify a user stylesheet file.  See --stylesheet-path.',
+          ['--user-stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'user_stylesheet'})
+         ),)
+
+    settings_defaults = {
+        # Many Unicode characters are provided by unicode_map.py, so
+        # we can default to latin-1.
+        'output_encoding': 'latin-1',
+        'output_encoding_error_handler': 'strict',
+        # Since we are using superscript footnotes, it is necessary to
+        # trim whitespace in front of footnote references.
+        'trim_footnote_reference_space': 1,
+        # Currently unsupported:
+        'docinfo_xform': 0,
+        # During development:
+        'traceback': 1
+        }
+
+    relative_path_settings = ('stylesheet_path', 'user_stylesheet_path')
+
+    config_section = 'newlatex2e writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [
+            writer_aux.Compound, writer_aux.Admonitions]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        assert not visitor.context, 'context not empty: %s' % visitor.context
+        self.output = visitor.astext()
+        self.head = visitor.header
+        self.body = visitor.body
+
+
+class LaTeXException(Exception):
+    """
+    Exception base class to for exceptions which influence the
+    automatic generation of LaTeX code.
+    """
+
+
+class SkipAttrParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\DECattr`` and ``\renewcommand{\DEVparent}{...}`` for this
+    node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class SkipParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\renewcommand{\DEVparent}{...}`` for this node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class LaTeXTranslator(nodes.SparseNodeVisitor):
+
+    # Country code by a.schlock.
+    # Partly manually converted from iso and babel stuff.
+    iso639_to_babel = {
+        'no': 'norsk',     # added by hand
+        'gd': 'scottish',  # added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    # Start with left double quote.
+    left_quote = 1
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = document.settings
+        self.header = []
+        self.body = []
+        self.context = []
+        self.stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.stylesheet_path:
+            self.settings.record_dependencies.add(self.stylesheet_path)
+        # This ugly hack will be cleaned up when refactoring the
+        # stylesheet mess.
+        self.settings.stylesheet = self.settings.user_stylesheet
+        self.settings.stylesheet_path = self.settings.user_stylesheet_path
+        self.user_stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.user_stylesheet_path:
+            self.settings.record_dependencies.add(self.user_stylesheet_path)
+        self.write_header()
+
+    def write_header(self):
+        a = self.header.append
+        a('%% Generated by Docutils %s <http://docutils.sourceforge.net>.'
+          % docutils.__version__)
+        a('')
+        a('% Docutils settings:')
+        lang = self.settings.language_code or ''
+        a(r'\providecommand{\DEVlanguageiso}{%s}' % lang)
+        a(r'\providecommand{\DEVlanguagebabel}{%s}' % self.iso639_to_babel.get(
+            lang, self.iso639_to_babel.get(lang.split('_')[0], '')))
+        a('')
+        if self.user_stylesheet_path:
+            a('% User stylesheet:')
+            a(r'\input{%s}' % self.user_stylesheet_path)
+        a('% Docutils stylesheet:')
+        a(r'\input{%s}' % self.stylesheet_path)
+        a('')
+        a('% Default definitions for Docutils nodes:')
+        for node_name in nodes.node_class_names:
+            a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', ''))
+        a('')
+        a('% Auxiliary definitions:')
+        for attr in (r'\DEVparent \DEVattrlen \DEVtitleastext '
+                     r'\DEVsinglebackref \DEVmultiplebackrefs'
+                     ).split():
+            # Later set using \renewcommand.
+            a(r'\providecommand{%s}{DOCUTILSUNINITIALIZEDVARIABLE}' % attr)
+        for attr in (r'\DEVparagraphindented \DEVhassubtitle').split():
+            # Initialize as boolean variables.
+            a(r'\providecommand{%s}{false}' % attr)
+        a('\n\n')
+
+    unicode_map = unicode_map.unicode_map # comprehensive Unicode map
+    # Fix problems with unimap.py.
+    unicode_map.update({
+        # We have AE or T1 encoding, so "``" etc. work.  The macros
+        # from unimap.py may *not* work.
+        u'\u201C': '{``}',
+        u'\u201D': "{''}",
+        u'\u201E': '{,,}',
+        })
+
+    character_map = {
+        '\\': r'{\textbackslash}',
+        '{': r'{\{}',
+        '}': r'{\}}',
+        '$': r'{\$}',
+        '&': r'{\&}',
+        '%': r'{\%}',
+        '#': r'{\#}',
+        '[': r'{[}',
+        ']': r'{]}',
+        '-': r'{-}',
+        '`': r'{`}',
+        "'": r"{'}",
+        ',': r'{,}',
+        '"': r'{"}',
+        '|': r'{\textbar}',
+        '<': r'{\textless}',
+        '>': r'{\textgreater}',
+        '^': r'{\textasciicircum}',
+        '~': r'{\textasciitilde}',
+        '_': r'{\DECtextunderscore}',
+        }
+    character_map.update(unicode_map)
+    #character_map.update(special_map)
+    
+    # `att_map` is for encoding attributes.  According to
+    # <http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-164.html>,
+    # the following characters are special: # $ % & ~ _ ^ \ { }
+    # These work without special treatment in macro parameters:
+    # $, &, ~, _, ^
+    att_map = {'#': '\\#',
+               '%': '\\%',
+               # We cannot do anything about backslashes.
+               '\\': '',
+               '{': '\\{',
+               '}': '\\}',
+               # The quotation mark may be redefined by babel.
+               '"': '"{}',
+               }
+    att_map.update(unicode_map)
+
+    def encode(self, text, attval=None):
+        """
+        Encode special characters in ``text`` and return it.
+
+        If attval is true, preserve as much as possible verbatim (used
+        in attribute value encoding).  If attval is 'width' or
+        'height', `text` is interpreted as a length value.
+        """
+        if attval in ('width', 'height'):
+            match = re.match(r'([0-9.]+)(\S*)$', text)
+            assert match, '%s="%s" must be a length' % (attval, text)
+            value, unit = match.groups()
+            if unit == '%':
+                value = str(float(value) / 100)
+                unit = r'\DECrelativeunit'
+            elif unit in ('', 'px'):
+                # If \DECpixelunit is "pt", this gives the same notion
+                # of pixels as graphicx.  This is a bit of a hack.
+                value = str(float(value) * 0.75)
+                unit = '\DECpixelunit'
+            return '%s%s' % (value, unit)
+        if attval:
+            get = self.att_map.get
+        else:
+            get = self.character_map.get
+        text = ''.join([get(c, c) for c in text])
+        if (self.literal_block or self.inline_literal) and not attval:
+            # NB: We can have inline literals within literal blocks.
+            # Shrink '\r\n'.
+            text = text.replace('\r\n', '\n')
+            # Convert space.  If "{ }~~~~~" is wrapped (at the
+            # brace-enclosed space "{ }"), the following non-breaking
+            # spaces ("~~~~") do *not* wind up at the beginning of the
+            # next line.  Also note that no hyphenation is done if the
+            # breaking space ("{ }") comes *after* the non-breaking
+            # spaces.
+            if self.literal_block:
+                # Replace newlines with real newlines.
+                text = text.replace('\n', '\mbox{}\\\\{}')
+                replace_fn = self.encode_replace_for_literal_block_spaces
+            else:
+                replace_fn = self.encode_replace_for_inline_literal_spaces
+            text = re.sub(r'\s+', replace_fn, text)
+            # Protect hyphens; if we don't, line breaks will be
+            # possible at the hyphens and even the \textnhtt macro
+            # from the hyphenat package won't change that.
+            text = text.replace('-', r'\mbox{-}')
+            text = text.replace("'", r'{\DECtextliteralsinglequote}')
+            return text
+        else:
+            if not attval:
+                # Replace space with single protected space.
+                text = re.sub(r'\s+', '{ }', text)
+                # Replace double quotes with macro calls.
+                L = []
+                for part in text.split(self.character_map['"']):
+                    if L:
+                        # Insert quote.
+                        L.append(self.left_quote and r'{\DECtextleftdblquote}'
+                                 or r'{\DECtextrightdblquote}')
+                        self.left_quote = not self.left_quote
+                    L.append(part)
+                return ''.join(L)
+            else:
+                return text
+
+    def encode_replace_for_literal_block_spaces(self, match):
+        return '~' * len(match.group())
+
+    def encode_replace_for_inline_literal_spaces(self, match):
+        return '{ }' + '~' * (len(match.group()) - 1)
+
+    def astext(self):
+        return '\n'.join(self.header) + (''.join(self.body))
+
+    def append(self, text, newline='%\n'):
+        """
+        Append text, stripping newlines, producing nice LaTeX code.
+        """
+        lines = ['  ' * self.indentation_level + line + newline
+                 for line in text.splitlines(0)]
+        self.body.append(''.join(lines))
+
+    def visit_Text(self, node):
+        self.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def is_indented(self, paragraph):
+        """Return true if `paragraph` should be first-line-indented."""
+        assert isinstance(paragraph, nodes.paragraph)
+        siblings = [n for n in paragraph.parent if
+                    self.is_visible(n) and not isinstance(n, nodes.Titular)]
+        index = siblings.index(paragraph)
+        if ('continued' in paragraph['classes'] or
+            index > 0 and isinstance(siblings[index-1], nodes.transition)):
+            return 0
+        # Indent all but the first paragraphs.
+        return index > 0
+
+    def before_paragraph(self, node):
+        self.append(r'\renewcommand{\DEVparagraphindented}{%s}'
+                    % (self.is_indented(node) and 'true' or 'false'))
+
+    def before_title(self, node):
+        self.append(r'\renewcommand{\DEVtitleastext}{%s}'
+                    % self.encode(node.astext()))
+        self.append(r'\renewcommand{\DEVhassubtitle}{%s}'
+                    % ((len(node.parent) > 2 and
+                        isinstance(node.parent[1], nodes.subtitle))
+                       and 'true' or 'false'))
+
+    def before_generated(self, node):
+        if 'sectnum' in node['classes']:
+            node[0] = node[0].strip()
+
+    literal_block = 0
+
+    def visit_literal_block(self, node):
+        self.literal_block = 1
+
+    def depart_literal_block(self, node):
+        self.literal_block = 0
+
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    inline_literal = 0
+
+    def visit_literal(self, node):
+        self.inline_literal += 1
+
+    def depart_literal(self, node):
+        self.inline_literal -= 1
+
+    def _make_encodable(self, text):
+        """
+        Return text (a unicode object) with all unencodable characters
+        replaced with '?'.
+
+        Thus, the returned unicode string is guaranteed to be encodable.
+        """
+        encoding = self.settings.output_encoding
+        return text.encode(encoding, 'replace').decode(encoding)
+
+    def visit_comment(self, node):
+        """
+        Insert the comment unchanged into the document, replacing
+        unencodable characters with '?'.
+
+        (This is done in order not to fail if comments contain unencodable
+        characters, because our default encoding is not UTF-8.)
+        """
+        self.append('\n'.join(['% ' + self._make_encodable(line) for line
+                               in node.astext().splitlines(0)]), newline='\n')
+        raise nodes.SkipChildren
+
+    def before_topic(self, node):
+        if 'contents' in node['classes']:
+            for bullet_list in list(node.traverse(nodes.bullet_list)):
+                p = bullet_list.parent
+                if isinstance(p, nodes.list_item):
+                    p.parent.insert(p.parent.index(p) + 1, bullet_list)
+                    del p[1]
+            for paragraph in node.traverse(nodes.paragraph):
+                paragraph.attributes.update(paragraph[0].attributes)
+                paragraph[:] = paragraph[0]
+                paragraph.parent['tocrefid'] = paragraph['refid']
+            node['contents'] = 1
+        else:
+            node['contents'] = 0
+
+    bullet_list_level = 0
+
+    def visit_bullet_list(self, node):
+        self.append(r'\DECsetbullet{\labelitem%s}' %
+                    ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)])
+        self.bullet_list_level += 1
+
+    def depart_bullet_list(self, node):
+        self.bullet_list_level -= 1
+
+    enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha':
+                   'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'}
+
+    enum_counter = 0
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.  This allows
+        # to set the style and starting value and unlimited nesting.
+        # Maybe the actual creation (\DEC) can be moved to the
+        # stylesheet?
+        self.enum_counter += 1
+        enum_prefix = self.encode(node['prefix'])
+        enum_suffix = self.encode(node['suffix'])
+        enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic')
+        start = node.get('start', 1) - 1
+        counter = 'Denumcounter%d' % self.enum_counter
+        self.append(r'\DECmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{'
+                    % (enum_prefix, enum_type, enum_suffix, counter, start))
+                    # for Emacs: }
+
+    def depart_enumerated_list(self, node):
+        self.append('}')  # for Emacs: {
+
+    def before_list_item(self, node):
+        # XXX needs cleanup.
+        if (len(node) and (isinstance(node[-1], nodes.TextElement) or
+                           isinstance(node[-1], nodes.Text)) and
+            node.parent.index(node) == len(node.parent) - 1):
+            node['lastitem'] = 'true'
+
+    before_line = before_list_item
+
+    def before_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            # We're inserting the text in before_raw and thus outside
+            # of \DN... and \DECattr in order to make grouping with
+            # curly brackets work.
+            self.append(node.astext())
+        raise nodes.SkipChildren
+
+    def process_backlinks(self, node, type):
+        """
+        Add LaTeX handling code for backlinks of footnote or citation
+        node `node`.  `type` is either 'footnote' or 'citation'.
+        """
+        self.append(r'\renewcommand{\DEVsinglebackref}{}')
+        self.append(r'\renewcommand{\DEVmultiplebackrefs}{}')
+        if len(node['backrefs']) > 1:
+            refs = []
+            for i in range(len(node['backrefs'])):
+                # \DECmulticitationbacklink or \DECmultifootnotebacklink.
+                refs.append(r'\DECmulti%sbacklink{%s}{%s}'
+                            % (type, node['backrefs'][i], i + 1))
+            self.append(r'\renewcommand{\DEVmultiplebackrefs}{(%s){ }}'
+                        % ', '.join(refs))
+        elif len(node['backrefs']) == 1:
+            self.append(r'\renewcommand{\DEVsinglebackref}{%s}'
+                        % node['backrefs'][0])
+
+    def visit_footnote(self, node):
+        self.process_backlinks(node, 'footnote')
+
+    def visit_citation(self, node):
+        self.process_backlinks(node, 'citation')
+
+    def before_table(self, node):
+        # A table contains exactly one tgroup.  See before_tgroup.
+        pass
+
+    def before_tgroup(self, node):
+        widths = []
+        total_width = 0
+        for i in range(int(node['cols'])):
+            assert isinstance(node[i], nodes.colspec)
+            widths.append(int(node[i]['colwidth']) + 1)
+            total_width += widths[-1]
+        del node[:len(widths)]
+        tablespec = '|'
+        for w in widths:
+            # 0.93 is probably wrong in many cases.  XXX Find a
+            # solution which works *always*.
+            tablespec += r'p{%s\textwidth}|' % (0.93 * w /
+                                                max(total_width, 60))
+        self.append(r'\DECmaketable{%s}{' % tablespec)
+        self.context.append('}')
+        raise SkipAttrParentLaTeX
+
+    def depart_tgroup(self, node):
+        self.append(self.context.pop())
+
+    def before_row(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_thead(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_tbody(self, node):
+        raise SkipAttrParentLaTeX
+
+    def is_simply_entry(self, node):
+        return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or
+                len(node) == 0)
+
+    def before_entry(self, node):
+        is_leftmost = 0
+        if node.hasattr('morerows'):
+            self.document.reporter.severe('Rowspans are not supported.')
+            # Todo: Add empty cells below rowspanning cell and issue
+            # warning instead of severe.
+        if node.hasattr('morecols'):
+            # The author got a headache trying to implement
+            # multicolumn support.
+            if not self.is_simply_entry(node):
+                self.document.reporter.severe(
+                    'Colspanning table cells may only contain one paragraph.')
+                # Todo: Same as above.
+            # The number of columns this entry spans (as a string).
+            colspan = int(node['morecols']) + 1
+            del node['morecols']
+        else:
+            colspan = 1
+        # Macro to call -- \DECcolspan or \DECcolspanleft.
+        macro_name = r'\DECcolspan'
+        if node.parent.index(node) == 0:
+            # Leftmost column.
+            macro_name += 'left'
+            is_leftmost = 1
+        if colspan > 1:
+            self.append('%s{%s}{' % (macro_name, colspan))
+            self.context.append('}')
+        else:
+            # Do not add a multicolumn with colspan 1 beacuse we need
+            # at least one non-multicolumn cell per column to get the
+            # desired column widths, and we can only do colspans with
+            # cells consisting of only one paragraph.
+            if not is_leftmost:
+                self.append(r'\DECsubsequententry{')
+                self.context.append('}')
+            else:
+                self.context.append('')
+        if isinstance(node.parent.parent, nodes.thead):
+            node['tableheaderentry'] = 'true'
+
+        # Don't add \renewcommand{\DEVparent}{...} because there must
+        # not be any non-expandable commands in front of \multicolumn.
+        raise SkipParentLaTeX
+
+    def depart_entry(self, node):
+        self.append(self.context.pop())
+
+    def before_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    indentation_level = 0
+
+    def node_name(self, node):
+        return node.__class__.__name__.replace('_', '')
+
+    # Attribute propagation order.
+    attribute_order = ['align', 'classes', 'ids']
+
+    def attribute_cmp(self, a1, a2):
+        """
+        Compare attribute names `a1` and `a2`.  Used in
+        propagate_attributes to determine propagation order.
+
+        See built-in function `cmp` for return value.
+        """
+        if a1 in self.attribute_order and a2 in self.attribute_order:
+            return cmp(self.attribute_order.index(a1),
+                       self.attribute_order.index(a2))
+        if (a1 in self.attribute_order) != (a2 in self.attribute_order):
+            # Attributes not in self.attribute_order come last.
+            return a1 in self.attribute_order and -1 or 1
+        else:
+            return cmp(a1, a2)
+
+    def propagate_attributes(self, node):
+        # Propagate attributes using \DECattr macros.
+        node_name = self.node_name(node)
+        attlist = []
+        if isinstance(node, nodes.Element):
+            attlist = node.attlist()
+        attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0],
+                                                             pair2[0]))
+        # `numatts` may be greater than len(attlist) due to list
+        # attributes.
+        numatts = 0
+        pass_contents = self.pass_contents(node)
+        for key, value in attlist:
+            if isinstance(value, ListType):
+                self.append(r'\renewcommand{\DEVattrlen}{%s}' % len(value))
+                for i in range(len(value)):
+                    self.append(r'\DECattr{%s}{%s}{%s}{%s}{' %
+                                (i+1, key, self.encode(value[i], attval=key),
+                                 node_name))
+                    if not pass_contents:
+                        self.append('}')
+                numatts += len(value)
+            else:
+                self.append(r'\DECattr{}{%s}{%s}{%s}{' %
+                            (key, self.encode(unicode(value), attval=key),
+                             node_name))
+                if not pass_contents:
+                    self.append('}')
+                numatts += 1
+        if pass_contents:
+            self.context.append('}' * numatts)  # for Emacs: {
+        else:
+            self.context.append('')
+
+    def visit_docinfo(self, node):
+        raise NotImplementedError('Docinfo not yet implemented.')
+
+    def visit_document(self, node):
+        document = node
+        # Move IDs into TextElements.  This won't work for images.
+        # Need to review this.
+        for node in document.traverse(nodes.Element):
+            if node.has_key('ids') and not isinstance(node,
+                                                      nodes.TextElement):
+                next_text_element = node.next_node(nodes.TextElement)
+                if next_text_element:
+                    next_text_element['ids'].extend(node['ids'])
+                    node['ids'] = []
+
+    def pass_contents(self, node):
+        r"""
+        Return True if the node contents should be passed in
+        \DN<nodename>{<contents>} and \DECattr{}{}{}{}{<contents>}.
+        Return False if the node contents should be passed in
+        \DECvisit<nodename> <contents> \DECdepart<nodename>, and no
+        attribute handler should be called.
+        """
+        # Passing the whole document or whole sections as parameters
+        # to \DN... or \DECattr causes LaTeX to run out of memory.
+        return not isinstance(node, (nodes.document, nodes.section))
+
+    def dispatch_visit(self, node):
+        skip_attr = skip_parent = 0
+        # TreePruningException to be propagated.
+        tree_pruning_exception = None
+        if hasattr(self, 'before_' + node.__class__.__name__):
+            try:
+                getattr(self, 'before_' + node.__class__.__name__)(node)
+            except SkipParentLaTeX:
+                skip_parent = 1
+            except SkipAttrParentLaTeX:
+                skip_attr = 1
+                skip_parent = 1
+            except nodes.SkipNode:
+                raise
+            except (nodes.SkipChildren, nodes.SkipSiblings), instance:
+                tree_pruning_exception = instance
+            except nodes.SkipDeparture:
+                raise NotImplementedError(
+                    'SkipDeparture not usable in LaTeX writer')
+
+        if not isinstance(node, nodes.Text):
+            node_name = self.node_name(node)
+            # attribute_deleters will be appended to self.context.
+            attribute_deleters = []
+            if not skip_parent and not isinstance(node, nodes.document):
+                self.append(r'\renewcommand{\DEVparent}{%s}'
+                            % self.node_name(node.parent))
+                for name, value in node.attlist():
+                    if not isinstance(value, ListType) and not ':' in name:
+                        # For non-list and non-special (like
+                        # 'xml:preserve') attributes, set
+                        # \DEVcurrentN<nodename>A<attribute> to the
+                        # attribute value, so that the value of the
+                        # attribute is available in the node handler
+                        # and all children.
+                        macro = r'\DEVcurrentN%sA%s' % (node_name, name)
+                        self.append(r'\def%s{%s}' % (
+                            macro, self.encode(unicode(value), attval=name)))
+                        # Make the attribute undefined afterwards.
+                        attribute_deleters.append(r'\let%s=\relax' % macro)
+            self.context.append('\n'.join(attribute_deleters))
+            if self.pass_contents(node):
+                # Call \DN<nodename>{<contents>}.
+                self.append(r'\DN%s{' % node_name)
+                self.context.append('}')
+            else:
+                # Call \DECvisit<nodename> <contents>
+                # \DECdepart<nodename>.  (Maybe we should use LaTeX
+                # environments for this?)
+                self.append(r'\DECvisit%s' % node_name)
+                self.context.append(r'\DECdepart%s' % node_name)
+            self.indentation_level += 1
+            if not skip_attr:
+                self.propagate_attributes(node)
+            else:
+                self.context.append('')
+
+        if (isinstance(node, nodes.TextElement) and
+            not isinstance(node.parent, nodes.TextElement)):
+            # Reset current quote to left.
+            self.left_quote = 1
+
+        # Call visit_... method.
+        try:
+            nodes.SparseNodeVisitor.dispatch_visit(self, node)
+        except LaTeXException:
+            raise NotImplementedError(
+                'visit_... methods must not raise LaTeXExceptions')
+
+        if tree_pruning_exception:
+            # Propagate TreePruningException raised in before_... method.
+            raise tree_pruning_exception
+
+    def is_invisible(self, node):
+        # Return true if node is invisible or moved away in the LaTeX
+        # rendering.
+        return (not isinstance(node, nodes.Text) and
+                (isinstance(node, nodes.Invisible) or
+                 isinstance(node, nodes.footnote) or
+                 isinstance(node, nodes.citation) or
+                 # Assume raw nodes to be invisible.
+                 isinstance(node, nodes.raw) or
+                 # Floating image or figure.
+                 node.get('align') in ('left', 'right')))
+
+    def is_visible(self, node):
+        return not self.is_invisible(node)
+
+    def needs_space(self, node):
+        """Two nodes for which `needs_space` is true need auxiliary space."""
+        # Return true if node is a visible block-level element.
+        return ((isinstance(node, nodes.Body) or
+                 isinstance(node, nodes.topic)) and
+                not (self.is_invisible(node) or
+                     isinstance(node.parent, nodes.TextElement)))
+
+    def always_needs_space(self, node):
+        """
+        Always add space around nodes for which `always_needs_space()`
+        is true, regardless of whether the other node needs space as
+        well.  (E.g. transition next to section.)
+        """
+        return isinstance(node, nodes.transition)
+
+    def dispatch_departure(self, node):
+        # Call departure method.
+        nodes.SparseNodeVisitor.dispatch_departure(self, node)
+
+        if not isinstance(node, nodes.Text):
+            # Close attribute and node handler call (\DN...{...}).
+            self.indentation_level -= 1
+            self.append(self.context.pop() + self.context.pop())
+            # Delete \DECcurrentN... attribute macros.
+            self.append(self.context.pop())
+            # Get next sibling.
+            next_node = node.next_node(
+                ascend=0, siblings=1, descend=0,
+                condition=self.is_visible)
+            # Insert space if necessary.
+            if  (self.needs_space(node) and self.needs_space(next_node) or
+                 self.always_needs_space(node) or
+                 self.always_needs_space(next_node)):
+                if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph):
+                    # Space between paragraphs.
+                    self.append(r'\DECparagraphspace')
+                else:
+                    # One of the elements is not a paragraph.
+                    self.append(r'\DECauxiliaryspace')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1180 @@
+% System stylesheet for the new LaTeX writer, newlatex2e.
+
+% Major parts of the rendering are done in this stylesheet and not in the
+% Python module.
+
+% For development notes, see notes.txt.
+
+% User documentation (in the stylesheet for now; that may change though):
+
+% Naming conventions:
+% All uppercase letters in macro names have a specific meaning.
+% \D...: All macros introduced by the Docutils LaTeX writer start with "D".
+% \DS<name>: Setup function (called at the bottom of this stylesheet).
+% \DN<nodename>{<contents>}: Handler for Docutils document tree node `node`; called by
+%                            the Python module.
+% \DEV<name>: External variable, set by the Python module.
+% \DEC<name>: External command.  It is called by the Python module and must be
+%             defined in this stylesheet.
+% \DN<nodename>A<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
+%     Attribute handler for `attribute` set on nodes of type `nodename`.
+%     See below for a discussion of attribute handlers.
+% \DA<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
+%     Attribute handler for all `attribute`.  Called only when no specific
+%     \DN<nodename>A<attribute> handler is defined.
+% \DN<nodename>C<class>{<contents>}:
+%     Handler for `class`, when set on nodes of type `nodename`.
+% \DC<class>{<contents>}:
+%     Handler for `class`.  Called only when no specific \DN<nodename>C<class>
+%     handler is defined.
+% \D<name>: Generic variable or function.
+
+% Attribute handlers:
+% TODO
+
+% ---------------------------------------------------------------------------
+
+% Having to intersperse code with \makeatletter-\makeatother pairs is very
+% annoying, so we call \makeatletter at the top and \makeatother at the
+% bottom.   Just be aware that you cannot use "@" as a text character inside
+% this stylesheet.
+\makeatletter
+
+% Print-mode (as opposed to online mode e.g. with Adobe Reader).
+% This causes for example blue hyperlinks.
+\providecommand{\Dprinting}{false}
+
+% \DSearly is called right after \documentclass.
+\providecommand{\DSearly}{}
+% \DSlate is called at the end of the stylesheet (right before the document
+% tree).
+\providecommand{\DSlate}{}
+
+% Use the KOMA script article class.
+\providecommand{\Ddocumentclass}{scrartcl}
+\providecommand{\Ddocumentoptions}{a4paper}
+\providecommand{\DSdocumentclass}{
+  \documentclass[\Ddocumentoptions]{\Ddocumentclass} }
+
+% Todo: This should be movable to the bottom, but it isn't as long as
+% we use \usepackage commands at the top level of this stylesheet
+% (which we shouldn't).
+\DSdocumentclass
+
+\providecommand{\DSpackages}{
+  % Load miscellaneous packages.
+  % Note 1: Many of the packages loaded here are used throughout this stylesheet.
+  % If one of these packages does not work on your system or in your scenario,
+  % please let us know, so we can consider making the package optional.
+  % Note 2: It would appear cleaner to load packages where they are used.
+  % However, since using a wrong package loading order can lead to *very*
+  % subtle bugs, we centralize the loading of most packages here.
+  \DSfontencoding % load font encoding packages
+  \DSlanguage % load babel
+  % Using \ifthenelse conditionals.
+  \usepackage{ifthen} % before hyperref (really!)
+  % There is not support for *not* using hyperref because it's used in many
+  % places.  If this is a problem (e.g. because hyperref doesn't work on your
+  % system), please let us know.
+  \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
+  % Get color, e.g. for links and system messages.
+  \usepackage{color}
+  % Get \textnhtt macro (non-hyphenating type writer).
+  \usepackage{hyphenat}
+  % For sidebars.
+  \usepackage{picins}
+  % We use longtable to create tables.
+  \usepackage{longtable}
+  % Images.
+  \usepackage{graphicx}
+  % These packages might be useful (some just add magic pixie dust), so
+  % evaluate them:
+  %\usepackage{fixmath}
+  %\usepackage{amsmath}
+  % Add some missing symbols like \textonehalf.
+  \usepackage{textcomp}
+}
+
+\providecommand{\DSfontencoding}{
+  % Set up font encoding.  Called by \DSpackages.
+  % AE is a T1 emulation.  It provides mostly the same characters and
+  % features as T1-encoded fonts but doesn't use bitmap fonts (which are
+  % unsuitable for online reading and subtle for printers).
+  \usepackage{ae}
+  % Provide the characters not contained in AE from EC bitmap fonts.
+  \usepackage{aecompl}
+  % Guillemets ("<<", ">>") in AE.
+  \usepackage{aeguill}
+}
+
+\providecommand{\DSsymbols}{%
+  % Fix up symbols.
+  % The Euro symbol in Computer Modern looks, um, funny.  Let's get a
+  % proper Euro symbol.
+  \usepackage{eurosym}%
+  \renewcommand{\texteuro}{\euro}%
+}
+
+% Taken from
+% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
+% and modified.  Used with permission.
+\providecommand{\Dprovidelength}[2]{%
+  \begingroup%
+    \escapechar\m@ne%
+    \xdef\@gtempa{{\string#1}}%
+  \endgroup%
+  \expandafter\@ifundefined\@gtempa%
+  {\newlength{#1}\setlength{#1}{#2}}%
+  {}%
+}
+
+\providecommand{\Dprovidecounter}[2]{%
+  % Like \newcounter except that it doesn't crash if the counter
+  % already exists.
+  \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{}
+}
+
+\Dprovidelength{\Dboxparindent}{\parindent}
+
+\providecommand{\Dmakebox}[1]{%
+  % Make a centered, frameless box.  Useful e.g. for block quotes.
+  % Do not use minipages here, but create pseudo-lists to allow
+  % page-breaking.  (Don't use KOMA-script's addmargin environment
+  % because it messes up bullet lists.)
+  \Dmakelistenvironment{}{}{%
+    \setlength{\parskip}{0pt}%
+    \setlength{\parindent}{\Dboxparindent}%
+    \item{#1}%
+  }%
+}
+
+\providecommand{\Dmakefbox}[1]{%
+  % Make a centered, framed box.  Useful e.g. for admonitions.
+  \vspace{0.4\baselineskip}%
+  \begin{center}%
+    \fbox{%
+      \begin{minipage}[t]{0.9\linewidth}%
+        \setlength{\parindent}{\Dboxparindent}%
+        #1%
+      \end{minipage}%
+    }%
+  \end{center}%
+  \vspace{0.4\baselineskip}%
+}
+
+% We do not currently recognize the difference between an end-sentence and a
+% mid-sentence period (".  " vs. ". " in plain text).  So \frenchspacing is
+% appropriate.
+\providecommand{\DSfrenchspacing}{\frenchspacing}
+
+
+\Dprovidelength{\Dblocklevelvspace}{%
+  % Space between block-level elements other than paragraphs.
+  0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
+}
+\providecommand{\DECauxiliaryspace}{%
+  \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
+  \par\noindent%
+}
+\providecommand{\DECparagraphspace}{\par}
+\providecommand{\Dneedvspace}{true}
+
+\providecommand{\DSlanguage}{%
+  % Set up babel.
+  \usepackage[\DEVlanguagebabel]{babel}
+}
+
+\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
+
+% Handler for 'classes' attribute (called for each class attribute).
+\providecommand{\DAclasses}[5]{%
+  % Dispatch to \DN<nodename>C<class>.
+  \Difdefined{DN#4C#3}{%
+    % Pass only contents, nothing else!
+    \csname DN#4C#3\endcsname{#5}%
+  }{%
+    % Otherwise, dispatch to \DC<class>.
+    \Difdefined{DC#3}{%
+      \csname DC#3\endcsname{#5}%
+    }{%
+      #5%
+    }%
+  }%
+}
+
+\providecommand{\DECattr}[5]{%
+  % Global attribute dispatcher, called inside the document tree.
+  % Parameters:
+  % 1. Attribute number.
+  % 2. Attribute name.
+  % 3. Attribute value.
+  % 4. Node name.
+  % 5. Node contents.
+  \Difdefined{DN#4A#2}{%
+    % Dispatch to \DN<nodename>A<attribute>.
+    \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2}{%
+    % Otherwise dispatch to \DA<attribute>.
+    \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{%
+    % Otherwise simply run the contents without calling a handler.
+    #5%
+  }}%
+}
+
+% ---------- Link handling ----------
+% Targets and references.
+
+\providecommand{\Draisedlink}[1]{%
+  % Anchors are placed on the base line by default.  This is a bad thing for
+  % inline context, so we raise the anchor (normally by \baselineskip).
+  \Hy@raisedlink{#1}%
+}
+
+% References.
+% We're assuming here that the "refid" and "refuri" attributes occur
+% only in inline context (in TextElements).
+\providecommand{\DArefid}[5]{%
+  \ifthenelse{\equal{#4}{reference}}{%
+    \Dexplicitreference{\##3}{#5}%
+  }{%
+    % If this is not a target node (targets with refids are
+    % uninteresting and should be silently dropped).
+    \ifthenelse{\not\equal{#4}{target}}{%
+      % If this is a footnote reference, call special macro.
+      \ifthenelse{\equal{#4}{footnotereference}}{%
+        \Dimplicitfootnotereference{\##3}{#5}%
+      }{%
+        \ifthenelse{\equal{#4}{citationreference}}{%
+          \Dimplicitcitationreference{\##3}{#5}%
+        }{%
+          \Dimplicitreference{\##3}{#5}%
+        }%
+      }%
+    }{}%
+  }%
+}
+\providecommand{\DArefuri}[5]{%
+  \ifthenelse{\equal{#4}{target}}{%
+    % The node name is 'target', so this is a hyperlink target, like this:
+    % .. _mytarget: URI
+    % Hyperlink targets are ignored because they are invisible.
+  }{%
+    % If a non-target node has a refuri attribute, it must be an explicit URI
+    % reference (i.e. node name is 'reference').
+    \Durireference{#3}{#5}%
+  }%
+}
+% Targets.
+\providecommand{\DAids}[5]{%
+  \label{#3}%
+  \ifthenelse{\equal{#4}{footnotereference}}{%
+    {%
+      \renewcommand{\HyperRaiseLinkDefault}{%
+        % Dirty hack to make backrefs to footnote references work.
+        % For some reason, \baselineskip is 0pt in fn references.
+        0.5\Doriginalbaselineskip%
+      }%
+      \Draisedlink{\hypertarget{#3}{}}#5%
+    }%
+  }{%
+    \Draisedlink{\hypertarget{#3}{}}#5%
+  }%
+}
+\providecommand{\Dimplicitreference}[2]{%
+  % Create implicit reference to ID.  Implicit references occur
+  % e.g. in TOC-backlinks of section titles.  Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{#2}%
+}
+\providecommand{\Dimplicitfootnotereference}[2]{%
+  % Ditto, but for the special case of footnotes.
+  % We want them to be rendered like explicit references.
+  \Dexplicitreference{#1}{#2}%
+}
+\providecommand{\Dimplicitcitationreference}[2]{%
+  % Ditto for citation references.
+  \Dimplicitfootnotereference{#1}{#2}%
+}
+\providecommand{\Dcolorexplicitreference}{%
+  \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}%
+}
+\providecommand{\Dexplicitreference}[2]{%
+  % Create explicit reference to ID, e.g. created with "foo_".
+  % Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{{\Dcolorexplicitreference#2}}%
+}
+\providecommand{\Dcolorurireference}{\Dcolorexplicitreference}
+\providecommand{\Durireference}[2]{%
+  % Create reference to URI.  Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{{\Dcolorurireference#2}}%
+}
+
+\Dprovidecounter{Dpdfbookmarkid}{0}%
+\providecommand{\Dpdfbookmark}[1]{%
+  % Temporarily decrement Desctionlevel counter.
+  \addtocounter{Dsectionlevel}{-1}%
+  %\typeout{\arabic{Dsectionlevel}}%
+  %\typeout{#1}%
+  %\typeout{docutils\roman{Dpdfbookmarkid}}%
+  %\typeout{}%
+  \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
+  \addtocounter{Dsectionlevel}{1}%
+  \addtocounter{Dpdfbookmarkid}{1}%
+}
+% ---------- End of Link Handling ----------
+
+\providecommand{\DNparagraph}[1]{%
+  \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}%
+  #1%
+}
+\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
+\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
+\providecommand{\Dtopictitle}[1]{%
+  \Difinsidetoc{\vspace{1em}\par}{}%
+  \noindent\Dformatboxtitle{#1}%
+  \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
+  \par%
+}
+\providecommand{\Dadmonitiontitle}[1]{%
+  \Dtopictitle{#1}%
+}
+\providecommand{\Dtopicsubtitle}[1]{%
+  \noindent\Dformatboxsubtitle{#1}%
+  \vspace{1em}%
+  \par%
+}
+\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
+\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
+\providecommand{\Ddocumenttitle}[1]{%
+  \begin{center}{\Huge#1}\end{center}%
+  \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
+}
+\providecommand{\Ddocumentsubtitle}[1]{%
+  \begin{center}{\huge#1}\end{center}%
+  \vspace{1cm}%
+}
+% Can be overwritten by user stylesheet.
+\providecommand{\Dformatsectiontitle}[1]{#1}
+\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
+\providecommand{\Dbookmarksectiontitle}[1]{%
+  % Return text suitable for use in \section*, \subsection*, etc.,
+  % containing a PDF bookmark.  Parameter:  The title (as node tree).
+  \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}%
+  #1%
+}
+\providecommand{\Dsectiontitlehook}[1]{#1}
+\providecommand{\Dsectiontitle}[1]{%
+  \Dsectiontitlehook{%
+    \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
+  }%
+}
+\providecommand{\Ddispatchsectiontitle}[1]{%
+  \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
+    \Ddeepsectiontitle{#1}%
+  }{%
+    \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
+  }%
+}
+\providecommand{\Ddispatchsectionsubtitle}[1]{%
+  \Ddispatchsectiontitle{#1}%
+}
+\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
+\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
+\providecommand{\Ddeepsectiontitle}[1]{%
+  % Anything below \subsubsection (like \paragraph or \subparagraph)
+  % is useless because it uses the same font.  The only way to
+  % (visually) distinguish such deeply nested sections is to use
+  % section numbering.
+  \subsubsection*{#1}%
+}
+\providecommand{\Dsectionsubtitlehook}[1]{#1}
+\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
+\providecommand{\Dsectionsubtitlescaling}{0.85}
+\providecommand{\Dsectionsubtitle}[1]{%
+  \Dsectionsubtitlehook{%
+    % Move the subtitle nearer to the title.
+    \vspace{-\Dsectionsubtitleraisedistance}%
+    % Don't create a PDF bookmark.
+    \Ddispatchsectionsubtitle{%
+      \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
+    }%
+  }%
+}
+\providecommand{\DNtitle}[1]{%
+  % Dispatch to \D<parent>title.
+  \csname D\DEVparent title\endcsname{#1}%
+}
+\providecommand{\DNsubtitle}[1]{%
+  % Dispatch to \D<parent>subtitle.
+  \csname D\DEVparent subtitle\endcsname{#1}%
+}
+
+\providecommand{\DNliteralblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      \setlength{\leftmargin}{0pt}%
+    }{}%
+    \setlength{\rightmargin}{0pt}%
+  }{%
+    \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
+  }%
+}
+\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}}
+\providecommand{\DNliteral}[1]{\textnhtt{#1}}
+\providecommand{\DNemphasis}[1]{\emph{#1}}
+\providecommand{\DNstrong}[1]{\textbf{#1}}
+\providecommand{\DECvisitdocument}{\begin{document}\noindent}
+\providecommand{\DECdepartdocument}{\end{document}}
+\providecommand{\DNtopic}[1]{%
+  \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{%
+    \addtocounter{Dtoclevel}{1}%
+    \par\noindent%
+    #1%
+    \addtocounter{Dtoclevel}{-1}%
+  }{%
+    \par\noindent%
+    \Dmakebox{#1}%
+  }%
+}
+\providecommand{\DNadmonition}[1]{%
+  \DNtopic{#1}%
+}
+\providecommand{\Dformatrubric}[1]{\textbf{#1}}
+\Dprovidelength{\Dprerubricspace}{0.3em}
+\providecommand{\DNrubric}[1]{%
+  \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
+}
+
+\providecommand{\Dbullet}{}
+\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
+\providecommand{\DNbulletlist}[1]{%
+  \Difinsidetoc{%
+    \Dtocbulletlist{#1}%
+  }{%
+    \Dmakelistenvironment{\Dbullet}{}{#1}%
+  }%
+}
+% Todo: So what on earth is @pnumwidth?
+\renewcommand{\@pnumwidth}{2.2em}
+\providecommand{\DNlistitem}[1]{%
+  \Difinsidetoc{%
+    \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
+      {%
+        \par\addvspace{1em}\noindent%
+        \sectfont%
+        #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}%
+      }%
+    }{%
+      \@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
+        \pageref{\DEVcurrentNlistitemAtocrefid}%
+      }%
+    }%
+  }{%
+    \item{#1}%
+  }%
+}
+\providecommand{\DNenumeratedlist}[1]{#1}
+\Dprovidecounter{Dsectionlevel}{0}
+\providecommand{\Dvisitsectionhook}{}
+\providecommand{\Ddepartsectionhook}{}
+\providecommand{\DECvisitsection}{%
+  \addtocounter{Dsectionlevel}{1}%
+  \Dvisitsectionhook%
+}
+\providecommand{\DECdepartsection}{%
+  \Ddepartsectionhook%
+  \addtocounter{Dsectionlevel}{-1}%
+}
+
+% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
+% because the hyphenat package redefines \_.  So we use
+% \textunderscore here.
+\providecommand{\DECtextunderscore}{\textunderscore}
+
+\providecommand{\Dtextinlineliteralfirstspace}{{ }}
+\providecommand{\Dtextinlineliteralsecondspace}{{~}}
+
+\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
+
+\providecommand{\Dsetlistrightmargin}{%
+  \ifthenelse{\lengthtest{\linewidth>12em}}{%
+    % Equal margins.
+    \setlength{\rightmargin}{\leftmargin}%
+  }{%
+    % If the line is narrower than 10em, we don't remove any further
+    % space from the right.
+    \setlength{\rightmargin}{0pt}%
+  }%
+}
+\providecommand{\Dresetlistdepth}{false}
+\Dprovidelength{\Doriginallabelsep}{\labelsep}
+\providecommand{\Dmakelistenvironment}[3]{%
+  % Make list environment with support for unlimited nesting and with
+  % reasonable default lengths.  Parameters:
+  % 1. Label (same as in list environment).
+  % 2. Spacing (same as in list environment).
+  % 3. List contents (contents of list environment).
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+    % Unfortunately, vertical spacing doesn't work correctly when
+    % using lists inside tabular environments, so we use a minipage.
+    \begin{minipage}[t]{\linewidth}%
+  }{}%
+    {%
+      \renewcommand{\Dneedvspace}{false}%
+      % \parsep0.5\baselineskip
+      \renewcommand{\Dresetlistdepth}{false}%
+      \ifnum \@listdepth>5%
+      \protect\renewcommand{\Dresetlistdepth}{true}%
+      \@listdepth=5%
+      \fi%
+      \begin{list}{%
+          #1%
+        }{%
+          \setlength{\itemsep}{0pt}%
+          \setlength{\partopsep}{0pt}%
+          \setlength{\topsep}{0pt}%
+                                  % List should take 90% of total width.
+          \setlength{\leftmargin}{0.05\linewidth}%
+          \ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
+            \setlength{\leftmargin}{1.8em}%
+          }{}%
+          \setlength{\labelsep}{\Doriginallabelsep}%
+          \Dsetlistrightmargin%
+          #2%
+        }{%
+          #3%
+        }%
+      \end{list}%
+      \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
+    }%
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
+}
+\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
+\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
+
+\Dprovidelength{\Ditemsep}{0pt}
+\providecommand{\DECmakeenumeratedlist}[6]{%
+  % Make enumerated list.
+  % Parameters:
+  % - prefix
+  % - type (\arabic, \roman, ...)
+  % - suffix
+  % - suggested counter name
+  % - start number - 1
+  % - list contents
+  \newcounter{#4}%
+  \Dmakelistenvironment{#1#2{#4}#3}{%
+    % Use as much space as needed for the label.
+    \setlength{\labelwidth}{10em}%
+    % Reserve enough space so that the label doesn't go beyond the
+    % left margin of preceding paragraphs.  Like that:
+    %
+    %    A paragraph.
+    %
+    %   1. First item.
+    \setlength{\leftmargin}{2.5em}%
+    \Dsetlistrightmargin%
+    \setlength{\itemsep}{\Ditemsep}%
+    % Use counter recommended by Python module.
+    \usecounter{#4}%
+    % Set start value.
+    \addtocounter{#4}{#5}%
+  }{%
+    % The list contents.
+    #6%
+  }%
+}
+
+
+% Single quote in literal mode.  \textquotesingle from package
+% textcomp has wrong width when using package ae, so we use a normal
+% single curly quote here.
+\providecommand{\DECtextliteralsinglequote}{'}
+
+
+% "Tabular lists" are field lists and options lists (not definition
+% lists because there the term always appears on its own line).  We'll
+% use the terminology of field lists now ("field", "field name",
+% "field body"), but the same is also analogously applicable to option
+% lists.
+%
+% We want these lists to be breakable across pages.  We cannot
+% automatically get the narrowest possible size for the left column
+% (i.e. the field names or option groups) because tabularx does not
+% support multi-page tables, ltxtable needs to have the table in an
+% external file and we don't want to clutter the user's directories
+% with auxiliary files created by the filecontents environment, and
+% ltablex is not included in teTeX.
+%
+% Thus we set a fixed length for the left column and use list
+% environments.  This also has the nice side effect that breaking is
+% now possible anywhere, not just between fields.
+%
+% Note that we are creating a distinct list environment for each
+% field.  There is no macro for a whole tabular list!
+\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
+\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
+\providecommand{\Dinsidetabular}{false}
+\providecommand{\Dsavefieldname}{}
+\providecommand{\Dsavefieldbody}{}
+\Dprovidelength{\Dusedfieldnamewidth}{0pt}
+\Dprovidelength{\Drealfieldnamewidth}{0pt}
+\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
+\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
+\Dprovidelength{\Dparskiptemp}{0pt}
+\providecommand{\Dtabularlistfield}[1]{%
+  {%
+    % This only saves field name and field body in \Dsavefieldname and
+    % \Dsavefieldbody, resp.  It does not insert any text into the
+    % document.
+    #1%
+    % Recalculate the real field name width everytime we encounter a
+    % tabular list field because it may have been changed using a
+    % "raw" node.
+    \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
+    \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
+    \Dmakelistenvironment{%
+      \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
+    }{%
+      \setlength{\labelwidth}{\Drealfieldnamewidth}%
+      \setlength{\leftmargin}{\Drealfieldnamewidth}%
+      \setlength{\rightmargin}{0pt}%
+      \setlength{\labelsep}{0pt}%
+    }{%
+      \item%
+      \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
+      \setlength{\Dparskiptemp}{\parskip}%
+      \ifthenelse{%
+        \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
+      }{%
+        \mbox{}\par%
+        \setlength{\parskip}{0pt}%
+      }{}%
+      \Dsavefieldbody%
+      \setlength{\parskip}{\Dparskiptemp}%
+      %XXX Why did we need this?
+      %\@finalstrut\@arstrutbox%
+    }%
+    \par%
+  }%
+}
+
+\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
+\providecommand{\DNfieldlist}[1]{#1}
+\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
+\providecommand{\DNfieldname}[1]{%
+  \Dtabularlistfieldname{%
+    \Dformatfieldname{#1}%
+  }%
+}
+\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
+
+\providecommand{\Dformatoptiongroup}[1]{%
+  % Format option group, e.g. "-f file, --input file".
+  \texttt{#1}%
+}
+\providecommand{\Dformatoption}[1]{%
+  % Format option, e.g. "-f file".
+  % Put into mbox to avoid line-breaking at spaces.
+  \mbox{#1}%
+}
+\providecommand{\Dformatoptionstring}[1]{%
+  % Format option string, e.g. "-f".
+  #1%
+}
+\providecommand{\Dformatoptionargument}[1]{%
+  % Format option argument, e.g. "file".
+  \textsl{#1}%
+}
+\providecommand{\Dformatoptiondescription}[1]{%
+  % Format option description, e.g.
+  % "\DNparagraph{Read input data from file.}"
+  #1%
+}
+\providecommand{\DNoptionlist}[1]{#1}
+\providecommand{\Doptiongroupjoiner}{,{ }}
+\providecommand{\Disfirstoption}{%
+  % Auxiliary macro indicating if a given option is the first child
+  % of its option group (if it's not, it has to preceded by
+  % \Doptiongroupjoiner).
+  false%
+}
+\providecommand{\DNoptionlistitem}[1]{%
+  \Dtabularlistfield{#1}%
+}
+\providecommand{\DNoptiongroup}[1]{%
+  \renewcommand{\Disfirstoption}{true}%
+  \Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
+}
+\providecommand{\DNoption}[1]{%
+  % If this is not the first option in this option group, add a
+  % joiner.
+  \ifthenelse{\equal{\Disfirstoption}{true}}{%
+    \renewcommand{\Disfirstoption}{false}%
+  }{%
+    \Doptiongroupjoiner%
+  }%
+  \Dformatoption{#1}%
+}
+\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
+\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
+\providecommand{\DNdescription}[1]{%
+  \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
+}
+
+\providecommand{\DNdefinitionlist}[1]{%
+  \begin{description}%
+    \parskip0pt%
+    #1%
+  \end{description}%
+}
+\providecommand{\DNdefinitionlistitem}[1]{%
+  % LaTeX expects the label in square brackets; we provide an empty
+  % label.
+  \item[]#1%
+}
+\providecommand{\Dformatterm}[1]{#1}
+\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
+% I'm still not sure what's the best rendering for classifiers.  The
+% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
+% Use slanted text because italic would cause too much emphasis.
+\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
+\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
+\providecommand{\Dformatdefinition}[1]{#1}
+\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
+
+\providecommand{\Dlineblockindentation}{2.5em}
+\providecommand{\DNlineblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\DEVparent}{lineblock}}{%
+      % Parent is a line block, so indent.
+      \setlength{\leftmargin}{\Dlineblockindentation}%
+    }{%
+      % At top level; don't indent.
+      \setlength{\leftmargin}{0pt}%
+    }%
+    \setlength{\rightmargin}{0pt}%
+    \setlength{\parsep}{0pt}%
+  }{%
+    #1%
+  }%
+}
+\providecommand{\DNline}[1]{\item#1}
+
+\providecommand{\DNtransition}{%
+  \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
+}
+
+\providecommand{\Dformatblockquote}[1]{%
+  % Format contents of block quote.
+  % This occurs in block-level context, so we cannot use \textsl.
+  {\slshape#1}%
+}
+\providecommand{\Dformatattribution}[1]{---\textup{#1}}
+\providecommand{\DNblockquote}[1]{%
+  \Dmakebox{%
+    \Dformatblockquote{#1}
+  }%
+}
+\providecommand{\DNattribution}[1]{%
+  \par%
+  \begin{flushright}\Dformatattribution{#1}\end{flushright}%
+}
+
+
+% Sidebars:
+% Vertical and horizontal margins.
+\Dprovidelength{\Dsidebarvmargin}{0.5em}
+\Dprovidelength{\Dsidebarhmargin}{1em}
+% Padding (space between contents and frame).
+\Dprovidelength{\Dsidebarpadding}{1em}
+% Frame width.
+\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
+% Position ("l" or "r").
+\providecommand{\Dsidebarposition}{r}
+% Width.
+\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
+\providecommand{\DNsidebar}[1]{
+  \parpic[\Dsidebarposition]{%
+    \begin{minipage}[t]{\Dsidebarwidth}%
+      % Doing this with nested minipages is ugly, but I haven't found
+      % another way to place vertical space before and after the fbox.
+      \vspace{\Dsidebarvmargin}%
+      {%
+        \setlength{\fboxrule}{\Dsidebarframewidth}%
+        \setlength{\fboxsep}{\Dsidebarpadding}%
+        \fbox{%
+          \begin{minipage}[t]{\linewidth}%
+            \setlength{\parindent}{\Dboxparindent}%
+            #1%
+          \end{minipage}%
+        }%
+      }%
+      \vspace{\Dsidebarvmargin}%
+    \end{minipage}%
+  }%
+}
+
+
+% Citations and footnotes.
+\providecommand{\Dformatfootnote}[1]{%
+  % Format footnote.
+  {%
+    \footnotesize#1%
+    % \par is necessary for LaTeX to adjust baselineskip to the
+    % changed font size.
+    \par%
+  }%
+}
+\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
+\Dprovidelength{\Doriginalbaselineskip}{0pt}
+\providecommand{\DNfootnotereference}[1]{%
+  {%
+    % \baselineskip is 0pt in \textsuperscript, so we save it here.
+    \setlength{\Doriginalbaselineskip}{\baselineskip}%
+    \textsuperscript{#1}%
+  }%
+}
+\providecommand{\DNcitationreference}[1]{{[}#1{]}}
+\Dprovidelength{\Dfootnotesep}{3.5pt}
+\providecommand{\Dsetfootnotespacing}{%
+  % Spacing commands executed at the beginning of footnotes.
+  \setlength{\parindent}{0pt}%
+  \hspace{1em}%
+}
+\providecommand{\DNfootnote}[1]{%
+  % See ltfloat.dtx for details.
+  {%
+    \insert\footins{%
+      % BUG: This is too small if the user adds
+      % \onehalfspacing or \doublespace.
+      \vspace{\Dfootnotesep}%
+      \Dsetfootnotespacing%
+      \Dformatfootnote{#1}%
+    }%
+  }%
+}
+\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
+\providecommand{\Dformatfootnotelabel}[1]{%
+  % Keep \footnotesize in footnote labels (\textsuperscript would
+  % reduce the font size even more).
+  \textsuperscript{\footnotesize#1{ }}%
+}
+\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
+\providecommand{\Dformatmultiplebackrefs}[1]{%
+  % If in printing mode, do not write out multiple backrefs.
+  \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
+}
+\providecommand{\Dthislabel}{}
+\providecommand{\DNlabel}[1]{%
+  % Footnote or citatation label.
+  \renewcommand{\Dthislabel}{#1}%
+  \ifthenelse{\not\equal{\DEVsinglebackref}{}}{%
+    \let\Doriginallabel=\Dthislabel%
+    \def\Dthislabel{%
+      \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}%
+    }%
+  }{}%
+  \ifthenelse{\equal{\DEVparent}{footnote}}{%
+    % Footnote label.
+    \Dformatfootnotelabel{\Dthislabel}%
+  }{%
+    \ifthenelse{\equal{\DEVparent}{citation}}{%
+      % Citation label.
+      \Dformatcitationlabel{\Dthislabel}%
+    }{}%
+  }%
+  % If there are multiple backrefs, add them now.
+  \Dformatmultiplebackrefs{\DEVmultiplebackrefs}%
+}
+\providecommand{\Dsinglefootnotebacklink}[2]{%
+  % Create normal backlink of a footnote label.  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\DECmultifootnotebacklink}[2]{%
+  % Create generated backlink, as in (1, 2).  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
+\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}}
+
+
+\providecommand{\DECmaketable}[2]{%
+  % Make table.  Parameters:
+  % 1. Table spec (like "|p|p|").
+  % 2. Table contents.
+  {%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      % Inside longtable; we cannot have nested longtables.
+      \begin{tabular}{#1}%
+        \hline%
+        #2%
+      \end{tabular}%
+    }{%
+      \renewcommand{\Dinsidetabular}{true}%
+      \begin{longtable}{#1}%
+        \hline%
+        #2%
+      \end{longtable}%
+    }%
+  }%
+}
+\providecommand{\DNthead}[1]{%
+  #1%
+  \endhead%
+}
+\providecommand{\DNrow}[1]{%
+  #1\tabularnewline%
+  \hline%
+}
+\providecommand{\Dinsidemulticolumn}{false}
+\providecommand{\Dcompensatingmulticol}[3]{%
+  \multicolumn{#1}{#2}{%
+    {%
+      \renewcommand{\Dinsidemulticolumn}{true}%
+      % Compensate for weird missing vertical space at top of paragraph.
+      \raisebox{-2.5pt}{#3}%
+    }%
+  }%
+}
+\providecommand{\DECcolspan}[2]{%
+  % Take care of the morecols attribute (but incremented by 1).
+  &%
+  \Dcompensatingmulticol{#1}{l|}{#2}%
+}
+\providecommand{\DECcolspanleft}[2]{%
+  % Like \Dmorecols, but called for the leftmost entries in a table
+  % row.
+  \Dcompensatingmulticol{#1}{|l|}{#2}%
+}
+\providecommand{\DECsubsequententry}[1]{%
+  &#1%
+}
+\providecommand{\DNentry}[1]{%
+  % The following sequence adds minimal vertical space above the top
+  % lines of the first cell paragraph, so that vertical space is
+  % balanced at the top and bottom of table cells.
+  \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{%
+    \vspace{-1em}\vspace{-\parskip}\par%
+  }{}%
+  #1%
+  % No need to add an ampersand ("&"); that's done by \DECsubsequententry.
+}
+\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
+\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
+
+
+\providecommand{\DNsystemmessage}[1]{%
+  {%
+    \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
+    \bfseries%
+    #1%
+  }%
+}
+
+
+\providecommand{\Dinsidehalign}{false}
+\newsavebox{\Dalignedimagebox}
+\Dprovidelength{\Dalignedimagewidth}{0pt}
+\providecommand{\Dhalign}[2]{%
+  % Horizontally align the contents to the left or right so that the
+  % text flows around it.
+  % Parameters:
+  % 1. l or r
+  % 2. Contents.
+  \renewcommand{\Dinsidehalign}{true}%
+  % For some obscure reason \parpic consumes some vertical space.
+  \vspace{-3pt}%
+  % Now we do something *really* ugly, but this enables us to wrap the
+  % image in a minipage while still allowing tight frames when
+  % class=border (see \DNimageCborder).
+  \sbox{\Dalignedimagebox}{#2}%
+  \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
+  \parpic[#1]{%
+    \begin{minipage}[b]{\Dalignedimagewidth}%
+      % Compensate for previously added space, but not entirely.
+      \vspace*{2.0pt}%
+      \vspace*{\Dfloatimagetopmargin}%
+      \usebox{\Dalignedimagebox}%
+      \vspace*{1.5pt}%
+      \vspace*{\Dfloatimagebottommargin}%
+    \end{minipage}%
+  }%
+  \renewcommand{\Dinsidehalign}{false}%
+}
+
+
+% Maximum width of an image.
+\providecommand{\Dimagemaxwidth}{\linewidth}
+\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
+% Auxiliary variable.
+\Dprovidelength{\Dcurrentimagewidth}{0pt}
+\providecommand{\DNimageAalign}[5]{%
+  \ifthenelse{\equal{#3}{left}}{%
+    \Dhalign{l}{#5}%
+  }{%
+    \ifthenelse{\equal{#3}{right}}{%
+      \Dhalign{r}{#5}%
+    }{%
+      \ifthenelse{\equal{#3}{center}}{%
+        % Text floating around centered figures is a bad idea.  Thus
+        % we use a center environment.  Note that no extra space is
+        % added by the writer, so the space added by the center
+        % environment is fine.
+        \begin{center}#5\end{center}%
+      }{%
+        #5%
+      }%
+    }%
+  }%
+}
+% Base path for images.
+\providecommand{\Dimagebase}{}
+% Auxiliary command.  Current image path.
+\providecommand{\Dimagepath}{}
+\providecommand{\DNimageAuri}[5]{%
+  % Insert image.  We treat the URI like a path here.
+  \renewcommand{\Dimagepath}{\Dimagebase#3}%
+  \Difdefined{DcurrentNimageAwidth}{%
+    \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}%
+  }{%
+    \Dsimpleimage{\Dimagepath}%
+  }%
+}
+\Dprovidelength{\Dfloatimagevmargin}{0pt}
+\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
+\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  % Need to make bottom-alignment dependent on align attribute (add
+  % functional test first).  Need to observe height attribute.
+  %\begin{minipage}[b]{#1}%
+    \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
+  %\end{minipage}%
+}  
+\providecommand{\Dcurrentimagemaxwidth}{}
+\providecommand{\Dsimpleimage}[1]{%
+  % Insert image, without much parametrization.
+  \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
+  \ifthenelse{\equal{\Dinsidehalign}{true}}{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
+  }{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
+  }%
+  \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
+    \Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
+  }{%
+    \Dwidthimage{\Dcurrentimagewidth}{#1}%
+  }%
+}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  \Dwidthimage{#1}{#2}%
+}
+
+% Figures.
+\providecommand{\DNfigureAalign}[5]{%
+  % Hack to make it work Right Now.
+  %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}%
+  %
+    %\def\DEVcurrentNimageAwidth{\linewidth}%
+    \DNimageAalign{#1}{#2}{#3}{#4}{%
+      \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
+    %\let\DEVcurrentNimageAwidth=\relax%
+  %
+  %\let\DEVcurrentNimageAwidth=\relax%
+}
+\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
+\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1}
+
+\providecommand{\DCborder}[1]{\fbox{#1}}
+% No padding between image and border.
+\providecommand{\DNimageCborder}[1]{\frame{#1}}
+
+
+% Need to replace with language-specific stuff.  Maybe look at
+% csquotes.sty and ask the author for permission to use parts of it.
+\providecommand{\DECtextleftdblquote}{``}
+\providecommand{\DECtextrightdblquote}{''}
+
+% Table of contents:
+\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
+\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
+% Level inside a table of contents.  While this is at -1, we are not
+% inside a TOC.
+\Dprovidecounter{Dtoclevel}{-1}%
+\providecommand{\Dlocaltoc}{false}%
+\providecommand{\DNtopicClocal}[1]{%
+  \renewcommand{\Dlocaltoc}{true}%
+  \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
+  \renewcommand{\Dlocaltoc}{false}%
+}
+\Dprovidelength{\Dtocindent}{0pt}%
+\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
+% Compensate for one additional TOC indentation space so that the
+% top-level is unindented.
+\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
+\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
+\providecommand{\Difinsidetoc}[2]{%
+  \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
+}
+\providecommand{\DNgeneratedCsectnum}[1]{%
+  \Difinsidetoc{%
+    % Section number inside TOC.
+    \makebox[\Dtocsectnumwidth][l]{#1}%
+  }{%
+    % Section number inside section title.
+    #1\quad%
+  }%
+}
+\providecommand{\Dtocbulletlist}[1]{%
+  \addtocounter{Dtoclevel}{1}%
+  \addtolength{\Dtocindent}{\Dtocsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
+  \addtocounter{Dtoclevel}{-1}%
+}
+
+
+% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by
+% specifying "pt" we get the same notion of "pixel" as graphicx.
+\providecommand{\DECpixelunit}{pt}
+% Normally lengths are relative to the current linewidth.
+\providecommand{\DECrelativeunit}{\linewidth}
+
+
+% ACTION: These commands actually *do* something.
+% Ultimately, everything should be done here, and no active content should be
+% above (not even \usepackage).
+
+\DSearly
+\DSpackages
+\DSfrenchspacing
+\DSsymbols
+\DSlate
+
+\makeatother
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2369 @@
+# $Id$
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This file has been placed in the public domain.
+
+# This is a mapping of Unicode characters to LaTeX equivalents.
+# The information has been extracted from
+# <http://www.w3.org/2003/entities/xml/unicode.xml>, written by
+# David Carlisle and Sebastian Rahtz.
+#
+# The extraction has been done by the "create_unimap.py" script
+# located at <http://docutils.sf.net/tools/dev/create_unimap.py>.
+
+unicode_map = {u'\xa0': '$~$',
+u'\xa1': '{\\textexclamdown}',
+u'\xa2': '{\\textcent}',
+u'\xa3': '{\\textsterling}',
+u'\xa4': '{\\textcurrency}',
+u'\xa5': '{\\textyen}',
+u'\xa6': '{\\textbrokenbar}',
+u'\xa7': '{\\textsection}',
+u'\xa8': '{\\textasciidieresis}',
+u'\xa9': '{\\textcopyright}',
+u'\xaa': '{\\textordfeminine}',
+u'\xab': '{\\guillemotleft}',
+u'\xac': '$\\lnot$',
+u'\xad': '$\\-$',
+u'\xae': '{\\textregistered}',
+u'\xaf': '{\\textasciimacron}',
+u'\xb0': '{\\textdegree}',
+u'\xb1': '$\\pm$',
+u'\xb2': '${^2}$',
+u'\xb3': '${^3}$',
+u'\xb4': '{\\textasciiacute}',
+u'\xb5': '$\\mathrm{\\mu}$',
+u'\xb6': '{\\textparagraph}',
+u'\xb7': '$\\cdot$',
+u'\xb8': '{\\c{}}',
+u'\xb9': '${^1}$',
+u'\xba': '{\\textordmasculine}',
+u'\xbb': '{\\guillemotright}',
+u'\xbc': '{\\textonequarter}',
+u'\xbd': '{\\textonehalf}',
+u'\xbe': '{\\textthreequarters}',
+u'\xbf': '{\\textquestiondown}',
+u'\xc0': '{\\`{A}}',
+u'\xc1': "{\\'{A}}",
+u'\xc2': '{\\^{A}}',
+u'\xc3': '{\\~{A}}',
+u'\xc4': '{\\"{A}}',
+u'\xc5': '{\\AA}',
+u'\xc6': '{\\AE}',
+u'\xc7': '{\\c{C}}',
+u'\xc8': '{\\`{E}}',
+u'\xc9': "{\\'{E}}",
+u'\xca': '{\\^{E}}',
+u'\xcb': '{\\"{E}}',
+u'\xcc': '{\\`{I}}',
+u'\xcd': "{\\'{I}}",
+u'\xce': '{\\^{I}}',
+u'\xcf': '{\\"{I}}',
+u'\xd0': '{\\DH}',
+u'\xd1': '{\\~{N}}',
+u'\xd2': '{\\`{O}}',
+u'\xd3': "{\\'{O}}",
+u'\xd4': '{\\^{O}}',
+u'\xd5': '{\\~{O}}',
+u'\xd6': '{\\"{O}}',
+u'\xd7': '{\\texttimes}',
+u'\xd8': '{\\O}',
+u'\xd9': '{\\`{U}}',
+u'\xda': "{\\'{U}}",
+u'\xdb': '{\\^{U}}',
+u'\xdc': '{\\"{U}}',
+u'\xdd': "{\\'{Y}}",
+u'\xde': '{\\TH}',
+u'\xdf': '{\\ss}',
+u'\xe0': '{\\`{a}}',
+u'\xe1': "{\\'{a}}",
+u'\xe2': '{\\^{a}}',
+u'\xe3': '{\\~{a}}',
+u'\xe4': '{\\"{a}}',
+u'\xe5': '{\\aa}',
+u'\xe6': '{\\ae}',
+u'\xe7': '{\\c{c}}',
+u'\xe8': '{\\`{e}}',
+u'\xe9': "{\\'{e}}",
+u'\xea': '{\\^{e}}',
+u'\xeb': '{\\"{e}}',
+u'\xec': '{\\`{\\i}}',
+u'\xed': "{\\'{\\i}}",
+u'\xee': '{\\^{\\i}}',
+u'\xef': '{\\"{\\i}}',
+u'\xf0': '{\\dh}',
+u'\xf1': '{\\~{n}}',
+u'\xf2': '{\\`{o}}',
+u'\xf3': "{\\'{o}}",
+u'\xf4': '{\\^{o}}',
+u'\xf5': '{\\~{o}}',
+u'\xf6': '{\\"{o}}',
+u'\xf7': '$\\div$',
+u'\xf8': '{\\o}',
+u'\xf9': '{\\`{u}}',
+u'\xfa': "{\\'{u}}",
+u'\xfb': '{\\^{u}}',
+u'\xfc': '{\\"{u}}',
+u'\xfd': "{\\'{y}}",
+u'\xfe': '{\\th}',
+u'\xff': '{\\"{y}}',
+u'\u0100': '{\\={A}}',
+u'\u0101': '{\\={a}}',
+u'\u0102': '{\\u{A}}',
+u'\u0103': '{\\u{a}}',
+u'\u0104': '{\\k{A}}',
+u'\u0105': '{\\k{a}}',
+u'\u0106': "{\\'{C}}",
+u'\u0107': "{\\'{c}}",
+u'\u0108': '{\\^{C}}',
+u'\u0109': '{\\^{c}}',
+u'\u010a': '{\\.{C}}',
+u'\u010b': '{\\.{c}}',
+u'\u010c': '{\\v{C}}',
+u'\u010d': '{\\v{c}}',
+u'\u010e': '{\\v{D}}',
+u'\u010f': '{\\v{d}}',
+u'\u0110': '{\\DJ}',
+u'\u0111': '{\\dj}',
+u'\u0112': '{\\={E}}',
+u'\u0113': '{\\={e}}',
+u'\u0114': '{\\u{E}}',
+u'\u0115': '{\\u{e}}',
+u'\u0116': '{\\.{E}}',
+u'\u0117': '{\\.{e}}',
+u'\u0118': '{\\k{E}}',
+u'\u0119': '{\\k{e}}',
+u'\u011a': '{\\v{E}}',
+u'\u011b': '{\\v{e}}',
+u'\u011c': '{\\^{G}}',
+u'\u011d': '{\\^{g}}',
+u'\u011e': '{\\u{G}}',
+u'\u011f': '{\\u{g}}',
+u'\u0120': '{\\.{G}}',
+u'\u0121': '{\\.{g}}',
+u'\u0122': '{\\c{G}}',
+u'\u0123': '{\\c{g}}',
+u'\u0124': '{\\^{H}}',
+u'\u0125': '{\\^{h}}',
+u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}',
+u'\u0127': '$\\Elzxh$',
+u'\u0128': '{\\~{I}}',
+u'\u0129': '{\\~{\\i}}',
+u'\u012a': '{\\={I}}',
+u'\u012b': '{\\={\\i}}',
+u'\u012c': '{\\u{I}}',
+u'\u012d': '{\\u{\\i}}',
+u'\u012e': '{\\k{I}}',
+u'\u012f': '{\\k{i}}',
+u'\u0130': '{\\.{I}}',
+u'\u0131': '{\\i}',
+u'\u0132': '{IJ}',
+u'\u0133': '{ij}',
+u'\u0134': '{\\^{J}}',
+u'\u0135': '{\\^{\\j}}',
+u'\u0136': '{\\c{K}}',
+u'\u0137': '{\\c{k}}',
+u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}',
+u'\u0139': "{\\'{L}}",
+u'\u013a': "{\\'{l}}",
+u'\u013b': '{\\c{L}}',
+u'\u013c': '{\\c{l}}',
+u'\u013d': '{\\v{L}}',
+u'\u013e': '{\\v{l}}',
+u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}',
+u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}',
+u'\u0141': '{\\L}',
+u'\u0142': '{\\l}',
+u'\u0143': "{\\'{N}}",
+u'\u0144': "{\\'{n}}",
+u'\u0145': '{\\c{N}}',
+u'\u0146': '{\\c{n}}',
+u'\u0147': '{\\v{N}}',
+u'\u0148': '{\\v{n}}',
+u'\u0149': "{'n}",
+u'\u014a': '{\\NG}',
+u'\u014b': '{\\ng}',
+u'\u014c': '{\\={O}}',
+u'\u014d': '{\\={o}}',
+u'\u014e': '{\\u{O}}',
+u'\u014f': '{\\u{o}}',
+u'\u0150': '{\\H{O}}',
+u'\u0151': '{\\H{o}}',
+u'\u0152': '{\\OE}',
+u'\u0153': '{\\oe}',
+u'\u0154': "{\\'{R}}",
+u'\u0155': "{\\'{r}}",
+u'\u0156': '{\\c{R}}',
+u'\u0157': '{\\c{r}}',
+u'\u0158': '{\\v{R}}',
+u'\u0159': '{\\v{r}}',
+u'\u015a': "{\\'{S}}",
+u'\u015b': "{\\'{s}}",
+u'\u015c': '{\\^{S}}',
+u'\u015d': '{\\^{s}}',
+u'\u015e': '{\\c{S}}',
+u'\u015f': '{\\c{s}}',
+u'\u0160': '{\\v{S}}',
+u'\u0161': '{\\v{s}}',
+u'\u0162': '{\\c{T}}',
+u'\u0163': '{\\c{t}}',
+u'\u0164': '{\\v{T}}',
+u'\u0165': '{\\v{t}}',
+u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}',
+u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}',
+u'\u0168': '{\\~{U}}',
+u'\u0169': '{\\~{u}}',
+u'\u016a': '{\\={U}}',
+u'\u016b': '{\\={u}}',
+u'\u016c': '{\\u{U}}',
+u'\u016d': '{\\u{u}}',
+u'\u016e': '{\\r{U}}',
+u'\u016f': '{\\r{u}}',
+u'\u0170': '{\\H{U}}',
+u'\u0171': '{\\H{u}}',
+u'\u0172': '{\\k{U}}',
+u'\u0173': '{\\k{u}}',
+u'\u0174': '{\\^{W}}',
+u'\u0175': '{\\^{w}}',
+u'\u0176': '{\\^{Y}}',
+u'\u0177': '{\\^{y}}',
+u'\u0178': '{\\"{Y}}',
+u'\u0179': "{\\'{Z}}",
+u'\u017a': "{\\'{z}}",
+u'\u017b': '{\\.{Z}}',
+u'\u017c': '{\\.{z}}',
+u'\u017d': '{\\v{Z}}',
+u'\u017e': '{\\v{z}}',
+u'\u0192': '$f$',
+u'\u0195': '{\\texthvlig}',
+u'\u019e': '{\\textnrleg}',
+u'\u01aa': '$\\eth$',
+u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}',
+u'\u01c2': '{\\textdoublepipe}',
+u'\u01f5': "{\\'{g}}",
+u'\u0250': '$\\Elztrna$',
+u'\u0252': '$\\Elztrnsa$',
+u'\u0254': '$\\Elzopeno$',
+u'\u0256': '$\\Elzrtld$',
+u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}',
+u'\u0259': '$\\Elzschwa$',
+u'\u025b': '$\\varepsilon$',
+u'\u0261': '{g}',
+u'\u0263': '$\\Elzpgamma$',
+u'\u0264': '$\\Elzpbgam$',
+u'\u0265': '$\\Elztrnh$',
+u'\u026c': '$\\Elzbtdl$',
+u'\u026d': '$\\Elzrtll$',
+u'\u026f': '$\\Elztrnm$',
+u'\u0270': '$\\Elztrnmlr$',
+u'\u0271': '$\\Elzltlmr$',
+u'\u0272': '{\\Elzltln}',
+u'\u0273': '$\\Elzrtln$',
+u'\u0277': '$\\Elzclomeg$',
+u'\u0278': '{\\textphi}',
+u'\u0279': '$\\Elztrnr$',
+u'\u027a': '$\\Elztrnrl$',
+u'\u027b': '$\\Elzrttrnr$',
+u'\u027c': '$\\Elzrl$',
+u'\u027d': '$\\Elzrtlr$',
+u'\u027e': '$\\Elzfhr$',
+u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}',
+u'\u0282': '$\\Elzrtls$',
+u'\u0283': '$\\Elzesh$',
+u'\u0287': '$\\Elztrnt$',
+u'\u0288': '$\\Elzrtlt$',
+u'\u028a': '$\\Elzpupsil$',
+u'\u028b': '$\\Elzpscrv$',
+u'\u028c': '$\\Elzinvv$',
+u'\u028d': '$\\Elzinvw$',
+u'\u028e': '$\\Elztrny$',
+u'\u0290': '$\\Elzrtlz$',
+u'\u0292': '$\\Elzyogh$',
+u'\u0294': '$\\Elzglst$',
+u'\u0295': '$\\Elzreglst$',
+u'\u0296': '$\\Elzinglst$',
+u'\u029e': '{\\textturnk}',
+u'\u02a4': '$\\Elzdyogh$',
+u'\u02a7': '$\\Elztesh$',
+u'\u02bc': "{'}",
+u'\u02c7': '{\\textasciicaron}',
+u'\u02c8': '$\\Elzverts$',
+u'\u02cc': '$\\Elzverti$',
+u'\u02d0': '$\\Elzlmrk$',
+u'\u02d1': '$\\Elzhlmrk$',
+u'\u02d2': '$\\Elzsbrhr$',
+u'\u02d3': '$\\Elzsblhr$',
+u'\u02d4': '$\\Elzrais$',
+u'\u02d5': '$\\Elzlow$',
+u'\u02d8': '{\\textasciibreve}',
+u'\u02d9': '{\\textperiodcentered}',
+u'\u02da': '{\\r{}}',
+u'\u02db': '{\\k{}}',
+u'\u02dc': '{\\texttildelow}',
+u'\u02dd': '{\\H{}}',
+u'\u02e5': '{\\tone{55}}',
+u'\u02e6': '{\\tone{44}}',
+u'\u02e7': '{\\tone{33}}',
+u'\u02e8': '{\\tone{22}}',
+u'\u02e9': '{\\tone{11}}',
+u'\u0300': '{\\`}',
+u'\u0301': "{\\'}",
+u'\u0302': '{\\^}',
+u'\u0303': '{\\~}',
+u'\u0304': '{\\=}',
+u'\u0306': '{\\u}',
+u'\u0307': '{\\.}',
+u'\u0308': '{\\"}',
+u'\u030a': '{\\r}',
+u'\u030b': '{\\H}',
+u'\u030c': '{\\v}',
+u'\u030f': '{\\cyrchar\\C}',
+u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}',
+u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}',
+u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}',
+u'\u0321': '$\\Elzpalh$',
+u'\u0322': '{\\Elzrh}',
+u'\u0327': '{\\c}',
+u'\u0328': '{\\k}',
+u'\u032a': '$\\Elzsbbrg$',
+u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}',
+u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}',
+u'\u0335': '{\\Elzxl}',
+u'\u0336': '{\\Elzbar}',
+u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}',
+u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}',
+u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}',
+u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}',
+u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}',
+u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}',
+u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}',
+u'\u0386': "{\\'{A}}",
+u'\u0388': "{\\'{E}}",
+u'\u0389': "{\\'{H}}",
+u'\u038a': "{\\'{}{I}}",
+u'\u038c': "{\\'{}O}",
+u'\u038e': "$\\mathrm{'Y}$",
+u'\u038f': "$\\mathrm{'\\Omega}$",
+u'\u0390': '$\\acute{\\ddot{\\iota}}$',
+u'\u0391': '$\\Alpha$',
+u'\u0392': '$\\Beta$',
+u'\u0393': '$\\Gamma$',
+u'\u0394': '$\\Delta$',
+u'\u0395': '$\\Epsilon$',
+u'\u0396': '$\\Zeta$',
+u'\u0397': '$\\Eta$',
+u'\u0398': '$\\Theta$',
+u'\u0399': '$\\Iota$',
+u'\u039a': '$\\Kappa$',
+u'\u039b': '$\\Lambda$',
+u'\u039c': '$M$',
+u'\u039d': '$N$',
+u'\u039e': '$\\Xi$',
+u'\u039f': '$O$',
+u'\u03a0': '$\\Pi$',
+u'\u03a1': '$\\Rho$',
+u'\u03a3': '$\\Sigma$',
+u'\u03a4': '$\\Tau$',
+u'\u03a5': '$\\Upsilon$',
+u'\u03a6': '$\\Phi$',
+u'\u03a7': '$\\Chi$',
+u'\u03a8': '$\\Psi$',
+u'\u03a9': '$\\Omega$',
+u'\u03aa': '$\\mathrm{\\ddot{I}}$',
+u'\u03ab': '$\\mathrm{\\ddot{Y}}$',
+u'\u03ac': "{\\'{$\\alpha$}}",
+u'\u03ad': '$\\acute{\\epsilon}$',
+u'\u03ae': '$\\acute{\\eta}$',
+u'\u03af': '$\\acute{\\iota}$',
+u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$',
+u'\u03b1': '$\\alpha$',
+u'\u03b2': '$\\beta$',
+u'\u03b3': '$\\gamma$',
+u'\u03b4': '$\\delta$',
+u'\u03b5': '$\\epsilon$',
+u'\u03b6': '$\\zeta$',
+u'\u03b7': '$\\eta$',
+u'\u03b8': '{\\texttheta}',
+u'\u03b9': '$\\iota$',
+u'\u03ba': '$\\kappa$',
+u'\u03bb': '$\\lambda$',
+u'\u03bc': '$\\mu$',
+u'\u03bd': '$\\nu$',
+u'\u03be': '$\\xi$',
+u'\u03bf': '$o$',
+u'\u03c0': '$\\pi$',
+u'\u03c1': '$\\rho$',
+u'\u03c2': '$\\varsigma$',
+u'\u03c3': '$\\sigma$',
+u'\u03c4': '$\\tau$',
+u'\u03c5': '$\\upsilon$',
+u'\u03c6': '$\\varphi$',
+u'\u03c7': '$\\chi$',
+u'\u03c8': '$\\psi$',
+u'\u03c9': '$\\omega$',
+u'\u03ca': '$\\ddot{\\iota}$',
+u'\u03cb': '$\\ddot{\\upsilon}$',
+u'\u03cc': "{\\'{o}}",
+u'\u03cd': '$\\acute{\\upsilon}$',
+u'\u03ce': '$\\acute{\\omega}$',
+u'\u03d0': '{\\Pisymbol{ppi022}{87}}',
+u'\u03d1': '{\\textvartheta}',
+u'\u03d2': '$\\Upsilon$',
+u'\u03d5': '$\\phi$',
+u'\u03d6': '$\\varpi$',
+u'\u03da': '$\\Stigma$',
+u'\u03dc': '$\\Digamma$',
+u'\u03dd': '$\\digamma$',
+u'\u03de': '$\\Koppa$',
+u'\u03e0': '$\\Sampi$',
+u'\u03f0': '$\\varkappa$',
+u'\u03f1': '$\\varrho$',
+u'\u03f4': '{\\textTheta}',
+u'\u03f6': '$\\backepsilon$',
+u'\u0401': '{\\cyrchar\\CYRYO}',
+u'\u0402': '{\\cyrchar\\CYRDJE}',
+u'\u0403': "{\\cyrchar{\\'\\CYRG}}",
+u'\u0404': '{\\cyrchar\\CYRIE}',
+u'\u0405': '{\\cyrchar\\CYRDZE}',
+u'\u0406': '{\\cyrchar\\CYRII}',
+u'\u0407': '{\\cyrchar\\CYRYI}',
+u'\u0408': '{\\cyrchar\\CYRJE}',
+u'\u0409': '{\\cyrchar\\CYRLJE}',
+u'\u040a': '{\\cyrchar\\CYRNJE}',
+u'\u040b': '{\\cyrchar\\CYRTSHE}',
+u'\u040c': "{\\cyrchar{\\'\\CYRK}}",
+u'\u040e': '{\\cyrchar\\CYRUSHRT}',
+u'\u040f': '{\\cyrchar\\CYRDZHE}',
+u'\u0410': '{\\cyrchar\\CYRA}',
+u'\u0411': '{\\cyrchar\\CYRB}',
+u'\u0412': '{\\cyrchar\\CYRV}',
+u'\u0413': '{\\cyrchar\\CYRG}',
+u'\u0414': '{\\cyrchar\\CYRD}',
+u'\u0415': '{\\cyrchar\\CYRE}',
+u'\u0416': '{\\cyrchar\\CYRZH}',
+u'\u0417': '{\\cyrchar\\CYRZ}',
+u'\u0418': '{\\cyrchar\\CYRI}',
+u'\u0419': '{\\cyrchar\\CYRISHRT}',
+u'\u041a': '{\\cyrchar\\CYRK}',
+u'\u041b': '{\\cyrchar\\CYRL}',
+u'\u041c': '{\\cyrchar\\CYRM}',
+u'\u041d': '{\\cyrchar\\CYRN}',
+u'\u041e': '{\\cyrchar\\CYRO}',
+u'\u041f': '{\\cyrchar\\CYRP}',
+u'\u0420': '{\\cyrchar\\CYRR}',
+u'\u0421': '{\\cyrchar\\CYRS}',
+u'\u0422': '{\\cyrchar\\CYRT}',
+u'\u0423': '{\\cyrchar\\CYRU}',
+u'\u0424': '{\\cyrchar\\CYRF}',
+u'\u0425': '{\\cyrchar\\CYRH}',
+u'\u0426': '{\\cyrchar\\CYRC}',
+u'\u0427': '{\\cyrchar\\CYRCH}',
+u'\u0428': '{\\cyrchar\\CYRSH}',
+u'\u0429': '{\\cyrchar\\CYRSHCH}',
+u'\u042a': '{\\cyrchar\\CYRHRDSN}',
+u'\u042b': '{\\cyrchar\\CYRERY}',
+u'\u042c': '{\\cyrchar\\CYRSFTSN}',
+u'\u042d': '{\\cyrchar\\CYREREV}',
+u'\u042e': '{\\cyrchar\\CYRYU}',
+u'\u042f': '{\\cyrchar\\CYRYA}',
+u'\u0430': '{\\cyrchar\\cyra}',
+u'\u0431': '{\\cyrchar\\cyrb}',
+u'\u0432': '{\\cyrchar\\cyrv}',
+u'\u0433': '{\\cyrchar\\cyrg}',
+u'\u0434': '{\\cyrchar\\cyrd}',
+u'\u0435': '{\\cyrchar\\cyre}',
+u'\u0436': '{\\cyrchar\\cyrzh}',
+u'\u0437': '{\\cyrchar\\cyrz}',
+u'\u0438': '{\\cyrchar\\cyri}',
+u'\u0439': '{\\cyrchar\\cyrishrt}',
+u'\u043a': '{\\cyrchar\\cyrk}',
+u'\u043b': '{\\cyrchar\\cyrl}',
+u'\u043c': '{\\cyrchar\\cyrm}',
+u'\u043d': '{\\cyrchar\\cyrn}',
+u'\u043e': '{\\cyrchar\\cyro}',
+u'\u043f': '{\\cyrchar\\cyrp}',
+u'\u0440': '{\\cyrchar\\cyrr}',
+u'\u0441': '{\\cyrchar\\cyrs}',
+u'\u0442': '{\\cyrchar\\cyrt}',
+u'\u0443': '{\\cyrchar\\cyru}',
+u'\u0444': '{\\cyrchar\\cyrf}',
+u'\u0445': '{\\cyrchar\\cyrh}',
+u'\u0446': '{\\cyrchar\\cyrc}',
+u'\u0447': '{\\cyrchar\\cyrch}',
+u'\u0448': '{\\cyrchar\\cyrsh}',
+u'\u0449': '{\\cyrchar\\cyrshch}',
+u'\u044a': '{\\cyrchar\\cyrhrdsn}',
+u'\u044b': '{\\cyrchar\\cyrery}',
+u'\u044c': '{\\cyrchar\\cyrsftsn}',
+u'\u044d': '{\\cyrchar\\cyrerev}',
+u'\u044e': '{\\cyrchar\\cyryu}',
+u'\u044f': '{\\cyrchar\\cyrya}',
+u'\u0451': '{\\cyrchar\\cyryo}',
+u'\u0452': '{\\cyrchar\\cyrdje}',
+u'\u0453': "{\\cyrchar{\\'\\cyrg}}",
+u'\u0454': '{\\cyrchar\\cyrie}',
+u'\u0455': '{\\cyrchar\\cyrdze}',
+u'\u0456': '{\\cyrchar\\cyrii}',
+u'\u0457': '{\\cyrchar\\cyryi}',
+u'\u0458': '{\\cyrchar\\cyrje}',
+u'\u0459': '{\\cyrchar\\cyrlje}',
+u'\u045a': '{\\cyrchar\\cyrnje}',
+u'\u045b': '{\\cyrchar\\cyrtshe}',
+u'\u045c': "{\\cyrchar{\\'\\cyrk}}",
+u'\u045e': '{\\cyrchar\\cyrushrt}',
+u'\u045f': '{\\cyrchar\\cyrdzhe}',
+u'\u0460': '{\\cyrchar\\CYROMEGA}',
+u'\u0461': '{\\cyrchar\\cyromega}',
+u'\u0462': '{\\cyrchar\\CYRYAT}',
+u'\u0464': '{\\cyrchar\\CYRIOTE}',
+u'\u0465': '{\\cyrchar\\cyriote}',
+u'\u0466': '{\\cyrchar\\CYRLYUS}',
+u'\u0467': '{\\cyrchar\\cyrlyus}',
+u'\u0468': '{\\cyrchar\\CYRIOTLYUS}',
+u'\u0469': '{\\cyrchar\\cyriotlyus}',
+u'\u046a': '{\\cyrchar\\CYRBYUS}',
+u'\u046c': '{\\cyrchar\\CYRIOTBYUS}',
+u'\u046d': '{\\cyrchar\\cyriotbyus}',
+u'\u046e': '{\\cyrchar\\CYRKSI}',
+u'\u046f': '{\\cyrchar\\cyrksi}',
+u'\u0470': '{\\cyrchar\\CYRPSI}',
+u'\u0471': '{\\cyrchar\\cyrpsi}',
+u'\u0472': '{\\cyrchar\\CYRFITA}',
+u'\u0474': '{\\cyrchar\\CYRIZH}',
+u'\u0478': '{\\cyrchar\\CYRUK}',
+u'\u0479': '{\\cyrchar\\cyruk}',
+u'\u047a': '{\\cyrchar\\CYROMEGARND}',
+u'\u047b': '{\\cyrchar\\cyromegarnd}',
+u'\u047c': '{\\cyrchar\\CYROMEGATITLO}',
+u'\u047d': '{\\cyrchar\\cyromegatitlo}',
+u'\u047e': '{\\cyrchar\\CYROT}',
+u'\u047f': '{\\cyrchar\\cyrot}',
+u'\u0480': '{\\cyrchar\\CYRKOPPA}',
+u'\u0481': '{\\cyrchar\\cyrkoppa}',
+u'\u0482': '{\\cyrchar\\cyrthousands}',
+u'\u0488': '{\\cyrchar\\cyrhundredthousands}',
+u'\u0489': '{\\cyrchar\\cyrmillions}',
+u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}',
+u'\u048d': '{\\cyrchar\\cyrsemisftsn}',
+u'\u048e': '{\\cyrchar\\CYRRTICK}',
+u'\u048f': '{\\cyrchar\\cyrrtick}',
+u'\u0490': '{\\cyrchar\\CYRGUP}',
+u'\u0491': '{\\cyrchar\\cyrgup}',
+u'\u0492': '{\\cyrchar\\CYRGHCRS}',
+u'\u0493': '{\\cyrchar\\cyrghcrs}',
+u'\u0494': '{\\cyrchar\\CYRGHK}',
+u'\u0495': '{\\cyrchar\\cyrghk}',
+u'\u0496': '{\\cyrchar\\CYRZHDSC}',
+u'\u0497': '{\\cyrchar\\cyrzhdsc}',
+u'\u0498': '{\\cyrchar\\CYRZDSC}',
+u'\u0499': '{\\cyrchar\\cyrzdsc}',
+u'\u049a': '{\\cyrchar\\CYRKDSC}',
+u'\u049b': '{\\cyrchar\\cyrkdsc}',
+u'\u049c': '{\\cyrchar\\CYRKVCRS}',
+u'\u049d': '{\\cyrchar\\cyrkvcrs}',
+u'\u049e': '{\\cyrchar\\CYRKHCRS}',
+u'\u049f': '{\\cyrchar\\cyrkhcrs}',
+u'\u04a0': '{\\cyrchar\\CYRKBEAK}',
+u'\u04a1': '{\\cyrchar\\cyrkbeak}',
+u'\u04a2': '{\\cyrchar\\CYRNDSC}',
+u'\u04a3': '{\\cyrchar\\cyrndsc}',
+u'\u04a4': '{\\cyrchar\\CYRNG}',
+u'\u04a5': '{\\cyrchar\\cyrng}',
+u'\u04a6': '{\\cyrchar\\CYRPHK}',
+u'\u04a7': '{\\cyrchar\\cyrphk}',
+u'\u04a8': '{\\cyrchar\\CYRABHHA}',
+u'\u04a9': '{\\cyrchar\\cyrabhha}',
+u'\u04aa': '{\\cyrchar\\CYRSDSC}',
+u'\u04ab': '{\\cyrchar\\cyrsdsc}',
+u'\u04ac': '{\\cyrchar\\CYRTDSC}',
+u'\u04ad': '{\\cyrchar\\cyrtdsc}',
+u'\u04ae': '{\\cyrchar\\CYRY}',
+u'\u04af': '{\\cyrchar\\cyry}',
+u'\u04b0': '{\\cyrchar\\CYRYHCRS}',
+u'\u04b1': '{\\cyrchar\\cyryhcrs}',
+u'\u04b2': '{\\cyrchar\\CYRHDSC}',
+u'\u04b3': '{\\cyrchar\\cyrhdsc}',
+u'\u04b4': '{\\cyrchar\\CYRTETSE}',
+u'\u04b5': '{\\cyrchar\\cyrtetse}',
+u'\u04b6': '{\\cyrchar\\CYRCHRDSC}',
+u'\u04b7': '{\\cyrchar\\cyrchrdsc}',
+u'\u04b8': '{\\cyrchar\\CYRCHVCRS}',
+u'\u04b9': '{\\cyrchar\\cyrchvcrs}',
+u'\u04ba': '{\\cyrchar\\CYRSHHA}',
+u'\u04bb': '{\\cyrchar\\cyrshha}',
+u'\u04bc': '{\\cyrchar\\CYRABHCH}',
+u'\u04bd': '{\\cyrchar\\cyrabhch}',
+u'\u04be': '{\\cyrchar\\CYRABHCHDSC}',
+u'\u04bf': '{\\cyrchar\\cyrabhchdsc}',
+u'\u04c0': '{\\cyrchar\\CYRpalochka}',
+u'\u04c3': '{\\cyrchar\\CYRKHK}',
+u'\u04c4': '{\\cyrchar\\cyrkhk}',
+u'\u04c7': '{\\cyrchar\\CYRNHK}',
+u'\u04c8': '{\\cyrchar\\cyrnhk}',
+u'\u04cb': '{\\cyrchar\\CYRCHLDSC}',
+u'\u04cc': '{\\cyrchar\\cyrchldsc}',
+u'\u04d4': '{\\cyrchar\\CYRAE}',
+u'\u04d5': '{\\cyrchar\\cyrae}',
+u'\u04d8': '{\\cyrchar\\CYRSCHWA}',
+u'\u04d9': '{\\cyrchar\\cyrschwa}',
+u'\u04e0': '{\\cyrchar\\CYRABHDZE}',
+u'\u04e1': '{\\cyrchar\\cyrabhdze}',
+u'\u04e8': '{\\cyrchar\\CYROTLD}',
+u'\u04e9': '{\\cyrchar\\cyrotld}',
+u'\u2002': '{\\hspace{0.6em}}',
+u'\u2003': '{\\hspace{1em}}',
+u'\u2004': '{\\hspace{0.33em}}',
+u'\u2005': '{\\hspace{0.25em}}',
+u'\u2006': '{\\hspace{0.166em}}',
+u'\u2007': '{\\hphantom{0}}',
+u'\u2008': '{\\hphantom{,}}',
+u'\u2009': '{\\hspace{0.167em}}',
+u'\u200a': '$\\mkern1mu$',
+u'\u2010': '{-}',
+u'\u2013': '{\\textendash}',
+u'\u2014': '{\\textemdash}',
+u'\u2015': '{\\rule{1em}{1pt}}',
+u'\u2016': '$\\Vert$',
+u'\u2018': '{`}',
+u'\u2019': "{'}",
+u'\u201a': '{,}',
+u'\u201b': '$\\Elzreapos$',
+u'\u201c': '{\\textquotedblleft}',
+u'\u201d': '{\\textquotedblright}',
+u'\u201e': '{,,}',
+u'\u2020': '{\\textdagger}',
+u'\u2021': '{\\textdaggerdbl}',
+u'\u2022': '{\\textbullet}',
+u'\u2024': '{.}',
+u'\u2025': '{..}',
+u'\u2026': '{\\ldots}',
+u'\u2030': '{\\textperthousand}',
+u'\u2031': '{\\textpertenthousand}',
+u'\u2032': "${'}$",
+u'\u2033': "${''}$",
+u'\u2034': "${'''}$",
+u'\u2035': '$\\backprime$',
+u'\u2039': '{\\guilsinglleft}',
+u'\u203a': '{\\guilsinglright}',
+u'\u2057': "$''''$",
+u'\u205f': '{\\mkern4mu}',
+u'\u2060': '{\\nolinebreak}',
+u'\u20a7': '{\\ensuremath{\\Elzpes}}',
+u'\u20ac': '{\\mbox{\\texteuro}}',
+u'\u20db': '$\\dddot$',
+u'\u20dc': '$\\ddddot$',
+u'\u2102': '$\\mathbb{C}$',
+u'\u210a': '{\\mathscr{g}}',
+u'\u210b': '$\\mathscr{H}$',
+u'\u210c': '$\\mathfrak{H}$',
+u'\u210d': '$\\mathbb{H}$',
+u'\u210f': '$\\hslash$',
+u'\u2110': '$\\mathscr{I}$',
+u'\u2111': '$\\mathfrak{I}$',
+u'\u2112': '$\\mathscr{L}$',
+u'\u2113': '$\\mathscr{l}$',
+u'\u2115': '$\\mathbb{N}$',
+u'\u2116': '{\\cyrchar\\textnumero}',
+u'\u2118': '$\\wp$',
+u'\u2119': '$\\mathbb{P}$',
+u'\u211a': '$\\mathbb{Q}$',
+u'\u211b': '$\\mathscr{R}$',
+u'\u211c': '$\\mathfrak{R}$',
+u'\u211d': '$\\mathbb{R}$',
+u'\u211e': '$\\Elzxrat$',
+u'\u2122': '{\\texttrademark}',
+u'\u2124': '$\\mathbb{Z}$',
+u'\u2126': '$\\Omega$',
+u'\u2127': '$\\mho$',
+u'\u2128': '$\\mathfrak{Z}$',
+u'\u2129': '$\\ElsevierGlyph{2129}$',
+u'\u212b': '{\\AA}',
+u'\u212c': '$\\mathscr{B}$',
+u'\u212d': '$\\mathfrak{C}$',
+u'\u212f': '$\\mathscr{e}$',
+u'\u2130': '$\\mathscr{E}$',
+u'\u2131': '$\\mathscr{F}$',
+u'\u2133': '$\\mathscr{M}$',
+u'\u2134': '$\\mathscr{o}$',
+u'\u2135': '$\\aleph$',
+u'\u2136': '$\\beth$',
+u'\u2137': '$\\gimel$',
+u'\u2138': '$\\daleth$',
+u'\u2153': '$\\textfrac{1}{3}$',
+u'\u2154': '$\\textfrac{2}{3}$',
+u'\u2155': '$\\textfrac{1}{5}$',
+u'\u2156': '$\\textfrac{2}{5}$',
+u'\u2157': '$\\textfrac{3}{5}$',
+u'\u2158': '$\\textfrac{4}{5}$',
+u'\u2159': '$\\textfrac{1}{6}$',
+u'\u215a': '$\\textfrac{5}{6}$',
+u'\u215b': '$\\textfrac{1}{8}$',
+u'\u215c': '$\\textfrac{3}{8}$',
+u'\u215d': '$\\textfrac{5}{8}$',
+u'\u215e': '$\\textfrac{7}{8}$',
+u'\u2190': '$\\leftarrow$',
+u'\u2191': '$\\uparrow$',
+u'\u2192': '$\\rightarrow$',
+u'\u2193': '$\\downarrow$',
+u'\u2194': '$\\leftrightarrow$',
+u'\u2195': '$\\updownarrow$',
+u'\u2196': '$\\nwarrow$',
+u'\u2197': '$\\nearrow$',
+u'\u2198': '$\\searrow$',
+u'\u2199': '$\\swarrow$',
+u'\u219a': '$\\nleftarrow$',
+u'\u219b': '$\\nrightarrow$',
+u'\u219c': '$\\arrowwaveright$',
+u'\u219d': '$\\arrowwaveright$',
+u'\u219e': '$\\twoheadleftarrow$',
+u'\u21a0': '$\\twoheadrightarrow$',
+u'\u21a2': '$\\leftarrowtail$',
+u'\u21a3': '$\\rightarrowtail$',
+u'\u21a6': '$\\mapsto$',
+u'\u21a9': '$\\hookleftarrow$',
+u'\u21aa': '$\\hookrightarrow$',
+u'\u21ab': '$\\looparrowleft$',
+u'\u21ac': '$\\looparrowright$',
+u'\u21ad': '$\\leftrightsquigarrow$',
+u'\u21ae': '$\\nleftrightarrow$',
+u'\u21b0': '$\\Lsh$',
+u'\u21b1': '$\\Rsh$',
+u'\u21b3': '$\\ElsevierGlyph{21B3}$',
+u'\u21b6': '$\\curvearrowleft$',
+u'\u21b7': '$\\curvearrowright$',
+u'\u21ba': '$\\circlearrowleft$',
+u'\u21bb': '$\\circlearrowright$',
+u'\u21bc': '$\\leftharpoonup$',
+u'\u21bd': '$\\leftharpoondown$',
+u'\u21be': '$\\upharpoonright$',
+u'\u21bf': '$\\upharpoonleft$',
+u'\u21c0': '$\\rightharpoonup$',
+u'\u21c1': '$\\rightharpoondown$',
+u'\u21c2': '$\\downharpoonright$',
+u'\u21c3': '$\\downharpoonleft$',
+u'\u21c4': '$\\rightleftarrows$',
+u'\u21c5': '$\\dblarrowupdown$',
+u'\u21c6': '$\\leftrightarrows$',
+u'\u21c7': '$\\leftleftarrows$',
+u'\u21c8': '$\\upuparrows$',
+u'\u21c9': '$\\rightrightarrows$',
+u'\u21ca': '$\\downdownarrows$',
+u'\u21cb': '$\\leftrightharpoons$',
+u'\u21cc': '$\\rightleftharpoons$',
+u'\u21cd': '$\\nLeftarrow$',
+u'\u21ce': '$\\nLeftrightarrow$',
+u'\u21cf': '$\\nRightarrow$',
+u'\u21d0': '$\\Leftarrow$',
+u'\u21d1': '$\\Uparrow$',
+u'\u21d2': '$\\Rightarrow$',
+u'\u21d3': '$\\Downarrow$',
+u'\u21d4': '$\\Leftrightarrow$',
+u'\u21d5': '$\\Updownarrow$',
+u'\u21da': '$\\Lleftarrow$',
+u'\u21db': '$\\Rrightarrow$',
+u'\u21dd': '$\\rightsquigarrow$',
+u'\u21f5': '$\\DownArrowUpArrow$',
+u'\u2200': '$\\forall$',
+u'\u2201': '$\\complement$',
+u'\u2202': '$\\partial$',
+u'\u2203': '$\\exists$',
+u'\u2204': '$\\nexists$',
+u'\u2205': '$\\varnothing$',
+u'\u2207': '$\\nabla$',
+u'\u2208': '$\\in$',
+u'\u2209': '$\\not\\in$',
+u'\u220b': '$\\ni$',
+u'\u220c': '$\\not\\ni$',
+u'\u220f': '$\\prod$',
+u'\u2210': '$\\coprod$',
+u'\u2211': '$\\sum$',
+u'\u2212': '{-}',
+u'\u2213': '$\\mp$',
+u'\u2214': '$\\dotplus$',
+u'\u2216': '$\\setminus$',
+u'\u2217': '${_\\ast}$',
+u'\u2218': '$\\circ$',
+u'\u2219': '$\\bullet$',
+u'\u221a': '$\\surd$',
+u'\u221d': '$\\propto$',
+u'\u221e': '$\\infty$',
+u'\u221f': '$\\rightangle$',
+u'\u2220': '$\\angle$',
+u'\u2221': '$\\measuredangle$',
+u'\u2222': '$\\sphericalangle$',
+u'\u2223': '$\\mid$',
+u'\u2224': '$\\nmid$',
+u'\u2225': '$\\parallel$',
+u'\u2226': '$\\nparallel$',
+u'\u2227': '$\\wedge$',
+u'\u2228': '$\\vee$',
+u'\u2229': '$\\cap$',
+u'\u222a': '$\\cup$',
+u'\u222b': '$\\int$',
+u'\u222c': '$\\int\\!\\int$',
+u'\u222d': '$\\int\\!\\int\\!\\int$',
+u'\u222e': '$\\oint$',
+u'\u222f': '$\\surfintegral$',
+u'\u2230': '$\\volintegral$',
+u'\u2231': '$\\clwintegral$',
+u'\u2232': '$\\ElsevierGlyph{2232}$',
+u'\u2233': '$\\ElsevierGlyph{2233}$',
+u'\u2234': '$\\therefore$',
+u'\u2235': '$\\because$',
+u'\u2237': '$\\Colon$',
+u'\u2238': '$\\ElsevierGlyph{2238}$',
+u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$',
+u'\u223b': '$\\homothetic$',
+u'\u223c': '$\\sim$',
+u'\u223d': '$\\backsim$',
+u'\u223e': '$\\lazysinv$',
+u'\u2240': '$\\wr$',
+u'\u2241': '$\\not\\sim$',
+u'\u2242': '$\\ElsevierGlyph{2242}$',
+u'\u2243': '$\\simeq$',
+u'\u2244': '$\\not\\simeq$',
+u'\u2245': '$\\cong$',
+u'\u2246': '$\\approxnotequal$',
+u'\u2247': '$\\not\\cong$',
+u'\u2248': '$\\approx$',
+u'\u2249': '$\\not\\approx$',
+u'\u224a': '$\\approxeq$',
+u'\u224b': '$\\tildetrpl$',
+u'\u224c': '$\\allequal$',
+u'\u224d': '$\\asymp$',
+u'\u224e': '$\\Bumpeq$',
+u'\u224f': '$\\bumpeq$',
+u'\u2250': '$\\doteq$',
+u'\u2251': '$\\doteqdot$',
+u'\u2252': '$\\fallingdotseq$',
+u'\u2253': '$\\risingdotseq$',
+u'\u2254': '{:=}',
+u'\u2255': '$=:$',
+u'\u2256': '$\\eqcirc$',
+u'\u2257': '$\\circeq$',
+u'\u2259': '$\\estimates$',
+u'\u225a': '$\\ElsevierGlyph{225A}$',
+u'\u225b': '$\\starequal$',
+u'\u225c': '$\\triangleq$',
+u'\u225f': '$\\ElsevierGlyph{225F}$',
+u'\u2260': '$\\not =$',
+u'\u2261': '$\\equiv$',
+u'\u2262': '$\\not\\equiv$',
+u'\u2264': '$\\leq$',
+u'\u2265': '$\\geq$',
+u'\u2266': '$\\leqq$',
+u'\u2267': '$\\geqq$',
+u'\u2268': '$\\lneqq$',
+u'\u2269': '$\\gneqq$',
+u'\u226a': '$\\ll$',
+u'\u226b': '$\\gg$',
+u'\u226c': '$\\between$',
+u'\u226d': '$\\not\\kern-0.3em\\times$',
+u'\u226e': '$\\not<$',
+u'\u226f': '$\\not>$',
+u'\u2270': '$\\not\\leq$',
+u'\u2271': '$\\not\\geq$',
+u'\u2272': '$\\lessequivlnt$',
+u'\u2273': '$\\greaterequivlnt$',
+u'\u2274': '$\\ElsevierGlyph{2274}$',
+u'\u2275': '$\\ElsevierGlyph{2275}$',
+u'\u2276': '$\\lessgtr$',
+u'\u2277': '$\\gtrless$',
+u'\u2278': '$\\notlessgreater$',
+u'\u2279': '$\\notgreaterless$',
+u'\u227a': '$\\prec$',
+u'\u227b': '$\\succ$',
+u'\u227c': '$\\preccurlyeq$',
+u'\u227d': '$\\succcurlyeq$',
+u'\u227e': '$\\precapprox$',
+u'\u227f': '$\\succapprox$',
+u'\u2280': '$\\not\\prec$',
+u'\u2281': '$\\not\\succ$',
+u'\u2282': '$\\subset$',
+u'\u2283': '$\\supset$',
+u'\u2284': '$\\not\\subset$',
+u'\u2285': '$\\not\\supset$',
+u'\u2286': '$\\subseteq$',
+u'\u2287': '$\\supseteq$',
+u'\u2288': '$\\not\\subseteq$',
+u'\u2289': '$\\not\\supseteq$',
+u'\u228a': '$\\subsetneq$',
+u'\u228b': '$\\supsetneq$',
+u'\u228e': '$\\uplus$',
+u'\u228f': '$\\sqsubset$',
+u'\u2290': '$\\sqsupset$',
+u'\u2291': '$\\sqsubseteq$',
+u'\u2292': '$\\sqsupseteq$',
+u'\u2293': '$\\sqcap$',
+u'\u2294': '$\\sqcup$',
+u'\u2295': '$\\oplus$',
+u'\u2296': '$\\ominus$',
+u'\u2297': '$\\otimes$',
+u'\u2298': '$\\oslash$',
+u'\u2299': '$\\odot$',
+u'\u229a': '$\\circledcirc$',
+u'\u229b': '$\\circledast$',
+u'\u229d': '$\\circleddash$',
+u'\u229e': '$\\boxplus$',
+u'\u229f': '$\\boxminus$',
+u'\u22a0': '$\\boxtimes$',
+u'\u22a1': '$\\boxdot$',
+u'\u22a2': '$\\vdash$',
+u'\u22a3': '$\\dashv$',
+u'\u22a4': '$\\top$',
+u'\u22a5': '$\\perp$',
+u'\u22a7': '$\\truestate$',
+u'\u22a8': '$\\forcesextra$',
+u'\u22a9': '$\\Vdash$',
+u'\u22aa': '$\\Vvdash$',
+u'\u22ab': '$\\VDash$',
+u'\u22ac': '$\\nvdash$',
+u'\u22ad': '$\\nvDash$',
+u'\u22ae': '$\\nVdash$',
+u'\u22af': '$\\nVDash$',
+u'\u22b2': '$\\vartriangleleft$',
+u'\u22b3': '$\\vartriangleright$',
+u'\u22b4': '$\\trianglelefteq$',
+u'\u22b5': '$\\trianglerighteq$',
+u'\u22b6': '$\\original$',
+u'\u22b7': '$\\image$',
+u'\u22b8': '$\\multimap$',
+u'\u22b9': '$\\hermitconjmatrix$',
+u'\u22ba': '$\\intercal$',
+u'\u22bb': '$\\veebar$',
+u'\u22be': '$\\rightanglearc$',
+u'\u22c0': '$\\ElsevierGlyph{22C0}$',
+u'\u22c1': '$\\ElsevierGlyph{22C1}$',
+u'\u22c2': '$\\bigcap$',
+u'\u22c3': '$\\bigcup$',
+u'\u22c4': '$\\diamond$',
+u'\u22c5': '$\\cdot$',
+u'\u22c6': '$\\star$',
+u'\u22c7': '$\\divideontimes$',
+u'\u22c8': '$\\bowtie$',
+u'\u22c9': '$\\ltimes$',
+u'\u22ca': '$\\rtimes$',
+u'\u22cb': '$\\leftthreetimes$',
+u'\u22cc': '$\\rightthreetimes$',
+u'\u22cd': '$\\backsimeq$',
+u'\u22ce': '$\\curlyvee$',
+u'\u22cf': '$\\curlywedge$',
+u'\u22d0': '$\\Subset$',
+u'\u22d1': '$\\Supset$',
+u'\u22d2': '$\\Cap$',
+u'\u22d3': '$\\Cup$',
+u'\u22d4': '$\\pitchfork$',
+u'\u22d6': '$\\lessdot$',
+u'\u22d7': '$\\gtrdot$',
+u'\u22d8': '$\\verymuchless$',
+u'\u22d9': '$\\verymuchgreater$',
+u'\u22da': '$\\lesseqgtr$',
+u'\u22db': '$\\gtreqless$',
+u'\u22de': '$\\curlyeqprec$',
+u'\u22df': '$\\curlyeqsucc$',
+u'\u22e2': '$\\not\\sqsubseteq$',
+u'\u22e3': '$\\not\\sqsupseteq$',
+u'\u22e5': '$\\Elzsqspne$',
+u'\u22e6': '$\\lnsim$',
+u'\u22e7': '$\\gnsim$',
+u'\u22e8': '$\\precedesnotsimilar$',
+u'\u22e9': '$\\succnsim$',
+u'\u22ea': '$\\ntriangleleft$',
+u'\u22eb': '$\\ntriangleright$',
+u'\u22ec': '$\\ntrianglelefteq$',
+u'\u22ed': '$\\ntrianglerighteq$',
+u'\u22ee': '$\\vdots$',
+u'\u22ef': '$\\cdots$',
+u'\u22f0': '$\\upslopeellipsis$',
+u'\u22f1': '$\\downslopeellipsis$',
+u'\u2305': '{\\barwedge}',
+u'\u2306': '$\\perspcorrespond$',
+u'\u2308': '$\\lceil$',
+u'\u2309': '$\\rceil$',
+u'\u230a': '$\\lfloor$',
+u'\u230b': '$\\rfloor$',
+u'\u2315': '$\\recorder$',
+u'\u2316': '$\\mathchar"2208$',
+u'\u231c': '$\\ulcorner$',
+u'\u231d': '$\\urcorner$',
+u'\u231e': '$\\llcorner$',
+u'\u231f': '$\\lrcorner$',
+u'\u2322': '$\\frown$',
+u'\u2323': '$\\smile$',
+u'\u2329': '$\\langle$',
+u'\u232a': '$\\rangle$',
+u'\u233d': '$\\ElsevierGlyph{E838}$',
+u'\u23a3': '$\\Elzdlcorn$',
+u'\u23b0': '$\\lmoustache$',
+u'\u23b1': '$\\rmoustache$',
+u'\u2423': '{\\textvisiblespace}',
+u'\u2460': '{\\ding{172}}',
+u'\u2461': '{\\ding{173}}',
+u'\u2462': '{\\ding{174}}',
+u'\u2463': '{\\ding{175}}',
+u'\u2464': '{\\ding{176}}',
+u'\u2465': '{\\ding{177}}',
+u'\u2466': '{\\ding{178}}',
+u'\u2467': '{\\ding{179}}',
+u'\u2468': '{\\ding{180}}',
+u'\u2469': '{\\ding{181}}',
+u'\u24c8': '$\\circledS$',
+u'\u2506': '$\\Elzdshfnc$',
+u'\u2519': '$\\Elzsqfnw$',
+u'\u2571': '$\\diagup$',
+u'\u25a0': '{\\ding{110}}',
+u'\u25a1': '$\\square$',
+u'\u25aa': '$\\blacksquare$',
+u'\u25ad': '$\\fbox{~~}$',
+u'\u25af': '$\\Elzvrecto$',
+u'\u25b1': '$\\ElsevierGlyph{E381}$',
+u'\u25b2': '{\\ding{115}}',
+u'\u25b3': '$\\bigtriangleup$',
+u'\u25b4': '$\\blacktriangle$',
+u'\u25b5': '$\\vartriangle$',
+u'\u25b8': '$\\blacktriangleright$',
+u'\u25b9': '$\\triangleright$',
+u'\u25bc': '{\\ding{116}}',
+u'\u25bd': '$\\bigtriangledown$',
+u'\u25be': '$\\blacktriangledown$',
+u'\u25bf': '$\\triangledown$',
+u'\u25c2': '$\\blacktriangleleft$',
+u'\u25c3': '$\\triangleleft$',
+u'\u25c6': '{\\ding{117}}',
+u'\u25ca': '$\\lozenge$',
+u'\u25cb': '$\\bigcirc$',
+u'\u25cf': '{\\ding{108}}',
+u'\u25d0': '$\\Elzcirfl$',
+u'\u25d1': '$\\Elzcirfr$',
+u'\u25d2': '$\\Elzcirfb$',
+u'\u25d7': '{\\ding{119}}',
+u'\u25d8': '$\\Elzrvbull$',
+u'\u25e7': '$\\Elzsqfl$',
+u'\u25e8': '$\\Elzsqfr$',
+u'\u25ea': '$\\Elzsqfse$',
+u'\u25ef': '$\\bigcirc$',
+u'\u2605': '{\\ding{72}}',
+u'\u2606': '{\\ding{73}}',
+u'\u260e': '{\\ding{37}}',
+u'\u261b': '{\\ding{42}}',
+u'\u261e': '{\\ding{43}}',
+u'\u263e': '{\\rightmoon}',
+u'\u263f': '{\\mercury}',
+u'\u2640': '{\\venus}',
+u'\u2642': '{\\male}',
+u'\u2643': '{\\jupiter}',
+u'\u2644': '{\\saturn}',
+u'\u2645': '{\\uranus}',
+u'\u2646': '{\\neptune}',
+u'\u2647': '{\\pluto}',
+u'\u2648': '{\\aries}',
+u'\u2649': '{\\taurus}',
+u'\u264a': '{\\gemini}',
+u'\u264b': '{\\cancer}',
+u'\u264c': '{\\leo}',
+u'\u264d': '{\\virgo}',
+u'\u264e': '{\\libra}',
+u'\u264f': '{\\scorpio}',
+u'\u2650': '{\\sagittarius}',
+u'\u2651': '{\\capricornus}',
+u'\u2652': '{\\aquarius}',
+u'\u2653': '{\\pisces}',
+u'\u2660': '{\\ding{171}}',
+u'\u2662': '$\\diamond$',
+u'\u2663': '{\\ding{168}}',
+u'\u2665': '{\\ding{170}}',
+u'\u2666': '{\\ding{169}}',
+u'\u2669': '{\\quarternote}',
+u'\u266a': '{\\eighthnote}',
+u'\u266d': '$\\flat$',
+u'\u266e': '$\\natural$',
+u'\u266f': '$\\sharp$',
+u'\u2701': '{\\ding{33}}',
+u'\u2702': '{\\ding{34}}',
+u'\u2703': '{\\ding{35}}',
+u'\u2704': '{\\ding{36}}',
+u'\u2706': '{\\ding{38}}',
+u'\u2707': '{\\ding{39}}',
+u'\u2708': '{\\ding{40}}',
+u'\u2709': '{\\ding{41}}',
+u'\u270c': '{\\ding{44}}',
+u'\u270d': '{\\ding{45}}',
+u'\u270e': '{\\ding{46}}',
+u'\u270f': '{\\ding{47}}',
+u'\u2710': '{\\ding{48}}',
+u'\u2711': '{\\ding{49}}',
+u'\u2712': '{\\ding{50}}',
+u'\u2713': '{\\ding{51}}',
+u'\u2714': '{\\ding{52}}',
+u'\u2715': '{\\ding{53}}',
+u'\u2716': '{\\ding{54}}',
+u'\u2717': '{\\ding{55}}',
+u'\u2718': '{\\ding{56}}',
+u'\u2719': '{\\ding{57}}',
+u'\u271a': '{\\ding{58}}',
+u'\u271b': '{\\ding{59}}',
+u'\u271c': '{\\ding{60}}',
+u'\u271d': '{\\ding{61}}',
+u'\u271e': '{\\ding{62}}',
+u'\u271f': '{\\ding{63}}',
+u'\u2720': '{\\ding{64}}',
+u'\u2721': '{\\ding{65}}',
+u'\u2722': '{\\ding{66}}',
+u'\u2723': '{\\ding{67}}',
+u'\u2724': '{\\ding{68}}',
+u'\u2725': '{\\ding{69}}',
+u'\u2726': '{\\ding{70}}',
+u'\u2727': '{\\ding{71}}',
+u'\u2729': '{\\ding{73}}',
+u'\u272a': '{\\ding{74}}',
+u'\u272b': '{\\ding{75}}',
+u'\u272c': '{\\ding{76}}',
+u'\u272d': '{\\ding{77}}',
+u'\u272e': '{\\ding{78}}',
+u'\u272f': '{\\ding{79}}',
+u'\u2730': '{\\ding{80}}',
+u'\u2731': '{\\ding{81}}',
+u'\u2732': '{\\ding{82}}',
+u'\u2733': '{\\ding{83}}',
+u'\u2734': '{\\ding{84}}',
+u'\u2735': '{\\ding{85}}',
+u'\u2736': '{\\ding{86}}',
+u'\u2737': '{\\ding{87}}',
+u'\u2738': '{\\ding{88}}',
+u'\u2739': '{\\ding{89}}',
+u'\u273a': '{\\ding{90}}',
+u'\u273b': '{\\ding{91}}',
+u'\u273c': '{\\ding{92}}',
+u'\u273d': '{\\ding{93}}',
+u'\u273e': '{\\ding{94}}',
+u'\u273f': '{\\ding{95}}',
+u'\u2740': '{\\ding{96}}',
+u'\u2741': '{\\ding{97}}',
+u'\u2742': '{\\ding{98}}',
+u'\u2743': '{\\ding{99}}',
+u'\u2744': '{\\ding{100}}',
+u'\u2745': '{\\ding{101}}',
+u'\u2746': '{\\ding{102}}',
+u'\u2747': '{\\ding{103}}',
+u'\u2748': '{\\ding{104}}',
+u'\u2749': '{\\ding{105}}',
+u'\u274a': '{\\ding{106}}',
+u'\u274b': '{\\ding{107}}',
+u'\u274d': '{\\ding{109}}',
+u'\u274f': '{\\ding{111}}',
+u'\u2750': '{\\ding{112}}',
+u'\u2751': '{\\ding{113}}',
+u'\u2752': '{\\ding{114}}',
+u'\u2756': '{\\ding{118}}',
+u'\u2758': '{\\ding{120}}',
+u'\u2759': '{\\ding{121}}',
+u'\u275a': '{\\ding{122}}',
+u'\u275b': '{\\ding{123}}',
+u'\u275c': '{\\ding{124}}',
+u'\u275d': '{\\ding{125}}',
+u'\u275e': '{\\ding{126}}',
+u'\u2761': '{\\ding{161}}',
+u'\u2762': '{\\ding{162}}',
+u'\u2763': '{\\ding{163}}',
+u'\u2764': '{\\ding{164}}',
+u'\u2765': '{\\ding{165}}',
+u'\u2766': '{\\ding{166}}',
+u'\u2767': '{\\ding{167}}',
+u'\u2776': '{\\ding{182}}',
+u'\u2777': '{\\ding{183}}',
+u'\u2778': '{\\ding{184}}',
+u'\u2779': '{\\ding{185}}',
+u'\u277a': '{\\ding{186}}',
+u'\u277b': '{\\ding{187}}',
+u'\u277c': '{\\ding{188}}',
+u'\u277d': '{\\ding{189}}',
+u'\u277e': '{\\ding{190}}',
+u'\u277f': '{\\ding{191}}',
+u'\u2780': '{\\ding{192}}',
+u'\u2781': '{\\ding{193}}',
+u'\u2782': '{\\ding{194}}',
+u'\u2783': '{\\ding{195}}',
+u'\u2784': '{\\ding{196}}',
+u'\u2785': '{\\ding{197}}',
+u'\u2786': '{\\ding{198}}',
+u'\u2787': '{\\ding{199}}',
+u'\u2788': '{\\ding{200}}',
+u'\u2789': '{\\ding{201}}',
+u'\u278a': '{\\ding{202}}',
+u'\u278b': '{\\ding{203}}',
+u'\u278c': '{\\ding{204}}',
+u'\u278d': '{\\ding{205}}',
+u'\u278e': '{\\ding{206}}',
+u'\u278f': '{\\ding{207}}',
+u'\u2790': '{\\ding{208}}',
+u'\u2791': '{\\ding{209}}',
+u'\u2792': '{\\ding{210}}',
+u'\u2793': '{\\ding{211}}',
+u'\u2794': '{\\ding{212}}',
+u'\u2798': '{\\ding{216}}',
+u'\u2799': '{\\ding{217}}',
+u'\u279a': '{\\ding{218}}',
+u'\u279b': '{\\ding{219}}',
+u'\u279c': '{\\ding{220}}',
+u'\u279d': '{\\ding{221}}',
+u'\u279e': '{\\ding{222}}',
+u'\u279f': '{\\ding{223}}',
+u'\u27a0': '{\\ding{224}}',
+u'\u27a1': '{\\ding{225}}',
+u'\u27a2': '{\\ding{226}}',
+u'\u27a3': '{\\ding{227}}',
+u'\u27a4': '{\\ding{228}}',
+u'\u27a5': '{\\ding{229}}',
+u'\u27a6': '{\\ding{230}}',
+u'\u27a7': '{\\ding{231}}',
+u'\u27a8': '{\\ding{232}}',
+u'\u27a9': '{\\ding{233}}',
+u'\u27aa': '{\\ding{234}}',
+u'\u27ab': '{\\ding{235}}',
+u'\u27ac': '{\\ding{236}}',
+u'\u27ad': '{\\ding{237}}',
+u'\u27ae': '{\\ding{238}}',
+u'\u27af': '{\\ding{239}}',
+u'\u27b1': '{\\ding{241}}',
+u'\u27b2': '{\\ding{242}}',
+u'\u27b3': '{\\ding{243}}',
+u'\u27b4': '{\\ding{244}}',
+u'\u27b5': '{\\ding{245}}',
+u'\u27b6': '{\\ding{246}}',
+u'\u27b7': '{\\ding{247}}',
+u'\u27b8': '{\\ding{248}}',
+u'\u27b9': '{\\ding{249}}',
+u'\u27ba': '{\\ding{250}}',
+u'\u27bb': '{\\ding{251}}',
+u'\u27bc': '{\\ding{252}}',
+u'\u27bd': '{\\ding{253}}',
+u'\u27be': '{\\ding{254}}',
+u'\u27f5': '$\\longleftarrow$',
+u'\u27f6': '$\\longrightarrow$',
+u'\u27f7': '$\\longleftrightarrow$',
+u'\u27f8': '$\\Longleftarrow$',
+u'\u27f9': '$\\Longrightarrow$',
+u'\u27fa': '$\\Longleftrightarrow$',
+u'\u27fc': '$\\longmapsto$',
+u'\u27ff': '$\\sim\\joinrel\\leadsto$',
+u'\u2905': '$\\ElsevierGlyph{E212}$',
+u'\u2912': '$\\UpArrowBar$',
+u'\u2913': '$\\DownArrowBar$',
+u'\u2923': '$\\ElsevierGlyph{E20C}$',
+u'\u2924': '$\\ElsevierGlyph{E20D}$',
+u'\u2925': '$\\ElsevierGlyph{E20B}$',
+u'\u2926': '$\\ElsevierGlyph{E20A}$',
+u'\u2927': '$\\ElsevierGlyph{E211}$',
+u'\u2928': '$\\ElsevierGlyph{E20E}$',
+u'\u2929': '$\\ElsevierGlyph{E20F}$',
+u'\u292a': '$\\ElsevierGlyph{E210}$',
+u'\u2933': '$\\ElsevierGlyph{E21C}$',
+u'\u2936': '$\\ElsevierGlyph{E21A}$',
+u'\u2937': '$\\ElsevierGlyph{E219}$',
+u'\u2940': '$\\Elolarr$',
+u'\u2941': '$\\Elorarr$',
+u'\u2942': '$\\ElzRlarr$',
+u'\u2944': '$\\ElzrLarr$',
+u'\u2947': '$\\Elzrarrx$',
+u'\u294e': '$\\LeftRightVector$',
+u'\u294f': '$\\RightUpDownVector$',
+u'\u2950': '$\\DownLeftRightVector$',
+u'\u2951': '$\\LeftUpDownVector$',
+u'\u2952': '$\\LeftVectorBar$',
+u'\u2953': '$\\RightVectorBar$',
+u'\u2954': '$\\RightUpVectorBar$',
+u'\u2955': '$\\RightDownVectorBar$',
+u'\u2956': '$\\DownLeftVectorBar$',
+u'\u2957': '$\\DownRightVectorBar$',
+u'\u2958': '$\\LeftUpVectorBar$',
+u'\u2959': '$\\LeftDownVectorBar$',
+u'\u295a': '$\\LeftTeeVector$',
+u'\u295b': '$\\RightTeeVector$',
+u'\u295c': '$\\RightUpTeeVector$',
+u'\u295d': '$\\RightDownTeeVector$',
+u'\u295e': '$\\DownLeftTeeVector$',
+u'\u295f': '$\\DownRightTeeVector$',
+u'\u2960': '$\\LeftUpTeeVector$',
+u'\u2961': '$\\LeftDownTeeVector$',
+u'\u296e': '$\\UpEquilibrium$',
+u'\u296f': '$\\ReverseUpEquilibrium$',
+u'\u2970': '$\\RoundImplies$',
+u'\u297c': '$\\ElsevierGlyph{E214}$',
+u'\u297d': '$\\ElsevierGlyph{E215}$',
+u'\u2980': '$\\Elztfnc$',
+u'\u2985': '$\\ElsevierGlyph{3018}$',
+u'\u2986': '$\\Elroang$',
+u'\u2993': '$<\\kern-0.58em($',
+u'\u2994': '$\\ElsevierGlyph{E291}$',
+u'\u2999': '$\\Elzddfnc$',
+u'\u299c': '$\\Angle$',
+u'\u29a0': '$\\Elzlpargt$',
+u'\u29b5': '$\\ElsevierGlyph{E260}$',
+u'\u29b6': '$\\ElsevierGlyph{E61B}$',
+u'\u29ca': '$\\ElzLap$',
+u'\u29cb': '$\\Elzdefas$',
+u'\u29cf': '$\\LeftTriangleBar$',
+u'\u29d0': '$\\RightTriangleBar$',
+u'\u29dc': '$\\ElsevierGlyph{E372}$',
+u'\u29eb': '$\\blacklozenge$',
+u'\u29f4': '$\\RuleDelayed$',
+u'\u2a04': '$\\Elxuplus$',
+u'\u2a05': '$\\ElzThr$',
+u'\u2a06': '$\\Elxsqcup$',
+u'\u2a07': '$\\ElzInf$',
+u'\u2a08': '$\\ElzSup$',
+u'\u2a0d': '$\\ElzCint$',
+u'\u2a0f': '$\\clockoint$',
+u'\u2a10': '$\\ElsevierGlyph{E395}$',
+u'\u2a16': '$\\sqrint$',
+u'\u2a25': '$\\ElsevierGlyph{E25A}$',
+u'\u2a2a': '$\\ElsevierGlyph{E25B}$',
+u'\u2a2d': '$\\ElsevierGlyph{E25C}$',
+u'\u2a2e': '$\\ElsevierGlyph{E25D}$',
+u'\u2a2f': '$\\ElzTimes$',
+u'\u2a34': '$\\ElsevierGlyph{E25E}$',
+u'\u2a35': '$\\ElsevierGlyph{E25E}$',
+u'\u2a3c': '$\\ElsevierGlyph{E259}$',
+u'\u2a3f': '$\\amalg$',
+u'\u2a53': '$\\ElzAnd$',
+u'\u2a54': '$\\ElzOr$',
+u'\u2a55': '$\\ElsevierGlyph{E36E}$',
+u'\u2a56': '$\\ElOr$',
+u'\u2a5e': '$\\perspcorrespond$',
+u'\u2a5f': '$\\Elzminhat$',
+u'\u2a63': '$\\ElsevierGlyph{225A}$',
+u'\u2a6e': '$\\stackrel{*}{=}$',
+u'\u2a75': '$\\Equal$',
+u'\u2a7d': '$\\leqslant$',
+u'\u2a7e': '$\\geqslant$',
+u'\u2a85': '$\\lessapprox$',
+u'\u2a86': '$\\gtrapprox$',
+u'\u2a87': '$\\lneq$',
+u'\u2a88': '$\\gneq$',
+u'\u2a89': '$\\lnapprox$',
+u'\u2a8a': '$\\gnapprox$',
+u'\u2a8b': '$\\lesseqqgtr$',
+u'\u2a8c': '$\\gtreqqless$',
+u'\u2a95': '$\\eqslantless$',
+u'\u2a96': '$\\eqslantgtr$',
+u'\u2a9d': '$\\Pisymbol{ppi020}{117}$',
+u'\u2a9e': '$\\Pisymbol{ppi020}{105}$',
+u'\u2aa1': '$\\NestedLessLess$',
+u'\u2aa2': '$\\NestedGreaterGreater$',
+u'\u2aaf': '$\\preceq$',
+u'\u2ab0': '$\\succeq$',
+u'\u2ab5': '$\\precneqq$',
+u'\u2ab6': '$\\succneqq$',
+u'\u2ab7': '$\\precapprox$',
+u'\u2ab8': '$\\succapprox$',
+u'\u2ab9': '$\\precnapprox$',
+u'\u2aba': '$\\succnapprox$',
+u'\u2ac5': '$\\subseteqq$',
+u'\u2ac6': '$\\supseteqq$',
+u'\u2acb': '$\\subsetneqq$',
+u'\u2acc': '$\\supsetneqq$',
+u'\u2aeb': '$\\ElsevierGlyph{E30D}$',
+u'\u2af6': '$\\Elztdcol$',
+u'\u2afd': '${{/}\\!\\!{/}}$',
+u'\u300a': '$\\ElsevierGlyph{300A}$',
+u'\u300b': '$\\ElsevierGlyph{300B}$',
+u'\u3018': '$\\ElsevierGlyph{3018}$',
+u'\u3019': '$\\ElsevierGlyph{3019}$',
+u'\u301a': '$\\openbracketleft$',
+u'\u301b': '$\\openbracketright$',
+u'\ufb00': '{ff}',
+u'\ufb01': '{fi}',
+u'\ufb02': '{fl}',
+u'\ufb03': '{ffi}',
+u'\ufb04': '{ffl}',
+u'\U0001d400': '$\\mathbf{A}$',
+u'\U0001d401': '$\\mathbf{B}$',
+u'\U0001d402': '$\\mathbf{C}$',
+u'\U0001d403': '$\\mathbf{D}$',
+u'\U0001d404': '$\\mathbf{E}$',
+u'\U0001d405': '$\\mathbf{F}$',
+u'\U0001d406': '$\\mathbf{G}$',
+u'\U0001d407': '$\\mathbf{H}$',
+u'\U0001d408': '$\\mathbf{I}$',
+u'\U0001d409': '$\\mathbf{J}$',
+u'\U0001d40a': '$\\mathbf{K}$',
+u'\U0001d40b': '$\\mathbf{L}$',
+u'\U0001d40c': '$\\mathbf{M}$',
+u'\U0001d40d': '$\\mathbf{N}$',
+u'\U0001d40e': '$\\mathbf{O}$',
+u'\U0001d40f': '$\\mathbf{P}$',
+u'\U0001d410': '$\\mathbf{Q}$',
+u'\U0001d411': '$\\mathbf{R}$',
+u'\U0001d412': '$\\mathbf{S}$',
+u'\U0001d413': '$\\mathbf{T}$',
+u'\U0001d414': '$\\mathbf{U}$',
+u'\U0001d415': '$\\mathbf{V}$',
+u'\U0001d416': '$\\mathbf{W}$',
+u'\U0001d417': '$\\mathbf{X}$',
+u'\U0001d418': '$\\mathbf{Y}$',
+u'\U0001d419': '$\\mathbf{Z}$',
+u'\U0001d41a': '$\\mathbf{a}$',
+u'\U0001d41b': '$\\mathbf{b}$',
+u'\U0001d41c': '$\\mathbf{c}$',
+u'\U0001d41d': '$\\mathbf{d}$',
+u'\U0001d41e': '$\\mathbf{e}$',
+u'\U0001d41f': '$\\mathbf{f}$',
+u'\U0001d420': '$\\mathbf{g}$',
+u'\U0001d421': '$\\mathbf{h}$',
+u'\U0001d422': '$\\mathbf{i}$',
+u'\U0001d423': '$\\mathbf{j}$',
+u'\U0001d424': '$\\mathbf{k}$',
+u'\U0001d425': '$\\mathbf{l}$',
+u'\U0001d426': '$\\mathbf{m}$',
+u'\U0001d427': '$\\mathbf{n}$',
+u'\U0001d428': '$\\mathbf{o}$',
+u'\U0001d429': '$\\mathbf{p}$',
+u'\U0001d42a': '$\\mathbf{q}$',
+u'\U0001d42b': '$\\mathbf{r}$',
+u'\U0001d42c': '$\\mathbf{s}$',
+u'\U0001d42d': '$\\mathbf{t}$',
+u'\U0001d42e': '$\\mathbf{u}$',
+u'\U0001d42f': '$\\mathbf{v}$',
+u'\U0001d430': '$\\mathbf{w}$',
+u'\U0001d431': '$\\mathbf{x}$',
+u'\U0001d432': '$\\mathbf{y}$',
+u'\U0001d433': '$\\mathbf{z}$',
+u'\U0001d434': '$\\mathsl{A}$',
+u'\U0001d435': '$\\mathsl{B}$',
+u'\U0001d436': '$\\mathsl{C}$',
+u'\U0001d437': '$\\mathsl{D}$',
+u'\U0001d438': '$\\mathsl{E}$',
+u'\U0001d439': '$\\mathsl{F}$',
+u'\U0001d43a': '$\\mathsl{G}$',
+u'\U0001d43b': '$\\mathsl{H}$',
+u'\U0001d43c': '$\\mathsl{I}$',
+u'\U0001d43d': '$\\mathsl{J}$',
+u'\U0001d43e': '$\\mathsl{K}$',
+u'\U0001d43f': '$\\mathsl{L}$',
+u'\U0001d440': '$\\mathsl{M}$',
+u'\U0001d441': '$\\mathsl{N}$',
+u'\U0001d442': '$\\mathsl{O}$',
+u'\U0001d443': '$\\mathsl{P}$',
+u'\U0001d444': '$\\mathsl{Q}$',
+u'\U0001d445': '$\\mathsl{R}$',
+u'\U0001d446': '$\\mathsl{S}$',
+u'\U0001d447': '$\\mathsl{T}$',
+u'\U0001d448': '$\\mathsl{U}$',
+u'\U0001d449': '$\\mathsl{V}$',
+u'\U0001d44a': '$\\mathsl{W}$',
+u'\U0001d44b': '$\\mathsl{X}$',
+u'\U0001d44c': '$\\mathsl{Y}$',
+u'\U0001d44d': '$\\mathsl{Z}$',
+u'\U0001d44e': '$\\mathsl{a}$',
+u'\U0001d44f': '$\\mathsl{b}$',
+u'\U0001d450': '$\\mathsl{c}$',
+u'\U0001d451': '$\\mathsl{d}$',
+u'\U0001d452': '$\\mathsl{e}$',
+u'\U0001d453': '$\\mathsl{f}$',
+u'\U0001d454': '$\\mathsl{g}$',
+u'\U0001d456': '$\\mathsl{i}$',
+u'\U0001d457': '$\\mathsl{j}$',
+u'\U0001d458': '$\\mathsl{k}$',
+u'\U0001d459': '$\\mathsl{l}$',
+u'\U0001d45a': '$\\mathsl{m}$',
+u'\U0001d45b': '$\\mathsl{n}$',
+u'\U0001d45c': '$\\mathsl{o}$',
+u'\U0001d45d': '$\\mathsl{p}$',
+u'\U0001d45e': '$\\mathsl{q}$',
+u'\U0001d45f': '$\\mathsl{r}$',
+u'\U0001d460': '$\\mathsl{s}$',
+u'\U0001d461': '$\\mathsl{t}$',
+u'\U0001d462': '$\\mathsl{u}$',
+u'\U0001d463': '$\\mathsl{v}$',
+u'\U0001d464': '$\\mathsl{w}$',
+u'\U0001d465': '$\\mathsl{x}$',
+u'\U0001d466': '$\\mathsl{y}$',
+u'\U0001d467': '$\\mathsl{z}$',
+u'\U0001d468': '$\\mathbit{A}$',
+u'\U0001d469': '$\\mathbit{B}$',
+u'\U0001d46a': '$\\mathbit{C}$',
+u'\U0001d46b': '$\\mathbit{D}$',
+u'\U0001d46c': '$\\mathbit{E}$',
+u'\U0001d46d': '$\\mathbit{F}$',
+u'\U0001d46e': '$\\mathbit{G}$',
+u'\U0001d46f': '$\\mathbit{H}$',
+u'\U0001d470': '$\\mathbit{I}$',
+u'\U0001d471': '$\\mathbit{J}$',
+u'\U0001d472': '$\\mathbit{K}$',
+u'\U0001d473': '$\\mathbit{L}$',
+u'\U0001d474': '$\\mathbit{M}$',
+u'\U0001d475': '$\\mathbit{N}$',
+u'\U0001d476': '$\\mathbit{O}$',
+u'\U0001d477': '$\\mathbit{P}$',
+u'\U0001d478': '$\\mathbit{Q}$',
+u'\U0001d479': '$\\mathbit{R}$',
+u'\U0001d47a': '$\\mathbit{S}$',
+u'\U0001d47b': '$\\mathbit{T}$',
+u'\U0001d47c': '$\\mathbit{U}$',
+u'\U0001d47d': '$\\mathbit{V}$',
+u'\U0001d47e': '$\\mathbit{W}$',
+u'\U0001d47f': '$\\mathbit{X}$',
+u'\U0001d480': '$\\mathbit{Y}$',
+u'\U0001d481': '$\\mathbit{Z}$',
+u'\U0001d482': '$\\mathbit{a}$',
+u'\U0001d483': '$\\mathbit{b}$',
+u'\U0001d484': '$\\mathbit{c}$',
+u'\U0001d485': '$\\mathbit{d}$',
+u'\U0001d486': '$\\mathbit{e}$',
+u'\U0001d487': '$\\mathbit{f}$',
+u'\U0001d488': '$\\mathbit{g}$',
+u'\U0001d489': '$\\mathbit{h}$',
+u'\U0001d48a': '$\\mathbit{i}$',
+u'\U0001d48b': '$\\mathbit{j}$',
+u'\U0001d48c': '$\\mathbit{k}$',
+u'\U0001d48d': '$\\mathbit{l}$',
+u'\U0001d48e': '$\\mathbit{m}$',
+u'\U0001d48f': '$\\mathbit{n}$',
+u'\U0001d490': '$\\mathbit{o}$',
+u'\U0001d491': '$\\mathbit{p}$',
+u'\U0001d492': '$\\mathbit{q}$',
+u'\U0001d493': '$\\mathbit{r}$',
+u'\U0001d494': '$\\mathbit{s}$',
+u'\U0001d495': '$\\mathbit{t}$',
+u'\U0001d496': '$\\mathbit{u}$',
+u'\U0001d497': '$\\mathbit{v}$',
+u'\U0001d498': '$\\mathbit{w}$',
+u'\U0001d499': '$\\mathbit{x}$',
+u'\U0001d49a': '$\\mathbit{y}$',
+u'\U0001d49b': '$\\mathbit{z}$',
+u'\U0001d49c': '$\\mathscr{A}$',
+u'\U0001d49e': '$\\mathscr{C}$',
+u'\U0001d49f': '$\\mathscr{D}$',
+u'\U0001d4a2': '$\\mathscr{G}$',
+u'\U0001d4a5': '$\\mathscr{J}$',
+u'\U0001d4a6': '$\\mathscr{K}$',
+u'\U0001d4a9': '$\\mathscr{N}$',
+u'\U0001d4aa': '$\\mathscr{O}$',
+u'\U0001d4ab': '$\\mathscr{P}$',
+u'\U0001d4ac': '$\\mathscr{Q}$',
+u'\U0001d4ae': '$\\mathscr{S}$',
+u'\U0001d4af': '$\\mathscr{T}$',
+u'\U0001d4b0': '$\\mathscr{U}$',
+u'\U0001d4b1': '$\\mathscr{V}$',
+u'\U0001d4b2': '$\\mathscr{W}$',
+u'\U0001d4b3': '$\\mathscr{X}$',
+u'\U0001d4b4': '$\\mathscr{Y}$',
+u'\U0001d4b5': '$\\mathscr{Z}$',
+u'\U0001d4b6': '$\\mathscr{a}$',
+u'\U0001d4b7': '$\\mathscr{b}$',
+u'\U0001d4b8': '$\\mathscr{c}$',
+u'\U0001d4b9': '$\\mathscr{d}$',
+u'\U0001d4bb': '$\\mathscr{f}$',
+u'\U0001d4bd': '$\\mathscr{h}$',
+u'\U0001d4be': '$\\mathscr{i}$',
+u'\U0001d4bf': '$\\mathscr{j}$',
+u'\U0001d4c0': '$\\mathscr{k}$',
+u'\U0001d4c1': '$\\mathscr{l}$',
+u'\U0001d4c2': '$\\mathscr{m}$',
+u'\U0001d4c3': '$\\mathscr{n}$',
+u'\U0001d4c5': '$\\mathscr{p}$',
+u'\U0001d4c6': '$\\mathscr{q}$',
+u'\U0001d4c7': '$\\mathscr{r}$',
+u'\U0001d4c8': '$\\mathscr{s}$',
+u'\U0001d4c9': '$\\mathscr{t}$',
+u'\U0001d4ca': '$\\mathscr{u}$',
+u'\U0001d4cb': '$\\mathscr{v}$',
+u'\U0001d4cc': '$\\mathscr{w}$',
+u'\U0001d4cd': '$\\mathscr{x}$',
+u'\U0001d4ce': '$\\mathscr{y}$',
+u'\U0001d4cf': '$\\mathscr{z}$',
+u'\U0001d4d0': '$\\mathmit{A}$',
+u'\U0001d4d1': '$\\mathmit{B}$',
+u'\U0001d4d2': '$\\mathmit{C}$',
+u'\U0001d4d3': '$\\mathmit{D}$',
+u'\U0001d4d4': '$\\mathmit{E}$',
+u'\U0001d4d5': '$\\mathmit{F}$',
+u'\U0001d4d6': '$\\mathmit{G}$',
+u'\U0001d4d7': '$\\mathmit{H}$',
+u'\U0001d4d8': '$\\mathmit{I}$',
+u'\U0001d4d9': '$\\mathmit{J}$',
+u'\U0001d4da': '$\\mathmit{K}$',
+u'\U0001d4db': '$\\mathmit{L}$',
+u'\U0001d4dc': '$\\mathmit{M}$',
+u'\U0001d4dd': '$\\mathmit{N}$',
+u'\U0001d4de': '$\\mathmit{O}$',
+u'\U0001d4df': '$\\mathmit{P}$',
+u'\U0001d4e0': '$\\mathmit{Q}$',
+u'\U0001d4e1': '$\\mathmit{R}$',
+u'\U0001d4e2': '$\\mathmit{S}$',
+u'\U0001d4e3': '$\\mathmit{T}$',
+u'\U0001d4e4': '$\\mathmit{U}$',
+u'\U0001d4e5': '$\\mathmit{V}$',
+u'\U0001d4e6': '$\\mathmit{W}$',
+u'\U0001d4e7': '$\\mathmit{X}$',
+u'\U0001d4e8': '$\\mathmit{Y}$',
+u'\U0001d4e9': '$\\mathmit{Z}$',
+u'\U0001d4ea': '$\\mathmit{a}$',
+u'\U0001d4eb': '$\\mathmit{b}$',
+u'\U0001d4ec': '$\\mathmit{c}$',
+u'\U0001d4ed': '$\\mathmit{d}$',
+u'\U0001d4ee': '$\\mathmit{e}$',
+u'\U0001d4ef': '$\\mathmit{f}$',
+u'\U0001d4f0': '$\\mathmit{g}$',
+u'\U0001d4f1': '$\\mathmit{h}$',
+u'\U0001d4f2': '$\\mathmit{i}$',
+u'\U0001d4f3': '$\\mathmit{j}$',
+u'\U0001d4f4': '$\\mathmit{k}$',
+u'\U0001d4f5': '$\\mathmit{l}$',
+u'\U0001d4f6': '$\\mathmit{m}$',
+u'\U0001d4f7': '$\\mathmit{n}$',
+u'\U0001d4f8': '$\\mathmit{o}$',
+u'\U0001d4f9': '$\\mathmit{p}$',
+u'\U0001d4fa': '$\\mathmit{q}$',
+u'\U0001d4fb': '$\\mathmit{r}$',
+u'\U0001d4fc': '$\\mathmit{s}$',
+u'\U0001d4fd': '$\\mathmit{t}$',
+u'\U0001d4fe': '$\\mathmit{u}$',
+u'\U0001d4ff': '$\\mathmit{v}$',
+u'\U0001d500': '$\\mathmit{w}$',
+u'\U0001d501': '$\\mathmit{x}$',
+u'\U0001d502': '$\\mathmit{y}$',
+u'\U0001d503': '$\\mathmit{z}$',
+u'\U0001d504': '$\\mathfrak{A}$',
+u'\U0001d505': '$\\mathfrak{B}$',
+u'\U0001d507': '$\\mathfrak{D}$',
+u'\U0001d508': '$\\mathfrak{E}$',
+u'\U0001d509': '$\\mathfrak{F}$',
+u'\U0001d50a': '$\\mathfrak{G}$',
+u'\U0001d50d': '$\\mathfrak{J}$',
+u'\U0001d50e': '$\\mathfrak{K}$',
+u'\U0001d50f': '$\\mathfrak{L}$',
+u'\U0001d510': '$\\mathfrak{M}$',
+u'\U0001d511': '$\\mathfrak{N}$',
+u'\U0001d512': '$\\mathfrak{O}$',
+u'\U0001d513': '$\\mathfrak{P}$',
+u'\U0001d514': '$\\mathfrak{Q}$',
+u'\U0001d516': '$\\mathfrak{S}$',
+u'\U0001d517': '$\\mathfrak{T}$',
+u'\U0001d518': '$\\mathfrak{U}$',
+u'\U0001d519': '$\\mathfrak{V}$',
+u'\U0001d51a': '$\\mathfrak{W}$',
+u'\U0001d51b': '$\\mathfrak{X}$',
+u'\U0001d51c': '$\\mathfrak{Y}$',
+u'\U0001d51e': '$\\mathfrak{a}$',
+u'\U0001d51f': '$\\mathfrak{b}$',
+u'\U0001d520': '$\\mathfrak{c}$',
+u'\U0001d521': '$\\mathfrak{d}$',
+u'\U0001d522': '$\\mathfrak{e}$',
+u'\U0001d523': '$\\mathfrak{f}$',
+u'\U0001d524': '$\\mathfrak{g}$',
+u'\U0001d525': '$\\mathfrak{h}$',
+u'\U0001d526': '$\\mathfrak{i}$',
+u'\U0001d527': '$\\mathfrak{j}$',
+u'\U0001d528': '$\\mathfrak{k}$',
+u'\U0001d529': '$\\mathfrak{l}$',
+u'\U0001d52a': '$\\mathfrak{m}$',
+u'\U0001d52b': '$\\mathfrak{n}$',
+u'\U0001d52c': '$\\mathfrak{o}$',
+u'\U0001d52d': '$\\mathfrak{p}$',
+u'\U0001d52e': '$\\mathfrak{q}$',
+u'\U0001d52f': '$\\mathfrak{r}$',
+u'\U0001d530': '$\\mathfrak{s}$',
+u'\U0001d531': '$\\mathfrak{t}$',
+u'\U0001d532': '$\\mathfrak{u}$',
+u'\U0001d533': '$\\mathfrak{v}$',
+u'\U0001d534': '$\\mathfrak{w}$',
+u'\U0001d535': '$\\mathfrak{x}$',
+u'\U0001d536': '$\\mathfrak{y}$',
+u'\U0001d537': '$\\mathfrak{z}$',
+u'\U0001d538': '$\\mathbb{A}$',
+u'\U0001d539': '$\\mathbb{B}$',
+u'\U0001d53b': '$\\mathbb{D}$',
+u'\U0001d53c': '$\\mathbb{E}$',
+u'\U0001d53d': '$\\mathbb{F}$',
+u'\U0001d53e': '$\\mathbb{G}$',
+u'\U0001d540': '$\\mathbb{I}$',
+u'\U0001d541': '$\\mathbb{J}$',
+u'\U0001d542': '$\\mathbb{K}$',
+u'\U0001d543': '$\\mathbb{L}$',
+u'\U0001d544': '$\\mathbb{M}$',
+u'\U0001d546': '$\\mathbb{O}$',
+u'\U0001d54a': '$\\mathbb{S}$',
+u'\U0001d54b': '$\\mathbb{T}$',
+u'\U0001d54c': '$\\mathbb{U}$',
+u'\U0001d54d': '$\\mathbb{V}$',
+u'\U0001d54e': '$\\mathbb{W}$',
+u'\U0001d54f': '$\\mathbb{X}$',
+u'\U0001d550': '$\\mathbb{Y}$',
+u'\U0001d552': '$\\mathbb{a}$',
+u'\U0001d553': '$\\mathbb{b}$',
+u'\U0001d554': '$\\mathbb{c}$',
+u'\U0001d555': '$\\mathbb{d}$',
+u'\U0001d556': '$\\mathbb{e}$',
+u'\U0001d557': '$\\mathbb{f}$',
+u'\U0001d558': '$\\mathbb{g}$',
+u'\U0001d559': '$\\mathbb{h}$',
+u'\U0001d55a': '$\\mathbb{i}$',
+u'\U0001d55b': '$\\mathbb{j}$',
+u'\U0001d55c': '$\\mathbb{k}$',
+u'\U0001d55d': '$\\mathbb{l}$',
+u'\U0001d55e': '$\\mathbb{m}$',
+u'\U0001d55f': '$\\mathbb{n}$',
+u'\U0001d560': '$\\mathbb{o}$',
+u'\U0001d561': '$\\mathbb{p}$',
+u'\U0001d562': '$\\mathbb{q}$',
+u'\U0001d563': '$\\mathbb{r}$',
+u'\U0001d564': '$\\mathbb{s}$',
+u'\U0001d565': '$\\mathbb{t}$',
+u'\U0001d566': '$\\mathbb{u}$',
+u'\U0001d567': '$\\mathbb{v}$',
+u'\U0001d568': '$\\mathbb{w}$',
+u'\U0001d569': '$\\mathbb{x}$',
+u'\U0001d56a': '$\\mathbb{y}$',
+u'\U0001d56b': '$\\mathbb{z}$',
+u'\U0001d56c': '$\\mathslbb{A}$',
+u'\U0001d56d': '$\\mathslbb{B}$',
+u'\U0001d56e': '$\\mathslbb{C}$',
+u'\U0001d56f': '$\\mathslbb{D}$',
+u'\U0001d570': '$\\mathslbb{E}$',
+u'\U0001d571': '$\\mathslbb{F}$',
+u'\U0001d572': '$\\mathslbb{G}$',
+u'\U0001d573': '$\\mathslbb{H}$',
+u'\U0001d574': '$\\mathslbb{I}$',
+u'\U0001d575': '$\\mathslbb{J}$',
+u'\U0001d576': '$\\mathslbb{K}$',
+u'\U0001d577': '$\\mathslbb{L}$',
+u'\U0001d578': '$\\mathslbb{M}$',
+u'\U0001d579': '$\\mathslbb{N}$',
+u'\U0001d57a': '$\\mathslbb{O}$',
+u'\U0001d57b': '$\\mathslbb{P}$',
+u'\U0001d57c': '$\\mathslbb{Q}$',
+u'\U0001d57d': '$\\mathslbb{R}$',
+u'\U0001d57e': '$\\mathslbb{S}$',
+u'\U0001d57f': '$\\mathslbb{T}$',
+u'\U0001d580': '$\\mathslbb{U}$',
+u'\U0001d581': '$\\mathslbb{V}$',
+u'\U0001d582': '$\\mathslbb{W}$',
+u'\U0001d583': '$\\mathslbb{X}$',
+u'\U0001d584': '$\\mathslbb{Y}$',
+u'\U0001d585': '$\\mathslbb{Z}$',
+u'\U0001d586': '$\\mathslbb{a}$',
+u'\U0001d587': '$\\mathslbb{b}$',
+u'\U0001d588': '$\\mathslbb{c}$',
+u'\U0001d589': '$\\mathslbb{d}$',
+u'\U0001d58a': '$\\mathslbb{e}$',
+u'\U0001d58b': '$\\mathslbb{f}$',
+u'\U0001d58c': '$\\mathslbb{g}$',
+u'\U0001d58d': '$\\mathslbb{h}$',
+u'\U0001d58e': '$\\mathslbb{i}$',
+u'\U0001d58f': '$\\mathslbb{j}$',
+u'\U0001d590': '$\\mathslbb{k}$',
+u'\U0001d591': '$\\mathslbb{l}$',
+u'\U0001d592': '$\\mathslbb{m}$',
+u'\U0001d593': '$\\mathslbb{n}$',
+u'\U0001d594': '$\\mathslbb{o}$',
+u'\U0001d595': '$\\mathslbb{p}$',
+u'\U0001d596': '$\\mathslbb{q}$',
+u'\U0001d597': '$\\mathslbb{r}$',
+u'\U0001d598': '$\\mathslbb{s}$',
+u'\U0001d599': '$\\mathslbb{t}$',
+u'\U0001d59a': '$\\mathslbb{u}$',
+u'\U0001d59b': '$\\mathslbb{v}$',
+u'\U0001d59c': '$\\mathslbb{w}$',
+u'\U0001d59d': '$\\mathslbb{x}$',
+u'\U0001d59e': '$\\mathslbb{y}$',
+u'\U0001d59f': '$\\mathslbb{z}$',
+u'\U0001d5a0': '$\\mathsf{A}$',
+u'\U0001d5a1': '$\\mathsf{B}$',
+u'\U0001d5a2': '$\\mathsf{C}$',
+u'\U0001d5a3': '$\\mathsf{D}$',
+u'\U0001d5a4': '$\\mathsf{E}$',
+u'\U0001d5a5': '$\\mathsf{F}$',
+u'\U0001d5a6': '$\\mathsf{G}$',
+u'\U0001d5a7': '$\\mathsf{H}$',
+u'\U0001d5a8': '$\\mathsf{I}$',
+u'\U0001d5a9': '$\\mathsf{J}$',
+u'\U0001d5aa': '$\\mathsf{K}$',
+u'\U0001d5ab': '$\\mathsf{L}$',
+u'\U0001d5ac': '$\\mathsf{M}$',
+u'\U0001d5ad': '$\\mathsf{N}$',
+u'\U0001d5ae': '$\\mathsf{O}$',
+u'\U0001d5af': '$\\mathsf{P}$',
+u'\U0001d5b0': '$\\mathsf{Q}$',
+u'\U0001d5b1': '$\\mathsf{R}$',
+u'\U0001d5b2': '$\\mathsf{S}$',
+u'\U0001d5b3': '$\\mathsf{T}$',
+u'\U0001d5b4': '$\\mathsf{U}$',
+u'\U0001d5b5': '$\\mathsf{V}$',
+u'\U0001d5b6': '$\\mathsf{W}$',
+u'\U0001d5b7': '$\\mathsf{X}$',
+u'\U0001d5b8': '$\\mathsf{Y}$',
+u'\U0001d5b9': '$\\mathsf{Z}$',
+u'\U0001d5ba': '$\\mathsf{a}$',
+u'\U0001d5bb': '$\\mathsf{b}$',
+u'\U0001d5bc': '$\\mathsf{c}$',
+u'\U0001d5bd': '$\\mathsf{d}$',
+u'\U0001d5be': '$\\mathsf{e}$',
+u'\U0001d5bf': '$\\mathsf{f}$',
+u'\U0001d5c0': '$\\mathsf{g}$',
+u'\U0001d5c1': '$\\mathsf{h}$',
+u'\U0001d5c2': '$\\mathsf{i}$',
+u'\U0001d5c3': '$\\mathsf{j}$',
+u'\U0001d5c4': '$\\mathsf{k}$',
+u'\U0001d5c5': '$\\mathsf{l}$',
+u'\U0001d5c6': '$\\mathsf{m}$',
+u'\U0001d5c7': '$\\mathsf{n}$',
+u'\U0001d5c8': '$\\mathsf{o}$',
+u'\U0001d5c9': '$\\mathsf{p}$',
+u'\U0001d5ca': '$\\mathsf{q}$',
+u'\U0001d5cb': '$\\mathsf{r}$',
+u'\U0001d5cc': '$\\mathsf{s}$',
+u'\U0001d5cd': '$\\mathsf{t}$',
+u'\U0001d5ce': '$\\mathsf{u}$',
+u'\U0001d5cf': '$\\mathsf{v}$',
+u'\U0001d5d0': '$\\mathsf{w}$',
+u'\U0001d5d1': '$\\mathsf{x}$',
+u'\U0001d5d2': '$\\mathsf{y}$',
+u'\U0001d5d3': '$\\mathsf{z}$',
+u'\U0001d5d4': '$\\mathsfbf{A}$',
+u'\U0001d5d5': '$\\mathsfbf{B}$',
+u'\U0001d5d6': '$\\mathsfbf{C}$',
+u'\U0001d5d7': '$\\mathsfbf{D}$',
+u'\U0001d5d8': '$\\mathsfbf{E}$',
+u'\U0001d5d9': '$\\mathsfbf{F}$',
+u'\U0001d5da': '$\\mathsfbf{G}$',
+u'\U0001d5db': '$\\mathsfbf{H}$',
+u'\U0001d5dc': '$\\mathsfbf{I}$',
+u'\U0001d5dd': '$\\mathsfbf{J}$',
+u'\U0001d5de': '$\\mathsfbf{K}$',
+u'\U0001d5df': '$\\mathsfbf{L}$',
+u'\U0001d5e0': '$\\mathsfbf{M}$',
+u'\U0001d5e1': '$\\mathsfbf{N}$',
+u'\U0001d5e2': '$\\mathsfbf{O}$',
+u'\U0001d5e3': '$\\mathsfbf{P}$',
+u'\U0001d5e4': '$\\mathsfbf{Q}$',
+u'\U0001d5e5': '$\\mathsfbf{R}$',
+u'\U0001d5e6': '$\\mathsfbf{S}$',
+u'\U0001d5e7': '$\\mathsfbf{T}$',
+u'\U0001d5e8': '$\\mathsfbf{U}$',
+u'\U0001d5e9': '$\\mathsfbf{V}$',
+u'\U0001d5ea': '$\\mathsfbf{W}$',
+u'\U0001d5eb': '$\\mathsfbf{X}$',
+u'\U0001d5ec': '$\\mathsfbf{Y}$',
+u'\U0001d5ed': '$\\mathsfbf{Z}$',
+u'\U0001d5ee': '$\\mathsfbf{a}$',
+u'\U0001d5ef': '$\\mathsfbf{b}$',
+u'\U0001d5f0': '$\\mathsfbf{c}$',
+u'\U0001d5f1': '$\\mathsfbf{d}$',
+u'\U0001d5f2': '$\\mathsfbf{e}$',
+u'\U0001d5f3': '$\\mathsfbf{f}$',
+u'\U0001d5f4': '$\\mathsfbf{g}$',
+u'\U0001d5f5': '$\\mathsfbf{h}$',
+u'\U0001d5f6': '$\\mathsfbf{i}$',
+u'\U0001d5f7': '$\\mathsfbf{j}$',
+u'\U0001d5f8': '$\\mathsfbf{k}$',
+u'\U0001d5f9': '$\\mathsfbf{l}$',
+u'\U0001d5fa': '$\\mathsfbf{m}$',
+u'\U0001d5fb': '$\\mathsfbf{n}$',
+u'\U0001d5fc': '$\\mathsfbf{o}$',
+u'\U0001d5fd': '$\\mathsfbf{p}$',
+u'\U0001d5fe': '$\\mathsfbf{q}$',
+u'\U0001d5ff': '$\\mathsfbf{r}$',
+u'\U0001d600': '$\\mathsfbf{s}$',
+u'\U0001d601': '$\\mathsfbf{t}$',
+u'\U0001d602': '$\\mathsfbf{u}$',
+u'\U0001d603': '$\\mathsfbf{v}$',
+u'\U0001d604': '$\\mathsfbf{w}$',
+u'\U0001d605': '$\\mathsfbf{x}$',
+u'\U0001d606': '$\\mathsfbf{y}$',
+u'\U0001d607': '$\\mathsfbf{z}$',
+u'\U0001d608': '$\\mathsfsl{A}$',
+u'\U0001d609': '$\\mathsfsl{B}$',
+u'\U0001d60a': '$\\mathsfsl{C}$',
+u'\U0001d60b': '$\\mathsfsl{D}$',
+u'\U0001d60c': '$\\mathsfsl{E}$',
+u'\U0001d60d': '$\\mathsfsl{F}$',
+u'\U0001d60e': '$\\mathsfsl{G}$',
+u'\U0001d60f': '$\\mathsfsl{H}$',
+u'\U0001d610': '$\\mathsfsl{I}$',
+u'\U0001d611': '$\\mathsfsl{J}$',
+u'\U0001d612': '$\\mathsfsl{K}$',
+u'\U0001d613': '$\\mathsfsl{L}$',
+u'\U0001d614': '$\\mathsfsl{M}$',
+u'\U0001d615': '$\\mathsfsl{N}$',
+u'\U0001d616': '$\\mathsfsl{O}$',
+u'\U0001d617': '$\\mathsfsl{P}$',
+u'\U0001d618': '$\\mathsfsl{Q}$',
+u'\U0001d619': '$\\mathsfsl{R}$',
+u'\U0001d61a': '$\\mathsfsl{S}$',
+u'\U0001d61b': '$\\mathsfsl{T}$',
+u'\U0001d61c': '$\\mathsfsl{U}$',
+u'\U0001d61d': '$\\mathsfsl{V}$',
+u'\U0001d61e': '$\\mathsfsl{W}$',
+u'\U0001d61f': '$\\mathsfsl{X}$',
+u'\U0001d620': '$\\mathsfsl{Y}$',
+u'\U0001d621': '$\\mathsfsl{Z}$',
+u'\U0001d622': '$\\mathsfsl{a}$',
+u'\U0001d623': '$\\mathsfsl{b}$',
+u'\U0001d624': '$\\mathsfsl{c}$',
+u'\U0001d625': '$\\mathsfsl{d}$',
+u'\U0001d626': '$\\mathsfsl{e}$',
+u'\U0001d627': '$\\mathsfsl{f}$',
+u'\U0001d628': '$\\mathsfsl{g}$',
+u'\U0001d629': '$\\mathsfsl{h}$',
+u'\U0001d62a': '$\\mathsfsl{i}$',
+u'\U0001d62b': '$\\mathsfsl{j}$',
+u'\U0001d62c': '$\\mathsfsl{k}$',
+u'\U0001d62d': '$\\mathsfsl{l}$',
+u'\U0001d62e': '$\\mathsfsl{m}$',
+u'\U0001d62f': '$\\mathsfsl{n}$',
+u'\U0001d630': '$\\mathsfsl{o}$',
+u'\U0001d631': '$\\mathsfsl{p}$',
+u'\U0001d632': '$\\mathsfsl{q}$',
+u'\U0001d633': '$\\mathsfsl{r}$',
+u'\U0001d634': '$\\mathsfsl{s}$',
+u'\U0001d635': '$\\mathsfsl{t}$',
+u'\U0001d636': '$\\mathsfsl{u}$',
+u'\U0001d637': '$\\mathsfsl{v}$',
+u'\U0001d638': '$\\mathsfsl{w}$',
+u'\U0001d639': '$\\mathsfsl{x}$',
+u'\U0001d63a': '$\\mathsfsl{y}$',
+u'\U0001d63b': '$\\mathsfsl{z}$',
+u'\U0001d63c': '$\\mathsfbfsl{A}$',
+u'\U0001d63d': '$\\mathsfbfsl{B}$',
+u'\U0001d63e': '$\\mathsfbfsl{C}$',
+u'\U0001d63f': '$\\mathsfbfsl{D}$',
+u'\U0001d640': '$\\mathsfbfsl{E}$',
+u'\U0001d641': '$\\mathsfbfsl{F}$',
+u'\U0001d642': '$\\mathsfbfsl{G}$',
+u'\U0001d643': '$\\mathsfbfsl{H}$',
+u'\U0001d644': '$\\mathsfbfsl{I}$',
+u'\U0001d645': '$\\mathsfbfsl{J}$',
+u'\U0001d646': '$\\mathsfbfsl{K}$',
+u'\U0001d647': '$\\mathsfbfsl{L}$',
+u'\U0001d648': '$\\mathsfbfsl{M}$',
+u'\U0001d649': '$\\mathsfbfsl{N}$',
+u'\U0001d64a': '$\\mathsfbfsl{O}$',
+u'\U0001d64b': '$\\mathsfbfsl{P}$',
+u'\U0001d64c': '$\\mathsfbfsl{Q}$',
+u'\U0001d64d': '$\\mathsfbfsl{R}$',
+u'\U0001d64e': '$\\mathsfbfsl{S}$',
+u'\U0001d64f': '$\\mathsfbfsl{T}$',
+u'\U0001d650': '$\\mathsfbfsl{U}$',
+u'\U0001d651': '$\\mathsfbfsl{V}$',
+u'\U0001d652': '$\\mathsfbfsl{W}$',
+u'\U0001d653': '$\\mathsfbfsl{X}$',
+u'\U0001d654': '$\\mathsfbfsl{Y}$',
+u'\U0001d655': '$\\mathsfbfsl{Z}$',
+u'\U0001d656': '$\\mathsfbfsl{a}$',
+u'\U0001d657': '$\\mathsfbfsl{b}$',
+u'\U0001d658': '$\\mathsfbfsl{c}$',
+u'\U0001d659': '$\\mathsfbfsl{d}$',
+u'\U0001d65a': '$\\mathsfbfsl{e}$',
+u'\U0001d65b': '$\\mathsfbfsl{f}$',
+u'\U0001d65c': '$\\mathsfbfsl{g}$',
+u'\U0001d65d': '$\\mathsfbfsl{h}$',
+u'\U0001d65e': '$\\mathsfbfsl{i}$',
+u'\U0001d65f': '$\\mathsfbfsl{j}$',
+u'\U0001d660': '$\\mathsfbfsl{k}$',
+u'\U0001d661': '$\\mathsfbfsl{l}$',
+u'\U0001d662': '$\\mathsfbfsl{m}$',
+u'\U0001d663': '$\\mathsfbfsl{n}$',
+u'\U0001d664': '$\\mathsfbfsl{o}$',
+u'\U0001d665': '$\\mathsfbfsl{p}$',
+u'\U0001d666': '$\\mathsfbfsl{q}$',
+u'\U0001d667': '$\\mathsfbfsl{r}$',
+u'\U0001d668': '$\\mathsfbfsl{s}$',
+u'\U0001d669': '$\\mathsfbfsl{t}$',
+u'\U0001d66a': '$\\mathsfbfsl{u}$',
+u'\U0001d66b': '$\\mathsfbfsl{v}$',
+u'\U0001d66c': '$\\mathsfbfsl{w}$',
+u'\U0001d66d': '$\\mathsfbfsl{x}$',
+u'\U0001d66e': '$\\mathsfbfsl{y}$',
+u'\U0001d66f': '$\\mathsfbfsl{z}$',
+u'\U0001d670': '$\\mathtt{A}$',
+u'\U0001d671': '$\\mathtt{B}$',
+u'\U0001d672': '$\\mathtt{C}$',
+u'\U0001d673': '$\\mathtt{D}$',
+u'\U0001d674': '$\\mathtt{E}$',
+u'\U0001d675': '$\\mathtt{F}$',
+u'\U0001d676': '$\\mathtt{G}$',
+u'\U0001d677': '$\\mathtt{H}$',
+u'\U0001d678': '$\\mathtt{I}$',
+u'\U0001d679': '$\\mathtt{J}$',
+u'\U0001d67a': '$\\mathtt{K}$',
+u'\U0001d67b': '$\\mathtt{L}$',
+u'\U0001d67c': '$\\mathtt{M}$',
+u'\U0001d67d': '$\\mathtt{N}$',
+u'\U0001d67e': '$\\mathtt{O}$',
+u'\U0001d67f': '$\\mathtt{P}$',
+u'\U0001d680': '$\\mathtt{Q}$',
+u'\U0001d681': '$\\mathtt{R}$',
+u'\U0001d682': '$\\mathtt{S}$',
+u'\U0001d683': '$\\mathtt{T}$',
+u'\U0001d684': '$\\mathtt{U}$',
+u'\U0001d685': '$\\mathtt{V}$',
+u'\U0001d686': '$\\mathtt{W}$',
+u'\U0001d687': '$\\mathtt{X}$',
+u'\U0001d688': '$\\mathtt{Y}$',
+u'\U0001d689': '$\\mathtt{Z}$',
+u'\U0001d68a': '$\\mathtt{a}$',
+u'\U0001d68b': '$\\mathtt{b}$',
+u'\U0001d68c': '$\\mathtt{c}$',
+u'\U0001d68d': '$\\mathtt{d}$',
+u'\U0001d68e': '$\\mathtt{e}$',
+u'\U0001d68f': '$\\mathtt{f}$',
+u'\U0001d690': '$\\mathtt{g}$',
+u'\U0001d691': '$\\mathtt{h}$',
+u'\U0001d692': '$\\mathtt{i}$',
+u'\U0001d693': '$\\mathtt{j}$',
+u'\U0001d694': '$\\mathtt{k}$',
+u'\U0001d695': '$\\mathtt{l}$',
+u'\U0001d696': '$\\mathtt{m}$',
+u'\U0001d697': '$\\mathtt{n}$',
+u'\U0001d698': '$\\mathtt{o}$',
+u'\U0001d699': '$\\mathtt{p}$',
+u'\U0001d69a': '$\\mathtt{q}$',
+u'\U0001d69b': '$\\mathtt{r}$',
+u'\U0001d69c': '$\\mathtt{s}$',
+u'\U0001d69d': '$\\mathtt{t}$',
+u'\U0001d69e': '$\\mathtt{u}$',
+u'\U0001d69f': '$\\mathtt{v}$',
+u'\U0001d6a0': '$\\mathtt{w}$',
+u'\U0001d6a1': '$\\mathtt{x}$',
+u'\U0001d6a2': '$\\mathtt{y}$',
+u'\U0001d6a3': '$\\mathtt{z}$',
+u'\U0001d6a8': '$\\mathbf{\\Alpha}$',
+u'\U0001d6a9': '$\\mathbf{\\Beta}$',
+u'\U0001d6aa': '$\\mathbf{\\Gamma}$',
+u'\U0001d6ab': '$\\mathbf{\\Delta}$',
+u'\U0001d6ac': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6ad': '$\\mathbf{\\Zeta}$',
+u'\U0001d6ae': '$\\mathbf{\\Eta}$',
+u'\U0001d6af': '$\\mathbf{\\Theta}$',
+u'\U0001d6b0': '$\\mathbf{\\Iota}$',
+u'\U0001d6b1': '$\\mathbf{\\Kappa}$',
+u'\U0001d6b2': '$\\mathbf{\\Lambda}$',
+u'\U0001d6b3': '$M$',
+u'\U0001d6b4': '$N$',
+u'\U0001d6b5': '$\\mathbf{\\Xi}$',
+u'\U0001d6b6': '$O$',
+u'\U0001d6b7': '$\\mathbf{\\Pi}$',
+u'\U0001d6b8': '$\\mathbf{\\Rho}$',
+u'\U0001d6b9': '{\\mathbf{\\vartheta}}',
+u'\U0001d6ba': '$\\mathbf{\\Sigma}$',
+u'\U0001d6bb': '$\\mathbf{\\Tau}$',
+u'\U0001d6bc': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6bd': '$\\mathbf{\\Phi}$',
+u'\U0001d6be': '$\\mathbf{\\Chi}$',
+u'\U0001d6bf': '$\\mathbf{\\Psi}$',
+u'\U0001d6c0': '$\\mathbf{\\Omega}$',
+u'\U0001d6c1': '$\\mathbf{\\nabla}$',
+u'\U0001d6c2': '$\\mathbf{\\Alpha}$',
+u'\U0001d6c3': '$\\mathbf{\\Beta}$',
+u'\U0001d6c4': '$\\mathbf{\\Gamma}$',
+u'\U0001d6c5': '$\\mathbf{\\Delta}$',
+u'\U0001d6c6': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6c7': '$\\mathbf{\\Zeta}$',
+u'\U0001d6c8': '$\\mathbf{\\Eta}$',
+u'\U0001d6c9': '$\\mathbf{\\theta}$',
+u'\U0001d6ca': '$\\mathbf{\\Iota}$',
+u'\U0001d6cb': '$\\mathbf{\\Kappa}$',
+u'\U0001d6cc': '$\\mathbf{\\Lambda}$',
+u'\U0001d6cd': '$M$',
+u'\U0001d6ce': '$N$',
+u'\U0001d6cf': '$\\mathbf{\\Xi}$',
+u'\U0001d6d0': '$O$',
+u'\U0001d6d1': '$\\mathbf{\\Pi}$',
+u'\U0001d6d2': '$\\mathbf{\\Rho}$',
+u'\U0001d6d3': '$\\mathbf{\\varsigma}$',
+u'\U0001d6d4': '$\\mathbf{\\Sigma}$',
+u'\U0001d6d5': '$\\mathbf{\\Tau}$',
+u'\U0001d6d6': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6d7': '$\\mathbf{\\Phi}$',
+u'\U0001d6d8': '$\\mathbf{\\Chi}$',
+u'\U0001d6d9': '$\\mathbf{\\Psi}$',
+u'\U0001d6da': '$\\mathbf{\\Omega}$',
+u'\U0001d6db': '$\\partial$',
+u'\U0001d6dc': '$\\in$',
+u'\U0001d6dd': '{\\mathbf{\\vartheta}}',
+u'\U0001d6de': '{\\mathbf{\\varkappa}}',
+u'\U0001d6df': '{\\mathbf{\\phi}}',
+u'\U0001d6e0': '{\\mathbf{\\varrho}}',
+u'\U0001d6e1': '{\\mathbf{\\varpi}}',
+u'\U0001d6e2': '$\\mathsl{\\Alpha}$',
+u'\U0001d6e3': '$\\mathsl{\\Beta}$',
+u'\U0001d6e4': '$\\mathsl{\\Gamma}$',
+u'\U0001d6e5': '$\\mathsl{\\Delta}$',
+u'\U0001d6e6': '$\\mathsl{\\Epsilon}$',
+u'\U0001d6e7': '$\\mathsl{\\Zeta}$',
+u'\U0001d6e8': '$\\mathsl{\\Eta}$',
+u'\U0001d6e9': '$\\mathsl{\\Theta}$',
+u'\U0001d6ea': '$\\mathsl{\\Iota}$',
+u'\U0001d6eb': '$\\mathsl{\\Kappa}$',
+u'\U0001d6ec': '$\\mathsl{\\Lambda}$',
+u'\U0001d6ed': '$M$',
+u'\U0001d6ee': '$N$',
+u'\U0001d6ef': '$\\mathsl{\\Xi}$',
+u'\U0001d6f0': '$O$',
+u'\U0001d6f1': '$\\mathsl{\\Pi}$',
+u'\U0001d6f2': '$\\mathsl{\\Rho}$',
+u'\U0001d6f3': '{\\mathsl{\\vartheta}}',
+u'\U0001d6f4': '$\\mathsl{\\Sigma}$',
+u'\U0001d6f5': '$\\mathsl{\\Tau}$',
+u'\U0001d6f6': '$\\mathsl{\\Upsilon}$',
+u'\U0001d6f7': '$\\mathsl{\\Phi}$',
+u'\U0001d6f8': '$\\mathsl{\\Chi}$',
+u'\U0001d6f9': '$\\mathsl{\\Psi}$',
+u'\U0001d6fa': '$\\mathsl{\\Omega}$',
+u'\U0001d6fb': '$\\mathsl{\\nabla}$',
+u'\U0001d6fc': '$\\mathsl{\\Alpha}$',
+u'\U0001d6fd': '$\\mathsl{\\Beta}$',
+u'\U0001d6fe': '$\\mathsl{\\Gamma}$',
+u'\U0001d6ff': '$\\mathsl{\\Delta}$',
+u'\U0001d700': '$\\mathsl{\\Epsilon}$',
+u'\U0001d701': '$\\mathsl{\\Zeta}$',
+u'\U0001d702': '$\\mathsl{\\Eta}$',
+u'\U0001d703': '$\\mathsl{\\Theta}$',
+u'\U0001d704': '$\\mathsl{\\Iota}$',
+u'\U0001d705': '$\\mathsl{\\Kappa}$',
+u'\U0001d706': '$\\mathsl{\\Lambda}$',
+u'\U0001d707': '$M$',
+u'\U0001d708': '$N$',
+u'\U0001d709': '$\\mathsl{\\Xi}$',
+u'\U0001d70a': '$O$',
+u'\U0001d70b': '$\\mathsl{\\Pi}$',
+u'\U0001d70c': '$\\mathsl{\\Rho}$',
+u'\U0001d70d': '$\\mathsl{\\varsigma}$',
+u'\U0001d70e': '$\\mathsl{\\Sigma}$',
+u'\U0001d70f': '$\\mathsl{\\Tau}$',
+u'\U0001d710': '$\\mathsl{\\Upsilon}$',
+u'\U0001d711': '$\\mathsl{\\Phi}$',
+u'\U0001d712': '$\\mathsl{\\Chi}$',
+u'\U0001d713': '$\\mathsl{\\Psi}$',
+u'\U0001d714': '$\\mathsl{\\Omega}$',
+u'\U0001d715': '$\\partial$',
+u'\U0001d716': '$\\in$',
+u'\U0001d717': '{\\mathsl{\\vartheta}}',
+u'\U0001d718': '{\\mathsl{\\varkappa}}',
+u'\U0001d719': '{\\mathsl{\\phi}}',
+u'\U0001d71a': '{\\mathsl{\\varrho}}',
+u'\U0001d71b': '{\\mathsl{\\varpi}}',
+u'\U0001d71c': '$\\mathbit{\\Alpha}$',
+u'\U0001d71d': '$\\mathbit{\\Beta}$',
+u'\U0001d71e': '$\\mathbit{\\Gamma}$',
+u'\U0001d71f': '$\\mathbit{\\Delta}$',
+u'\U0001d720': '$\\mathbit{\\Epsilon}$',
+u'\U0001d721': '$\\mathbit{\\Zeta}$',
+u'\U0001d722': '$\\mathbit{\\Eta}$',
+u'\U0001d723': '$\\mathbit{\\Theta}$',
+u'\U0001d724': '$\\mathbit{\\Iota}$',
+u'\U0001d725': '$\\mathbit{\\Kappa}$',
+u'\U0001d726': '$\\mathbit{\\Lambda}$',
+u'\U0001d727': '$M$',
+u'\U0001d728': '$N$',
+u'\U0001d729': '$\\mathbit{\\Xi}$',
+u'\U0001d72a': '$O$',
+u'\U0001d72b': '$\\mathbit{\\Pi}$',
+u'\U0001d72c': '$\\mathbit{\\Rho}$',
+u'\U0001d72d': '{\\mathbit{O}}',
+u'\U0001d72e': '$\\mathbit{\\Sigma}$',
+u'\U0001d72f': '$\\mathbit{\\Tau}$',
+u'\U0001d730': '$\\mathbit{\\Upsilon}$',
+u'\U0001d731': '$\\mathbit{\\Phi}$',
+u'\U0001d732': '$\\mathbit{\\Chi}$',
+u'\U0001d733': '$\\mathbit{\\Psi}$',
+u'\U0001d734': '$\\mathbit{\\Omega}$',
+u'\U0001d735': '$\\mathbit{\\nabla}$',
+u'\U0001d736': '$\\mathbit{\\Alpha}$',
+u'\U0001d737': '$\\mathbit{\\Beta}$',
+u'\U0001d738': '$\\mathbit{\\Gamma}$',
+u'\U0001d739': '$\\mathbit{\\Delta}$',
+u'\U0001d73a': '$\\mathbit{\\Epsilon}$',
+u'\U0001d73b': '$\\mathbit{\\Zeta}$',
+u'\U0001d73c': '$\\mathbit{\\Eta}$',
+u'\U0001d73d': '$\\mathbit{\\Theta}$',
+u'\U0001d73e': '$\\mathbit{\\Iota}$',
+u'\U0001d73f': '$\\mathbit{\\Kappa}$',
+u'\U0001d740': '$\\mathbit{\\Lambda}$',
+u'\U0001d741': '$M$',
+u'\U0001d742': '$N$',
+u'\U0001d743': '$\\mathbit{\\Xi}$',
+u'\U0001d744': '$O$',
+u'\U0001d745': '$\\mathbit{\\Pi}$',
+u'\U0001d746': '$\\mathbit{\\Rho}$',
+u'\U0001d747': '$\\mathbit{\\varsigma}$',
+u'\U0001d748': '$\\mathbit{\\Sigma}$',
+u'\U0001d749': '$\\mathbit{\\Tau}$',
+u'\U0001d74a': '$\\mathbit{\\Upsilon}$',
+u'\U0001d74b': '$\\mathbit{\\Phi}$',
+u'\U0001d74c': '$\\mathbit{\\Chi}$',
+u'\U0001d74d': '$\\mathbit{\\Psi}$',
+u'\U0001d74e': '$\\mathbit{\\Omega}$',
+u'\U0001d74f': '$\\partial$',
+u'\U0001d750': '$\\in$',
+u'\U0001d751': '{\\mathbit{\\vartheta}}',
+u'\U0001d752': '{\\mathbit{\\varkappa}}',
+u'\U0001d753': '{\\mathbit{\\phi}}',
+u'\U0001d754': '{\\mathbit{\\varrho}}',
+u'\U0001d755': '{\\mathbit{\\varpi}}',
+u'\U0001d756': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d757': '$\\mathsfbf{\\Beta}$',
+u'\U0001d758': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d759': '$\\mathsfbf{\\Delta}$',
+u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d75b': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d75c': '$\\mathsfbf{\\Eta}$',
+u'\U0001d75d': '$\\mathsfbf{\\Theta}$',
+u'\U0001d75e': '$\\mathsfbf{\\Iota}$',
+u'\U0001d75f': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d760': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d761': '$M$',
+u'\U0001d762': '$N$',
+u'\U0001d763': '$\\mathsfbf{\\Xi}$',
+u'\U0001d764': '$O$',
+u'\U0001d765': '$\\mathsfbf{\\Pi}$',
+u'\U0001d766': '$\\mathsfbf{\\Rho}$',
+u'\U0001d767': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d768': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d769': '$\\mathsfbf{\\Tau}$',
+u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d76b': '$\\mathsfbf{\\Phi}$',
+u'\U0001d76c': '$\\mathsfbf{\\Chi}$',
+u'\U0001d76d': '$\\mathsfbf{\\Psi}$',
+u'\U0001d76e': '$\\mathsfbf{\\Omega}$',
+u'\U0001d76f': '$\\mathsfbf{\\nabla}$',
+u'\U0001d770': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d771': '$\\mathsfbf{\\Beta}$',
+u'\U0001d772': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d773': '$\\mathsfbf{\\Delta}$',
+u'\U0001d774': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d775': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d776': '$\\mathsfbf{\\Eta}$',
+u'\U0001d777': '$\\mathsfbf{\\Theta}$',
+u'\U0001d778': '$\\mathsfbf{\\Iota}$',
+u'\U0001d779': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d77a': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d77b': '$M$',
+u'\U0001d77c': '$N$',
+u'\U0001d77d': '$\\mathsfbf{\\Xi}$',
+u'\U0001d77e': '$O$',
+u'\U0001d77f': '$\\mathsfbf{\\Pi}$',
+u'\U0001d780': '$\\mathsfbf{\\Rho}$',
+u'\U0001d781': '$\\mathsfbf{\\varsigma}$',
+u'\U0001d782': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d783': '$\\mathsfbf{\\Tau}$',
+u'\U0001d784': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d785': '$\\mathsfbf{\\Phi}$',
+u'\U0001d786': '$\\mathsfbf{\\Chi}$',
+u'\U0001d787': '$\\mathsfbf{\\Psi}$',
+u'\U0001d788': '$\\mathsfbf{\\Omega}$',
+u'\U0001d789': '$\\partial$',
+u'\U0001d78a': '$\\in$',
+u'\U0001d78b': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d78c': '{\\mathsfbf{\\varkappa}}',
+u'\U0001d78d': '{\\mathsfbf{\\phi}}',
+u'\U0001d78e': '{\\mathsfbf{\\varrho}}',
+u'\U0001d78f': '{\\mathsfbf{\\varpi}}',
+u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d791': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d793': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d796': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d798': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d79b': '$M$',
+u'\U0001d79c': '$N$',
+u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d79e': '$O$',
+u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$',
+u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d7b5': '$M$',
+u'\U0001d7b6': '$N$',
+u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d7b8': '$O$',
+u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$',
+u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7c3': '$\\partial$',
+u'\U0001d7c4': '$\\in$',
+u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}',
+u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}',
+u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}',
+u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}',
+u'\U0001d7ce': '$\\mathbf{0}$',
+u'\U0001d7cf': '$\\mathbf{1}$',
+u'\U0001d7d0': '$\\mathbf{2}$',
+u'\U0001d7d1': '$\\mathbf{3}$',
+u'\U0001d7d2': '$\\mathbf{4}$',
+u'\U0001d7d3': '$\\mathbf{5}$',
+u'\U0001d7d4': '$\\mathbf{6}$',
+u'\U0001d7d5': '$\\mathbf{7}$',
+u'\U0001d7d6': '$\\mathbf{8}$',
+u'\U0001d7d7': '$\\mathbf{9}$',
+u'\U0001d7d8': '$\\mathbb{0}$',
+u'\U0001d7d9': '$\\mathbb{1}$',
+u'\U0001d7da': '$\\mathbb{2}$',
+u'\U0001d7db': '$\\mathbb{3}$',
+u'\U0001d7dc': '$\\mathbb{4}$',
+u'\U0001d7dd': '$\\mathbb{5}$',
+u'\U0001d7de': '$\\mathbb{6}$',
+u'\U0001d7df': '$\\mathbb{7}$',
+u'\U0001d7e0': '$\\mathbb{8}$',
+u'\U0001d7e1': '$\\mathbb{9}$',
+u'\U0001d7e2': '$\\mathsf{0}$',
+u'\U0001d7e3': '$\\mathsf{1}$',
+u'\U0001d7e4': '$\\mathsf{2}$',
+u'\U0001d7e5': '$\\mathsf{3}$',
+u'\U0001d7e6': '$\\mathsf{4}$',
+u'\U0001d7e7': '$\\mathsf{5}$',
+u'\U0001d7e8': '$\\mathsf{6}$',
+u'\U0001d7e9': '$\\mathsf{7}$',
+u'\U0001d7ea': '$\\mathsf{8}$',
+u'\U0001d7eb': '$\\mathsf{9}$',
+u'\U0001d7ec': '$\\mathsfbf{0}$',
+u'\U0001d7ed': '$\\mathsfbf{1}$',
+u'\U0001d7ee': '$\\mathsfbf{2}$',
+u'\U0001d7ef': '$\\mathsfbf{3}$',
+u'\U0001d7f0': '$\\mathsfbf{4}$',
+u'\U0001d7f1': '$\\mathsfbf{5}$',
+u'\U0001d7f2': '$\\mathsfbf{6}$',
+u'\U0001d7f3': '$\\mathsfbf{7}$',
+u'\U0001d7f4': '$\\mathsfbf{8}$',
+u'\U0001d7f5': '$\\mathsfbf{9}$',
+u'\U0001d7f6': '$\\mathtt{0}$',
+u'\U0001d7f7': '$\\mathtt{1}$',
+u'\U0001d7f8': '$\\mathtt{2}$',
+u'\U0001d7f9': '$\\mathtt{3}$',
+u'\U0001d7fa': '$\\mathtt{4}$',
+u'\U0001d7fb': '$\\mathtt{5}$',
+u'\U0001d7fc': '$\\mathtt{6}$',
+u'\U0001d7fd': '$\\mathtt{7}$',
+u'\U0001d7fe': '$\\mathtt{8}$',
+u'\U0001d7ff': '$\\mathtt{9}$'}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/null.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A do-nothing Writer.
+"""
+
+from docutils import writers
+
+
+class Writer(writers.UnfilteredWriter):
+
+    supported = ('null',)
+    """Formats this writer supports."""
+
+    config_section = 'null writer'
+    config_section_dependencies = ('writers',)
+
+    def translate(self):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+PEP HTML Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import codecs
+import docutils
+from docutils import frontend, nodes, utils, writers
+from docutils.writers import html4css1
+
+
+class Writer(html4css1.Writer):
+
+    default_stylesheet = 'pep.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'PEP/HTML-Specific Options',
+        'For the PEP/HTML writer, the default value for the --stylesheet-path '
+        'option is "%s", and the default value for --template is "%s". '
+        'See HTML-Specific Options above.'
+        % (default_stylesheet_path, default_template_path),
+        (('Python\'s home URL.  Default is "http://www.python.org".',
+          ['--python-home'],
+          {'default': 'http://www.python.org', 'metavar': '<URL>'}),
+         ('Home URL prefix for PEPs.  Default is "." (current directory).',
+          ['--pep-home'],
+          {'default': '.', 'metavar': '<URL>'}),
+         # For testing.
+         (frontend.SUPPRESS_HELP,
+          ['--no-random'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_default_overrides = {'stylesheet_path': default_stylesheet_path,
+                                  'template': default_template_path,}
+
+    relative_path_settings = (html4css1.Writer.relative_path_settings
+                              + ('template',))
+
+    config_section = 'pep_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def interpolation_dict(self):
+        subs = html4css1.Writer.interpolation_dict(self)
+        settings = self.document.settings
+        pyhome = settings.python_home
+        subs['pyhome'] = pyhome
+        subs['pephome'] = settings.pep_home
+        if pyhome == '..':
+            subs['pepindex'] = '.'
+        else:
+            subs['pepindex'] = pyhome + '/dev/peps'
+        index = self.document.first_child_matching_class(nodes.field_list)
+        header = self.document[index]
+        self.pepnum = header[0][1].astext()
+        subs['pep'] = self.pepnum
+        if settings.no_random:
+            subs['banner'] = 0
+        else:
+            import random
+            subs['banner'] = random.randrange(64)
+        try:
+            subs['pepnum'] = '%04i' % int(self.pepnum)
+        except ValueError:
+            subs['pepnum'] = pepnum
+        self.title = header[1][1].astext()
+        subs['title'] = self.title
+        subs['body'] = ''.join(
+            self.body_pre_docinfo + self.docinfo + self.body)
+        return subs
+
+    def assemble_parts(self):
+        html4css1.Writer.assemble_parts(self)
+        self.parts['title'] = [self.title]
+        self.parts['pepnum'] = self.pepnum
+
+
+class HTMLTranslator(html4css1.HTMLTranslator):
+
+    def depart_field_list(self, node):
+        html4css1.HTMLTranslator.depart_field_list(self, node)
+        if 'rfc2822' in node['classes']:
+             self.body.append('<hr />\n')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,344 @@
+/*
+:Author: David Goodger
+:Contact: goodger@python.org
+:date: $Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) $
+:version: $Revision: 4564 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the PEP HTML output of Docutils.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.navigation {
+  width: 100% ;
+  background: #99ccff ;
+  margin-top: 0px ;
+  margin-bottom: 0px }
+
+.navigation .navicon {
+  width: 150px ;
+  height: 35px }
+
+.navigation .textlinks {
+  padding-left: 1em ;
+  text-align: left }
+
+.navigation td, .navigation th {
+  padding-left: 0em ;
+  padding-right: 0em ;
+  vertical-align: middle }
+
+.rfc2822 {
+  margin-top: 0.5em ;
+  margin-left: 0.5em ;
+  margin-right: 0.5em ;
+  margin-bottom: 0em }
+
+.rfc2822 td {
+  text-align: left }
+
+.rfc2822 th.field-name {
+  text-align: right ;
+  font-family: sans-serif ;
+  padding-right: 0.5em ;
+  font-weight: bold ;
+  margin-bottom: 0em }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+body {
+  margin: 0px ;
+  margin-bottom: 1em ;
+  padding: 0px }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+div.section {
+  margin-left: 1em ;
+  margin-right: 1em ;
+  margin-bottom: 1.5em }
+
+div.section div.section {
+  margin-left: 0em ;
+  margin-right: 0em ;
+  margin-top: 1.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.footer {
+  margin-left: 1em ;
+  margin-right: 1em }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1 {
+  font-family: sans-serif ;
+  font-size: large }
+
+h2 {
+  font-family: sans-serif ;
+  font-size: medium }
+
+h3 {
+  font-family: sans-serif ;
+  font-size: small }
+
+h4 {
+  font-family: sans-serif ;
+  font-style: italic ;
+  font-size: small }
+
+h5 {
+  font-family: sans-serif;
+  font-size: x-small }
+
+h6 {
+  font-family: sans-serif;
+  font-style: italic ;
+  font-size: x-small }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+td.num {
+  text-align: right }
+
+th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="%(encoding)s" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+This HTML is auto-generated.  DO NOT EDIT THIS FILE!  If you are writing a new
+PEP, see http://www.python.org/dev/peps/pep-0001 for instructions and links
+to templates.  DO NOT USE THIS HTML FILE AS YOUR TEMPLATE!
+-->
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
+  <meta name="generator" content="Docutils %(version)s: http://docutils.sourceforge.net/" />
+  <title>PEP %(pep)s -- %(title)s</title>
+  %(stylesheet)s
+</head>
+<body bgcolor="white">
+<table class="navigation" cellpadding="0" cellspacing="0"
+       width="100%%" border="0">
+<tr><td class="navicon" width="150" height="35">
+<a href="%(pyhome)s/" title="Python Home Page">
+<img src="%(pyhome)s/pics/PyBanner%(banner)03d.gif" alt="[Python]"
+ border="0" width="150" height="35" /></a></td>
+<td class="textlinks" align="left">
+[<b><a href="%(pyhome)s/">Python Home</a></b>]
+[<b><a href="%(pepindex)s/">PEP Index</a></b>]
+[<b><a href="%(pephome)s/pep-%(pepnum)s.txt">PEP Source</a></b>]
+</td></tr></table>
+<div class="document">
+%(body)s
+%(body_suffix)s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+# $Id: pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes indented pseudo-XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('pprint', 'pformat', 'pseudoxml')
+    """Formats this writer supports."""
+
+    config_section = 'pseudoxml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def translate(self):
+        self.output = self.document.pformat()
+
+    def supports(self, format):
+        """This writer supports all format-specific elements."""
+        return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,337 @@
+# $Id: __init__.py 4883 2007-01-16 01:51:28Z wiemann $
+# Authors: Chris Liechti <cliechti@gmx.net>;
+#          David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+S5/HTML Slideshow Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import re
+import docutils
+from docutils import frontend, nodes, utils
+from docutils.writers import html4css1
+from docutils.parsers.rst import directives
+
+themes_dir_path = utils.relative_path(
+    os.path.join(os.getcwd(), 'dummy'),
+    os.path.join(os.path.dirname(__file__), 'themes'))
+
+def find_theme(name):
+    # Where else to look for a theme?
+    # Check working dir?  Destination dir?  Config dir?  Plugins dir?
+    path = os.path.join(themes_dir_path, name)
+    if not os.path.isdir(path):
+        raise docutils.ApplicationError(
+            'Theme directory not found: %r (path: %r)' % (name, path))
+    return path
+
+
+class Writer(html4css1.Writer):
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'S5 Slideshow Specific Options',
+        'For the S5/HTML writer, the --no-toc-backlinks option '
+        '(defined in General Docutils Options above) is the default, '
+        'and should not be changed.',
+        (('Specify an installed S5 theme by name.  Overrides --theme-url.  '
+          'The default theme name is "default".  The theme files will be '
+          'copied into a "ui/<theme>" directory, in the same directory as the '
+          'destination file (output HTML).  Note that existing theme files '
+          'will not be overwritten (unless --overwrite-theme-files is used).',
+          ['--theme'],
+          {'default': 'default', 'metavar': '<name>',
+           'overrides': 'theme_url'}),
+         ('Specify an S5 theme URL.  The destination file (output HTML) will '
+          'link to this theme; nothing will be copied.  Overrides --theme.',
+          ['--theme-url'],
+          {'metavar': '<URL>', 'overrides': 'theme'}),
+         ('Allow existing theme files in the ``ui/<theme>`` directory to be '
+          'overwritten.  The default is not to overwrite theme files.',
+          ['--overwrite-theme-files'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
+          'overwrite any.  This is the default.',
+          ['--keep-theme-files'],
+          {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
+         ('Set the initial view mode to "slideshow" [default] or "outline".',
+          ['--view-mode'],
+          {'choices': ['slideshow', 'outline'], 'default': 'slideshow',
+           'metavar': '<mode>'}),
+         ('Normally hide the presentation controls in slideshow mode. '
+          'This is the default.',
+          ['--hidden-controls'],
+          {'action': 'store_true', 'default': True,
+           'validator': frontend.validate_boolean}),
+         ('Always show the presentation controls in slideshow mode.  '
+          'The default is to hide the controls.',
+          ['--visible-controls'],
+          {'dest': 'hidden_controls', 'action': 'store_false'}),
+         ('Enable the current slide indicator ("1 / 15").  '
+          'The default is to disable it.',
+          ['--current-slide'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Disable the current slide indicator.  This is the default.',
+          ['--no-current-slide'],
+          {'dest': 'current_slide', 'action': 'store_false'}),))
+
+    settings_default_overrides = {'toc_backlinks': 0}
+
+    config_section = 's5_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = S5HTMLTranslator
+
+
+class S5HTMLTranslator(html4css1.HTMLTranslator):
+
+    s5_stylesheet_template = """\
+<!-- configuration parameters -->
+<meta name="defaultView" content="%(view_mode)s" />
+<meta name="controlVis" content="%(control_visibility)s" />
+<!-- style sheet links -->
+<script src="%(path)s/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="%(path)s/slides.css"
+      type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="%(path)s/outline.css"
+      type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="%(path)s/print.css"
+      type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="%(path)s/opera.css"
+      type="text/css" media="projection" id="operaFix" />\n"""
+    # The script element must go in front of the link elements to
+    # avoid a flash of unstyled content (FOUC), reproducible with
+    # Firefox.
+
+    disable_current_slide = """
+<style type="text/css">
+#currentSlide {display: none;}
+</style>\n"""
+
+    layout_template = """\
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+%(header)s
+</div>
+<div id="footer">
+%(title)s%(footer)s
+</div>
+</div>\n"""
+# <div class="topleft"></div>
+# <div class="topright"></div>
+# <div class="bottomleft"></div>
+# <div class="bottomright"></div>
+
+    default_theme = 'default'
+    """Name of the default theme."""
+
+    base_theme_file = '__base__'
+    """Name of the file containing the name of the base theme."""
+
+    direct_theme_files = (
+        'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
+    """Names of theme files directly linked to in the output HTML"""
+
+    indirect_theme_files = (
+        's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
+    """Names of files used indirectly; imported or used by files in
+    `direct_theme_files`."""
+
+    required_theme_files = indirect_theme_files + direct_theme_files
+    """Names of mandatory theme files."""
+
+    def __init__(self, *args):
+        html4css1.HTMLTranslator.__init__(self, *args)
+        #insert S5-specific stylesheet and script stuff:
+        self.theme_file_path = None
+        self.setup_theme()
+        view_mode = self.document.settings.view_mode
+        control_visibility = ('visible', 'hidden')[self.document.settings
+                                                   .hidden_controls]
+        self.stylesheet.append(self.s5_stylesheet_template
+                               % {'path': self.theme_file_path,
+                                  'view_mode': view_mode,
+                                  'control_visibility': control_visibility})
+        if not self.document.settings.current_slide:
+            self.stylesheet.append(self.disable_current_slide)
+        self.add_meta('<meta name="version" content="S5 1.1" />\n')
+        self.s5_footer = []
+        self.s5_header = []
+        self.section_count = 0
+        self.theme_files_copied = None
+
+    def setup_theme(self):
+        if self.document.settings.theme:
+            self.copy_theme()
+        elif self.document.settings.theme_url:
+            self.theme_file_path = self.document.settings.theme_url
+        else:
+            raise docutils.ApplicationError(
+                'No theme specified for S5/HTML writer.')
+
+    def copy_theme(self):
+        """
+        Locate & copy theme files.
+
+        A theme may be explicitly based on another theme via a '__base__'
+        file.  The default base theme is 'default'.  Files are accumulated
+        from the specified theme, any base themes, and 'default'.
+        """
+        settings = self.document.settings
+        path = find_theme(settings.theme)
+        theme_paths = [path]
+        self.theme_files_copied = {}
+        required_files_copied = {}
+        # This is a link (URL) in HTML, so we use "/", not os.sep:
+        self.theme_file_path = '%s/%s' % ('ui', settings.theme)
+        if settings._destination:
+            dest = os.path.join(
+                os.path.dirname(settings._destination), 'ui', settings.theme)
+            if not os.path.isdir(dest):
+                os.makedirs(dest)
+        else:
+            # no destination, so we can't copy the theme
+            return
+        default = 0
+        while path:
+            for f in os.listdir(path):  # copy all files from each theme
+                if f == self.base_theme_file:
+                    continue            # ... except the "__base__" file
+                if ( self.copy_file(f, path, dest)
+                     and f in self.required_theme_files):
+                    required_files_copied[f] = 1
+            if default:
+                break                   # "default" theme has no base theme
+            # Find the "__base__" file in theme directory:
+            base_theme_file = os.path.join(path, self.base_theme_file)
+            # If it exists, read it and record the theme path:
+            if os.path.isfile(base_theme_file):
+                lines = open(base_theme_file).readlines()
+                for line in lines:
+                    line = line.strip()
+                    if line and not line.startswith('#'):
+                        path = find_theme(line)
+                        if path in theme_paths: # check for duplicates (cycles)
+                            path = None         # if found, use default base
+                        else:
+                            theme_paths.append(path)
+                        break
+                else:                   # no theme name found
+                    path = None         # use default base
+            else:                       # no base theme file found
+                path = None             # use default base
+            if not path:
+                path = find_theme(self.default_theme)
+                theme_paths.append(path)
+                default = 1
+        if len(required_files_copied) != len(self.required_theme_files):
+            # Some required files weren't found & couldn't be copied.
+            required = list(self.required_theme_files)
+            for f in required_files_copied.keys():
+                required.remove(f)
+            raise docutils.ApplicationError(
+                'Theme files not found: %s'
+                % ', '.join(['%r' % f for f in required]))
+
+    files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$')
+
+    def copy_file(self, name, source_dir, dest_dir):
+        """
+        Copy file `name` from `source_dir` to `dest_dir`.
+        Return 1 if the file exists in either `source_dir` or `dest_dir`.
+        """
+        source = os.path.join(source_dir, name)
+        dest = os.path.join(dest_dir, name)
+        if self.theme_files_copied.has_key(dest):
+            return 1
+        else:
+            self.theme_files_copied[dest] = 1
+        if os.path.isfile(source):
+            if self.files_to_skip_pattern.search(source):
+                return None
+            settings = self.document.settings
+            if os.path.exists(dest) and not settings.overwrite_theme_files:
+                settings.record_dependencies.add(dest)
+            else:
+                src_file = open(source, 'rb')
+                src_data = src_file.read()
+                src_file.close()
+                dest_file = open(dest, 'wb')
+                dest_dir = dest_dir.replace(os.sep, '/')
+                dest_file.write(src_data.replace(
+                    'ui/default', dest_dir[dest_dir.rfind('ui/'):]))
+                dest_file.close()
+                settings.record_dependencies.add(source)
+            return 1
+        if os.path.isfile(dest):
+            return 1
+
+    def depart_document(self, node):
+        header = ''.join(self.s5_header)
+        footer = ''.join(self.s5_footer)
+        title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
+        layout = self.layout_template % {'header': header,
+                                         'title': title,
+                                         'footer': footer}
+        self.fragment.extend(self.body)
+        self.body_prefix.extend(layout)
+        self.body_prefix.append('<div class="presentation">\n')
+        self.body_prefix.append(
+            self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
+        if not self.section_count:
+            self.body.append('</div>\n')
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        self.s5_footer.append('<h2>')
+        self.s5_footer.extend(self.body[start:])
+        self.s5_footer.append('</h2>')
+        del self.body[start:]
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = ['<div id="header">\n']
+        header.extend(self.body[start:])
+        header.append('\n</div>\n')
+        del self.body[start:]
+        self.s5_header.extend(header)
+
+    def visit_section(self, node):
+        if not self.section_count:
+            self.body.append('\n</div>\n')
+        self.section_count += 1
+        self.section_level += 1
+        if self.section_level > 1:
+            # dummy for matching div's
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+        else:
+            self.body.append(self.starttag(node, 'div', CLASS='slide'))
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.section):
+            level = self.section_level + self.initial_header_level - 1
+            if level == 1:
+                level = 2
+            tag = 'h%s' % level
+            self.body.append(self.starttag(node, tag, ''))
+            self.context.append('</%s>\n' % tag)
+        else:
+            html4css1.HTMLTranslator.visit_subtitle(self, node)
+
+    def visit_title(self, node):
+        html4css1.HTMLTranslator.visit_title(self, node)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+Except where otherwise noted (default/iepngfix.htc), all files in this
+directory have been released into the Public Domain.
+
+These files are based on files from S5 1.1, released into the Public
+Domain by Eric Meyer.  For further details, please see
+http://www.meyerweb.com/eric/tools/s5/credits.html.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+# base theme of this theme:
+big-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/*  list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,109 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #005; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Binary file buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+  if ((/\.png$/i).test(src)) {
+   filt(src, 'image');  // was 'scale'
+   src = blankImg;
+  } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+   var s = RegExp.$1;
+   style.backgroundImage = '';
+   filt(s, 'crop');
+  } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+	visibility: visible !important;
+	position: static !important;
+	page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,16 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+   outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+  display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.outline {display: inline ! important;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+   div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+  margin: 0; padding-left: 0.7em; white-space: nowrap;
+  font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+  color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+   DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+  font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.print {display: inline ! important;}
+
+/* The following rule keeps the layout stuff out of print.
+   Remove at your own risk! */
+.layout, .layout * {display: none !important;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+   The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer, 
+  html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,558 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+	if (!object.className) return false;
+	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+	if (!object) return false;
+	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+	if (!object) return;
+	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+	if (!object || hasClass(object, className)) return;
+	if (object.className) {
+		object.className += ' '+className;
+	} else {
+		object.className = className;
+	}
+}
+
+function GetElementsWithClassName(elementName,className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (var i = 0; i< allElements.length; i++) {
+		if (hasClass(allElements[i], className)) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+	if (element == null || element.nodeName=='BODY') return false;
+	else if (element.id == id) return true;
+	else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+	var result = "";
+	if (node.nodeType == 1) {
+		var children = node.childNodes;
+		for (var i = 0; i < children.length; ++i) {
+			result += nodeValue(children[i]);
+		}		
+	}
+	else if (node.nodeType == 3) {
+		result = node.nodeValue;
+	}
+	return(result);
+}
+
+function slideLabel() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var list = document.getElementById('jumplist');
+	smax = slideColl.length;
+	for (var n = 0; n < smax; n++) {
+		var obj = slideColl[n];
+
+		var did = 'slide' + n.toString();
+		if (obj.getAttribute('id')) {
+			slideIDs[n] = obj.getAttribute('id');
+		}
+		else {
+			obj.setAttribute('id',did);
+			slideIDs[n] = did;
+		}
+		if (isOp) continue;
+
+		var otext = '';
+		var menu = obj.firstChild;
+		if (!menu) continue; // to cope with empty slides
+		while (menu && menu.nodeType == 3) {
+			menu = menu.nextSibling;
+		}
+	 	if (!menu) continue; // to cope with slides with only text nodes
+
+		var menunodes = menu.childNodes;
+		for (var o = 0; o < menunodes.length; o++) {
+			otext += nodeValue(menunodes[o]);
+		}
+		list.options[list.length] = new Option(n + ' : '  + otext, n);
+	}
+}
+
+function currentSlide() {
+	var cs;
+	var footer_nodes;
+	var vis = 'visible';
+	if (document.getElementById) {
+		cs = document.getElementById('currentSlide');
+		footer_nodes = document.getElementById('footer').childNodes;
+	} else {
+		cs = document.currentSlide;
+		footer = document.footer.childNodes;
+	}
+	cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + 
+		'<span id="csSep">\/<\/span> ' + 
+		'<span id="csTotal">' + (smax-1) + '<\/span>';
+	if (snum == 0) {
+		vis = 'hidden';
+	}
+	cs.style.visibility = vis;
+	for (var i = 0; i < footer_nodes.length; i++) {
+		if (footer_nodes[i].nodeType == 1) {
+			footer_nodes[i].style.visibility = vis;
+		}
+	}		
+}
+
+function go(step) {
+	if (document.getElementById('slideProj').disabled || step == 0) return;
+	var jl = document.getElementById('jumplist');
+	var cid = slideIDs[snum];
+	var ce = document.getElementById(cid);
+	if (incrementals[snum].length > 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			removeClass(incrementals[snum][i], 'current');
+			removeClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (step != 'j') {
+		snum += step;
+		lmax = smax - 1;
+		if (snum > lmax) snum = lmax;
+		if (snum < 0) snum = 0;
+	} else
+		snum = parseInt(jl.value);
+	var nid = slideIDs[snum];
+	var ne = document.getElementById(nid);
+	if (!ne) {
+		ne = document.getElementById(slideIDs[0]);
+		snum = 0;
+	}
+	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+	if (incrementals[snum].length > 0 && incpos == 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			if (hasClass(incrementals[snum][i], 'current'))
+				incpos = i + 1;
+			else
+				addClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (incrementals[snum].length > 0 && incpos > 0)
+		addClass(incrementals[snum][incpos - 1], 'current');
+	ce.style.visibility = 'hidden';
+	ne.style.visibility = 'visible';
+	jl.selectedIndex = snum;
+	currentSlide();
+	number = 0;
+}
+
+function goTo(target) {
+	if (target >= smax || target == snum) return;
+	go(target - snum);
+}
+
+function subgo(step) {
+	if (step > 0) {
+		removeClass(incrementals[snum][incpos - 1],'current');
+		removeClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos],'current');
+		incpos++;
+	} else {
+		incpos--;
+		removeClass(incrementals[snum][incpos],'current');
+		addClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos - 1],'current');
+	}
+}
+
+function toggle() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	if (!slides.disabled) {
+		slides.disabled = true;
+		outline.disabled = false;
+		s5mode = false;
+		fontSize('1em');
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'visible';
+		}
+	} else {
+		slides.disabled = false;
+		outline.disabled = true;
+		s5mode = true;
+		fontScale();
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'hidden';
+		}
+		slideColl[snum].style.visibility = 'visible';
+	}
+}
+
+function showHide(action) {
+	var obj = GetElementsWithClassName('*','hideme')[0];
+	switch (action) {
+	case 's': obj.style.visibility = 'visible'; break;
+	case 'h': obj.style.visibility = 'hidden'; break;
+	case 'k':
+		if (obj.style.visibility != 'visible') {
+			obj.style.visibility = 'visible';
+		} else {
+			obj.style.visibility = 'hidden';
+		}
+	break;
+	}
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+	if (!key) {
+		key = event;
+		key.which = key.keyCode;
+	}
+	if (key.which == 84) {
+		toggle();
+		return;
+	}
+	if (s5mode) {
+		switch (key.which) {
+			case 10: // return
+			case 13: // enter
+				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+				if (key.target && isParentOrSelf(key.target, 'controls')) return;
+				if(number != undef) {
+					goTo(number);
+					break;
+				}
+			case 32: // spacebar
+			case 34: // page down
+			case 39: // rightkey
+			case 40: // downkey
+				if(number != undef) {
+					go(number);
+				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+					go(1);
+				} else {
+					subgo(1);
+				}
+				break;
+			case 33: // page up
+			case 37: // leftkey
+			case 38: // upkey
+				if(number != undef) {
+					go(-1 * number);
+				} else if (!incrementals[snum] || incpos <= 0) {
+					go(-1);
+				} else {
+					subgo(-1);
+				}
+				break;
+			case 36: // home
+				goTo(0);
+				break;
+			case 35: // end
+				goTo(smax-1);
+				break;
+			case 67: // c
+				showHide('k');
+				break;
+		}
+		if (key.which < 48 || key.which > 57) {
+			number = undef;
+		} else {
+			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+			if (key.target && isParentOrSelf(key.target, 'controls')) return;
+			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+		}
+	}
+	return false;
+}
+
+function clicker(e) {
+	number = undef;
+	var target;
+	if (window.event) {
+		target = window.event.srcElement;
+		e = window.event;
+	} else target = e.target;
+    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; 
+	if (!e.which || e.which == 1) {
+		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+			go(1);
+		} else {
+			subgo(1);
+		}
+	}
+}
+
+function findSlide(hash) {
+	var target = document.getElementById(hash);
+	if (target) {
+		for (var i = 0; i < slideIDs.length; i++) {
+			if (target.id == slideIDs[i]) return i;
+		}
+	}
+	return null;
+}
+
+function slideJump() {
+	if (window.location.hash == null || window.location.hash == '') {
+		currentSlide();
+		return;
+	}
+	if (window.location.hash == null) return;
+	var dest = null;
+	dest = findSlide(window.location.hash.slice(1));
+	if (dest == null) {
+		dest = 0;
+	}
+	go(dest - snum);
+}
+
+function fixLinks() {
+	var thisUri = window.location.href;
+	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+	var aelements = document.getElementsByTagName('A');
+	for (var i = 0; i < aelements.length; i++) {
+		var a = aelements[i].href;
+		var slideID = a.match('\#.+');
+		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+			var dest = findSlide(slideID[0].slice(1));
+			if (dest != null) {
+				if (aelements[i].addEventListener) {
+					aelements[i].addEventListener("click", new Function("e",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"if (e.preventDefault) e.preventDefault();"), true);
+				} else if (aelements[i].attachEvent) {
+					aelements[i].attachEvent("onclick", new Function("",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"event.returnValue = false;"));
+				}
+			}
+		}
+	}
+}
+
+function externalLinks() {
+	if (!document.getElementsByTagName) return;
+	var anchors = document.getElementsByTagName('a');
+	for (var i=0; i<anchors.length; i++) {
+		var anchor = anchors[i];
+		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+			anchor.target = '_blank';
+			addClass(anchor,'external');
+		}
+	}
+}
+
+function createControls() {
+	var controlsDiv = document.getElementById("controls");
+	if (!controlsDiv) return;
+	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+	var hideDiv, hideList = '';
+	if (controlVis == 'hidden') {
+		hideDiv = hider;
+	} else {
+		hideList = hider;
+	}
+	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+	'<div id="navLinks">' +
+	'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+	'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+	'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+	'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+	'<\/div><\/form>';
+	if (controlVis == 'hidden') {
+		var hidden = document.getElementById('navLinks');
+	} else {
+		var hidden = document.getElementById('jumplist');
+	}
+	addClass(hidden,'hideme');
+}
+
+function fontScale() {  // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+	if (!s5mode) return false;
+	var vScale = 22;  // both yield 32 (after rounding) at 1024x768
+	var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
+	if (window.innerHeight) {
+		var vSize = window.innerHeight;
+		var hSize = window.innerWidth;
+	} else if (document.documentElement.clientHeight) {
+		var vSize = document.documentElement.clientHeight;
+		var hSize = document.documentElement.clientWidth;
+	} else if (document.body.clientHeight) {
+		var vSize = document.body.clientHeight;
+		var hSize = document.body.clientWidth;
+	} else {
+		var vSize = 700;  // assuming 1024x768, minus chrome and such
+		var hSize = 1024; // these do not account for kiosk mode or Opera Show
+	}
+	var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+	fontSize(newSize + 'px');
+	if (isGe) {  // hack to counter incremental reflow bugs
+		var obj = document.getElementsByTagName('body')[0];
+		obj.style.display = 'none';
+		obj.style.display = 'block';
+	}
+}
+
+function fontSize(value) {
+	if (!(s5ss = document.getElementById('s5ss'))) {
+		if (!isIE) {
+			document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+			s5ss.setAttribute('media','screen, projection');
+			s5ss.setAttribute('id','s5ss');
+		} else {
+			document.createStyleSheet();
+			document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+		}
+	}
+	if (!isIE) {
+		while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+		s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+	} else {
+		document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+	}
+}
+
+function notOperaFix() {
+	slideCSS = document.getElementById('slideProj').href;
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	slides.setAttribute('media','screen');
+	outline.disabled = true;
+	if (isGe) {
+		slides.setAttribute('href','null');   // Gecko fix
+		slides.setAttribute('href',slideCSS); // Gecko fix
+	}
+	if (isIE && document.styleSheets && document.styleSheets[0]) {
+		document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+	}
+}
+
+function getIncrementals(obj) {
+	var incrementals = new Array();
+	if (!obj) 
+		return incrementals;
+	var children = obj.childNodes;
+	for (var i = 0; i < children.length; i++) {
+		var child = children[i];
+		if (hasClass(child, 'incremental')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'incremental');
+				for (var j = 0; j < child.childNodes.length; j++) {
+					if (child.childNodes[j].nodeType == 1) {
+						addClass(child.childNodes[j], 'incremental');
+					}
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+				removeClass(child,'incremental');
+			}
+		}
+		if (hasClass(child, 'show-first')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'show-first');
+				if (child.childNodes[isGe].nodeType == 1) {
+					removeClass(child.childNodes[isGe], 'incremental');
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+			}
+		}
+		incrementals = incrementals.concat(getIncrementals(child));
+	}
+	return incrementals;
+}
+
+function createIncrementals() {
+	var incrementals = new Array();
+	for (var i = 0; i < smax; i++) {
+		incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+	}
+	return incrementals;
+}
+
+function defaultCheck() {
+	var allMetas = document.getElementsByTagName('meta');
+	for (var i = 0; i< allMetas.length; i++) {
+		if (allMetas[i].name == 'defaultView') {
+			defaultView = allMetas[i].content;
+		}
+		if (allMetas[i].name == 'controlVis') {
+			controlVis = allMetas[i].content;
+		}
+	}
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+	if (!e) {
+		e = event;
+		e.which = e.keyCode;
+	}
+	try {
+		modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+	}
+	catch(e) {
+		modifierKey = false;
+	}
+	return modifierKey || e.which == 0;
+}
+
+function startup() {
+	defaultCheck();
+	if (!isOp) createControls();
+	slideLabel();
+	fixLinks();
+	externalLinks();
+	fontScale();
+	if (!isOp) {
+		notOperaFix();
+		incrementals = createIncrementals();
+		slideJump();
+		if (defaultView == 'outline') {
+			toggle();
+		}
+		document.onkeyup = keys;
+		document.onkeypress = trap;
+		document.onclick = clicker;
+	}
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+# base theme of this theme:
+medium-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,115 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+# base theme of this theme:
+small-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,116 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/roman.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+"""Convert to and from Roman numerals"""
+
+__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
+__version__ = "1.4"
+__date__ = "8 August 2001"
+__copyright__ = """Copyright (c) 2001 Mark Pilgrim
+
+This program is part of "Dive Into Python", a free Python tutorial for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Python 2.1.1 license, available at
+http://www.python.org/2.1.1/license.html
+"""
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+                   ('CM', 900),
+                   ('D',  500),
+                   ('CD', 400),
+                   ('C',  100),
+                   ('XC', 90),
+                   ('L',  50),
+                   ('XL', 40),
+                   ('X',  10),
+                   ('IX', 9),
+                   ('V',  5),
+                   ('IV', 4),
+                   ('I',  1))
+
+def toRoman(n):
+    """convert integer to Roman numeral"""
+    if not (0 < n < 5000):
+        raise OutOfRangeError, "number out of range (must be 1..4999)"
+    if int(n) <> n:
+        raise NotIntegerError, "decimals can not be converted"
+
+    result = ""
+    for numeral, integer in romanNumeralMap:
+        while n >= integer:
+            result += numeral
+            n -= integer
+    return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile("""
+    ^                   # beginning of string
+    M{0,4}              # thousands - 0 to 4 M's
+    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+                        #            or 500-800 (D, followed by 0 to 3 C's)
+    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+                        #        or 50-80 (L, followed by 0 to 3 X's)
+    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+                        #        or 5-8 (V, followed by 0 to 3 I's)
+    $                   # end of string
+    """ ,re.VERBOSE)
+
+def fromRoman(s):
+    """convert Roman numeral to integer"""
+    if not s:
+        raise InvalidRomanNumeralError, 'Input can not be blank'
+    if not romanNumeralPattern.search(s):
+        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+    result = 0
+    index = 0
+    for numeral, integer in romanNumeralMap:
+        while s[index:index+len(numeral)] == numeral:
+            result += integer
+            index += len(numeral)
+    return result
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/easy-install.pth	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+import sys; sys.__plen = len(sys.path)
+./setuptools-0.6c5-py2.5.egg
+./PyXML-0.8.4-py2.5-win32.egg
+./4Suite_XML-1.0.2-py2.5-win32.egg
+#../2.6/4Suite_XML-1.0.2-py2.6-win32.egg
+./Amara-1.2.0.1-py2.5.egg
+./coverage-2.85-py2.5.egg
+./docutils-0.5-py2.5.egg
+./epydoc-3.0beta1-py2.5.egg
+./Jinja-1.2-py2.5-win32.egg
+./Jinja2-2.0rc1-py2.5-win32.egg
+./lxml-1.3.5-py2.5-win32.egg
+#../2.6/lxml-2.2.1-py2.6-win32.egg
+./nose-0.10.4-py2.5.egg
+./mocker-0.10.1-py2.5.egg
+./path-2.2-py2.5.egg
+./pygments-0.10-py2.5.egg
+./simplejson-1.9.1-py2.5-win32.egg
+./sphinx-0.5.1-py2.5.egg
+./psyco-1.6-py2.5.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/python/lib/2.5/epydoc-3.0beta1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/jython-2.5-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/linux/4Suite_XML-1.0.2-py2.5-linux-i686.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/linux/PyXML-0.8.4-py2.5-linux-i686.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/linux/easy-install.pth	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+import sys; sys.__plen = len(sys.path)
+../setuptools-0.6c5-py2.5.egg
+./PyXML-0.8.4-py2.5-linux-i686.egg
+./4Suite_XML-1.0.2-py2.5-linux-i686.egg
+../Amara-1.2.0.1-py2.5.egg
+./..
+../coverage-2.85-py2.5.egg
+../docutils-0.5-py2.5.egg
+./epydoc-3.0beta1-py2.5.egg
+../Jinja-1.2-py2.5-win32.egg
+../Jinja2-2.0rc1-py2.5-win32.egg
+./lxml-1.3.6-py2.5-linux-i686.egg
+../nose-0.10.2-py2.5.egg
+../mocker-0.10.1-py2.5.egg
+../path-2.2-py2.5.egg
+../pygments-0.10-py2.5.egg
+../simplejson-1.9.1-py2.5-win32.egg
+../sphinx-0.5.1-py2.5.egg
+../psyco-1.6-py2.5.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/python/lib/2.5/linux/lxml-1.3.6-py2.5-linux-i686.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/linux/site.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,394 @@
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
Binary file buildframework/helium/external/python/lib/2.5/lxml-1.3.5-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/mocker-0.10.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/nose-0.10.4-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/path-2.2-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+Metadata-Version: 1.0
+Name: psyco
+Version: 1.6
+Summary: Psyco, the Python specializing compiler
+Home-page: http://psyco.sourceforge.net/
+Author: Armin Rigo
+Author-email: arigo@users.sourceforge.net
+License: MIT License
+Description: Psyco shows that it is possible to execute Python code at speeds
+        approaching that of fully compiled languages, by "specialization".
+        This extension module for the unmodified interpreter accelerates
+        user programs with little or not change in their sources, by a
+        factor that can be very interesting (2-10 times is common).
+Platform: i386
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: C
+Classifier: Topic :: Software Development :: Compilers
+Classifier: Topic :: Software Development :: Interpreters
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+###########################################################################
+# 
+#  Psyco top-level file of the Psyco package.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco -- the Python Specializing Compiler.
+
+Typical usage: add the following lines to your application's main module,
+preferably after the other imports:
+
+try:
+    import psyco
+    psyco.full()
+except ImportError:
+    print 'Psyco not installed, the program will just run slower'
+"""
+###########################################################################
+
+
+#
+# This module is present to make 'psyco' a package and to
+# publish the main functions and variables.
+#
+# More documentation can be found in core.py.
+#
+
+
+# Try to import the dynamic-loading _psyco and report errors
+try:
+    import _psyco
+except ImportError, e:
+    extramsg = ''
+    import sys, imp
+    try:
+        file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__)
+    except ImportError:
+        ext = [suffix for suffix, mode, type in imp.get_suffixes()
+               if type == imp.C_EXTENSION]
+        if ext:
+            extramsg = (" (cannot locate the compiled extension '_psyco%s' "
+                        "in the package path '%s')" % (ext[0], '; '.join(__path__)))
+    else:
+        extramsg = (" (check that the compiled extension '%s' is for "
+                    "the correct Python version; this is Python %s)" %
+                    (filename, sys.version.split()[0]))
+    raise ImportError, str(e) + extramsg
+
+# Publish important data by importing them in the package
+from support import __version__, error, warning, _getrealframe, _getemulframe
+from support import version_info, __version__ as hexversion
+from core import full, profile, background, runonly, stop, cannotcompile
+from core import log, bind, unbind, proxy, unproxy, dumpcodebuf
+from _psyco import setfilter
+from _psyco import compact, compacttype
Binary file buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/_psyco.pyd has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/classes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+###########################################################################
+# 
+#  Psyco class support module.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco class support module.
+
+'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes.
+Any class inheriting from it or using the metaclass '__metaclass__' might
+get optimized specifically for Psyco. It is equivalent to call
+psyco.bind() on the class object after its creation.
+
+Importing everything from psyco.classes in a module will import the
+'__metaclass__' name, so all classes defined after a
+
+       from psyco.classes import *
+
+will automatically use the Psyco-optimized metaclass.
+"""
+###########################################################################
+
+__all__ = ['psyobj', 'psymetaclass', '__metaclass__']
+
+
+from _psyco import compacttype
+import core
+from types import FunctionType
+
+class psymetaclass(compacttype):
+    "Psyco-optimized meta-class. Turns all methods into Psyco proxies."
+
+    def __new__(cls, name, bases, dict):
+        bindlist = dict.get('__psyco__bind__')
+        if bindlist is None:
+            bindlist = [key for key, value in dict.items()
+                        if isinstance(value, FunctionType)]
+        for attr in bindlist:
+            dict[attr] = core.proxy(dict[attr])
+        return super(psymetaclass, cls).__new__(cls, name, bases, dict)
+
+psyobj = psymetaclass("psyobj", (), {})
+__metaclass__ = psymetaclass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/core.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,228 @@
+###########################################################################
+# 
+#  Psyco main functions.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco main functions.
+
+Here are the routines that you can use from your applications.
+These are mostly interfaces to the C core, but they depend on
+the Python version.
+
+You can use these functions from the 'psyco' module instead of
+'psyco.core', e.g.
+
+    import psyco
+    psyco.log('/tmp/psyco.log')
+    psyco.profile()
+"""
+###########################################################################
+
+import _psyco
+import types, new
+from support import *
+
+
+# Default charge profiler values
+default_watermark     = 0.09     # between 0.0 (0%) and 1.0 (100%)
+default_halflife      = 0.5      # seconds
+default_pollfreq_profile    = 20       # Hz
+default_pollfreq_background = 100      # Hz -- a maximum for sleep's resolution
+default_parentframe   = 0.25     # should not be more than 0.5 (50%)
+
+
+def full(memory=None, time=None, memorymax=None, timemax=None):
+    """Compile as much as possible.
+
+Typical use is for small scripts performing intensive computations
+or string handling."""
+    import profiler
+    p = profiler.FullCompiler()
+    p.run(memory, time, memorymax, timemax)
+
+
+def profile(watermark   = default_watermark,
+            halflife    = default_halflife,
+            pollfreq    = default_pollfreq_profile,
+            parentframe = default_parentframe,
+            memory=None, time=None, memorymax=None, timemax=None):
+    """Turn on profiling.
+
+The 'watermark' parameter controls how easily running functions will
+be compiled. The smaller the value, the more functions are compiled."""
+    import profiler
+    p = profiler.ActivePassiveProfiler(watermark, halflife,
+                                       pollfreq, parentframe)
+    p.run(memory, time, memorymax, timemax)
+
+
+def background(watermark   = default_watermark,
+               halflife    = default_halflife,
+               pollfreq    = default_pollfreq_background,
+               parentframe = default_parentframe,
+               memory=None, time=None, memorymax=None, timemax=None):
+    """Turn on passive profiling.
+
+This is a very lightweight mode in which only intensively computing
+functions can be detected. The smaller the 'watermark', the more functions
+are compiled."""
+    import profiler
+    p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe)
+    p.run(memory, time, memorymax, timemax)
+
+
+def runonly(memory=None, time=None, memorymax=None, timemax=None):
+    """Nonprofiler.
+
+XXX check if this is useful and document."""
+    import profiler
+    p = profiler.RunOnly()
+    p.run(memory, time, memorymax, timemax)
+
+
+def stop():
+    """Turn off all automatic compilation.  bind() calls remain in effect."""
+    import profiler
+    profiler.go([])
+
+
+def log(logfile='', mode='w', top=10):
+    """Enable logging to the given file.
+
+If the file name is unspecified, a default name is built by appending
+a 'log-psyco' extension to the main script name.
+
+Mode is 'a' to append to a possibly existing file or 'w' to overwrite
+an existing file. Note that the log file may grow quickly in 'a' mode."""
+    import profiler, logger
+    if not logfile:
+        import os
+        logfile, dummy = os.path.splitext(sys.argv[0])
+        if os.path.basename(logfile):
+            logfile += '.'
+        logfile += 'log-psyco'
+    if hasattr(_psyco, 'VERBOSE_LEVEL'):
+        print >> sys.stderr, 'psyco: logging to', logfile
+    # logger.current should be a real file object; subtle problems
+    # will show up if its write() and flush() methods are written
+    # in Python, as Psyco will invoke them while compiling.
+    logger.current = open(logfile, mode)
+    logger.print_charges = top
+    profiler.logger = logger
+    logger.writedate('Logging started')
+    cannotcompile(logger.psycowrite)
+    _psyco.statwrite(logger=logger.psycowrite)
+
+
+def bind(x, rec=None):
+    """Enable compilation of the given function, method, or class object.
+
+If C is a class (or anything with a '__dict__' attribute), bind(C) will
+rebind all functions and methods found in C.__dict__ (which means, for
+classes, all methods defined in the class but not in its parents).
+
+The optional second argument specifies the number of recursive
+compilation levels: all functions called by func are compiled
+up to the given depth of indirection."""
+    if isinstance(x, types.MethodType):
+        x = x.im_func
+    if isinstance(x, types.FunctionType):
+        if rec is None:
+            x.func_code = _psyco.proxycode(x)
+        else:
+            x.func_code = _psyco.proxycode(x, rec)
+        return
+    if hasattr(x, '__dict__'):
+        funcs = [o for o in x.__dict__.values()
+                 if isinstance(o, types.MethodType)
+                 or isinstance(o, types.FunctionType)]
+        if not funcs:
+            raise error, ("nothing bindable found in %s object" %
+                          type(x).__name__)
+        for o in funcs:
+            bind(o, rec)
+        return
+    raise TypeError, "cannot bind %s objects" % type(x).__name__
+
+
+def unbind(x):
+    """Reverse of bind()."""
+    if isinstance(x, types.MethodType):
+        x = x.im_func
+    if isinstance(x, types.FunctionType):
+        try:
+            f = _psyco.unproxycode(x.func_code)
+        except error:
+            pass
+        else:
+            x.func_code = f.func_code
+        return
+    if hasattr(x, '__dict__'):
+        for o in x.__dict__.values():
+            if (isinstance(o, types.MethodType)
+             or isinstance(o, types.FunctionType)):
+                unbind(o)
+        return
+    raise TypeError, "cannot unbind %s objects" % type(x).__name__
+
+
+def proxy(x, rec=None):
+    """Return a Psyco-enabled copy of the function.
+
+The original function is still available for non-compiled calls.
+The optional second argument specifies the number of recursive
+compilation levels: all functions called by func are compiled
+up to the given depth of indirection."""
+    if isinstance(x, types.FunctionType):
+        if rec is None:
+            code = _psyco.proxycode(x)
+        else:
+            code = _psyco.proxycode(x, rec)
+        return new.function(code, x.func_globals, x.func_name)
+    if isinstance(x, types.MethodType):
+        p = proxy(x.im_func, rec)
+        return new.instancemethod(p, x.im_self, x.im_class)
+    raise TypeError, "cannot proxy %s objects" % type(x).__name__
+
+
+def unproxy(proxy):
+    """Return a new copy of the original function of method behind a proxy.
+The result behaves like the original function in that calling it
+does not trigger compilation nor execution of any compiled code."""
+    if isinstance(proxy, types.FunctionType):
+        return _psyco.unproxycode(proxy.func_code)
+    if isinstance(proxy, types.MethodType):
+        f = unproxy(proxy.im_func)
+        return new.instancemethod(f, proxy.im_self, proxy.im_class)
+    raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__
+
+
+def cannotcompile(x):
+    """Instruct Psyco never to compile the given function, method
+or code object."""
+    if isinstance(x, types.MethodType):
+        x = x.im_func
+    if isinstance(x, types.FunctionType):
+        x = x.func_code
+    if isinstance(x, types.CodeType):
+        _psyco.cannotcompile(x)
+    else:
+        raise TypeError, "unexpected %s object" % type(x).__name__
+
+
+def dumpcodebuf():
+    """Write in file psyco.dump a copy of the emitted machine code,
+provided Psyco was compiled with a non-zero CODE_DUMP.
+See py-utils/httpxam.py to examine psyco.dump."""
+    if hasattr(_psyco, 'dumpcodebuf'):
+        _psyco.dumpcodebuf()
+
+
+###########################################################################
+# Psyco variables
+#   error         * the error raised by Psyco
+#   warning       * the warning raised by Psyco
+#   __in_psyco__  * a new built-in variable which is always zero, but which
+#                     Psyco special-cases by returning 1 instead. So
+#                     __in_psyco__ can be used in a function to know if
+#                     that function is being executed by Psyco or not.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/kdictproxy.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+###########################################################################
+#
+#  Support code for the 'psyco.compact' type.
+
+from __future__ import generators
+
+try:
+    from UserDict import DictMixin
+except ImportError:
+
+    # backported from Python 2.3 to Python 2.2
+    class DictMixin:
+        # Mixin defining all dictionary methods for classes that already have
+        # a minimum dictionary interface including getitem, setitem, delitem,
+        # and keys. Without knowledge of the subclass constructor, the mixin
+        # does not define __init__() or copy().  In addition to the four base
+        # methods, progressively more efficiency comes with defining
+        # __contains__(), __iter__(), and iteritems().
+
+        # second level definitions support higher levels
+        def __iter__(self):
+            for k in self.keys():
+                yield k
+        def has_key(self, key):
+            try:
+                value = self[key]
+            except KeyError:
+                return False
+            return True
+        def __contains__(self, key):
+            return self.has_key(key)
+
+        # third level takes advantage of second level definitions
+        def iteritems(self):
+            for k in self:
+                yield (k, self[k])
+        def iterkeys(self):
+            return self.__iter__()
+
+        # fourth level uses definitions from lower levels
+        def itervalues(self):
+            for _, v in self.iteritems():
+                yield v
+        def values(self):
+            return [v for _, v in self.iteritems()]
+        def items(self):
+            return list(self.iteritems())
+        def clear(self):
+            for key in self.keys():
+                del self[key]
+        def setdefault(self, key, default):
+            try:
+                return self[key]
+            except KeyError:
+                self[key] = default
+            return default
+        def pop(self, key, *args):
+            if len(args) > 1:
+                raise TypeError, "pop expected at most 2 arguments, got "\
+                                  + repr(1 + len(args))
+            try:
+                value = self[key]
+            except KeyError:
+                if args:
+                    return args[0]
+                raise
+            del self[key]
+            return value
+        def popitem(self):
+            try:
+                k, v = self.iteritems().next()
+            except StopIteration:
+                raise KeyError, 'container is empty'
+            del self[k]
+            return (k, v)
+        def update(self, other):
+            # Make progressively weaker assumptions about "other"
+            if hasattr(other, 'iteritems'):  # iteritems saves memory and lookups
+                for k, v in other.iteritems():
+                    self[k] = v
+            elif hasattr(other, '__iter__'): # iter saves memory
+                for k in other:
+                    self[k] = other[k]
+            else:
+                for k in other.keys():
+                    self[k] = other[k]
+        def get(self, key, default=None):
+            try:
+                return self[key]
+            except KeyError:
+                return default
+        def __repr__(self):
+            return repr(dict(self.iteritems()))
+        def __cmp__(self, other):
+            if other is None:
+                return 1
+            if isinstance(other, DictMixin):
+                other = dict(other.iteritems())
+            return cmp(dict(self.iteritems()), other)
+        def __len__(self):
+            return len(self.keys())
+
+###########################################################################
+
+from _psyco import compact
+
+
+class compactdictproxy(DictMixin):
+
+    def __init__(self, ko):
+        self._ko = ko    # compact object of which 'self' is the dict
+
+    def __getitem__(self, key):
+        return compact.__getslot__(self._ko, key)
+
+    def __setitem__(self, key, value):
+        compact.__setslot__(self._ko, key, value)
+
+    def __delitem__(self, key):
+        compact.__delslot__(self._ko, key)
+
+    def keys(self):
+        return compact.__members__.__get__(self._ko)
+
+    def clear(self):
+        keys = self.keys()
+        keys.reverse()
+        for key in keys:
+            del self[key]
+
+    def __repr__(self):
+        keys = ', '.join(self.keys())
+        return '<compactdictproxy object {%s}>' % (keys,)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/logger.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+###########################################################################
+# 
+#  Psyco logger.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco logger.
+
+See log() in core.py.
+"""
+###########################################################################
+
+
+import _psyco
+from time import time, localtime, strftime
+
+
+current = None
+print_charges = 10
+dump_delay = 0.2
+dump_last = 0.0
+
+def write(s, level):
+    t = time()
+    f = t-int(t)
+    try:
+        current.write("%s.%02d  %-*s%s\n" % (
+            strftime("%X", localtime(int(t))),
+            int(f*100.0), 63-level, s,
+            "%"*level))
+        current.flush()
+    except (OSError, IOError):
+        pass
+
+def psycowrite(s):
+    t = time()
+    f = t-int(t)
+    try:
+        current.write("%s.%02d  %-*s%s\n" % (
+            strftime("%X", localtime(int(t))),
+            int(f*100.0), 60, s.strip(),
+            "% %"))
+        current.flush()
+    except (OSError, IOError):
+        pass
+
+##def writelines(lines, level=0):
+##    if lines:
+##        t = time()
+##        f = t-int(t)
+##        timedesc = strftime("%x %X", localtime(int(t)))
+##        print >> current, "%s.%03d  %-*s %s" % (
+##            timedesc, int(f*1000),
+##            50-level, lines[0],
+##            "+"*level)
+##        timedesc = " " * (len(timedesc)+5)
+##        for line in lines[1:]:
+##            print >> current, timedesc, line
+
+def writememory():
+    write("memory usage: %d+ kb" % _psyco.memory(), 1)
+
+def dumpcharges():
+    global dump_last
+    if print_charges:
+        t = time()
+        if not (dump_last <= t < dump_last+dump_delay):
+            if t <= dump_last+1.5*dump_delay:
+                dump_last += dump_delay
+            else:
+                dump_last = t
+            #write("%s: charges:" % who, 0)
+            lst = _psyco.stattop(print_charges)
+            if lst:
+                f = t-int(t)
+                lines = ["%s.%02d   ______\n" % (
+                    strftime("%X", localtime(int(t))),
+                    int(f*100.0))]
+                i = 1
+                for co, charge in lst:
+                    detail = co.co_filename
+                    if len(detail) > 19:
+                        detail = '...' + detail[-17:]
+                    lines.append("        #%-3d |%4.1f %%|  %-26s%20s:%d\n" %
+                                 (i, charge*100.0, co.co_name, detail,
+                                  co.co_firstlineno))
+                    i += 1
+                current.writelines(lines)
+                current.flush()
+
+def writefinalstats():
+    dumpcharges()
+    writememory()
+    writedate("program exit")
+
+def writedate(msg):
+    write('%s, %s' % (msg, strftime("%x")), 20)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/profiler.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,379 @@
+###########################################################################
+# 
+#  Psyco profiler (Python part).
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco profiler (Python part).
+
+The implementation of the non-time-critical parts of the profiler.
+See profile() and full() in core.py for the easy interface.
+"""
+###########################################################################
+
+import _psyco
+from support import *
+import math, time, types, atexit
+now = time.time
+try:
+    import thread
+except ImportError:
+    import dummy_thread as thread
+
+
+# current profiler instance
+current = None
+
+# enabled profilers, in order of priority
+profilers = []
+
+# logger module (when enabled by core.log())
+logger = None
+
+# a lock for a thread-safe go()
+go_lock = thread.allocate_lock()
+
+def go(stop=0):
+    # run the highest-priority profiler in 'profilers'
+    global current
+    go_lock.acquire()
+    try:
+        prev = current
+        if stop:
+            del profilers[:]
+        if prev:
+            if profilers and profilers[0] is prev:
+                return    # best profiler already running
+            prev.stop()
+            current = None
+        for p in profilers[:]:
+            if p.start():
+                current = p
+                if logger: # and p is not prev:
+                    logger.write("%s: starting" % p.__class__.__name__, 5)
+                return
+    finally:
+        go_lock.release()
+    # no profiler is running now
+    if stop:
+        if logger:
+            logger.writefinalstats()
+    else:
+        tag2bind()
+
+atexit.register(go, 1)
+
+
+def buildfncache(globals, cache):
+    if hasattr(types.IntType, '__dict__'):
+        clstypes = (types.ClassType, types.TypeType)
+    else:
+        clstypes = types.ClassType
+    for x in globals.values():
+        if isinstance(x, types.MethodType):
+            x = x.im_func
+        if isinstance(x, types.FunctionType):
+            cache[x.func_code] = x, ''
+        elif isinstance(x, clstypes):
+            for y in x.__dict__.values():
+                if isinstance(y, types.MethodType):
+                    y = y.im_func
+                if isinstance(y, types.FunctionType):
+                    cache[y.func_code] = y, x.__name__
+
+# code-to-function mapping (cache)
+function_cache = {}
+
+def trytobind(co, globals, log=1):
+    try:
+        f, clsname = function_cache[co]
+    except KeyError:
+        buildfncache(globals, function_cache)
+        try:
+            f, clsname = function_cache[co]
+        except KeyError:
+            if logger:
+                logger.write('warning: cannot find function %s in %s' %
+                             (co.co_name, globals.get('__name__', '?')), 3)
+            return  # give up
+    if logger and log:
+        modulename = globals.get('__name__', '?')
+        if clsname:
+            modulename += '.' + clsname
+        logger.write('bind function: %s.%s' % (modulename, co.co_name), 1)
+    f.func_code = _psyco.proxycode(f)
+
+
+# the list of code objects that have been tagged
+tagged_codes = []
+
+def tag(co, globals):
+    if logger:
+        try:
+            f, clsname = function_cache[co]
+        except KeyError:
+            buildfncache(globals, function_cache)
+            try:
+                f, clsname = function_cache[co]
+            except KeyError:
+                clsname = ''  # give up
+        modulename = globals.get('__name__', '?')
+        if clsname:
+            modulename += '.' + clsname
+        logger.write('tag function: %s.%s' % (modulename, co.co_name), 1)
+    tagged_codes.append((co, globals))
+    _psyco.turbo_frame(co)
+    _psyco.turbo_code(co)
+
+def tag2bind():
+    if tagged_codes:
+        if logger:
+            logger.write('profiling stopped, binding %d functions' %
+                         len(tagged_codes), 2)
+        for co, globals in tagged_codes:
+            trytobind(co, globals, 0)
+        function_cache.clear()
+        del tagged_codes[:]
+
+
+class Profiler:
+    MemoryTimerResolution = 0.103
+
+    def run(self, memory, time, memorymax, timemax):
+        self.memory = memory
+        self.memorymax = memorymax
+        self.time = time
+        if timemax is None:
+            self.endtime = None
+        else:
+            self.endtime = now() + timemax
+        self.alarms = []
+        profilers.append(self)
+        go()
+    
+    def start(self):
+        curmem = _psyco.memory()
+        memlimits = []
+        if self.memorymax is not None:
+            if curmem >= self.memorymax:
+                if logger:
+                    logger.writememory()
+                return self.limitreached('memorymax')
+            memlimits.append(self.memorymax)
+        if self.memory is not None:
+            if self.memory <= 0:
+                if logger:
+                    logger.writememory()
+                return self.limitreached('memory')
+            memlimits.append(curmem + self.memory)
+            self.memory_at_start = curmem
+
+        curtime = now()
+        timelimits = []
+        if self.endtime is not None:
+            if curtime >= self.endtime:
+                return self.limitreached('timemax')
+            timelimits.append(self.endtime - curtime)
+        if self.time is not None:
+            if self.time <= 0.0:
+                return self.limitreached('time')
+            timelimits.append(self.time)
+            self.time_at_start = curtime
+        
+        try:
+            self.do_start()
+        except error, e:
+            if logger:
+                logger.write('%s: disabled by psyco.error:' % (
+                    self.__class__.__name__), 4)
+                logger.write('    %s' % str(e), 3)
+            return 0
+        
+        if memlimits:
+            self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,),
+                                   self.check_memory, (min(memlimits),))
+            self.alarms.append(_psyco.alarm(*self.memlimits_args))
+        if timelimits:
+            self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),),
+                                            self.time_out))
+        return 1
+    
+    def stop(self):
+        for alarm in self.alarms:
+            alarm.stop(0)
+        for alarm in self.alarms:
+            alarm.stop(1)   # wait for parallel threads to stop
+        del self.alarms[:]
+        if self.time is not None:
+            self.time -= now() - self.time_at_start
+        if self.memory is not None:
+            self.memory -= _psyco.memory() - self.memory_at_start
+
+        try:
+            self.do_stop()
+        except error:
+            return 0
+        return 1
+
+    def check_memory(self, limit):
+        if _psyco.memory() < limit:
+            return self.memlimits_args
+        go()
+
+    def time_out(self):
+        self.time = 0.0
+        go()
+
+    def limitreached(self, limitname):
+        try:
+            profilers.remove(self)
+        except ValueError:
+            pass
+        if logger:
+            logger.write('%s: disabled (%s limit reached)' % (
+                self.__class__.__name__, limitname), 4)
+        return 0
+
+
+class FullCompiler(Profiler):
+
+    def do_start(self):
+        _psyco.profiling('f')
+
+    def do_stop(self):
+        _psyco.profiling('.')
+
+
+class RunOnly(Profiler):
+
+    def do_start(self):
+        _psyco.profiling('n')
+
+    def do_stop(self):
+        _psyco.profiling('.')
+
+
+class ChargeProfiler(Profiler):
+
+    def __init__(self, watermark, parentframe):
+        self.watermark = watermark
+        self.parent2 = parentframe * 2.0
+        self.lock = thread.allocate_lock()
+
+    def init_charges(self):
+        _psyco.statwrite(watermark = self.watermark,
+                         parent2   = self.parent2)
+
+    def do_stop(self):
+        _psyco.profiling('.')
+        _psyco.statwrite(callback = None)
+
+
+class ActiveProfiler(ChargeProfiler):
+
+    def active_start(self):
+        _psyco.profiling('p')
+
+    def do_start(self):
+        self.init_charges()
+        self.active_start()
+        _psyco.statwrite(callback = self.charge_callback)
+
+    def charge_callback(self, frame, charge):
+        tag(frame.f_code, frame.f_globals)
+
+
+class PassiveProfiler(ChargeProfiler):
+
+    initial_charge_unit   = _psyco.statread('unit')
+    reset_stats_after     = 120      # half-lives (maximum 200!)
+    reset_limit           = initial_charge_unit * (2.0 ** reset_stats_after)
+
+    def __init__(self, watermark, halflife, pollfreq, parentframe):
+        ChargeProfiler.__init__(self, watermark, parentframe)
+        self.pollfreq = pollfreq
+        # self.progress is slightly more than 1.0, and computed so that
+        # do_profile() will double the change_unit every 'halflife' seconds.
+        self.progress = 2.0 ** (1.0 / (halflife * pollfreq))
+
+    def reset(self):
+        _psyco.statwrite(unit = self.initial_charge_unit, callback = None)
+        _psyco.statreset()
+        if logger:
+            logger.write("%s: resetting stats" % self.__class__.__name__, 1)
+
+    def passive_start(self):
+        self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,),
+                                  self.do_profile)
+        self.alarms.append(_psyco.alarm(*self.passivealarm_args))
+
+    def do_start(self):
+        tag2bind()
+        self.init_charges()
+        self.passive_start()
+
+    def do_profile(self):
+        _psyco.statcollect()
+        if logger:
+            logger.dumpcharges()
+        nunit = _psyco.statread('unit') * self.progress
+        if nunit > self.reset_limit:
+            self.reset()
+        else:
+            _psyco.statwrite(unit = nunit, callback = self.charge_callback)
+        return self.passivealarm_args
+
+    def charge_callback(self, frame, charge):
+        trytobind(frame.f_code, frame.f_globals)
+
+
+class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler):
+
+    def do_start(self):
+        self.init_charges()
+        self.active_start()
+        self.passive_start()
+
+    def charge_callback(self, frame, charge):
+        tag(frame.f_code, frame.f_globals)
+
+
+
+#
+# we register our own version of sys.settrace(), sys.setprofile()
+# and thread.start_new_thread().
+#
+
+def psyco_settrace(*args, **kw):
+    "This is the Psyco-aware version of sys.settrace()."
+    result = original_settrace(*args, **kw)
+    go()
+    return result
+
+def psyco_setprofile(*args, **kw):
+    "This is the Psyco-aware version of sys.setprofile()."
+    result = original_setprofile(*args, **kw)
+    go()
+    return result
+
+def psyco_thread_stub(callable, args, kw):
+    _psyco.statcollect()
+    if kw is None:
+        return callable(*args)
+    else:
+        return callable(*args, **kw)
+
+def psyco_start_new_thread(callable, args, kw=None):
+    "This is the Psyco-aware version of thread.start_new_thread()."
+    return original_start_new_thread(psyco_thread_stub, (callable, args, kw))
+
+original_settrace         = sys.settrace
+original_setprofile       = sys.setprofile
+original_start_new_thread = thread.start_new_thread
+sys.settrace            = psyco_settrace
+sys.setprofile          = psyco_setprofile
+thread.start_new_thread = psyco_start_new_thread
+# hack to patch threading._start_new_thread if the module is
+# already loaded
+if (sys.modules.has_key('threading') and
+    hasattr(sys.modules['threading'], '_start_new_thread')):
+    sys.modules['threading']._start_new_thread = psyco_start_new_thread
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/support.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,191 @@
+###########################################################################
+# 
+#  Psyco general support module.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco general support module.
+
+For internal use.
+"""
+###########################################################################
+
+import sys, _psyco, __builtin__
+
+error = _psyco.error
+class warning(Warning):
+    pass
+
+_psyco.NoLocalsWarning = warning
+
+def warn(msg):
+    from warnings import warn
+    warn(msg, warning, stacklevel=2)
+
+#
+# Version checks
+#
+__version__ = 0x010600f0
+if _psyco.PSYVER != __version__:
+    raise error, "version mismatch between Psyco parts, reinstall it"
+
+version_info = (__version__ >> 24,
+                (__version__ >> 16) & 0xff,
+                (__version__ >> 8) & 0xff,
+                {0xa0: 'alpha',
+                 0xb0: 'beta',
+                 0xc0: 'candidate',
+                 0xf0: 'final'}[__version__ & 0xf0],
+                __version__ & 0xf)
+
+
+VERSION_LIMITS = [0x02020200,   # 2.2.2
+                  0x02030000,   # 2.3
+                  0x02040000]   # 2.4
+
+if ([v for v in VERSION_LIMITS if v <= sys.hexversion] !=
+    [v for v in VERSION_LIMITS if v <= _psyco.PYVER  ]):
+    if sys.hexversion < VERSION_LIMITS[0]:
+        warn("Psyco requires Python version 2.2.2 or later")
+    else:
+        warn("Psyco version does not match Python version. "
+             "Psyco must be updated or recompiled")
+
+
+if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'):
+    print >> sys.stderr, ('psyco: running in debugging mode on %s' %
+                          _psyco.PROCESSOR)
+
+
+###########################################################################
+# sys._getframe() gives strange results on a mixed Psyco- and Python-style
+# stack frame. Psyco provides a replacement that partially emulates Python
+# frames from Psyco frames. The new sys._getframe() may return objects of
+# a custom "Psyco frame" type, which is a subtype of the normal frame type.
+#
+# The same problems require some other built-in functions to be replaced
+# as well. Note that the local variables are not available in any
+# dictionary with Psyco.
+
+
+class Frame:
+    pass
+
+
+class PythonFrame(Frame):
+
+    def __init__(self, frame):
+        self.__dict__.update({
+            '_frame': frame,
+            })
+
+    def __getattr__(self, attr):
+        if attr == 'f_back':
+            try:
+                result = embedframe(_psyco.getframe(self._frame))
+            except ValueError:
+                result = None
+            except error:
+                warn("f_back is skipping dead Psyco frames")
+                result = self._frame.f_back
+            self.__dict__['f_back'] = result
+            return result
+        else:
+            return getattr(self._frame, attr)
+
+    def __setattr__(self, attr, value):
+        setattr(self._frame, attr, value)
+
+    def __delattr__(self, attr):
+        delattr(self._frame, attr)
+
+
+class PsycoFrame(Frame):
+
+    def __init__(self, tag):
+        self.__dict__.update({
+            '_tag'     : tag,
+            'f_code'   : tag[0],
+            'f_globals': tag[1],
+            })
+
+    def __getattr__(self, attr):
+        if attr == 'f_back':
+            try:
+                result = embedframe(_psyco.getframe(self._tag))
+            except ValueError:
+                result = None
+        elif attr == 'f_lineno':
+            result = self.f_code.co_firstlineno  # better than nothing
+        elif attr == 'f_builtins':
+            result = self.f_globals['__builtins__']
+        elif attr == 'f_restricted':
+            result = self.f_builtins is not __builtins__
+        elif attr == 'f_locals':
+            raise AttributeError, ("local variables of functions run by Psyco "
+                                   "cannot be accessed in any way, sorry")
+        else:
+            raise AttributeError, ("emulated Psyco frames have "
+                                   "no '%s' attribute" % attr)
+        self.__dict__[attr] = result
+        return result
+
+    def __setattr__(self, attr, value):
+        raise AttributeError, "Psyco frame objects are read-only"
+
+    def __delattr__(self, attr):
+        if attr == 'f_trace':
+            # for bdb which relies on CPython frames exhibiting a slightly
+            # buggy behavior: you can 'del f.f_trace' as often as you like
+            # even without having set it previously.
+            return
+        raise AttributeError, "Psyco frame objects are read-only"
+
+
+def embedframe(result):
+    if type(result) is type(()):
+        return PsycoFrame(result)
+    else:
+        return PythonFrame(result)
+
+def _getframe(depth=0):
+    """Return a frame object from the call stack. This is a replacement for
+sys._getframe() which is aware of Psyco frames.
+
+The returned objects are instances of either PythonFrame or PsycoFrame
+instead of being real Python-level frame object, so that they can emulate
+the common attributes of frame objects.
+
+The original sys._getframe() ignoring Psyco frames altogether is stored in
+psyco._getrealframe(). See also psyco._getemulframe()."""
+    # 'depth+1' to account for this _getframe() Python function
+    return embedframe(_psyco.getframe(depth+1))
+
+def _getemulframe(depth=0):
+    """As _getframe(), but the returned objects are real Python frame objects
+emulating Psyco frames. Some of their attributes can be wrong or missing,
+however."""
+    # 'depth+1' to account for this _getemulframe() Python function
+    return _psyco.getframe(depth+1, 1)
+
+def patch(name, module=__builtin__):
+    f = getattr(_psyco, name)
+    org = getattr(module, name)
+    if org is not f:
+        setattr(module, name, f)
+        setattr(_psyco, 'original_' + name, org)
+
+_getrealframe = sys._getframe
+sys._getframe = _getframe
+patch('globals')
+patch('eval')
+patch('execfile')
+patch('locals')
+patch('vars')
+patch('dir')
+patch('input')
+_psyco.original_raw_input = raw_input
+__builtin__.__in_psyco__ = 0==1   # False
+
+if hasattr(_psyco, 'compact'):
+    import kdictproxy
+    _psyco.compactdictproxy = kdictproxy.compactdictproxy
Binary file buildframework/helium/external/python/lib/2.5/setuptools-0.6c5-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/setuptools.pth	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+./setuptools-0.6c5-py2.5.egg 
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/simplejson-1.9.1-py2.5-win32.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/site.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,394 @@
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/sphinx-build.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+#!python.exe
+# EASY-INSTALL-ENTRY-SCRIPT: 'Sphinx==0.5.1','console_scripts','sphinx-build'
+__requires__ = 'Sphinx==0.5.1'
+import sys
+from pkg_resources import load_entry_point
+
+sys.exit(
+   load_entry_point('Sphinx==0.5.1', 'console_scripts', 'sphinx-build')()
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.5/threadpool.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,337 @@
+
+# -*- coding: UTF-8 -*-
+"""Easy to use object-oriented thread pool framework.
+
+A thread pool is an object that maintains a pool of worker threads to perform
+time consuming operations in parallel. It assigns jobs to the threads
+by putting them in a work request queue, where they are picked up by the
+next available thread. This then performs the requested operation in the
+background and puts the results in a another queue.
+
+The thread pool object can then collect the results from all threads from
+this queue as soon as they become available or after all threads have
+finished their work. It's also possible, to define callbacks to handle
+each result as it comes in.
+
+The basic concept and some code was taken from the book "Python in a Nutshell"
+by Alex Martelli, copyright 2003, ISBN 0-596-00188-6, from section 14.5
+"Threaded Program Architecture". I wrapped the main program logic in the
+ThreadPool class, added the WorkRequest class and the callback system and
+tweaked the code here and there. Kudos also to Florent Aide for the exception
+handling mechanism.
+
+Basic usage:
+
+>>> pool = TreadPool(poolsize)
+>>> requests = makeRequests(some_callable, list_of_args, callback)
+>>> [pool.putRequest(req) for req in requests]
+>>> pool.wait()
+
+See the end of the module code for a brief, annotated usage example.
+
+Website : http://chrisarndt.de/en/software/python/threadpool/
+"""
+
+__all__ = [
+  'makeRequests',
+  'NoResultsPending',
+  'NoWorkersAvailable',
+  'ThreadPool',
+  'WorkRequest',
+  'WorkerThread'
+]
+
+__author__ = "Christopher Arndt"
+__version__ = "1.2.3"
+__revision__ = "$Revision: 1.5 $"
+__date__ = "$Date: 2006/06/23 12:32:25 $"
+__license__ = 'Python license'
+
+# standard library modules
+import sys
+import threading
+import Queue
+
+# exceptions
+class NoResultsPending(Exception):
+    """All work requests have been processed."""
+    pass
+
+class NoWorkersAvailable(Exception):
+    """No worker threads available to process remaining requests."""
+    pass
+
+# classes
+class WorkerThread(threading.Thread):
+    """Background thread connected to the requests/results queues.
+
+    A worker thread sits in the background and picks up work requests from
+    one queue and puts the results in another until it is dismissed.
+    """
+
+    def __init__(self, requestsQueue, resultsQueue, **kwds):
+        """Set up thread in daemonic mode and start it immediatedly.
+
+        requestsQueue and resultQueue are instances of Queue.Queue passed
+        by the ThreadPool class when it creates a new worker thread.
+        """
+
+        threading.Thread.__init__(self, **kwds)
+        self.setDaemon(1)
+        self.workRequestQueue = requestsQueue
+        self.resultQueue = resultsQueue
+        self._dismissed = threading.Event()
+        self.start()
+
+    def run(self):
+        """Repeatedly process the job queue until told to exit."""
+
+        while not self._dismissed.isSet():
+            # thread blocks here, if queue empty
+            request = self.workRequestQueue.get()
+            if self._dismissed.isSet():
+                # if told to exit, return the work request we just picked up
+                self.workRequestQueue.put(request)
+                break # and exit
+            try:
+                self.resultQueue.put(
+                    (request, request.callable(*request.args, **request.kwds))
+                )
+            except:
+                request.exception = True
+                self.resultQueue.put((request, sys.exc_info()))
+
+    def dismiss(self):
+        """Sets a flag to tell the thread to exit when done with current job.
+        """
+
+        self._dismissed.set()
+
+
+class WorkRequest:
+    """A request to execute a callable for putting in the request queue later.
+
+    See the module function makeRequests() for the common case
+    where you want to build several WorkRequests for the same callable
+    but with different arguments for each call.
+    """
+
+    def __init__(self, callable, args=None, kwds=None, requestID=None,
+      callback=None, exc_callback=None):
+        """Create a work request for a callable and attach callbacks.
+
+        A work request consists of the a callable to be executed by a
+        worker thread, a list of positional arguments, a dictionary
+        of keyword arguments.
+
+        A callback function can be specified, that is called when the results
+        of the request are picked up from the result queue. It must accept
+        two arguments, the request object and the results of the callable,
+        in that order. If you want to pass additional information to the
+        callback, just stick it on the request object.
+
+        You can also give a callback for when an exception occurs. It should
+        also accept two arguments, the work request and a tuple with the
+        exception details as returned by sys.exc_info().
+
+        requestID, if given, must be hashable since it is used by the
+        ThreadPool object to store the results of that work request in a
+        dictionary. It defaults to the return value of id(self).
+        """
+
+        if requestID is None:
+            self.requestID = id(self)
+        else:
+            try:
+                hash(requestID)
+            except TypeError:
+                raise TypeError("requestID must be hashable.")
+            self.requestID = requestID
+        self.exception = False
+        self.callback = callback
+        self.exc_callback = exc_callback
+        self.callable = callable
+        self.args = args or []
+        self.kwds = kwds or {}
+
+
+class ThreadPool:
+    """A thread pool, distributing work requests and collecting results.
+
+    See the module doctring for more information.
+    """
+
+    def __init__(self, num_workers, q_size=0):
+        """Set up the thread pool and start num_workers worker threads.
+
+        num_workers is the number of worker threads to start initialy.
+        If q_size > 0 the size of the work request queue is limited and
+        the thread pool blocks when the queue is full and it tries to put
+        more work requests in it (see putRequest method).
+        """
+
+        self.requestsQueue = Queue.Queue(q_size)
+        self.resultsQueue = Queue.Queue()
+        self.workers = []
+        self.workRequests = {}
+        self.createWorkers(num_workers)
+
+    def createWorkers(self, num_workers):
+        """Add num_workers worker threads to the pool."""
+
+        for i in range(num_workers):
+            self.workers.append(WorkerThread(self.requestsQueue,
+              self.resultsQueue))
+
+    def dismissWorkers(self, num_workers):
+        """Tell num_workers worker threads to quit after their current task.
+        """
+
+        for i in range(min(num_workers, len(self.workers))):
+            worker = self.workers.pop()
+            worker.dismiss()
+
+    def addWork(self, callable, args=None, kwds=None, requestID=None, callback=None, exc_callback=None, block=True, timeout=0):
+        request = WorkRequest(callable, args, kwds, requestID, callback, exc_callback)
+        self.putRequest(request, block, timeout)
+        
+    def putRequest(self, request, block=True, timeout=0):
+        """Put work request into work queue and save its id for later."""
+
+        assert isinstance(request, WorkRequest)
+        self.requestsQueue.put(request, block, timeout)
+        self.workRequests[request.requestID] = request
+
+    def poll(self, block=False):
+        """Process any new results in the queue."""
+
+        while True:
+            # still results pending?
+            if not self.workRequests:
+                raise NoResultsPending
+            # are there still workers to process remaining requests?
+            elif block and not self.workers:
+                raise NoWorkersAvailable
+            try:
+                # get back next results
+                request, result = self.resultsQueue.get(block=block)
+                # has an exception occured?
+                if request.exception and request.exc_callback:
+                    request.exc_callback(request, result)
+                # hand results to callback, if any
+                if request.callback and not \
+                  (request.exception and request.exc_callback):
+                    request.callback(request, result)
+                del self.workRequests[request.requestID]
+            except Queue.Empty:
+                break
+
+    def wait(self):
+        """Wait for results, blocking until all have arrived."""
+
+        while 1:
+            try:
+                self.poll(True)
+            except NoResultsPending:
+                break
+
+# helper functions
+def makeRequests(callable, args_list, callback=None, exc_callback=None):
+    """Create several work requests for same callable with different arguments.
+
+    Convenience function for creating several work requests for the same
+    callable where each invocation of the callable receives different values
+    for its arguments.
+
+    args_list contains the parameters for each invocation of callable.
+    Each item in 'args_list' should be either a 2-item tuple of the list of
+    positional arguments and a dictionary of keyword arguments or a single,
+    non-tuple argument.
+
+    See docstring for WorkRequest for info on callback and exc_callback.
+    """
+
+    requests = []
+    for item in args_list:
+        if isinstance(item, tuple):
+            requests.append(
+              WorkRequest(callable, item[0], item[1], callback=callback,
+                exc_callback=exc_callback)
+            )
+        else:
+            requests.append(
+              WorkRequest(callable, [item], None, callback=callback,
+                exc_callback=exc_callback)
+            )
+    return requests
+
+################
+# USAGE EXAMPLE
+################
+
+if __name__ == '__main__':
+    import random
+    import time
+
+    # the work the threads will have to do (rather trivial in our example)
+    def do_something(data):
+        time.sleep(random.randint(1, 5))
+        result = round(random.random() * data, 5)
+        # just to show off, we throw an exception once in a while
+        if result > 3:
+            raise RuntimeError("Something extraordinary happened!")
+        return result
+
+    # this will be called each time a result is available
+    def print_result(request, result):
+        print "**Result: %s from request #%s" % (result, request.requestID)
+
+    # this will be called when an exception occurs within a thread
+    def handle_exception(request, exc_info):
+        print "Exception occured in request #%s: %s" % \
+          (request.requestID, exc_info[1])
+
+    # assemble the arguments for each job to a list...
+    data = [random.randint(1, 10) for i in range(20)]
+    # ... and build a WorkRequest object for each item in data
+    requests = makeRequests(do_something, data, print_result, handle_exception)
+
+    # or the other form of args_lists accepted by makeRequests: ((,), {})
+    data = [((random.randint(1, 10), ), {}) for i in range(20)]
+    requests.extend(
+      makeRequests(do_something, data, print_result, handle_exception)
+    )
+
+    # we create a pool of 3 worker threads
+    main = ThreadPool(3)
+
+    # then we put the work requests in the queue...
+    for req in requests:
+        main.putRequest(req)
+        print "Work request #%s added." % req.requestID
+    # or shorter:
+    # [main.putRequest(req) for req in requests]
+
+    # ...and wait for the results to arrive in the result queue
+    # by using ThreadPool.wait(). This would block until results for
+    # all work requests have arrived:
+    # main.wait()
+
+    # instead we can poll for results while doing something else:
+    i = 0
+    while 1:
+        try:
+            main.poll()
+            print "Main thread working..."
+            time.sleep(0.5)
+            if i == 10:
+                print "Adding 3 more worker threads..."
+                main.createWorkers(3)
+            i += 1
+        except KeyboardInterrupt:
+            print "Interrupted!"
+            break
+        except NoResultsPending:
+            print "All results collected."
+            break
+
Binary file buildframework/helium/external/python/lib/2.6/4Suite_XML-1.0.2-py2.6-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.6/lxml-2.2.1-py2.6-win32.egg has changed
Binary file buildframework/helium/external/sources/bsh-2.1b0_source-1.0.zip has changed
Binary file buildframework/helium/external/sources/freemarker-2.3.13-sources-1.0.zip has changed
Binary file buildframework/helium/external/sources/junit-4.5-src.zip has changed
Binary file buildframework/helium/external/sources/mail-1.4.1-sources-1.0.zip has changed
Binary file buildframework/helium/external/sources/wsdl4j-1.5.1-sources-1.0.zip has changed
Binary file buildframework/helium/external/sources/xia_source-1.0.zip has changed
Binary file buildframework/helium/external/sources/xincluder-1.0d11.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/helium.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Main full build targets and properties
+    </description>
+
+    <!-- Check the Ant version is what we expect. -->
+    <property name="required.ant.version" value="1.7.0"/>
+    <fail message="Incorrect version of Ant found. Please check you have Ant ${required.ant.version}.">
+        <condition>
+            <and>
+                <os family="windows"/>
+                <not>
+                    <antversion exactly="${required.ant.version}"/>
+                </not>
+            </and>
+        </condition>
+    </fail>
+    
+    
+    <!-- Load the current Helium version. -->
+    <property file="${helium.dir}/config/version.txt"/>
+
+    <!-- Libraries
+    ======================================================================-->
+    <import file="helium_preinclude.ant.xml"/>
+    
+    <property name="cache.dir" location="${env.TEMP}/helium/${env.USERNAME}"/>
+    <property name="helium.build.dir" location="${helium.dir}/build"/>
+    
+    <hlm:typedef file="${helium.dir}/tools/common/common.antlib.xml" uri="http://www.nokia.com/helium"/> 
+    
+    <property name="logging.output.file" location="${cache.dir}/logging.${env.PID}.conf" />
+    <fmpp sourceFile="${helium.dir}/config/logging.conf.ftl" outputFile="${logging.output.file}" quiet="true">
+        <data expandProperties="yes">
+            ant: antProperties()
+        </data>
+    </fmpp>
+     
+    <!-- Properties
+    ======================================================================-->
+    <property name="team" value="${env.TEAM}"/>
+
+    <!-- See if 'bn' is defined as a shortcut for build.number. -->
+    <if>
+        <isset property="bn"/>
+        <then>
+            <property name="build.number" value="${bn}"/>
+        </then>
+    </if>
+    
+    <!-- If build.drive not define then search the next free drive -->
+    <if>
+        <not>
+            <isset property="build.drive"/>        
+        </not>    
+        <then>
+            <property name="build.drive.notdefined" value="true"/> 
+            <exec osfamily="windows" executable="python" failonerror="true" outputproperty="build.drive">
+                <arg value="${helium.dir}/tools/common/python/scripts/searchnextdrive.py"/>               
+            </exec>
+            <if>
+                <equals arg1="${build.drive}" arg2="Error: No free drive!"/>
+                <then>            
+                    <fail message="ERROR: Failed to assign build drive, please check you are not running out of drives." />    
+                </then>
+            </if>
+            <echo> Using build drive ${build.drive} </echo>
+        </then>
+    </if>
+    
+    <if>
+        <and>
+            <isset property="major.version"/>
+            <isset property="minor.version"/>
+        </and>
+        <then>
+            <property name="core.build.version" value="${major.version}.${minor.version}"/>
+        </then>
+        <else>
+            <property name="core.build.version" value="${env.USERNAME}"/>
+        </else>
+    </if>
+    
+    <if>
+        <and>
+            <isset property="read.build.int"/>
+            <not>
+                <isset property="build.number"/>
+            </not>
+        </and>
+        <then>
+            <if>
+                <isset property="build.tag"/>
+                <then>
+                    <property name="build.tag.ext" value="${build.tag}."/>
+                </then>
+                <else>
+                    <property name="build.tag.ext" value=""/>
+                    <property name="build.tag" value=""/>
+                </else>
+            </if>
+            <!-- Use an internal directory to store text files for assigning build number information. -->
+            <property name="build.int.db.dir" location="${publish.root.dir}/internal/build_int_db"/>
+            <mkdir dir="${build.int.db.dir}"/>
+            <property name="build.int.db.file" value="${build.int.db.dir}/${build.name}_${core.build.version}_${build.tag}_build_int_db.txt"/>
+            <if>
+                <available file="${build.int.db.file}"/>
+                <then>
+                    <echo>Reading from existing build number property file.</echo>
+                    <property file="${build.int.db.file}"/>
+                    <echo>Build int = ${build.int}</echo>
+                    <!-- Read the comments in the file too, for history information. -->
+                    <loadfile property="build.int.db.file.comments" srcFile="${build.int.db.file}">
+                        <filterchain>
+                            <linecontains>
+                                <contains value="# history: "/>
+                            </linecontains>
+                        </filterchain>
+                    </loadfile>
+                    <!-- Set the property in case nothing was found. -->
+                    <property name="build.int.db.file.comments" value=""/>
+                    <echo>History comments:
+${build.int.db.file.comments}</echo>
+                    <property name="build.number" value="${build.tag.ext}${build.int}"/>
+                    <echo>Writing incremented build int back to file.</echo>
+                    <propertyfile file="${build.int.db.file}" comment="build.int database file">
+                        <entry key="build.int" type="int" default="001" operation="+" pattern="000"/>
+                    </propertyfile>
+                    <tstamp>
+                        <format property="build.int.db.file.tstamp" pattern="dd/MM/yyyy-HH:mm:ss"/>
+                    </tstamp>
+                    <concat destfile="${build.int.db.file}" append="true">
+${build.int.db.file.comments}
+# history: ${env.COMPUTERNAME};${env.USERNAME};${build.int.db.file.tstamp};${build.int}
+                    </concat>
+                </then>
+                <else>
+                    <echo>Build number property file not found. Creating a new one.</echo>
+                    <property name="new.build.int" value="001"/>
+                    <property name="build.number" value="${build.tag.ext}${new.build.int}"/>
+                    <echo>Build number = ${build.number}</echo>
+                    <propertyfile file="${build.int.db.file}" comment="build.int database file">
+                        <entry key="build.int" type="int" default="001" operation="+" pattern="000"/>
+                    </propertyfile>
+                </else>
+            </if>
+        </then>
+    </if>
+
+
+    <!-- Define a number of properties that should be consistent amongst all builds. They can be overridden
+    within any config or team Ant file though. -->
+    <property name="build.name" value="helium"/>
+    <if>
+        <and>
+            <isset property="core.build.version"/>
+            <isset property="build.number"/>
+        </and>
+        <then>
+            <property name="build.version" value="${core.build.version}.${build.number}"/>
+        </then>
+        <else>
+            <property name="build.version" value="${env.USERNAME}"/>
+        </else>
+    </if>
+    
+    <property name="build.id" value="${build.name}_${build.version}"/>
+    <property name="build.type" value="core"/>
+    <property name="epocroot" value="\"/>
+    <property name="data.model.file" location="${helium.dir}/config/helium_data_model.xml"/>
+    <property name="data.model.parsed" location="${helium.build.dir}/datamodel.out"/>
+    <condition property="data.model.xsl" value="${helium.dir}/extensions/nokia/config/helium_nokia_data_model.xsl" else="${helium.dir}/config/helium_data_model.xsl">
+        <available file="${helium.dir}/extensions/nokia/config/helium_nokia_data_model.xsl"/>
+    </condition>
+    <property name="database.file" location="${helium.dir}/build/database.xml"/>
+    <property name="ccm.base.dir" location="${ccm.home.dir}\${minor.version}"/>
+    <property name="prep.build.dir" location="${prep.root.dir}/${build.id}"/>
+    <property name="build.output.dir" location="${build.drive}/output"/>
+    <property name="build.sisfiles.dir" location="${build.output.dir}/sisfiles"/>
+    <property name="zips.build.dir" location="${build.output.dir}/build_area/engineering_english"/>
+    <property name="zips.loc.dir" location="${build.output.dir}/build_area/localised"/>
+    <property name="subcon.zips.dir" location="${build.output.dir}/build_area/subcon"/>
+    <property name="zips.flashfiles.dir" location="${build.output.dir}/zips_flashfiles"/>
+    <property name="build.log.dir" location="${build.output.dir}/logs"/>
+    <property name="build.signal.status.dir" location="${build.log.dir}/signals"/>
+    <property name="build.status.email.template" location="${helium.dir}/tools/common/templates/log/email_status.html.ftl" />
+    <property name="metadata.dbfile" location="${build.log.dir}/${build.id}_metadata.sqlite"/>
+    <property name="temp.build.dir" location="${build.output.dir}/temp_build_files"/>
+    <property name="failonerror" value="false"/>
+    <property name="build.errors.limit" value="0"/>
+    <property name="unsubst.after.build" value="no"/>
+    <property name="validate.properties.at.startup" value="yes"/>
+    <property name="zip.wa.file" value="${build.drive}/output/src/${build.id}_sources.zip"/>
+
+    <!-- Cache related properties. -->
+    <property name="build.cache.dir" location="${cache.dir}/${build.id}"/>
+    <property name="build.cache.log.dir" location="${build.cache.dir}/logs"/>
+    <mkdir dir="${build.cache.log.dir}"/>
+    
+    <property name="tracing.csv.file" location="${build.cache.dir}/logs/${build.id}_traces.csv"/>
+    
+    <!-- Publish dir configuration. Defines subdir first and next toplevel properties. -->
+    <property name="publish.subdir" value="${build.name}/builds/${core.build.version}/${build.id}"/>
+    <property name="publish.release.subdir" value="${build.name}/releases/${core.build.version}/${build.id}"/>
+    <property name="publish.dir" location="${publish.root.dir}/${publish.subdir}"/>
+    <property name="publish.release.dir" location="${publish.root.dir}/${publish.release.subdir}"/>
+    <condition property="is.published" else="false">
+        <isset property="publish"/>
+    </condition>
+    
+    <property name="release.images.dir" value="${build.output.dir}/release_flash_images"/>
+    <property name="binary.root" value="${build.drive}/epoc32/release/armv5/urel" />
+    <property name="python.dir" value="${helium.dir}/external/python/lib/2.5"/>
+    <property name="python.tools" value="${helium.dir}/external/python/bin"/>
+
+    <!-- EBS is selected as the default build system, but ec for Electric Cloud could be used. -->
+    <property name="build.system" value="ebs"/>
+    <property name="genxml.output.file" location="${temp.build.dir}/${build.id}.${sysdef.configuration}.xml" />
+    <property name="canonical.sysdef.file" value="${build.output.dir}/build/canonical_system_definition.xml"/>
+    <property name="build.system.${build.system}" value="Not used"/>
+    <property name="build.summary.file" location="${build.log.dir}/summary/${build.id}_summary.log.xml"/>
+    <property name="error.summary.file" location="${build.log.dir}/summary/${build.id}_error_summary.log.xml"/>
+    <property name="build.logging.start.stage" value="check-env-prep"/>
+    <property name="build.logging.key.stages" value="prep,build-ebs-main,postbuild,flashfiles,java-certification-rom,zip-main,publish-generic,variants-core,variants-elaf,variants-china,variants-thai,variants-japan,variants,mobilecrash-prep,localise-tutorial-content,hdd-images,zip-flashfiles,zip-localisation,data-packaging-prep"/>
+    <property name="build.log" value="${build.log.dir}/${build.id}_ant_build.log"/>
+    <property name="overlays.log.file" location="${build.log.dir}/${build.id}_overlays.xml"/>
+    <property name="diamonds.listener.configuration.file" location="${helium.dir}/config/diamonds_config.xml.ftl"/>
+    <property name="antlib.import.module.path" location="${helium.dir}/tools/hlm-antlib-imports"/>
+    
+    <!-- Following are temporarily defined here until global tools available-->
+    <property name="ec.scripts.dir" location="${helium.dir}/external/symbiantools/ectools/"/>
+    <property name="ec.history.dir" location="${publish.root.dir}\${product.family}\ec_history"/>
+    <property name="ec.tools.dir" location="${helium.dir}/external/symbiantools/ectools/tools/"/>
+    <property name="release.label" value="${build.version}"/>
+    <property name="ec.mode" value="parallel" />
+    <property name="ec.allow.duplicates" value="0" />
+    <property name="roms.spec.name" value=""/>
+    <property name="zip.ee.log.file" location="${build.log.dir}/${build.id}_ee_zip.log" />
+    <property name="zip.localised.log.file" location="${build.log.dir}/${build.id}_localised_zip.log" />
+    <property name="zip.subcon.log.file" value="${build.log.dir}/${build.id}_subcon_zip.log" />
+    <property name="zip.subcon_roms.log.file" location="${build.log.dir}/${build.id}_subcon_roms_zip.log" />
+    <property name="zip.trace_roms.log.file" location="${build.log.dir}/${build.id}_trace_roms_zip.log" />
+    <property name="zip.uda_roms.log.file" location="${build.log.dir}/${build.id}_uda_roms_zip.log" />
+    <property name="rombuild.makefile.name" value="image_conf_helium.mk" />
+    <property name="loc.temp.dir" location="${temp.build.dir}/locfiles"/>
+    <property name="loc.output.dir" location="${build.output.dir}/build_area/localised"/>
+    <property name="loc.output.filename" location="${build.id}_locfiles.zip"/>
+    
+    <property name="tools.ivy.config.file" location="${helium.dir}/config/ivy/tools_ivy_settings.xml" />
+    
+    <property name="build.property.cache.file" location="${build.log.dir}/build_properties_cache.txt" />
+    <property name="ccmtask.python.script.file" location="${helium.dir}/tools/preparation/synergy/ccmtask.jep" />
+
+    <if>
+        <available file="${build.property.cache.file}"/>
+        <then>
+            <property file="${build.property.cache.file}"/>
+        </then>
+    </if>
+
+    
+
+    <!-- Default number of threads is 2 * NUMBER_OF_PROCESSORS, but this can be overridden by defining the
+    property manually. -->
+    <if>
+        <not>
+            <isset property="number.of.threads"/>
+        </not>
+        <then>
+            <if>
+                <isset property="env.NUMBER_OF_PROCESSORS"/>
+                <then>
+                    <math result="number.of.threads" operand1="${env.NUMBER_OF_PROCESSORS}" operation="*" operand2="2" datatype="int"/>
+                </then>
+                <else>
+                    <property name="number.of.threads" value="2"/>
+                </else>
+            </if>
+        </then>
+    </if>
+     
+
+    <!-- Import basic targets.
+        
+    The intention would be to split the targets into separate files somewhat
+    matching the build phases located inside \nbuild and import each one here.
+    -->
+    <import file="extensions/nokia/build.xml" optional="true"/>
+    <import file="tools/preparation/preparation.ant.xml"/>
+    <import file="tools/common/common.ant.xml"/>
+    <import file="tools/common/testing.ant.xml"/>
+    <import file="tools/compile/compile.ant.xml"/>
+    <import file="tools/common/docs.ant.xml"/>
+    <import file="tools/localisation/localisation.ant.xml"/>
+    <import file="tools/publish/publish.ant.xml"/>
+    <import file="tools/metadata/metadata.ant.xml"/>
+    <import file="tools/release/release.ant.xml"/>
+    <import file="tools/rombuild/rombuild.ant.xml"/>
+    <import file="tools/uda/uda.ant.xml"/>
+    <import file="tools/quality/quality.ant.xml"/>
+    <import file="tools/relnotes/relnotes.ant.xml"/>
+    <import file="tools/integration/integration.ant.xml"/>
+    <import file="tools/startup/antserver/remote.ant.xml" />
+    <import file="tools/testing/testing.ant.xml" />
+    <import file="tools/startup/bootstrap/bootstrap.ant.xml"/>
+    <import file="tools/iad/iad.ant.xml"/>
+    <import file="config/signaling_config_default.ant.xml"/>
+    <import file="config/metadata_filter_config_default.ant.xml"/>
+
+    <!-- Checking required properties from datamodel if "validate.properties.at.startup=yes" 
+        
+    Comment this out until it is done more correctly.-->
+    <!--<if>
+        <and>
+            <isset property="validate.properties.at.startup"/>
+            <equals arg1="${validate.properties.at.startup}" arg2="yes"/>
+        </and>
+        <then>
+            <runtarget target="validate-at-startup"/>
+        </then>
+    </if>-->
+    
+    <!-- Top level build execution targets.
+        
+    All of these should simply depend on other targets. They should not contain any tasks.
+    -->
+    
+    <!-- Top-level target for platform builds. -->
+    <target name="platform-build"
+            depends="prep,prebuild,compile-main,postbuild,ee-roms,zip-ee,publish-generic,
+                     report,final"
+            description="The default platform build"/>
+    
+    <!-- Top-level target for IBUSAL builds. -->
+    <target name="ibusal-build"
+            depends="prep-drive,init-build-area,prebuild,build-info,log-build-env,
+                     check-env-prep,diamonds,prep-copy,set-arm-version,
+                     create-canonical-sysdef-file,compile-main,zip-ee"
+            description="The default IBUSAL build"/>
+
+    <!-- Top-level target for IDO builds. -->
+    <target name="ido-build"
+            depends="diamonds,compile-clean,compile-main,ee-roms"
+            description="IDO build"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/helium_preinclude.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium_preinclude.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<project name="helium_preinclude" basedir="." xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Helium task definations. User can import this file and use helium and helium-antlib tasks.
+    </description>
+    <import file="tools/common/libs.ant.xml"/>
+    <taskdef resource="com/nokia/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/scm/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/metadata/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/quality/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/hlm-bootstrap.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+
+REM Set the Helium location
+REM Make sure the path is not ending with a backslash!
+if not defined HELIUM_HOME (
+	set HELIUM_HOME_TEMP=%~dp0
+)
+if not defined HELIUM_HOME (
+	set HELIUM_HOME=%HELIUM_HOME_TEMP:~0,-1%
+)
+
+set ANT_ARGS=-lib "%HELIUM_HOME%\tools\common\java\lib" -lib "%HELIUM_HOME%\external\antlibs"
+
+call "%HELIUM_HOME%\hlm.bat" -f "%HELIUM_HOME%\tools\startup\bootstrap\bootstrap.ant.xml" get-ivy %*
+call "%HELIUM_HOME%\hlm.bat" -f "%HELIUM_HOME%\tools\startup\bootstrap\bootstrap.ant.xml" %*
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/hlm-jar.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+
+REM Set the Helium location
+REM Make sure the path is not ending with a backslash!
+if not defined HELIUM_HOME (
+	set HELIUM_HOME_TEMP=%~dp0
+)
+if not defined HELIUM_HOME (
+	set HELIUM_HOME=%HELIUM_HOME_TEMP:~0,-1%
+)
+
+set HLM_DISABLE_INTERNAL_DATA=1
+
+set JEP_HOME=%HELIUM_HOME%\external\jep_1.6_2.5
+
+set ANT_ARGS=-lib "%HELIUM_HOME%\external\antlibs" -lib "%JEP_HOME%" -logger org.apache.tools.ant.DefaultLogger
+
+hlm -f build-jar.ant.xml jar
+
+
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,146 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+
+REM Set the Helium location
+REM Make sure the path is not ending with a backslash!
+if not defined HELIUM_HOME (
+	set HELIUM_HOME_TEMP=%~dp0
+)
+if not defined HELIUM_HOME (
+	set HELIUM_HOME=%HELIUM_HOME_TEMP:~0,-1%
+)
+
+rem Loading runtime environment tools
+if exist "%HELIUM_HOME%\runtime\runtime_env.bat" (
+call %HELIUM_HOME%\runtime\runtime_env.bat
+) 
+
+if not exist "%HELIUM_HOME%\extensions\nokia\distribution.policy.S60" ( 
+set HLM_SUBCON=1
+set HLM_DISABLE_INTERNAL_DATA=1
+)
+
+
+REM Configure Java
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+if not exist "%JAVA_HOME%" ( echo *** Java cannot be found & goto :errorstop )
+set JEP_HOME=%HELIUM_HOME%\external\jep_1.6_2.5
+set PATH=%PATH%;%JEP_HOME%
+
+REM Needed by python logging
+set PID=1
+perl "%HELIUM_HOME%\tools\common\bin\getppid.pl" > %TEMP%\%USERNAME%pid.txt
+set /p PID=< %TEMP%\%USERNAME%pid.txt
+
+REM Configure Apache Ant
+set TESTED_ANT=C:\APPS\ant_1.7
+if exist %TESTED_ANT% (set ANT_HOME=%TESTED_ANT%)
+if not exist "%ANT_HOME%" ( echo *** Ant cannot be found & goto :errorstop )
+if not defined ANT_OPTS (
+	set ANT_OPTS=-Xmx896M -Dlog4j.configuration=com/nokia/log4j.xml
+)
+
+set SIGNALING_ANT_ARGS= -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor
+set DIAMONDS_ANT_ARGS= -listener com.nokia.helium.diamonds.ant.HeliumListener
+
+if not defined HLM_DISABLE_INTERNAL_DATA (
+set INTERNAL_DATA_ANT_ARGS= -listener com.nokia.ant.listener.internaldata.Listener
+echo Internal data listening enabled.
+)
+
+if not defined ANT_ARGS (
+set ANT_ARGS=-lib "%HELIUM_HOME%\extensions\nokia\external\antlibs" -lib "%HELIUM_HOME%\extensions\nokia\external\helium-nokia-antlib\bin" -lib "%HELIUM_HOME%\external\helium-antlib\bin" -lib "%HELIUM_HOME%\tools\common\java\lib" -lib "%HELIUM_HOME%\external\antlibs" -lib "%JEP_HOME%" -logger com.nokia.ant.HeliumLogger  %DIAMONDS_ANT_ARGS% %INTERNAL_DATA_ANT_ARGS% %SIGNALING_ANT_ARGS%
+)
+
+REM Shall we impose the EPOCROOT?
+if not defined EPOCROOT (
+set EPOCROOT=\
+)
+
+REM Symbian Build area path related settings
+set PATH=%PATH%;%EPOCROOT%epoc32\tools;%EPOCROOT%epoc32\gcc\bin;%EPOCROOT%epoc32\tools\build;%EPOCROOT%epoc32\rombuild
+
+REM Helium specific settings
+set PATH=%PATH%;%HELIUM_HOME%\tools\common\bin
+set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\doxygen
+set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\unxutils
+set PATH=%PATH%;%HELIUM_HOME%\external\filedisk
+set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\info-zip
+set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\Subversion\bin
+set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\graphviz\bin
+set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\LSC_5.2
+set PATH=%PATH%;\tools
+set PATH=%PATH%;\tools\ncp_tools
+set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\external\python\lib\2.5;%HELIUM_HOME%\tools\common\python\lib
+set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\extensions\nokia\external\python\lib\2.5
+set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\extensions\nokia\tools\common\python\lib;%SBS_HOME%\python
+set PERL5LIB=%HELIUM_HOME%\tools\common\packages
+set COPYCMD=/y
+set spp_tools=\tools\
+set ppd_tools=\tools\
+
+REM Should be done that SYMSEE?
+set PATH=%PATH%;C:\APPS\ctc
+
+REM Nokia specific
+set HOME=h:\
+set ARMROOT=\
+
+
+REM Setting the Visual Studio environment
+REM if not exist "%HELIUM_HOME%\tools\common\bin\call_vcvars32.bat" ( echo *** "%HELIUM_HOME%\tools\common\bin\call_vcvars32.bat" cannot be found & goto :errorstop )
+REM call "%HELIUM_HOME%\tools\common\bin\call_vcvars32.bat" > nul
+
+REM Manage RVCT switching.
+if defined HLM_RVCT_VERSION (
+if not exist "C:\APPS\rvct%HLM_RVCT_VERSION%\rvctcmdprompt.bat" ( echo *** "C:\APPS\rvct%HLM_RVCT_VERSION%\rvctcmdprompt.bat" cannot be found & goto :errorstop )
+call "C:\APPS\rvct%HLM_RVCT_VERSION%\rvctcmdprompt.bat" > nul
+)
+TITLE Helium
+
+call "%JAVA_HOME%\bin\java" -cp "%HELIUM_HOME%\tools\common\bin" CheckTools
+
+REM Call the Helium generated batch file if it exists
+REM This must match with the cache.dir property in helium.ant.xml
+set HELIUM_CACHE_DIR=%TEMP%\helium\%USERNAME%
+if not exist %HELIUM_CACHE_DIR% (
+md %HELIUM_CACHE_DIR%
+)
+
+REM pass cache dir to a property for log4j log file
+if defined ANT_OPTS (
+	set ANT_OPTS=%ANT_OPTS% -Dlog4j.cache.dir=%HELIUM_CACHE_DIR% -Dpython.path=%PYTHONPATH%;%HELIUM_HOME%\external\python\lib\2.5\jython-2.5-py2.5.egg
+)
+
+call "%HELIUM_HOME%\precompile_py.bat"
+
+call ant -Dhelium.dir="%HELIUM_HOME%" %*
+
+endlocal
+goto :eof
+
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/hlm.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+if (`alias module` != "") then
+    module load "java/1.6.0"
+    module load "tww/ant/1.7.1"
+    module load "tww/python/2.5.2"
+    module load "tww/p7zip/4.58"
+    module load "rvct/2.2_616"
+    module load "tww/graphviz/2.12"
+    module load mercurial
+endif
+
+setenv LANG en_US.UTF-8
+
+if (! $?HELIUM_HOME ) then
+    setenv HELIUM_HOME `pwd`
+endif
+
+setenv JEP_HOME $HELIUM_HOME/external/jep_1.6_2.5
+
+
+setenv ANT_ARGS "-lib $HELIUM_HOME/extensions/nokia/external/antlibs -lib $HELIUM_HOME/extensions/nokia/external/helium-nokia-antlib/bin -lib $HELIUM_HOME/external/helium-antlib/bin -lib $HELIUM_HOME/external/antlibs -lib $HELIUM_HOME/tools/common/java/lib -lib $JEP_HOME -logger com.nokia.ant.HeliumLogger -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor -listener com.nokia.helium.diamonds.ant.HeliumListener"
+
+setenv LD_LIBRARY_PATH $JEP_HOME
+if (-e /nokia/apps/tww/@sys/python252/lib/python2.5/config/libpython2.5.so) then
+    setenv LD_PRELOAD /nokia/apps/tww/@sys/python252/lib/python2.5/config/libpython2.5.so
+else
+    setenv LD_PRELOAD /usr/lib/libpython2.5.so.1
+endif
+
+setenv PYTHONPATH $HELIUM_HOME/external/python/lib/2.5/linux:$HELIUM_HOME/tools/common/python/lib:$HELIUM_HOME/extensions/nokia/external/python/lib/2.5:$HELIUM_HOME/extensions/nokia/tools/common/python/lib
+setenv JYTHONPATH "$HELIUM_HOME/external/python/lib/2.5/jython-2.5-py2.5.egg:$HELIUM_HOME/external/python/lib/2.5:$PYTHONPATH"
+setenv PERL5LIB $HELIUM_HOME/tools/common/packages
+
+setenv USERNAME $USER
+setenv TEMP /tmp/$USER
+if ($?HOST) then
+    setenv COMPUTERNAME $HOST
+else
+    setenv COMPUTERNAME `hostname`
+endif
+
+if (! $?EPOCROOT) then
+    setenv EPOCROOT /
+endif
+
+setenv SYMSEE_VERSION not_in_use
+setenv PID $$
+setenv HELIUM_CACHE_DIR $TEMP/helium/$USER
+setenv ANT_OPTS "-Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=$HELIUM_CACHE_DIR"
+ant -Dpython.cachedir=$HELIUM_HOME/temp -Dhelium.dir=$HELIUM_HOME -Dpython.path=$PYTHONPATH $* 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/4Suite-XML-1.0.2_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+
+   14: The 4Suite License, Version 1.1
+   15: -------------------------------
+   16: 
+   17: Copyright (c) 2000 Fourthought, Inc.  All rights reserved.
+   18: 
+   19: Redistribution and use in source and binary forms, with or without
+   20: modification, are permitted provided that the following conditions
+   21: are met:
+   22: 
+   23:  1. Redistributions of source code must retain the above copyright
+   24:     notice, this list of conditions and the following disclaimer.
+   25: 
+   26:  2. Redistributions in binary form must reproduce the above
+   27:     copyright notice, this list of conditions and the following
+   28:     disclaimer in the documentation and/or other materials provided
+   29:     with the distribution.
+   30: 
+   31:  3. The end-user documentation included with the redistribution,
+   32:     if any, must include the following acknowledgment:
+   33:        "This product includes software developed by
+   34:         Fourthought, Inc. (http://www.fourthought.com)."
+   35:     Alternately, this acknowledgment may appear in the software
+   36:     itself, if and wherever such third-party acknowledgments
+   37:     normally appear.
+   38: 
+   39:  4. The names "4Suite", "4Suite Server" and "Fourthought" must not
+   40:     be used to endorse or promote products derived from this
+   41:     software without prior written permission. For written
+   42:     permission, please contact info@fourthought.com.
+   43: 
+   44:  5. Products derived from this software may not be called "4Suite",
+   45:     nor may "4Suite" appear in their name, without prior written
+   46:     permission of Fourthought, Inc.
+   47: 
+   48: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   49: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   50: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+   51:  IN NO EVENT SHALL FOURTHOGHT, INC. OR ITS CONTRIBUTORS BE LIABLE
+   52: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   53: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   54: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+   55: BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   56: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   57: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   58: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   59: 
+   60: ===================================================================
+   61: 
+   62: This license is based on the Apache Software License, Version 1.1,
+   63: Copyright (c) 2000 The Apache Software Foundation.
+   64: All rights reserved.
+
+----
+
+    8: Copyright (c) 2000-2001 Alexandre Fayolle (France).
+    9: 
+   10: Permission to use, copy, modify, and distribute this software and its
+   11: documentation for any purpose and without fee is hereby granted,
+   12: provided that the above copyright notice appear in all copies and that
+   13: both that copyright notice and this permission notice appear in
+   14: supporting documentation.
+   15: 
+   16: THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+   17: OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   18: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+----
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/APACHE_LICENSE-2.0.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Amara-1.2.0.1-py2.5_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+
+Redistribution and use in source and binary forms, with 
+or without modification, are permitted provided that the 
+following conditions are met:
+
+   1. Redistributions of source code must retain the above 
+copyright notice, this list of conditions and the following 
+disclaimer.
+   2. 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.
+   3. The end-user documentation included with the 
+redistribution, if any, must include the following 
+acknowledgment: "This product includes software developed 
+by Uche Ogbuji (http://uche.ogbuji.net)." Alternately, this 
+acknowledgment may appear in the software itself, if and 
+wherever such third-party acknowledgments normally appear.
+   4. The names "Amara" and "Uche Ogbuji" must not be used 
+to endorse or promote products derived from this software 
+without prior written permission of Uche Ogbuji 
+(uche@ogbuji.net).
+   5. Products derived from this software may not be called 
+"Amara", nor may "Amara" appear in their name, without prior 
+written permission of Uche Ogbuji (uche.ogbuji@gmail.com).
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 FOURTHOGHT, INC. 
+OR ITS 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.
+
+====================================================================
+
+This license is based on the Apache Software License, Version 1.1, 
+Copyright (c) 2000 The Apache Software Foundation. 
+All rights reserved.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Apache Ant Contrib Tasks 1.0b2.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+
+1: /*
+    2:  * The Apache Software License, Version 1.1
+    3:  *
+    4:  * Copyright (c) 2001-2003 Ant-Contrib project.  All rights reserved.
+    5:  *
+    6:  * Redistribution and use in source and binary forms, with or without
+    7:  * modification, are permitted provided that the following conditions
+    8:  * are met:
+    9:  *
+   10:  * 1. Redistributions of source code must retain the above copyright
+   11:  *    notice, this list of conditions and the following disclaimer. 
+   12:  *
+   13:  * 2. Redistributions in binary form must reproduce the above copyright
+   14:  *    notice, this list of conditions and the following disclaimer in
+   15:  *    the documentation and/or other materials provided with the
+   16:  *    distribution.
+   17:  *
+   18:  * 3. The end-user documentation included with the redistribution, if
+   19:  *    any, must include the following acknowlegement:  
+   20:  *       "This product includes software developed by the 
+   21:  *        Ant-Contrib project (http://sourceforge.net/projects/ant-contrib)."
+   22:  *    Alternately, this acknowlegement may appear in the software itself,
+   23:  *    if and wherever such third-party acknowlegements normally appear.
+   24:  *
+   25:  * 4. The name Ant-Contrib must not be used to endorse or promote products 
+   26:  *    derived from this software without prior written permission. For
+   27:  *    written permission, please contact
+   28:  *    ant-contrib-developers@lists.sourceforge.net.
+   29:  *
+   30:  * 5. Products derived from this software may not be called "Ant-Contrib"
+   31:  *    nor may "Ant-Contrib" appear in their names without prior written
+   32:  *    permission of the Ant-Contrib project.
+   33:  *
+   34:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   35:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   36:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   37:  * DISCLAIMED.  IN NO EVENT SHALL THE ANT-CONTRIB PROJECT OR ITS
+   38:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   39:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   40:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   41:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   42:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   43:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   44:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   45:  * SUCH DAMAGE.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/BSD license.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+
+Copyright (c) <YEAR>, <OWNER>
+All rights reserved.
+
+Redistribution and use 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 
+	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 <ORGANIZATION> nor the 
+	names of its contributors may be used to endorse or 
+	promote products derived from this software without
+	specific rior written permission. 
+
+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.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/CDDL 1.0.1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,288 @@
+
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1.
+
+Definitions.
+
+1.1. Contributor means each individual or entity that creates or contributes to 
+the creation of Modifications.
+
+1.2. Contributor Version means the combination of the Original Software, prior 
+Modifications used by a Contributor (if any), and the Modifications made by that 
+particular Contributor.
+
+1.3. Covered Software means (a) the Original Software, or (b) Modifications, or 
+(c) the combination of files containing Original Software with files containing 
+Modifications, in each case including portions thereof.
+
+1.4. Executable means the Covered Software in any form other than Source Code.
+
+1.5. Initial Developer means the individual or entity that first makes Original 
+Software available under this License.
+
+1.6. Larger Work means a work which combines Covered Software or portions thereof 
+with code not governed by the terms of this License.
+
+1.7. License means this document.
+
+1.8. Licensable means having the right to grant, to the maximum extent possible, 
+whether at the time of the initial grant or subsequently acquired, any and all of 
+the rights conveyed herein.
+
+1.9. Modifications means the Source Code and Executable form of any of the 
+following: A. Any file that results from an addition to, deletion from or 
+modification of the contents of a file containing Original Software or previous 
+Modifications; B. Any new file that contains any part of the Original Software 
+or previous Modification; or C. Any new file that is contributed or otherwise 
+made available under the terms of this License.
+
+1.10. Original Software means the Source Code and Executable form of computer 
+software code that is originally released under this License.
+
+1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, 
+including without limitation, method, process, and apparatus claims, in any patent 
+Licensable by grantor.
+
+1.12. Source Code means (a) the common form of computer software code in which 
+modifications are made and (b) associated documentation included in or with such 
+code.
+
+1.13. You (or Your) means an individual or a legal entity exercising rights 
+under, and complying with all of the terms of, this License. For legal entities, 
+You includes any entity which controls, is controlled by, or is under common 
+control with You. For purposes of this definition, control means (a) the power, 
+direct or indirect, to cause the direction or management of such entity, whether 
+by contract or otherwise, or (b) ownership of more than fifty percent (50%) of 
+the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 
+3.1 below and subject to third party intellectual property claims, the Initial 
+Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark) 
+Licensable by Initial Developer, to use, reproduce, modify, display, perform, 
+sublicense and distribute the Original Software (or portions thereof), with or 
+without Modifications, and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making, using or selling of Original 
+Software, to make, have made, use, practice, sell, and offer for sale, and/or 
+otherwise dispose of the Original Software (or portions thereof);
+
+(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date 
+Initial Developer first distributes or otherwise makes the Original Software 
+available to a third party under the terms of this License;
+
+(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) 
+for code that You delete from the Original Software, or (2) for infringements 
+caused by: (i) the modification of the Original Software, or (ii) the 
+combination of the Original Software with other software or devices.
+
+2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 
+below and subject to third party intellectual property claims, each Contributor 
+hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark) 
+Licensable by Contributor to use, reproduce, modify, display, perform, 
+sublicense and distribute the Modifications created by such Contributor 
+(or portions thereof), either on an unmodified basis, with other Modifications, 
+as Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making, using, or selling of 
+Modifications made by that Contributor either alone and/or in combination with 
+its Contributor Version (or portions of such combination), to make, use, sell, 
+offer for sale, have made, and/or otherwise dispose of: (1) Modifications made 
+by that Contributor (or portions thereof); and (2) the combination of 
+Modifications made by that Contributor with its Contributor Version (or 
+portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the 
+date Contributor first distributes or otherwise makes the Modifications 
+available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent license is granted: 
+(1) for any code that Contributor has deleted from the Contributor Version; 
+(2) for infringements caused by: (i) third party modifications of Contributor 
+Version, or (ii) the combination of Modifications made by that Contributor 
+with other software (except as part of the Contributor Version) or other 
+devices; or 
+(3) under Patent Claims infringed by Covered Software in the absence of 
+Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code. Any Covered Software that You distribute 
+or otherwise make available in Executable form must also be made available 
+in Source Code form and that Source Code form must be distributed only under 
+the terms of this License. You must include a copy of this License with 
+every copy of the Source Code form of the Covered Software You distribute 
+or otherwise make available. You must inform recipients of any such Covered 
+Software in Executable form as to how they can obtain such Covered Software 
+in Source Code form in a reasonable manner on or through a medium customarily 
+used for software exchange.
+
+3.2. Modifications. The Modifications that You create or to which You 
+contribute are governed by the terms of this License. You represent that You 
+believe Your Modifications are Your original creation(s) and/or You have 
+sufficient rights to grant the rights conveyed by this License.
+
+3.3. Required Notices. You must include a notice in each of Your Modifications 
+that identifies You as the Contributor of the Modification. You may not remove 
+or alter any copyright, patent or trademark notices contained within the 
+Covered Software, or any notices of licensing or any descriptive text giving 
+attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms. You may not offer or impose any terms 
+on any Covered Software in Source Code form that alters or restricts the 
+applicable version of this License or the recipients rights hereunder. You 
+may choose to offer, and to charge a fee for, warranty, support, indemnity or 
+liability obligations to one or more recipients of Covered Software. However, 
+you may do so only on Your own behalf, and not on behalf of the Initial 
+Developer or any Contributor. You must make it absolutely clear that any such 
+warranty, support, indemnity or liability obligation is offered by You alone, 
+and You hereby agree to indemnify the Initial Developer and every Contributor 
+for any liability incurred by the Initial Developer or such Contributor as a 
+result of warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions. You may distribute the Executable 
+form of the Covered Software under the terms of this License or under the terms 
+of a license of Your choice, which may contain terms different from this 
+License, provided that You are in compliance with the terms of this License and 
+that the license for the Executable form does not attempt to limit or alter 
+the recipients rights in the Source Code form from the rights set forth in this 
+License. If You distribute the Covered Software in Executable form under a 
+different license, You must make it absolutely clear that any terms which 
+differ from this License are offered by You alone, not by the Initial Developer 
+or Contributor. You hereby agree to indemnify the Initial Developer and every 
+Contributor for any liability incurred by the Initial Developer or such 
+Contributor as a result of any such terms You offer.
+
+3.6. Larger Works. You may create a Larger Work by combining Covered Software 
+with other code not governed by the terms of this License and distribute the 
+Larger Work as a single product. In such a case, You must make sure the 
+requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and 
+may publish revised and/or new versions of this License from time to time. 
+Each version will be given a distinguishing version number. Except as provided 
+in Section 4.3, no one other than the license steward has the right to modify 
+this License.
+
+4.2. Effect of New Versions. You may always continue to use, distribute or 
+otherwise make the Covered Software available under the terms of the version 
+of the License under which You originally received the Covered Software. If 
+the Initial Developer includes a notice in the Original Software prohibiting 
+it from being distributed or otherwise made available under any subsequent 
+version of the License, You must distribute and make the Covered Software 
+available under the terms of the version of the License under which You 
+originally received the Covered Software. Otherwise, You may also choose to 
+use, distribute or otherwise make the Covered Software available under the 
+terms of any subsequent version of the License published by the license 
+steward.
+
+4.3. Modified Versions. When You are an Initial Developer and You want to 
+create a new license for Your Original Software, You may create and use a 
+modified version of this License if You: (a) rename the license and remove 
+any references to the name of the license steward (except to note that the 
+license differs from this License); and (b) otherwise make it clear that 
+the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE 
+ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
+INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE 
+OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. 
+THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE 
+IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, 
+YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF 
+ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY 
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE 
+IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will terminate automatically 
+if You fail to comply with terms herein and fail to cure such breach within 
+30 days of becoming aware of the breach. Provisions which, by their nature, 
+must remain in effect beyond the termination of this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding declaratory 
+judgment actions) against Initial Developer or a Contributor (the Initial 
+Developer or Contributor against whom You assert such claim is referred to 
+as Participant) alleging that the Participant Software (meaning the Contributor 
+Version where the Participant is a Contributor or the Original Software where 
+the Participant is the Initial Developer) directly or indirectly infringes any 
+patent, then any and all rights granted directly or indirectly to You by such 
+Participant, the Initial Developer (if the Initial Developer is not the 
+Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License 
+shall, upon 60 days notice from Participant terminate prospectively and 
+automatically at the expiration of such 60 day notice period, unless if within 
+such 60 day period You withdraw Your claim with respect to the Participant 
+Software against such Participant either unilaterally or pursuant to a written 
+agreement with Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user 
+licenses that have been validly granted by You or any distributor hereunder 
+prior to termination (excluding licenses granted to You by any distributor) 
+shall survive termination.
+
+7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, 
+WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE 
+INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED 
+SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON 
+FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER 
+INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, 
+WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL 
+DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE 
+POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO 
+LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE 
+TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO 
+NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, 
+SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item, as 
+that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial 
+computer software (as that term is defined at 48 C.F.R.  252.227-7014(a)(1)) 
+and commercial computer software documentation as such terms are used in 48 
+C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 
+227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users 
+acquire Covered Software with only those rights set forth herein. This U.S. 
+Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, 
+or other clause or provision that addresses Government rights in computer 
+software under this License.
+
+9. MISCELLANEOUS. This License represents the complete agreement concerning 
+subject matter hereof. If any provision of this License is held to be 
+unenforceable, such provision shall be reformed only to the extent necessary 
+to make it enforceable. This License shall be governed by the law of the 
+jurisdiction specified in a notice contained within the Original Software 
+(except to the extent applicable law, if any, provides otherwise), excluding 
+such jurisdictions conflict-of-law provisions. Any litigation relating to 
+this License shall be subject to the jurisdiction of the courts located in 
+the jurisdiction and venue specified in a notice contained within the Original 
+Software, with the losing party responsible for costs, including, without 
+limitation, court costs and reasonable attorneys fees and expenses. The 
+application of the United Nations Convention on Contracts for the 
+International Sale of Goods is expressly excluded. Any law or regulation 
+which provides that the language of a contract shall be construed against 
+the drafter shall not apply to this License. You agree that You alone are 
+responsible for compliance with the United States export administration 
+regulations (and the export control laws and regulation of any other 
+countries) when You use, distribute or otherwise make available any Covered 
+Software.
+
+10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the 
+Contributors, each party is responsible for claims and damages arising, 
+directly or indirectly, out of its utilization of rights under this License 
+and You agree to work with Initial Developer and Contributors to distribute 
+such responsibility on an equitable basis. Nothing herein is intended or 
+shall be deemed to constitute any admission of liability.
+
+NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION 
+LICENSE (CDDL) The code released under the CDDL shall be governed by the 
+laws of the State of California (excluding conflict-of-law provisions). 
+Any litigation relating to this License shall be subject to the jurisdiction 
+of the Federal Courts of the Northern District of California and the 
+state courts of the State of California, with venue lying in Santa Clara 
+County, California.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Common Public License Version 1.0.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,212 @@
+Common Public License Version 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+    a) in the case of the initial Contributor, the initial code and documentation
+    distributed under this Agreement, and
+
+    b) in the case of each subsequent Contributor:
+
+    i) changes to the Program, and
+
+    ii) additions to the Program;
+
+    where such changes and/or additions to the Program originate from and are
+    distributed by that particular Contributor. A Contribution 'originates' from
+    a Contributor if it was added to the Program by such Contributor itself or
+    anyone acting on such Contributor's behalf. Contributions do not include
+    additions to the Program which: (i) are separate modules of software
+    distributed in conjunction with the Program under their own license
+    agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including
+all Contributors.
+
+2. GRANT OF RIGHTS
+
+    a) Subject to the terms of this Agreement, each Contributor hereby grants
+    Recipient a non-exclusive, worldwide, royalty-free copyright license to
+    reproduce, prepare derivative works of, publicly display, publicly perform,
+    distribute and sublicense the Contribution of such Contributor, if any, and
+    such derivative works, in source code and object code form.
+
+    b) Subject to the terms of this Agreement, each Contributor hereby grants
+    Recipient a non-exclusive, worldwide, royalty-free patent license under
+    Licensed Patents to make, use, sell, offer to sell, import and otherwise
+    transfer the Contribution of such Contributor, if any, in source code and
+    object code form. This patent license shall apply to the combination of the
+    Contribution and the Program if, at the time the Contribution is added by
+    the Contributor, such addition of the Contribution causes such combination
+    to be covered by the Licensed Patents. The patent license shall not apply to
+    any other combinations which include the Contribution. No hardware per se is
+    licensed hereunder.
+
+    c) Recipient understands that although each Contributor grants the licenses
+    to its Contributions set forth herein, no assurances are provided by any
+    Contributor that the Program does not infringe the patent or other
+    intellectual property rights of any other entity. Each Contributor disclaims
+    any liability to Recipient for claims brought by any other entity based on
+    infringement of intellectual property rights or otherwise. As a condition to
+    exercising the rights and licenses granted hereunder, each Recipient hereby
+    assumes sole responsibility to secure any other intellectual property rights
+    needed, if any. For example, if a third party patent license is required to
+    allow Recipient to distribute the Program, it is Recipient's responsibility
+    to acquire that license before distributing the Program.
+
+    d) Each Contributor represents that to its knowledge it has sufficient
+    copyright rights in its Contribution, if any, to grant the copyright license
+    set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its
+own license agreement, provided that:
+
+    a) it complies with the terms and conditions of this Agreement; and
+
+    b) its license agreement:
+
+    i) effectively disclaims on behalf of all Contributors all warranties and
+    conditions, express and implied, including warranties or conditions of title
+    and non-infringement, and implied warranties or conditions of merchantability
+    and fitness for a particular purpose;
+
+    ii) effectively excludes on behalf of all Contributors all liability for
+    damages, including direct, indirect, special, incidental and consequential
+    damages, such as lost profits;
+
+    iii) states that any provisions which differ from this Agreement are offered
+    by that Contributor alone and not by any other party; and
+
+    iv) states that source code for the Program is available from such Contributor,
+    and informs licensees how to obtain it in a reasonable manner on or through
+    a medium customarily used for software exchange. 
+
+When the Program is made available in source code form:
+
+    a) it must be made available under this Agreement; and
+
+    b) a copy of this Agreement must be included with each copy of the Program. 
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore, if
+a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages
+and costs (collectively "Losses") arising from claims, lawsuits and other legal
+actions brought by a third party against the Indemnified Contributor to the
+extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product offering.
+The obligations in this section do not apply to any claims or Losses relating to
+any actual or alleged intellectual property infringement. In order to qualify,
+an Indemnified Contributor must: a) promptly notify the Commercial Contributor 
+n writing of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense and any related
+settlement negotiations. The Indemnified Contributor may participate in any such
+claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If that
+Commercial Contributor then makes performance claims, or offers warranties
+related to Product X, those performance claims and warranties are such Commercial
+Contributor's responsibility alone. Under this section, the Commercial
+Contributor would have to defend claims against the other Contributors related
+to those performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor must pay
+those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using
+and distributing the Program and assumes all risks associated with its exercise
+of rights under this Agreement, including but not limited to the risks and costs
+of program errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable
+law, it shall not affect the validity or enforceability of the remainder of the
+terms of this Agreement, and without further action by the parties hereto, such
+provision shall be reformed to the minimum extent necessary to make such
+provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to
+a patent applicable to software (including a cross-claim or counterclaim in a
+lawsuit), then any patent licenses granted by that Contributor to such Recipient
+under this Agreement shall terminate as of the date such litigation is filed.
+In addition, if Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted under
+Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply
+with any of the material terms or conditions of this Agreement and does not cure
+such failure in a reasonable period of time after becoming aware of such
+noncompliance. If all Recipient's rights under this Agreement terminate, Recipient
+agrees to cease use and distribution of the Program as soon as reasonably
+practicable. However, Recipient's obligations under this Agreement and any
+licenses granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be modified
+in the following manner. The Agreement Steward reserves the right to publish new
+versions (including revisions) of this Agreement from time to time. No one other
+than the Agreement Steward has the right to modify this Agreement. IBM is the
+initial Agreement Steward. IBM may assign the responsibility to serve as the
+Agreement Steward to a suitable separate entity. Each new version of the Agreement
+will be given a distinguishing version number. The Program (including Contributions)
+may always be distributed subject to the version of the Agreement under which it
+was received. In addition, after a new version of the Agreement is published,
+Contributor may elect to distribute the Program (including its Contributions)
+under the new version. Except as expressly stated in Sections 2(a) and 2(b) above,
+Recipient receives no rights or licenses to the intellectual property of any
+Contributor under this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this Agreement
+are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year after
+the cause of action arose. Each party waives its rights to a jury trial in any
+resulting litigation.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Commons HTTPClient 3.1_NOTICE.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,5 @@
+   1: Apache Jakarta HttpClient
+    2: Copyright 1999-2007 The Apache Software Foundation
+    3: 
+    4: This product includes software developed by
+    5: The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Jaxen 1.1.1_required_notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,266 @@
+    4:  Copyright 2003-2006 The Werken Company. All Rights Reserved.
+    5:  
+    6:  Redistribution and use in source and binary forms, with or without
+    7:  modification, are permitted provided that the following conditions are
+    8:  met:
+    9: 
+   10:   * Redistributions of source code must retain the above copyright
+   11:     notice, this list of conditions and the following disclaimer.
+   12: 
+   13:   * Redistributions in binary form must reproduce the above copyright
+   14:     notice, this list of conditions and the following disclaimer in the
+   15:     documentation and/or other materials provided with the distribution.
+   16: 
+   17:   * Neither the name of the Jaxen Project nor the names of its
+   18:     contributors may be used to endorse or promote products derived 
+   19:     from this software without specific prior written permission.
+   20: 
+   21: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   22: IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+   23: TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   24: PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+   25: OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   26: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   27: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   28: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   29: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   30: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   31: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   32: 
+   33:  */
+
+--
+
+    8:  * ====================================================================
+    9:  *
+   10:  * Copyright 2000-2005 bob mcwhirter & James Strachan.
+   11:  * All rights reserved.
+   12:  *
+   13:  *
+   14:  * Redistribution and use in source and binary forms, with or without
+   15:  * modification, are permitted provided that the following conditions are
+   16:  * met:
+   17:  * 
+   18:  *   * Redistributions of source code must retain the above copyright
+   19:  *     notice, this list of conditions and the following disclaimer.
+   20:  * 
+   21:  *   * Redistributions in binary form must reproduce the above copyright
+   22:  *     notice, this list of conditions and the following disclaimer in the
+   23:  *     documentation and/or other materials provided with the distribution.
+   24:  * 
+   25:  *   * Neither the name of the Jaxen Project nor the names of its
+   26:  *     contributors may be used to endorse or promote products derived 
+   27:  *     from this software without specific prior written permission.
+   28:  * 
+   29:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   30:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+   31:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   32:  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+   33:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   34:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   35:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   36:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   37:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   38:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   39:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   40:  *
+   41:  * ====================================================================
+
+--
+
+    4:  Copyright 2005 Elliotte Rusty Harold. All Rights Reserved.
+    5:  
+    6: Redistribution and use in source and binary forms, with or without
+    7: modification, are permitted provided that the following conditions are
+    8: met:
+    9: 
+   10:   * Redistributions of source code must retain the above copyright
+   11:     notice, this list of conditions and the following disclaimer.
+   12: 
+   13:   * Redistributions in binary form must reproduce the above copyright
+   14:     notice, this list of conditions and the following disclaimer in the
+   15:     documentation and/or other materials provided with the distribution.
+   16: 
+   17:   * Neither the name of the Jaxen Project nor the names of its
+   18:     contributors may be used to endorse or promote products derived 
+   19:     from this software without specific prior written permission.
+   20: 
+   21: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   22: IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+   23: TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   24: PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+   25: OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   26: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   27: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   28: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   29: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   30: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   31: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   32: 
+   33:  */
+
+--
+
+    5:  * Copyright 2000-2004 Jason Hunter & Brett McLaughlin.
+    6:  * All rights reserved.
+    7:  *
+    8:  * Redistribution and use in source and binary forms, with or without
+    9:  * modification, are permitted provided that the following conditions are
+   10:  * met:
+   11:  * 
+   12:  *   * Redistributions of source code must retain the above copyright
+   13:  *     notice, this list of conditions and the following disclaimer.
+   14:  * 
+   15:  *   * Redistributions in binary form must reproduce the above copyright
+   16:  *     notice, this list of conditions and the following disclaimer in the
+   17:  *     documentation and/or other materials provided with the distribution.
+   18:  * 
+   19:  *   * Neither the name of the Jaxen Project nor the names of its
+   20:  *     contributors may be used to endorse or promote products derived 
+   21:  *     from this software without specific prior written permission.
+   22:  * 
+   23:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   24:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+   25:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   26:  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+   27:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   28:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   29:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   30:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   31:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   32:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   33:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   34:  *
+   35:  * ====================================================================
+
+--
+
+    6:  * ====================================================================
+    7:  *
+    8:  * Copyright 2007 Elliotte Rusty Harold
+    9:  * All rights reserved.
+   10:  *
+   11:  * Redistribution and use in source and binary forms, with or without
+   12:  * modification, are permitted provided that the following conditions are
+   13:  * met:
+   14:  * 
+   15:  *   * Redistributions of source code must retain the above copyright
+   16:  *     notice, this list of conditions and the following disclaimer.
+   17:  * 
+   18:  *   * Redistributions in binary form must reproduce the above copyright
+   19:  *     notice, this list of conditions and the following disclaimer in the
+   20:  *     documentation and/or other materials provided with the distribution.
+   21:  * 
+   22:  *   * Neither the name of the Jaxen Project nor the names of its
+   23:  *     contributors may be used to endorse or promote products derived 
+   24:  *     from this software without specific prior written permission.
+   25:  * 
+   26:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   27:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+   28:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   29:  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+   30:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   31:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   32:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   33:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   34:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   35:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   36:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   37:  *
+   38:  * ====================================================================
+
+--
+
+   13:  * ====================================================================
+   14:  *
+   15:  * Copyright (C) 2000-2002 bob mcwhirter &amp; James Strachan.
+   16:  * All rights reserved.
+   17:  *
+   18:  * Redistribution and use in source and binary forms, with or without
+   19:  * modification, are permitted provided that the following conditions
+   20:  * are met:
+   21:  *
+   22:  * 1. Redistributions of source code must retain the above copyright
+   23:  *    notice, this list of conditions, and the following disclaimer.
+   24:  *
+   25:  * 2. Redistributions in binary form must reproduce the above copyright
+   26:  *    notice, this list of conditions, and the disclaimer that follows
+   27:  *    these conditions in the documentation and/or other materials
+   28:  *    provided with the distribution.
+   29:  *
+   30:  * 3. The name "Jaxen" must not be used to endorse or promote products
+   31:  *    derived from this software without prior written permission.  For
+   32:  *    written permission, please contact license@jaxen.org.
+   33:  *
+   34:  * 4. Products derived from this software may not be called "Jaxen", nor
+   35:  *    may "Jaxen" appear in their name, without prior written permission
+   36:  *    from the Jaxen Project Management (pm@jaxen.org).
+   37:  *
+   38:  * In addition, we request (but do not require) that you include in the
+   39:  * end-user documentation provided with the redistribution and/or in the
+   40:  * software itself an acknowledgement equivalent to the following:
+   41:  *     "This product includes software developed by the
+   42:  *      Jaxen Project (http://www.jaxen.org/)."
+   43:  * Alternatively, the acknowledgment may be graphical using the logos
+   44:  * available at http://www.jaxen.org/
+   45:  *
+   46:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   47:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   48:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   49:  * DISCLAIMED.  IN NO EVENT SHALL THE Jaxen AUTHORS OR THE PROJECT
+   50:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   51:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   52:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   53:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   54:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   55:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   56:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   57:  * SUCH DAMAGE.
+   58:  *
+   59:  * ====================================================================
+
+
+Copyright © 1994-2000 World Wide Web Consortium, (Massachusetts Institute of Technology, 
+Institut National de Recherche en Informatique et en Automatique, Keio University). 
+All Rights Reserved. http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related items) is 
+being provided by the copyright holders under the following license. By obtaining, 
+using and/or copying this work, you (the licensee) agree that you have read, understood, 
+and will comply with the following terms and conditions:
+
+Permission to use, copy, and modify this software and its documentation, with or without 
+modification,  for any purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and documentation or portions 
+thereof, including modifications, that you make:
+
+   1. The full text of this NOTICE in a location viewable to users of the redistributed or 
+	derivative work.
+   2. Any pre-existing intellectual property disclaimers, notices, or terms and conditions. 
+	If none exist, a short notice of the following form (hypertext is preferred, text 
+	is permitted) should be used within the body of any redistributed or derivative 
+	code: "Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts 
+	Institute of Technology, Institut National de Recherche en Informatique et en 
+	Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/
+	Legal/"
+   3. Notice of any changes or modifications to the W3C files, including the date changes 
+	were made. (We recommend you provide URIs to the location from which the code is 
+	derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO 
+EPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, 
+WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF 
+THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, 
+TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL 
+DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising or publicity 
+pertaining to the software without specific, written prior permission. Title to copyright 
+in this software and any associated documentation will at all times remain with copyright 
+holders.
+
+
DOCUMENTTYPE

6 (6)




TypeUnitOrDepartmentHere



TypeYourNameHere
TypeDateHere
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Jinja2-2.1.1_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+
+    1: Copyright (c) 2006-2008 by the respective authors (see AUTHORS file).
+    2: All rights reserved.
+    3: 
+    4: Redistribution and use in source and binary forms, with or without
+    5: modification, are permitted provided that the following conditions are
+    6: met:
+    7: 
+    8:     * Redistributions of source code must retain the above copyright
+    9:       notice, this list of conditions and the following disclaimer.
+   10: 
+   11:     * Redistributions in binary form must reproduce the above
+   12:       copyright notice, this list of conditions and the following
+   13:       disclaimer in the documentation and/or other materials provided
+   14:       with the distribution.
+   15: 
+   16:     * The names of the contributors may not be used to endorse or
+   17:       promote products derived from this software without specific
+   18:       prior written permission.
+   19: 
+   20: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   21: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   22: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   23: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+   24: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   25: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   26: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+   27: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+   28: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   29: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+   30: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Jinja2-2.1.1/AUTHORS:
+
+    1: Jinja is written and maintained by Armin Ronacher <armin.ronacher@active-4.com>.
+    2: 
+    3: Other contributors (as mentionend in :copyright:s) are:
+    4: 
+    5: - Armin Ronacher <armin.ronacher@active-4.com>
+    6: - Georg Brandl
+    7: - Lawrence Journal-World.
+    8: - Bryan McLemore
+    9: - Mickaël Guérin <kael@crocobox.org>
+   10: - Cameron Knight
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/MIT license.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+
+The MIT License
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/Mozilla 1.1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,470 @@
+
+  			  MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/NOTICE	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+Helium
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/SUN PUBLIC LICENSE Version 1-1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,471 @@
+                        SUN PUBLIC LICENSE Version 1.0 
+
+                        1. Definitions. 
+
+                                1.0.1. "Commercial Use" means distribution or otherwise making the 
+                                Covered Code available to a third party. 
+
+                                1.1. "Contributor" means each entity that creates or contributes to 
+                                the creation of Modifications. 
+
+                                1.2. "Contributor Version" means the combination of the Original Code, 
+                                prior Modifications used by a Contributor, and the Modifications made 
+                                by that particular Contributor. 
+
+                                1.3. "Covered Code" means the Original Code or Modifications or the 
+                                combination of the Original Code and Modifications, in each case 
+                                including portions thereof and corresponding documentation released 
+                                with the source code. 
+
+                                1.4. "Electronic Distribution Mechanism" means a mechanism generally 
+                                accepted in the software development community for the electronic 
+                                transfer of data. 
+
+                                1.5. "Executable" means Covered Code in any form other than Source 
+                                Code. 
+
+                                1.6. "Initial Developer" means the individual or entity identified as 
+                                the Initial Developer in the Source Code notice required by Exhibit A. 
+
+                                1.7. "Larger Work" means a work which combines Covered Code or 
+                                portions thereof with code not governed by the terms of this License. 
+
+                                1.8. "License" means this document. 
+
+                                1.8.1. "Licensable" means having the right to grant, to the maximum 
+                                extent possible, whether at the time of the initial grant or 
+                                subsequently acquired, any and all of the rights conveyed herein. 
+
+                                1.9. "Modifications" means any addition to or deletion from the 
+                                substance or structure of either the Original Code or any previous 
+                                Modifications. When Covered Code is released as a series of files, a 
+                                Modification is: 
+
+                                A. Any addition to or deletion from the contents of a file containing 
+                                Original Code or previous Modifications. 
+
+                                B. Any new file that contains any part of the Original Code or 
+                                previous Modifications. 
+
+                                1.10. "Original Code" means Source Code of computer software code 
+                                which is described in the Source Code notice required by Exhibit A as 
+                                Original Code, and which, at the time of its release under this 
+                                License is not already Covered Code governed by this License. 
+
+                                1.10.1. "Patent Claims" means any patent claim(s), now owned or 
+                                hereafter acquired, including without limitation, method, process, and 
+                                apparatus claims, in any patent Licensable by grantor. 
+
+                                1.11. "Source Code" means the preferred form of the Covered Code for 
+                                making modifications to it, including all modules it contains, plus 
+                                any associated documentation, interface definition files, scripts used 
+                                to control compilation and installation of an Executable, or source 
+                                code differential comparisons against either the Original Code or 
+                                another well known, available Covered Code of the Contributor's 
+                                choice. The Source Code can be in a compressed or archival form, 
+                                provided the appropriate decompression or de-archiving software is 
+                                widely available for no charge. 
+
+                                1.12. "You" (or "Your") means an individual or a legal entity 
+                                exercising rights under, and complying with all of the terms of, this 
+                                License or a future version of this License issued under Section 6.1. 
+                                For legal entities, "You" includes any entity which controls, is 
+                                controlled by, or is under common control with You. For purposes of 
+                                this definition, "control" means (a) the power, direct or indirect, to 
+                                cause the direction or management of such entity, whether by contract 
+                                or otherwise, or (b) ownership of more than fifty percent (50%) of the 
+                                outstanding shares or beneficial ownership of such entity.
+
+                        2. Source Code License. 
+
+                        2.1 The Initial Developer Grant. 
+
+                                The Initial Developer hereby grants You a world-wide, royalty-free, 
+                                non-exclusive license, subject to third party intellectual property 
+                                claims: 
+
+                                (a)  under intellectual property rights (other than patent or 
+                                trademark) Licensable by Initial Developer to use, reproduce, modify, 
+                                display, perform, sublicense and distribute the Original Code (or 
+                                portions thereof) with or without Modifications, and/or as part of a 
+                                Larger Work; and 
+
+                                (b) under Patent Claims infringed by the making, using or selling of 
+                                Original Code, to make, have made, use, practice, sell, and offer for 
+                                sale, and/or otherwise dispose of the Original Code (or portions 
+                                thereof). 
+
+                                (c) the licenses granted in this Section 2.1(a) and (b) are effective 
+                                on the date Initial Developer first distributes Original Code under 
+                                the terms of this License. 
+
+                                (d) Notwithstanding Section 2.1(b) above, no patent license is 
+                                granted: 1)     for code that You delete from the Original Code; 2) 
+                                separate from the       Original Code; or 3) for infringements caused by: 
+                                i) the modification of the Original Code or ii) the combination of the 
+                                Original Code with other software or devices. 
+
+                        2.2. Contributor Grant. 
+
+                                Subject to third party intellectual property claims, each Contributor 
+                                hereby grants You a world-wide, royalty-free, non-exclusive license 
+
+                                (a) under intellectual property rights (other than patent or 
+                                trademark) Licensable by Contributor, to use, reproduce,  modify, 
+                                display, perform, sublicense and distribute the Modifications created 
+                                by such Contributor (or portions thereof) either on an unmodified 
+                                basis, with other Modifications, as Covered Code and/or as part of a 
+                                Larger Work; and 
+
+                                (b) under Patent Claims infringed by the making, using, or selling of  
+                                Modifications made by that Contributor either alone and/or in 
+                                combination with its Contributor Version (or portions of such 
+                                combination), to make, use, sell, offer for sale, have made, and/or 
+                                otherwise dispose of: 1) Modifications made by that Contributor (or 
+                                portions thereof); and 2) the combination of Modifications made by 
+                                that Contributor with its Contributor Version (or portions of such 
+                                combination). 
+
+                                (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective 
+                                on the date Contributor first makes Commercial Use of the Covered 
+                                Code. 
+
+                                (d)  notwithstanding Section 2.2(b) above, no patent license is 
+                                granted: 1) for any code that Contributor has deleted from the 
+                                Contributor Version; 2)  separate from the Contributor Version; 3) for 
+                                infringements caused by: i) third party modifications of Contributor 
+                                Version or ii) the combination of Modifications made by that 
+                                Contributor with other software (except as part of the Contributor 
+                                Version) or other devices; or 4) under Patent Claims infringed by 
+                                Covered Code in the absence of Modifications made by that Contributor.
+
+                        3. Distribution Obligations. 
+
+                        3.1. Application of License.
+
+                                The Modifications which You create or to which You contribute are 
+                                governed by the terms of this License, including without limitation 
+                                Section 2.2. The Source Code version of Covered Code may be 
+                                distributed only under the terms of this License or a future version 
+                                of this License released under Section 6.1, and You must include a 
+                                copy of this License with every copy of the Source Code You 
+                                distribute. You may not offer or impose any terms on any Source Code 
+                                version that alters or restricts the applicable version of this 
+                                License or the recipients' rights hereunder. However, You may include 
+                                an additional document offering the additional rights described in 
+                                Section 3.5. 
+
+                        3.2. Availability of Source Code.
+
+                                Any Modification which You create or to which You contribute must be 
+                                made available in Source Code form under the terms of this License 
+                                either on the same media as an Executable version or via an accepted 
+                                Electronic Distribution Mechanism to anyone to whom you made an 
+                                Executable version available; and if made available via Electronic 
+                                Distribution Mechanism, must remain available for at least twelve (12) 
+                                months after the date it initially became available, or at least six 
+                                (6) months after a subsequent version of that particular Modification 
+                                has been made available to such recipients. You are responsible for 
+                                ensuring that the Source Code version remains available even if the 
+                                Electronic Distribution Mechanism is maintained by a third party. 
+
+                        3.3. Description of Modifications.
+
+                                You must cause all Covered Code to which You contribute to contain a 
+                                file documenting the changes You made to create that Covered Code and 
+                                the date of any change. You must include a prominent statement that 
+                                the Modification is derived, directly or indirectly, from Original 
+                                Code provided by the Initial Developer and including the name of the 
+                                Initial Developer in (a) the Source Code, and (b) in any notice in an 
+                                Executable version or related documentation in which You describe the 
+                                origin or ownership of the Covered Code. 
+
+                        3.4. Intellectual Property Matters.
+
+                                (a) Third Party Claims.
+
+                                If Contributor has knowledge that a license under a third party's 
+                                intellectual property rights is required to exercise the rights 
+                                granted by such Contributor under Sections 2.1 or 2.2, Contributor 
+                                must include a text file with the Source Code distribution titled 
+                                "LEGAL'' which describes the claim and the party making the claim in 
+                                sufficient detail that a recipient will know whom to contact. If 
+                                Contributor obtains such knowledge after the Modification is made 
+                                available as described in Section 3.2, Contributor shall promptly 
+                                modify the LEGAL file in all copies Contributor makes available 
+                                thereafter and shall take other steps (such as notifying appropriate 
+                                mailing lists or newsgroups) reasonably calculated to inform those who 
+                                received the Covered Code that new knowledge has been obtained. 
+
+                                (b) Contributor APIs.
+
+                                If Contributor's Modifications include an application programming 
+                                interface ("API") and Contributor has knowledge of patent licenses 
+                                which are reasonably necessary to implement that API, Contributor must 
+                                also include this information in the LEGAL file. 
+
+                                (c) Representations.
+
+                                Contributor represents that, except as disclosed pursuant to Section 
+                                3.4(a) above, Contributor believes that Contributor's Modifications 
+                                are Contributor's original creation(s) and/or Contributor has 
+                                sufficient rights to grant the rights conveyed by this License.
+
+                        3.5. Required Notices.
+
+                                You must duplicate the notice in Exhibit A in each file of the Source 
+                                Code. If it is not possible to put such notice in a particular Source 
+                                Code file due to its structure, then You must include such notice in a 
+                                location (such as a relevant directory) where a user would be likely 
+                                to look for such a notice.  If You created one or more Modification(s) 
+                                You may add your name as a Contributor to the notice described in 
+                                Exhibit A. You must also duplicate this License in any documentation 
+                                for the Source Code where You describe recipients' rights or ownership 
+                                rights relating to Covered Code. You may choose to offer, and to 
+                                charge a fee for, warranty, support, indemnity or liability 
+                                obligations to one or more recipients of Covered Code. However, You 
+                                may do so only on Your own behalf, and not on behalf of the Initial 
+                                Developer or any Contributor. You must make it absolutely clear than 
+                                any such warranty, support, indemnity or liability obligation is 
+                                offered by You alone, and You hereby agree to indemnify the Initial 
+                                Developer and every Contributor for any liability incurred by the 
+                                Initial Developer or such Contributor as a result of warranty, 
+                                support, indemnity or liability terms You offer. 
+
+                        3.6. Distribution of Executable Versions.
+
+                                You may distribute Covered Code in Executable form only if the 
+                                requirements of Section 3.1-3.5 have been met for that Covered Code, 
+                                and if You include a notice stating that the Source Code version of 
+                                the Covered Code is available under the terms of this License, 
+                                including a description of how and where You have fulfilled the 
+                                obligations of Section 3.2. The notice must be conspicuously included 
+                                in any notice in an Executable version, related documentation or 
+                                collateral in which You describe recipients' rights relating to the 
+                                Covered Code. You may distribute the Executable version of Covered 
+                                Code or ownership rights under a license of Your choice, which may 
+                                contain terms different from this License, provided that You are in 
+                                compliance with the terms of this License and that the license for the 
+                                Executable version does not attempt to limit or alter the recipient's 
+                                rights in the Source Code version from the rights set forth in this 
+                                License. If You distribute the Executable version under a different 
+                                license You must make it absolutely clear that any terms which differ 
+                                from this License are offered by You alone, not by the Initial 
+                                Developer or any Contributor. You hereby agree to indemnify the 
+                                Initial Developer and every Contributor for any liability incurred by 
+                                the Initial Developer or such Contributor as a result of any such 
+                                terms You offer. 
+
+                        3.7. Larger Works.
+
+                                You may create a Larger Work by combining Covered Code with other code 
+                                not governed by the terms of this License and distribute the Larger 
+                                Work as a single product. In such a case, You must make sure the 
+                                requirements of this License are fulfilled for the Covered Code.
+
+                        4. Inability to Comply Due to Statute or Regulation. 
+
+                                If it is impossible for You to comply with any of the terms of this 
+                                License with respect to some or all of the Covered Code due to 
+                                statute, judicial order, or regulation then You must: (a) comply with 
+                                the terms of this License to the maximum extent possible; and (b) 
+                                describe the limitations and the code they affect. Such description 
+                                must be included in the LEGAL file described in Section 3.4 and must 
+                                be included with all distributions of the Source Code. Except to the 
+                                extent prohibited by statute or regulation, such description must be 
+                                sufficiently detailed for a recipient of ordinary skill to be able to 
+                                understand it.
+
+                        5. Application of this License. 
+
+                                This License applies to code to which the Initial Developer has 
+                                attached the notice in Exhibit A and to related Covered Code.
+
+                        6. Versions of the License. 
+
+                        6.1. New Versions.
+
+                                Sun Microsystems, Inc. ("Sun") may publish revised and/or new versions 
+                                of the License from time to time. Each version will be given a 
+                                distinguishing version number. 
+
+                        6.2. Effect of New Versions.
+
+                                Once Covered Code has been published under a particular version of the 
+                                License, You may always continue to use it under the terms of that 
+                                version. You may also choose to use such Covered Code under the terms 
+                                of any subsequent version of the License published by Sun. No one 
+                                other than Sun has the right to modify the terms applicable to Covered 
+                                Code created under this License. 
+
+                        6.3. Derivative Works.
+
+                                If You create or use a modified version of this License (which you may 
+                                only do in order to apply it to code which is not already Covered Code 
+                                governed by this License), You must: (a) rename Your license so that 
+                                the phrases "Sun," "Sun Public License," or "SPL" or any confusingly 
+                                similar phrase do not appear in your license (except to note that your 
+                                license differs from this License) and (b) otherwise make it clear 
+                                that Your version of the license contains terms which differ from the 
+                                Sun Public License. (Filling in the name of the Initial Developer, 
+                                Original Code or Contributor in the notice described in Exhibit A 
+                                shall not of themselves be deemed to be modifications of this 
+                                License.)
+
+                        7. DISCLAIMER OF WARRANTY. 
+
+                                COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS, 
+                                WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 
+                                WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF 
+                                DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. 
+                                THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE 
+                                IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, 
+                                YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE 
+                                COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER 
+                                OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF 
+                                ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+                        8. TERMINATION. 
+
+                                8.1. This License and the rights granted hereunder will terminate 
+                                automatically if You fail to comply with terms herein and fail to cure 
+                                such breach within 30 days of becoming aware of the breach. All 
+                                sublicenses to the Covered Code which are properly granted shall 
+                                survive any termination of this License. Provisions which, by their 
+                                nature, must remain in effect beyond the termination of this License 
+                                shall survive. 
+
+                                8.2. If You initiate litigation by asserting a patent infringement 
+                                claim (excluding declaratory judgment actions) against Initial Developer 
+                                or a Contributor (the Initial Developer or Contributor against whom 
+                                You file such action is referred to as "Participant")  alleging that: 
+
+                                (a) such Participant's Contributor Version directly or indirectly 
+                                infringes any patent, then any and all rights granted by such 
+                                Participant to You under Sections 2.1 and/or 2.2 of this License 
+                                shall, upon 60 days notice from Participant terminate prospectively, 
+                                unless if within 60 days after receipt of notice You either: (i)  
+                                agree in writing to pay Participant a mutually agreeable reasonable 
+                                royalty for Your past and future use of Modifications made by such 
+                                Participant, or (ii) withdraw Your litigation claim with respect to 
+                                the Contributor Version against such Participant.  If within 60 days 
+                                of notice, a reasonable royalty and payment arrangement are not 
+                                mutually agreed upon in writing by the parties or the litigation claim 
+                                is not withdrawn, the rights granted by Participant to You under 
+                                Sections 2.1 and/or 2.2 automatically terminate at the expiration of 
+                                the 60 day notice period specified above. 
+
+                                (b) any software, hardware, or device, other than such Participant's 
+                                Contributor Version, directly or indirectly infringes any patent, then 
+                                any rights granted to You by such Participant under Sections 2.1(b) 
+                                and 2.2(b) are revoked effective as of the date You first made, used, 
+                                sold, distributed, or had made, Modifications made by that 
+                                Participant. 
+
+                                8.3. If You assert a patent infringement claim against Participant 
+                                alleging that such Participant's Contributor Version directly or 
+                                indirectly infringes any patent where such claim is resolved (such as 
+                                by license or settlement) prior to the initiation of patent 
+                                infringement litigation, then the reasonable value of the licenses 
+                                granted by such Participant under Sections 2.1 or 2.2 shall be taken 
+                                into account in determining the amount or value of any payment or 
+                                license. 
+
+                                8.4. In the event of termination under Sections 8.1 or 8.2 above,  all 
+                                end user license agreements (excluding distributors and resellers) 
+                                which have been validly granted by You or any distributor hereunder 
+                                prior to termination shall survive termination.
+
+                        9. LIMITATION OF LIABILITY. 
+
+                                UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT 
+                                (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL 
+                                DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, 
+                                OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR 
+                                ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY 
+                                CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, 
+                                WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER 
+                                COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN 
+                                INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF 
+                                LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY 
+                                RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW 
+                                PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE 
+                                EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO 
+                                THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+                        10. U.S. GOVERNMENT END USERS. 
+
+                                The Covered Code is a "commercial item," as that term is defined in 48 
+                                C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" 
+                                and "commercial computer software documentation," as such terms are 
+                                used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 
+                                12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all 
+                                U.S. Government End Users acquire Covered Code with only those rights 
+                                set forth herein.
+
+                        11. MISCELLANEOUS. 
+
+                                This License represents the complete agreement concerning subject 
+                                matter hereof. If any provision of this License is held to be 
+                                unenforceable, such provision shall be reformed only to the extent 
+                                necessary to make it enforceable. This License shall be governed by 
+                                California law provisions (except to the extent applicable law, if 
+                                any, provides otherwise), excluding its conflict-of-law provisions. 
+                                With respect to disputes in which at least one party is a citizen of, 
+                                or an entity chartered or registered to do business in the United 
+                                States of America, any litigation relating to this License shall be 
+                                subject to the jurisdiction of the Federal Courts of the Northern 
+                                District of California, with venue lying in Santa Clara County, 
+                                California, with the losing party responsible for costs, including 
+                                without limitation, court costs and reasonable attorneys' fees and 
+                                expenses. The application of the United Nations Convention on 
+                                Contracts for the International Sale of Goods is expressly excluded. 
+                                Any law or regulation which provides that the language of a contract 
+                                shall be construed against the drafter shall not apply to this 
+                                License.
+
+                        12. RESPONSIBILITY FOR CLAIMS. 
+
+                                As between Initial Developer and the Contributors, each party is 
+                                responsible for claims and damages arising, directly or indirectly, 
+                                out of its utilization of rights under this License and You agree to 
+                                work with Initial Developer and Contributors to distribute such 
+                                responsibility on an equitable basis. Nothing herein is intended or 
+                                shall be deemed to constitute any admission of liability.
+
+                        13. MULTIPLE-LICENSED CODE. 
+
+                                Initial Developer may designate portions of the Covered Code as 
+                                ?Multiple-Licensed?. ?Multiple-Licensed? means that the Initial 
+                                Developer permits you to utilize portions of the Covered Code under 
+                                Your choice of the alternative licenses, if any, specified by the 
+                                Initial Developer in the file described in Exhibit A.
+
+                        Exhibit A -Sun Public License Notice. 
+
+                                The contents of this file are subject to the Sun Public License 
+                                Version 1.0 (the "License"); you may not use this file except in 
+                                compliance with the License. A copy of the License is available at 
+                                http://www.sun.com/
+
+                                The Original Code is _________________. The Initial Developer of the 
+                                Original Code is ___________. Portions created by ______ are Copyright 
+                                (C)_________. All Rights Reserved.
+
+                                Contributor(s): ______________________________________. 
+
+                                Alternatively, the contents of this file may be used under the terms 
+                                of the _____ license (the  ?[___] License?), in which case the 
+                                provisions of [______] License are applicable  instead of those above.  
+                                If you wish to allow use of your version of this file only under the 
+                                terms of the [____] License and not to allow others to use your 
+                                version of this file under the SPL, indicate your decision by deleting  
+                                the provisions above and replace  them with the notice and other 
+                                provisions required by the [___] License. If you do not delete the 
+                                provisions above, a recipient may use your version of this file under 
+                                either the SPL or the [___] License." 
+
+                                [NOTE: The text of this Exhibit A may differ slightly from the text of 
+                                the notices in the Source Code files of the Original Code. You should 
+                                use the text of this Exhibit A rather than the text found in the 
+                                Original Code Source Code for Your Modifications.]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/The Apache Software License, Version 1.1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+    6:  * ====================================================================
+    7:  *
+    8:  * The Apache Software License, Version 1.1
+    9:  *
+   10:  * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
+   11:  * reserved.
+   12:  *
+   13:  * Redistribution and use in source and binary forms, with or without
+   14:  * modification, are permitted provided that the following conditions
+   15:  * are met:
+   16:  *
+   17:  * 1. Redistributions of source code must retain the above copyright
+   18:  *    notice, this list of conditions and the following disclaimer.
+   19:  *
+   20:  * 2. Redistributions in binary form must reproduce the above copyright
+   21:  *    notice, this list of conditions and the following disclaimer in
+   22:  *    the documentation and/or other materials provided with the
+   23:  *    distribution.
+   24:  *
+   25:  * 3. The end-user documentation included with the redistribution, if
+   26:  *    any, must include the following acknowlegement:
+   27:  *       "This product includes software developed by the
+   28:  *        Apache Software Foundation (http://www.apache.org/)."
+   29:  *    Alternately, this acknowlegement may appear in the software itself,
+   30:  *    if and wherever such third-party acknowlegements normally appear.
+   31:  *
+   32:  * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+   33:  *    Foundation" must not be used to endorse or promote products derived
+   34:  *    from this software without prior written permission. For written
+   35:  *    permission, please contact apache@apache.org.
+   36:  *
+   37:  * 5. Products derived from this software may not be called "Apache"
+   38:  *    nor may "Apache" appear in their names without prior written
+   39:  *    permission of the Apache Group.
+   40:  *
+   41:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   42:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   43:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   44:  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+   45:  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   46:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   47:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   48:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   49:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   50:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   51:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   52:  * SUCH DAMAGE.
+   53:  * ====================================================================
+   54:  *
+   55:  * This software consists of voluntary contributions made by many
+   56:  * individuals on behalf of the Apache Software Foundation.  For more
+   57:  * information on the Apache Software Foundation, please see
+   58:  * <http://www.apache.org/>.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/apache-ivy-2.0.0-beta2_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+
+  205: License for JCraft JSch package
+  206: ------------------------------------------------------------------------------
+  207: Copyright (c) 2002,2003,2004,2005,2006,2007 Atsuhiko Yamanaka, JCraft,Inc. 
+       Copyright (c) Christian Plattner
+  208: All rights reserved.
+  209: 
+  210: Redistribution and use in source and binary forms, with or without
+  211: modification, are permitted provided that the following conditions are met:
+  212: 
+  213:   1. Redistributions of source code must retain the above copyright notice,
+  214:      this list of conditions and the following disclaimer.
+  215: 
+  216:   2. Redistributions in binary form must reproduce the above copyright 
+  217:      notice, this list of conditions and the following disclaimer in 
+  218:      the documentation and/or other materials provided with the distribution.
+  219: 
+  220:   3. The names of the authors may not be used to endorse or promote products
+  221:      derived from this software without specific prior written permission.
+  222: 
+  223: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+  224: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+  225: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+  226: INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+  227: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  228: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+  229: OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  230: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  231: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  232: EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/asm-2.2.1_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+
+    2:  ASM: a very small and fast Java bytecode manipulation framework
+    3:  Copyright (c) 2000-2005 INRIA, France Telecom
+    4:  Copyright (c) 2004, Eugene Kuleshov
+    4:  All rights reserved.
+    5: 
+    6:  Redistribution and use in source and binary forms, with or without
+    7:  modification, are permitted provided that the following conditions
+    8:  are met:
+    9:  1. Redistributions of source code must retain the above copyright
+   10:     notice, this list of conditions and the following disclaimer.
+   11:  2. Redistributions in binary form must reproduce the above copyright
+   12:     notice, this list of conditions and the following disclaimer in the
+   13:     documentation and/or other materials provided with the distribution.
+   14:  3. Neither the name of the copyright holders nor the names of its
+   15:     contributors may be used to endorse or promote products derived from
+   16:     this software without specific prior written permission.
+   17: 
+   18:  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   19:  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   20:  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   21:  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+   22:  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   23:  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   24:  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   25:  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   26:  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   27:  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+   28:  THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/coverage-2.77_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+
+ 1082: # Copyright 2001 Gareth Rees.  All rights reserved.
+ 1083: # Copyright 2004-2007 Ned Batchelder.  All rights reserved.
+ 1084: #
+ 1085: # Redistribution and use in source and binary forms, with or without
+ 1086: # modification, are permitted provided that the following conditions are
+ 1087: # met:
+ 1088: #
+ 1089: # 1. Redistributions of source code must retain the above copyright
+ 1090: #    notice, this list of conditions and the following disclaimer.
+ 1091: #
+ 1092: # 2. Redistributions in binary form must reproduce the above copyright
+ 1093: #    notice, this list of conditions and the following disclaimer in the
+ 1094: #    documentation and/or other materials provided with the
+ 1095: #    distribution.
+ 1096: #
+ 1097: # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ 1098: # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ 1099: # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ 1100: # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ 1101: # HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ 1102: # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ 1103: # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ 1104: # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ 1105: # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ 1106: # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ 1107: # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ 1108: # DAMAGE.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/dom4j.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
+
+Redistribution and use of this software and associated documentation
+("Software"), with or without modification, are permitted provided
+that the following conditions are met:
+
+1. Redistributions of source code must retain copyright
+   statements and notices.  Redistributions must also contain a
+   copy of this document.
+ 
+2. 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.
+ 
+3. The name "DOM4J" must not be used to endorse or promote
+   products derived from this Software without prior written
+   permission of MetaStuff, Ltd.  For written permission,
+   please contact dom4j-info@metastuff.com.
+ 
+4. Products derived from this Software may not be called "DOM4J"
+   nor may "DOM4J" appear in their names without prior written
+   permission of MetaStuff, Ltd. DOM4J is a registered
+   trademark of MetaStuff, Ltd.
+ 
+5. Due credit should be given to the DOM4J Project - 
+   http://www.dom4j.org
+ 
+THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESSED 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
+METASTUFF, LTD. OR ITS 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.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/fmpp 0.9.13 _required_notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+    3: /*
+    4:  * Copyright (c) 2003, Dániel Dékány
+    5:  * All rights reserved.
+    6:  *
+    7:  * Redistribution and use in source and binary forms, with or without
+    8:  * modification, are permitted provided that the following conditions are
+    9:  * met:
+   10:  *
+   11:  * - Redistributions of source code must retain the above copyright notice,
+   12:  *   this list of conditions and the following disclaimer.
+   13:  *
+   14:  * - Redistributions in binary form must reproduce the above copyright
+   15:  *   notice, this list of conditions and the following disclaimer in the
+   16:  *   documentation and/or other materials provided with the distribution.
+   17:  *
+   18:  * - Neither the name "FMPP" nor the names of the project contributors may
+   19:  *   be used to endorse or promote products derived from this software
+   20:  *   without specific prior written permission.
+   21:  *
+   22:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   23:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+   24:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   25:  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+   26:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   27:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   28:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   29:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   30:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   31:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   32:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   33:  */
+   34: 
+
+
+   8: Copyright (c) 2003 The Visigoth Software Society. All rights reserved.
+    9: 
+   10: Redistribution and use in source and binary forms, with or without
+   11: modification, are permitted provided that the following conditions are met:
+   12: 
+   13: 1.  Redistributions of source code must retain the above copyright notice,
+   14:     this list of conditions and the following disclaimer.
+   15: 
+   16: 2.  The end-user documentation included with the redistribution, if any, must
+   17:     include the following acknowlegement:
+   18:       "This product includes software developed by the 
+   19:       Visigoth Software Society (http://www.visigoths.org/)."
+   20:     Alternately, this acknowlegement may appear in the software itself, if and
+   21:     wherever such third-party acknowlegements normally appear.
+   22: 
+   23: 3.  Neither the name "FreeMarker", "Visigoth", nor any of the names of the
+   24:     project contributors may be used to endorse or promote products derived
+   25:     from this software without prior written permission. For written
+   26:     permission, please contact visigoths@visigoths.org.
+   27: 
+   28: 4.  Products derived from this software may not be called "FreeMarker" or
+   29:     "Visigoth" nor may "FreeMarker" or "Visigoth" appear in their names
+   30:     without prior written permission of the Visigoth Software Society.
+   31: 
+   32: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+   33: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   34: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   35: VISIGOTH SOFTWARE SOCIETY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   36: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+   37: BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+   38: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+   39: OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   40: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+   41: EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   42: ------------------------------------------------------------------------------
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/freemarker-2.3.13_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,91 @@
+
+    2:  * Copyright (c) 2003 The Visigoth Software Society. All rights
+    3:  * reserved.
+    4:  *
+    5:  * Redistribution and use in source and binary forms, with or without
+    6:  * modification, are permitted provided that the following conditions
+    7:  * are met:
+    8:  *
+    9:  * 1. Redistributions of source code must retain the above copyright
+   10:  *    notice, this list of conditions and the following disclaimer.
+   11:  *
+   12:  * 2. Redistributions in binary form must reproduce the above copyright
+   13:  *    notice, this list of conditions and the following disclaimer in
+   14:  *    the documentation and/or other materials provided with the
+   15:  *    distribution.
+   16:  *
+   17:  * 3. The end-user documentation included with the redistribution, if
+   18:  *    any, must include the following acknowledgement:
+   19:  *       "This product includes software developed by the
+   20:  *        Visigoth Software Society (http://www.visigoths.org/)."
+   21:  *    Alternately, this acknowledgement may appear in the software itself,
+   22:  *    if and wherever such third-party acknowledgements normally appear.
+   23:  *
+   24:  * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
+   25:  *    project contributors may be used to endorse or promote products derived
+   26:  *    from this software without prior written permission. For written
+   27:  *    permission, please contact visigoths@visigoths.org.
+   28:  *
+   29:  * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
+   30:  *    nor may "FreeMarker" or "Visigoth" appear in their names
+   31:  *    without prior written permission of the Visigoth Software Society.
+   32:  *
+   33:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   34:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   35:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   36:  * DISCLAIMED.  IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
+   37:  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   38:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   39:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   40:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   41:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   42:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   43:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   44:  * SUCH DAMAGE.
+   45:  * ====================================================================
+   46:  *
+   47:  * This software consists of voluntary contributions made by many
+   48:  * individuals on behalf of the Visigoth Software Society. For more
+   49:  * information on the Visigoth Software Society, please see
+   50:  * http://www.visigoths.org/
+
+----
+
+Copyright 1994-2007 Sun Microsystems, Inc. All Rights Reserved.
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted provided that the following conditions 
+are met:
+ 
+
+    * Redistribution of source code must retain the above copyright 
+notice, this list of conditions and the following disclaimer.
+
+    * Redistribution 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 Sun Microsystems, Inc. or the names of 
+contributors may be used to endorse or promote products derived from 
+this software without specific prior written permission.
+ 
+This software is provided "AS IS," without a warranty of any kind. 
+ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, 
+INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A 
+PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN 
+MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE 
+FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING 
+OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL 
+SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR 
+DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL 
+OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY 
+OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS 
+SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 
+DAMAGES.
+ 
+You acknowledge that this software is not designed, licensed or 
+intended for use in the design, construction, operation or 
+maintenance of any nuclear facility. 
+
+----
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/jsch-0.1.39_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+
+    5: Copyright (c) 2002,2003,2004,2005,2006,2007,2008 Atsuhiko Yamanaka, JCraft,Inc. 
+    6: All rights reserved.
+    7: 
+    8: Redistribution and use in source and binary forms, with or without
+    9: modification, are permitted provided that the following conditions are met:
+   10: 
+   11:   1. Redistributions of source code must retain the above copyright notice,
+   12:      this list of conditions and the following disclaimer.
+   13: 
+   14:   2. Redistributions in binary form must reproduce the above copyright 
+   15:      notice, this list of conditions and the following disclaimer in 
+   16:      the documentation and/or other materials provided with the distribution.
+   17: 
+   18:   3. The names of the authors may not be used to endorse or promote products
+   19:      derived from this software without specific prior written permission.
+   20: 
+   21: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+   22: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   23: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+   24: INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+   25: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   26: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+   27: OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   28: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   29: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+   30: EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/jython license 2.0, 2.1.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,200 @@
+
+    2: A. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING JYTHON
+    3: =======================================================
+    4: 
+    5: PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+    6: --------------------------------------------
+    7: 
+    8: 1. This LICENSE AGREEMENT is between the Python Software Foundation
+    9: ("PSF"), and the Individual or Organization ("Licensee") accessing and
+   10: otherwise using this software ("Jython") in source or binary form and
+   11: its associated documentation.
+   12: 
+   13: 2. Subject to the terms and conditions of this License Agreement, PSF
+   14: hereby grants Licensee a nonexclusive, royalty-free, world-wide
+   15: license to reproduce, analyze, test, perform and/or display publicly,
+   16: prepare derivative works, distribute, and otherwise use Jython alone
+   17: or in any derivative version, provided, however, that PSF's License
+   18: Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2007
+   19: Python Software Foundation; All Rights Reserved" are retained in
+   20: Jython alone or in any derivative version prepared by Licensee.
+   21: 
+   22: 3. In the event Licensee prepares a derivative work that is based on
+   23: or incorporates Jython or any part thereof, and wants to make
+   24: the derivative work available to others as provided herein, then
+   25: Licensee hereby agrees to include in any such work a brief summary of
+   26: the changes made to Jython.
+   27: 
+   28: 4. PSF is making Jython available to Licensee on an "AS IS"
+   29: basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+   30: IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+   31: DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+   32: FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF JYTHON WILL NOT
+   33: INFRINGE ANY THIRD PARTY RIGHTS.
+   34: 
+   35: 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF JYTHON
+   36: FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+   37: A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING JYTHON,
+   38: OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+   39: 
+   40: 6. This License Agreement will automatically terminate upon a material
+   41: breach of its terms and conditions.
+   42: 
+   43: 7. Nothing in this License Agreement shall be deemed to create any
+   44: relationship of agency, partnership, or joint venture between PSF and
+   45: Licensee.  This License Agreement does not grant permission to use PSF
+   46: trademarks or trade name in a trademark sense to endorse or promote
+   47: products or services of Licensee, or any third party.
+   48: 
+   49: 8. By copying, installing or otherwise using Jython, Licensee
+   50: agrees to be bound by the terms and conditions of this License
+   51: Agreement.
+   52:  
+   53: Jython 2.0, 2.1 License
+   54: ================================
+   55: 
+   56: Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Jython Developers
+   57: All rights reserved.
+   58: 
+   59: Redistribution and use in source and binary forms, with or without
+   60: modification, are permitted provided that the following conditions
+   61: are met:
+   62: 
+   63:  - Redistributions of source code must retain the above copyright
+   64:    notice, this list of conditions and the following disclaimer.
+   65: 
+   66:  - Redistributions in binary form must reproduce the above copyright
+   67:    notice, this list of conditions and the following disclaimer in
+   68:    the documentation and/or other materials provided with the distribution.
+   69: 
+   70:  - Neither the name of the Jython Developers nor the names of
+   71:    its contributors may be used to endorse or promote products
+   72:    derived from this software without specific prior written permission.
+   73: 
+   74: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   75: ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   76: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   77: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+   78: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   79: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   80: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   81: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+   82: OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   83: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   84: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   85: 
+   86: 
+   87: 
+   88: 
+   89: JPython 1.1.x Software License.
+   90: =========================
+   91: 
+   92: ______________________________________________________________________
+   93: 
+   94: IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY.
+   95: 
+   96: BY CLICKING ON THE "ACCEPT" BUTTON WHERE INDICATED, OR BY INSTALLING,
+   97: COPYING OR OTHERWISE USING THE SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO
+   98: THE TERMS AND CONDITIONS OF THIS AGREEMENT.
+   99: 
+  100: ______________________________________________________________________
+  101: 
+  102: JPython version 1.1.x
+  103: 
+  104:   1. This LICENSE AGREEMENT is between the Corporation for National Research
+  105:      Initiatives, having an office at 1895 Preston White Drive, Reston, VA
+  106:      20191 ("CNRI"), and the Individual or Organization ("Licensee")
+  107:      accessing and using JPython version 1.1.x in source or binary form and
+  108:      its associated documentation as provided herein ("Software").
+  109: 
+  110:   2. Subject to the terms and conditions of this License Agreement, CNRI
+  111:      hereby grants Licensee a non-exclusive, non-transferable, royalty-free,
+  112:      world-wide license to reproduce, analyze, test, perform and/or display
+  113:      publicly, prepare derivative works, distribute, and otherwise use the
+  114:      Software alone or in any derivative version, provided, however, that
+  115:      CNRI's License Agreement and CNRI's notice of copyright, i.e.,
+  116:      "Copyright ©1996-1999 Corporation for National Research Initiatives;
+  117:      All Rights Reserved" are both retained in the Software, alone or in any
+  118:      derivative version prepared by Licensee.
+  119: 
+  120:      Alternatively, in lieu of CNRI's License Agreement, Licensee may
+  121:      substitute the following text (omitting the quotes), provided, however,
+  122:      that such text is displayed prominently in the Software alone or in any
+  123:      derivative version prepared by Licensee: "JPython (Version 1.1.x) is
+  124:      made available subject to the terms and conditions in CNRI's License
+  125:      Agreement. This Agreement may be located on the Internet using the
+  126:      following unique, persistent identifier (known as a handle):
+  127:      1895.22/1006. The License may also be obtained from a proxy server on
+  128:      the Web using the following URL: http://hdl.handle.net/1895.22/1006."
+  129: 
+  130:   3. In the event Licensee prepares a derivative work that is based on or
+  131:      incorporates the Software or any part thereof, and wants to make the
+  132:      derivative work available to the public as provided herein, then
+  133:      Licensee hereby agrees to indicate in any such work, in a prominently
+  134:      visible way, the nature of the modifications made to CNRI's Software.
+  135: 
+  136:   4. Licensee may not use CNRI trademarks or trade name, including JPython
+  137:      or CNRI, in a trademark sense to endorse or promote products or
+  138:      services of Licensee, or any third party. Licensee may use the mark
+  139:      JPython in connection with Licensee's derivative versions that are
+  140:      based on or incorporate the Software, but only in the form
+  141:      "JPython-based ___________________," or equivalent.
+  142: 
+  143:   5. CNRI is making the Software available to Licensee on an "AS IS" basis.
+  144:      CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY
+  145:      OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY
+  146:      REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY
+  147:      PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE
+  148:      ANY THIRD PARTY RIGHTS.
+  149: 
+  150:   6. CNRI SHALL NOT BE LIABLE TO LICENSEE OR OTHER USERS OF THE SOFTWARE FOR
+  151:      ANY INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
+  152:      USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE
+  153:      THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. SOME STATES DO NOT
+  154:      ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY SO THE ABOVE DISCLAIMER
+  155:      MAY NOT APPLY TO LICENSEE.
+  156: 
+  157:   7. This License Agreement may be terminated by CNRI (i) immediately upon
+  158:      written notice from CNRI of any material breach by the Licensee, if the
+  159:      nature of the breach is such that it cannot be promptly remedied; or
+  160:      (ii) sixty (60) days following notice from CNRI to Licensee of a
+  161:      material remediable breach, if Licensee has not remedied such breach
+  162:      within that sixty-day period.
+  163: 
+  164:   8. This License Agreement shall be governed by and interpreted in all
+  165:      respects by the law of the State of Virginia, excluding conflict of law
+  166:      provisions. Nothing in this Agreement shall be deemed to create any
+  167:      relationship of agency, partnership, or joint venture between CNRI and
+  168:      Licensee.
+  169: 
+  170:   9. By clicking on the "ACCEPT" button where indicated, or by installing,
+  171:      copying or otherwise using the Software, Licensee agrees to be bound by
+  172:      the terms and conditions of this License Agreement.
+  173: 
+  174:                                [ACCEPT BUTTON]
+  175: 
+  176: B. HISTORY OF THE SOFTWARE
+  177: =======================================================
+  178: 
+  179: JPython was created in late 1997 by Jim Hugunin. Jim was also the
+  180: primary developer while he was at CNRI. In February 1999 Barry Warsaw
+  181: took over as primary developer and released JPython version 1.1.
+  182: 
+  183: In October 2000 Barry helped move the software to SourceForge
+  184: where it was renamed to Jython. Jython 2.0 and 2.1 were developed
+  185: under the Jython specific license below.
+  186: 
+  187: From the 2.2 release on, Jython contributors have signed
+  188: Python Software Foundation contributor agreements and releases are
+  189: covered under the Python Software Foundation license version 2.
+  190: 
+  191: The standard library is covered by the Python Software Foundation
+  192: license as well. See the Lib/LICENSE file for details.
+  193: 
+  194: The zxJDBC package was written by Brian Zimmer and originally licensed
+  195: under the GNU Public License.  The package is now covered by the Jython
+  196: Software License.
+  197: 
+  198: The command line interpreter is covered by the Apache Software
+  199: License.  See the org/apache/LICENSE file for details.
+  200: 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/jython_src_2.2.1_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,515 @@
+
+*********
+
+These texts need to be included into the product documentation:
+
+*********
+
+
+
+    5: # Copyright 2000 by Timothy O'Malley <timo@alum.mit.edu>
+    6: #
+    7: #                All Rights Reserved
+    8: #
+    9: # Permission to use, copy, modify, and distribute this software
+   10: # and its documentation for any purpose and without fee is hereby
+   11: # granted, provided that the above copyright notice appear in all
+   12: # copies and that both that copyright notice and this permission
+   13: # notice appear in supporting documentation, and that the name of
+   14: # Timothy O'Malley  not be used in advertising or publicity
+   15: # pertaining to distribution of the software without specific, written
+   16: # prior permission.
+   17: #
+   18: # Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+   19: # SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+   20: # AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
+   21: # ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   22: # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+   23: # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+   24: # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+   25: # PERFORMANCE OF THIS SOFTWARE.
+
+----
+
+    6: # Copyright 1996 by Sam Rushing
+    7: #
+    8: #                         All Rights Reserved
+    9: #
+   10: # Permission to use, copy, modify, and distribute this software and
+   11: # its documentation for any purpose and without fee is hereby
+   12: # granted, provided that the above copyright notice appear in all
+   13: # copies and that both that copyright notice and this permission
+   14: # notice appear in supporting documentation, and that the name of Sam
+   15: # Rushing not be used in advertising or publicity pertaining to
+   16: # distribution of the software without specific, written prior
+   17: # permission.
+   18: #
+   19: # SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+   20: # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+   21: # NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+   22: # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+   23: # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+   24: # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+   25: # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+----
+
+    5: Copyright 1994, by InfoSeek Corporation, all rights reserved.
+    6: Written by James Roskind
+    7: 
+    8: Permission to use, copy, modify, and distribute this Python software
+    9: and its associated documentation for any purpose (subject to the
+   10: restriction in the following sentence) without fee is hereby granted,
+   11: provided that the above copyright notice appears in all copies, and
+   12: that both that copyright notice and this permission notice appear in
+   13: supporting documentation, and that the name of InfoSeek not be used in
+   14: advertising or publicity pertaining to distribution of the software
+   15: without specific, written prior permission.  This permission is
+   16: explicitly restricted to the copying and modification of the software
+   17: to remain in Python, compiled Python, or other languages (such as C)
+   18: wherein the modified or derived code is exclusively imported into a
+   19: Python module.
+   20: 
+   21: INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+   22: SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   23: FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
+   24: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+   25: RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+   26: CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+   27: CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+----
+
+    3: # Copyright 1994 by Lance Ellinghouse
+    4: # Cathedral City, California Republic, United States of America.
+    5: #                        All Rights Reserved
+    6: # Permission to use, copy, modify, and distribute this software and its
+    7: # documentation for any purpose and without fee is hereby granted,
+    8: # provided that the above copyright notice appear in all copies and that
+    9: # both that copyright notice and this permission notice appear in
+   10: # supporting documentation, and that the name of Lance Ellinghouse
+   11: # not be used in advertising or publicity pertaining to distribution
+   12: # of the software without specific, written prior permission.
+   13: # LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
+   14: # THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   15: # FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
+   16: # FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   17: # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   18: # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+   19: # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+----
+
+   49: # Copyright (c) 1999-2001 by Secret Labs AB
+   50: # Copyright (c) 1999-2001 by Fredrik Lundh
+   51: #
+   52: # By obtaining, using, and/or copying this software and/or its
+   53: # associated documentation, you agree that you have read, understood,
+   54: # and will comply with the following terms and conditions:
+   55: #
+   56: # Permission to use, copy, modify, and distribute this software and
+   57: # its associated documentation for any purpose and without fee is
+   58: # hereby granted, provided that the above copyright notice appears in
+   59: # all copies, and that both that copyright notice and this permission
+   60: # notice appear in supporting documentation, and that the name of
+   61: # Secret Labs AB or the author not be used in advertising or publicity
+   62: # pertaining to distribution of the software without specific, written
+   63: # prior permission.
+   64: #
+   65: # SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
+   66: # TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
+   67: # ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
+   68: # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+   69: # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+   70: # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+   71: # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+   72: # OF THIS SOFTWARE.
+
+----
+
+   21:  *       "This product includes software developed by the
+   22:  *        Apache Software Foundation (http://www.apache.org/)."
+
+"This product includes software developed by Fourthought, Inc. 
+(http://www.fourthought.com)."
+
+
+
+
+********
+
+The following texts need to be included into the product documentation if 
+distributed in binary only:
+
+********
+
+
+
+
+Version 1.1 Copyright (c) 2000 Fourthought, Inc.. 
+All rights reserved. 
+
+Redistribution and use 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. 
+
+The end-user documentation included with the redistribution, if any, 
+must include the following acknowledgment: "This product includes 
+software developed by Fourthought, Inc. (http://www.fourthought.com)." 
+Alternately, this acknowledgment may appear in the software itself, 
+if and wherever such third-party acknowledgments normally appear. 
+
+The names "4Suite", "4Suite Server" and "Fourthought" must not be 
+used to endorse or promote products derived from this software 
+without prior written permission. For written permission, please 
+contact info@fourthought.com. Products derived from this software 
+may not be called "4Suite", nor may "4Suite" appear in their name, 
+without prior written permission of Fourthought, Inc. 
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 FOURTHOGHT, INC. OR ITS 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. 
+
+====================================================================
+
+This license is based on the Apache Software License, Version 1.1, 
+Copyright (c) 2000 The Apache Software Foundation.
+All rights reserved.
+
+----
+
+Copyright (c) 1997-1998, Greg Stein
+All rights reserved.
+
+Redistribution and use 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 
+	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 <ORGANIZATION> nor the 
+	names of its contributors may be used to endorse or 
+	promote products derived from this software without
+	specific rior written permission. 
+
+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.
+
+----
+
+   14:  * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 The Cryptix Foundation
+   15:  * Limited.
+   16:  * All rights reserved.
+   17:  *
+   18:  * Redistribution and use in source and binary forms, with or
+   19:  * without modification, are permitted provided that the
+   20:  * following conditions are met:
+   21:  *
+   22:  * - Redistributions of source code must retain the copyright notice, this
+   23:  *   list of conditions and the following disclaimer.
+   24:  * - Redistributions in binary form must reproduce the above
+   25:  *   copyright notice, this list of conditions and the following
+   26:  *   disclaimer in the documentation and/or other materials
+   27:  *   provided with the distribution.
+   28:  *
+   29:  * THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED
+   30:  * AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+   31:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   32:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   33:  * DISCLAIMED. IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED
+   34:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   35:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+   36:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   37:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+   38:  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   39:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   40:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   41:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----
+
+    4:  * Copyright (c) 2002 The Apache Software Foundation.  All rights
+    5:  * reserved.
+    6:  *
+    7:  * Redistribution and use in source and binary forms, with or without
+    8:  * modification, are permitted provided that the following conditions
+    9:  * are met:
+   10:  *
+   11:  * 1. Redistributions of source code must retain the above copyright
+   12:  *    notice, this list of conditions and the following disclaimer.
+   13:  *
+   14:  * 2. Redistributions in binary form must reproduce the above copyright
+   15:  *    notice, this list of conditions and the following disclaimer in
+   16:  *    the documentation and/or other materials provided with the
+   17:  *    distribution.
+   18:  *
+   19:  * 3. The end-user documentation included with the redistribution, if
+   20:  *    any, must include the following acknowlegement:
+   21:  *       "This product includes software developed by the
+   22:  *        Apache Software Foundation (http://www.apache.org/)."
+   23:  *    Alternately, this acknowlegement may appear in the software itself,
+   24:  *    if and wherever such third-party acknowlegements normally appear.
+   25:  *
+   26:  * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+   27:  *    Foundation" must not be used to endorse or promote products derived
+   28:  *    from this software without prior written permission. For written
+   29:  *    permission, please contact apache@apache.org.
+   30:  *
+   31:  * 5. Products derived from this software may not be called "Apache"
+   32:  *    nor may "Apache" appear in their names without prior written
+   33:  *    permission of the Apache Group.
+   34:  *
+   35:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   36:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   37:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   38:  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+   39:  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   40:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   41:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   42:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   43:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   44:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   45:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   46:  * SUCH DAMAGE.
+   47:  * ====================================================================
+   48:  *
+   49:  * This software consists of voluntary contributions made by many
+   50:  * individuals on behalf of the Apache Software Foundation.  For more
+   51:  * information on the Apache Software Foundation, please see
+   52:  * <http://www.apache.org/>.
+
+----
+
+Apache License
+    2:                            Version 2.0, January 2004
+    3:                         http://www.apache.org/licenses/
+    4: 
+    5:    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+    6: 
+    7:    1. Definitions.
+    8: 
+    9:       "License" shall mean the terms and conditions for use, reproduction,
+   10:       and distribution as defined by Sections 1 through 9 of this document.
+   11: 
+   12:       "Licensor" shall mean the copyright owner or entity authorized by
+   13:       the copyright owner that is granting the License.
+   14: 
+   15:       "Legal Entity" shall mean the union of the acting entity and all
+   16:       other entities that control, are controlled by, or are under common
+   17:       control with that entity. For the purposes of this definition,
+   18:       "control" means (i) the power, direct or indirect, to cause the
+   19:       direction or management of such entity, whether by contract or
+   20:       otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   21:       outstanding shares, or (iii) beneficial ownership of such entity.
+   22: 
+   23:       "You" (or "Your") shall mean an individual or Legal Entity
+   24:       exercising permissions granted by this License.
+   25: 
+   26:       "Source" form shall mean the preferred form for making modifications,
+   27:       including but not limited to software source code, documentation
+   28:       source, and configuration files.
+   29: 
+   30:       "Object" form shall mean any form resulting from mechanical
+   31:       transformation or translation of a Source form, including but
+   32:       not limited to compiled object code, generated documentation,
+   33:       and conversions to other media types.
+   34: 
+   35:       "Work" shall mean the work of authorship, whether in Source or
+   36:       Object form, made available under the License, as indicated by a
+   37:       copyright notice that is included in or attached to the work
+   38:       (an example is provided in the Appendix below).
+   39: 
+   40:       "Derivative Works" shall mean any work, whether in Source or Object
+   41:       form, that is based on (or derived from) the Work and for which the
+   42:       editorial revisions, annotations, elaborations, or other modifications
+   43:       represent, as a whole, an original work of authorship. For the purposes
+   44:       of this License, Derivative Works shall not include works that remain
+   45:       separable from, or merely link (or bind by name) to the interfaces of,
+   46:       the Work and Derivative Works thereof.
+   47: 
+   48:       "Contribution" shall mean any work of authorship, including
+   49:       the original version of the Work and any modifications or additions
+   50:       to that Work or Derivative Works thereof, that is intentionally
+   51:       submitted to Licensor for inclusion in the Work by the copyright owner
+   52:       or by an individual or Legal Entity authorized to submit on behalf of
+   53:       the copyright owner. For the purposes of this definition, "submitted"
+   54:       means any form of electronic, verbal, or written communication sent
+   55:       to the Licensor or its representatives, including but not limited to
+   56:       communication on electronic mailing lists, source code control systems,
+   57:       and issue tracking systems that are managed by, or on behalf of, the
+   58:       Licensor for the purpose of discussing and improving the Work, but
+   59:       excluding communication that is conspicuously marked or otherwise
+   60:       designated in writing by the copyright owner as "Not a Contribution."
+   61: 
+   62:       "Contributor" shall mean Licensor and any individual or Legal Entity
+   63:       on behalf of whom a Contribution has been received by Licensor and
+   64:       subsequently incorporated within the Work.
+   65: 
+   66:    2. Grant of Copyright License. Subject to the terms and conditions of
+   67:       this License, each Contributor hereby grants to You a perpetual,
+   68:       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   69:       copyright license to reproduce, prepare Derivative Works of,
+   70:       publicly display, publicly perform, sublicense, and distribute the
+   71:       Work and such Derivative Works in Source or Object form.
+   72: 
+   73:    3. Grant of Patent License. Subject to the terms and conditions of
+   74:       this License, each Contributor hereby grants to You a perpetual,
+   75:       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   76:       (except as stated in this section) patent license to make, have made,
+   77:       use, offer to sell, sell, import, and otherwise transfer the Work,
+   78:       where such license applies only to those patent claims licensable
+   79:       by such Contributor that are necessarily infringed by their
+   80:       Contribution(s) alone or by combination of their Contribution(s)
+   81:       with the Work to which such Contribution(s) was submitted. If You
+   82:       institute patent litigation against any entity (including a
+   83:       cross-claim or counterclaim in a lawsuit) alleging that the Work
+   84:       or a Contribution incorporated within the Work constitutes direct
+   85:       or contributory patent infringement, then any patent licenses
+   86:       granted to You under this License for that Work shall terminate
+   87:       as of the date such litigation is filed.
+   88: 
+   89:    4. Redistribution. You may reproduce and distribute copies of the
+   90:       Work or Derivative Works thereof in any medium, with or without
+   91:       modifications, and in Source or Object form, provided that You
+   92:       meet the following conditions:
+   93: 
+   94:       (a) You must give any other recipients of the Work or
+   95:           Derivative Works a copy of this License; and
+   96: 
+   97:       (b) You must cause any modified files to carry prominent notices
+   98:           stating that You changed the files; and
+   99: 
+  100:       (c) You must retain, in the Source form of any Derivative Works
+  101:           that You distribute, all copyright, patent, trademark, and
+  102:           attribution notices from the Source form of the Work,
+  103:           excluding those notices that do not pertain to any part of
+  104:           the Derivative Works; and
+  105: 
+  106:       (d) If the Work includes a "NOTICE" text file as part of its
+  107:           distribution, then any Derivative Works that You distribute must
+  108:           include a readable copy of the attribution notices contained
+  109:           within such NOTICE file, excluding those notices that do not
+  110:           pertain to any part of the Derivative Works, in at least one
+  111:           of the following places: within a NOTICE text file distributed
+  112:           as part of the Derivative Works; within the Source form or
+  113:           documentation, if provided along with the Derivative Works; or,
+  114:           within a display generated by the Derivative Works, if and
+  115:           wherever such third-party notices normally appear. The contents
+  116:           of the NOTICE file are for informational purposes only and
+  117:           do not modify the License. You may add Your own attribution
+  118:           notices within Derivative Works that You distribute, alongside
+  119:           or as an addendum to the NOTICE text from the Work, provided
+  120:           that such additional attribution notices cannot be construed
+  121:           as modifying the License.
+  122: 
+  123:       You may add Your own copyright statement to Your modifications and
+  124:       may provide additional or different license terms and conditions
+  125:       for use, reproduction, or distribution of Your modifications, or
+  126:       for any such Derivative Works as a whole, provided Your use,
+  127:       reproduction, and distribution of the Work otherwise complies with
+  128:       the conditions stated in this License.
+  129: 
+  130:    5. Submission of Contributions. Unless You explicitly state otherwise,
+  131:       any Contribution intentionally submitted for inclusion in the Work
+  132:       by You to the Licensor shall be under the terms and conditions of
+  133:       this License, without any additional terms or conditions.
+  134:       Notwithstanding the above, nothing herein shall supersede or modify
+  135:       the terms of any separate license agreement you may have executed
+  136:       with Licensor regarding such Contributions.
+  137: 
+  138:    6. Trademarks. This License does not grant permission to use the trade
+  139:       names, trademarks, service marks, or product names of the Licensor,
+  140:       except as required for reasonable and customary use in describing the
+  141:       origin of the Work and reproducing the content of the NOTICE file.
+  142: 
+  143:    7. Disclaimer of Warranty. Unless required by applicable law or
+  144:       agreed to in writing, Licensor provides the Work (and each
+  145:       Contributor provides its Contributions) on an "AS IS" BASIS,
+  146:       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+  147:       implied, including, without limitation, any warranties or conditions
+  148:       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+  149:       PARTICULAR PURPOSE. You are solely responsible for determining the
+  150:       appropriateness of using or redistributing the Work and assume any
+  151:       risks associated with Your exercise of permissions under this License.
+  152: 
+  153:    8. Limitation of Liability. In no event and under no legal theory,
+  154:       whether in tort (including negligence), contract, or otherwise,
+  155:       unless required by applicable law (such as deliberate and grossly
+  156:       negligent acts) or agreed to in writing, shall any Contributor be
+  157:       liable to You for damages, including any direct, indirect, special,
+  158:       incidental, or consequential damages of any character arising as a
+  159:       result of this License or out of the use or inability to use the
+  160:       Work (including but not limited to damages for loss of goodwill,
+  161:       work stoppage, computer failure or malfunction, or any and all
+  162:       other commercial damages or losses), even if such Contributor
+  163:       has been advised of the possibility of such damages.
+  164: 
+  165:    9. Accepting Warranty or Additional Liability. While redistributing
+  166:       the Work or Derivative Works thereof, You may choose to offer,
+  167:       and charge a fee for, acceptance of support, warranty, indemnity,
+  168:       or other liability obligations and/or rights consistent with this
+  169:       License. However, in accepting such obligations, You may act only
+  170:       on Your own behalf and on Your sole responsibility, not on behalf
+  171:       of any other Contributor, and only if You agree to indemnify,
+  172:       defend, and hold each Contributor harmless for any liability
+  173:       incurred by, or claims asserted against, such Contributor by reason
+  174:       of your accepting any such warranty or additional liability.
+  175: 
+  176:    END OF TERMS AND CONDITIONS
+  177: 
+  178:    APPENDIX: How to apply the Apache License to your work.
+  179: 
+  180:       To apply the Apache License to your work, attach the following
+  181:       boilerplate notice, with the fields enclosed by brackets "[]"
+  182:       replaced with your own identifying information. (Don't include
+  183:       the brackets!)  The text should be enclosed in the appropriate
+  184:       comment syntax for the file format. We also recommend that a
+  185:       file or class name and description of purpose be included on the
+  186:       same "printed page" as the copyright notice for easier
+  187:       identification within third-party archives.
+  188: 
+  189:    Copyright [yyyy] [name of copyright owner]
+  190: 
+  191:    Licensed under the Apache License, Version 2.0 (the "License");
+  192:    you may not use this file except in compliance with the License.
+  193:    You may obtain a copy of the License at
+  194: 
+  195:        http://www.apache.org/licenses/LICENSE-2.0
+  196: 
+  197:    Unless required by applicable law or agreed to in writing, software
+  198:    distributed under the License is distributed on an "AS IS" BASIS,
+  199:    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  200:    See the License for the specific language governing permissions and
+  201:    limitations under the License.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/lgpl.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/lxml-1.3.5_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,118 @@
+
+    1: Copyright (c) 2004 Infrae. All rights reserved.
+    2: 
+    3: Redistribution and use in source and binary forms, with or without
+    4: modification, are permitted provided that the following conditions are
+    5: met:
+    6: 
+    7:   1. Redistributions of source code must retain the above copyright
+    8:      notice, this list of conditions and the following disclaimer.
+    9:    
+   10:   2. Redistributions in binary form must reproduce the above copyright
+   11:      notice, this list of conditions and the following disclaimer in
+   12:      the documentation and/or other materials provided with the
+   13:      distribution.
+   14: 
+   15:   3. Neither the name of Infrae nor the names of its contributors may
+   16:      be used to endorse or promote products derived from this software
+   17:      without specific prior written permission.
+   18: 
+   19: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   20: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   21: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   22: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INFRAE OR
+   23: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   24: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   25: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   26: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   27: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   28: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   29: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----
+
+    3: Copyright (c) 1999-2003 by Secret Labs AB
+    4: Copyright (c) 1999-2003 by Fredrik Lundh
+    5: 
+    6: By obtaining, using, and/or copying this software and/or its
+    7: associated documentation, you agree that you have read, understood,
+    8: and will comply with the following terms and conditions:
+    9: 
+   10: Permission to use, copy, modify, and distribute this software and its
+   11: associated documentation for any purpose and without fee is hereby
+   12: granted, provided that the above copyright notice appears in all
+   13: copies, and that both that copyright notice and this permission notice
+   14: appear in supporting documentation, and that the name of Secret Labs
+   15: AB or the author not be used in advertising or publicity pertaining to
+   16: distribution of the software without specific, written prior
+   17: permission.
+   18: 
+   19: SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO
+   20: THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   21: FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR
+   22: ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   23: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   24: ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+   25: OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+----
+
+    1: Zope Public License (ZPL) Version 2.0
+    2: -----------------------------------------------
+    3: 
+    4: This software is Copyright (c) Zope Corporation (tm) and
+    5: Contributors. All rights reserved.
+    6: 
+    7: This license has been certified as open source. It has also
+    8: been designated as GPL compatible by the Free Software
+    9: Foundation (FSF).
+   10: 
+   11: Redistribution and use in source and binary forms, with or
+   12: without modification, are permitted provided that the
+   13: following conditions are met:
+   14: 
+   15: 1. Redistributions in source code must retain the above
+   16:    copyright notice, this list of conditions, and the following
+   17:    disclaimer.
+   18: 
+   19: 2. Redistributions in binary form must reproduce the above
+   20:    copyright notice, this list of conditions, and the following
+   21:    disclaimer in the documentation and/or other materials
+   22:    provided with the distribution.
+   23: 
+   24: 3. The name Zope Corporation (tm) must not be used to
+   25:    endorse or promote products derived from this software
+   26:    without prior written permission from Zope Corporation.
+   27: 
+   28: 4. The right to distribute this software or to use it for
+   29:    any purpose does not give you the right to use Servicemarks
+   30:    (sm) or Trademarks (tm) of Zope Corporation. Use of them is
+   31:    covered in a separate agreement (see
+   32:    http://www.zope.com/Marks).
+   33: 
+   34: 5. If any files are modified, you must cause the modified
+   35:    files to carry prominent notices stating that you changed
+   36:    the files and the date of any change.
+   37: 
+   38: Disclaimer
+   39: 
+   40:   THIS SOFTWARE IS PROVIDED BY ZOPE CORPORATION ``AS IS''
+   41:   AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+   42:   NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+   43:   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+   44:   NO EVENT SHALL ZOPE CORPORATION OR ITS CONTRIBUTORS BE
+   45:   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   46:   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   47:   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   48:   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   49:   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   50:   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+   51:   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   52:   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+   53:   DAMAGE.
+   54: 
+   55: 
+   56: This software consists of contributions made by Zope
+   57: Corporation and many individuals on behalf of Zope
+   58: Corporation.  Specific attributions are listed in the
+   59: accompanying credits file.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/mail_src_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+
+    4:  * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+    5:  *
+    6:  * Redistribution and use in source and binary forms, with or without
+    7:  * modification, are permitted provided that the following conditions
+    8:  * are met:
+    9:  *
+   10:  *   - Redistributions of source code must retain the above copyright
+   11:  *     notice, this list of conditions and the following disclaimer.
+   12:  *
+   13:  *   - Redistributions in binary form must reproduce the above copyright
+   14:  *     notice, this list of conditions and the following disclaimer in the
+   15:  *     documentation and/or other materials provided with the distribution.
+   16:  *
+   17:  *   - Neither the name of Sun Microsystems nor the names of its
+   18:  *     contributors may be used to endorse or promote products derived
+   19:  *     from this software without specific prior written permission.
+   20:  *
+   21:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+   22:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+   23:  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+   24:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+   25:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   26:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   27:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   28:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   29:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   30:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   31:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/plexus-utils-1.5.7_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,235 @@
+
+The following texts need to be included in the product documentation:
+*********************
+
+
+----
+
+   21:  *       "This product includes software developed by the
+   22:  *        Apache Software Foundation (http://www.codehaus.org/)."
+
+----
+
+ 3249:  *      "This product includes software developed by the Indiana
+ 3250:  *      University Extreme! Lab.  For further information please visit
+ 3251:  *      http://www.extreme.indiana.edu/"
+
+----
+
+
+Additional texts for binary distributions: 
+**********************
+
+----
+
+    5: Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved.
+    6: 
+    7: Redistribution and use in source and binary forms, with or without 
+    8: modification, are permitted provided that the following conditions 
+    9: are met:
+   10: 
+   11: 1. Redistributions of source code must retain the above copyright notice, 
+   12:    this list of conditions and the following disclaimer.
+   13: 
+   14: 2. Redistributions in binary form must reproduce the above copyright 
+   15:    notice, this list of conditions and the following disclaimer in 
+   16:    the documentation and/or other materials provided with the distribution.
+   17: 
+   18: 3. The end-user documentation included with the redistribution, if any, 
+   19:    must include the following acknowledgment:
+   20: 
+   21:   "This product includes software developed by the Indiana University 
+   22:   Extreme! Lab (http://www.extreme.indiana.edu/)."
+   23: 
+   24: Alternately, this acknowledgment may appear in the software itself, 
+   25: if and wherever such third-party acknowledgments normally appear.
+   26: 
+   27: 4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab" 
+   28: must not be used to endorse or promote products derived from this 
+   29: software without prior written permission. For written permission, 
+   30: please contact http://www.extreme.indiana.edu/.
+   31: 
+   32: 5. Products derived from this software may not use "Indiana Univeristy" 
+   33: name nor may "Indiana Univeristy" appear in their name, without prior 
+   34: written permission of the Indiana University.
+   35: 
+   36: THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
+   37: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   38: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+   39: IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS
+   40: BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   41: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   42: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+   43: BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+   44: WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+   45: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   46: ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----
+
+    1: Javolution - Java(TM) Solution for Real-Time and Embedded Systems
+    2: Copyright (c) 2006, Javolution (http://javolution.org)
+    3: All rights reserved.
+    4: 
+    5: Redistribution and use in source and binary forms, with or without modification,
+    6: are permitted provided that the following conditions are met:
+    7: 
+    8:     * Redistributions of source code must retain the above copyright notice,
+    9:       this list of conditions and the following disclaimer.
+   10:     * Redistributions in binary form must reproduce the above copyright notice,
+   11:       this list of conditions and the following disclaimer in the documentation
+   12:       and/or other materials provided with the distribution.
+   13: 
+   14: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+   15: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+   16: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+   17: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
+   18: ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+   19: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+   20: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   21: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+   22: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+   23: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----
+
+    2: /********************************************************************************
+    3:  * CruiseControl, a Continuous Integration Toolkit
+    4:  * Copyright (c) 2001-2003, ThoughtWorks, Inc.
+    5:  * 651 W Washington Ave. Suite 500
+    6:  * Chicago, IL 60661 USA
+    7:  * All rights reserved.
+    8:  *
+    9:  * Redistribution and use in source and binary forms, with or without
+   10:  * modification, are permitted provided that the following conditions
+   11:  * are met:
+   12:  *
+   13:  *     + Redistributions of source code must retain the above copyright
+   14:  *       notice, this list of conditions and the following disclaimer.
+   15:  *
+   16:  *     + Redistributions in binary form must reproduce the above
+   17:  *       copyright notice, this list of conditions and the following
+   18:  *       disclaimer in the documentation and/or other materials provided
+   19:  *       with the distribution.
+   20:  *
+   21:  *     + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
+   22:  *       names of its contributors may be used to endorse or promote
+   23:  *       products derived from this software without specific prior
+   24:  *       written permission.
+   25:  *
+   26:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   27:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   28:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   29:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+   30:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   31:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   32:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   33:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   34:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   35:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   36:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   37:  ********************************************************************************/
+
+----
+
+    4:  * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
+    5:  * reserved.
+    6:  *
+    7:  * Redistribution and use in source and binary forms, with or without
+    8:  * modification, are permitted provided that the following conditions
+    9:  * are met:
+   10:  *
+   11:  * 1. Redistributions of source code must retain the above copyright
+   12:  *    notice, this list of conditions and the following disclaimer.
+   13:  *
+   14:  * 2. Redistributions in binary form must reproduce the above copyright
+   15:  *    notice, this list of conditions and the following disclaimer in
+   16:  *    the documentation and/or other materials provided with the
+   17:  *    distribution.
+   18:  *
+   19:  * 3. The end-user documentation included with the redistribution, if
+   20:  *    any, must include the following acknowlegement:
+   21:  *       "This product includes software developed by the
+   22:  *        Apache Software Foundation (http://www.codehaus.org/)."
+   23:  *    Alternately, this acknowlegement may appear in the software itself,
+   24:  *    if and wherever such third-party acknowlegements normally appear.
+   25:  *
+   26:  * 4. The names "Ant" and "Apache Software
+   27:  *    Foundation" must not be used to endorse or promote products derived
+   28:  *    from this software without prior written permission. For written
+   29:  *    permission, please contact codehaus@codehaus.org.
+   30:  *
+   31:  * 5. Products derived from this software may not be called "Apache"
+   32:  *    nor may "Apache" appear in their names without prior written
+   33:  *    permission of the Apache Group.
+   34:  *
+   35:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+   36:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   37:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   38:  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+   39:  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   40:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   41:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   42:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   43:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   44:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+   45:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   46:  * SUCH DAMAGE.
+   47:  * ====================================================================
+
+----
+
+ 3229:  * Copyright (C) 2003 The Trustees of Indiana University.
+ 3230:  * All rights reserved.
+ 3231:  *
+ 3232:  * Redistribution and use in source and binary forms, with or without
+ 3233:  * modification, are permitted provided that the following conditions are
+ 3234:  * met:
+ 3235:  *
+ 3236:  * 1) All redistributions of source code must retain the above
+ 3237:  *    copyright notice, the list of authors in the original source
+ 3238:  *    code, this list of conditions and the disclaimer listed in this
+ 3239:  *    license;
+ 3240:  *
+ 3241:  * 2) All redistributions in binary form must reproduce the above
+ 3242:  *    copyright notice, this list of conditions and the disclaimer
+ 3243:  *    listed in this license in the documentation and/or other
+ 3244:  *    materials provided with the distribution;
+ 3245:  *
+ 3246:  * 3) Any documentation included with all redistributions must include
+ 3247:  *    the following acknowledgement:
+ 3248:  *
+ 3249:  *      "This product includes software developed by the Indiana
+ 3250:  *      University Extreme! Lab.  For further information please visit
+ 3251:  *      http://www.extreme.indiana.edu/"
+ 3252:  *
+ 3253:  *    Alternatively, this acknowledgment may appear in the software
+ 3254:  *    itself, and wherever such third-party acknowledgments normally
+ 3255:  *    appear.
+ 3256:  *
+ 3257:  * 4) The name "Indiana University" or "Indiana University
+ 3258:  *    Extreme! Lab" shall not be used to endorse or promote
+ 3259:  *    products derived from this software without prior written
+ 3260:  *    permission from Indiana University.  For written permission,
+ 3261:  *    please contact http://www.extreme.indiana.edu/.
+ 3262:  *
+ 3263:  * 5) Products derived from this software may not use "Indiana
+ 3264:  *    University" name nor may "Indiana University" appear in their name,
+ 3265:  *    without prior written permission of the Indiana University.
+ 3266:  *
+ 3267:  * Indiana University provides no reassurances that the source code
+ 3268:  * provided does not infringe the patent or any other intellectual
+ 3269:  * property rights of any other entity.  Indiana University disclaims any
+ 3270:  * liability to any recipient for claims brought by any other entity
+ 3271:  * based on infringement of intellectual property rights or otherwise.
+ 3272:  *
+ 3273:  * LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH
+ 3274:  * NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA
+ 3275:  * UNIVERSITY GIVES NO WARRANTIES AND MAKES NO REPRESENTATION THAT
+ 3276:  * SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR
+ 3277:  * OTHER PROPRIETARY RIGHTS.  INDIANA UNIVERSITY MAKES NO WARRANTIES THAT
+ 3278:  * SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP
+ 3279:  * DOORS", "WORMS", OR OTHER HARMFUL CODE.  LICENSEE ASSUMES THE ENTIRE
+ 3280:  * RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS,
+ 3281:  * AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING
+ 3282:  * SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/psf_zpl_licenses_for_python_setuptools_0.6c5.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,253 @@
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PSF LICENSE AGREEMENT FOR PYTHON 2.3
+------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using Python 2.3 software in source or binary form and its
+associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 2.3
+alone or in any derivative version, provided, however, that PSF's
+License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
+2001, 2002 Python Software Foundation; All Rights Reserved" are
+retained in Python 2.3 alone or in any derivative version prepared by
+Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 2.3 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 2.3.
+
+4. PSF is making Python 2.3 available to Licensee on an "AS IS"
+basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.3 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+2.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.3,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee.  This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python 2.3, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions.  Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee.  This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party.  As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee.  Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement.  This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013.  This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee.  This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+        ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands.  All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+
+Zope Public License (ZPL) Version 2.1
+------------------------------------------------------------------------------
+
+A copyright notice accompanies this license document that
+identifies the copyright holders.
+
+This license has been certified as open source. It has also
+been designated as GPL compatible by the Free Software
+Foundation (FSF).
+
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions in source code must retain the
+   accompanying copyright notice, this list of conditions,
+   and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the accompanying
+   copyright notice, this list of conditions, and the
+   following disclaimer in the documentation and/or other
+   materials provided with the distribution.
+
+3. Names of the copyright holders must not be used to
+   endorse or promote products derived from this software
+   without prior written permission from the copyright
+   holders.
+
+4. The right to distribute this software or to use it for
+   any purpose does not give you the right to use
+   Servicemarks (sm) or Trademarks (tm) of the copyright
+   holders. Use of them is covered by separate agreement
+   with the copyright holders.
+
+5. If any files are modified, you must cause the modified
+   files to carry prominent notices stating that you changed
+   the files and the date of any change.
+
+Disclaimer
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS''
+  AND ANY EXPRESSED 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 HOLDERS 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.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/python 1,6 license.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+Python 1.6
+
+CNRI OPEN SOURCE LICENSE AGREEMENT
+
+IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY. BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR OTHERWISE USING PYTHON 1.6 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO THE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT.
+
+1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6 software in source or binary form and its associated documentation, as released at the www.python.org Internet site on September 5, 2000 ("Python 1.6").
+
+2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 1995-2000 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6 alone or in any derivative version prepared by
+
+Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1012. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1012".
+
+3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 1.6.
+
+4. CNRI is making Python 1.6 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
+
+7. This License Agreement shall be governed by and interpreted in all respects by the law of the State of Virginia, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6, Licensee agrees to be bound by the terms and conditions of this License Agreement.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/licenses/xmlunit-1.2_required notices.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+
+    2: ******************************************************************
+    3: Copyright (c) 2001-2007, Jeff Martin, Tim Bacon
+    3: Copyright (c) 2008, Stefan Bodewig
+    4: All rights reserved.
+    5: 
+    6: Redistribution and use in source and binary forms, with or without
+    7: modification, are permitted provided that the following conditions
+    8: are met:
+    9: 
+   10:     * Redistributions of source code must retain the above copyright
+   11:       notice, this list of conditions and the following disclaimer.
+   12:     * Redistributions in binary form must reproduce the above
+   13:       copyright notice, this list of conditions and the following
+   14:       disclaimer in the documentation and/or other materials provided
+   15:       with the distribution.
+   16:     * Neither the name of the xmlunit.sourceforge.net nor the names
+   17:       of its contributors may be used to endorse or promote products
+   18:       derived from this software without specific prior written
+   19:       permission.
+   20: 
+   21: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   22: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   23: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   24: FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   25: COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   26: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+   27: BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   28: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+   29: CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+   30: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+   31: ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   32: POSSIBILITY OF SUCH DAMAGE.
+   33: 
+   34: ******************************************************************
+
+----
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/precompile_py.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+
+python %HELIUM_HOME%\tools\common\python\lib\precompile.py --modulepath %HELIUM_HOME%\tools\common\python\lib
+
+endlocal
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/pt.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+
+set HELIUM_HOME=.
+set PYTHONPATH=%HELIUM_HOME%\external\python\lib\2.5;%HELIUM_HOME%\tools\common\python\lib;%HELIUM_HOME%\tools\dp\iCreatorDP;c:\apps\sbs\python
+
+python external\python\bin\nosetests-script.py -v %*
+
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/PythonTest.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+print "test complete!"
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/ant_config_test.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+
+text.a = text.value.A
+text.b : text.value.B
+text.c : ${text.a}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/ant_config_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<config>
+    <foo>bar</foo>
+    <interpolated>foo value = ${foo}</interpolated>
+    <xml>
+        <c>C</c>
+        <d>D</d>
+    </xml>
+    <array>
+        <value>one</value>
+        <value>two</value>
+        <value>three</value>
+    </array>
+</config>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/archive_test_input.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<build>
+    <config>
+        <set name="max.uncompressed.size" value="2000000"/>
+        <set name="root.dir" value="${env.TEMP}/python"/>
+        <set name="max.files.per.archive" value="65000"/>
+        <set name="archive.tool" value="7za"/>
+        <set name="archives.dir" value="${env.TEMP}"/>
+        <set name="temp.build.dir" value="${temp.build.dir}"/>
+        <set name="name" value="python_libs"/>
+        <set name="include" value="lib\*.egg"/>
+    </config>
+</build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_101_bom.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bom>
+  <build>bom_validate_101</build>
+  <content>
+    <project>
+      <name>wv_domain-bh1spp#wv.91_helium_dev:project:tr1nss#1</name>
+      <database>bh1spp</database>
+      <baseline overridden="false">flashlite_3_1-bh1spp#wv.mcl_200929:project:bh1s60#1</baseline>
+      <baseline overridden="false">helix_flash_video-bh1spp#wv.mcl_200929:project:bh1s60#1</baseline>
+      <baseline overridden="false">webvideo-bh1spp#wv.mcl_200929:project:tr1nss#1</baseline>
+      <baseline overridden="true">wv_domain-bh1spp#wv.mcl_200929:project:tr1nss#1</baseline>
+      <folder>
+        <name overridden="true">bh1spp#1369: swbuild's Assigned Or Completed Tasks for Release wv_domain/wv.91</name>
+      </folder>
+      <folder>
+        <name overridden="true">bh1spp#1594: wv_domain 9.1 All completed tasks</name>
+        <task overridden="false">
+          <id>bh1s60#51236</id>
+          <synopsis>Testing Task for Helium</synopsis>
+          <owner>swbuild</owner>
+        </task>
+      </folder>
+      <folder>
+        <name overridden="true">bh1spp#1635: Created for Helium Testing</name>
+        <task overridden="false">
+          <id>bh1spp#52093</id>
+          <synopsis>Testing Task for Helium</synopsis>
+          <owner>swbuild</owner>
+        </task>
+      </folder>
+    </project>
+    <input>
+      <name>N/A</name>
+      <year>0</year>
+      <week>0</week>
+      <version>N/A</version>
+      <icds/>
+    </input>
+    <input>
+      <name>s60</name>
+      <year>0</year>
+      <week>0</week>
+      <version>None</version>
+      <source>
+        <type>grace</type>
+        <service>s60_devices_sw</service>
+        <product>DFS70.91.91</product>
+        <release>S60.91_200927_hw70</release>
+      </source>
+    </input>
+  </content>
+</bom>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_101_bom_delta.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bomDelta>
+  <buildFrom>bom_validate_100</buildFrom>
+  <buildTo>bom_validate_101</buildTo>
+  <content>
+    <folder status="added" overridden="true">bh1spp#1635: Created for Helium Testing</folder>
+    <task status="added" overridden="false">bh1spp#52093: Testing Task for Helium</task>
+  </content>
+</bomDelta>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_102_bom.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bom>
+  <build>bom_validate_102</build>
+  <content>
+    <project>
+      <name>wv_domain-bh1spp#wv.91_helium_dev:project:tr1nss#1</name>
+      <database>bh1spp</database>
+      <baseline overridden="false">flashlite_3_1-bh1spp#wv.mcl_200929:project:bh1s60#1</baseline>
+      <baseline overridden="false">helix_flash_video-bh1spp#wv.mcl_200929:project:bh1s60#1</baseline>
+      <baseline overridden="false">webvideo-bh1spp#wv.mcl_200929:project:tr1nss#1</baseline>
+      <baseline overridden="true">wv_domain-bh1spp#wv.mcl_200929:project:tr1nss#1</baseline>
+      <folder>
+        <name overridden="true">bh1spp#1369: swbuild's Assigned Or Completed Tasks for Release wv_domain/wv.91</name>
+      </folder>
+      <folder>
+        <name overridden="true">bh1spp#1594: wv_domain 9.1 All completed tasks</name>
+        <task overridden="false">
+          <id>bh1s60#51236</id>
+          <synopsis>Testing Task for Helium</synopsis>
+          <owner>swbuild</owner>
+        </task>
+      </folder>
+    </project>
+    <input>
+      <name>N/A</name>
+      <year>0</year>
+      <week>0</week>
+      <version>N/A</version>
+      <icds/>
+    </input>
+    <input>
+      <name>s60</name>
+      <year>0</year>
+      <week>0</week>
+      <version>None</version>
+      <source>
+        <type>grace</type>
+        <service>s60_devices_sw</service>
+        <product>DFS70.91.91</product>
+        <release>S60.91_200927_hw70</release>
+      </source>
+    </input>
+  </content>
+</bom>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_102_bom_delta.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bomDelta>
+  <buildFrom>bom_validate_101</buildFrom>
+  <buildTo>bom_validate_102</buildTo>
+  <content>
+    <folder status="deleted" overridden="true">bh1spp#1635: Created for Helium Testing</folder>
+    <task status="deleted" overridden="false">bh1spp#52093: Testing Task for Helium</task>
+  </content>
+</bomDelta>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_103_bom.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bom>
+  <build>bom_validate_03</build>
+  <content>
+    <project>
+      <name>wv_domain-bh1spp#wv.91_helium_dev:project:tr1nss#1</name>
+      <database>bh1spp</database>
+      <baseline overridden="false">flashlite_3_1-bh1spp#wv.mcl_200929:project:bh1s60#1</baseline>
+      <baseline overridden="false">helix_flash_video-bh1spp#wv.mcl_200929:project:bh1s60#1</baseline>
+      <baseline overridden="false">webvideo-bh1spp#wv.mcl_200929:project:tr1nss#1</baseline>
+      <baseline overridden="true">wv_domain-bh1spp#wv.mcl_200929:project:tr1nss#1</baseline>
+      <folder>
+        <name overridden="true">bh1spp#1369: swbuild's Assigned Or Completed Tasks for Release wv_domain/wv.91</name>
+      </folder>
+      <folder>
+        <name overridden="true">bh1spp#1594: wv_domain 9.1 All completed tasks</name>
+        <task overridden="false">
+          <id>bh1s60#51236</id>
+          <synopsis>Testing Task for Helium</synopsis>
+          <owner>eswaraia</owner>
+        </task>
+      </folder>
+    </project>
+    <input>
+      <name>N/A</name>
+      <year>0</year>
+      <week>0</week>
+      <version>N/A</version>
+      <icds/>
+    </input>
+    <input>
+      <name>s60</name>
+      <year>0</year>
+      <week>0</week>
+      <version>None</version>
+      <source>
+        <type>grace</type>
+        <service>s60_devices_sw</service>
+        <product>DFS70.91.91</product>
+        <release>S60.91_200927_hw70</release>
+      </source>
+    </input>
+  </content>
+</bom>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_103_bom_delta.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bomDelta>
+  <buildFrom>bom_validate_102</buildFrom>
+  <buildTo>bom_validate_103</buildTo>
+  <content/>
+</bomDelta>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/bom_validate_104_bom_delta.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bomDelta>
+  <buildFrom>bom_validate_101</buildFrom>
+  <buildTo>bom_validate_102</buildTo>
+  <content>
+    <folder status="deleted" overridden="true">bh1spp#1635: Created for Helium Testing</folder>
+    <task status="deleted" overridden="false">bh1spp#52093: Task for Helium</task>
+  </content>
+</bomDelta>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bom/build_model_bom.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bom>
+  <build>ido_raptor_mcl_abs_MCL.52.57</build>
+  <content>
+    <project>
+      <name>ABS_domain-abs.mcl_sbs_hewec001:project:tr1s60#1</name>
+      <database>tr1s60</database>
+      <baseline overridden="false">2D_OpenVG_1_0-S60_5.0_2008_wk37_t:project:ou1ape3#1</baseline>
+      <baseline overridden="false">3d_opengl_es_1_1-S60_5.0_2008_wk33:project:ou1ape3#1</baseline>
+      <baseline overridden="true">ABS_domain-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">ActiveIdle2-tr1s60#abs.mcl_200843:project:he1s60#1</baseline>
+      <baseline overridden="false">AknGlobalUI-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">AknIcon-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">AknInputLanguage-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">AknJapaneseReading-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">AknLayoutCompiler-tr1s60#abs.mcl_200839:project:ccm51#1</baseline>
+      <baseline overridden="false">AknPictograph-tr1s60#abs.mcl_200839:project:ccm51#1</baseline>
+      <baseline overridden="false">AknPictographBitmaps-tr1s60#abs.mcl_200839:project:ccm51#1</baseline>
+      <baseline overridden="false">AknSkinContent-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">AknSkinDescCompiler-tr1s60#abs.50_200813:project:ccm51#1</baseline>
+      <baseline overridden="false">AknSkins-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">AppShell-tr1s60#abs.mcl_200843:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">Arabica-abs.50_200830:project:tr1s60#1</baseline>
+      <baseline overridden="false">AvKon-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">Bitmaps2-tr1s60#abs.mcl_200835:project:ccm51#1</baseline>
+      <baseline overridden="false">Charconv-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">Charconvplugin-tr1s60#abs.50_200813:project:ccm51#1</baseline>
+      <baseline overridden="false">Color-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">CommonAdapter-tr1s60#abs.50_200813:project:ccm51#1</baseline>
+      <baseline overridden="false">CommonDialogs-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">CommonUi-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">Csxhelp-tr1s60#abs.mcl_200843:project:bh1s60#1</baseline>
+      <baseline overridden="false">DirectoryLocalizerEx-tr1s60#abs.50_200817:project:e003sa01#1</baseline>
+      <baseline overridden="false">EikStd-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">Exa_CommonDialogs-tr1s60#abs.50_200817:project:e003sa01#1</baseline>
+      <baseline overridden="false">Exa_HierarchicalColumnList-tr1s60#abs.50_200817:project:e003sa01#1</baseline>
+      <baseline overridden="false">Findutil-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">FontProvider-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">GSLangPlugin-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">Icons-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">JPLangUtil-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">Localizer-tr1s60#abs.50_200821:project:ccm51#1</baseline>
+      <baseline overridden="false">M3GCore11-tr1s60#abs.50_200813:project:tr1gfx#1</baseline>
+      <baseline overridden="false">Matsutake-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">OemNokia-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">Psln-tr1s60#abs.mcl_200841:project:ccm51#1</baseline>
+      <baseline overridden="false">PtiAtokCore-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">PtiEngine-tr1s60#abs.mcl_200837:project:ccm51#1</baseline>
+      <baseline overridden="false">PtiT9Core-tr1s60#abs.50_200832:project:ccm51#1</baseline>
+      <baseline overridden="false">PtiT9Core_stub-abs.50_200813:project:tr1s60#1</baseline>
+      <baseline overridden="false">S60Helps-tr1s60#abs.mcl_200841:project:ccm51#1</baseline>
+      <baseline overridden="false">SVGTopt-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">ServiceHandler-tr1s60#abs.50_200813:project:ccm51#1</baseline>
+      <baseline overridden="false">SortUtil-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">SvgtViewerPlugin-tr1s60#abs.mcl_200841:project:bh1s60#1</baseline>
+      <baseline overridden="false">UserDict-tr1s60#abs.50_200813:project:ccm51#1</baseline>
+      <baseline overridden="false">VariatedBitmaps-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">XercesC-abs.50_200830:project:tr1s60#1</baseline>
+      <baseline overridden="false">Xuikon-tr1s60#abs.mcl_200843:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">XuikonTestTools-tr1s60#abs.mcl_200839:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">activeidle-tr1s60#abs.mcl_200843:project:he1s60#1</baseline>
+      <baseline overridden="false">aiwconsumerbasics-abs.50_200813:project:tr1s60#1</baseline>
+      <baseline overridden="false">aknfep-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">aknlayout2-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">applicationinterworkingfw-abs.50_200813:project:tr1s60#1</baseline>
+      <baseline overridden="false">backsteppingservice-hs_2008w42:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">cdl-tr1s60#abs.mcl_200839:project:ccm51#1</baseline>
+      <baseline overridden="false">cdlcompiler-abs.50_200830:project:tr1s60#1</baseline>
+      <baseline overridden="false">cdlcompilertoolkit-abs.50_200826:project:tr1s60#1</baseline>
+      <baseline overridden="false">classicui-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">classicui_dom-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">classicui_sdk-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">commonuis-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">contentpublishingservice-hs_2008w42:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">coreuiapps-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">coreuiapps_dom-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">eikctl-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">fonts-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">gamerecognizer-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">gditools-tr1s60#abs.mcl_200839:project:ccm51#1</baseline>
+      <baseline overridden="false">gfxtools-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">graphics-tr1s60#abs.mcl_200843:project:bs1s60#1</baseline>
+      <baseline overridden="false">graphics_dom-abs.mcl_200833:project:tr1s60#1</baseline>
+      <baseline overridden="false">graphicsaccelaration-abs.mcl_200837:project:tr1s60#1</baseline>
+      <baseline overridden="false">graphicsadapt_dom-abs.50_200825_001:project:tr1s60#1</baseline>
+      <baseline overridden="false">graphicsadapt_sdk-abs.50_200813:project:tr1s60#1</baseline>
+      <baseline overridden="false">graphicsadaptations-abs.mcl_200837:project:tr1s60#1</baseline>
+      <baseline overridden="false">graphicsuis-tr1s60#abs.mcl_200841:project:bs1s60#1</baseline>
+      <baseline overridden="false">graphicsuis_dom-abs.mcl_200841:project:tr1s60#1</baseline>
+      <baseline overridden="false">hitchcock-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">iconsd-tr1s60#abs.mcl_200833:project:sa1ui#1</baseline>
+      <baseline overridden="false">inputmethods-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">inputmethods_dom-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">inputmethods_sdk-abs.mcl_200841:project:tr1s60#1</baseline>
+      <baseline overridden="false">layouts-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">locales-abs.mcl_200841:project:tr1s60#1</baseline>
+      <baseline overridden="false">loce32-tr1s60#abs.mcl_200841:project:ccm51#1</baseline>
+      <baseline overridden="false">m3gapi-tr1s60#abs.50_200813:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">numbergrouping-tr1s60#abs.50_200826:project:ccm51#1</baseline>
+      <baseline overridden="false">ocrsrv-abs.50_200830:project:tr1s60#1</baseline>
+      <baseline overridden="false">palette-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">peninputarc-tr1s60#abs.mcl_200843:project:be1s60pr#1</baseline>
+      <baseline overridden="false">peninputcommonctrls-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">peninputcommonlayout-tr1s60#abs.mcl_200843:project:be1s60pr#1</baseline>
+      <baseline overridden="false">peninputgenerichwr-tr1s60#abs.mcl_200843:project:be1s60pr#1</baseline>
+      <baseline overridden="false">peninputgenericitut-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">peninputgenericvkb-tr1s60#abs.mcl_200843:project:be1s60pr#1</baseline>
+      <baseline overridden="false">peninputhwrboxcn-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">peninputhwrfscn-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">peninputhwrtrui-tr1s60#abs.mcl_200843:project:be1s60pr#1</baseline>
+      <baseline overridden="false">peninputvkbcn-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">pictographs-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">power_save_display_mode_stub-abs.50_200813:project:tr1s60#1</baseline>
+      <baseline overridden="false">pticpicore-tr1s60#abs.mcl_200843:project:be1s60pr#1</baseline>
+      <baseline overridden="false">ptidecumacore-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">ptienginev2-abs.mcl_200841:project:tr1s60#1</baseline>
+      <baseline overridden="false">ptihanwangcore-abs.mcl_200837:project:tr1s60#1</baseline>
+      <baseline overridden="false">ptiindicphoneticcore-abs.50_200817:project:tr1s60#1</baseline>
+      <baseline overridden="false">ptivocore-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">ptixt9core-abs.50_200830:project:tr1s60#1</baseline>
+      <baseline overridden="false">reszip-tr1s60#abs.50_200817:project:ccm51#1</baseline>
+      <baseline overridden="false">s60config-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">sapi_actionhandler-tr1s60#abs.mcl_200843:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">sapi_backstepping-hs_2008w42:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">sapi_contentpublishing-tr1s60#abs.mcl_200843:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">screensaver-tr1s60#abs.mcl_200843:project:ccm51#1</baseline>
+      <baseline overridden="false">skincompiler-abs.50_200813:project:tr1s60#1</baseline>
+      <baseline overridden="false">skins-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">srsf-mui.mcl_200843:project:tr1nss#1</baseline>
+      <baseline overridden="false">srsfenginestub-mui.mcl_200843:project:tr1nss#1</baseline>
+      <baseline overridden="false">svgtviewer-tr1s60#abs.mcl_200841:project:bs1s60#1</baseline>
+      <baseline overridden="false">tactileclickplugin_stub-tr1s60#abs.50_200813:project:e003sa01#1</baseline>
+      <baseline overridden="false">tactilefeedback-tr1s60#abs.mcl_200839:project:e003sa01#1</baseline>
+      <baseline overridden="false">textinput-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">tfxserver-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">themeinstaller-tr1s60#abs.50_200819:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">toollibraries-abs.50_200830:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiaccelerator-abs.mcl_200841:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiacceltk-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiconfig-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uifw-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uigraphics-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiklaf-tr1s60#abs.50_200824:project:ccm51#1</baseline>
+      <baseline overridden="false">uiresources-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiresources_dom-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiresources_sdk-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uishellservices-tr1s60#abs.mcl_200843:project:bh1s60pm#1</baseline>
+      <baseline overridden="false">uishellservices_dom-tr1s60#abs.mcl_200843:project:bh1s60pm#1</baseline>
+      <baseline overridden="false">uitools-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">uitools_dom-abs.mcl_200839:project:tr1s60#1</baseline>
+      <baseline overridden="false">uitools_sdk-abs.50_200817:project:tr1s60#1</baseline>
+      <baseline overridden="false">uiutils-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">uniteditorex-abs.50_200817:project:tr1s60#1</baseline>
+      <baseline overridden="false">vcommand-mui.mcl_200843:project:tr1nss#1</baseline>
+      <baseline overridden="false">voiceservices-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">voicesrv_dom-abs.mcl_200841:project:tr1s60#1</baseline>
+      <baseline overridden="false">voiceui-mui.mcl_200843:project:tr1nss#1</baseline>
+      <baseline overridden="false">voiceuis-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">widgeteditors-tr1s60#abs.50_200819:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">xcfw-tr1s60#abs.mcl_200839:project:ou1s60ui#1</baseline>
+      <baseline overridden="false">xmlui-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">xmlui_dom-abs.mcl_200843:project:tr1s60#1</baseline>
+      <baseline overridden="false">xmluifw-abs.mcl_200843:project:tr1s60#1</baseline>
+      <folder>
+        <name overridden="true">tr1s60#5856: all completed tasks for release ABS_domain/abs.mcl for collaborative projects</name>
+        <task overridden="false">
+            <id>e002sa09#10745</id>
+            <synopsis>ActiveIdle2: Error:DPEE-7KEGRT: S60SW Language Variant Testing - E.T.: S60 5.0 PF52.50 wk41: Control panel: Truncation in menu item home screen theme (MCL)</synopsis>
+        </task>
+      </folder>
+      <folder>
+        <name overridden="true">tr1s60#6130: wbernard's Assigned Or Completed Tasks for Release ABS_domain/abs.mcl</name>
+      </folder>
+    </project>
+  </content>
+</bom>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/ARM11.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+#<bsf>#
+
+# This file customizes the default ARMV5. It specifies a platform that uses
+# most optimization for arm936 based engines
+
+customizes ARMV5_ABIV1
+
+# The following options that can be overridden by MMP files
+common_options	--cpu ARM1136JF-S --diag_suppress 1,161,654,1135,1152,1300 --diag_error 1267
+
+# Fixed options for this build. These options should only be changed with great care since
+# they have the potential to introduce incompatible ABI (or machine) level effects.
+# -cpu 5T - this build just targets a generic 5T
+# -Ono_known_library - we use our own library so tell the compiler not to make assumptions about its implementation
+# -fpu softvfp - some system code explicitly assumes this variant of the EABI (softvfp+vfp could be used on say XScale)
+# --dll_vtbl - this switches on class exporting and is needed to support Symbian OS DLL model
+# -apcs /inter - redundant on 5T, but worth saying anyway
+# --enum_is_int - force all enum entries to be sizeof(int) which avoids problems when passing enums between 5T and 9E libs
+invariant_options	-Ono_known_library --enum_is_int --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --APCS /inter --dllimport_runtime -O3 -Otime
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/ARM11_arm.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+#<bsf>#
+
+# This file customizes the default ARMV5. It specifies a platform that uses
+# most optimization for arm936 based engines
+
+customizes ARMV5_ABIV1
+
+# The following options that can be overridden by MMP files
+common_options	--cpu ARM1136JF-S --diag_suppress 1,161,654,1135,1152,1300 --diag_error 1267
+
+# Fixed options for this build. These options should only be changed with great care since
+# they have the potential to introduce incompatible ABI (or machine) level effects.
+# -cpu 5T - this build just targets a generic 5T
+# -Ono_known_library - we use our own library so tell the compiler not to make assumptions about its implementation
+# -fpu softvfp - some system code explicitly assumes this variant of the EABI (softvfp+vfp could be used on say XScale)
+# --dll_vtbl - this switches on class exporting and is needed to support Symbian OS DLL model
+# -apcs /inter - redundant on 5T, but worth saying anyway
+# --enum_is_int - force all enum entries to be sizeof(int) which avoids problems when passing enums between 5T and 9E libs
+invariant_options	-Ono_known_library --enum_is_int --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --APCS /inter --dllimport_runtime -O3 -Otime --arm
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/ARM926_arm.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+#<bsf>#
+
+# This file customizes the default ARMV5. It specifies a platform that uses
+# most optimization for arm936 based engines
+
+customizes ARMV5_ABIV1
+
+# The following options that can be overridden by MMP files
+common_options	--cpu ARM926EJ-S --diag_suppress 1,161,654,1135,1152,1300 --diag_error 1267
+
+# Fixed options for this build. These options should only be changed with great care since
+# they have the potential to introduce incompatible ABI (or machine) level effects.
+# -cpu 5T - this build just targets a generic 5T
+# -Ono_known_library - we use our own library so tell the compiler not to make assumptions about its implementation
+# -fpu softvfp - some system code explicitly assumes this variant of the EABI (softvfp+vfp could be used on say XScale)
+# --dll_vtbl - this switches on class exporting and is needed to support Symbian OS DLL model
+# -apcs /inter - redundant on 5T, but worth saying anyway
+# --enum_is_int - force all enum entries to be sizeof(int) which avoids problems when passing enums between 5T and 9E libs
+invariant_options	-Ono_known_library --enum_is_int --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --APCS /inter --dllimport_runtime -O3 -Otime --arm
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/ARM9E.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+#<bsf>#
+
+# NOTE Some options modified as originals obsolete e.g add double dash prefix
+# Example build specialization file 
+# 
+# NB currently specialization only applies to ARMV5 build using RVCT.
+
+# This file customizes the default ARMV5. It specifies a build that
+# always uses optimization level O1 rather than the default O2.
+CUSTOMIZES ARMV5_ABIV1
+
+# The following options that can be overridden by MMP files
+
+# Use these options when compiling user-side THUMB code
+thumb_options -O1
+
+# Use these options when compiling user-side ARM code
+arm_options	--arm -O1
+
+# Use these options when compiling Kernel code
+kernel_options	--arm -O1 
+
+# This just factors out common (contingent) options from the above.
+# These options can also be overridden by MMP files.
+common_options	--cpu ARM9E --diag_suppress 1,161,654,1135,1152,1300 --diag_error 1267 --exceptions --exceptions_unwind --export_all_vtbl
+
+# Fixed options for this build. These options should only be changed with great care since
+# they have the potential to introduce incompatible ABI (or machine) level effects.
+# -cpu 5T - this build just targets a generic 5T
+# -Ono_known_library - we use our own library so tell the compiler not to make assumptions about its implementation
+# -fpu softvfp - some system code explicitly assumes this variant of the EABI (softvfp+vfp could be used on say XScale)
+# --dll_vtbl - this switches on class exporting and is needed to support Symbian OS DLL model
+# -apcs /inter - redundant on 5T, but worth saying anyway
+# --enum_is_int - force all enum entries to be sizeof(int) which avoids problems when passing enums between 5T and 9E libs
+invariant_options	-Ono_known_library --enum_is_int --FPU softvfp --dll_vtbl --export_vtbl --export_all_vtbl --no_vfe --APCS=/interwork
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/armv6.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+#<bsf>#
+
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, etc, then it can be done via a different BSF file
+# NOTE: The options specified here for the compiler disable the unaligned memory access.
+
+CUSTOMIZES ARMV5
+
+INVARIANT_OPTIONS --cpu 6 --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --apcs /inter --memaccess -UL41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/armv6_abiv1.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+#<bsf>#
+
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, etc, then it can be done via a different BSF file
+# NOTE: The options specified here for the compiler disable the unaligned memory access.
+
+CUSTOMIZES ARMV5_ABIV1
+
+INVARIANT_OPTIONS --cpu 6 --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --apcs /inter --memaccess -UL41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/config.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+#<bsf>#
+
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, --memaccess -UL41, etc, then it can be done via a different
+# BSF file
+
+CUSTOMIZES VARIANT
+
+VARIANT
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/product.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+#<bsf>#
+
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, --memaccess -UL41, etc, then it can be done via a different
+# BSF file
+
+CUSTOMIZES platform
+
+VARIANT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/bsf/variant.bsf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+#<bsf>#
+
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other
+# specific options are required such as --cpu ARM1136J-S, --memaccess -UL41, etc, then it can be done via a different
+# BSF file
+
+CUSTOMIZES ARMV5
+
+VIRTUALVARIANT
+COMPILEWITHPARENT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/build/io/abld_what.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+=== Stage=3771 == ibusal_chipset_product
+-- abld -what build armv5
+--- EBS_CLIENT3 Executed ID 8616
+++ Started at Thu Sep 20 01:56:51 2007
++++ HiRes Start 1190278611.17028
+Chdir \ncp_sw\spp_core4.0\ibusal_chipset\group\product
+\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd
+\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd.map
++++ HiRes End 1190278612.21715
+++ Finished at Thu Sep 20 01:56:52 2007
+=== Stage=3771 == ibusal_chipset_product2
+-- abld -what build armv5
+--- EBS_CLIENT1 Executed ID 8617
+++ Started at Thu Sep 20 01:56:51 2007
++++ HiRes Start 1190278611.34216
+Chdir \ncp_sw\spp_core4.0\ibusal_chipset\group\product2
+\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd
+\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd.map
++++ HiRes End 1190278612.35777
+++ Finished at Thu Sep 20 01:56:52 2007
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/build/io/test_rofs.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+File block for dir 'Bootdata' @offs=0x5bf34, size=56
+File block for dir '101F72A6' @offs=0x5bf6c, size=112
+File block for dir 'Fonts' @offs=0x5bfdc, size=210
+File block for dir '101f7a85' @offs=0x5c0b0, size=60
+File block for dir '10009d8f' @offs=0x5c0ec, size=54
+Reading file \epoc32\data\Z\Resource\ICL\jpegcodec_extra.rsc to image
+File '\epoc32\data\Z\Resource\ICL\jpegcodec_extra.rsc' size: 000000ca
+Reading file \epoc32\release\ARMV5\urel\jpegcodec.dll to image
+Original file:'\epoc32\release\ARMV5\urel\jpegcodec.dll' is compressed by method:101f7afc
+Compressed executable File '\epoc32\release\ARMV5\urel\jpegcodec.dll' size: 00015e80, mode:101f7afc
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/build/io/test_rom.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+Primary details (Multiple Kernels):
+
+Kernel 1:
+Uids:                    1000007a 1000008b 100041af 6bf50df9
+Entry point:             f8008108
+Code start addr:         f8008000
+Data start addr:         f803dfec
+DataBssLinearBase:       64000000
+Text size:               00035fec
+Code size:               00035fec
+Data size:               000001f8
+BssSize:                 00001a38
+Total data size:         00001c30
+Heap min:                00008000
+Heap max:                00ffc000
+Stack size:              00001000
+Dll ref table:           00000000
+Export directory:        f803a1c8
+Export dir count:        00000328
+Hardware variant:        09080001
+Flags:                   8500002a
+Secure ID:               100041af
+Vendor ID:               70000001
+Capability:              00000000 000fffff
+Tools Version:           2.01(576)
+Module Version:          10.0
+Exception Descriptor:    00000000
+Priority:                350
+
+Summary of file sizes in rom:
+Overhead (bootstrap+gaps+sectioning)	10723
+Overhead (directory size)	25232
+\epoc32\release\ARMV5\urel\__ekern.exe	221788
+\epoc32\release\ARMV5\urel\elocd.ldd	15192
+\epoc32\release\ARMV5\urel\__medint.pdd	2320
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/build/metadata/abld_what_db_test.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+=== Stage=3771 == ibusal_chipset_product
+-- abld -what build armv5
+--- EBS_CLIENT3 Executed ID 8616
+++ Started at Thu Sep 20 01:56:51 2007
++++ HiRes Start 1190278611.17028
+Chdir \ncp_sw\spp_core4.0\ibusal_chipset\group\product
+\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd
+\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd.map
++++ HiRes End 1190278612.21715
+++ Finished at Thu Sep 20 01:56:52 2007
+=== Stage=3771 == ibusal_chipset_product
+-- abld -what build armv5
+--- EBS_CLIENT1 Executed ID 8617
+++ Started at Thu Sep 20 01:56:51 2007
++++ HiRes Start 1190278611.34216
+Chdir \ncp_sw\spp_core4.0\ibusal_chipset\group\product
+\epoc32\release\ARMV5\UDEB\_product_accelerometerpdd.pdd
+\epoc32\release\ARMV5\UDEB\_product_accelerometerpdd.pdd.map
++++ HiRes End 1190278612.35777
+++ Finished at Thu Sep 20 01:56:52 2007
+=== Stage=3771 == test_one
+-- abld -what build armv5
+--- EBS_CLIENT1 Executed ID 8617
+++ Started at Thu Sep 20 01:56:51 2007
++++ HiRes Start 1190278611.34216
+Chdir \ncp_sw\spp_core4.0\ibusal_chipset\group\product
+\epoc32\release\ARMV5\UDEB\foo.dll
+\epoc32\release\ARMV5\UDEB\bar.dll
++++ HiRes End 1190278612.35777
+++ Finished at Thu Sep 20 01:56:52 2007
+=== Stage=3771 == test_two
+-- abld -what build armv5
+--- EBS_CLIENT1 Executed ID 8617
+++ Started at Thu Sep 20 01:56:51 2007
++++ HiRes Start 1190278611.34216
+Chdir \ncp_sw\spp_core4.0\ibusal_chipset\group\product
+\epoc32\release\ARMV5\UDEB\foo.dll
+\epoc32\release\ARMV5\UDEB\bar.dll
++++ HiRes End 1190278612.35777
+++ Finished at Thu Sep 20 01:56:52 2007
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+REM <branchInfo originator="cishih">
+REM Testing if it's good~~~
+REM </branchInfo>
+REM BRANCH 17-09-07 :cishih
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.cpp	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+// <branchInfo originator="prozeniu" error="wiki-07wk24-311" since="07-06-14" category="fix">
+// We need TwistOpen and TwistClose to cause display to change between
+// landscape and portrait, but SysAp is consuming the key events.  Try
+// treating them as Flip events are handled already by SysAp.
+// </branchInfo>
+// BRANCH 07-06-14
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.h	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,5 @@
+// <branchInfo originator="prozeniu" error="wiki-07wk24-311" since="07-06-14" category="fix">
+// We need TwistOpen and TwistClose to cause display to change between
+// landscape and portrait, but SysAp is consuming the key events.  Try
+// treating them as Flip events are handled already by SysAp.
+// </branchInfo>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.hrh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+// <branchInfo>
+// puikko ME SCD DeSW: wk21 Flag fix
+// </branchInfo>
+// BRANCH 07-06-06
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.iby	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,5 @@
+// <branchInfo originator="prozeniu" error="wiki-07wk22-002" since="07-05-22" category="fix">
+// Since Catalogs is not compiling at this point, and we are not building it, don't try to
+// pull it into the rom.  Also, tfxserver is crashing, so don't build or pull it in either.
+// </branchInfo>
+// BRANCH 07-05-22
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+// <branchInfo originator="wbernard">
+// Fix target export, which cause issue when cleanexport.
+// </branchInfo>
+// BRANCH 07-02-07
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+// <branchInfo>
+// Test info, so whatever~
+// </branchInfo>
+// BRANCH  17-09-07 :cishih
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+# <branchInfo originator="rmetcalf" error="rm-wiki-060530-6" since="06-05-30" category="build_from_source">
+# Move command to makmake as EBS does not call abld build
+# </branchInfo>
+# BRANCH 06-05-30
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.mmp	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+//<branchInfo originator="suchatte" since="07-04-16" category="merge"> 
+//Activate PCFW for Screensaver 
+//</branchInfo> 
+// BRANCH 07-04-16: suchatte
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+# <branchInfo originator="wbernard">
+# Support SPP mechanism for flags support.
+# </branchInfo>
+# BRANCH 07-05-08
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+# <branchInfo originator="cishih">
+# Again, it is just a test
+# </branchInfo>
+# BRANCH 17-09-07 :cishih
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+//<branchInfo originator="sanummel" since="07-03-22" category="" error="kkk"> 
+//Add rofsfiles for usage in paged images
+//</branchInfo> 
+// BRANCH 07-03-22: sanummel
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,2 @@
+<!-- <branchInfo originator="broum">Enabling all the HWRM light zones target for product</branchInfo> -->
+	<!-- BRANCH 07-05-17 -->
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test1.cmd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4 @@
+REM <branchInfo originator="marhyvon" since="22-02-07" category="new feature" error="foobar123">
+REM k
+REM </branchInfo>
+REM BRANCH 22-02-07 :marhyvon
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/comments_test2.cmd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,3 @@
+#<branchInfo originator="marhyvon" since="22-02-07" category="new feature" error="foobar123">
+#</branchInfo>
+# BRANCH 22-02-07 :marhyvon
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/config_test.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<build>
+    <config name="test_spec" abstract="true">
+        <set name="A" value="foo"/>
+        <set name="B" value="parent: ${A}"/>
+        <!-- 0 -->
+        <config>
+            <set name="B" value="child -> ${A}"/>
+            <set name="C" value="missing value test ${does_not_exist}"/>
+            <set name="node.content">
+This is the value!
+            </set>
+        </config>
+        
+        <!-- 1 -->
+        <config>
+            <set name="C" value="one"/>
+            <set name="C" value="two"/>
+        </config>
+        
+        <!-- 2 -->
+        <config/>
+        
+        <!-- 3 -->
+        <config name="spec.with.type" type="test.type"/>
+        
+        <!-- 4 -->
+        <config>
+            <append name="A" value="bar"/>
+        </config>
+        
+        <!-- 5 -->
+        <config name="parent">
+            <set name="template" value="value -> ${my.value}"/>
+            <set name="my.value" value="from parent"/>
+    
+            <config name="child">
+                <set name="my.value" value="from child"/>
+            </config>
+        </config>
+
+        <!-- 6 -->
+        <config name="spec.with.type2" type="test.type"/>
+    
+    </config>
+    
+    
+    <config name="test_list" abstract="true">
+        <append name="include" value="foo_${custom.property}"/>
+        <config abstract="true">
+            <append name="include" value="bar1_${custom.property}"/>
+            <set name="include" value="bar2_${custom.property}"/>
+            <config name="test_list_config1">
+                    <set name="custom.property" value="config1"/>
+            </config>
+
+            <config name="test_list_config2">
+                    <set name="custom.property" value="config2"/>
+            </config>    
+        </config>
+    </config>
+
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/data_model_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<heliumDataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\tools\common\schema\helium_data_model.xsd">
+    <property>
+        <name>test.property.1</name>
+        <usage>required</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Test property one.</description>
+    </property>
+    <property>
+        <name>test.property.2</name>
+        <usage>optional</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Test property two.</description>
+    </property>
+    <property>
+        <name>test.property.3</name>
+        <usage>optional</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Test property three.</description>
+    </property>    
+    <group>
+        <name>testGroup</name>
+        <description/>
+        <propertyRef usage="required">test.property.2</propertyRef>
+        <propertyRef usage="optional">test.property.3</propertyRef>
+        <propertyRef usage="optional">test.property.1</propertyRef>
+    </group>
+</heliumDataModel>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/data_model_validation_group_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<heliumDataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\tools\common\schema\helium_data_model.xsd">
+    <property>
+        <name>test.property.1</name>
+        <usage>required</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Test property one.</description>
+    </property>    
+    <group>
+        <name>testGroup</name>
+        <description/>
+        <propertyRef usage="required">test.property.1</propertyRef>
+        <propertyRef usage="required">test.property.2</propertyRef>
+    </group>
+</heliumDataModel>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/data_model_validation_property_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<heliumDataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\tools\common\schema\helium_data_model.xsd">
+    <property>
+        <name>test.property.1</name>
+        <description>Test property one.</description>
+    </property>      
+    <group>
+        <name>testGroup</name>
+        <description/>
+        <propertyRef usage="required">test.property.1</propertyRef>
+    </group>
+</heliumDataModel>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/data_model_validation_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<heliumDataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\tools\common\schema\helium_data_model.xsd">
+    <property>
+        <name>test.property.1</name>
+        <usage>required</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Test property one.</description>
+    </property>
+    <property>
+        <name>test.property.2</name>
+        <usage>optional</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Test property two.</description>
+    </property>
+    <property>
+        <name>test.property.3</name>
+        <usage>optional</usage>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>**Test property Three.</description>
+    </property>   
+    <group>
+        <name>testGroup</name>
+        <description>Group description test.</description>
+        <propertyRef usage="required">test.property.1</propertyRef>
+        <propertyRef usage="required">test.property.2</propertyRef>
+    </group>
+</heliumDataModel>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/distribution.policy.extended_for_sf.id_status.csv	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+ID,Include in build?,Regexp,Symbian Foundation License,Eclipse Public License,Supplier,Description,Contact,Other Notes
+0,Yes,Nokia,,,Nokia,Free to deliver,,
+1,No,Nokia,,,Nokia,Nokia internal sw,,
+3,Yes,Nokia,Yes,No,Nokia,Symbian Foundation License,,
+7,Yes,Nokia,No,Yes,Nokia,Eclipse Public License,,
+10,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR NB encoder,Eugene Tsai ,10 - AmrNbCodecPlugin         -> project for AMR NB decoder & encoder
+11,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR NB decoder,Eugene Tsai ,
+12,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR WB encoder,Eugene Tsai ,12 - AmrWbCodecPlugin         -> project for AMR WB decoder
+13,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR WB decoder,Eugene Tsai ,
+21,Yes,Beatnik,,,Beatnik Inc.,MobileBAE v2.1 audio engine from Beatnik Inc.,Vesa Jaamuru,
+30,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed MP3 decoder,Eugene Tsai ,30 - MP3CodecPlugin           -> project for MP3 decoder
+40,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed MPEG-4 AAC decoder,Eugene Tsai ,>40 - AACCodecPlugin           -> project for AAC decoder
+41,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed eAAC+ decoder ,Eugene Tsai ,>40 - AacEncoderPlugin         -> project for AAC-LC encoder
+42,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed MPEG-4 AAC encoder,Eugene Tsai ,>40 - EAacPlusCodecPlugin      -> project for EAacPlus decoder
+50,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed H.263 encoder,Vesa Lunden,
+51,Bin,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,Emuzed MDF H263/MPEG4 Decoder,Brian Yan,
+52,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,Emuzed MDF Video Postprocessor,Brian Yan,
+53,Bin,Nokia,,,Nokia,NRC MDF H264 (AVC) Decoder,Brian Yan,
+54,No,Helix,,,Helix,Helix MDF RealVideo-8/9 Decoder,Brian Yan,
+55,No,Helix,,,Helix,Helix CMMFCodec RealAudio-8 Decoder,Brian Yan,
+56,No,Helix,,,Helix,Helix CMMFCodec RealAudio-Voice Decoder,Brian Yan,
+57,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,Emuzed h.264/AVC ARM11 video encoder,Hippel„inen Juha-Pekka,
+60,Yes,PacketVideo,,,PacketVideo,Circuit switched Video Telephony Solution (3G-324M) from PacketVideo Corporation ,Rantanen Pasi,
+80,Yes,Real,,,Real Networks Inc.,RealOnePlayerEngine,Simon Khoo,
+81,Bin,Helix,,,Helix,"Helix DNA engine sources, restricted protocol and codex from RealNetworks, Inc. ",Yu I-Chin,
+82,Yes,Helix,,,Helix,"Helix DNA engine binaries, restricted protocol and codex from RealNetworks, Inc. ",Yu I-Chin,
+100,Yes,Sun,,,Sun Microsystems,Java JSR-135,Simo F„lt,
+101,Yes,Nokia,,,Nokia,Java JSR-75,Simo F„lt,
+102,Yes,Sun,,,Sun Microsystems,Java J2ME,Simo F„lt,General Java environment files
+103,Yes,.,,,N/A,KVM virtual machine,Simo F„lt,
+104,Yes,.,,,N/A,Monty virtual machine,Simo F„lt,
+105,Yes,Sun,,,Sun Microsystems,Software implementation of J2ME Web Services Specification (JSR-172),Simo F„lt,
+106,Yes,Sun,,,Sun Microsystems,Software implementation of Security and Trust Services API for J2ME (JSR-177),Simo F„lt,
+107,No,Sun,,,Sun Microsystems,Java VSCL implementation,Simo F„lt,
+108,No,Sun,,,Sun Microsystems,Java for iMode,Simo F„lt,
+109,No,Nokia,,,Nokia,Nokia proprietary Java API supplements,Simo F„lt,
+110,Yes,Tegic,,,Tegic,Tegic T9 WINS binaries,Antti Sepp„l„,
+111,No,Tegic,,,Tegic,"THUMB of T9 from Tegic Communications, Inc.",Antti Sepp„l„,
+115,Yes,Matsutake,,,Matsutake,Matsutake Predictive Text Input Engine Binaries,Antti Sepp„l„,PTI Engine only for Japanese SDK
+116,No,Tegic,,,Tegic,Xt9TegicDelivery,Antti Sepp„l„,"From 5.0 releases onwards, never delivered"
+117,No,Zi,,,Zi Corporation,ZiDelivery,Antti Sepp„l„,"From 5.0 releases onwards, delivered by contracts"
+130,No,CESI,,,CESI,Chinese bitmap fonts from Chinese Electronics Standardization Technical Institute.,Vesa H„rk”nen,
+131,Yes,Ricoh,,,Ricoh,Ricoh Japan fonts,Vesa H„rk”nen,
+132,Yes,Agfa,,,Agfa,Agfa Thai fonts,Vesa H„rk”nen,
+133,Yes,Agfa,,,Agfa,"Vector fonts & rendering engine from Monotype Imaging (Agfa) including WGL4, Arabic, Hebrew, Thai, Japanese, Chinese",Vesa H„rk”nen,Platform fonts that are sublicensed
+140,Yes,SJTU,,,SJTU,SJTU Sunway Chinese-English dictionary,Nie Xin,
+151,Yes,Entrust,,,Entrust,Entrust root certificates,Ilhan Gurel  ,
+152,Yes,Verisign,,,Verisign,Verisign root certificates,Ilhan Gurel  ,
+153,Yes,Symbian,,,Symbian Software Ltd,Symbian root certificates,Ilhan Gurel  ,
+157,Yes,BeTrusted,,,BeTrusted Ltd.,Root Certificates from BeTrusted Ltd.,Ilhan Gurel  ,
+158,Yes,Equifax,,,Equifax,Equifax root certificate,Ilhan Gurel  ,
+159,Yes,Valicert,,,Valicert,Valicert Class2 CA,Ilhan Gurel  ,\s60\mw\securityservice\spkiutilities\Certificates\data\S60_certificates\Valicert
+161,Yes,CyberTrust,,,CyberTrust,CyberTrust,Ilhan Gurel  ,securityservices\pkiutilities\Certificates\data\S60_certificates\CyberTrust
+162,Yes,Starfield,,,Starfield,Starfield,Ilhan Gurel  ,\s60\mw\securityservices\pkiutilities\Certificates\data\S60_certificates\Starfield
+163,Yes,GoDaddy,,,GoDaddy,GoDaddy,Ilhan Gurel  ,\s60\mw\securityservices\pkiutilities\Certificates\data\S60_certificates\GoDaddy
+165,Yes,.,,,GeoTrust,"GeoTrust root certificate, part of S60_certificates component","Heikkinen Timo.J (Nokia-D-MSW/Tampere), Hyttinen Teuvo (Nokia-D-MSW/Tampere)",3rd party
+171,Yes,Sun,,,Sun Microsystems,Java eSWT,Simo F„lt,Not allowed to go to licensees
+172,No,Nokia,,,Nokia,JSR-238 Mobile Internationalization API,Simo F„lt,Early dev for Taco
+180,Yes,Agfa,,,Agfa,"Vector fonts & rendering engine from Monotype Imaging (Agfa) including WGL4, Arabic, Hebrew, Thai, Japanese, Chinese",Mikko Tuokko,
+200,Yes,Netscape,,,Netscape,Netscape Plugin API,Eki Monni,
+210,No,Macromedia,,,Macromedia,Macromedia Flash,Michael Klingele ,
+220,No,3C|LLC,,,"3C, LLC","SD memory card specifications from 3C, LLC and related Nokia proprietary implementation",Jyri Lassi,legal contact
+230,Yes,Apache,,,Apache,Arabica & Xerces C++ XML parser (OSS),Mikko Amper,legal contact
+240,Yes,.,,,N/A,KJS Scripting Engine (OSS),Alan M. Lerner,
+241,Yes,.,,,N/A,Javascriptcore ,Alan M. Lerner,
+242,Yes,.,,,N/A,Webcore ,Alan M. Lerner,
+250,Yes,.,,,N/A,libxml2,Alan M. Lerner,
+260,No,Vodafone,,,Vodafone,Vodafone  pictographs,Attila Bencze,These are not allowed to be delivered for external licencees without Vodafone permission
+261,No,DoCoMo,,,DoCoMo,DoCoMo  pictographs,Attila Bencze,These are not allowed to be delivered for external licencees without DoCoMo permission
+280,No,Nokia,,,Nokia,CXX Specifications (related to WLAN) from Cisco,M„enp„„ Henri,3rd party or Complement or both?
+281,Bin,Nokia,,,Nokia,Cisco Compatible eXtensions (CCX) for WLAN devices binaries,Pekko Vehvil„inen,Allowed to be delivered
+290,Yes,.,,,N/A,3GP_EXT_Parser,Raharja Flo,
+300,Yes,Nokia,,,Nokia,FileBrowse 3.0 from Nokia,,
+310,No,Hanwang,,,Hanwang,OCR Technology including OCR engine and OCR language packages from Hanwang,Wang Lei 4,
+350,No,Vision,,,Vision Object,PtiEngine core which wraps HandWriting Recognition engine from Vision Object company,Hametvaara Vesa,3rd party
+400,No,.,,,N/A,Components implementing Japanese hadwriting recognition and virtual keyboard.,Tapio Hinkkanen,Nokia component implementation including 3rd party SW
+500,No,Vodafone,,,Vodafone,Vodafone Branding content,Sami Jylkk„,Complement
+510,No,DoCoMo,,,DoCoMo,Docomo Complement Package,Sami Jylkk„,Complement
+520,No,Vodafone,,,Vodafone,Vodafone Complement Package 1,Timo Suhonen,Complement
+525,No,Vodafone,,,Vodafone,Vodafone Complement Package 1.1,Gudena Teja ,Complement
+530,No,China,,,China Mobile,CMCC Complement Package,Tong Lifeng,Complement,,
+540,No,Vodafone,,,Vodafone,Vodafone Complement Package 2,Gudena Teja ,Complement,,
+545,No,Vodafone,,,Vodafone,"Vodafone Complement Package 2.1, Complement",Gudena Teja ,Complement,,
+546,No,Vodafone,,,Vodafone,Vodafone Complement Package 2.1G for Gadget,Gudena Teja ,Complement,,
+547,No,Vodafone,,,Vodafone,Vodafone Complement Package 2.1L for Lumiere,Gudena Teja ,Complement,,
+550,No,Orange,,,Orange,Orange Complement Package 2,Gudena Teja ,Complement,,
+551,No,Orange,,,Orange,"OCP2 (Orange CP Release 2.1 ). This is the next version of Orange Complementary package which includes Orange customizations and Orange specific IM branding.
+",Niittynen Anu (Nokia-D-MSW/Tampere),Complement,,
+560,No,mobile,,,T-mobile,T-mobile Complement Package 2,Gudena Teja ,Complement,,
+565,No,mobile,,,T-mobile,"T-mobile Complement Package 3, Complement",,,,Not delivered
+570,No,AT,,,AT & T,AT & T Complement Package,Gudena Teja ,Complement,,
+580,No,AT,,,AT & T,AT & T Complement Package 2,Fuentes Jose.A (Nokia-D-MSW/SanDiego),Complement,,
+600,No,Nokia,,,Nokia,Rosetta I-mode,Sarsila Kari,,,
+610,No,Nokia,,,Nokia,3.2 ED VoIP and CCE components ,Sami Uusitalo,not allowed to go to the licensees,,
+620,Yes,Nokia,,,Nokia,"CCE REQ components: cce, spsettings cch",Jouni Alan„r„,,,
+650,Bin,.,,,N/A,CASN RTS ,Katajainen Pasi,binary only,,
+700,No,.,,,N/A,WMDRM,Eckhart K”ppen and Simo Kivim„ki,,,
+800,Yes,Sun,,,Sun Microsystems,Java WECE External j9,Simo F„lt,"Saa menn„ S60 lisensoijille, mutta ei saa levitt„„ Nokian sis„ll„."
+810,Yes,Sun,,,Sun Microsystems,Java WEME Internal j9,Simo F„lt,"Saa levitt„„ Nokian sis„ll„, mutte EI saa menn„ ulkoisille asiakkaille."
+900,No,Zi,,,Zi Corporation,Decuma/HWR from Zi Corporation,Wang Lei,
+950,No,Nokia,,,Nokia,SP API Test Automation,Ville Ilvonen,To be removed from external licensees
+1000,No,Nokia,,,Nokia,PC Suite,Aki Lehto (prod. mngr),Complement
+1010,No,Nokia,,,Nokia,Nokia PoC Client,Teemu Polo,Complement
+1020,Yes,Nokia,,,Nokia,ThemeStudio,Janne K Kauppila,Complement
+1030,No,Nokia,,,Nokia,Nokia VPN Client,Timo Ruokolainen,Complement
+1040,No,Nokia,,,Nokia,Catalogs (Preminet Client),Ari Sutinen,Complement
+1050,No,Adobe,,,Adobe Corporation,PDF Reader from Adobe Corporation,Kimmo Uutela,Complement
+1060,No,.,,,N/A,MS Office viewers/editors in 3.0,Kimmo Uutela,Complement
+1070,No,Adobe|Macromedia,,,Adobe Corporation,FlashLite 1.1 binaries (bin in 2.8&3.0),Michael Klingele,Complement
+1075,No,Adobe|Macromedia,,,Adobe Corporation,FlashLite 2.0 sources,Michael Klingele,Complement
+1076,No,Adobe|Macromedia,,,Adobe Corporation,FlashLite 2.0 binaries,Michael Klingele,Complement
+1077,No,Adobe|Macromedia,,,Adobe Corporation,"Flashlite 3.0 sources, special delivery to SEMC only, maybe other licensees later",Michael Klingele,Complement
+1078,No,Adobe|Macromedia,,,Adobe Corporation,Flashlite 3.0 sources,Michael Klingele,
+1079,No,Adobe|Macromedia,,,Adobe Corporation,Flashlite 3.0 binaries,Michael Klingele,
+1080,No,Paragon,,,Paragon Technologie Gmbh,Zip Manager from Paragon Technologie Gmbh,Kimmo Uutela,Complement
+1090,No,Quickoffice ,,,QuickOffice,Quick Office,Pekka Karimaa (team manager),Complement
+1100,No,.,,,Nokia,"Mobile Search client contains two parts: Online Search and Active Search. Online Search enables end users to make search queries directly to 3rd party services (such as e.g. Google, Yahoo! and MSN). Active Search enables end users to search for local content items in the device. It is possible to disable the Online Search with a variant configuration file, during integration. In that case only Active Search (in-device search) remains in the client.",Tenhunen Jouko (Nokia-S&S/Espoo),Complement
+1120,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed WMA decoder,Dan Plane/Timo Pastila ,>1120 - WMADecoderAPI          -> project for WMA decoder
+1130,Yes,Nokia,,,Nokia,MTP Protocol,Dan Plane/Timo Pastila ,
+1140,No,Microsoft,,,Microsoft,Windows Media DRM from Microsoft,Simo J„rvinen,Complement
+1160,No,Bend,,,Red Bend,vCurrentMobile Delta Generator and Installer from Red Bend,Hegde Rajesh ,Complement
+1170,No,Symantec,,,Symantec,Mobile Security from Symantec,,
+1180,No,Nokia,,,Nokia,"UI effects, phase 1",Juuso Kanner,Complement
+1190,Yes,Alliance,,,Wi-Fi Alliance,WLAN ASD Client from Wi-Fi Alliance (WFA),Niko Ojanen,3rd party
+1200,No,.,,,NA,AudioProxyServer  release ,Passila Mika.K ,Complement
+1201,No,N/A,,,3rd party,WMA 10 Professional audio codec,Bryan Honzaÿ,"WMA 10 Professional audio codec for the S60 platform. WMA 10 Pro supports profiles that include everything from full-resolution 24-bit/96 kHz audio in stereo, 5.1 channel, or even 7.1 channel surround sound, to highly efficient mobile capabilities at 24 Kbps to 96 Kbps for stereo, and 128 Kbps to 256 Kbps for 5.1-channel sound. WMA 10 Pro supports streaming, progressive download, or download-and-play delivery at 128 to 768 Kbps. "
+1300,Yes,.,,,"Red Hat, freedesktop.org",d-bus. Open source IPC library,Mahadevan Shankar (Nokia-D-MSW/Bangalore),Its not a 3rd party but an Open Source library. Yes to licensees and to all S60 SDKs. legal and IPR checks done.
+1301,Yes,.,,,"IMENDIO AB, www.loudmouth-project.org",Loudmouth. Open Source Library,Sharma Shrikumar.B (Nokia-D-MSW/Bangalore),This is a library that is used for last-step connections for xmpp protocol. It also performs certain xmpp protocol tasks.
+1302,Yes,.,,,"telepathy.freedesktop.org, Collabora Limited",telepathygabble. Open Source Library,Sharma Shrikumar.B (Nokia-D-MSW/Bangalore),This is an XMPP protocol connection manager. This uses loudmouth. 
+1303,Yes,.,,,"telepathy.freedesktop.org, Collabora Limited",Libtelepathy. Open Source Library,Sharma Shrikumar.B (Nokia-D-MSW/Bangalore),this is a framework for XMPP protocol. 
+1304,No,.,,,"freedesktop.org, open source component",gstreamer,Adkoli Prashant (Nokia-D-MSW/Bangalore); Patel Kirit (Nokia-D-MSW/Dallas),"3rd party component, open source code.. No Licensee Fee impact"
+1400,Yes,.,,,Symbian Software Ltd,Symbian tools - A set of RnD Tools done by Symbian which can be used in S60 platform.,Kauraniemi Pasi (Nokia-D-MSW/Tampere); Laitinen Matti.T (Nokia-D-MSW/Helsinki),Nokia has done a contract with Symbian for distributing the Symbian LTC debug tools in S60 releases.
+842593,No,.,,,GameLion,Global Race - It is 3D racing game developed by GameLion,Pulkkinen Kimmo (Nokia-D-MSW/Oulu)," - Located in \ppd_sw\cusw_oul_domain\Game_GlobalRace, Nokia has bought a license for Tube + variants, the component cannot be delivered to licensees."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/distribution.policy.id_status.csv	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,115 @@
+ID,Include in build?,Description,Contract status,Supplier
+0,Yes,Series 60 Platform,Delivered,Nokia
+1,No,Nokia internal sw,Not delivered,Nokia
+10,Yes,eMuzed AMR NB encoder,Delivered,3rd party
+11,Yes,eMuzed AMR NB decoder,Delivered,3rd party
+12,Yes,eMuzed AMR WB encoder,Delivered,3rd party
+13,Yes,eMuzed AMR WB decoder,Delivered,3rd party
+21,Yes,"MobileBAE v2.1 audio engine from Beatnik, Inc.",Binary only,3rd party
+30,Yes,eMuzed MP3 decoder,Delivered,3rd party
+40,Yes,eMuzed MPEG-4 AAC decoder,Delivered,3rd party
+41,Yes,eMuzed eAAC+ decoder ,Delivered,3rd party
+42,Yes,eMuzed MPEG-4 AAC encoder,Delivered,3rd party
+50,Yes,eMuzed H.263 encoder,Delivered,3rd party
+51,Bin,Emuzed MDF H263/MPEG4 Decoder,Binary only,3rd party
+52,Yes,Emuzed MDF Video Postprocessor,Delivered,3rd party
+53,Bin,NRC MDF H264 (AVC) Decoder,Binary only,Nokia
+54,No,Helix MDF RealVideo-8/9 Decoder,Not delivered,3rd party
+55,No,Helix CMMFCodec RealAudio-8 Decoder,Not delivered,3rd party
+56,No,Helix CMMFCodec RealAudio-Voice Decoder,Not delivered,3rd party
+57,Yes,Emuzed h.264/AVC ARM11 video encoder,Binary only,3rd party
+60,Yes,Circuit switched Video Telephony Solution (3G-324M) from PacketVideo Corporation ,Binary only,3rd party
+80,Yes,RealOnePlayerEngine,Delivered,3rd party
+81,Bin,"Helix DNA engine sources, restricted protocol and codex from RealNetworks, Inc. ",Binary only,3rd party
+82,Yes,"Helix DNA engine binaries, restricted protocol and codex from RealNetworks, Inc. ",Delivered,3rd party
+100,Yes,Java JSR-135,Delivered,3rd party
+101,Yes,Java JSR-75,Delivered,Nokia
+102,Yes,Java J2ME,Delivered,3rd party
+103,Yes,KVM virtual machine,Delivered,3rd party
+104,Yes,Monty virtual machine,Delivered,3rd party
+105,Yes,Software implementation of J2ME Web Services Specification (JSR-172),Delivered,3rd party
+106,Yes,Software implementation of Security and Trust Services API for J2ME (JSR-177),Delivered,3rd party
+107,No,Java VSCL implementation,Not delivered,3rd party
+108,No,Java for iMode,Not delivered,3rd party
+109,No,Nokia proprietary Java API supplements,Not delivered,Nokia
+110,Yes,Tegic T9 WINS binaries,Delivered,3rd party
+111,No,"THUMB of T9 from Tegic Communications, Inc.",Not delivered,3rd party
+115,Yes,Matsutake Predictive Text Input Engine Binaries,Delivered,3rd party
+130,No,Chinese bitmap fonts from Chinese Electronics Standardization Technical Institute.,Not delivered,3rd party
+131,Yes,Ricoh Japan fonts,Binary only,3rd party
+132,Yes,Agfa Thai fonts,Binary only,3rd party
+133,Yes,"Vector fonts & rendering engine from Monotype Imaging (Agfa) including WGL4, Arabic, Hebrew, Thai, Japanese, Chinese",Binary only,3rd party
+140,Yes,SJTU Sunway Chinese-English dictionary,Delivered,3rd party
+151,Yes,Entrust root certificates,Delivered,3rd party
+152,Yes,Verisign root certificates,Delivered,3rd party
+153,Yes,Symbian root certificates,Delivered,3rd party
+157,Yes,Root Certificates from BeTrusted Ltd.,Delivered,3rd party
+158,Yes,Equifax root certificate,Delivered,3rd party
+180,Yes,"Vector fonts & rendering engine from Monotype Imaging (Agfa) including WGL4, Arabic, Hebrew, Thai, Japanese, Chinese",Binary only,3rd party
+200,Yes,Netscape Plugin API,Delivered,3rd party
+210,No,Macromedia Flash,Not delivered,3rd party
+220,No,"SD memory card specifications from 3C, LLC and related Nokia proprietary implementation",Not delivered,3rd party
+230,Yes,Arabica & Xerces C++ XML parser (OSS),Delivered,3rd party
+240,Yes,KJS Scripting Engine (OSS),Delivered,3rd party
+241,Yes,Javascriptcore ,Delivered,3rd party
+242,Yes,Webcore ,Delivered,3rd party
+250,Yes,libxml2,Delivered,3rd party
+260,No,Vodafone  pictographs,Not delivered,3rd party
+261,No,DoCoMo  pictographs,Not delivered,3rd party
+280,No,CXX Specifications (related to WLAN) from Cisco,Not delivered,3rd party
+290,Yes,3GP_EXT_Parser,Delivered,3rd party
+300,Yes,FileBrowse 3.0 from Nokia,Binary only,Nokia
+310,No,OCR Technology including OCR engine and OCR language packages from Hanwang,Not delivered,3rd party
+500,No,Vodafone Branding content,Not delivered,Nokia
+510,No,Docomo Complement Package,Not delivered,Nokia
+520,No,Vodafone Complement Package 1,Not delivered,Nokia
+600,No,Rosetta I-mode,Not delivered,Nokia
+1000,No,PC Suite,Not delivered,Nokia
+1010,No,Nokia PoC Client,Not delivered,Nokia
+1020,Yes,ThemeStudio,Binary only,Nokia
+1030,No,Nokia VPN Client,Not delivered,Nokia
+1040,No,Catalogs (Preminet Client),Not delivered,Nokia
+1050,No,PDF Reader from Adobe Corporation,Not delivered,3rd party
+1060,No,MS Office viewers/editors in 3.0,Not delivered,3rd party
+1070,No,FlashLite 1.1 binaries (bin in 2.8&3.0),Not delivered,3rd party
+1075,No,FlashLite 2.0 sources,Not delivered,3rd party
+1076,No,FlashLite 2.0 binaries,Not delivered,3rd party
+1080,No,Zip Manager from Paragon Technologie Gmbh,Not delivered,3rd party
+1090,No,Quick Office,Not delivered,3rd party
+1120,Yes,eMuzed WMA decoder,Binary only,3rd party
+1140,No,Windows Media DRM from Microsoft,Not delivered,3rd party
+1160,No,vCurrentMobile Delta Generator and Installer from Red Bend,Not delivered,3rd party
+1170,No,Mobile Security from Symantec,Not delivered,3rd party
+700,No,WMDRM,Not delivered,3rd party
+1180,No,"UI effects, phase 1",Not delivered,Nokia
+159,Yes,Valicert Class2 CA,Delivered,3rd party
+800,Yes,Java WECE External j9,Delivered,3rd party
+810,Yes,Java WEME Internal j9,Delivered,3rd party
+281,Bin,Cisco Compatible eXtensions (CCX) for WLAN devices binaries,Binary only,3rd party
+900,No,Decuma/HWR from Zi Corporation,Not delivered,3rd party
+530,No,CMCC Complement Package,Not delivered,3rd party
+1190,Yes,WLAN ASD Client from Wi-Fi Alliance (WFA),Delivered,3rd party
+171,Yes,Java eSWT,Delivered,3rd party
+540,No,Vodafone Complement Package 2,Not delivered,NA
+550,No,Orange Complement Package 2,Not delivered,NA
+560,No,T-mobile Complement Package 2,Not delivered,NA
+172,No,JSR-238 Mobile Internationalization API,Not delivered,3rd party
+161,Yes,CyberTrust,Delivered,3rd party
+650,Bin,CASN RTS ,Not delivered,NA
+1200,No,AudioProxyServer  release ,Not delivered,NA
+610,No,3.2 ED VoIP and CCE components ,Not delivered,Nokia
+525,No,Vodafone Complement Package 1.1,Not delivered,3rd party
+570,No,AT & T Complement Package,Not delivered,3rd party
+620,Yes,"CCE REQ components: cce, spsettings cch",Delivered,Nokia
+400,No,Components implementing Japanese hadwriting recognition and virtual keyboard.,Not delivered,3rd party
+162,Yes,Starfield,Delivered,3rd party  
+163,Yes,GoDaddy,Delivered,3rd party  
+950,No,SP API Test Automation,Not delivered,Nokia
+1201,No,WMA 10 Professional audio codec,Not delivered,3rd party
+1130,Yes,MTP Protocol,Delivered,Nokia
+116,No,Xt9TegicDelivery,Not delivered,3rd party
+117,No,ZiDelivery,Not delivered,3rd party
+350,No,PtiEngine core which wraps HandWriting Recognition engine from Vision Object company,Not delivered,3rd party
+1078,No,Flashlite 3.0 sources,Not delivered,3rd party
+1079,No,Flashlite 3.0 binaries,Not delivered,3rd party
+,,,, 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/flash_config/rom_image_config_test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<build>
+    <spec name="mc" abstract="true">
+        <set name="target.dir" value="${release.images.dir}"/>
+        <set name="today" value="$(TODAY)"/>
+        
+        <set name="rom.output.dir" value="${build.drive}\output\development_flash_images"/>
+        <set name="image.type" value="prd,rnd"/>
+        <set name="build.drive" value="${build.drive}"/>
+        <set name="build.version" value="0.0728.3.0.1"/>
+        
+        <!-- Template dirs  -->
+        <set name="core.image.path" value="${image.type}/core"/>
+        <set name="languagepack.image.path" value="${image.type}/language/${languagepack.id}_variant_${description}/"/>
+        <set name="customer.image.path" value="${image.type}/customer/vanilla/${customer.id}_variant_${description}"/>
+        <set name="flash.config.path" value="${customer.image.path}"/>
+        
+        <!-- Template outputdir  -->
+        <set name="flash.output.dir" value="${rom.output.dir}/${rommake.product.name}/${image.type}"/>
+        <set name="core.output.dir" value="${rom.output.dir}/${rommake.product.name}/${core.image.path}"/>
+        <set name="languagepack.output.dir" value="${rom.output.dir}/${rommake.product.name}/${languagepack.image.path}"/>
+        <set name="customer.output.dir" value="${rom.output.dir}/${rommake.product.name}/${customer.image.path}"/>
+        <set name="eraseuda.output.dir" value="${rom.output.dir}/${rommake.product.name}/${languagepack.image.path}"/>
+        
+        <!-- Flash image name -->
+        <set name="core.image.name" value="${version.product.type}_${build.version}_${image.type}"/>
+        <set name="languagepack.image.name" value="${version.product.type}_${build.version}_${image.type}_${languagepack.id}"/>
+        <set name="customer.image.name" value="${version.product.type}_${build.version}_${image.type}_${variant.id}_${build.id}_${customer.id}_${revision}"/>
+        <set name="eraseuda.image.name" value="${config.name}_${build.version}"/>
+        <set name="flash.config.name" value="${customer.image.name}.config.xml"/>
+        
+        <!-- default localisation settings -->
+        <set name="variation" value="western"/>
+        <set name="languagepack.revision" value="0"/>
+        <set name="description" value=""/>
+        
+        <!-- Do not build target in parallel by default -->
+        <set name="build.parallel" value="false"/>
+        
+        <!-- templates to generate the makefiles -->
+        <set name="output.makefile.filename" value="${rombuild.makefile.name}"/>
+        <set name="main.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\main.mk"/>
+        <set name="flash.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\flash.mk"/>
+        <set name="core.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\core.mk"/>
+        <set name="languagepack.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\languagepack.mk"/>
+        <set name="customer.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\customer.mk"/>
+        <set name="uda.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\uda.mk"/>
+        <set name="eraseuda.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\eraseuda.mk"/>
+        <set name="flash.config.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\template.config.xml"/>
+        
+        <spec name="product" abstract="true">
+            <set name="config.name" value="product"/>
+            <set name="rommake.hwid" value="2048"/>
+            <set name="version.product.type" value="RM-235"/>
+            <set name="rommake.product.name" value="product"/>
+            <set name="rommake.product.type" value="RM-235"/>
+            
+            <!-- Language pack and Variant -->
+            <spec name="variants" abstract="true">
+                <set name="target.dir" value="${release.images.dir}"/>
+                <set name="build.parallel" value="false"/>
+                <!-- core -->
+                <spec type="core">
+                    <set name="core.id" value="00"/>
+                    <set name="image.type" value="rnd,prd"/>
+                </spec>
+                
+                <!-- western group -->
+                <spec name="western" abstract="true">
+                    <set name="build.parallel" value="true"/>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="01"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,03,05,04,13"/>
+                        <set name="description" value="EURO1"/>
+                        <set name="variation" value="western"/>
+                        <set name="revision" value="0"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="02"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,03,14,05,18"/>
+                        <set name="description" value="EURO2"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="23"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,18,03,05"/>
+                        <set name="description" value="AFRICA2"/>
+                    </spec>
+                </spec>
+                
+                <spec name="customer_roms" abstract="true">
+                    <set name="build.parallel" value="true"/>
+                    <spec type="customer">
+                        <set name="customer.id" value="01"/>
+                        <set name="description" value="vanilla_customer_variant"/>
+                        <set name="compatible.languagepack" value="01,02,03"/>
+                    </spec>
+                </spec>
+            </spec>
+            
+            <!-- china group -->
+            <spec name="china" abstract="true">
+                <set name="build.parallel" value="true"/>
+                <set name="variation" value="china"/>
+                <spec type="languagepack">
+                    <set name="languagepack.id" value="11"/>
+                    <set name="default" value="29"/>
+                    <set name="languages" value="29,157"/>
+                    <set name="description" value="TAIWAN"/>
+                </spec>
+            </spec>
+            
+        </spec>
+    </spec>
+</build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/ido/ido_project/ido_project/classicui/layers.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,163 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition (systemModel?, build?)>
+<!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED
+>
+<!-- all paths are relative to the root of the source -->
+
+<!-- System Model Section of DTD -->
+<!ELEMENT systemModel (layer+)>
+
+<!ELEMENT layer (logicalset* | module*)*>
+<!-- Kernel Services, Base Services, OS Services, Etc -->
+<!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED
+>
+
+<!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!-- Generic OS services, Comms Services, etc -->
+<!ATTLIST logicalset 
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+<!-- Telephony services, Networking Services, etc -->
+<!ATTLIST logicalsubset 
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+<!-- Screen Driver, Content Handling, etc -->
+<!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED  
+>
+
+<!ELEMENT component (unit* | package* | prebuilt*)*>
+<!-- units or packages -->
+<!ATTLIST component
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT unit EMPTY >
+<!-- must be buildable (bld.inf) -->
+<!-- bldFile will soon be removed in favour of mrp -->
+<!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+<!ELEMENT package EMPTY >
+<!-- like a unit, but not buildable -->
+<!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+<!ELEMENT prebuilt EMPTY>
+<!-- pre-built CBR component -->
+<!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+
+
+<!-- Build Section of DTD -->
+<!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+
+<!ELEMENT unitList (unitRef+)>
+<!-- e.g. common, beech, cedar, etc -->
+<!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+>
+
+<!ELEMENT unitRef EMPTY>
+<!-- Reference to unit in System Model -->
+<!ATTLIST unitRef
+  unit IDREF #REQUIRED
+>
+
+<!ELEMENT targetList EMPTY>
+<!-- e.g. DEFAULT_7.0S, TOOLS_7.0S, etc -->
+<!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED
+>
+
+<!ELEMENT target EMPTY>
+<!-- e.g. WINS, WINSCW, ARM4, etc -->
+<!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED
+>
+
+<!ELEMENT option EMPTY>
+<!-- e.g. Keepgoing, SaveSpace, etc -->
+<!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED
+>
+
+<!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+<!-- 7.0s, 8.0a, 8.0b, cuskit, etc -->
+<!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED
+>
+<!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+
+<!ELEMENT unitListRef EMPTY>
+<!-- Reference to unitList -->
+<!ATTLIST unitListRef
+  unitList IDREF #REQUIRED
+>
+
+<!ELEMENT layerRef EMPTY>
+<!-- Reference to named entity in the model, usually a layer -->
+<!ATTLIST layerRef
+  layerName CDATA #REQUIRED
+>
+
+<!ELEMENT buildLayer EMPTY>
+<!-- bldmake, abld export, etc -->
+<!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED
+>
+
+<!ELEMENT specialInstructions EMPTY>
+<!-- BootStrap -->
+<!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED
+>
+
+<!ENTITY layer_real_source_path "s60/mw/classicui">
+
+]>
+
+<SystemDefinition name="MCL" schema="1.4.0"/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/ido/ido_project/ido_project/myapp/layers.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,163 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition (systemModel?, build?)>
+<!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED
+>
+<!-- all paths are relative to the root of the source -->
+
+<!-- System Model Section of DTD -->
+<!ELEMENT systemModel (layer+)>
+
+<!ELEMENT layer (logicalset* | module*)*>
+<!-- Kernel Services, Base Services, OS Services, Etc -->
+<!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED
+>
+
+<!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!-- Generic OS services, Comms Services, etc -->
+<!ATTLIST logicalset 
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+<!-- Telephony services, Networking Services, etc -->
+<!ATTLIST logicalsubset 
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+<!-- Screen Driver, Content Handling, etc -->
+<!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED  
+>
+
+<!ELEMENT component (unit* | package* | prebuilt*)*>
+<!-- units or packages -->
+<!ATTLIST component
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT unit EMPTY >
+<!-- must be buildable (bld.inf) -->
+<!-- bldFile will soon be removed in favour of mrp -->
+<!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+<!ELEMENT package EMPTY >
+<!-- like a unit, but not buildable -->
+<!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+<!ELEMENT prebuilt EMPTY>
+<!-- pre-built CBR component -->
+<!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+
+
+<!-- Build Section of DTD -->
+<!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+
+<!ELEMENT unitList (unitRef+)>
+<!-- e.g. common, beech, cedar, etc -->
+<!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+>
+
+<!ELEMENT unitRef EMPTY>
+<!-- Reference to unit in System Model -->
+<!ATTLIST unitRef
+  unit IDREF #REQUIRED
+>
+
+<!ELEMENT targetList EMPTY>
+<!-- e.g. DEFAULT_7.0S, TOOLS_7.0S, etc -->
+<!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED
+>
+
+<!ELEMENT target EMPTY>
+<!-- e.g. WINS, WINSCW, ARM4, etc -->
+<!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED
+>
+
+<!ELEMENT option EMPTY>
+<!-- e.g. Keepgoing, SaveSpace, etc -->
+<!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED
+>
+
+<!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+<!-- 7.0s, 8.0a, 8.0b, cuskit, etc -->
+<!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED
+>
+<!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+
+<!ELEMENT unitListRef EMPTY>
+<!-- Reference to unitList -->
+<!ATTLIST unitListRef
+  unitList IDREF #REQUIRED
+>
+
+<!ELEMENT layerRef EMPTY>
+<!-- Reference to named entity in the model, usually a layer -->
+<!ATTLIST layerRef
+  layerName CDATA #REQUIRED
+>
+
+<!ELEMENT buildLayer EMPTY>
+<!-- bldmake, abld export, etc -->
+<!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED
+>
+
+<!ELEMENT specialInstructions EMPTY>
+<!-- BootStrap -->
+<!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED
+>
+
+<!ENTITY layer_real_source_path "s60/app/myapp">
+
+]>
+
+<SystemDefinition name="MCL" schema="1.4.0"/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/ido/ido_project/ido_project/xmlui/layers.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,161 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition (systemModel?, build?)>
+<!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED
+>
+<!-- all paths are relative to the root of the source -->
+
+<!-- System Model Section of DTD -->
+<!ELEMENT systemModel (layer+)>
+
+<!ELEMENT layer (logicalset* | module*)*>
+<!-- Kernel Services, Base Services, OS Services, Etc -->
+<!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED
+>
+
+<!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!-- Generic OS services, Comms Services, etc -->
+<!ATTLIST logicalset 
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+<!-- Telephony services, Networking Services, etc -->
+<!ATTLIST logicalsubset 
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+<!-- Screen Driver, Content Handling, etc -->
+<!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED  
+>
+
+<!ELEMENT component (unit* | package* | prebuilt*)*>
+<!-- units or packages -->
+<!ATTLIST component
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT unit EMPTY >
+<!-- must be buildable (bld.inf) -->
+<!-- bldFile will soon be removed in favour of mrp -->
+<!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+<!ELEMENT package EMPTY >
+<!-- like a unit, but not buildable -->
+<!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+<!ELEMENT prebuilt EMPTY>
+<!-- pre-built CBR component -->
+<!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED
+>
+
+
+
+<!-- Build Section of DTD -->
+<!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+
+<!ELEMENT unitList (unitRef+)>
+<!-- e.g. common, beech, cedar, etc -->
+<!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+>
+
+<!ELEMENT unitRef EMPTY>
+<!-- Reference to unit in System Model -->
+<!ATTLIST unitRef
+  unit IDREF #REQUIRED
+>
+
+<!ELEMENT targetList EMPTY>
+<!-- e.g. DEFAULT_7.0S, TOOLS_7.0S, etc -->
+<!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED
+>
+
+<!ELEMENT target EMPTY>
+<!-- e.g. WINS, WINSCW, ARM4, etc -->
+<!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED
+>
+
+<!ELEMENT option EMPTY>
+<!-- e.g. Keepgoing, SaveSpace, etc -->
+<!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED
+>
+
+<!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+<!-- 7.0s, 8.0a, 8.0b, cuskit, etc -->
+<!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED
+>
+<!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+
+<!ELEMENT unitListRef EMPTY>
+<!-- Reference to unitList -->
+<!ATTLIST unitListRef
+  unitList IDREF #REQUIRED
+>
+
+<!ELEMENT layerRef EMPTY>
+<!-- Reference to named entity in the model, usually a layer -->
+<!ATTLIST layerRef
+  layerName CDATA #REQUIRED
+>
+
+<!ELEMENT buildLayer EMPTY>
+<!-- bldmake, abld export, etc -->
+<!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED
+>
+
+<!ELEMENT specialInstructions EMPTY>
+<!-- BootStrap -->
+<!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED
+>
+<!ENTITY layer_real_source_path "s60/mw/xmlui">
+]>
+
+<SystemDefinition name="MCL" schema="1.4.0"/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/iqrf/imaker_5250.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1279 @@
+<?xml version="1.0" encoding="ASCII"?>
+<IMaker xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="iqrf" query="help-config">
+  <result>
+    <interfaces name="An interface">
+      <configurationElements name="BLDROBY" description="For passing extra oby files (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="BLDROM_OPT" description="The default buildrom.pl options" values="(string)"/>
+      <configurationElements name="BLDROPT" description="For passing extra parameters (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="CONFIGROOT" description="Define the default configuration root directory." values="(string)"/>
+      <configurationElements name="CORE_CDPROMFILE" description="The name of the core Code Demand Paging rom file (Code paging)." values="(string)"/>
+      <configurationElements name="CORE_DIR" description="The working directory, when creating core image" values="(string)"/>
+      <configurationElements name="CORE_E2FNAME" description="The core elf2flash filename. This is the final core flash file." values="(string)"/>
+      <configurationElements name="CORE_FWIDFILE" description="The (generated) _core_fwid.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVFILE" description="The (generated) _core_imeisv.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVINFO" description="The content string for the imeisv.txt file." values="(string)"/>
+      <configurationElements name="CORE_MODELFILE" description="The (generated) _core_model.txt file name." values="(string)"/>
+      <configurationElements name="CORE_MODELINFO" description="The content string for the model.txt file." values="(string)"/>
+      <configurationElements name="CORE_MSTOBY" description="The generated master oby file name, which includes the CORE_OBY files" values="(string)"/>
+      <configurationElements name="CORE_NAME" description="The full name of the core image" values="(string)"/>
+      <configurationElements name="CORE_NDPROMFILE" description="The name of the core Non Demand Paging rom file." values="(string)"/>
+      <configurationElements name="CORE_OBY" description="The oby file(s) included to the core image creation" values="(string)"/>
+      <configurationElements name="CORE_ODPROMFILE" description="The name of the core On Demand Paging rom file (Rom paging)." values="(string)"/>
+      <configurationElements name="CORE_OPT" description="The core specific buildrom options" values="(string)"/>
+      <configurationElements name="CORE_PLATFILE" description="The (generated) _core_platform.txt file name." values="(string)"/>
+      <configurationElements name="CORE_PLATINFO" description="The content string for the fwid.txt file." values="(string)"/>
+      <configurationElements name="CORE_PRODFILE" description="The (generated) _core_product.txt file name." values="(string)"/>
+      <configurationElements name="CORE_ROFSFILE" description="The name of the core rofs file." values="(string)"/>
+      <configurationElements name="CORE_ROMVER" description="The rom version parameter passed to the version.iby" values="(string)"/>
+      <configurationElements name="CORE_SWVERFILE" description="The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file." values="(string)"/>
+      <configurationElements name="CORE_SWVERINFO" description="The content string for the sw.txt file." values="(string)"/>
+      <configurationElements name="CORE_TIME" description="The time defined to the core image" values="(string)"/>
+      <configurationElements name="CORE_UDEBFILE" description="The name of the core udeb file. See USE_UDEB." values="(string)"/>
+      <configurationElements name="CORE_VERIBY" description="The name of the generated core *version.iby, which included version files and info" values="(string)"/>
+      <configurationElements name="CORE_VERSION" description="The version of the core. Used in sw.txt generation." values="(string)"/>
+      <configurationElements name="COREPLAT_NAME" description="Name of the core platform" values="(string)"/>
+      <configurationElements name="CUSTVARIANT_DIR" description="Configure the directory where to included the customer variant content. By default all content under /content is included to the image as it exists in the folder." values="(string)"/>
+      <configurationElements name="DEFAULT_LANGUAGE" description="Default language is the language where the device will boot to (SIM language overrides this selection)" values="(string)"/>
+      <configurationElements name="FLASH_EXT" description="The flash file extension." values="(string)"/>
+      <configurationElements name="HWID" description="Hardware Id" values="([0-9]4)"/>
+      <configurationElements name="HWID_LIST" description="Possible Hardware Ids of the product." values="([0-9]4)*"/>
+      <configurationElements name="KEEPTEMP" description="Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby" values="([0|1])"/>
+      <configurationElements name="LABEL" description="A label to the NAME of the image" values="(string)"/>
+      <configurationElements name="LANGID" description="Language id used in the lang.txt generation" values="(string)"/>
+      <configurationElements name="LANGUAGES" description="Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)" values="(string)"/>
+      <configurationElements name="NAME" description="The name of the image" values="(string)"/>
+      <configurationElements name="OPERATOR_OBY" description="The name for generated operator oby, which is a file generated based on an operator specific content." values="(string)"/>
+      <configurationElements name="OPERATOR_OBYGEN" description="The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder)." values="(string)|(string)|(string)"/>
+      <configurationElements name="PRODUCT_MODEL" description="The model of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_NAME" description="Name of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_REVISION" description="The reision of the product" values="(string)"/>
+      <configurationElements name="RELEASEDIR" description="The RELEASEDIR is used in the RELEASE step that copies the created files to a separate folder defined by the RELEASEDIR." values="(string)"/>
+      <configurationElements name="RELEASEFILES" description="The RELEASEFILES define the source files that are copied in the RELEASE step. The files must be given as a space delimited list. Wildcards can be used. E.g. \epoc32\rombuild\product\theflash.fpsx \epoc32\rombuild\product\*.log" values="(string)"/>
+      <configurationElements name="RELEASENAME" description="The RELEASENAME is used in the RELEASE step that copies the created files to a separate folder with a new name." values="(string)"/>
+      <configurationElements name="ROFS2_DIR" description="The working directory, when creating the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_E2FNAME" description="The rofs2 elf2flash filename. This is the final rofs2 flash file." values="(string)"/>
+      <configurationElements name="ROFS2_FOOTER" description="This variable can contain a footer section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDFILE" description="The (generated) _rofs2_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDINFO" description="The content string for the fwid2.txt file." values="(string)"/>
+      <configurationElements name="ROFS2_HEADER" description="This variable can contain a header section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_MSTOBY" description="The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters" values="(string)"/>
+      <configurationElements name="ROFS2_NAME" description="The full name of the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_OBY" description="The oby file(s) included to the rofs2 image creation" values="(string)"/>
+      <configurationElements name="ROFS2_OPT" description="The rofs2 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS2_ROMVER" description="The rofs2 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS2_TIME" description="The time defined to the rofs2 image." values="(string)"/>
+      <configurationElements name="ROFS2_VERIBY" description="The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTFILE" description="The (generated) source file name for customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTINFO" description="The content string for the customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_DIR" description="The working directory, when creating the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_E2FNAME" description="The rofs3 elf2flash filename. This is the final rofs3 flash file." values="(string)"/>
+      <configurationElements name="ROFS3_FOOTER" description="This variable can contain a footer section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDFILE" description="The (generated) _rofs3_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDINFO" description="The content string for the fwid3.txt file." values="(string)"/>
+      <configurationElements name="ROFS3_HEADER" description="This variable can contain a header section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_MSTOBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_NAME" description="The full name of the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_OBY" description="The oby file(s) included to the rofs3 image creation" values="(string)"/>
+      <configurationElements name="ROFS3_OPT" description="The rofs3 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS3_ROMVER" description="The rofs3 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS3_TIME" description="The time defined to the rofs3 image." values="(string)"/>
+      <configurationElements name="ROFS3_VERIBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="SOS_VERSION" description="Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)" values="([0-9]+.[0-9]+)"/>
+      <configurationElements name="SWUPD_EXT" description="The software update file extension." values="(string)"/>
+      <configurationElements name="TYPE" description="Defines the image type." values="(rnd|prd|subcon)"/>
+      <configurationElements name="USE_OVERRIDE" description="Define whether the override.pm Buildrom.pl plugin is used (Includes automatically also \epoc32\rom\override.oby)." values="([0|1])"/>
+      <configurationElements name="USE_PAGING" description="Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code)." values="((0|rom|code[:[(1|2|3)]+]?))"/>
+      <configurationElements name="USE_ROFS" description="Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3)." values="([[dummy|]0..6][,[dummy|]0..6]*)"/>
+      <configurationElements name="USE_ROMFILE" description="Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1." values="([0|1])"/>
+      <configurationElements name="USE_ROMSYMGEN" description="Generate the rom symbol file. 0=Do not generate, 1=Generate" values="([0|1])"/>
+      <configurationElements name="USE_UDEB" description="Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel." values="([0|1|full])"/>
+      <configurationElements name="USE_VERGEN" description="Use iMaker version info generation" values="([0|1])"/>
+      <configurationElements name="BLDROBY" description="For passing extra oby files (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="BLDROM_OPT" description="The default buildrom.pl options" values="(string)"/>
+      <configurationElements name="BLDROPT" description="For passing extra parameters (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="CONFIGROOT" description="Define the default configuration root directory." values="(string)"/>
+      <configurationElements name="CORE_CDPROMFILE" description="The name of the core Code Demand Paging rom file (Code paging)." values="(string)"/>
+      <configurationElements name="CORE_DIR" description="The working directory, when creating core image" values="(string)"/>
+      <configurationElements name="CORE_E2FNAME" description="The core elf2flash filename. This is the final core flash file." values="(string)"/>
+      <configurationElements name="CORE_FWIDFILE" description="The (generated) _core_fwid.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVFILE" description="The (generated) _core_imeisv.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVINFO" description="The content string for the imeisv.txt file." values="(string)"/>
+      <configurationElements name="CORE_MODELFILE" description="The (generated) _core_model.txt file name." values="(string)"/>
+      <configurationElements name="CORE_MODELINFO" description="The content string for the model.txt file." values="(string)"/>
+      <configurationElements name="CORE_MSTOBY" description="The generated master oby file name, which includes the CORE_OBY files" values="(string)"/>
+      <configurationElements name="CORE_NAME" description="The full name of the core image" values="(string)"/>
+      <configurationElements name="CORE_NDPROMFILE" description="The name of the core Non Demand Paging rom file." values="(string)"/>
+      <configurationElements name="CORE_OBY" description="The oby file(s) included to the core image creation" values="(string)"/>
+      <configurationElements name="CORE_ODPROMFILE" description="The name of the core On Demand Paging rom file (Rom paging)." values="(string)"/>
+      <configurationElements name="CORE_OPT" description="The core specific buildrom options" values="(string)"/>
+      <configurationElements name="CORE_PLATFILE" description="The (generated) _core_platform.txt file name." values="(string)"/>
+      <configurationElements name="CORE_PLATINFO" description="The content string for the fwid.txt file." values="(string)"/>
+      <configurationElements name="CORE_PRODFILE" description="The (generated) _core_product.txt file name." values="(string)"/>
+      <configurationElements name="CORE_ROFSFILE" description="The name of the core rofs file." values="(string)"/>
+      <configurationElements name="CORE_ROMVER" description="The rom version parameter passed to the version.iby" values="(string)"/>
+      <configurationElements name="CORE_SWVERFILE" description="The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file." values="(string)"/>
+      <configurationElements name="CORE_SWVERINFO" description="The content string for the sw.txt file." values="(string)"/>
+      <configurationElements name="CORE_TIME" description="The time defined to the core image" values="(string)"/>
+      <configurationElements name="CORE_UDEBFILE" description="The name of the core udeb file. See USE_UDEB." values="(string)"/>
+      <configurationElements name="CORE_VERIBY" description="The name of the generated core *version.iby, which included version files and info" values="(string)"/>
+      <configurationElements name="CORE_VERSION" description="The version of the core. Used in sw.txt generation." values="(string)"/>
+      <configurationElements name="COREPLAT_NAME" description="Name of the core platform" values="(string)"/>
+      <configurationElements name="CUSTVARIANT_DIR" description="Configure the directory where to included the customer variant content. By default all content under /content is included to the image as it exists in the folder." values="(string)"/>
+      <configurationElements name="DEFAULT_LANGUAGE" description="Default language is the language where the device will boot to (SIM language overrides this selection)" values="(string)"/>
+      <configurationElements name="FLASH_EXT" description="The flash file extension." values="(string)"/>
+      <configurationElements name="HWID" description="Hardware Id" values="([0-9]4)"/>
+      <configurationElements name="HWID_LIST" description="Possible Hardware Ids of the product." values="([0-9]4)*"/>
+      <configurationElements name="KEEPTEMP" description="Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby" values="([0|1])"/>
+      <configurationElements name="LABEL" description="A label to the NAME of the image" values="(string)"/>
+      <configurationElements name="LANGID" description="Language id used in the lang.txt generation" values="(string)"/>
+      <configurationElements name="LANGUAGES" description="Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)" values="(string)"/>
+      <configurationElements name="NAME" description="The name of the image" values="(string)"/>
+      <configurationElements name="OPERATOR_OBY" description="The name for generated operator oby, which is a file generated based on an operator specific content." values="(string)"/>
+      <configurationElements name="OPERATOR_OBYGEN" description="The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder)." values="(string)|(string)|(string)"/>
+      <configurationElements name="PRODUCT_MODEL" description="The model of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_NAME" description="Name of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_REVISION" description="The reision of the product" values="(string)"/>
+      <configurationElements name="RELEASEDIR" description="The RELEASEDIR is used in the RELEASE step that copies the created files to a separate folder defined by the RELEASEDIR." values="(string)"/>
+      <configurationElements name="RELEASEFILES" description="The RELEASEFILES define the source files that are copied in the RELEASE step. The files must be given as a space delimited list. Wildcards can be used. E.g. \epoc32\rombuild\product\theflash.fpsx \epoc32\rombuild\product\*.log" values="(string)"/>
+      <configurationElements name="RELEASENAME" description="The RELEASENAME is used in the RELEASE step that copies the created files to a separate folder with a new name." values="(string)"/>
+      <configurationElements name="ROFS2_DIR" description="The working directory, when creating the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_E2FNAME" description="The rofs2 elf2flash filename. This is the final rofs2 flash file." values="(string)"/>
+      <configurationElements name="ROFS2_FOOTER" description="This variable can contain a footer section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDFILE" description="The (generated) _rofs2_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDINFO" description="The content string for the fwid2.txt file." values="(string)"/>
+      <configurationElements name="ROFS2_HEADER" description="This variable can contain a header section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_MSTOBY" description="The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters" values="(string)"/>
+      <configurationElements name="ROFS2_NAME" description="The full name of the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_OBY" description="The oby file(s) included to the rofs2 image creation" values="(string)"/>
+      <configurationElements name="ROFS2_OPT" description="The rofs2 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS2_ROMVER" description="The rofs2 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS2_TIME" description="The time defined to the rofs2 image." values="(string)"/>
+      <configurationElements name="ROFS2_VERIBY" description="The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTFILE" description="The (generated) source file name for customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTINFO" description="The content string for the customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_DIR" description="The working directory, when creating the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_E2FNAME" description="The rofs3 elf2flash filename. This is the final rofs3 flash file." values="(string)"/>
+      <configurationElements name="ROFS3_FOOTER" description="This variable can contain a footer section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDFILE" description="The (generated) _rofs3_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDINFO" description="The content string for the fwid3.txt file." values="(string)"/>
+      <configurationElements name="ROFS3_HEADER" description="This variable can contain a header section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_MSTOBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_NAME" description="The full name of the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_OBY" description="The oby file(s) included to the rofs3 image creation" values="(string)"/>
+      <configurationElements name="ROFS3_OPT" description="The rofs3 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS3_ROMVER" description="The rofs3 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS3_TIME" description="The time defined to the rofs3 image." values="(string)"/>
+      <configurationElements name="ROFS3_VERIBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="SOS_VERSION" description="Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)" values="([0-9]+.[0-9]+)"/>
+      <configurationElements name="SWUPD_EXT" description="The software update file extension." values="(string)"/>
+      <configurationElements name="TYPE" description="Defines the image type." values="(rnd|prd|subcon)"/>
+      <configurationElements name="USE_OVERRIDE" description="Define whether the override.pm Buildrom.pl plugin is used (Includes automatically also \epoc32\rom\override.oby)." values="([0|1])"/>
+      <configurationElements name="USE_PAGING" description="Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code)." values="((0|rom|code[:[(1|2|3)]+]?))"/>
+      <configurationElements name="USE_ROFS" description="Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3)." values="([[dummy|]0..6][,[dummy|]0..6]*)"/>
+      <configurationElements name="USE_ROMFILE" description="Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1." values="([0|1])"/>
+      <configurationElements name="USE_ROMSYMGEN" description="Generate the rom symbol file. 0=Do not generate, 1=Generate" values="([0|1])"/>
+      <configurationElements name="USE_UDEB" description="Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel." values="([0|1|full])"/>
+      <configurationElements name="USE_VERGEN" description="Use iMaker version info generation" values="([0|1])"/>
+      <configurationElements name="BLDROBY" description="For passing extra oby files (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="BLDROM_OPT" description="The default buildrom.pl options" values="(string)"/>
+      <configurationElements name="BLDROPT" description="For passing extra parameters (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="CONFIGROOT" description="Define the default configuration root directory." values="(string)"/>
+      <configurationElements name="CORE_CDPROMFILE" description="The name of the core Code Demand Paging rom file (Code paging)." values="(string)"/>
+      <configurationElements name="CORE_DIR" description="The working directory, when creating core image" values="(string)"/>
+      <configurationElements name="CORE_E2FNAME" description="The core elf2flash filename. This is the final core flash file." values="(string)"/>
+      <configurationElements name="CORE_FWIDFILE" description="The (generated) _core_fwid.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVFILE" description="The (generated) _core_imeisv.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVINFO" description="The content string for the imeisv.txt file." values="(string)"/>
+      <configurationElements name="CORE_MODELFILE" description="The (generated) _core_model.txt file name." values="(string)"/>
+      <configurationElements name="CORE_MODELINFO" description="The content string for the model.txt file." values="(string)"/>
+      <configurationElements name="CORE_MSTOBY" description="The generated master oby file name, which includes the CORE_OBY files" values="(string)"/>
+      <configurationElements name="CORE_NAME" description="The full name of the core image" values="(string)"/>
+      <configurationElements name="CORE_NDPROMFILE" description="The name of the core Non Demand Paging rom file." values="(string)"/>
+      <configurationElements name="CORE_OBY" description="The oby file(s) included to the core image creation" values="(string)"/>
+      <configurationElements name="CORE_ODPROMFILE" description="The name of the core On Demand Paging rom file (Rom paging)." values="(string)"/>
+      <configurationElements name="CORE_OPT" description="The core specific buildrom options" values="(string)"/>
+      <configurationElements name="CORE_PLATFILE" description="The (generated) _core_platform.txt file name." values="(string)"/>
+      <configurationElements name="CORE_PLATINFO" description="The content string for the fwid.txt file." values="(string)"/>
+      <configurationElements name="CORE_PRODFILE" description="The (generated) _core_product.txt file name." values="(string)"/>
+      <configurationElements name="CORE_ROFSFILE" description="The name of the core rofs file." values="(string)"/>
+      <configurationElements name="CORE_ROMVER" description="The rom version parameter passed to the version.iby" values="(string)"/>
+      <configurationElements name="CORE_SWVERFILE" description="The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file." values="(string)"/>
+      <configurationElements name="CORE_SWVERINFO" description="The content string for the sw.txt file." values="(string)"/>
+      <configurationElements name="CORE_TIME" description="The time defined to the core image" values="(string)"/>
+      <configurationElements name="CORE_UDEBFILE" description="The name of the core udeb file. See USE_UDEB." values="(string)"/>
+      <configurationElements name="CORE_VERIBY" description="The name of the generated core *version.iby, which included version files and info" values="(string)"/>
+      <configurationElements name="CORE_VERSION" description="The version of the core. Used in sw.txt generation." values="(string)"/>
+      <configurationElements name="COREPLAT_NAME" description="Name of the core platform" values="(string)"/>
+      <configurationElements name="CUSTVARIANT_DIR" description="Configure the directory where to included the customer variant content. By default all content under /content is included to the image as it exists in the folder." values="(string)"/>
+      <configurationElements name="DEFAULT_LANGUAGE" description="Default language is the language where the device will boot to (SIM language overrides this selection)" values="(string)"/>
+      <configurationElements name="FLASH_EXT" description="The flash file extension." values="(string)"/>
+      <configurationElements name="HWID" description="Hardware Id" values="([0-9]4)"/>
+      <configurationElements name="HWID_LIST" description="Possible Hardware Ids of the product." values="([0-9]4)*"/>
+      <configurationElements name="KEEPTEMP" description="Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby" values="([0|1])"/>
+      <configurationElements name="LABEL" description="A label to the NAME of the image" values="(string)"/>
+      <configurationElements name="LANGID" description="Language id used in the lang.txt generation" values="(string)"/>
+      <configurationElements name="LANGUAGES" description="Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)" values="(string)"/>
+      <configurationElements name="NAME" description="The name of the image" values="(string)"/>
+      <configurationElements name="OPERATOR_OBY" description="The name for generated operator oby, which is a file generated based on an operator specific content." values="(string)"/>
+      <configurationElements name="OPERATOR_OBYGEN" description="The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder)." values="(string)|(string)|(string)"/>
+      <configurationElements name="PRODUCT_MODEL" description="The model of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_NAME" description="Name of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_REVISION" description="The reision of the product" values="(string)"/>
+      <configurationElements name="RELEASEDIR" description="The RELEASEDIR is used in the RELEASE step that copies the created files to a separate folder defined by the RELEASEDIR." values="(string)"/>
+      <configurationElements name="RELEASEFILES" description="The RELEASEFILES define the source files that are copied in the RELEASE step. The files must be given as a space delimited list. Wildcards can be used. E.g. \epoc32\rombuild\product\theflash.fpsx \epoc32\rombuild\product\*.log" values="(string)"/>
+      <configurationElements name="RELEASENAME" description="The RELEASENAME is used in the RELEASE step that copies the created files to a separate folder with a new name." values="(string)"/>
+      <configurationElements name="ROFS2_DIR" description="The working directory, when creating the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_E2FNAME" description="The rofs2 elf2flash filename. This is the final rofs2 flash file." values="(string)"/>
+      <configurationElements name="ROFS2_FOOTER" description="This variable can contain a footer section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDFILE" description="The (generated) _rofs2_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDINFO" description="The content string for the fwid2.txt file." values="(string)"/>
+      <configurationElements name="ROFS2_HEADER" description="This variable can contain a header section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_MSTOBY" description="The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters" values="(string)"/>
+      <configurationElements name="ROFS2_NAME" description="The full name of the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_OBY" description="The oby file(s) included to the rofs2 image creation" values="(string)"/>
+      <configurationElements name="ROFS2_OPT" description="The rofs2 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS2_ROMVER" description="The rofs2 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS2_TIME" description="The time defined to the rofs2 image." values="(string)"/>
+      <configurationElements name="ROFS2_VERIBY" description="The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTFILE" description="The (generated) source file name for customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTINFO" description="The content string for the customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_DIR" description="The working directory, when creating the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_E2FNAME" description="The rofs3 elf2flash filename. This is the final rofs3 flash file." values="(string)"/>
+      <configurationElements name="ROFS3_FOOTER" description="This variable can contain a footer section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDFILE" description="The (generated) _rofs3_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDINFO" description="The content string for the fwid3.txt file." values="(string)"/>
+      <configurationElements name="ROFS3_HEADER" description="This variable can contain a header section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_MSTOBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_NAME" description="The full name of the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_OBY" description="The oby file(s) included to the rofs3 image creation" values="(string)"/>
+      <configurationElements name="ROFS3_OPT" description="The rofs3 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS3_ROMVER" description="The rofs3 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS3_TIME" description="The time defined to the rofs3 image." values="(string)"/>
+      <configurationElements name="ROFS3_VERIBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="SOS_VERSION" description="Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)" values="([0-9]+.[0-9]+)"/>
+      <configurationElements name="SWUPD_EXT" description="The software update file extension." values="(string)"/>
+      <configurationElements name="TYPE" description="Defines the image type." values="(rnd|prd|subcon)"/>
+      <configurationElements name="USE_OVERRIDE" description="Define whether the override.pm Buildrom.pl plugin is used (Includes automatically also \epoc32\rom\override.oby)." values="([0|1])"/>
+      <configurationElements name="USE_PAGING" description="Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code)." values="((0|rom|code[:[(1|2|3)]+]?))"/>
+      <configurationElements name="USE_ROFS" description="Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3)." values="([[dummy|]0..6][,[dummy|]0..6]*)"/>
+      <configurationElements name="USE_ROMFILE" description="Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1." values="([0|1])"/>
+      <configurationElements name="USE_ROMSYMGEN" description="Generate the rom symbol file. 0=Do not generate, 1=Generate" values="([0|1])"/>
+      <configurationElements name="USE_UDEB" description="Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel." values="([0|1|full])"/>
+      <configurationElements name="USE_VERGEN" description="Use iMaker version info generation" values="([0|1])"/>
+      <configurationElements name="BLDROBY" description="For passing extra oby files (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="BLDROM_OPT" description="The default buildrom.pl options" values="(string)"/>
+      <configurationElements name="BLDROPT" description="For passing extra parameters (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="CONFIGROOT" description="Define the default configuration root directory." values="(string)"/>
+      <configurationElements name="CORE_CDPROMFILE" description="The name of the core Code Demand Paging rom file (Code paging)." values="(string)"/>
+      <configurationElements name="CORE_DIR" description="The working directory, when creating core image" values="(string)"/>
+      <configurationElements name="CORE_E2FNAME" description="The core elf2flash filename. This is the final core flash file." values="(string)"/>
+      <configurationElements name="CORE_FWIDFILE" description="The (generated) _core_fwid.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVFILE" description="The (generated) _core_imeisv.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVINFO" description="The content string for the imeisv.txt file." values="(string)"/>
+      <configurationElements name="CORE_MODELFILE" description="The (generated) _core_model.txt file name." values="(string)"/>
+      <configurationElements name="CORE_MODELINFO" description="The content string for the model.txt file." values="(string)"/>
+      <configurationElements name="CORE_MSTOBY" description="The generated master oby file name, which includes the CORE_OBY files" values="(string)"/>
+      <configurationElements name="CORE_NAME" description="The full name of the core image" values="(string)"/>
+      <configurationElements name="CORE_NDPROMFILE" description="The name of the core Non Demand Paging rom file." values="(string)"/>
+      <configurationElements name="CORE_OBY" description="The oby file(s) included to the core image creation" values="(string)"/>
+      <configurationElements name="CORE_ODPROMFILE" description="The name of the core On Demand Paging rom file (Rom paging)." values="(string)"/>
+      <configurationElements name="CORE_OPT" description="The core specific buildrom options" values="(string)"/>
+      <configurationElements name="CORE_PLATFILE" description="The (generated) _core_platform.txt file name." values="(string)"/>
+      <configurationElements name="CORE_PLATINFO" description="The content string for the fwid.txt file." values="(string)"/>
+      <configurationElements name="CORE_PRODFILE" description="The (generated) _core_product.txt file name." values="(string)"/>
+      <configurationElements name="CORE_ROFSFILE" description="The name of the core rofs file." values="(string)"/>
+      <configurationElements name="CORE_ROMVER" description="The rom version parameter passed to the version.iby" values="(string)"/>
+      <configurationElements name="CORE_SWVERFILE" description="The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file." values="(string)"/>
+      <configurationElements name="CORE_SWVERINFO" description="The content string for the sw.txt file." values="(string)"/>
+      <configurationElements name="CORE_TIME" description="The time defined to the core image" values="(string)"/>
+      <configurationElements name="CORE_UDEBFILE" description="The name of the core udeb file. See USE_UDEB." values="(string)"/>
+      <configurationElements name="CORE_VERIBY" description="The name of the generated core *version.iby, which included version files and info" values="(string)"/>
+      <configurationElements name="CORE_VERSION" description="The version of the core. Used in sw.txt generation." values="(string)"/>
+      <configurationElements name="COREPLAT_NAME" description="Name of the core platform" values="(string)"/>
+      <configurationElements name="CUSTVARIANT_DIR" description="Configure the directory where to included the customer variant content. By default all content under /content is included to the image as it exists in the folder." values="(string)"/>
+      <configurationElements name="DEFAULT_LANGUAGE" description="Default language is the language where the device will boot to (SIM language overrides this selection)" values="(string)"/>
+      <configurationElements name="FLASH_EXT" description="The flash file extension." values="(string)"/>
+      <configurationElements name="HWID" description="Hardware Id" values="([0-9]4)"/>
+      <configurationElements name="HWID_LIST" description="Possible Hardware Ids of the product." values="([0-9]4)*"/>
+      <configurationElements name="KEEPTEMP" description="Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby" values="([0|1])"/>
+      <configurationElements name="LABEL" description="A label to the NAME of the image" values="(string)"/>
+      <configurationElements name="LANGID" description="Language id used in the lang.txt generation" values="(string)"/>
+      <configurationElements name="LANGUAGES" description="Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)" values="(string)"/>
+      <configurationElements name="NAME" description="The name of the image" values="(string)"/>
+      <configurationElements name="OPERATOR_OBY" description="The name for generated operator oby, which is a file generated based on an operator specific content." values="(string)"/>
+      <configurationElements name="OPERATOR_OBYGEN" description="The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder)." values="(string)|(string)|(string)"/>
+      <configurationElements name="PRODUCT_MODEL" description="The model of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_NAME" description="Name of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_REVISION" description="The reision of the product" values="(string)"/>
+      <configurationElements name="RELEASEDIR" description="The RELEASEDIR is used in the RELEASE step that copies the created files to a separate folder defined by the RELEASEDIR." values="(string)"/>
+      <configurationElements name="RELEASEFILES" description="The RELEASEFILES define the source files that are copied in the RELEASE step. The files must be given as a space delimited list. Wildcards can be used. E.g. \epoc32\rombuild\product\theflash.fpsx \epoc32\rombuild\product\*.log" values="(string)"/>
+      <configurationElements name="RELEASENAME" description="The RELEASENAME is used in the RELEASE step that copies the created files to a separate folder with a new name." values="(string)"/>
+      <configurationElements name="ROFS2_DIR" description="The working directory, when creating the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_E2FNAME" description="The rofs2 elf2flash filename. This is the final rofs2 flash file." values="(string)"/>
+      <configurationElements name="ROFS2_FOOTER" description="This variable can contain a footer section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDFILE" description="The (generated) _rofs2_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDINFO" description="The content string for the fwid2.txt file." values="(string)"/>
+      <configurationElements name="ROFS2_HEADER" description="This variable can contain a header section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_MSTOBY" description="The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters" values="(string)"/>
+      <configurationElements name="ROFS2_NAME" description="The full name of the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_OBY" description="The oby file(s) included to the rofs2 image creation" values="(string)"/>
+      <configurationElements name="ROFS2_OPT" description="The rofs2 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS2_ROMVER" description="The rofs2 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS2_TIME" description="The time defined to the rofs2 image." values="(string)"/>
+      <configurationElements name="ROFS2_VERIBY" description="The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTFILE" description="The (generated) source file name for customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTINFO" description="The content string for the customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_DIR" description="The working directory, when creating the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_E2FNAME" description="The rofs3 elf2flash filename. This is the final rofs3 flash file." values="(string)"/>
+      <configurationElements name="ROFS3_FOOTER" description="This variable can contain a footer section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDFILE" description="The (generated) _rofs3_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDINFO" description="The content string for the fwid3.txt file." values="(string)"/>
+      <configurationElements name="ROFS3_HEADER" description="This variable can contain a header section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_MSTOBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_NAME" description="The full name of the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_OBY" description="The oby file(s) included to the rofs3 image creation" values="(string)"/>
+      <configurationElements name="ROFS3_OPT" description="The rofs3 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS3_ROMVER" description="The rofs3 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS3_TIME" description="The time defined to the rofs3 image." values="(string)"/>
+      <configurationElements name="ROFS3_VERIBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="SOS_VERSION" description="Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)" values="([0-9]+.[0-9]+)"/>
+      <configurationElements name="SWUPD_EXT" description="The software update file extension." values="(string)"/>
+      <configurationElements name="TYPE" description="Defines the image type." values="(rnd|prd|subcon)"/>
+      <configurationElements name="USE_OVERRIDE" description="Define whether the override.pm Buildrom.pl plugin is used (Includes automatically also \epoc32\rom\override.oby)." values="([0|1])"/>
+      <configurationElements name="USE_PAGING" description="Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code)." values="((0|rom|code[:[(1|2|3)]+]?))"/>
+      <configurationElements name="USE_ROFS" description="Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3)." values="([[dummy|]0..6][,[dummy|]0..6]*)"/>
+      <configurationElements name="USE_ROMFILE" description="Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1." values="([0|1])"/>
+      <configurationElements name="USE_ROMSYMGEN" description="Generate the rom symbol file. 0=Do not generate, 1=Generate" values="([0|1])"/>
+      <configurationElements name="USE_UDEB" description="Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel." values="([0|1|full])"/>
+      <configurationElements name="USE_VERGEN" description="Use iMaker version info generation" values="([0|1])"/>
+      <configurationElements name="BLDROBY" description="For passing extra oby files (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="BLDROM_OPT" description="The default buildrom.pl options" values="(string)"/>
+      <configurationElements name="BLDROPT" description="For passing extra parameters (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="CONFIGROOT" description="Define the default configuration root directory." values="(string)"/>
+      <configurationElements name="CORE_CDPROMFILE" description="The name of the core Code Demand Paging rom file (Code paging)." values="(string)"/>
+      <configurationElements name="CORE_DIR" description="The working directory, when creating core image" values="(string)"/>
+      <configurationElements name="CORE_E2FNAME" description="The core elf2flash filename. This is the final core flash file." values="(string)"/>
+      <configurationElements name="CORE_FWIDFILE" description="The (generated) _core_fwid.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVFILE" description="The (generated) _core_imeisv.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVINFO" description="The content string for the imeisv.txt file." values="(string)"/>
+      <configurationElements name="CORE_MODELFILE" description="The (generated) _core_model.txt file name." values="(string)"/>
+      <configurationElements name="CORE_MODELINFO" description="The content string for the model.txt file." values="(string)"/>
+      <configurationElements name="CORE_MSTOBY" description="The generated master oby file name, which includes the CORE_OBY files" values="(string)"/>
+      <configurationElements name="CORE_NAME" description="The full name of the core image" values="(string)"/>
+      <configurationElements name="CORE_NDPROMFILE" description="The name of the core Non Demand Paging rom file." values="(string)"/>
+      <configurationElements name="CORE_OBY" description="The oby file(s) included to the core image creation" values="(string)"/>
+      <configurationElements name="CORE_ODPROMFILE" description="The name of the core On Demand Paging rom file (Rom paging)." values="(string)"/>
+      <configurationElements name="CORE_OPT" description="The core specific buildrom options" values="(string)"/>
+      <configurationElements name="CORE_PLATFILE" description="The (generated) _core_platform.txt file name." values="(string)"/>
+      <configurationElements name="CORE_PLATINFO" description="The content string for the fwid.txt file." values="(string)"/>
+      <configurationElements name="CORE_PRODFILE" description="The (generated) _core_product.txt file name." values="(string)"/>
+      <configurationElements name="CORE_ROFSFILE" description="The name of the core rofs file." values="(string)"/>
+      <configurationElements name="CORE_ROMVER" description="The rom version parameter passed to the version.iby" values="(string)"/>
+      <configurationElements name="CORE_SWVERFILE" description="The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file." values="(string)"/>
+      <configurationElements name="CORE_SWVERINFO" description="The content string for the sw.txt file." values="(string)"/>
+      <configurationElements name="CORE_TIME" description="The time defined to the core image" values="(string)"/>
+      <configurationElements name="CORE_UDEBFILE" description="The name of the core udeb file. See USE_UDEB." values="(string)"/>
+      <configurationElements name="CORE_VERIBY" description="The name of the generated core *version.iby, which included version files and info" values="(string)"/>
+      <configurationElements name="CORE_VERSION" description="The version of the core. Used in sw.txt generation." values="(string)"/>
+      <configurationElements name="COREPLAT_NAME" description="Name of the core platform" values="(string)"/>
+      <configurationElements name="CUSTVARIANT_DIR" description="Configure the directory where to included the customer variant content. By default all content under /content is included to the image as it exists in the folder." values="(string)"/>
+      <configurationElements name="DEFAULT_LANGUAGE" description="Default language is the language where the device will boot to (SIM language overrides this selection)" values="(string)"/>
+      <configurationElements name="FLASH_EXT" description="The flash file extension." values="(string)"/>
+      <configurationElements name="HWID" description="Hardware Id" values="([0-9]4)"/>
+      <configurationElements name="HWID_LIST" description="Possible Hardware Ids of the product." values="([0-9]4)*"/>
+      <configurationElements name="KEEPTEMP" description="Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby" values="([0|1])"/>
+      <configurationElements name="LABEL" description="A label to the NAME of the image" values="(string)"/>
+      <configurationElements name="LANGID" description="Language id used in the lang.txt generation" values="(string)"/>
+      <configurationElements name="LANGUAGES" description="Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)" values="(string)"/>
+      <configurationElements name="NAME" description="The name of the image" values="(string)"/>
+      <configurationElements name="OPERATOR_OBY" description="The name for generated operator oby, which is a file generated based on an operator specific content." values="(string)"/>
+      <configurationElements name="OPERATOR_OBYGEN" description="The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder)." values="(string)|(string)|(string)"/>
+      <configurationElements name="PRODUCT_MODEL" description="The model of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_NAME" description="Name of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_REVISION" description="The reision of the product" values="(string)"/>
+      <configurationElements name="RELEASEDIR" description="The RELEASEDIR is used in the RELEASE step that copies the created files to a separate folder defined by the RELEASEDIR." values="(string)"/>
+      <configurationElements name="RELEASEFILES" description="The RELEASEFILES define the source files that are copied in the RELEASE step. The files must be given as a space delimited list. Wildcards can be used. E.g. \epoc32\rombuild\product\theflash.fpsx \epoc32\rombuild\product\*.log" values="(string)"/>
+      <configurationElements name="RELEASENAME" description="The RELEASENAME is used in the RELEASE step that copies the created files to a separate folder with a new name." values="(string)"/>
+      <configurationElements name="ROFS2_DIR" description="The working directory, when creating the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_E2FNAME" description="The rofs2 elf2flash filename. This is the final rofs2 flash file." values="(string)"/>
+      <configurationElements name="ROFS2_FOOTER" description="This variable can contain a footer section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDFILE" description="The (generated) _rofs2_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDINFO" description="The content string for the fwid2.txt file." values="(string)"/>
+      <configurationElements name="ROFS2_HEADER" description="This variable can contain a header section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_MSTOBY" description="The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters" values="(string)"/>
+      <configurationElements name="ROFS2_NAME" description="The full name of the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_OBY" description="The oby file(s) included to the rofs2 image creation" values="(string)"/>
+      <configurationElements name="ROFS2_OPT" description="The rofs2 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS2_ROMVER" description="The rofs2 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS2_TIME" description="The time defined to the rofs2 image." values="(string)"/>
+      <configurationElements name="ROFS2_VERIBY" description="The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTFILE" description="The (generated) source file name for customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTINFO" description="The content string for the customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_DIR" description="The working directory, when creating the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_E2FNAME" description="The rofs3 elf2flash filename. This is the final rofs3 flash file." values="(string)"/>
+      <configurationElements name="ROFS3_FOOTER" description="This variable can contain a footer section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDFILE" description="The (generated) _rofs3_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDINFO" description="The content string for the fwid3.txt file." values="(string)"/>
+      <configurationElements name="ROFS3_HEADER" description="This variable can contain a header section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_MSTOBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_NAME" description="The full name of the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_OBY" description="The oby file(s) included to the rofs3 image creation" values="(string)"/>
+      <configurationElements name="ROFS3_OPT" description="The rofs3 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS3_ROMVER" description="The rofs3 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS3_TIME" description="The time defined to the rofs3 image." values="(string)"/>
+      <configurationElements name="ROFS3_VERIBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="SOS_VERSION" description="Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)" values="([0-9]+.[0-9]+)"/>
+      <configurationElements name="SWUPD_EXT" description="The software update file extension." values="(string)"/>
+      <configurationElements name="TYPE" description="Defines the image type." values="(rnd|prd|subcon)"/>
+      <configurationElements name="USE_OVERRIDE" description="Define whether the override.pm Buildrom.pl plugin is used (Includes automatically also \epoc32\rom\override.oby)." values="([0|1])"/>
+      <configurationElements name="USE_PAGING" description="Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code)." values="((0|rom|code[:[(1|2|3)]+]?))"/>
+      <configurationElements name="USE_ROFS" description="Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3)." values="([[dummy|]0..6][,[dummy|]0..6]*)"/>
+      <configurationElements name="USE_ROMFILE" description="Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1." values="([0|1])"/>
+      <configurationElements name="USE_ROMSYMGEN" description="Generate the rom symbol file. 0=Do not generate, 1=Generate" values="([0|1])"/>
+      <configurationElements name="USE_UDEB" description="Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel." values="([0|1|full])"/>
+      <configurationElements name="USE_VERGEN" description="Use iMaker version info generation" values="([0|1])"/>
+      <configurationElements name="BLDROBY" description="For passing extra oby files (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="BLDROM_OPT" description="The default buildrom.pl options" values="(string)"/>
+      <configurationElements name="BLDROPT" description="For passing extra parameters (from command line) to the buildrom.pl" values="(string)"/>
+      <configurationElements name="CONFIGROOT" description="Define the default configuration root directory." values="(string)"/>
+      <configurationElements name="CORE_CDPROMFILE" description="The name of the core Code Demand Paging rom file (Code paging)." values="(string)"/>
+      <configurationElements name="CORE_DIR" description="The working directory, when creating core image" values="(string)"/>
+      <configurationElements name="CORE_E2FNAME" description="The core elf2flash filename. This is the final core flash file." values="(string)"/>
+      <configurationElements name="CORE_FWIDFILE" description="The (generated) _core_fwid.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVFILE" description="The (generated) _core_imeisv.txt file name." values="(string)"/>
+      <configurationElements name="CORE_IMEISVINFO" description="The content string for the imeisv.txt file." values="(string)"/>
+      <configurationElements name="CORE_MODELFILE" description="The (generated) _core_model.txt file name." values="(string)"/>
+      <configurationElements name="CORE_MODELINFO" description="The content string for the model.txt file." values="(string)"/>
+      <configurationElements name="CORE_MSTOBY" description="The generated master oby file name, which includes the CORE_OBY files" values="(string)"/>
+      <configurationElements name="CORE_NAME" description="The full name of the core image" values="(string)"/>
+      <configurationElements name="CORE_NDPROMFILE" description="The name of the core Non Demand Paging rom file." values="(string)"/>
+      <configurationElements name="CORE_OBY" description="The oby file(s) included to the core image creation" values="(string)"/>
+      <configurationElements name="CORE_ODPROMFILE" description="The name of the core On Demand Paging rom file (Rom paging)." values="(string)"/>
+      <configurationElements name="CORE_OPT" description="The core specific buildrom options" values="(string)"/>
+      <configurationElements name="CORE_PLATFILE" description="The (generated) _core_platform.txt file name." values="(string)"/>
+      <configurationElements name="CORE_PLATINFO" description="The content string for the fwid.txt file." values="(string)"/>
+      <configurationElements name="CORE_PRODFILE" description="The (generated) _core_product.txt file name." values="(string)"/>
+      <configurationElements name="CORE_ROFSFILE" description="The name of the core rofs file." values="(string)"/>
+      <configurationElements name="CORE_ROMVER" description="The rom version parameter passed to the version.iby" values="(string)"/>
+      <configurationElements name="CORE_SWVERFILE" description="The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file." values="(string)"/>
+      <configurationElements name="CORE_SWVERINFO" description="The content string for the sw.txt file." values="(string)"/>
+      <configurationElements name="CORE_TIME" description="The time defined to the core image" values="(string)"/>
+      <configurationElements name="CORE_UDEBFILE" description="The name of the core udeb file. See USE_UDEB." values="(string)"/>
+      <configurationElements name="CORE_VERIBY" description="The name of the generated core *version.iby, which included version files and info" values="(string)"/>
+      <configurationElements name="CORE_VERSION" description="The version of the core. Used in sw.txt generation." values="(string)"/>
+      <configurationElements name="COREPLAT_NAME" description="Name of the core platform" values="(string)"/>
+      <configurationElements name="CUSTVARIANT_DIR" description="Configure the directory where to included the customer variant content. By default all content under /content is included to the image as it exists in the folder." values="(string)"/>
+      <configurationElements name="DEFAULT_LANGUAGE" description="Default language is the language where the device will boot to (SIM language overrides this selection)" values="(string)"/>
+      <configurationElements name="FLASH_EXT" description="The flash file extension." values="(string)"/>
+      <configurationElements name="HWID" description="Hardware Id" values="([0-9]4)"/>
+      <configurationElements name="HWID_LIST" description="Possible Hardware Ids of the product." values="([0-9]4)*"/>
+      <configurationElements name="KEEPTEMP" description="Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby" values="([0|1])"/>
+      <configurationElements name="LABEL" description="A label to the NAME of the image" values="(string)"/>
+      <configurationElements name="LANGID" description="Language id used in the lang.txt generation" values="(string)"/>
+      <configurationElements name="LANGUAGES" description="Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)" values="(string)"/>
+      <configurationElements name="NAME" description="The name of the image" values="(string)"/>
+      <configurationElements name="OPERATOR_OBY" description="The name for generated operator oby, which is a file generated based on an operator specific content." values="(string)"/>
+      <configurationElements name="OPERATOR_OBYGEN" description="The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder)." values="(string)|(string)|(string)"/>
+      <configurationElements name="PRODUCT_MODEL" description="The model of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_NAME" description="Name of the product" values="(string)"/>
+      <configurationElements name="PRODUCT_REVISION" description="The reision of the product" values="(string)"/>
+      <configurationElements name="RELEASEDIR" description="The RELEASEDIR is used in the RELEASE step that copies the created files to a separate folder defined by the RELEASEDIR." values="(string)"/>
+      <configurationElements name="RELEASEFILES" description="The RELEASEFILES define the source files that are copied in the RELEASE step. The files must be given as a space delimited list. Wildcards can be used. E.g. \epoc32\rombuild\product\theflash.fpsx \epoc32\rombuild\product\*.log" values="(string)"/>
+      <configurationElements name="RELEASENAME" description="The RELEASENAME is used in the RELEASE step that copies the created files to a separate folder with a new name." values="(string)"/>
+      <configurationElements name="ROFS2_DIR" description="The working directory, when creating the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_E2FNAME" description="The rofs2 elf2flash filename. This is the final rofs2 flash file." values="(string)"/>
+      <configurationElements name="ROFS2_FOOTER" description="This variable can contain a footer section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDFILE" description="The (generated) _rofs2_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS2_FWIDINFO" description="The content string for the fwid2.txt file." values="(string)"/>
+      <configurationElements name="ROFS2_HEADER" description="This variable can contain a header section for the rofs2 master oby." values="(string)"/>
+      <configurationElements name="ROFS2_MSTOBY" description="The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters" values="(string)"/>
+      <configurationElements name="ROFS2_NAME" description="The full name of the rofs2 image" values="(string)"/>
+      <configurationElements name="ROFS2_OBY" description="The oby file(s) included to the rofs2 image creation" values="(string)"/>
+      <configurationElements name="ROFS2_OPT" description="The rofs2 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS2_ROMVER" description="The rofs2 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS2_TIME" description="The time defined to the rofs2 image." values="(string)"/>
+      <configurationElements name="ROFS2_VERIBY" description="The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTFILE" description="The (generated) source file name for customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_CUSTINFO" description="The content string for the customersw.txt." values="(string)"/>
+      <configurationElements name="ROFS3_DIR" description="The working directory, when creating the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_E2FNAME" description="The rofs3 elf2flash filename. This is the final rofs3 flash file." values="(string)"/>
+      <configurationElements name="ROFS3_FOOTER" description="This variable can contain a footer section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDFILE" description="The (generated) _rofs3_fwid.txt file name." values="(string)"/>
+      <configurationElements name="ROFS3_FWIDINFO" description="The content string for the fwid3.txt file." values="(string)"/>
+      <configurationElements name="ROFS3_HEADER" description="This variable can contain a header section for the rofs3 master oby." values="(string)"/>
+      <configurationElements name="ROFS3_MSTOBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="ROFS3_NAME" description="The full name of the rofs3 image" values="(string)"/>
+      <configurationElements name="ROFS3_OBY" description="The oby file(s) included to the rofs3 image creation" values="(string)"/>
+      <configurationElements name="ROFS3_OPT" description="The rofs3 specific buildrom options" values="(string)"/>
+      <configurationElements name="ROFS3_ROMVER" description="The rofs3 ROM version string" values="(string)"/>
+      <configurationElements name="ROFS3_TIME" description="The time defined to the rofs3 image." values="(string)"/>
+      <configurationElements name="ROFS3_VERIBY" description="The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters." values="(string)"/>
+      <configurationElements name="SOS_VERSION" description="Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)" values="([0-9]+.[0-9]+)"/>
+      <configurationElements name="SWUPD_EXT" description="The software update file extension." values="(string)"/>
+      <configurationElements name="TYPE" description="Defines the image type." values="(rnd|prd|subcon)"/>
+      <configurationElements name="USE_OVERRIDE" description="Define whether the override.pm Buildrom.pl plugin is used (Includes automatically also \epoc32\rom\override.oby)." values="([0|1])"/>
+      <configurationElements name="USE_PAGING" description="Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code)." values="((0|rom|code[:[(1|2|3)]+]?))"/>
+      <configurationElements name="USE_ROFS" description="Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3)." values="([[dummy|]0..6][,[dummy|]0..6]*)"/>
+      <configurationElements name="USE_ROMFILE" description="Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1." values="([0|1])"/>
+      <configurationElements name="USE_ROMSYMGEN" description="Generate the rom symbol file. 0=Do not generate, 1=Generate" values="([0|1])"/>
+      <configurationElements name="USE_UDEB" description="Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel." values="([0|1|full])"/>
+      <configurationElements name="USE_VERGEN" description="Use iMaker version info generation" values="([0|1])"/>
+    </interfaces>
+    <configurations name="image_conf_product52.mk" filePath="\epoc32\rom\config\platform\product52\image_conf_product52.mk" targetrefs="//@result/@targets.0 //@result/@targets.1 //@result/@targets.2 //@result/@targets.3 //@result/@targets.4 //@result/@targets.5 //@result/@targets.6 //@result/@targets.7 //@result/@targets.8 //@result/@targets.9 //@result/@targets.10 //@result/@targets.11 //@result/@targets.12 //@result/@targets.13 //@result/@targets.14 //@result/@targets.15 //@result/@targets.16 //@result/@targets.17 //@result/@targets.18 //@result/@targets.19 //@result/@targets.20 //@result/@targets.21 //@result/@targets.22 //@result/@targets.23 //@result/@targets.24 //@result/@targets.25 //@result/@targets.26 //@result/@targets.27 //@result/@targets.28 //@result/@targets.29 //@result/@targets.30 //@result/@targets.31 //@result/@targets.32 //@result/@targets.33 //@result/@targets.34 //@result/@targets.35 //@result/@targets.36 //@result/@targets.37">
+      <settings name="BLDROBY" ref="//@result/@interfaces.0/@configurationElements.0"/>
+      <settings name="BLDROM_OPT" value="-p -v -nosymbols   -D_IMAGE_TYPE_RND" ref="//@result/@interfaces.0/@configurationElements.1"/>
+      <settings name="BLDROPT" ref="//@result/@interfaces.0/@configurationElements.2"/>
+      <settings name="CONFIGROOT" value="/epoc32/rom/config" ref="//@result/@interfaces.0/@configurationElements.3"/>
+      <settings name="CORE_CDPROMFILE" value="/epoc32/rombuild/odpcoderomfiles.txt" ref="//@result/@interfaces.0/@configurationElements.4"/>
+      <settings name="CORE_DIR" value="/epoc32/rombuild/product52/core" ref="//@result/@interfaces.0/@configurationElements.5"/>
+      <settings name="CORE_E2FNAME" value="/epoc32/rombuild/product52/core/elf2flash/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.6"/>
+      <settings name="CORE_FWIDFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.7"/>
+      <settings name="CORE_IMEISVFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_imeisv.txt" ref="//@result/@interfaces.0/@configurationElements.8"/>
+      <settings name="CORE_IMEISVINFO" value="00" ref="//@result/@interfaces.0/@configurationElements.9"/>
+      <settings name="CORE_MODELFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_model.txt" ref="//@result/@interfaces.0/@configurationElements.10"/>
+      <settings name="CORE_MODELINFO" value="S60" ref="//@result/@interfaces.0/@configurationElements.11"/>
+      <settings name="CORE_MSTOBY" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_master.oby" ref="//@result/@interfaces.0/@configurationElements.12"/>
+      <settings name="CORE_NAME" value="/epoc32/rombuild/product52/core/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.13"/>
+      <settings name="CORE_NDPROMFILE" value="/epoc32/rombuild/romfiles.txt" ref="//@result/@interfaces.0/@configurationElements.14"/>
+      <settings name="CORE_OBY" value="/epoc32/rom/ncp.oby" ref="//@result/@interfaces.0/@configurationElements.15"/>
+      <settings name="CORE_ODPROMFILE" value="/epoc32/rombuild/odpromfiles.txt" ref="//@result/@interfaces.0/@configurationElements.16"/>
+      <settings name="CORE_OPT" value="-p -v -nosymbols   -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11  -Dproduct52  -DLCD_SHELL" ref="//@result/@interfaces.0/@configurationElements.17"/>
+      <settings name="CORE_PLATFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_platform.txt" ref="//@result/@interfaces.0/@configurationElements.18"/>
+      <settings name="CORE_PLATINFO" value="SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n" ref="//@result/@interfaces.0/@configurationElements.19"/>
+      <settings name="CORE_PRODFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_product.txt" ref="//@result/@interfaces.0/@configurationElements.20"/>
+      <settings name="CORE_ROFSFILE" value="/epoc32/rombuild/odpcoderofsfiles.txt" ref="//@result/@interfaces.0/@configurationElements.21"/>
+      <settings name="CORE_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.22"/>
+      <settings name="CORE_SWVERFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_sw.txt" ref="//@result/@interfaces.0/@configurationElements.23"/>
+      <settings name="CORE_SWVERINFO" value="V 52.2008.29.xx RND\n14-07-08\nRX-47\n(c) Nokia" ref="//@result/@interfaces.0/@configurationElements.24"/>
+      <settings name="CORE_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.25"/>
+      <settings name="CORE_UDEBFILE" value="/epoc32/rombuild/mytraces.txt" ref="//@result/@interfaces.0/@configurationElements.26"/>
+      <settings name="CORE_VERIBY" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_version.iby" ref="//@result/@interfaces.0/@configurationElements.27"/>
+      <settings name="CORE_VERSION" value="V 52.2008.29.xx RND" ref="//@result/@interfaces.0/@configurationElements.28"/>
+      <settings name="COREPLAT_NAME" value="platform" ref="//@result/@interfaces.0/@configurationElements.29"/>
+      <settings name="CUSTVARIANT_DIR" ref="//@result/@interfaces.0/@configurationElements.30"/>
+      <settings name="DEFAULT_LANGUAGE" value="SC" ref="//@result/@interfaces.0/@configurationElements.31"/>
+      <settings name="FLASH_EXT" value=".fpsx" ref="//@result/@interfaces.0/@configurationElements.32"/>
+      <settings name="HWID" value="5161 5210 5211 5220 5230* 5240" ref="//@result/@interfaces.0/@configurationElements.33"/>
+      <settings name="HWID_LIST" value="5161 5210 5211 5220 5230 5240" ref="//@result/@interfaces.0/@configurationElements.34"/>
+      <settings name="KEEPTEMP" value="0" ref="//@result/@interfaces.0/@configurationElements.35"/>
+      <settings name="LABEL" ref="//@result/@interfaces.0/@configurationElements.36"/>
+      <settings name="LANGID" value="01" ref="//@result/@interfaces.0/@configurationElements.37"/>
+      <settings name="LANGUAGES" value="SC" ref="//@result/@interfaces.0/@configurationElements.38"/>
+      <settings name="NAME" value="product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.39"/>
+      <settings name="OPERATOR_OBY" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_operator.oby" ref="//@result/@interfaces.0/@configurationElements.40"/>
+      <settings name="OPERATOR_OBYGEN" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_operator.oby | /epoc32/rom/include/operator | *.iby" ref="//@result/@interfaces.0/@configurationElements.41"/>
+      <settings name="PRODUCT_MODEL" value="N00" ref="//@result/@interfaces.0/@configurationElements.42"/>
+      <settings name="PRODUCT_NAME" value="product52" ref="//@result/@interfaces.0/@configurationElements.43"/>
+      <settings name="PRODUCT_REVISION" value="01" ref="//@result/@interfaces.0/@configurationElements.44"/>
+      <settings name="RELEASEDIR" value="/flash_images/product52" ref="//@result/@interfaces.0/@configurationElements.45"/>
+      <settings name="RELEASEFILES" value="/epoc32/rombuild/product52/product52_5230_rnd.fpsx /epoc32/rombuild/product52/core/product52_5230_rnd.rom.log /epoc32/rombuild/product52/core/product52_5230_rnd.rofs1.log /epoc32/rombuild/product52/rofs2/product52_5230_rnd.rofs2.log /epoc32/rombuild/product52/rofs3/product52_5230_rnd.rofs3.log" ref="//@result/@interfaces.0/@configurationElements.46"/>
+      <settings name="RELEASENAME" value="product52_rnd_20080714082810_haismail" ref="//@result/@interfaces.0/@configurationElements.47"/>
+      <settings name="ROFS2_DIR" value="/epoc32/rombuild/product52/rofs2" ref="//@result/@interfaces.0/@configurationElements.48"/>
+      <settings name="ROFS2_E2FNAME" value="/epoc32/rombuild/product52/rofs2/elf2flash/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.49"/>
+      <settings name="ROFS2_FOOTER" ref="//@result/@interfaces.0/@configurationElements.50"/>
+      <settings name="ROFS2_FWIDFILE" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.51"/>
+      <settings name="ROFS2_FWIDINFO" value="id=language\nversion=01\n" ref="//@result/@interfaces.0/@configurationElements.52"/>
+      <settings name="ROFS2_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.53"/>
+      <settings name="ROFS2_MSTOBY" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_master.oby" ref="//@result/@interfaces.0/@configurationElements.54"/>
+      <settings name="ROFS2_NAME" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.55"/>
+      <settings name="ROFS2_OBY" ref="//@result/@interfaces.0/@configurationElements.56"/>
+      <settings name="ROFS2_OPT" ref="//@result/@interfaces.0/@configurationElements.57"/>
+      <settings name="ROFS2_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.58"/>
+      <settings name="ROFS2_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.59"/>
+      <settings name="ROFS2_VERIBY" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_version.iby" ref="//@result/@interfaces.0/@configurationElements.60"/>
+      <settings name="ROFS3_CUSTFILE" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_customersw.txt" ref="//@result/@interfaces.0/@configurationElements.61"/>
+      <settings name="ROFS3_CUSTINFO" value="V 0.00.0\n14-07-08" ref="//@result/@interfaces.0/@configurationElements.62"/>
+      <settings name="ROFS3_DIR" value="/epoc32/rombuild/product52/rofs3" ref="//@result/@interfaces.0/@configurationElements.63"/>
+      <settings name="ROFS3_E2FNAME" value="/epoc32/rombuild/product52/rofs3/elf2flash/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.64"/>
+      <settings name="ROFS3_FOOTER" ref="//@result/@interfaces.0/@configurationElements.65"/>
+      <settings name="ROFS3_FWIDFILE" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.66"/>
+      <settings name="ROFS3_FWIDINFO" value="id=customer\nversion=V 0.00.0 RND Customer\n" ref="//@result/@interfaces.0/@configurationElements.67"/>
+      <settings name="ROFS3_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.68"/>
+      <settings name="ROFS3_MSTOBY" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_master.oby" ref="//@result/@interfaces.0/@configurationElements.69"/>
+      <settings name="ROFS3_NAME" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.70"/>
+      <settings name="ROFS3_OBY" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_operator.oby" ref="//@result/@interfaces.0/@configurationElements.71"/>
+      <settings name="ROFS3_OPT" ref="//@result/@interfaces.0/@configurationElements.72"/>
+      <settings name="ROFS3_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.73"/>
+      <settings name="ROFS3_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.74"/>
+      <settings name="ROFS3_VERIBY" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_version.iby" ref="//@result/@interfaces.0/@configurationElements.75"/>
+      <settings name="SOS_VERSION" value="9.4" ref="//@result/@interfaces.0/@configurationElements.76"/>
+      <settings name="SWUPD_EXT" value=".swupd" ref="//@result/@interfaces.0/@configurationElements.77"/>
+      <settings name="TYPE" value="rnd" ref="//@result/@interfaces.0/@configurationElements.78"/>
+      <settings name="USE_OVERRIDE" value="0" ref="//@result/@interfaces.0/@configurationElements.79"/>
+      <settings name="USE_PAGING" value="code:123" ref="//@result/@interfaces.0/@configurationElements.80"/>
+      <settings name="USE_ROFS" value="1" ref="//@result/@interfaces.0/@configurationElements.81"/>
+      <settings name="USE_ROMFILE" value="1" ref="//@result/@interfaces.0/@configurationElements.82"/>
+      <settings name="USE_ROMSYMGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.83"/>
+      <settings name="USE_UDEB" value="0" ref="//@result/@interfaces.0/@configurationElements.84"/>
+      <settings name="USE_VERGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.85"/>
+    </configurations>
+    <configurations name="image_conf_product52_ui.mk" filePath="\epoc32\rom\config\platform\product52\image_conf_product52_ui.mk" targetrefs="//@result/@targets.38 //@result/@targets.39 //@result/@targets.40 //@result/@targets.41 //@result/@targets.42 //@result/@targets.43 //@result/@targets.44 //@result/@targets.45 //@result/@targets.46 //@result/@targets.47 //@result/@targets.48 //@result/@targets.49 //@result/@targets.50 //@result/@targets.51 //@result/@targets.52 //@result/@targets.53 //@result/@targets.54 //@result/@targets.55 //@result/@targets.56 //@result/@targets.57 //@result/@targets.58 //@result/@targets.59 //@result/@targets.60 //@result/@targets.61 //@result/@targets.62 //@result/@targets.63 //@result/@targets.64 //@result/@targets.65 //@result/@targets.66 //@result/@targets.67 //@result/@targets.68 //@result/@targets.69 //@result/@targets.70 //@result/@targets.71 //@result/@targets.72 //@result/@targets.73 //@result/@targets.74 //@result/@targets.75">
+      <settings name="BLDROBY" ref="//@result/@interfaces.0/@configurationElements.86"/>
+      <settings name="BLDROM_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND" ref="//@result/@interfaces.0/@configurationElements.87"/>
+      <settings name="BLDROPT" ref="//@result/@interfaces.0/@configurationElements.88"/>
+      <settings name="CONFIGROOT" value="/epoc32/rom/config" ref="//@result/@interfaces.0/@configurationElements.89"/>
+      <settings name="CORE_CDPROMFILE" value="/epoc32/rombuild/odpcoderomfiles.txt" ref="//@result/@interfaces.0/@configurationElements.90"/>
+      <settings name="CORE_DIR" value="/epoc32/rombuild/product52/core" ref="//@result/@interfaces.0/@configurationElements.91"/>
+      <settings name="CORE_E2FNAME" value="/epoc32/rombuild/product52/core/elf2flash/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.92"/>
+      <settings name="CORE_FWIDFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.93"/>
+      <settings name="CORE_IMEISVFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_imeisv.txt" ref="//@result/@interfaces.0/@configurationElements.94"/>
+      <settings name="CORE_IMEISVINFO" value="00" ref="//@result/@interfaces.0/@configurationElements.95"/>
+      <settings name="CORE_MODELFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_model.txt" ref="//@result/@interfaces.0/@configurationElements.96"/>
+      <settings name="CORE_MODELINFO" value="S60" ref="//@result/@interfaces.0/@configurationElements.97"/>
+      <settings name="CORE_MSTOBY" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_master.oby" ref="//@result/@interfaces.0/@configurationElements.98"/>
+      <settings name="CORE_NAME" value="/epoc32/rombuild/product52/core/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.99"/>
+      <settings name="CORE_NDPROMFILE" value="/epoc32/rombuild/romfiles.txt" ref="//@result/@interfaces.0/@configurationElements.100"/>
+      <settings name="CORE_OBY" value="/epoc32/rom/master.oby /epoc32/rom/ppd.oby /epoc32/rom/rnd.oby /epoc32/rom/override.oby /epoc32/rombuild/product52/core/product52_5230_rnd_core_collected.oby /epoc32/rom/include/symbianos.iby /epoc32/rom/variant/patchdata.iby" ref="//@result/@interfaces.0/@configurationElements.101"/>
+      <settings name="CORE_ODPROMFILE" value="/epoc32/rombuild/odpromfiles.txt" ref="//@result/@interfaces.0/@configurationElements.102"/>
+      <settings name="CORE_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct52  -es60ibymacros -DSECTION -DRND_CONTENT " ref="//@result/@interfaces.0/@configurationElements.103"/>
+      <settings name="CORE_PLATFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_platform.txt" ref="//@result/@interfaces.0/@configurationElements.104"/>
+      <settings name="CORE_PLATINFO" value="SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n" ref="//@result/@interfaces.0/@configurationElements.105"/>
+      <settings name="CORE_PRODFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_product.txt" ref="//@result/@interfaces.0/@configurationElements.106"/>
+      <settings name="CORE_ROFSFILE" value="/epoc32/rombuild/odpcoderofsfiles.txt" ref="//@result/@interfaces.0/@configurationElements.107"/>
+      <settings name="CORE_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.108"/>
+      <settings name="CORE_SWVERFILE" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_sw.txt" ref="//@result/@interfaces.0/@configurationElements.109"/>
+      <settings name="CORE_SWVERINFO" value="V 52.50.2008.23. RnD\n13-06-08\nRX-47\n(c)NMP" ref="//@result/@interfaces.0/@configurationElements.110"/>
+      <settings name="CORE_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.111"/>
+      <settings name="CORE_UDEBFILE" value="/epoc32/rombuild/mytraces.txt" ref="//@result/@interfaces.0/@configurationElements.112"/>
+      <settings name="CORE_VERIBY" value="/epoc32/rombuild/product52/core/product52_5230_rnd_core_version.iby" ref="//@result/@interfaces.0/@configurationElements.113"/>
+      <settings name="CORE_VERSION" value="V 52.50.2008.23. RnD" ref="//@result/@interfaces.0/@configurationElements.114"/>
+      <settings name="COREPLAT_NAME" value="platform" ref="//@result/@interfaces.0/@configurationElements.115"/>
+      <settings name="CUSTVARIANT_DIR" ref="//@result/@interfaces.0/@configurationElements.116"/>
+      <settings name="DEFAULT_LANGUAGE" value="01" ref="//@result/@interfaces.0/@configurationElements.117"/>
+      <settings name="FLASH_EXT" value=".fpsx" ref="//@result/@interfaces.0/@configurationElements.118"/>
+      <settings name="HWID" value="5161 5210 5211 5220 5230* 5240" ref="//@result/@interfaces.0/@configurationElements.119"/>
+      <settings name="HWID_LIST" value="5161 5210 5211 5220 5230 5240" ref="//@result/@interfaces.0/@configurationElements.120"/>
+      <settings name="KEEPTEMP" value="0" ref="//@result/@interfaces.0/@configurationElements.121"/>
+      <settings name="LABEL" ref="//@result/@interfaces.0/@configurationElements.122"/>
+      <settings name="LANGID" value="01" ref="//@result/@interfaces.0/@configurationElements.123"/>
+      <settings name="LANGUAGES" value="01" ref="//@result/@interfaces.0/@configurationElements.124"/>
+      <settings name="NAME" value="product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.125"/>
+      <settings name="OPERATOR_OBY" ref="//@result/@interfaces.0/@configurationElements.126"/>
+      <settings name="OPERATOR_OBYGEN" value=" | /epoc32/rom/include/operator | *.iby" ref="//@result/@interfaces.0/@configurationElements.127"/>
+      <settings name="PRODUCT_MODEL" value="N00" ref="//@result/@interfaces.0/@configurationElements.128"/>
+      <settings name="PRODUCT_NAME" value="product52" ref="//@result/@interfaces.0/@configurationElements.129"/>
+      <settings name="PRODUCT_REVISION" value="01" ref="//@result/@interfaces.0/@configurationElements.130"/>
+      <settings name="RELEASEDIR" value="/flash_images/product52" ref="//@result/@interfaces.0/@configurationElements.131"/>
+      <settings name="RELEASEFILES" value="/epoc32/rombuild/product52/product52_5230_rnd.fpsx /epoc32/rombuild/product52/core/product52_5230_rnd.rom.log /epoc32/rombuild/product52/core/product52_5230_rnd.rofs1.log /epoc32/rombuild/product52/rofs2/product52_5230_rnd.rofs2.log /epoc32/rombuild/product52/rofs3/product52_5230_rnd.rofs3.log" ref="//@result/@interfaces.0/@configurationElements.132"/>
+      <settings name="RELEASENAME" value="product52_rnd_20080714082814_haismail" ref="//@result/@interfaces.0/@configurationElements.133"/>
+      <settings name="ROFS2_DIR" value="/epoc32/rombuild/product52/rofs2" ref="//@result/@interfaces.0/@configurationElements.134"/>
+      <settings name="ROFS2_E2FNAME" value="/epoc32/rombuild/product52/rofs2/elf2flash/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.135"/>
+      <settings name="ROFS2_FOOTER" ref="//@result/@interfaces.0/@configurationElements.136"/>
+      <settings name="ROFS2_FWIDFILE" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.137"/>
+      <settings name="ROFS2_FWIDINFO" value="id=language\nversion=01\n" ref="//@result/@interfaces.0/@configurationElements.138"/>
+      <settings name="ROFS2_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.139"/>
+      <settings name="ROFS2_MSTOBY" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_master.oby" ref="//@result/@interfaces.0/@configurationElements.140"/>
+      <settings name="ROFS2_NAME" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.141"/>
+      <settings name="ROFS2_OBY" value="&lt;Variant.oby> &lt;ppd_variant.oby> &lt;ppd_locales.iby> /epoc32/rom/override.oby /epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_language_collected.oby /epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_customer_collected.oby" ref="//@result/@interfaces.0/@configurationElements.142"/>
+      <settings name="ROFS2_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct52  -es60ibymacros -elocalise -DRND_CONTENT" ref="//@result/@interfaces.0/@configurationElements.143"/>
+      <settings name="ROFS2_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.144"/>
+      <settings name="ROFS2_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.145"/>
+      <settings name="ROFS2_VERIBY" value="/epoc32/rombuild/product52/rofs2/product52_5230_rnd_rofs2_version.iby" ref="//@result/@interfaces.0/@configurationElements.146"/>
+      <settings name="ROFS3_CUSTFILE" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_customersw.txt" ref="//@result/@interfaces.0/@configurationElements.147"/>
+      <settings name="ROFS3_CUSTINFO" value="V 52.50.2008.23. RnD\n14-07-08" ref="//@result/@interfaces.0/@configurationElements.148"/>
+      <settings name="ROFS3_DIR" value="/epoc32/rombuild/product52/rofs3" ref="//@result/@interfaces.0/@configurationElements.149"/>
+      <settings name="ROFS3_E2FNAME" value="/epoc32/rombuild/product52/rofs3/elf2flash/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.150"/>
+      <settings name="ROFS3_FOOTER" ref="//@result/@interfaces.0/@configurationElements.151"/>
+      <settings name="ROFS3_FWIDFILE" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.152"/>
+      <settings name="ROFS3_FWIDINFO" value="id=customer\nversion=V 52.50.2008.23. RnD RND Customer\n" ref="//@result/@interfaces.0/@configurationElements.153"/>
+      <settings name="ROFS3_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.154"/>
+      <settings name="ROFS3_MSTOBY" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_master.oby" ref="//@result/@interfaces.0/@configurationElements.155"/>
+      <settings name="ROFS3_NAME" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.156"/>
+      <settings name="ROFS3_OBY" value=" /epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_collected.oby" ref="//@result/@interfaces.0/@configurationElements.157"/>
+      <settings name="ROFS3_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct52  -es60ibymacros" ref="//@result/@interfaces.0/@configurationElements.158"/>
+      <settings name="ROFS3_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.159"/>
+      <settings name="ROFS3_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.160"/>
+      <settings name="ROFS3_VERIBY" value="/epoc32/rombuild/product52/rofs3/product52_5230_rnd_rofs3_version.iby" ref="//@result/@interfaces.0/@configurationElements.161"/>
+      <settings name="SOS_VERSION" value="9.4" ref="//@result/@interfaces.0/@configurationElements.162"/>
+      <settings name="SWUPD_EXT" value=".swupd" ref="//@result/@interfaces.0/@configurationElements.163"/>
+      <settings name="TYPE" value="rnd" ref="//@result/@interfaces.0/@configurationElements.164"/>
+      <settings name="USE_OVERRIDE" value="1" ref="//@result/@interfaces.0/@configurationElements.165"/>
+      <settings name="USE_PAGING" value="code:123" ref="//@result/@interfaces.0/@configurationElements.166"/>
+      <settings name="USE_ROFS" value="1,2,3" ref="//@result/@interfaces.0/@configurationElements.167"/>
+      <settings name="USE_ROMFILE" value="1" ref="//@result/@interfaces.0/@configurationElements.168"/>
+      <settings name="USE_ROMSYMGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.169"/>
+      <settings name="USE_UDEB" value="1" ref="//@result/@interfaces.0/@configurationElements.170"/>
+      <settings name="USE_VERGEN" value="1" ref="//@result/@interfaces.0/@configurationElements.171"/>
+    </configurations>
+    <configurations name="image_conf_product.mk" filePath="\epoc32\rom\config\platform\product\image_conf_product.mk" targetrefs="//@result/@targets.76 //@result/@targets.77 //@result/@targets.78 //@result/@targets.79 //@result/@targets.80 //@result/@targets.81 //@result/@targets.82 //@result/@targets.83 //@result/@targets.84 //@result/@targets.85 //@result/@targets.86 //@result/@targets.87 //@result/@targets.88 //@result/@targets.89 //@result/@targets.90 //@result/@targets.91 //@result/@targets.92 //@result/@targets.93 //@result/@targets.94 //@result/@targets.95 //@result/@targets.96 //@result/@targets.97 //@result/@targets.98 //@result/@targets.99 //@result/@targets.100 //@result/@targets.101 //@result/@targets.102 //@result/@targets.103 //@result/@targets.104 //@result/@targets.105 //@result/@targets.106 //@result/@targets.107 //@result/@targets.108 //@result/@targets.109 //@result/@targets.110 //@result/@targets.111 //@result/@targets.112 //@result/@targets.113">
+      <settings name="BLDROBY" ref="//@result/@interfaces.0/@configurationElements.172"/>
+      <settings name="BLDROM_OPT" value="-p -v -nosymbols   -D_IMAGE_TYPE_RND" ref="//@result/@interfaces.0/@configurationElements.173"/>
+      <settings name="BLDROPT" ref="//@result/@interfaces.0/@configurationElements.174"/>
+      <settings name="CONFIGROOT" value="/epoc32/rom/config" ref="//@result/@interfaces.0/@configurationElements.175"/>
+      <settings name="CORE_CDPROMFILE" value="/epoc32/rombuild/odpcoderomfiles.txt" ref="//@result/@interfaces.0/@configurationElements.176"/>
+      <settings name="CORE_DIR" value="/epoc32/rombuild/product/core" ref="//@result/@interfaces.0/@configurationElements.177"/>
+      <settings name="CORE_E2FNAME" value="/epoc32/rombuild/product/core/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.178"/>
+      <settings name="CORE_FWIDFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.179"/>
+      <settings name="CORE_IMEISVFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_imeisv.txt" ref="//@result/@interfaces.0/@configurationElements.180"/>
+      <settings name="CORE_IMEISVINFO" value="00" ref="//@result/@interfaces.0/@configurationElements.181"/>
+      <settings name="CORE_MODELFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_model.txt" ref="//@result/@interfaces.0/@configurationElements.182"/>
+      <settings name="CORE_MODELINFO" value="S60" ref="//@result/@interfaces.0/@configurationElements.183"/>
+      <settings name="CORE_MSTOBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_master.oby" ref="//@result/@interfaces.0/@configurationElements.184"/>
+      <settings name="CORE_NAME" value="/epoc32/rombuild/product/core/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.185"/>
+      <settings name="CORE_NDPROMFILE" value="/epoc32/rombuild/romfiles.txt" ref="//@result/@interfaces.0/@configurationElements.186"/>
+      <settings name="CORE_OBY" value="/epoc32/rom/ncp.oby" ref="//@result/@interfaces.0/@configurationElements.187"/>
+      <settings name="CORE_ODPROMFILE" value="/epoc32/rombuild/odpromfiles.txt" ref="//@result/@interfaces.0/@configurationElements.188"/>
+      <settings name="CORE_OPT" value="-p -v -nosymbols   -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11  -Dproduct  -DLCD_SHELL" ref="//@result/@interfaces.0/@configurationElements.189"/>
+      <settings name="CORE_PLATFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_platform.txt" ref="//@result/@interfaces.0/@configurationElements.190"/>
+      <settings name="CORE_PLATINFO" value="SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n" ref="//@result/@interfaces.0/@configurationElements.191"/>
+      <settings name="CORE_PRODFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_product.txt" ref="//@result/@interfaces.0/@configurationElements.192"/>
+      <settings name="CORE_ROFSFILE" value="/epoc32/rombuild/odpcoderofsfiles.txt" ref="//@result/@interfaces.0/@configurationElements.193"/>
+      <settings name="CORE_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.194"/>
+      <settings name="CORE_SWVERFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_sw.txt" ref="//@result/@interfaces.0/@configurationElements.195"/>
+      <settings name="CORE_SWVERINFO" value="V 52.2008.29.xx RND\n14-07-08\nRM-356\n(c) Nokia" ref="//@result/@interfaces.0/@configurationElements.196"/>
+      <settings name="CORE_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.197"/>
+      <settings name="CORE_UDEBFILE" value="/epoc32/rombuild/mytraces.txt" ref="//@result/@interfaces.0/@configurationElements.198"/>
+      <settings name="CORE_VERIBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_version.iby" ref="//@result/@interfaces.0/@configurationElements.199"/>
+      <settings name="CORE_VERSION" value="V 52.2008.29.xx RND" ref="//@result/@interfaces.0/@configurationElements.200"/>
+      <settings name="COREPLAT_NAME" value="platform" ref="//@result/@interfaces.0/@configurationElements.201"/>
+      <settings name="CUSTVARIANT_DIR" ref="//@result/@interfaces.0/@configurationElements.202"/>
+      <settings name="DEFAULT_LANGUAGE" value="SC" ref="//@result/@interfaces.0/@configurationElements.203"/>
+      <settings name="FLASH_EXT" value=".fpsx" ref="//@result/@interfaces.0/@configurationElements.204"/>
+      <settings name="HWID" value="5230*" ref="//@result/@interfaces.0/@configurationElements.205"/>
+      <settings name="HWID_LIST" value="5230" ref="//@result/@interfaces.0/@configurationElements.206"/>
+      <settings name="KEEPTEMP" value="0" ref="//@result/@interfaces.0/@configurationElements.207"/>
+      <settings name="LABEL" ref="//@result/@interfaces.0/@configurationElements.208"/>
+      <settings name="LANGID" value="01" ref="//@result/@interfaces.0/@configurationElements.209"/>
+      <settings name="LANGUAGES" value="SC" ref="//@result/@interfaces.0/@configurationElements.210"/>
+      <settings name="NAME" value="product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.211"/>
+      <settings name="OPERATOR_OBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_operator.oby" ref="//@result/@interfaces.0/@configurationElements.212"/>
+      <settings name="OPERATOR_OBYGEN" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_operator.oby | /epoc32/rom/include/operator | *.iby" ref="//@result/@interfaces.0/@configurationElements.213"/>
+      <settings name="PRODUCT_MODEL" value="N00" ref="//@result/@interfaces.0/@configurationElements.214"/>
+      <settings name="PRODUCT_NAME" value="product" ref="//@result/@interfaces.0/@configurationElements.215"/>
+      <settings name="PRODUCT_REVISION" value="01" ref="//@result/@interfaces.0/@configurationElements.216"/>
+      <settings name="RELEASEDIR" value="/flash_images/product" ref="//@result/@interfaces.0/@configurationElements.217"/>
+      <settings name="RELEASEFILES" value="/epoc32/rombuild/product/product_5230_rnd.fpsx /epoc32/rombuild/product/core/product_5230_rnd.rom.log /epoc32/rombuild/product/core/product_5230_rnd.rofs1.log /epoc32/rombuild/product/rofs2/product_5230_rnd.rofs2.log /epoc32/rombuild/product/rofs3/product_5230_rnd.rofs3.log" ref="//@result/@interfaces.0/@configurationElements.218"/>
+      <settings name="RELEASENAME" value="product_rnd_20080714082818_haismail" ref="//@result/@interfaces.0/@configurationElements.219"/>
+      <settings name="ROFS2_DIR" value="/epoc32/rombuild/product/rofs2" ref="//@result/@interfaces.0/@configurationElements.220"/>
+      <settings name="ROFS2_E2FNAME" value="/epoc32/rombuild/product/rofs2/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.221"/>
+      <settings name="ROFS2_FOOTER" ref="//@result/@interfaces.0/@configurationElements.222"/>
+      <settings name="ROFS2_FWIDFILE" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.223"/>
+      <settings name="ROFS2_FWIDINFO" value="id=language\nversion=01\n" ref="//@result/@interfaces.0/@configurationElements.224"/>
+      <settings name="ROFS2_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.225"/>
+      <settings name="ROFS2_MSTOBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_master.oby" ref="//@result/@interfaces.0/@configurationElements.226"/>
+      <settings name="ROFS2_NAME" value="/epoc32/rombuild/product/rofs2/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.227"/>
+      <settings name="ROFS2_OBY" ref="//@result/@interfaces.0/@configurationElements.228"/>
+      <settings name="ROFS2_OPT" ref="//@result/@interfaces.0/@configurationElements.229"/>
+      <settings name="ROFS2_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.230"/>
+      <settings name="ROFS2_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.231"/>
+      <settings name="ROFS2_VERIBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_version.iby" ref="//@result/@interfaces.0/@configurationElements.232"/>
+      <settings name="ROFS3_CUSTFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_customersw.txt" ref="//@result/@interfaces.0/@configurationElements.233"/>
+      <settings name="ROFS3_CUSTINFO" value="V 0.00.0\n14-07-08" ref="//@result/@interfaces.0/@configurationElements.234"/>
+      <settings name="ROFS3_DIR" value="/epoc32/rombuild/product/rofs3" ref="//@result/@interfaces.0/@configurationElements.235"/>
+      <settings name="ROFS3_E2FNAME" value="/epoc32/rombuild/product/rofs3/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.236"/>
+      <settings name="ROFS3_FOOTER" ref="//@result/@interfaces.0/@configurationElements.237"/>
+      <settings name="ROFS3_FWIDFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.238"/>
+      <settings name="ROFS3_FWIDINFO" value="id=customer\nversion=V 0.00.0 RND Customer\n" ref="//@result/@interfaces.0/@configurationElements.239"/>
+      <settings name="ROFS3_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.240"/>
+      <settings name="ROFS3_MSTOBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_master.oby" ref="//@result/@interfaces.0/@configurationElements.241"/>
+      <settings name="ROFS3_NAME" value="/epoc32/rombuild/product/rofs3/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.242"/>
+      <settings name="ROFS3_OBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_operator.oby" ref="//@result/@interfaces.0/@configurationElements.243"/>
+      <settings name="ROFS3_OPT" ref="//@result/@interfaces.0/@configurationElements.244"/>
+      <settings name="ROFS3_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.245"/>
+      <settings name="ROFS3_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.246"/>
+      <settings name="ROFS3_VERIBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_version.iby" ref="//@result/@interfaces.0/@configurationElements.247"/>
+      <settings name="SOS_VERSION" value="9.4" ref="//@result/@interfaces.0/@configurationElements.248"/>
+      <settings name="SWUPD_EXT" value=".swupd" ref="//@result/@interfaces.0/@configurationElements.249"/>
+      <settings name="TYPE" value="rnd" ref="//@result/@interfaces.0/@configurationElements.250"/>
+      <settings name="USE_OVERRIDE" value="0" ref="//@result/@interfaces.0/@configurationElements.251"/>
+      <settings name="USE_PAGING" value="code:123" ref="//@result/@interfaces.0/@configurationElements.252"/>
+      <settings name="USE_ROFS" value="1" ref="//@result/@interfaces.0/@configurationElements.253"/>
+      <settings name="USE_ROMFILE" value="1" ref="//@result/@interfaces.0/@configurationElements.254"/>
+      <settings name="USE_ROMSYMGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.255"/>
+      <settings name="USE_UDEB" value="0" ref="//@result/@interfaces.0/@configurationElements.256"/>
+      <settings name="USE_VERGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.257"/>
+    </configurations>
+    <configurations name="image_conf_product_ui.mk" filePath="\epoc32\rom\config\platform\product\image_conf_product_ui.mk" targetrefs="//@result/@targets.114 //@result/@targets.115 //@result/@targets.116 //@result/@targets.117 //@result/@targets.118 //@result/@targets.119 //@result/@targets.120 //@result/@targets.121 //@result/@targets.122 //@result/@targets.123 //@result/@targets.124 //@result/@targets.125 //@result/@targets.126 //@result/@targets.127 //@result/@targets.128 //@result/@targets.129 //@result/@targets.130 //@result/@targets.131 //@result/@targets.132 //@result/@targets.133 //@result/@targets.134 //@result/@targets.135 //@result/@targets.136 //@result/@targets.137 //@result/@targets.138 //@result/@targets.139 //@result/@targets.140 //@result/@targets.141 //@result/@targets.142 //@result/@targets.143 //@result/@targets.144 //@result/@targets.145 //@result/@targets.146 //@result/@targets.147 //@result/@targets.148 //@result/@targets.149 //@result/@targets.150 //@result/@targets.151">
+      <settings name="BLDROBY" ref="//@result/@interfaces.0/@configurationElements.258"/>
+      <settings name="BLDROM_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND" ref="//@result/@interfaces.0/@configurationElements.259"/>
+      <settings name="BLDROPT" ref="//@result/@interfaces.0/@configurationElements.260"/>
+      <settings name="CONFIGROOT" value="/epoc32/rom/config" ref="//@result/@interfaces.0/@configurationElements.261"/>
+      <settings name="CORE_CDPROMFILE" value="/epoc32/rombuild/odpcoderomfiles.txt" ref="//@result/@interfaces.0/@configurationElements.262"/>
+      <settings name="CORE_DIR" value="/epoc32/rombuild/product/core" ref="//@result/@interfaces.0/@configurationElements.263"/>
+      <settings name="CORE_E2FNAME" value="/epoc32/rombuild/product/core/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.264"/>
+      <settings name="CORE_FWIDFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.265"/>
+      <settings name="CORE_IMEISVFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_imeisv.txt" ref="//@result/@interfaces.0/@configurationElements.266"/>
+      <settings name="CORE_IMEISVINFO" value="00" ref="//@result/@interfaces.0/@configurationElements.267"/>
+      <settings name="CORE_MODELFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_model.txt" ref="//@result/@interfaces.0/@configurationElements.268"/>
+      <settings name="CORE_MODELINFO" value="S60" ref="//@result/@interfaces.0/@configurationElements.269"/>
+      <settings name="CORE_MSTOBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_master.oby" ref="//@result/@interfaces.0/@configurationElements.270"/>
+      <settings name="CORE_NAME" value="/epoc32/rombuild/product/core/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.271"/>
+      <settings name="CORE_NDPROMFILE" value="/epoc32/rombuild/romfiles.txt" ref="//@result/@interfaces.0/@configurationElements.272"/>
+      <settings name="CORE_OBY" value="/epoc32/rom/master.oby /epoc32/rom/ppd.oby /epoc32/rom/rnd.oby /epoc32/rom/override.oby /epoc32/rombuild/product/core/product_5230_rnd_core_collected.oby /epoc32/rom/include/symbianos.iby /epoc32/rom/variant/patchdata.iby" ref="//@result/@interfaces.0/@configurationElements.273"/>
+      <settings name="CORE_ODPROMFILE" value="/epoc32/rombuild/odpromfiles.txt" ref="//@result/@interfaces.0/@configurationElements.274"/>
+      <settings name="CORE_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct  -es60ibymacros -DSECTION -DRND_CONTENT " ref="//@result/@interfaces.0/@configurationElements.275"/>
+      <settings name="CORE_PLATFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_platform.txt" ref="//@result/@interfaces.0/@configurationElements.276"/>
+      <settings name="CORE_PLATINFO" value="SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n" ref="//@result/@interfaces.0/@configurationElements.277"/>
+      <settings name="CORE_PRODFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_product.txt" ref="//@result/@interfaces.0/@configurationElements.278"/>
+      <settings name="CORE_ROFSFILE" value="/epoc32/rombuild/odpcoderofsfiles.txt" ref="//@result/@interfaces.0/@configurationElements.279"/>
+      <settings name="CORE_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.280"/>
+      <settings name="CORE_SWVERFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_sw.txt" ref="//@result/@interfaces.0/@configurationElements.281"/>
+      <settings name="CORE_SWVERINFO" value="V 52.50.2008.24 RnD\n13-06-08\nRM-356\n(c)NMP" ref="//@result/@interfaces.0/@configurationElements.282"/>
+      <settings name="CORE_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.283"/>
+      <settings name="CORE_UDEBFILE" value="/epoc32/rombuild/mytraces.txt" ref="//@result/@interfaces.0/@configurationElements.284"/>
+      <settings name="CORE_VERIBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_version.iby" ref="//@result/@interfaces.0/@configurationElements.285"/>
+      <settings name="CORE_VERSION" value="V 52.50.2008.24 RnD" ref="//@result/@interfaces.0/@configurationElements.286"/>
+      <settings name="COREPLAT_NAME" value="platform" ref="//@result/@interfaces.0/@configurationElements.287"/>
+      <settings name="CUSTVARIANT_DIR" ref="//@result/@interfaces.0/@configurationElements.288"/>
+      <settings name="DEFAULT_LANGUAGE" value="01" ref="//@result/@interfaces.0/@configurationElements.289"/>
+      <settings name="FLASH_EXT" value=".fpsx" ref="//@result/@interfaces.0/@configurationElements.290"/>
+      <settings name="HWID" value="5230*" ref="//@result/@interfaces.0/@configurationElements.291"/>
+      <settings name="HWID_LIST" value="5230" ref="//@result/@interfaces.0/@configurationElements.292"/>
+      <settings name="KEEPTEMP" value="0" ref="//@result/@interfaces.0/@configurationElements.293"/>
+      <settings name="LABEL" ref="//@result/@interfaces.0/@configurationElements.294"/>
+      <settings name="LANGID" value="01" ref="//@result/@interfaces.0/@configurationElements.295"/>
+      <settings name="LANGUAGES" value="01" ref="//@result/@interfaces.0/@configurationElements.296"/>
+      <settings name="NAME" value="product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.297"/>
+      <settings name="OPERATOR_OBY" ref="//@result/@interfaces.0/@configurationElements.298"/>
+      <settings name="OPERATOR_OBYGEN" value=" | /epoc32/rom/include/operator | *.iby" ref="//@result/@interfaces.0/@configurationElements.299"/>
+      <settings name="PRODUCT_MODEL" value="N00" ref="//@result/@interfaces.0/@configurationElements.300"/>
+      <settings name="PRODUCT_NAME" value="product" ref="//@result/@interfaces.0/@configurationElements.301"/>
+      <settings name="PRODUCT_REVISION" value="01" ref="//@result/@interfaces.0/@configurationElements.302"/>
+      <settings name="RELEASEDIR" value="/flash_images/product" ref="//@result/@interfaces.0/@configurationElements.303"/>
+      <settings name="RELEASEFILES" value="/epoc32/rombuild/product/product_5230_rnd.fpsx /epoc32/rombuild/product/core/product_5230_rnd.rom.log /epoc32/rombuild/product/core/product_5230_rnd.rofs1.log /epoc32/rombuild/product/rofs2/product_5230_rnd.rofs2.log /epoc32/rombuild/product/rofs3/product_5230_rnd.rofs3.log" ref="//@result/@interfaces.0/@configurationElements.304"/>
+      <settings name="RELEASENAME" value="product_rnd_20080714082822_haismail" ref="//@result/@interfaces.0/@configurationElements.305"/>
+      <settings name="ROFS2_DIR" value="/epoc32/rombuild/product/rofs2" ref="//@result/@interfaces.0/@configurationElements.306"/>
+      <settings name="ROFS2_E2FNAME" value="/epoc32/rombuild/product/rofs2/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.307"/>
+      <settings name="ROFS2_FOOTER" ref="//@result/@interfaces.0/@configurationElements.308"/>
+      <settings name="ROFS2_FWIDFILE" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.309"/>
+      <settings name="ROFS2_FWIDINFO" value="id=language\nversion=01\n" ref="//@result/@interfaces.0/@configurationElements.310"/>
+      <settings name="ROFS2_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.311"/>
+      <settings name="ROFS2_MSTOBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_master.oby" ref="//@result/@interfaces.0/@configurationElements.312"/>
+      <settings name="ROFS2_NAME" value="/epoc32/rombuild/product/rofs2/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.313"/>
+      <settings name="ROFS2_OBY" value="&lt;Variant.oby> &lt;ppd_variant.oby> &lt;ppd_locales.iby> /epoc32/rom/override.oby /epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_language_collected.oby /epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_customer_collected.oby" ref="//@result/@interfaces.0/@configurationElements.314"/>
+      <settings name="ROFS2_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct  -es60ibymacros -elocalise -DRND_CONTENT" ref="//@result/@interfaces.0/@configurationElements.315"/>
+      <settings name="ROFS2_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.316"/>
+      <settings name="ROFS2_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.317"/>
+      <settings name="ROFS2_VERIBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_version.iby" ref="//@result/@interfaces.0/@configurationElements.318"/>
+      <settings name="ROFS3_CUSTFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_customersw.txt" ref="//@result/@interfaces.0/@configurationElements.319"/>
+      <settings name="ROFS3_CUSTINFO" value="V 52.50.2008.24 RnD\n14-07-08" ref="//@result/@interfaces.0/@configurationElements.320"/>
+      <settings name="ROFS3_DIR" value="/epoc32/rombuild/product/rofs3" ref="//@result/@interfaces.0/@configurationElements.321"/>
+      <settings name="ROFS3_E2FNAME" value="/epoc32/rombuild/product/rofs3/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.322"/>
+      <settings name="ROFS3_FOOTER" ref="//@result/@interfaces.0/@configurationElements.323"/>
+      <settings name="ROFS3_FWIDFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.324"/>
+      <settings name="ROFS3_FWIDINFO" value="id=customer\nversion=V 52.50.2008.24 RnD RND Customer\n" ref="//@result/@interfaces.0/@configurationElements.325"/>
+      <settings name="ROFS3_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.326"/>
+      <settings name="ROFS3_MSTOBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_master.oby" ref="//@result/@interfaces.0/@configurationElements.327"/>
+      <settings name="ROFS3_NAME" value="/epoc32/rombuild/product/rofs3/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.328"/>
+      <settings name="ROFS3_OBY" value=" /epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_collected.oby" ref="//@result/@interfaces.0/@configurationElements.329"/>
+      <settings name="ROFS3_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct  -es60ibymacros" ref="//@result/@interfaces.0/@configurationElements.330"/>
+      <settings name="ROFS3_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.331"/>
+      <settings name="ROFS3_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.332"/>
+      <settings name="ROFS3_VERIBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_version.iby" ref="//@result/@interfaces.0/@configurationElements.333"/>
+      <settings name="SOS_VERSION" value="9.4" ref="//@result/@interfaces.0/@configurationElements.334"/>
+      <settings name="SWUPD_EXT" value=".swupd" ref="//@result/@interfaces.0/@configurationElements.335"/>
+      <settings name="TYPE" value="rnd" ref="//@result/@interfaces.0/@configurationElements.336"/>
+      <settings name="USE_OVERRIDE" value="1" ref="//@result/@interfaces.0/@configurationElements.337"/>
+      <settings name="USE_PAGING" value="code:123" ref="//@result/@interfaces.0/@configurationElements.338"/>
+      <settings name="USE_ROFS" value="1,2,3" ref="//@result/@interfaces.0/@configurationElements.339"/>
+      <settings name="USE_ROMFILE" value="1" ref="//@result/@interfaces.0/@configurationElements.340"/>
+      <settings name="USE_ROMSYMGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.341"/>
+      <settings name="USE_UDEB" value="1" ref="//@result/@interfaces.0/@configurationElements.342"/>
+      <settings name="USE_VERGEN" value="1" ref="//@result/@interfaces.0/@configurationElements.343"/>
+    </configurations>
+    <configurations name="image_conf_product.mk" filePath="\epoc32\rom\config\platform\product_oem\image_conf_product.mk" targetrefs="//@result/@targets.152 //@result/@targets.153 //@result/@targets.154 //@result/@targets.155 //@result/@targets.156 //@result/@targets.157 //@result/@targets.158 //@result/@targets.159 //@result/@targets.160 //@result/@targets.161 //@result/@targets.162 //@result/@targets.163 //@result/@targets.164 //@result/@targets.165 //@result/@targets.166 //@result/@targets.167 //@result/@targets.168 //@result/@targets.169 //@result/@targets.170 //@result/@targets.171 //@result/@targets.172 //@result/@targets.173 //@result/@targets.174 //@result/@targets.175 //@result/@targets.176 //@result/@targets.177 //@result/@targets.178 //@result/@targets.179 //@result/@targets.180 //@result/@targets.181 //@result/@targets.182 //@result/@targets.183 //@result/@targets.184 //@result/@targets.185 //@result/@targets.186 //@result/@targets.187 //@result/@targets.188 //@result/@targets.189">
+      <settings name="BLDROBY" ref="//@result/@interfaces.0/@configurationElements.344"/>
+      <settings name="BLDROM_OPT" value="-p -v -nosymbols   -D_IMAGE_TYPE_RND" ref="//@result/@interfaces.0/@configurationElements.345"/>
+      <settings name="BLDROPT" ref="//@result/@interfaces.0/@configurationElements.346"/>
+      <settings name="CONFIGROOT" value="/epoc32/rom/config" ref="//@result/@interfaces.0/@configurationElements.347"/>
+      <settings name="CORE_CDPROMFILE" value="/epoc32/rombuild/odpcoderomfiles.txt" ref="//@result/@interfaces.0/@configurationElements.348"/>
+      <settings name="CORE_DIR" value="/epoc32/rombuild/product/core" ref="//@result/@interfaces.0/@configurationElements.349"/>
+      <settings name="CORE_E2FNAME" value="/epoc32/rombuild/product/core/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.350"/>
+      <settings name="CORE_FWIDFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.351"/>
+      <settings name="CORE_IMEISVFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_imeisv.txt" ref="//@result/@interfaces.0/@configurationElements.352"/>
+      <settings name="CORE_IMEISVINFO" value="00" ref="//@result/@interfaces.0/@configurationElements.353"/>
+      <settings name="CORE_MODELFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_model.txt" ref="//@result/@interfaces.0/@configurationElements.354"/>
+      <settings name="CORE_MODELINFO" value="S60" ref="//@result/@interfaces.0/@configurationElements.355"/>
+      <settings name="CORE_MSTOBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_master.oby" ref="//@result/@interfaces.0/@configurationElements.356"/>
+      <settings name="CORE_NAME" value="/epoc32/rombuild/product/core/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.357"/>
+      <settings name="CORE_NDPROMFILE" value="/epoc32/rombuild/romfiles.txt" ref="//@result/@interfaces.0/@configurationElements.358"/>
+      <settings name="CORE_OBY" value="/epoc32/rom/ncp.oby" ref="//@result/@interfaces.0/@configurationElements.359"/>
+      <settings name="CORE_ODPROMFILE" value="/epoc32/rombuild/odpromfiles.txt" ref="//@result/@interfaces.0/@configurationElements.360"/>
+      <settings name="CORE_OPT" value="-p -v -nosymbols   -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11  -Dproduct  -DLCD_SHELL" ref="//@result/@interfaces.0/@configurationElements.361"/>
+      <settings name="CORE_PLATFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_platform.txt" ref="//@result/@interfaces.0/@configurationElements.362"/>
+      <settings name="CORE_PLATINFO" value="SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n" ref="//@result/@interfaces.0/@configurationElements.363"/>
+      <settings name="CORE_PRODFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_product.txt" ref="//@result/@interfaces.0/@configurationElements.364"/>
+      <settings name="CORE_ROFSFILE" value="/epoc32/rombuild/odpcoderofsfiles.txt" ref="//@result/@interfaces.0/@configurationElements.365"/>
+      <settings name="CORE_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.366"/>
+      <settings name="CORE_SWVERFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_sw.txt" ref="//@result/@interfaces.0/@configurationElements.367"/>
+      <settings name="CORE_SWVERINFO" value="V 52.2008.29.xx RND\n14-07-08\nRM-356\n(c) Nokia" ref="//@result/@interfaces.0/@configurationElements.368"/>
+      <settings name="CORE_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.369"/>
+      <settings name="CORE_UDEBFILE" value="/epoc32/rombuild/mytraces.txt" ref="//@result/@interfaces.0/@configurationElements.370"/>
+      <settings name="CORE_VERIBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_version.iby" ref="//@result/@interfaces.0/@configurationElements.371"/>
+      <settings name="CORE_VERSION" value="V 52.2008.29.xx RND" ref="//@result/@interfaces.0/@configurationElements.372"/>
+      <settings name="COREPLAT_NAME" value="platform" ref="//@result/@interfaces.0/@configurationElements.373"/>
+      <settings name="CUSTVARIANT_DIR" ref="//@result/@interfaces.0/@configurationElements.374"/>
+      <settings name="DEFAULT_LANGUAGE" value="SC" ref="//@result/@interfaces.0/@configurationElements.375"/>
+      <settings name="FLASH_EXT" value=".fpsx" ref="//@result/@interfaces.0/@configurationElements.376"/>
+      <settings name="HWID" value="5230*" ref="//@result/@interfaces.0/@configurationElements.377"/>
+      <settings name="HWID_LIST" value="5230" ref="//@result/@interfaces.0/@configurationElements.378"/>
+      <settings name="KEEPTEMP" value="0" ref="//@result/@interfaces.0/@configurationElements.379"/>
+      <settings name="LABEL" ref="//@result/@interfaces.0/@configurationElements.380"/>
+      <settings name="LANGID" value="01" ref="//@result/@interfaces.0/@configurationElements.381"/>
+      <settings name="LANGUAGES" value="SC" ref="//@result/@interfaces.0/@configurationElements.382"/>
+      <settings name="NAME" value="product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.383"/>
+      <settings name="OPERATOR_OBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_operator.oby" ref="//@result/@interfaces.0/@configurationElements.384"/>
+      <settings name="OPERATOR_OBYGEN" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_operator.oby | /epoc32/rom/include/operator | *.iby" ref="//@result/@interfaces.0/@configurationElements.385"/>
+      <settings name="PRODUCT_MODEL" value="N00" ref="//@result/@interfaces.0/@configurationElements.386"/>
+      <settings name="PRODUCT_NAME" value="product" ref="//@result/@interfaces.0/@configurationElements.387"/>
+      <settings name="PRODUCT_REVISION" value="01" ref="//@result/@interfaces.0/@configurationElements.388"/>
+      <settings name="RELEASEDIR" value="/flash_images/product" ref="//@result/@interfaces.0/@configurationElements.389"/>
+      <settings name="RELEASEFILES" value="/epoc32/rombuild/product/product_5230_rnd.fpsx /epoc32/rombuild/product/core/product_5230_rnd.rom.log /epoc32/rombuild/product/core/product_5230_rnd.rofs1.log /epoc32/rombuild/product/rofs2/product_5230_rnd.rofs2.log /epoc32/rombuild/product/rofs3/product_5230_rnd.rofs3.log" ref="//@result/@interfaces.0/@configurationElements.390"/>
+      <settings name="RELEASENAME" value="product_rnd_20080714082826_haismail" ref="//@result/@interfaces.0/@configurationElements.391"/>
+      <settings name="ROFS2_DIR" value="/epoc32/rombuild/product/rofs2" ref="//@result/@interfaces.0/@configurationElements.392"/>
+      <settings name="ROFS2_E2FNAME" value="/epoc32/rombuild/product/rofs2/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.393"/>
+      <settings name="ROFS2_FOOTER" ref="//@result/@interfaces.0/@configurationElements.394"/>
+      <settings name="ROFS2_FWIDFILE" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.395"/>
+      <settings name="ROFS2_FWIDINFO" value="id=language\nversion=01\n" ref="//@result/@interfaces.0/@configurationElements.396"/>
+      <settings name="ROFS2_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.397"/>
+      <settings name="ROFS2_MSTOBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_master.oby" ref="//@result/@interfaces.0/@configurationElements.398"/>
+      <settings name="ROFS2_NAME" value="/epoc32/rombuild/product/rofs2/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.399"/>
+      <settings name="ROFS2_OBY" ref="//@result/@interfaces.0/@configurationElements.400"/>
+      <settings name="ROFS2_OPT" ref="//@result/@interfaces.0/@configurationElements.401"/>
+      <settings name="ROFS2_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.402"/>
+      <settings name="ROFS2_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.403"/>
+      <settings name="ROFS2_VERIBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_version.iby" ref="//@result/@interfaces.0/@configurationElements.404"/>
+      <settings name="ROFS3_CUSTFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_customersw.txt" ref="//@result/@interfaces.0/@configurationElements.405"/>
+      <settings name="ROFS3_CUSTINFO" value="V 0.00.0\n14-07-08" ref="//@result/@interfaces.0/@configurationElements.406"/>
+      <settings name="ROFS3_DIR" value="/epoc32/rombuild/product/rofs3" ref="//@result/@interfaces.0/@configurationElements.407"/>
+      <settings name="ROFS3_E2FNAME" value="/epoc32/rombuild/product/rofs3/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.408"/>
+      <settings name="ROFS3_FOOTER" ref="//@result/@interfaces.0/@configurationElements.409"/>
+      <settings name="ROFS3_FWIDFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.410"/>
+      <settings name="ROFS3_FWIDINFO" value="id=customer\nversion=V 0.00.0 RND Customer\n" ref="//@result/@interfaces.0/@configurationElements.411"/>
+      <settings name="ROFS3_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.412"/>
+      <settings name="ROFS3_MSTOBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_master.oby" ref="//@result/@interfaces.0/@configurationElements.413"/>
+      <settings name="ROFS3_NAME" value="/epoc32/rombuild/product/rofs3/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.414"/>
+      <settings name="ROFS3_OBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_operator.oby" ref="//@result/@interfaces.0/@configurationElements.415"/>
+      <settings name="ROFS3_OPT" ref="//@result/@interfaces.0/@configurationElements.416"/>
+      <settings name="ROFS3_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.417"/>
+      <settings name="ROFS3_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.418"/>
+      <settings name="ROFS3_VERIBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_version.iby" ref="//@result/@interfaces.0/@configurationElements.419"/>
+      <settings name="SOS_VERSION" value="9.4" ref="//@result/@interfaces.0/@configurationElements.420"/>
+      <settings name="SWUPD_EXT" value=".swupd" ref="//@result/@interfaces.0/@configurationElements.421"/>
+      <settings name="TYPE" value="rnd" ref="//@result/@interfaces.0/@configurationElements.422"/>
+      <settings name="USE_OVERRIDE" value="0" ref="//@result/@interfaces.0/@configurationElements.423"/>
+      <settings name="USE_PAGING" value="code:123" ref="//@result/@interfaces.0/@configurationElements.424"/>
+      <settings name="USE_ROFS" value="1" ref="//@result/@interfaces.0/@configurationElements.425"/>
+      <settings name="USE_ROMFILE" value="1" ref="//@result/@interfaces.0/@configurationElements.426"/>
+      <settings name="USE_ROMSYMGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.427"/>
+      <settings name="USE_UDEB" value="0" ref="//@result/@interfaces.0/@configurationElements.428"/>
+      <settings name="USE_VERGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.429"/>
+    </configurations>
+    <configurations name="image_conf_product_oem_ui.mk" filePath="\epoc32\rom\config\platform\product_oem\image_conf_product_oem_ui.mk" targetrefs="//@result/@targets.190 //@result/@targets.191 //@result/@targets.192 //@result/@targets.193 //@result/@targets.194 //@result/@targets.195 //@result/@targets.196 //@result/@targets.197 //@result/@targets.198 //@result/@targets.199 //@result/@targets.200 //@result/@targets.201 //@result/@targets.202 //@result/@targets.203 //@result/@targets.204 //@result/@targets.205 //@result/@targets.206 //@result/@targets.207 //@result/@targets.208 //@result/@targets.209 //@result/@targets.210 //@result/@targets.211 //@result/@targets.212 //@result/@targets.213 //@result/@targets.214 //@result/@targets.215 //@result/@targets.216 //@result/@targets.217 //@result/@targets.218 //@result/@targets.219 //@result/@targets.220 //@result/@targets.221 //@result/@targets.222 //@result/@targets.223 //@result/@targets.224 //@result/@targets.225 //@result/@targets.226 //@result/@targets.227">
+      <settings name="BLDROBY" ref="//@result/@interfaces.0/@configurationElements.430"/>
+      <settings name="BLDROM_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND" ref="//@result/@interfaces.0/@configurationElements.431"/>
+      <settings name="BLDROPT" ref="//@result/@interfaces.0/@configurationElements.432"/>
+      <settings name="CONFIGROOT" value="/epoc32/rom/config" ref="//@result/@interfaces.0/@configurationElements.433"/>
+      <settings name="CORE_CDPROMFILE" value="/epoc32/rombuild/odpcoderomfiles.txt" ref="//@result/@interfaces.0/@configurationElements.434"/>
+      <settings name="CORE_DIR" value="/epoc32/rombuild/product/core" ref="//@result/@interfaces.0/@configurationElements.435"/>
+      <settings name="CORE_E2FNAME" value="/epoc32/rombuild/product/core/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.436"/>
+      <settings name="CORE_FWIDFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.437"/>
+      <settings name="CORE_IMEISVFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_imeisv.txt" ref="//@result/@interfaces.0/@configurationElements.438"/>
+      <settings name="CORE_IMEISVINFO" value="00" ref="//@result/@interfaces.0/@configurationElements.439"/>
+      <settings name="CORE_MODELFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_model.txt" ref="//@result/@interfaces.0/@configurationElements.440"/>
+      <settings name="CORE_MODELINFO" value="S60" ref="//@result/@interfaces.0/@configurationElements.441"/>
+      <settings name="CORE_MSTOBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_master.oby" ref="//@result/@interfaces.0/@configurationElements.442"/>
+      <settings name="CORE_NAME" value="/epoc32/rombuild/product/core/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.443"/>
+      <settings name="CORE_NDPROMFILE" value="/epoc32/rombuild/romfiles.txt" ref="//@result/@interfaces.0/@configurationElements.444"/>
+      <settings name="CORE_OBY" value="/epoc32/rom/master.oby /epoc32/rom/ppd.oby /epoc32/rom/rnd.oby /epoc32/rom/override.oby /epoc32/rombuild/product/core/product_5230_rnd_core_collected.oby /epoc32/rom/include/symbianos.iby /epoc32/rom/variant/patchdata.iby" ref="//@result/@interfaces.0/@configurationElements.445"/>
+      <settings name="CORE_ODPROMFILE" value="/epoc32/rombuild/odpromfiles.txt" ref="//@result/@interfaces.0/@configurationElements.446"/>
+      <settings name="CORE_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct  -es60ibymacros -DSECTION -DRND_CONTENT " ref="//@result/@interfaces.0/@configurationElements.447"/>
+      <settings name="CORE_PLATFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_platform.txt" ref="//@result/@interfaces.0/@configurationElements.448"/>
+      <settings name="CORE_PLATINFO" value="SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n" ref="//@result/@interfaces.0/@configurationElements.449"/>
+      <settings name="CORE_PRODFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_product.txt" ref="//@result/@interfaces.0/@configurationElements.450"/>
+      <settings name="CORE_ROFSFILE" value="/epoc32/rombuild/odpcoderofsfiles.txt" ref="//@result/@interfaces.0/@configurationElements.451"/>
+      <settings name="CORE_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.452"/>
+      <settings name="CORE_SWVERFILE" value="/epoc32/rombuild/product/core/product_5230_rnd_core_sw.txt" ref="//@result/@interfaces.0/@configurationElements.453"/>
+      <settings name="CORE_SWVERINFO" value="V 52.50.2008.24 RnD\n13-06-08\nRM-356\n(c)NMP" ref="//@result/@interfaces.0/@configurationElements.454"/>
+      <settings name="CORE_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.455"/>
+      <settings name="CORE_UDEBFILE" value="/epoc32/rombuild/mytraces.txt" ref="//@result/@interfaces.0/@configurationElements.456"/>
+      <settings name="CORE_VERIBY" value="/epoc32/rombuild/product/core/product_5230_rnd_core_version.iby" ref="//@result/@interfaces.0/@configurationElements.457"/>
+      <settings name="CORE_VERSION" value="V 52.50.2008.24 RnD" ref="//@result/@interfaces.0/@configurationElements.458"/>
+      <settings name="COREPLAT_NAME" value="platform" ref="//@result/@interfaces.0/@configurationElements.459"/>
+      <settings name="CUSTVARIANT_DIR" ref="//@result/@interfaces.0/@configurationElements.460"/>
+      <settings name="DEFAULT_LANGUAGE" value="01" ref="//@result/@interfaces.0/@configurationElements.461"/>
+      <settings name="FLASH_EXT" value=".fpsx" ref="//@result/@interfaces.0/@configurationElements.462"/>
+      <settings name="HWID" value="5230*" ref="//@result/@interfaces.0/@configurationElements.463"/>
+      <settings name="HWID_LIST" value="5230" ref="//@result/@interfaces.0/@configurationElements.464"/>
+      <settings name="KEEPTEMP" value="0" ref="//@result/@interfaces.0/@configurationElements.465"/>
+      <settings name="LABEL" ref="//@result/@interfaces.0/@configurationElements.466"/>
+      <settings name="LANGID" value="01" ref="//@result/@interfaces.0/@configurationElements.467"/>
+      <settings name="LANGUAGES" value="01" ref="//@result/@interfaces.0/@configurationElements.468"/>
+      <settings name="NAME" value="product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.469"/>
+      <settings name="OPERATOR_OBY" ref="//@result/@interfaces.0/@configurationElements.470"/>
+      <settings name="OPERATOR_OBYGEN" value=" | /epoc32/rom/include/operator | *.iby" ref="//@result/@interfaces.0/@configurationElements.471"/>
+      <settings name="PRODUCT_MODEL" value="N00" ref="//@result/@interfaces.0/@configurationElements.472"/>
+      <settings name="PRODUCT_NAME" value="product" ref="//@result/@interfaces.0/@configurationElements.473"/>
+      <settings name="PRODUCT_REVISION" value="01" ref="//@result/@interfaces.0/@configurationElements.474"/>
+      <settings name="RELEASEDIR" value="/flash_images/product" ref="//@result/@interfaces.0/@configurationElements.475"/>
+      <settings name="RELEASEFILES" value="/epoc32/rombuild/product/product_5230_rnd.fpsx /epoc32/rombuild/product/core/product_5230_rnd.rom.log /epoc32/rombuild/product/core/product_5230_rnd.rofs1.log /epoc32/rombuild/product/rofs2/product_5230_rnd.rofs2.log /epoc32/rombuild/product/rofs3/product_5230_rnd.rofs3.log" ref="//@result/@interfaces.0/@configurationElements.476"/>
+      <settings name="RELEASENAME" value="product_rnd_20080714082829_haismail" ref="//@result/@interfaces.0/@configurationElements.477"/>
+      <settings name="ROFS2_DIR" value="/epoc32/rombuild/product/rofs2" ref="//@result/@interfaces.0/@configurationElements.478"/>
+      <settings name="ROFS2_E2FNAME" value="/epoc32/rombuild/product/rofs2/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.479"/>
+      <settings name="ROFS2_FOOTER" ref="//@result/@interfaces.0/@configurationElements.480"/>
+      <settings name="ROFS2_FWIDFILE" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.481"/>
+      <settings name="ROFS2_FWIDINFO" value="id=language\nversion=01\n" ref="//@result/@interfaces.0/@configurationElements.482"/>
+      <settings name="ROFS2_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.483"/>
+      <settings name="ROFS2_MSTOBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_master.oby" ref="//@result/@interfaces.0/@configurationElements.484"/>
+      <settings name="ROFS2_NAME" value="/epoc32/rombuild/product/rofs2/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.485"/>
+      <settings name="ROFS2_OBY" value="&lt;Variant.oby> &lt;ppd_variant.oby> &lt;ppd_locales.iby> /epoc32/rom/override.oby /epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_language_collected.oby /epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_customer_collected.oby" ref="//@result/@interfaces.0/@configurationElements.486"/>
+      <settings name="ROFS2_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct  -es60ibymacros -elocalise -DRND_CONTENT" ref="//@result/@interfaces.0/@configurationElements.487"/>
+      <settings name="ROFS2_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.488"/>
+      <settings name="ROFS2_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.489"/>
+      <settings name="ROFS2_VERIBY" value="/epoc32/rombuild/product/rofs2/product_5230_rnd_rofs2_version.iby" ref="//@result/@interfaces.0/@configurationElements.490"/>
+      <settings name="ROFS3_CUSTFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_customersw.txt" ref="//@result/@interfaces.0/@configurationElements.491"/>
+      <settings name="ROFS3_CUSTINFO" value="V 52.50.2008.24 RnD\n14-07-08" ref="//@result/@interfaces.0/@configurationElements.492"/>
+      <settings name="ROFS3_DIR" value="/epoc32/rombuild/product/rofs3" ref="//@result/@interfaces.0/@configurationElements.493"/>
+      <settings name="ROFS3_E2FNAME" value="/epoc32/rombuild/product/rofs3/elf2flash/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.494"/>
+      <settings name="ROFS3_FOOTER" ref="//@result/@interfaces.0/@configurationElements.495"/>
+      <settings name="ROFS3_FWIDFILE" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_fwid.txt" ref="//@result/@interfaces.0/@configurationElements.496"/>
+      <settings name="ROFS3_FWIDINFO" value="id=customer\nversion=V 52.50.2008.24 RnD RND Customer\n" ref="//@result/@interfaces.0/@configurationElements.497"/>
+      <settings name="ROFS3_HEADER" value="#include &lt;data_caging_paths_for_iby.hrh> \n\n// TEMPORARY FIXES BEGIN\n // Enable faster variant creation, to be removed when iby header hierarchy is fixed\n #define __platform_OBY__  // Define platform.oby out\n #include &lt;Variant\Header.iby>\n #include &lt;header.iby>  // Symbian common definitions\n // TEMPORARY FIXES END\n" ref="//@result/@interfaces.0/@configurationElements.498"/>
+      <settings name="ROFS3_MSTOBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_master.oby" ref="//@result/@interfaces.0/@configurationElements.499"/>
+      <settings name="ROFS3_NAME" value="/epoc32/rombuild/product/rofs3/product_5230_rnd" ref="//@result/@interfaces.0/@configurationElements.500"/>
+      <settings name="ROFS3_OBY" value=" /epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_collected.oby" ref="//@result/@interfaces.0/@configurationElements.501"/>
+      <settings name="ROFS3_OPT" value="-p -v -nosymbols -eoverride  -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -Dproduct  -es60ibymacros" ref="//@result/@interfaces.0/@configurationElements.502"/>
+      <settings name="ROFS3_ROMVER" value="0.01(0)" ref="//@result/@interfaces.0/@configurationElements.503"/>
+      <settings name="ROFS3_TIME" value="14/07/2008" ref="//@result/@interfaces.0/@configurationElements.504"/>
+      <settings name="ROFS3_VERIBY" value="/epoc32/rombuild/product/rofs3/product_5230_rnd_rofs3_version.iby" ref="//@result/@interfaces.0/@configurationElements.505"/>
+      <settings name="SOS_VERSION" value="9.4" ref="//@result/@interfaces.0/@configurationElements.506"/>
+      <settings name="SWUPD_EXT" value=".swupd" ref="//@result/@interfaces.0/@configurationElements.507"/>
+      <settings name="TYPE" value="rnd" ref="//@result/@interfaces.0/@configurationElements.508"/>
+      <settings name="USE_OVERRIDE" value="1" ref="//@result/@interfaces.0/@configurationElements.509"/>
+      <settings name="USE_PAGING" value="code:123" ref="//@result/@interfaces.0/@configurationElements.510"/>
+      <settings name="USE_ROFS" value="1,2,3" ref="//@result/@interfaces.0/@configurationElements.511"/>
+      <settings name="USE_ROMFILE" value="1" ref="//@result/@interfaces.0/@configurationElements.512"/>
+      <settings name="USE_ROMSYMGEN" value="0" ref="//@result/@interfaces.0/@configurationElements.513"/>
+      <settings name="USE_UDEB" value="1" ref="//@result/@interfaces.0/@configurationElements.514"/>
+      <settings name="USE_VERGEN" value="1" ref="//@result/@interfaces.0/@configurationElements.515"/>
+    </configurations>
+    <targets name="all" description="Create all image sections and symbol files."/>
+    <targets name="clean" description="Clean all target files."/>
+    <targets name="core" description="Create the core image (ROM,ROFS1)"/>
+    <targets name="core-image" description="Create the core image files (rom.img, rofs1.img)"/>
+    <targets name="custrofs2" description="Create an image from a variant with rofs2. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custuda" description="Create an image from a variant userdata folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custvariant" description="Create an image from a customer variant folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="e2flash" description="Create the elf2flash (flash) file."/>
+    <targets name="f2image" description="Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)"/>
+    <targets name="flash" description="Create all image sections files. Not any symbol files."/>
+    <targets name="flash-all" description="Create all image sections and symbol files."/>
+    <targets name="help" description="Print help on help targets."/>
+    <targets name="help-%" description="Print help on help items matching the pattern."/>
+    <targets name="help-%-list" description="Print a list of help items matching the pattern."/>
+    <targets name="help-config" description="Print a list of available configurations in the current working environment."/>
+    <targets name="help-target" description="Print help on all targets (same as help-target-*)."/>
+    <targets name="help-target-%" description="Print help on targets matching the pattern."/>
+    <targets name="help-target-%-list" description="Print a list of targets matching the pattern."/>
+    <targets name="help-target-%-wiki" description="Print wiki-formatted help on targets matching the pattern."/>
+    <targets name="help-variable" description="Print help on all variables (same as help-variable-*)."/>
+    <targets name="help-variable-%" description="Print help on variables matching the pattern."/>
+    <targets name="help-variable-%-all" description="Print full help on variables matching the pattern."/>
+    <targets name="help-variable-%-list" description="Print a list of variables matching the pattern."/>
+    <targets name="help-variable-%-value" description="Print a list of variables with values matching the pattern."/>
+    <targets name="help-variable-%-wiki" description="Print wiki-formatted help on variables matching the pattern."/>
+    <targets name="image" description="Create only the image file(s) (*.img)"/>
+    <targets name="print-*" description="Print the value of the given variable to the screen."/>
+    <targets name="release" description="Run the RELEASE step, that copies the created image files to the release folder. (See RELEASENAME,RELEASEDIR,RELEASEFILES)"/>
+    <targets name="rofs2" description="Create the rofs2 image"/>
+    <targets name="rofs2-image" description="Create the rofs2 image file (rofs2.img)"/>
+    <targets name="rofs3" description="Create the rofs3 image"/>
+    <targets name="rofs3-image" description="Create the rofs3 image file (rofs3.img)"/>
+    <targets name="romsymbol" description="Create the rom symbol file"/>
+    <targets name="step-*" description="Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands."/>
+    <targets name="toolinfo" description="Print info about the tool"/>
+    <targets name="uda-image" description="Create the User Data area (uda) flash file."/>
+    <targets name="variant" description="Create the variant image (rofs2,rofs3)"/>
+    <targets name="variant-image" description="Create the variant image files (rofs3.img,rofs3.img)"/>
+    <targets name="all" description="Create all image sections and symbol files."/>
+    <targets name="clean" description="Clean all target files."/>
+    <targets name="core" description="Create the core image (ROM,ROFS1)"/>
+    <targets name="core-image" description="Create the core image files (rom.img, rofs1.img)"/>
+    <targets name="custrofs2" description="Create an image from a variant with rofs2. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custuda" description="Create an image from a variant userdata folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custvariant" description="Create an image from a customer variant folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="e2flash" description="Create the elf2flash (flash) file."/>
+    <targets name="f2image" description="Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)"/>
+    <targets name="flash" description="Create all image sections files. Not any symbol files."/>
+    <targets name="flash-all" description="Create all image sections and symbol files."/>
+    <targets name="help" description="Print help on help targets."/>
+    <targets name="help-%" description="Print help on help items matching the pattern."/>
+    <targets name="help-%-list" description="Print a list of help items matching the pattern."/>
+    <targets name="help-config" description="Print a list of available configurations in the current working environment."/>
+    <targets name="help-target" description="Print help on all targets (same as help-target-*)."/>
+    <targets name="help-target-%" description="Print help on targets matching the pattern."/>
+    <targets name="help-target-%-list" description="Print a list of targets matching the pattern."/>
+    <targets name="help-target-%-wiki" description="Print wiki-formatted help on targets matching the pattern."/>
+    <targets name="help-variable" description="Print help on all variables (same as help-variable-*)."/>
+    <targets name="help-variable-%" description="Print help on variables matching the pattern."/>
+    <targets name="help-variable-%-all" description="Print full help on variables matching the pattern."/>
+    <targets name="help-variable-%-list" description="Print a list of variables matching the pattern."/>
+    <targets name="help-variable-%-value" description="Print a list of variables with values matching the pattern."/>
+    <targets name="help-variable-%-wiki" description="Print wiki-formatted help on variables matching the pattern."/>
+    <targets name="image" description="Create only the image file(s) (*.img)"/>
+    <targets name="print-*" description="Print the value of the given variable to the screen."/>
+    <targets name="release" description="Run the RELEASE step, that copies the created image files to the release folder. (See RELEASENAME,RELEASEDIR,RELEASEFILES)"/>
+    <targets name="rofs2" description="Create the rofs2 image"/>
+    <targets name="rofs2-image" description="Create the rofs2 image file (rofs2.img)"/>
+    <targets name="rofs3" description="Create the rofs3 image"/>
+    <targets name="rofs3-image" description="Create the rofs3 image file (rofs3.img)"/>
+    <targets name="romsymbol" description="Create the rom symbol file"/>
+    <targets name="step-*" description="Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands."/>
+    <targets name="toolinfo" description="Print info about the tool"/>
+    <targets name="uda-image" description="Create the User Data area (uda) flash file."/>
+    <targets name="variant" description="Create the variant image (rofs2,rofs3)"/>
+    <targets name="variant-image" description="Create the variant image files (rofs3.img,rofs3.img)"/>
+    <targets name="all" description="Create all image sections and symbol files."/>
+    <targets name="clean" description="Clean all target files."/>
+    <targets name="core" description="Create the core image (ROM,ROFS1)"/>
+    <targets name="core-image" description="Create the core image files (rom.img, rofs1.img)"/>
+    <targets name="custrofs2" description="Create an image from a variant with rofs2. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custuda" description="Create an image from a variant userdata folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custvariant" description="Create an image from a customer variant folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="e2flash" description="Create the elf2flash (flash) file."/>
+    <targets name="f2image" description="Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)"/>
+    <targets name="flash" description="Create all image sections files. Not any symbol files."/>
+    <targets name="flash-all" description="Create all image sections and symbol files."/>
+    <targets name="help" description="Print help on help targets."/>
+    <targets name="help-%" description="Print help on help items matching the pattern."/>
+    <targets name="help-%-list" description="Print a list of help items matching the pattern."/>
+    <targets name="help-config" description="Print a list of available configurations in the current working environment."/>
+    <targets name="help-target" description="Print help on all targets (same as help-target-*)."/>
+    <targets name="help-target-%" description="Print help on targets matching the pattern."/>
+    <targets name="help-target-%-list" description="Print a list of targets matching the pattern."/>
+    <targets name="help-target-%-wiki" description="Print wiki-formatted help on targets matching the pattern."/>
+    <targets name="help-variable" description="Print help on all variables (same as help-variable-*)."/>
+    <targets name="help-variable-%" description="Print help on variables matching the pattern."/>
+    <targets name="help-variable-%-all" description="Print full help on variables matching the pattern."/>
+    <targets name="help-variable-%-list" description="Print a list of variables matching the pattern."/>
+    <targets name="help-variable-%-value" description="Print a list of variables with values matching the pattern."/>
+    <targets name="help-variable-%-wiki" description="Print wiki-formatted help on variables matching the pattern."/>
+    <targets name="image" description="Create only the image file(s) (*.img)"/>
+    <targets name="print-*" description="Print the value of the given variable to the screen."/>
+    <targets name="release" description="Run the RELEASE step, that copies the created image files to the release folder. (See RELEASENAME,RELEASEDIR,RELEASEFILES)"/>
+    <targets name="rofs2" description="Create the rofs2 image"/>
+    <targets name="rofs2-image" description="Create the rofs2 image file (rofs2.img)"/>
+    <targets name="rofs3" description="Create the rofs3 image"/>
+    <targets name="rofs3-image" description="Create the rofs3 image file (rofs3.img)"/>
+    <targets name="romsymbol" description="Create the rom symbol file"/>
+    <targets name="step-*" description="Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands."/>
+    <targets name="toolinfo" description="Print info about the tool"/>
+    <targets name="uda-image" description="Create the User Data area (uda) flash file."/>
+    <targets name="variant" description="Create the variant image (rofs2,rofs3)"/>
+    <targets name="variant-image" description="Create the variant image files (rofs3.img,rofs3.img)"/>
+    <targets name="all" description="Create all image sections and symbol files."/>
+    <targets name="clean" description="Clean all target files."/>
+    <targets name="core" description="Create the core image (ROM,ROFS1)"/>
+    <targets name="core-image" description="Create the core image files (rom.img, rofs1.img)"/>
+    <targets name="custrofs2" description="Create an image from a variant with rofs2. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custuda" description="Create an image from a variant userdata folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custvariant" description="Create an image from a customer variant folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="e2flash" description="Create the elf2flash (flash) file."/>
+    <targets name="f2image" description="Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)"/>
+    <targets name="flash" description="Create all image sections files. Not any symbol files."/>
+    <targets name="flash-all" description="Create all image sections and symbol files."/>
+    <targets name="help" description="Print help on help targets."/>
+    <targets name="help-%" description="Print help on help items matching the pattern."/>
+    <targets name="help-%-list" description="Print a list of help items matching the pattern."/>
+    <targets name="help-config" description="Print a list of available configurations in the current working environment."/>
+    <targets name="help-target" description="Print help on all targets (same as help-target-*)."/>
+    <targets name="help-target-%" description="Print help on targets matching the pattern."/>
+    <targets name="help-target-%-list" description="Print a list of targets matching the pattern."/>
+    <targets name="help-target-%-wiki" description="Print wiki-formatted help on targets matching the pattern."/>
+    <targets name="help-variable" description="Print help on all variables (same as help-variable-*)."/>
+    <targets name="help-variable-%" description="Print help on variables matching the pattern."/>
+    <targets name="help-variable-%-all" description="Print full help on variables matching the pattern."/>
+    <targets name="help-variable-%-list" description="Print a list of variables matching the pattern."/>
+    <targets name="help-variable-%-value" description="Print a list of variables with values matching the pattern."/>
+    <targets name="help-variable-%-wiki" description="Print wiki-formatted help on variables matching the pattern."/>
+    <targets name="image" description="Create only the image file(s) (*.img)"/>
+    <targets name="print-*" description="Print the value of the given variable to the screen."/>
+    <targets name="release" description="Run the RELEASE step, that copies the created image files to the release folder. (See RELEASENAME,RELEASEDIR,RELEASEFILES)"/>
+    <targets name="rofs2" description="Create the rofs2 image"/>
+    <targets name="rofs2-image" description="Create the rofs2 image file (rofs2.img)"/>
+    <targets name="rofs3" description="Create the rofs3 image"/>
+    <targets name="rofs3-image" description="Create the rofs3 image file (rofs3.img)"/>
+    <targets name="romsymbol" description="Create the rom symbol file"/>
+    <targets name="step-*" description="Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands."/>
+    <targets name="toolinfo" description="Print info about the tool"/>
+    <targets name="uda-image" description="Create the User Data area (uda) flash file."/>
+    <targets name="variant" description="Create the variant image (rofs2,rofs3)"/>
+    <targets name="variant-image" description="Create the variant image files (rofs3.img,rofs3.img)"/>
+    <targets name="all" description="Create all image sections and symbol files."/>
+    <targets name="clean" description="Clean all target files."/>
+    <targets name="core" description="Create the core image (ROM,ROFS1)"/>
+    <targets name="core-image" description="Create the core image files (rom.img, rofs1.img)"/>
+    <targets name="custrofs2" description="Create an image from a variant with rofs2. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custuda" description="Create an image from a variant userdata folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custvariant" description="Create an image from a customer variant folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="e2flash" description="Create the elf2flash (flash) file."/>
+    <targets name="f2image" description="Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)"/>
+    <targets name="flash" description="Create all image sections files. Not any symbol files."/>
+    <targets name="flash-all" description="Create all image sections and symbol files."/>
+    <targets name="help" description="Print help on help targets."/>
+    <targets name="help-%" description="Print help on help items matching the pattern."/>
+    <targets name="help-%-list" description="Print a list of help items matching the pattern."/>
+    <targets name="help-config" description="Print a list of available configurations in the current working environment."/>
+    <targets name="help-target" description="Print help on all targets (same as help-target-*)."/>
+    <targets name="help-target-%" description="Print help on targets matching the pattern."/>
+    <targets name="help-target-%-list" description="Print a list of targets matching the pattern."/>
+    <targets name="help-target-%-wiki" description="Print wiki-formatted help on targets matching the pattern."/>
+    <targets name="help-variable" description="Print help on all variables (same as help-variable-*)."/>
+    <targets name="help-variable-%" description="Print help on variables matching the pattern."/>
+    <targets name="help-variable-%-all" description="Print full help on variables matching the pattern."/>
+    <targets name="help-variable-%-list" description="Print a list of variables matching the pattern."/>
+    <targets name="help-variable-%-value" description="Print a list of variables with values matching the pattern."/>
+    <targets name="help-variable-%-wiki" description="Print wiki-formatted help on variables matching the pattern."/>
+    <targets name="image" description="Create only the image file(s) (*.img)"/>
+    <targets name="print-*" description="Print the value of the given variable to the screen."/>
+    <targets name="release" description="Run the RELEASE step, that copies the created image files to the release folder. (See RELEASENAME,RELEASEDIR,RELEASEFILES)"/>
+    <targets name="rofs2" description="Create the rofs2 image"/>
+    <targets name="rofs2-image" description="Create the rofs2 image file (rofs2.img)"/>
+    <targets name="rofs3" description="Create the rofs3 image"/>
+    <targets name="rofs3-image" description="Create the rofs3 image file (rofs3.img)"/>
+    <targets name="romsymbol" description="Create the rom symbol file"/>
+    <targets name="step-*" description="Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands."/>
+    <targets name="toolinfo" description="Print info about the tool"/>
+    <targets name="uda-image" description="Create the User Data area (uda) flash file."/>
+    <targets name="variant" description="Create the variant image (rofs2,rofs3)"/>
+    <targets name="variant-image" description="Create the variant image files (rofs3.img,rofs3.img)"/>
+    <targets name="all" description="Create all image sections and symbol files."/>
+    <targets name="clean" description="Clean all target files."/>
+    <targets name="core" description="Create the core image (ROM,ROFS1)"/>
+    <targets name="core-image" description="Create the core image files (rom.img, rofs1.img)"/>
+    <targets name="custrofs2" description="Create an image from a variant with rofs2. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custuda" description="Create an image from a variant userdata folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="custvariant" description="Create an image from a customer variant folder. Be sure to define the CUSTVARIANT_DIR."/>
+    <targets name="e2flash" description="Create the elf2flash (flash) file."/>
+    <targets name="f2image" description="Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)"/>
+    <targets name="flash" description="Create all image sections files. Not any symbol files."/>
+    <targets name="flash-all" description="Create all image sections and symbol files."/>
+    <targets name="help" description="Print help on help targets."/>
+    <targets name="help-%" description="Print help on help items matching the pattern."/>
+    <targets name="help-%-list" description="Print a list of help items matching the pattern."/>
+    <targets name="help-config" description="Print a list of available configurations in the current working environment."/>
+    <targets name="help-target" description="Print help on all targets (same as help-target-*)."/>
+    <targets name="help-target-%" description="Print help on targets matching the pattern."/>
+    <targets name="help-target-%-list" description="Print a list of targets matching the pattern."/>
+    <targets name="help-target-%-wiki" description="Print wiki-formatted help on targets matching the pattern."/>
+    <targets name="help-variable" description="Print help on all variables (same as help-variable-*)."/>
+    <targets name="help-variable-%" description="Print help on variables matching the pattern."/>
+    <targets name="help-variable-%-all" description="Print full help on variables matching the pattern."/>
+    <targets name="help-variable-%-list" description="Print a list of variables matching the pattern."/>
+    <targets name="help-variable-%-value" description="Print a list of variables with values matching the pattern."/>
+    <targets name="help-variable-%-wiki" description="Print wiki-formatted help on variables matching the pattern."/>
+    <targets name="image" description="Create only the image file(s) (*.img)"/>
+    <targets name="print-*" description="Print the value of the given variable to the screen."/>
+    <targets name="release" description="Run the RELEASE step, that copies the created image files to the release folder. (See RELEASENAME,RELEASEDIR,RELEASEFILES)"/>
+    <targets name="rofs2" description="Create the rofs2 image"/>
+    <targets name="rofs2-image" description="Create the rofs2 image file (rofs2.img)"/>
+    <targets name="rofs3" description="Create the rofs3 image"/>
+    <targets name="rofs3-image" description="Create the rofs3 image file (rofs3.img)"/>
+    <targets name="romsymbol" description="Create the rom symbol file"/>
+    <targets name="step-*" description="Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands."/>
+    <targets name="toolinfo" description="Print info about the tool"/>
+    <targets name="uda-image" description="Create the User Data area (uda) flash file."/>
+    <targets name="variant" description="Create the variant image (rofs2,rofs3)"/>
+    <targets name="variant-image" description="Create the variant image files (rofs3.img,rofs3.img)"/>
+  </result>
+</IMaker>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/log2xml_failure.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,4929 @@
+Starting build: 839
+mkdir \epoc32\rombuild\imaker_temp
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... core
+++ Started at Thu Nov 13 14:11:27 2008
++++ HiRes Start 1226578287.10578
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  core  WORKDIR=\epoc32\rombuild\imaker_temp/conf_0
+iMaker 08.43.01, 20-Oct-2008.
+Generating file(s) for Core image creation
+Creating Core (ROM & ROFS1) SOS image
+
+Y:\output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd>rem @echo off 
+
+Y:\output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd>setlocal
+
+Y:\output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd>perl -S buildrom.pl -loglevel1 -v -nosymbols -DFEATUREVARIANT=devlon52 -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -DDEVLON52 -es60ibymacros -DSECTION -DRND_CONTENT -cbytepair -oRX-47_200846_rnd.img y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_master.oby 
+* cpp -o tmp1.oby -nostdinc -undef -DFEATUREVARIANT=devlon52 -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -DDEVLON52 -DSECTION -DRND_CONTENT -I. -I "Y:\epoc32\rom\config\platform\devlon52" -I "Y:\epoc32\include\config\platform\devlon52" -I "Y:\epoc32\rom\config\platform" -I "Y:\epoc32\include\config\platform" -I "Y:\epoc32\rom\config" -I "Y:\epoc32\include\config" -I "Y:\epoc32\rom" -I "Y:\epoc32\rom\include" -I "Y:\epoc32\include\oem" -include "Y:\epoc32\include\oem\feature_settings.hrh"
+In file included from Y:\epoc32\include\config\platform\adaptation_features.hrh:25,
+                 from Y:\epoc32\include\oem\feature_settings.hrh:43,
+                 from :1:
+Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+*Initialization*:1: warning: this is the location of the previous definition
+In file included from Y:\epoc32\rom\config\platform\ncp_components.iby:124,
+                 from Y:\epoc32\rom\config\platform\Variant\BasePorting.iby:26,
+                 from ../../../../../../epoc32/rom/master.oby:34,
+                 from y:output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_master.oby:50:
+Y:\epoc32\rom\include\H4PlusHci.iby:4: warning: `#ifndef' argument starts with punctuation
+* reading y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_master.oby
+override.pm: Initializing; logfile =`y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_bldromplugin.log', debug = 0
+configpaging.pm: Initializing with configpaging_nokia.cfg
+Using export-restricted strong crytography implementation
+ROM_IMAGE[1] rofs1 size=0x10000000 xip=0 compress=0 extension=0 composite=none uncompress=0 
+* Writing tmp2.oby - result of substitution phase
+* Writing tmp3.oby - result of reorganisation phase
+* Writing tmp4.oby - result of Plugin stage
+* No language codes specified, defaulting to 01
+Converting >\epoc32\data\Z\Resource\Charconv\BUILTIN.R01< to RSC
+Converting >\epoc32\data\Z\Resource\swtlstokentype.R01< to RSC
+Converting >\epoc32\data\Z\Resource\TlsCacheServer\TlsCacheTimeouts.R01< to RSC
+Converting >\epoc32\data\Z\Resource\logeng\logwrap.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88592.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88593.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88594.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88595.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88596.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88597.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88598.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88599.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885910.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885913.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885914.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885915.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\CP850.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\UCS2.R01< to RSC
+Converting >\epoc32\data\Z\Resource\APPS\ApfMimeContentPolicy.R01< to RSC
+Converting >\epoc32\data\Z\resource\messaging\smss.R01< to RSC
+Converting >\epoc32\data\Z\resource\messaging\wappstr.R01< to RSC
+Converting >\epoc32\data\Z\RESOURCE\messaging\wappushunknown.R01< to RSC
+Converting >\epoc32\data\Z\Resource\fstokenserver.R01< to RSC
+Converting >\epoc32\data\Z\resource\defaultbeep.R01< to RSC
+Converting >\epoc32\data\Z\Resource\JavaHelper\JavaHelper.R01< to RSC
+Converting >\epoc32\data\Z\resource\Apps\trkapplication.R01< to RSC
+Converting >\epoc32\data\Z\resource\Apps\trkapplication_loc.R01< to RSC
+Converting >\epoc32\data\Z\private\10003a3f\Apps\trkapplication_reg.R01< to RSC
+Converting >\epoc32\data\Z\resource\Apps\trkapplication.M01< to MIF
+* Writing tmp5.oby - result of choosing language-specific files
+* Invalid image file name: \epoc32\data\Z\resource\apps\VideoEditorBitmaps.mbm or .mif
+Created ecom-0-0.spi
+Created ecom-0-1.s01
+* Writing tmp6.oby - result of SPI stage
+override.pm: ------------------------------------------------------------------
+Handling overrides...
+Replace ROM_IMAGE[0] `file=\epoc32\release\ARMV5\urel\FeatMgr.DLL		sys\bin\FEATMGR.DLL' with `file=\epoc32\release\ARMV5\urel\FeatMgr.Devlon52.DLL  sys\bin\FEATMGR.DLL'
+Replace ROM_IMAGE[0] `data=\epoc32\release\ARMV5\urel\R1_Mobile_4_0_Platform.cfg   resource\R1_Mobile_4_0_Platform.cfg' with `data=\epoc32\release\ARMV5\urel\R1_Mobile_4_0_Platform_ppd.cfg  resource\R1_Mobile_4_0_Platform.cfg'
+Replace ROM_IMAGE[0] `data=\Epoc32\Data\WSINI.ini                 System\Data\Wsini.ini' with `data=\Epoc32\Data\WSINI_devlon52.ini  System\Data\Wsini.ini'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\sw.txt		resource\versions\sw.txt' with `data=\epoc32\data\Z\Resource\versions\sw_devlon52.txt  resource\versions\sw.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\resource\Starter_Arm.rsc                resource\Starter_Arm.rsc' with `data=\epoc32\data\Z\resource\Starter_Arm_Devlon52_wop_wopc_wat_ww_wss.rsc  resource\Starter_Arm.rsc'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\resource\starter_non_critical_1_arm.rsc resource\starter_non_critical_1.rsc' with `data=\epoc32\data\Z\resource\Starter_non_critical_1_arm_Devlon52_wop_wopc_wat_ww_wss.rsc  resource\starter_non_critical_1.rsc'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\sw_devlon52.txt  resource\versions\sw.txt' with `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_sw.txt  resource\versions\sw.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\model.txt	resource\versions\model.txt' with `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_model.txt  resource\versions\model.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\imeisv.txt	resource\versions\imeisv.txt' with `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_imeisv.txt  resource\versions\imeisv.txt'
+Add ROM_IMAGE[0] `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_platform.txt  resource\versions\platform.txt' from `data-override=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_platform.txt  resource\versions\platform.txt'
+Add ROM_IMAGE[0] `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_product.txt  resource\versions\product.txt' from `data-override=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_product.txt  resource\versions\product.txt'
+Add ROM_IMAGE[0] `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_fwid.txt  resource\versions\fwid1.txt' from `data-override=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_fwid.txt  resource\versions\fwid1.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\ost_dictionaries.zip                                             \Data\ost_dictionaries.zip' with `data=y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/ost_dictionaries.zip  \Data\ost_dictionaries.zip'
+override.pm: Duration: 1 seconds ----------------------------------------------
+obyparse.pm: Reading /epoc32/rombuild/odpcoderomfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/odp_code_romfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/odpcoderofsfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/IAD_rofsfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/mytraces.txt
+obyparse.pm: Processing...
+obyparse.pm: Duration: 0 seconds
+configpaging.pm: Modifying demand paging configuration using \epoc32\rom\configpaging\configpaging_nokia.cfg
+Y:\epoc32\rom\include\lightsacoreservices.iby(72): Missing file: '\epoc32\release\ARMV5\urel\LightSAIscService.DLL' in statement 'file='
+Y:\epoc32\rom\include\lightadaptation.iby(110): Missing file: '\epoc32\release\ARMV5\urel\light_sensor_adaptation.DLL' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\app\IpVideo.iby(112): Missing file: '\epoc32\release\ARMV5\urel\vcxnsappui_test.exe' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\app\IpVideo.iby(392): Missing file: '\epoc32\release\ARMV5\urel\VcXNotifierPlugin.DLL' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\advancedtspcontroller.iby(48): Missing file: '\epoc32\release\ARMV5\urel\AdvancedTspController.dll' in statement 'file='
+Y:\epoc32\rom\include\declarativeui.iby(9): Missing file: '\epoc32\release\ARMV5\urel\duiengine.dll' in statement 'file='
+Y:\epoc32\rom\include\declarativeui.iby(11): Missing file: '\epoc32\release\ARMV5\urel\duiinterpreter.dll' in statement 'file='
+Y:\epoc32\rom\include\widgetmodel.iby(9): Missing file: '\epoc32\release\ARMV5\urel\alfwidgetmodel.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\alfwidgets.iby(19): Missing file: '\epoc32\release\ARMV5\urel\alfcontainerwidget.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\alfwidgets.iby(23): Missing file: '\epoc32\release\ARMV5\urel\alfviewwidget.dll' in statement 'file='
+Y:\epoc32\rom\include\j9midpS60.iby(233): Missing file: '\epoc32\release\ARMV5\urel\j9_23_sip.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\midp20.iby(224): Missing file: '\epoc32\release\ARMV5\urel\MIDP2RECOGNIZER.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\mulcoverflowwidget.iby(46): Missing file: '\epoc32\release\ARMV5\urel\mulcoverflowwidget.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\mullistwidget.iby(46): Missing file: '\epoc32\release\ARMV5\urel\mullistwidget.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\mulutility.iby(46): Missing file: '\epoc32\release\armv5\urel\mulutility.dll' in statement 'file='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(250): Missing file: '\epoc32\data\Z\resource\ActivePalette2Bitmaps.mbm' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(251): Missing file: '\epoc32\data\Z\resource\activepalette2genericicons.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(294): Missing file: '\epoc32\data\Z\system\sounds\audiothemes\public\Orchestral fold open.aac' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(295): Missing file: '\epoc32\data\Z\system\sounds\audiothemes\public\Orchestral fold close.aac' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(335): Missing file: '\epoc32\data\Z\Private\101f85a0\acccircle.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(336): Missing file: '\epoc32\data\Z\Private\101f85a0\bigtrip.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(337): Missing file: '\epoc32\data\Z\Private\101f85a0\compass.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(338): Missing file: '\epoc32\data\Z\Private\101f85a0\flag.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(339): Missing file: '\epoc32\data\Z\Private\101f85a0\flagwave.gif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(340): Missing file: '\epoc32\data\Z\Private\101f85a0\globe.gif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(341): Missing file: '\epoc32\data\Z\Private\101f85a0\north.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(342): Missing file: '\epoc32\data\Z\Private\101f85a0\pointer.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(343): Missing file: '\epoc32\data\Z\Private\101f85a0\satellite.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(344): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_01.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(345): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_02.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(346): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_03.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(347): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_04.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(348): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_05.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(349): Missing file: '\epoc32\data\Z\Private\101f85a0\spwatch.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(350): Missing file: '\epoc32\data\Z\Private\101f85a0\table.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(351): Missing file: '\epoc32\data\Z\Private\101f85a0\time.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(352): Missing file: '\epoc32\data\Z\Private\101f85a0\navigation_ring.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(353): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_01.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(354): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_02.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(355): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_03.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(356): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_04.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(357): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_05.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(358): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_searching.gif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(359): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_searching_small.gif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(360): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_startup.gif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(361): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_unavail.png' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(384): Missing file: '\epoc32\data\Z\resource\apps\calendefaulteditors.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(401): Missing file: '\epoc32\data\Z\Private\2001B29B\backup_registration.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(456): Missing file: '\epoc32\data\Z\app_resource_dir\glxmetadataview.rsc' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(593): Missing file: '\epoc32\data\Z\private\10003a3f\apps\vcxnsappui_test_reg.RSC' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(594): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test_icon.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(605): Missing file: '\epoc32\data\z\resource\videostorageschema.mde' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(959): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(960): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\sources\qsn_fr_popup_sub_mask_icon.svg' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(961): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(962): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\sources\idle_toolbaricons.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(963): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(964): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(965): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\sources\idle_toolbaricons.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(966): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\sources\fmradioclassicidle.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1005): Missing file: '\epoc32\data\z\resource\hc_list_itemtypes.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1006): Missing file: '\epoc32\data\z\resource\lctgridimagetext.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1007): Missing file: '\epoc32\data\z\resource\lctgridimage.xml.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1008): Missing file: '\epoc32\data\z\resource\lctgridtext.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1059): Missing file: '\epoc32\data\z\system\install\callprovider_stub.SIS' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1153): Missing file: '\epoc32\release\ARMV5\urel\Z\Resource\ive\lib\jclcldc11\ext\0_j9_23_sip_jxe.odc' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1310): Missing file: '\epoc32\data\Z\Resource\JavaHelper\javahelper.mif' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1340): Missing file: '\epoc32\data\Z\Private\10202BE9\20010976.txt' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1372): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1373): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1374): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1375): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1376): Missing file: '\epoc32\data\z\resource\grid\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1377): Missing file: '\epoc32\data\z\resource\grid\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1378): Missing file: '\epoc32\data\z\resource\grid\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1379): Missing file: '\epoc32\data\z\resource\grid\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1380): Missing file: '\epoc32\winscw\c\logical_template_1_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1381): Missing file: '\epoc32\winscw\c\logical_template_2_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1382): Missing file: '\epoc32\winscw\c\logical_template_3_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1383): Missing file: '\epoc32\winscw\c\logical_template_4_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1384): Missing file: '\epoc32\winscw\c\logical_template_5_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1385): Missing file: '\epoc32\winscw\c\logical_template_6_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1386): Missing file: '\epoc32\winscw\c\logical_template_7_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1387): Missing file: '\epoc32\winscw\c\logical_template_8_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1388): Missing file: '\epoc32\data\z\resource\slider\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1389): Missing file: '\epoc32\data\z\resource\slider\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1390): Missing file: '\epoc32\data\z\resource\slider\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1391): Missing file: '\epoc32\data\z\resource\slider\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1392): Missing file: '\epoc32\data\z\resource\slider\logical_template_5.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1393): Missing file: '\epoc32\data\z\resource\slider\logical_template_6.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1394): Missing file: '\epoc32\data\z\resource\slider\logical_template_7.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1395): Missing file: '\epoc32\data\z\resource\slider\logical_template_8.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1396): Missing file: '\epoc32\data\z\resource\slider\logical_template_9.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1397): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1398): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1399): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1400): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1401): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_5.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1402): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_6.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1403): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_7.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1404): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_8.xml' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1644): Missing file: '\epoc32\data\Z\system\install\ximpfw.sis' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1690): Missing file: '\epoc32\Data\z\resource\services' in statement 'data='
+y:output\release_flash_images\devlon52\rnd\core\RX-47_200846_rnd\RX-47_200846_rnd_core_master.oby(1691): Missing file: '\epoc32\Data\z\resource\locales.txt' in statement 'data='
+* Writing tmp7.oby - result of problem-suppression phase
+* Writing tmp8.oby - result of bitmap conversion phase
+* Removing previous image and logs...
+* Writing tmp9.oby - result of cleaning phase
+* Writing RX-47_200846_rnd.oby - final OBY file
+* Writing RX-47_200846_rnd.rofs1.oby - final OBY file
+* Writing RX-47_200846_rnd.dir - ROM directory listing
+* compression method: bytepair* Executing rombuild -slog -loglevel1 -type-safe-link -geninc -compressionmethod bytepair RX-47_200846_rnd.oby
+
+ROMBUILD - Rom builder V2.08 (Build 596)
+ Software Ltd.
+
+WARNING: Unknown keyword 'ROFS_HEADER'.  Line 781 ignored
+WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_BEGIN'.  Line 2520 ignored
+WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_END'.  Line 2522 ignored
+WARNING: Unknown keyword '/'.  Line 2641 ignored
+WARNING: Unknown keyword ''.  Line 2806 ignored
+WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2875 ignored
+WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3554 ignored
+WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3558 ignored
+WARNING: Unknown keyword '***'.  Line 4226 ignored
+WARNING: Unknown keyword '***'.  Line 4228 ignored
+WARNING: Unknown keyword '***'.  Line 4558 ignored
+WARNING: Unknown keyword '***'.  Line 4560 ignored
+WARNING: Unknown keyword '***'.  Line 4741 ignored
+WARNING: Unknown keyword '***'.  Line 5302 ignored
+WARNING: Unknown keyword '***'.  Line 5304 ignored
+WARNING: Unknown keyword '***'.  Line 5330 ignored
+WARNING: Unknown keyword '***'.  Line 5332 ignored
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxcloudview.dll (UID3:200071ba HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxfetcher.dll (UID3:200071b3 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxdataprovider.dll (UID3:200104da HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxgridview.dll (UID3:200009ef HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxfullscreenview.dll (UID3:20000a07 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxlistview.dll (UID3:20000a0d HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxunifiedmetadataview.dll (UID3:20007193 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\vcxnsvodui.dll (UID3:102750db HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\vcxnsmyvideos.dll (UID3:2000b439 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\vcxnslivetvui.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\alflctlayoutmanagers.dll (UID3:20012475 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\alfscrollbarwidget.dll (UID3:20010105 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\armv5\urel\mulmodelutility.dll (UID3:2000d246 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\armv5\urel\muldatamodel.dll (UID3:2000d247 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulgridwidget.dll (UID3:2000d244 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulgridwidget.dll (UID3:2000d244 HWVD:01000000 VER:10.0)
+because
+	mulutility.dll (UID3:2000fa83 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\armv5\urel\mulsingleitemmodel.dll (UID3:2000fa84 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulsliderwidget.dll (UID3:2000fa7f HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulsliderwidget.dll (UID3:2000fa7f HWVD:01000000 VER:10.0)
+because
+	mulutility.dll (UID3:2000fa83 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: LoadContents failed - return code -1
+* rombuild failed
+
+*** Error: (S:CORE,C:1,B:1,K:0,V:1): Command `buildrom -loglevel1 -v -nosymbols -DFEATUREVARIANT=devlon52 -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -DDEVLON52 -es60ibymacros -DSECTION -DRND_CONTENT -cbytepair -oRX-47_200846_rnd.img y:\output/release_flash_images/devlon52/rnd/core/RX-47_200846_rnd/RX-47_200846_rnd_core_master.oby' failed (1).
+mingw_make[1]: *** [core] Error 1
+make: [configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core] Error 2 (ignored)
++++ HiRes End 1226578474.19474
+++ Finished at Thu Nov 13 14:14:34 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_01
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_01
+++ Started at Thu Nov 13 14:11:27 2008
++++ HiRes Start 1226578288.09013
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_01  WORKDIR=\epoc32\rombuild\imaker_temp/conf_1
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_01'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_01/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_01/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_01/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r04' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r05' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r13' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\04\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\05\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\13\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0004' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0005' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0013' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0004' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0005' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0013' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0004' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0005' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0013' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0004' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0005' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0013' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0004' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0005' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0013' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0004' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0005' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0013' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578438.91439
+++ Finished at Thu Nov 13 14:13:58 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_02
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_02
+++ Started at Thu Nov 13 14:14:35 2008
++++ HiRes Start 1226578476.02282
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_02  WORKDIR=\epoc32\rombuild\imaker_temp/conf_2
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_02'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_02/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_02/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_02/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r05' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r14' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r18' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\05\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\14\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\18\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0005' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0014' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0018' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0005' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0014' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0018' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0005' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0014' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0018' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0005' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0014' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0018' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0005' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0014' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0018' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0005' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0014' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0018' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578538.55288
+++ Finished at Thu Nov 13 14:15:38 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_03
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_03
+++ Started at Thu Nov 13 14:15:39 2008
++++ HiRes Start 1226578539.80286
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_03  WORKDIR=\epoc32\rombuild\imaker_temp/conf_3
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_03'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_03/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_03/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_03/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r06' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r07' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r08' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r09' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r15' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\06\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\07\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\08\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\09\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\15\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0006' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0007' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0008' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0009' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0015' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0006' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0007' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0008' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0009' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0015' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0006' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0007' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0008' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0009' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0015' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0006' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0007' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0008' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0009' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0015' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0006' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0007' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0008' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0009' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0015' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0006' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0007' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0008' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0009' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0015' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578601.02083
+++ Finished at Thu Nov 13 14:16:41 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_04
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_04
+++ Started at Thu Nov 13 14:16:42 2008
++++ HiRes Start 1226578602.22394
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_04  WORKDIR=\epoc32\rombuild\imaker_temp/conf_4
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_04'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_04/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_04/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_04/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r16' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r49' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r67' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r68' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\16\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\49\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\67\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\68\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0016' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0049' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0067' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0068' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0016' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0049' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0067' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0068' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0016' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0049' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0067' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0068' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0016' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0049' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0067' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0068' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0016' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0049' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0067' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0068' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0016' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0049' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0067' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0068' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578662.62942
+++ Finished at Thu Nov 13 14:17:42 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_05
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_05
+++ Started at Thu Nov 13 14:17:43 2008
++++ HiRes Start 1226578663.8794
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_05  WORKDIR=\epoc32\rombuild\imaker_temp/conf_5
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_05'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_05/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_05/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_05/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(53): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(54): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r16' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(55): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r17' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(56): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r42' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(57): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r78' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(58): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r93' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\16\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\17\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\42\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\78\appshelldata.dtd' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\93\appshelldata.dtd' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0016' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0017' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0042' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0078' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0093' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0016' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(59): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0017' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0042' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0078' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0093' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0016' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0017' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0042' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0078' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0093' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(88): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0016' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(89): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0017' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0042' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0078' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0093' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(97): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(98): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(99): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0016' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0017' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0042' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0078' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0093' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(108): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(109): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(110): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0016' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(111): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0017' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(112): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0042' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(113): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0078' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(114): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0093' in statement 'data='
+54) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+55) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+56) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+57) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+58) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+59) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+60) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+61) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 421 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2271 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2992 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 3248 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3813 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3851 ignored
+ 9) WARNING: Unknown keyword ''.  Line 421 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2271 ignored
+11) WARNING: Unknown keyword '***'.  Line 2992 ignored
+12) WARNING: Unknown keyword '***'.  Line 3248 ignored
+13) WARNING: Unknown keyword '***'.  Line 3813 ignored
+14) WARNING: Unknown keyword '***'.  Line 3851 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578726.36297
+++ Finished at Thu Nov 13 14:18:46 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_06
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_06
+++ Started at Thu Nov 13 14:18:47 2008
++++ HiRes Start 1226578727.73796
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_06  WORKDIR=\epoc32\rombuild\imaker_temp/conf_6
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_06'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_06/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_06/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_06/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r17' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r25' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r26' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r27' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\17\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\25\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\26\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\27\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0017' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0025' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0026' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0027' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0017' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0025' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0026' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0027' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0017' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0025' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0026' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0027' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0017' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0025' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0026' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0027' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0017' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0025' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0026' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0027' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0017' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0025' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0026' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0027' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578786.40908
+++ Finished at Thu Nov 13 14:19:46 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_07
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_07
+++ Started at Thu Nov 13 14:19:47 2008
++++ HiRes Start 1226578787.62782
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_07  WORKDIR=\epoc32\rombuild\imaker_temp/conf_7
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_07'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_07/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_07/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_07/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r28' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r45' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r54' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r79' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\28\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\45\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\54\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\79\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0028' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0045' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0054' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0079' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0028' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0045' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0054' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0079' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0028' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0045' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0054' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0079' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0028' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0045' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0054' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0079' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0028' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0045' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0054' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0079' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0028' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0045' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0054' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0079' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578847.51767
+++ Finished at Thu Nov 13 14:20:47 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_08
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_08
+++ Started at Thu Nov 13 14:20:48 2008
++++ HiRes Start 1226578848.75203
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_08  WORKDIR=\epoc32\rombuild\imaker_temp/conf_8
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_08'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_08/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_08/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_08/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r04' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r16' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r37' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r57' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r78' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\04\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\16\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\37\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\57\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\78\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0004' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0016' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0037' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0057' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0078' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0004' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0016' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0037' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0057' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0078' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0004' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0016' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0037' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0057' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0078' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0004' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0016' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0037' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0057' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0078' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0004' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0016' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0037' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0057' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0078' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0004' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0016' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0037' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0057' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0078' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578909.57938
+++ Finished at Thu Nov 13 14:21:49 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_09
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_09
+++ Started at Thu Nov 13 14:21:50 2008
++++ HiRes Start 1226578910.84499
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_09  WORKDIR=\epoc32\rombuild\imaker_temp/conf_9
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_09'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_09/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_09/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_09/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\audiothemesresources.iby(29): Missing file: '\epoc32\data\Z\resource\PslnATPluginRsc.r102' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\audiothemesresources.iby(30): Missing file: '\epoc32\data\Z\resource\PslnATPluginRsc.r103' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(57): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(58): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(59): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(60): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r04' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(61): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r102' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(62): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r103' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(63): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r13' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(64): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r44' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\04\appshelldata.dtd' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\102\appshelldata.dtd' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\103\appshelldata.dtd' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\13\appshelldata.dtd' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\44\appshelldata.dtd' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0004' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0102' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0103' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0013' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0044' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0004' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0102' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(64): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0103' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(65): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0013' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(66): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0044' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\app\mobiledictionaryresources.iby(19): Missing file: '\epoc32\data\Z\resource\Apps\mobiledictionary.r102' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\app\mobiledictionaryresources.iby(20): Missing file: '\epoc32\data\Z\resource\Apps\mobiledictionary.r103' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\app\NcdCatalogsUiResources.iby(32): Missing file: '\epoc32\data\Z\resource\apps\Ncd.r102' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\app\NcdCatalogsUiResources.iby(33): Missing file: '\epoc32\data\Z\resource\apps\Ncd.r103' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0004' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0102' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0103' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0013' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0044' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0004' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(96): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0102' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(97): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0103' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(98): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0013' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(99): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0044' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+54) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(106): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+55) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(107): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0004' in statement 'data='
+56) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(108): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0102' in statement 'data='
+57) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(109): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0103' in statement 'data='
+58) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(110): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0013' in statement 'data='
+59) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(111): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0044' in statement 'data='
+60) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(116): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+61) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(117): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+62) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(118): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+63) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(119): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0004' in statement 'data='
+64) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(120): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0102' in statement 'data='
+65) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(121): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0103' in statement 'data='
+66) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(122): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0013' in statement 'data='
+67) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(123): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0044' in statement 'data='
+68) ..\..\..\..\..\..\epoc32\rom\include\language\mw\elocl.iby(28): Missing file: '\epoc32\release\ARMV5\urel\Elocl.102' in statement 'file='
+69) ..\..\..\..\..\..\epoc32\rom\include\language\mw\elocl.iby(29): Missing file: '\epoc32\release\ARMV5\urel\Elocl.103' in statement 'file='
+70) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+71) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+72) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+73) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+74) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+75) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+76) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+77) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 472 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2560 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 3372 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 3660 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 4296 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 4339 ignored
+ 9) WARNING: Unknown keyword ''.  Line 472 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2560 ignored
+11) WARNING: Unknown keyword '***'.  Line 3372 ignored
+12) WARNING: Unknown keyword '***'.  Line 3660 ignored
+13) WARNING: Unknown keyword '***'.  Line 4296 ignored
+14) WARNING: Unknown keyword '***'.  Line 4339 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226578977.98475
+++ Finished at Thu Nov 13 14:22:58 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_11
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_11
+++ Started at Thu Nov 13 14:22:59 2008
++++ HiRes Start 1226578979.37536
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_11  WORKDIR=\epoc32\rombuild\imaker_temp/conf_10
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_11'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_11/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_11/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_11/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(32): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(33): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(34): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r37' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\37\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0037' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0037' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0037' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(64): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0037' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0037' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0037' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 217 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1115 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1472 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1600 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1881 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1899 ignored
+ 9) WARNING: Unknown keyword ''.  Line 217 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1115 ignored
+11) WARNING: Unknown keyword '***'.  Line 1472 ignored
+12) WARNING: Unknown keyword '***'.  Line 1600 ignored
+13) WARNING: Unknown keyword '***'.  Line 1881 ignored
+14) WARNING: Unknown keyword '***'.  Line 1899 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579017.23425
+++ Finished at Thu Nov 13 14:23:37 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_12
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_12
+++ Started at Thu Nov 13 14:23:38 2008
++++ HiRes Start 1226579018.07799
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_12  WORKDIR=\epoc32\rombuild\imaker_temp/conf_11
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_12'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_12/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_12/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_12/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(37): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(38): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r37' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(39): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r50' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(40): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r94' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\37\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\50\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\94\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0037' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0050' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0094' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0037' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0050' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0094' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0037' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0050' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0094' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0037' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0050' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0094' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0037' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0050' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0094' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0037' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0050' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0094' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 268 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1404 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1852 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2012 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2364 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2387 ignored
+ 9) WARNING: Unknown keyword ''.  Line 268 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1404 ignored
+11) WARNING: Unknown keyword '***'.  Line 1852 ignored
+12) WARNING: Unknown keyword '***'.  Line 2012 ignored
+13) WARNING: Unknown keyword '***'.  Line 2364 ignored
+14) WARNING: Unknown keyword '***'.  Line 2387 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579063.9524
+++ Finished at Thu Nov 13 14:24:23 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_13
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_13
+++ Started at Thu Nov 13 14:24:24 2008
++++ HiRes Start 1226579064.95239
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_13  WORKDIR=\epoc32\rombuild\imaker_temp/conf_12
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_13'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_13/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_13/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_13/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r13' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\13\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0013' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0013' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0013' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0013' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0013' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0013' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579096.78011
+++ Finished at Thu Nov 13 14:24:56 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_14
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_14
+++ Started at Thu Nov 13 14:24:57 2008
++++ HiRes Start 1226579097.51447
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_14  WORKDIR=\epoc32\rombuild\imaker_temp/conf_13
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_14'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_14/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_14/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_14/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(42): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(43): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(44): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(45): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r05' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(46): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r18' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\05\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\18\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0005' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0018' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0005' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0018' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(65): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(66): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(67): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0005' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0018' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0005' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0018' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0005' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0018' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0005' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(96): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0018' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 319 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1693 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2232 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2424 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2847 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2875 ignored
+ 9) WARNING: Unknown keyword ''.  Line 319 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1693 ignored
+11) WARNING: Unknown keyword '***'.  Line 2232 ignored
+12) WARNING: Unknown keyword '***'.  Line 2424 ignored
+13) WARNING: Unknown keyword '***'.  Line 2847 ignored
+14) WARNING: Unknown keyword '***'.  Line 2875 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579142.96725
+++ Finished at Thu Nov 13 14:25:42 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_16
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_16
+++ Started at Thu Nov 13 14:25:44 2008
++++ HiRes Start 1226579144.07662
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_16  WORKDIR=\epoc32\rombuild\imaker_temp/conf_14
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_16'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_16/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_16/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_16/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(42): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(43): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r10' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(44): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r18' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(45): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r76' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(46): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r83' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\10\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\18\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\76\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\83\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0010' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0018' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0076' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0083' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0010' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0018' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0076' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0083' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(65): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(66): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0010' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(67): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0018' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0076' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0083' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0010' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0018' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0076' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0083' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0010' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0018' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0076' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0083' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0010' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0018' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0076' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(96): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0083' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 319 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1695 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2234 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2426 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2849 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2877 ignored
+ 9) WARNING: Unknown keyword ''.  Line 319 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1695 ignored
+11) WARNING: Unknown keyword '***'.  Line 2234 ignored
+12) WARNING: Unknown keyword '***'.  Line 2426 ignored
+13) WARNING: Unknown keyword '***'.  Line 2849 ignored
+14) WARNING: Unknown keyword '***'.  Line 2877 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579195.70129
+++ Finished at Thu Nov 13 14:26:35 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_17
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_17
+++ Started at Thu Nov 13 14:26:36 2008
++++ HiRes Start 1226579196.82628
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_17  WORKDIR=\epoc32\rombuild\imaker_temp/conf_15
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_17'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_17/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_17/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_17/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(37): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r10' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(38): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r51' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(39): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r76' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(40): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r83' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\10\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\51\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\76\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\83\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0010' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0051' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0076' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0083' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0010' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0051' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0076' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0083' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0010' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0051' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0076' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0083' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0010' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0051' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0076' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0083' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0010' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0051' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0076' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0083' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0010' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0051' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0076' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0083' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 268 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1854 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2014 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2366 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2389 ignored
+ 9) WARNING: Unknown keyword ''.  Line 268 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+11) WARNING: Unknown keyword '***'.  Line 1854 ignored
+12) WARNING: Unknown keyword '***'.  Line 2014 ignored
+13) WARNING: Unknown keyword '***'.  Line 2366 ignored
+14) WARNING: Unknown keyword '***'.  Line 2389 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579241.326
+++ Finished at Thu Nov 13 14:27:21 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_18
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_18
+++ Started at Thu Nov 13 14:27:22 2008
++++ HiRes Start 1226579242.26349
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_18  WORKDIR=\epoc32\rombuild\imaker_temp/conf_16
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_18'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_18/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_18/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_18/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r33' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\33\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0033' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0033' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0033' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0033' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0033' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0033' in statement 'data='
+14) Y:\epoc32\rom\Variant\localized_resources.iby(905): Missing file: '\epoc32\data\Z\resource\CalenThaiPluginData.r33' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579276.81014
+++ Finished at Thu Nov 13 14:27:56 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_19
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_19
+++ Started at Thu Nov 13 14:27:57 2008
++++ HiRes Start 1226579277.49764
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_19  WORKDIR=\epoc32\rombuild\imaker_temp/conf_17
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_19'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_19/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_19/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_19/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r39' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\39\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0039' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0039' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0039' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0039' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0039' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0039' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579311.52867
+++ Finished at Thu Nov 13 14:28:31 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_20
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_20
+++ Started at Thu Nov 13 14:28:32 2008
++++ HiRes Start 1226579312.21617
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_20  WORKDIR=\epoc32\rombuild\imaker_temp/conf_18
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_20'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_20/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_20/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_20/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r96' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\96\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0096' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0096' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0096' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0096' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0096' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0096' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579346.9347
+++ Finished at Thu Nov 13 14:29:06 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_22
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_22
+++ Started at Thu Nov 13 14:29:07 2008
++++ HiRes Start 1226579347.60657
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_22  WORKDIR=\epoc32\rombuild\imaker_temp/conf_19
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_22'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_22/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_22/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_22/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(37): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r159' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(38): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r31' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(39): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r326' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(40): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r327' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\159\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\31\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\326\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\327\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0159' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0031' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0326' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0327' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0159' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0031' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0326' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0327' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0159' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0031' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0326' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0327' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0159' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0031' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0326' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0327' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0159' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0031' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0326' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0327' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0159' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0031' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0326' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0327' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 268 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1854 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2014 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2366 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2389 ignored
+ 9) WARNING: Unknown keyword ''.  Line 268 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+11) WARNING: Unknown keyword '***'.  Line 1854 ignored
+12) WARNING: Unknown keyword '***'.  Line 2014 ignored
+13) WARNING: Unknown keyword '***'.  Line 2366 ignored
+14) WARNING: Unknown keyword '***'.  Line 2389 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579392.32503
+++ Finished at Thu Nov 13 14:29:52 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_23
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_23
+++ Started at Thu Nov 13 14:29:53 2008
++++ HiRes Start 1226579393.1219
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_23  WORKDIR=\epoc32\rombuild\imaker_temp/conf_20
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_23'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_23/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_23/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_23/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(32): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r158' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(33): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r30' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(34): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r31' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\158\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\30\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\31\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0158' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0030' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0031' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0158' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0030' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0031' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0158' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0030' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0031' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0158' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0030' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(64): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0031' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0158' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0030' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0031' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0158' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0030' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0031' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 217 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1117 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1474 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1602 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1883 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1901 ignored
+ 9) WARNING: Unknown keyword ''.  Line 217 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1117 ignored
+11) WARNING: Unknown keyword '***'.  Line 1474 ignored
+12) WARNING: Unknown keyword '***'.  Line 1602 ignored
+13) WARNING: Unknown keyword '***'.  Line 1883 ignored
+14) WARNING: Unknown keyword '***'.  Line 1901 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579433.99664
+++ Finished at Thu Nov 13 14:30:34 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_24
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_24
+++ Started at Thu Nov 13 14:30:34 2008
++++ HiRes Start 1226579434.76226
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_24  WORKDIR=\epoc32\rombuild\imaker_temp/conf_21
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_24'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_24/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_24/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_24/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r157' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r29' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(36): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\157\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\29\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0157' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0029' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0157' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0029' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0157' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0029' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0157' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0029' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0157' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0029' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0157' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0029' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1094 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1190 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1400 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1413 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+11) WARNING: Unknown keyword '***'.  Line 1094 ignored
+12) WARNING: Unknown keyword '***'.  Line 1190 ignored
+13) WARNING: Unknown keyword '***'.  Line 1400 ignored
+14) WARNING: Unknown keyword '***'.  Line 1413 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579469.90266
+++ Finished at Thu Nov 13 14:31:09 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_25
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_25
+++ Started at Thu Nov 13 14:31:10 2008
++++ HiRes Start 1226579470.6214
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_25  WORKDIR=\epoc32\rombuild\imaker_temp/conf_22
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_25'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_25/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_25/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_25/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r159' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r31' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(36): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\159\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\31\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0159' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0031' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0159' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0031' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0159' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0031' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0159' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0031' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0159' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0031' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0159' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0031' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1094 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1190 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1400 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1413 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+11) WARNING: Unknown keyword '***'.  Line 1094 ignored
+12) WARNING: Unknown keyword '***'.  Line 1190 ignored
+13) WARNING: Unknown keyword '***'.  Line 1400 ignored
+14) WARNING: Unknown keyword '***'.  Line 1413 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579500.90246
+++ Finished at Thu Nov 13 14:31:40 2008
+=== config_1 == configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_27
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_27
+++ Started at Thu Nov 13 14:31:41 2008
++++ HiRes Start 1226579501.68371
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=rnd"  langpack_27  WORKDIR=\epoc32\rombuild\imaker_temp/conf_23
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_27'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_27/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_27/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/rnd/langpack/langpack_27/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r160' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r32' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(36): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\160\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\32\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0160' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0032' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0160' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0032' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0160' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0032' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0160' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0032' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0160' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0032' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0160' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0032' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1094 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1190 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1400 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1413 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+11) WARNING: Unknown keyword '***'.  Line 1094 ignored
+12) WARNING: Unknown keyword '***'.  Line 1190 ignored
+13) WARNING: Unknown keyword '***'.  Line 1400 ignored
+14) WARNING: Unknown keyword '***'.  Line 1413 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579536.43348
+++ Finished at Thu Nov 13 14:32:16 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... core
+++ Started at Thu Nov 13 14:32:17 2008
++++ HiRes Start 1226579537.7145
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  core  WORKDIR=\epoc32\rombuild\imaker_temp/conf_0
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core] Error 1 (ignored)
++++ HiRes End 1226579538.46442
+++ Finished at Thu Nov 13 14:32:18 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_01
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_01
+++ Started at Thu Nov 13 14:32:18 2008
++++ HiRes Start 1226579538.57378
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_01  WORKDIR=\epoc32\rombuild\imaker_temp/conf_1
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_01] Error 1 (ignored)
++++ HiRes End 1226579538.74563
+++ Finished at Thu Nov 13 14:32:18 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_02
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_02
+++ Started at Thu Nov 13 14:32:18 2008
++++ HiRes Start 1226579538.83937
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_02  WORKDIR=\epoc32\rombuild\imaker_temp/conf_2
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_02] Error 1 (ignored)
++++ HiRes End 1226579538.99561
+++ Finished at Thu Nov 13 14:32:19 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_03
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_03
+++ Started at Thu Nov 13 14:32:19 2008
++++ HiRes Start 1226579539.08935
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_03  WORKDIR=\epoc32\rombuild\imaker_temp/conf_3
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_03] Error 1 (ignored)
++++ HiRes End 1226579539.24558
+++ Finished at Thu Nov 13 14:32:19 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_04
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_04
+++ Started at Thu Nov 13 14:32:19 2008
++++ HiRes Start 1226579539.33932
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_04  WORKDIR=\epoc32\rombuild\imaker_temp/conf_4
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_04] Error 1 (ignored)
++++ HiRes End 1226579539.49555
+++ Finished at Thu Nov 13 14:32:19 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_05
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_05
+++ Started at Thu Nov 13 14:32:19 2008
++++ HiRes Start 1226579539.58929
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_05  WORKDIR=\epoc32\rombuild\imaker_temp/conf_5
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_05] Error 1 (ignored)
++++ HiRes End 1226579539.74553
+++ Finished at Thu Nov 13 14:32:19 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_06
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_06
+++ Started at Thu Nov 13 14:32:19 2008
++++ HiRes Start 1226579539.83927
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_06  WORKDIR=\epoc32\rombuild\imaker_temp/conf_6
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_06] Error 1 (ignored)
++++ HiRes End 1226579540.01112
+++ Finished at Thu Nov 13 14:32:20 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_07
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_07
+++ Started at Thu Nov 13 14:32:20 2008
++++ HiRes Start 1226579540.10486
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_07  WORKDIR=\epoc32\rombuild\imaker_temp/conf_7
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_07] Error 1 (ignored)
++++ HiRes End 1226579540.26109
+++ Finished at Thu Nov 13 14:32:20 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_08
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_08
+++ Started at Thu Nov 13 14:32:20 2008
++++ HiRes Start 1226579540.35483
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_08  WORKDIR=\epoc32\rombuild\imaker_temp/conf_8
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_08] Error 1 (ignored)
++++ HiRes End 1226579540.51107
+++ Finished at Thu Nov 13 14:32:20 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_09
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_09
+++ Started at Thu Nov 13 14:32:20 2008
++++ HiRes Start 1226579540.60481
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_09  WORKDIR=\epoc32\rombuild\imaker_temp/conf_9
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_09] Error 1 (ignored)
++++ HiRes End 1226579540.77666
+++ Finished at Thu Nov 13 14:32:20 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_11
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_11
+++ Started at Thu Nov 13 14:32:20 2008
++++ HiRes Start 1226579540.8704
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_11  WORKDIR=\epoc32\rombuild\imaker_temp/conf_10
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_11] Error 1 (ignored)
++++ HiRes End 1226579541.02664
+++ Finished at Thu Nov 13 14:32:21 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_12
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_12
+++ Started at Thu Nov 13 14:32:21 2008
++++ HiRes Start 1226579541.12038
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_12  WORKDIR=\epoc32\rombuild\imaker_temp/conf_11
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_12] Error 1 (ignored)
++++ HiRes End 1226579541.29223
+++ Finished at Thu Nov 13 14:32:21 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_13
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_13
+++ Started at Thu Nov 13 14:32:21 2008
++++ HiRes Start 1226579541.38597
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_13  WORKDIR=\epoc32\rombuild\imaker_temp/conf_12
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_13] Error 1 (ignored)
++++ HiRes End 1226579541.54221
+++ Finished at Thu Nov 13 14:32:21 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_14
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_14
+++ Started at Thu Nov 13 14:32:21 2008
++++ HiRes Start 1226579541.63595
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_14  WORKDIR=\epoc32\rombuild\imaker_temp/conf_13
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_14] Error 1 (ignored)
++++ HiRes End 1226579541.8078
+++ Finished at Thu Nov 13 14:32:21 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_16
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_16
+++ Started at Thu Nov 13 14:32:21 2008
++++ HiRes Start 1226579541.90154
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_16  WORKDIR=\epoc32\rombuild\imaker_temp/conf_14
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_16] Error 1 (ignored)
++++ HiRes End 1226579542.05777
+++ Finished at Thu Nov 13 14:32:22 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_17
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_17
+++ Started at Thu Nov 13 14:32:22 2008
++++ HiRes Start 1226579542.15151
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_17  WORKDIR=\epoc32\rombuild\imaker_temp/conf_15
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_17] Error 1 (ignored)
++++ HiRes End 1226579542.32337
+++ Finished at Thu Nov 13 14:32:22 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_18
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_18
+++ Started at Thu Nov 13 14:32:22 2008
++++ HiRes Start 1226579542.41711
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_18  WORKDIR=\epoc32\rombuild\imaker_temp/conf_16
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_18] Error 1 (ignored)
++++ HiRes End 1226579542.57334
+++ Finished at Thu Nov 13 14:32:22 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_19
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_19
+++ Started at Thu Nov 13 14:32:22 2008
++++ HiRes Start 1226579542.66708
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_19  WORKDIR=\epoc32\rombuild\imaker_temp/conf_17
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_19] Error 1 (ignored)
++++ HiRes End 1226579542.83894
+++ Finished at Thu Nov 13 14:32:22 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_20
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_20
+++ Started at Thu Nov 13 14:32:22 2008
++++ HiRes Start 1226579542.93268
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_20  WORKDIR=\epoc32\rombuild\imaker_temp/conf_18
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_20] Error 1 (ignored)
++++ HiRes End 1226579543.08891
+++ Finished at Thu Nov 13 14:32:23 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_22
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_22
+++ Started at Thu Nov 13 14:32:23 2008
++++ HiRes Start 1226579543.18265
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_22  WORKDIR=\epoc32\rombuild\imaker_temp/conf_19
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_22] Error 1 (ignored)
++++ HiRes End 1226579543.35451
+++ Finished at Thu Nov 13 14:32:23 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_23
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_23
+++ Started at Thu Nov 13 14:32:23 2008
++++ HiRes Start 1226579543.44825
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_23  WORKDIR=\epoc32\rombuild\imaker_temp/conf_20
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_23] Error 1 (ignored)
++++ HiRes End 1226579543.60448
+++ Finished at Thu Nov 13 14:32:23 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_24
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_24
+++ Started at Thu Nov 13 14:32:23 2008
++++ HiRes Start 1226579543.69822
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_24  WORKDIR=\epoc32\rombuild\imaker_temp/conf_21
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_24] Error 1 (ignored)
++++ HiRes End 1226579543.87008
+++ Finished at Thu Nov 13 14:32:23 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_25
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_25
+++ Started at Thu Nov 13 14:32:23 2008
++++ HiRes Start 1226579543.94819
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_25  WORKDIR=\epoc32\rombuild\imaker_temp/conf_22
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_25] Error 1 (ignored)
++++ HiRes End 1226579544.12005
+++ Finished at Thu Nov 13 14:32:24 2008
+=== config_1 == signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_27
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_27
+++ Started at Thu Nov 13 14:32:24 2008
++++ HiRes Start 1226579544.21379
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=rnd"  langpack_27  WORKDIR=\epoc32\rombuild\imaker_temp/conf_23
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration1_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_27] Error 1 (ignored)
++++ HiRes End 1226579544.37002
+++ Finished at Thu Nov 13 14:32:24 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... core
+++ Started at Thu Nov 13 14:32:24 2008
++++ HiRes Start 1226579545.07405
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  core  WORKDIR=\epoc32\rombuild\imaker_temp/conf_24
+iMaker 08.43.01, 20-Oct-2008.
+Generating file(s) for Core image creation
+Creating Core (ROM & ROFS1) SOS image
+
+Y:\output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon>rem @echo off 
+
+Y:\output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon>setlocal
+
+Y:\output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon>perl -S buildrom.pl -loglevel1 -v -nosymbols -DFEATUREVARIANT=devlon52 -D_IMAGE_TYPE_SUBCON -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -DDEVLON52 -es60ibymacros -DSECTION -DRND_CONTENT -cbytepair -oRX-47_200846_subcon.img y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_master.oby 
+* cpp -o tmp1.oby -nostdinc -undef -DFEATUREVARIANT=devlon52 -D_IMAGE_TYPE_SUBCON -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -DDEVLON52 -DSECTION -DRND_CONTENT -I. -I "Y:\epoc32\rom\config\platform\devlon52" -I "Y:\epoc32\include\config\platform\devlon52" -I "Y:\epoc32\rom\config\platform" -I "Y:\epoc32\include\config\platform" -I "Y:\epoc32\rom\config" -I "Y:\epoc32\include\config" -I "Y:\epoc32\rom" -I "Y:\epoc32\rom\include" -I "Y:\epoc32\include\oem" -include "Y:\epoc32\include\oem\feature_settings.hrh"
+In file included from Y:\epoc32\include\config\platform\adaptation_features.hrh:25,
+                 from Y:\epoc32\include\oem\feature_settings.hrh:43,
+                 from :1:
+Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+*Initialization*:1: warning: this is the location of the previous definition
+In file included from Y:\epoc32\rom\config\platform\ncp_components.iby:124,
+                 from Y:\epoc32\rom\config\platform\Variant\BasePorting.iby:26,
+                 from ../../../../../../epoc32/rom/master.oby:34,
+                 from y:output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_master.oby:50:
+Y:\epoc32\rom\include\H4PlusHci.iby:4: warning: `#ifndef' argument starts with punctuation
+* reading y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_master.oby
+override.pm: Initializing; logfile =`y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_bldromplugin.log', debug = 0
+configpaging.pm: Initializing with configpaging_nokia.cfg
+Using export-restricted strong crytography implementation
+ROM_IMAGE[1] rofs1 size=0x10000000 xip=0 compress=0 extension=0 composite=none uncompress=0 
+* Writing tmp2.oby - result of substitution phase
+* Writing tmp3.oby - result of reorganisation phase
+* Writing tmp4.oby - result of Plugin stage
+* No language codes specified, defaulting to 01
+Converting >\epoc32\data\Z\Resource\Charconv\BUILTIN.R01< to RSC
+Converting >\epoc32\data\Z\Resource\swtlstokentype.R01< to RSC
+Converting >\epoc32\data\Z\Resource\TlsCacheServer\TlsCacheTimeouts.R01< to RSC
+Converting >\epoc32\data\Z\Resource\logeng\logwrap.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88592.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88593.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88594.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88595.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88596.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88597.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88598.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO88599.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885910.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885913.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885914.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\ISO885915.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\CP850.R01< to RSC
+Converting >\epoc32\data\Z\Resource\Charconv\UCS2.R01< to RSC
+Converting >\epoc32\data\Z\Resource\APPS\ApfMimeContentPolicy.R01< to RSC
+Converting >\epoc32\data\Z\resource\messaging\smss.R01< to RSC
+Converting >\epoc32\data\Z\resource\messaging\wappstr.R01< to RSC
+Converting >\epoc32\data\Z\RESOURCE\messaging\wappushunknown.R01< to RSC
+Converting >\epoc32\data\Z\Resource\fstokenserver.R01< to RSC
+Converting >\epoc32\data\Z\resource\defaultbeep.R01< to RSC
+Converting >\epoc32\data\Z\Resource\JavaHelper\JavaHelper.R01< to RSC
+Converting >\epoc32\data\Z\resource\Apps\trkapplication.R01< to RSC
+Converting >\epoc32\data\Z\resource\Apps\trkapplication_loc.R01< to RSC
+Converting >\epoc32\data\Z\private\10003a3f\Apps\trkapplication_reg.R01< to RSC
+Converting >\epoc32\data\Z\resource\Apps\trkapplication.M01< to MIF
+* Writing tmp5.oby - result of choosing language-specific files
+* Invalid image file name: \epoc32\data\Z\resource\apps\VideoEditorBitmaps.mbm or .mif
+Created ecom-0-0.spi
+Created ecom-0-1.s01
+* Writing tmp6.oby - result of SPI stage
+override.pm: ------------------------------------------------------------------
+Handling overrides...
+Replace ROM_IMAGE[0] `file=\epoc32\release\ARMV5\urel\FeatMgr.DLL		sys\bin\FEATMGR.DLL' with `file=\epoc32\release\ARMV5\urel\FeatMgr.Devlon52.DLL  sys\bin\FEATMGR.DLL'
+Replace ROM_IMAGE[0] `data=\epoc32\release\ARMV5\urel\R1_Mobile_4_0_Platform.cfg   resource\R1_Mobile_4_0_Platform.cfg' with `data=\epoc32\release\ARMV5\urel\R1_Mobile_4_0_Platform_ppd.cfg  resource\R1_Mobile_4_0_Platform.cfg'
+Replace ROM_IMAGE[0] `data=\Epoc32\Data\WSINI.ini                 System\Data\Wsini.ini' with `data=\Epoc32\Data\WSINI_devlon52.ini  System\Data\Wsini.ini'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\sw.txt		resource\versions\sw.txt' with `data=\epoc32\data\Z\Resource\versions\sw_devlon52.txt  resource\versions\sw.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\resource\Starter_Arm.rsc                resource\Starter_Arm.rsc' with `data=\epoc32\data\Z\resource\Starter_Arm_Devlon52_wop_wopc_wat_ww_wss.rsc  resource\Starter_Arm.rsc'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\resource\starter_non_critical_1_arm.rsc resource\starter_non_critical_1.rsc' with `data=\epoc32\data\Z\resource\Starter_non_critical_1_arm_Devlon52_wop_wopc_wat_ww_wss.rsc  resource\starter_non_critical_1.rsc'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\sw_devlon52.txt  resource\versions\sw.txt' with `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_sw.txt  resource\versions\sw.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\model.txt	resource\versions\model.txt' with `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_model.txt  resource\versions\model.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\Z\Resource\versions\imeisv.txt	resource\versions\imeisv.txt' with `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_imeisv.txt  resource\versions\imeisv.txt'
+Add ROM_IMAGE[0] `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_platform.txt  resource\versions\platform.txt' from `data-override=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_platform.txt  resource\versions\platform.txt'
+Add ROM_IMAGE[0] `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_product.txt  resource\versions\product.txt' from `data-override=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_product.txt  resource\versions\product.txt'
+Add ROM_IMAGE[0] `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_fwid.txt  resource\versions\fwid1.txt' from `data-override=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_fwid.txt  resource\versions\fwid1.txt'
+Replace ROM_IMAGE[0] `data=\epoc32\data\ost_dictionaries.zip                                             \Data\ost_dictionaries.zip' with `data=y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/ost_dictionaries.zip  \Data\ost_dictionaries.zip'
+override.pm: Duration: 1 seconds ----------------------------------------------
+obyparse.pm: Reading /epoc32/rombuild/odpcoderomfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/odp_code_romfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/odpcoderofsfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/IAD_rofsfiles.txt
+obyparse.pm: Reading /epoc32/rombuild/mytraces.txt
+obyparse.pm: Processing...
+obyparse.pm: Duration: 0 seconds
+configpaging.pm: Modifying demand paging configuration using \epoc32\rom\configpaging\configpaging_nokia.cfg
+Y:\epoc32\rom\include\lightsacoreservices.iby(72): Missing file: '\epoc32\release\ARMV5\urel\LightSAIscService.DLL' in statement 'file='
+Y:\epoc32\rom\include\lightadaptation.iby(110): Missing file: '\epoc32\release\ARMV5\urel\light_sensor_adaptation.DLL' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\app\IpVideo.iby(112): Missing file: '\epoc32\release\ARMV5\urel\vcxnsappui_test.exe' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\app\IpVideo.iby(392): Missing file: '\epoc32\release\ARMV5\urel\VcXNotifierPlugin.DLL' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\advancedtspcontroller.iby(48): Missing file: '\epoc32\release\ARMV5\urel\AdvancedTspController.dll' in statement 'file='
+Y:\epoc32\rom\include\declarativeui.iby(9): Missing file: '\epoc32\release\ARMV5\urel\duiengine.dll' in statement 'file='
+Y:\epoc32\rom\include\declarativeui.iby(11): Missing file: '\epoc32\release\ARMV5\urel\duiinterpreter.dll' in statement 'file='
+Y:\epoc32\rom\include\widgetmodel.iby(9): Missing file: '\epoc32\release\ARMV5\urel\alfwidgetmodel.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\alfwidgets.iby(19): Missing file: '\epoc32\release\ARMV5\urel\alfcontainerwidget.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\alfwidgets.iby(23): Missing file: '\epoc32\release\ARMV5\urel\alfviewwidget.dll' in statement 'file='
+Y:\epoc32\rom\include\j9midpS60.iby(233): Missing file: '\epoc32\release\ARMV5\urel\j9_23_sip.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\midp20.iby(224): Missing file: '\epoc32\release\ARMV5\urel\MIDP2RECOGNIZER.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\mulcoverflowwidget.iby(46): Missing file: '\epoc32\release\ARMV5\urel\mulcoverflowwidget.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\mullistwidget.iby(46): Missing file: '\epoc32\release\ARMV5\urel\mullistwidget.dll' in statement 'file='
+..\..\..\..\..\..\epoc32\rom\include\core\mw\mulutility.iby(46): Missing file: '\epoc32\release\armv5\urel\mulutility.dll' in statement 'file='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(250): Missing file: '\epoc32\data\Z\resource\ActivePalette2Bitmaps.mbm' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(251): Missing file: '\epoc32\data\Z\resource\activepalette2genericicons.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(294): Missing file: '\epoc32\data\Z\system\sounds\audiothemes\public\Orchestral fold open.aac' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(295): Missing file: '\epoc32\data\Z\system\sounds\audiothemes\public\Orchestral fold close.aac' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(335): Missing file: '\epoc32\data\Z\Private\101f85a0\acccircle.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(336): Missing file: '\epoc32\data\Z\Private\101f85a0\bigtrip.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(337): Missing file: '\epoc32\data\Z\Private\101f85a0\compass.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(338): Missing file: '\epoc32\data\Z\Private\101f85a0\flag.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(339): Missing file: '\epoc32\data\Z\Private\101f85a0\flagwave.gif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(340): Missing file: '\epoc32\data\Z\Private\101f85a0\globe.gif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(341): Missing file: '\epoc32\data\Z\Private\101f85a0\north.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(342): Missing file: '\epoc32\data\Z\Private\101f85a0\pointer.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(343): Missing file: '\epoc32\data\Z\Private\101f85a0\satellite.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(344): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_01.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(345): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_02.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(346): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_03.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(347): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_04.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(348): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_05.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(349): Missing file: '\epoc32\data\Z\Private\101f85a0\spwatch.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(350): Missing file: '\epoc32\data\Z\Private\101f85a0\table.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(351): Missing file: '\epoc32\data\Z\Private\101f85a0\time.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(352): Missing file: '\epoc32\data\Z\Private\101f85a0\navigation_ring.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(353): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_01.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(354): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_02.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(355): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_03.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(356): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_04.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(357): Missing file: '\epoc32\data\Z\Private\101f85a0\signal_bar_05.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(358): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_searching.gif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(359): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_searching_small.gif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(360): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_startup.gif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(361): Missing file: '\epoc32\data\Z\Private\101f85a0\blid_unavail.png' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(384): Missing file: '\epoc32\data\Z\resource\apps\calendefaulteditors.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(401): Missing file: '\epoc32\data\Z\Private\2001B29B\backup_registration.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(456): Missing file: '\epoc32\data\Z\app_resource_dir\glxmetadataview.rsc' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(593): Missing file: '\epoc32\data\Z\private\10003a3f\apps\vcxnsappui_test_reg.RSC' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(594): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test_icon.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(605): Missing file: '\epoc32\data\z\resource\videostorageschema.mde' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(959): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(960): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\sources\qsn_fr_popup_sub_mask_icon.svg' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(961): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(962): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\sources\idle_toolbaricons.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(963): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(964): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0000' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(965): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\sources\idle_toolbaricons.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(966): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\sources\fmradioclassicidle.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1005): Missing file: '\epoc32\data\z\resource\hc_list_itemtypes.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1006): Missing file: '\epoc32\data\z\resource\lctgridimagetext.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1007): Missing file: '\epoc32\data\z\resource\lctgridimage.xml.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1008): Missing file: '\epoc32\data\z\resource\lctgridtext.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1059): Missing file: '\epoc32\data\z\system\install\callprovider_stub.SIS' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1153): Missing file: '\epoc32\release\ARMV5\urel\Z\Resource\ive\lib\jclcldc11\ext\0_j9_23_sip_jxe.odc' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1310): Missing file: '\epoc32\data\Z\Resource\JavaHelper\javahelper.mif' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1340): Missing file: '\epoc32\data\Z\Private\10202BE9\20010976.txt' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1372): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1373): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1374): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1375): Missing file: '\epoc32\data\z\resource\coverflow\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1376): Missing file: '\epoc32\data\z\resource\grid\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1377): Missing file: '\epoc32\data\z\resource\grid\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1378): Missing file: '\epoc32\data\z\resource\grid\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1379): Missing file: '\epoc32\data\z\resource\grid\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1380): Missing file: '\epoc32\winscw\c\logical_template_1_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1381): Missing file: '\epoc32\winscw\c\logical_template_2_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1382): Missing file: '\epoc32\winscw\c\logical_template_3_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1383): Missing file: '\epoc32\winscw\c\logical_template_4_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1384): Missing file: '\epoc32\winscw\c\logical_template_5_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1385): Missing file: '\epoc32\winscw\c\logical_template_6_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1386): Missing file: '\epoc32\winscw\c\logical_template_7_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1387): Missing file: '\epoc32\winscw\c\logical_template_8_list.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1388): Missing file: '\epoc32\data\z\resource\slider\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1389): Missing file: '\epoc32\data\z\resource\slider\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1390): Missing file: '\epoc32\data\z\resource\slider\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1391): Missing file: '\epoc32\data\z\resource\slider\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1392): Missing file: '\epoc32\data\z\resource\slider\logical_template_5.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1393): Missing file: '\epoc32\data\z\resource\slider\logical_template_6.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1394): Missing file: '\epoc32\data\z\resource\slider\logical_template_7.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1395): Missing file: '\epoc32\data\z\resource\slider\logical_template_8.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1396): Missing file: '\epoc32\data\z\resource\slider\logical_template_9.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1397): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_1.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1398): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_2.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1399): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_3.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1400): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_4.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1401): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_5.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1402): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_6.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1403): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_7.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1404): Missing file: '\\epoc32\winscw\c\resource\slider\lct\logical_template_8.xml' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1644): Missing file: '\epoc32\data\Z\system\install\ximpfw.sis' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1690): Missing file: '\epoc32\Data\z\resource\services' in statement 'data='
+y:output\release_flash_images\devlon52\subcon\core\RX-47_200846_subcon\RX-47_200846_subcon_core_master.oby(1691): Missing file: '\epoc32\Data\z\resource\locales.txt' in statement 'data='
+* Writing tmp7.oby - result of problem-suppression phase
+* Writing tmp8.oby - result of bitmap conversion phase
+* Removing previous image and logs...
+* Writing tmp9.oby - result of cleaning phase
+* Writing RX-47_200846_subcon.oby - final OBY file
+* Writing RX-47_200846_subcon.rofs1.oby - final OBY file
+* Writing RX-47_200846_subcon.dir - ROM directory listing
+* compression method: bytepair* Executing rombuild -slog -loglevel1 -type-safe-link -geninc -compressionmethod bytepair RX-47_200846_subcon.oby
+
+ROMBUILD - Rom builder V2.08 (Build 596)
+ Software Ltd.
+
+WARNING: Unknown keyword 'ROFS_HEADER'.  Line 781 ignored
+WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_BEGIN'.  Line 2520 ignored
+WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_END'.  Line 2522 ignored
+WARNING: Unknown keyword '/'.  Line 2641 ignored
+WARNING: Unknown keyword ''.  Line 2806 ignored
+WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2875 ignored
+WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3554 ignored
+WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3558 ignored
+WARNING: Unknown keyword '***'.  Line 4226 ignored
+WARNING: Unknown keyword '***'.  Line 4228 ignored
+WARNING: Unknown keyword '***'.  Line 4558 ignored
+WARNING: Unknown keyword '***'.  Line 4560 ignored
+WARNING: Unknown keyword '***'.  Line 4741 ignored
+WARNING: Unknown keyword '***'.  Line 5302 ignored
+WARNING: Unknown keyword '***'.  Line 5304 ignored
+WARNING: Unknown keyword '***'.  Line 5330 ignored
+WARNING: Unknown keyword '***'.  Line 5332 ignored
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxcloudview.dll (UID3:200071ba HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxfetcher.dll (UID3:200071b3 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxdataprovider.dll (UID3:200104da HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxgridview.dll (UID3:200009ef HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxfullscreenview.dll (UID3:20000a07 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxlistview.dll (UID3:20000a0d HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\glxunifiedmetadataview.dll (UID3:20007193 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\vcxnsvodui.dll (UID3:102750db HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\vcxnsmyvideos.dll (UID3:2000b439 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\vcxnslivetvui.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\alflctlayoutmanagers.dll (UID3:20012475 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\alfscrollbarwidget.dll (UID3:20010105 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\armv5\urel\mulmodelutility.dll (UID3:2000d246 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\armv5\urel\muldatamodel.dll (UID3:2000d247 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulgridwidget.dll (UID3:2000d244 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulgridwidget.dll (UID3:2000d244 HWVD:01000000 VER:10.0)
+because
+	mulutility.dll (UID3:2000fa83 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\armv5\urel\mulsingleitemmodel.dll (UID3:2000fa84 HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulsliderwidget.dll (UID3:2000fa7f HWVD:01000000 VER:10.0)
+because
+	alfwidgetmodel.dll (UID3:00000000 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: Can't build dependence graph for
+	\epoc32\release\ARMV5\urel\mulsliderwidget.dll (UID3:2000fa7f HWVD:01000000 VER:10.0)
+because
+	mulutility.dll (UID3:2000fa83 HWVD:01000000 VER:10.0)
+is not in rom.
+ERROR: LoadContents failed - return code -1
+* rombuild failed
+
+*** Error: (S:CORE,C:1,B:1,K:0,V:1): Command `buildrom -loglevel1 -v -nosymbols -DFEATUREVARIANT=devlon52 -D_IMAGE_TYPE_SUBCON -D_EABI=ARMV5 -D_ASIC_VER_11 -DUSE_MULTIROFS -DDEVLON52 -es60ibymacros -DSECTION -DRND_CONTENT -cbytepair -oRX-47_200846_subcon.img y:\output/release_flash_images/devlon52/subcon/core/RX-47_200846_subcon/RX-47_200846_subcon_core_master.oby' failed (1).
+mingw_make[1]: *** [core] Error 1
+make: [configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core] Error 2 (ignored)
++++ HiRes End 1226579662.47955
+++ Finished at Thu Nov 13 14:34:22 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_01
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_01
+++ Started at Thu Nov 13 14:34:23 2008
++++ HiRes Start 1226579663.47955
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_01  WORKDIR=\epoc32\rombuild\imaker_temp/conf_25
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_01'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_01/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_01/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_01/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r04' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r05' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r13' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\04\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\05\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\13\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0004' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0005' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0013' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0004' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0005' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0013' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0004' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0005' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0013' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0004' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0005' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0013' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0004' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0005' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0013' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0004' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0005' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0013' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579721.79167
+++ Finished at Thu Nov 13 14:35:21 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_02
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_02
+++ Started at Thu Nov 13 14:35:23 2008
++++ HiRes Start 1226579723.04166
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_02  WORKDIR=\epoc32\rombuild\imaker_temp/conf_26
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_02'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_02/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_02/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_02/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r05' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r14' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r18' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\05\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\14\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\18\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0005' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0014' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0018' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0005' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0014' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0018' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0005' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0014' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0018' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0005' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0014' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0018' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0005' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0014' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0018' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0005' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0014' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0018' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579780.93192
+++ Finished at Thu Nov 13 14:36:20 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_03
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_03
+++ Started at Thu Nov 13 14:36:22 2008
++++ HiRes Start 1226579782.11941
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_03  WORKDIR=\epoc32\rombuild\imaker_temp/conf_27
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_03'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_03/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_03/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_03/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r06' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r07' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r08' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r09' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r15' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\06\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\07\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\08\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\09\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\15\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0006' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0007' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0008' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0009' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0015' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0006' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0007' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0008' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0009' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0015' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0006' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0007' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0008' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0009' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0015' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0006' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0007' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0008' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0009' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0015' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0006' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0007' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0008' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0009' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0015' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0006' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0007' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0008' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0009' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0015' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579841.88465
+++ Finished at Thu Nov 13 14:37:21 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_04
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_04
+++ Started at Thu Nov 13 14:37:23 2008
++++ HiRes Start 1226579843.13465
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_04  WORKDIR=\epoc32\rombuild\imaker_temp/conf_28
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_04'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_04/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_04/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_04/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r16' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r49' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r67' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r68' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\16\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\49\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\67\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\68\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0016' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0049' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0067' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0068' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0016' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0049' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0067' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0068' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0016' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0049' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0067' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0068' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0016' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0049' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0067' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0068' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0016' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0049' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0067' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0068' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0016' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0049' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0067' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0068' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579902.32177
+++ Finished at Thu Nov 13 14:38:22 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_05
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_05
+++ Started at Thu Nov 13 14:38:23 2008
++++ HiRes Start 1226579903.54051
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_05  WORKDIR=\epoc32\rombuild\imaker_temp/conf_29
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_05'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_05/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_05/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_05/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(53): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(54): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r16' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(55): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r17' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(56): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r42' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(57): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r78' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(58): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r93' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\16\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\17\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\42\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\78\appshelldata.dtd' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\93\appshelldata.dtd' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0016' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0017' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0042' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0078' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0093' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0016' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(59): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0017' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0042' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0078' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0093' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0016' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0017' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0042' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0078' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0093' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(88): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0016' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(89): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0017' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0042' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0078' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0093' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(97): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(98): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(99): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0016' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0017' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0042' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0078' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0093' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(108): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(109): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(110): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0016' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(111): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0017' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(112): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0042' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(113): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0078' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(114): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0093' in statement 'data='
+54) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+55) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+56) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+57) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+58) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+59) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+60) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+61) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 421 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2271 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2992 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 3248 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3813 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3851 ignored
+ 9) WARNING: Unknown keyword ''.  Line 421 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2271 ignored
+11) WARNING: Unknown keyword '***'.  Line 2992 ignored
+12) WARNING: Unknown keyword '***'.  Line 3248 ignored
+13) WARNING: Unknown keyword '***'.  Line 3813 ignored
+14) WARNING: Unknown keyword '***'.  Line 3851 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226579964.63387
+++ Finished at Thu Nov 13 14:39:24 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_06
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_06
+++ Started at Thu Nov 13 14:39:25 2008
++++ HiRes Start 1226579965.99323
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_06  WORKDIR=\epoc32\rombuild\imaker_temp/conf_30
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_06'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_06/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_06/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_06/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r17' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r25' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r26' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r27' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\17\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\25\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\26\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\27\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0017' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0025' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0026' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0027' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0017' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0025' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0026' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0027' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0017' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0025' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0026' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0027' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0017' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0025' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0026' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0027' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0017' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0025' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0026' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0027' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0017' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0025' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0026' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0027' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580023.55537
+++ Finished at Thu Nov 13 14:40:23 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_07
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_07
+++ Started at Thu Nov 13 14:40:24 2008
++++ HiRes Start 1226580024.82098
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_07  WORKDIR=\epoc32\rombuild\imaker_temp/conf_31
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_07'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_07/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_07/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_07/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r28' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r45' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r54' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r79' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\28\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\45\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\54\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\79\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0028' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0045' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0054' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0079' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0028' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0045' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0054' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0079' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0028' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0045' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0054' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0079' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0028' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0045' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0054' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0079' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0028' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0045' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0054' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0079' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0028' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0045' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0054' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0079' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580081.86749
+++ Finished at Thu Nov 13 14:41:21 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_08
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_08
+++ Started at Thu Nov 13 14:41:23 2008
++++ HiRes Start 1226580083.08623
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_08  WORKDIR=\epoc32\rombuild\imaker_temp/conf_32
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_08'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_08/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_08/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_08/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(47): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(48): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r04' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(49): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r16' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(50): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r37' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(51): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r57' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(52): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r78' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\04\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\16\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\37\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\57\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\78\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0004' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0016' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0037' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0057' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0078' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0004' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0016' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0037' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0057' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0078' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0004' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(72): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0016' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(73): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0037' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0057' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0078' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0004' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0016' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0037' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0057' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0078' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(90): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(91): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0004' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0016' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0037' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0057' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0078' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(100): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(101): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0004' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(102): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0016' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(103): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0037' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0057' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0078' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 370 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2612 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2836 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 3330 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 3363 ignored
+ 9) WARNING: Unknown keyword ''.  Line 370 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1982 ignored
+11) WARNING: Unknown keyword '***'.  Line 2612 ignored
+12) WARNING: Unknown keyword '***'.  Line 2836 ignored
+13) WARNING: Unknown keyword '***'.  Line 3330 ignored
+14) WARNING: Unknown keyword '***'.  Line 3363 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580141.39836
+++ Finished at Thu Nov 13 14:42:21 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_09
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_09
+++ Started at Thu Nov 13 14:42:22 2008
++++ HiRes Start 1226580142.78898
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_09  WORKDIR=\epoc32\rombuild\imaker_temp/conf_33
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_09'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_09/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_09/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_09/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\audiothemesresources.iby(29): Missing file: '\epoc32\data\Z\resource\PslnATPluginRsc.r102' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\audiothemesresources.iby(30): Missing file: '\epoc32\data\Z\resource\PslnATPluginRsc.r103' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(57): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(58): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(59): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(60): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r04' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(61): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r102' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(62): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r103' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(63): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r13' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(64): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r44' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\04\appshelldata.dtd' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\102\appshelldata.dtd' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\103\appshelldata.dtd' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\13\appshelldata.dtd' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\44\appshelldata.dtd' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0004' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0102' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0103' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0013' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(58): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0044' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0004' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0102' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(64): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0103' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(65): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0013' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(66): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0044' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\app\mobiledictionaryresources.iby(19): Missing file: '\epoc32\data\Z\resource\Apps\mobiledictionary.r102' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\app\mobiledictionaryresources.iby(20): Missing file: '\epoc32\data\Z\resource\Apps\mobiledictionary.r103' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\app\NcdCatalogsUiResources.iby(32): Missing file: '\epoc32\data\Z\resource\apps\Ncd.r102' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\app\NcdCatalogsUiResources.iby(33): Missing file: '\epoc32\data\Z\resource\apps\Ncd.r103' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(80): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(81): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(82): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0004' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0102' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0103' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0013' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0044' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+46) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+47) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0004' in statement 'data='
+48) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(96): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0102' in statement 'data='
+49) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(97): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0103' in statement 'data='
+50) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(98): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0013' in statement 'data='
+51) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(99): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0044' in statement 'data='
+52) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(104): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+53) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(105): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+54) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(106): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+55) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(107): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0004' in statement 'data='
+56) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(108): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0102' in statement 'data='
+57) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(109): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0103' in statement 'data='
+58) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(110): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0013' in statement 'data='
+59) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(111): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0044' in statement 'data='
+60) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(116): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+61) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(117): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+62) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(118): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+63) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(119): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0004' in statement 'data='
+64) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(120): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0102' in statement 'data='
+65) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(121): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0103' in statement 'data='
+66) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(122): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0013' in statement 'data='
+67) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(123): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0044' in statement 'data='
+68) ..\..\..\..\..\..\epoc32\rom\include\language\mw\elocl.iby(28): Missing file: '\epoc32\release\ARMV5\urel\Elocl.102' in statement 'file='
+69) ..\..\..\..\..\..\epoc32\rom\include\language\mw\elocl.iby(29): Missing file: '\epoc32\release\ARMV5\urel\Elocl.103' in statement 'file='
+70) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+71) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+72) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+73) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+74) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+75) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+76) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+77) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 472 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2560 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 3372 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 3660 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 4296 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 4339 ignored
+ 9) WARNING: Unknown keyword ''.  Line 472 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2560 ignored
+11) WARNING: Unknown keyword '***'.  Line 3372 ignored
+12) WARNING: Unknown keyword '***'.  Line 3660 ignored
+13) WARNING: Unknown keyword '***'.  Line 4296 ignored
+14) WARNING: Unknown keyword '***'.  Line 4339 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580209.9448
+++ Finished at Thu Nov 13 14:43:29 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_11
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_11
+++ Started at Thu Nov 13 14:43:31 2008
++++ HiRes Start 1226580211.33541
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_11  WORKDIR=\epoc32\rombuild\imaker_temp/conf_34
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_11'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_11/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_11/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_11/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(32): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(33): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(34): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r37' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\37\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0037' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0037' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0037' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(64): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0037' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0037' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0037' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 217 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1115 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1472 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1600 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1881 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1899 ignored
+ 9) WARNING: Unknown keyword ''.  Line 217 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1115 ignored
+11) WARNING: Unknown keyword '***'.  Line 1472 ignored
+12) WARNING: Unknown keyword '***'.  Line 1600 ignored
+13) WARNING: Unknown keyword '***'.  Line 1881 ignored
+14) WARNING: Unknown keyword '***'.  Line 1899 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580248.80392
+++ Finished at Thu Nov 13 14:44:08 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_12
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_12
+++ Started at Thu Nov 13 14:44:09 2008
++++ HiRes Start 1226580249.63204
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_12  WORKDIR=\epoc32\rombuild\imaker_temp/conf_35
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_12'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_12/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_12/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_12/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(37): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(38): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r37' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(39): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r50' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(40): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r94' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\37\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\50\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\94\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0037' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0050' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0094' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0037' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0050' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0094' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0037' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0050' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0094' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0037' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0050' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0094' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0037' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0050' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0094' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0037' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0050' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0094' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 268 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1404 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1852 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2012 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2364 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2387 ignored
+ 9) WARNING: Unknown keyword ''.  Line 268 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1404 ignored
+11) WARNING: Unknown keyword '***'.  Line 1852 ignored
+12) WARNING: Unknown keyword '***'.  Line 2012 ignored
+13) WARNING: Unknown keyword '***'.  Line 2364 ignored
+14) WARNING: Unknown keyword '***'.  Line 2387 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580292.78802
+++ Finished at Thu Nov 13 14:44:52 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_13
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_13
+++ Started at Thu Nov 13 14:44:53 2008
++++ HiRes Start 1226580293.75676
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_13  WORKDIR=\epoc32\rombuild\imaker_temp/conf_36
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_13'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_13/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_13/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_13/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r13' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\13\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0013' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0013' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0013' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0013' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0013' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0013' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580326.70968
+++ Finished at Thu Nov 13 14:45:26 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_14
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_14
+++ Started at Thu Nov 13 14:45:27 2008
++++ HiRes Start 1226580327.39717
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_14  WORKDIR=\epoc32\rombuild\imaker_temp/conf_37
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_14'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_14/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_14/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_14/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(42): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(43): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(44): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r03' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(45): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r05' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(46): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r18' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\03\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\05\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\18\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0003' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0005' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0018' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0003' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0005' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0018' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(65): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(66): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(67): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0003' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0005' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0018' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0003' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0005' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0018' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0003' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0005' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0018' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0003' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0005' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(96): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0018' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+41) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+42) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+43) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+44) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+45) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 319 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1693 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2232 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2424 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2847 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2875 ignored
+ 9) WARNING: Unknown keyword ''.  Line 319 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1693 ignored
+11) WARNING: Unknown keyword '***'.  Line 2232 ignored
+12) WARNING: Unknown keyword '***'.  Line 2424 ignored
+13) WARNING: Unknown keyword '***'.  Line 2847 ignored
+14) WARNING: Unknown keyword '***'.  Line 2875 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580373.85
+++ Finished at Thu Nov 13 14:46:13 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_16
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_16
+++ Started at Thu Nov 13 14:46:14 2008
++++ HiRes Start 1226580374.99062
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_16  WORKDIR=\epoc32\rombuild\imaker_temp/conf_38
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_16'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_16/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_16/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_16/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(42): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r02' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(43): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r10' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(44): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r18' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(45): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r76' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(46): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r83' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\02\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\10\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\18\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\76\appshelldata.dtd' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\83\appshelldata.dtd' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0002' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0010' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0018' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0076' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0083' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0002' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0010' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(52): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0018' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(53): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0076' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(54): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0083' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(65): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0002' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(66): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0010' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(67): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0018' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0076' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0083' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(74): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0002' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(75): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0010' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0018' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0076' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0083' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(83): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0002' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0010' in statement 'data='
+33) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0018' in statement 'data='
+34) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0076' in statement 'data='
+35) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0083' in statement 'data='
+36) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(92): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0002' in statement 'data='
+37) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(93): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0010' in statement 'data='
+38) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(94): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0018' in statement 'data='
+39) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(95): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0076' in statement 'data='
+40) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(96): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0083' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 319 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1695 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 2234 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2426 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2849 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2877 ignored
+ 9) WARNING: Unknown keyword ''.  Line 319 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1695 ignored
+11) WARNING: Unknown keyword '***'.  Line 2234 ignored
+12) WARNING: Unknown keyword '***'.  Line 2426 ignored
+13) WARNING: Unknown keyword '***'.  Line 2849 ignored
+14) WARNING: Unknown keyword '***'.  Line 2877 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580424.50592
+++ Finished at Thu Nov 13 14:47:04 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_17
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_17
+++ Started at Thu Nov 13 14:47:05 2008
++++ HiRes Start 1226580425.64654
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_17  WORKDIR=\epoc32\rombuild\imaker_temp/conf_39
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_17'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_17/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_17/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_17/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(37): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r10' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(38): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r51' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(39): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r76' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(40): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r83' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\10\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\51\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\76\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\83\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0010' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0051' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0076' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0083' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0010' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0051' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0076' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0083' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0010' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0051' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0076' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0083' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0010' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0051' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0076' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0083' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0010' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0051' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0076' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0083' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0010' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0051' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0076' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0083' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 268 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1854 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2014 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2366 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2389 ignored
+ 9) WARNING: Unknown keyword ''.  Line 268 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+11) WARNING: Unknown keyword '***'.  Line 1854 ignored
+12) WARNING: Unknown keyword '***'.  Line 2014 ignored
+13) WARNING: Unknown keyword '***'.  Line 2366 ignored
+14) WARNING: Unknown keyword '***'.  Line 2389 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580468.27127
+++ Finished at Thu Nov 13 14:47:48 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_18
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_18
+++ Started at Thu Nov 13 14:47:49 2008
++++ HiRes Start 1226580469.27126
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_18  WORKDIR=\epoc32\rombuild\imaker_temp/conf_40
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_18'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_18/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_18/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_18/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r33' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\33\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0033' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0033' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0033' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0033' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0033' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0033' in statement 'data='
+14) Y:\epoc32\rom\Variant\localized_resources.iby(905): Missing file: '\epoc32\data\Z\resource\CalenThaiPluginData.r33' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580502.8023
+++ Finished at Thu Nov 13 14:48:22 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_19
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_19
+++ Started at Thu Nov 13 14:48:23 2008
++++ HiRes Start 1226580503.52104
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_19  WORKDIR=\epoc32\rombuild\imaker_temp/conf_41
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_19'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_19/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_19/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_19/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r39' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\39\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0039' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0039' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0039' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0039' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0039' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0039' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580537.14583
+++ Finished at Thu Nov 13 14:48:57 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_20
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_20
+++ Started at Thu Nov 13 14:48:57 2008
++++ HiRes Start 1226580537.91145
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_20  WORKDIR=\epoc32\rombuild\imaker_temp/conf_42
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_20'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_20/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_20/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_20/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r01' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r96' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\96\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0096' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0096' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0096' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0001' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0096' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0096' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0001' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0096' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(310): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\contents.zip' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(311): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\index.xml' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(312): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\keywords.xml' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(313): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10281BA0\meta.xml' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(326): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\contents.zip' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(327): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\index.xml' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(328): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\keywords.xml' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\customer\app\S60helps_variant.iby(329): Missing file: '\epoc32\data\Z\resource\xhtml\01\0x10282411\meta.xml' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1092 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1188 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1398 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1411 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 826 ignored
+11) WARNING: Unknown keyword '***'.  Line 1092 ignored
+12) WARNING: Unknown keyword '***'.  Line 1188 ignored
+13) WARNING: Unknown keyword '***'.  Line 1398 ignored
+14) WARNING: Unknown keyword '***'.  Line 1411 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580571.02061
+++ Finished at Thu Nov 13 14:49:31 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_22
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_22
+++ Started at Thu Nov 13 14:49:31 2008
++++ HiRes Start 1226580571.72373
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_22  WORKDIR=\epoc32\rombuild\imaker_temp/conf_43
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_22'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_22/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_22/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_22/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(37): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r159' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(38): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r31' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(39): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r326' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(40): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r327' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\159\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\31\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\326\appshelldata.dtd' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\327\appshelldata.dtd' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0159' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0031' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0326' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0327' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(47): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0159' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(48): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0031' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(49): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0326' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0327' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(60): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0159' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(61): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0031' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0326' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0327' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0159' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0031' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0326' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0327' in statement 'data='
+25) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0159' in statement 'data='
+26) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0031' in statement 'data='
+27) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0326' in statement 'data='
+28) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(79): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0327' in statement 'data='
+29) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(84): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0159' in statement 'data='
+30) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(85): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0031' in statement 'data='
+31) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(86): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0326' in statement 'data='
+32) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(87): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0327' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 268 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1854 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 2014 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 2366 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 2389 ignored
+ 9) WARNING: Unknown keyword ''.  Line 268 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1406 ignored
+11) WARNING: Unknown keyword '***'.  Line 1854 ignored
+12) WARNING: Unknown keyword '***'.  Line 2014 ignored
+13) WARNING: Unknown keyword '***'.  Line 2366 ignored
+14) WARNING: Unknown keyword '***'.  Line 2389 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580610.19224
+++ Finished at Thu Nov 13 14:50:10 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_23
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_23
+++ Started at Thu Nov 13 14:50:11 2008
++++ HiRes Start 1226580611.27035
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_23  WORKDIR=\epoc32\rombuild\imaker_temp/conf_44
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_23'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_23/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_23/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_23/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(32): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r158' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(33): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r30' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(34): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r31' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\158\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(38): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\30\appshelldata.dtd' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\31\appshelldata.dtd' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0158' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0030' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(43): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0031' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(44): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0158' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(45): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0030' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(46): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0031' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(55): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0158' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0030' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0031' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0158' in statement 'data='
+17) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0030' in statement 'data='
+18) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(64): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0031' in statement 'data='
+19) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0158' in statement 'data='
+20) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(70): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0030' in statement 'data='
+21) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(71): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0031' in statement 'data='
+22) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(76): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0158' in statement 'data='
+23) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(77): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0030' in statement 'data='
+24) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(78): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0031' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 217 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1117 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1474 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1602 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1883 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1901 ignored
+ 9) WARNING: Unknown keyword ''.  Line 217 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 1117 ignored
+11) WARNING: Unknown keyword '***'.  Line 1474 ignored
+12) WARNING: Unknown keyword '***'.  Line 1602 ignored
+13) WARNING: Unknown keyword '***'.  Line 1883 ignored
+14) WARNING: Unknown keyword '***'.  Line 1901 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580648.41074
+++ Finished at Thu Nov 13 14:50:48 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_24
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_24
+++ Started at Thu Nov 13 14:50:49 2008
++++ HiRes Start 1226580649.25449
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_24  WORKDIR=\epoc32\rombuild\imaker_temp/conf_45
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_24'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_24/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_24/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_24/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r157' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r29' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(36): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\157\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\29\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0157' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0029' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0157' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0029' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0157' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0029' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0157' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0029' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0157' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0029' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0157' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0029' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1094 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1190 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1400 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1413 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+11) WARNING: Unknown keyword '***'.  Line 1094 ignored
+12) WARNING: Unknown keyword '***'.  Line 1190 ignored
+13) WARNING: Unknown keyword '***'.  Line 1400 ignored
+14) WARNING: Unknown keyword '***'.  Line 1413 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580682.41052
+++ Finished at Thu Nov 13 14:51:22 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_25
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_25
+++ Started at Thu Nov 13 14:51:23 2008
++++ HiRes Start 1226580683.06677
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_25  WORKDIR=\epoc32\rombuild\imaker_temp/conf_46
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_25'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_25/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_25/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_25/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r159' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r31' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(36): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\159\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\31\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0159' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0031' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0159' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0031' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0159' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0031' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0159' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0031' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0159' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0031' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0159' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0031' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1094 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1190 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1400 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1413 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+11) WARNING: Unknown keyword '***'.  Line 1094 ignored
+12) WARNING: Unknown keyword '***'.  Line 1190 ignored
+13) WARNING: Unknown keyword '***'.  Line 1400 ignored
+14) WARNING: Unknown keyword '***'.  Line 1413 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580714.37907
+++ Finished at Thu Nov 13 14:51:54 2008
+=== config_2 == configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_27
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=image ... langpack_27
+++ Started at Thu Nov 13 14:51:55 2008
++++ HiRes Start 1226580715.05094
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=image "TYPE=subcon"  langpack_27  WORKDIR=\epoc32\rombuild\imaker_temp/conf_47
+iMaker 08.43.01, 20-Oct-2008.
+Variant target             USE_VARIANTBLD = `2'
+Variant directory          VARIANT_DIR    = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_27'
+Variant config makefile    VARIANT_MK     = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_27/language_variant.mk'
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `Y:/epoc32/rom/config/platform/devlon52/language/langpack_27/variant.confml'
+Variant CenRep configs     VARIANT_CONFCP = `5251  devlon52  variant'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `y:\output/release_flash_images/devlon52/subcon/langpack/langpack_27/variant'
+Calling S60 Configuration Tool
+Generating file(s) for ROFS2 image creation
+Generating language files for Language Package image creation
+Creating ROFS2 SOS image
+
+Missing file(s):
+ 1) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(27): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r160' in statement 'data='
+ 2) ..\..\..\..\..\..\epoc32\rom\include\language\app\IpVideoResources.iby(28): Missing file: '\epoc32\data\Z\resource\apps\vcxnsappui_test.r32' in statement 'data='
+ 3) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(36): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\160\appshelldata.dtd' in statement 'data='
+ 4) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(37): Missing file: '\epoc32\data\Z\Private\101F4CD2\Content\32\appshelldata.dtd' in statement 'data='
+ 5) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(39): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0160' in statement 'data='
+ 6) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(40): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067333\1.0\hasclassicgrid.o0032' in statement 'data='
+ 7) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(41): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0160' in statement 'data='
+ 8) ..\..\..\..\..\..\epoc32\rom\include\language\app\menu3_resources.iby(42): Missing file: '\epoc32\data\Z\Private\10207254\themes\270486738\270513751\271067334\1.0\hasclassiclist.o0032' in statement 'data='
+ 9) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(50): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0160' in statement 'data='
+10) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(51): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063149\1.0\AI.o0032' in statement 'data='
+11) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(56): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0160' in statement 'data='
+12) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(57): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063148\1.0\BI.o0032' in statement 'data='
+13) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(62): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0160' in statement 'data='
+14) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(63): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271063147\1.0\CI.o0032' in statement 'data='
+15) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(68): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0160' in statement 'data='
+16) ..\..\..\..\..\..\epoc32\rom\include\language\mw\activeidle2_resources.iby(69): Missing file: '\epoc32\data\Z\Private\10207254\themes\271012080\270513751\271068379\1.0\FT.o0032' in statement 'data='
+
+Warning(s):
+ 1) Y:\epoc32\include\config\platform\devlon52\ncp_feature_settings.hrh:38: warning: `DEVLON52' redefined
+ 2) *Initialization*:1: warning: this is the location of the previous definition
+ 3) WARNING: Unknown keyword ''.  Line 166 ignored
+ 4) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+ 5) WARNING: Unknown keyword '***'.  Line 1094 ignored
+ 6) WARNING: Unknown keyword '***'.  Line 1190 ignored
+ 7) WARNING: Unknown keyword '***'.  Line 1400 ignored
+ 8) WARNING: Unknown keyword '***'.  Line 1413 ignored
+ 9) WARNING: Unknown keyword ''.  Line 166 ignored
+10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 828 ignored
+11) WARNING: Unknown keyword '***'.  Line 1094 ignored
+12) WARNING: Unknown keyword '***'.  Line 1190 ignored
+13) WARNING: Unknown keyword '***'.  Line 1400 ignored
+14) WARNING: Unknown keyword '***'.  Line 1413 ignored
+Creating ROFS2 symbol file
++++ HiRes End 1226580747.58198
+++ Finished at Thu Nov 13 14:52:27 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... core
+++ Started at Thu Nov 13 14:52:28 2008
++++ HiRes Start 1226580748.17016
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  core  WORKDIR=\epoc32\rombuild\imaker_temp/conf_24
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_core] Error 1 (ignored)
++++ HiRes End 1226580748.32641
+++ Finished at Thu Nov 13 14:52:28 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_01
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_01
+++ Started at Thu Nov 13 14:52:28 2008
++++ HiRes Start 1226580748.42015
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_01  WORKDIR=\epoc32\rombuild\imaker_temp/conf_25
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_01] Error 1 (ignored)
++++ HiRes End 1226580748.5764
+++ Finished at Thu Nov 13 14:52:28 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_02
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_02
+++ Started at Thu Nov 13 14:52:28 2008
++++ HiRes Start 1226580748.67015
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_02  WORKDIR=\epoc32\rombuild\imaker_temp/conf_26
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_02] Error 1 (ignored)
++++ HiRes End 1226580748.84202
+++ Finished at Thu Nov 13 14:52:28 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_03
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_03
+++ Started at Thu Nov 13 14:52:28 2008
++++ HiRes Start 1226580748.93576
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_03  WORKDIR=\epoc32\rombuild\imaker_temp/conf_27
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_03] Error 1 (ignored)
++++ HiRes End 1226580749.09201
+++ Finished at Thu Nov 13 14:52:29 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_04
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_04
+++ Started at Thu Nov 13 14:52:29 2008
++++ HiRes Start 1226580749.18576
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_04  WORKDIR=\epoc32\rombuild\imaker_temp/conf_28
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_04] Error 1 (ignored)
++++ HiRes End 1226580749.342
+++ Finished at Thu Nov 13 14:52:29 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_05
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_05
+++ Started at Thu Nov 13 14:52:29 2008
++++ HiRes Start 1226580749.43575
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_05  WORKDIR=\epoc32\rombuild\imaker_temp/conf_29
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_05] Error 1 (ignored)
++++ HiRes End 1226580749.592
+++ Finished at Thu Nov 13 14:52:29 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_06
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_06
+++ Started at Thu Nov 13 14:52:29 2008
++++ HiRes Start 1226580749.68575
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_06  WORKDIR=\epoc32\rombuild\imaker_temp/conf_30
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_06] Error 1 (ignored)
++++ HiRes End 1226580749.85762
+++ Finished at Thu Nov 13 14:52:29 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_07
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_07
+++ Started at Thu Nov 13 14:52:29 2008
++++ HiRes Start 1226580749.95136
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_07  WORKDIR=\epoc32\rombuild\imaker_temp/conf_31
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_07] Error 1 (ignored)
++++ HiRes End 1226580750.10761
+++ Finished at Thu Nov 13 14:52:30 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_08
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_08
+++ Started at Thu Nov 13 14:52:30 2008
++++ HiRes Start 1226580750.20136
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_08  WORKDIR=\epoc32\rombuild\imaker_temp/conf_32
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_08] Error 1 (ignored)
++++ HiRes End 1226580750.3576
+++ Finished at Thu Nov 13 14:52:30 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_09
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_09
+++ Started at Thu Nov 13 14:52:30 2008
++++ HiRes Start 1226580750.45135
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_09  WORKDIR=\epoc32\rombuild\imaker_temp/conf_33
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_09] Error 1 (ignored)
++++ HiRes End 1226580750.62322
+++ Finished at Thu Nov 13 14:52:30 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_11
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_11
+++ Started at Thu Nov 13 14:52:30 2008
++++ HiRes Start 1226580750.71697
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_11  WORKDIR=\epoc32\rombuild\imaker_temp/conf_34
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_11] Error 1 (ignored)
++++ HiRes End 1226580750.87322
+++ Finished at Thu Nov 13 14:52:30 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_12
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_12
+++ Started at Thu Nov 13 14:52:30 2008
++++ HiRes Start 1226580750.96696
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_12  WORKDIR=\epoc32\rombuild\imaker_temp/conf_35
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_12] Error 1 (ignored)
++++ HiRes End 1226580751.12321
+++ Finished at Thu Nov 13 14:52:31 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_13
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_13
+++ Started at Thu Nov 13 14:52:31 2008
++++ HiRes Start 1226580751.21696
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_13  WORKDIR=\epoc32\rombuild\imaker_temp/conf_36
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_13] Error 1 (ignored)
++++ HiRes End 1226580751.3732
+++ Finished at Thu Nov 13 14:52:31 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_14
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_14
+++ Started at Thu Nov 13 14:52:31 2008
++++ HiRes Start 1226580751.46695
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_14  WORKDIR=\epoc32\rombuild\imaker_temp/conf_37
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_14] Error 1 (ignored)
++++ HiRes End 1226580751.63882
+++ Finished at Thu Nov 13 14:52:31 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_16
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_16
+++ Started at Thu Nov 13 14:52:31 2008
++++ HiRes Start 1226580751.73257
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_16  WORKDIR=\epoc32\rombuild\imaker_temp/conf_38
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_16] Error 1 (ignored)
++++ HiRes End 1226580751.88881
+++ Finished at Thu Nov 13 14:52:31 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_17
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_17
+++ Started at Thu Nov 13 14:52:31 2008
++++ HiRes Start 1226580751.98256
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_17  WORKDIR=\epoc32\rombuild\imaker_temp/conf_39
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_17] Error 1 (ignored)
++++ HiRes End 1226580752.13881
+++ Finished at Thu Nov 13 14:52:32 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_18
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_18
+++ Started at Thu Nov 13 14:52:32 2008
++++ HiRes Start 1226580752.23255
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_18  WORKDIR=\epoc32\rombuild\imaker_temp/conf_40
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_18] Error 1 (ignored)
++++ HiRes End 1226580752.3888
+++ Finished at Thu Nov 13 14:52:32 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_19
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_19
+++ Started at Thu Nov 13 14:52:32 2008
++++ HiRes Start 1226580752.48255
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_19  WORKDIR=\epoc32\rombuild\imaker_temp/conf_41
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_19] Error 1 (ignored)
++++ HiRes End 1226580752.65442
+++ Finished at Thu Nov 13 14:52:32 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_20
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_20
+++ Started at Thu Nov 13 14:52:32 2008
++++ HiRes Start 1226580752.76379
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_20  WORKDIR=\epoc32\rombuild\imaker_temp/conf_42
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_20] Error 1 (ignored)
++++ HiRes End 1226580752.93566
+++ Finished at Thu Nov 13 14:52:32 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_22
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_22
+++ Started at Thu Nov 13 14:52:32 2008
++++ HiRes Start 1226580753.02941
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_22  WORKDIR=\epoc32\rombuild\imaker_temp/conf_43
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_22] Error 1 (ignored)
++++ HiRes End 1226580753.18566
+++ Finished at Thu Nov 13 14:52:33 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_23
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_23
+++ Started at Thu Nov 13 14:52:33 2008
++++ HiRes Start 1226580753.2794
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_23  WORKDIR=\epoc32\rombuild\imaker_temp/conf_44
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_23] Error 1 (ignored)
++++ HiRes End 1226580753.43565
+++ Finished at Thu Nov 13 14:52:33 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_24
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_24
+++ Started at Thu Nov 13 14:52:33 2008
++++ HiRes Start 1226580753.5294
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_24  WORKDIR=\epoc32\rombuild\imaker_temp/conf_45
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_24] Error 1 (ignored)
++++ HiRes End 1226580753.70127
+++ Finished at Thu Nov 13 14:52:33 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_25
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_25
+++ Started at Thu Nov 13 14:52:33 2008
++++ HiRes Start 1226580753.77939
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_25  WORKDIR=\epoc32\rombuild\imaker_temp/conf_46
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_25] Error 1 (ignored)
++++ HiRes End 1226580753.95126
+++ Finished at Thu Nov 13 14:52:33 2008
+=== config_2 == signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_27
+-- imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk HELIUM_EC=signing ... langpack_27
+++ Started at Thu Nov 13 14:52:34 2008
++++ HiRes Start 1226580754.04501
+imaker -f /epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk -f /epoc32/rom/config/helium_ec_image.mk HELIUM_EC=signing "TYPE=subcon"  langpack_27  WORKDIR=\epoc32\rombuild\imaker_temp/conf_47
+iMaker 08.43.01, 20-Oct-2008.
+Warning: Use of uninitialized value in pattern match (m//) at \epoc32\tools\rom\imaker\imaker.pl line 41.
+Warning: Use of uninitialized value in concatenation (.) or string at \epoc32\tools\rom\imaker\imaker.pl line 43.
+*** Error: Can't run `\epoc32\tools\rom\imaker\mingw_make.exe' properly:
+make: [signing_configuration2_/epoc32/rom/config/platform/devlon52/image_conf_devlon52_ui.mk_langpack_27] Error 1 (ignored)
++++ HiRes End 1226580754.20125
+++ Finished at Thu Nov 13 14:52:34 2008
+Finished build: 839   Duration: 41:09 (m:s)   Cluster availability: 100%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/log2xml_test.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,468 @@
+     [exec] === Stage=mceraseuda == mceraseuda
+     [exec] ++ Started at Mon Sep 17 06:36:19 2007
+     [exec] +++ HiRes Start 1190000179.23461
+     [exec] =========== Configuration =================
+     [exec] PRODUCT:  product
+     [exec] WORKNAME: q:\output\development_flash_images\engineering_english/product\product_0.0738.3.X.201
+     [exec] TYPE:     rnd
+     [exec] ===========================================
+     [exec] *** Error: Can't read iMaker command file `/output/development_flash_images/engineering_english/product/product_0.0738.3.X.201_udaerase.icmd'.
+     [exec] mingw_make.exe[1]: *** [udaerase] Error 1
+     [exec] mingw_make.exe: *** [eraseudarnd] Error 2
+     [exec] Unzipping variation western...
+     [exec] unzip -o -qq -d / /output/build_area/localised/delta_western_package.zip
+     [exec] === Stage=flashuirnd == flashuirnd
+     [exec] ++ Started at Mon Sep 17 06:36:19 2007
+     [exec] +++ HiRes Start 1190000179.95337
+     [exec] =========== Configuration =================
+     [exec] PRODUCT          : product
+     [exec] TYPE             : rnd
+     [exec] NAME             : mc_5132_0.0738.3.X.201_rnd_ui
+     [exec] USE_OVERRIDE     : 1
+     [exec] BLDROM_OBY       : \epoc32\rom\master.oby /epoc32/rom/ppd.oby /epoc32/rom/rnd.oby
+     [exec] BLDROM_OPTION    : -p -v -nosymbols -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -Dproduct -D_ASIC_VER_11 -DUSE_MULTIROFS -es60ibymacros -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS  q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby    -eoverride 
+     [exec] WORKDIR          : q:\output\development_flash_images\engineering_english/product/rnd
+     [exec] UDEBFILE         : 0
+     [exec] UDEBFILE_LIST    : 
+     [exec] USE_FOTI         : 
+     [exec] USE_FOTA         : 
+     [exec] PREBUILD_STEPS   :  
+     [exec] SOSCORE_VERSION  : 0.0738.3.0.201
+     [exec] SOSROFS1_VERSION : 0.0738.3.0.201	
+     [exec] SOSROFS2_VERSION : 0.0738.3.0.201.ee
+     [exec] SOSROFS3_VERSION : 0.0738.3.0.201.ee
+     [exec] ENABLE_ROMSYMBOL : 1
+     [exec] ===========================================
+     [exec] iMaker - The Image Maker, version 07.34.04, 24-Aug-2007.
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_sw.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_model.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby
+     [exec] Generating header iby for Core ROM image creation
+     [exec] Generating header iby for Core ROFS1 image creation
+     [exec] Generating Core FWID txt file
+     [exec] Generating Core FWID iby file
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_sw.txt
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_model.txt
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_core_fwid.iby
+     [exec] Generating full Core ROM oby
+     [exec] 
+     [exec] Missing file(s):
+     [exec]  1) ..\..\epoc32\rom\include\ssc.iby(31): Missing file: '\epoc32\release\ARMV5\urel\ssc.ext' in statement 'extension[0x09080004]='
+     [exec]  2) ..\..\epoc32\rom\include\SWATI_Symbian_Tools.iby(163): Missing file: '\epoc32\release\ARMV5\urel\MobileCrashTimer.exe' in statement 'file='
+     [exec]  3) ..\..\epoc32\rom\include\PhoneCntFinderExt.iby(24): Missing file: '\epoc32\data\Z\System\install\phcntvoicerecoghandler_stub.SIS' in statement 'data='
+     [exec]  4) ..\..\epoc32\rom\include\screensaver.iby(24): Missing file: '\epoc32\release\ARMV5\urel\screensaver.product.exe' in statement 'file='
+     [exec]  5) ..\..\epoc32\rom\include\eSWT.iby(44): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\odc\eswt-core.jar' in statement 'data='
+     [exec]  6) ..\..\epoc32\rom\include\eSWT.iby(45): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\odc\esw.jar' in statement 'data='
+     [exec]  7) ..\..\epoc32\rom\include\eSWT.iby(46): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\odc\eswt-expanded.jar' in statement 'data='
+     [exec]  8) ..\..\epoc32\rom\include\eSWT.iby(49): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\eswt-core.odc' in statement 'data='
+     [exec]  9) ..\..\epoc32\rom\include\eSWT.iby(50): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\esw.odc' in statement 'data='
+     [exec] 10) ..\..\epoc32\rom\include\eSWT.iby(51): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\eswt-expanded.odc' in statement 'data='
+     [exec] 11) ..\..\epoc32\rom\include\advancedtspcontroller.iby(24): Missing file: '\epoc32\release\ARMV5\urel\AdvancedTspController.dll' in statement 'file='
+     [exec] 12) ..\..\epoc32\rom\include\.oby(30): Missing file: '\epoc32\data\Z\System\install\enh_drv.sis' in statement 'data='
+     [exec] 13) ..\..\epoc32\rom\include\d2d.iby(22): Missing file: '\epoc32\release\ARMV5\urel\d2dwlanconnector.dll' in statement 'file='
+     [exec] 14) ..\..\epoc32\rom\include\sysaplightpluginsource.iby(25): Missing file: '\epoc32\release\ARMV5\urel\sysaplightpluginsource.dll' in statement 'file='
+     [exec] 15) ..\..\epoc32\rom\include\animplugin.iby(8): Missing file: '\epoc32\release\ARMV5\urel\KeyCapturerPlugin.dll' in statement 'file='
+     [exec] 16) ..\..\epoc32\rom\include\OnlinePrint.iby(25): Missing file: '\epoc32\data\Z\system\install\OnlinePrint.sis' in statement 'data='
+     [exec] 17) ..\..\epoc32\rom\include\msync.iby(30): Missing file: '\epoc32\release\ARMV5\urel\msyncpluginmedia.dll' in statement 'file='
+     [exec] 18) ..\..\epoc32\rom\include\msync.iby(31): Missing file: '\epoc32\release\ARMV5\urel\msyncpluginmessaging.dll' in statement 'file='
+     [exec] 19) q:outputdevelopment_flash_images\033ngineering_english\product\rnd\mc_5132_0.0738.3.X.201_rnd_ui_core_fwid.iby(6): Missing file: 'q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_fwid1.txt' in statement 'data='
+     [exec] 
+     [exec] Warning(s):
+     [exec]  1) WARNING: Unknown keyword '/'.  Line 193 ignored
+     [exec]  2) WARNING: Unknown keyword 'ROFS_HEADER'.  Line 212 ignored
+     [exec]  3) WARNING: Unknown keyword '..\data\VoiceRecorder_stub.SIS'.  Line 3242 ignored
+     [exec]  4) WARNING: Unknown keyword '***'.  Line 3580 ignored
+     [exec]  5) WARNING: Unknown keyword ';;'.  Line 7183 ignored
+     [exec]  6) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7817 ignored
+     [exec]  7) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7827 ignored
+     [exec]  8) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7832 ignored
+     [exec]  9) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7836 ignored
+     [exec] 10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7842 ignored
+     [exec] 11) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7864 ignored
+     [exec] 
+     [exec] Error(s):
+     [exec] 1) ERROR: Override target \private\101fe1db\usbman.rsc was not found!
+     [exec] 2) ERROR: Override target private\10207254\themes\271012080\270513751\271063147\1.0\ci.o0001 was not found!
+     [exec] 3) ERROR: Override target resource\versions\langsw.txt was not found!
+     [exec] 4) ERROR: Override target private\10207254\themes\271012080\270513751\271063149\1.0\ai.o0001 was not found!
+     [exec] 5) ERROR: Override target resource\apps\startup.rsc was not found!
+     [exec] Creating Core ROM image
+     [exec] * cpp -o tmp1.oby -nostdinc -undef -I "..\..\..\..\..\EPOC32\include\oem\" -include "..\..\..\..\..\EPOC32\include\oem\feature_settings.hrh" -I. -I../../../../../epoc32/rom/include
+     [exec] * reading q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_rom_hdr.iby
+     [exec] * reading q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_rom_split.oby
+     [exec] * Writing tmp2.oby - result of substitution phase
+     [exec] * Writing tmp3.oby - result of reorganisation phase
+     [exec] * Writing tmp4.oby - result of Plugin stage
+     [exec] * No language codes specified, defaulting to 01
+     [exec] * Writing tmp5.oby - result of choosing language-specific files
+     [exec] * Writing tmp6.oby - result of SPI stage
+     [exec] configpaging.pm: Modifying demand paging configuration using \epoc32\rom\configpaging\configpaging.cfg
+     [exec] * Writing tmp7.oby - result of problem-suppression phase
+     [exec] * Writing tmp8.oby - result of bitmap conversion phase
+     [exec] * Removing previous image and logs...
+     [exec] * Writing tmp9.oby - result of cleaning phase
+     [exec] * Writing mc_5132_0.0738.3.X.201_rnd_ui.rom.oby - final OBY file
+     [exec] * Writing mc_5132_0.0738.3.X.201_rnd_ui.rom.dir - ROM directory listing
+     [exec] * Compression method: NONE
+     [exec] * Executing rombuild -slog  -type-safe-link -geninc -no-header mc_5132_0.0738.3.X.201_rnd_ui.rom.oby
+     [exec] 
+     [exec] ROMBUILD - Rom builder V2.07 (Build 576)
+     [exec] = Software Ltd.
+     [exec] 
+     [exec] WARNING: Unknown keyword '..\data\VoiceRecorder_stub.SIS'.  Line 1249 ignored
+     [exec] WARNING: Unknown keyword '***'.  Line 1408 ignored
+     [exec] WARNING: Unknown keyword ';;'.  Line 2891 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3100 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3104 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3106 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3108 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3111 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3118 ignored
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	armutilities_11.dll (UID3:102749fe HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	armprocessengine_11.dll (UID3:1020db93 HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\glxuiutilities.dll (UID3:20000a08 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	glxtvout.dll (UID3:2000a7bc HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: LoadContents failed - return code -1
+     [exec] 
+     [exec] ROMBUILD - Rom builder V2.07 (Build 576)
+     [exec] = Software Ltd.
+     [exec] 
+     [exec] WARNING: Unknown keyword '..\data\VoiceRecorder_stub.SIS'.  Line 1249 ignored
+     [exec] WARNING: Unknown keyword '***'.  Line 1408 ignored
+     [exec] WARNING: Unknown keyword ';;'.  Line 2891 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3100 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3104 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3106 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3108 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3111 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3118 ignored
+     [exec] ERROR: Can't build dependence graph for
+     [exec] *** Error: (S:COREBLDROM,C:1,B:1,K:0,V:1): Command `(perl /epoc32/tools/buildrom.pl -v -nosymbols -omc_5132_0.0738.3.X.201_rnd_ui.rom.img q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_rom_hdr.iby q:\output\development_flash_images\engineering_english/product/rnd/mc_5132_0.0738.3.X.201_rnd_ui_rom_split.oby)' failed.
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] mingw_make.exe[1]: *** [flash] Error 1
+     [exec] because
+     [exec] 	armutilities_11.dll (UID3:102749fe HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	armprocessengine_11.dll (UID3:1020db93 HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\glxuiutilities.dll (UID3:20000a08 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	glxtvout.dll (UID3:2000a7bc HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: LoadContents failed - return code -1
+     [exec] * ROMBUILD failed
+     [exec] 
+     [exec] Creating Core ROM symbol file
+     [exec] 
+     [exec] Total duration: 03:13
+     [exec] mingw_make.exe: [flashuirnd] Error 2 (ignored)
+     [exec] +++ HiRes End 1190000371.08327
+     [exec] ++ Finished at Mon Sep 17 06:39:31 2007
+     [exec] === Stage=flashuiprd == flashuiprd
+     [exec] ++ Started at Mon Sep 17 06:39:31 2007
+     [exec] +++ HiRes Start 1190000371.22389
+     [exec] =========== Configuration =================
+     [exec] PRODUCT          : product
+     [exec] TYPE             : prd
+     [exec] NAME             : mc_5132_0.0738.3.X.201_prd_ui
+     [exec] USE_OVERRIDE     : 1
+     [exec] BLDROM_OBY       : \epoc32\rom\master.oby /epoc32/rom/ppd.oby 
+     [exec] BLDROM_OPTION    : -p -v -nosymbols -D_IMAGE_TYPE_PRD -D_EABI=ARMV5 -Dproduct -D_ASIC_VER_11 -DUSE_MULTIROFS -es60ibymacros -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS  q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby    -eoverride 
+     [exec] WORKDIR          : q:\output\development_flash_images\engineering_english/product/prd
+     [exec] UDEBFILE         : 0
+     [exec] UDEBFILE_LIST    : 
+     [exec] USE_FOTI         : 
+     [exec] USE_FOTA         : 
+     [exec] PREBUILD_STEPS   :  
+     [exec] SOSCORE_VERSION  : 0.0738.3.0.201
+     [exec] SOSROFS1_VERSION : 0.0738.3.0.201	
+     [exec] SOSROFS2_VERSION : 0.0738.3.0.201.ee
+     [exec] SOSROFS3_VERSION : 0.0738.3.0.201.ee
+     [exec] ENABLE_ROMSYMBOL : 1
+     [exec] ===========================================
+     [exec] iMaker - The Image Maker, version 07.34.04, 24-Aug-2007.
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_sw.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_model.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby
+     [exec] Generating header iby for Core ROM image creation
+     [exec] Generating header iby for Core ROFS1 image creation
+     [exec] Generating Core FWID txt file
+     [exec] Generating Core FWID iby file
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_sw.txt
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_model.txt
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_core_fwid.iby
+     [exec] Generating full Core ROM oby
+     [exec] 
+     [exec] Missing file(s):
+     [exec]  1) ..\..\epoc32\rom\include\ssc.iby(31): Missing file: '\epoc32\release\ARMV5\urel\ssc.ext' in statement 'extension[0x09080004]='
+     [exec]  2) ..\..\epoc32\rom\include\SWATI_Symbian_Tools.iby(163): Missing file: '\epoc32\release\ARMV5\urel\MobileCrashTimer.exe' in statement 'file='
+     [exec]  3) ..\..\epoc32\rom\include\PhoneCntFinderExt.iby(24): Missing file: '\epoc32\data\Z\System\install\phcntvoicerecoghandler_stub.SIS' in statement 'data='
+     [exec]  4) ..\..\epoc32\rom\include\screensaver.iby(24): Missing file: '\epoc32\release\ARMV5\urel\screensaver.product.exe' in statement 'file='
+     [exec]  5) ..\..\epoc32\rom\include\eSWT.iby(44): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\odc\eswt-core.jar' in statement 'data='
+     [exec]  6) ..\..\epoc32\rom\include\eSWT.iby(45): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\odc\esw.jar' in statement 'data='
+     [exec]  7) ..\..\epoc32\rom\include\eSWT.iby(46): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\odc\eswt-expanded.jar' in statement 'data='
+     [exec]  8) ..\..\epoc32\rom\include\eSWT.iby(49): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\eswt-core.odc' in statement 'data='
+     [exec]  9) ..\..\epoc32\rom\include\eSWT.iby(50): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\esw.odc' in statement 'data='
+     [exec] 10) ..\..\epoc32\rom\include\eSWT.iby(51): Missing file: '\epoc32\RELEASE\ARMV5\UREL\Z\Resource\ive\lib\jclcldc11\ext\eswt-expanded.odc' in statement 'data='
+     [exec] 11) ..\..\epoc32\rom\include\advancedtspcontroller.iby(24): Missing file: '\epoc32\release\ARMV5\urel\AdvancedTspController.dll' in statement 'file='
+     [exec] 12) ..\..\epoc32\rom\include\.oby(30): Missing file: '\epoc32\data\Z\System\install\enh_drv.sis' in statement 'data='
+     [exec] 13) ..\..\epoc32\rom\include\d2d.iby(22): Missing file: '\epoc32\release\ARMV5\urel\d2dwlanconnector.dll' in statement 'file='
+     [exec] 14) ..\..\epoc32\rom\include\sysaplightpluginsource.iby(25): Missing file: '\epoc32\release\ARMV5\urel\sysaplightpluginsource.dll' in statement 'file='
+     [exec] 15) ..\..\epoc32\rom\include\animplugin.iby(8): Missing file: '\epoc32\release\ARMV5\urel\KeyCapturerPlugin.dll' in statement 'file='
+     [exec] 16) ..\..\epoc32\rom\include\OnlinePrint.iby(25): Missing file: '\epoc32\data\Z\system\install\OnlinePrint.sis' in statement 'data='
+     [exec] 17) ..\..\epoc32\rom\include\msync.iby(30): Missing file: '\epoc32\release\ARMV5\urel\msyncpluginmedia.dll' in statement 'file='
+     [exec] 18) ..\..\epoc32\rom\include\msync.iby(31): Missing file: '\epoc32\release\ARMV5\urel\msyncpluginmessaging.dll' in statement 'file='
+     [exec] 19) q:outputdevelopment_flash_images\033ngineering_english\product\prd\mc_5132_0.0738.3.X.201_prd_ui_core_fwid.iby(6): Missing file: 'q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_fwid1.txt' in statement 'data='
+     [exec] 
+     [exec] Warning(s):
+     [exec]  1) WARNING: Unknown keyword '/'.  Line 193 ignored
+     [exec]  2) WARNING: Unknown keyword 'ROFS_HEADER'.  Line 212 ignored
+     [exec]  3) WARNING: Unknown keyword '..\data\VoiceRecorder_stub.SIS'.  Line 3242 ignored
+     [exec]  4) WARNING: Unknown keyword '***'.  Line 3580 ignored
+     [exec]  5) WARNING: Unknown keyword ';;'.  Line 7183 ignored
+     [exec]  6) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7817 ignored
+     [exec]  7) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7827 ignored
+     [exec]  8) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7832 ignored
+     [exec]  9) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7836 ignored
+     [exec] 10) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7842 ignored
+     [exec] 11) WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 7864 ignored
+     [exec] 
+     [exec] Error(s):
+     [exec] 1) ERROR: Override target \private\101fe1db\usbman.rsc was not found!
+     [exec] 2) ERROR: Override target private\10207254\themes\271012080\270513751\271063147\1.0\ci.o0001 was not found!
+     [exec] 3) ERROR: Override target resource\versions\langsw.txt was not found!
+     [exec] 4) ERROR: Override target private\10207254\themes\271012080\270513751\271063149\1.0\ai.o0001 was not found!
+     [exec] 5) ERROR: Override target resource\apps\startup.rsc was not found!
+     [exec] Creating Core ROM image
+     [exec] * cpp -o tmp1.oby -nostdinc -undef -I "..\..\..\..\..\EPOC32\include\oem\" -include "..\..\..\..\..\EPOC32\include\oem\feature_settings.hrh" -I. -I../../../../../epoc32/rom/include
+     [exec] * reading q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_rom_hdr.iby
+     [exec] * reading q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_rom_split.oby
+     [exec] * Writing tmp2.oby - result of substitution phase
+     [exec] * Writing tmp3.oby - result of reorganisation phase
+     [exec] * Writing tmp4.oby - result of Plugin stage
+     [exec] * No language codes specified, defaulting to 01
+     [exec] * Writing tmp5.oby - result of choosing language-specific files
+     [exec] * Writing tmp6.oby - result of SPI stage
+     [exec] configpaging.pm: Modifying demand paging configuration using \epoc32\rom\configpaging\configpaging.cfg
+     [exec] * Writing tmp7.oby - result of problem-suppression phase
+     [exec] * Writing tmp8.oby - result of bitmap conversion phase
+     [exec] * Removing previous image and logs...
+     [exec] * Writing tmp9.oby - result of cleaning phase
+     [exec] * Writing mc_5132_0.0738.3.X.201_prd_ui.rom.oby - final OBY file
+     [exec] * Writing mc_5132_0.0738.3.X.201_prd_ui.rom.dir - ROM directory listing
+     [exec] * Compression method: NONE
+     [exec] * Executing rombuild -slog  -type-safe-link -geninc -no-header mc_5132_0.0738.3.X.201_prd_ui.rom.oby
+     [exec] 
+     [exec] ROMBUILD - Rom builder V2.07 (Build 576)
+     [exec] = Software Ltd.
+     [exec] 
+     [exec] WARNING: Unknown keyword '..\data\VoiceRecorder_stub.SIS'.  Line 1249 ignored
+     [exec] WARNING: Unknown keyword '***'.  Line 1408 ignored
+     [exec] WARNING: Unknown keyword ';;'.  Line 2891 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3100 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3104 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3106 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3108 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3111 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3118 ignored
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	armutilities_11.dll (UID3:102749fe HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	armprocessengine_11.dll (UID3:1020db93 HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\glxuiutilities.dll (UID3:20000a08 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	glxtvout.dll (UID3:2000a7bc HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: LoadContents failed - return code -1
+     [exec] 
+     [exec] ROMBUILD - Rom builder V2.07 (Build 576)
+     [exec] = Software Ltd.
+     [exec] 
+     [exec] WARNING: Unknown keyword '..\data\VoiceRecorder_stub.SIS'.  Line 1249 ignored
+     [exec] WARNING: Unknown keyword '***'.  Line 1408 ignored
+     [exec] WARNING: Unknown keyword ';;'.  Line 2891 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3100 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3104 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3106 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3108 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3111 ignored
+     [exec] WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 3118 ignored
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	armutilities_11.dll (UID3:102749fe HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\armh264enchwdevice_11.dll (UID3:20001c12 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] *** Error: (S:COREBLDROM,C:1,B:1,K:0,V:1): Command `(perl /epoc32/tools/buildrom.pl -v -nosymbols -omc_5132_0.0738.3.X.201_prd_ui.rom.img q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_rom_hdr.iby q:\output\development_flash_images\engineering_english/product/prd/mc_5132_0.0738.3.X.201_prd_ui_rom_split.oby)' failed.
+     [exec] 	armprocessengine_11.dll (UID3:1020db93 HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: Can't build dependence graph for
+     [exec] 	\epoc32\release\ARMV5\urel\glxuiutilities.dll (UID3:20000a08 HWVD:01000000 VER:10.0)
+     [exec] because
+     [exec] 	glxtvout.dll (UID3:2000a7bc HWVD:01000000 VER:10.0)
+     [exec] is not in rom.
+     [exec] ERROR: LoadContents failed - return code -1
+     [exec] * ROMBUILD failed
+     [exec] 
+     [exec] mingw_make.exe[1]: *** [flash] Error 1
+     [exec] Creating Core ROM symbol file
+     [exec] 
+     [exec] Total duration: 05:16
+     [exec] mingw_make.exe: [flashuiprd] Error 2 (ignored)
+     [exec] +++ HiRes End 1190000494.52393
+     [exec] ++ Finished at Mon Sep 17 06:41:34 2007
+     [exec] === Stage=mceraseuda == mceraseuda
+     [exec] ++ Started at Mon Sep 17 06:41:34 2007
+     [exec] +++ HiRes Start 1190000494.64893
+     [exec] =========== Configuration =================
+     [exec] PRODUCT:  product
+     [exec] WORKNAME: q:\output\development_flash_images\engineering_english/product\product_0.0738.3.X.201
+     [exec] TYPE:     prd
+     [exec] ===========================================
+     [exec] Generating UDA erase Elf2flash configuration
+     [exec] Creating flashable UDA erase image
+     [exec] 
+     [exec] Total duration: 05:17
+     [exec] +++ HiRes End 1190000495.28957
+     [exec] ++ Finished at Mon Sep 17 06:41:35 2007
+     [exec] mingw_make.exe: Target `ee_roms' not remade because of errors.
+     [exec] Result: 2
+     [exec] Unzipping variation western...
+     [exec] unzip -o -qq -d / /output/build_area/localised/delta_western_package.zip
+     [exec] === Stage=flashuirnd == flashuirnd
+     [exec] ++ Started at Mon Sep 17 06:41:35 2007
+     [exec] +++ HiRes Start 1190000495.74271
+     [exec] =========== Configuration =================
+     [exec] PRODUCT          : product_edge
+     [exec] TYPE             : rnd
+     [exec] NAME             : mc_5132_0.0738.3.X.201_rnd_ui
+     [exec] USE_OVERRIDE     : 1
+     [exec] BLDROM_OBY       : \epoc32\rom\master.oby /epoc32/rom/ppd.oby /epoc32/rom/rnd.oby
+     [exec] BLDROM_OPTION    : -p -v -nosymbols -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -Dproduct_EDGE -D_ASIC_VER_11 -DUSE_MULTIROFS -es60ibymacros -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS  q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby    -eoverride 
+     [exec] WORKDIR          : q:\output\development_flash_images\engineering_english/product_edge/rnd
+     [exec] UDEBFILE         : 0
+     [exec] UDEBFILE_LIST    : 
+     [exec] USE_FOTI         : 
+     [exec] USE_FOTA         : 
+     [exec] PREBUILD_STEPS   :  
+     [exec] SOSCORE_VERSION  : 0.0738.3.1.201
+     [exec] SOSROFS1_VERSION : 0.0738.3.1.201	
+     [exec] SOSROFS2_VERSION : 00
+     [exec] SOSROFS3_VERSION : 00
+     [exec] ENABLE_ROMSYMBOL : 1
+     [exec] ===========================================
+     [exec] iMaker - The Image Maker, version 07.34.04, 24-Aug-2007.
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_sw.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_model.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby
+     [exec] Generating header iby for Core ROM image creation
+     [exec] Generating header iby for Core ROFS1 image creation
+     [exec] Generating Core FWID txt file
+     [exec] Generating Core FWID iby file
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_sw.txt
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_model.txt
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_core_fwid.iby
+     [exec] Generating full Core ROM oby
+     [exec] * cpp -o tmp1.oby -nostdinc -undef -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -Dproduct_EDGE -D_ASIC_VER_11 -DUSE_MULTIROFS -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS -DPAGED_ROM -I "..\.\rom\CONFIG\platform\product_EDGE" -I "..\include\CONFIG\platform\product_EDGE" -I "..\.\rom\CONFIG\platform" -I "..\include\CONFIG\platform" -I "..\.\rom\CONFIG" -I "..\include\CONFIG" -I "..\include\oem\" -include "..\include\oem\feature_settings.hrh" -I. -I../../epoc32/rom/include
+     [exec] In file included from /epoc32/rom/ppd.oby:32:
+     [exec] ..\.\rom\CONFIG\platform\ppd_product.iby:28: spp_product.iby: No such file or directory
+     [exec] poc32
+     [exec] omoverride.oby:6: product_override.iby: No such file or directorypoc32
+     [exec] omoverride.oby:7: product_override_resources.iby: No such file or directory* cpp failed
+     [exec] * reading q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby
+     [exec] * reading \epoc32\rom\master.oby
+     [exec] * reading /epoc32/rom/ppd.oby
+     [exec] * reading /epoc32/rom/rnd.oby
+     [exec] * reading q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_core_fwid.iby
+     [exec] * reading \epoc32\rom\override.oby
+     [exec] *** Error: (S:COREBLDFULL,C:1,B:1,K:0,V:1): Command `(set VARIANT=product_edge) && (perl /epoc32/tools/buildrom.pl -p -v -nosymbols -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -Dproduct_EDGE -D_ASIC_VER_11 -DUSE_MULTIROFS -es60ibymacros -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS  q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_override_version.iby    -eoverride  -DPAGED_ROM   -omc_5132_0.0738.3.X.201_rnd_ui.full.img \epoc32\rom\master.oby /epoc32/rom/ppd.oby /epoc32/rom/rnd.oby q:\output\development_flash_images\engineering_english/product_edge/rnd/mc_5132_0.0738.3.X.201_rnd_ui_core_fwid.iby \epoc32\rom\override.oby )' failed.
+     [exec] mingw_make.exe[1]: *** [flash] Error 1
+     [exec] Creating Core ROM symbol file
+     [exec] ERROR: Can't open rombuild log file "q:\output\development_flash_images\engineering_english\product_edge\rnd\mc_5132_0.0738.3.X.201_rnd_ui.rom.log"
+     [exec] *** Error: (S:COREBLDROMSYM,C:1,B:1,K:0,V:1): Command `perl /epoc32/tools/maksym.pl q:\output\development_flash_images\engineering_english\product_edge\rnd\mc_5132_0.0738.3.X.201_rnd_ui.rom.log' failed.
+     [exec] mingw_make.exe[1]: *** [romsymbol] Error 1
+     [exec] mingw_make.exe: [flashuirnd] Error 2 (ignored)
+     [exec] +++ HiRes End 1190000501.1491
+     [exec] ++ Finished at Mon Sep 17 06:41:41 2007
+     [exec] === Stage=flashuiprd == flashuiprd
+     [exec] ++ Started at Mon Sep 17 06:41:41 2007
+     [exec] +++ HiRes Start 1190000501.28972
+     [exec] =========== Configuration =================
+     [exec] PRODUCT          : product_edge
+     [exec] TYPE             : prd
+     [exec] NAME             : mc_5132_0.0738.3.X.201_prd_ui
+     [exec] USE_OVERRIDE     : 1
+     [exec] BLDROM_OBY       : \epoc32\rom\master.oby /epoc32/rom/ppd.oby 
+     [exec] BLDROM_OPTION    : -p -v -nosymbols -D_IMAGE_TYPE_PRD -D_EABI=ARMV5 -Dproduct_EDGE -D_ASIC_VER_11 -DUSE_MULTIROFS -es60ibymacros -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS  q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby    -eoverride 
+     [exec] WORKDIR          : q:\output\development_flash_images\engineering_english/product_edge/prd
+     [exec] UDEBFILE         : 0
+     [exec] UDEBFILE_LIST    : 
+     [exec] USE_FOTI         : 
+     [exec] USE_FOTA         : 
+     [exec] PREBUILD_STEPS   :  
+     [exec] SOSCORE_VERSION  : 0.0738.3.1.201
+     [exec] SOSROFS1_VERSION : 0.0738.3.1.201	
+     [exec] SOSROFS2_VERSION : 00
+     [exec] SOSROFS3_VERSION : 00
+     [exec] ENABLE_ROMSYMBOL : 1
+     [exec] ===========================================
+     [exec] iMaker - The Image Maker, version 07.34.04, 24-Aug-2007.
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_sw.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_model.txt
+     [exec] Deleting q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby
+     [exec] Generating header iby for Core ROM image creation
+     [exec] Generating header iby for Core ROFS1 image creation
+     [exec] Generating Core FWID txt file
+     [exec] Generating Core FWID iby file
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_sw.txt
+     [exec] Generating file: q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_model.txt
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby
+     [exec] Generating the q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_core_fwid.iby
+     [exec] Generating full Core ROM oby
+     [exec] * cpp -o tmp1.oby -nostdinc -undef -D_IMAGE_TYPE_PRD -D_EABI=ARMV5 -Dproduct_EDGE -D_ASIC_VER_11 -DUSE_MULTIROFS -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS -DPAGED_ROM -I "..\.\rom\CONFIG\platform\product_EDGE" -I "..\include\CONFIG\platform\product_EDGE" -I "..\.\rom\CONFIG\platform" -I "..\include\CONFIG\platform" -I "..\.\rom\CONFIG" -I "..\include\CONFIG" -I "..\include\oem\" -include "..\include\oem\feature_settings.hrh" -I. -I../../epoc32/rom/include
+     [exec] In file included from /epoc32/rom/ppd.oby:32:
+     [exec] ..\.\rom\CONFIG\platform\ppd_product.iby:28: spp_product.iby: No such file or directory
+     [exec] poc32
+     [exec] omoverride.oby:6: product_override.iby: No such file or directorypoc32
+     [exec] omoverride.oby:7: product_override_resources.iby: No such file or directory* cpp failed
+     [exec] * reading q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby
+     [exec] * reading \epoc32\rom\master.oby
+     [exec] * reading /epoc32/rom/ppd.oby
+     [exec] * reading q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_core_fwid.iby
+     [exec] * reading \epoc32\rom\override.oby
+     [exec] *** Error: (S:COREBLDFULL,C:1,B:1,K:0,V:1): Command `(set VARIANT=product_edge) && (perl /epoc32/tools/buildrom.pl -p -v -nosymbols -D_IMAGE_TYPE_PRD -D_EABI=ARMV5 -Dproduct_EDGE -D_ASIC_VER_11 -DUSE_MULTIROFS -es60ibymacros -DXTI_TRACES -DNO_PLATSEC -DSECTION -DUSE_MULTIROFS  q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_override_version.iby    -eoverride  -DPAGED_ROM   -omc_5132_0.0738.3.X.201_prd_ui.full.img \epoc32\rom\master.oby /epoc32/rom/ppd.oby  q:\output\development_flash_images\engineering_english/product_edge/prd/mc_5132_0.0738.3.X.201_prd_ui_core_fwid.iby \epoc32\rom\override.oby )' failed.
+     [exec] mingw_make.exe[1]: *** [flash] Error 1
+     [exec] Creating Core ROM symbol file
+     [exec] ERROR: Can't open rombuild log file "q:\output\development_flash_images\engineering_english\product_edge\prd\mc_5132_0.0738.3.X.201_prd_ui.rom.log"
+     [exec] *** Error: (S:COREBLDROMSYM,C:1,B:1,K:0,V:1): Command `perl /epoc32/tools/maksym.pl q:\output\development_flash_images\engineering_english\product_edge\prd\mc_5132_0.0738.3.X.201_prd_ui.rom.log' failed.
+     [exec] mingw_make.exe[1]: *** [romsymbol] Error 1
+     [exec] mingw_make.exe: [flashuiprd] Error 2 (ignored)
+     [exec] +++ HiRes End 1190000506.71174
+     [exec] ++ Finished at Mon Sep 17 06:41:46 2007
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/logs/test_log.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,8 @@
+Some text...
+
+ERROR: This is an error!
+
+WARNING: This is a warning.
+
+More text...
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/pythonTest2.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+from optparse import OptionParser
+
+def main():
+    parser = OptionParser(usage="%prog VERSION")
+    opts, args = parser.parse_args()
+    input = args[0]
+    print input
+    
+main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/scanlog/all_regex_type.log	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.5.3 [2009-03-12 release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<info>sbs: version 2.5.3 [2009-03-12 release]
+</info>
+<info>SBS_HOME E:/Build_E/ido-config-df/sbs</info>
+<info>Set-up E:/Build_E/ido-config-df/sbs/sbs_init.xml</info>
+<warning>E:/build_e/sbs_2.8.4/sbs/win32/mingw/bin/cpp.exe: x:/sf/mw/accesssec/eapol/eapol_framework/eapol_symbian/group/eapol.mmp:36:2: warning: #warning For R&D info: Protected Setup & Expanded EAP defined, EAPOLPROTECTED.DEF will be used.</warning>
+<info>Command-line-arguments -s z:\output/build/canonical_system_definition_build.xml -k -c armv5 -j 4 -m z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_Makefile --filters=FilterHeliumLog -f z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_compile.log</info>
+<recipe name='resourcedependencies' target='z:/epoc32/build/camera/c_87f62b1af2e7d874/gscameraplugin_dll/gscameraplugin_resource_plugins_27.rpp.d' host='fawec012' layer='app_layer' component='' bldinf='z:/sf/app/camera/group/bld.inf' mmp='z:/sf/app/camera/camerauis/cameraapp/generic/GsCamcorderPlugin/group/gscameraplugin.mmp' config='armv5_udeb' platform='' phase='RESOURCE_DEPS' source=''>
+<![CDATA[
+mingw_make.exe: error
+test FATAL ERROR(S):abcd
+): Missing file:
+abcd FLEXlm error:
+ABLD ERROR: 1234
+BLDMAKE ERROR: 43543
+test FATAL ERROR 
+fatal error U1077 error occured
+test warning U4010
+Warning:
+WARNING:
+LINK : warning
+REMARK: 
+:10: warning: cannot find matching deallocation function
+INFO:
+make[10]: ***abcd
+make[10]: abcd not remade because of errors
+error: ((Internal fault)):
+ERROR,error: ((Internal fault):)$,
+ error given more than once in the same rule
+ERROR: build error
+ERROR EC95940: ec error
+Errors caused tool to abort. asdfasdf
+test no rule to make target
+ERROR,.*no rule to make.*,
+ERROR	testing
+100) : WARNING: TEST123
+MAKEDEF WARNING: TEST
+TEST 123 \\(10) : Warning: (400)
+BLDMAKE WARNING: bldm warning
+MAKEDEF WARNING: make warning
+atest(100) : warning C aasdfa
+testas 100: warning: test123
+usage Usage Warning: warn1
+abcd mwld.exe: abcd
+Command line warning abcd
+anything ERROR: bad relocation: test123
+10 warning in component1
+EventType: Error Source: SweepNTabcde
+WARNING,.EventType:\s+Error\s+Source:\s+SweepNT.*,
+WARN	test
+anything Command line warning D4025 : test
+REMARK: test remark anything
+EventType: Error Source: GNU Make.
+abcd :10: warning: cannot find matching deallocation function 100:note abcd
+INFO: any info match
+"abcd" 
+line 100+: Warning:', : warning 30:,
+"abcd , line 100: Error: 100abcd:. abcd
+line 10: Warning:\', r\': warning 10: abcd
+"abcd, line 100: Warning: 100 abcd: abcd",
+]]><time start='1238421421.153697000' elapsed='0.171' />
++ RV=0
++ set +x
+<status exit='ok' attempt='1' />
+</recipe>
+</buildlog>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/scanlog/all_regex_type.log_sbs_info.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbsinfo>
+<logfile name="test-scanlog-metadata-1.log"/>
+<duration time="01:00:28"/>
+</sbsinfo>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_1/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_1/test1.zip has changed
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_1/test2.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1_001"/>
+		</releaseID>
+		<dependsOf>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</dependsOf>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="sp1.zip"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/release_metadata_1.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1_001"/>
+		</releaseID>
+		<dependsOf>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</dependsOf>
+	</releaseDetails>
+
+    <servicePacks>
+        <servicePack name="SP1" reInstallNeeded="false">
+            <file name="sp1.zip"/>
+            <instructions name="specialInstructions.xml"/>
+        </servicePack>
+    </servicePacks>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_001/sp1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_002/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1_002"/>
+		</releaseID>
+		<dependsOf>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1_001"/>
+		</dependsOf>
+	</releaseDetails>
+
+    <servicePacks>
+        <servicePack name="SP2" reInstallNeeded="false">
+            <file name="sp2.zip"/>
+            <instructions name="specialInstructions.xml"/>
+        </servicePack>
+    </servicePacks>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_1_002/sp2.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_2/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_2"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip"/>
+		<package default="true" extract="single" type=".zip" name="missing.zip"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_2/test1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_3/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_2"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip"/>
+		<package default="true" extract="single" type=".zip" name="missing.zip"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_3/test1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_4/TICKLER	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+
+Title:  site Grace Server
+User:   symuser
+Date:   2008-11-06 15:36:56
+Screen: View Release
++---------------------------+----------------------------------+-------------------+-----------------+--------+
+|Description                |V1                                |V2                 |V3               |V4      |
++---------------------------+----------------------------------+-------------------+-----------------+--------+
+|Release is currently       |LOCKED                            |                   |                 |        |
+|Packages Total / Size Total|     1 /            .01 MB        |                   |                 |        |
+|Packages / Released From   |     1 / fasrrm01.europe.nokia.com|                   |                 |        |
+|Packages / Released By     |     1 / varamana                 |                   |                 |        |
+|--                         |                                  |                   |                 |        |
+|Packages Sent / Site       |Start                             |Finish             |Moved            |Saved   |
+|1 / site              |                                  |                   |                 |        |
+|1 / site                |2008-11-06 14:41:47               |2008-11-06 14:41:54|           .01 MB|  -1.4 %|
+|1 / site                 |                                  |                   |                 |        |
+|1 / site             |2008-11-06 14:41:53               |2008-11-06 14:41:54|           .01 MB|  -1.4 %|
+|1 / site                 |                                  |                   |                 |        |
+|1 / site               |2008-11-06 14:41:54               |2008-11-06 14:41:56|           .01 MB|  -1.4 %|
+|1 / site              |2008-11-06 14:41:56               |2008-11-06 14:41:58|           .01 MB|  -1.4 %|
+|1 / site                   |2008-11-06 14:41:45               |2008-11-06 14:41:47|           .01 MB|  -1.4 %|
+|1 / site                   |2008-11-06 15:19:02               |2008-11-06 15:19:04|           .01 MB|  -1.4 %|
+|1 / site              |                                  |                   |                 |        |
+|1 / site                |2008-11-06 14:41:53               |2008-11-06 14:41:55|           .01 MB|  -1.4 %|
+|1 / site                  |2008-11-06 14:47:39               |2008-11-06 14:47:43|           .01 MB|  -1.4 %|
+|1 / site              |                                  |                   |                 |        |
++---------------------------+----------------------------------+-------------------+-----------------+--------+
+Rows: 19  Page: 1  RPP: 25
+
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_4/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_2"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip"/>
+		<package default="true" extract="single" type=".zip" name="missing.zip"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_4/test1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_5/HYDRASTATUS.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<release xmlns="http://hydra.nokia.com/schema/hydrastatus">
+  <name>5.0</name>
+  <state>Ready</state>
+  <service>service</service>
+  <ctime>2009-06-23T14:29:47+00:00</ctime>
+  <owner>a</owner>
+  <direction>OUT</direction>
+  <total-file-count>1</total-file-count>
+  <total-file-size>236313771</total-file-size>
+  <transports>
+    <transport>
+      <peer>z</peer>
+      <direction>OUT</direction>
+      <state>Done</state>
+      <file-count>1</file-count>
+      <file-size>236313771</file-size>
+      <retries>0</retries>
+    </transport>
+  </transports>
+</release>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_5/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_5"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_5/test1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_6/HYDRASTATUS.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<release xmlns="http://hydra.nokia.com/schema/hydrastatus">
+  <name>5.0</name>
+  <state>Created</state>
+  <service>service</service>
+  <ctime>2009-06-23T14:29:47+00:00</ctime>
+  <owner>a</owner>
+  <direction>OUT</direction>
+  <total-file-count>1</total-file-count>
+  <total-file-size>236313771</total-file-size>
+  <transports>
+    <transport>
+      <peer>z</peer>
+      <direction>OUT</direction>
+      <state>Done</state>
+      <file-count>1</file-count>
+      <file-size>236313771</file-size>
+      <retries>0</retries>
+    </transport>
+  </transports>
+</release>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_6/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_6"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_6/test1.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/GRACE/service/product/release_7/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="Helium"/>
+			<product name="test"/>
+			<release name="${env.PID}"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_7/test1.zip has changed
Binary file buildframework/helium/tests/data/symrec/GRACE/service/product/release_7/test2.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/generated_release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+    <releaseDetails>
+        <releaseID>
+            <service name="minibuild"/>
+            <product name="PF5250"/>
+            <release name="PF5250_minibuild_630"/>
+        </releaseID>
+    </releaseDetails>
+    <releaseFiles>
+    <package s60filter="" name="s60_app_organizer_clock.zip" default="true" type="zip" filters="" extract="single"/>
+  <package s60filter="" name="s60_app_organizer_clock_binary.zip" default="true" type="zip" filters="" extract="single"/>
+  <package s60filter="" name="s60_mw_classicui_and_app_radio.zip" default="true" type="zip" filters="" extract="single"/>
+    <package s60filter="" name="s60_mw_classicui_and_app_radio_internal.zip" default="true" type="zip" filters="" extract="double"/>
+  </releaseFiles>
+    <externalFiles/>
+
+	<filters>
+		<!-- Filter definitions -->
+		<!-- 	code = code used in package attribute "filters" 
+					text = Filter name
+					description = filter description
+		-->
+    <filter text="Emulator binaries" code="foo" description="Files needed for emulator."/> 
+    <filter text="complementary binaries and sources" code="bar" description="complementary components binaries and sources"/>
+    <filter text="source files" code="test" description="symbian and S60 source files"/>
+	</filters>
+    
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/merge/main_metadata_1.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/merge/main_metadata_2.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/merge/main_metadata_3.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test3_1.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test3_2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/override/one/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/override/several/release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/override/several/release_metadata_1.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/override/several/release_metadata_2.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation>
+	<releaseDetails>
+		<releaseID>
+			<service name="service"/>
+			<product name="product"/>
+			<release name="release_1"/>
+		</releaseID>
+	</releaseDetails>
+	<releaseFiles>
+		<package default="true" extract="single" type=".zip" name="test1.zip" md5checksum="29b6ddc0265958641949c15e5c16c580" size="112"/>
+		<package default="true" extract="single" type=".zip" name="test2.zip"  md5checksum="433fd286bcf7e55be9d0e7e88f0cd84c" size="112"/>
+	</releaseFiles>
+	<externalFiles/>
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/symrec/revision_release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<releaseInformation hidden="false">
+	<releaseDetails>
+		<releaseID>	
+			<service name="S60RnD"/>
+			<product name="pf_5250"/>
+			<release name="pf_5250_200836_001"/>
+		</releaseID>
+		<dependsOf>
+			<service name="S60RnD"/>
+			<product name="pf_5250"/>
+			<release name="pf_5250_200836"/>
+		</dependsOf>
+		<!-- <previousBaseline>
+			<service name="S60RnD" />
+			<product name="pf_5250" />
+			<release name="pf_5250_200835" />
+		</previousBaseline> -->
+	</releaseDetails>
+
+	<releaseFiles>
+	<package s60filter="emu" name="pf_5250_200836_SP1.zip" default="true" type="zip" filters="emu" extract="single"/>
+  </releaseFiles>
+
+	<!-- <servicePacks>
+		<servicePack name="SP1" reInstallNeeded="false">
+			<file name="pf_5250_200836_SP1.zip"/>
+			<instructions name="specialInstructions.xml"/>
+		</servicePack>
+	</servicePacks> -->
+
+	<localeVariants>
+		<variant name="western">
+			<file name="pf_5250_200836_delta_western.zip"/>
+		</variant>
+		<variant name="china">
+			<file name="pf_5250_200836_delta_china.zip"/>
+		</variant>
+		<variant name="japan">
+			<file name="pf_5250_200836_delta_japan.zip"/>
+		</variant>
+	</localeVariants>
+	
+	<filters>
+		<!-- Filter definitions -->
+		<!-- 	code = code used in package attribute "filters" 
+					text = Filter name
+					description = filter description
+		-->
+    <filter text="Emulator binaries" code="emu" description="Files needed for emulator."/> 
+    <filter text="complementary binaries and sources" code="compl" description="complementary components binaries and sources"/>
+    <filter text="source files" code="src" description="symbian and S60 source files"/>
+    <filter text="source files" code="tsrc" description="test source files"/>
+    <filter text="binary files" code="jvm" description="java virtual machine binaries and sources"/>
+	</filters>
+	
+</releaseInformation>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/sysdef2make/SDF.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,184 @@
+<?xml version="1.0"?>
+<!-- Enable this after dtd is available with OsExt release -->
+<!DOCTYPE SystemDefinition [
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
+]>
+
+
+
+<SystemDefinition name="PPD_build" schema="1.4.0">
+
+  <systemModel>
+  	<!-- Common file for prebuild layers-->
+  	
+  	
+    <layer name="layer1">  
+	    <module name="module1"> 
+		    <component name="component1"> 
+			    <unit unitID="unit1"  name="unit1" bldFile="unit1\location" mrp="" filter=""/> 
+			    <unit unitID="unit2"  name="unit2" bldFile="unit2\location" mrp="" filter="!skip"/> 
+			    <unit unitID="unit3"  name="unit3" bldFile="unit3\location" mrp="" filter="skip"/>
+            </component> 
+        </module> 
+    </layer>
+
+  </systemModel>
+
+  <build>
+  
+    <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="N"/>
+    <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+    <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+    <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+    <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+    <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+    <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+    <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+    <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+    <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+
+    <!-- Aditional Targets -->
+    <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+    <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+    
+    <targetList name="default" description="Main Targets" target="WINSCW ARMV5"/>
+    <targetList name="default_winscw" description="Main Targets" target="WINSCW"/>
+    <targetList name="default_armv5" description="Main Targets" target="ARMV5"/>
+    <targetList name="default_rel" description="Main Targets for rel" target="ARMV5_REL"/>
+    <targetList name="default_deb" description="Main Targets for deb" target="ARMV5_DEB"/>
+    <targetList name="default_tools" description="tools Targets" target="TOOLS"/>
+    <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+    <targetList name="cwtools" description="cwtools Targets" target="CWTOOLS"/>
+    <targetList name="cwtools_rel" description="cwtools Release Targets" target="CWTOOLS_REL"/>
+  
+    <configuration name="config1" description="config1" filter="">
+			<task><specialInstructions name="attrib" cwd="%EPOCROOT%" command="attrib -R \*.* /S /D"/></task>
+			<task><specialInstructions name="touch_s60" cwd="%EPOCROOT%" command="toucher.exe \s60"/></task>
+			<task><specialInstructions name="touch_ppd_sw" cwd="%EPOCROOT%" command="toucher.exe \ppd_sw"/></task>
+			<task><specialInstructions name="touch_ncp_sw" cwd="%EPOCROOT%" command="toucher.exe \ncp_sw"/></task>
+			<task><specialInstructions name="touch_tools_ncp_tools" cwd="%EPOCROOT%" command="toucher.exe \tools\ncp_tools"/></task>
+			<task><specialInstructions name="touch_config" cwd="%EPOCROOT%" command="toucher.exe \config"/></task>
+			<task><specialInstructions name="touch_psw" cwd="%EPOCROOT%" command="toucher.exe \psw"/></task>			
+			<task><specialInstructions name="CopyCommonVariation" cwd="\psw\ncp_psw\psw" command="xcopy *.*  \ /F /R /Y /S"/></task>
+			<task><specialInstructions name="CopySPP_ABLD" cwd="\tools\ncp_tools\toolsmod_93" command="xcopy *.*  \ /F /R /Y /S"/></task>
+			<task><specialInstructions name="CopyNCP52Variation" cwd="\psw\ncp_psw\platform_psw\psw" command="xcopy *.*  \ /F /R /Y /S"/></task>
+			<task><specialInstructions name="CopyS6050Variation" cwd="\psw\s60_50_psw\psw" command="xcopy *.*  \ /F /R /Y /S"/></task>
+			<task><specialInstructions name="psw\s60_50_psw\52.50_psw" cwd="\psw\s60_50_psw\52.50_psw\psw" command="xcopy *.*  \ /F /R /Y /S"/></task>
+    </configuration>
+
+
+	<configuration name="config2" description="config2" filter="">			
+			<layerRef layerName="layer1" />
+			<task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+			<task><buildLayer command="abld export" unitParallel="Y"/></task>
+	</configuration>
+    
+	<configuration name="config3" description="config3" filter="skip">			
+			<layerRef layerName="layer1" />
+			<task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+			<task><buildLayer command="abld export" unitParallel="Y"/></task>
+	</configuration>
+
+
+	<unitList name="unitlist1">
+		<unitRef unit="unit1" />
+		<unitRef unit="unit2" />
+		<unitRef unit="unit3" />
+	</unitList>
+	<configuration name="config4" description="config4" filter="skip">			
+			<unitListRef unitList="unitlist1" />
+			<task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+			<task><buildLayer command="abld export" unitParallel="Y"/></task>
+			<task><buildLayer command="abld build" targetList="default" unitParallel="Y"/></task>
+	</configuration>
+
+</build>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/test_ccmwaid.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,3 @@
+/nokia/jk_nmp/groups/gscm/dbs/jk1f5132/db
+2073797
+sa1spp#1/project/S60/jk1f5132#wbernard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/test_database.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<antDatabase>
+  <project>
+    <name>compile.cmaker</name>
+    <documentation> 
+      <p>cMaker support.</p>
+    </documentation>
+    <default/>
+    <pythonDependency/>
+    <target>
+      <name>cmaker-install</name>
+      <ifDependency/>
+      <unlessDependency/>
+      <description/>
+      <tasks>3</tasks>
+      <location>C:\Helium_svn\helium\tools\compile\cmaker.ant.xml:78:</location>
+      <log>${build.id}_install.cmaker.log</log>
+      <executable>${build.drive}/epoc32/tools/make.exe</executable>
+      <documentation> 
+        <p>Installing CMaker.</p>
+      </documentation>
+      <propertyDependency>build.id</propertyDependency>
+      <propertyDependency>build.drive</propertyDependency>
+      <propertyDependency>cmaker.component.dir</propertyDependency>
+      <source>&lt;target name="cmaker-install"&gt;
+        &lt;hlm:recordStartMacro xmlns:hlm="http://www.nokia.com/helium" name="${build.id}_install.cmaker.log" emacsmode="true"/&gt;
+        &lt;exec executable="${build.drive}/epoc32/tools/make.exe" dir="${cmaker.component.dir}"&gt;
+            &lt;arg line="install"/&gt;
+        &lt;/exec&gt;
+        &lt;hlm:recordStopMacro xmlns:hlm="http://www.nokia.com/helium" name="${build.id}_install.cmaker.log"/&gt;
+    &lt;/target&gt;</source>
+    </target>
+    <target>
+      <name>cmaker-export</name>
+      <ifDependency>enable.cmaker</ifDependency>
+      <unlessDependency/>
+      <description/>
+      <tasks>3</tasks>
+      <location>C:\Helium_svn\helium\tools\compile\cmaker.ant.xml:87:</location>
+      <dependency type="direct">cmaker-install</dependency>
+      <log>${build.id}.export.cmaker.log</log>
+      <documentation> 
+        <p>CMaker export configuration.</p>
+      </documentation>
+      <propertyDependency>build.id</propertyDependency>
+      <propertyDependency>cmaker.pp.version</propertyDependency>
+      <propertyDependency>cmaker.s60.version</propertyDependency>
+      <source>&lt;target name="cmaker-export" depends="cmaker-install" if="enable.cmaker"&gt;
+        &lt;hlm:recordStartMacro xmlns:hlm="http://www.nokia.com/helium" name="${build.id}.export.cmaker.log" emacsmode="true"/&gt;
+        &lt;hlm:cmakerMacro xmlns:hlm="http://www.nokia.com/helium" ncp="${cmaker.pp.version}" s60="${cmaker.s60.version}" action="export"/&gt;
+        &lt;hlm:recordStopMacro xmlns:hlm="http://www.nokia.com/helium" name="${build.id}.export.cmaker.log"/&gt;
+    &lt;/target&gt;</source>
+    </target>
+  </project>
+</antDatabase>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/test_delivery.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?>
+<build>
+
+	<config name="delivery" abstract="true">
+		<set  name="database" value="to1tobet"/>
+		<set  name="thread" value="1"/>
+		<set  name="dir" value="C:\temp"/>
+		
+    	<config type="snapshot" name="2D_OpenVG_1_0-to1tobet#ekhuq:project:ou1ape3#1"/>
+    </config>
+    
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/test_prep.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<prepSpec>
+    <config>
+        <exclude name="abld.bat"/>
+        <exclude name=".static_wa"/>
+        <exclude name="_ccmwaid.inf"/>
+    </config>
+    <source label="Symbian" basedir="${symbian.release.dir}">
+        <unzip name="${symbian.zip.prefix}${symbian.release}_src_generic_part1.zip"/>
+        <unzip name="${symbian.zip.prefix}${symbian.release}_src_generic_part2.zip"/>
+        <unzip name="${symbian.zip.prefix}${symbian.release}_src_generic_part3.zip"/>
+        <unzip name="${symbian.zip.prefix}${symbian.release}_src_cedar.zip"/>
+        <unzip name="${symbian.zip.prefix}${symbian.release}_epoc32.zip">
+            <include name="epoc32/tools/*"/>
+            <include name="epoc32/gcc/*"/>
+            <include name="epoc32/rom/include/mscomp.iby"/>
+            <include name="epoc32/rom/include/staccomp.iby"/>
+            <include name="epoc32/rom/include/profiler.iby"/>
+            <include name="epoc32/INCLUDE/variant/Symbian_OS_v9.3.hrh"/>
+        </unzip>
+        <unzip name="${symbian.zip.prefix}${symbian.release}_epoc32_RELEASE_ARMV5.zip">
+            <include name="epoc32/RELEASE/ARMV5/UDEB/mscomp.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/UDEB/staccomp.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/UREL/mscomp.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/UREL/staccomp.dll"/>
+            <!-- Crypto binaries -->
+            <include name="epoc32/RELEASE/ARMV5/lib/hash.lib"/>
+            <include name="epoc32/RELEASE/ARMV5/udeb/hash.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/urel/hash.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/lib/random.lib"/>
+            <include name="epoc32/RELEASE/ARMV5/udeb/random.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/urel/random.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/lib/randsvr.lib"/>
+            <include name="epoc32/RELEASE/ARMV5/udeb/randsvr.exe"/>
+            <include name="epoc32/RELEASE/ARMV5/urel/randsvr.exe"/>
+            <include name="epoc32/RELEASE/ARMV5/lib/pbe.lib"/>
+            <include name="epoc32/RELEASE/ARMV5/udeb/pbe.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/urel/pbe.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/lib/cryptography.lib"/>
+            <include name="epoc32/RELEASE/ARMV5/udeb/strong_cryptography.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/urel/strong_cryptography.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/udeb/weak_cryptography.dll"/>
+            <include name="epoc32/RELEASE/ARMV5/urel/weak_cryptography.dll"/>
+        </unzip>
+    </source>
+
+    
+    <!-- unzip ICF/ICD's for this baseline-->
+		<source name="icds" basedir="">
+			<unzipicds dest="${build.drive}\">
+				<!-- Unzipping from following location
+						 * S60
+						 * common
+						 * product
+				  -->
+				<location name="${ccm.base.dir}/S60/S60/Symbian_ICD_ICF/${symbian.release}">
+				</location>
+				<location name="${ccm.base.dir}/mc/mc_overlay/mc_4032_overlay/common/files/Symbian_ICD_ICF/${symbian.release}" />
+				<location name="${ccm.base.dir}/mc/mc_overlay/mc_4032_overlay/${product.name}_overlay/files/Symbian_ICD_ICF/${symbian.release}" />
+				
+				<include name="src/*" />
+			</unzipicds>
+		</source>
+ 
+    <source label="S60" basedir="${s60.release.dir}">
+        <unzip name="S60_3_2_${s60.version}_epoc32.zip" if="NO_NCP">
+            <!-- use default commdb for chip build -->
+    	    <include name="epoc32/data/Z/private/10202be9/cccccc00.cre"/>
+        </unzip>
+    </source>
+    
+    <source label="S60" basedir="${ccm.base.dir}/S60">
+        <copy name="S60" dest="s60"/>
+    </source>
+ 
+    <source label="ME" basedir="${ccm.base.dir}">
+        <copy name="me_scd_desw/me_scd_desw" dest="me/me_scd_desw"/>
+    </source>
+    
+    <source label="ppd_sw" basedir="${ccm.base.dir}">
+        <copy name="ppd_sw/ppd_sw" dest="ppd_sw"/>
+        <copy name="ppd_sw/ppd_sw/s60_dd/T9TegicDelivery" dest="s60/mw/inputmethods/textinput/T9TegicDelivery"/>
+    </source>
+
+    <source label="multimedia_sw" basedir="${ccm.base.dir}">
+        <copy name="productconceptfw/productconceptfw" dest="multimedia_sw/productconceptfw"/>
+    </source>
+
+    <source label="extra_apps" basedir="${ccm.base.dir}">
+        <copy name="DvbhTestApplication/DvbhTestApplication" dest="extra_apps/DvbhTestApplication"/>
+    </source>
+
+    <source label="chipset" basedir="${ccm.base.dir}/IBUSAL_chipset/IBUSAL_chipset">
+        <copy name="config" dest="config" unless="NO_NCP"/>
+        <copy name="ncp_sw" dest="ncp_sw" unless="NO_NCP"/>
+        <copy name="psw" dest="psw" unless="NO_NCP"/>
+        <copy name="tools" dest="tools" unless="NO_NCP"/>
+    </source>
+   
+    <source label="mc" basedir="${ccm.base.dir}">
+        <copy name="mc/mc_build" dest="mc/mc_build"/>
+        <copy name="mc/mc_config" dest="mc/mc_config"/>
+        <copy name="mc/mc_overlay/mc_4032_overlay" dest="mc/mc_overlay/mc_4032_overlay"/>
+<!--         <copy name="mc/mc_sw/mc_4032_sw/common" dest="mc/mc_sw/mc_4032_sw/common"/> -->
+<!--         <copy name="mc/mc_sw/mc_4032_sw/${product.name}" dest="mc/mc_sw/mc_4032_sw/${product.name}"/> -->
+        <copy name="mc/helium" dest="mc/helium"/>
+    </source>
+
+    <source label="chipset_cellmo" basedir="${ibusal.cellmo.dir}">
+        <copy name="product4" dest="${build.drive}/epoc32/include/product4/cellmo" unless="NO_NCP"/>
+        <copy name="product4" dest="${build.drive}/output/development_flash_images/cellmo/product4" unless="NO_NCP"/>
+        <copy name="product" dest="${build.drive}/epoc32/include/product/cellmo" unless="NO_NCP"/>
+        <copy name="product" dest="${build.drive}/output/development_flash_images/cellmo/product" unless="NO_NCP"/>
+    </source>
+
+
+
+    <source label="overlays" basedir="${build.drive}">
+        <copy name="mc/mc_overlay/mc_4032_overlay/common/files"/>
+        <copy name="mc/mc_overlay/mc_4032_overlay/${product.name}_overlay/files"/>
+
+		<!-- manual exports required before bldmake bldfiles phase -->
+        <copy name="mc/mc_config/mc_4032_config/${product.name}/include/ProductVariant.hrh" tofile="epoc32/include/oem/ProductVariant.hrh"/>
+        <copy name="mc/mc_config/mc_4032_config/${product.name}/include/ProductVariant.hrh" tofile="S60/misc/release/bldvariant/common/ProductVariant.hrh"/>
+        <copy name="mc/mc_config/mc_4032_config/${product.name}/include/ProductVariant.hrh" tofile="config/ncp_config/platform_config/config/inc/productvariant.hrh"/>
+        <copy name="me/me_scd_desw/variation/product/DeSwFlagsproduct.hrh" tofile="epoc32/include/oem/DeSwFlagsproduct.hrh"/>
+		<!--Ensure correct iby version gets exported regardless of timestamp: -->
+        <copy name="mc/mc_config/mc_4032_config/common/rom/include/NCPCenrep_variant.iby" tofile="config/ncp_config/config/rom/include/NCPCenrep_variant.iby"/>
+		<!--Ensure correct certificate gets exported regardless of timestamp: -->
+        <copy name="mc/mc_config/mc_4032_config/common/certificates/S60_root_certificates/rnd/swicertstore.dat" tofile="s60/mw/securityservices/pkiutilities/certificates/data/swicertstore.dat"/>
+
+
+    	<!-- S60 manual exports required before bldmake bldfiles phase phase where  bldvariant is included-->
+
+        <!-- special copy for subcon package -->
+        <copy name="mc/mc_config/mc_4032_config/common/certificates/S60_root_certificates/s60_licensees/swicertstore.dat" tofile="epoc32/data/z/resource/swicertstore.dat_for_s60_licensees"/>
+
+        <!-- special copy for localisation -->
+        <copy name="S60/tools/build_platforms/build/tools/parse_what_log.pl" tofile="epoc32/tools/s60tools/parse_what_log.pl"/>
+        <copy name="S60/tools/build_platforms/build/tools/add_build_definition_filter.pl" tofile="epoc32/tools/s60tools/add_build_definition_filter.pl"/>
+
+
+      <!-- chipset overlay;  manual exports required due to missing bld.inf-->
+    	<!-- from \build\ncp_build\build\variation.txt -->
+        <copy name="/psw/ncp_psw/psw" unless="NO_NCP"/>
+        <copy name="/tools/toolsmod_93" unless="NO_NCP"/>
+    	<!-- from \build\ncp_build\platform_build\build\variation.txt -->
+        <copy name="/psw/ncp_psw/platform_psw/psw" unless="NO_NCP"/>
+    	<!-- from \build\ncp_build\platform_build\platform_product_build\build\variation.txt -->
+        <copy name="/psw/ncp_psw/platform_psw/platform_product_psw/psw" unless="NO_NCP"/>
+  
+      <!-- chipset manual exports required before bldmake bldfiles phase where  bldvariant is included-->
+        <copy name="config/ncp_config/config/inc/feature_settings.hrh" tofile="epoc32/include/oem/feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/config/inc/st_consts.hrh" tofile="epoc32/include/oem/st_consts.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/adaptation_features.hrh" tofile="epoc32/include/oem/adaptation_features.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/st_feature_settings.hrh" tofile="epoc32/include/oem/st_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/st_features_common.hrh" tofile="epoc32/include/oem/st_features_common.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/config/inc/spp_variant.cfg" tofile="epoc32/tools/variant/spp_variant.cfg" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/spp_feature_settings.hrh" tofile="epoc32/include/oem/spp_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/oem/ncp_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/config/inc/ncp_feature_consts.hrh" tofile="epoc32/include/oem/ncp_feature_consts.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/config/inc/ncp_consts.hrh" tofile="epoc32/include/oem/ncp_consts.hrh" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/adaptation_conf.h" tofile="epoc32/include/internal/adaptation_conf.h" unless="NO_NCP"/>
+        <copy name="config/ncp_config/platform_config/config/inc/st_settings.hrh" tofile="epoc32/include/st_settings.hrh" unless="NO_NCP"/>
+        <copy name="ncp_sw/corecom/aasw/AaCommonTools/config/audio_sw_external_conf.hrh" tofile="epoc32/include/internal/audio_sw_external_conf.hrh" unless="NO_NCP"/>
+        <copy name="ncp_sw/corecom/aasw/AaCommonTools/config/audio_sw_conf.hrh" tofile="epoc32/include/internal/audio_sw_conf.hrh" unless="NO_NCP"/>
+
+      <!-- chipset manual exports required before bldmake bldfiles phase so build does not hang -->
+        <copy name="config/ncp_config/config/tools" dest="epoc32/tools" unless="NO_NCP"/>
+
+      <!-- fix for LightService-->
+        <copy name="/config/ncp_config/platform_config/config/inc/ncp_feature_settings.hrh" tofile="/epoc32/include/config/platform/ncp_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/st_feature_settings.hrh" tofile="/epoc32/include/config/platform/st_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/st_features_common.hrh" tofile="/epoc32/include/st_features_common.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/st_features_common.hrh" tofile="/epoc32/include/config/platform/st_features_common.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/VariationItemValues.hrh" tofile="/epoc32/include/oem/VariationItemValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/VariationItemValues.hrh" tofile="/epoc32/include/config/platform/VariationItemValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/VariationItemDetailedValues.hrh" tofile="/epoc32/include/oem/VariationItemDetailedValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/VariationItemDetailedValues.hrh" tofile="/epoc32/include/config/platform/VariationItemDetailedValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/st_features.hrh" tofile="/epoc32/include/st_features.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/casw_light_settings.hrh" tofile="/epoc32/include/oem/casw_light_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/casw_light_settings.hrh" tofile="/epoc32/include/config/platform/casw_light_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/inc/adaptation_features.hrh" tofile="/epoc32/include/config/platform/adaptation_features.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/config/tools/platform.bsf" tofile="/epoc32/tools/platform.bsf" unless="NO_NCP"/>
+
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="/epoc32/include/config/platform/product4/ncp_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/VariationItemValues.hrh" tofile="/epoc32/include/config/platform/product4/VariationItemValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/VariationItemDetailedValues.hrh" tofile="/epoc32/include/config/platform/product4/VariationItemDetailedValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/st_feature_settings.hrh" tofile="/epoc32/include/config/platform/product4/st_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/casw_light_settings.hrh" tofile="/epoc32/include/config/platform/product4/casw_light_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/rom/config/x_conf_product4.txt" tofile="/ncp_sw/spp_core4.0/base_ca_product/stn8815/product/product4/x_conf_product4.txt" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/tools/product4.bsf" tofile="/epoc32/tools/product4.bsf" unless="NO_NCP"/>
+
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="/epoc32/include/config/platform/product/ncp_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/VariationItemValues.hrh" tofile="/epoc32/include/config/platform/product/VariationItemValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/VariationItemDetailedValues.hrh" tofile="/epoc32/include/config/platform/product/VariationItemDetailedValues.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/st_feature_settings.hrh" tofile="/epoc32/include/config/platform/product/st_feature_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/inc/casw_light_settings.hrh" tofile="/epoc32/include/config/platform/product/casw_light_settings.hrh" unless="NO_NCP"/>
+        <copy name="/config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="/epoc32/tools/product.bsf" unless="NO_NCP"/>
+
+      <!-- temporary chipset manual exports -->
+        <copy name="config/s60_32_config/config/rom/include/commsdat_db_variant.iby" tofile="epoc32/rom/include/commsdat_db_variant.iby" unless="NO_NCP"/>
+        <copy name="config/s60_32_config/config/rom/include/commsdat.iby" tofile="epoc32/rom/include/commsdat.iby" unless="NO_NCP"/>
+        <copy name="config/s60_32_config/config/rombuild/s60_romfiles.txt" tofile="epoc32/rombuild/s60_romfiles.txt" unless="NO_NCP"/>
+        <copy name="ncp_sw/spp_core4.0/product/targets/product/variant.mmh" tofile="epoc32/include/product/variant.mmh" unless="NO_NCP"/>
+    </source>
+
+    <source label="Temporary unzip of DVB-H" basedir="${build.drive}">
+        <unzip name="me/me_scd_desw/source/JugnooTSW.zip"/>
+    </source>
+
+ 
+</prepSpec>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/validate_overlay/delivery.xml.parsed	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+<?xml version="1.0" ?>
+<deliveryConfiguration>
+
+  <snapshot project="ppd_sw-MCL_200732:project:sa1spp#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734" thread="10" />
+
+	<checkout project="IBUSAL_RapidoYawe-jk1f5132#0734:project:jk1imeng#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734" release="mc/next" />
+	
+	<!-- temporary fix to handle two naviscroll projects -->
+	<snapshot project="naviscroll-jk1f5132#0728_2:project:tr1imeng#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\naviscroll-old" thread="1" />
+	<snapshot project="sensor_server_adaptation-jk1f5132#0728_2:project:tr1imeng#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\sensor_server_adaptation-old" thread="1" />
+	<!-- this is for new driver  - requires change in sys_def to be compiled -->
+	<snapshot project="naviscroll-jk1f5132#0734:project:tr1imeng#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\naviscroll-new" thread="1" />
+	<snapshot project="sensor_server_adaptation-jk1f5132#0734:project:tr1imeng#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\sensor_server_adaptation-new" thread="1" />
+	
+
+  <snapshot project="S60-S60.32_200732:project:sa1spp#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734" thread="10" />
+	
+	<snapshot project="T9TegicDelivery-tr1s60#AppBaseDo_direct_200707:project:ccm51#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734" thread="1" />
+	<snapshot project="maps-bh1cfloc#1.2_200734:project:tr1cfloc#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="1" />
+	<snapshot project="fmtx-dev_200729:project:tr1nss#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="1" />
+	<snapshot project="InternetRadio-InternetRadioA32_0732:project:sa1nssx4#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="1" />
+  <!-- VOIP baselines -->
+<snapshot project="ipappservices_Domain_direct-IPASDo_direct_200731:project:he1cfsip#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+<snapshot project="iptelephony-TeDo_direct_200731:project:ou1s60rt#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+<snapshot project="brandingserver-bh1s60#IMPPDo_Int.200731:project:tr1cfmsg#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+<snapshot project="presencefw-IMPECDo_Int_200731:project:tr1cfmsg#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+<snapshot project="simpledatamodeladapter-Sawfish_VoIP_2007_wk27:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+<snapshot project="sipvoipcontactsextension-Sawfish_VoIP_2007_wk33:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+ <snapshot project="calllineidentificationxsp-Sawfish_VoIP_2007_wk31:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+ <snapshot project="callloggingxsp-Sawfish_VoIP_2007_wk20:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+ <snapshot project="callmenuxsp-Sawfish_VoIP_2007_wk20:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+ <snapshot project="callstateidentificationxsp-Sawfish_VoIP_2007_wk33:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+ <snapshot project="calltypeidentificationxsp-Sawfish_VoIP_2007_wk20:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+ <snapshot project="logsserviceextension-Sawfish_VoIP_2007_wk33:project:ou1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw\VoIP" thread="1" />
+	<!-- VOIP baselines -->
+  <snapshot project="me_scd_desw-release5_200733:project:fa1cfspd#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="5" />			
+	
+	<checkout project="productconceptfw-s6032_2007_wk27:project:tr1nss#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" release="mc/next">
+	    <task id="tr1nss#34759" />
+	</checkout>
+	
+	<snapshot project="MCNaviscroll-0726_Inc7.1:project:fa1f5132#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="1" />
+	
+	<snapshot project="WLANSniffer2-2007_wk21:project:e002sa08#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="1" />
+	
+	<!-- Jan: 27.06.2007: adding phone activation thingie -->
+	<snapshot project="phoneactivation_2.0-he1dcm#07wk34_2:project:e003sa26#1" dir="E:\wbernard\ccm_wa\fa1f5132\0734\multimedia_sw" thread="1" />	
+</deliveryConfiguration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/validate_overlay/new_delivery/delivery.xml.parsed	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+<?xml version="1.0" ?>
+<build>
+    <spec name="mc_5132" abstract="true">
+        <set name="database" value="fa1f5132"/>
+        <set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740"/>
+        <set name="threads" value="4"/> 
+        <set name="release" value="mc/integration"/> 
+        
+        <spec name="ppd_sw-MCL_200726:project:sa1spp#1" type="snapshot"/>
+        <spec name="IBUSAL_RapidoYawe-jk1f5132#0732:project:jk1imeng#1" type="snapshot"/>
+        
+        <!-- temporary fix to handle two naviscroll projects -->
+        <spec name="naviscroll-jk1f5132#0728_2:project:tr1imeng#1" type="snapshot">
+	        <set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740\naviscroll-old"/>
+        </spec>
+        <spec name="sensor_server_adaptation-jk1f5132#0728_2:project:tr1imeng#1" type="snapshot">
+	        <set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740\sensor_server_adaptation-old"/>
+        </spec>
+        
+        <!-- this is for new driver  - requires change in sys_def to be compiled -->
+        <spec name="naviscroll-jk1f5132#0732:project:tr1imeng#1" type="snapshot">
+	        <set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740\naviscroll-new"/>
+        </spec>
+        <spec name="sensor_server_adaptation-jk1f5132#0732:project:tr1imeng#1" type="snapshot">
+	        <set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740\sensor_server_adaptation-new"/>
+        </spec>
+
+        <spec name="S60-S60.32_200726:project:sa1spp#1" type="snapshot">
+        	<set name="threads" value="10"/>
+        </spec>
+        
+        <spec name="T9TegicDelivery-tr1s60#AppBaseDo_direct_200707:project:ccm51#1" type="snapshot"/>
+        
+        <spec name="multimedia_sw" abstract="true">
+        	<set name="threads" value="1"/>
+	        <set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740\multimedia_sw"/>
+        	<spec name="maps-bh1cfloc#1.1_200725:project:tr1cfloc#1" type="snapshot"/>
+        	<spec name="fmtx-dev_200725:project:tr1nss#1" type="snapshot"/>
+        	<spec name="InternetRadio-InternetRadioA32_0726:project:sa1nssx4#1" type="snapshot"/>
+        	
+        	<!-- VOIP baselines -->
+	        <spec name="multimedia_sw" abstract="true">
+				<set name="dir" value="E:\wbernard\ccm_wa\fa1f5132\0740\multimedia_sw\VoIP"/>
+				<spec name="ipappservices_Domain_direct-ou1cfspd#Sawfish_2007wk27:project:he1cfsip#1" type="snapshot" />
+				<spec name="iptelephony-ou1cfspd#Sawfish_2007wk27:project:ou1s60rt#1" type="snapshot" />
+				<spec name="brandingserver-bh1s60#IMPPDo_Int_200725:project:tr1cfmsg#1" type="snapshot" />
+				<spec name="presencefw-IMPECDo_Int_200721:project:tr1cfmsg#1" type="snapshot" />
+				<spec name="simpledatamodeladapter-Sawfish_VoIP_2007_wk27:project:ou1cfspd#1" type="snapshot" />
+				<spec name="sipvoipcontactsextension-Sawfish_VoIP_2007_wk27:project:ou1cfspd#1" type="snapshot" />
+	  			<spec name="calllineidentificationxsp-Sawfish_VoIP_2007_wk27:project:ou1cfspd#1" type="snapshot" />
+  				<spec name="callloggingxsp-Sawfish_VoIP_2007_wk20:project:ou1cfspd#1" type="snapshot" />
+			    <spec name="callmenuxsp-Sawfish_VoIP_2007_wk20:project:ou1cfspd#1" type="snapshot" />
+  				<spec name="callstateidentificationxsp-Sawfish_VoIP_2007_wk27:project:ou1cfspd#1" type="snapshot" />
+  				<spec name="calltypeidentificationxsp-Sawfish_VoIP_2007_wk20:project:ou1cfspd#1" type="snapshot" />
+  				<spec name="logsserviceextension-Sawfish_VoIP_2007_wk27:project:ou1cfspd#1" type="snapshot" />
+			</spec>
+			
+			<spec name="me_scd_desw-release5_200729v1:project:fa1cfspd#1" type="snapshot" />			
+	
+			<spec name="productconceptfw-s6032_2007_wk27:project:tr1nss#1" type="checkout">
+	    		<set name="tasks" value="tr1nss#34759" />
+	    		<set name="threads" value="5"/>
+			</spec>
+	
+			<spec name="MCNaviscroll-0726_Inc7.1:project:fa1f5132#1" type="snapshot" />	
+			<spec name="WLANSniffer2-2007_wk21:project:e002sa08#1" type="snapshot" />
+	
+			<!-- Jan: 27.06.2007: adding phone activation thingie -->
+			<spec name="phoneactivation_2.0-he1dcm#07wk31_4:project:e003sa26#1" type="snapshot"/>
+
+	    </spec>
+    </spec>
+</build>
+
+
+	
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/validate_overlay/new_delivery/prep.xml.parsed	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<prepSpec>
+    <config>
+				<exclude name="abld.bat"/>
+				<exclude name=".static_wa"/>
+				<exclude name="_ccmwaid.inf"/>
+				<exclude name="documentation/*"/>
+				<exclude name="documents/*"/>
+				<exclude name="doc/*"/>
+				<!-- Fix to missing .bmp files in s60\md\java component. Files were missing since javahelper.mbm file was existing under \epoc32\.. 
+				and it wasn't executing the epocmbm.pl command in the makefile. This is required only when using (i.e. unzipping) Symbian binaries  -->
+				<exclude name="javahelper.mbm"/>
+		</config>
+<!-- Other possible excludable folders -->
+<!--				<exclude name="e32test/*"/> -->
+<!--				<exclude name="f32test/*"/> -->
+<!--				<exclude name="WINCW/*"/> -->
+<!--				<exclude name="WINC/*"/> -->
+<!--				<exclude name="WINS/*"/> -->
+<!--				<exclude name="bwins/*"/> -->
+<!--				<exclude name="swins/*"/> -->
+<!--				<exclude name="WINSCW/*"/> -->
+		
+		<source label="Symbian" basedir="\\fasamba\dfs\r1120_isis\NT\Build_and_Release\GRACE\MC\SOS\__SymbianOS_9.3\SymbianOS_93_2007_wk36">
+				<unzip name="MCL_93_200736_src_generic_part1.zip"/>
+				<unzip name="MCL_93_200736_src_generic_part2.zip"/>
+				<unzip name="MCL_93_200736_src_generic_part3.zip"/>
+				<unzip name="MCL_93_200736_src_cedar.zip"/>
+				<unzip name="MCL_93_200736_src_common_other_sources_part2.zip"/>
+
+				<!-- This is required to generate all the .jar files correctly under \epoc32\tools\ -->
+				<unzip name="MCL_93_200736_src_product.zip" dest="z:/src"/>
+
+				<unzip name="MCL_93_200736_epoc32.zip"/>
+				<unzip name="MCL_93_200736_epoc32_RELEASE_ARMV5.zip"/>
+		</source>
+
+		<!-- Unzip (ICF/ICD)'s if there are any -->
+		<source name="icds" basedir="">
+			<unzipicds dest="z:\">
+				<!-- Unzipping from following location
+						 * S60
+						 * common
+						 * product
+					-->
+				<location name="E:\wbernard\ccm_wa\fa1f5132\0740/S60/S60/Symbian_ICD_ICF/93_200736" />
+				<location name="E:\wbernard\ccm_wa\fa1f5132\mc-fa1f5132#0728_ec\mc\mc_build\mc_5132_build../../../mc_overlay/mc_5132_overlay/common/files/Symbian_ICD_ICF/93_200736" />
+			</unzipicds>
+		</source>
+
+		<!-- copying  s60 content -->
+		<source label="S60" basedir="E:\wbernard\ccm_wa\fa1f5132\0740">
+			<copy name="S60/s60"	 dest="s60" />
+		</source>
+
+
+		<source label="PPD" basedir="E:\wbernard\ccm_wa\fa1f5132\0740">
+			<copy name="ppd_sw/ppd_sw"					dest="ppd_sw"/>			
+		</source>
+		
+		<source label="IBUSAL51" basedir="E:\wbernard\ccm_wa\fa1f5132\0740/">
+			<copy name="IBUSAL_RapidoYawe/IBUSAL_RapidoYawe"/>
+		</source>
+		
+   <source label="MULTIMEDIA_SW" basedir="E:\wbernard\ccm_wa\fa1f5132\0740">
+		 	<copy name="multimedia_sw"				 dest="multimedia_sw"/>
+	 </source>
+
+		<source label="NSS_ICONS" basedir="\\fasamba\dfs\r1120_isis\NT\Build_and_Release\GRACE\MC\NSS">
+					 <unzip name="nss_sources_3_2_wk34.zip" dest="ppd_sw/nss_sw"/>
+		</source>
+
+		<source label="CELLMO" basedir="\\fasamba\dfs\r1120_isis\NT\Build_and_Release\GRACE\MC\Cellmo\product">
+				<!-- product cellmo copy -->
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product\rm187_rapido_v1_1_flsh_image.hex"	tofile="epoc32/rom/config/platform/product/dsp.hex"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product\nalo.axf"			tofile="epoc32/rom/config/platform/product/nalo.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product\naloext.axf"		tofile="epoc32/rom/config/platform/product/naloext.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product\3rd.bin" 			tofile="epoc32/rom/config/platform/product/3rd.bin"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product\rm235_07wk15v20.out"	tofile="epoc32/rom/config/platform/product/isa.out"/>
+				<!-- product Edge cellmo copy -->
+        			<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_chn\wg41s_edge_rapido_v1_1_flsh_image.hex"	tofile="epoc32/rom/config/platform/product_edge/dsp.hex"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_chn\nalo.axf"			tofile="epoc32/rom/config/platform/product_edge/nalo.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_chn\naloext.axf"		tofile="epoc32/rom/config/platform/product_edge/naloext.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_chn\3rd.bin" 			tofile="epoc32/rom/config/platform/product_edge/3rd.bin"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_chn\rm236_07wk15v20.out"	tofile="epoc32/rom/config/platform/product_edge/isa.out"/>
+				<!--
+				<branchInfo originator="tpekkane">
+				Americas variant integration
+				</branchInfo>
+				BRANCH 21-Sep-2007
+				-->
+				<!-- product Americas/lta cellmo copy -->
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_lta\dsp50_RAPIDO_v1_1.hex" tofile="epoc32/rom/config/platform/product_lta/dsp.hex"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_lta\nalo.axf"			tofile="epoc32/rom/config/platform/product_lta/nalo.axf"/>	
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_lta\naloext.axf"		tofile="epoc32/rom/config/platform/product_lta/naloext.axf"/>			
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_lta\3rd.bin" 			tofile="epoc32/rom/config/platform/product_lta/3rd.bin"/>			
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v20\product_lta\rm342_07wk15v20.out"	tofile="epoc32/rom/config/platform/product_lta/isa.out"/>
+				<!-- BRANCH_END -->
+		</source>
+
+		<source label="T9TegicDelivery" basedir="E:\wbernard\ccm_wa\fa1f5132\0740">
+				<copy name="T9TegicDelivery\T9TegicDelivery" dest="S60\mw\inputmethods\textinput\T9TegicDelivery" />
+		</source>
+
+		<!-- Copying ppd patch sw -->
+		<source label="psw" basedir="z:">
+				<copy name="psw\ncp_psw\psw"/>
+				<copy name="psw\ncp_psw\platform_psw\psw"/>
+				<copy name="psw\ncp_psw\platform_psw\platform_product_psw\psw"/>
+				<copy name="psw\s60_32_psw\psw"/>
+				<copy name="psw\s60_32_psw\51.32_psw\psw"/>
+				<copy name="psw\ncp_psw\platform_psw\ncp_psw"/>
+		</source>
+	        
+ 
+   	<!-- Apply the overlays first -->
+		<source label="mc" basedir="E:\wbernard\ccm_wa\fa1f5132\mc-fa1f5132#0728_ec\mc\mc_build\mc_5132_build../../..">
+				<copy name="mc_overlay/mc_5132_overlay/common/files"/>
+        <copy name="mc_overlay/mc_5132_overlay/common/files" dest="mc/mc_overlay/mc_5132_overlay/common/files" />
+				<!-- bvsupport <copy name="mc_overlay/mc_5132_overlay/mc_5132_overlay/files"/>-->
+
+				<copy name="mc_build" dest="mc/mc_build"/>
+				<copy name="mc_config" dest="mc/mc_config"/> <!-- variation folder will be there -->
+				<copy name="mc_sw" dest="mc/mc_sw"/>
+
+		    <!-- This is required for FMTx Increment 6 -->
+		    <copy name="mc_config\mc_5132_config\mc_5132\include\ProductStaticFeatures.hrh" tofile="epoc32\include\oem\ProductStaticFeatures.hrh"/>
+				
+				<!-- SPP CARBON CHANGE:  markhyvo: 						-->
+		    <copy name="mc_config\mc_5132_config\mc_5132\include\ProductVariant.hrh" tofile="epoc32\include\oem\ProductVariant.hrh"/>
+        <copy name="mc_config\mc_5132_config\mc_5132\include\ProductVariant.hrh" tofile="S60\misc\release\bldvariant\common\ProductVariant.hrh"/>
+        <copy name="mc_config\mc_5132_config\mc_5132\include\ProductVariant.hrh" tofile="config\s60_32_config\51.32_config\config\inc\ProductVariant.hrh"/>
+		</source>
+
+		<!-- Copying helium from its location. -->
+		<source label="mc" basedir="E:\wbernard\workspace\helium/../">
+			<copy name="helium" dest="mc/helium"/>
+		</source>
+   
+    <!-- desw config -->
+	  <source label="desw" basedir="z:">
+        <copy name="\s60\mw\uiresources\uiresources_dom\icon_build_locations_api\inc\iconlocations.hrh" tofile="\epoc32\include\oem\iconlocations.hrh" />
+	      <copy name="\multimedia_sw\me_scd_desw\me_scd_desw\variation\product\DeSwFlagsproduct.hrh" tofile="\epoc32\include\oem\DeSwFlagsproduct.hrh" />
+		</source>
+   
+    <source label="PP_manual_exports" basedir="z:">
+			<!-- NCP manual exports required before bldmake bldfiles phase where  bldvariant is included-->
+		  <copy name="config/ncp_config/config/inc/feature_settings.hrh" tofile="epoc32/include/oem/feature_settings.hrh"/>
+			<copy name="config/s60_32_config/51.32_config/config/inc/spp_feature_settings.hrh" tofile="epoc32/include/oem/spp_feature_settings.hrh"/>
+			<copy name="config/ncp_config/config/inc/ncp_feature_consts.hrh" tofile="epoc32/include/oem/ncp_feature_consts.hrh"/>
+			<copy name="config/ncp_config/platform_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/oem/ncp_feature_settings.hrh"/>
+			<copy name="config/ncp_config/platform_config/config/inc/adaptation_conf.h" tofile="epoc32/include/internal/adaptation_conf.h"/>
+    	<copy name="config/ncp_config/platform_config/config/inc/adaptation_features.hrh" tofile="epoc32/include/oem/adaptation_features.hrh"/>
+		  <copy name="config/ncp_config/platform_config/config/inc/Symbian.hrh" tofile="epoc32/include/oem/Symbian.hrh"/>
+			<copy name="config/ncp_config/config/inc/spp_variant.cfg" tofile="EPOC32/tools/variant/spp_variant.cfg"/>
+      <copy name="config/ncp_config/config/inc/ncp_consts.hrh" tofile="epoc32/include/oem/ncp_consts.hrh"/>
+	    <copy name="ncp_sw/corecom/aasw/AaCommonTools/config/audio_sw_conf.hrh" tofile="epoc32/include/internal/audio_sw_conf.hrh"/>
+	    <copy name="ncp_sw/corecom/aasw/AaCommonTools/config/audio_sw_external_conf.hrh" tofile="epoc32/include/internal/audio_sw_external_conf.hrh"/>
+			
+			<copy name="config\s60_32_config\config\inc\bldregional.hrh"     tofile="epoc32\include\oem\bldregional.hrh"/>
+			<copy name="config\s60_32_config\config\inc\bldvariant.hrh"			tofile="epoc32\include\oem\bldvariant.hrh"/>
+      <copy name="config\s60_32_config\config\inc\bldpublic.hrh"			tofile="epoc32\include\oem\bldpublic.hrh"/>
+      <copy name="config\s60_32_config\config\inc\bldprivate.hrh"			tofile="epoc32\include\oem\bldprivate.hrh"/>
+      <copy name="config\s60_32_config\config\inc\bldcodeline.hrh"			tofile="epoc32\include\oem\bldcodeline.hrh"/>
+      <copy name="config\s60_32_config\config\inc\privateruntimeids.hrh"		tofile="epoc32\include\oem\privateruntimeids.hrh"/>
+      <copy name="config\s60_32_config\config\inc\publicruntimeids.hrh"		tofile="epoc32\include\oem\publicruntimeids.hrh"/>
+      <copy name="config\s60_32_config\config\inc\PublicStaticFeatures.hrh"		tofile="epoc32\include\oem\PublicStaticFeatures.hrh"/>
+      <copy name="config\s60_32_config\config\inc\PrivateStaticFeatures.hrh"	tofile="epoc32\include\oem\PrivateStaticFeatures.hrh"/>
+      <copy name="config\s60_32_config\config\inc\PlatformStaticFeatures.hrh"	tofile="epoc32\include\oem\PlatformStaticFeatures.hrh"/>
+			<!-- bsf files needed to export here so that variation information is valid on time-->
+	    <copy name="config/ncp_config/config/tools/ARM11.bsf" tofile="epoc32/tools/ARM11.bsf"/>
+	    <copy name="config/ncp_config/config/tools/ARM11_arm.bsf" tofile="epoc32/tools/ARM11_arm.bsf"/>
+	    <copy name="config/ncp_config/config/tools/ARM926_arm.bsf" tofile="epoc32/tools/ARM926_arm.bsf"/>
+	    <copy name="config/ncp_config/config/tools/ARM9E.bsf" tofile="epoc32/tools/ARM9E.bsf"/>
+	    <copy name="config/ncp_config/config/tools/config.bsf" tofile="epoc32/tools/config.bsf"/>
+	    <copy name="config/ncp_config/config/tools/variant.bsf" tofile="epoc32/tools/variant.bsf"/>
+	    <copy name="config/ncp_config/platform_config/config/tools/platform.bsf" tofile="epoc32/tools/platform.bsf"/>
+	    <!-- <copy name="config/ncp_config/platform_config/config/tools/platform.bsf" tofile="epoc32/tools/platform.bsf"/>
+	    <copy name="config/ncp_config/platform_config/config/tools/platform.bsf" tofile="epoc32/tools/platform.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon51.bsf" tofile="epoc32/tools/devlon51.bsf"/>-->
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_edge_config/config/tools/product_edge.bsf" tofile="epoc32/tools/product_edge.bsf"/>
+	    <!--<copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_r3_config/config/tools/devlon51_r3.bsf" tofile="epoc32/tools/devlon51_r3.bsf"/>	    
+	    <copy name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon70.bsf" tofile="epoc32/tools/devlon70.bsf"/>-->
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/devlon51/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_edge_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product_edge/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_r3_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/devlon51_r3/ncp_feature_settings.hrh"/>
+      <copy name="config/ncp_config/platform_config/platform_devlon_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/devlon70/ncp_feature_settings.hrh"/>
+	    <del name="config/ncp_config/platform_config/config/tools/platform.bsf"/>
+	    <del name="config/ncp_config/platform_config/config/tools/platform.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon51.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_devlon_r3_config/config/tools/devlon51_r3.bsf"/>	    
+	    <del name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon70.bsf"/>
+	  </source>
+
+    
+		<!-- NCP manual exports required due to missing bld.inf -->
+		<source label="NCP_config" basedir="z:">
+				<!-- Copying spp modified tools -->
+				<copy name="tools\ncp_tools\toolsmod_93" />
+                                <!-- 
+				<copy name="config\s60_32_config\51.32_config\51.32_${product.base.name}_config\config\inc\spp_feature_settings.hrh" tofile="epoc32\include\oem\spp_feature_settings.hrh"/>
+                                 -->
+				<copy name="config\s60_32_config\51.32_config\config\rom\config\my_romfiles.txt" tofile="epoc32\rombuild\my_romfiles.txt"/>
+		</source>
+
+		<source label="S60_config" basedir="z:">
+				<copy name="src\cedar\generic\utils\Symbian_OS_v9.3.hrh" tofile="epoc32\INCLUDE\variant\Symbian_OS_v9.3.hrh"/>
+				<copy name="src\cedar\generic\utils\Symbian_OS_v9.3_cbrtargetalias.cfg" tofile="epoc32\tools\variant\cbrtargetalias.cfg"/>
+				
+				
+		<!-- SPP CARBON CHANGE:  markhyvo: 		<copy name="S60\misc\release\bldvariant\elaf\data\bldvariant.hrh" tofile="epoc32\include\oem\bldvariant.hrh"/>  -->
+				<!-- variant.cfg is absoultely critical as it is being used during "bldmake bldfiles",
+						 otherwise the makefiles won't generte correctly -->
+				<copy name="S60\misc\release\bldvariant\common\variant.cfg" tofile="EPOC32\tools\variant\variant.cfg"/>
+				<copy name="S60\misc\release\bldvariant\common\features.hrh" tofile="epoc32\include\oem\features.hrh"/>
+				<copy name="S60\misc\release\bldvariant\common\defaultcaps.hrh" tofile="epoc32\include\oem\defaultcaps.hrh"/>
+		    <copy name="S60\misc\release\S60Exports\tools\S60IBYMACROS.PM" tofile="epoc32\tools\S60IBYMACROS.PM"/>
+		    
+		    <!--On S60 3.2 w16 platform_paths.hrh has changed place -->
+		    <copy name="S60\osext\systemswextensions\sysswext_dom\platform_path_definitions_api\inc\platform_paths.hrh"  tofile="epoc32\include\domain\osextensions\platform_paths.hrh"/>
+		    <copy name="S60\osext\systemswextensions\sysswext_dom\platform_path_definitions_api\inc\platform_paths.hrh"  tofile="epoc32\include\oem\platform_paths.hrh"/>
+		    <copy name="S60\osext\systemswextensions\sysswext_dom\platform_path_definitions_api\inc\platform_paths.hrh"  tofile="epoc32\include\oem\domain\osextensions\platform_paths.hrh"/>
+		    
+		</source>
+
+<!--  BRANCH 07-09-07: wb -->	
+		<source label="custom_manual_exports" basedir="z:">
+			<!-- Patch tools under symbian -->
+			<copy name="\src\common\generic\tools\build\GenXml.pm" tofile="\epoc32\tools\build\GenXml.pm" />
+		</source>
+<!-- BRANCH_END 07-09-07: wb -->
+		<!-- unzip possbile patches for nightly build -->
+		<source name="patches" basedir="">
+			<unzipicds dest="z:\">
+				<location name="\\jknfs05\cms_wa\5132_wa\MC\patch\0740" />
+				<include name="*" />
+			</unzipicds>
+		</source>
+		
+</prepSpec>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/validate_overlay/prep.xml.parsed	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<prepSpec>
+    <config>
+				<exclude name="abld.bat"/>
+				<exclude name=".static_wa"/>
+				<exclude name="_ccmwaid.inf"/>
+				<exclude name="documentation/*"/>
+				<exclude name="documents/*"/>
+				<exclude name="doc/*"/>
+		</config>
+<!-- Other possible excludable folders -->
+<!--				<exclude name="e32test/*"/> -->
+<!--				<exclude name="f32test/*"/> -->
+<!--				<exclude name="WINCW/*"/> -->
+<!--				<exclude name="WINC/*"/> -->
+<!--				<exclude name="WINS/*"/> -->
+<!--				<exclude name="bwins/*"/> -->
+<!--				<exclude name="swins/*"/> -->
+<!--				<exclude name="WINSCW/*"/> -->
+		
+		<source label="Symbian" basedir="\\fasamba\dfs\r1120_isis\NT\Build_and_Release\GRACE\MC\SOS\__SymbianOS_9.3\SymbianOS_93_2007_wk30">
+				<unzip name="MCL_93_200730_src_generic_part1.zip"/>
+				<unzip name="MCL_93_200730_src_generic_part2.zip"/>
+				<unzip name="MCL_93_200730_src_generic_part3.zip"/>
+				<unzip name="MCL_93_200730_src_cedar.zip"/>
+				<unzip name="MCL_93_200730_src_common_other_sources_part2.zip"/>
+
+				<!-- This is required to generate all the .jar files correctly under \epoc32\tools\ -->
+				<unzip name="MCL_93_200730_src_product.zip" dest="z:/src"/>
+
+				<unzip name="MCL_93_200730_epoc32.zip"/>
+				<unzip name="MCL_93_200730_epoc32_RELEASE_ARMV5.zip"/>
+		</source>
+
+		<!-- Unzip (ICF/ICD)'s if there are any -->
+		<source name="icds" basedir="">
+			<unzipicds dest="z:\">
+				<!-- Unzipping from following location
+						 * S60
+						 * common
+						 * product
+					-->
+				<location name="E:\wbernard\ccm_wa\fa1f5132\0734/S60/S60/Symbian_ICD_ICF/93_200730" />
+				<location name="E:\wbernard\ccm_wa\fa1f5132\mc-fa1f5132#loc_0734\mc\mc_build\mc_5132_build../../../mc_overlay/mc_5132_overlay/common/files/Symbian_ICD_ICF/93_200730" />
+			</unzipicds>
+		</source>
+
+		<!-- copying  s60 content -->
+		<source label="S60" basedir="E:\wbernard\ccm_wa\fa1f5132\0734">
+			<copy name="S60/s60"	 dest="s60" />
+		</source>
+
+
+		<source label="PPD" basedir="E:\wbernard\ccm_wa\fa1f5132\0734">
+			<copy name="ppd_sw/ppd_sw"					dest="ppd_sw"/>			
+		</source>
+		
+		<source label="IBUSAL51" basedir="E:\wbernard\ccm_wa\fa1f5132\0734/">
+			<copy name="IBUSAL_RapidoYawe/IBUSAL_RapidoYawe"/>
+		</source>
+		
+		<!-- temporary fix to handle two naviscroll projects -->
+		<source label="naviscroll" basedir="E:\wbernard\ccm_wa\fa1f5132\0734/">
+		    <copy name="naviscroll-old/naviscroll/naviscroll" dest="Ibusal_internal/Navi/naviscroll" />
+		</source>
+		<source label="sensor_server_adaptation" basedir="E:\wbernard\ccm_wa\fa1f5132\0734/">
+		    <copy name="sensor_server_adaptation-old/sensor_server_adaptation/sensor_server_adaptation" dest="Ibusal_internal/Navi/sensor_server_adaptation" />
+		</source>
+		<!-- this is for new driver  - requires change in sys_def to be compiled -->
+		<source label="naviscroll" basedir="E:\wbernard\ccm_wa\fa1f5132\0734/">
+		    <copy name="naviscroll-new/naviscroll/naviscroll" dest="ncp_sw/corecom/bbc_components/ibusal_rapidoyawe/naviscroll" />
+		</source>
+		<source label="sensor_server_adaptation" basedir="E:\wbernard\ccm_wa\fa1f5132\0734/">
+		    <copy name="sensor_server_adaptation-new/sensor_server_adaptation/sensor_server_adaptation" dest="ncp_sw/corecom/bbc_components/ibusal_rapidoyawe/sensor_server_adaptation" />
+		</source>
+
+   <source label="MULTIMEDIA_SW" basedir="E:\wbernard\ccm_wa\fa1f5132\0734">
+		 	<copy name="multimedia_sw"				 dest="multimedia_sw"/>
+	 </source>
+
+		<source label="NSS_ICONS" basedir="\\fasamba\dfs\r1120_isis\NT\Build_and_Release\GRACE\MC\NSS">
+					 <unzip name="nss_sources_3_2_wk32.zip" dest="ppd_sw/nss_sw"/>
+		</source>
+
+		<source label="CELLMO" basedir="\\fasamba\dfs\r1120_isis\NT\Build_and_Release\GRACE\MC\Cellmo\product">
+				<!-- product cellmo copy -->
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product\rm187_rapido_v1_1_flsh_image.hex"	tofile="epoc32/rom/config/platform/product/dsp.hex"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product\nalo.axf"			tofile="epoc32/rom/config/platform/product/nalo.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product\naloext.axf"		tofile="epoc32/rom/config/platform/product/naloext.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product\3rd.bin" 			tofile="epoc32/rom/config/platform/product/3rd.bin"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product\rm235_07wk15v14.out"	tofile="epoc32/rom/config/platform/product/isa.out"/>
+				<!-- product Edge cellmo copy -->
+        			<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product_chn\wg41s_edge_rapido_v1_1_flsh_image.hex"	tofile="epoc32/rom/config/platform/product_edge/dsp.hex"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product_chn\nalo.axf"			tofile="epoc32/rom/config/platform/product_edge/nalo.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product_chn\naloext.axf"		tofile="epoc32/rom/config/platform/product_edge/naloext.axf"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product_chn\3rd.bin" 			tofile="epoc32/rom/config/platform/product_edge/3rd.bin"/>
+				<copy name="\Releases\IBUSAL_CellMo\2007_wk15_PB\2007wk15v14\product_chn\rm236_07wk15v14.out"	tofile="epoc32/rom/config/platform/product_edge/isa.out"/>
+		</source>
+
+		<source label="T9TegicDelivery" basedir="E:\wbernard\ccm_wa\fa1f5132\0734">
+				<copy name="T9TegicDelivery\T9TegicDelivery" dest="S60\mw\inputmethods\textinput\T9TegicDelivery" />
+		</source>
+
+		<!-- Copying ppd patch sw -->
+		<source label="psw" basedir="z:">
+				<copy name="psw\ncp_psw\psw"/>
+				<copy name="psw\ncp_psw\platform_psw\psw"/>
+				<copy name="psw\ncp_psw\platform_psw\platform_product_psw\psw"/>
+				<copy name="psw\s60_32_psw\psw"/>
+				<copy name="psw\s60_32_psw\51.32_psw\psw"/>
+				<copy name="psw\ncp_psw\platform_psw\ncp_psw"/>
+		</source>
+	        
+ 
+   	<!-- Apply the overlays first -->
+		<source label="mc" basedir="E:\wbernard\ccm_wa\fa1f5132\mc-fa1f5132#loc_0734\mc\mc_build\mc_5132_build../../..">
+				<copy name="mc_overlay/mc_5132_overlay/common/files"/>
+        <copy name="mc_overlay/mc_5132_overlay/common/files" dest="mc/mc_overlay/mc_5132_overlay/common/files" />
+				<!-- bvsupport <copy name="mc_overlay/mc_5132_overlay/mc_5132_overlay/files"/>-->
+
+				<copy name="mc_build" dest="mc/mc_build"/>
+				<copy name="mc_config" dest="mc/mc_config"/> <!-- variation folder will be there -->
+				<copy name="mc_sw" dest="mc/mc_sw"/>
+
+		    <!-- This is required for FMTx Increment 6 -->
+		    <copy name="mc_config\mc_5132_config\mc_5132\include\ProductStaticFeatures.hrh" tofile="epoc32\include\oem\ProductStaticFeatures.hrh"/>
+				
+				<!-- SPP CARBON CHANGE:  markhyvo: 						-->
+		    <copy name="mc_config\mc_5132_config\mc_5132\include\ProductVariant.hrh" tofile="epoc32\include\oem\ProductVariant.hrh"/>
+        <copy name="mc_config\mc_5132_config\mc_5132\include\ProductVariant.hrh" tofile="S60\misc\release\bldvariant\common\ProductVariant.hrh"/>
+        <copy name="mc_config\mc_5132_config\mc_5132\include\ProductVariant.hrh" tofile="config\s60_32_config\51.32_config\config\inc\ProductVariant.hrh"/>
+		</source>
+
+		<!-- Copying helium from its location. -->
+		<source label="mc" basedir="E:\buildbot\slaves\fasym015-win32\fasym015-win32\build\helium/../">
+			<copy name="helium" dest="mc/helium"/>
+		</source>
+   
+    <!-- desw config -->
+	  <source label="desw" basedir="z:">
+        <copy name="\s60\mw\uiresources\uiresources_dom\icon_build_locations_api\inc\iconlocations.hrh" tofile="\epoc32\include\oem\iconlocations.hrh" />
+	      <copy name="\multimedia_sw\me_scd_desw\me_scd_desw\variation\product\DeSwFlagsproduct.hrh" tofile="\epoc32\include\oem\DeSwFlagsproduct.hrh" />
+		</source>
+   
+    <source label="PP_manual_exports" basedir="z:">
+			<!-- NCP manual exports required before bldmake bldfiles phase where  bldvariant is included-->
+		  <copy name="config/ncp_config/config/inc/feature_settings.hrh" tofile="epoc32/include/oem/feature_settings.hrh"/>
+			<copy name="config/s60_32_config/51.32_config/config/inc/spp_feature_settings.hrh" tofile="epoc32/include/oem/spp_feature_settings.hrh"/>
+			<copy name="config/ncp_config/config/inc/ncp_feature_consts.hrh" tofile="epoc32/include/oem/ncp_feature_consts.hrh"/>
+			<copy name="config/ncp_config/platform_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/oem/ncp_feature_settings.hrh"/>
+			<copy name="config/ncp_config/platform_config/config/inc/adaptation_conf.h" tofile="epoc32/include/internal/adaptation_conf.h"/>
+    	<copy name="config/ncp_config/platform_config/config/inc/adaptation_features.hrh" tofile="epoc32/include/oem/adaptation_features.hrh"/>
+		  <copy name="config/ncp_config/platform_config/config/inc/Symbian.hrh" tofile="epoc32/include/oem/Symbian.hrh"/>
+			<copy name="config/ncp_config/config/inc/spp_variant.cfg" tofile="EPOC32/tools/variant/spp_variant.cfg"/>
+      <copy name="config/ncp_config/config/inc/ncp_consts.hrh" tofile="epoc32/include/oem/ncp_consts.hrh"/>
+	    <copy name="ncp_sw/corecom/aasw/AaCommonTools/config/audio_sw_conf.hrh" tofile="epoc32/include/internal/audio_sw_conf.hrh"/>
+	    <copy name="ncp_sw/corecom/aasw/AaCommonTools/config/audio_sw_external_conf.hrh" tofile="epoc32/include/internal/audio_sw_external_conf.hrh"/>
+			
+			<copy name="config\s60_32_config\config\inc\bldvariant.hrh"			tofile="epoc32\include\oem\bldvariant.hrh"/>
+      <copy name="config\s60_32_config\config\inc\bldpublic.hrh"			tofile="epoc32\include\oem\bldpublic.hrh"/>
+      <copy name="config\s60_32_config\config\inc\bldprivate.hrh"			tofile="epoc32\include\oem\bldprivate.hrh"/>
+      <copy name="config\s60_32_config\config\inc\bldcodeline.hrh"			tofile="epoc32\include\oem\bldcodeline.hrh"/>
+      <copy name="config\s60_32_config\config\inc\privateruntimeids.hrh"		tofile="epoc32\include\oem\privateruntimeids.hrh"/>
+      <copy name="config\s60_32_config\config\inc\publicruntimeids.hrh"		tofile="epoc32\include\oem\publicruntimeids.hrh"/>
+      <copy name="config\s60_32_config\config\inc\PublicStaticFeatures.hrh"		tofile="epoc32\include\oem\PublicStaticFeatures.hrh"/>
+      <copy name="config\s60_32_config\config\inc\PrivateStaticFeatures.hrh"	tofile="epoc32\include\oem\PrivateStaticFeatures.hrh"/>
+      <copy name="config\s60_32_config\config\inc\PlatformStaticFeatures.hrh"	tofile="epoc32\include\oem\PlatformStaticFeatures.hrh"/>
+			<!-- bsf files needed to export here so that variation information is valid on time-->
+	    <copy name="config/ncp_config/config/tools/ARM11.bsf" tofile="epoc32/tools/ARM11.bsf"/>
+	    <copy name="config/ncp_config/config/tools/ARM11_arm.bsf" tofile="epoc32/tools/ARM11_arm.bsf"/>
+	    <copy name="config/ncp_config/config/tools/ARM926_arm.bsf" tofile="epoc32/tools/ARM926_arm.bsf"/>
+	    <copy name="config/ncp_config/config/tools/ARM9E.bsf" tofile="epoc32/tools/ARM9E.bsf"/>
+	    <copy name="config/ncp_config/config/tools/config.bsf" tofile="epoc32/tools/config.bsf"/>
+	    <copy name="config/ncp_config/config/tools/variant.bsf" tofile="epoc32/tools/variant.bsf"/>
+	    <copy name="config/ncp_config/platform_config/config/tools/platform.bsf" tofile="epoc32/tools/platform.bsf"/>
+	    <!-- <copy name="config/ncp_config/platform_config/config/tools/platform.bsf" tofile="epoc32/tools/platform.bsf"/>
+	    <copy name="config/ncp_config/platform_config/config/tools/platform.bsf" tofile="epoc32/tools/platform.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon51.bsf" tofile="epoc32/tools/devlon51.bsf"/>-->
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_edge_config/config/tools/product_edge.bsf" tofile="epoc32/tools/product_edge.bsf"/>
+	    <!--<copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf" tofile="epoc32/tools/product.bsf"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_r3_config/config/tools/devlon51_r3.bsf" tofile="epoc32/tools/devlon51_r3.bsf"/>	    
+	    <copy name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon70.bsf" tofile="epoc32/tools/devlon70.bsf"/>-->
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/devlon51/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_edge_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product_edge/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_product_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/product/ncp_feature_settings.hrh"/>
+	    <copy name="config/ncp_config/platform_config/platform_devlon_r3_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/devlon51_r3/ncp_feature_settings.hrh"/>
+      <copy name="config/ncp_config/platform_config/platform_devlon_config/config/inc/ncp_feature_settings.hrh" tofile="epoc32/include/config/platform/devlon70/ncp_feature_settings.hrh"/>
+	    <del name="config/ncp_config/platform_config/config/tools/platform.bsf"/>
+	    <del name="config/ncp_config/platform_config/config/tools/platform.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon51.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_product_config/config/tools/product.bsf"/>
+	    <del name="config/ncp_config/platform_config/platform_devlon_r3_config/config/tools/devlon51_r3.bsf"/>	    
+	    <del name="config/ncp_config/platform_config/platform_devlon_config/config/tools/devlon70.bsf"/>
+	  </source>
+
+    
+		<!-- NCP manual exports required due to missing bld.inf -->
+		<source label="NCP_config" basedir="z:">
+				<!-- Copying spp modified tools -->
+				<copy name="tools\ncp_tools\toolsmod_93" />
+                                <!-- 
+				<copy name="config\s60_32_config\51.32_config\51.32_${product.base.name}_config\config\inc\spp_feature_settings.hrh" tofile="epoc32\include\oem\spp_feature_settings.hrh"/>
+                                 -->
+				<copy name="config\s60_32_config\51.32_config\config\rom\config\my_romfiles.txt" tofile="epoc32\rombuild\my_romfiles.txt"/>
+		</source>
+
+		<source label="S60_config" basedir="z:">
+				<copy name="src\cedar\generic\utils\Symbian_OS_v9.3.hrh" tofile="epoc32\INCLUDE\variant\Symbian_OS_v9.3.hrh"/>
+				<copy name="src\cedar\generic\utils\Symbian_OS_v9.3_cbrtargetalias.cfg" tofile="epoc32\tools\variant\cbrtargetalias.cfg"/>
+				
+				
+		<!-- SPP CARBON CHANGE:  markhyvo: 		<copy name="S60\misc\release\bldvariant\elaf\data\bldvariant.hrh" tofile="epoc32\include\oem\bldvariant.hrh"/>  -->
+				<!-- variant.cfg is absoultely critical as it is being used during "bldmake bldfiles",
+						 otherwise the makefiles won't generte correctly -->
+				<copy name="S60\misc\release\bldvariant\common\variant.cfg" tofile="EPOC32\tools\variant\variant.cfg"/>
+				<copy name="S60\misc\release\bldvariant\common\features.hrh" tofile="epoc32\include\oem\features.hrh"/>
+				<copy name="S60\misc\release\bldvariant\common\defaultcaps.hrh" tofile="epoc32\include\oem\defaultcaps.hrh"/>
+		    <copy name="S60\misc\release\S60Exports\tools\S60IBYMACROS.PM" tofile="epoc32\tools\S60IBYMACROS.PM"/>
+		    
+		    <!--On S60 3.2 w16 platform_paths.hrh has changed place -->
+		    <copy name="S60\osext\systemswextensions\sysswext_dom\platform_path_definitions_api\inc\platform_paths.hrh"  tofile="epoc32\include\domain\osextensions\platform_paths.hrh"/>
+		    <copy name="S60\osext\systemswextensions\sysswext_dom\platform_path_definitions_api\inc\platform_paths.hrh"  tofile="epoc32\include\oem\platform_paths.hrh"/>
+		    <copy name="S60\osext\systemswextensions\sysswext_dom\platform_path_definitions_api\inc\platform_paths.hrh"  tofile="epoc32\include\oem\domain\osextensions\platform_paths.hrh"/>
+		    
+		</source>
+
+<!--  BRANCH 04-06-07: Petraisa: Merge task fa1f5132#18403 -->	
+		<source label="custom_manual_exports" basedir="z:">
+			<!-- Export screensaver -->
+			<copy name="/ppd_sw/nss_sw/nss_graphics/nseries3_theme_3_1/Nseries3_screensaver_1.swf" tofile="epoc32/data/Z/private/10207114/import/10281cc3/Nseries3_screensaver_1.swf" />
+		</source>		 
+
+<!-- BRANCH_END 04-06-07: Petraisa -->
+		<!-- unzip possbile patches for nightly build -->
+		<source name="patches" basedir="">
+			<unzipicds dest="z:\">
+				<location name="\\jknfs05\cms_wa\5132_wa\MC\patch\0734" />
+				<include name="*" />
+			</unzipicds>
+		</source>
+		
+</prepSpec>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/zip_archive_test.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<build>
+    <archiveSpec>
+        <set name="name" value="python_libs"/>
+        <set name="include" value="lib\*.egg"/>
+    </archiveSpec>
+    <config>
+        <set name="max.uncompressed.size" value="2000000"/>
+        <set name="root.dir" value="c:/Temp/python"/>
+        <set name="max.files.per.archive" value="65000"/>
+        <set name="archive.tool" value="zip"/>
+        <set name="archives.dir" value="c:\temp\output\build_area"/>
+        <set name="temp.build.dir" value="c:/Temp/output/temp_build_files"/>
+    </config>
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/zip_checkDrive_test.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<?xml    version="1.0"    encoding="UTF-8"?>
+<build>
+    <config name="wvdo_sources" abstract="true">
+        <set name="archive.tool" value="7za"/>
+       <set name="root.dir" value="C:\"/>
+                
+        <config name="wvdo_sources_1">
+            <set name="name" value="${build.id}_wvdo_sources_3"/>
+            <set name="root.dir" value="\\bhwec0100\build_e$\swbuild\ido_wa\wv_domain\wv_domain\"/>
+                 <set name="include" value="flashapi\"/>
+        </config>
+        
+        <config name="wvdo_sources_2">
+            <set name="name" value="${build.id}_wvdo_sources_3"/>
+            <set name="root.dir" value="\\bhwec0100\build_e$\swbuild\ido_wa\wv_domain"/>
+                 <set name="include" value="flashapi\"/>
+        </config>
+        
+        <config name="wvdo_sources_3">
+            <set name="name" value="${build.id}_wvdo_sources_3"/>
+            <set name="root.dir" value="Y:\wv_domain\"/>
+                 <set name="include" value="flashapi\"/>
+        </config>
+        
+        <config name="wvdo_sources_4">
+            <set name="name" value="${build.id}_wvdo_sources_3"/>
+                 <set name="include" value="flashapi\"/>
+        </config>
+        
+        <config name="medo_sources_1">
+            <set name="name" value="${build.id}_medo_sources_1"/>
+            <set name="root.dir" value="\\bhwec0100\build_e$\swbuild\ido_wa\Messaging_Domain\Messaging_Domain\"/>
+            <set name="include" value="messagingextensions\"/>
+        </config>
+        
+        <config name="medo_sources_2">
+            <set name="name" value="${build.id}_medo_sources_2"/>
+            <set name="root.dir" value="\\bhwec0100\build_e$\swbuild\ido_wa\Messaging_Domain\Messaging_Domain\"/>
+            <set name="include" value="messagingextensions\"/>
+        </config>
+        
+     </config>
+</build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/zip_checkDrive_test.cfg.xml.parsed	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<?xml version="1.0" ?>
+<build>
+	
+
+	<config abstract="true" name="wvdo_sources">
+		<config name="wvdo_sources_1">
+			<set name="include" value="flashapi\"/>
+			<set name="root.dir" value="X:\wv_domain\wv_domain\"/>
+			<set name="name" value="${build.id}_wvdo_sources_3"/>
+			<set name="archive.tool" value="7za"/>
+		</config>
+		<config name="wvdo_sources_2">
+			<set name="include" value="flashapi\"/>
+			<set name="root.dir" value="X:\wv_domain\"/>
+			<set name="name" value="${build.id}_wvdo_sources_3"/>
+			<set name="archive.tool" value="7za"/>
+		</config>
+		<config name="wvdo_sources_3">
+			<set name="include" value="flashapi\"/>
+			<set name="root.dir" value="Y:\wv_domain\"/>
+			<set name="name" value="${build.id}_wvdo_sources_3"/>
+			<set name="archive.tool" value="7za"/>
+		</config>
+		<config name="wvdo_sources_4">
+			<set name="include" value="flashapi\"/>
+			<set name="name" value="${build.id}_wvdo_sources_3"/>
+			<set name="archive.tool" value="7za"/>
+			<set name="root.dir" value="C:\"/>
+		</config>
+		<config name="medo_sources_1">
+			<set name="include" value="messagingextensions\"/>
+			<set name="root.dir" value="X:\Messaging_Domain\Messaging_Domain\"/>
+			<set name="name" value="${build.id}_medo_sources_1"/>
+			<set name="archive.tool" value="7za"/>
+		</config>
+		<config name="medo_sources_2">
+			<set name="include" value="messagingextensions\"/>
+			<set name="root.dir" value="X:\Messaging_Domain\Messaging_Domain\"/>
+			<set name="name" value="${build.id}_medo_sources_2"/>
+			<set name="archive.tool" value="7za"/>
+		</config>
+	</config>
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/archive.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <config abstract="true">
+        <set name="max.uncompressed.size" value="2000000000"/>
+        <set name="max.files.per.archive" value="65000"/>
+        <set name="archive.tool" value="7za"/>
+        <set name="root.dir" value="${build.drive}\"/>
+        <set name="temp.build.dir" value="${temp.build.dir}"/>
+        
+
+        <config name="minibuild_archive" abstract="true">
+            <set name="archives.dir" value="${zips.build.dir}"/>
+            <config>
+	            <set name="root.dir" value="${build.drive}\s60\app\organizer\clock"/>
+                <set name="name" value="s60_app_organizer_clock"/>
+                <set name="include" value="**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+            </config>
+            <!--<config>
+	            <set name="root.dir" value="${build.drive}\"/>
+                <set name="name" value="s60_app_organizer_clock_binary"/>
+                <set name="scanners" value="abld.what"/>
+                <set name="abld.buildpath" value="${build.drive}\s60\app\organizer\clock\group"/>
+                <set name="include" value="**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+            </config>-->
+    	</config>
+
+	</config>
+</build>
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.ats" default="minibuild-ats" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    <import file="../site/${env.TEAM}.ant.xml" />
+
+    <!-- Enable Helium internal assertion checking. -->
+    <property name="hlm.enable.asserts" value="1" />
+        
+    <property name="build.name" value="minibuild_ats" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="0" />
+    <property name="build.drive" value="z:" />
+    
+    
+    <property name="enabled.ats" value="1" />
+
+	<property name="skip.ats.sending" value="1"/>
+		<property name="ats.image.type" value="variant" />
+		<property name="ats.product.name" value="" />
+		<property name="ats.email.list" value="" />
+		<property name="ats.plan.name" value="" />
+		<property name="ats.flashfiles.minlimit" value="2" />
+		<property name="ats.target.platform" value="armv5 urel" />
+		<property name="ats.script.type" value="import" />
+		<property name="ats.product.hwid" value="" />
+		<property name="ats.testrun.name" value="${build.id}_${ats.product.name}_${core.build.version}" />
+		<property name="ats.test.timeout" value="60" />
+		<property name="tsrc.data.dir" value="data_rom" />
+		<property name="ats.ctc.enabled" value="True" />
+		<property name="ats.flashfiles.minlimit" value="2" />
+		
+		<property name="ta.flag.list" value="TA_M, TA_MU, TA_MMAPPFW,TA_MM"/>
+    <property name="ido.build.filter" value="${ta.flag.list},dfs_build"/>
+    <property name="release.images.dir" value="Z:\output\variant_images" />
+		
+    <!-- build configuration -->
+    <property name="sysdef.configurations.list" value="helium_minibuild_ats_compile" />
+    <path id="system.definition.files">
+        <fileset dir="." includes="*.sysdef.xml"/>
+    </path>
+
+<!--    
+    <property name="build.system" value="ec-helium" />
+-->	
+	<property name="rvct.version" value="22_616"/>
+	<!-- Archiving configuration-->
+	<property name="zip.config.file" location="archive.cfg.xml"/>
+	<property name="zips.ee.spec.name" value="minibuild_archive"/>
+	
+    <!-- Synergy is not configured -->
+    <property name="skip.password.validation" value="1"/>
+    
+    
+    <import file="${helium.dir}/helium.ant.xml"/>
+    
+    <!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+    <target name="minibuild-ats" depends="mini-build-cleanup,mini-build-prep,compile-main,ats-test,ats-aste"/>
+    
+    <!-- Prepare the minibuild. -->
+    <!--target name="mini-build-prep" depends="init-build-area,start-ant-log,diamonds,set-arm-version,prep-copy-symbiantools"/-->
+    <target name="mini-build-prep" depends="prep"/>
+    
+    <!-- Stubbing few targets for easy testing with dragonfly ... -->
+    <target name="prep-drive" depends="build-number"/>
+    <target name="dragonfly-prep-drive"/>
+    <target name="do-prep-work-area"/>
+    <target name="create-bom"/>
+    <target name="check-env-prep"/>
+    <target name="prep-copy"/>
+    
+    <target name="mini-build-cleanup">
+        <delete verbose="true" includeemptydirs="true">
+            <fileset dir="${build.drive}/" casesensitive="false">
+                <include name="makefile"/>
+                <include name="*.mk"/>
+            	<include name="ecloud_tmp_*/**"/>
+            	<include name="emake.*"/>            	
+                <include name="epoc32/build/**"/>
+                <include name="epoc32/rombuild/*/**"/>
+                <include name="timestart.txt"/>
+                <include name="timestop.txt"/>
+            </fileset>
+        </delete>
+    </target>
+    
+    <target name="mini-build-check">
+    	<!-- Check if prep has set some prop correctly... -->
+        <echo>'${arm.compiler.version}'</echo>
+        <au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true"/>
+
+        <!-- Check if compile-main step did what expected... -->
+    	<au:assertFileExists file="${canonical.sysdef.file}"/>
+        <au:assertFileExists file="${build.drive}/Makefile"/>
+        <au:assertFileExists file="${build.drive}/emake.data"/>
+        <au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_compile_run_emake.bat"/>
+    	
+    	
+    	<!-- Checking the zip generation -->
+    	<au:assertFileExists file="${zips.build.dir}/s60_app_organizer_clock_binary.zip"/>
+    	<au:assertFileExists file="${zips.build.dir}/s60_app_organizer_clock.zip"/>    	
+    </target>
+
+
+	
+</project>
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/helium_minibuild_ats.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition SYSTEM "http://delivery.nmp.nokia.com/trac/helium/browser/trunk/helium/tools/common/dtd/sysdef_1_4_0.dtd?format=raw">
+<SystemDefinition name="helium_minibuild_compile" schema="1.4.0">
+	<systemModel>
+	 	<layer name="ats_test_layer">
+			<module name="mod_tsrc_test">
+				<unit unitID="sortutil_api" name="sortutilapi" bldFile="\s60\test_nested\tsrc\group" mrp="" />
+			</module>
+	 	</layer>
+	</systemModel>
+    <build>
+        <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+<!--    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/> -->
+    <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+    <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+    <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+    <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+    <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+    <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+    <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+    <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+    <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+
+    <!-- Aditional Targets -->
+    <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+    <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+    
+    <targetList name="default" description="Main Targets" target="WINSCW ARMV5"/>
+    <targetList name="default_winscw" description="Main Targets" target="WINSCW"/>
+    <targetList name="default_armv5" description="Main Targets" target="ARMV5"/>
+    <targetList name="default_rel" description="Main Targets for rel" target="WINSCW_REL ARMV5_REL"/>
+    <targetList name="default_deb" description="Main Targets for deb" target="WINSCW_DEB ARMV5_DEB"/>
+    <targetList name="default_tools" description="tools Targets" target="TOOLS"/>
+    <targetList name="tools" description="tools Targets" target="TOOLS"/>
+        <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+    <targetList name="cwtools" description="cwtools Targets" target="CWTOOLS"/>
+    <targetList name="cwtools_rel" description="cwtools Release Targets" target="CWTOOLS_REL"/>
+  
+	    <configuration name="helium_minibuild_ats_compile" description="" filter="">
+	    	<layerRef layerName="ats_test_layer"/>
+	    	
+	        <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld export" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld test build" targetList="default" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld resource" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld library" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld -what build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	    </configuration>
+    </build>
+    
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+..\..\..\hlm.bat %*
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/matti/archive.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <config abstract="true">
+        <set name="max.uncompressed.size" value="2000000000"/>
+        <set name="max.files.per.archive" value="65000"/>
+        <set name="archive.tool" value="7za"/>
+        <set name="root.dir" value="${build.drive}\"/>
+        <set name="temp.build.dir" value="${temp.build.dir}"/>
+        
+
+        <config name="minibuild_archive" abstract="true">
+            <set name="archives.dir" value="${zips.build.dir}"/>
+            <config>
+	            <set name="root.dir" value="${build.drive}\s60\app\organizer\clock"/>
+                <set name="name" value="s60_app_organizer_clock"/>
+                <set name="include" value="**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+            </config>
+            <!--<config>
+	            <set name="root.dir" value="${build.drive}\"/>
+                <set name="name" value="s60_app_organizer_clock_binary"/>
+                <set name="scanners" value="abld.what"/>
+                <set name="abld.buildpath" value="${build.drive}\s60\app\organizer\clock\group"/>
+                <set name="include" value="**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+            </config>-->
+    	</config>
+
+	</config>
+</build>
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/matti/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the configuration variables for the minibuild testing of MATTI.
+============================================================================
+-->
+<project name="minibuild.ats" default="minibuild-ats" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    <import file="../../site/${env.TEAM}.ant.xml" />
+
+    <!-- Enable Helium internal assertion checking. -->
+    <property name="hlm.enable.asserts" value="1" />
+        
+    <property name="build.name" value="minibuild_ats" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="0" />
+    <property name="build.drive" value="z:" />
+    
+    <!-- MATTI testing parameters-->
+    <property name="enabled.matti" value="1" />
+    <property name="enabled.ats" value="1" />
+	<property name="matti.scripts" value="${helium.dir}\testconfig\ats3\matti\script" />
+	<property name="template.file" value="${helium.dir}\tools\common\python\lib\ats3\matti\template\matti_demo.xml" />
+	<property name="ats.sis.images.dir" location="${helium.dir}\testconfig\ats3\matti\sis" />
+    <property name="ats.image.type" value="variant" />
+	<property name="ats.product.name" value="" />
+	<property name="ats.email.list" value="" />
+	<property name="ats.plan.name" value="" />
+	<property name="ats.flashfiles.minlimit" value="2" />
+	<property name="ats.target.platform" value="armv5 urel" />
+	<property name="ats.script.type" value="import" />
+	<property name="ats.product.hwid" value="" />
+    <property name="core.build.version" value="1" />
+    <property name="build.id" value="001" />
+	<property name="ats.testrun.name" value="${build.id}_${ats.product.name}_${core.build.version}" />
+	<property name="ats.test.timeout" value="60" />
+    <property name="ats.output.dir" location="${build.drive}\output\ats" />
+    <property name="ats.sisfiles.minlimit" value="1" />
+
+    <!--ats3 testing properties-->
+    <property name="tsrc.data.dir" value="data_rom" />
+    <property name="ats.ctc.enabled" value="True" />
+    <property name="ats.flashfiles.minlimit" value="2"/>
+ 
+    <property name="ta.flag.list" value="TA_M, TA_MU, TA_MMAPPFW,TA_MM"/>
+    <property name="ido.build.filter" value="${ta.flag.list},dfs_build"/>
+   <property name="ats.server" value="4fio00105:8080"/>
+    <property name="release.images.dir" value="${helium.dir}\testconfig\ats3\matti\variant_images" />
+		
+    <!-- build configuration -->
+    <property name="sysdef.configurations.list" value="helium_minibuild_matti_compile" />
+    <path id="system.definition.files">
+        <fileset dir="." includes="*.sysdef.xml"/>
+    </path>
+<!--    
+    <property name="build.system" value="ec-helium" />
+-->	
+	<property name="rvct.version" value="22_616"/>
+	<!-- Archiving configuration-->
+	<property name="zip.config.file" location="archive.cfg.xml"/>
+	<property name="zips.ee.spec.name" value="minibuild_archive"/>
+	
+    <!-- Synergy is not configured -->
+    <property name="skip.password.validation" value="1"/>
+    
+    <import file="${helium.dir}/helium.ant.xml"/>
+    
+   <!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+    <!--target name="minibuild-matti" depends="mini-build-cleanup,mini-build-prep,compile-main,matti-test"/-->
+    <target name="minibuild-matti" depends="mini-build-prep,ee-roms,matti-test"/>
+    
+    <!-- Prepare the minibuild. -->
+    <!--target name="mini-build-prep" depends="init-build-area,start-ant-log,diamonds,set-arm-version,prep-copy-symbiantools"/-->
+    <target name="mini-build-prep" depends="prep"/>
+    
+    <!-- Stubbing few targets for easy testing with dragonfly ... -->
+    <target name="prep-drive" depends="build-number"/>
+    <target name="dragonfly-prep-drive"/>
+    <target name="do-prep-work-area"/>
+    <target name="create-bom"/>
+    <target name="check-env-prep"/>
+    <target name="prep-copy"/>
+    
+    <target name="mini-build-cleanup">
+        <delete verbose="true" includeemptydirs="true">
+            <fileset dir="${build.drive}/" casesensitive="false">
+                <include name="makefile"/>
+                <include name="*.mk"/>
+            	<include name="ecloud_tmp_*/**"/>
+            	<include name="emake.*"/>            	
+                <include name="epoc32/build/**"/>
+                <include name="epoc32/rombuild/*/**"/>
+                <include name="timestart.txt"/>
+                <include name="timestop.txt"/>
+            </fileset>
+        </delete>
+    </target>
+    
+    <target name="mini-build-check">
+    	<!-- Check if prep has set some prop correctly... -->
+        <echo>'${arm.compiler.version}'</echo>
+        <au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true"/>
+
+        <!-- Check if compile-main step did what expected... -->
+    	<au:assertFileExists file="${canonical.sysdef.file}"/>
+        <au:assertFileExists file="${build.drive}/Makefile"/>
+        <au:assertFileExists file="${build.drive}/emake.data"/>
+        <au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_compile_run_emake.bat"/>
+    	
+    	
+    	<!-- Checking the zip generation -->
+    	<au:assertFileExists file="${zips.build.dir}/s60_app_organizer_clock_binary.zip"/>
+    	<au:assertFileExists file="${zips.build.dir}/s60_app_organizer_clock.zip"/>    	
+    </target>
+    
+	
+</project>
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/matti/helium_minibuild_ats.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition SYSTEM "http://delivery.nmp.nokia.com/trac/helium/browser/trunk/helium/tools/common/dtd/sysdef_1_4_0.dtd?format=raw">
+<SystemDefinition name="helium_minibuild_compile" schema="1.4.0">
+	<systemModel>
+	 	<layer name="matti_test_layer">
+			<module name="mod_tsrc_test">
+				<unit unitID="sortutil_api" name="sortutilapi" bldFile="\sf\os\devicesrv\sysstatemgmt\tsrc\public\basic\group" mrp="" />
+			</module>
+	 	</layer>
+	</systemModel>
+    <build>
+        <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+<!--    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/> -->
+    <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+    <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+    <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+    <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+    <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+    <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+    <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+    <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+    <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+
+    <!-- Aditional Targets -->
+    <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+    <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+    
+    <targetList name="default" description="Main Targets" target="WINSCW ARMV5"/>
+    <targetList name="default_winscw" description="Main Targets" target="WINSCW"/>
+    <targetList name="default_armv5" description="Main Targets" target="ARMV5"/>
+    <targetList name="default_rel" description="Main Targets for rel" target="WINSCW_REL ARMV5_REL"/>
+    <targetList name="default_deb" description="Main Targets for deb" target="WINSCW_DEB ARMV5_DEB"/>
+    <targetList name="default_tools" description="tools Targets" target="TOOLS"/>
+    <targetList name="tools" description="tools Targets" target="TOOLS"/>
+        <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+    <targetList name="cwtools" description="cwtools Targets" target="CWTOOLS"/>
+    <targetList name="cwtools_rel" description="cwtools Release Targets" target="CWTOOLS_REL"/>
+  
+	    <configuration name="helium_minibuild_matti_compile" description="" filter="">
+	    	<layerRef layerName="matti_test_layer"/>
+	    	
+	        <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld export" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld test build" targetList="default" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld resource" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld library" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld -what build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	    </configuration>
+    </build>
+    
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/matti/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+..\..\..\..\hlm.bat %*
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/matti/test.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- 
+============================================================================ 
+Name        : matti.demo.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+--><test>
+  <name>001__1</name>
+  <target>
+    <device alias="STIF" rank="none">
+      <property name="HARNESS" value="STIF"/>
+      <property name="TYPE" value=""/>
+      <property name="HARDWARE" value=""/>
+    </device>
+  </target>
+  <plan passrate="100" enabled="true" name="MATTI test " significant="false" harness="STIF">
+    <session name="session" harness="STIF" enabled="true" passrate="100"><set name="MATTI test set0" harness="STIF" enabled="true" passrate="100">
+    			<target>
+          	<device alias="STIF" rank="master"/>
+        	</target>
+    			<case name="MATTI test case" passrate="100" harness="STIF" enabled="true" significant="false"> 
+          <flash target-alias="STIF" images="ATS3Drop\images\test_file.fpsx" />
+          	<flash target-alias="STIF" images="ATS3Drop\images\test_file_3rd.fpsx" />
+          	<flash target-alias="STIF" images="ATS3Drop\images\test_file_another.fpsx" />
+          	
+          <step name="Create logs folder" harness="STIF" enabled="true" passrate="100" significant="false">
+          <command>makedir</command>
+                        <params>
+                            <param dir="c:\logs\testability"/>
+                        </params>
+          </step>
+          <step name="Copy sis" harness="STIF" enabled="true" passrate="100" significant="false">
+                        <command>install</command>
+                        <params>
+                            <param src="ATS3Drop\sis\another_test_file_matti_install.sis"/>
+                            <param dst="E:\another_test_file_matti_install.sis"/>
+                            <param overwrite="false"/>
+                        </params>
+                    </step>
+
+                    <step name="Install SIS" harness="STIF" enabled="true" passrate="100" significant="false">
+	                    <command>install-software</command>
+		    								<params>
+                            <param sisPackageName="E:\another_test_file_matti_install.sis"/>
+                            <param upgradeAllowed="true"/>
+                            <param optionalItemsAllowed="true"/>
+                            <param OCSP_Done="true"/>
+                            <param ignoreOCSPWarnings="true"/>
+                            <param untrustedAllowed="true"/>
+                            <param packageInfoAllowed="true"/>
+                            <param userCapGranted="true"/>
+                            <param killApp="true"/>
+                            <param overWriteAllowed="true"/>
+                            <param downloadAllowed="false"/>
+                            <param downloadUsername="user"/>
+                            <param downloadPassword="passwd"/>
+                            <param installDrive="C"/>
+                            <param upgradeData="true"/>
+                            <param timeout="40"/>                       	
+										    </params>
+										</step>
+          	<step name="Copy sis" harness="STIF" enabled="true" passrate="100" significant="false">
+                        <command>install</command>
+                        <params>
+                            <param src="ATS3Drop\sis\test_file_matti_install.sis"/>
+                            <param dst="E:\test_file_matti_install.sis"/>
+                            <param overwrite="false"/>
+                        </params>
+                    </step>
+
+                    <step name="Install SIS" harness="STIF" enabled="true" passrate="100" significant="false">
+	                    <command>install-software</command>
+		    								<params>
+                            <param sisPackageName="E:\test_file_matti_install.sis"/>
+                            <param upgradeAllowed="true"/>
+                            <param optionalItemsAllowed="true"/>
+                            <param OCSP_Done="true"/>
+                            <param ignoreOCSPWarnings="true"/>
+                            <param untrustedAllowed="true"/>
+                            <param packageInfoAllowed="true"/>
+                            <param userCapGranted="true"/>
+                            <param killApp="true"/>
+                            <param overWriteAllowed="true"/>
+                            <param downloadAllowed="false"/>
+                            <param downloadUsername="user"/>
+                            <param downloadPassword="passwd"/>
+                            <param installDrive="C"/>
+                            <param upgradeData="true"/>
+                            <param timeout="40"/>                       	
+										    </params>
+										</step>
+          	          
+          <step name="Test case" harness="STIF" enabled="true" passrate="100" significant="false">
+                        <command>execute</command>
+                        <params>
+    			    							<param dir="C:\ruby\bin\"/>
+    			    							<param file="C:\ruby\bin\ruby.exe"/>
+                            <param parameters="&#x00A7;TEST_RUN_ROOT&#x00A7;\ATS3Drop\MATTISCRIPTS\test.rb"/>
+                            <param timeout="60"/>
+                            <param local="true"/>
+                            <param async="false"/>
+			    									<param needs-connection="true"/>
+                        </params>
+                    </step>
+          </case>
+      </set></session>
+  </plan>
+  
+  
+  <files>
+  	<file>ATS3Drop\images\test_file.fpsx</file>
+    <file>ATS3Drop\images\test_file_3rd.fpsx</file>
+    <file>ATS3Drop\images\test_file_another.fpsx</file>
+    <file>ATS3Drop\sis\another_test_file_matti_install.sis</file>
+    <file>ATS3Drop\sis\test_file_matti_install.sis</file>
+    <file>ATS3Drop\MATTISCRIPTS\test.rb</file>
+    </files>
+  
+</test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/broom/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.compile" default="minibuild" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" basedir=".">
+    <property environment="env"/>
+	<dirname property="config.dir" file="${ant.file.minibuild.compile}"/>
+
+    <!-- Enable Helium internal assertion checking. -->
+    <property name="hlm.enable.asserts" value="1" />
+        
+    <property name="build.name" value="minibuild_broom" />
+    <property name="build.family" value="cleaner" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="0" />
+    <property name="publish.root.dir" location="${build.drive}/release"/>
+	<property name="ci.cleanup.env.dir" location="E:/bb/minibuild-broom/trigger"/>
+
+	<target name="create-ci-dir">
+		<mkdir dir="${ci.cleanup.env.dir}"/>
+	</target>
+	
+	<target name="mini-build" depends="create-ci-dir,delete-folders-from-list"/>
+	
+	<import file="${helium.dir}/helium.ant.xml"/>
+	
+</project>
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/broom/doc/index.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+.. index::
+  module:  Minibuild Broom configuration
+
+===============================
+Minibuild Broom configuration
+===============================
+
+
+.. index::
+  single:  Minibuild Broom coverage
+
+Coverage
+========
+
+* delete-folders-from-list
+
+.. index::
+  single:  Minibuild Broom Setup
+
+Minubuild setup
+===============
+
+What is required?
+-----------------
+
+* Build machine
+* Build Area with a valid S60 environment (eg. PF5250)
+* Helium (obviously)
+
+
+
+  
+.. index::
+  single:  Minibuild Broom coverage - how to run
+
+How to run the build?
+---------------------
+
+The command line to run the build is the following::
+
+   hlm -Dbuild.drive=%BUILD_DRIVE% -Dbuild.number=01 mini-build
+
+
+You only need to provide the following properties:
+* build.drive: location of the build area
+* build.number: the build number
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/broom/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+..\..\..\..\helium\hlm.bat %*
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/archive.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <config abstract="true">
+        <set name="max.uncompressed.size" value="2000000000"/>
+        <set name="max.files.per.archive" value="65000"/>
+        <set name="archive.tool" value="7za"/>
+        <set name="root.dir" value="${build.drive}\"/>
+        <set name="temp.build.dir" value="${temp.build.dir}"/>
+        
+
+        <config name="minibuild_archive" abstract="true">
+        	<set name="grace.service" value="minibuild"/>
+        	<set name="grace.product" value="SF"/>
+        	<set name="grace.release" value="SF_minibuild_${build.number}"/>
+        	<set name="grace.metadata" value="true"/>
+        	<set name="grace.template" value="${config.dir}/template_release_metadata.xml"/>
+        	
+            <set name="archives.dir" value="${zips.build.dir}/${zipping.type}"/>
+            <set name="clock.dir" value="${build.drive}\sf\app\organizer\clock2"/>
+            <config>
+	            <set name="root.dir" value="${clock.dir}"/>
+                <set name="name" value="sf_app_organizer_clock"/>
+                <set name="include" value="**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+            </config>
+            <config>
+	            <set name="root.dir" value="${build.drive}\"/>
+                <set name="name" value="sf_app_organizer_clock_binary"/>
+                <set name="scanners" value="abld.what"/>
+                <set name="abld.buildpath" value="${clock.dir}\group"/>
+                <set name="include" value="**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+            </config>
+            <config>
+	            <set name="root.dir" value="${build.drive}/"/>
+                <set name="name" value="sf_mw_classicui_and_app_radio"/>
+                <set name="mapper" value="policy"/>
+                <set name="include" value="sf/mw/classicui/**"/>
+                <set name="include" value="sf/app/radio/**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+                <set name="policy.csv" value="${config.dir}/distribution.policy.extended_for_sf.id_status.csv"/>
+            </config>
+            <config>
+	            <set name="root.dir" value="${build.drive}/"/>
+                <set name="name" value="sf_os"/>
+                <set name="mapper" value="policy.remover"/>
+                <set name="include" value="test_policy/os/**"/>
+                <set name="exclude" value="**/_ccmwaid.inf"/>
+                <set name="policy.root.dir" value="${build.drive}/test_policy"/>
+                <set name="policy.csv" value="${config.dir}/distribution.policy.extended_for_sf.id_status.csv"/>
+            </config>
+    	</config>
+
+	</config>
+</build>
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,392 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.compile" default="mini-build" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" basedir=".">
+	<property environment="env" />
+    <import file="../site/${env.TEAM}.ant.xml" optional="true"/>
+	<dirname property="config.dir" file="${ant.file.minibuild.compile}" />
+
+	<!-- Enable Helium internal assertion checking. -->
+	<property name="hlm.enable.asserts" value="1" />
+
+	<property name="build.name" value="minibuild_compile" />
+	<property name="build.family" value="test_minibuilds" />
+	<property name="major.version" value="0" />
+	<property name="minor.version" value="0" />
+	<property name="publish.root.dir" location="${build.drive}/release" />
+
+	<!-- For Grace upload-->
+	<property name="release.grace.service" value="Test_Helium" />
+	<property name="release.grace.product" value="minibuild_compile" />
+	<property name="release.label" value="${major.version}.${minor.version}" />
+
+	<!-- build configuration -->
+	<property name="sysdef.configurations.list" value="helium_minibuild_compile" />
+	<path id="system.definition.files">
+		<fileset dir="." includes="*.sysdef.xml" />
+	</path>
+
+	<property name="build.system" value="ec-helium" />
+	<property name="rvct.version" value="22_616" />
+
+	<!-- Archiving configuration-->
+	<property name="zip.config.file" location="archive.cfg.xml" />
+	<property name="zips.ee.spec.name" value="minibuild_archive" />
+
+	<!-- Synergy is not configured -->
+	<property name="skip.password.validation" value="1" />
+
+
+	<import file="${helium.dir}/helium.ant.xml" />
+
+	<!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+	<target name="do-mini-build" depends="mini-build-cleanup,mini-build-install-new-imaker,mini-build-prep,
+                compile-main,test-ec-history-option,integration-mmp-to-target,mini-build-archive,build-roms,
+                minibuild-release,mini-build-check" />
+
+
+	<target name="do-mini-build-subcon" depends="mini-build-cleanup,mini-build-install-new-imaker,mini-build-prep,
+                compile-main,mini-build-archive,mini-build-check" />
+
+	<!--ant code coverage for mini-builds-->
+	<target name="mini-build">
+    <antcall target="database">
+        <param name="home.files.only" value="false"/>
+    </antcall>
+		<mkdir dir="${helium.build.dir}/temp" />
+		<hlm:coveragerecord name="${helium.build.dir}/temp/test_minibuild.xml" action="start" />
+		<runtarget target="do-mini-build" />
+		<hlm:coveragerecord name="${helium.build.dir}/temp/test_minibuild.xml" action="stop" />
+		<fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.txt.ftl" outputfile="${helium.build.dir}/temp/test_minibuild.txt">
+			<data expandProperties="yes">
+                doc: xml(${helium.build.dir}/temp/test_minibuild.xml)
+                database: xml(${database.file})
+            </data>
+		</fmpp>
+		<loadfile srcfile="${helium.build.dir}/temp/test_minibuild.txt" property="ant.coverage.summary" />
+		<echo>
+The summary of Ant code coverage:
+
+${ant.coverage.summary}</echo>
+		<fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.html.ftl" outputfile="${helium.build.dir}/temp/test_minibuild.html">
+			<data expandProperties="yes">
+                    doc: xml(${helium.build.dir}/temp/test_minibuild.xml)
+                    database: xml(${database.file})
+             </data>
+		</fmpp>
+	</target>
+	
+    <!-- Test ec history option is create for single node build and merge is for multinode build. -->
+    <target name="test-ec-history-option" if="build.system.ec-helium">
+        <loadfile srcfile="${build.log.dir}/${build.id}.${sysdef.configurations.list}_run_emake.bat" property="emake.bat.file"/>
+        <if>
+            <equals arg1="${ec.maxagents}" arg2="1" />
+            <then>
+                <au:assertTrue>
+                    <contains string="${emake.bat.file}" substring="--emake-history=create"/>
+                </au:assertTrue>
+            </then>
+            <else>
+                <au:assertTrue>
+                    <contains string="${emake.bat.file}" substring="--emake-history=merge"/>
+                </au:assertTrue>
+            </else>
+        </if>
+        <echo message="ec.mode:${ec.mode}" />
+        <echo message="ec.maxagents:${ec.maxagents}"/>
+        <echo message="ec.history.option:${ec.history.option}"/>
+    </target>
+    
+	<!-- Prepare the minibuild. -->
+	<!--target name="mini-build-prep" depends="init-build-area,start-ant-log,diamonds,set-arm-version,prep-copy-symbiantools"/-->
+	<target name="mini-build-prep" depends="prep" />
+
+	<!-- Stubbing few targets for easy testing with dragonfly ... -->
+	<target name="prep-drive" depends="build-number" />
+	<target name="dragonfly-prep-drive" />
+	<target name="do-prep-work-area" />
+	<target name="create-bom" />
+	<target name="check-env-prep" />
+	<target name="prep-copy" />
+
+	<target name="minibuild-release">
+		<mkdir dir="${publish.release.dir}" />
+		<copy todir="${publish.release.dir}">
+			<fileset dir="${build.output.dir}">
+				<include name="release_flash_images/**" />
+			</fileset>
+		</copy>
+		<script language="jython" setbeans="false">
+			<![CDATA[
+import os
+import fileutils
+import pathaddition.relative
+result = []
+rootdir = os.path.normpath(project.getProperty("publish.release.dir") + "/..")
+
+def sortbydate(a, b):
+    if os.stat(a)[9] == os.stat(b)[9]:
+	    return 0
+    elif os.stat(a)[9] < os.stat(b)[9]:
+        return 1
+    return -1
+			
+if os.path.exists(rootdir):
+    for name in os.listdir(rootdir):
+        path = os.path.join(rootdir, name)
+        if os.path.isdir(path):
+           result.append(os.path.normpath(path))
+
+result.sort(sortbydate)
+if len(result) > 2:
+    for name in result[2:]:
+        print "Deleting " + name
+        fileutils.rmtree(name)
+
+project.setProperty('fota.publish.root.dir', project.getProperty("publish.root.dir"))
+old = pathaddition.relative.abs2rel(result[0], project.getProperty("publish.root.dir"))
+new = pathaddition.relative.abs2rel(result[1], project.getProperty("publish.root.dir"))
+project.setProperty('fota.old.publish.subdir', result[0])
+project.setProperty('fota.new.publish.subdir', result[1])
+print "Old subdir: %s" % old
+print "New subdir: %s" % old
+]]>
+		</script>
+	</target>
+
+	<!-- Upload to Grace -->
+	<target name="minibuild-grace-upload">
+		<echo message="Uploading files into Grace ${release.grace.dir}" />
+		<hlm:retry retryCount="${grace.upload.retryCount}" sleepTime="1000">
+			<copy file="${build.drive}\output\build_area\engineering_english\ant\sf_app_organizer_clock.zip" tofile="${release.grace.dir}\${build.name}_${major.version}.${minor.version}.${build.id}_sf_app_organizer_clock.zip" />
+		</hlm:retry>
+		<antcall target="release-grace-content">
+			<param name="release-grace-content" value="${cache.dir}" />
+		</antcall>
+	</target>
+
+
+	<!-- Check that the XML data returned from Diamonds via the REST interface
+    is the same as what is sent. 
+        
+    Currently there are some differences between the formats so some edits to the
+    XML content are made before using XMLUnit to compare the content.
+    -->
+	<target name="check-diamonds">
+		<loadfile srcfile="${build.log.dir}/${build.id}_diamonds-log-start.xml" property="diamonds.log.start">
+			<filterchain>
+				<tokenfilter>
+					<filetokenizer />
+					<hlm:prettyprintxml />
+				</tokenfilter>
+			</filterchain>
+		</loadfile>
+		<echo>Data sent to Diamonds:
+            
+${diamonds.log.start}</echo>
+		<loadresource property="diamonds.log.start.output">
+			<url url="${diamonds.build.url}?fmt=xml" />
+			<filterchain>
+				<tokenfilter>
+					<filetokenizer />
+					<hlm:prettyprintxml />
+				</tokenfilter>
+			</filterchain>
+		</loadresource>
+		<echo>Data returned from Diamonds:
+            
+${diamonds.log.start.output}</echo>
+		<echo file="${helium.dir}/diamonds_build.xml">${diamonds.log.start}</echo>
+		<!--xmltask source="${helium.dir}/diamonds_build.xml" dest="${helium.dir}/diamonds_build_edit.xml">
+            
+            <cut path="/diamonds-build/tool" buffer="toolElements"/>
+            <cut path="/diamonds-build/locations" buffer="temp"/>
+        </xmltask-->
+		<!--<loadfile srcfile="${helium.dir}/diamonds_build_edit.xml" property="diamonds.log.start.edited"/>
+        <echo>Data sent massaged to match what is received:
+            
+${diamonds.log.start.edited}</echo>-->
+		<!-- TODO: make assertXmlEqual work with direct string input -->
+		<string id="control.id" value="${diamonds.log.start}" />
+		<string id="test.id" value="${diamonds.log.start.output}" />
+		<hlm:assertXmlEqual control="control.id" test="test.id" failonerror="true" />
+	</target>
+
+
+	<target name="mini-build-archive" depends="mini-build-archive-ant,mini-build-archive-ec-full" />
+
+	<!-- This target will copy a part of the tree structure to test policy.remover mapper. -->
+	<target name="prepare-archiving">
+		<delete dir="${build.drive}/test_policy" failonerror="false" />
+		<mkdir dir="${build.drive}/test_policy/os" />
+		<!-- Creating a policy file under the new s60 test root. -->
+		<echo file="${build.drive}/test_policy/distribution.policy.s60">0</echo>
+		<echo file="${build.drive}/test_policy/os/distribution.policy.s60">0</echo>
+		<!-- Getting some Content -->
+		<copy todir="${build.drive}/test_policy">
+			<fileset dir="${build.drive}/sf">
+				<include name="os/graphics/" />
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="mini-build-archive-ec-full">
+		<antcall target="do-mini-build-archive">
+			<param name="build.system" value="ec-helium" />
+			<param name="archive.using.ec" value="true" />
+			<param name="zipping.type" value="ec" />
+			<!-- Uses to set the target location -->
+		</antcall>
+	</target>
+
+	<target name="mini-build-archive-ant">
+		<antcall target="do-mini-build-archive">
+			<param name="build.system" value="ebs" />
+			<param name="archive.using.ec" value="false" />
+			<param name="zipping.type" value="ant" />
+			<!-- Uses to set the target location -->
+		</antcall>
+	</target>
+
+	<target name="do-mini-build-archive">
+		<runtarget target="prepare-archiving" />
+		<runtarget target="zip-ee" />
+		<!-- Checking the zip generation Ant -->
+		<au:assertFileExists file="${zips.build.dir}/${zipping.type}/release_metadata.xml" />
+		<au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_app_organizer_clock_binary.zip" />
+		<au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_app_organizer_clock.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_0.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_1.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_3.zip" />
+		<au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_950.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_0.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_1.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_2.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_3.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_7.zip" />
+        <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_1308.zip" />
+	</target>
+
+
+	<target name="mini-build-cleanup">
+		<delete verbose="true" includeemptydirs="true">		 
+			<fileset dir="${build.drive}/" casesensitive="false">
+				<include name="makefile" />
+				<include name="*.mk" />
+				<include name="*.make" />
+				<include name="ecloud_tmp_*/**" />
+				<include name="emake.*" />
+				<include name="epoc32/build/**" />
+                <include name="epoc32/rombuild/imaker_temp/**" />
+                <include name="epoc32/rombuild/${product.name}/**" />
+				<include name="epoc32/rom/config/*/**/foti*.*" />
+				<include name="output/**" />
+				<include name="timestart.txt" />
+				<include name="timestop.txt" />
+				<exclude name="output/build_area/localised/**" />
+			</fileset>
+		</delete>
+	</target>
+
+	<target name="mini-build-install-new-imaker">
+		<!-- Export custom image configuration file. -->
+		<copy file="config/image_conf_naming.mk" tofile="${build.drive}/epoc32/rom/config/image_conf_naming.mk" />
+		<property name="imaker.dir" value="${helium.dir}/../external/imaker" />
+		<!--
+        <delete dir="${build.drive}/imaker_rnd"/>
+        <copy todir="${build.drive}/imaker_rnd">
+            <fileset dir="${imaker.dir}"/>
+        </copy>
+        
+        <hlm:bldmakeBldfilesMacro dir="${build.drive}/imaker_rnd/group"/>
+        <hlm:abldMacro dir="${build.drive}/imaker_rnd/group" command="cleanexport" platform=""/>
+        <hlm:abldMacro dir="${build.drive}/imaker_rnd/group" command="export" platform=""/>
+        -->
+	</target>
+
+	<target name="mini-build-check">
+		<!-- Check if prep has set some prop correctly... -->
+		<echo>'${arm.compiler.version}'</echo>
+		<au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true" />
+
+		<!-- Check if compile-main step did what expected... -->
+		<au:assertFileExists file="${canonical.sysdef.file}" />
+		<!--<au:assertFileExists file="${build.drive}/Makefile"/>-->
+        <if>
+            <istrue value="${blocks.enabled}" />
+            <then>
+                <au:assertFileExists file="${blocks.config.dir}/roms.blocks_component.xml" />
+            </then>
+        </if>
+
+		<if>
+			<isset property="build.system.ec-helium" />
+			<then>
+				<au:assertFileExists file="${build.drive}/emake.data" />
+				<au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_compile_run_emake.bat" />
+			</then>
+		</if>
+
+		<resourcecount property="fpsx.count">
+			<fileset dir="${build.output.dir}">
+				<include name="**/*.core.fpsx" />
+				<include name="**/*.rofs2.fpsx" />
+			</fileset>
+		</resourcecount>
+		<echo>Number of images generated: ${fpsx.count}.</echo>
+	</target>
+
+
+	<!-- Custom iMaker configuration - preparing for future dev. -->
+	<property name="imaker.fmpp.makefile" location="${helium.dir}/tools/common/templates/imaker/build_imaker_roms_signing.mk.ftl" />
+	<hlm:imakerconfigurationset id="imaker.rom.config">
+		<imakerconfiguration>
+			<makefileset>
+                <include name="**/image_conf_${product.name}.mk" />
+			</makefileset>
+			<targetset>
+				<include name="fota" />
+			</targetset>
+		</imakerconfiguration>
+		<imakerconfiguration regionalVariation="true">
+			<makefileset>
+			    <include name="**/${product.name}/*ui.mk"/>
+			</makefileset>
+			<targetset>
+				<include name="core(?:-prd|-rnd|-subcon)?$" />
+				<include name="^langpack_01$" />
+				<exclude name=".*-image$" />
+			</targetset>
+			<variableset>
+				<variable name="USE_FOTI" value="1" />
+				<variable name="USE_FOTA" value="1" />
+				<variable name="TYPE" value="rnd" />
+			</variableset>
+		</imakerconfiguration>
+	</hlm:imakerconfigurationset>
+
+	<fileset dir="${build.drive}/" id="mmp.to.target.config">
+		<include name="s60/app/**/*.mmp" />
+	</fileset>
+
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/config/image_conf_naming.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+USE_NAMEMK = 1
+# Example version of image_conf_naming.mk
+# If this file exists in the build area, it is read by iMaker and can be
+# used for image naming, setting directories and version info generation.
+
+# this variable is intended to be overriden by customer that would need to customize the version string.
+CUSTOMIZE_VERSION?=
+
+# setting langpack templates
+ROFS2_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/langpack/$(LANGPACK_NAME)
+ROFS2_NAME = $(PRODUCT_TYPE)_$(MAJOR_VERSION)$(MINOR_VERSION).$(LANGPACK_ID)_$(TYPE)
+
+# setting core templates
+CORE_NAME = $(PRODUCT_TYPE)_$(MAJOR_VERSION)$(MINOR_VERSION)_$(TYPE)
+CORE_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/core/$(CORE_NAME)
+
+# setting customer templates
+ROFS3_NAME = $(PRODUCT_TYPE)_$(MAJOR_VERSION)$(MINOR_VERSION)_$(TYPE)
+ROFS3_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/customer/$(CUSTVARIANT_NAME)
+
+# setting version string templates
+#CORE_VERSION=V $(COREPLAT_VERSION).$(S60_VERSION).$(BUILD_YEAR)_wk$(BUILD_WEEK)
+CORE_VERSION=v $(BUILD_ID)
+CORE_SWVERINFO = $(CORE_VERSION).$(LANGPACK_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) Nokia
+LANGPACK_SWVERINFO = $(CORE_VERSION).$(LANGPACK_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) Nokia
+ROFS3_CUSTINFO = $(CORE_VERSION).$(LANGPACK_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) Nokia
+
+# fix the fpsx image location too.
+CORE_FLASH       = $(CORE_DIR)/$(CORE_NAME)$(call iif,$(USE_ROFS2)$(USE_ROFS3),.core)$(FLASH_EXT)
+ROFS2_FLASH      = $(ROFS2_DIR)/$(ROFS2_NAME).rofs2$(FLASH_EXT)
+ROFS3_FLASH      = $(ROFS3_DIR)/$(ROFS3_NAME).rofs3$(FLASH_EXT)
+
+# declaring missing target declaration foti/fota...
+$(call add_help,foti,t,Create FOTI sw updater)
+$(call add_help,fota,t,Create FOTA sw updater)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/distribution.policy.extended_for_sf.id_status.csv	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+ID,Include in build?,Regexp,Symbian Foundation License,Eclipse Public License,Supplier,Description,Contact,Other Notes
+0,Yes,Nokia,,,Nokia,Free to deliver,,
+1,No,Nokia,,,Nokia,Nokia internal sw,,
+3,Yes,Nokia,Yes,No,Nokia,Symbian Foundation License,,
+7,Yes,Nokia,No,Yes,Nokia,Eclipse Public License,,
+10,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR NB encoder,Eugene Tsai ,10 - AmrNbCodecPlugin         -> project for AMR NB decoder & encoder
+11,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR NB decoder,Eugene Tsai ,
+12,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR WB encoder,Eugene Tsai ,12 - AmrWbCodecPlugin         -> project for AMR WB decoder
+13,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed AMR WB decoder,Eugene Tsai ,
+21,Yes,Beatnik,,,Beatnik Inc.,MobileBAE v2.1 audio engine from Beatnik Inc.,Vesa Jaamuru,
+30,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed MP3 decoder,Eugene Tsai ,30 - MP3CodecPlugin           -> project for MP3 decoder
+40,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed MPEG-4 AAC decoder,Eugene Tsai ,>40 - AACCodecPlugin           -> project for AAC decoder
+41,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed eAAC+ decoder ,Eugene Tsai ,>40 - AacEncoderPlugin         -> project for AAC-LC encoder
+42,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed MPEG-4 AAC encoder,Eugene Tsai ,>40 - EAacPlusCodecPlugin      -> project for EAacPlus decoder
+50,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed H.263 encoder,Vesa Lunden,
+51,Bin,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,Emuzed MDF H263/MPEG4 Decoder,Brian Yan,
+52,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,Emuzed MDF Video Postprocessor,Brian Yan,
+53,Bin,Nokia,,,Nokia,NRC MDF H264 (AVC) Decoder,Brian Yan,
+54,No,Helix,,,Helix,Helix MDF RealVideo-8/9 Decoder,Brian Yan,
+55,No,Helix,,,Helix,Helix CMMFCodec RealAudio-8 Decoder,Brian Yan,
+56,No,Helix,,,Helix,Helix CMMFCodec RealAudio-Voice Decoder,Brian Yan,
+57,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,Emuzed h.264/AVC ARM11 video encoder,Hippel„inen Juha-Pekka,
+60,Yes,PacketVideo,,,PacketVideo,Circuit switched Video Telephony Solution (3G-324M) from PacketVideo Corporation ,Rantanen Pasi,
+80,Yes,Real,,,Real Networks Inc.,RealOnePlayerEngine,Simon Khoo,
+81,Bin,Helix,,,Helix,"Helix DNA engine sources, restricted protocol and codex from RealNetworks, Inc. ",Yu I-Chin,
+82,Yes,Helix,,,Helix,"Helix DNA engine binaries, restricted protocol and codex from RealNetworks, Inc. ",Yu I-Chin,
+100,Yes,Sun,,,Sun Microsystems,Java JSR-135,Simo F„lt,
+101,Yes,Nokia,,,Nokia,Java JSR-75,Simo F„lt,
+102,Yes,Sun,,,Sun Microsystems,Java J2ME,Simo F„lt,General Java environment files
+103,Yes,.,,,N/A,KVM virtual machine,Simo F„lt,
+104,Yes,.,,,N/A,Monty virtual machine,Simo F„lt,
+105,Yes,Sun,,,Sun Microsystems,Software implementation of J2ME Web Services Specification (JSR-172),Simo F„lt,
+106,Yes,Sun,,,Sun Microsystems,Software implementation of Security and Trust Services API for J2ME (JSR-177),Simo F„lt,
+107,No,Sun,,,Sun Microsystems,Java VSCL implementation,Simo F„lt,
+108,No,Sun,,,Sun Microsystems,Java for iMode,Simo F„lt,
+109,No,Nokia,,,Nokia,Nokia proprietary Java API supplements,Simo F„lt,
+110,Yes,Tegic,,,Tegic,Tegic T9 WINS binaries,Antti Sepp„l„,
+111,No,Tegic,,,Tegic,"THUMB of T9 from Tegic Communications, Inc.",Antti Sepp„l„,
+115,Yes,Matsutake,,,Matsutake,Matsutake Predictive Text Input Engine Binaries,Antti Sepp„l„,PTI Engine only for Japanese SDK
+116,No,Tegic,,,Tegic,Xt9TegicDelivery,Antti Sepp„l„,"From 5.0 releases onwards, never delivered"
+117,No,Zi,,,Zi Corporation,ZiDelivery,Antti Sepp„l„,"From 5.0 releases onwards, delivered by contracts"
+130,No,CESI,,,CESI,Chinese bitmap fonts from Chinese Electronics Standardization Technical Institute.,Vesa H„rk”nen,
+131,Yes,Ricoh,,,Ricoh,Ricoh Japan fonts,Vesa H„rk”nen,
+132,Yes,Agfa,,,Agfa,Agfa Thai fonts,Vesa H„rk”nen,
+133,Yes,Agfa,,,Agfa,"Vector fonts & rendering engine from Monotype Imaging (Agfa) including WGL4, Arabic, Hebrew, Thai, Japanese, Chinese",Vesa H„rk”nen,Platform fonts that are sublicensed
+140,Yes,SJTU,,,SJTU,SJTU Sunway Chinese-English dictionary,Nie Xin,
+151,Yes,Entrust,,,Entrust,Entrust root certificates,Ilhan Gurel  ,
+152,Yes,Verisign,,,Verisign,Verisign root certificates,Ilhan Gurel  ,
+153,Yes,Symbian,,,Symbian Software Ltd,Symbian root certificates,Ilhan Gurel  ,
+157,Yes,BeTrusted,,,BeTrusted Ltd.,Root Certificates from BeTrusted Ltd.,Ilhan Gurel  ,
+158,Yes,Equifax,,,Equifax,Equifax root certificate,Ilhan Gurel  ,
+159,Yes,Valicert,,,Valicert,Valicert Class2 CA,Ilhan Gurel  ,\s60\mw\securityservice\spkiutilities\Certificates\data\S60_certificates\Valicert
+161,Yes,CyberTrust,,,CyberTrust,CyberTrust,Ilhan Gurel  ,securityservices\pkiutilities\Certificates\data\S60_certificates\CyberTrust
+162,Yes,Starfield,,,Starfield,Starfield,Ilhan Gurel  ,\s60\mw\securityservices\pkiutilities\Certificates\data\S60_certificates\Starfield
+163,Yes,GoDaddy,,,GoDaddy,GoDaddy,Ilhan Gurel  ,\s60\mw\securityservices\pkiutilities\Certificates\data\S60_certificates\GoDaddy
+165,Yes,.,,,GeoTrust,"GeoTrust root certificate, part of S60_certificates component","Heikkinen Timo.J (Nokia-D-MSW/Tampere), Hyttinen Teuvo (Nokia-D-MSW/Tampere)",3rd party
+171,Yes,Sun,,,Sun Microsystems,Java eSWT,Simo F„lt,Not allowed to go to licensees
+172,No,Nokia,,,Nokia,JSR-238 Mobile Internationalization API,Simo F„lt,Early dev for Taco
+180,Yes,Agfa,,,Agfa,"Vector fonts & rendering engine from Monotype Imaging (Agfa) including WGL4, Arabic, Hebrew, Thai, Japanese, Chinese",Mikko Tuokko,
+200,Yes,Netscape,,,Netscape,Netscape Plugin API,Eki Monni,
+210,No,Macromedia,,,Macromedia,Macromedia Flash,Michael Klingele ,
+220,No,3C|LLC,,,"3C, LLC","SD memory card specifications from 3C, LLC and related Nokia proprietary implementation",Jyri Lassi,legal contact
+230,Yes,Apache,,,Apache,Arabica & Xerces C++ XML parser (OSS),Mikko Amper,legal contact
+240,Yes,.,,,N/A,KJS Scripting Engine (OSS),Alan M. Lerner,
+241,Yes,.,,,N/A,Javascriptcore ,Alan M. Lerner,
+242,Yes,.,,,N/A,Webcore ,Alan M. Lerner,
+250,Yes,.,,,N/A,libxml2,Alan M. Lerner,
+260,No,Vodafone,,,Vodafone,Vodafone  pictographs,Attila Bencze,These are not allowed to be delivered for external licencees without Vodafone permission
+261,No,DoCoMo,,,DoCoMo,DoCoMo  pictographs,Attila Bencze,These are not allowed to be delivered for external licencees without DoCoMo permission
+280,No,Nokia,,,Nokia,CXX Specifications (related to WLAN) from Cisco,M„enp„„ Henri,3rd party or Complement or both?
+281,Bin,Nokia,,,Nokia,Cisco Compatible eXtensions (CCX) for WLAN devices binaries,Pekko Vehvil„inen,Allowed to be delivered
+290,Yes,.,,,N/A,3GP_EXT_Parser,Raharja Flo,
+300,Yes,Nokia,,,Nokia,FileBrowse 3.0 from Nokia,,
+310,No,Hanwang,,,Hanwang,OCR Technology including OCR engine and OCR language packages from Hanwang,Wang Lei 4,
+350,No,Vision,,,Vision Object,PtiEngine core which wraps HandWriting Recognition engine from Vision Object company,Hametvaara Vesa,3rd party
+400,No,.,,,N/A,Components implementing Japanese hadwriting recognition and virtual keyboard.,Tapio Hinkkanen,Nokia component implementation including 3rd party SW
+500,No,Vodafone,,,Vodafone,Vodafone Branding content,Sami Jylkk„,Complement
+510,No,DoCoMo,,,DoCoMo,Docomo Complement Package,Sami Jylkk„,Complement
+520,No,Vodafone,,,Vodafone,Vodafone Complement Package 1,Timo Suhonen,Complement
+525,No,Vodafone,,,Vodafone,Vodafone Complement Package 1.1,Gudena Teja ,Complement
+530,No,China,,,China Mobile,CMCC Complement Package,Tong Lifeng,Complement,,
+540,No,Vodafone,,,Vodafone,Vodafone Complement Package 2,Gudena Teja ,Complement,,
+545,No,Vodafone,,,Vodafone,"Vodafone Complement Package 2.1, Complement",Gudena Teja ,Complement,,
+546,No,Vodafone,,,Vodafone,Vodafone Complement Package 2.1G for Gadget,Gudena Teja ,Complement,,
+547,No,Vodafone,,,Vodafone,Vodafone Complement Package 2.1L for Lumiere,Gudena Teja ,Complement,,
+550,No,Orange,,,Orange,Orange Complement Package 2,Gudena Teja ,Complement,,
+551,No,Orange,,,Orange,"OCP2 (Orange CP Release 2.1 ). This is the next version of Orange Complementary package which includes Orange customizations and Orange specific IM branding.
+",Niittynen Anu (Nokia-D-MSW/Tampere),Complement,,
+560,No,mobile,,,T-mobile,T-mobile Complement Package 2,Gudena Teja ,Complement,,
+565,No,mobile,,,T-mobile,"T-mobile Complement Package 3, Complement",,,,Not delivered
+570,No,AT,,,AT & T,AT & T Complement Package,Gudena Teja ,Complement,,
+580,No,AT,,,AT & T,AT & T Complement Package 2,Fuentes Jose.A (Nokia-D-MSW/SanDiego),Complement,,
+600,No,Nokia,,,Nokia,Rosetta I-mode,Sarsila Kari,,,
+610,No,Nokia,,,Nokia,3.2 ED VoIP and CCE components ,Sami Uusitalo,not allowed to go to the licensees,,
+620,Yes,Nokia,,,Nokia,"CCE REQ components: cce, spsettings cch",Jouni Alan„r„,,,
+650,Bin,.,,,N/A,CASN RTS ,Katajainen Pasi,binary only,,
+700,No,.,,,N/A,WMDRM,Eckhart K”ppen and Simo Kivim„ki,,,
+800,Yes,Sun,,,Sun Microsystems,Java WECE External j9,Simo F„lt,"Saa menn„ S60 lisensoijille, mutta ei saa levitt„„ Nokian sis„ll„."
+810,Yes,Sun,,,Sun Microsystems,Java WEME Internal j9,Simo F„lt,"Saa levitt„„ Nokian sis„ll„, mutte EI saa menn„ ulkoisille asiakkaille."
+900,No,Zi,,,Zi Corporation,Decuma/HWR from Zi Corporation,Wang Lei,
+950,No,Nokia,,,Nokia,SP API Test Automation,Ville Ilvonen,To be removed from external licensees
+1000,No,Nokia,,,Nokia,PC Suite,Aki Lehto (prod. mngr),Complement
+1010,No,Nokia,,,Nokia,Nokia PoC Client,Teemu Polo,Complement
+1020,Yes,Nokia,,,Nokia,ThemeStudio,Janne K Kauppila,Complement
+1030,No,Nokia,,,Nokia,Nokia VPN Client,Timo Ruokolainen,Complement
+1040,No,Nokia,,,Nokia,Catalogs (Preminet Client),Ari Sutinen,Complement
+1050,No,Adobe,,,Adobe Corporation,PDF Reader from Adobe Corporation,Kimmo Uutela,Complement
+1060,No,.,,,N/A,MS Office viewers/editors in 3.0,Kimmo Uutela,Complement
+1070,No,Adobe|Macromedia,,,Adobe Corporation,FlashLite 1.1 binaries (bin in 2.8&3.0),Michael Klingele,Complement
+1075,No,Adobe|Macromedia,,,Adobe Corporation,FlashLite 2.0 sources,Michael Klingele,Complement
+1076,No,Adobe|Macromedia,,,Adobe Corporation,FlashLite 2.0 binaries,Michael Klingele,Complement
+1077,No,Adobe|Macromedia,,,Adobe Corporation,"Flashlite 3.0 sources, special delivery to SEMC only, maybe other licensees later",Michael Klingele,Complement
+1078,No,Adobe|Macromedia,,,Adobe Corporation,Flashlite 3.0 sources,Michael Klingele,
+1079,No,Adobe|Macromedia,,,Adobe Corporation,Flashlite 3.0 binaries,Michael Klingele,
+1080,No,Paragon,,,Paragon Technologie Gmbh,Zip Manager from Paragon Technologie Gmbh,Kimmo Uutela,Complement
+1090,No,Quickoffice ,,,QuickOffice,Quick Office,Pekka Karimaa (team manager),Complement
+1100,No,.,,,Nokia,"Mobile Search client contains two parts: Online Search and Active Search. Online Search enables end users to make search queries directly to 3rd party services (such as e.g. Google, Yahoo! and MSN). Active Search enables end users to search for local content items in the device. It is possible to disable the Online Search with a variant configuration file, during integration. In that case only Active Search (in-device search) remains in the client.",Tenhunen Jouko (Nokia-S&S/Espoo),Complement
+1120,Yes,eMuzed|Aricent,,,Aricent Communications Pvt. Ltd,eMuzed WMA decoder,Dan Plane/Timo Pastila ,>1120 - WMADecoderAPI          -> project for WMA decoder
+1130,Yes,Nokia,,,Nokia,MTP Protocol,Dan Plane/Timo Pastila ,
+1140,No,Microsoft,,,Microsoft,Windows Media DRM from Microsoft,Simo J„rvinen,Complement
+1160,No,Bend,,,Red Bend,vCurrentMobile Delta Generator and Installer from Red Bend,Hegde Rajesh ,Complement
+1170,No,Symantec,,,Symantec,Mobile Security from Symantec,,
+1180,No,Nokia,,,Nokia,"UI effects, phase 1",Juuso Kanner,Complement
+1190,Yes,Alliance,,,Wi-Fi Alliance,WLAN ASD Client from Wi-Fi Alliance (WFA),Niko Ojanen,3rd party
+1200,No,.,,,NA,AudioProxyServer  release ,Passila Mika.K ,Complement
+1201,No,N/A,,,3rd party,WMA 10 Professional audio codec,Bryan Honzaÿ,"WMA 10 Professional audio codec for the S60 platform. WMA 10 Pro supports profiles that include everything from full-resolution 24-bit/96 kHz audio in stereo, 5.1 channel, or even 7.1 channel surround sound, to highly efficient mobile capabilities at 24 Kbps to 96 Kbps for stereo, and 128 Kbps to 256 Kbps for 5.1-channel sound. WMA 10 Pro supports streaming, progressive download, or download-and-play delivery at 128 to 768 Kbps. "
+1300,Yes,.,,,"Red Hat, freedesktop.org",d-bus. Open source IPC library,Mahadevan Shankar (Nokia-D-MSW/Bangalore),Its not a 3rd party but an Open Source library. Yes to licensees and to all S60 SDKs. legal and IPR checks done.
+1301,Yes,.,,,"IMENDIO AB, www.loudmouth-project.org",Loudmouth. Open Source Library,Sharma Shrikumar.B (Nokia-D-MSW/Bangalore),This is a library that is used for last-step connections for xmpp protocol. It also performs certain xmpp protocol tasks.
+1302,Yes,.,,,"telepathy.freedesktop.org, Collabora Limited",telepathygabble. Open Source Library,Sharma Shrikumar.B (Nokia-D-MSW/Bangalore),This is an XMPP protocol connection manager. This uses loudmouth. 
+1303,Yes,.,,,"telepathy.freedesktop.org, Collabora Limited",Libtelepathy. Open Source Library,Sharma Shrikumar.B (Nokia-D-MSW/Bangalore),this is a framework for XMPP protocol. 
+1304,No,.,,,"freedesktop.org, open source component",gstreamer,Adkoli Prashant (Nokia-D-MSW/Bangalore); Patel Kirit (Nokia-D-MSW/Dallas),"3rd party component, open source code.. No Licensee Fee impact"
+1400,Yes,.,,,Symbian Software Ltd,Symbian tools - A set of RnD Tools done by Symbian which can be used in S60 platform.,Kauraniemi Pasi (Nokia-D-MSW/Tampere); Laitinen Matti.T (Nokia-D-MSW/Helsinki),Nokia has done a contract with Symbian for distributing the Symbian LTC debug tools in S60 releases.
+842593,No,.,,,GameLion,Global Race - It is 3D racing game developed by GameLion,Pulkkinen Kimmo (Nokia-D-MSW/Oulu)," - Located in \ppd_sw\cusw_oul_domain\Game_GlobalRace, Nokia has bought a license for Tube + variants, the component cannot be delivered to licensees."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/doc/index.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,83 @@
+.. index::
+  module:  Minibuild compile configuration
+
+===============================
+Minibuild compile configuration
+===============================
+
+
+.. index::
+  single:  Minibuild compile configuration - coverage
+
+Coverage
+========
+
+* prep target except:
+   * prep-drive
+   * dragonfly-prep-drive and deps
+   * do-prep-work-area and deps
+   * create-bom and deps
+   * check-env-prep and deps
+   * prep-copy and deps
+* compile-main
+* imaker-test-new-impl (experimental testing)
+* zip-ee
+   * Regular archive creation
+   * Policy archive creation
+   * Abld what scanner
+   * Metadata generation
+   * All systems:
+      * Ant
+      * Light EC acceleration
+      * Full EC acceleration
+
+
+.. index::
+  single:  Minibuild compile configuration - setup
+
+Minibuild setup
+===============
+
+What is required?
+-----------------
+
+* Build machine
+* Build Area with a valid S60 environment (eg. PF5250)
+* Helium (obviously)
+
+
+Current Dragonfly configuration
+-------------------------------
+
+The current minibuild environment is using PF5250 wk25 release from a Dragonfly server.
+The Dragonfly workspace has been created with share flag enabled so anybody should be able to access it.
+
+Information related to the share are logged during the build::
+
+   ...
+   ------------ Build Drive Info -----------------
+   Local name        T:
+   Remote name       \\tribld03\shared_workspaces\helium_test_wk25
+   Resource type     Disk
+   ...
+   -----------------------------------------------
+   ...
+
+
+  
+.. index::
+  module:  Minibuild compile configuration - how to run the build
+
+How to run the build?
+---------------------
+
+The command line to run the build is the following::
+
+   hlm -Dbuild.drive=%BUILD_DRIVE% -Dbuild.number=01 mini-build
+
+
+You only need to provide the following properties:
+* build.drive: location of the build area
+* build.number: the build number
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+set HLM_RVCT_VERSION=22_616
+..\..\..\hlm.bat %*
+endlocal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/minibuild_compile.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd">
+<SystemDefinition name="helium_minibuild_compile" schema="1.4.0">
+	<systemModel>
+		<layer name="clock_layer">
+			<module name="clock">
+				<component name="clock">
+					<unit unitID="S60_app_organizer_clock" name="clock" bldFile="sf\app\organizer\clock2\group" mrp=""/>
+				</component>
+			</module>
+		</layer>
+	</systemModel>
+    <build>
+        <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+<!--    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/> -->
+    <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+    <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+    <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+    <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+    <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+    <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+    <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+    <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+    <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+
+    <!-- Aditional Targets -->
+    <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+    <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+    
+    <targetList name="default" description="Main Targets" target="WINSCW ARMV5"/>
+    <targetList name="default_winscw" description="Main Targets" target="WINSCW"/>
+    <targetList name="default_armv5" description="Main Targets" target="ARMV5"/>
+    <targetList name="default_rel" description="Main Targets for rel" target="WINSCW_REL ARMV5_REL"/>
+    <targetList name="default_deb" description="Main Targets for deb" target="WINSCW_DEB ARMV5_DEB"/>
+    <targetList name="default_tools" description="tools Targets" target="TOOLS"/>
+    <targetList name="tools" description="tools Targets" target="TOOLS"/>
+        <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+    <targetList name="cwtools" description="cwtools Targets" target="CWTOOLS"/>
+    <targetList name="cwtools_rel" description="cwtools Release Targets" target="CWTOOLS_REL"/>
+  
+	    <configuration name="helium_minibuild_compile" description="" filter="">
+	    	<layerRef layerName="clock_layer"/>
+	    	
+	        <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld export" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld resource" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld library" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld -what build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	    </configuration>
+    </build>
+    
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/sysdef_1_4_0.dtd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/template_release_metadata.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<releaseInformation>
+    <releaseDetails>
+        <releaseID>
+            <service name="service"/>
+            <product name="prod"/>
+            <release name="rel"/>
+        </releaseID>
+    </releaseDetails>
+    <releaseFiles/>
+    <externalFiles/>
+
+	<filters>
+		<!-- Filter definitions -->
+		<!-- 	code = code used in package attribute "filters" 
+					text = Filter name
+					description = filter description
+		-->
+    <filter code="foo" text="Emulator binaries" description="Files needed for emulator." /> 
+    <filter code="bar" text="complementary binaries and sources" description="complementary components binaries and sources"/>
+    <filter code="test" text="source files" description="symbian and S60 source files"/>
+	</filters>
+    
+</releaseInformation>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/diamonds/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.diamonds" default="mini-build" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" basedir=".">
+    <property environment="env"/>
+    
+	<dirname property="config.dir" file="${ant.file.minibuild.diamonds}"/>
+
+    <!-- Enable Helium internal assertion checking. -->
+    <property name="hlm.enable.asserts" value="1" />
+        
+    <property name="build.name" value="minibuild_diamonds" />
+    <property name="build.family" value="test_minibuilds" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="0" />
+    <property name="prep.root.dir" value="f:\pmackay" />
+    
+    <import file="${helium.dir}/helium.ant.xml"/>
+        
+    <!--ant code coverage for mini-builds-->
+    <target name="mini-build" depends="prep-drive,init-build-area,diamonds,prebuild,compile-main"/>
+
+    
+    <!-- Stubbing few targets for easy testing with dragonfly ... -->
+    <target name="prebuild">
+        <echo>Stubbed target: prebuild</echo>
+    </target>
+    <target name="compile-main">
+        <echo>Stubbed target: compile-main</echo>
+        <echo>Pause for 10 seconds.</echo>
+        <sleep seconds="10"/>
+    </target>
+    <target name="check-env-prep"/>
+    <target name="prep-copy"/>
+	
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/diamonds/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+..\..\..\..\helium\hlm.bat %*
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.ido-sbs" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" basedir="..\ido">
+    <property environment="env"/>
+	<!--property name="config.temp.build.dir" location="${ant.file.minibuild.ido-sbs}/../build"/ -->
+	
+	<!-- Configuring raptor build system -->
+	<property name="build.system" value="sbs"/>
+
+    <!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+    <!--<target name="do-mini-build" depends="mini-build-cleanup,
+    										compile-main"/>-->
+
+	<property name="build.name" value="minibuild_ido_sbs" />
+    <property name="build.family" value="test_minibuild_ido_sbs" />
+		
+    <target name="mini-build-check">
+    	<!-- Check if prep has set some prop correctly... -->
+        <echo>'${arm.compiler.version}'</echo>
+        <au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true"/>
+
+        <!-- Check if compile-main step did what expected... -->
+        <au:assertFileExists file="${canonical.sysdef.file}"/>
+        <if>
+            <istrue value="${blocks.enabled}" />
+            <then>
+                <au:assertFileExists file="${blocks.config.dir}/minibuild_helloworldapi.blocks_component.xml" />
+                <au:assertFileExists file="${blocks.config.dir}/minibuild_helloworldcons.blocks_component.xml" />
+            </then>
+        </if>
+    </target>
+	
+	
+	<import file="../ido/build.xml"/>
+</project>
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if exist "E:\APPS\sbs" (
+set SBS_HOME=E:\APPS\sbs
+set PATH=%SBS_HOME%\bin;%PATH%
+)
+echo Using Raptor from: %SBS_HOME%
+..\..\..\..\helium\hlm.bat %*
+endlocal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.ido" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+	<property environment="env" />
+	<import file="../site/${env.TEAM}.ant.xml" />
+	<dirname property="config.dir" file="${ant.file.minibuild.ido}" />
+
+	<!-- Enable Helium internal assertion checking. -->
+	<property name="hlm.enable.asserts" value="1" />
+
+	<property name="build.name" value="minibuild_ido" />
+	<property name="build.family" value="test_minibuild_ido" />
+	<property name="major.version" value="0" />
+	<property name="minor.version" value="0" />
+
+	<property name="ccm.project.wa_path" location="E:\Build_E\${env.USERNAME}\ido_wa\${build.name}" />
+	<property name="ccm.enabled" value="true" />
+
+
+	<!-- build configuration -->
+	<property name="sysdef.configurations.list" value="helium_minibuild_ido" />
+	<path id="system.definition.files">
+		<fileset dir="${config.dir}" includes="sysdefs/*.sysdef.xml" />
+		<fileset dir="${ccm.project.wa_path}" includes="*/*/*/layers.sysdef.xml" />
+	</path>
+
+
+	<!-- Configuring the build system -->
+	<property name="build.system" value="ec-helium" />
+	<property name="rvct.version" value="22_616" />
+
+	<!-- Configuring get latest env. -->
+	<property name="s60.grace.service" value="S60RnD" />
+	<property name="s60.grace.product" value="pf_5250" />
+	<property name="s60.grace.release" value="pf_5250(?:_| )?\d{4}(?:\s*wk)?\d{2}" />
+	<!-- matching pf_5250_200816 and pf_5250 2008 wk16 -->
+	<property name="prep.root.dir" value="E:\Build_E\${env.USERNAME}\ido_ba\${build.name}" />
+
+	<!-- Synergy configuration -->
+	<property name="ccm.database" value="tr1test1" />
+	<property name="prep.delivery.file" location="config/delivery.xml" />
+	<property name="publish.ccm.folder" value="tr1test1#2079" />
+
+
+	<!-- Synergy is not configured -->
+	<property name="skip.password.validation" value="1" />
+
+	<!-- IDO robot configuration -->
+	<property name="do.robot.release" value="MinibuildDomain" />
+	<tstamp>
+		<format property="ido.robot.tstamp" pattern="yyyyMMddhhmmss" />
+	</tstamp>
+	<property name="s60.build.robot.path" location="${build.drive}/shared_drive/s60robot/${build.name}/${ido.robot.tstamp}" />
+
+	<import file="hack-test.ant.xml" />
+	<import file="${helium.dir}/helium.ant.xml" />
+
+	<!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+	<target name="do-mini-build" depends="ido-update-build-area,
+                                            flag-ba-for-deletion,
+    										mini-build-cleanup,
+    										ido-build,
+                							check-diamonds,
+    	                                    mini-build-check,
+    										run-hack" />
+
+
+	<!--ant code coverage for mini-builds-->
+	<target name="mini-build">
+    <antcall target="database">
+        <param name="home.files.only" value="false"/>
+    </antcall>
+		<mkdir dir="${helium.build.dir}/temp" />
+		<property name="config.temp.build.dir" location="${config.dir}/build" />
+		<hlm:coveragerecord name="${helium.build.dir}/temp/test.minibuild-ido.xml" action="start" />
+		<runtarget target="do-mini-build" />
+		<hlm:coveragerecord name="${helium.build.dir}/temp/test.minibuild-ido.xml" action="stop" />
+		<fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.txt.ftl" outputfile="${helium.build.dir}/temp/test_minibuild.txt">
+			<data expandProperties="yes">
+                doc: xml(${helium.build.dir}/temp/test.minibuild-ido.xml)
+                database: xml(${database.file})
+            </data>
+		</fmpp>
+		<loadfile srcfile="${helium.build.dir}/temp/test_minibuild.txt" property="ant.coverage.summary" />
+		<echo>
+The summary of Ant code coverage:
+
+${ant.coverage.summary}</echo>
+		<fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.html.ftl" outputfile="${helium.build.dir}/temp/test_minibuild.html">
+			<data expandProperties="yes">
+            	doc: xml(${helium.build.dir}/temp/test.minibuild-ido.xml)
+                database: xml(${database.file})
+			</data>
+		</fmpp>
+	</target>
+
+	<!-- Preparing the content on top of the env -->
+	<target name="ido-50-build" depends="ido-build-prep,compile-main,build-log-summary,render-internal-exports,update-policy-src-reference,render-validate-policy,localisation-50-build,ido-codescanner,rndsdk-create-api-descr-xml,ats-test,publish-tasks-to-folder,ido-sources-to-s60-build-robot" />
+	<target name="ido-build-prep" depends="ido-configure-prep,init,check-tool-dependencies,log-build-env,set-arm-version,check-free-space,diamonds,do-ccm-get-input,ido-prep-clean,ido-prep-copy,create-bom" />
+
+	<!-- needed to defined skip.prep-drive -->
+	<target name="ido-configure-prep">
+		<property name="skip.prep-drive" value="true" />
+	</target>
+
+	<!-- real IDO use this to switch branch target. -->
+	<target name="ido-build">
+		<runtarget target="ido-50-build" />
+	</target>
+
+
+	<target name="check-diamonds">
+		<!--loadfile srcfile="${build.log.dir}/diamonds-start.log.xml" property="diamonds.log.start" />
+		<echo>${diamonds.log.start}</echo-->
+		<!--loadresource property="diamonds.log.start.output">
+			<url url="${diamonds.build.url}?fmt=xml" />
+		</loadresource-->
+		<!--echo>${diamonds.log.start.output}</echo-->
+        <xmlvalidate lenient="yes">
+        	<fileset dir="${build.log.dir}">
+                <include name="diamonds-finish.xml"/>
+                <include name="diamonds-full-results.xml"/>
+                <include name="diamonds-start.log.xml"/>
+        		<include name="check-tool-dependencies.xml"/>
+        		<include name="compile-main.xml"/>
+        		<include name="create-bom.xml"/>
+        		<include name="build-time.xml"/>
+        	</fileset>
+        </xmlvalidate>
+	</target>
+
+	<target name="mini-build-cleanup">
+		<delete verbose="true" includeemptydirs="true">
+			<fileset dir="${build.drive}/" casesensitive="false">
+				<include name="makefile" />
+				<include name="*.mk" />
+				<include name="ecloud_tmp_*/**" />
+				<include name="emake.*" />
+				<include name="epoc32/build/**" />
+				<include name="epoc32/rombuild/*/**" />
+				<include name="output/**" />
+				<include name="timestart.txt" />
+				<include name="timestop.txt" />
+			</fileset>
+		</delete>
+	</target>
+
+
+	<target name="mini-build-check">
+		<!-- Check if prep has set some prop correctly... -->
+		<echo>'${arm.compiler.version}'</echo>
+		<au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true" />
+
+		<!-- Check if compile-main step did what expected... -->
+		<au:assertFileExists file="${canonical.sysdef.file}" />
+		<if>
+			<or>
+				<isset property="build.system.ec-helium" />
+				<isset property="build.system.ec" />
+			</or>
+			<then>
+				<au:assertFileExists file="${build.drive}/helium_minibuild_ido.make" />
+				<au:assertFileExists file="${build.drive}/helium_minibuild_ido_clean.make" />
+				<au:assertFileExists file="${build.drive}/emake.data" />
+
+				<au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_ido_run_emake.bat" />
+				<au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_ido_clean_run_emake.bat" />
+			</then>
+		</if>
+	</target>
+
+
+	<target name="update-policy-src-reference" depends="ido-create-ado-mapping">
+		<hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="reference.policy.path.list"/>
+	</target>
+
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/config/delivery.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" ?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <config name="IDOs" abstract="true">
+        <set name="database" value="${ccm.database}" />
+        <set name="dir" value="${ccm.project.wa_path}" />
+        <set name="threads" value="1" />
+        <set name="sync" value="true" />
+		<set name="show.conflicts" value="true" />
+		<set name="fix.missing.baselines" value="true" />
+		<set name="replace.subprojects" value="true" />
+		
+
+
+        <set name="use.reconfigure.template" value="true" />
+        <set name="purpose" value="Insulated Development" />
+        <set name="release" value="MinibuildDomain/next" />
+
+        <config name="MinibuildDomain-50_200832:project:tr1test1#1" type="checkout"/>
+        
+    </config>
+</build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/doc/index.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+.. index::
+  module:  Minibuild IDO compile configuration
+
+===================================
+Minibuild IDO compile configuration
+===================================
+
+
+.. index::
+  single:  Minibuild IDO compile configuration - coverage
+
+Coverage
+========
+
+* Automatic environment update. 
+* IDO specific target (relying on layers.sysdef.xml)
+
+
+.. index::
+  single:  Minibuild IDO compile configuration - setup
+
+Minubuild setup
+===============
+
+What is required?
+-----------------
+
+* Build machine
+* Helium (obviously)
+
+
+  
+.. index::
+  single:  Minibuild IDO compile configuration - how to run
+
+How to run the build?
+---------------------
+
+The command line to run the build is the following::
+
+   hlm -Dbuild.drive=%BUILD_DRIVE% -Dbuild.number=01 mini-build
+
+
+You only need to provide the following properties:
+* build.drive: location of the build area
+* build.number: the build number
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/hack-test.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="hack-test" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+	<property name="hack.dir" location="${build.drive}/test_hack/"/>
+	
+	<!-- Running hack test. -->
+	<target name="run-hack" depends="prepare-hack,do-hack,cleanup-hack"/>
+
+	<!-- Getting real file to hack. -->
+	<target name="prepare-hack">
+		<mkdir dir="${hack.dir}"/>
+		<copy file="${build.drive}\epoc32\tools\variant\variant.cfg" todir="${hack.dir}" overwrite="true"/>
+		<copy file="${build.drive}\epoc32\rom\include\s60.iby" todir="${hack.dir}" overwrite="true"/>
+		<copy file="${build.drive}\epoc32\data\z\private\10202be9\101F8763.txt" todir="${hack.dir}" overwrite="true"/>
+	</target>
+
+	<!-- Cleanup hack area. -->
+	<target name="cleanup-hack">
+        <delete verbose="true" includeemptydirs="true">
+            <fileset dir="${hack.dir}/" casesensitive="false">
+                <include name="**"/>
+            </fileset>
+        </delete>
+	</target>
+
+	<!-- Testing hackMacro by hacking s60.iby and variant.cfg. -->
+	<target name="do-hack">
+		<!-- Hacking variant.cfg -->
+		<copy file="${hack.dir}/variant.cfg" tofile="${hack.dir}/variant_hacked.cfg" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/variant_hacked.cfg" keyword="ENABLE_ABIV2_MODE" regex="(.hrh\s*$)" replace="\1\nENABLE_ABIV2_MODE"/>
+		<copy file="${hack.dir}/variant_hacked.cfg" tofile="${hack.dir}/variant_skipped.cfg" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/variant_skipped.cfg" keyword="ENABLE_ABIV2_MODE" regex="(.hrh\s*$)" replace="\1\nENABLE_ABIV2_MODE"/>
+
+		<au:assertFilesDiffer expected="${hack.dir}/variant.cfg" actual="${hack.dir}/variant_hacked.cfg" />
+		<au:assertFilesMatch expected="${hack.dir}/variant_skipped.cfg" actual="${hack.dir}/variant_hacked.cfg" />
+
+		<!-- Hacking S60.iby -->
+		<copy file="${hack.dir}/s60.iby" tofile="${hack.dir}/s60_hacked.iby" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/s60_hacked.iby" keyword="&lt;foo\.iby&gt;" regex="#endif" replace="#include &lt;foo.iby&gt;\n#endif"/>
+		<copy file="${hack.dir}/s60_hacked.iby" tofile="${hack.dir}/s60_skipped.iby" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/s60_skipped.iby" keyword="&lt;foo\.iby&gt;" regex="#endif" replace="#include &lt;foo.iby&gt;\n#endif"/>
+
+		<au:assertFilesDiffer expected="${hack.dir}/s60.iby" actual="${hack.dir}/s60_hacked.iby" />
+		<au:assertFilesMatch expected="${hack.dir}/s60_skipped.iby" actual="${hack.dir}/s60_hacked.iby" />
+
+		<!-- Hacking 101F8763.iby -->
+		<copy file="${hack.dir}/101F8763.txt" tofile="${hack.dir}/101F8763_hacked.txt" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/101F8763_hacked.txt" keyword="0xA int 0 0" regex="0xA int 1 0" replace="0xA int 0 0" encoding="UTF16"/>
+		<copy file="${hack.dir}/101F8763_hacked.txt" tofile="${hack.dir}/101F8763_skipped.txt" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/101F8763_skipped.txt" keyword="0xA int 0 0" regex="0xA int 1 0" replace="0xA int 0 0" encoding="UTF16"/>
+
+		<au:assertFilesDiffer expected="${hack.dir}/101F8763.txt" actual="${hack.dir}/101F8763_hacked.txt" />
+		<au:assertFilesMatch expected="${hack.dir}/101F8763_skipped.txt" actual="${hack.dir}/101F8763_hacked.txt" />
+	</target>
+
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+..\..\..\..\helium\hlm.bat %*
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/sysdefs/minibuild_ido.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition SYSTEM "http://helium.nmp.nokia.com/trac/browser/helium/trunk/helium/tools/common/dtd/sysdef_1_4_0.dtd?format=raw">
+<SystemDefinition name="helium_minibuild_compile" schema="1.4.0">
+	<systemModel>
+		<layer name="mw_layer"/>
+		<layer name="app_layer"/>
+		<layer name="osext_layer"/>
+	</systemModel>
+    <build>
+        <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+<!--    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/> -->
+    <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+    <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+    <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+    <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+    <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+    <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+    <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+    <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+    <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+
+    <!-- Aditional Targets -->
+    <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+    <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+    
+    <targetList name="default" description="Main Targets" target="WINSCW ARMV5"/>
+    <targetList name="default_winscw" description="Main Targets" target="WINSCW"/>
+    <targetList name="default_armv5" description="Main Targets" target="ARMV5"/>
+    <targetList name="default_rel" description="Main Targets for rel" target="WINSCW_REL ARMV5_REL"/>
+    <targetList name="default_deb" description="Main Targets for deb" target="WINSCW_DEB ARMV5_DEB"/>
+    <targetList name="default_tools" description="tools Targets" target="TOOLS"/>
+    <targetList name="tools" description="tools Targets" target="TOOLS"/>
+        <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+    <targetList name="cwtools" description="cwtools Targets" target="CWTOOLS"/>
+    <targetList name="cwtools_rel" description="cwtools Release Targets" target="CWTOOLS_REL"/>
+  
+	    <configuration name="helium_minibuild_ido" description="" filter="raptor_helium_minibuild_ido">
+	    	<layerRef layerName="mw_layer"/>
+	    	<layerRef layerName="app_layer"/>
+	    	<layerRef layerName="osext_layer"/>
+	    	
+	        <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld export" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld resource" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld library" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld target" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld final" targetList="default_armv5" unitParallel="N" targetParallel="N"/></task>
+	        <task><buildLayer command="abld -what build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld -check build" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	    </configuration>
+	    
+	    <configuration name="helium_minibuild_ido_clean" description="" filter="raptor_helium_minibuild_ido_clean">
+	    	<layerRef layerName="mw_layer"/>
+	    	<layerRef layerName="app_layer"/>
+	    	<layerRef layerName="osext_layer"/>
+	        <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+	        <task><buildLayer command="abld makefile" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="abld reallyclean" targetList="default_armv5" unitParallel="Y" targetParallel="Y"/></task>
+	        <task><buildLayer command="bldmake clean" unitParallel="Y"/></task>
+	    </configuration>
+    </build>
+    
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/imaker/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.ido" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    <import file="../site/${env.TEAM}.ant.xml" />
+	<dirname property="config.dir" file="${ant.file.minibuild.ido}"/>
+	
+    <!-- Enable Helium internal assertion checking. -->
+    <property name="hlm.enable.asserts" value="1" />
+
+    <property name="build.name" value="minibuild_imaker" />
+    <property name="build.family" value="minibuild_imaker" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="0" />
+	<property name="ccm.enabled" value="true"/>
+
+	<!-- Configuring the build system -->
+    <property name="build.system" value="ec-helium" />
+    
+    <property name="ec.cluster.manager" value="fawec001"/>
+    <property name="ec.build.class" value="ISISBR"/>
+    
+    <property name="rvct.version" value="22_616"/>
+
+    <!-- Configuring get latest env. -->
+	<property name="s60.grace.service" value="s60_devices_sw" />
+	<property name="s60.grace.product" value="DFS70.91.91" />
+	<property name="s60.grace.release" value="S60.91_\d{6}_hw70" />
+	<property name="prep.root.dir" value="E:\Build_E\${env.USERNAME}\ido_ba\${build.name}" />
+
+
+    <import file="${helium.dir}/helium.ant.xml"/>
+
+    <!-- Need to define custom preparation steps. -->
+	<target name="ido-prep" depends="prep-drive,preparation-getenv"/>
+
+    <!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+    <target name="do-mini-build" depends="ido-update-build-area,
+    										mini-build-cleanup,
+                                            mini-build-install-new-imaker,
+    										imaker-build,
+    	                                    mini-build-check"/>
+    
+    
+    <!--ant code coverage for mini-builds-->
+    <target name="mini-build">
+        <antcall target="database">
+            <param name="home.files.only" value="false"/>
+        </antcall>
+        <mkdir dir="${helium.build.dir}/temp"/>
+        <property name="config.temp.build.dir" location="${config.dir}/build"/>
+        <hlm:coveragerecord name="${helium.build.dir}/temp/test.minibuild-ido.xml" action="start"/>
+        <runtarget target="do-mini-build"/>
+        <hlm:coveragerecord name="${helium.build.dir}/temp/test.minibuild-ido.xml" action="stop"/>
+        <fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.txt.ftl"
+            outputfile="${helium.build.dir}/temp/test_minibuild.txt">
+            <data expandProperties="yes">
+                doc: xml(${helium.build.dir}/temp/test.minibuild-ido.xml)
+                database: xml(${database.file})
+            </data>
+        </fmpp>
+        <loadfile srcfile="${helium.build.dir}/temp/test_minibuild.txt" property="ant.coverage.summary"/>
+        <echo>
+The summary of Ant code coverage:
+
+${ant.coverage.summary}</echo>
+		<fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.html.ftl"
+			  outputfile="${helium.build.dir}/temp/test_minibuild.html">
+			<data expandProperties="yes">
+            	doc: xml(${helium.build.dir}/temp/test.minibuild-ido.xml)
+                database: xml(${database.file})
+			</data>
+		</fmpp>
+    </target>
+
+    <target name="mini-build-install-new-imaker">
+        <!-- Export custom image configuration file. -->
+        <copy file="config/image_conf_naming.mk" tofile="${build.drive}/epoc32/rom/config/image_conf_naming.mk"/>
+        <!--hlm:bldmakeBldfilesMacro dir="${build.drive}/imaker_rnd/group"/>
+        <hlm:abldMacro dir="${build.drive}/imaker_rnd/group" command="cleanexport" platform=""/>
+        <hlm:abldMacro dir="${build.drive}/imaker_rnd/group" command="export" platform=""/-->
+    </target>
+	
+	<target name="minibuild-build-roms" depends="build-roms,imaker-merge-rom-xml"/>
+	
+    <target name="build-roms-ec">
+        <antcall target="minibuild-build-roms">
+            <reference refid="imaker.rom.config" torefid="imaker.rom.config"/>
+            <param name="build.system" value="ec-helium"/>
+        	<param name="release.images.dir" value="${build.output.dir}/imaker_ec"/>        	
+       </antcall>
+    </target>
+	
+    <target name="build-roms-ebs">
+        <antcall target="minibuild-build-roms">
+            <reference refid="imaker.rom.config" torefid="imaker.rom.config"/>
+            <param name="build.system" value="ebs"/>
+            <param name="release.images.dir" value="${build.output.dir}/imaker_ebs"/>         
+       </antcall>
+    </target>
+	
+	<!-- test target. -->
+	<target name="imaker-build" depends="build-roms-ec,build-roms-ebs">
+	</target>
+
+    
+    <target name="check-diamonds">
+		<loadfile srcfile="${build.log.dir}/${build.id}_diamonds-log-start.xml" property="diamonds.log.start"/>
+        <echo>${diamonds.log.start}</echo>
+        <loadresource property="diamonds.log.start.output">
+            <url url="${diamonds.build.url}?fmt=xml"/>
+        </loadresource>
+        <echo>${diamonds.log.start.output}</echo>
+	</target>
+    
+    <target name="mini-build-cleanup">
+        <delete verbose="true" includeemptydirs="true">
+            <fileset dir="${build.drive}/" casesensitive="false">
+                <include name="makefile"/>
+                <include name="*.mk"/>
+            	<include name="ecloud_tmp_*/**"/>
+            	<include name="emake.*"/>            	
+                <include name="epoc32/build/**"/>
+                <include name="epoc32/rombuild/*/**"/>
+                <include name="output/**"/>
+                <include name="timestart.txt"/>
+                <include name="timestop.txt"/>
+            </fileset>
+        </delete>
+    	<mkdir dir="${build.drive}/output/logs"/>
+    </target>
+    
+    
+    <target name="mini-build-check">
+    </target>
+	
+	<!-- Rom configuration -->
+    <hlm:imakerconfigurationset id="imaker.rom.config">
+        <imakerconfiguration>
+            <makefileset>
+                <include name="**/${product.name}*/*ui.mk"/>
+            </makefileset>
+            <targetset>
+                <include name="^core$"/>
+                <include name="^langpack_01.*$"/>
+                <include name="^langpack_02.*$"/><!---->
+                <include name="^custvariant_.*$"/>
+            </targetset>
+            <variableset>
+                <variable name="USE_FOTI" value="0"/>
+                <variable name="USE_FOTA" value="1"/>
+                <variable name="TYPE" value="rnd"/>
+            </variableset>
+        </imakerconfiguration>
+                <imakerconfiguration>
+            <makefileset>
+                <include name="**/${product.name}*/*ui.mk"/>
+            </makefileset>
+            <targetset>
+                <include name="^core$"/>
+                <include name="^langpack_01.*$"/>
+                <include name="^langpack_02.*$"/><!---->
+                <include name="^custvariant_.*$"/>
+            </targetset>
+            <variableset>
+                <variable name="USE_FOTI" value="0"/>
+                <variable name="USE_FOTA" value="1"/>
+                <variable name="TYPE" value="prd"/>
+            </variableset>
+        </imakerconfiguration>
+    </hlm:imakerconfigurationset>	
+</project>
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/imaker/config/image_conf_naming.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+USE_NAMEMK = 1
+# Example version of image_conf_naming.mk
+# If this file exists in the build area, it is read by iMaker and can be
+# used for image naming, setting directories and version info generation.
+
+# this variable is intended to be overriden by customer that would need to customize the version string.
+CUSTOMIZE_VERSION?=
+
+# setting langpack templates
+ROFS2_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/langpack/$(LANGPACK_PREFIX)$(LANGPACK_ID)
+ROFS2_NAME = $(PRODUCT_TYPE)_$(BUILD_ID)_$(LANGPACK_ID)_$(TYPE)
+
+# setting core templates
+CORE_NAME = $(PRODUCT_TYPE)_$(BUILD_ID)_$(TYPE)
+CORE_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/core/$(CORE_NAME)
+
+UDA_NAME = $(PRODUCT_TYPE)_$(BUILD_ID)_$(TYPE)
+UDA_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/uda
+
+# setting customer templates
+ROFS3_NAME = $(PRODUCT_TYPE)_$(BUILD_ID)_${CUSTVARIANT_NAME}_$(TYPE)
+ROFS3_DIR  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_NAME)/$(TYPE)/customer/$(CUSTVARIANT_NAME)
+
+# setting version string templates
+#CORE_VERSION=V$(COREPLAT_VERSION).$(S60_VERSION).$(BUILD_YEAR)_wk$(BUILD_WEEK)
+CORE_SHORTVERSION=$(MAJOR_VERSION)$(MINOR_VERSION).$(BUILD_NUMBER)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)
+CORE_VERSION=v$(BUILD_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)
+
+LANGPACK_SHORTVERSION=$(MAJOR_VERSION)$(MINOR_VERSION).$(BUILD_NUMBER).$(LANGPACK_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)
+LANGPACK_VERSION=v$(BUILD_ID).$(LANGPACK_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)
+
+ROFS3_SHORTVERSION=$(MAJOR_VERSION)$(MINOR_VERSION).$(BUILD_NUMBER).$(CUSTVARIANT_NAME)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)$(FOTA_A_BUILD)
+ROFS3_VERSION=v$(BUILD_ID)$(TYPE_SWINFO)$(CUSTOMIZE_VERSION)
+
+CORE_SWVERINFO = $(CORE_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) Nokia
+LANGPACK_SWVERINFO = $(LANGPACK_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) Nokia
+ROFS3_CUSTINFO = $(ROFS3_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) Nokia
+
+# fix the fpsx image location too.
+CORE_FLASH       = $(CORE_DIR)/$(CORE_NAME)$(call iif,$(USE_ROFS2)$(USE_ROFS3),.core)$(FLASH_EXT)
+ROFS2_FLASH      = $(ROFS2_DIR)/$(ROFS2_NAME).rofs2$(FLASH_EXT)
+ROFS3_FLASH      = $(ROFS3_DIR)/$(ROFS3_NAME).rofs3$(FLASH_EXT)
+
+# declaring missing target declaration foti/fota...
+$(call add_help,foti,t,Create FOTI sw updater)
+$(call add_help,fota,t,Create FOTA sw updater)
+
+IMAKER_VARXML  = $(RELEASE_IMAGES_DIR)/$(PRODUCT_TYPE)_$(BUILD_ID)_core$(LANGPACK_NAME)$(CUSTVARIANT_NAME)${TYPE}.iconfig.xml
+IMAKER_VARLIST=CORE_NAME ROFS2_NAME ROFS3_NAME LANGPACK_ID CUSTVARIANT_ID PRODUCT_NAME PRODUCT_TYPE TYPE CORE_VERSION LANGPACK_VERSION ROFS3_VERSION CORE_DIR ROFS2_DIR ROFS3_DIR
+
+USE_FOTAXML=1
+
+FOTA_CONFXML = $(ROFS3_DIR)/$(ROFS3_NAME)_$(LANGPACK_ID)$(if $(CUSTVARIANT_ID),_$(CUSTVARIANT_ID)).config.xml
+
+define FOTA_XMLINFO
+  <?xml version="1.0"?>
+  <flash_config>
+  \    <image_set>
+  \        <product>$(PRODUCT_NAME)</product>
+  \        <type_designator>$(PRODUCT_TYPE)</type_designator>
+  \        <image_type>$(TYPE)</image_type>
+  \        <sw_version>$(CORE_VERSION)</sw_version>
+  \        <image type="core" name="$(CORE_FLASH)"/>
+  $(if $(LANGPACK_ID),
+  \        <image type="language" name="$(ROFS2_FLASH)" id="$(LANGPACK_ID)"/>)
+  $(if $(CUSTVARIANT_ID),
+  \        <image type="customer" name="$(ROFS3_FLASH)" id="$(CUSTVARIANT_ID)"/>)
+  \        <fwid>$(PRODUCT_TYPE)_$(CORE_SHORTVERSION) $(LANGPACK_SHORTVERSION) $(ROFS3_SHORTVERSION)</fwid>
+  $(if $(CUSTVARIANT_DESC),
+  \        <description>$(CUSTVARIANT_DESC)</description>)
+  \        <date>$(DAY)-$(MONTH)-$(YEAR2)</date>
+  \    </image_set>
+  </flash_config>
+endef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/imaker/doc/index.rst	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+.. index::
+  module:  Minibuild iMaker configuration
+
+===================================
+Minibuild iMaker configuration
+===================================
+
+
+.. index::
+  single:  Minibuild iMaker configuration - coverage
+
+Coverage
+========
+
+* Automatic environment update. 
+* Testing latest version of iMaker (from svn).
+
+
+.. index::
+  single:  Minibuild iMaker configuration - Setup
+
+Minubuild setup
+===============
+
+What is required?
+-----------------
+
+* Build machine
+* Helium (obviously)
+
+
+  
+.. index::
+  single:  Minibuild iMaker configuration - how to run
+
+How to run the build?
+---------------------
+
+The command line to run the build is the following::
+
+   hlm -Dbuild.drive=%BUILD_DRIVE% -Dbuild.number=01 mini-build
+
+
+You only need to provide the following properties:
+* build.drive: location of the build area
+* build.number: the build number
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/imaker/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+..\..\..\..\helium\hlm.bat %*
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.qt" default="mini-build" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" basedir=".">
+    <property environment="env" />
+    <import file="../site/${env.TEAM}.ant.xml" optional="true"/>
+    <dirname property="config.dir" file="${ant.file.minibuild.qt}" />
+
+    <!-- Enable Helium internal assertion checking. -->
+    <property name="hlm.enable.asserts" value="1" />
+    
+    <!-- Configure Qt building -->
+    <property name="compile.sysdef.dtd.stub" location="${helium.dir}/tools/common/dtd/sysdef_dtd_1_5_1.xml" />
+    <property name="qmake.enabled" value="true" />
+    <property name="qt.dir" location="${build.drive}/sf/mw/qt" />
+    
+    <property name="build.name" value="minibuild_qt" />
+    <property name="build.family" value="test_minibuilds" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="0" />
+    <property name="publish.root.dir" location="${build.drive}/release" />
+
+    <!-- For Grace upload-->
+    <property name="release.grace.service" value="Test_Helium" />
+    <property name="release.grace.product" value="minibuild_qt" />
+    <property name="release.label" value="${major.version}.${minor.version}" />
+
+    <!-- build configuration -->
+    <property name="sysdef.configurations.list" value="build_tools,build" />
+    <path id="system.definition.files">
+        <fileset dir="." includes="*.sysdef.xml" />
+    </path>
+
+    <property name="build.system" value="ec-helium" />
+
+    <!-- Synergy is not configured -->
+    <property name="skip.password.validation" value="1" />
+    <property name="zip.config.file" value="${helium.dir}/tests/minibuilds/qt/config/qmake_zip_cfg.xml"/>
+    <property name="zips.ee.spec.name" value="ee"/>
+
+
+    <import file="${helium.dir}/helium.ant.xml" />
+
+    <!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
+    <target name="do-mini-build" depends="mini-build-cleanup,mini-build-prep,export-tools,
+      compile-main,zip-ee, mini-build-check" />
+
+
+
+    <!--ant code coverage for mini-builds-->
+    <target name="mini-build">
+        <antcall target="database">
+            <param name="home.files.only" value="false"/>
+        </antcall>
+        <mkdir dir="${helium.build.dir}/temp" />
+        <hlm:coveragerecord name="${helium.build.dir}/temp/test_minibuild.xml" action="start" />
+        <runtarget target="do-mini-build" />
+        <hlm:coveragerecord name="${helium.build.dir}/temp/test_minibuild.xml" action="stop" />
+        <fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.txt.ftl" outputfile="${helium.build.dir}/temp/test_minibuild.txt">
+            <data expandProperties="yes">
+                doc: xml(${helium.build.dir}/temp/test_minibuild.xml)
+                database: xml(${database.file})
+            </data>
+        </fmpp>
+        <loadfile srcfile="${helium.build.dir}/temp/test_minibuild.txt" property="ant.coverage.summary" />
+        <echo>
+The summary of Ant code coverage:
+
+${ant.coverage.summary}</echo>
+        <fmpp sourcefile="${helium.dir}/tools/common/templates/coveragerecord.html.ftl" outputfile="${helium.build.dir}/temp/test_minibuild.html">
+            <data expandProperties="yes">
+                    doc: xml(${helium.build.dir}/temp/test_minibuild.xml)
+                    database: xml(${database.file})
+             </data>
+        </fmpp>
+    </target>
+        
+    <!-- Prepare the minibuild. -->
+    <target name="mini-build-prep" depends="prep" />
+
+    <!-- Stubbing few targets for easy testing with dragonfly ... -->
+    <target name="prep-drive" depends="build-number" />
+    <target name="dragonfly-prep-drive" />
+    <target name="do-prep-work-area" />
+    <target name="create-bom" />
+    <target name="check-env-prep" />
+    <target name="prep-copy">
+        <property name="qt.zip" value="qt-embedded-s60-commercial-src-4.5.0-garden.zip" />
+        <!-- Qt prerelease are accessible from the outside world too. -->
+        <if>
+            <not><available file="${build.drive}/${qt.zip}"/></not>
+            <then>
+                <get src="http://pepper.troll.no/s60prereleases/testpackages/garden05/${qt.zip}" dest="${build.drive}/${qt.zip}"/>
+            </then>
+        </if>
+        <mkdir dir="${qt.dir}"/>
+        <delete>
+            <fileset dir="${qt.dir}">
+                <include name="**/bld.inf"/>
+                <include name="**/*.mmp"/>
+            </fileset>
+        </delete>
+        <unzip src="${build.drive}/${qt.zip}" dest="${qt.dir}/../">
+            <mapper>
+                <regexpmapper from="^qt([^/]*)/(.*)$$" to="qt/\2"/>
+            </mapper>
+        </unzip>
+    </target>
+
+
+
+    <!-- Check that the XML data returned from Diamonds via the REST interface
+    is the same as what is sent. 
+        
+    Currently there are some differences between the formats so some edits to the
+    XML content are made before using XMLUnit to compare the content.
+    -->
+    <target name="check-diamonds">
+        <loadfile srcfile="${build.log.dir}/${build.id}_diamonds-log-start.xml" property="diamonds.log.start">
+            <filterchain>
+                <tokenfilter>
+                    <filetokenizer />
+                    <hlm:prettyprintxml />
+                </tokenfilter>
+            </filterchain>
+        </loadfile>
+        <echo>Data sent to Diamonds:
+            
+${diamonds.log.start}</echo>
+        <loadresource property="diamonds.log.start.output">
+            <url url="${diamonds.build.url}?fmt=xml" />
+            <filterchain>
+                <tokenfilter>
+                    <filetokenizer />
+                    <hlm:prettyprintxml />
+                </tokenfilter>
+            </filterchain>
+        </loadresource>
+        <echo>Data returned from Diamonds:
+            
+${diamonds.log.start.output}</echo>
+        <echo file="${helium.dir}/diamonds_build.xml">${diamonds.log.start}</echo>
+        <!--xmltask source="${helium.dir}/diamonds_build.xml" dest="${helium.dir}/diamonds_build_edit.xml">
+            
+            <cut path="/diamonds-build/tool" buffer="toolElements"/>
+            <cut path="/diamonds-build/locations" buffer="temp"/>
+        </xmltask-->
+        <!--<loadfile srcfile="${helium.dir}/diamonds_build_edit.xml" property="diamonds.log.start.edited"/>
+        <echo>Data sent massaged to match what is received:
+            
+${diamonds.log.start.edited}</echo>-->
+        <!-- TODO: make assertXmlEqual work with direct string input -->
+        <string id="control.id" value="${diamonds.log.start}" />
+        <string id="test.id" value="${diamonds.log.start.output}" />
+        <hlm:assertXmlEqual control="control.id" test="test.id" failonerror="true" />
+    </target>
+
+    <!-- Export tools under epoc32/tools -->
+    <target name="cmaker-qt" depends="cmaker-export,cmaker-what" />
+    <target name="export-tools">
+        <antcall target="cmaker-qt">
+            <param name="cmaker.config.dir" location="${qt.dir}/group/cmaker"/>
+        </antcall>
+    </target>
+
+    <target name="mini-build-cleanup">
+        <delete verbose="true" includeemptydirs="true">         
+            <fileset dir="${build.drive}/" casesensitive="false">
+                <include name="makefile" />
+                <include name="*.mk" />
+                <include name="*.make" />
+                <include name="ecloud_tmp_*/**" />
+                <include name="emake.*" />
+                <include name="epoc32/build/**" />
+                <include name="epoc32/rombuild/imaker_temp/**" />
+                <include name="epoc32/rombuild/${product.name}/**" />
+                <include name="epoc32/rom/config/*/**/foti*.*" />
+                <include name="output/**" />
+                <include name="timestart.txt" />
+                <include name="timestop.txt" />
+                <include name="epoc32/tools/qmake.exe" />
+                <include name="epoc32/tools/rcc.exe" />
+                <include name="epoc32/tools/uic.exe" />
+                <include name="epoc32/tools/moc.exe" />
+                <include name="sf/mw/qt/src/**/bld.inf" />
+                <include name="sf/mw/qt/src/**/*.mmp" />
+                <exclude name="output/build_area/localised/**" />
+            </fileset>
+        </delete>
+    </target>
+
+    <target name="mini-build-check">
+        <!-- Checking that the qmake command line have been generated correctly -->
+        <if>
+            <or>
+                <equals arg1="${build.system}" arg2="ec-helium" />
+                <equals arg1="${build.system}" arg2="sbs-ec" />
+            </or>
+            <then>
+                <au:assertFileExists file="${temp.build.dir}/run-qmake-build.mk" />
+                <loadfile property="qmake.build.makefile" srcFile="${temp.build.dir}/run-qmake-build.mk"/>
+                <au:assertTrue>
+                    <and>
+                        <contains string="${qmake.build.makefile}" substring="qmake -listgen -r src.pro" />
+                        <contains string="${qmake.build.makefile}" substring="qmake -listgen -platform symbian-abld -r examples.pro" />
+                    </and>
+                </au:assertTrue>
+            </then>
+            <else>
+                <xpathtest xmlfile="${temp.build.dir}/run-qmake-build.ant.xml">  
+                    <namespace uri="" prefix=""/>
+                    <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@value='-listgen']"/>
+                    <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@line='-r']"/>
+                    <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@line='-platform symbian-abld -r -listgen']"/>
+                </xpathtest>
+            </else>
+        </if>
+        
+        <!-- Check if prep has set some prop correctly... -->
+        <echo>'${arm.compiler.version}'</echo>
+        <au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true" />
+
+        <!-- Check if compile-main step did what expected... -->
+        <au:assertFileExists file="${canonical.sysdef.file}" />
+        <au:assertFileExists file="${qt.dir}/src/bld.inf" />
+        <au:assertFileExists file="${qt.dir}/examples/bld.inf" />
+        <au:assertFileExists file="${build.drive}/epoc32/tools/qmake.bat" />
+        <au:assertFileExists file="${build.drive}/epoc32/tools/moc.bat" />
+        <hlm:assertFileExists file="${build.log.dir}/${build.id}_build.qmake.generated.txt"/>
+        <hlm:assertFileExists file="${build.log.dir}/${build.id}_build_tools.qmake.generated.txt"/>
+        <loadfile srcFile="${build.log.dir}/${build.id}_build.qmake.generated.txt" property="qmake.generated.output"/>
+        <au:assertMatches string="${qmake.generated.output}" pattern="[^/]+/+[^/]+" />
+
+    </target>
+
+    <!-- Never fail the build. -->
+    <hlm:signalInput id="compileSignalInput" failbuild="never">
+        <hlm:notifierListRef refid="defaultSignalFailNotifier" />
+    </hlm:signalInput>
+    
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/config/qmake_zip_cfg.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : qmake_zip.cfg.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <config name="ee" abstract="true">
+        <set name="max.uncompressed.size" value="2000000000"/>
+        <set name="max.files.per.archive" value="100000"/>
+        <set name="archive.tool" value="7za"/>
+        <set name="archives.dir" value="${build.output.dir}/zips"/>
+        <set name="temp.build.dir" value="${temp.build.dir}"/>
+        <set name="build.log.dir" value="${build.log.dir}"/>
+        <set name="build.id" value="${build.id}"/>
+        <set name="sysdef.configuration" value="build"/>
+        <set name="root.dir" value="${build.drive}/"/>
+        <config>
+            <set name="name" value="${build.id}_${sysdef.configuration}.qmake"/>
+            <set name="scanners" value="default,input.file"/>
+            <set name="input.files" value="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt"/>
+            <set name="include" value="output/docs/"/>
+        </config>
+    </config>
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+set HLM_RVCT_VERSION=22_616
+..\..\..\..\helium\hlm.bat %*
+endlocal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/minibuild_compile.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_5_1.dtd">
+<SystemDefinition name="helium_minibuild_compile" schema="1.5.1">
+    <systemModel>
+        <layer name="qt_tools_layer">
+            <module name="qt_tools_module">
+                <component name="qt_tools">
+                    <unit unitID="qt" name="qt" bldFile="sf/mw/qt/group" mrp="" />
+                </component>
+            </module>
+        </layer>
+        <layer name="qt_layer">
+            <module name="qt_module">
+                <component name="qt">
+                    <unit unitID="qt_src" name="qt_src" bldFile="sf/mw/qt/src" mrp="" proFile="src.pro" qmakeArgs="-r" />
+                    <unit unitID="qt_examples" name="qt_examples" bldFile="sf/mw/qt/examples" mrp="" proFile="examples.pro" />
+                </component>
+            </module>
+        </layer>
+    </systemModel>
+    <build>
+        <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y" />
+        <!--    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/> -->
+        <target name="WINS" abldTarget="wins" description="MSVC Compiler" />
+        <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler" />
+        <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler" />
+        <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler" />
+        <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler" />
+        <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler" />
+        <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools" />
+        <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only" />
+        <target name="TOOLS2" abldTarget="tools2" description="MSVC Compiler for Tools" />
+        <target name="TOOLS2_REL" abldTarget="tools2 rel" description="MSVC Compiler for Tools Release mode only" />
+        <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler" />
+        <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler" />
+        <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler" />
+
+        <!-- Aditional Targets -->
+        <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools" />
+        <!-- Not supported -->
+        <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only" />
+        <!-- Not supported -->
+
+        <targetList name="default" description="Main Targets" target="WINSCW ARMV5" />
+        <targetList name="default_winscw" description="Main Targets" target="WINSCW" />
+        <targetList name="default_armv5" description="Main Targets" target="ARMV5" />
+        <targetList name="default_rel" description="Main Targets for rel" target="WINSCW_REL ARMV5_REL" />
+        <targetList name="default_deb" description="Main Targets for deb" target="WINSCW_DEB ARMV5_DEB" />
+        <targetList name="default_tools" description="tools Targets" target="TOOLS" />
+        <targetList name="tools" description="tools Targets" target="TOOLS" />
+        <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL" />
+        <targetList name="tools2" description="tools Targets" target="TOOLS2" />
+        <targetList name="tools2_rel" description="tools Release Targets" target="TOOLS2_REL" />
+        <targetList name="cwtools" description="cwtools Targets" target="CWTOOLS" />
+        <targetList name="cwtools_rel" description="cwtools Release Targets" target="CWTOOLS_REL" />
+
+
+        <configuration name="build_tools" description="" filter="raptor_build_tools">
+            <layerRef layerName="qt_tools_layer" />
+            <task>
+                <buildLayer command="bldmake bldfiles" unitParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld export" unitParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld library" targetList="tools2" unitParallel="N" targetParallel="N" />
+            </task>
+            <task>
+                <buildLayer command="abld target" targetList="tools2_rel" unitParallel="N" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld final" targetList="tools2_rel" unitParallel="N" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="N" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="N" targetParallel="Y" />
+            </task>
+        </configuration>
+
+        <configuration name="build" description="" filter="raptor_build">
+            <layerRef layerName="qt_layer" />
+            <task>
+                <buildLayer command="abld makefile" targetList="default_armv5" unitParallel="Y" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld resource" targetList="default_armv5" unitParallel="N" targetParallel="N" />
+            </task>
+            <task>
+                <buildLayer command="abld library" targetList="default_armv5" unitParallel="N" targetParallel="N" />
+            </task>
+            <task>
+                <buildLayer command="abld target" targetList="default_armv5" unitParallel="Y" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld final" targetList="default_armv5" unitParallel="N" targetParallel="N" />
+            </task>
+            <task>
+                <buildLayer command="abld -what build" targetList="default_armv5" unitParallel="Y" targetParallel="Y" />
+            </task>
+            <task>
+                <buildLayer command="abld -check build" targetList="default_armv5" unitParallel="Y" targetParallel="Y" />
+            </task>
+        </configuration>
+    </build>
+
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/sysdef_1_5_1.dtd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  proFile CDATA #IMPLIED
+  qmakeArgs CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
Binary file buildframework/helium/tools/common/bin/CheckTools.class has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/bin/CheckTools.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+//javac CheckTools.java -source 1.3 -target 1.3
+
+import java.io.*;
+
+public class CheckTools
+{
+    public static void main(String[] args)
+    {
+        try {
+            Runtime runtime = Runtime.getRuntime();
+            
+            Process toolProcess = runtime.exec("python -V");
+            InputStream err = toolProcess.getErrorStream();
+            if (!(toString(err).trim().startsWith("Python 2.5")))
+            {
+                System.out.println("Error: Python 2.5 not found");
+                System.out.println(err);
+            }
+            
+            toolProcess = runtime.exec("java -version");
+            err = toolProcess.getErrorStream();
+            if (!(toString(err).trim().startsWith("java version \"1.6")))
+            {
+                System.out.println("Error: Java 6 not found");
+                System.out.println(err);
+            }
+            
+//            toolProcess = runtime.exec("ant -version");
+//            err = toolProcess.getErrorStream();
+//            if (!(toString(err).trim().startsWith("Apache Ant version 1.7.0")))
+//            {
+//                System.out.println("Error: Ant 1.7.0 not found");
+//                System.out.println(err);
+//            }
+        } catch (Exception e) { System.out.println(e); }
+    }
+    
+    private static String toString(InputStream inputStream) throws IOException
+    {
+        byte[] buffer = new byte[4096];
+        OutputStream outputStream = new ByteArrayOutputStream();
+         
+        while (true) {
+            int read = inputStream.read(buffer);
+            
+            if (read == -1) {
+                break;
+            }
+         
+            outputStream.write(buffer, 0, read);
+        }
+         
+        outputStream.close();
+        inputStream.close();
+         
+        return outputStream.toString();
+    }
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/bin/call_vcvars32.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,31 @@
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+REM Set MS Visual C++ environment
+if "%MSVC_ENV_BAT%"=="" call :findmsvc vcvars32.bat
+goto :foundmsvc
+:findmsvc
+set MSVC_ENV_BAT=%~$PATH:1
+exit /b
+:foundmsvc
+if "%MSVC_ENV_BAT%"=="" set MSVC_ENV_BAT=C:\apps\msvc6\VC98\Bin\Vcvars32.bat
+if not exist "%MSVC_ENV_BAT%" set MSVC_ENV_BAT=C:\Program Files\Microsoft Visual Studio\VC98\Bin\Vcvars32.bat
+REM Do we need the following line to support MSVS.net 2003?
+REM if not exist "%MSVC_ENV_BAT%" set MSVC_ENV_BAT=C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\Vcvars32.bat
+if not exist "%MSVC_ENV_BAT%" ( echo *** WARNING: Can't find vcvars32.bat - MS Visual Studio not present. & goto MS_Set_Env_End )
+call "%MSVC_ENV_BAT%" > nul
+if not "%DEBUG%"=="" echo on
+:MS_Set_Env_End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/bin/check_home_drv.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+REM This is needed by buildbot service to connect H: drive
+net use
+net use | find  "Unavailable  H:" >arg.txt
+if %ERRORLEVEL% == 1 goto end
+echo net use %%2 %%3 > temp.bat
+set /P t_var=<arg.txt
+call temp.bat %t_var%
+rem del temp.bat
+rem del arg.txt
+set t_var=
+:end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/bin/get_gscm_info.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,106 @@
+#!/usr/bin/env perl
+
+#============================================================================ 
+#Name        : get_gscm_info.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+#
+# Script that fetch database connection information.
+#
+# e.g get_gscm_info.pl myccmdb get_db_path|get_router_address|get_engine_host myccmdb
+#
+use strict;
+BEGIN {
+    require Socket;
+    eval qq{
+        sub Socket::IPPROTO_TCP ();
+        sub Socket::TCP_NODELAY ();
+    } if  Socket->VERSION < 1.76 ;
+}
+
+use Config;
+BEGIN {
+    my $archname = $Config{archname};
+    my $gscm_lib;
+    if ($archname =~ m/Win32/)
+    {
+      $gscm_lib = "C:/apps/gscm-apps/lib"; # TODO: remove hardcoded path!
+    }
+    else
+    {
+      $gscm_lib = $ENV{'CCM_HOME'} . "/../gscm-apps/lib"; # TODO: remove hardcoded path!
+    }
+    my ($perl_version) = $Config{version} =~ /^(\d+\.\d+)/;    
+    unshift @INC, "$gscm_lib/$perl_version/$archname", "$gscm_lib/$perl_version", $gscm_lib;
+}
+
+
+use GSCM::CCM::Utils qw(locate_databases get_general_info get_ccm_home sites);
+use GSCM::Logging;
+#use Data::Dumper;
+log_config(level=>'alert');
+
+sub get_db_path
+{
+	my $db = shift;
+	foreach my $dbpath (locate_databases())
+	{
+		return $dbpath if ($dbpath =~ m/$db$/);
+	}
+	exit (-1);
+}
+
+sub get_router_address
+{
+	my %ccm_info = get_general_info(get_db_path(shift));	
+	return $ccm_info{"win32::router_address"};
+}
+
+sub get_engine_host
+{
+	my %ccm_info = get_general_info(get_db_path(shift));
+	my $archname = $Config{archname};
+	if ($archname =~ m/Win32/)
+  {
+    return $ccm_info{"win32::engine_host"};
+  }
+  else
+  {
+    return $ccm_info{"hostname"};
+  }
+}
+
+
+if (scalar(@ARGV)==2)
+{
+	eval {
+		no strict 'refs';
+		my $subroutine = shift @ARGV;
+		my $v = &$subroutine(@ARGV);
+		print $v;
+		
+	};
+	if ($@) {print "Error: error executing method $ARGV[1]:$@\n"; exit(-1)};
+}
+else
+{
+  print scalar(@ARGV);
+	print "get_gscm_info.pl dbname get_db_path|get_router_address|get_engine_host\n";
+	exit(-2);
+}
+exit(0);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/bin/getppid.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+#============================================================================ 
+#Name        : getppid.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+use Win32;
+sub _getppid() {
+    
+    my $ppid;
+
+    if ($^O =~ /^MSWin/) {
+        my $pid = $$;
+        my $machine = "\\\\.";
+        
+        require Win32::OLE;
+        require Win32::OLE::Variant;
+    
+        # WMI Win32_Process class
+        my $class =
+"winmgmts:{impersonationLevel=impersonate}$machine\\Root\\cimv2";
+        if (my $wmi = Win32::OLE-> GetObject($class)) {
+            if(my $proc=$wmi-> Get(qq{Win32_Process.Handle="$pid"})) {
+                $ppid = $proc-> {ParentProcessId} if
+($proc-> {ParentProcessId}!=0);
+            }
+        }
+    }
+    else {
+        $ppid = getppid();
+    }
+    
+    return $ppid;
+}
+my $name = shift @ARGV or "";
+print $name._getppid()."\n";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/bsh/unique_filename.bsh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+import java.io.File;
+String counter = project.getProperty(".unique.counter");
+int count;
+if (counter == null){
+	count = 0;
+}else{
+	count = Integer.valueOf(counter) + 1;
+}
+project.setProperty(".unique.counter", ""+count);
+targetname = (String.format("%016d",count) + "_"+new File(source).getName());
+self.addMappedName(targetname);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/common.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,501 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : common.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="common" xmlns:hlm="http://www.nokia.com/helium" xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">
+    <description>
+        Common targets for all helium tools.
+    </description>
+    
+    <import file="logging.ant.xml"/>
+    
+    <!--=======================================================================
+    Preset definitions -->
+    <presetdef name="preset.exec">
+        <exec>
+            <!-- Note the extra ':' required at the start of the value. This
+            is required for the Symbian tools to match the env variable. -->
+            <env key="ARMV5VER" value=":${arm.compiler.version}"/>
+
+            <!-- Tools configuration -->
+            <env key="LOGONSERVER" value="${logon.server}"/>
+        </exec>
+    </presetdef>
+    
+    
+    <presetdef name="preset.mail">
+        <mail from="${email.from}" messagemimetype="text/html" mailhost="${email.smtp.server}" failonerror="false"/>
+    </presetdef>
+    
+    
+    <!-- Outputs diagnostics information for the Helium configuration.
+    
+    This contains:
+    * The current configuration of properties.
+    * The Ant diagnostics information.
+    -->
+    <target name="diagnostics" description="Print diagnostics about Helium">
+        <echo>
+-------- Helium diagnostics report --------
+Helium version ${helium.version}
+            
+-------------------------------------------
+ Helium configuration
+-------------------------------------------
+        </echo>
+        <runtarget target="config"/>
+        <diagnostics/>
+        <hlm:database/>
+    </target>
+    
+    <!-- Sets the properties that are dependent on build.number -property. 
+    
+    The properties are:
+    * build.version
+    * build.id
+    * prep.build.dir
+    * publish.dir
+    * publish.release.dir
+     -->
+    <target name="build-number">
+        <fail unless="build.number" message="build.number property not defined" />
+        <property name="build.version" value="${core.build.version}.${build.number}"/>
+        <property name="build.id" value="${build.name}_${build.version}"/>
+        <property name="prep.build.dir" location="${prep.root.dir}/${build.id}"/>
+        <property name="publish.dir" location="${publish.root.dir}/${build.name}/builds/${core.build.version}/${build.id}"/>
+        <property name="publish.release.dir" location="${publish.root.dir}/${build.name}/releases/${core.build.version}/${build.id}"/>
+    </target>
+
+    <!-- Variable set to configuration tool. 
+        Currently supported configuration tool arguments are
+        argument        :    ant variable name
+        
+        -master_conf    :    master_conf
+        -confml         :    confml
+        -impl            :    impl
+        -iby            :    iby
+        -ignore_errors    :    keepgoing(true - uses -ignore_errors, otherwise not, setting 
+                            true generates cenrep incase of errors, and signals has to be configured to stop the build
+                            in case of errors).
+    -->    
+    <hlm:argSet id="cnftool.refid">
+        <hlm:arg name="path" value="${build.drive}/s60/tools/toolsextensions/configurationtool" />
+        <hlm:arg name="master_conf" value="s60.confml" />
+        <hlm:arg name="confml" value="\epoc32\rom\config\confml_data\s60" />
+        <hlm:arg name="impl" value="\epoc32\rom\config\confml_data\s60" />
+        <hlm:arg name="iby" value="\epoc32\rom\include\" />
+        <hlm:arg name="keepgoing" value="false" />
+    </hlm:argSet>
+
+    <!-- Target to run configtool. See cnftool.refid for config tool parameters-->
+    <target name="configtool" description="target to run configtool, refid is for mcl, overridden by changing cnftool.refid">
+        <hlm:toolMacro name="configuration">
+            <hlm:toolvarset refid="cnftool.refid"/>
+        </hlm:toolMacro>
+    </target>
+
+    <!-- Finds the build manager's (current user) email address from their username. -->
+    <target name="lookup-email" if="email.ldap.server">
+        <if>
+            <not>
+                <isset property="email.from"/>
+            </not>
+            <then>
+                <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${env.USERNAME}" outputproperty="email.from" key="mail"/>
+            </then>
+        </if>
+    </target>
+    
+    <!-- To authenticate the noe password (read from .netrc file) for ${env.USERNAME}. -->
+    <target name="authenticate-user" if="authenticate.noe.user">
+        <runtarget target="noe-password"/>
+
+        <hlm:ldapauthenticate   url="${email.ldap.server}" 
+                                rootdn="${email.ldap.rootdn}" 
+                                searchdn="${ldap.organization.unit.rootdn}, ${ldap.people.rootdn}" 
+                                filter="uid=${env.USERNAME}" 
+                                outputproperty="is.authentication.sucess" 
+                                key="employeeNumber"
+                                password="${noe.password}"
+                                />
+        <if>
+            <istrue value="${is.authentication.sucess}" />
+            <then>
+                <echo>noe authentication for user ${env.USERNAME} is success.</echo>              
+            </then>
+            <else>
+                <fail message="noe authentication for user ${env.USERNAME} is failed."/>
+            </else>
+        </if>
+    </target>
+    
+    <!-- Utility target to test mail sending from Helium. -->
+    <target name="check-mail" depends="lookup-email">
+        <preset.mail tolist="${email.from}" subject="mail-test"/>
+    </target>
+
+    <!-- A simple test target that prints a simple message -->
+    <target name="hello">
+        <echo message="Hello!"/>
+        <if>
+            <isset property="build.number"/>
+            <then>
+                <echo message="Ant libs found OK"/>
+            </then>
+        </if>
+    </target>
+    
+    
+    <!-- A simple test target that prints a simple message and is dependant upon another target to show how ANT works-->
+    <target name="hi" depends="hello"/>
+    
+    
+    <!-- A simple test target that prints a simple message -->
+    <target name="fail">
+        <fail message="Test build failure."/>
+    </target>
+    
+    
+    <!-- Print out the build properties -->
+    <target name="config" description="Print out the build properties">
+        <echoproperties>
+            <propertyset negate="true">
+                <propertyref prefix="java."/>
+                <propertyref prefix="sun."/>
+                <propertyref prefix="awt."/>
+                <propertyset refid="password.list.ref"/>
+            </propertyset>
+        </echoproperties>
+    </target>
+
+    <!-- Prints out target dependencies.
+    
+    A <tt>target</tt> property should be defined on the command line to specify which target's dependencies to analyse.
+
+    Example: <tt>hlm -Dtarget=compile-main deps</tt>
+    -->
+    <target name="deps">
+        <fail unless="target" message="target property not defined" />
+        <hlm:dependencies target="${target}" format="nested"/>
+    </target>
+    
+    
+    <!-- Displays target dependencies in a text box. 
+    
+    A <tt>target</tt> property should be defined on the command line to specify which target's dependencies to analyse. -->
+    <target name="execlist">
+        <fail unless="target" message="target property not defined" />
+        <record name="execlist.txt" action="start" emacsmode="true"/>
+        <hlm:dependencies target="${target}" format="executable"/>
+        <record name="execlist.txt" action="stop"/>
+        <exec executable="notepad.exe">
+            <arg value="execlist.txt"/>
+        </exec>
+        <delete file="execlist.txt"/>
+    </target>
+    
+    
+    <!-- Prints out Helium help dialog -->
+    <target name="help">
+        <if>
+            <not>
+                <available file="${database.file}"/>
+            </not>
+            <then>
+                <antcall target="database"/>
+            </then>
+        </if>
+        <if>
+            <isset property="help.target"/>
+            <then>
+                <fmpp sourcefile="${helium.dir}/tools/common/templates/help_text.txt.ftl" outputfile="build/help_text.txt" quiet="true">
+                    <data expandProperties="yes">
+                        xml: xml(${database.file})
+                        helpTarget: ${help.target}
+                    </data>
+                </fmpp>
+                <loadfile srcfile="build/help_text.txt" property="help.text"/>
+                <echo>${help.text}</echo>                
+            </then>
+            <else>
+                <echo>
+Usage:
+hlm [target] [-D&lt;property>=&lt;value>] [-f &lt;ant_build_file>] [-h] [-p -v]
+
+[target]                        Run Ant target
+[-D&lt;property>=&lt;value>]          Set an Ant property
+[-f &lt;ant_build_file>]           Use another Ant build file
+[-h]                            Print Ant help text
+[-p -v]                         List all Ant targets
+
+Variable properties for helium:
+-Dsysdef.configuration=default set build configuration, default value is 'default'
+-Dbuild.system=ebs             set build system, default value is 'ebs'
+                                  - possible values are 'ebs' and 'ec'
+
+Usage examples:
+hlm                            build the default build target
+hlm -Dbuild.system=ec-helium   use electric cloud build system
+                </echo>                
+            </else>
+        </if>
+    </target>
+        
+    
+    <!-- Automates deletion of old work areas.
+    
+    <tt>prep.root.dir</tt> is the path where work areas are typically stored. This command
+    scans that directory for sub-directories that match a pattern based on the build name.
+    A dialog is displayed listing the directories as checkboxes. Check each build area 
+    directory to delete it.
+    -->
+    <target name="clean-pc">
+        <dirset id="prep.build.dirs" dir="${prep.root.dir}">
+            <include name="*_*"/>
+            <include name="subcon_*_*"/>
+        </dirset>
+        <pathconvert pathsep="," property="prep.build.dirs.path">
+            <dirset refid="prep.build.dirs"/>
+        </pathconvert>
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/clean_pc.ant.ftl"
+              outputFile="${cache.dir}/clean_pc.ant.xml">
+            <data expandProperties="yes">
+                prepRootDir: ${prep.root.dir}
+                buildAreaDirs: [${prep.build.dirs.path}]
+            </data>
+        </fmpp>
+        <ant antfile="${cache.dir}/clean_pc.ant.xml"/>
+        <delete file="${cache.dir}/clean_pc.ant.xml"/>
+    </target>
+    
+    
+    <!-- Displays the current version of Helium -->
+    <target name="version" description="Displays the current version of Helium">
+        <echo message="Helium version: ${helium.version}" />
+    </target>
+        
+    
+    <!-- Creates a database of the current configuration. -->
+    <target name="create-data-model-db">        
+        <echoproperties format="text" destfile="${build.cache.dir}/database.txt">        
+            <propertyset negate="true">
+                <propertyref prefix="ant."/>
+                <propertyref prefix="os."/>
+                <propertyref prefix="file."/>
+                <propertyref prefix="java."/>
+                <propertyref prefix="sun."/>
+                <propertyref prefix="awt."/>
+                <propertyref prefix="env."/>
+                <propertyref prefix="user."/>
+                <propertyref prefix="line."/>
+                <propertyref prefix="path."/>
+                <propertyref prefix="python."/>
+                <propertyref prefix="TODAY"/>
+                <propertyref prefix="DSTAMP"/>
+                <propertyref prefix="TSTAMP"/>
+                <propertyref prefix="sig"/>
+                <propertyref name="basedir"/>
+                <propertyset refid="password.list.ref"/>
+            </propertyset>
+        </echoproperties>
+    </target>
+    
+    <!--Macro to Assert Ant configuration against a Helium data model.-->
+    <macrodef name="checkDataModelMacro" uri="http://www.nokia.com/helium">
+        <attribute name="datamodel"/>
+        <attribute name="config"/>
+        <attribute name="assert" default="false"/>
+        <sequential>
+            <hlm:python>
+import logging
+import ant
+import configuration
+import configuration_model
+
+datamodel_file = ant.get_property(r'@{datamodel}')
+config_file = ant.get_property(r'@{config}')
+model = configuration_model.DataModel(str(datamodel_file))
+db_file = open(str(config_file), 'r')
+config = configuration.PropertiesConfiguration(db_file)
+
+items = model.validate_config(config)
+
+logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
+for item in items:
+    item.log(logging.getLogger())
+    
+assert_attr = ant.get_property(r'@{assert}')
+if assert_attr != None and str(assert_attr) == 'true':
+    for item in items:
+        if isinstance(item, configuration_model.MissingFromDataModelItem):
+            raise Exception(str(item))
+            </hlm:python>
+        </sequential>
+    </macrodef>
+        
+        
+    <!-- Checks the Ant configuration against a Helium data model. -->
+    <target name="check" depends="create-data-model-db">
+        <xslt in="${data.model.file}" out="${data.model.parsed}" style="${data.model.xsl}"/>
+        <hlm:checkDataModelMacro datamodel="${data.model.parsed}" config="${build.cache.dir}/database.txt"/>
+    </target>
+    
+    <!--Assert Ant configuration against a Helium data model.-->
+    <target name="assert-datamodel-correct" depends="create-data-model-db">
+        <xslt in="${data.model.file}" out="${data.model.parsed}" style="${data.model.xsl}"/>
+        <hlm:checkDataModelMacro datamodel="${data.model.parsed}" config="${build.cache.dir}/database.txt" assert="true"/>
+    </target>
+    
+    
+    <!-- Generates an Ant XML database file.
+        
+    This lists all the targets and information about them. -->
+    <target name="database">
+        <!-- Projects with no targets or non project files -->
+        <fileset id="database.extra.files" dir="${helium.dir}">
+            <include name="tools/**/*.antlib.xml"/>
+            <include name="tools/**/*.ant.xml"/>
+            <include name="extensions/nokia/tools/**/*.antlib.xml"/>
+            <include name="extensions/nokia/tools/**/*.ant.xml"/>
+            <include name="extensions/nokia/*.ant.xml"/>
+            <include name="config/signaling_config_default.ant.xml"/>
+        </fileset>
+        
+        <mkdir dir="${helium.build.dir}"/>
+        <property name="home.files.only" value="false"/>
+        <hlm:database output="${database.file}" refid="database.extra.files" homeFilesOnly="${home.files.only}"/>
+    </target>
+    
+    
+    <!-- Looks for lint-style issues with the Ant files in Helium, using the antlint task. -->
+    <target name="antlint" depends="check">
+        <delete dir="${helium.build.dir}/jep"/>
+        <delete dir="${helium.build.dir}/python"/>
+        <delete dir="${helium.build.dir}/beanshell"/>
+        <delete file="${helium.build.dir}/test_jython.xml"/>
+        <hlm:antlint configfile="${helium.dir}/config/antlint_config.xml">
+            <fileset id="antlint.files" dir="${helium.dir}">
+                <include name="*.ant.xml"/>
+                <include name="tools/**/*.ant.xml"/>
+                <include name="tools/**/build.xml"/>
+                <include name="tools/**/*.antlib.xml"/>
+                <include name="config/**/*.ant.xml"/>
+                <include name="config/**/build.xml"/>
+                <include name="config/**/*.antlib.xml"/>
+                <include name="external/helium-antlib/**/*.ant.xml"/>
+                <include name="external/helium-antlib/**/build.xml"/>
+                <include name="external/helium-antlib/**/*.antlib.xml"/>
+                <include name="extensions/nokia/**/build.xml"/>
+                <include name="extensions/nokia/**/*.antlib.xml"/>
+                <include name="extensions/nokia/**/*.ant.xml"/>
+            </fileset>
+        </hlm:antlint>
+        
+        <fileset id="jep.files" dir="${helium.build.dir}">
+            <include name="jep/**/*.py"/>
+            <include name="python/**/*.py"/>
+        </fileset>
+        <antcall target="pylint" inheritRefs="true">
+            <reference refid="jep.files" torefid="python.files" />
+        </antcall>
+        <cs:checkstyle config="config/java_checkstyle_config.xml">
+            <fileset dir="${helium.build.dir}/beanshell" includes="**/*.java"/>
+            <formatter type="plain"/>
+        </cs:checkstyle>
+        
+        <for param="file">
+            <path>
+                <fileset dir="${helium.dir}">
+                    <include name="**/*.ftl"/>
+                    <include name="**/*.rst"/>
+                    <exclude name="**/*.mk.ftl"/>
+                    <exclude name="build/**/*"/>
+                </fileset>
+            </path>
+            <sequential>
+                <loadfile srcfile="@{file}" property="tabs.in.ftl">
+                    <filterchain>
+                        <linecontainsregexp>
+                            <regexp pattern="\t"/>
+                        </linecontainsregexp>
+                    </filterchain>
+                </loadfile>
+                <fail if="tabs.in.ftl" message="@{file} has tabs" />
+            </sequential>
+        </for>
+    </target>
+    
+    
+    <!-- This target can be use to clean up after a build finished or failed.
+    
+    This contains:
+    * Unsubst build drive if the build finished.
+    * Can be used to do other cleanup stuff too.
+    -->
+    <target name="cleanup-all">
+        <!-- unsubst build drive after build finished if the property "unsubst.after.build" defined as "yes" -->
+        <if>
+            <and>
+                <isset property="unsubst.after.build"/>
+                <istrue value="${unsubst.after.build}" />
+            </and>
+            <then>
+                <echo> Removing build drive: ${build.drive} </echo>
+                <hlm:unsubst drive="${build.drive}"/>
+            </then>
+        </if>                
+    </target>
+    
+    
+    <!-- validate only requires properties at startup -->
+    <target name="validate-at-startup" depends="create-data-model-db">
+        <hlm:python>
+import logging
+import configuration
+import configuration_model
+
+model = configuration_model.DataModel(r'${data.model.file}')
+db_file = open(r'${build.cache.dir}/database.txt', 'r')
+config = configuration.PropertiesConfiguration(db_file)
+
+items = model.validate_config_at_startup(config)
+            
+_checks_logger = logging.getLogger('config_check')
+_handler = logging.StreamHandler()
+_handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
+_checks_logger.addHandler(_handler)
+_checks_logger.setLevel(logging.INFO)
+for item in items:
+    item.log(_checks_logger)
+        </hlm:python>
+    </target>
+    
+    
+    <!-- Macro test target. -->
+    <target name="macro-test">
+        <hlm:fooMacro/>
+    </target>
+
+</project>
+    
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/common.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,807 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : common.antlib.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    
+    
+    <!-- Macro to execute bldmake command. To be removed if not used. -->
+    <macrodef name="bldmakeBldfilesMacro" uri="http://www.nokia.com/helium">
+        <attribute name="dir"/>
+        <sequential>
+            <exec executable="${build.drive}/epoc32/tools/bldmake.bat" dir="@{dir}" failonerror="${failonerror}">
+                <arg value="bldfiles"/>
+                <arg value="-k"/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+
+    <!-- Macro to execute abld command. Once used in rombuild.ant.xml. -->
+    <macrodef name="abldMacro" uri="http://www.nokia.com/helium">
+        <attribute name="dir"/>
+        <attribute name="command"/>
+        <attribute name="platform"/>
+        <sequential>
+            <exec executable="@{dir}/abld.bat" dir="@{dir}" failonerror="${failonerror}">
+                <arg value="@{command}"/>
+                <arg value="@{platform}"/>
+                <arg value="-k"/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+    <!--
+        This macro generate a file that contains a list of path from a path structure:
+        <pre>
+        <hlm:pathToFileListMacro file="output.lst">
+            <path>
+                <pathelement path="${helium.dir}"/>
+            </path>
+        </hlm:pathToFileListMacro> 
+        </pre>
+    -->
+    <scriptdef name="pathToFileListMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <element name="path" type="path"/>
+        <![CDATA[
+    import java.io.FileWriter;
+    FileWriter out = new FileWriter(attributes.get("file"));
+    paths = elements.get("path");
+    for (int i = 0 ; i < paths.size() ; i++) {
+        String[] files = paths.get(i).list();
+        for (int l = 0; l < files.length ; l++) {
+            out.write(files[l] + "\n");
+        }
+    }
+out.close();
+]]>   
+    </scriptdef>
+
+    
+   
+    <!-- This Macro is a wrapper to command line tool 
+        Currently supported command line tools are
+        configuration tool and
+        sbs tool
+        Usage: 
+            name - name of the tool:
+            toolvarset - reference id for variables to be passed to the tool
+        <pre>
+        <hlm:toolMacro name="configuration">
+            <hlm:toolvarset refid="cnftool.conf.50"/>
+        </hlm:toolMacro>
+        </pre>
+    -->
+    <scriptdef name="toolMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <element name="toolvarset" classname="com.nokia.ant.types.VariableSet"/>
+        <attribute name="name"/>
+<![CDATA[
+import com.nokia.ant.util.ToolsProcess;
+import com.nokia.tools.*;
+import com.nokia.ant.types.VariableSet;
+import org.apache.tools.ant.types.Reference;
+    Reference ref;
+    java.lang.String toolName = attributes.get("name");
+    confTool =  ToolsProcess.getTool(toolName);
+    varSets = elements.get("toolvarset");
+    for (i = 0; i < varSets.size(); ++i) {
+        try {
+            varSet = (VariableSet)varSets.get(i);
+            if (varSet.isReference()) {
+                varSet = varSet.getRefid().getReferencedObject(project);
+            }
+            confTool.execute(varSet,project);
+        } catch (Exception e) {
+            self.log("Error: " + e);
+            //self.log("Tool Argument Validation failure");
+            throw e;
+        }
+  }
+]]>
+    </scriptdef>
+
+    <!-- This task allow to dump the content of a text file to the shell. -->
+    <scriptdef name="echoFileMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <![CDATA[        
+        //Open the file for reading
+         try {
+            java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader(attributes.get("file")));
+            while ((thisLine = in.readLine()) != null) { // while loop begins here
+                 self.log(thisLine);
+            } // end while 
+        } catch (java.io.IOException e) {
+            self.log("Error: " + e);
+            throw e;
+        }        
+        ]]>
+    </scriptdef>
+    
+    <!-- This task create the herder information in the symbian log file -->
+    <scriptdef name="symbianLogHeaderMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="config"/>
+        <attribute name="command"/>
+        <attribute name="dir"/>
+import log2xml
+log2xml.symbian_log_header(self, attributes.get('config'), attributes.get('command'), attributes.get('dir'))
+    </scriptdef>
+
+    <!-- This task create the footer information in the symbian log file -->
+    <scriptdef name="symbianLogFooterMacro" language="jython" uri="http://www.nokia.com/helium">
+import log2xml
+log2xml.symbian_log_footer(self)
+    </scriptdef>
+
+
+    <!-- Macro to record content to a separate log file without recording in the main log. -->
+    <macrodef name="recordStartMacro" uri="http://www.nokia.com/helium">
+        <attribute name="name"/>
+        <attribute name="emacsmode" default="false"/>
+        <sequential>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="stop" append="true"/>
+                </then>
+            </if>
+            <if>
+                <available file="${build.log.dir}" type="dir"/>
+                <then>
+                    <record name="${build.log.dir}/@{name}" action="start" append="true" emacsmode="@{emacsmode}"/>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+
+    <!-- Macro to stop recording content to a separate log file without recording in the main log. -->
+    <macrodef name="recordStopMacro" uri="http://www.nokia.com/helium">
+        <attribute name="name"/>
+        <sequential>
+            <if>
+                <available file="${build.log.dir}/@{name}"/>
+                <then>
+                    <record name="${build.log.dir}/@{name}" action="stop" append="true"/>
+                </then>
+            </if>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="start" append="true"/>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+    
+    <!--Macro to stop recording to the main log file (if present) and record to
+        a separate log file that is filtered after logging is stopped. -->
+    <macrodef name="filterRecordStartMacro" uri="http://www.nokia.com/helium">
+        <sequential>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="stop" append="true"/>
+                </then>
+            </if>
+            <echo>Start of filtering ${build.log} for passwords</echo>
+            <record name="${build.cache.log.dir}/temp_ant_build.log" action="start" loglevel="info"/>
+        </sequential>
+    </macrodef>
+    
+
+    <!--Macro to stop recording the seperate filtered log file, filter the passwords
+    and start recording in main log file -->
+    <macrodef name="filterRecordStopMacro" uri="http://www.nokia.com/helium">
+        <attribute name="pattern"/>
+        <attribute name="log" default="${build.log}"/>
+        <attribute name="append" default="true"/>
+        <sequential>
+            <record name="${build.cache.log.dir}/temp_ant_build.log" action="stop"/>                    
+            <concat destfile="@{log}" append="@{append}">
+                <filelist dir="${build.cache.log.dir}" files="temp_ant_build.log"/>                        
+                <filterchain>
+                    <tokenfilter>
+                        <replaceregex pattern="@{pattern}" replace="****" flags="gi"/>
+                    </tokenfilter>
+                </filterchain>                        
+            </concat>
+            <delete file="${build.cache.log.dir}/temp_ant_build.log" failonerror="false"/>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="start" append="true"/>
+                </then>
+            </if>
+            <echo>End of filtering @{log} for passwords</echo>
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- A generic assert macro similar to AntUnit "assertTrue". -->
+    <macrodef name="assert" uri="http://www.nokia.com/helium">
+        <attribute name="message" default="Value is not true."/>
+        <element name="condition" implicit="yes"/>
+        <sequential>
+            <if>
+                <isset property="hlm.enable.asserts"/>
+                <then>
+                    <au:assertTrue message="@{message}">
+                        <condition/>
+                    </au:assertTrue>
+                </then>
+                <else>
+                    <trycatch property="assert.try">
+                        <try>
+                            <au:assertTrue message="@{message}">
+                                <condition/>
+                            </au:assertTrue>
+                        </try>
+                        <catch>
+                            <echo message="Warning: @{message}"/>
+                            <hlm:hlmassertmessage assertName="hlm:assert" message="Warning: @{message}"/>
+                        </catch>
+                    </trycatch>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- A generic assert macro similar to AntUnit "assertFileExists". -->
+    <macrodef name="assertFileExists" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <attribute name="message" default="@{file} does not exists."/>
+        <sequential>
+            <if>
+                <isset property="hlm.enable.asserts"/>
+                <then>
+                    <au:assertFileExists file="@{file}" message="Warning: @{message}"/>
+                </then>
+                <else>
+                    <trycatch property="assert.try">
+                        <try>
+                            <au:assertFileExists file="@{file}" message="Warning: @{message}"/>                                
+                        </try>
+                        <catch>
+                            <echo message="Warning: @{message}"/>
+                            <hlm:hlmassertmessage assertName="hlm:assertFileExists" message="Warning: @{message}"/>
+                        </catch>
+                    </trycatch>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <!-- A generic assert macro similar to AntUnit "assertPropertySet". -->
+    <macrodef name="assertPropertySet" uri="http://www.nokia.com/helium">
+        <attribute name="property"/>
+        <attribute name="message" default="@{property} is not set."/>
+        <sequential>
+            <if>
+                <isset property="hlm.enable.asserts"/>
+                <then>
+                    <au:assertPropertySet name="@{property}" message="@{message}"/>
+                </then>
+                <else>
+                    <trycatch property="assert.try">
+                        <try>
+                            <au:assertPropertySet name="@{property}" message="@{message}"/>
+                        </try>
+                        <catch>
+                            <echo message="Warning: @{message}"/>
+                            <hlm:hlmassertmessage assertName="hlm:assertPropertySet" message="Warning: @{message}"/>
+                        </catch>
+                    </trycatch>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+
+
+    
+    <!-- Script definition to collect target dependencies -->
+    <scriptdef name="dependencies" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="target"/>
+        <attribute name="format"/>
+parsedTargets = []
+targetList = []
+
+def collectTargetDependencies(targetName, indent):    
+    targetObject = project.getTargets().get(targetName)
+    if targetObject is None :
+        print  "Target '" + targetName + "' not found."   
+    else :
+        dependenciesEnum = targetObject.getDependencies()
+        while dependenciesEnum.hasMoreElements():
+            dependency = dependenciesEnum.nextElement()
+            if dependency not in parsedTargets:
+                collectTargetDependencies(dependency, indent + 1)
+                parsedTargets.append(dependency)
+                targetList.append((dependency, indent))
+
+target = str(attributes.get('target'))
+
+collectTargetDependencies(target, 1)
+targetList.append((target, 0))
+    
+format = str(attributes.get('format'))
+
+if format == 'nested':    
+    for target, indent in targetList:        
+        indentString = ''.join(['   ' for x in range(indent)])
+        print indentString + str(target)
+elif format == 'executable':
+    print "Top level targets:\n"
+    print ''.join([str(target) + ' ' for target, indent in targetList[:-1] if indent == 1])
+    print "\n\nAll targets in sequence:\n"
+    print ''.join([str(target) + ' ' for target, indent in targetList[:-1]])
+    </scriptdef>
+    
+    
+    <!-- This new task allows to save a reference to a file. -->
+    <scriptdef name="referenceToFileMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="refid"/>
+        <attribute name="output"/>
+    <![CDATA[
+from java.io import FileWriter
+
+refid = str(attributes.get("refid"))
+output = str(attributes.get("output"))
+
+if refid == None:
+    raise Exception("'refid' attribute must be defined!")    
+if output == None:
+    raise Exception("'output' attribute must be defined!")
+    
+self.log("Creating %s using %s" % (output, refid))
+
+reference = project.getReference(refid)
+if reference == None:
+    raise Exception("Unknown reference '%s'" % refid)
+output = FileWriter(output)
+i = reference.iterator()
+while i.hasNext():
+    path = i.next().toString()
+    self.log(path)
+    output.write(path + "\n")
+output.close()
+    ]]></scriptdef>
+    
+    <!-- Reads password from .netrc file for a specific type of service. -->
+    <scriptdef name="netrcPasswordMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output-prop"/>
+        <attribute name="result-prop"/>
+        <attribute name="type"/>
+        <![CDATA[
+import netrc
+import os
+result = "0"
+try:
+    netrc_file = netrc.netrc()
+    self.log("Type: %s" % str(attributes.get("type")))
+    netrc_info = netrc_file.authenticators(str(attributes.get("type")))
+    if netrc_info == None:
+        raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
+    (n_username, n_account, n_password) = netrc_info
+    if attributes.get('output-prop') != None:
+        self.log("Output: %s" % attributes.get('output-prop'))
+        project.setProperty(str(attributes.get('output-prop')), str(n_password))
+except Exception, e:
+    result = "-1"
+    print "ERROR: %s" % e
+if attributes.get('result-prop') != None:
+    self.log("Result: %s" % attributes.get('result-prop'))
+    project.setProperty(str(attributes.get('result-prop')), str(result))
+    self.log("%s: %s" % (attributes.get('result-prop'), project.getProperty(str(attributes.get('result-prop')))))
+        ]]>
+    </scriptdef>
+
+    <!-- Reads user name from .netrc file for a specific type of service. -->
+    <scriptdef name="netrcUsernameMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output-prop"/>
+        <attribute name="result-prop"/>
+        <attribute name="type"/>
+        <![CDATA[
+import netrc
+import os
+result = "0"
+try:
+    netrc_file = netrc.netrc()
+    self.log("Type: %s" % str(attributes.get("type")))
+    netrc_info = netrc_file.authenticators(str(attributes.get("type")))
+    if netrc_info == None:
+        raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
+    (n_username, n_account, n_password) = netrc_info
+    if attributes.get('output-prop') != None:
+        self.log("Output: %s" % attributes.get('output-prop'))
+        project.setProperty(str(attributes.get('output-prop')), str(n_username))
+except Exception, e:
+    result = "-1"
+    print "ERROR: %s" % e
+if attributes.get('result-prop') != None:
+
+    self.log("Result: %s" % attributes.get('result-prop'))
+    project.setProperty(str(attributes.get('result-prop')), str(result))
+    self.log("%s: %s" % (attributes.get('result-prop'), project.getProperty(str(attributes.get('result-prop')))))
+        ]]>
+    </scriptdef>
+     
+    <!-- Check availability of synergy. -->   
+    <scriptdef  name="ccmAvailableMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="resultproperty"/>
+        <![CDATA[
+import nokia.nokiaccm
+import logging
+import ccm.extra
+
+logging.basicConfig(level=logging.INFO)
+
+session = None
+result = "0"
+cache = None
+if project.getProperty("ccm.cache.xml")is not None:
+    cache = str(project.getProperty("ccm.cache.xml"))
+try:
+    database = project.getProperty('ccm.database')
+    
+    if project.getProperty('ccm.user.login') == None :
+        raise Exception("'ccm.user.login' property is not defined")
+        
+    username = project.getProperty('ccm.user.login')
+    
+    if project.getProperty('ccm.user.password') == None :
+        raise Exception("'ccm.user.password' property is not defined")
+        
+    password = project.getProperty('ccm.user.password')
+    
+    
+    engine = project.getProperty('ccm.engine.host')
+    dbpath = project.getProperty('ccm.database.path')
+    provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+    if database != None:
+        session = provider.get(username, password, database=database, reuse=False)
+    else:
+        session = provider.get(username, password, engine, dbpath, reuse=False)
+    del(session)
+except Exception, e:
+    print "ERROR: %s" % e
+    if str(e).find("access denied") != -1:
+        result = "-2"
+    else:
+        result = "-1"
+self.log("Result: %s" % attributes.get('resultproperty'))
+project.setProperty(str(attributes.get('resultproperty')), str(result))
+        ]]>
+     </scriptdef>
+
+    <!-- Extract logs from text file and process error/warnings/components name etc
+    into xml file.-->
+    <scriptdef name="logextract" language="jython"  uri="http://www.nokia.com/helium">
+        <attribute name="file" />
+        <attribute name="outputfile" />
+        <element name="fileset" type="fileset"/>
+        <element name="logfilterset" classname="com.nokia.ant.types.LogFilterSet"/>
+        <![CDATA[
+import os.path
+import log2xml
+import java.io
+
+def convertFile(inputfile, outputfile, config):
+    if (outputfile != None):
+        print "output file not none"
+        print "output file: %s" % outputfile
+        targetfile = str(outputfile)
+    else:
+        #print "output file: %s" % outputfile
+        targetfile = "%s.xml" % inputfile
+        #print "targetFile %s" % targetfile
+    if not os.path.exists(targetfile) or \
+       (os.path.exists(targetfile) and os.path.getmtime(inputfile) > os.path.getmtime(targetfile)):
+        self.getProject().log("Converting %s..." % inputfile)
+        log2xml.convert(inputfile, targetfile, False, config)
+    else:
+        self.getProject().log("Extracted log is uptodate: %s" % inputfile)
+        
+config = log2xml.DEFAULT_CONFIGURATION
+logfilterset = elements.get("logfilterset")
+if logfilterset != None and logfilterset.size() > 0:
+    # if any logfilterset are dfined then
+    # it override the default configuration
+    config = {}
+    for filtersetid in range(logfilterset.size()):
+        filterset = logfilterset.get(filtersetid)
+        if filterset.isReference():
+            filterset = filterset.getRefid().getReferencedObject(project)
+        filters = filterset.getFilters()
+        for filterid in range(filters.size()):
+            if not filters.get(filterid).getCategory() in config:
+                config[filters.get(filterid).getCategory()] = []
+            config[filters.get(filterid).getCategory()].append(str(filters.get(filterid).getRegex()))
+
+fileset = elements.get("fileset")
+outputfile = attributes.get("outputfile")
+if fileset != None and fileset.size() > 0:
+    for filesetid in range(fileset.size()):
+        dirscanner = fileset.get(filesetid).getDirectoryScanner(project)
+        for filename in dirscanner.getIncludedFiles():
+            inputfile = str(java.io.File(dirscanner.getBasedir(), str(filename)).getAbsolutePath())
+            convertFile(inputfile, outputfile, config)
+elif attributes.get("file") != None:
+    inputfile = str(java.io.File(str(attributes.get("file"))).getAbsolutePath())
+    convertFile(inputfile, outputfile, config)
+else:
+    self.log("No input specified.")
+        ]]>
+    </scriptdef>
+    
+    
+    <!--Macro to stop recording to the main log file (if present) and record to
+        a separate log file into a temporary location (doesn't need the build aread to work). -->
+    <macrodef name="tempRecordStartMacro" uri="http://www.nokia.com/helium">
+        <attribute name="name"/>
+        <sequential>
+            <mkdir dir="${build.cache.log.dir}"/>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="stop" append="true"/>
+                </then>
+            </if>
+            <record name="${build.cache.log.dir}/@{name}" action="start" loglevel="verbose"/>
+        </sequential>
+    </macrodef>
+
+
+    <!--Macro to restart  the main log file (if present) and stop recording to
+        a separate log file into a temporary location the file is next xml summarized 
+        and potentially copied to the build area (if exists). Else those files will get copied during the 
+        build area preparation. -->
+    <macrodef name="tempRecordStopMacro" uri="http://www.nokia.com/helium">
+        <attribute name="name"/>
+        <attribute name="database" default="${metadata.dbfile}"/>
+        <attribute name="filterref" default="filterset.temprecord"/>
+        <sequential>
+            <mkdir dir="${build.cache.log.dir}"/>
+            <mkdir dir="${build.cache.log.dir}/signals"/>
+            <record name="${build.cache.log.dir}/@{name}" action="stop" loglevel="verbose"/>
+            <!--Temporary solution, the logextract in general 
+                needs to be handled in a better way (not all logs needs to be processed,
+                logextract / counting errors could be merged and logextract should be
+                executed on a need basis and not to process for all stopmacro.-->
+            <!-- Todo: metadata: replace logextract -->
+            <hlm:metadatarecord database="@{database}">
+                <hlm:antmetadatainput>
+                    <fileset casesensitive="false" file="${build.cache.log.dir}/@{name}" />
+                    <metadatafilterset refid="@{filterref}" />
+                </hlm:antmetadatainput>
+            </hlm:metadatarecord>
+            <hlm:generateBuildStatus dbfile="@{database}" output-dir="${build.cache.log.dir}/signals" file="@{name}" />
+            <copy todir="${build.log.dir}" failonerror="false">
+                <fileset casesensitive="false" file="${build.cache.log.dir}/@{name}" />
+            </copy>
+            <copy todir="${build.signal.status.dir}" failonerror="false">
+                <fileset casesensitive="false" dir="${build.cache.log.dir}/signals" />
+            </copy>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="start" append="true"/>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+    
+
+    <macrodef name="signalMacro" uri="http://www.nokia.com/helium">
+        <attribute name="logfile"/>
+        <attribute name="signal.input" />
+        <attribute name="skip.count" default="false" />
+        <attribute name="result" default="not-set"/>
+        <sequential>
+            <var name="signal.errors.total" value="" unset="true"/>
+            <var name="base.signal.log.file" value="" unset="true"/>
+            <basename property="base.signal.log.file" file="@{logfile}" suffix=".log"/>
+            <if>
+                <isfalse value="@{skip.count}" />
+                <then>
+                    <hlm:metadataCountSeverity severity="error" 
+                        log="@{logfile}"
+                        db="${metadata.dbfile}" property="signal.errors.total"/>
+                </then>
+                <else>
+                    <if>
+                        <equals arg1="@{result}" arg2="not-set"/>
+                        <then>
+                            <fail message="result parameter is missing for signa macro" />
+                        </then>
+                    </if>
+                    <var name="signal.errors.total" value="@{result}" />
+                </else>
+            </if>
+            <hlm:generateBuildStatus output-dir="${build.signal.status.dir}/" 
+                file="${base.signal.log.file}" />
+            <!-- signal for errors -->
+            <hlm:signal name="@{signal.input}" result="${signal.errors.total}" >
+                <signalNotifierInput>
+                    <signalInput refid="@{signal.input}" />
+                    <notifierInput file = "${build.signal.status.dir}/${base.signal.log.file}.status.html" />
+                </signalNotifierInput>
+            </hlm:signal>
+        </sequential>
+    </macrodef>
+
+    <!-- Macro to start logging to a separate log file.
+    
+    This will stop logging to the main ant_build log file until stopSpecificLogMacro
+    is called. -->
+    <macrodef name="startSpecificLogMacro">
+        <attribute name="name"/>
+        <attribute name="regexp" default=""/>
+        <attribute name="backup" default="false"/>
+        
+        <sequential>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <echo>Stopping recording to main Ant build log.</echo>
+                    <record name="${build.log}" action="stop" append="true"/>
+                </then>
+            </if>
+            <mkdir dir="@{name}/.."/>
+            <hlm:logrecord name="@{name}" action="start" loglevel="verbose" regexp="@{regexp}" backup="@{backup}"/>
+        </sequential>
+    </macrodef>
+
+
+    <!--Macro to restart  the main log file (if present) and stop recording to
+        a separate log file. -->
+    <macrodef name="stopSpecificLogMacro">
+        <attribute name="name"/>
+        <sequential>
+            <hlm:logrecord name="@{name}" action="stop" loglevel="verbose"/>
+            <if>
+                <available file="${build.log}"/>
+                <then>
+                    <record name="${build.log}" action="start" append="true"/>
+                    <echo>Starting recording to main Ant build log again.</echo>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <!-- Temp BMD macro -->
+    <macrodef name="bmdLogExtractMacro" uri="http://www.nokia.com/helium">
+        <attribute name="log"/>
+        <attribute name="metadatafilterset" default="common"/>
+        <sequential>
+            <hlm:metadatarecord database="${metadata.dbfile}">
+                <hlm:textmetadatainput>
+                    <fileset casesensitive="false" file="@{log}"/>
+                    <metadatafilterset refid="@{metadatafilterset}" />
+                </hlm:textmetadatainput>
+            </hlm:metadatarecord>
+            <!-- todo: check to add for usage and add genbuildstatus macro -->
+            <basename property="log.name" file="@{log}"/>
+            <fmpp sourceFile="${helium.dir}/tools/common/templates/db2xml.xml.ftl"
+                         outputfile="@{log}.xml">
+                <data expandProperties="yes">
+                    dbPath: ${metadata.dbfile}
+                    log: ${log.name}
+                    ant: antProperties()
+                </data>
+            </fmpp>
+        </sequential>
+    </macrodef>
+
+    <!-- A simple test macro -->
+    <macrodef name="fooMacro" uri="http://www.nokia.com/helium">
+        <sequential>
+            <echo>foo</echo>
+            <runtarget target="hello"/>
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- Asserts that two XML resources are logically equal.
+    
+    This looks at the XML content rather than just diffing the strings. -->
+    <scriptdef name="assertXmlEqual" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="control"/>
+        <attribute name="test"/>
+        <attribute name="failonerror"/>
+        <![CDATA[
+import logging
+
+import java.io
+import org.custommonkey.xmlunit
+
+control_id = str(attributes.get('control'))
+test_id = str(attributes.get('test'))
+
+control_resource = project.getReference(control_id)
+test_resource = project.getReference(test_id)
+control_reader = java.io.InputStreamReader(control_resource.getInputStream())
+test_reader = java.io.InputStreamReader(test_resource.getInputStream())
+
+org.custommonkey.xmlunit.XMLUnit.setIgnoreWhitespace(True)
+org.custommonkey.xmlunit.XMLUnit.setIgnoreComments(True)
+diff = org.custommonkey.xmlunit.Diff(control_reader, test_reader)
+detailed_diff = org.custommonkey.xmlunit.DetailedDiff(diff)
+differences = detailed_diff.getAllDifferences()
+print 'Differences total = ' + str(differences.size())
+for diff in differences.toArray():
+    print logging.warning(diff.toString())
+
+try:
+    control_reader = java.io.InputStreamReader(control_resource.getInputStream())
+    test_reader = java.io.InputStreamReader(test_resource.getInputStream())
+    org.custommonkey.xmlunit.XMLAssert.assertXMLEqual(control_reader, test_reader)
+    print 'XML is similar'
+except Exception, e:
+    print 'XML is NOT similar!'
+    failonerror = str(attributes.get('failonerror'))
+    if failonerror == 'true' or failonerror == 'None':
+        raise e
+        ]]>
+    </scriptdef>
+    
+    <!-- unsubst task, will unsubst a given drive. -->
+    <scriptdef name="unsubst" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="drive"/>
+        <attribute name="failonerror"/>
+""" internal.codescanner.drive """
+import fileutils
+self.setTaskName('unsubst')
+drive = attributes.get('drive')
+failonerror = attributes.get('failonerror')
+if (failonerror == None or str(failonerror) == "true"):
+    failonerror = True
+else:
+    failonerror = False
+if drive == None or len(str(drive)) != 2:
+    raise Exception("'drive' attribute is missing or invalid. " + str(drive))
+drive = str(drive)
+try:
+    self.log(str("Unsubsting %s..." % drive))
+    fileutils.unsubst(drive)
+except Exception, e:
+    if failonerror:
+        raise e
+    else:
+        self.log(str("Error: %s" % e))
+    </scriptdef>
+    
+    <!-- Touches the files in the paths given. -->
+    <scriptdef name="touch" language="jython" uri="http://www.nokia.com/helium">
+        <element name="path" type="path"/>
+        <![CDATA[
+import fileutils
+for id in range(elements.get("path").size()):
+    iterator = elements.get("path").get(int(id)).iterator()
+    while iterator.hasNext():
+        path = str(iterator.next())
+        fileutils.touch(path)
+        ]]>
+    </scriptdef>
+    
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/docs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,876 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : docs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="internal.docs" xmlns:hlm="http://www.nokia.com/helium" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>
+    Documentation generation targets.
+    </description>
+    
+    <property name="helium.doc.dir" location="${helium.dir}/doc" />
+    
+    <fileset id="python.library.files" dir="${helium.dir}">
+        <include name="extensions/nokia/tools/common/python/lib/**/*.py"/>
+        <include name="tools/common/python/lib/**/*.py"/>
+        <include name="extensions/nokia/tools/dp/iCreatorDP/**/*.py"/>
+    </fileset>
+    
+    <!-- Generate an overview of Helium as HTML tables. -->
+    <target name="overview-to-html">
+        <fmpp sourceFile="${helium.doc.dir}/src/helium_overview.html.ftl"
+              outputFile="${helium.build.dir}/temp/doc/helium_overview.html"
+              replaceExtension="html.ftl, html" expert="true">
+            <data expandProperties="yes">
+                doc: xml(${helium.doc.dir}/src/helium_overview.xml)
+            </data>
+        </fmpp>
+    </target>
+
+    
+    <!-- Macro to generate the tools dependency xml output. -->
+    <macrodef name="createToolsTableMacro" uri="http://www.nokia.com/helium">
+        <attribute name="dir"/>
+        <attribute name="failonerror"/>
+        <attribute name="configs"/>
+        <sequential>
+            <ivy:configure file="${tools.ivy.config.file}" override="true"/>
+            <ivy:resolve file="${helium.dir}/config/ivy/ivy.xml" conf="@{configs}" haltonfailure="@{failonerror}"/>
+            <ivy:report todir="@{dir}" outputpattern="tool-dependencies-[conf].xml"
+                        conf="@{configs}" xml="true" graph="false" xsl="false"/>
+        </sequential>
+    </macrodef>
+
+    
+    <!-- Generates the tools dependency xml output. used in the retrieving Helium section to list the tools used within Helium-->
+    <target name="tools-rst-table">
+        <hlm:createToolsTableMacro dir="${helium.build.dir}/doc/ivy" failonerror="false" 
+            configs="core,ido"/>
+        <fmpp sourceFile="${helium.doc.dir}/src/manual/tool-dependencies.rst.ftl" includes="*.dot.ftl"
+              outputFile="${helium.build.dir}/temp/doc/nokia/tool-dependencies.rst_include"
+              replaceExtension="dot.ftl, dot">
+            <data expandProperties="yes">
+                doc: xml(${helium.build.dir}/doc/ivy/tool-dependencies-ido.xml)
+            </data>
+        </fmpp>
+    </target>
+    
+    
+    <!-- Create a complete dependency graph of Helium libraries. 
+        
+    Currently this does not work correctly but it is useful for future testing of repreport. -->
+    <target name="libraries-dependencies">
+        <ivy:settings file="${tools.ivy.config.file}"/>
+        <!--<ivy:resolve file="${helium.dir}/config/ivy/ivy.xml" conf="" haltonfailure="false"/>-->
+        <delete file="@{dir}/ivy-repository-report.xml"/>
+        <ivy:repreport todir="${helium.build.dir}/doc/ivy" organisation="S60_SAM"
+                    xml="true" graph="false" xsl="false"/>
+        <!--<fmpp sourceFile="${helium.doc.dir}/src/manual/tool-dependencies.rst.ftl" includes="*.dot.ftl"
+              outputFile="${helium.build.dir}/temp/doc/manual/tool-dependencies.rst_include"
+              replaceExtension="dot.ftl, dot">
+            <data expandProperties="yes">
+                doc: xml(${helium.build.dir}/doc/ivy/tool-dependencies-ido.xml)
+            </data>
+        </fmpp>-->
+    </target>
+    
+    
+    <!-- Generate .rst tables from the property groups in the data model. -->
+    <target name="property-group-tables">
+        <fmpp sourceRoot="${helium.doc.dir}/src" includes="*.dot.ftl" outputRoot="${helium.build.dir}/temp/doc/api/helium"
+              replaceExtension="dot.ftl, dot">
+            <data expandProperties="yes">
+                doc: xml(${database.file})
+            </data>
+        </fmpp>
+    </target>
+
+    
+    <!-- Generate Python API documentation using epydoc. -->
+    <target name="python-apidocs">
+        <mkdir dir="${helium.build.dir}/doc/api/python"/>
+        <pathconvert pathsep=" " property="epydoc.python.modules.path">
+            <fileset refid="python.library.files"/>
+        </pathconvert>
+        <echo>Python modules path: ${epydoc.python.modules.path}</echo>
+        <exec osfamily="windows" executable="python" dir="${helium.build.dir}" failonerror="true">        
+            <arg line="${python.tools}\epydoc"/>
+            <arg value="-v"/>
+            <arg value="--config=${helium.dir}\config\epydoc.conf"/>
+            <arg value="--exclude=sgmllib"/>
+            <arg line="${epydoc.python.modules.path}"/>
+        </exec>
+    </target>
+    
+    
+    <!-- Generate Java API documentation using javadoc. -->
+    <target name="java-apidocs" depends="install-cruisecontrol">
+        <path id="classpath-javadoc">
+            <fileset dir="${helium.dir}/external/CruiseControl/lib" includes="*.jar"/>
+            <fileset dir="${helium.dir}/external" includes="**/*.jar"/>
+            <pathelement path="${helium.dir}/external/CruiseControl/webapps/dashboard/WEB-INF/classes"/>
+        </path>
+        <javadoc classpathref="classpath-javadoc" 
+            destdir="${helium.build.dir}/doc/api/java" useexternalfile="true">
+            <packageset dir="tools/common/java/src" defaultexcludes="yes"/>
+            <packageset dir="tools/common/java/test" defaultexcludes="yes"/>
+            <doctitle><![CDATA[<h1>API Documentation</h1>]]></doctitle>
+        </javadoc>
+    </target>
+    
+    
+    <!-- Generate Ant API documentation using antdoclet. -->
+    <target name="antdoclet" description="Generate Ant Task/Types documentation">
+        <path id="doclet-classpath">
+            <pathelement path="${java.class.path}/"/>
+            <pathelement path="${helium.dir}/external/CruiseControl/webapps/dashboard/WEB-INF/classes"/>
+        </path>
+        <mkdir dir="${helium.build.dir}/doc/api/ant"/>
+
+        <!-- First copy the "static" resources (images, static html files) -->
+        <copy todir="${helium.build.dir}/doc/api/ant" overwrite="true">
+            <fileset dir="${helium.doc.dir}/src/antdoclet/html">
+                <exclude name="*.vm"/>
+            </fileset>
+        </copy>
+      
+        <!-- Now invoke AntDoclet to generate the "dynamic" content from the templates -->
+        <javadoc access="private" sourcepath="${helium.dir}/tools/common/java/src/"
+                 destdir="${helium.build.dir}/doc/api/ant"
+                 packagenames="com.nokia.ant,com.nokia.ant.filters,com.nokia.ant.types.imaker,com.nokia.ant.types,com.nokia.ant.listerner,com.nokia.ant.taskdefs,com.nokia.ant.taskdefs.ccm.commands,com.nokia.cruisecontrol,com.nokia.cruisecontrol.sourcecontrol,com.nokia.fmpp,nokia.ivy"
+                 docletpathref="doclet-classpath" source="1.6"
+                 useexternalfile="true">
+            <doclet name="com.neuroning.antdoclet.AntDoclet">
+                <param name="-doctitle" value="${build.name}" />
+                <param name="-templatesdir" value="${helium.doc.dir}/src/antdoclet/html"/>
+                <param name="-templates" value="main.vm"/>
+            </doclet>
+        </javadoc>
+        <move file="velocity.log" tofile="build/velocity.log" failonerror="false"/>
+    </target>
+
+    
+    <!-- Cleans the Helium API documentation. -->
+    <target name="clean-helium-apidoc">
+        <delete dir="${helium.build.dir}/doc/api/helium"/>
+        <delete dir="${helium.build.dir}/temp/doc/api/helium"/>
+    </target>
+    
+    
+    <!-- Creates images of the dependencies for all Ant targets.
+        
+    This includes creating a cmap file that is included in the HTML document,
+    so the boxes in the image are linked to their targets. -->
+    <target name="helium-api-dependency-images">
+        <mkdir dir="${helium.build.dir}/doc/api/helium"/>
+        <fmpp sourceRoot="${helium.doc.dir}/src/api" includes="*.dot.ftl" outputRoot="${helium.build.dir}/temp/doc/api/helium"
+              replaceExtension="dot.ftl, dot">
+            <data expandProperties="yes">
+                doc: xml(${database.file})
+            </data>
+        </fmpp>
+        <for param="dot.file" parallel="true" threadCount="${number.of.threads}">
+            <fileset dir="${helium.build.dir}/temp/doc/api/helium" includes="*.dot"/>
+            <sequential>
+                <echo>Processing dot file: @{dot.file}</echo>
+                <exec executable="dot" dir="${helium.build.dir}/temp/doc/api/helium">
+                    <arg line="-Tcmap @{dot.file} -O"/>
+                </exec>
+                <exec executable="dot" dir="${helium.build.dir}/doc/api">
+                    <arg line="-Tpng @{dot.file} -O"/>
+                </exec>
+            </sequential>
+        </for>
+        <move todir="${helium.build.dir}/doc/api" overwrite="true">
+            <fileset dir="${helium.build.dir}/temp/doc/api" includes="*.dot.png"/>
+        </move>
+    </target>
+    
+    
+    <!-- Builds the HTML files for the Helium API documentation. -->
+    <target name="helium-api-html-docs">
+        <mkdir dir="${helium.build.dir}/doc/api/helium"/>
+        <copy todir="${helium.build.dir}/temp/doc/api/helium" overwrite="true">
+            <fileset dir="${helium.doc.dir}/src/api"/>
+        </copy>
+        <xslt in="${data.model.file}" out="${data.model.parsed}" style="${data.model.xsl}"/>
+        <hlm:parsemodel output="${helium.build.dir}/helium_data_model.xml_parsed" input="${data.model.parsed}"/>
+        <fmpp sourceRoot="${helium.build.dir}/temp/doc/api/helium" excludes="*.dot.ftl,**/*.dot,**/*.cmap,*.bak"
+              outputRoot="${helium.build.dir}/doc/api/helium"
+              replaceExtension="html.ftl, html">
+            <data expandProperties="yes">
+                ant: antProperties()
+                doc: xml(${database.file})
+                data: xml(${helium.build.dir}/helium_data_model.xml_parsed)
+            </data>            
+        </fmpp>
+    </target>
+    
+    
+    <!-- Builds the Helium API documentation. -->
+    <target name="helium-apidocs" depends="clean-helium-apidoc,database,
+        find-python-dependencies,helium-api-dependency-images,helium-api-html-docs"/>
+    
+    <!-- Builds the Helium API documentation for customer. -->
+    <target name="customer-apidocs">
+        <mkdir dir="${helium.build.dir}"/>
+        
+        <antcall target="helium-apidocs">
+            <param name="helium.dir" value="."/>
+            <param name="home.files.only" value="true"/>
+            <param name="database.file" location="${helium.build.dir}/database.xml"/>
+        </antcall>
+        <!--
+        <antform title="login information">
+            <textProperty label="password:" property="noe.password" password="true"/>
+        </antform>
+        
+        <antcall target="upload-docs">
+            <param name="helium.dir" value="."/>
+            <param name="documentation.path.root" value="/var/local/www/helium/doc/${customer}"/>
+        </antcall>
+        -->
+    </target>
+    
+    <!-- Generate documentation from the source code. -->
+    <target name="apidocs" depends="python-apidocs,helium-apidocs,java-apidocs,antdoclet,apidocs-search"/>
+    
+    <!-- Macro to generate html docs from rst. -->
+    <macrodef name="rstMacro" uri="http://www.nokia.com/helium">
+        <attribute name="version" default="${helium.version}"/>
+        <attribute name="src" default="${helium.build.dir}/temp/doc"/>
+        <attribute name="output" default="${helium.build.dir}/doc"/>
+        <sequential>
+            <property name="sphinx.lib.dir" location="${helium.dir}/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx" />
+            <if>
+                <available file="${nokia.python.tools}/sphinxfixsearch.diff"/>
+                <then>
+                    <patch patchfile="${nokia.python.tools}/sphinxfixsearch.diff" originalfile="${sphinx.lib.dir}/search.py"/>
+                </then>
+            </if>
+            <exec executable="python" failonerror="${failonerror}">        
+                <arg file="${python.dir}/sphinx-build.py"/>
+                <arg value="-b" />
+                <arg value="html" />            
+                <arg value="-D" />
+                <arg value="version=@{version}" />
+                <arg value="-D" />
+                <arg value="release=@{version}" />
+                <arg file="@{src}" />
+                <arg file="@{output}" />
+            </exec>
+            <if>
+                <available file="${nokia.python.tools}/sphinxfixsearch.diff"/>
+                <then>
+                    <patch reverse="true" patchfile="${nokia.python.tools}/sphinxfixsearch.diff" originalfile="${sphinx.lib.dir}/search.py"/>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+    
+    <!-- Generate rst files for docs -->
+    <target name="prep-textdocs" depends="clean-doc-dir,overview-to-html,tools-rst-table,dependency-diagram,dependency-logs,release-diff,helium-user-graph">
+        <mkdir dir="${helium.build.dir}/doc"/>
+        
+        <delete dir="${helium.build.dir}/doc/.doctrees"/>
+        <delete file="${helium.build.dir}/doc/searchindex.json"/>
+        
+        <copy todir="${helium.build.dir}/doc/images">
+            <fileset dir="${helium.doc.dir}/images"/>
+        </copy>
+
+        <!-- Temporarily copy the image directory so that doc generation will complete happily. -->
+        <copy todir="${helium.build.dir}/temp/doc/images">
+            <fileset dir="${helium.build.dir}/doc/images"/>
+        </copy>
+        <copy todir="${helium.build.dir}/temp/doc">
+            <fileset dir="${helium.doc.dir}/src">
+                <include name="**/*.rst"/>
+                <include name="**/*.css"/>
+                <include name="**/*.jpg"/>
+                <include name="**/*.dot"/>
+            </fileset>
+        </copy>
+        <copy todir="${helium.build.dir}/temp/doc/nokia" failonerror="false">
+            <fileset dir="${nokia.dir}/doc/src">
+                <include name="**/*.rst"/>
+                <include name="**/*.css"/>
+                <include name="**/*.jpg"/>
+            </fileset>
+        </copy>
+        
+        <mkdir dir="${helium.build.dir}/temp/doc/minibuilds"/>
+        <copy todir="${helium.build.dir}/temp/doc/minibuilds" failonerror="false">
+            <fileset dir="${helium.dir}/tests/minibuilds/">
+                <include name="*/doc/**/*"/>
+            </fileset>
+        </copy>
+        
+        <fmpp sourceFile="${helium.doc.dir}/src/quick_start_guide.rst.ftl" outputFile="${helium.build.dir}/temp/doc/quick_start_guide.rst">
+            <data expandProperties="yes">
+                ant: antProperties()
+            </data>            
+        </fmpp>
+        
+        <fileset id="internal.ref.minibuilds" dir="${helium.build.dir}/temp/doc/minibuilds" includes="*/**/index.rst"/>
+        <fmpp sourceFile="${helium.doc.dir}/src/minibuilds.rst.ftl"
+              outputFile="${helium.build.dir}/temp/doc/minibuilds/index.rst">
+            <data expandProperties="yes">
+                project: antProject()
+            </data>            
+        </fmpp>
+        <fmpp sourceFile="${helium.doc.dir}/src/index.rst.ftl" outputFile="${helium.build.dir}/temp/doc/index.rst">
+            <data expandProperties="yes">
+                ant: antProperties()
+            </data>            
+        </fmpp>
+        <fmpp sourceFile="${helium.doc.dir}/src/manual/APIs.rst.ftl" outputFile="${helium.build.dir}/temp/doc/manual/APIs.rst">
+            <data expandProperties="yes">
+                ant: antProperties()
+            </data>            
+        </fmpp>
+        <fmpp sourceFile="${helium.doc.dir}/src/manual/stages.rst.ftl" outputFile="${helium.build.dir}/temp/doc/manual/stages.rst">
+            <data expandProperties="yes">
+                ant: antProperties()
+            </data>            
+        </fmpp>
+        
+        <copy todir="${helium.build.dir}/temp/doc">
+            <fileset dir="${helium.doc.dir}/src">
+                <include name="conf.py"/>
+                <include name=".static"/>
+                <include name=".templates/**"/>
+                <include name="*.jpg"/>
+            </fileset>
+        </copy>
+
+        <!-- Including Helium antlib doc -->
+        <mkdir dir="${helium.build.dir}/temp/doc/helium-antlib"/>
+        <copy todir="${helium.build.dir}/temp/doc/helium-antlib" failonerror="false">
+            <fileset dir="${helium.dir}/external/helium-antlib/doc/src">
+                <include name="**/*.rst"/>
+                <include name="**/*.css"/>
+                <include name="**/*.jpg"/>
+            </fileset>
+        </copy>
+        
+        <for param="dot.file">
+            <fileset dir="${helium.build.dir}/temp/doc/manual" includes="*.dot"/>
+            <sequential>
+                <exec executable="dot">
+                    <arg line="-Tpng @{dot.file} -O"/>
+                </exec>
+            </sequential>
+        </for>
+    </target>
+    
+    <!-- Generate HTML documentation from .rst documents with Sphinx.
+    
+    All doc .rst files should be generated or copied into build/temp/doc before being processed into HTML.    
+    -->
+    <target name="textdocs" depends="prep-textdocs">        
+        <hlm:rstMacro />
+        
+        <copy file="${database.file}" todir="${helium.build.dir}/doc"/>
+        <copy file="${helium.build.dir}/temp/doc/default.css" todir="${helium.build.dir}/doc/_static" overwrite="true"/>
+        <copy file="${helium.build.dir}/temp/doc/helium_pallot_small.jpg" todir="${helium.build.dir}/doc/_static" overwrite="true"/>
+        <copy todir="${helium.build.dir}/doc" overwrite="true">
+            <fileset dir="${helium.doc.dir}/src">
+                <include name="**/*.zip"/>
+            </fileset>
+        </copy>
+    </target>
+    
+    <!-- Generate search index for apis -->
+    <target name="apidocs-search">
+        <hlm:python>
+import html2rest
+import os
+import codecs
+#import traceback
+for root, dirs, files in os.walk(r'${helium.build.dir}/doc/api', topdown=False):
+    for fname in files:
+        if '.html' in fname:
+            filename = os.path.abspath(os.path.join(root, fname))
+            rstfilename = filename.replace('.html', '.rst')
+            try:
+                out = open(rstfilename, 'w')
+                html2rest.html2rest(html2rest.readsoup(filename), out)
+            except:
+                #traceback.print_exc()
+                print filename + ' failed to be converted to rst'
+            finally:
+                out.close()
+                
+            try:
+                rstfile = codecs.open(rstfilename, 'r', 'utf8')
+                rstfile.read()
+            except:
+                print rstfilename + ' has invalid unicode'
+                rstfile.close()
+                os.remove(rstfilename)
+        </hlm:python>
+        
+        <move todir="${helium.build.dir}/temp_search/doc" overwrite="true">
+            <fileset dir="${helium.build.dir}/doc/api">
+                <include name="**/*.rst"/>
+            </fileset>
+        </move>
+        
+        <move todir="${helium.build.dir}/doc/api_backup" overwrite="true">
+            <fileset dir="${helium.build.dir}/doc/api"/>
+        </move>
+        
+        <copy file="${helium.doc.dir}/src/api/apisearchindex.rst" tofile="${helium.build.dir}/temp_search/doc/index.rst"/>
+        
+        <copy todir="${helium.build.dir}/temp_search/doc">
+            <fileset dir="${helium.doc.dir}/src">
+                <include name="conf.py"/>
+                <include name=".static"/>
+                <include name=".templates/**"/>
+                <include name="*.jpg"/>
+            </fileset>
+        </copy>
+        
+        <hlm:rstMacro src="${helium.build.dir}/temp_search/doc" output="${helium.build.dir}/doc/api"/>
+        
+        <move todir="${helium.build.dir}/doc/api" overwrite="true">
+            <fileset dir="${helium.build.dir}/doc/api_backup"/>
+        </move>
+    </target>
+    
+    <!-- Generate all documentation. -->
+    <target name="add-policies-to-docs" unless="env.HLM_SUBCON">
+        <hlm:updatePolicy policy="7" filename="distribution.policy.S60">         
+            <dirset dir="${helium.dir}" includes="${helium.build.dir}/doc/**/*"/>        
+        </hlm:updatePolicy>   
+    </target>
+    
+    
+    <!-- Creates XML and .rst documents describing the difference between
+    this version of Helium and the previous major release. -->
+    <target name="release-diff" depends="database" unless="env.HLM_SUBCON">
+        <mkdir dir="${helium.build.dir}/doc"/>
+        <property name="last.major.release.database.url" value="${documentation.url.root}/${last.major.helium.version}/database.xml"/>
+        <hlm:python>
+import urllib
+import helium.documentation
+
+old_db_file = urllib.urlopen(r'${last.major.release.database.url}')
+writer = helium.documentation.APIDeltaWriter(old_db_file, r'${database.file}')
+writer.write(r'${helium.build.dir}/doc/api_changes.xml')
+        </hlm:python>
+        <fmpp sourceFile="${helium.doc.dir}/src/api_changes.rst.ftl" outputFile="${helium.build.dir}/temp/doc/api_changes.rst">
+            <data expandProperties="yes">
+                doc: xml(${helium.build.dir}/doc/api_changes.xml)
+                old_release: ${last.major.helium.version}
+                new_release: ${helium.version}
+            </data>
+        </fmpp>
+    </target>
+    
+    <!-- Generate docs for Symbian Foundataion -->
+    <target name="docs-sf">
+        <delete dir="${helium.build.dir}"/>
+        <antcall target="helium-subcon-release"/>
+        <unzip src="${helium.build.dir}/helium_${helium.version}_subcon.zip" dest="${helium.build.dir}/helium_${helium.version}_subcon" overwrite="true" />
+        <!---->
+        <exec executable="cmd" dir="${helium.build.dir}/helium_${helium.version}_subcon/helium">
+            <env key="HELIUM_HOME" value="${helium.build.dir}/helium_${helium.version}_subcon/helium"/>
+            <env key="PYTHONPATH" value="${env.PYTHONPATH}"/>
+            <env key="ANT_ARGS" value="${env.ANT_ARGS}"/>
+            <arg line="/C hlm.bat"/>
+            <arg value="docs"/>
+            <arg value="-Dpython.tools=${python.tools}"/>
+            <arg value="-Dsf=true"/>
+        </exec>
+    </target>
+    
+    <!-- generate all the user documentation for helium -->
+    <target name="docs" depends="clean-doc-dir,database,apidocs,textdocs,add-policies-to-docs"/>
+    
+    <!-- Clean old build/doc dir. -->
+    <target name="clean-doc-dir">
+        <delete dir="build/doc"/>
+        <delete dir="build/temp/doc"/>        
+    </target>
+    
+    <!-- Connect to home drive if it is not connected for .netrc file. -->
+    <target name="check-home-drive">
+        <exec executable="cmd">
+            <arg value="/c"/>
+            <arg value="${helium.dir}/tools/common/bin/check_home_drv.bat"/>
+            <arg value=">nul"/>
+        </exec>
+    </target>
+    
+    <!-- Upload generated HTML docs to the Helium server. -->
+    <target name="upload-docs" depends="check-home-drive">
+        <property name="documentation.path" value="${documentation.path.root}"/>
+        <property name="docs.zip" value="${helium.build.dir}/helium-docs.zip"/>
+
+        <!-- Python API docs. -->
+        <delete file="${docs.zip}"/>
+        <zip destfile="${docs.zip}">
+            <fileset dir="${helium.build.dir}/doc" includes="**/*"/>
+        </zip>
+        <sshexec host="${documentation.host}"
+                 username="${user.name}"
+                 keyfile="${env.HOME}/.ssh/id_rsa_openssh.ppk"
+                 trust="true"
+                 command="mkdir -p ${documentation.path}"/>
+        <scp todir="${user.name}@${documentation.host}:${documentation.path}"
+          keyfile="${env.HOME}/.ssh/id_rsa_openssh.ppk"
+          passphrase=""
+          trust="true"
+          sftp="true"
+          file="${docs.zip}"/>
+        <sshexec host="${documentation.host}"
+                 username="${user.name}"
+                 keyfile="${env.HOME}/.ssh/id_rsa_openssh.ppk"
+                 trust="true"
+                 command="cd ${documentation.path}; unzip -u -o helium-docs.zip"/>
+    </target>
+    
+    
+    <!-- Upload generated HTML docs to the Helium server. -->
+    <target name="upload-release-docs">
+        <property name="documentation.path" value="${documentation.path.root}/${helium.version}"/>
+        <antcall target="upload-docs"/>
+    </target>
+    
+    
+  <!-- create slides from images -->
+    <target name="slides">
+        <mkdir dir="${helium.build.dir}/slides"/>
+    
+        <copy todir="${helium.build.dir}/slides">
+            <fileset dir="${helium.doc.dir}/slides"/>
+        </copy>
+
+        <copy todir="${helium.build.dir}/slides/images">
+            <fileset dir="${helium.doc.dir}/slides/images"/>
+        </copy>
+    
+        <for param="document">
+            <fileset dir="${helium.build.dir}/slides" includes="**/*.rst"/>
+            <sequential>
+                <propertyregex property="document.no.ext" input="@{document}" regexp="\.rst$" replace="" override="true"/>
+                <if>
+                    <not>
+                        <uptodate srcfile="@{document}" targetfile="${document.no.ext}.html"/>
+                    </not>
+                    <then>
+                        <echo>Building doc: @{document}</echo>
+                        <exec executable="python" dir="${helium.doc.dir}" failonerror="${failonerror}">
+                            <arg value="${nokia.python.tools}/rst2s5.py"/>
+                            <arg value="@{document}"/>
+                            <arg value="${document.no.ext}.html"/>
+                        </exec>
+                    </then>
+                </if>
+            </sequential>
+        </for>
+    </target>
+
+        
+    <!-- Generate HTML documentation from .rst documents.
+    
+    TODO: Remove this old method. -->
+    <target name="textdocs-old" depends="overview-to-html">
+        <mkdir dir="${helium.build.dir}/doc"/>
+        <copy todir="${helium.build.dir}/doc-old">
+            <fileset dir="${helium.doc.dir}/src" excludes="cover.rst"/>
+            <fileset dir="${nokia.dir}/doc/src"/>
+        </copy>
+        
+        <copy todir="${helium.build.dir}/doc-old/images">
+            <fileset dir="${helium.doc.dir}/images"/>
+        </copy>
+        
+        <for param="document">
+            <fileset dir="${helium.build.dir}/doc-old">
+                <include name="**/*.rst" />
+                <exclude name="index.rst" /><!-- index.rst is the top-level doc for new-style docs -->
+            </fileset>
+            <sequential>
+                <propertyregex property="document.no.ext" input="@{document}" regexp="\.rst$" replace="" override="true"/>
+                <if>
+                    <not>
+                        <uptodate srcfile="@{document}" targetfile="${document.no.ext}.html"/>
+                    </not>
+                    <then>
+                        <echo>Building doc: @{document}</echo>                        
+                        <exec executable="python" dir="${helium.doc.dir}" failonerror="${failonerror}">
+                            <!--<env key="PYTHONPATH" value="${helium.dir}\${python25.lib};tools\common\python\lib"/>-->
+                            <arg value="${nokia.python.tools}\rst2html.py"/>
+                            <arg line="--traceback --no-toc-backlinks"/>
+                            <!-- -stylesheet-path nokia_style.css -->
+                            <arg value="@{document}"/>
+                            <arg value="${document.no.ext}.html"/>
+                        </exec>
+                    </then>
+                </if>
+            </sequential>
+        </for>
+    </target>
+    
+    
+    <!-- Search Python internal module used in helium -->
+    <target name="find-python-dependencies" depends="database">    
+        <hlm:assertPropertySet property="helium.dir" message="Property helium.dir is not defined." />
+        <hlm:assertPropertySet property="database.file" message="Property database.file is not defined."/>
+        <hlm:python>
+from __future__ import with_statement
+import re
+import os
+import string
+import amara
+import codecs
+import ant
+
+setpath = r'${helium.dir}'+'/tools'
+
+print "Searching under "+setpath
+
+dbPath = r'${database.file}'
+dbPath = 'file:///'+ dbPath.replace('\\','/')
+dbPrj = amara.parse(dbPath)
+
+for root, dirs, files in os.walk(setpath, topdown=False):
+    for fname in files:
+        filePattern = re.compile('.ant.xml$')
+        fileMatch = filePattern.search(fname)
+        modulelist = []
+        if (fileMatch):
+            filePath = os.path.abspath(os.path.join(root, fname))
+            with open(filePath) as f:
+                filePathAmara = 'file:///'+ filePath.replace('\\','/')
+                curPrj=amara.parse(filePathAmara)
+                for line in f:
+                    linePattern = re.compile('^import')
+                    lineMatch = linePattern.search(line)
+                    if ((lineMatch) and (line.find('.')==-1)):
+                        newLine = line.replace('import','')
+                        newLine = newLine.replace(',','')
+                        moduleArray = newLine.split()
+                        for curModule in moduleArray:
+                            try:
+                                importModule = __import__(curModule)
+                                modulePath=importModule.__file__
+                                if (modulePath.find('\\helium\\tools')!= -1):
+                                    for projectList in dbPrj.antDatabase.project:
+                                        if (projectList.name==curPrj.project.name):
+                                            if not (curModule in modulelist):
+                                                print " Python module : " +curModule
+                                                moduleElement = projectList.pythonDependency.xml_create_element(u'module', content=u''+curModule)
+                                                projectList.pythonDependency.xml_append(moduleElement)
+                                            modulelist = modulelist + [curModule]
+                            except Exception, e:
+                                error ="yes"
+
+
+file_object = codecs.open(r'${database.file}', 'w', "utf_8")
+file_object.write(dbPrj.xml(indent=u"yes"))
+file_object.close()
+    
+        </hlm:python>
+    </target>
+    
+    
+    <!-- Reads the Java libraries and extracts a list of their versions. -->
+    <target name="library-versions">    
+        <script language="jython" setbeans="false">
+import java.io
+import java.util.jar
+antlibsDir = java.io.File('external/antlibs')
+print antlibsDir
+jarFiles = antlibsDir.listFiles()
+for jar in jarFiles:
+    if jar.getName().endswith('jar'):
+        jarFile = java.util.jar.JarFile(jar)
+        manifest = jarFile.getManifest()
+        attributes = manifest.getMainAttributes()
+        implementationVersion = attributes.getValue('Implementation-Version')
+        print jar.getName() + ': ' + str(implementationVersion)
+        </script>
+    </target>
+    
+    <!-- Generates a subcon dependancy diagram based on Egg and Jars files -->
+    <target name="dependency-diagram-subcon">
+        <fileset id="subcon.jar.files" dir="${helium.dir}">
+            <include name="external/antlibs/*.jar"/>
+            <include name="external/jep/**/*.jar"/>
+            <include name="external/helium-antlib/bin/**/*.jar"/>
+            <include name="tools/**/*.jar"/>
+        </fileset>
+        <antcall target="dependency-diagram">
+            <reference refid="subcon.jar.files" torefid="jar.files"/>
+            <param name="python.exclude.dir" value="${helium.dir}\external\python\lib\2.5\internal"/>
+            <param name="dependency.grph" value="${helium.build.dir}/doc/images/dependencies_subcon.grph"/>
+            <param name="subcon" value="true"/>
+        </antcall>
+    </target>
+    
+    <fileset id="jar.files" dir="${helium.dir}">
+        <include name="external/antlibs/**/*.jar"/>
+        <include name="external/jep/**/*.jar"/>
+        <include name="external/helium-antlib/**/*.jar"/>
+        <include name="tools/**/*.jar"/>
+        <include name="extensions/nokia/external/antlibs/**/*.jar"/>
+    </fileset>
+    
+    <!-- Generates a dependancy diagram based on Egg and Jars files -->
+    <target name="dependency-diagram">
+        <mkdir dir="${helium.build.dir}/doc/images"/>
+        <mkdir dir="${temp.build.dir}"/>
+        <property name="dependency.grph" value="${helium.build.dir}/doc/images/dependencies.grph"/>
+        
+        <!---->
+        <copy todir="${temp.build.dir}/dependencylibs" flatten="true">
+            <fileset refid="jar.files"/>
+        </copy>
+        
+        <hlm:antdependency outputFile="${temp.build.dir}/antdependencies.grph">
+            <fileset dir="${temp.build.dir}/dependencylibs" includes="*.jar"/>
+        </hlm:antdependency>
+        
+        <taskdef name="jaranalyzer" classname="com.kirkk.analyzer.textui.JarAnalyzerTask"/>
+        <jaranalyzer srcdir="${temp.build.dir}/dependencylibs" destfile="${dependency.grph}" summaryclass="com.kirkk.analyzer.textui.DOTSummary"/>
+        
+        <loadfile srcfile="${temp.build.dir}/antdependencies.grph" property="antdependencies"/>
+        <replace file="${dependency.grph}" token="}" value="${antdependencies}}"/>
+        
+        <antcall target="dependency-grouping"/>
+        
+        <exec executable="dot">
+            <arg line="-Tpng -Grankdir=LR -Nshape=box -Nfontsize=9 -Nwidth=0.3 -Nheight=0.2 ${dependency.grph} -O"/>
+        </exec>
+        
+        <delete dir="${temp.build.dir}/dependencylibs"/>
+        
+    </target>
+    
+    <!-- Private: -->
+    <target name="dependency-grouping">
+        <property name="dependency.grph" value="${helium.build.dir}/doc/images/dependencies.grph"/>
+        <mkdir dir="${helium.build.dir}/doc/images"/>
+        <property name="python.internal.dir" value="${nokia.dir}\external\python\lib\2.5"/>
+        <property name="subcon" value=""/>
+        <property name="ivy.xml.file" value="${helium.dir}/config/ivy/ivy.xml"/>
+        <hlm:python>
+import os
+import dependancygraph
+
+dependancygraph.createGraph(r'${ivy.xml.file}', r'${dependency.grph}', r'${python.dir}', r'${python.internal.dir}', r'${subcon}')
+        </hlm:python>
+        <!--
+        <exec executable="dot">
+            <arg line="-Tpng -Grankdir=LR -Nshape=box -Nfontsize=9 -Nwidth=0.3 -Nheight=0.2 ${dependency.egg.grph} -O"/>
+        </exec>
+        -->
+    </target>
+    
+    <!-- Generates a dependancy diagram of ant projects to helium external files -->
+    <target name="dependency-external">
+        <property name="dependency.external.grph" value="${helium.build.dir}/doc/images/dependencies_external.grph"/>
+        <copy file="${database.file}" tofile="${database.file}.parsed" overwrite="true">
+            <filterchain>
+                <expandproperties/>
+            </filterchain>
+        </copy>
+        <hlm:python>
+import os
+import dependancygraph
+
+dependancygraph.externalDependancies(r'${database.file}.parsed', r'${dependency.external.grph}')
+        </hlm:python>
+        <!---->
+        <exec executable="dot">
+            <arg line="-Tpng -Grankdir=LR -Nshape=box -Nfontsize=9 -Nwidth=0.3 -Nheight=0.2 ${dependency.external.grph} -O"/>
+        </exec>
+        
+    </target>
+    
+    <!-- Private: Convert db file -->
+    <target name="dependency-db-convert" depends="database">
+        <copy file="${database.file}" tofile="${database.file}.parsed" overwrite="true">
+            <filterchain>
+                <expandproperties/>
+            </filterchain>
+        </copy>
+    </target>
+    
+    <!-- Generates a dependancy diagram of log files -->
+    <target name="dependency-logs">
+        <property name="dependency.external.grph" value="${helium.build.dir}/doc/images/dependencies_log.grph"/>
+        
+        <antcall target="dependency-db-convert" inheritAll="false">
+            <param name="build.drive" value="build.drive"/>
+            <param name="build.id" value="build.id"/>
+            <param name="build.log.dir" value="/output/logs"/>
+        </antcall>
+        
+        <hlm:python>
+import os
+import dependancygraph
+
+dependancygraph.findLogFiles(r'${database.file}.parsed', r'${dependency.external.grph}')
+        </hlm:python>
+        <!---->
+        <exec executable="dot">
+            <arg line="-Tpng -Grankdir=LR -Nshape=box -Nfontsize=9 -Nwidth=0.3 -Nheight=0.2 ${dependency.external.grph} -O"/>
+        </exec>
+        
+    </target>
+    
+    <!-- Download data listening logs and extract data -->
+    <target name="parse-datalistening">
+        <exec executable="python" dir="${helium.dir}/tools/common/python/lib" failonerror="${failonerror}">
+            <arg value="parsedatalistening.py"/>
+        </exec>
+    </target>
+
+    <!-- Creates user flow diagram -->
+    <target name="helium-user-graph">
+        <mkdir dir="${helium.build.dir}/doc/api"/>
+        <fmpp sourcefile="${helium.doc.dir}/src/user-graph.dot.ftl" outputfile="${helium.build.dir}/temp/doc/user-graph.dot">
+            <data expandProperties="yes">
+              ant: antProperties()
+            </data>
+        </fmpp>
+        <for param="dot.file">
+            <fileset dir="${helium.build.dir}/temp/doc" includes="user-graph.dot"/>
+            <sequential>
+                <echo>Processing dot file: @{dot.file}</echo>
+                <exec executable="dot" dir="${helium.build.dir}/temp/doc/">
+                    <arg line="-Tcmap @{dot.file} -O"/>
+                </exec>
+                <exec executable="dot" dir="${helium.build.dir}/doc/api">
+                    <arg line="-Tpng @{dot.file} -O"/>
+                </exec>
+            </sequential>
+        </for>
+        <move todir="${helium.build.dir}/doc/images" overwrite="true">
+            <fileset dir="${helium.build.dir}/temp/doc" includes="user-graph.dot.png"/>
+        </move>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/symbian_sysdef_options.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : symbian_sysdef_options.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [<!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
+]>
+<SystemDefinition name="symbian_sysdef_options_xml" schema="1.4.0">
+  <build>
+    <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+    <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/>
+    <option name="NO_DEBUG" abldOption="-no_debug" description="Causes the toolchain not to generate debug tables" enable="N"/>
+    <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+    <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+    <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+    <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+    <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+    <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+    <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+    <target name="TOOLS2" abldTarget="tools2" description="MinGW GCC Compiler for Tools"/>
+    <target name="TOOLS2_REL" abldTarget="tools2 rel" description="MinGW GCC Compiler for Tools Release mode only"/>
+    <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+    <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+    <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+
+    <!-- Aditional Targets -->
+    <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+    <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+    <target name="GCCXML" abldTarget="gccxml" description="GCCXML for Code comparision tools"/>
+    <target name="GCCXML_REL" abldTarget="gccxml urel" description="GCCXML for Code comparision tools release mode only"/>
+    
+    <targetList name="default_9.0" description="Main Targets for 9.0" target="WINSCW ARMV5"/>
+    <targetList name="default_9.0_rel" description="Main Targets for 9.0_rel" target="WINSCW_REL ARMV5_REL"/>
+    <targetList name="default_9.0_deb" description="Main Targets for 9.0_deb" target="WINSCW_DEB ARMV5_DEB"/>
+    <targetList name="tools" description="tools Targets" target="TOOLS"/>
+    <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+    <targetList name="tools2" description="tools Targets" target="TOOLS2"/>
+    <targetList name="tools2_rel" description="tools Release Targets" target="TOOLS2_REL"/>
+    <targetList name="gccxml" description="tools Targets" target="GCCXML"/>
+    <targetList name="gccxml_rel" description="tools Release Targets" target="GCCXML_REL"/>
+  </build>
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_1_4_0.dtd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_1_5_0.dtd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  proFile CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_1_5_1.dtd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  proFile CDATA #IMPLIED
+  qmakeArgs CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_2_0_0.dtd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition ( systemModel?, SystemBuild? )>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (block* | collection*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT block (subblock* | collection*)*>
+ <!ATTLIST block
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  name CDATA #REQUIRED>
+ <!ELEMENT subblock (collection)*>
+ <!ATTLIST subblock name CDATA #REQUIRED>
+ <!ELEMENT collection (component)*>
+ <!ATTLIST collection
+  name CDATA #REQUIRED
+  level NMTOKEN #IMPLIED>
+ <!ELEMENT component (unit)*>
+ <!ATTLIST component
+  name CDATA #REQUIRED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  plugin (Y|N) "N"
+  filter CDATA #IMPLIED
+  class NMTOKENS #IMPLIED
+  supports CDATA #IMPLIED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  mrp CDATA #IMPLIED
+  filter CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (Y|N) #IMPLIED
+  priority CDATA #IMPLIED>
+ <!ELEMENT SystemBuild (option* | target+ | targetList+ | list+ | configuration+)*>
+ <!ATTLIST SystemBuild schema CDATA #REQUIRED>
+ <!ELEMENT list (ref+)>
+ <!ATTLIST list
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT ref EMPTY>
+ <!ATTLIST ref item CDATA #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N ) #REQUIRED>
+ <!ELEMENT configuration (listRef+ | ref+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task (listRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT listRef EMPTY>
+ <!ATTLIST listRef list CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N ) #REQUIRED
+  targetParallel (Y | N ) "N">
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  root CDATA #IMPLIED
+  command CDATA #REQUIRED>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_dtd_1_4_0.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sysdef_dtd_1_4_0.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [<!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
+]>
+<SystemDefinition name="sysdef_dtd_1_4_0_xml" schema="1.4.0">
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_dtd_1_5_0.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sysdef_dtd_1_5_0.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [<!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  proFile CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>
+]>
+<SystemDefinition name="sysdef_dtd_1_5_0_xml" schema="1.5.0">
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_dtd_1_5_1.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sysdef_dtd_1_5_1.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [<!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  proFile CDATA #IMPLIED
+  qmakeArgs CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>
+]>
+<SystemDefinition name="sysdef_dtd_1_5_1_xml" schema="1.5.1">
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/dtd/sysdef_dtd_2_0_0.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sysdef_dtd_2_0_0.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [
+ <!ELEMENT SystemDefinition ( systemModel?, SystemBuild? )>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (block* | collection*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT block (subblock* | collection*)*>
+ <!ATTLIST block
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  name CDATA #REQUIRED>
+ <!ELEMENT subblock (collection)*>
+ <!ATTLIST subblock name CDATA #REQUIRED>
+ <!ELEMENT collection (component)*>
+ <!ATTLIST collection
+  name CDATA #REQUIRED
+  level NMTOKEN #IMPLIED>
+ <!ELEMENT component (unit)*>
+ <!ATTLIST component
+  name CDATA #REQUIRED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  plugin (Y|N) "N"
+  filter CDATA #IMPLIED
+  class NMTOKENS #IMPLIED
+  supports CDATA #IMPLIED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  mrp CDATA #IMPLIED
+  filter CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (Y|N) #IMPLIED
+  priority CDATA #IMPLIED>
+ <!ELEMENT SystemBuild (option* | target+ | targetList+ | list+ | configuration+)*>
+ <!ATTLIST SystemBuild schema CDATA #REQUIRED>
+ <!ELEMENT list (ref+)>
+ <!ATTLIST list
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT ref EMPTY>
+ <!ATTLIST ref item CDATA #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N ) #REQUIRED>
+ <!ELEMENT configuration (listRef+ | ref+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task (listRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT listRef EMPTY>
+ <!ATTLIST listRef list CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N ) #REQUIRED
+  targetParallel (Y | N ) "N">
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  root CDATA #IMPLIED
+  command CDATA #REQUIRED>
+]>
+<SystemDefinition name="system_definition_2_0_0" schema="2.0.0">
+</SystemDefinition>
\ No newline at end of file
Binary file buildframework/helium/tools/common/java/lib/nokia_ant.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/Antlib.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,169 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+/* * Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+
+package com.nokia.ant;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.ComponentHelper;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.helper.ProjectHelper2;
+import org.apache.tools.ant.UnknownElement;
+
+import org.apache.tools.ant.taskdefs.*;
+
+/**
+ * Antlib task. It does not
+ * occur in an ant build file. It is the root element
+ * an antlib xml file.
+ * @ant.task ignore="true"
+ * @since Ant 1.6
+ */
+public class Antlib extends Task implements TaskContainer {
+    //
+    // Static
+    //
+
+    /** The name of this task */
+    public static final String TAG = "antlib";
+    
+    //
+    // Instance
+    //
+    private ClassLoader classLoader;
+    private String      uri = "";
+    private List  tasks = new ArrayList();
+    
+    /**
+     * Static method to read an ant lib definition from
+     * a url.
+     *
+     * @param project   the current project
+     * @param antlibUrl the url to read the definitions from
+     * @param uri       the uri that the antlib is to be placed in
+     * @return   the ant lib task
+     */
+    public static Antlib createAntlib(final Project project, final URL antlibUrl,
+                                      final String uri) {
+        // Check if we can contact the URL
+        try {
+            antlibUrl.openConnection().connect();
+        } catch (IOException ex) {
+            throw new BuildException(
+                "Unable to find " + antlibUrl, ex);
+        }
+        ComponentHelper helper =
+            ComponentHelper.getComponentHelper(project);
+        helper.enterAntLib(uri);
+        try {
+            // Should be safe to parse
+            ProjectHelper2 parser = new ProjectHelper2();
+            UnknownElement ue =
+                parser.parseUnknownElement(project, antlibUrl);
+            // Check name is "antlib"
+            if (!(ue.getTag().equals(TAG))) {
+                throw new BuildException(
+                    "Unexpected tag " + ue.getTag() + " expecting "
+                    + TAG, ue.getLocation());
+            }
+            Antlib antlib = new Antlib();
+            antlib.setProject(project);
+            antlib.setLocation(ue.getLocation());
+            antlib.setTaskName("antlib");
+            antlib.init();
+            ue.configure(antlib);
+            return antlib;
+        } finally {
+            helper.exitAntLib();
+        }
+    }
+
+    /**
+     * Set the class loader for this antlib.
+     * This class loader is used for any tasks that
+     * derive from Definer.
+     *
+     * @param classLoader the class loader
+     */
+    protected final void setClassLoader(final ClassLoader classLoader) 
+    {
+        this.classLoader = classLoader;
+    }
+
+    /**
+     * Set the URI for this antlib.
+     * @param uri the namespace uri
+     */
+    protected final void  setURI(final String uri) 
+    {
+        this.uri = uri;
+    }
+
+    private ClassLoader getClassLoader() {
+        if (classLoader == null) {
+            classLoader = Antlib.class.getClassLoader();
+        }
+        return classLoader;
+    }
+
+    /**
+     * add a task to the list of tasks
+     *
+     * @param nestedTask Nested task to execute in antlib
+     */
+    public final void addTask(final Task nestedTask) {
+        tasks.add(nestedTask);
+    }
+
+    /**
+     * Execute the nested tasks, setting the classloader for
+     * any tasks that derive from Definer.
+     */
+    public final void execute() {
+        for (Iterator i = tasks.iterator(); i.hasNext();) {
+            UnknownElement ue = (UnknownElement) i.next();
+            setLocation(ue.getLocation());
+            ue.maybeConfigure();
+            Object configuredObject = ue.getRealThing();
+            if (configuredObject == null) {
+                continue;
+            }
+            if (!(configuredObject instanceof AntlibDefinition)) {
+                throw new BuildException(
+                    "Invalid task in antlib " + ue.getTag()
+                    + " " + configuredObject.getClass() + " does not "
+                    + "extend org.apache.tools.ant.taskdefs.AntlibDefinition");
+            }
+            AntlibDefinition def = (AntlibDefinition) configuredObject;
+            def.setURI(uri);
+            def.setAntlibClassLoader(getClassLoader());
+            def.init();
+            def.execute();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/BSFJepEngine.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant;
+
+import java.io.*;
+import org.apache.bsf.BSFException;
+import org.apache.bsf.BSFManager;
+
+/**
+ * Override default implementation to support source with are not files.
+ * 
+ * @author Helium Team
+ * @see jep.BSFJepEngine
+ */
+public class BSFJepEngine extends jep.BSFJepEngine
+{
+
+    static
+    {
+        BSFManager.registerScriptingEngine("jep", "com.nokia.ant.BSFJepEngine", new String[]
+        { "py" });
+    }
+
+    /**
+     * Execute a script.
+     * 
+     * @param source
+     *            a <code>String</code> value
+     * @param lineNo
+     *            an <code>int</code> value
+     * @param columnNo
+     *            an <code>int</code> value
+     * @param script
+     *            an <code>Object</code> value
+     * @exception BSFException
+     *                if an error occurs
+     */
+    public final void exec(final String source, final int lineNo, final int columnNo, final Object script) throws BSFException
+    {
+        boolean deleteTemp = false;
+        File file = null;
+        try
+        {
+            file = new File(script.toString());
+            if (file.exists() && file.isFile())
+            {
+                super.exec(source, lineNo, columnNo, script);
+            }
+            else
+            {
+                deleteTemp = true;
+                file = File.createTempFile("helium", null);
+                PrintWriter output = new PrintWriter(new FileOutputStream(file));
+                output.write(script.toString());
+                output.close();
+                super.exec(source, lineNo, columnNo, file.getAbsolutePath());
+            }
+        }
+        catch (Exception e)
+        {
+            throw new BSFException(BSFException.REASON_EXECUTION_ERROR, e.toString(), e);
+        }
+        finally
+        {
+            terminate();
+            if (deleteTemp && file != null && file.exists()) {
+                file.delete();
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/BuildStatusDef.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,334 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant;
+
+
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.types.*;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.log4j.Logger;
+
+import java.util.Iterator;
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.util.List;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import org.dom4j.Document;
+import org.dom4j.Node;
+import org.dom4j.Comment;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.dom4j.Visitor;
+import org.dom4j.VisitorSupport;
+
+/**
+ * Class to store the status of the signal of a particular target.
+ */
+public class BuildStatusDef extends HlmPostDefImpl
+{
+    private Logger log;
+    private HashSet<String> output = new HashSet<String>();
+    
+    public BuildStatusDef() {
+        log = Logger.getLogger(BuildStatusDef.class);    
+    }
+    
+    public void execute(Project prj, String module, String[] targetNames)
+    {
+        //Run after targets execute so dynamic target names are resolved
+        for (int i = 0; i < targetNames.length; i++)
+        {
+            String[] array = { targetNames[i] };
+            Target target = findTarget(targetNames[i], project, array);
+            targetCallsHeliumTarget(target, project);
+        }
+        checkTargetsProperties(project);
+        
+        if (!output.isEmpty())
+        {
+            System.out.println("*** Configuration report ***");
+            for (String x : output)
+                System.out.println(x);
+        }
+    }
+    
+        /**
+     * @param desiredTarget
+     *            Target name to search
+     * @param project
+     *            Object of the project
+     * @param targetNames
+     *            Array of target names
+     * 
+     */
+    public Target findTarget(String desiredTarget, Project project, String[] targetNames)
+    {
+        Hashtable targets;
+        Vector sorted;
+        Target t = new Target();
+        boolean matchFound = false;
+
+        // get all targets of the current project
+        targets = project.getTargets();
+
+        // sort all targets of the current project
+        sorted = project.topoSort(targetNames[0], targets);
+
+        // Find the desiredTarget Target object
+        for (int i = 0; i < sorted.size(); i++)
+        {
+            t = (Target) sorted.get(i);
+            if (t.getName().equals(desiredTarget))
+            {
+                matchFound = true;
+                break;
+            }
+        }
+        if (matchFound)
+        {
+            return t;
+        }
+        else
+        {
+            throw new BuildException("Could not find target matching " + desiredTarget + "\n");
+        }
+    }
+    
+     /**
+     * If a target defined outside helium are calling a private Helium target then print warning
+     * 
+     */
+    public void targetCallsHeliumTarget(Target target, Project project)
+    {        
+        String location = target.getLocation().getFileName();
+        
+        try {
+        String heliumpath = new File(project.getProperty("helium.dir")).getCanonicalPath();
+        String targetpath = new File(location).getCanonicalPath();
+        
+        if (!targetpath.contains(heliumpath))
+        {   
+            ArrayList antcallTargets = new ArrayList();
+            Visitor visitorTarget = new AntTargetVisitor(antcallTargets, project);
+            
+            Element element = findTargetElement(target, project);
+            if (element != null)
+                element.accept(visitorTarget);
+            for (Iterator iterator = antcallTargets.iterator(); iterator.hasNext();)
+            {
+                String depTargetString = (String) iterator.next();
+                String[] array = { depTargetString };
+                try {
+                Target depTarget = findTarget(depTargetString, project, array);
+                targetCallsHeliumTarget(depTarget, project);
+                } catch (BuildException x) { 
+                    x = null;
+                    }
+            }
+            
+          
+            for (Enumeration e = target.getDependencies(); e.hasMoreElements();)
+            {
+                String depTargetString = (String) e.nextElement();
+                String[] array = { depTargetString };
+                try {
+                Target depTarget = findTarget(depTargetString, project, array);
+                targetCallsHeliumTarget(depTarget, project);
+                } catch (BuildException x) { 
+                    x = null;
+                    }
+            }
+        }
+        else
+        {
+            checkIfTargetPrivate(target, project);
+        }
+
+        } catch (Exception e) { e.printStackTrace(); }
+    }
+
+    private class AntTargetVisitor extends VisitorSupport
+    {
+        private List targetList;
+        private Project project;
+
+        public AntTargetVisitor(List targetList, Project project)
+        {
+            this.targetList = targetList;
+            this.project = project;
+        }
+
+        public void visit(Element node)
+        {
+            String name = node.getName();
+            if (name.equals("antcall") || name.equals("runtarget"))
+            {
+                String text = node.attributeValue("target");
+                extractTarget(text);
+            }
+        }
+
+        private void extractTarget(String text)
+        {
+            String iText = project.replaceProperties(text);
+            targetList.add(iText);
+        }
+
+    }
+
+    /**
+     * Find the xml Element for the target
+     * 
+     */      
+    public Element findTargetElement(Target target, Project project)
+    {
+        SAXReader xmlReader = new SAXReader();
+        
+        Document antDoc = null;
+        
+        String location = target.getLocation().getFileName();
+        
+        try {
+        File file = new File(location);
+        antDoc = xmlReader.read(file);
+        } catch (Exception e) { e.printStackTrace(); }
+          
+        String projectName = antDoc.valueOf("/project/@name");
+        for (Iterator iterator = antDoc.selectNodes("//target").iterator(); iterator.hasNext();)
+        {
+            Element e = (Element) iterator.next();
+
+            String targetName = e.attributeValue("name");
+            if (targetName.equals(target.getName()) || (projectName + "." + targetName).equals(target.getName()))
+                return e;
+        }
+        return null;
+    }
+    
+        /**
+     * If target has comment that says it is private them print warning
+     * 
+     */
+    public void checkIfTargetPrivate(Target target, Project project)
+    { 
+        Element targetElement = findTargetElement(target, project);
+        if (targetElement != null)
+        {
+            List children = targetElement.selectNodes("preceding-sibling::node()");
+            if (children.size() > 0)
+            {
+                // Scan past the text nodes, which are most likely whitespace
+                int index = children.size() - 1;
+                Node child = (Node) children.get(index);
+                while (index > 0 && child.getNodeType() == Node.TEXT_NODE)
+                {
+                    index--;
+                    child = (Node) children.get(index);
+                }
+    
+                // Check if there is a comment node
+                String commentText = null;
+                if (child.getNodeType() == Node.COMMENT_NODE)
+                {
+                    Comment macroComment = (Comment) child;
+                    commentText = macroComment.getStringValue().trim();
+                    //log(macroName + " comment: " + commentText, Project.MSG_DEBUG);
+                }
+    
+                if (commentText != null)
+                {
+                    if (commentText.contains("Private:"))
+                    {
+                        output.add("Warning: " + target.getName() + " is private and should only be called by helium");
+                    }
+                    if (commentText.contains("<deprecated>"))
+                    {
+                        output.add("Warning: " + target.getName() + "\n" + commentText);
+                    }
+                }
+            }
+        }
+    }
+    
+    public void checkTargetsProperties(Project project)
+    {
+        if (project.getProperty("data.model.file") != null)
+        {
+            SAXReader xmlReader = new SAXReader();
+            Document antDoc = null;
+            
+            ArrayList customerProps = getCustomerProperties(project);
+            
+            try {
+            File model = new File(project.getProperty("data.model.file"));
+            antDoc = xmlReader.read(model);
+            } catch (Exception e) { e.printStackTrace(); }
+            
+            List<Node> statements = antDoc.selectNodes("//property");
+            
+            for (Node statement : statements)
+            {
+                if (statement.valueOf("editStatus").equals("never"))
+                {
+                    if (customerProps.contains(statement.valueOf("name")))
+                    {
+                        output.add("Warning: " + statement.valueOf("name") + " property has been overridden");
+                    }
+                }
+            }
+        }
+    }
+    
+    public ArrayList getCustomerProperties(Project project)
+    {
+        ArrayList props = new ArrayList();
+        Database db = new Database(null, null, null);
+        try {
+        String heliumpath = new File(project.getProperty("helium.dir")).getCanonicalPath();
+        
+        for (Object o : db.getAntFiles(project))
+        {
+            String antFile = (String)o;
+            antFile = new File(antFile).getCanonicalPath();
+            
+            if (!antFile.contains(heliumpath))
+            {
+                SAXReader xmlReader = new SAXReader();
+                Document antDoc = xmlReader.read(new File(antFile));
+                
+                List propertyNodes = antDoc.selectNodes("//property | //param");
+                for (Iterator iterator = propertyNodes.iterator(); iterator.hasNext();)
+                {
+                    Element propertyNode = (Element) iterator.next();
+                    String propertyName = propertyNode.attributeValue("name");
+                    props.add(propertyName);
+                }
+            }
+        }
+        } catch (Exception e) { e.printStackTrace(); }
+          
+        return props;
+    }
+    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/Database.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,904 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant;
+
+import info.bliki.wiki.model.WikiModel;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.*;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.types.resources.FileResource;
+
+import org.dom4j.Attribute;
+import org.dom4j.CDATA;
+import org.dom4j.Comment;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.Text;
+import org.dom4j.Visitor;
+import org.dom4j.VisitorSupport;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+import org.dom4j.XPath;
+
+/**
+ * Reads the current ant project and a fileset and generates a xml file with a summary of targets,
+ * macros and properties.
+ */
+public class Database
+{
+    private Project project;
+    private ResourceCollection rc;
+    private Task task;
+    private boolean debug;
+    private boolean homeFilesOnly = true;
+    private HashMap<String, List<String>> globalSignalList = new HashMap<String, List<String>>();
+    private HashMap map = new HashMap();
+    private Document signaldoc;
+
+    public Database(Project project, ResourceCollection rc, Task task)
+    {
+        this.project = project;
+        this.rc = rc;
+        this.task = task;
+        map.put("hlm", "http://www.nokia.com/helium");
+    }
+
+    public Project getProject() {
+        return project;
+    }
+    
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+    
+    public void setHomeFilesOnly(boolean homeFilesOnly) {
+        this.homeFilesOnly = homeFilesOnly;
+    }
+    
+    public void log(String msg, int level) {
+        if (task != null) {
+            task.log(msg, level);
+        } else if (debug) {            
+            System.out.println(msg);
+        }
+    }
+
+
+    public void setRefid(Reference r)
+    {
+        Object o = r.getReferencedObject();
+        if (!(o instanceof ResourceCollection))
+        {
+            throw new BuildException(r.getRefId() + " doesn\'t denote a ResourceCollection");
+        }
+        rc = (ResourceCollection) o;
+    }
+
+    public Document createDOM() throws Exception
+    {        
+        //log("Building Ant project database", Project.MSG_DEBUG);
+        Element root = DocumentHelper.createElement("antDatabase");
+        Document outDoc = DocumentHelper.createDocument(root);
+        ArrayList antFiles = getAntFiles(getProject(), homeFilesOnly);
+        Iterator antFilesIter = antFiles.iterator();
+        while (antFilesIter.hasNext())
+        {
+            String antFile = (String) antFilesIter.next();
+            readSignals(root, antFile);
+        }
+        antFilesIter = antFiles.iterator();
+        while (antFilesIter.hasNext())
+        {
+            String antFile = (String) antFilesIter.next();
+            parseAntFile(root, antFile);
+        }
+        return outDoc;
+    }
+    
+    public void createXMLFile(File outputFile) {
+        try {
+            Document outDoc = createDOM();
+            OutputStream outStream = System.out;
+            if (outputFile != null) {
+                outStream = new FileOutputStream(outputFile);
+            }
+            XMLWriter out = new XMLWriter(outStream, OutputFormat.createPrettyPrint());
+            out.write(outDoc);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
+        }
+    }
+    
+    private void readSignals(Element root, String antFile) throws DocumentException, IOException
+    {
+        SAXReader xmlReader = new SAXReader();
+        Document antDoc = xmlReader.read(new File(antFile));
+        
+        XPath xpath = DocumentHelper.createXPath("//hlm:signalConfig");
+        xpath.setNamespaceURIs(map);
+        
+        List signalNodes = xpath.selectNodes(antDoc);
+        for (Iterator iterator = signalNodes.iterator(); iterator.hasNext();)
+        {
+            signaldoc = antDoc;
+            Element propertyNode = (Element) iterator.next();
+            String signalid = propertyNode.attributeValue("id");
+            
+            String signaltarget = signalName(signalid, signaldoc);
+            List existinglist = globalSignalList.get(signaltarget);
+            String failbuild = signalType(signalid, signaldoc);
+            if (existinglist == null)
+                existinglist = new ArrayList<String>();
+            existinglist.add(signalid + "," + failbuild);
+            globalSignalList.put(signaltarget, existinglist);
+        }
+        
+        xpath = DocumentHelper.createXPath("//hlm:signalListenerConfig");
+        xpath.setNamespaceURIs(map);
+        signalNodes = xpath.selectNodes(antDoc);
+        for (Iterator iterator = signalNodes.iterator(); iterator.hasNext();)
+        {
+            signaldoc = antDoc;
+            Element propertyNode = (Element) iterator.next();
+            String signalid = propertyNode.attributeValue("id");
+            
+            String signaltarget = propertyNode.attributeValue("target");
+            List existinglist = globalSignalList.get(signaltarget);
+            String failbuild = signalType(signalid, signaldoc);
+            if (existinglist == null)
+                existinglist = new ArrayList<String>();
+            existinglist.add(signalid + "," + failbuild);
+            globalSignalList.put(signaltarget, existinglist);
+        }
+    }
+    
+    private String signalName(String signalid, Document antDoc)
+    {
+        XPath xpath = DocumentHelper.createXPath("//hlm:signalConfig[@id='" + signalid + "']/hlm:targetCondition");
+        xpath.setNamespaceURIs(map);
+        List signalNodes2 = xpath.selectNodes(antDoc);
+
+        for (Iterator iterator2 = signalNodes2.iterator(); iterator2.hasNext();)
+        {
+            Element propertyNode2 = (Element) iterator2.next();
+            return propertyNode2.attributeValue("name");
+        }
+        return null;
+    }
+    
+    private String signalType(String signalid, Document antDoc)
+    {
+        XPath xpath2 = DocumentHelper.createXPath("//hlm:signalConfig[@id='" + signalid + "']/hlm:inputRef|//hlm:signalListenerConfig[@id='" + signalid + "']/signalNotifierInput/signalInput");
+        xpath2.setNamespaceURIs(map);
+        List signalNodes3 = xpath2.selectNodes(antDoc);
+        
+        for (Iterator iterator3 = signalNodes3.iterator(); iterator3.hasNext();)
+        {
+            Element propertyNode3 = (Element) iterator3.next();
+            String signalinputid = propertyNode3.attributeValue("refid");
+            
+            XPath xpath3 = DocumentHelper.createXPath("//hlm:signalInput[@id='" + signalinputid + "']");
+            xpath3.setNamespaceURIs(map);
+            List signalNodes4 = xpath3.selectNodes(antDoc);
+            for (Iterator iterator4 = signalNodes4.iterator(); iterator4.hasNext();)
+            {
+                Element propertyNode4 = (Element) iterator4.next();
+                return propertyNode4.attributeValue("failbuild");
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * @param root
+     * @param antFile
+     * @throws DocumentException
+     * @throws IOException
+     */
+    private void parseAntFile(Element root, String antFile) throws DocumentException, IOException
+    {
+        log("Processing Ant file: " + antFile, Project.MSG_DEBUG);
+        SAXReader xmlReader = new SAXReader();
+        Document antDoc = xmlReader.read(new File(antFile));
+
+        // Element targetElement =
+        // DocumentHelper.createElement("target");
+        Element projectElement = root.addElement("project");
+        Element nameElement = projectElement.addElement("name");
+        String projectName = antDoc.valueOf("/project/@name");
+
+        nameElement.setText(projectName);
+        // Element descriptionElement =
+        // projectElement.addElement("description");
+
+        String description = antDoc.valueOf("/project/description");
+        insertDocumentation(projectElement, description);
+
+        // descriptionElement.setText(description);
+
+        if (!antFile.contains("antlib.xml") && description.equals(""))
+        {
+            log("Project has no comment: " + projectName, Project.MSG_WARN);
+        }
+
+        Element defaultElement = projectElement.addElement("default");
+        defaultElement.setText(antDoc.valueOf("/project/@default"));
+
+        // Project import statements
+        List importNodes = antDoc.selectNodes("//import");
+        for (Iterator iterator = importNodes.iterator(); iterator.hasNext();)
+        {
+            Element importCurrentNode = (Element) iterator.next();
+            addTextElement(projectElement, "fileDependency", importCurrentNode
+                    .attributeValue("file"));
+        }
+
+        projectElement.addElement("pythonDependency");
+
+        // Project exec statements
+        List execNodes = antDoc.selectNodes("//exec//arg");
+        for (Iterator iterator = execNodes.iterator(); iterator.hasNext();)
+        {
+            Element argNode = (Element) iterator.next();
+            String argValue = argNode.attributeValue("value");
+            
+            if (argValue == null)
+                argValue = argNode.attributeValue("line");
+            
+            if (argValue != null)
+            {
+                Pattern filePattern = Pattern.compile(".pl|.py|.bat|.xml|.txt");
+                Matcher fileMatcher = filePattern.matcher(argValue);
+                if (fileMatcher.find())
+                {
+                    addTextElement(projectElement, "fileDependency", argValue);
+                }
+            }
+        }
+
+        List targetNodes = antDoc.selectNodes("//target");
+        for (Iterator iterator = targetNodes.iterator(); iterator.hasNext();)
+        {
+            Element targetNode = (Element) iterator.next();
+            processTarget(targetNode, projectElement);
+        }
+
+        // Process macrodef and scriptdef tasks
+        // TODO - maybe scriptdefs should be separate?
+        List macroNodes = antDoc.selectNodes("//macrodef | //scriptdef");
+        for (Iterator iterator = macroNodes.iterator(); iterator.hasNext();)
+        {
+            Element macroNode = (Element) iterator.next();
+            processMacro(macroNode, projectElement, antFile);
+        }
+
+        // Project properties
+        List propertyNodes = antDoc.selectNodes("//property");
+        for (Iterator iterator = propertyNodes.iterator(); iterator.hasNext();)
+        {
+            Element propertyNode = (Element) iterator.next();
+            processProperty(propertyNode, projectElement);
+        }
+    }
+
+    public ArrayList getAntFiles()
+    {
+        return getAntFiles(getProject(), true);
+    }
+    
+    public ArrayList getAntFiles(Project project)
+    {
+        return getAntFiles(project, true);
+    }
+
+    /**
+     * Get the list of all Ant files we want to process. These can be project
+     * and antlib files.
+     * 
+     * @return antFiles a list of ant files to be processed
+     */
+    public ArrayList getAntFiles(Project project, boolean homeOnly)
+    {
+        ArrayList antFiles = new ArrayList();
+
+        Map targets = project.getTargets();
+        Iterator targetsIter = targets.values().iterator();
+        
+        String projectHome = null;
+        try {
+            projectHome = new File(project.getProperty("helium.dir")).getCanonicalPath();
+          
+            while (targetsIter.hasNext())
+            {
+                Target target = (Target) targetsIter.next();
+                String projectPath = new File(target.getLocation().getFileName()).getCanonicalPath();
+                
+                if (!antFiles.contains(projectPath))
+                {
+                    if (homeOnly)
+                    {
+                        if (!projectPath.contains(projectHome))
+                        {
+                            antFiles.add(projectPath);
+                        }
+                    }
+                    else
+                        antFiles.add(projectPath);
+                }
+            }
+    
+            if (rc != null)
+            {
+                Iterator extraFilesIter = rc.iterator();
+                while (extraFilesIter.hasNext())
+                {
+                    FileResource f = (FileResource) extraFilesIter.next();
+                    String extrafile = f.getFile().getCanonicalPath();
+                    
+                    if (!antFiles.contains(f.toString()) && !f.getFile().getName().startsWith("test_"))
+                    {
+                        if (homeOnly)
+                        {
+                            if (!extrafile.contains(projectHome))
+                            {
+                                antFiles.add(extrafile);
+                            }
+                        }
+                        else
+                            antFiles.add(extrafile);
+                    }
+                }
+            }
+        
+        } catch (Exception e) { e.printStackTrace(); }
+        return antFiles;
+    }
+
+    private void processMacro(Element macroNode, Element outProjectNode, String antFile)
+            throws IOException, DocumentException
+    {
+        String macroName = macroNode.attributeValue("name");
+        log("Processing macro: " + macroName, Project.MSG_DEBUG);
+
+        Element outmacroNode = outProjectNode.addElement("macro");
+        addTextElement(outmacroNode, "name", macroNode.attributeValue("name"));
+        addTextElement(outmacroNode, "description", macroNode.attributeValue("description"));
+
+        // Add location
+        // Project project = getProject();
+        // Macro antmacro = (Macro) project.getTargets().get(macroName);
+        // System.out.println(project.getMacroDefinitions());
+        // System.out.println(macroName);
+        // MacroInstance antmacro = (MacroInstance)
+        // project.getMacroDefinitions().get("http://www.nokia.com/helium:" +
+        // macroName);
+
+        // Add the location with just the file path for now and a dummy line
+        // number.
+        // TODO - Later we should find the line number from the XML input.
+        addTextElement(outmacroNode, "location", antFile + ":1:");
+        
+        List<Node> statements = macroNode.selectNodes("//scriptdef[@name='" + macroName + "']/attribute | //macrodef[@name='" + macroName + "']/attribute");
+        String usage = "";
+        for (Node statement : statements)
+        {
+            String defaultval = statement.valueOf("@default");
+            if (defaultval.equals(""))
+                defaultval = "value";
+            else
+                defaultval = "<i>" + defaultval + "</i>";
+            usage = usage + " " + statement.valueOf("@name") + "=\"" + defaultval + "\"";
+        }
+        
+        String macroElements = "";
+        statements = macroNode.selectNodes("//scriptdef[@name='" + macroName + "']/element | //macrodef[@name='" + macroName + "']/element");
+        for (Node statement : statements)
+        {
+            macroElements = "&lt;" + statement.valueOf("@name") + "/&gt;\n" + macroElements;
+        }
+        if (macroElements.equals(""))
+            addTextElement(outmacroNode, "usage", "&lt;hlm:" + macroName + " " + usage + "/&gt;");
+        else
+            addTextElement(outmacroNode, "usage", "&lt;hlm:" + macroName + " " + usage + "&gt;\n" + macroElements + "&lt;/hlm:" + macroName + "&gt;");
+        
+        
+        // Add dependencies
+        // Enumeration dependencies = antmacro.getDependencies();
+        // while (dependencies.hasMoreElements())
+        // {
+        // String dependency = (String) dependencies.nextElement();
+        // Element dependencyElement = addTextElement(outmacroNode,
+        // "dependency", dependency);
+        // dependencyElement.addAttribute("type","direct");
+        // }
+
+        callAntTargetVisitor(macroNode, outmacroNode, outProjectNode);
+
+        // Add documentation
+        // Get comment element before the macro element to extract macro doc
+        List children = macroNode.selectNodes("preceding-sibling::node()");
+        if (children.size() > 0)
+        {
+            // Scan past the text nodes, which are most likely whitespace
+            int index = children.size() - 1;
+            Node child = (Node) children.get(index);
+            while (index > 0 && child.getNodeType() == Node.TEXT_NODE)
+            {
+                index--;
+                child = (Node) children.get(index);
+            }
+
+            // Check if there is a comment node
+            String commentText = null;
+            if (child.getNodeType() == Node.COMMENT_NODE)
+            {
+                Comment macroComment = (Comment) child;
+                commentText = macroComment.getStringValue().trim();
+                log(macroName + " comment: " + commentText, Project.MSG_DEBUG);
+            }
+            else
+            {
+                log("Macro has no comment: " + macroName, Project.MSG_WARN);
+            }
+
+            insertDocumentation(outmacroNode, commentText);
+
+            Node previousNode = (Node) children.get(children.size() - 1);
+        }
+
+        // Get names of all properties used in this macro
+        ArrayList properties = new ArrayList();
+        Visitor visitor = new AntPropertyVisitor(properties);
+        macroNode.accept(visitor);
+        for (Iterator iterator = properties.iterator(); iterator.hasNext();)
+        {
+            String property = (String) iterator.next();
+            addTextElement(outmacroNode, "propertyDependency", property);
+        }
+    }
+    
+    private void callAntTargetVisitor(Element targetNode, Element outTargetNode, Element outProjectNode)
+    {
+        // Add antcall/runtarget dependencies
+        ArrayList antcallTargets = new ArrayList();
+        ArrayList<String> logs = new ArrayList<String>();
+        ArrayList<String> signals = new ArrayList<String>();
+        ArrayList<String> executables = new ArrayList<String>();
+        Visitor visitorTarget = new AntTargetVisitor(antcallTargets, logs, signals, executables);
+        targetNode.accept(visitorTarget);
+        for (Iterator iterator = antcallTargets.iterator(); iterator.hasNext();)
+        {
+            String antcallTarget = (String) iterator.next();
+            Element dependencyElement = addTextElement(outTargetNode, "dependency", antcallTarget);
+            dependencyElement.addAttribute("type", "exec");
+        }
+        
+        for (String log : logs)
+        {
+            addTextElement(outTargetNode, "log", log);
+        }
+        
+        if (globalSignalList.get(targetNode.attributeValue("name")) != null)
+            signals.addAll(globalSignalList.get(targetNode.attributeValue("name")));
+        
+        for (String signal : signals)
+        {
+            addTextElement(outTargetNode, "signal", signal);
+        }
+        
+        for (String executable : executables)
+        {
+            addTextElement(outTargetNode, "executable", executable);
+        }
+    }
+    
+    private void processTarget(Element targetNode, Element outProjectNode) throws IOException, DocumentException
+    {
+        String targetName = targetNode.attributeValue("name");
+        log("Processing target: " + targetName, Project.MSG_DEBUG);
+
+        // Add documentation
+        // Get comment element before the target element to extract target doc
+        String commentText = "";
+        List children = targetNode.selectNodes("preceding-sibling::node()");
+        if (children.size() > 0)
+        {
+            // Scan past the text nodes, which are most likely whitespace
+            int index = children.size() - 1;
+            Node child = (Node) children.get(index);
+            while (index > 0 && child.getNodeType() == Node.TEXT_NODE)
+            {
+                index--;
+                child = (Node) children.get(index);
+            }
+
+            // Check if there is a comment node
+            if (child.getNodeType() == Node.COMMENT_NODE)
+            {
+                Comment targetComment = (Comment) child;
+                commentText = targetComment.getStringValue().trim();
+                
+                log(targetName + " comment: " + commentText, Project.MSG_DEBUG);
+            }
+            else
+            {
+                log("Target has no comment: " + targetName, Project.MSG_WARN);
+            }
+
+            Node previousNode = (Node) children.get(children.size() - 1);
+        }
+        
+        if (!commentText.contains("Private:"))
+        {
+            Element outTargetNode = outProjectNode.addElement("target");
+            
+            addTextElement(outTargetNode, "name", targetNode.attributeValue("name"));
+            addTextElement(outTargetNode, "ifDependency", targetNode.attributeValue("if"));
+            addTextElement(outTargetNode, "unlessDependency", targetNode.attributeValue("unless"));
+            addTextElement(outTargetNode, "description", targetNode.attributeValue("description"));
+            addTextElement(outTargetNode, "tasks", String.valueOf(targetNode.elements().size()));
+    
+            // Add location
+            Project project = getProject();
+            Target antTarget = (Target) project.getTargets().get(targetName);
+            
+            if (antTarget == null)
+                return;
+            
+            addTextElement(outTargetNode, "location", antTarget.getLocation().toString());
+    
+            // Add dependencies
+            Enumeration dependencies = antTarget.getDependencies();
+            while (dependencies.hasMoreElements())
+            {
+                String dependency = (String) dependencies.nextElement();
+                Element dependencyElement = addTextElement(outTargetNode, "dependency", dependency);
+                dependencyElement.addAttribute("type", "direct");
+            }
+            
+            callAntTargetVisitor(targetNode, outTargetNode, outProjectNode);
+            
+            // Process the comment text as MediaWiki syntax and convert to HTML
+            insertDocumentation(outTargetNode, commentText);
+    
+            // Get names of all properties used in this target
+            ArrayList properties = new ArrayList();
+            Visitor visitor = new AntPropertyVisitor(properties);
+            targetNode.accept(visitor);
+            for (Iterator iterator = properties.iterator(); iterator.hasNext();)
+            {
+                String property = (String) iterator.next();
+                addTextElement(outTargetNode, "propertyDependency", property);
+            }
+            
+            // Add the raw XML content of the element
+            String targetXml = targetNode.asXML();
+            // Replace the CDATA end notation to avoid nested CDATA sections
+            targetXml = targetXml.replace("]]>", "] ]>");
+            
+            addTextElement(outTargetNode, "source", targetXml, true);
+        }
+    }
+
+    private void processProperty(Element propertyNode, Element outProjectNode) throws IOException
+    {
+        String propertyName = propertyNode.attributeValue("name");
+        log("Processing Property: " + propertyName, Project.MSG_DEBUG);
+
+        Element outPropertyNode = outProjectNode.addElement("property");
+        addTextElement(outPropertyNode, "name", propertyNode.attributeValue("name"));
+        if (propertyNode.attributeValue("value") == null)
+        {
+            addTextElement(outPropertyNode, "defaultValue", propertyNode.attributeValue("location"));
+        }
+        else
+        {
+            addTextElement(outPropertyNode, "defaultValue", propertyNode.attributeValue("value"));
+        }
+    }
+
+    private void insertDocumentation(Element outNode, String commentText) throws IOException, DocumentException
+    {
+        if (commentText != null)
+        {
+            WikiModel wikiModel = new WikiModel("", "");
+            if (!commentText.contains("</pre>") && (commentText.contains("**") || commentText.contains("==") || commentText.contains("- -")))
+            {
+                commentText = commentText.replace("**", "").replace("==", "").replace("- -", "").trim();
+                log("Warning: Comment code has invalid syntax: " + commentText, Project.MSG_WARN);
+            }
+            if (commentText.startsWith("-"))
+                commentText = commentText.replace("-", "");
+            commentText = commentText.trim();
+            
+            String commentTextCheck = commentText.replace("deprecated>", "").replace("tt>", "").replace("todo>", "");
+            if (commentTextCheck.contains(">") && !commentTextCheck.contains("</pre>"))
+                log("Warning: Comment code needs <pre> tags around it: " + commentText, Project.MSG_WARN);
+            
+            commentText = filterTextNewlines(commentText);
+            commentText = wikiModel.render(commentText);
+
+            // If <deprecated> tag exists in the comment, then parse the
+            // deprecated message.
+            if (commentText.indexOf("&#60;deprecated&#62;") != -1)
+            {
+                int deprecatedMsgStart = commentText.indexOf("&#60;deprecated&#62;") + 20;
+                int deprecatedMsgEnd = commentText.indexOf("&#60;/deprecated&#62;");
+
+                // Add deprecated element.
+                String deprecatedMsg = commentText.substring(deprecatedMsgStart, deprecatedMsgEnd);
+                addTextElement(outNode, "deprecated", deprecatedMsg);
+
+                // remove <deprecated> part from description field.
+                int commentTextLength = commentText.length();
+                String documentationMsgStart = commentText.substring(1, deprecatedMsgStart - 20);
+                String documentationMsgEnd = commentText.substring(deprecatedMsgEnd + 21,
+                        commentTextLength);
+                String documentationMsg = documentationMsgStart.concat(documentationMsgEnd);
+                commentText = documentationMsg.trim();
+            }
+        }
+        else
+        {
+            commentText = "";
+        }
+        // Get the documentation element as a document
+        String documentationText = "<documentation>" + commentText +
+                                    "</documentation>";
+        Document docDoc = DocumentHelper.parseText(documentationText);
+        outNode.add(docDoc.getRootElement());
+        log("HTML comment: " + commentText, Project.MSG_DEBUG);
+    }
+
+    private Element addTextElement(Element parent, String name, String text)
+    {
+        Element element = addTextElement(parent, name, text, false);
+
+        return element;
+    }
+
+    private Element addTextElement(Element parent, String name, String text, boolean escape)
+    {
+        Element element = parent.addElement(name);
+        if (text != null)
+        {
+            if (escape)
+            {
+                element.addCDATA(text);
+            }
+            else
+            {
+                element.setText(text);
+            }
+        }
+        return element;
+    }
+
+    private String filterTextNewlines(String text) throws IOException
+    {
+        BufferedReader in = new BufferedReader(new StringReader(text));
+        StringBuilder out = new StringBuilder();
+        String line = in.readLine();
+        while (line != null)
+        {
+            out.append(line.trim());
+            out.append("\n");
+            line = in.readLine();
+        }
+        return out.toString();
+    }
+
+    private class AntPropertyVisitor extends VisitorSupport
+    {
+        private List propertyList;
+
+        public AntPropertyVisitor(List propertyList)
+        {
+            this.propertyList = propertyList;
+        }
+
+        public void visit(Attribute node)
+        {
+            String text = node.getStringValue();
+            extractUsedProperties(text);
+        }
+
+        public void visit(CDATA node)
+        {
+            String text = node.getText();
+            extractUsedProperties(text);
+        }
+
+        public void visit(Text node)
+        {
+            String text = node.getText();
+            extractUsedProperties(text);
+        }
+        
+        public void visit(Element node)
+        {
+            if (node.getName().equals("property"))
+            {
+                String propertyName = node.attributeValue("name");
+                if (!propertyList.contains(propertyName))
+                {
+                    propertyList.add(propertyName);
+                   log("property matches :" + propertyName, Project.MSG_DEBUG);
+                }
+            }
+        }
+
+        private void extractUsedProperties(String text)
+        {
+            Pattern p1 = Pattern.compile("\\$\\{([^@$}]*)\\}");
+            Matcher m1 = p1.matcher(text);
+            log(text, Project.MSG_DEBUG);
+            while (m1.find())
+            {
+                String group = m1.group(1);
+                if (!propertyList.contains(group))
+                {
+                    propertyList.add(group);
+                }
+                log("property matches: " + group, Project.MSG_DEBUG);
+            }
+
+            Pattern p2 = Pattern.compile("\\$\\{([^\n]*\\})\\}");
+            Matcher m2 = p2.matcher(text);
+            log(text, Project.MSG_DEBUG);
+            while (m2.find())
+            {
+                String group = m2.group(1);
+                if (!propertyList.contains(group))
+                {
+                    propertyList.add(group);
+                }
+                log("property matches: " + group, Project.MSG_DEBUG);
+            }
+
+            Pattern p3 = Pattern.compile("\\$\\{(\\@\\{[^\n]*)\\}");
+            Matcher m3 = p3.matcher(text);
+            log(text, Project.MSG_DEBUG);
+            while (m3.find())
+            {
+                String group = m3.group(1);
+                if (!propertyList.contains(group))
+                {
+                    propertyList.add(group);
+                }
+                log("property matches: " + group, Project.MSG_DEBUG);
+            }
+        }
+    }
+
+    private class AntTargetVisitor extends VisitorSupport
+    {
+        private List targetList;
+        private List logList;
+        private List signalList;
+        private List executableList;
+
+        public AntTargetVisitor(List targetList)
+        {
+            this.targetList = targetList;
+        }
+        
+        public AntTargetVisitor(List targetList, List logList, List signalList, List executableList)
+        {
+            this.targetList = targetList;
+            this.logList = logList;
+            this.signalList = signalList;
+            this.executableList = executableList;
+        }
+
+        public void visit(Element node)
+        {
+            String name = node.getName();
+            if (name.equals("antcall") || name.equals("runtarget"))
+            {
+                String text = node.attributeValue("target");
+                extractTarget(text);
+            }
+            
+            if (!name.equals("include") && !name.equals("exclude"))
+            {
+                String text = node.attributeValue("name");
+                addLog(text);
+                text = node.attributeValue("output");
+                addLog(text);
+                text = node.attributeValue("value");
+                addLog(text);
+                text = node.attributeValue("log");
+                addLog(text);
+                text = node.attributeValue("line");
+                addLog(text);
+                text = node.attributeValue("file");
+                addLog(text);
+            }
+            
+            if (name.equals("signal") || name.equals("execSignal"))
+            {
+                String signalid = getProject().replaceProperties(node.attributeValue("name"));
+                String failbuild = signalType(signalid, signaldoc);
+                
+                if (signalList != null)
+                {
+                    if (failbuild != null)
+                        signalList.add(signalid + "," + failbuild);
+                    else
+                        signalList.add(signalid);
+                }
+            }
+            
+            if (name.equals("exec") || name.equals("preset.exec"))
+            {
+                String text = node.attributeValue("executable");
+                executableList.add(text);
+                log("Executable: " + text, Project.MSG_DEBUG);
+            }
+        }
+        
+        private void addLog(String text)
+        {
+            if (text != null && logList != null)
+            {
+                for (String log : text.split(" "))
+                {
+                    String fulllogname = getProject().replaceProperties(log);
+                    if (!logList.contains(log) && (fulllogname.endsWith(".log") || fulllogname.endsWith(".html")))
+                    {
+                        log = log.replace("--log=", "");
+                        logList.add(log);
+                    }
+                }
+            }
+        }
+
+        private void extractTarget(String text)
+        {
+            String iText = getProject().replaceProperties(text);
+            targetList.add(iText);
+        }
+
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/HeliumLogger.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
+
+package com.nokia.ant;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.DataOutputStream;
+import java.io.PrintStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+import java.util.Hashtable;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tools.ant.DefaultLogger;
+
+/**
+ * Logger class that can connect to Ant and log information regarding to build
+ * times, number of errors and such. Data is sent to Diamonds server, where it
+ * is processed further.
+ * 
+ * This class is listening all build related events. It catches the build
+ * start-finish, target start-finish events of Ant and gather build start-end
+ * time, errors/warnings and store in BuildData class. Stored data will be
+ * exported to XML and uploaded to Diamonds server after each specific target.
+ * For example after target "create-bom" this class will upload all BOM data to
+ * Diamonds.
+ * 
+ * 
+ */
+public class HeliumLogger extends DefaultLogger {
+
+    private static boolean stopLogToConsole;
+
+    private Date endOfPreviousTarget;
+
+    private Project project;
+
+    private Log log = LogFactory.getLog(HeliumLogger.class);
+
+    private boolean isInitialized;
+
+    private String directory;
+
+    private SimpleDateFormat timeFormat;
+
+    private Date buildStartTime;
+
+    private Date buildEndTime;
+
+    private Date targetStartTime;
+
+    private Hashtable targetTable;
+
+    private Hashtable tempStartTime;
+
+    private StringBuffer allStages;
+
+    /**
+     * Ant call this function when bjuild start.
+     */
+    public void buildStarted(BuildEvent event) {
+        project = event.getProject();
+
+        // Record build start time
+        endOfPreviousTarget = new Date();
+        buildStartTime = new Date();
+        endOfPreviousTarget = new Date();
+
+        targetTable = new Hashtable();
+        tempStartTime = new Hashtable();
+
+        // For Stage start time
+        allStages = new StringBuffer("\t<stages>");
+
+        super.buildStarted(event);
+    }
+
+    /**
+     * Triggered when a target starts.
+     */
+    public void targetStarted(BuildEvent event) {
+        String targetName = event.getTarget().getName();
+        targetStartTime = new Date();
+
+        logTargetEvent(targetName, "start");
+
+        if (!isInitialized) {
+            initializeLogger();
+        }
+        if (isInitialized) {
+            // Record the target start time
+            tempStartTime.put(targetName, new Date());
+        }
+        super.targetStarted(event);
+    }
+
+    private void initializeLogger() {
+        directory = project.getProperty("build.log.dir");
+        isInitialized = true;
+    }
+
+    /**
+     * Log the start or end of the build as a event.
+     * 
+     * @param targetName
+     *            The name of the current target.
+     * @param event
+     *            A string description of the event.
+     */
+    private void logTargetEvent(String targetName, String event) {
+        String logTargetProperty = project.getProperty("log.target");
+        if ((logTargetProperty != null) && (logTargetProperty.equals("yes"))) {
+            log.info("Target #### " + targetName + " ####: " + event);
+        }
+    }
+
+    /**
+     * Triggered when a target finishes.
+     */
+    public void targetFinished(BuildEvent event) {
+        String targetName = event.getTarget().getName();
+
+        logTargetEvent(targetName, "finish");
+
+        logTargetTime(targetName);
+
+    }
+
+    private void logTargetTime(String targetName) {
+        Date targetFinishTime = new Date();
+        long targetLengthMSecs = targetFinishTime.getTime()
+                - targetStartTime.getTime();
+        Long outputSecs = TimeUnit.MILLISECONDS.toSeconds(targetLengthMSecs);
+        targetTable.put(outputSecs, targetName);
+    }
+
+    /**
+     * Triggered when the build finishes.
+     */
+    public void buildFinished(BuildEvent event) {
+        if (isInitialized) {
+            if (directory != null && new File(directory).exists()) {
+                try {
+                    // Log target times to file
+                    String timesLogFileName = directory + File.separator
+                            + "targetTimesLog.csv";
+                    File timesLogFile = new File(timesLogFileName);
+
+                    // Sort hashtable.
+                    Vector v = new Vector(targetTable.keySet());
+                    Collections.sort(v);
+
+                    FileOutputStream timesLogFileStream = new FileOutputStream(
+                            timesLogFileName, true);
+                    DataOutputStream timesLogOut = new DataOutputStream(
+                            timesLogFileStream);
+                    // Display (sorted) hashtable.
+                    for (Enumeration e = v.elements(); e.hasMoreElements();) {
+                        Long key = (Long) e.nextElement();
+                        String val = (String) targetTable.get(key);
+                        timesLogOut.writeBytes(val + "," + key.toString()
+                                + "\n");
+                    }
+                    timesLogOut.close();
+                } catch (Exception ex) {
+                    log.fatal("Exception has occurred", ex);
+                    ex.printStackTrace();
+                }
+            }
+            cleanup();
+        }
+        super.buildFinished(event);
+    }
+
+    /**
+     * See if build needs a final cleanup target to be called.
+     */
+    private void cleanup() {
+        String loggingoutputfile = project.getProperty("logging.output.file");
+        if (loggingoutputfile != null) {
+            File f = new File(loggingoutputfile);
+            if (f.exists()) {
+                f.delete();
+            }
+        }
+
+        if ((project.getProperty("call.cleanup") != null)
+                && (project.getProperty("call.cleanup").equals("yes"))) {
+            project.executeTarget("cleanup-all");
+        }
+    }
+
+    /**
+     * Get log to console status
+     */
+    public static boolean getStopLogToConsole() {
+        return stopLogToConsole;
+    }
+
+    /**
+     * Set log to console status
+     */
+    public static void setStopLogToConsole(boolean stop) {
+        stopLogToConsole = stop;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void printMessage(final String message, final PrintStream stream,
+            final int priority) {
+        if (!stopLogToConsole) {
+            stream.println(message);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/HelpDef.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant;
+
+import java.util.Iterator;
+
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.types.*;
+
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.BuildLogger;
+
+import org.apache.log4j.Logger;
+/**
+ * 
+ */
+public class HelpDef extends HlmPostDefImpl
+{
+    private Logger log;
+    public HelpDef() {
+        log = Logger.getLogger(HelpDef.class);
+    }
+
+    /**
+     * 
+     * @param project
+     *            Object of the project
+     * @param targetNames
+     *            Array of target names to execute
+     * 
+     */
+    public void execute(Project project, String module, String[] targetNames)
+    {
+        String firstTarget;
+
+        // take target
+        if (targetNames != null && targetNames.length > 0)
+        {
+            firstTarget = targetNames[0];
+        }
+        else
+        // no target, so set the default one
+        {
+            firstTarget = "help";
+        }
+
+        // If 'help' target is called, just run that and set other
+        // target names as a property
+        if (firstTarget.equals("help"))
+        {
+            displayHelp(project, targetNames, firstTarget);
+        }
+    }
+
+    private void displayHelp(Project project, String[] targetNames, String firstTarget)
+    {
+        if (targetNames.length > 1)
+        {
+            project.setProperty("help.target", targetNames[1]);
+        }
+        
+        // Set Emacs mode to true for all listeners, so that help text does
+        // not have [echo] at the start of each line
+        Iterator iter = project.getBuildListeners().iterator();
+        while (iter.hasNext())
+        {
+            BuildListener listener = (BuildListener) iter.next();
+            if (listener instanceof BuildLogger)
+            {
+                BuildLogger logger = (BuildLogger) listener;
+                logger.setEmacsMode(true);
+            }
+        }
+
+        // Run the 'help' target
+        project.executeTarget(firstTarget);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/ModelPropertiesParser.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant;
+
+import info.bliki.wiki.model.WikiModel;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+
+
+/**
+ * Renders model property and group description to Wiki Model Syntax
+ * @author Helium Team
+ */
+public class ModelPropertiesParser
+{
+    private String inputPath;
+    private String outputPath;
+    private Document doc;
+    
+    public ModelPropertiesParser(String inputPath, String outputPath)
+    {
+        this.inputPath = inputPath;
+        this.outputPath = outputPath;
+    }
+
+    /**
+     * Reads model xml file, changes description format.
+     * @throws DocumentException
+     * @throws IOException
+     */
+    public void parsePropertiesDescription() throws IOException, DocumentException
+    {
+        SAXReader xmlReader = new SAXReader();
+        doc = xmlReader.read(new File(inputPath));
+        List importNodes = doc.selectNodes("//description");
+        for (Iterator iterator = importNodes.iterator(); iterator.hasNext();)
+        {
+            Element importCurrentNode = (Element) iterator.next();
+            importCurrentNode.setText(renderWikiModel(importCurrentNode.getText()));
+            writeXMLFile();
+        }
+    }
+    
+     /**
+     * Writes Document object as xml file
+     */
+    private void writeXMLFile()
+    {
+        try {
+            if (outputPath != null) {
+            XMLWriter out = new XMLWriter(new FileOutputStream(new File(outputPath)), OutputFormat.createPrettyPrint());
+            out.write(doc);
+          }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+     /**
+     * Render the description as Wiki model
+     * @param String descriptionText
+     * @return String
+     */
+    private String renderWikiModel(String descriptionText) throws IOException, DocumentException
+    {
+        if (descriptionText != null)
+        {
+            WikiModel wikiModel = new WikiModel("", "");
+            //If description contains unwanted symbols like "**", "==" and "- -", remove those from description.
+            if (descriptionText.contains("**") || descriptionText.contains("==") || descriptionText.contains("- -"))
+            {
+                descriptionText = descriptionText.replace("**", "").replace("==", "").replace("- -", "").trim();
+            }
+            //If description starts with "-", remove it. As wiki have special meaning for this symbol
+            if (descriptionText.startsWith("-"))
+                descriptionText = descriptionText.replace("-", "");
+            descriptionText = descriptionText.trim();
+            //Render description with wiki model syntax
+            descriptionText = wikiModel.render(descriptionText);
+        }
+        else
+        {
+            descriptionText = "";
+        }
+      return descriptionText;
+     }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/TypedefURIFix.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,638 @@
+package com.nokia.ant;
+
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ * package org.apache.tools.ant.taskdefs;
+ */
+
+/* * Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+ 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.NoSuchElementException;
+import java.util.Properties;
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Base class for Taskdef and Typedef - handles all
+ * the attributes for Typedef. The uri and class
+ * handling is handled by DefBase
+ * @ant.task ignore="true"
+ * @since Ant 1.4
+ */
+public class TypedefURIFix extends Definer {
+
+    /**
+     * the extension of an antlib file for autoloading.
+     * {@value[
+     */
+    private static final String ANTLIB_XML = "/antlib.xml";
+
+    private static class ResourceStack extends ThreadLocal {
+        public Object initialValue() {
+            return new HashMap();
+        }
+        Map getStack() {
+            return (Map) get();
+        }
+    }
+    private static ResourceStack resourceStack = new ResourceStack();
+    private String name;
+    private String classname;
+    private File file;
+    private String resource;
+
+    private   int    format = Format.PROPERTIES;
+    private   boolean definerSet;
+    private   int         onError = OnError.FAIL;
+    private   String      adapter;
+    private   String      adaptTo;
+
+    private   Class       adapterClass;
+    private   Class       adaptToClass;
+
+    /**
+     * Enumerated type for onError attribute
+     *
+     * @see EnumeratedAttribute
+     */
+    public static class OnError extends EnumeratedAttribute {
+        /** Enumerated values */
+        public static final int  FAIL = 0, REPORT = 1, IGNORE = 2, FAIL_ALL = 3;
+
+        /**
+         * text value of onerror option {@value}
+         */
+        public static final String POLICY_FAIL = "fail";
+        /**
+         * text value of onerror option {@value}
+         */
+        public static final String POLICY_REPORT = "report";
+        /**
+         * text value of onerror option {@value}
+         */
+        public static final String POLICY_IGNORE = "ignore";
+        /**
+         * text value of onerror option {@value}
+         */
+        public static final String POLICY_FAILALL = "failall";
+
+        /**
+         * Constructor
+         */
+        public OnError() {
+            super();
+        }
+
+        /**
+         * Constructor using a string.
+         * @param value the value of the attribute
+         */
+        public OnError(String value) {
+            setValue(value);
+        }
+
+        /**
+         * get the values
+         * @return an array of the allowed values for this attribute.
+         */
+        public String[] getValues() {
+            return new String[] { POLICY_FAIL, POLICY_REPORT, POLICY_IGNORE, POLICY_FAILALL };
+        }
+    }
+
+    /**
+     * Enumerated type for format attribute
+     *
+     * @see EnumeratedAttribute
+     */
+    public static class Format extends EnumeratedAttribute {
+        /** Enumerated values */
+        public static final int PROPERTIES = 0, XML = 1;
+
+        /**
+         * get the values
+         * @return an array of the allowed values for this attribute.
+         */
+        public String[] getValues() {
+            return new String[] {"properties", "xml"};
+        }
+    }
+
+    /**
+     * What to do if there is an error in loading the class.
+     * <dl>
+     *   <li>error - throw build exception</li>
+     *   <li>report - output at warning level</li>
+     *   <li>ignore - output at debug level</li>
+     * </dl>
+     *
+     * @param onError an <code>OnError</code> value
+     */
+    public void setOnError(OnError onError) {
+        this.onError = onError.getIndex();
+    }
+
+    /**
+     * Sets the format of the file or resource
+     * @param format the enumerated value - xml or properties
+     */
+    public void setFormat(Format format) {
+        this.format = format.getIndex();
+    }
+
+    /**
+     * @return the name for this definition
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return the file containing definitions
+     */
+    public File getFile() {
+        return file;
+    }
+
+    /**
+     * @return the resource containing definitions
+     */
+    public String getResource() {
+        return resource;
+    }
+
+
+    /**
+     * Run the definition.
+     *
+     * @exception BuildException if an error occurs
+     */
+    public void execute() {
+        ClassLoader al = createLoader();
+
+        if (!definerSet) {
+            //we arent fully defined yet. this is an error unless
+            //we are in an antlib, in which case the resource name is determined
+            //automatically.
+            //NB: URIs in the ant core package"" at this point.
+            if (getURI() == null) {
+                throw new BuildException(
+                        "name, file or resource attribute of "
+                                + getTaskName() + " is undefined",
+                        getLocation());
+            }
+
+            if (getURI().startsWith(MagicNames.ANTLIB_PREFIX)) {
+                //convert the URI to a resource
+                String uri1 = getURI();
+                setResource(makeResourceFromURI(uri1));
+            } else {
+                throw new BuildException(
+                        "Only antlib URIs can be located from the URI alone,"
+                                + "not the URI " + getURI());
+            }
+        }
+
+        if (name != null) {
+            if (classname == null) {
+                throw new BuildException(
+                    "classname attribute of " + getTaskName() + " element "
+                    + "is undefined", getLocation());
+            }
+            addDefinition(al, name, classname);
+        } else {
+            if (classname != null) {
+                String msg = "You must not specify classname "
+                    + "together with file or resource.";
+                throw new BuildException(msg, getLocation());
+            }
+            Enumeration/*<URL>*/ urls = null;
+            if (file != null) {
+                final URL url = fileToURL();
+                if (url == null) {
+                    return;
+                }
+                urls = new Enumeration() {
+                    private boolean more = true;
+                    public boolean hasMoreElements() {
+                        return more;
+                    }
+                    public Object nextElement() {
+                        if (more) {
+                            more = false;
+                            return url;
+                        } else {
+                            throw new NoSuchElementException();
+                        }
+                    }
+                };
+            } else {
+                urls = resourceToURLs(al);
+            }
+
+            while (urls.hasMoreElements()) {
+                URL url = (URL) urls.nextElement();
+
+                int fmt = this.format;
+                if (url.toString().toLowerCase(Locale.US).endsWith(".xml")) {
+                    fmt = Format.XML;
+                }
+
+                if (fmt == Format.PROPERTIES) {
+                    loadProperties(al, url);
+                    break;
+                } else {
+                    if (resourceStack.getStack().get(url) != null) {
+                        log("Warning: Recursive loading of " + url
+                            + " ignored"
+                            + " at " + getLocation()
+                            + " originally loaded at "
+                            + resourceStack.getStack().get(url),
+                            Project.MSG_WARN);
+                    } else {
+                        try {
+                            resourceStack.getStack().put(url, getLocation());
+                            loadAntlib(al, url);
+                        } finally {
+                            resourceStack.getStack().remove(url);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * This is where the logic to map from a URI to an antlib resource
+     * is kept.
+     * @param uri the xml namespace uri that to convert.
+     * @return the name of a resource. It may not exist
+     */
+
+    public static String makeResourceFromURI(String uri) {
+        String path = uri.substring(MagicNames.ANTLIB_PREFIX.length());
+        String resource;
+        if (path.startsWith("//")) {
+            //handle new style full paths to an antlib, in which
+            //all but the forward slashes are allowed.
+            resource = path.substring("//".length());
+            if (!resource.endsWith(".xml")) {
+                //if we haven't already named an XML file, it gets antlib.xml
+                resource = resource + ANTLIB_XML;
+            }
+        } else {
+            //convert from a package to a path
+            resource = path.replace('.', '/') + ANTLIB_XML;
+        }
+        return resource;
+    }
+
+    /**
+     * Convert a file to a file: URL.
+     *
+     * @return the URL, or null if it isn't valid and the active error policy
+     * is not to raise a fault
+     * @throws BuildException if the file is missing/not a file and the
+     * policy requires failure at this point.
+     */
+    private URL fileToURL() {
+        String message = null;
+        if (!(file.exists())) {
+            message = "File " + file + " does not exist";
+        }
+        if (message == null && !(file.isFile())) {
+            message = "File " + file + " is not a file";
+        }
+        try {
+            if (message == null) {
+                return file.toURI().toURL();
+            }
+        } catch (Exception ex) {
+            message =
+                "File " + file + " cannot use as URL: "
+                + ex.toString();
+        }
+        // Here if there is an error
+        switch (onError) {
+            case OnError.FAIL_ALL:
+                throw new BuildException(message);
+            case OnError.FAIL:
+                // Fall Through
+            case OnError.REPORT:
+                log(message, Project.MSG_WARN);
+                break;
+            case OnError.IGNORE:
+                // log at a lower level
+                log(message, Project.MSG_VERBOSE);
+                break;
+            default:
+                // Ignore the problem
+                break;
+        }
+        return null;
+    }
+
+    private Enumeration/*<URL>*/ resourceToURLs(ClassLoader classLoader) {
+        Enumeration ret;
+        try {
+            ret = classLoader.getResources(resource);
+        } catch (IOException e) {
+            throw new BuildException(
+                "Could not fetch resources named " + resource,
+                e, getLocation());
+        }
+        if (!ret.hasMoreElements()) {
+            String message = "Could not load definitions from resource "
+                + resource + ". It could not be found.";
+            switch (onError) {
+                case OnError.FAIL_ALL:
+                    throw new BuildException(message);
+                case OnError.FAIL:
+                case OnError.REPORT:
+                    log(message, Project.MSG_WARN);
+                    break;
+                case OnError.IGNORE:
+                    log(message, Project.MSG_VERBOSE);
+                    break;
+                default:
+                    // Ignore the problem
+                    break;
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * Load type definitions as properties from a URL.
+     *
+     * @param al the classloader to use
+     * @param url the url to get the definitions from
+     */
+    protected void loadProperties(ClassLoader al, URL url) {
+        InputStream is = null;
+        try {
+            is = url.openStream();
+            if (is == null) {
+                log("Could not load definitions from " + url,
+                    Project.MSG_WARN);
+                return;
+            }
+            Properties props = new Properties();
+            props.load(is);
+            Enumeration keys = props.keys();
+            while (keys.hasMoreElements()) {
+                name = (String) keys.nextElement();
+                classname = props.getProperty(name);
+                addDefinition(al, name, classname);
+            }
+        } catch (IOException ex) {
+            throw new BuildException(ex, getLocation());
+        } finally {
+            FileUtils.close(is);
+        }
+    }
+
+    /**
+     * Load an antlib from a URL.
+     *
+     * @param classLoader the classloader to use.
+     * @param url the url to load the definitions from.
+     */
+    private void loadAntlib(ClassLoader classLoader, URL url) {
+        try {
+            Antlib antlib = Antlib.createAntlib(getProject(), url, getURI());
+            antlib.setClassLoader(classLoader);
+            antlib.setURI(getURI());
+            antlib.execute();
+        } catch (BuildException ex) {
+            throw ProjectHelper.addLocationToBuildException(
+                ex, getLocation());
+        }
+    }
+
+    /**
+     * Name of the property file  to load
+     * ant name/classname pairs from.
+     * @param file the file
+     */
+    public void setFile(File file) {
+        if (definerSet) {
+            tooManyDefinitions();
+        }
+        definerSet = true;
+        this.file = file;
+    }
+
+    /**
+     * Name of the property resource to load
+     * ant name/classname pairs from.
+     * @param res the resource to use
+     */
+    public void setResource(String res) {
+        if (definerSet) {
+            tooManyDefinitions();
+        }
+        definerSet = true;
+        this.resource = res;
+    }
+
+    /**
+     * Antlib attribute, sets resource and uri.
+     * uri is set the antlib value and, resource is set
+     * to the antlib.xml resource in the classpath.
+     * For example antlib="antlib:org.acme.bland.cola"
+     * corresponds to uri="antlib:org.acme.bland.cola"
+     * resource="org/acme/bland/cola/antlib.xml".
+     * @param antlib the value to set.
+     */
+    public void setAntlib(String antlib) {
+        if (definerSet) {
+            tooManyDefinitions();
+        }
+        if (!antlib.startsWith("antlib:")) {
+            throw new BuildException(
+                "Invalid antlib attribute - it must start with antlib:");
+        }
+        setURI(antlib);
+        this.resource = antlib.substring("antlib:".length()).replace('.', '/')
+            + "/antlib.xml";
+        definerSet = true;
+    }
+
+    /**
+     * Name of the definition
+     * @param name the name of the definition
+     */
+    public void setName(String name) {
+        if (definerSet) {
+            tooManyDefinitions();
+        }
+        definerSet = true;
+        this.name = name;
+    }
+
+    /**
+     * Returns the classname of the object we are defining.
+     * May be <code>null</code>.
+     * @return the class name
+     */
+    public String getClassname() {
+        return classname;
+    }
+
+    /**
+     * The full class name of the object being defined.
+     * Required, unless file or resource have
+     * been specified.
+     * @param classname the name of the class
+     */
+    public void setClassname(String classname) {
+        this.classname = classname;
+    }
+
+    /**
+     * Set the class name of the adapter class.
+     * An adapter class is used to proxy the
+     * definition class. It is used if the
+     * definition class is not assignable to
+     * the adaptto class, or if the adaptto
+     * class is not present.
+     *
+     * @param adapter the name of the adapter class
+     */
+
+    public void setAdapter(String adapter) {
+        this.adapter = adapter;
+    }
+
+    /**
+     * Set the adapter class.
+     *
+     * @param adapterClass the class to use to adapt the definition class
+     */
+    protected void setAdapterClass(Class adapterClass) {
+        this.adapterClass = adapterClass;
+    }
+
+    /**
+     * Set the classname of the class that the definition
+     * must be compatible with, either directly or
+     * by use of the adapter class.
+     *
+     * @param adaptTo the name of the adaptto class
+     */
+    public void setAdaptTo(String adaptTo) {
+        this.adaptTo = adaptTo;
+    }
+
+    /**
+     * Set the class for adaptToClass, to be
+     * used by derived classes, used instead of
+     * the adaptTo attribute.
+     *
+     * @param adaptToClass the class for adapto.
+     */
+    protected void setAdaptToClass(Class adaptToClass) {
+        this.adaptToClass = adaptToClass;
+    }
+
+
+    /**
+     * Add a definition using the attributes of Definer
+     *
+     * @param al the ClassLoader to use
+     * @param name the name of the definition
+     * @param classname the classname of the definition
+     * @exception BuildException if an error occurs
+     */
+    protected void addDefinition(ClassLoader al, String name, String classname)
+    {
+        Class cl = null;
+        try {
+            try {
+                name = ProjectHelper.genComponentName(getURI(), name);
+
+                if (onError != OnError.IGNORE) {
+                    cl = Class.forName(classname, true, al);
+                }
+
+                if (adapter != null) {
+                    adapterClass = Class.forName(adapter, true, al);
+                }
+
+                if (adaptTo != null) {
+                    adaptToClass = Class.forName(adaptTo, true, al);
+                }
+
+                AntTypeDefinition def = new AntTypeDefinition();
+                def.setName(name);
+                def.setClassName(classname);
+                def.setClass(cl);
+                def.setAdapterClass(adapterClass);
+                def.setAdaptToClass(adaptToClass);
+                def.setClassLoader(al);
+                if (cl != null) {
+                    def.checkClass(getProject());
+                }
+                ComponentHelper.getComponentHelper(getProject())
+                    .addDataTypeDefinition(def);
+            } catch (ClassNotFoundException cnfe) {
+                String msg = getTaskName() + " class " + classname
+                    + " cannot be found";
+                throw new BuildException(msg, cnfe, getLocation());
+            } catch (NoClassDefFoundError ncdfe) {
+                String msg = getTaskName() + " A class needed by class "
+                    + classname + " cannot be found: " + ncdfe.getMessage();
+                throw new BuildException(msg, ncdfe, getLocation());
+            }
+        } catch (BuildException ex) {
+            switch (onError) {
+                case OnError.FAIL_ALL:
+                case OnError.FAIL:
+                    throw ex;
+                case OnError.REPORT:
+                    log(ex.getLocation() + "Warning: " + ex.getMessage(),
+                        Project.MSG_WARN);
+                    break;
+                default:
+                    log(ex.getLocation() + ex.getMessage(),
+                        Project.MSG_DEBUG);
+            }
+        }
+    }
+
+    /**
+     * handle too many definitions by raising an exception.
+     * @throws BuildException always.
+     */
+    private void tooManyDefinitions() {
+        throw new BuildException(
+            "Only one of the attributes name, file and resource"
+            + " can be set", getLocation());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/XmlLogger.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,406 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package nokia.ant;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.util.Hashtable;
+import java.util.Stack;
+import java.util.Enumeration;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.apache.tools.ant.util.DOMElementWriter;
+import org.apache.tools.ant.util.StringUtils;
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.util.DateUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+/**
+ * Generates a file in the current directory with
+ * an XML description of what happened during a build.
+ * The default filename is "log.xml", but this can be overridden
+ * with the property <code>XmlLogger.file</code>.
+ *
+ * This implementation assumes in its sanity checking that only one
+ * thread runs a particular target/task at a time. This is enforced
+ * by the way that parallel builds and antcalls are done - and
+ * indeed all but the simplest of tasks could run into problems
+ * if executed in parallel.
+ *
+ * @see Project#addBuildListener(BuildListener)
+ */
+public class XmlLogger implements BuildLogger {
+
+    /** XML element name for a build. */
+    private static final String BUILD_TAG = "build";
+    /** XML element name for a target. */
+    private static final String TARGET_TAG = "target";
+    /** XML element name for a task. */
+    private static final String TASK_TAG = "task";
+    /** XML element name for a message. */
+    private static final String MESSAGE_TAG = "message";
+    /** XML attribute name for a name. */
+    private static final String NAME_ATTR = "name";
+    /** XML attribute name for a time. */
+    private static final String TIME_ATTR = "time";
+    /** XML attribute name for a message priority. */
+    private static final String PRIORITY_ATTR = "priority";
+    /** XML attribute name for a file location. */
+    private static final String LOCATION_ATTR = "location";
+    /** XML attribute name for an error description. */
+    private static final String ERROR_ATTR = "error";
+    /** XML element name for a stack trace. */
+    private static final String STACKTRACE_TAG = "stacktrace";
+    
+    /** DocumentBuilder to use when creating the document to start with. */
+    private static DocumentBuilder builder = getDocumentBuilder();
+    
+    private int msgOutputLevel = Project.MSG_ERR;
+    private PrintStream outStream;
+    
+    /** The complete log document for this build. */
+    private Document doc = builder.newDocument();
+    /** Mapping for when tasks started (Task to TimedElement). */
+    private Hashtable tasks = new Hashtable();
+    /** Mapping for when targets started (Task to TimedElement). */
+    private Hashtable targets = new Hashtable();
+    /**
+     * Mapping of threads to stacks of elements
+     * (Thread to Stack of TimedElement).
+     */
+    private Hashtable threadStacks = new Hashtable();
+    /**
+     * When the build started.
+     */
+    private TimedElement buildElement;
+    
+    /**
+     *  Constructs a new BuildListener that logs build events to an XML file.
+     */
+    public XmlLogger() {
+    }
+    
+    /**
+     * Returns a default DocumentBuilder instance or throws an
+     * ExceptionInInitializerError if it can't be created.
+     *
+     * @return a default DocumentBuilder instance.
+     */
+    private static DocumentBuilder getDocumentBuilder() {
+        try {
+            return DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        } catch (Exception exc) {
+            throw new ExceptionInInitializerError(exc);
+        }
+    }
+
+    /** Utility class representing the time an element started. */
+    private static class TimedElement {
+        /**
+         * Start time in milliseconds
+         * (as returned by <code>System.currentTimeMillis()</code>).
+         */
+        private long startTime;
+        /** Element created at the start time. */
+        private Element element;
+        public String toString() {
+            return element.getTagName() + ":" + element.getAttribute("name");
+        }
+    }
+
+    /**
+     * Fired when the build starts, this builds the top-level element for the
+     * document and remembers the time of the start of the build.
+     *
+     * @param event Ignored.
+     */
+    public void buildStarted(BuildEvent event) {
+        buildElement = new TimedElement();
+        buildElement.startTime = System.currentTimeMillis();
+        buildElement.element = doc.createElement(BUILD_TAG);
+    }
+
+    /**
+     * Fired when the build finishes, this adds the time taken and any
+     * error stacktrace to the build element and writes the document to disk.
+     *
+     * @param event An event with any relevant extra information.
+     *              Will not be <code>null</code>.
+     */
+    public void buildFinished(BuildEvent event) {
+        long totalTime = System.currentTimeMillis() - buildElement.startTime;
+        buildElement.element.setAttribute(TIME_ATTR,
+                DateUtils.formatElapsedTime(totalTime));
+
+        if (event.getException() != null) {
+            buildElement.element.setAttribute(ERROR_ATTR,
+                    event.getException().toString());
+            // print the stacktrace in the build file it is always useful...
+            // better have too much info than not enough.
+            Throwable t = event.getException();
+            Text errText = doc.createCDATASection(StringUtils.getStackTrace(t));
+            Element stacktrace = doc.createElement(STACKTRACE_TAG);
+            stacktrace.appendChild(errText);
+            buildElement.element.appendChild(stacktrace);
+        }
+
+        String outFilename = event.getProject().getProperty("XmlLogger.file");
+        if (outFilename == null) {
+            outFilename = "log.xml";
+        }
+        String xslUri
+                = event.getProject().getProperty("ant.XmlLogger.stylesheet.uri");
+        if (xslUri == null) {
+            xslUri = "log.xsl";
+        }
+        Writer out = null;
+        try {
+            // specify output in UTF8 otherwise accented characters will blow
+            // up everything
+            OutputStream stream = outStream;
+            if (stream == null) {
+                stream = new FileOutputStream(outFilename);
+            }
+            out = new OutputStreamWriter(stream, "UTF8");
+            out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+            if (xslUri.length() > 0) {
+                out.write("<?xml-stylesheet type=\"text/xsl\" href=\""
+                        + xslUri + "\"?>\n\n");
+            }
+            (new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
+            out.flush();
+        } catch (IOException exc) {
+            throw new BuildException("Unable to write log file", exc);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    e = null; // ignore
+                }
+            }
+        }
+        buildElement = null;
+    }
+
+    /**
+     * Returns the stack of timed elements for the current thread.
+     * @return the stack of timed elements for the current thread
+     */
+    private Stack getStack() {
+        Stack threadStack = (Stack) threadStacks.get(Thread.currentThread());
+        if (threadStack == null) {
+            threadStack = new Stack();
+            threadStacks.put(Thread.currentThread(), threadStack);
+        }
+        /* For debugging purposes uncomment:
+        org.w3c.dom.Comment s = doc.createComment("stack=" + threadStack);
+        buildElement.element.appendChild(s);
+         */
+        return threadStack;
+    }
+
+    /**
+     * Fired when a target starts building, this pushes a timed element
+     * for the target onto the stack of elements for the current thread,
+     * remembering the current time and the name of the target.
+     *
+     * @param event An event with any relevant extra information.
+     *              Will not be <code>null</code>.
+     */
+    public void targetStarted(BuildEvent event) {
+    }
+
+    /**
+     * Fired when a target finishes building, this adds the time taken
+     * and any error stacktrace to the appropriate target element in the log.
+     *
+     * @param event An event with any relevant extra information.
+     *              Will not be <code>null</code>.
+     */
+    public void targetFinished(BuildEvent event) {
+    }
+
+    /**
+     * Fired when a task starts building, this pushes a timed element
+     * for the task onto the stack of elements for the current thread,
+     * remembering the current time and the name of the task.
+     *
+     * @param event An event with any relevant extra information.
+     *              Will not be <code>null</code>.
+     */
+    public void taskStarted(BuildEvent event) {
+    }
+
+    /**
+     * Fired when a task finishes building, this adds the time taken
+     * and any error stacktrace to the appropriate task element in the log.
+     *
+     * @param event An event with any relevant extra information.
+     *              Will not be <code>null</code>.
+     */
+    public void taskFinished(BuildEvent event) {
+    }
+
+
+    /**
+     * Get the TimedElement associated with a task.
+     *
+     * Where the task is not found directly, search for unknown elements which
+     * may be hiding the real task
+     */
+    private TimedElement getTaskElement(Task task) {
+        TimedElement element = (TimedElement) tasks.get(task);
+        if (element != null) {
+            return element;
+        }
+
+        for (Enumeration e = tasks.keys(); e.hasMoreElements();) {
+            Task key = (Task) e.nextElement();
+            if (key instanceof UnknownElement) {
+                if (((UnknownElement) key).getTask() == task) {
+                    return (TimedElement) tasks.get(key);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Fired when a message is logged, this adds a message element to the
+     * most appropriate parent element (task, target or build) and records
+     * the priority and text of the message.
+     *
+     * @param event An event with any relevant extra information.
+     *              Will not be <code>null</code>.
+     */
+    public void messageLogged(BuildEvent event) {
+        int priority = event.getPriority();
+        if (priority > msgOutputLevel) {
+            return;
+        }
+        Element messageElement = doc.createElement(MESSAGE_TAG);
+
+        String name = "debug";
+        switch (event.getPriority()) {
+            case Project.MSG_ERR:
+                name = "error";
+                break;
+            case Project.MSG_WARN:
+                name = "warn";
+                break;
+            case Project.MSG_INFO:
+                name = "info";
+                break;
+            default:
+                name = "debug";
+                break;
+        }
+        messageElement.setAttribute(PRIORITY_ATTR, name);
+
+        Throwable ex = event.getException();
+        if (Project.MSG_DEBUG <= msgOutputLevel && ex != null) {
+            Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex));
+            Element stacktrace = doc.createElement(STACKTRACE_TAG);
+            stacktrace.appendChild(errText);
+            buildElement.element.appendChild(stacktrace);
+        }
+        Text messageText = doc.createCDATASection(event.getMessage());
+        messageElement.appendChild(messageText);
+
+        TimedElement parentElement = null;
+
+        Task task = event.getTask();
+
+        Target target = event.getTarget();
+        if (task != null) {
+            parentElement = getTaskElement(task);
+        }
+        if (parentElement == null && target != null) {
+            parentElement = (TimedElement) targets.get(target);
+        }
+
+        /*
+        if (parentElement == null) {
+            Stack threadStack
+                    = (Stack) threadStacks.get(Thread.currentThread());
+            if (threadStack != null) {
+                if (!threadStack.empty()) {
+                    parentElement = (TimedElement) threadStack.peek();
+                }
+            }
+        }
+        */
+
+        if (parentElement != null) {
+            parentElement.element.appendChild(messageElement);
+        } else {
+            buildElement.element.appendChild(messageElement);
+        }
+    }
+
+    // -------------------------------------------------- BuildLogger interface
+
+    /**
+     * Set the logging level when using this as a Logger
+     *
+     * @param level the logging level -
+     *        see {@link org.apache.tools.ant.Project#MSG_ERR Project}
+     *        class for level definitions
+     */
+    public void setMessageOutputLevel(int level) {
+        msgOutputLevel = level;
+    }
+
+    /**
+     * Set the output stream to which logging output is sent when operating
+     * as a logger.
+     *
+     * @param output the output PrintStream.
+     */
+    public void setOutputPrintStream(PrintStream output) {
+        this.outStream = new PrintStream(output, true);
+    }
+
+    /**
+     * Ignore emacs mode, as it has no meaning in XML format
+     *
+     * @param emacsMode true if logger should produce emacs compatible
+     *        output
+     */
+    public void setEmacsMode(boolean emacsMode) {
+    }
+
+    /**
+     * Ignore error print stream. All output will be written to
+     * either the XML log file or the PrintStream provided to
+     * setOutputPrintStream
+     *
+     * @param err the stream we are going to ignore.
+     */
+    public void setErrorPrintStream(PrintStream err) {
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+   
+    <taskdef name="antdependency" classname="com.nokia.ant.taskdefs.AntDependencyTask"/>
+    <taskdef name="antlint" classname="com.nokia.ant.taskdefs.AntLintTask"/>
+    <taskdef name="ccm" classname="com.nokia.ant.taskdefs.CcmTask" onerror="report"/>
+    <taskdef name="configuration" classname="com.nokia.ant.taskdefs.AntConfigurationTask"/>
+    <taskdef name="coveragerecord" classname="com.nokia.ant.taskdefs.CoverageRecorderTask"/>
+    <taskdef name="database" classname="com.nokia.ant.taskdefs.DatabaseTask"/>
+    <taskdef name="deconfigure" classname="com.nokia.ant.taskdefs.DeconfigureTask"/>
+    <taskdef name="fastcopy" classname="com.nokia.ant.taskdefs.CopyParallelTask"/>
+    <taskdef name="getVariableValue" classname="com.nokia.ant.taskdefs.GetValueFromVariableSet"/>
+    <taskdef name="logrecord" classname="com.nokia.ant.taskdefs.LogRecorderTask"/>
+    <taskdef name="logtoconsole" classname="com.nokia.ant.taskdefs.StopLogToConsole"/>
+    <taskdef name="parsemodel" classname="com.nokia.ant.taskdefs.ModelPropertiesTask"/>
+    <taskdef name="python" classname="com.nokia.ant.taskdefs.PythonTask"/>
+    <taskdef name="rebaseline" classname="com.nokia.ant.taskdefs.RebaselineTask"/>
+    <taskdef name="hlmassertmessage" classname="com.nokia.ant.taskdefs.HlmAssertMessage"/>
+    <taskdef name="retry" classname="com.nokia.ant.taskdefs.RetryTask"/>
+    <typedef name="ldap" classname="com.nokia.ant.taskdefs.LDAP" />
+    
+    <typedef name="arg" classname="com.nokia.ant.types.Variable"/>
+    <typedef name="cmdVar" classname="com.nokia.ant.types.Variable"/>
+    <typedef name="makeOption" classname="com.nokia.ant.types.Variable"/>
+    
+    <typedef name="argSet" classname="com.nokia.ant.types.VariableSet"/> 
+    <typedef name="cmdVarSet" classname="com.nokia.ant.types.VariableSet"/>
+    
+    <typedef name="imakerconfiguration" classname="com.nokia.ant.types.imaker.Configuration"/>
+    <typedef name="imakerconfigurationset" classname="com.nokia.ant.types.imaker.ConfigurationSet"/>
+    <typedef name="logfilter" classname="com.nokia.ant.types.LogFilter"/> 
+    <typedef name="logfilterset" classname="com.nokia.ant.types.LogFilterSet"/>
+    
+    <typedef name="prettyprintxml" classname="com.nokia.ant.filters.PrettyPrintXmlFilter"/>
+    <typedef name="sbsMakeOptions" classname="com.nokia.ant.types.SBSMakeOptions"/>
+    <typedef name="session" classname="com.nokia.ant.types.ccm.Session"/> 
+    <typedef name="sessionset" classname="com.nokia.ant.types.ccm.SessionSet"/> 
+    <typedef name="typedef" classname="com.nokia.ant.TypedefURIFix"/>
+    <typedef name="variable" classname="com.nokia.ant.types.imaker.Variable"/> 
+    <typedef name="variableset" classname="com.nokia.ant.types.imaker.VariableSet"/>
+
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/filters/PrettyPrintXmlFilter.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.filters;
+
+import java.io.StringWriter;
+
+import org.apache.tools.ant.filters.TokenFilter;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+/**
+ * Prints xml file in pretty format.
+ *
+ */
+public class PrettyPrintXmlFilter implements TokenFilter.Filter
+{
+    public PrettyPrintXmlFilter()
+    {
+    
+    }
+
+    public String filter(String token)
+    {
+        if (token.length() == 0)
+        {
+            return token;
+        }
+        try
+        {
+//            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+//            DocumentBuilder builder = docFactory.newDocumentBuilder();
+//            Document doc = builder.parse(new InputSource(new StringReader(token)));
+//            TransformerFactory tfactory = TransformerFactory.newInstance();
+//            Transformer serializer;
+//
+//            StringWriter out = new StringWriter();
+//            serializer = tfactory.newTransformer();
+//            
+//            // Configure to pretty-print the XML
+//            serializer.setOutputProperty(OutputKeys.INDENT, "yes");
+//            serializer.setOutputProperty(OutputKeys.METHOD, "xml");
+//            serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+//
+//            serializer.transform(new DOMSource(doc), new StreamResult(out));
+//            result = out.toString();
+            
+            Document doc = DocumentHelper.parseText(token);
+            StringWriter out = new StringWriter();
+            OutputFormat format = OutputFormat.createPrettyPrint();
+            format.setIndentSize(4);
+            XMLWriter writer = new XMLWriter( out, format );
+            writer.write(doc);
+            writer.close();
+            return out.toString();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/helium.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-mains" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <typedef name="buildstatusdef" classname="com.nokia.ant.BuildStatusDef" uri="http://www.nokia.com/helium"/>
+    <typedef name="helpdef" classname="com.nokia.ant.HelpDef" uri="http://www.nokia.com/helium"/>
+    <hlm:deflist id="nokia_ant.list">
+        <hlm:buildstatusdef/>
+        <hlm:helpdef/>
+    </hlm:deflist>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/ivy/ToolResolver.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,170 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ivy;
+
+import java.io.*;
+import java.util.Date;
+
+import org.apache.ivy.core.module.descriptor.Artifact;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.plugins.repository.BasicResource;
+import org.apache.ivy.plugins.repository.Resource;
+import org.apache.ivy.plugins.resolver.AbstractResourceResolver;
+import org.apache.ivy.plugins.resolver.util.ResolvedResource;
+import org.apache.ivy.plugins.resolver.util.ResourceMDParser;
+import org.apache.ivy.util.Message;
+
+
+/**
+ * Ivy plugin to read tool versions
+ */
+public class ToolResolver extends AbstractResourceResolver
+{
+
+
+//    private List ivyPatterns = new ArrayList(); // List (String pattern)
+//
+//    private List artifactPatterns = new ArrayList(); // List (String pattern)
+//
+//    public void addConfiguredIvy(IvyPattern p)
+//    {
+//        ivyPatterns.add(p.getPattern());
+//    }
+//
+//    public void addConfiguredArtifact(IvyPattern p)
+//    {
+//        artifactPatterns.add(p.getPattern());
+//    }
+
+//    public DownloadReport download(Artifact[] artifacts, DownloadOptions options)
+//    {
+//        // TODO Auto-generated method stub
+//        Message.verbose("ToolResolver.download() start");
+//        return null;
+//    }
+
+//    public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data)
+//    {
+//        // TODO Auto-generated method stub
+//        Message.verbose("ToolResolver.findIvyFileRef() start");
+//        return null;
+//    }
+
+//    public ResolvedModuleRevision getDependency(DependencyDescriptor depDescriptor, ResolveData data)
+//            throws ParseException
+//    {
+//        // TODO Auto-generated method stub
+//        Message.verbose("ToolResolver.getDependency() start: " + depDescriptor.getDependencyId().getName());
+//        
+//        Map attributes = depDescriptor.getAttributes();
+//        Iterator entriesIter = attributes.entrySet().iterator();
+//        for (; entriesIter.hasNext();)
+//        {
+//            Map.Entry entry = (Map.Entry) entriesIter.next();
+//            System.out.println(entry.getKey() + ", " + entry.getValue());
+//        }
+//        
+//        return null;
+//    }
+
+    public void publish(Artifact artifact, File src, boolean overwrite) throws IOException
+    {
+        // TODO Auto-generated method stub
+        Message.verbose("ToolResolver.publish() start");
+
+    }
+    
+    @Override
+    protected ResolvedResource findResourceUsingPattern(ModuleRevisionId mrid, String pattern,
+            Artifact artifact, ResourceMDParser rmdparser, Date date)
+    {
+        Message.verbose("ToolResolver.findResourceUsingPattern() start");
+        
+        Message.verbose(artifact.getName());
+        Message.verbose(mrid.getRevision());
+        Message.verbose(artifact.getAttribute("versionArgs"));
+
+        String toolVersion = mrid.getRevision();
+        ResolvedResource resolvedResource = null;
+        try
+        {
+            String versionText = getToolVersion(artifact);
+            Message.verbose(versionText);
+            
+            if (versionText.contains(toolVersion) || versionText.matches(artifact.getAttribute("versionExp")))
+            {
+                BasicResource resource = new BasicResource(artifact.getName(), true, 0, 0, true);
+                resolvedResource = new ResolvedResource(resource, toolVersion);
+            }
+        }
+        catch (IOException e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return resolvedResource;
+    }
+
+    @Override
+    protected long get(Resource resource, File dest) throws IOException
+    {
+        Message.verbose("ToolResolver.get() start");
+        return 0;
+    }
+    
+    private String getToolVersion(Artifact artifact) throws IOException
+    {
+        String toolName = artifact.getName();
+        String toolType = artifact.getType();
+        String versionArgs = artifact.getAttribute("versionArgs");
+        Runtime runtime = Runtime.getRuntime();
+        Message.verbose("'" + toolName + " " + versionArgs + "'");
+        //Process toolProcess = runtime.exec(toolName+ "." + toolType + " " + versionArgs);
+        Process toolProcess = runtime.exec(toolName + " " + versionArgs);
+        InputStream in = toolProcess.getInputStream();
+        InputStream err = toolProcess.getErrorStream();
+        String outText = toString(in).trim();
+        String errText = toString(err).trim();
+        Message.verbose("err: " + errText);
+        return outText + errText;
+    }
+    
+    private String toString(InputStream inputStream) throws IOException
+    {
+        byte[] buffer = new byte[4096];
+        OutputStream outputStream = new ByteArrayOutputStream();
+         
+        while (true) {
+            int read = inputStream.read(buffer);
+         
+            if (read == -1) {
+                break;
+            }
+         
+            outputStream.write(buffer, 0, read);
+        }
+         
+        outputStream.close();
+        inputStream.close();
+         
+        return outputStream.toString();
+    }
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/TracingLogger.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.listener;
+
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryUsage;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+/**
+ * This subclass of BuildListener object is to trace heap memory usages for task, target and build.
+ *
+ */
+public class TracingLogger implements BuildListener
+{
+    private Project project;
+
+    private MemoryMXBean mbean;
+
+    private boolean loggingEnabled;
+
+    private PrintWriter out;
+    
+    private String currentTarget;
+
+    public void buildFinished(BuildEvent event)
+    {
+        out.close();
+    }
+
+    public void buildStarted(BuildEvent event)
+    {
+        mbean = ManagementFactory.getMemoryMXBean();
+        // mbean.setVerbose(true);
+        project = event.getProject();
+    }
+
+    public void messageLogged(BuildEvent event)
+    {
+    }
+
+    public void targetFinished(BuildEvent event)
+    {
+//        logMemoryUsage("target", event.getTarget().getName());
+        currentTarget = "";
+    }
+
+    public void targetStarted(BuildEvent event)
+    {
+        currentTarget = event.getTarget().getName();
+        try
+        {
+            if (!loggingEnabled)
+            {
+                loggingEnabled = true;
+                String tracingFile = project.getProperty("tracing.csv.file");
+                out = new PrintWriter(tracingFile);
+                out.print("target,task,committed,used,timestamp\n");
+            }
+//            logMemoryUsage("target", event.getTarget().getName());
+        }
+        catch (FileNotFoundException e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
+        }
+    }
+
+    public void taskFinished(BuildEvent event)
+    {
+        logMemoryUsage("task", event.getTask().getTaskName());
+    }
+
+    public void taskStarted(BuildEvent event)
+    {
+        logMemoryUsage("task", event.getTask().getTaskName());
+    }
+
+    private void logMemoryUsage(String type, String label)
+    {
+        if (loggingEnabled)
+        {
+            MemoryUsage heapMemory = mbean.getHeapMemoryUsage();
+            project.log("Build event: " + label, Project.MSG_DEBUG);
+            project.log("Max memory = " + heapMemory.getMax(), Project.MSG_DEBUG);
+            project.log("Committed memory = " + heapMemory.getCommitted(), Project.MSG_DEBUG);
+            project.log("Used memory = " + heapMemory.getUsed(), Project.MSG_DEBUG);
+            long timestamp = System.currentTimeMillis();
+            out.print(currentTarget + "," + label  + ","
+                    + heapMemory.getCommitted() + "," + heapMemory.getUsed() + "," + String.valueOf(timestamp) + "\n");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/AssertNode.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.listener.internaldata;
+
+import com.nokia.ant.taskdefs.HlmAssertMessage;
+/**
+ * Object to set end time for a task.
+ *
+ */
+public class AssertNode extends DataNode {
+
+    private String name;
+    
+    
+    // location
+    private String filename;
+    private String message;
+    private int line = -1;
+    private String assertName;
+    
+     public AssertNode(DataNode parent, HlmAssertMessage task) {
+        super(parent, task);
+        name = task.getTaskName();
+        this.setFilename(task.getLocation().getFileName());
+        this.setLine(task.getLocation().getLineNumber());
+        message = task.getMessage();
+        assertName = task.getAssertName();
+    }
+    /**
+     * Return the assert message
+     * @return
+     */
+     public String getMessage() {
+        return message;
+    }
+    /**
+     * Return the assert task name.
+     * @return
+     */
+    public String getName() {
+        return name;
+    } 
+    /**
+     * Return the assert name.
+     * @return
+     */
+    public String getAssertName() 
+    {
+        return assertName;
+    }
+    /**
+     * Return the path to file name.
+     * @return
+     */
+    public String getFilename() {
+        return filename;
+    }
+    /**
+     * Sets the path to file name.
+     * @param filename
+     */
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+    /**
+     * Return the line number.
+     * @return
+     */
+    public int getLine() {
+        return line;
+    }
+    /**
+     * Sets the line number.
+     * @param line
+     */
+    public void setLine(int line) {
+        this.line = line;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/BuildNode.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.listener.internaldata;
+
+import org.apache.tools.ant.Project;
+/**
+ * Keeps data for a build node.
+ *
+ */
+public class BuildNode extends DataNode {
+    
+    private boolean successful = true;
+    private String name;
+    
+    public BuildNode(DataNode parent, Project project) {
+        super(parent, project);
+        name = project.getName();
+    }
+
+    public String getName() {
+        if (name != null)
+            return name;
+        return "build";
+    } 
+
+    public boolean getSuccessful() {
+        return successful;
+    }
+
+    public void setSuccessful(boolean successful) {
+        this.successful = successful;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/DataNode.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.listener.internaldata;
+import java.util.Iterator;
+import java.util.Vector;
+import java.util.Date;
+
+/**
+ * Data node object to iterate, keep timing, name, maintain parallel tasks for the node. 
+ *
+ */
+public abstract class DataNode {
+
+    // Job number management
+    private static long commonJobId;
+    private long jobId = commonJobId++;
+    // Parent node
+    private DataNode parent;
+    
+    // children nodes.
+    private Vector<DataNode> children = new Vector<DataNode>();
+    
+    
+    
+    // Statistics about the time.
+    private Date startTime;
+    private Date endTime;
+
+    // Get the thread id. this is important for parallel tasks.
+    private long threadId = Thread.currentThread().getId();
+    
+    // reference for the data.
+    private Object reference; 
+    
+    public DataNode(DataNode parent, Object reference) {
+        this.parent = parent;
+        if (parent != null) {
+            parent.add(this);
+        }
+        this.setStartTime(new Date());
+        this.setReference(reference);
+    }
+    
+    /**
+     * Method used to register a child to it's parent.
+     * @param child, the child to register.
+     */
+    public void add(DataNode child) {
+        children.add(child);
+    }
+
+    /**
+     * Return an iterator on this node children
+     * @return the iterator
+     */
+    public Iterator<DataNode> iterator() {
+        return children.iterator();
+    }
+
+    /**
+     * Method used to remove a node from it's parent
+     * @param child, the child to remove.
+     */
+    public void remove(DataNode child) {
+        children.remove(child);
+    }
+
+    /**
+     * Is the node containing any children.
+     * @return true is the node is empty
+     */
+    public boolean isEmpty() {
+        return children.isEmpty();
+    }
+    
+    /**
+     * Returns the parent node, or null if the root.
+     * @return a DataNode.
+     */
+    public DataNode getParent() {
+        return parent;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    /**
+     * Make is reliable: if end time doesn't exists let's use the start time.
+     */
+    public Date getEndTime() {
+        if (endTime != null)
+            return endTime;
+        else
+            return this.getStartTime();
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+    
+    /**
+     * Return the thread where the class has been created under.
+     * @return thread id as a long.
+     */
+    public long getThreadId() {
+        return this.threadId;
+    }
+
+    public Object getReference() {
+        return reference;
+    }
+
+    public void setReference(Object reference) {
+        this.reference = reference;
+    }
+    
+    public long getJobId() {
+        return jobId;
+    }
+
+    /**
+     * Find a node using its reference.
+     * @param reference object
+     * @return
+     */
+    public DataNode find(Object reference) {
+        if (this.reference == reference)
+            return this;        
+        for (Iterator<DataNode> i = children.iterator() ; i.hasNext() ; ) {
+            DataNode node = i.next();
+            DataNode result = node.find(reference);
+            if (result != null)
+                return result;
+        }
+        return null;
+    }
+    
+
+    /**
+     * Name of the node. 
+     * @return name of the node (e.g target name for targets)
+     */
+    public abstract String getName();
+    
+    /**
+     * Default string representation.
+     */
+    public String toString() {
+        return getName();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EmailDataSender.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.listener.internaldata;
+
+import java.util.Properties;
+import java.util.Hashtable;
+import java.util.zip.GZIPOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import javax.mail.*;
+import javax.mail.internet.*;
+import javax.naming.*;
+import javax.naming.directory.*;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import org.apache.log4j.Logger;
+
+/**
+ * Sends email of the internal data log in a zipped format.
+ *
+ */
+public class EmailDataSender {
+
+    
+    // The target address
+    public static final String TO_EMAIL = "helium.internaldata@nokia.com";
+    
+    // LDAP config
+    public static final String LDAP_URL = "ldap://nedi.europe.nokia.com:389/o=Nokia";
+
+    // Default SMTP server
+    public static final String SMTP_SERVER = "smtp.nokia.com";
+    
+    // Configured smtp server address
+    private String smtpServer;
+    // Logger
+    private Logger log = Logger.getLogger(EmailDataSender.class);
+    
+    /**
+     * Set the smtp server address.
+     */
+    public void setSMTPServer(String address) {
+        smtpServer = address;
+    }
+
+    /**
+     * Get the smtp server address.
+     */
+    public String getSMTPServer() {
+        if (smtpServer != null)
+            return smtpServer;
+        return SMTP_SERVER;
+    }
+    
+    /**
+     * Sending the XML data through email.
+     */
+    public void sendData(String data) {
+        try {
+            String email = getUserEmail();
+            Properties props = new Properties();
+            props.setProperty("mail.smtp.host", getSMTPServer());
+
+            Session mailSession = Session.getDefaultInstance(props, null);
+
+            MimeMessage message = new MimeMessage(mailSession);
+            message.setSubject("[HELIUM]: internal data");
+            
+            MimeMultipart multipart = new MimeMultipart("related");
+            
+            // first part  (the text html content)
+            BodyPart messageBodyPart = new MimeBodyPart();
+            String htmlText = "<H1>Internal data</H1>";
+            messageBodyPart.setContent(htmlText, "text/html");
+            multipart.addBodyPart(messageBodyPart); // add to the multipart
+
+            // second part (the data)
+            messageBodyPart = new MimeBodyPart();
+            ByteArrayDataSource dataSrc = gzip(data, "data.xml");
+            messageBodyPart.setFileName(dataSrc.getName());
+            messageBodyPart.setDataHandler(new DataHandler(dataSrc));
+            messageBodyPart.setHeader("Content-ID","<data>");
+            
+            multipart.addBodyPart(messageBodyPart); // add to the multipart
+            
+            message.setContent(multipart);
+            message.setFrom(new InternetAddress(email));
+            message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_EMAIL));
+            
+            log.debug("Sending data.");
+            Transport.send(message);
+        } catch (Exception e) {
+            log.error("Internal data failure: " + e.getMessage());
+        }        
+    }
+
+    /**
+     * GZipping a string.
+     * @param data the content to be gzipped.
+     * @param filename the name for the file.
+     * @return a ByteArrayDataSource.
+     */
+    protected ByteArrayDataSource gzip(String data, String filename) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        GZIPOutputStream gz = new GZIPOutputStream(out);
+        gz.write(data.getBytes());
+        gz.close();
+        out.close();
+        ByteArrayDataSource dataSrc = new ByteArrayDataSource(out.toByteArray(), "application/x-gzip");
+        dataSrc.setName(filename + ".gz");
+        return dataSrc;
+    }
+
+    /**
+     * Getting user email.
+     * @returns the user email.
+     */
+    protected String getUserEmail() throws Exception {
+        String username = System.getProperty("user.name");
+
+        // Set up environment for creating initial context
+        Hashtable env = new Hashtable(11);
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+                "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, LDAP_URL);
+
+        // Create initial context
+        DirContext ctx = new InitialDirContext(env);
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+        NamingEnumeration en = ctx.search("", "uid=" + username, controls);
+        if (en.hasMore()) {
+            SearchResult sr = (SearchResult) en.next();
+            String email = (String) sr.getAttributes().get("mail").get();
+            return email;
+        }
+        throw new Exception("Could not find user email in LDAP.");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EndLessStack.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.listener.internaldata;
+
+import java.util.Stack;
+/**
+ * Object to keep the elements in a stack, it supports both pop and peek (return element is kept in the stack).
+ * 
+ */
+public class EndLessStack<E> extends Stack<E> {
+    public static final long serialVersionUID = -1L;
+    private E defaultElement;
+    
+    /**
+     * Create a stack with a defaultElement as the default element.
+     */
+    public EndLessStack(E defaultElement) {
+        super();
+        this.defaultElement = defaultElement;
+    }
+
+    /**
+     * Create a stack with a null default element.
+     */
+    public EndLessStack() {
+        super();
+        this.defaultElement = null;
+    }
+
+    /**
+     * This return the top most element out from the stack.
+     * If the stack is empty it returns the defaultElement.
+     * @return element 
+     */
+    public E pop() {
+        E element = super.pop();
+        if (element != null)
+            return element;
+        return defaultElement;
+    }
+    
+    /** 
+     * Endless stack is never empty. 
+     */
+    public boolean empty() {
+        return false;
+    }
+    
+    /**
+     * This return the top most element from the stack.
+     * If the stack is empty it returns the defaultElement.
+     * The return element is kept in the stack.
+     * @return element 
+     */
+    public E peek() {
+        if (!super.empty()) {
+            E element = super.peek();
+            return element;
+        }
+        return defaultElement;
+    }
+
+    /**
+     * Get default element.
+     * This is the object which will get returned if the internal stack gets empty.
+     * @return element 
+     */
+    public Object getDefaultElement() {
+        return defaultElement;
+    }
+
+    /**
+     * Set default element.
+     * @return element 
+     */
+    public void setDefaultElement(E defaultElement) {
+        this.defaultElement = defaultElement;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/Listener.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.listener.internaldata;
+
+import java.util.Hashtable;
+import java.util.Date;
+import com.nokia.ant.Database;
+import com.nokia.ant.taskdefs.HlmAssertMessage;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.SubBuildListener;
+import org.dom4j.Document;
+import org.apache.log4j.Logger;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryUsage;
+
+/**
+ * Listener class for the Logger.
+ *
+ */
+public class Listener implements BuildListener, SubBuildListener {
+
+    // Logger for listener
+    private Logger log;
+        
+    // Database logging
+    private boolean sendDatabase = true;
+    
+    // Root node.
+    private BuildNode buildNode;
+    
+    // Ant build Stack. Usefull to associate with current parent.
+    private EndLessStack<DataNode> buildEventStack = new EndLessStack<DataNode>();
+    
+    // default list of properties to extract.
+    private String[] propList = {"os.name", "user.name", "build.name", "build.number", "build.id", "build.system", "env.NUMBER_OF_PROCESSORS", "helium.version", "env.SYMSEE_VERSION", "diamonds.build.id"};
+
+    // Memory bean 
+    private MemoryMXBean mbean;
+    
+    public Listener() {
+        log = Logger.getLogger(Listener.class);
+        mbean = ManagementFactory.getMemoryMXBean();
+    }
+    
+    /**
+     * Method to call to trigger the data sending.
+     */
+    public void sendData(String smtpServer, BuildEvent event) {
+        if (buildNode != null) {
+            Document database = null;
+            if (sendDatabase) {
+                try {
+                    Database antDB = new Database((Project)buildNode.getReference(), null, null);
+                    database = antDB.createDOM();
+                } catch (Exception e) {
+                    System.out.println("Warning: couldn't generate Ant DB.");
+                    database = null;
+                }
+            }
+            //TreeDumper dumper = new TreeDumper(buildNode);
+            //dumper.dump();
+            try {
+                log.debug("Creating the XML log.");
+                XMLRenderer writer = new XMLRenderer(buildNode, database, this.extractProperties(), event);
+                EmailDataSender sender = new EmailDataSender();
+                // Setting the server address.
+                sender.setSMTPServer(smtpServer);
+                log.debug("Sending the data.");
+                String xml = writer.toString();
+                log.debug(xml);
+                sender.sendData(xml);
+            } catch (Exception e) {
+                log.debug("Warning: error generating the XML.");
+                e.printStackTrace();
+            }
+        }
+    }
+
+    
+    
+    /**
+     * Extracting properties from the build.
+     * @return a hashtable containing relevant properties and their value.
+     */
+    private Hashtable<String, String> extractProperties() {
+        Hashtable<String, String> properties = new Hashtable<String, String>();
+        if (buildNode != null) {
+            Project project = (Project)buildNode.getReference();
+            Hashtable projProps = project.getProperties();
+            for (int i = 0; i < propList.length; i++) {
+                if (projProps.containsKey(propList[i])) {
+                    properties.put(propList[i], (String)projProps.get(propList[i]));
+                }
+            }
+        }
+        return properties;
+    }
+    
+    //-------------------------------------------------------------
+    //
+    // Implementing BuildListener and SubBuildListener interface
+    //
+    //-------------------------------------------------------------
+    public synchronized void buildFinished(BuildEvent event) {
+        log.debug("buildFinished");
+        if (buildNode != null) {
+            BuildNode node = (BuildNode)buildNode.find(event.getProject());
+            if (node != null) {
+                node.setEndTime(new Date());
+                node.setSuccessful(event.getException() == null);
+            }
+        }
+        String smtpServer = event.getProject().getProperty("email.smtp.server");
+        this.sendData(smtpServer, event);
+    }
+
+    public synchronized void buildStarted(BuildEvent event) {
+        log.debug("buildStarted");
+        if (buildNode == null) {
+            // Create data node for a build
+            buildNode = new BuildNode(null, event.getProject());
+            // Garbage collector for execution. 
+            buildEventStack.setDefaultElement(buildNode);
+        }
+    }
+
+    public synchronized void subBuildFinished(BuildEvent event) {
+        log.debug("subBuildFinished");
+        if (buildNode != null) {
+            BuildNode node = (BuildNode)buildNode.find(event.getProject());
+            if (node != null) {
+                node.setEndTime(new Date());
+                node.setReference(null);
+                node.setSuccessful(event.getException() == null);
+            } else {
+                log.debug("subBuildFinished - could not find subbuild.");
+            }
+            buildEventStack.pop();
+        }
+    }
+
+    public synchronized void subBuildStarted(BuildEvent event) {
+        log.debug("subBuildStarted");
+        DataNode parentNode = buildEventStack.peek();
+        if (parentNode != null) {
+            BuildNode node = new BuildNode(parentNode, event.getProject());
+            buildEventStack.push(node);
+        }
+    }
+
+    public void messageLogged(BuildEvent event) {
+        // Ignoring message logging.
+    }
+
+    public synchronized void targetFinished(BuildEvent event) {
+        //log.debug("targetFinished");
+        if (buildNode != null) {
+            DataNode node = buildNode.find(event.getTarget());
+            if (node != null) {
+                node.setEndTime(new Date());
+                MemoryUsage mem = mbean.getHeapMemoryUsage();
+                TargetNode tnode = (TargetNode)node;
+                tnode.setEndUsedHeap(mem.getUsed());
+                tnode.setEndCommittedHeap(mem.getCommitted());
+                node.setReference(null);
+            } else {
+                log.debug("targetFinished - could not find target.");
+            }
+            buildEventStack.pop();
+        }
+    }
+
+    public synchronized void targetStarted(BuildEvent event) {
+        //log.debug("targetStarted");
+        DataNode parentNode = buildEventStack.peek();
+        if (parentNode != null) {
+            TargetNode node = new TargetNode(parentNode, event.getTarget());
+            MemoryUsage mem = mbean.getHeapMemoryUsage();
+            node.setStartUsedHeap(mem.getUsed());
+            node.setStartCommittedHeap(mem.getCommitted());
+            buildEventStack.push(node);
+        } else {
+            log.debug("targetStarted - could not find parent.");
+        }
+    }
+
+    public synchronized void taskFinished(BuildEvent event) {
+        //log.debug("taskFinished");
+        if (buildNode != null) {
+            DataNode node = buildNode.find(event.getTask());
+            if (node != null) {
+                node.setEndTime(new Date());
+                node.setReference(null);
+            } else {
+                log.debug("taskFinished - could not find task.");
+            }
+        }
+    }
+
+    public synchronized void taskStarted(BuildEvent event) {
+        //log.debug("taskStarted");
+        if (buildNode != null) {
+            DataNode parentNode = buildNode.find(event.getTask().getOwningTarget());
+            if (parentNode != null) {
+                //log.debug("taskStarted - pushing using owning parent");
+                new TaskNode(parentNode, event.getTask());
+            } else {
+                //log.debug("taskStarted - pushing using stack");
+                new TaskNode(buildEventStack.peek(), event.getTask());
+            }
+        }
+    }
+    
+    public void addAssertTask(HlmAssertMessage assertTask) { 
+        if (buildNode != null) {
+            DataNode parentNode = buildNode.find(assertTask.getOwningTarget());
+            if (parentNode != null) {
+                new AssertNode(parentNode, assertTask);
+            } else {
+                new AssertNode(buildEventStack.peek(), assertTask);
+            }
+        }
+        
+    }
+    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TargetNode.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.listener.internaldata;
+
+import org.apache.tools.ant.Target;
+/**
+ * Object to keep trace for memory usage, based on start heap and end heap of a target.
+ *
+ */
+public class TargetNode extends DataNode {
+
+    private String name;
+
+    // location
+    private String filename;
+    private int line = -1;
+    
+    // Memory usage
+    private long startUsedHeap;
+    private long startCommittedHeap;
+    private long endUsedHeap;
+    private long endCommittedHeap;
+    
+    public TargetNode(DataNode parent, Target target) {
+        super(parent, target);
+        this.setFilename(target.getLocation().getFileName());
+        this.setLine(target.getLocation().getLineNumber());        
+        name = target.getName();
+    }
+
+    public String getName() {
+        return name;
+    } 
+
+    public String getFilename() {
+        return filename;
+    }
+
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+
+    public int getLine() {
+        return line;
+    }
+
+    public void setLine(int line) {
+        this.line = line;
+    }
+
+    public long getStartUsedHeap() {
+        return startUsedHeap;
+    }
+
+    public void setStartUsedHeap(long startUsedHeap) {
+        this.startUsedHeap = startUsedHeap;
+    }
+
+    public long getStartCommittedHeap() {
+        return startCommittedHeap;
+    }
+
+    public void setStartCommittedHeap(long startCommittedHeap) {
+        this.startCommittedHeap = startCommittedHeap;
+    }
+
+    public long getEndUsedHeap() {
+        return endUsedHeap;
+    }
+
+    public void setEndUsedHeap(long endUsedHeap) {
+        this.endUsedHeap = endUsedHeap;
+    }
+
+    public long getEndCommittedHeap() {
+        return endCommittedHeap;
+    }
+
+    public void setEndCommittedHeap(long endCommittedHeap) {
+        this.endCommittedHeap = endCommittedHeap;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TaskNode.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.listener.internaldata;
+
+import org.apache.tools.ant.Task;
+import java.util.Date;
+/**
+ * Object to set end time for a task.
+ *
+ */
+public class TaskNode extends DataNode {
+
+    private String name;
+
+    // location
+    private String filename;
+    private int line = -1;
+
+    public TaskNode(DataNode parent, Task task) {
+        super(parent, task);
+        this.setFilename(task.getLocation().getFileName());
+        this.setLine(task.getLocation().getLineNumber());        
+        name = task.getTaskName();
+    }
+
+    public String getName() {
+        return name;
+    } 
+
+    public String getFilename() {
+        return filename;
+    }
+
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+
+    public int getLine() {
+        return line;
+    }
+
+    public void setLine(int line) {
+        this.line = line;
+    }
+
+    public void setEndTime(Date endTime) {
+        super.setEndTime(endTime);
+        if ((endTime.getTime() - getStartTime().getTime() < 1000) && isEmpty() && getParent() != null) {
+            getParent().remove(this);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TreeDumper.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.listener.internaldata;
+
+import java.util.Iterator;
+/**
+ * Helper class to fix indentation of the xml.
+ *
+ */
+public class TreeDumper {
+    
+    private DataNode rootNode;
+    
+    public TreeDumper(DataNode root) {
+        this.rootNode = root;
+    }
+    
+    public void dump() {
+        dump(rootNode, "");
+    }
+
+    public void dump(DataNode root, String indent) {
+        System.out.println(indent + " + " + root);
+        for (Iterator<DataNode> i = root.iterator(); i.hasNext() ;) {
+            DataNode node = i.next();
+            dump(node, indent + "   ");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/XMLRenderer.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,282 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.listener.internaldata;
+
+import java.util.Iterator;
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.io.ByteArrayOutputStream;
+
+import org.dom4j.Document;
+//import org.dom4j.DefaultDocumentType;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.io.XMLWriter;
+import org.dom4j.io.OutputFormat;
+
+import org.apache.tools.ant.BuildEvent;
+/**
+ * This xml render object does the following - 
+ * Generates target only for TargetNode type of node
+ * Creates the targets section.
+ * Generates task only for TargetNode type of node
+ * Creates the task section.
+ * Creates execution tree recursively, visiting the DataNodes.
+ * Creates the execution tree section.
+ * Creates the property section.
+ * Renders the build node into XML string. 
+ */
+public class XMLRenderer {
+
+    // Dump of properties
+    private Hashtable<String, String> properties;
+    // the toplevel node.
+    private BuildNode root;
+    private BuildEvent buildEvent;
+    
+    // Helium content database. 
+    private Document database;
+    
+    // Deps hashes: helper to remove duplicates.
+    private Vector<String> targetList = new Vector<String>();
+    private Vector<String> taskList = new Vector<String>();
+    private Vector<String> assertList = new Vector<String>();
+    
+    public XMLRenderer(BuildNode root, Document database, Hashtable<String, String> properties, BuildEvent event) {
+        this.root = root; 
+        this.database = database;
+        this.properties = properties;
+        this.buildEvent = event;
+    }
+
+    /**
+     * Generating target only for TargetNode type of node
+     * @param node
+     * @param targets
+     */
+    protected void createTarget(DataNode node, Element targets) {
+        if (node instanceof TargetNode) {
+            TargetNode targetNode = (TargetNode)node;            
+            if (!targetList.contains(targetNode.getName() + targetNode.getFilename())) {
+                targetList.add(targetNode.getName() + targetNode.getFilename());
+                Element target = targets.addElement("target");
+                target.addAttribute("id", "target@" + targetList.indexOf(targetNode.getName() + targetNode.getFilename()));
+                target.addAttribute("name", targetNode.getName());
+                target.addAttribute("file", targetNode.getFilename());
+                target.addAttribute("line", "" + targetNode.getLine());
+            }
+        }
+        for (Iterator<DataNode> i = node.iterator() ; i.hasNext() ; ) {
+            createTarget(i.next(), targets);
+        }
+    }
+
+    /**
+     * Creating the targets section.
+     * @param statistics
+     */
+    protected void createTargets(Element statistics) {
+        Element targets = statistics.addElement("targets");
+        if (root != null) {
+            createTarget(root, targets);
+        }
+    }
+
+    /**
+     * Generating task only for TargetNode type of node
+     * @param node
+     * @param targets
+     */
+    protected void createTask(DataNode node, Element targets) {
+        if (node instanceof TaskNode) {            
+            TaskNode taskNode = (TaskNode)node;
+            if (!taskList.contains(taskNode.getName())) {
+                taskList.add(taskNode.getName());
+                Element target = targets.addElement("task");
+                target.addAttribute("id", "task@" + taskList.indexOf(taskNode.getName()));
+                target.addAttribute("name", taskNode.getName());                
+            }
+        }
+        for (Iterator<DataNode> i = node.iterator() ; i.hasNext() ; ) {
+            createTask(i.next(), targets);
+        }
+    }    
+    
+    /**
+     * Creating the task section.
+     * @param statistics
+     */
+    protected void createTasks(Element statistics) {
+        Element tasks = statistics.addElement("tasks");
+        if (root != null) {
+            createTask(root, tasks);
+        }
+    }
+    
+    /**
+     * Creating the assert section.
+     * @param statistics
+     */
+    protected void createAsserts(Element statistics) {
+        Element asserts = statistics.addElement("asserts");
+        if (root != null) {
+            createAssert(root, asserts);
+        }
+    }
+    
+    /**
+     * Generating assert only for TargetNode type of node
+     * @param node
+     * @param targets
+     */
+    protected void createAssert(DataNode node, Element targets) {
+        
+        if (node instanceof AssertNode) {
+            AssertNode assertNode = (AssertNode)node;
+            if (assertNode.getAssertName() != null) {
+                assertList.add(assertNode.getAssertName());
+                Element target = targets.addElement("assert");
+                target.addAttribute("id", "assert@" + assertList.indexOf(assertNode.getAssertName()));
+                target.addAttribute("name", assertNode.getAssertName());
+                //target.addAttribute("assertname", assertNode.getAssertName());
+                target.addAttribute("file", assertNode.getFilename());
+                target.addAttribute("line", "" + assertNode.getLine());
+                target.addAttribute("message", "" + assertNode.getMessage());
+            }
+            
+        }
+        for (Iterator<DataNode> i = node.iterator() ; i.hasNext() ; ) {
+            createAssert(i.next(), targets);
+        }
+    }
+
+    /**
+     * Creating execution tree recursively, visiting the DataNodes.
+     * @param node
+     * @param tree
+     */
+    protected void createTree(DataNode node, Element tree) {
+        Element elt = null;
+        if (node instanceof BuildNode) {
+            BuildNode buildNode = (BuildNode)node;
+            elt = tree.addElement("build");
+            elt.addAttribute("name", buildNode.getName());            
+            elt.addAttribute("startTime", "" + buildNode.getStartTime().getTime());
+            elt.addAttribute("endTime", "" + buildNode.getEndTime().getTime());
+            elt.addAttribute("status", buildNode.getSuccessful() ? "successful" : "failed");            
+            elt.addAttribute("thread", "" + buildNode.getThreadId());            
+        } else if (node instanceof TargetNode) {
+            TargetNode targetNode = (TargetNode)node;
+            elt = tree.addElement("targetRef");
+            elt.addAttribute("reference", "target@" + targetList.indexOf(targetNode.getName() + targetNode.getFilename()));
+            elt.addAttribute("startTime", "" + targetNode.getStartTime().getTime());
+            elt.addAttribute("endTime", "" + targetNode.getEndTime().getTime());
+            elt.addAttribute("thread", "" + targetNode.getThreadId());
+            elt.addAttribute("startUsedHeap", "" + targetNode.getStartUsedHeap());
+            elt.addAttribute("startCommittedHeap", "" + targetNode.getStartCommittedHeap());
+            elt.addAttribute("endUsedHeap", "" + targetNode.getEndUsedHeap());
+            elt.addAttribute("endCommittedHeap", "" + targetNode.getEndCommittedHeap());
+        } else if (node instanceof TaskNode) {
+            TaskNode taskNode = (TaskNode)node;
+            elt = tree.addElement("taskRef");
+            elt.addAttribute("reference", "task@" + taskList.indexOf(taskNode.getName()));
+            elt.addAttribute("startTime", "" + taskNode.getStartTime().getTime());
+            elt.addAttribute("endTime", "" + taskNode.getEndTime().getTime());
+            elt.addAttribute("thread", "" + taskNode.getThreadId());
+        } else if (node instanceof AssertNode) {
+            AssertNode assertNode = (AssertNode)node;
+            if (assertNode.getAssertName() != null) {
+                elt = tree.addElement("assertRef");
+                elt.addAttribute("reference", "assert@" + assertList.indexOf(assertNode.getAssertName()));
+                elt.addAttribute("startTime", "" + assertNode.getStartTime().getTime());
+                elt.addAttribute("endTime", "" + assertNode.getEndTime().getTime());
+                elt.addAttribute("thread", "" + assertNode.getThreadId());
+            }
+        }
+        
+        if (elt != null) {
+            for (Iterator<DataNode> i = node.iterator() ; i.hasNext() ; ) {
+                createTree(i.next(), elt);
+            }
+        }
+    }
+    
+    /**
+     * Creating the execution tree section.
+     * @param statistics
+     */
+    protected void createExecutionTree(Element statistics) {
+        Element executionTree = statistics.addElement("executionTree");
+        if (root != null) {
+            createTree(root, executionTree);
+        }
+    }
+
+    /**
+     * Creating the property section.
+     * @param statistics
+     */
+    protected void createProperties(Element statistics) {
+        Element propertiesElt = statistics.addElement("properties");
+        if (properties != null) {
+            for (Enumeration<String> e = properties.keys(); e.hasMoreElements() ; ) {
+                String key = e.nextElement();
+                Element propertyElt = propertiesElt.addElement("property");
+                propertyElt.addAttribute("name", key);
+                propertyElt.addAttribute("value", properties.get(key));
+            }
+        }
+    }
+    
+    protected void insertDatabase(Element statistics) {
+        if (database != null) {
+            Element databaseElt = statistics.addElement("database");
+            databaseElt.add(database.getRootElement().detach());
+        }
+    }
+    
+    /**
+     * Rendering the build node into XML string. 
+     */
+    public String toString() {
+        // Creating the XML document
+        Document document = DocumentHelper.createDocument();
+        // DefaultDocumentType(String elementName, String publicID, String systemID) 
+        //document.setDocType(new DefaultDocumentType());
+        Element statistics = document.addElement( "statistics" );
+        statistics.addAttribute("version", "1.0");
+        
+        // Creating the document content.
+        insertDatabase(statistics);
+        createTargets(statistics);
+        createTasks(statistics);
+        createAsserts(statistics);
+        createExecutionTree(statistics);
+        createProperties(statistics);
+        try {
+            ByteArrayOutputStream output = new ByteArrayOutputStream(); 
+            XMLWriter out = new XMLWriter(output, OutputFormat.createPrettyPrint());
+            out.write(document);
+            return output.toString();
+        } catch (Exception exc) {
+            return document.asXML();            
+        }        
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntConfigurationTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,133 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.FileResource;
+
+import org.apache.commons.configuration.*;
+
+/**
+ * Can load ant configuration file both in .xml and .txt format.
+ * In .txt file configuration could be defined like -
+ * text.a = text.value.A
+ * text.b : text.value.B
+ * text.c : ${text.a}
+ * In .xml file configuration could be defined like -
+ * <config>
+ *   <foo>bar</foo>
+ *   <interpolated>foo value = ${foo}</interpolated>
+ *    <xml>
+ *        <c>C</c>
+ *        <d>D</d>
+ *    </xml>
+ *    <array>
+ *        <value>one</value>
+ *        <value>two</value>
+ *    </array>
+ *</config> 
+ * @ant.task name="configuration"
+*/
+public class AntConfigurationTask extends Task
+{
+    private String filepath;
+
+    private ArrayList rcs;
+
+    public AntConfigurationTask()
+    {
+        rcs = new ArrayList();
+    }
+
+    public final void setFile(final String file)
+    {
+        this.filepath = file;
+    }
+
+    public final void addFileset(final FileSet set)
+    {
+        add(set);
+    }
+
+    public final void add( final ResourceCollection res)
+    {
+        rcs.add(res);
+    }
+
+    public final void execute() 
+    {
+        if (filepath != null)
+        {
+            importFile(new File(filepath));
+        }
+        else
+        {
+            Iterator resourceCollectionIter = rcs.iterator();
+
+            while (resourceCollectionIter.hasNext())
+            {
+                ResourceCollection resourceCollection = (ResourceCollection) resourceCollectionIter
+                        .next();
+                Iterator resourceIter = resourceCollection.iterator();
+                while (resourceIter.hasNext())
+                {
+                    FileResource filepath = (FileResource) resourceIter.next();
+                    log(filepath.toString());
+                    importFile(filepath.getFile());
+                }
+            }
+        }
+    }
+
+    private void importFile(final File file)
+    {
+        try
+        {
+            String filename = file.getName();
+            Configuration config = null;
+            if (filename.endsWith(".txt"))
+            {
+                config = new PropertiesConfiguration(file);
+            }
+            else if (filename.endsWith(".xml"))
+            {
+                config = new XMLConfiguration(file);
+            }
+            Iterator keysIter = config.getKeys();
+            while (keysIter.hasNext())
+            {
+                String key = (String) keysIter.next();
+                log(key);
+                getProject().setProperty(key, config.getString(key));
+            }
+        }
+        catch (ConfigurationException e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntDependencyTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,335 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.DirectoryScanner;
+
+import java.util.jar.*;
+import java.util.zip.ZipEntry;
+import java.net.*;
+import org.dom4j.io.SAXReader;
+import org.dom4j.Document;
+import org.dom4j.Element;
+
+/**
+ * Outputs a directed graph of Ant library dependencies, reads information from dependency jars
+ */
+public class AntDependencyTask extends Task
+{
+    private ArrayList antFileSetList = new ArrayList();
+    private String outputFile;
+
+    public AntDependencyTask()
+    {
+        setTaskName("AntDependencyTask");
+    }
+    
+    /**
+     * Add a set of files to copy.
+     * @param set a set of files to AntDependencyTask.
+     * @ant.required
+     */
+    public void addFileset(FileSet set) {
+        antFileSetList.add(set);
+    }
+    
+    /**
+     * Location of graph file to output to
+     * @ant.required
+     */
+    public void setOutputFile(String path)
+    {
+        outputFile = path;
+    }
+    
+    public String classToJar(Class aclass)
+    {
+        String name = aclass.getName().replace(".", "/") + ".class";
+      
+        for (Iterator iterator = antFileSetList.iterator(); iterator.hasNext();)
+        {
+            FileSet fs = (FileSet) iterator.next();
+            DirectoryScanner ds = fs.getDirectoryScanner(project);
+            String[] srcFiles = ds.getIncludedFiles();
+            String basedir = ds.getBasedir().getPath();
+            //log(basedir);
+            
+            for (int i = 0; i < srcFiles.length; i++)
+            {
+                String fileName = basedir + File.separator + srcFiles[i];
+                //log(fileName);
+                try {
+                    JarFile jar = new JarFile(fileName);
+                    
+                    //for (Enumeration e = jar.entries(); e.hasMoreElements() ;) {log(e.nextElement().toString()); }
+                    
+                    if (jar.getJarEntry(name) != null)
+                        return fileName;
+                }
+                catch (IOException e) { e.printStackTrace(); }
+            }
+        }
+        log(name + " not found");
+        return null;
+    }
+    
+    public String getJarAttr(JarFile jar, String nameOfAttr)
+    {
+        try {
+            String attr = jar.getManifest().getMainAttributes().getValue(nameOfAttr);
+            if (attr != null)
+                return attr;
+        
+            Manifest manifest = jar.getManifest();
+            Map map = manifest.getEntries();
+        
+            for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+                String entryName = (String)it.next();
+                Attributes attrs = (Attributes)map.get(entryName);
+        
+                for (Iterator it2 = attrs.keySet().iterator(); it2.hasNext(); )
+                {
+                    Attributes.Name attrName = (Attributes.Name)it2.next();
+                        if (attrName.toString() == nameOfAttr)
+                            return attrs.getValue(attrName).replace("\"", "");
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    
+    public HashSet<String> getJarInfo()
+    {
+        HashSet<String> classlist = new HashSet<String>();
+        
+        for (Iterator iterator = antFileSetList.iterator(); iterator.hasNext();)
+        {
+            FileSet fs = (FileSet) iterator.next();
+            DirectoryScanner ds = fs.getDirectoryScanner(project);
+            String[] srcFiles = ds.getIncludedFiles();
+            String basedir = ds.getBasedir().getPath();
+            //log(basedir);
+            
+            for (int i = 0; i < srcFiles.length; i++)
+            {
+                String fileName = basedir + File.separator + srcFiles[i];
+                //log(fileName);
+                try {
+                    JarFile jar = new JarFile(fileName);
+                    
+                    String vendor = getJarAttr(jar, "Implementation-Vendor");
+                    String version = getJarAttr(jar, "Implementation-Version");
+                    if (version == null)
+                        version = getJarAttr(jar, "Specification-Version");
+                    String name = convertJarName(fileName);
+                    
+                    //findLicense(srcFiles[i], jar);
+                    
+                    String nameandversion = name;
+                    
+                    if (version != null)
+                    {
+                        version = version.replace("$", "");
+                        if (!digitInString(name))
+                            nameandversion = name + " " + version;
+                    }
+                    if (vendor == null)
+                        vendor = "";
+                    classlist.add(name + " [style=filled,shape=record,label=\"" + nameandversion + "|" + vendor + "\"];");
+                }
+                catch (IOException e) { e.printStackTrace(); }
+            }
+        }
+
+        return classlist;
+    }
+    
+    public void findLicense(String name, JarFile jar)
+    {
+        try {
+            ZipEntry entry = jar.getEntry("META-INF/LICENSE");
+            if (entry == null)
+                entry = jar.getEntry("META-INF/LICENSE.txt");
+            if (entry != null)
+            {
+              /**/
+                System.out.println(name);
+            
+                byte[] data = new byte[1024];
+                jar.getInputStream(entry).read(data);
+                for (String line : new String(data).split("\n"))
+                {
+                    if (line.contains("License") || line.contains("LICENSE ") || line.contains("Copyright"))
+                    {
+                        System.out.println(line.replace("*", "").trim());
+                        break;
+                    }
+                }
+            }
+            else
+            {   
+                //http://mirrors.ibiblio.org/pub/mirrors/maven2/
+                String mavenUrl = "http://repo2.maven.org/maven2/";
+                Enumeration jarfiles = jar.entries();
+                boolean found = false;
+                while (!found && jarfiles.hasMoreElements ()) {
+                    ZipEntry file = (ZipEntry) jarfiles.nextElement();
+                    if (file.isDirectory())
+                    {   
+                        String filename = file.getName();
+                        String[] split = file.getName().split("/");
+                        String end = split[split.length - 1];
+                        String specialfilename = filename + end;
+                        
+                        URL url = new URL(mavenUrl + filename + end + "/maven-metadata.xml");
+                        if (!end.equals("apache"))
+                        {
+                            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+                            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
+                            {
+                                filename = filename.replace(end, name.replace(".jar", ""));
+                                end = name.replace(".jar", "");
+                                specialfilename = filename;
+                                url = new URL(mavenUrl + filename + "maven-metadata.xml");
+                                connection = (HttpURLConnection) url.openConnection();
+                            }
+                            //System.out.println(url);
+                            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK)
+                            {   
+                                
+                                SAXReader xmlReader = new SAXReader();
+                                Document antDoc = xmlReader.read(url.openStream());
+                                List versions = antDoc.selectNodes("//versioning/versions/version");
+                                //if (version.equals(""))
+                                //{
+                                //    version = antDoc.valueOf("/metadata/version");
+                                //}
+                                Collections.reverse(versions);
+                                for (Object tmpversion : versions)
+                                {
+                                    String version = ((Element)tmpversion).getText();
+                                    URL url2 = new URL(mavenUrl + specialfilename + "/" + version + "/" + end + "-" + version + ".pom");
+                                    //System.out.println(url2);
+                                    HttpURLConnection connection2 = (HttpURLConnection) url2.openConnection();
+                                    if (connection2.getResponseCode() == HttpURLConnection.HTTP_OK)
+                                    {
+                                        DataInputStream din = new DataInputStream(url2.openStream());
+                                        StringBuffer sb = new StringBuffer();
+                                        String line = null;
+                                        while ((line = din.readLine()) != null) {
+                                            line = line.replace("xmlns=\"http://maven.apache.org/POM/4.0.0\"", "");
+                                            sb.append(line + "\n");
+                                        }
+                                        xmlReader = new SAXReader();
+                                        //
+                                        Document antDoc2 = xmlReader.read(new ByteArrayInputStream(new String(sb).getBytes()));
+                                        String license = antDoc2.valueOf("/project/licenses/license/name");
+                                        if (!license.equals(""))
+                                        {
+                                            System.out.println(name);
+                                            //System.out.println(antDoc2.valueOf("/project/name"));
+                                            System.out.println(license);
+                                            found = true;
+                                            break;
+                                        }
+                                            
+                                    }
+                                }
+                            }
+                        }
+                    }   
+                    
+                }
+                if (!found)
+                    System.out.println(name + " not found");
+            }
+        }
+        catch (Exception e) { e.printStackTrace(); }
+    }
+    
+    public boolean digitInString(String s) {
+        int j = s.length() - 1;
+        while (j >= 0 && Character.isDigit(s.charAt(j))) {
+            return true;
+        }
+        return false;
+    }
+
+    
+    public String convertJarName(String jar)
+    {
+        return new File(jar).getName().replace(".jar", "").replace("-", "_").replace(".", "_");
+    }
+    
+    public final void execute()
+    {
+        try {
+            Project project = getProject();
+            
+            Hashtable taskdefs = project.getTaskDefinitions();
+            
+            HashSet<String> classlist = new HashSet<String>();
+            
+            Enumeration taskdefsenum = taskdefs.keys();
+            while (taskdefsenum.hasMoreElements ()) {
+                String key = (String) taskdefsenum.nextElement();
+                Class value = (Class) taskdefs.get(key);
+                if (!key.contains("nokia") && !value.toString().contains("org.apache.tools.ant"))
+                {
+                    String name = value.getPackage().getName();
+                    String vendor = value.getPackage().getImplementationVendor();
+                    
+                    name = classToJar(value);
+                    
+                    if (name != null)
+                    {
+                        name = convertJarName(name);
+                      
+                        classlist.add("helium_ant -> \"" + name + "\";");
+                        
+                        if (vendor == null)
+                            vendor = "";
+                        
+                        classlist.add(name + " [style=filled,shape=record,label=\"" + name + "|" + vendor + "\"];");
+                    }
+                }
+            }
+            
+            classlist.add("helium_ant -> nokia_ant;");
+            
+            classlist.addAll(getJarInfo());
+        
+            Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF8"));
+            
+            for (String value : classlist)
+                output.write(value + "\n");
+            
+            output.close();
+        } catch (Exception e) { e.printStackTrace();
+        }
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntLintTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,937 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.BuildException;
+
+import org.dom4j.io.SAXReader;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.VisitorSupport;
+import org.dom4j.Visitor;
+import org.xml.sax.*;
+import org.xml.sax.helpers.DefaultHandler; 
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.util.regex.*;
+
+/**
+ * AntLint Task. This task checks for common coding conventions 
+ * and errors in Ant XML script files.
+ * 
+ * <p>The current checks include: 
+ * <ul>
+ * <li>Macro names.
+ * <li>Preset def names.
+ * <li>Target names. 
+ * <li>Property names and Indentation.
+ * <li>Project names.</li>
+ * <li>Project description is present.</li>
+ * <li>Ant file names.</li>
+ * <li>runtarget calls a target that has dependencies.</li>
+ *  <li>antcall is used with no param elements and calls a target
+ * with no dependencies (could use runtarget instead).</li>
+ * </ul>
+ * </p>
+ *
+ * <p>Checks to be added:
+ * <ul>
+ * <li>Help target is defined.</li>
+ * <li>Optional to thrown warnings about deprecated targets (rename, copydir, copyfile).</li>
+ * </ul>
+ * </p>
+ * @ant.task category="Quality"
+ *
+ */
+public class AntLintTask extends Task
+{
+    private ArrayList propertiesVisited = new ArrayList();
+    private ArrayList antFileSetList = new ArrayList();
+    private ArrayList<AntFile> antFilelist = new ArrayList<AntFile>();
+    
+    private String configurationPath;
+    
+    private boolean tabCharacterCheck;
+    private boolean propertyNameCheck;
+    private boolean targetNameCheck;
+    private boolean indentationCheck;
+    private boolean presetDefMacroDefNameCheck;
+    private boolean projectNameCheck;
+    private boolean descriptionCheck;
+    private boolean fileNameCheck;
+    private boolean runTargetCheck;
+    private boolean antcallCheck;
+    
+    private String propertyNamePattern;
+    private String targetNamePattern;
+    private String presetDefMacroDefNamePattern;
+    private String projectNamePattern;
+    private String fileNamePattern;
+    
+    private AntFile currentFile;
+    
+    private class AntFile implements Comparable<AntFile>
+    {
+        private String name;
+        private int warningCount;
+        private int errorCount;
+        
+        public AntFile(String n) { name = n; }
+        public void incWarningCount() { warningCount++; }
+        public int getWarningCount() { return warningCount; }
+        public void incErrorCount() { errorCount++; }
+        public int getErrorCount() { return errorCount; }
+        
+        public String toString()
+        {
+            if (errorCount > 0)
+                throw new BuildException(errorCount + " errors found in " + name); 
+            return warningCount + " warnings " + name;
+        }
+        
+        public int compareTo(AntFile o)
+        {
+            return new Integer(o.getWarningCount()).compareTo(new Integer(warningCount)) * -1;
+        }
+    }
+    
+    /**
+     * AntLintTask Constructor
+     */
+    public AntLintTask()
+    {
+        setTaskName("antlint");
+    }
+    
+    /**
+     * Add a set of files to copy.
+     * @param set a set of files to AntLintTask.
+     * @ant.required
+     */
+    public void addFileset(FileSet set) {
+        antFileSetList.add(set);
+    }
+    
+    /**
+     * Set the path of the configuration file to use.
+     * 
+     * @param configurationPath path to config file
+     * @ant.required
+     */
+    public void setConfigFile(String configurationPath)
+    {
+        this.configurationPath = configurationPath;
+    }
+    
+    public void checkDuplicateNames(Project project)
+    {
+        Hashtable taskdefs = project.getTaskDefinitions();
+        HashSet<String> classlist = new HashSet<String>();
+        Enumeration taskdefsenum = taskdefs.keys();
+        ArrayList<String> macros = new ArrayList<String>();
+        while (taskdefsenum.hasMoreElements ()) {
+            String key = (String) taskdefsenum.nextElement();
+            Class value = (Class) taskdefs.get(key);
+            macros.add(key);
+        }
+        currentFile = new AntFile("General");
+        antFilelist.add(currentFile);
+        for (String x : macros)
+        {
+            if (macros.contains(x + "Macro") || macros.contains(x + "macro"))
+                log("W: " + x + " and " + x + "Macro" + " found duplicate name");
+                currentFile.incWarningCount();
+        }
+    }
+      
+    public final void execute()
+    {
+        try
+        {
+            log("Running antlint..", Project.MSG_DEBUG);
+            Project project = getProject();
+            
+            getConfiguration();//loads configuration file
+            
+            checkDuplicateNames(project);
+            
+            for (Iterator iterator = antFileSetList.iterator(); iterator.hasNext();)
+            {
+                FileSet fs = (FileSet) iterator.next();
+                DirectoryScanner ds = fs.getDirectoryScanner(project);
+                String[] srcFiles = ds.getIncludedFiles();
+                String basedir = ds.getBasedir().getPath();
+                
+                for (int i = 0; i < srcFiles.length; i++) 
+                {    
+                    String antFileName = basedir + File.separator + srcFiles[i];
+                    log("*************** Ant File: " + antFileName);
+                    
+                    currentFile = new AntFile(antFileName);
+                    antFilelist.add(currentFile);
+                    
+                    checkFileName(new File(antFileName).getName());
+                                       
+                    SAXReader saxReader = new SAXReader();
+                    Document doc = saxReader.read(new File(antFileName));
+                    treeWalk(doc);
+                    
+                    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
+                    saxFactory.setNamespaceAware(true);
+                    saxFactory.setValidating(true);
+                    SAXParser parser = saxFactory.newSAXParser();
+                    AntLintHandler handler = new AntLintHandler();
+                    parser.parse(new File(antFileName), handler);
+                }
+                
+                Collections.sort(antFilelist);
+            }  
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        
+        for (AntFile s : antFilelist)
+        {
+            log(s.toString());
+        }
+    }
+
+    public final void treeWalk(final Document document)
+    {
+        Element rootElement = document.getRootElement();
+        Visitor visitorRootElement = new AntProjectVisitor();
+        rootElement.accept(visitorRootElement);
+        treeWalk(rootElement);        
+    }
+
+    public final void treeWalk(final Element element)
+    {
+        for ( int i = 0, size = element.nodeCount(); i < size; i++ ) 
+        {
+            Node node = element.node(i);
+            if ( node instanceof Element ) 
+            {
+                Visitor visitorElement = new AntXMLVisitor();
+                node.accept(visitorElement);
+                treeWalk( (Element) node );
+            }
+        }
+    }
+    
+    private void checkFileName(String text)
+    {
+        try
+        {
+            boolean found = false;
+            Pattern p1 = Pattern.compile(fileNamePattern);
+            Matcher m1 = p1.matcher(text);
+            while (m1.find())
+            {
+                found = true;            
+            }
+            if (!found && fileNameCheck) {
+                log("W: INVALID File Name: " + text);
+                currentFile.incWarningCount();
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+    
+    public final void getConfiguration()
+    {
+        try
+        {
+            SAXReader saxConfigReader = new SAXReader();
+            Document docConfig = saxConfigReader.read(new File(configurationPath));
+        
+            Element rootConfig = docConfig.getRootElement();
+    
+            // iterate through child elements of root
+            for ( Iterator i = rootConfig.elementIterator(); i.hasNext(); ) {
+                Element elementConfig = (Element) i.next();
+                String attrName = elementConfig.attributeValue("name");
+                if (attrName.equals("TabCharacter")) {
+                        tabCharacterCheck = true;
+                }
+                else if (attrName.equals("PropertyName")) {
+                        propertyNameCheck = true;
+                        propertyNamePattern = elementConfig.getText();
+                }
+                else if (attrName.equals("TargetName")) {
+                        targetNameCheck = true;
+                        targetNamePattern = elementConfig.getText();
+                }
+                else if (attrName.equals("Indentation")) {
+                        indentationCheck = true;
+                }
+                else if (attrName.equals("PresetDefMacroDefName")) {   
+                        presetDefMacroDefNameCheck = true;
+                        presetDefMacroDefNamePattern = elementConfig.getText();
+                }
+                else if (attrName.equals("ProjectName")) {
+                        projectNameCheck = true;
+                        projectNamePattern = elementConfig.getText();
+                }
+                else if (attrName.equals("Description")) {
+                        descriptionCheck = true;
+                }
+                else if (attrName.equals("FileName")) {
+                        fileNameCheck = true;
+                        fileNamePattern = elementConfig.getText();
+                }
+                else if (attrName.equals("RunTarget")) {
+                        runTargetCheck = true;
+                }
+                else if (attrName.equals("AntCall")) {
+                        antcallCheck = true;
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+
+    }
+    
+    private class AntXMLVisitor extends VisitorSupport
+    {    
+        public void visit(Element node)
+        {
+            String name = node.getName();
+            if (name.equals("target"))
+            {
+                checkTarget(node);
+            }
+            if (name.equals("property"))
+            {
+                String text = node.attributeValue("name");
+                if (text != null && propertyNameCheck)
+                {
+                    checkPropertyName(text);
+                }
+            }
+            if (name.equals("equals"))
+            {
+                String text = node.attributeValue("arg2");
+                if (text.equals("true") || text.equals("yes"))
+                {
+                    log("E: " + node.attributeValue("arg1") + " uses 'equals' should use 'istrue' task");
+                    currentFile.incErrorCount();
+                }
+            }
+            if (name.equals("presetdef") || name.equals("macrodef"))
+            {
+                String text = node.attributeValue("name");
+                if (text != null && presetDefMacroDefNameCheck)
+                {
+                    checkDefName(text);
+                }
+            }
+            
+            if (name.equals("scriptdef"))
+            {
+                String scriptdefname = node.attributeValue("name");
+                String language = node.attributeValue("language");
+                
+                checkScriptdef(scriptdefname, node);
+                
+                if (language.equals("beanshell"))
+                {
+                    writeBeanshellFile(scriptdefname, node.getText());
+                }
+
+                if (language.equals("jep") || language.equals("jython"))
+                {
+                    writeJepFile(scriptdefname, node.getText());
+                    checkJepPropertiesInText(node.getText());
+                }
+            }
+        }
+        
+        private void checkTarget(Element node)
+        {
+            String target = node.attributeValue("name");
+            if (target != null && targetNameCheck)
+            {
+                checkTargetName(target);
+            }
+            else
+            {
+                log("W: Target name not specified!");
+                currentFile.incWarningCount();
+            }
+            checkUseOfIf(node);
+            checkSizeOfScript(node);
+            checkTabsInScript(node);
+            if ((node.elements("runtarget") != null) && runTargetCheck)
+            {
+                List runTargetList = node.elements("runtarget");
+                for (Iterator iterator = runTargetList.iterator(); iterator.hasNext();)
+                {
+                    Element runTargetElement = (Element) iterator.next();
+                    String runTargetName = runTargetElement.attributeValue("target");
+                    if (checkTargetDependency(runTargetName))
+                    {
+                        log("W: <runtarget> calls the target " +  runTargetName + " that has dependencies!");
+                        currentFile.incWarningCount();
+                    }
+                }
+            }
+            if ((node.elements("antcall") != null) && antcallCheck)
+            {
+                List antcallList = node.elements("antcall");
+                for (Iterator iterator = antcallList.iterator(); iterator.hasNext();)
+                {
+                    Element antcallElement = (Element) iterator.next();
+                    String antcallName = antcallElement.attributeValue("target");
+                    if ((node.elements("param") == null) && !checkTargetDependency(antcallName))
+                    {
+                        log("R: <antcall> is used with no param elements and calls the target " +  antcallName + " that has no dependencies! (<runtarget> could be used instead.)");
+                        currentFile.incWarningCount();
+                    }
+                }
+            }
+            
+            List scriptList = node.selectNodes("//target[@name='" + target + "']/descendant::script");
+            for (Iterator iterator = scriptList.iterator(); iterator.hasNext();)
+            {
+                Element scriptElement = (Element) iterator.next();
+                String language = scriptElement.attributeValue("language");
+                if (language.equals("jep") || language.equals("jython"))
+                {
+                    writeJepFile("target_" + target, scriptElement.getText());
+                    checkJepPropertiesInText(scriptElement.getText());
+                }
+            }
+
+            List scriptList2 = node.selectNodes("//target[@name='" + target + "']/descendant::scriptcondition");
+            for (Iterator iterator = scriptList2.iterator(); iterator.hasNext();)
+            {
+                Element scriptElement2 = (Element) iterator.next();
+                String language2 = scriptElement2.attributeValue("language");
+                if (language2.equals("jep") || language2.equals("jython"))
+                {
+                    writeJepFile("scriptcondition_" + target, scriptElement2.getText());
+                    checkJepPropertiesInText(scriptElement2.getText());
+                }
+            }
+            
+            List pythonList = node.selectNodes("//target[@name='" + target + "']/descendant::*[name()=\"hlm:python\"]");
+            int i = 0;
+            for (Iterator iterator = pythonList.iterator(); iterator.hasNext();)
+            {
+                Element pythonElement = (Element) iterator.next();
+                writePythonFile(i + "_" + target, pythonElement.getText());
+                i++;
+            }
+        }
+        
+        private void writePythonFile(String scriptdefname, String text)
+        {
+            try {
+            String heliumpath = new File(project.getProperty("helium.build.dir")).getCanonicalPath();
+            new File(heliumpath + File.separator + "python").mkdirs();
+            File file = new File(heliumpath + File.separator + "python" + File.separator + "target" + scriptdefname + ".py");
+            PrintWriter output = new PrintWriter(new FileOutputStream(file));
+            output.write(text);
+            output.close();
+            checkPropertiesInText(text);
+            } catch (Exception e) { e.printStackTrace(); }
+        }
+        
+        private void writeBeanshellFile(String scriptdefname, String text)
+        {
+            scriptdefname = "Beanshell" + scriptdefname;
+            try {
+            String heliumpath = new File(project.getProperty("helium.build.dir")).getCanonicalPath();
+            new File(heliumpath + File.separator + "beanshell").mkdirs();
+            File file = new File(heliumpath + File.separator + "beanshell" + File.separator + scriptdefname + ".java");
+            PrintWriter output = new PrintWriter(new FileOutputStream(file));
+            
+            for (String line : text.split("\n"))
+            {
+                if (line.trim().startsWith("import"))
+                    output.write(line + "\n");
+            }
+            
+            output.write("/**\n * x\n */\npublic final class " + scriptdefname + " {\n");
+            output.write("private " + scriptdefname + "() { }\n");
+            output.write("public static void main(String[] args) {\n");
+            for (String line : text.split("\n"))
+            {
+                if (!line.trim().startsWith("import"))
+                    output.write(line + "\n");
+            }
+            output.write("} }");
+            output.close();
+            } catch (Exception e) { e.printStackTrace(); }
+        }
+        
+        private void writeJepFile(String scriptdefname, String text)
+        {   
+            if (text.contains("${"))
+            {
+                log("E: ${ found in " + scriptdefname);
+                currentFile.incErrorCount();
+            }
+          
+            try {
+            String heliumpath = new File(project.getProperty("helium.build.dir")).getCanonicalPath();
+            new File(heliumpath + File.separator + "jep").mkdirs();
+            File file = new File(heliumpath + File.separator + "jep" + File.separator + scriptdefname + "_jep.py");
+            PrintWriter output = new PrintWriter(new FileOutputStream(file));
+            output.write("attributes = {} # pylint: disable-msg=C0103\n");
+            output.write("elements = {} # pylint: disable-msg=C0103\n");
+            output.write("project = None # pylint: disable-msg=C0103\n");
+            output.write("self = None # pylint: disable-msg=C0103\n");
+            text = text.replace(" File(", " self.File(");
+            
+            output.write(text);
+            output.close();
+            
+            if (text.contains("import "))
+            {
+                File file2 = new File(heliumpath + File.separator + "test_jython.xml");
+                PrintWriter output2 = new PrintWriter(new FileOutputStream(file2, true));
+                output2.write("try:\n");
+                for (String line : text.split("\n"))
+                {
+                    if (line.trim().startsWith("import ") || line.trim().startsWith("from "))
+                        output2.write("    " + line + "\n");
+                }
+                
+                output2.write("except ImportError, e:\n");
+                output2.write("    print '" + scriptdefname + " failed: ' + str(e)\n");
+                output2.close();
+            }
+            } catch (Exception e) { e.printStackTrace(); }
+        }
+        
+        private void checkJepPropertiesInText(String text)
+        {
+            Pattern p1 = Pattern.compile("getProperty\\([\"']([a-zA-Z0-9\\.]*)[\"']\\)");
+            Matcher m1 = p1.matcher(text);
+            ArrayList<String> props = new ArrayList<String>();
+            while (m1.find())
+            {
+                props.add(m1.group(1));
+            }
+            for (String group : props)
+                checkPropertyInModel(group);
+        }
+        
+        private void checkPropertiesInText(String text)
+        {
+            Pattern p1 = Pattern.compile("r[\"']\\$\\{([a-zA-Z0-9\\.]*)\\}[\"']");
+            Matcher m1 = p1.matcher(text);
+            ArrayList<String> props = new ArrayList<String>();
+            while (m1.find())
+            {
+                props.add(m1.group(1));
+            }
+            for (String group : props)
+                checkPropertyInModel(group);
+        }
+        
+        public void checkScriptdef(String name, Node node)
+        {   
+            List<Node> statements = node.selectNodes("//scriptdef[@name='" + name + "']/attribute");
+            
+            Pattern p1 = Pattern.compile("attributes.get\\([\"']([^\"']*)[\"']\\)");
+            Matcher m1 = p1.matcher(node.getText());
+            ArrayList<String> props = new ArrayList<String>();
+            while (m1.find())
+            {
+                props.add(m1.group(1));
+            }
+            
+            ArrayList<String> attributes = new ArrayList<String>();
+            for (Node statement : statements)
+            {
+                attributes.add(statement.valueOf("@name"));
+            }
+            for (String x : props)
+            {
+                if (!attributes.contains(x))
+                {
+                    log("E: Scriptdef " + name + " does not have attribute " + x);
+                    currentFile.incErrorCount();
+                }
+            }
+            
+            if (!statements.isEmpty() && props.isEmpty())
+            {
+                log("W: Scriptdef " + name + " doesn't reference attributes directly, poor style");
+                currentFile.incWarningCount();
+            }
+            else
+            {
+                for (Node statement : statements)
+                {                
+                    if (!props.contains(statement.valueOf("@name")))
+                    {
+                        //for (String x : props)
+                        //    log(x);
+                        log("E: Scriptdef " + name + " does not use " + statement.valueOf("@name"));
+                        currentFile.incErrorCount();
+                    }
+                }
+            }
+        }
+        
+        public void checkPropertyInModel(String customerProp)
+        {
+            SAXReader xmlReader = new SAXReader();
+            Document antDoc = null;
+            
+            try {
+            File model = new File(project.getProperty("data.model.parsed"));
+            antDoc = xmlReader.read(model);
+            } catch (Exception e) { e.printStackTrace(); }
+            
+            List<Node> statements = antDoc.selectNodes("//property");
+            
+            for (Node statement : statements)
+            {
+                if (customerProp.equals(statement.valueOf("name")))
+                {
+                    return;
+                }
+            }
+            log("W: " + customerProp + " not in data model");
+            currentFile.incWarningCount();
+        }
+                  
+        private void checkTargetName(String text)
+        {     
+            try
+            {
+                Pattern p1 = Pattern.compile(targetNamePattern);
+                Matcher m1 = p1.matcher(text);
+                if (!m1.matches())
+                {
+                    log("W: INVALID Target Name: " + text);
+                    currentFile.incWarningCount();
+                }
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+        
+        private void checkUseOfIf(Element node)
+        {
+            String target = node.attributeValue("name");
+            String targetxpath = "//target[@name='" + target + "']/if";
+            
+            List conditiontest = node.selectNodes(targetxpath + "/then/property");
+            if (conditiontest != null && conditiontest.size() == 1)
+            {
+                if (node.selectSingleNode(targetxpath + "/else") == null)
+                {
+                    log("W: Target " + target + " poor use of if-then-property statement, use condition task");
+                    currentFile.incWarningCount();
+                }
+                else
+                {
+                    List conditiontest2 = node.selectNodes(targetxpath + "/else/property");
+                    if (conditiontest2 != null && conditiontest2.size() == 1)
+                    {
+                        log("W: Target " + target + " poor use of if-else-property statement, use condition task");
+                        currentFile.incWarningCount();
+                    }
+                }
+            }
+            
+            List statements = node.selectNodes("//target[@name='" + target + "']/*");
+            if (!(statements.size() > 1))
+            {
+                if (node.selectSingleNode(targetxpath + "/else") == null)
+                {
+                    if (node.selectSingleNode(targetxpath + "/isset") != null || node.selectSingleNode(targetxpath + "/not/isset") != null)
+                    {
+                        log("W: Target " + target + " poor use of if statement, use <target if|unless=\"prop\"");
+                        //log(node.selectSingleNode(targetxpath).asXML());
+                        currentFile.incWarningCount();
+                    }
+                }
+            }
+        }
+        
+        private void checkSizeOfScript(Element node)
+        {
+            String target = node.attributeValue("name");
+            
+            List<Node> statements = node.selectNodes("//target[@name='" + target + "']/script | //target[@name='" + target + "']/*[name()=\"hlm:python\"]");
+            
+            for (Node statement : statements)
+            {
+                int size = statement.getText().length();
+                
+                if (size > 1000)
+                {
+                    log("W: Target " + target + " has a script with " + size + " characters, code should be inside a python file");
+                    currentFile.incWarningCount();
+                }
+            }
+        }
+        
+        private void checkTabsInScript(Element node)
+        {
+            String target = node.attributeValue("name");
+            
+            List<Node> statements = node.selectNodes("//target[@name='" + target + "']/script | //target[@name='" + target + "']/*[name()=\"hlm:python\"]");
+            
+            for (Node statement : statements)
+            {
+                if (statement.getText().contains("\t"))
+                {
+                    log("E: Target " + target + " has a script with tabs");
+                    currentFile.incErrorCount();
+                }
+            }
+        }
+                
+            
+        
+        private void checkPropertyName(String text)
+        {
+            try
+            {
+                Pattern p1 = Pattern.compile(propertyNamePattern);
+                Matcher m1 = p1.matcher(text);
+                if (!m1.matches() && !propertiesVisited.contains(text))
+                {
+                    log("W: INVALID Property Name: " + text);
+                    propertiesVisited.add(text);
+                    currentFile.incWarningCount();
+                }
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+        
+        private void checkDefName(String text)
+        {
+            try
+            {
+                Pattern p1 = Pattern.compile(presetDefMacroDefNamePattern);
+                Matcher m1 = p1.matcher(text);
+                if (!m1.matches())
+                {
+                    log("W: INVALID PRESETDEF/MACRODEF Name: " + text);
+                    currentFile.incWarningCount();
+                }
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+        
+        private boolean checkTargetDependency(String text)
+        {     
+            boolean dependencyCheck = false;
+            try
+            {
+                Target targetDependency = (Target) project.getTargets().get(text);
+                if (targetDependency != null)
+                {
+                    if (targetDependency.getDependencies().hasMoreElements())
+                    {
+                        dependencyCheck = true;
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+            finally
+            {
+                return dependencyCheck;
+            }
+        }   
+    }
+    
+    private class AntProjectVisitor extends VisitorSupport
+    {    
+        public void visit(Element node)
+        {
+            String name = node.getName();
+            if (name.equals("project"))
+            {
+                String text = node.attributeValue("name");
+                if (text != null && projectNameCheck)
+                {
+                    checkProjectName(text);
+                }
+                else
+                {
+                    log("W: Project name not specified!");
+                    currentFile.incWarningCount();
+                } 
+                if ((node.element("description") == null) && descriptionCheck)
+                {
+                    log("W: Description not specified!");
+                    currentFile.incWarningCount();
+                }
+            }
+        }
+        
+        private void checkProjectName(String text)
+        {
+            try
+            {
+                Pattern p1 = Pattern.compile(projectNamePattern);
+                Matcher m1 = p1.matcher(text);
+                if (!m1.matches())
+                {
+                    log("W: INVALID Project Name: " + text);
+                    currentFile.incWarningCount();
+                }
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+    
+    private class AntLintHandler extends DefaultHandler
+    {
+        private int indentLevel;
+        private int indentSpace;
+        private Locator locator;
+        private boolean textElement;
+        private int currentLine;
+        private StringBuffer strBuff = new StringBuffer();
+        
+        public AntLintHandler()
+        {
+            super();
+        }
+        
+        public void setDocumentLocator(Locator locator)
+        {
+            this.locator = locator;
+        }
+        
+        public void startDocument ()
+        {
+            indentLevel -= 4;
+        }
+    
+    
+        public void endDocument ()
+        {
+            
+        }
+        
+        public void startElement(String uri, String name,
+                  String qName, Attributes atts)
+        {
+            countSpaces();
+            indentLevel += 4; //When an element start tag is encountered, indentLevel is increased 4 spaces.
+            checkIndent();
+            currentLine = locator.getLineNumber();
+        }
+
+        public void endElement(String uri, String name, String qName)
+        {
+            countSpaces();
+            //Ignore end tags in the same line
+            if (currentLine != locator.getLineNumber()) {
+                checkIndent();
+            }
+            indentLevel -= 4; //When an element end tag is encountered, indentLevel is decreased 4 spaces.
+            textElement = false;
+        }
+        
+        private void checkIndent()
+        {
+            if (indentationCheck)
+            {
+                if ((indentSpace != indentLevel) && !textElement)
+                {
+                    log("E:" + locator.getLineNumber() + ": Bad indentation!");
+                    currentFile.incErrorCount();
+                }
+            }           
+        }
+              
+        public void characters(char[] ch, int start, int length)
+        {
+            for (int i = start; i < start + length; i++) 
+            {
+                strBuff.append(ch[i]);
+            }
+        }
+        
+        public void countSpaces()
+        {
+            //Counts spaces and tabs in every newline.
+            int numSpaces = 0;
+            for (int i = 0; i < strBuff.length(); i++) 
+            {
+                switch (strBuff.charAt(i)) {
+                    case '\t':
+                        numSpaces += 4;
+                        if (tabCharacterCheck)
+                        {
+                            log("E:" + locator.getLineNumber() + ": Tabs should not be used!");
+                            currentFile.incErrorCount();
+                        }
+                        break;
+                    case '\n':
+                        numSpaces = 0;
+                        break;
+                    case '\r':
+                        break;
+                    case ' ':
+                        numSpaces++;
+                        break;
+                    default:
+                        textElement = true;
+                        break;
+                }
+            }
+            indentSpace = numSpaces;
+            strBuff.delete(0,strBuff.length());
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CcmTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,185 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+//import jep.Jep;
+//import jep.JepException;
+import org.python.util.PythonInterpreter;
+
+import com.nokia.ant.taskdefs.ccm.commands.*;
+import com.nokia.ant.types.ccm.SessionSet;
+
+//import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+/**
+ * Synergy task.
+ * <pre>
+ * &lt;hlm:createSessionMacro database="to1tobet" reference="test.session" /&gt;
+ * &lt;hlm:ccm verbose="false"&gt;
+ *     &lt;hlm:sessionset refid="test.session" /&gt;
+ *     &lt;hlm:addtask folder="tr1test1#2079"&gt;
+ *         &lt;task name="tr1test1#5310" /&gt;
+ *     &lt;/hlm:addtask&gt;
+ *     &lt;hlm:snapshot project="helium-to1tobet#helium_3.0:project:vc1s60p1#1" dir="c:\test" fast="true" recursive="true" /&gt;
+ *     &lt;hlm:synchronize project="helium-to1tobet#helium_3.0:project:vc1s60p1#1" recursive="true" /&gt;
+ *     &lt;hlm:close /&gt;
+ * &lt;/hlm:ccm&gt;
+ * </pre>
+ * @ant.task category="SCM"
+ */
+public class CcmTask extends Task
+{
+    private String username;
+
+    private String password;
+
+    private List commands = new ArrayList();
+    private Vector sessionSets = new Vector();
+    private boolean verbose;
+
+    public void setVerbose(boolean value) {
+        verbose = value;
+    }
+    
+    public boolean getVerbose() {
+        return verbose;
+    }
+
+    public String getUsername()
+    {
+        return username;
+    }
+
+    public final void setUsername(final String username)
+    {
+        this.username = username;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+    public final void setPassword(final String password)
+    {
+        this.password = password;
+    }
+
+    public CcmCommand[] getCommands()
+    {
+        return (CcmCommand[]) commands.toArray(new CcmCommand[0]);
+    }
+
+    public void addUpdate(Update a)
+    {
+        addCommand(a);
+    }
+    
+    public void addSynchronize(Synchronize a)
+    {
+        addCommand(a);
+    }
+    
+    public void addReconcile(Reconcile a)
+    {
+        addCommand(a);
+    }
+    
+    public void addSnapshot(Snapshot a)
+    {
+        addCommand(a);
+    }
+    
+    public void addChangeReleaseTag(ChangeReleaseTag a)
+    {
+        addCommand(a);
+    }
+
+    public void addCheckout(Checkout a)
+    {
+        addCommand(a);
+    }
+
+    public void addWorkarea(Workarea a)
+    {
+        addCommand(a);
+    }
+
+    private void addCommand(CcmCommand cmd)
+    {
+        cmd.setTask(this);
+        commands.add(cmd);
+    }
+
+    public AddTask createAddTask()
+    {
+        AddTask cmd = new AddTask();
+        addCommand(cmd);
+        return cmd;
+    }
+
+    public Close createClose()
+    {
+        Close cmd = new Close();
+        addCommand(cmd);
+        return cmd;
+    }
+
+    public SessionSet createSessionSet()
+    {
+        SessionSet sessionSet = new SessionSet();
+        sessionSets.add(sessionSet);
+        return sessionSet;
+    }
+    
+    public SessionSet[] getSessionSets() {
+        SessionSet[] result = new SessionSet[sessionSets.size()];
+        sessionSets.copyInto(result);
+        return result; 
+    }
+
+    public final void execute()
+    {
+        String ccmtaskScript = getProject().getProperty("ccmtask.python.script.file");
+        PythonInterpreter pi = new PythonInterpreter();
+        pi.set("java_ccmtask", this);
+        pi.set("project", getProject());
+        pi.execfile(ccmtaskScript);
+        
+//        try
+//        {
+//            String ccmtaskScript = getProject().getProperty("ccmtask.python.script.file");
+//            Jep jep = new Jep(false, ccmtaskScript);
+//            jep.set("java_ccmtask", this);
+//            jep.set("project", getProject());
+//            jep.runScript(ccmtaskScript);
+//            jep.close();
+//        }
+//        catch (JepException e)
+//        {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//            throw new BuildException(e.getMessage());
+//        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CopyParallelTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,274 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+
+import org.apache.tools.ant.taskdefs.Copy;
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+
+import java.util.Vector;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.FilterSet;
+import org.apache.tools.ant.types.FilterSetCollection;
+
+/**
+ * Copies a file(s) or directory(s) to a new file(s)
+ * or directory(s) using parallel threads. Number of parallel
+ * threads can be defined by threadCount. Files are only 
+ * copied if the source file is newer
+ * than the destination file, or when the destination file does not
+ * exist.  It is possible to explicitly overwrite existing files.</p>
+ *
+ *
+ * @ant.task category="Filesystem"
+ * @since Helium 0.21
+ *
+ */ 
+public class CopyParallelTask extends Copy
+{
+   
+    static final String LINE_SEPARATOR = System.getProperty("line.separator");
+    private int copyThreadCount;
+    private int maxThreadCount;
+    /**
+     * CopyParallelTask task constructor.
+     */
+    public CopyParallelTask()
+    {
+        setTaskName("copy-parallel");        
+    }
+    /**
+     * Perform the copy operation in parallel.
+     * @exception BuildException if an error occurs.
+     */
+    public final void execute()
+    {
+       super.execute(); 
+       //wait until all copy threads are dead
+       while (copyThreadCount > 0)
+       {
+            try
+            {
+                Thread.sleep(500);
+            }
+            catch (InterruptedException e)
+            {
+                e.printStackTrace();
+            }
+       }
+       
+    }
+    /**
+     * Set maximum number of thread.
+     * @param threadCount maximum number of threads
+     */
+    public final void setThreadCount(final int threadCount) 
+    {
+        // Limit max. threads to 8 otherwise we experience freezing when using the fastcopy task on 8 processor build machines
+        if (threadCount > 8) 
+        {
+            this.maxThreadCount = 8;   
+        } else {
+            this.maxThreadCount = threadCount;
+        }    
+     }
+     /**
+     * Actually does the file (and possibly empty directory) copies.
+     * This is a good method for subclasses to override.
+     */
+    protected final void doFileOperations() 
+    {
+        Vector filterChains = getFilterChains();
+        Vector filterSets = getFilterSets();
+        String inputEncoding = getEncoding();
+        String outputEncoding = getOutputEncoding();
+        long granularity = 0;   
+        
+        // set default thread count to 1 if it is not set
+        if ( maxThreadCount < 1 )
+            maxThreadCount = 1;   
+        
+      
+        if (fileCopyMap.size() > 0) 
+        {
+            log("Copying " + fileCopyMap.size()
+                + " file" + (fileCopyMap.size() == 1 ? "" : "s")
+                + " to " + destDir.getAbsolutePath() + " using " +  maxThreadCount 
+                + " threads in parallel.");
+
+            Enumeration e = fileCopyMap.keys();
+            while (e.hasMoreElements())
+            {
+                String fromFile = (String) e.nextElement();
+                String[] toFiles = (String[]) fileCopyMap.get(fromFile);
+
+                for (int i = 0; i < toFiles.length; i++) {
+                    String toFile = toFiles[i];
+
+                    if (fromFile.equals(toFile)) {
+                        log("Skipping self-copy of " + fromFile, verbosity);
+                        continue;
+                    }
+                    try {
+                        log("Copying " + fromFile + " to " + toFile, verbosity);
+
+                        FilterSetCollection executionFilters = new FilterSetCollection();
+                        if ( filtering ) 
+                        {
+                            executionFilters.addFilterSet(getProject().getGlobalFilterSet());
+                        }
+                        for (Enumeration filterEnum = filterSets.elements();
+                            filterEnum.hasMoreElements();) {
+                            executionFilters
+                                .addFilterSet((FilterSet) filterEnum.nextElement());
+                        }                       
+                        
+                        while (true)
+                        {
+                          if ( copyThreadCount < maxThreadCount)
+                          {
+                              CopyThread copyThread = new CopyThread(fromFile, toFile, executionFilters);
+                              copyThread.start();
+                              copyThreadCount++;
+                              break;
+                          }                           
+                        }
+                    }
+                     catch (Exception ioe) {
+                        String msg = "Failed to copy " + fromFile + " to " + toFile
+                            + " due to " + getDueTo(ioe);
+                        File targetFile = new File(toFile);
+                        if (targetFile.exists() && !targetFile.delete()) {
+                            msg += " and I couldn't delete the corrupt " + toFile;
+                        }
+                        if (failonerror) {
+                            throw new BuildException(msg, ioe, getLocation());
+                        }
+                        log(msg, Project.MSG_ERR);
+                    }
+                }
+            }
+        }
+        if (includeEmpty) {
+            Enumeration e = dirCopyMap.elements();
+            int createCount = 0;
+            while (e.hasMoreElements()) {
+                String[] dirs = (String[]) e.nextElement();
+                for (int i = 0; i < dirs.length; i++) {
+                    File d = new File(dirs[i]);
+                    if (!d.exists()) {
+                        if (!d.mkdirs()) {
+                            log("Unable to create directory "
+                                + d.getAbsolutePath(), Project.MSG_ERR);
+                        } else {
+                            createCount++;
+                        }
+                    }
+                }
+            }
+            if (createCount > 0) {
+                log("Copied " + dirCopyMap.size()
+                    + " empty director"
+                    + (dirCopyMap.size() == 1 ? "y" : "ies")
+                    + " to " + createCount
+                    + " empty director"
+                    + (createCount == 1 ? "y" : "ies") + " under "
+                    + destDir.getAbsolutePath());
+            }
+        }
+    }
+    
+    /**
+     * Returns a reason for failure based on
+     * the exception thrown.
+     * If the exception is not IOException output the class name,
+     * output the message
+     * if the exception is MalformedInput add a little note.
+     */
+    private String getDueTo(Exception ex) {
+        boolean baseIOException = ex.getClass() == IOException.class;
+        StringBuffer message = new StringBuffer();
+        if (!baseIOException || ex.getMessage() == null) {
+            message.append(ex.getClass().getName());
+        }
+        if (ex.getMessage() != null) {
+            if (!baseIOException) {
+                message.append(" ");
+            }
+            message.append(ex.getMessage());
+        }
+        if (ex.getClass().getName().indexOf("MalformedInput") != -1) {
+            message.append(LINE_SEPARATOR);
+            message.append(
+                "This is normally due to the input file containing invalid");
+             message.append(LINE_SEPARATOR);
+            message.append("bytes for the character encoding used : ");
+            message.append(
+                getEncoding() == null
+                 ? fileUtils.getDefaultEncoding() : getEncoding());
+            message.append(LINE_SEPARATOR);
+        }
+        return message.toString();
+    }
+    /**
+     * private class to start a new thread to copy a single file or 
+     * or directory. 
+     */ 
+    private class CopyThread extends Thread 
+    {   
+        private String fromFile;
+        private String toFile;
+        private FilterSetCollection executionFilters;
+        private Vector filterChains;
+        private String inputEncoding;
+        private String outputEncoding;
+        
+        public CopyThread(String fromFile, String toFile, FilterSetCollection executionFilters)
+        {
+            this.fromFile = fromFile;
+            this.toFile = toFile;
+            this.executionFilters = executionFilters;            
+            this.filterChains = getFilterChains();
+            this.inputEncoding = getEncoding();
+            this.outputEncoding = getOutputEncoding();        
+        }        
+    
+        public void run() 
+        {  
+          try 
+          { 
+             fileUtils.copyFile(fromFile, toFile, executionFilters,
+                                         filterChains, forceOverwrite,
+                                         preserveLastModified, inputEncoding,
+                                         outputEncoding, getProject());                                  
+                 
+           }
+           catch (Exception e) 
+           {
+                log("Problem found in parallel copy " + e.toString(), Project.MSG_ERR);
+           } 
+             
+          copyThreadCount--;            
+          stop();
+       }    
+    }
+   
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderEntry.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,457 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+/* Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. */
+
+package com.nokia.ant.taskdefs;
+
+import java.io.*;
+import org.apache.tools.ant.util.DOMElementWriter;
+import org.apache.tools.ant.util.DateUtils;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.apache.tools.ant.*;
+import java.util.*;
+
+/**
+ * This is a class that represents a XML recorder. This is the listener to the
+ * build process.
+ *
+ */
+public class CoverageRecorderEntry implements BuildLogger, SubBuildListener {
+
+    //////////////////////////////////////////////////////////////////////
+    // ATTRIBUTES
+    
+    /** XML element name for a build. */
+    private static final String BUILD_TAG = "build";
+    /** XML element name for a target. */
+    private static final String TARGET_TAG = "target";
+    /** XML element name for a task. */
+    private static final String TASK_TAG = "task";
+    /** XML attribute name for a name. */
+    private static final String NAME_ATTR = "name";
+    /** XML attribute name for a time. */
+    private static final String TIME_ATTR = "time";
+    /** XML attribute name for a file location. */
+    private static final String LOCATION_ATTR = "location";
+    
+    /** DocumentBuilder to use when creating the document to start with. */
+    private static DocumentBuilder builder = getDocumentBuilder();
+    
+    private String recordTaskName;
+    
+    /** The name of the file associated with this recorder entry.  */
+    private String filename;
+    /** The state of the recorder (recorder on or off).  */
+    private boolean record = true;
+    /** The current verbosity level to record at.  */
+    private int loglevel = Project.MSG_INFO;
+    /** The output PrintStream to record to.  */
+    private PrintStream outStream;
+    /** The start time of the last know target.  */
+    private long targetStartTime;
+    /** Strip task banners if true.  */
+    private boolean emacsMode;
+    /** project instance the recorder is associated with */
+    private Project project;
+
+    /** The complete log document for this build. */
+    private Document doc = builder.newDocument();
+    /** Mapping for when tasks started (Task to TimedElement). */
+    private Hashtable tasks = new Hashtable();
+    /** Mapping for when targets started (Task to TimedElement). */
+    private Hashtable targets = new Hashtable();
+    /**
+     * Mapping of threads to stacks of elements
+     * (Thread to Stack of TimedElement).
+     */
+    private Hashtable threadStacks = new Hashtable();
+    /**
+     * When the build started.
+     */
+    private TimedElement buildElement;
+    
+    //////////////////////////////////////////////////////////////////////
+    // CONSTRUCTORS / INITIALIZERS
+
+    /**
+     * @param name The name of this recorder (used as the filename).
+     */
+    protected CoverageRecorderEntry(String name, String recordTaskName) {
+        filename = name;
+        this.recordTaskName = recordTaskName;
+        startBuild();
+    }
+    
+    /**
+     * Returns a default DocumentBuilder instance or throws an
+     * ExceptionInInitializerError if it can't be created.
+     *
+     * @return a default DocumentBuilder instance.
+     */
+    protected static DocumentBuilder getDocumentBuilder() {
+        try {
+            return DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        } catch (Exception exc) {
+            throw new ExceptionInInitializerError(exc);
+        }
+    }
+    
+    /** Utility class representing the time an element started. */
+    protected static class TimedElement {
+        /**
+         * Start time in milliseconds
+         * (as returned by <code>System.currentTimeMillis()</code>).
+         */
+        private long startTime;
+        /** Element created at the start time. */
+        private Element element;
+        public String toString() {
+            return element.getTagName() + ":" + element.getAttribute("name");
+        }
+    }
+    
+    /**
+     * Returns the stack of timed elements for the current thread.
+     * @return the stack of timed elements for the current thread
+     */
+    protected Stack getStack() {
+        Stack threadStack = (Stack) threadStacks.get(Thread.currentThread());
+        if (threadStack == null) {
+            threadStack = new Stack();
+            threadStacks.put(Thread.currentThread(), threadStack);
+        }
+        /* For debugging purposes uncomment:
+        org.w3c.dom.Comment s = doc.createComment("stack=" + threadStack);
+        buildElement.element.appendChild(s);
+         */
+        return threadStack;
+    }
+    
+    //////////////////////////////////////////////////////////////////////
+    // ACCESSOR METHODS
+
+    /**
+     * @return the name of the file the output is sent to.
+     */
+    public String getFilename() {
+        return filename;
+    }
+
+    /**
+     * Turns off or on this recorder.
+     *
+     * @param state true for on, false for off, null for no change.
+     */
+    public void setRecordState(Boolean state) {
+        if (state != null) {
+            record = state.booleanValue();
+        }
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#buildStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void buildStarted(BuildEvent event) {
+        
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#buildFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void buildFinished(BuildEvent event) {
+        cleanup();
+    }
+
+    /**
+     * Cleans up any resources held by this recorder entry at the end
+     * of a subbuild if it has been created for the subbuild's project
+     * instance.
+     *
+     * @param event the buildFinished event
+     *
+     * @since Ant 1.6.2
+     */
+    public void subBuildFinished(BuildEvent event) {
+        if (event.getProject() == project) {
+            cleanup();
+        }
+    }
+
+    /**
+     * Empty implementation to satisfy the BuildListener interface.
+     *
+     * @param event the buildStarted event
+     *
+     * @since Ant 1.6.2
+     */
+    public void subBuildStarted(BuildEvent event) {
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#targetStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void targetStarted(BuildEvent event) {
+        Target target = event.getTarget();
+        TimedElement targetElement = new TimedElement();
+        targetElement.startTime = System.currentTimeMillis();
+        targetElement.element = doc.createElement(TARGET_TAG);
+        targetElement.element.setAttribute(NAME_ATTR, target.getName());
+        targets.put(target, targetElement);
+        getStack().push(targetElement);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#targetFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void targetFinished(BuildEvent event) {
+        Target target = event.getTarget();
+        TimedElement targetElement = (TimedElement) targets.get(target);
+        if (targetElement != null) {
+            long totalTime
+                    = System.currentTimeMillis() - targetElement.startTime;
+            targetElement.element.setAttribute(TIME_ATTR,
+                    DateUtils.formatElapsedTime(totalTime));
+
+            TimedElement parentElement = null;
+            Stack threadStack = getStack();
+            if (!threadStack.empty()) {
+                TimedElement poppedStack = (TimedElement) threadStack.pop();
+//                if (poppedStack != targetElement) {
+//                    throw new RuntimeException("Mismatch - popped element = "
+//                            + poppedStack
+//                            + " finished target element = "
+//                            + targetElement);
+//                }
+                if (!threadStack.empty()) {
+                    parentElement = (TimedElement) threadStack.peek();
+                }
+            }
+            if (parentElement == null) {
+                buildElement.element.appendChild(targetElement.element);
+            } else {
+                parentElement.element.appendChild(targetElement.element);
+            }
+        }
+        targets.remove(target);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#taskStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void taskStarted(BuildEvent event) {
+        TimedElement taskElement = new TimedElement();
+        taskElement.startTime = System.currentTimeMillis();
+        taskElement.element = doc.createElement(TASK_TAG);
+
+        Task task = event.getTask();
+        String name = event.getTask().getTaskName();
+        if (name == null) {
+            name = "";
+        }
+        taskElement.element.setAttribute(NAME_ATTR, name);
+        taskElement.element.setAttribute(LOCATION_ATTR,
+                event.getTask().getLocation().toString());
+        tasks.put(task, taskElement);
+        getStack().push(taskElement);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#taskFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void taskFinished(BuildEvent event) {
+        
+//        if (event.getTask().getTaskName() != recordTaskName) {
+            Task task = event.getTask();
+            TimedElement taskElement = (TimedElement) tasks.get(task);
+            if (taskElement != null) {
+                long totalTime = System.currentTimeMillis() - taskElement.startTime;
+                taskElement.element.setAttribute(TIME_ATTR,
+                        DateUtils.formatElapsedTime(totalTime));
+                Target target = task.getOwningTarget();
+                TimedElement targetElement = null;
+                if (target != null) {
+                    targetElement = (TimedElement) targets.get(target);
+                }
+                if (targetElement == null) {
+                    buildElement.element.appendChild(taskElement.element);
+                } else {
+                    targetElement.element.appendChild(taskElement.element);
+                }
+                Stack threadStack = getStack();
+                if (!threadStack.empty()) {
+                    TimedElement poppedStack = (TimedElement) threadStack.pop();
+//                    if (poppedStack != taskElement) {
+//                        throw new RuntimeException("Mismatch - popped element = "
+//                                + poppedStack + " finished task element = "
+//                                + taskElement);
+//                    }
+                }
+                tasks.remove(task);
+//            } else {
+//                throw new RuntimeException("Unknown task " + task + " not in " + tasks);
+//            }
+        }
+    }
+    
+    /**
+     * Get the TimedElement associated with a task.
+     *
+     * Where the task is not found directly, search for unknown elements which
+     * may be hiding the real task
+     */
+    protected TimedElement getTaskElement(Task task) {
+        TimedElement element = (TimedElement) tasks.get(task);
+        if (element != null) {
+            return element;
+        }
+
+        for (Enumeration e = tasks.keys(); e.hasMoreElements();) {
+            Task key = (Task) e.nextElement();
+            if (key instanceof UnknownElement) {
+                if (((UnknownElement) key).getTask() == task) {
+                    return (TimedElement) tasks.get(key);
+                }
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * @see org.apache.tools.ant.BuildListener#messageLogged(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void messageLogged(BuildEvent event) {
+        
+    }
+
+    /**
+     * @see BuildLogger#setMessageOutputLevel(int)
+     */
+    /** {@inheritDoc}. */
+    public void setMessageOutputLevel(int level) {
+        if (level >= Project.MSG_ERR && level <= Project.MSG_DEBUG) {
+            loglevel = level;
+        }
+    }
+
+    /**
+     * @see BuildLogger#setOutputPrintStream(PrintStream)
+     */
+    /** {@inheritDoc}. */
+    public void setOutputPrintStream(PrintStream output) {
+        outStream = output;
+    }
+
+
+    /**
+     * @see BuildLogger#setEmacsMode(boolean)
+     */
+    /** {@inheritDoc}. */
+    public void setEmacsMode(boolean emacsMode) {
+        this.emacsMode = emacsMode;
+    }
+
+
+    /**
+     * @see BuildLogger#setErrorPrintStream(PrintStream)
+     */
+    /** {@inheritDoc}. */
+    public void setErrorPrintStream(PrintStream err) {
+        setOutputPrintStream(err);
+    }
+
+    /**
+     * Set the project associated with this recorder entry.
+     *
+     * @param project the project instance
+     *
+     * @since 1.6.2
+     */
+    public void setProject(Project project) {
+        this.project = project;
+        if (project != null) {
+            project.addBuildListener(this);
+        }
+    }
+    
+    /**
+     * @since 1.6.2
+     */
+    public void cleanup() {
+        closeFile();
+        if (project != null) {
+            project.removeBuildListener(this);
+        }
+        project = null;
+    }
+    
+    /**
+     * Closes the file associated with this recorder.
+     * Used by Recorder.
+     * @since 1.6.3
+     */
+    void closeFile() {
+        finishBuild();
+        Writer out = null;
+        try {
+            // specify output in UTF8 otherwise accented characters will blow
+            // up everything
+            OutputStream stream = outStream;
+            if (stream == null) {
+                stream = new FileOutputStream(filename);
+            }
+            out = new OutputStreamWriter(stream, "UTF8");
+            out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+            (new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
+            out.flush();
+        } catch (IOException exc) {
+            throw new BuildException("Unable to write log file", exc);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    e = null; // ignore
+                }
+            }
+        }
+        buildElement = null;
+    }
+    
+    void startBuild() {
+        buildElement = new TimedElement();
+        buildElement.startTime = System.currentTimeMillis();
+        buildElement.element = doc.createElement(BUILD_TAG);
+    }
+    
+    void finishBuild() {
+        long totalTime = System.currentTimeMillis() - buildElement.startTime;
+        buildElement.element.setAttribute(TIME_ATTR,
+                DateUtils.formatElapsedTime(totalTime));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,174 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+/* Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. */
+
+package com.nokia.ant.taskdefs;
+
+import java.util.Hashtable;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Recorder;
+
+/**
+ * Adds a listener, which inherits the Ant Record task, to the current build process that records the
+ * output to a XML file.
+ */
+public class CoverageRecorderTask extends Recorder {
+
+    //////////////////////////////////////////////////////////////////////
+    // ATTRIBUTES
+    
+    /** The list of recorder entries. */
+    private static Hashtable recorderEntries = new Hashtable();
+    
+    /** The name of the file to record to. */
+    private String filename;
+    /**
+     * Whether or not to append. Need Boolean to record an unset state (null).
+     */
+    private Boolean append;
+    /**
+     * Whether to start or stop recording. Need Boolean to record an unset
+     * state (null).
+     */
+    private Boolean start;
+    /** The level to log at. A level of -1 means not initialized yet. */
+    private int loglevel = -1;
+    /** Strip task banners if true.  */
+    private boolean emacsMode;
+
+    //////////////////////////////////////////////////////////////////////
+    // ACCESSOR METHODS
+
+    /**
+     * Sets the name of the file to log to, and the name of the recorder
+     * entry.
+     *
+     * @param fname File name of logfile.
+     */
+    public void setName(String fname) {
+        filename = fname;
+    }
+
+
+    /**
+     * Sets the action for the associated recorder entry.
+     *
+     * @param action The action for the entry to take: start or stop.
+     */
+    public void setAction(ActionChoices action) {
+        if (action.getValue().equalsIgnoreCase("start")) {
+            start = Boolean.TRUE;
+        } else {
+            start = Boolean.FALSE;
+        }
+    }
+
+
+    /**
+     * Whether or not the logger should append to a previous file.
+     * @param append if true, append to a previous file.
+     */
+    public void setAppend(boolean append) {
+        this.append = append ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+
+    /**
+     * Set emacs mode.
+     * @param emacsMode if true use emacs mode
+     */
+    public void setEmacsMode(boolean emacsMode) {
+        this.emacsMode = emacsMode;
+    }
+
+
+    /**
+     * Sets the level to which this recorder entry should log to.
+     * @param level the level to set.
+     * see VerbosityLevelChoices
+     */
+    public void setLoglevel(VerbosityLevelChoices level) {
+        loglevel = level.getLevel();
+    }
+
+    //////////////////////////////////////////////////////////////////////
+    // CORE / MAIN BODY
+
+    /**
+     * The main execution.
+     * @throws BuildException on error
+     */
+    public void execute() {
+        if (filename == null) {
+            throw new BuildException("No filename specified");
+        }
+
+        getProject().log("setting a recorder for name " + filename,
+            Project.MSG_DEBUG);
+        
+        String recordTaskName = this.getTaskName();
+        
+        // get the recorder entry
+        CoverageRecorderEntry recorder = getRecorder(filename, getProject(), recordTaskName);
+        // set the values on the recorder
+        recorder.setMessageOutputLevel(loglevel);
+        recorder.setEmacsMode(emacsMode);
+        if (start != null) {
+            if (start.booleanValue()) {
+                //recorder.reopenFile();
+                recorder.setRecordState(start);
+            } else {
+                recorder.setRecordState(start);
+                recorder.cleanup();
+            }
+        }
+    }
+
+    /**
+     * Gets the recorder that's associated with the passed in name. If the
+     * recorder doesn't exist, then a new one is created.
+     * @param name the name of the recoder
+     * @param proj the current project
+     * @return a recorder
+     * @throws BuildException on error
+     */
+    protected CoverageRecorderEntry getRecorder(String name, Project proj, String recordTaskName)
+    {
+        Object o = recorderEntries.get(name);
+        CoverageRecorderEntry entry;
+
+        if (o == null) {
+            // create a recorder entry
+            entry = new CoverageRecorderEntry(name, recordTaskName);
+
+            /*if (append == null) {
+                entry.openFile(false);
+            } else {
+                entry.openFile(append.booleanValue());
+            }*/
+            entry.setProject(proj);
+            recorderEntries.put(name, entry);
+        } else {
+            entry = (CoverageRecorderEntry) o;
+        }
+        return entry;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DatabaseTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.io.File;
+import com.nokia.ant.Database;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Reads the current ant project and a fileset and generates a xml file with a summary of targets,
+ * macros and properties.
+ *
+ * @ant.task name="database"
+ */
+public class DatabaseTask extends Task
+{
+    private File outputFile;
+
+    private ResourceCollection rc;
+    private boolean homeFilesOnly = true;
+
+    public DatabaseTask()
+    {
+        setTaskName("database");
+    }
+
+    public void setOutput(File outputFile)
+    {
+        this.outputFile = outputFile;
+    }
+
+    public void setRefid(Reference r)
+    {
+        Object o = r.getReferencedObject();
+        if (!(o instanceof ResourceCollection))
+        {
+            throw new BuildException(r.getRefId() + " doesn\'t denote a ResourceCollection");
+        }
+        rc = (ResourceCollection) o;
+    }
+    
+    /**
+     * If true only read files that are not in the helium dir.
+     */
+    public void setHomeFilesOnly(boolean homeFilesOnly) {
+        this.homeFilesOnly = homeFilesOnly;
+    }
+
+    public void execute()
+    {
+        log("Building Ant project database", Project.MSG_DEBUG);
+        try
+        {
+            Database db = new Database(getProject(), rc, this);
+            db.setHomeFilesOnly(homeFilesOnly);
+            db.createXMLFile(outputFile);
+        }
+        catch (Exception e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DeconfigureTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Execute;
+
+/**
+ * ANT wrapper task for the GSCM deconfigure.pl script.
+ * @ant.task category="SCM"
+ */
+public class DeconfigureTask extends Task
+{
+    // The attributes of this task
+    private String database;
+    private String projectName;
+    private String password;
+    private Boolean considerBranchReleases;
+    private Integer verbosity;
+
+    /**
+     * Set Synergy Database name to be used by deconfigure.pl script.
+     * @param database
+     * @ant.required
+     */
+    public void setdatabase(String database) {
+        this.database = database;
+        log("Set database to " + database, Project.MSG_DEBUG); 
+    }
+
+    /**
+     * Set Synergy Project Name to be used by deconfigure.pl script.
+     * @param projectName
+     * @ant.required
+     */
+    public void setprojectName(String projectName) {
+        this.projectName = projectName;
+        log("Set projectName to " + projectName, Project.MSG_DEBUG); 
+    }
+
+    /**
+     * Set Synergy Password to be used by deconfigure.pl script.
+     * @param password
+     * @ant.required
+     */    
+    public void setpassword(String password) {
+        this.password = password;
+        log("Set password to " + password, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set if we want deconfigure.pl script to check for branch differences based on the 'included_releases' attribute of project.
+     * @param considerBranchReleases 
+     * @ant.not-required  Default is no.
+     */    
+    public void setconsiderBranchReleases(Boolean considerBranchReleases) {
+        this.considerBranchReleases = considerBranchReleases;
+        log("Set considerBranchReleases to " + considerBranchReleases, Project.MSG_DEBUG);
+    }
+
+   /**
+     * Set verbosity level to be used by deconfigure.pl script. Verbosity level ( 0 - quiet, 1 - verbose, 2 - very verbose). Exception will be raised for any other value.
+     * @param verbosity
+     * @ant.not-required
+     */     
+    public void setverbosity(Integer verbosity) {
+        this.verbosity = verbosity;
+        log("Set verbosity to " + verbosity, Project.MSG_DEBUG);
+    }
+    
+    public void execute() {
+        String missingArgs = "";
+        String commandArgs = "cmd /c deconfigure.pl ";
+
+        /* Handle mandatory arguments */
+        if (database == null)
+            missingArgs += "database ";
+        else
+            commandArgs += "-d " + database + " "; 
+
+        if (projectName == null)
+            missingArgs += "projectName ";
+        else
+            commandArgs += "-p " + projectName + " "; 
+
+        if (password == null)
+            missingArgs += "password ";
+        else
+            commandArgs += "-P " + password + " "; 
+
+        if (!missingArgs.equals(""))
+            throw new BuildException("[" + getTaskName() + "] Error: mandatory attributes are not defined - " + missingArgs);
+
+        /* Handle optional arguments */
+        if (considerBranchReleases != null)
+            if (considerBranchReleases)
+                commandArgs += "-b ";
+
+        if (verbosity != null)
+            switch(verbosity) {
+              case 0: commandArgs += "-q ";
+                      break;
+              case 1: commandArgs += "-V ";
+                      break;
+              case 2: commandArgs += "-W ";
+                      break;
+              default: throw new BuildException("[" + getTaskName() + "] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose or 2 - very verbose");
+            }
+
+        try {
+            Execute exe = new Execute();
+            exe.runCommand(this, commandArgs.split(" "));
+        } catch (BuildException e) {
+            throw new BuildException("[" + getTaskName() + "] Error: Script execution failure.");
+        }
+        log("Completed successfully.");
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/GetValueFromVariableSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Reference;
+import java.util.Iterator;
+import java.util.Vector;
+import com.nokia.ant.types.VariableSet;
+import com.nokia.ant.types.Variable;
+
+
+/**
+ * To retrive a variable value from a collection of variable set based on name, which contains property-value in pair.
+ *  
+ * <pre>
+ * Example:
+ * 
+ * &lt;hlm:argSet id="test.variableSet"&gt;
+ * &lt;variable name="v1" value="the_value_1"/&gt;
+ *     &lt;variable name="v2" value="the_value_2"/&gt;
+ *      &lt;variable name="v3" value="the_value_3"/&gt;
+ * &lt;/hlm:argSet&gt;
+ *       
+ *  &lt;hlm:getVariableValue name="v3" property="v1.value"&gt;
+ * &lt;hlm:argSet refid="test.variableSet"/&gt;
+ * &lt;/hlm:getVariableValue&gt;
+ * </pre>
+ * @ant.task name="getVariableValue"
+ */
+public class GetValueFromVariableSet extends Task {
+    private String name;
+    private String property;
+    private Vector<VariableSet> variablesets = new Vector<VariableSet>();
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    public void add(VariableSet vs) {
+        variablesets.add(vs);
+    }
+
+    public VariableSet createVariableSet() {
+        VariableSet vs = new VariableSet();
+        variablesets.add(vs);
+        return vs;
+    }
+
+    public void execute() {
+        if (name == null)
+            throw new BuildException("'name' attribute has not been defined.");
+        if (property == null)
+            throw new BuildException(
+                    "'property' attribute has not been defined.");
+
+        for (Iterator<VariableSet> vsit = variablesets.iterator(); vsit
+                .hasNext();) {
+            VariableSet vs = vsit.next();
+            if (vs.isReference()) {
+                Reference reference = vs.getRefid();
+                vs = (VariableSet)reference.getReferencedObject(getProject());
+            }
+            for (Iterator vit = vs.getVariables().iterator(); vit.hasNext();) {
+                Variable v = (Variable) vit.next();
+                if (v.getName().equals(name)) {
+                    log("Setting '" + property + "' property to '" + v.getValue() + "'");
+                    getProject().setProperty(property, v.getValue());
+                    return;
+                }
+            }
+        }
+
+        throw new BuildException("Could not find '" + name + "' variable.");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/HlmAssertMessage.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import com.nokia.ant.listener.internaldata.*;
+import javax.naming.*;
+import javax.naming.directory.*;
+
+/**
+ * Task to identify failing assert.
+ *
+ * Usage: &lt;hlm:hlmassertmessage assertName="hlm:assertPropertySet" message="Warning: @{message}"/&gt;
+ */
+
+public class HlmAssertMessage extends Task {
+    
+    private String message;
+    private String assertName;
+        
+    public void execute() {
+        
+        if (assertName == null)
+            throw new BuildException("'assertName' attribute is not defined");
+        if (message == null)
+            throw new BuildException("'message' attribute is not defined");
+        
+        for (int i = 0 ; i < getProject().getBuildListeners().size() ; i++) {
+            if (getProject().getBuildListeners().get(i) instanceof Listener) {
+                Listener listen = (Listener)getProject().getBuildListeners().get(i);
+                listen.addAssertTask(this);
+                break;
+            }
+        }
+    }
+    /**
+     * Returns assert name.
+     * @return
+     */
+    public String getAssertName() 
+    {
+        return assertName;
+    }
+    /**
+     * Set the assertname.
+     * @param assertName
+     */
+    public void setAssertName(String assertName) 
+    {
+        this.assertName = assertName;
+    }
+    /**
+     * Return the assert message.
+     * @return
+     */
+    public String getMessage() 
+    {
+        return message;
+    }
+    /**
+     * Set the assert message.
+     * @param message
+     */
+    public void setMessage(String message) 
+    {
+        this.message = message;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LDAP.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import javax.naming.*;
+import javax.naming.directory.*;
+import java.util.Hashtable;
+
+/**
+ * Task is to search data from LDAP server.
+ *
+ * Usage: &lt;hlm:ldap url="${ldap.server.url}" rootdn="${ldap.root.dn}" filter="uid=${env.USERNAME}" outputproperty="email.from" key="mail"/&gt;
+ */
+public class LDAP extends Task 
+{
+    private String url;
+    private String rootdn;
+    private String filter;
+    private String key;
+    private String property;
+        
+    public void execute()
+    {
+        
+        if (url == null)
+            throw new BuildException("'url' attribute is not defined");
+        if (rootdn == null)
+            throw new BuildException("'rootdn' attribute is not defined");
+        if (filter == null)
+            throw new BuildException("'filter' attribute is not defined");
+        if (property == null)
+            throw new BuildException("'property' attribute is not defined");
+        if (key == null)
+            throw new BuildException("'key' attribute is not defined");    
+        
+        // Set up environment for creating initial context
+        Hashtable<String, String> env = new Hashtable<String, String>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+                "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, url + "/" + rootdn);
+
+        // Create initial context
+        try 
+        {
+            DirContext ctx = new InitialDirContext(env);
+            SearchControls controls = new SearchControls();
+            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            NamingEnumeration<SearchResult> en = ctx.search("", filter, controls);
+            if (en.hasMore()) 
+            {
+                SearchResult sr = en.next();
+                getProject().setProperty(property, (String)sr.getAttributes().get(key).get());
+                return;
+            }
+        } 
+        catch (NamingException exc) 
+        {
+            throw new BuildException(exc);
+        }
+    }
+
+    public String getUrl() 
+    {
+        return url;
+    }
+
+    public void setUrl(String url) 
+    {
+        this.url = url;
+    }
+    
+
+    public String getRootdn() 
+    {
+        return rootdn;
+    }
+
+    public void setRootdn(String rootdn) 
+    {
+        this.rootdn = rootdn;
+    }
+
+    public String getFilter() 
+    {
+        return filter;
+    }
+
+    public void setFilter(String filter) 
+    {
+        this.filter = filter;
+    }
+
+    public String getOutputProperty() 
+    {
+        return property;
+    }
+
+    public void setOutputProperty(String property) 
+    {
+        this.property = property;
+    }
+
+    public String getKey() 
+    {
+        return key;
+    }
+
+    public void setKey(String key) 
+    {
+        this.key = key;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderEntry.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.Project;
+import com.nokia.ant.types.LogFilterSet;
+
+interface LogRecorderEntry
+{
+    void openFile(boolean append);
+
+    void reopenFile();
+
+    void closeFile();
+
+    void setRecordState(boolean state);
+    
+    void setEmacsMode(boolean emacsMode);
+    
+    void setMessageOutputLevel(int level);
+
+    void setProject(Project project);
+
+    String getFilename();
+
+    void setFilterSet(LogFilterSet o);
+    
+    void setRegexp(String regexp);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,429 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.util.Hashtable;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.SubBuildListener;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+import org.apache.tools.ant.types.LogLevel;
+
+import java.lang.reflect.Constructor;
+import java.io.File;
+
+/**
+ * Adds a listener to the current build process that records the output to a
+ * file.
+ * <p>
+ * Several recorders can exist at the same time. Each recorder is associated
+ * with a file. The filename is used as a unique identifier for the recorders.
+ * The first call to the recorder task with an unused filename will create a
+ * recorder (using the parameters provided) and add it to the listeners of the
+ * build. All subsequent calls to the recorder task using this filename will
+ * modify that recorders state (recording or not) or other properties (like
+ * logging level).
+ * </p>
+ * <p>
+ * Some technical issues: the file's print stream is flushed for
+ * &quot;finished&quot; events (buildFinished, targetFinished and taskFinished),
+ * and is closed on a buildFinished event.
+ * </p>
+ *
+ * @ant.task name="record" category="Utility" 
+ * @see LogRecorderEntry
+ * @version 0.5
+ * @since Ant 1.4
+ */
+public class LogRecorderTask extends Task implements SubBuildListener
+{
+
+    // ////////////////////////////////////////////////////////////////////
+    // ATTRIBUTES
+    
+    /** The list of recorder entries. */
+    private static Hashtable recorderEntries = new Hashtable();
+
+    /** The name of the file to record to. */
+    private String filename;
+
+    private String loggerclass = "nokia.ant.taskdefs.TextLogRecorderEntry";
+
+    private String filterset;
+
+    /**
+     * Whether or not to append. Need Boolean to record an unset state (null).
+     */
+    private boolean append;
+    
+    /**
+     * Whether or not to backup the old log (if exists). 
+     */
+    private boolean backup;
+
+    /**
+     * Whether to start or stop recording. Need Boolean to record an unset state
+     * (null).
+     */
+    private boolean start;
+    
+    private int loglevel = -1;
+    /** Strip task banners if true.  */
+    private boolean emacsMode;
+
+    private String regexp;
+
+    // ////////////////////////////////////////////////////////////////////
+    // CONSTRUCTORS / INITIALIZERS
+
+    /**
+     * Overridden so we can add the task as build listener.
+     * 
+     * @since Ant 1.7
+     */
+    public void init()
+    {
+        getProject().addBuildListener(this);
+    }
+
+    // ////////////////////////////////////////////////////////////////////
+    // ACCESSOR METHODS
+
+    /**
+     * Sets the name of the file to log to, and the name of the recorder entry.
+     * 
+     * @param fname
+     *            File name of logfile.
+     */
+    public void setName(String fname)
+    {
+        filename = fname;
+    }
+
+    public void setClass(String name)
+    {
+        loggerclass = name;
+    }
+
+    /**
+     * Sets the action for the associated recorder entry.
+     * 
+     * @param action
+     *            The action for the entry to take: start or stop.
+     */
+    public void setAction(ActionChoices action)
+    {
+        if (action.getValue().equalsIgnoreCase("start"))
+        {
+            start = true;
+        }
+        else
+        {
+            start = false;
+        }
+    }
+
+    /**
+     * Whether or not the logger should append to a previous file.
+     * 
+     * @param append
+     *            if true, append to a previous file.
+     */
+    public void setAppend(boolean append)
+    {
+        this.append = append;
+    }
+    
+    
+    
+    /**
+     * Whether or not the logger should backup the previous file.
+     * 
+     * @param backup
+     *            if true, backup the exising file.
+     */
+    public void setBackup(boolean backup)
+    {
+        this.backup = backup;
+    }
+    
+    
+    
+    /**
+     * Set emacs mode.
+     * @param emacsMode if true use emacs mode
+     */
+    public void setEmacsMode(boolean emacsMode) {
+        this.emacsMode = emacsMode;
+    }
+
+
+    /**
+     * Sets the level to which this recorder entry should log to.
+     * @param level the level to set.
+     * @see VerbosityLevelChoices
+     */
+    public void setLoglevel(VerbosityLevelChoices level) {
+        loglevel = level.getLevel();
+    }
+
+    /**
+     * Sets filterset
+     * 
+     * @param filterset
+     */
+    public void setFilterSet(String filterset)
+    {
+        this.filterset = filterset;
+    }
+
+    public void setRegexp(String regexp)
+    {
+        this.regexp = regexp;
+    }
+
+    // ////////////////////////////////////////////////////////////////////
+    // CORE / MAIN BODY
+
+    /**
+     * The main execution.
+     * 
+     * @throws BuildException
+     *             on error
+     */
+    public void execute()
+    {
+        if (filename == null)
+        {
+            throw new BuildException("No filename specified");
+        }
+        
+        //Backup the old log file        
+        if (backup)
+        {            
+            long timestamp = System.currentTimeMillis();                         
+            File oldFile = new File(filename); 
+            if (oldFile.exists()) {
+                oldFile.renameTo(new File(filename + "." + timestamp));
+                getProject().setProperty("backup.file.name", filename + "." + timestamp);
+            }    
+            
+        }
+        
+        
+        getProject().log("setting a recorder for name " + filename, Project.MSG_DEBUG);
+
+        // get the recorder entry
+        LogRecorderEntry recorder = getRecorder(filename, getProject());
+        recorder.setMessageOutputLevel(loglevel);
+        recorder.setEmacsMode(emacsMode);
+        if (regexp != null && regexp.trim().length() > 0)
+        {
+            recorder.setRegexp(regexp);
+        }
+        // if (filterset != null)
+        // {
+        // Object o = getProject().getReference(filterset);
+        // if (o != null && o instanceof LogFilterSet)
+        // {
+        // recorder.setFilterSet((LogFilterSet) o);
+        // }
+        // }
+
+        // set the values on the recorder
+        if (start)
+        {
+            recorder.reopenFile();
+            recorder.setRecordState(true);
+        }
+        else
+        {
+            recorder.setRecordState(false);
+            recorder.closeFile();
+        }
+    }
+
+    /**
+    * INNER CLASSES
+    */
+    public static class VerbosityLevelChoices extends LogLevel {
+    }
+
+    /**
+     * A list of possible values for the <code>setAction()</code> method.
+     * Possible values include: start and stop.
+     */
+    public static class ActionChoices extends EnumeratedAttribute
+    {
+        private static final String[] VALUES =
+        { "start", "stop" };
+
+        /**
+         * @see EnumeratedAttribute#getValues()
+         */
+        public String[] getValues()
+        {
+            return VALUES;
+        }
+    }
+
+    /**
+     * Gets the recorder that's associated with the passed in name. If the
+     * recorder doesn't exist, then a new one is created.
+     * 
+     * @param name
+     *            the name of the recoder
+     * @param proj
+     *            the current project
+     * @return a recorder
+     * @throws BuildException
+     *             on error
+     */
+    protected LogRecorderEntry getRecorder(String name, Project proj)
+    {
+        Object o = recorderEntries.get(name);
+        LogRecorderEntry entry;
+
+        if (o == null)
+        {
+            try
+            {
+                Class[] parameters = new Class[1];
+                parameters[0] = String.class;
+                Class centry = Class.forName(loggerclass);
+                Constructor c = centry.getConstructor(parameters);
+                Object[] params = new Object[1];
+                params[0] = filename;
+                entry = (LogRecorderEntry) c.newInstance(params);
+            }
+            catch (Exception e)
+            {
+                entry = new TextLogRecorderEntry(name);
+            }
+
+            entry.openFile(append);
+            entry.setProject(proj);
+            recorderEntries.put(name, entry);
+        }
+        else
+        {
+            entry = (LogRecorderEntry) o;
+        }
+        return entry;
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void buildStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void subBuildStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void targetStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void targetFinished(BuildEvent event)
+    {
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void taskStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void taskFinished(BuildEvent event)
+    {
+    }
+
+    /**
+     * Empty implementation required by SubBuildListener interface.
+     * 
+     * @since Ant 1.7
+     */
+    public void messageLogged(BuildEvent event)
+    {
+    }
+
+    /**
+     * Cleans recorder registry.
+     * 
+     * @since Ant 1.7
+     */
+    public void buildFinished(BuildEvent event)
+    {
+        cleanup();
+    }
+
+    /**
+     * Cleans recorder registry, if this is the subbuild the task has been
+     * created in.
+     * 
+     * @since Ant 1.7
+     */
+    public void subBuildFinished(BuildEvent event)
+    {
+        if (event.getProject() == getProject())
+        {
+            cleanup();
+        }
+    }
+
+    /**
+     * cleans recorder registry and removes itself from BuildListener list.
+     * 
+     * @since Ant 1.7
+     */
+    private void cleanup()
+    {
+        recorderEntries.clear();
+        getProject().removeBuildListener(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ModelPropertiesTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.io.IOException;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.dom4j.DocumentException;
+
+import com.nokia.ant.ModelPropertiesParser;
+
+
+/**
+ * Renders model property and group description to Wiki Model Syntax.
+ * Usage: &lt;hlm:parsemodel output="Output file path" input="Input file path"/&gt;
+ * @ant.task name="parsemodel"
+ */
+public class ModelPropertiesTask extends Task
+{
+    private String outputFile;
+
+    private String inputFile;
+
+    public ModelPropertiesTask()
+    {
+        setTaskName("ModelPropertiesTask");
+    }
+
+    public void setOutput(String outputFile)
+    {
+        this.outputFile = outputFile;
+    }
+
+    public void setInput(String inputFile)
+    {
+        this.inputFile = inputFile;
+    }
+
+    /**
+     * Executes ModelPropertyParser
+     * @throws BuildException
+     */    
+    public void execute()
+    {
+        log("Parsing model properties ", Project.MSG_DEBUG);
+        try
+        {
+            ModelPropertiesParser pmp = new ModelPropertiesParser(inputFile, outputFile);
+            pmp.parsePropertiesDescription();
+        }
+        catch (IOException ioe)
+        {
+            log("Couldn't find model file");
+            ioe.printStackTrace();
+            throw new BuildException(ioe.getMessage());
+        }
+        catch (DocumentException be)
+        {
+            log("Error in creating model dom object");
+            be.printStackTrace();
+            throw new BuildException(be.getMessage());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/PythonTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.types.*;
+import java.io.*;
+
+/**
+ * Embed python code in ant, generates temporary python file and executes it
+ */
+public class PythonTask extends Task
+{
+    private static final String TEMPFILE_PROPERTY = "python.script.tempfile";
+
+    //private ExecTask execTask = new ExecTask();
+    
+    private String iText;
+
+    private String outputProperty;
+
+    private String resultProperty;
+
+    private String script;
+    
+    private File dir;
+    
+    private File output;
+    
+    private boolean iFailonerror;
+    
+    private Commandline cmdl = new Commandline();
+    
+    public PythonTask()
+    {
+        setTaskName("python");
+        /*execTask.setProject(getProject());
+        execTask.setTaskName("python");
+        execTask.setExecutable("python.exe");*/
+    }
+
+    public void setOutputProperty(String propertyname)
+    {
+        outputProperty = propertyname;
+    }
+
+    public void setResultProperty(String propertyname)
+    {
+        resultProperty = propertyname;
+    }
+
+    public void addText(String text)
+    {
+        iText = getProject().replaceProperties(text);
+    }
+
+    public void setScript(String scriptname)
+    {
+        script = scriptname;
+    }
+    
+    public void setFailonerror(boolean failonerror)
+    {
+        iFailonerror = failonerror;
+    }
+
+    public void setOutput(File outputname)
+    {
+        output = outputname;
+    }
+    
+    public void setDir(File dirname)
+    {
+        dir = dirname;
+    }
+    
+    public Commandline.Argument createArg()
+    {
+        return cmdl.createArgument();
+    }
+    
+   /* private void allAttrSet()
+    {
+        execTask.setOutputproperty(outputProperty);
+        execTask.setResultProperty(resultProperty);
+        execTask.setDir(dir);
+        execTask.setOutput(output);
+    }*/
+    
+    public void execute()
+    {
+        if (script != null)
+        {
+            // Run the Python script
+            ExecTask execTask = new ExecTask();
+            execTask.setProject(getProject());
+            execTask.setTaskName("python");
+            execTask.setExecutable("python");
+            execTask.setFailonerror(true);
+            Commandline.Argument scriptArg = cmdl.createArgument(true);
+            scriptArg.setValue(script);
+            //allAttrSet();
+            execTask.setCommand(cmdl);
+            execTask.setOutputproperty(outputProperty);
+            execTask.setResultProperty(resultProperty);
+            execTask.setDir(dir);
+            execTask.setOutput(output);
+            try
+            {
+                execTask.execute();
+            }
+            catch (BuildException t)
+            {
+                if (iFailonerror)
+                    throw new BuildException(t.getMessage());
+                else
+                    log(t.getMessage(), 0);     //MSG_ERR=0    
+            }
+        }
+        else
+        {            
+            // Write the content of the script using Echo task
+            File tempfile = null;
+            try
+            {
+                // Create a temporary file to contain the script
+                tempfile = File.createTempFile("helium", null);
+                PrintWriter out = new PrintWriter(new FileWriter(tempfile));
+                out.write(iText);
+                out.close();
+
+                // Run the temporary Python script
+                ExecTask execTask = new ExecTask();
+                execTask.setProject(getProject());
+                execTask.setTaskName("python");
+                execTask.setExecutable("python");
+                execTask.setFailonerror(iFailonerror);
+                Commandline.Argument scriptArg = execTask.createArg();
+                scriptArg.setValue(tempfile.getAbsolutePath());
+                //allAttrSet();
+                execTask.setOutputproperty(outputProperty);
+                execTask.setResultProperty(resultProperty);
+                execTask.setDir(dir);
+                execTask.setOutput(output);
+                execTask.execute();
+            
+                // Delete temporary script file
+                boolean fileDeleted = tempfile.delete();
+                if (!fileDeleted)
+                {
+                    throw new BuildException("Could not delete script file!");
+                }            
+            }
+            catch (IOException e)
+            {
+                throw new BuildException(e.getMessage());
+            }
+            finally
+            {
+                // make sure we delete the file anyway
+                if (tempfile != null)
+                    tempfile.delete();
+            }
+        }
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RebaselineTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Execute;
+
+/**
+ * ANT wrapper task for the GSCM rebaseline.pl script.
+ * @ant.task category="SCM"
+ */
+public class RebaselineTask extends Task
+{
+    // The attributes of this task
+    private String database;
+    private String projectName;
+    private String password;
+    private String release;   
+    private String baseline;
+    private String version;
+    private Boolean releaseBaseline;
+    private Boolean leaveFolderswritable;   
+    private Boolean disableTaskRebadging;   
+    private Boolean rebadgeObjectVersions;
+    private String baselineName;
+    private Boolean useBranchReleaseMethodology;
+    private Boolean createBaselineForRollingReleaseTag;
+    private Integer verbosity;
+
+    /**
+     * Set Synergy Database name to be used by rebaseline.pl script.
+     * @param database
+     * @ant.required
+     */
+    public void setdatabase(String database) {
+        this.database = database;
+        log("Set database to " + database, Project.MSG_DEBUG); 
+    }
+
+    /**
+     * Set Synergy Project Name to be used by rebaseline.pl script.
+     * @param projectName
+     * @ant.required
+     */
+    public void setprojectName(String projectName) {
+        this.projectName = projectName;
+        log("Set projectName to " + projectName, Project.MSG_DEBUG); 
+    }
+
+    /**
+     * Set Synergy Password to be used by rebaseline.pl script.
+     * @param password
+     * @ant.required
+     */    
+    public void setpassword(String password) {
+        this.password = password;
+        log("Set password to " + password, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set release tag (Two-part name) for the release project created by reconfigure.pl script.
+     * @param release
+     * @ant.not-required
+     */    
+    public void setrelease(String release) {
+        this.release = release;
+        log("Set release to " + release, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set four-part name of existing baseline (incompatible with 'projectName' and 'baselineName' attributes) to be used by rebaseline.pl script.
+     * @param baseline 
+     * @ant.not-required
+     */    
+    public void setbaseline(String baseline) {
+        this.baseline = baseline;
+        log("Set baseline to " + baseline, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set version of new project created by rebaseline.pl script.
+     * @param version
+     * @ant.not-required
+     */    
+    public void setversion(String version) {
+        this.version = version;
+        log("Set version to " + version, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set whether to release the baseline project created by rebaseline.pl script.
+     * @param releaseBaseline
+     * @ant.not-required Default is no.
+     */    
+    public void setreleaseBaseline(Boolean releaseBaseline) {
+        this.releaseBaseline = releaseBaseline;
+        log("Set releaseBaseline to " + releaseBaseline, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set whether to leave the folders writable in the baseline project created by rebaseline.pl script.
+     * @param leaveFolderswritable
+     * @ant.not-required  Default is no.
+     */    
+    public void setleaveFolderswritable(Boolean leaveFolderswritable) {
+        this.leaveFolderswritable = leaveFolderswritable;
+        log("Set leaveFolderswritable to " + leaveFolderswritable, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set whether to disable task rebadging (incompatible with 'rebadgeObjectVersions' attribute) in the rebaseline.pl script.
+     * @param disableTaskRebadging
+     * @ant.not-required  Default is no.
+     */    
+    public void setdisableTaskRebadging(Boolean disableTaskRebadging) {
+        this.disableTaskRebadging = disableTaskRebadging;
+        log("Set disableTaskRebadging to " + disableTaskRebadging, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set whether to rebadge object versions in the rebaseline.pl script.
+     * @param password Synergy Password
+     * @ant.not-required Default is no.
+     */    
+    public void setrebadgeObjectVersions(Boolean rebadgeObjectVersions) {
+        this.rebadgeObjectVersions = rebadgeObjectVersions;
+        log("Set rebadgeObjectVersions to " + rebadgeObjectVersions, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set new baseline name to use in rebaseline.pl script.
+     * @param baselineName
+     * @ant.not-required
+     */    
+    public void setbaselineName(String baselineName) {
+        this.baselineName = baselineName;
+        log("Set baselineName to " + baselineName, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set whether to utilize branch release methodology in the rebaseline.pl script.
+     * @param useBranchReleaseMethodology
+     * @ant.not-required Default is no.
+     */    
+    public void setuseBranchReleaseMethodology(Boolean useBranchReleaseMethodology) {
+        this.useBranchReleaseMethodology = useBranchReleaseMethodology;
+        log("Set useBranchReleaseMethodology to " + useBranchReleaseMethodology, Project.MSG_DEBUG);
+    }
+
+    /**
+     * Set whether to create additional integration baseline for rolling-release tag.
+     * @param createBaselineForRollingReleaseTag
+     * @ant.not-required Default is no.
+     */    
+    public void setcreateBaselineForRollingReleaseTag(Boolean createBaselineForRollingReleaseTag) {
+        this.createBaselineForRollingReleaseTag = createBaselineForRollingReleaseTag;
+        log("Set createBaselineForRollingReleaseTag to " + createBaselineForRollingReleaseTag, Project.MSG_DEBUG);
+    }
+
+   /**
+     * Set verbosity level to be used by rebaseline.pl script. Verbosity level ( 0 - quiet, 1 - verbose). Exception will be raised for any other value.
+     * @param verbosity 
+     * @ant.not-required
+     */     
+    public void setverbosity(Integer verbosity) {
+        this.verbosity = verbosity;
+        log("Set verbosity to " + verbosity, Project.MSG_DEBUG);
+    }
+    
+    public void execute() {
+        String missingArgs = "";
+        String commandArgs = "cmd /c rebaseline.pl ";
+
+        /* Handle mandatory arguments */
+        if (database == null)
+            missingArgs += "database ";
+        else
+            commandArgs += "-d " + database + " "; 
+
+        if (projectName == null)
+            missingArgs += "projectName ";
+        else
+            commandArgs += "-p " + projectName + " "; 
+
+        if (password == null)
+            missingArgs += "password ";
+        else
+            commandArgs += "-P " + password + " "; 
+
+        if (!missingArgs.equals(""))
+            throw new BuildException("[" + getTaskName() + "] Error: mandatory attributes are not defined - " + missingArgs);
+
+        /* Handle optional arguments */
+        if (release != null)
+             commandArgs += "-r " + release + " "; 
+
+        if (baseline != null)
+             commandArgs += "-B " + baseline + " "; 
+
+        if (version != null)
+             commandArgs += "-v " + version + " "; 
+
+        if (baselineName != null)
+             commandArgs += "-n " + baselineName + " "; 
+
+        if (releaseBaseline != null)
+            if (releaseBaseline)
+                commandArgs += "-R ";
+
+        if (leaveFolderswritable != null)
+            if (leaveFolderswritable)
+                commandArgs += "-w ";
+                
+        if (disableTaskRebadging != null)
+            if (disableTaskRebadging)
+                commandArgs += "-x ";
+
+        if (rebadgeObjectVersions != null)
+            if (rebadgeObjectVersions)
+                commandArgs += "-a ";
+
+        if (useBranchReleaseMethodology != null)
+            if (useBranchReleaseMethodology)
+                commandArgs += "-b ";
+
+        if (createBaselineForRollingReleaseTag != null)
+            if (createBaselineForRollingReleaseTag)
+                commandArgs += "-i ";
+
+        if (verbosity != null)
+            switch(verbosity) {
+              case 0: commandArgs += "-q ";
+                      break;
+              case 1: commandArgs += "-V ";
+                      break;
+              default: throw new BuildException("[" + getTaskName() + "] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose.");
+            }
+
+        try {
+            Execute exe = new Execute();
+            exe.runCommand(this, commandArgs.split(" "));
+        } catch (BuildException e) {
+            throw new BuildException("[" + getTaskName() + "] Error: Script execution failure.");
+        }
+        log("Completed successfully.");
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RetryTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,131 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+/* package org.apache.tools.ant.taskdefs; */
+/* * Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.taskdefs.*;
+
+/**
+ * Retries the nested task a set number of times
+ * 
+ * @since Ant 1.7.1
+ */
+public class RetryTask extends Task implements TaskContainer
+{
+
+    /**
+     * task to execute n times
+     */
+    private Task nestedTask;
+
+    /**
+     * set retryCount to 1 by default
+     */
+    private int retryCount = 1;
+
+    /**
+     * set sleepTime to 0 by default
+     */
+    private int sleepTime;
+
+    /**
+     * set the task
+     * 
+     * @param t
+     *            the task to retry.
+     */
+    public synchronized void addTask(Task t)
+    {
+        if (nestedTask != null)
+        {
+            throw new BuildException("The retry task container accepts a single nested task"
+                    + " (which may be a sequential task container)");
+        }
+        nestedTask = t;
+    }
+
+    /**
+     * set the number of times to retry the task
+     * 
+     * @param n
+     *            the number to use.
+     */
+    public void setRetryCount(int n)
+    {
+        retryCount = n;
+    }
+
+    /**
+     * set the sleep time inbetween each retry
+     * 
+     * @param n
+     *            the time in ms to sleep between each retry.
+     */
+    public void setSleepTime(int n)
+    {
+        sleepTime = n;
+    }
+
+    /**
+     * perform the work
+     * 
+     * @throws BuildException
+     *             if there is an error.
+     */
+    public void execute()
+    {
+        StringBuffer errorMessages = new StringBuffer();
+        String br = getProject().getProperty("line.separator");
+        for (int i = 0; i <= retryCount; i++)
+        {
+            try
+            {
+                nestedTask.perform();
+                break;
+            }
+            catch (Exception e)
+            {
+                errorMessages.append(e.getMessage());
+                if (i >= retryCount)
+                {
+                    StringBuffer exceptionMessage = new StringBuffer();
+                    exceptionMessage.append("Task [").append(nestedTask.getTaskName());
+                    exceptionMessage.append("] failed after [").append(retryCount);
+                    exceptionMessage.append("] attempts; giving up.").append(br);
+                    exceptionMessage.append("Error messages:").append(br);
+                    exceptionMessage.append(errorMessages);
+                    throw new BuildException(exceptionMessage.toString(), getLocation());
+                }
+                log("Attempt [" + i + "]:  error occurred; retrying...", e, Project.MSG_INFO);
+                errorMessages.append(br);
+                if (sleepTime > 0)
+                {
+                    Sleep sleepTimer = new Sleep();
+                    sleepTimer.setMilliseconds(sleepTime);
+                    sleepTimer.execute();
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/Signal.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.ant.taskdefs;
+
+/**
+ * This class stores a signal while being deferred. 
+ *
+ */
+public class Signal {
+
+    private String name;
+    private String message;
+
+    public String getMessage() {
+        return message;
+    }
+    
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/StopLogToConsole.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.Task;
+import com.nokia.ant.HeliumLogger;
+
+/**
+ * This task will control the outputing of the Helium logger.
+ * 
+ * Example of usage, to stop logging to console:
+ * <pre>
+ * &lt;hlm:logtoconsole action="stop"/&gt;
+ * </pre>
+ *  
+ * To resume logging to console:
+ * <pre>
+ * &lt;hlm:logtoconsole action="start"/&gt;
+ * </pre> 
+ * 
+ * @ant.task name="logtoconsole" category="Logging"
+ */ 
+public class StopLogToConsole extends Task 
+{   
+    private boolean stopLogToConsole;
+    
+    /**
+     * Action to perform, stop/start logging.
+     * @ant.not-required Default value is start.
+     */
+    public void setAction(String msg)
+    {
+        if ( msg.equalsIgnoreCase("stop") )
+        {
+            stopLogToConsole = true;
+        }
+        else
+        {
+            stopLogToConsole = false;
+        }       
+    }
+
+    @Override
+    public void execute()
+    {
+        super.execute();
+        if (HeliumLogger.getStopLogToConsole() != stopLogToConsole)
+        {
+            if (stopLogToConsole)
+                log("Logging to console suspended.");             
+            HeliumLogger.setStopLogToConsole(stopLogToConsole);   
+            if (!stopLogToConsole)
+                log("Logging to console resumed."); 
+        }       
+    }   
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/TextLogRecorderEntry.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,446 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+ 
+ /* * Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+ 
+package com.nokia.ant.taskdefs;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.ant.types.LogFilterSet;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.SubBuildListener;
+import org.apache.tools.ant.util.StringUtils;
+
+/**
+ * This is a class that represents a recorder. This is the listener to the build
+ * process.
+ * 
+ * @since Ant 1.4
+ */
+public class TextLogRecorderEntry implements LogRecorderEntry, SubBuildListener
+{
+
+    // ////////////////////////////////////////////////////////////////////
+    // ATTRIBUTES
+
+    /** The name of the file associated with this recorder entry. */
+    private String filename;
+
+    /** The state of the recorder (recorder on or off). */
+    private boolean record = true;
+
+    /** The current verbosity level to record at. */
+    private int loglevel = Project.MSG_INFO;
+
+    /** The output PrintStream to record to. */
+    private PrintStream out;
+
+    /** The start time of the last know target. */
+    private long targetStartTime;
+
+    /** Strip task banners if true. */
+    private boolean emacsMode;
+    
+    private LogFilterSet filterset;
+        
+    private Pattern pattern;
+
+    /** project instance the recorder is associated with */
+    private Project project;
+    
+
+    // ////////////////////////////////////////////////////////////////////
+    // CONSTRUCTORS / INITIALIZERS
+
+    /**
+     * @param name
+     *            The name of this recorder (used as the filename).
+     */
+    protected TextLogRecorderEntry(String name)
+    {
+        targetStartTime = System.currentTimeMillis();
+        filename = name;
+    }
+
+    // ////////////////////////////////////////////////////////////////////
+    // ACCESSOR METHODS
+
+    /**
+     * @return the name of the file the output is sent to.
+     */
+    public String getFilename()
+    {
+        return filename;
+    }
+
+    /**
+     * Turns off or on this recorder.
+     * 
+     * @param state
+     *            true for on, false for off, null for no change.
+     */
+    public void setRecordState(boolean state)
+    {
+        flush();
+        record = state;
+    }
+    
+    public void setRegexp(String regexp)
+    {        
+        pattern = Pattern.compile(Pattern.quote(regexp));
+    }
+    
+    public void setFilterSet(LogFilterSet o)
+    {
+        System.out.println("setFilterSet: " + o);
+        filterset = o;
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#buildStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void buildStarted(BuildEvent event)
+    {
+        log("> BUILD STARTED", Project.MSG_DEBUG);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#buildFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void buildFinished(BuildEvent event)
+    {
+        log("< BUILD FINISHED", Project.MSG_DEBUG);
+
+        if (record && out != null)
+        {
+            Throwable error = event.getException();
+
+            if (error == null)
+            {
+                out.println(StringUtils.LINE_SEP + "BUILD SUCCESSFUL");
+            }
+            else
+            {
+                out.println(StringUtils.LINE_SEP + "BUILD FAILED" + StringUtils.LINE_SEP);
+                error.printStackTrace(out);
+            }
+        }
+        cleanup();
+    }
+
+    /**
+     * Cleans up any resources held by this recorder entry at the end of a
+     * subbuild if it has been created for the subbuild's project instance.
+     * 
+     * @param event
+     *            the buildFinished event
+     * 
+     * @since Ant 1.6.2
+     */
+    public void subBuildFinished(BuildEvent event)
+    {
+        if (event.getProject() == project)
+        {
+            cleanup();
+        }
+    }
+
+    /**
+     * Empty implementation to satisfy the BuildListener interface.
+     * 
+     * @param event
+     *            the buildStarted event
+     * 
+     * @since Ant 1.6.2
+     */
+    public void subBuildStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#targetStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void targetStarted(BuildEvent event)
+    {
+        log(">> TARGET STARTED -- " + event.getTarget(), Project.MSG_DEBUG);
+        log(StringUtils.LINE_SEP + event.getTarget().getName() + ":", Project.MSG_INFO);
+        targetStartTime = System.currentTimeMillis();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#targetFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void targetFinished(BuildEvent event)
+    {
+        log("<< TARGET FINISHED -- " + event.getTarget(), Project.MSG_DEBUG);
+
+        String time = formatTime(System.currentTimeMillis() - targetStartTime);
+
+        log(event.getTarget() + ":  duration " + time, Project.MSG_VERBOSE);
+        flush();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#taskStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void taskStarted(BuildEvent event)
+    {
+        log(">>> TASK STARTED -- " + event.getTask(), Project.MSG_DEBUG);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#taskFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void taskFinished(BuildEvent event)
+    {
+        log("<<< TASK FINISHED -- " + event.getTask(), Project.MSG_DEBUG);
+        flush();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#messageLogged(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void messageLogged(BuildEvent event)
+    {
+        log("--- MESSAGE LOGGED", Project.MSG_DEBUG);
+
+        StringBuffer buf = new StringBuffer();
+
+        if (event.getTask() != null)
+        {
+            String name = event.getTask().getTaskName();
+
+            if (!emacsMode)
+            {
+                String label = "[" + name + "] ";
+                int size = DefaultLogger.LEFT_COLUMN_SIZE - label.length();
+
+                for (int i = 0; i < size; i++)
+                {
+                    buf.append(" ");
+                }
+                buf.append(label);
+            }
+        }
+        String message = event.getMessage();
+        String filteredMessage = filterMessage(message);
+        buf.append(filteredMessage);
+
+        log(buf.toString(), event.getPriority());
+    }
+    
+    private String filterMessage(String message)
+    {
+        if (pattern != null)
+        {
+        Matcher match = pattern.matcher(message);
+        message = match.replaceAll("********");
+    }
+        return message;
+    }
+
+    /**
+     * The thing that actually sends the information to the output.
+     * 
+     * @param mesg
+     *            The message to log.
+     * @param level
+     *            The verbosity level of the message.
+     */
+    private void log(String mesg, int level)
+    {
+        if (record && (level <= loglevel) && out != null)
+        {
+            out.println(mesg);
+        }
+    }
+
+    private void flush()
+    {
+        if (record && out != null)
+        {
+            out.flush();
+        }
+    }
+
+    /**
+     * @see BuildLogger#setMessageOutputLevel(int)
+     */
+    /** {@inheritDoc}. */
+    public void setMessageOutputLevel(int level)
+    {
+        if (level >= Project.MSG_ERR && level <= Project.MSG_DEBUG)
+        {
+            loglevel = level;
+        }
+    }
+
+    /**
+     * @see BuildLogger#setOutputPrintStream(PrintStream)
+     */
+    /**
+     * 
+     * @param output Output print stream
+     * 
+     */
+    public void setOutputPrintStream(PrintStream output)
+    {
+        closeFile();
+        out = output;
+    }
+
+    /**
+     * @see BuildLogger#setEmacsMode(boolean)
+     */
+    /** {@inheritDoc}. */
+    public void setEmacsMode(boolean emacsMode)
+    {
+        this.emacsMode = emacsMode;
+    }
+
+    /**
+     * @see BuildLogger#setErrorPrintStream(PrintStream)
+     */
+    /**
+     * 
+     * @param err Error print stream
+     * 
+     */
+    public void setErrorPrintStream(PrintStream err)
+    {
+        setOutputPrintStream(err);
+    }
+
+    private static String formatTime(long millis)
+    {
+        long seconds = millis / 1000;
+        long minutes = seconds / 60;
+
+        if (minutes > 0)
+        {
+            return Long.toString(minutes) + " minute" + (minutes == 1 ? " " : "s ")
+                    + Long.toString(seconds % 60) + " second" + (seconds % 60 == 1 ? "" : "s");
+        }
+        else
+        {
+            return Long.toString(seconds) + " second" + (seconds % 60 == 1 ? "" : "s");
+        }
+
+    }
+
+    /**
+     * Set the project associated with this recorder entry.
+     * 
+     * @param project
+     *            the project instance
+     * 
+     * @since 1.6.2
+     */
+    public void setProject(Project project)
+    {
+        this.project = project;
+        if (project != null)
+        {
+            project.addBuildListener(this);
+        }
+    }
+
+    /**
+     * @since 1.6.2
+     */
+    public void cleanup()
+    {
+        closeFile();
+        if (project != null)
+        {
+            project.removeBuildListener(this);
+        }
+        project = null;
+    }
+
+    /**
+     * Initially opens the file associated with this recorder. Used by Recorder.
+     * 
+     * @param append
+     *            Indicates if output must be appended to the logfile or that
+     *            the logfile should be overwritten.
+     * @throws BuildException
+     * @since 1.6.3
+     */
+    public void openFile(boolean append)
+    {
+        openFileImpl(append);
+    }
+
+    /**
+     * Closes the file associated with this recorder. Used by Recorder.
+     * 
+     * @since 1.6.3
+     */
+    public void closeFile()
+    {
+        if (out != null)
+        {
+            out.close();
+            out = null;
+        }
+    }
+
+    /**
+     * Re-opens the file associated with this recorder. Used by Recorder.
+     * 
+     * @throws BuildException
+     * @since 1.6.3
+     */
+    public void reopenFile()
+    {
+        openFileImpl(true);
+    }
+
+    private void openFileImpl(boolean append)
+    {
+        if (out == null)
+        {
+            try
+            {
+                out = new PrintStream(new FileOutputStream(filename, append));
+            }
+            catch (IOException ioe)
+            {
+                throw new BuildException("Problems opening file using a " + "recorder entry", ioe);
+            }
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/AddTask.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+import java.util.Vector;
+import com.nokia.ant.types.ccm.Task;
+
+/**
+ * This object creates new ccm task and contains all the Tasks in a list.
+ *
+ */
+public class AddTask extends CcmCommand
+{
+    private String folder;
+    private Vector tasks = new Vector();
+
+    public String getFolder()
+    {
+        return folder;
+    }
+
+    public void setFolder(String folder)
+    {
+        this.folder = folder;
+    }
+    
+    public Task createTask() {
+        Task task = new Task();
+        tasks.add(task);
+        return task;
+    }
+    
+    public Task[] getTasks() {
+        Task[] result = new Task[tasks.size()];
+        tasks.copyInto(result);
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/CcmCommand.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+import com.nokia.ant.taskdefs.CcmTask;
+
+/**
+ * Creates command string based on runtime class name.
+ *
+ */
+public class CcmCommand
+{
+    private CcmTask task;
+
+    /**
+     * @return the task
+     */
+    public CcmTask getTask()
+    {
+        return task;
+    }
+
+    /**
+     * @param task
+     *            the task to set
+     */
+    public void setTask(CcmTask task)
+    {
+        this.task = task;
+    }
+    
+    
+    public String getName()
+    {
+        String className = getClass().getName();
+        String commandName = className.substring(className.lastIndexOf('.') + 1).toLowerCase();
+        return commandName;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/ChangeReleaseTag.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+/**
+ * This object contains the current release tag.
+ *
+ */
+public class ChangeReleaseTag extends CcmCommand
+{
+    private String folder;
+    private String newreleasetag;
+    
+    
+    public String getFolder()
+    {
+        return folder;
+    }
+
+    public void setFolder(String folder)
+    {
+        this.folder = folder;
+    }
+    
+    public String getReleaseTag()
+    {
+        return newreleasetag;
+    }
+
+    public void setReleasetag(String newreleasetag)
+    {
+        this.newreleasetag = newreleasetag;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Checkout.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+/**
+ * This object is used to check out a ccm project.
+ *
+ */
+public class Checkout extends CcmCommand
+{
+    private String project;
+    private String release;
+    private String version;
+    private String purpose;
+    private String wa;
+    private boolean recursive;
+    private boolean relative;
+
+    public String getProject()
+    {
+        return project;
+    }
+
+    public void setProject(String project)
+    {
+        this.project = project;
+    }
+    
+    public String getRelease()
+    {
+        return release;
+    }
+
+    public void setRelease(String release)
+    {
+        this.release = release;
+    }
+    
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getPurpose()
+    {
+        return purpose;
+    }
+
+    public void setPurpose(String purpose)
+    {
+        this.purpose = purpose;
+    }
+
+    public String getWa()
+    {
+        return wa;
+    }
+
+    public void setWa(String wa)
+    {
+        this.wa = wa;
+    }
+
+    public boolean getRecursive()
+    {
+        return recursive;
+    }
+
+    public void setRecursive(boolean recursive)
+    {
+        this.recursive = recursive;
+    }
+
+    public boolean getRelative()
+    {
+        return relative;
+    }
+
+    public void setRelative(boolean relative)
+    {
+        this.relative = relative;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Close.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+/**
+ * To close the ccm session
+ *
+ */
+public class Close extends CcmCommand
+{
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Reconcile.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+/**
+ * This object is used to reconcile a ccm project.
+ *
+ */
+public class Reconcile extends CcmCommand
+{
+    private String project;
+
+    public String getProject()
+    {
+        return project;
+    }
+
+    public void setProject(String project)
+    {
+        this.project = project;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Snapshot.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+/**
+ * This object is used to snap shot a ccm project.
+ *
+ */
+public class Snapshot extends CcmCommand
+{
+    private String project;
+    private String dir;
+    private boolean recursive;
+    private boolean fast;
+
+    public String getProject()
+    {
+        return project;
+    }
+
+    public void setProject(String project)
+    {
+        this.project = project;
+    }
+    
+    public String getDir()
+    {
+        return dir;
+    }
+
+    public void setDir(String dir)
+    {
+        this.dir = dir;
+    }
+    
+    public boolean getRecursive()
+    {
+        return recursive;
+    }
+
+    public void setRecursive(boolean recursive)
+    {
+        this.recursive = recursive;
+    }
+    
+    public boolean getFast()
+    {
+        return fast;
+    }
+
+    public void setFast(boolean fast)
+    {
+        this.fast = fast;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Synchronize.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+
+/**
+ * This object is used to Synchronize a ccm project.
+ *
+ */
+public class Synchronize extends CcmCommand
+{
+    private String project;
+    private boolean recursive = true;
+    
+
+    public String getProject()
+    {
+        return project;
+    }
+
+    public void setProject(String project)
+    {
+        this.project = project;
+    }
+    
+    public boolean getRecursive()
+    {
+        return recursive;
+    }
+
+    public void setRecursive(boolean recursive)
+    {
+        this.recursive = recursive;
+    } 
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Update.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+/**
+ * This object is used to update a ccm project.
+ *
+ */
+public class Update extends CcmCommand
+{
+    private String project;
+
+    public String getProject()
+    {
+        return project;
+    }
+
+    public void setProject(String project)
+    {
+        this.project = project;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ccm/commands/Workarea.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.taskdefs.ccm.commands;
+/**
+ * Creates interface to get\set workarea informations for a given project.
+ *
+ */
+public class Workarea extends CcmCommand
+{
+    private String project;
+    private String path;
+    private String pst;
+    private boolean maintain;
+    private boolean recursive;
+    private boolean relative;
+    private boolean wat;
+
+    public String getProject()
+    {
+        return project;
+    }
+
+    public void setProject(String project)
+    {
+        this.project = project;
+    }
+    
+    public boolean getMaintain()
+    {
+        return maintain;
+    }
+
+    public void setMaintain(boolean maintain)
+    {
+        this.maintain = maintain;
+    }
+    
+    public boolean getRecursive()
+    {
+        return recursive;
+    }
+
+    public void setRecursive(boolean recursive)
+    {
+        this.recursive = recursive;
+    }
+
+    public boolean getRelative()
+    {
+        return relative;
+    }
+
+    public void setRelative(boolean relative)
+    {
+        this.relative = relative;
+    }
+
+    public String getPath()
+    {
+        return path;
+    }
+
+    public void setPath(String path)
+    {
+        this.path = path;
+    }
+
+    public String getPst()
+    {
+        return pst;
+    }
+
+    public void setPst(String pst)
+    {
+        this.pst = pst;
+    }
+
+    public boolean getWat()
+    {
+        return wat;
+    }
+
+    public void setWat(boolean wat)
+    {
+        this.wat = wat;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/LogFilter.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.regex.Pattern;
+
+/**
+ * This object contains log filter information basically a regular expression to use to filter the properties based on type and category.
+ *
+ * @ant.type name="logfilter"
+ */
+public class LogFilter extends DataType
+{
+    private String type;
+    private String regex;
+    private String category;
+    private java.util.regex.Pattern compileRegex;
+    
+    public LogFilter() {
+    }
+    
+    /**
+     * Set the type.
+     * @param type
+     */
+    public void setType(String type) {
+//        assertValid("name", name);
+        this.type = type;
+    }
+
+    /**
+     * Set the regular expression to use to filter the properties.
+     * @param regex a regular expression.
+     */
+    public void setRegex(String regex) {
+//        assertValid("regex", regex);
+        this.regex = regex;
+        compileRegex = java.util.regex.Pattern.compile(regex);
+    }
+
+    /**
+     * Set the catagory.
+     * @param cat value of the catagory.
+     */    
+    public void setCategory(String cat) {
+//      assertValid("regex", regex);
+      this.category = cat;
+    }
+    
+     /**
+     * Get the compile regex.
+     * @return compileRegex.
+     */
+    public Pattern getCompileRegex() {
+        return compileRegex;
+    }
+
+     /**
+     * Get the regex.
+     * @return regex.
+     */
+    public String getRegex() {
+        return regex;
+    }
+     /**
+     * Get the category.
+     * @return category.
+     */
+    public String getCategory() {
+        return category;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/LogFilterSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types;
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * Helper class to store the log filter set.
+ * @ant.type name="logfilterset"
+ */
+public class LogFilterSet extends DataType {
+    
+    private Vector filters = new Vector();
+    
+    public LogFilterSet() {
+    }    
+
+    public LogFilter createLogFilter() {
+        LogFilter filter =  new LogFilter();
+        add(filter);
+        return filter;
+    }
+    
+    public void add(LogFilter filter) {
+        filters.add(filter);
+    }
+    
+    public Vector getFilters() {
+        return filters;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/SBSMakeOptions.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types;
+
+import java.util.Vector;
+
+/**
+ * Helper class to store the variable set (list of variables
+ * with name / value pair)
+ * @ant.type name="sbsMakeOptions"
+ */
+public class SBSMakeOptions extends VariableSet {
+    
+    private Vector variables = new Vector();
+    
+    private String engine;
+    /**
+     * Constructor
+     */
+    public SBSMakeOptions() {
+    }    
+
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public Variable createVariable() {
+        Variable var =  new Variable();
+        add(var);
+        return var;
+    }
+    
+    /**
+     * Add a given variable to the list 
+     * @param var variable to add
+     */
+    public void add(Variable var) {
+        variables.add(var);
+    }
+    
+    /**
+     * Returns the list of variables available in the VariableSet 
+     * @return variable list
+     */
+    public Vector getVariables() {
+        return variables;
+    }
+    
+    public void setEngine(String makeEngine) {
+        engine = makeEngine;
+    }
+    
+    public String getEngine() {
+        return engine;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/Variable.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+
+/**
+ * Helper class to store the command line variables
+ * with name / value pair.
+ * @ant.type name="arg"
+ * @ant.type name="makeOption"
+ */
+public class Variable extends DataType
+{
+    private String mName;
+    private String mValue;
+    
+    public Variable() {
+    }
+    
+    /**
+     * Set the name of the variable.
+     * @param name
+     */
+    public void setName(String name) {
+        mName = name;
+    }
+
+    
+    /**
+     * Get the name of the variable.
+     * @return name.
+     */
+    public String getName() {
+        return mName;
+    }
+
+    /**
+     * Set the value of the variable.
+     * @param value
+     */
+    public void setValue(String value) {
+        mValue = value;
+    }
+
+    
+    /**
+     * Get the value of the variable.
+     * @return value.
+     */
+    public String getValue() {
+        return mValue;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/VariableSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * Helper class to store the variable set (list of variables
+ * with name / value pair)
+ * @ant.type name="argSet"
+ */
+public class VariableSet extends DataType {
+    
+    private Vector variables = new Vector();
+    
+    /**
+     * Constructor
+     */
+    public VariableSet() {
+    }    
+
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public Variable createVariable() {
+        Variable var =  new Variable();
+        add(var);
+        return var;
+    }
+    
+    /**
+     * Add a given variable to the list 
+     * @param var variable to add
+     */
+    public void add(Variable var) {
+        variables.add(var);
+    }
+    
+    /**
+     * Returns the list of variables available in the VariableSet 
+     * @return variable list
+     */
+    public Vector getVariables() {
+        return variables;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/Session.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.ccm;
+
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * This class abstract a synergy session.
+ * It store the address to an already existing session. 
+ */
+public class Session extends DataType {
+    // store the ccm_addr value
+    private String addr;
+    
+    /**
+     * Sets the synergy address.
+     * @param addr string representing the ccm_addr
+     */
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+    
+    /**
+     * Get the synergy address.
+     * @return string representing the ccm_addr
+     */
+    public String getAddr() {
+        return this.addr;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/SessionSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.ccm;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * This class implement an Ant Datatype that represents a set of
+ * synergy sessions. 
+ */
+public class SessionSet extends DataType {
+    private Vector sessions = new Vector();
+    
+    /**
+     * Create and register a Session object. 
+     * @return a Session object.
+     */
+    public Session createSession() {
+        Session session = new Session();
+        sessions.add(session);
+        return session;
+    }
+    
+    /**
+     * Returns an array of Session object.
+     * @returns an array of Session object
+     */
+    public Session[] getSessions() {
+        Session[] result = new Session[sessions.size()];
+        sessions.copyInto(result);
+        return result; 
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/Task.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.ccm;
+
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * This class abstract a synergy session.
+ * It store the address to an already existing session. 
+ */
+public class Task extends DataType {
+    // store the ccm_addr value
+    private String name;
+    
+    /**
+     * Sets the synergy address.
+     * @param addr string representing the ccm_addr
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    /**
+     * Get the synergy address.
+     * @return string representing the ccm_addr
+     */
+    public String getName() {
+        return name;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/ccm/TaskSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.ccm;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * This class abstract a synergy session.
+ * It store the address to an already existing session. 
+ */
+public class TaskSet extends DataType {
+    // store the Task objects
+    private Vector tasks = new Vector();
+    
+    /**
+     * Create and register a Session object. 
+     * @return a Session object.
+     */
+    public Task createTask() {
+        Task task = new Task();
+        tasks.add(task);
+        return task;
+    }
+    
+    /**
+     * Returns an array of Session object.
+     * @returns an array of Session object
+     */
+    public Task[] getSessions() {
+        Task[] result = new Task[tasks.size()];
+        tasks.copyInto(result);
+        return result; 
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Configuration.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,101 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.imaker;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.PatternSet;
+import java.util.Vector;
+
+/**
+ * This object represent a iMaker configuration.
+ * @ant.type name="imakerconfiguration" category="Imaker"
+ */
+public class Configuration extends DataType {
+    
+    private Vector makefiles = new Vector();
+    private Vector targets = new Vector();
+    private Vector variables = new Vector();
+    private boolean regionalVariation;
+    
+    public Configuration() {
+    }    
+
+    /**
+     * Create a makefileset element.
+     * Makefileset elements are based on regular Ant PatternSet.
+     * @return a PatternSet object.
+     */
+    public PatternSet createMakefileSet() {
+        PatternSet makefile =  new PatternSet();
+        makefiles.add(makefile);
+        return makefile;
+    }
+    
+    /**
+     * Get the list of makefileset element.
+     * @return a vector of PatternSet objects.
+     */
+    public Vector getMakefileSet() {
+        return makefiles;
+    }
+    
+    /**
+     * Create a targetset element.
+     * Targetset elements are based on regular Ant PatternSet.
+     * @return a PatternSet object.
+     */
+    public PatternSet createTargetSet() {
+        PatternSet target =  new PatternSet();
+        targets.add(target);
+        return target;
+    }
+    
+    /**
+     * Get the list of targetset.
+     * @return a vector of PatternSet objects.
+     */
+    public Vector getTargetSet() {
+        return targets;
+    }
+
+    /**
+     * Create a VariableSet element.
+     * @return a VariableSet object.
+     */
+    public VariableSet createVariableSet() {
+        VariableSet var =  new VariableSet();
+        variables.add(var);
+        return var;
+    }
+        
+    /**
+     * Get the list of variableset.
+     * @return a vector of VariableSet objects.
+     */
+    public Vector getVariableSet() {
+        return variables;
+    }
+
+    public void setRegionalVariation(boolean value) {
+        regionalVariation = value;
+    }
+
+    public boolean getRegionalVariation() {
+        return regionalVariation;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/ConfigurationSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.imaker;
+
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * Set of iMaker configuration.
+ *
+ * <pre>
+ * &lt;hlm:imakerconfigurationset&gt;
+ *     &lt;imakerconfiguration regionalVariation="true"&gt;
+ *         &lt;makefileset&gt;
+ *             &lt;include name="*&#42;/product/*ui.mk"/&gt;
+ *         &lt;/makefileset&gt;
+ *         &lt;targetset&gt;
+ *             &lt;include name="^core$" /&gt;
+ *             &lt;include name="langpack_\d+" /&gt;
+ *             &lt;include name="^custvariant_.*$" /&gt;
+ *             &lt;include name="^udaerase$" /&gt;
+ *         &lt;/targetset&gt;
+ *         &lt;variableset&gt;
+ *             &lt;variable name="TYPE" value="rnd"/&gt;
+ *             &lt;variable name="USE_FOTI" value="0"/&gt;
+ *             &lt;variable name="USE_FOTA" value="1"/&gt;
+ *         &lt;/variableset&gt;
+ *     &lt;/imakerconfiguration&gt;
+ * &lt;/hlm:imakerconfigurationset&gt;
+ * </pre>
+ * @ant.type name="imakerconfigurationset" category="Imaker"
+ */
+public class ConfigurationSet extends DataType {
+
+    private Vector configurations = new Vector();
+
+    public ConfigurationSet() {
+    }
+
+    /**
+     * This method create an iMaker Configuration element. 
+     */
+    public Configuration createImakerConfiguration() {
+        Configuration config = new Configuration();
+        configurations.add(config);
+        return config;
+    }
+
+    /**
+     * Get the list of iMaker configuration. 
+     */
+    public Vector getImakerConfiguration() {
+        return configurations;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Variable.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.imaker;
+
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * Helper class to store the command line variables for imaker.
+ * @ant.type name="variable" category="Imaker"
+ */
+public class Variable extends DataType
+{
+    private String mName;
+    private String mValue;
+    
+    public Variable() {
+    }
+    
+    /**
+     * Set the name of the variable.
+     * @param name
+     */
+    public void setName(String name) {
+        mName = name;
+    }
+
+    
+    /**
+     * Get the name of the variable.
+     * @return name.
+     */
+    public String getName() {
+        return mName;
+    }
+
+    /**
+     * Set the value of the variable.
+     * @param value
+     */
+    public void setValue(String value) {
+        mValue = value;
+    }
+
+    
+    /**
+     * Get the value of the variable.
+     * @return value.
+     */
+    public String getValue() {
+        return mValue;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/VariableSet.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.types.imaker;
+import org.apache.tools.ant.types.DataType;
+import java.util.Vector;
+
+/**
+ * This object stores a set of Variable object.
+ * @ant.type name="variableset" category="Imaker"
+ */
+public class VariableSet extends DataType {
+    
+    private Vector variables = new Vector();
+    
+    public VariableSet() {
+    }    
+
+    /**
+     * Creates a Variable object.
+     * @return a Variable object.
+     */
+    public Variable createVariable() {
+        Variable var =  new Variable();
+        add(var);
+        return var;
+    }
+    
+    /**
+     * Support the addition of a Variable object.
+     * @param a Variable object.
+     */
+    public void add(Variable var) {
+        variables.add(var);
+    }
+    
+    /**
+     * Get the list of Variable object.
+     * @return a vector of Variable objects
+     */
+    public Vector getVariables() {
+        return variables;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/util/Helper.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant.util; 
+
+import org.apache.tools.ant.Project;
+/**
+ * Utility class to read property value, if property is not defined it will raise an exception.
+ *
+ */
+public final class Helper
+{
+    private Helper() { }
+    
+    public static String getProperty(Project project, String val) throws Exception
+    {
+        String prop = project.getProperty(val);
+        if (prop == null)
+            throw new Exception(val + " not defined");
+        return prop;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/util/ToolsProcess.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.util;
+
+import java.util.Hashtable;
+
+import com.nokia.tools.Tool;
+import com.nokia.tools.ToolsProcessException;
+import org.apache.log4j.Logger;
+/**
+ * Utility class to read property value, if property is not defined it will raise an exception.
+ *
+ */
+public final class ToolsProcess {
+    private static Hashtable tools = new Hashtable();
+
+    private static Logger log;
+    
+    private ToolsProcess() { }
+
+    public static Tool getTool(String reqTool) throws ToolsProcessException {
+        if (log == null) {
+            log = Logger.getLogger(ToolsProcess.class);
+        }
+        log.info("processing for tool" + reqTool);
+        Class toolClass = null;
+        String className = "com.nokia.tools."
+            + reqTool.toLowerCase() + "." + reqTool.toUpperCase()
+            + "Tool";
+        try {
+            toolClass = Class.forName(className);
+            Tool tool = (Tool) toolClass.newInstance();
+            log.debug("Found tool" + reqTool);
+            return tool;
+        } catch (ClassNotFoundException e1) {
+            log.debug("Tool not found exception:", e1);
+            throw new ToolsProcessException("tool not supported: " + className);
+        } catch (InstantiationException e2) {
+            log.debug("Tool instantiation exception: ", e2);
+            throw new ToolsProcessException("tool " + toolClass
+                    + "cannot be instantiated");
+        } catch (IllegalAccessException e3) {
+            log.debug("Tool illegal access exception: ", e3);
+            throw new ToolsProcessException("tool " + toolClass
+                    + " cannot be accessed");
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/config/SAXConfigParser.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.config;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.Attribute;
+import org.dom4j.ElementPath;
+import org.dom4j.ElementHandler;
+import org.dom4j.io.SAXReader;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Parses the sysdef config file and extracts the available configurations
+ */
+public class SAXConfigParser {
+    private String sysdefFile;
+    private String configs = "";
+
+    /**
+     * Constructor
+     * @param fileName - name of the sysdef file to parse
+     */
+    public SAXConfigParser(String fileName) {
+        sysdefFile = fileName;
+    }
+
+    /**
+     * Constructor
+     * @return list of available configurations that can be built.
+     */    
+     public String getConfigs() {
+        File file = new File(sysdefFile);
+            SAXReader reader = new SAXReader();
+            reader.addHandler( "/SystemDefinition/build/target",
+                new ElementHandler() {
+                    public void onStart(ElementPath path) {
+                    }
+                    public void onEnd(ElementPath path) {
+                        Element row = path.getCurrent();
+                        Iterator itr = row.attributeIterator();
+                        while (itr.hasNext())
+                        {
+                            Attribute child = (Attribute) itr.next();
+                            String attrName = child.getQualifiedName();
+                            if (attrName.equals("name")) {
+                                configs += (String)child.getValue() + ",";
+                            }
+                        }
+                        row.detach();
+                    }
+                }
+            );
+            try {
+                Document doc = reader.read(file);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        return configs;
+    }
+     
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/fmpp/SqlDataLoader.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,117 @@
+package com.nokia.fmpp;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import freemarker.core.StringArraySequence;
+import freemarker.template.SimpleList;
+
+import fmpp.Engine;
+import fmpp.tdd.DataLoader;
+
+/**
+ * 
+ */
+public class SqlDataLoader implements DataLoader {
+
+    private Engine engine;
+
+    private List args;
+
+    private String driverClassName = "org.sqlite.JDBC";
+
+    private String url = "jdbc:sqlite:e:\\Build_E\\eclipse_fasym013\\helium-trunk\\helium\\build\\test.db";
+
+    private String database = "log_output_text";
+    
+    private int offset;
+
+    /**
+     * @see fmpp.tdd.DataLoader#load(fmpp.Engine, java.util.List)
+     */
+    public Object load(Engine engine, List args) throws Exception {
+
+        this.engine = engine;
+        this.args = args;
+        this.offset = Integer.parseInt((String)args.get(0));
+
+
+        // establish a JDBC connection
+        Class.forName(this.driverClassName);
+        System.setProperty("jdbc.drivers", this.driverClassName);
+        Connection connection = DriverManager.getConnection(this.url);
+
+        try {
+            return load(connection);
+        }
+        finally {
+            connection.close();
+        }
+    }
+
+    protected Object load(Connection connection) throws Exception {
+        HashMap database = new HashMap();
+
+        // recuperation des tables
+        ResultSet rs = connection.getMetaData().getTables(this.database, null,
+                null, null);
+        while (rs.next()) {
+            System.out.println(rs.getString(3));
+            database.put(rs.getString(3), new ArrayList());
+        }
+        rs.close();
+
+        // recuperation des donnees
+        Iterator it = database.keySet().iterator();
+        while (it.hasNext()) {
+            String tableName = (String) it.next();
+            List table = (List) database.get(tableName);
+
+            // recuperation de la structure de la table
+            rs = connection.getMetaData().getColumns(this.database, null,
+                    tableName, null);
+            List tableStructure = new ArrayList();
+            while (rs.next()) {
+                //System.out.println("string4:"+rs.getString(4));
+                tableStructure.add(rs.getString(4));
+            }
+            String[] fieldNames = (String[]) tableStructure
+                    .toArray(new String[] { });
+            ArrayList list = new ArrayList();
+            ArrayList rowList = new ArrayList();
+            System.out.println("offset" + offset);
+            // recuperation des donnees
+            String sql = "SELECT COUNT(*) AS COUNT FROM " + tableName + " where priority='WARNING';";
+            Statement stmt = connection.createStatement();
+            rs = stmt.executeQuery(sql);
+            System.out.println("record size of warning:" + rs.getInt("COUNT"));
+            stmt.close();
+            sql = "SELECT * FROM " + tableName + " limit 5 offset " + offset + ";";
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sql);
+            if (rs.isBeforeFirst()) {
+                while (rs.next()) {
+                    HashMap row = new HashMap();
+                    for (int i = 0; i < fieldNames.length; i++) {
+                        String fieldName = fieldNames[i];
+                        //System.out.println("fieldName:"+fieldName);
+                        list.add(rs.getObject(i + 1));
+                        //row.put(fieldName, rs.getObject(i + 1));
+                    }
+                    String[] str = new String [list.size()];
+                    rowList.add(new StringArraySequence((String [])list.toArray(str)));
+                    //table.add(row);
+                }
+            }
+            
+            database.put("content",new SimpleList(rowList));
+            stmt.close();
+        }
+        return database;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/log4j.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+            <appender-ref ref="FILE"/>
+            <appender-ref ref="CONSOLE"/>
+    </appender>
+
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="false" />
+    </filter>
+    </appender>
+
+
+    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
+        <param name="File" value="${log4j.cache.dir}/hlm_debug.log"/>
+        <param name="append" value="false"/>
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="true" />
+    </filter>
+    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
+    </appender>
+
+    <appender name="FILE-listener" class="org.apache.log4j.RollingFileAppender">
+        <param name="File" value="${log4j.cache.dir}/hlm_listener.log"/>
+        <param name="MaxFileSize" value="1024KB"/>
+        <param name="append" value="false"/>
+        <layout class="org.apache.log4j.PatternLayout">
+               <param name="ConversionPattern" 
+                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+        </layout>
+    <filter class="org.apache.log4j.varia.LevelMatchFilter">
+      <param name="LevelToMatch" value="DEBUG" />
+      <param name="AcceptOnMatch" value="true" />
+    </filter>
+    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
+    </appender>
+
+  <logger name="com.nokia" additivity="false">
+      <level value="DEBUG" />
+    <appender-ref ref="ASYNC" />
+  </logger>
+
+ <logger name="org.apache.bsf.BSFManager">
+	<level value="off"/>
+ </logger>
+
+  <logger name="com.nokia.ant.listener.internaldata" additivity="false">
+      <level value="DEBUG" />
+    <appender-ref ref="CONSOLE"/>
+    <appender-ref ref="FILE-listener" />
+  </logger>
+    <root>
+        <priority value="DEBUG"/>
+        <appender-ref ref="CONSOLE"/>
+    </root>
+</log4j:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/Tool.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.tools;
+
+import com.nokia.ant.types.VariableSet;
+import org.apache.tools.ant.Project;
+/**
+ * Common interface for the command line tool wrapper
+ */
+public interface Tool {
+
+    /**
+     * Create a task which can be executed based on the input
+     * command line variables set using setVariables()
+     * @return the task to execute
+     */
+    void execute(VariableSet varSet, Project prj)throws ToolsProcessException;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/ToolsProcessException.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.tools;
+
+/**
+ * Exception handling for command line tool wrapper 
+ */
+public class ToolsProcessException extends Exception {
+
+    /**
+     * Constructor
+     * @param String exception message
+     */    
+    public ToolsProcessException(String message) {
+        super("ToolsProcessException:" + message);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/cmt/CMTTool.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,113 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.tools.cmt;
+
+import java.util.Enumeration;
+import com.nokia.ant.types.VariableSet;
+import com.nokia.ant.types.Variable;
+import com.nokia.tools.*;
+import java.io.File;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+import java.io.FileWriter;
+import java.io.BufferedWriter;
+import org.apache.tools.ant.DirectoryScanner;
+
+/**
+ * Command Line wrapper for configuration tools
+ */
+public class CMTTool implements Tool {
+
+    /**
+     * Sets the command line variables to be used to execute and validates
+     * for the required parameters 
+     * @param VariableSet variable(name / value list)
+     */    
+       public void execute(VariableSet varSet, Project prj)throws ToolsProcessException {
+        String input = null; 
+        String output = null;
+        String config = null;
+        String pattern = null;
+        String keepGoing = "false";
+        String varName;
+        String value;
+        Enumeration e = varSet.getVariables().elements();
+        Variable variable;
+        while (e.hasMoreElements()) {
+            variable = (Variable)e.nextElement();
+            varName = variable.getName();
+            value = variable.getValue();
+            if (varName.equals("input")) {
+                input = value;
+            } else if (varName.equals("config")) {
+                config = value;
+            } else if (varName.equals("output")) {
+                output = value;
+            } else if (varName.equals("pattern")) {
+                pattern = value;
+            }
+        }
+           if (input == null || output == null || pattern == null) {
+               throw new ToolsProcessException("CMTTool Parameter missing");
+           }
+           generateFileList(input, output,pattern, prj);
+           try {
+             org.apache.tools.ant.taskdefs.ExecTask task = new org.apache.tools.ant.taskdefs.ExecTask();
+             task.setDir(new File(prj.getProperty("build.drive")));
+             task.setTaskName("cmttool");
+             task.setExecutable("cmt.exe");
+             task.createArg().setValue("-f");
+             task.createArg().setValue(input + System.getProperty("file.separator") + "files.lst");
+             task.createArg().setValue("-o");
+             task.createArg().setValue(output);
+             task.execute();
+             org.apache.tools.ant.taskdefs.ExecTask cmt2task = new org.apache.tools.ant.taskdefs.ExecTask();
+             cmt2task.setDir(new File(output).getParentFile()); 
+             cmt2task.setTaskName("cmt2html");
+             cmt2task.setExecutable("cmt2html.bat");
+             cmt2task.createArg().setValue("-i");
+             cmt2task.createArg().setValue(output);
+             cmt2task.createArg().setValue("-nsb");
+             cmt2task.execute();
+        } catch (Exception e1) {
+            e1.printStackTrace();
+        }       
+    }
+    
+    private void generateFileList(String input,String output, String pattern, Project prj) {
+        FileSet fileset = new FileSet();
+        String [] includes = pattern.split(",");
+        fileset.setDir(new File(input));
+        fileset.setProject(prj);
+        fileset.appendIncludes(includes);
+        DirectoryScanner ds = fileset.getDirectoryScanner();
+        ds.scan();
+        String [] filelist = ds.getIncludedFiles();
+        String fileSeparator = System.getProperty("file.separator");
+        File fileList = new File(input + fileSeparator + "files.lst");
+        try {
+            BufferedWriter outputFile = new BufferedWriter(new FileWriter(fileList));
+            for (int i = 0; i < filelist.length; i++ ) {
+                outputFile.write(input + fileSeparator  + filelist[i] + "\n");
+            }
+            outputFile.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/configuration/CONFIGURATIONTool.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.tools.configuration;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import com.nokia.ant.types.VariableSet;
+import com.nokia.ant.types.Variable;
+import com.nokia.tools.*;
+import org.apache.tools.ant.Project;
+
+/**
+ * Command Line wrapper for configuration tools
+ */
+public class CONFIGURATIONTool implements Tool {
+
+    /**
+     * Sets the command line variables to be used to execute and validates for
+     * the required parameters
+     * 
+     * @param VariableSet
+     *            variable(name / value list)
+     */
+    public void execute(VariableSet varSet, Project prj)
+            throws ToolsProcessException {
+        String path = null;
+        String masterConf = null;
+        String confml = null;
+        String impl = null;
+        String iby = null;
+        String keepGoing = "false";
+        String report = null;
+        String varName;
+        String value;
+        Vector configSet = varSet.getVariables();
+        Enumeration e = configSet.elements();
+        Variable variable;
+        while (e.hasMoreElements()) {
+            variable = (Variable) e.nextElement();
+            varName = variable.getName();
+            value = variable.getValue();
+            if (varName.equals("path")) {
+                path = value;
+            } else if (varName.equals("master_conf")) {
+                masterConf = value;
+            } else if (varName.equals("confml")) {
+                confml = value;
+            } else if (varName.equals("impl")) {
+                impl = value;
+            } else if (varName.equals("iby")) {
+                iby = value;
+            } else if (varName.equals("keepgoing")) {
+                keepGoing = value;
+            } else if (varName.equals("report")) {
+                report = value;
+            }
+        }
+        if (path == null || masterConf == null || confml == null || iby == null) {
+            throw new ToolsProcessException("Config Tool Parameter missing");
+        }
+        org.apache.tools.ant.taskdefs.ExecTask task = new org.apache.tools.ant.taskdefs.ExecTask();
+        task.setTaskName("Configuration");
+        task.setDir(new java.io.File(path));
+        task.setExecutable(path + java.io.File.separator + "cli_build.cmd");
+        if (keepGoing.equals("false")) {
+            task.setFailonerror(true);
+        } else {
+            task.createArg().setValue("-ignore_errors");
+        }
+        task.createArg().setValue("-master_conf");
+        task.createArg().setValue(masterConf);
+        task.createArg().setValue("-impl");
+        task.createArg().setValue(impl);
+        task.createArg().setValue("-confml");
+        task.createArg().setValue(confml);
+        task.createArg().setValue("-iby");
+        task.createArg().setValue(iby);
+        if (report != null) {
+            task.createArg().setValue("-report");
+            task.createArg().setValue(report);
+        }
+        task.execute();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/sbs/SBSTool.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,515 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.tools.sbs;
+
+import java.util.Vector;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Enumeration;
+import com.nokia.ant.types.VariableSet;
+import com.nokia.ant.types.SBSMakeOptions;
+import com.nokia.ant.types.Variable;
+import com.nokia.tools.*;
+import org.apache.tools.ant.Project;
+import java.util.Set;
+import org.apache.tools.ant.taskdefs.ExecTask;
+import org.apache.log4j.Logger;
+import java.io.File;
+import org.apache.tools.ant.types.Reference;
+import org.w3c.dom.*;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+import java.io.FileWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+//import org.apache.tools.ant.types.Environment;
+/**
+ * Command Line wrapper for configuration tools
+ */
+public class SBSTool implements Tool {
+    private final String prefix = "--mo=";
+    private final String equalSign = "=";
+    
+    private Logger log;
+    private String layers;
+    private String config;
+    private String skipBuild;
+    private String singleJob;
+    private String layerOrder;
+    private String components;
+    private String command;
+    private String varName;
+    private String sysdefBase;
+    private String enableFilter;
+    private String checkOption;
+    private String whatOption;
+    private String retryOption;
+    private SimpleDateFormat timeFormat;
+    private Date startTime;
+    private Date endTime;
+    
+    
+    public SBSTool() {
+        log = Logger.getLogger(SBSTool.class);
+        timeFormat = new SimpleDateFormat("HH:mm:ss");
+        
+    }
+    /**
+     * Sets the command line variables to be used to execute and validates 
+     * for the required parameters (as Tool interface) 
+     * @param VariableSet variable(name / value list)
+     */    
+    public void execute(VariableSet varSet, Project prj)throws ToolsProcessException {
+        layers = null;
+        config = null;
+        skipBuild = null;
+        singleJob = null;
+        layerOrder = null;
+        components = null;
+        command = null;
+        varName = null;
+        String value = null;
+        sysdefBase = null;
+        enableFilter = null;
+        checkOption = null;
+        whatOption = null;
+        retryOption = null;
+        Vector configSet = varSet.getVariables();
+        log.debug("SBSTool:configSet.size:" + configSet.size());
+        Enumeration e = configSet.elements();
+        Variable variable;
+        while (e.hasMoreElements()) {
+            variable = (Variable)e.nextElement();
+            varName = variable.getName();
+            value = variable.getValue();
+            log.debug("SBSTool:varName:" + varName);
+            log.debug("SBSTool:value:" + value);
+            if (varName.equals("layers")) {
+                layers = value;
+            } else if (varName.equals("config")) {
+                config = value;
+            } else if (varName.equals("skipbuild")) {
+                skipBuild = value;
+            } else if (varName.equals("singlejob")) {
+                singleJob = value;
+            } else if (varName.equals("layer-order")) {
+                layerOrder = value;
+            } else if (varName.equals("command")) {
+                command = value;
+            } else if (varName.equals("components")) {
+                components = value;
+            } else if (varName.equals("sysdef-base")) {
+                sysdefBase = value;
+            } else if (varName.equals("enable-filter")) {
+                enableFilter = value;
+            } else if (varName.equals("run-check")) {
+                checkOption = value;
+            } else if (varName.equals("run-what")) {
+                whatOption = value;
+            } else if (varName.equals("retry-limit")) {
+                retryOption = value;
+            }
+            
+        }
+        execTask(prj);
+    }
+
+    /**
+     * Sets the command line variables to be used to execute and validates 
+     * for the required parameters (as SBSTask) 
+     * @param VariableSet variable(name / value list)
+     */    
+    public void execute(HashMap attributes, Project project)throws ToolsProcessException {
+        layers = null;
+        config = null;
+        skipBuild = null;
+        singleJob = null;
+        layerOrder = null;
+        command = null;
+        components = null;
+        sysdefBase = null;
+        enableFilter = null;
+        retryOption = null;
+        String value = (String)attributes.get("layers");
+        if ( value != null) {
+            layers = value;
+            System.out.println("layers:" + value);
+        }
+        value = (String)attributes.get("config");
+        if (value != null) {
+            config = value;
+            System.out.println("config:" + value);
+        }
+        value = (String)attributes.get("skipbuild");
+        if (value != null) {
+            skipBuild = value;
+            System.out.println("skipbuild:" + value);
+        }
+        value = (String)attributes.get("singlejob");
+        if (value != null) {
+            singleJob = value;
+            System.out.println("singlejob:" + value);
+        }
+        value = (String)attributes.get("layer-order");
+        if (value != null) {
+            layerOrder = value;
+            System.out.println("layer-order:" + value);
+        }
+        value = (String)attributes.get("command");
+        if (value != null) {
+            command = value;
+            System.out.println("command:" + value);
+        }
+        value = (String)attributes.get("components");
+        if (value != null) {
+            components = value;
+        }
+        value = (String)attributes.get("sysdef-base");
+        if (value != null) {
+            sysdefBase = value;
+        }
+        value = (String)attributes.get("enable-filter");
+        if (value != null) {
+            enableFilter = value;
+        } else if (varName.equals("retry")) {
+            retryOption = value;
+        }
+
+        execTask(project);
+    }
+    
+    /**
+     * Task to execute the SBS command 
+     * Updates all the default values for the command, in case
+     * if the options are not provided. 
+     * @param engine - make engine for sbs command
+     * @param layers - layers for sbs commands has to be executed
+     * @param config - configuration to be built (armv5 / winscw) 
+     * @param singleJob - no. of concurrent jobs
+     * @param layerOrder - whether the layer execution should be based on order
+     * @param command - sbs make targets to execute(CLEAN, REALLYCLEAN, TARGET etc.,) 
+     * @param prj - Ant project reference. 
+     */    
+    public void execTask(Project prj) throws ToolsProcessException {
+
+        log.info("SBSTask:executing for SBS task");
+        String partialLogPath = prj.getProperty("build.log.dir") + "/" + prj.getProperty("build.id");
+        String sysdefConfig = prj.getProperty("sysdef.configuration");
+        String sbsLogName = "";
+        ExecTask task = new ExecTask();
+        task.setTaskName("sbs");
+        String osType = System.getProperty("os.name");
+        log.debug("SBSTask:ostype:" + osType);
+        if (osType.toLowerCase().startsWith("win")) {
+            task.setExecutable("sbs.bat");
+        } else {
+            task.setExecutable("sbs");
+        }
+        task.setFailonerror(true);
+        task.setDir(new java.io.File(prj.getProperty("build.drive") + "/"));
+        log.debug("SBSTask:root dir:" + prj.getProperty("build.drive") + "/");
+        task.createArg().setValue("-s");
+        String sysdefFile = prj.getProperty("build.output.dir") + "/build/canonical_system_definition_" + sysdefConfig + ".xml";
+        task.createArg().setValue(sysdefFile);
+        if (layerOrder != null) {
+            task.createArg().setValue("-o");
+        }
+        task.createArg().setValue("-k");
+        sbsLogName += setLayerArgs(task);
+        sbsLogName += setConfigArgs(task);
+        Object makeOptReference = prj.getReference("sbs.internal.make.options");
+        sbsLogName += updateSBSMakeOptions(makeOptReference, prj, task);
+        if ( skipBuild != null ) {
+            log.debug("SBSTask:makeOptions.skipping build:" + skipBuild);
+            sbsLogName += "_nobuild";
+            if (skipBuild.equals("true")) {
+                task.createArg().setValue("-n");
+            }
+        }
+        if (command != null) {
+            log.debug("SBSTask:command:" + command);
+            sbsLogName += command;
+            task.createArg().setValue(command);
+        }
+        if (sysdefBase != null) {
+            log.debug("SBSTask:sysdefBase:" + sysdefBase);
+            task.createArg().setValue("-a");
+            task.createArg().setValue(sysdefBase);
+        }
+        String logFileName = partialLogPath + "." + sysdefConfig + "_compile.log";
+        sbsLogName = convertSpecialCharacters(sbsLogName);
+        String tempPath = partialLogPath + "_" + sbsLogName + "_" + sysdefConfig;
+        task.createArg().setValue("-m");
+        task.createArg().setValue(tempPath + "_Makefile");
+        String additionalFilters = "";
+        /*
+         * commented as changes from raptor is required and is not there yet. Further 
+         * discussions on to handle in a better way.
+         */
+        if (whatOption != null && whatOption.equals("true")) {
+            task.createArg().setValue("--what");
+        }
+        /*
+        //When whatOption is set to true, then it uses the filterWhat plugin to generate the 
+        // what log (which is generated during the build phase)
+        if (whatOption != null && whatOption.equals("true")) {
+            Environment.Variable var = new Environment.Variable();
+            var.setKey("FILTERWHAT_FILE");
+            var.setValue(partialLogPath + "." + sysdefConfig + "_what.log");
+            log.debug("SBSTask:filterwhatlog file:" + (partialLogPath + "." + sysdefConfig + "_what.log"));
+            task.addEnv(var);
+            additionalFilters = ",filterWhat";
+        }
+        //When checkOption is set to true, then in filterHeliumLog during summary file generation
+        // what log is read and checked for the existance of the file in what log. If the file doesn't exists
+        // then it writes it to the check log. Requested this operation to be in raptor plugin rather than
+        // in helium plugin, but 
+        // what log (which is generated during the build phase)
+        if (checkOption != null && checkOption.equals("true")) {
+            Environment.Variable var = new Environment.Variable();
+            var.setKey("FILTERCHECK_FILE");
+            var.setValue(partialLogPath + "." + sysdefConfig + "_check.log");
+            log.debug("SBSTask:filterchecklog file:" + (partialLogPath + "." + sysdefConfig + "_check.log"));
+            task.addEnv(var);
+            additionalFilters = ",filterWhat";
+        }
+        */
+        if (checkOption != null && checkOption.equals("true")) {
+            task.createArg().setValue("--check");
+        }
+        task.createArg().setValue("--filters=FilterMetadataLog" + additionalFilters);
+        String sbsStatsFile = partialLogPath + "." + sysdefConfig + "_sbs_info.xml";
+        if (retryOption != null) {
+            //the problem could be that if the failure happened for some other reason
+            //it would still retry
+            log.debug("building with retry:");
+            task.createArg().setValue("--tries");
+            task.createArg().setValue(retryOption);
+        }
+        task.createArg().setValue("-f");
+        task.createArg().setValue(tempPath + "_compile.log");
+        String outputFileName = tempPath + ".sbs_ant_output.log";
+        log.debug("SBSTask:outputfilename:" + outputFileName);
+        log.debug("SBSTask:sbsLogName:" + sbsLogName);
+        task.setOutput(new File(outputFileName));
+        startTime = new Date();
+        
+        try {
+            task.execute();
+        } catch (Exception ex) {
+            //Sometime null pointer exception is thrown in linux
+            log.debug("Warning: exception during executing sbs task", ex);
+        }
+        try {
+            log.debug("SBSTask:sbs.log.file:" + tempPath + "_compile.log");
+            prj.setProperty("sbs.log.file", tempPath + "_compile.log");
+        } catch (Exception e) {
+            log.debug("SBSTask:sysdefBase:copying the log file with sbs config failed");
+        }
+        endTime = new Date();
+        updateSBSLogStatistics(sbsStatsFile, tempPath + "_compile.log");
+    }
+
+    private String updateSBSMakeOptions(Object makeOptReference, Project prj, ExecTask task) {
+        String retValue = "";
+        if (makeOptReference != null && makeOptReference instanceof SBSMakeOptions) {
+            Object makeOptObject = ((Reference)((SBSMakeOptions)makeOptReference).getRefid()).getReferencedObject();
+            if (makeOptObject != null && makeOptObject instanceof SBSMakeOptions) {
+                log.debug("SBSTask:makeOptReference: not null");
+                SBSMakeOptions sbsMakeOptions = (SBSMakeOptions)makeOptObject;
+                String engine = sbsMakeOptions.getEngine();
+                log.info("SBSTask:with engine:" + engine);
+                if (engine != null && engine.equals("emake")) {
+                    emake(task, sbsMakeOptions, prj);
+                } else if (engine != null && engine.equals("gmake")) {
+                    retValue += gmake(task, prj);
+                }
+            }
+        }
+        return retValue;
+    }
+    
+    private void updateSBSLogStatistics(String infoFileName, 
+            String logFileName) {
+
+        try {
+            DocumentBuilderFactory sbsInfo = DocumentBuilderFactory.newInstance();
+            DocumentBuilder docBuilder = sbsInfo.newDocumentBuilder();
+            Document doc = docBuilder.newDocument();
+            Element root = doc.createElement("sbsinfo");
+            doc.appendChild(root);
+            Element child = doc.createElement("logfile");
+            child.setAttribute("name", logFileName);
+            root.appendChild(child);
+            
+            child = doc.createElement("duration");
+            //Todo: handle if the time difference is greater than 24 hours
+            child.setAttribute("time", timeFormat.format(new Date(endTime.getTime() - startTime.getTime())));
+            root.appendChild(child);
+            Transformer transformer = TransformerFactory.newInstance().newTransformer();
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+            FileWriter sbsWriter = new FileWriter(infoFileName);
+            StreamResult result = new StreamResult(sbsWriter);
+            DOMSource sbsSource = new DOMSource(doc);
+            transformer.transform(sbsSource, result);
+        } catch (Exception ex) {
+            log.debug("exception while xml writing sbs log info", ex);
+        }
+        
+    }
+
+    
+    private String setLayerArgs(ExecTask task)
+    {
+        String logName = "";
+        if (layers != null) { 
+            String[] lList = layers.split(","); 
+            for (int i = 0;i < lList.length; i++) { 
+                log.debug("SBSTask:llist:" + lList[i]); 
+                logName += "_" + lList[i]; 
+                task.createArg().setValue("-l"); 
+                task.createArg().setValue(lList[i]); 
+            } 
+        }
+        return logName;
+    }
+    
+    private String setConfigArgs(ExecTask task)
+    {
+        String logName = "";
+        if (config != null) {
+            String[] configList = config.split(",");
+            for (int i = 0; i < configList.length; i++) {
+                logName += "_" + configList[i];
+                task.createArg().setValue("-c");
+                task.createArg().setValue(configList[i]);
+            }
+        }
+        return logName;
+    }
+    
+    private String gmake(ExecTask task, Project prj)
+    {
+        log.info("SBSTask:normal gmake");
+        if (singleJob == null) {
+            log.debug("SBSTask:building using multiple thread");
+            task.createArg().setValue("-j");
+            task.createArg().setValue(prj.getProperty("number.of.threads"));
+            return "_multiple_thread";
+        } else if (singleJob.equals("true")) {
+            task.createArg().setValue("-j");
+            task.createArg().setValue("1");
+            return "_single_thread";
+        }
+        return "";
+    }
+    
+    private void emake(ExecTask task, SBSMakeOptions sbsMakeOptions, Project prj)
+    {
+        HashMap makeOptMap = new HashMap();
+        Vector makeOptions = sbsMakeOptions.getVariables();
+        Enumeration makeOptEnum = makeOptions.elements();
+        Variable variable = null;
+        while (makeOptEnum.hasMoreElements()) {
+            variable = (Variable)makeOptEnum.nextElement();
+            log.debug("SBSTask:makeOptions.variable-name:" + variable.getName());
+            log.debug("SBSTask:makeOptions.variable-name:" + variable.getValue());
+            makeOptMap.put(variable.getName(),variable.getValue());
+        }
+        updatedMakeOptions(sbsMakeOptions.getEngine(), makeOptMap, prj);
+        log.info("SBSTask:updating all make options");
+        
+        String makeOpt = null;
+        task.createArg().setValue("-e");
+        task.createArg().setValue("emake");
+        Set keys = makeOptMap.keySet();
+        for ( Iterator listIter = keys.iterator(); listIter.hasNext(); ) {
+            makeOpt = (String)listIter.next();
+            String param = prefix + makeOpt;
+            String paramValue = (String)makeOptMap.get(makeOpt);
+            if (paramValue != null ) {
+                param += equalSign + paramValue;
+            }
+            task.createArg().setValue( param );
+            log.debug("SBSTask:makeOptions.variable-name:" + param);
+        }
+    }
+    
+        /**
+         * Updates the make options with default values if not provided. 
+         * @param engine - make engine for sbs command
+         * @param prj - Ant project reference. 
+        */
+    private void updatedMakeOptions(String engine, HashMap makeOptsMap, Project prj) {
+        log.info("Updating default make options along with passed options");
+        if (engine.equals("emake")) {
+            if (makeOptsMap.get("--emake-root") == null) {
+                String emakeRoot = prj.getProperty("env.EMAKE_ROOT") + ";" + prj.getProperty("helium.dir") + ";" +
+                        prj.getProperty("build.drive") + "/;" + prj.getProperty("env.SBS_HOME");
+                makeOptsMap.put("--emake-root",emakeRoot);
+                log.debug("SBSTask:adding --emake-root:" + emakeRoot);
+            }
+            if (makeOptsMap.get("--emake-annodetail") == null) {
+                log.debug("SBSTask:adding --emake-annodetail:");
+                makeOptsMap.put("--emake-annodetail","basic,history,waiting");
+            }
+            if (makeOptsMap.get("--emake-historyfile") == null) {
+                log.debug("SBSTask:adding --emake-historyfile");
+                String emakeHistoryDIR = prj.getProperty("build.log.dir") + "/ec_history/";
+                File emakeHistoryDIRFile = new File(emakeHistoryDIR);
+                if (!emakeHistoryDIRFile.exists()) {
+                    boolean successus = emakeHistoryDIRFile.mkdir();
+                    log.debug("SBSTask:history dir created status :" + emakeHistoryDIRFile + ":" + successus);
+                }
+                String emakeHistoryFile = emakeHistoryDIR + "emake_" + prj.getProperty("sysdef.configuration") + ".data";
+                makeOptsMap.put("--emake-historyfile",emakeHistoryFile);
+                log.debug("SBSTask:adding --emake-historyfile" + emakeHistoryFile);
+            }
+            if (makeOptsMap.get("--emake-annofile") == null) {
+                log.debug("SBSTask:adding --emake-annofile");
+                String annofile = prj.getProperty("build.log.dir") + "/" + 
+                                prj.getProperty("build.id") + ".xml";
+                makeOptsMap.put("--emake-annofile",annofile);
+                log.debug("SBSTask:adding --emake-annofile" + annofile);
+            }
+            if (makeOptsMap.get("--emake-emulation") == null) {
+                makeOptsMap.put("--emake-emulation", "gmake");
+                log.debug("SBSTask:adding --emake-emulation:gmake");
+            }
+        }
+    }
+    
+    private String convertSpecialCharacters(String inputFileName) {
+        int colonIndex = 0;
+        String resultString;
+        colonIndex = inputFileName.indexOf(':');
+        if ((colonIndex != -1) && (inputFileName.substring(0, colonIndex + 2)).endsWith(":\\")) {
+            resultString = inputFileName.substring(0, colonIndex + 2);
+            String remainingString = inputFileName.substring(colonIndex + 2);
+            remainingString = remainingString.replaceAll(":","_");
+            resultString += remainingString;
+        } else {
+            resultString = inputFileName.replaceAll(":", "_");
+        }
+        return resultString;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/test/com/nokia/ant/HeliumLoggerTest.java	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
+
+package com.nokia.ant;
+
+import junit.framework.*;
+
+/**
+ * Test class for Helium Logger.
+ * 
+ */
+public class HeliumLoggerTest extends TestCase {
+    
+    /**
+     * Basic test to check if the property
+     * is set correctly. 
+     */
+    public void testSetStopLogToConsole() {
+        HeliumLogger logger = new HeliumLogger();
+        logger.setStopLogToConsole(true);
+        assert logger.getStopLogToConsole();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/jep/unique_filename.jep	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+from java.io import File
+counter = project.getProperty(".unique.counter")
+if counter == None:
+	counter = 0
+else:
+	counter = int(counter) + 1
+project.setProperty(".unique.counter", str(counter))
+
+targetname = "%016d_%s" % (counter, File(str(source)).getName())
+print("Conversion: %s" %  targetname);
+self.addMappedName(targetname)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/libs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs">
+    <description>
+        Ant task definition declarations.
+    </description>
+
+    
+    <path id="lib.path">
+        <fileset dir="${helium.dir}/external/antlibs" includes="**/*.jar"/>
+        <fileset dir="${helium.dir}/tools/common/java/lib" includes="nokia_ant.jar"/>
+    </path>
+    
+    <!-- External tasks. -->
+    <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="lib.path"/>
+    <taskdef resource="org/apache/ant/antunit/antlib.xml" classpathref="lib.path" uri="org.apache.ant.antunit"/>
+    <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpathref="lib.path"/>
+    <taskdef name="antform" classname="com.sardak.antform.AntForm" classpathref="lib.path" onerror="ignore"/>
+    <taskdef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="lib.path" onerror="ignore"/>
+    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="lib.path"/>
+    <property name="ant.regexp.regexpimpl" value="org.apache.tools.ant.util.regexp.JakartaOroRegexp" classpathref="lib.path"/>
+    <taskdef name="xinclude" classname="de.jeckle.AntExtension.XIncludeTask"/>
+    <!--<taskdef name="xcluder" classname="gr.abiss.xcluder.XercesXcluder" classpathref="lib.path" />-->
+    <taskdef name="fmpp" classname="fmpp.tools.AntTask" classpathref="lib.path" onerror="report"/>
+    <taskdef name="xpathtest" classname="se.jtech.ant.xpath.XPathEvaluatorTask" classpathref="lib.path" onerror="ignore"/>
+    <taskdef classpathref="lib.path" resource="emma_ant.properties" />
+    
+    <!-- Nokia internal tasks. -->
+    <taskdef resource="com/nokia/ant/antlib.xml" classpathref="lib.path" uri="http://www.nokia.com/helium"/>
+
+
+    <!-- This step load the com.nokia.ant.BSFJepEngine class and activate the BSF 
+       registration mechanism.
+    -->
+    <if>
+        <not>
+            <available classname="com.nokia.ant.BSFJepEngine"/>
+        </not>
+        <then>
+            <echo>Jepp is not installed.</echo>    
+        </then>    
+    </if>    
+        
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/logging.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : logging.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="logging" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Targets related to log parsing, rendaring, upload to diamonds etc.
+    </description>
+    <!-- Merges all XML log files ending in ".log2.xml" in the build log directory
+    into a single summary log file. -->
+    <target name="log-merge" unless="metadata.enable" >
+        <mkdir dir="${build.log.dir}"/>
+        <dependset>
+            <srcfileset dir="${build.log.dir}" includes="${build.id}*.log.xml"/>
+            <targetfileset file="${build.summary.file}"/>
+        </dependset>
+        <if>
+            <not>
+                <available file="${build.summary.file}"/>
+            </not>
+            <then>
+                <echo>Merging all *.log.xml files</echo>        
+                <mkdir dir="${build.log.dir}/summary"/>
+                <xmltask  dest="${build.summary.file}">
+                    <insert path="/"  >
+                    <![CDATA[
+                    <logSummary/>
+                    ]]>
+                    </insert>
+                </xmltask>
+                <for param="file">
+                    <path>
+                        <fileset dir="${build.log.dir}">
+                            <include name="${build.id}*.log.xml"/>
+                        </fileset>
+                    </path>
+                    <sequential>
+                        <echo>Inserting @{file} into summary.</echo>
+                        <!--<xmltask source="${build.summary.file}"
+                                 dest="${build.summary.file}">
+                           <insert path="/logSummary" file="@{file}" />
+                        </xmltask>-->
+                        <hlm:assertPropertySet property="build.summary.file" message="Property build.summary.file is not defined." />
+                        <script language="jython" setbeans="false">
+# Temporary solution
+import log2xml
+log2xml.append_summary(project.getProperty('build.summary.file'), r'@{file}')
+                        </script>                        
+                    </sequential>
+                </for>
+            </then>
+            <else>
+                <echo>Summary XML log file does not need updating.</echo>
+            </else>
+        </if>
+    </target>
+    
+    
+    <!-- Outputs an HTML readable version of the summary log. -->
+    <target name="render-log-summary">
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/log/summary_metadata.html.ftl"
+                     outputfile="${build.log.dir}/summary/${build.id}_summary.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${helium.dir}/tools/common/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${metadata.dbfile}
+                loginfo: xml(${build.log.dir}/${build.id}_info.log.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+    
+    <!-- Prepare email for build summary -->
+    <target name="logger-email" depends="log-merge">
+        <fmpp sourceRoot="${helium.dir}/tools/common/templates/log" includes="email.html.ftl" outputRoot="${build.log.dir}/summary"
+              replaceExtension="html.ftl, html">
+            <data expandProperties="yes">
+                doc: xml(${build.summary.file})
+                ant: antProperties()
+            </data>
+        </fmpp>        
+    </target>
+    
+
+    <!-- Test target to show how Diamond metadata could be rendered. -->
+    <target name="render-diamonds-data" depends="log-merge">
+        <mkdir dir="${build.log.dir}/summary/diamonds"/>
+        <fmpp sourceRoot="${helium.dir}/tools/common/templates/diamonds"
+              outputRoot="${build.log.dir}/summary/diamonds" includes="diamonds.xml.ftl"
+              replaceExtension="xml.ftl, xml">
+            <data expandProperties="yes">
+                doc: xml(${build.summary.file})
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+    
+    <!-- Render the CC dashboad summary. -->
+    <target name="render-cc-summary" depends="log-merge">
+        <mkdir dir="${build.log.dir}/summary"/>
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/log/cc_summary_metadata.html.ftl"
+                     outputfile="${build.log.dir}/summary/${build.id}_cc_summary.html">
+            <data expandProperties="yes">
+                dbPath: ${metadata.dbfile}
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+    
+    <!-- Creates a full summary log from all the build logs. -->
+    <target name="build-log-summary" depends="render-log-summary"/>
+    
+    <!-- Test target to check signal. -->
+    <target name="check-signal" />
+    
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/BuildJob.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,294 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!perl -w
+# ==============================================================================
+#  %name:          BuildJob.pm %
+#  Part of:        Juno Build Tools
+#  Requires:       Symbian OS build tools
+#
+#  %derived_by:    hasegawa %
+#  %version:	   to1r1103#4.1.2 %
+#  %date_modified: Thu Oct  5 15:41:26 2006 %
+#
+#  See POD text at the end of this file for usage and other details.
+# ==============================================================================
+
+package BuildJob;
+use strict;
+use warnings;
+use Win32::Job;
+use Config;
+use Exporter;
+
+our @ISA       = qw(Exporter);
+our @EXPORT_OK = qw(EBS_PORT EBS_DIR EBS_CLIENT EBS_SERVER);
+
+our $EPOCROOT = $ENV{EPOCROOT} || "\\";
+our $BUILD_DRIVE = $ENV{BUILD_DRIVE};
+
+my @EBS_PATHS = ("epoc32\\tools\\build", "src\\common\\generic\\tools\\build");
+
+$BuildJob::EBS_PORT   = 1973;
+$BuildJob::EBS_DIR    = "";
+$BuildJob::EBS_CLIENT = "buildclient.pl";
+$BuildJob::EBS_SERVER = "buildserver.pl";
+
+sub find_ebs
+{
+    return 1 if -d "$BuildJob::EBS_DIR\\$BuildJob::EBS_CLIENT";
+    foreach (map("${BuildJob::BUILD_DRIVE}${BuildJob::EPOCROOT}$_", @EBS_PATHS))
+    {
+        $BuildJob::EBS_DIR = $_ and return 1 if -f "$_\\$BuildJob::EBS_CLIENT";
+    }
+    return 0;
+}
+
+sub run
+{
+    my $data_source = shift;
+    return 0 unless ($data_source and -e $data_source);
+
+    # finding free port.
+    my $offset = 0;
+    my $trials = 10;
+    $BuildJob::EBS_PORT = $BuildJob::EBS_PORT + int(rand(1000));
+    for(;$offset < $trials; $offset++) {
+      if (!is_buildjob_running($BuildJob::EBS_PORT + $offset)) {
+        $BuildJob::EBS_PORT = $BuildJob::EBS_PORT + $offset;
+        last;
+      }
+    }
+    warn("Can't start build job, is one already running?\n") and return 0 if ($offset > $trials); 
+    print "Using port: $BuildJob::EBS_PORT\n";
+    
+    my $log_file = shift;
+    $log_file = "build.log" unless $log_file;
+    my $num_clients = shift;
+
+    # default number of clients is the number of processors
+    $num_clients = $ENV{NUMBER_OF_PROCESSORS} unless ($num_clients);
+
+    # if we can't find the number of processors, just run one client
+    $num_clients = 1 unless ($num_clients);
+
+    find_ebs()
+      or die("Can't find EBS scripts; looked in: "
+             . join(",", map("${BuildJob::EPOCROOT}$_", @EBS_PATHS)));
+
+    my $job = Win32::Job->new();
+    for (my $i = 0; $i < $num_clients; $i++)
+    {
+        $job->spawn(
+            $Config{perlpath},
+            "perl $BuildJob::EBS_DIR\\$BuildJob::EBS_CLIENT -d localhost:$BuildJob::EBS_PORT -w 2 -c EBS_CLIENT$i",
+            {new_console => 1, window_attr => 'minimized'});
+    }
+    my $server_pid = $job->spawn($Config{perlpath},
+                                 "perl $BuildJob::EBS_DIR\\$BuildJob::EBS_SERVER -d $data_source -p $BuildJob::EBS_PORT -l $log_file"
+                                );
+
+    my $job_failure = 0;
+    {
+        # kill the job if we receive a sigint
+        local $SIG{INT} = sub {$job->kill();};
+
+        # start job with no timeout (a null watchdog run every 60s)
+        # and complete when the first process terminates
+        $job_failure = !$job->watch(sub {return 0}, 60, 0);
+    }
+
+    my $job_status = $job->status();
+    $job_failure ||= ($job_status->{$server_pid}{exitcode} != 0);
+
+    if ($job_failure)
+    {
+        print(STDERR "Abnormal job termination:\nProcess\tExit Code\n");
+        foreach my $pid (keys %$job_status)
+        {
+            print(  STDERR (($pid == $server_pid) ? "server" : "client") . "\t"
+                  . $job_status->{$pid}{exitcode}
+                  . "\n");
+        }
+    }
+    return !$job_failure;
+}
+
+sub is_buildjob_running
+{
+    my $port = shift;
+    use IO::Socket::INET;
+
+    # try to open a socket on the build server port
+    my $sock =
+      IO::Socket::INET->new(LocalAddr => '127.0.0.1',
+                            LocalPort => $port,
+                            Proto     => 'tcp',
+                            Timeout   => 2);
+
+    # failure means the server is probably running already
+    my $is_port_available = !defined $sock;
+    $sock->close() if $sock;
+    return $is_port_available;
+}
+
+sub new
+{
+    my $invocant = shift;
+    my $name     = shift;
+    my $class    = ref($invocant) || $invocant;
+    my $self     = {name => $name, stages => [], env => []};
+    bless($self, $class);
+    $self->new_stage();
+    return $self;
+}
+
+sub set
+{
+    my $self  = shift;
+    my $var   = shift;
+    my $value = shift;
+
+    push(@{$self->{env}},
+         {name  => $var,
+          value => $value});
+}
+
+sub add
+{
+    my $self = shift;
+    push(@{$self->{stages}->[0]}, shift);
+}
+
+sub new_stage
+{
+    my $self = shift;
+    unshift(@{$self->{stages}}, []);
+}
+
+sub go
+{
+    my $self       = shift;
+    my $logfile    = shift;
+    my $scriptfile = $self->{name} . ".xml";
+
+    open(EBSSCRIPT, ">$scriptfile") or die("Can't open $scriptfile: $!");
+    print EBSSCRIPT <<EOT;
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="build.xsl"?>
+<!-- <!DOCTYPE BUILD SYSTEM "ebs.dtd"> -->
+<!DOCTYPE Build  [
+  <!ELEMENT Product (Commands)>
+  <!ATTLIST Product name CDATA #REQUIRED>
+  <!ELEMENT Commands (Execute+ | SetEnv*)>
+  <!ELEMENT Execute EMPTY>
+  <!ATTLIST Execute ID CDATA #REQUIRED>
+  <!ATTLIST Execute Stage CDATA #REQUIRED>
+  <!ATTLIST Execute Component CDATA #REQUIRED>
+  <!ATTLIST Execute Cwd CDATA #REQUIRED>
+  <!ATTLIST Execute CommandLine CDATA #REQUIRED>
+  <!ELEMENT SetEnv EMPTY>
+  <!ATTLIST SetEnv Order ID #REQUIRED>
+  <!ATTLIST SetEnv Name CDATA #REQUIRED>
+  <!ATTLIST SetEnv Value CDATA #REQUIRED>
+]>
+<Product name="zip">
+  <Commands>
+    <SetEnv Order="1" Name="PATH" Value="\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%"/>
+EOT
+
+    my $order = 2;
+    foreach my $setenv (@{$self->{env}})
+    {
+        print EBSSCRIPT
+          "<SetEnv Order=\"$order\" Name=\"$setenv->{name}\" Value=\"$setenv->{value}\"/>\n";
+        $order++;
+    }
+
+    my $id       = 1;
+    my $stage_id = 1;
+    foreach my $stage (reverse @{$self->{stages}})
+    {
+        foreach my $cmd (@{$stage})
+        {
+            my $cmdline;
+            $cmdline = $cmd->{commandline} if exists $cmd->{commandline};
+            die("Undefined command line") unless $cmdline;
+            my $cwd = "\\";
+            $cwd = $cmd->{cwd} if exists $cmd->{cwd};
+            my $component = $id;
+            $component = $cmd->{component} if exists $cmd->{component};
+
+            print EBSSCRIPT
+              "<Execute ID=\"$id\" Stage=\"$stage_id\" Component=\"$component\" Cwd=\"$cwd\" CommandLine=\"$cmdline\"\/>\n";
+            $id++;
+        }
+        $stage_id++;
+    }
+    print EBSSCRIPT <<EOT;
+  </Commands>
+</Product>
+EOT
+    close(EBSSCRIPT);
+
+    my $status = run($scriptfile, $logfile);
+    unlink($scriptfile);
+    return $status;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+BuildJob - Run BuildServer and BuildClients
+
+=head1 SYNOPSIS
+
+ use BuildJob;
+
+ BuildJob::run($data_source, $num_clients, $log_file);
+
+=head1 DESCRIPTION
+
+BuildJob runs a number of BuildClients and the BuildServer with the
+specified data source and log file.  If undefined, the number of
+clients defaults to the number of processors on the system and the log
+file name defaults to "build.log" in the current working directory.
+
+Any errors are communicated by a nonzero return code.
+
+BuildJob uses port 1973 for communications and looks for the build
+client and server scripts "buildclient.pl" and "buildserver.pl" in
+"\src\common\generic\tools\build".  Change these defaults by setting
+the following variables prior to calling "run":
+
+ $EBS_PORT = 1973;
+ $EBS_DIR = "\\src\\common\\generic\\tools\\build";
+ $EBS_CLIENT = "buildclient.pl";
+ $EBS_SERVER = "buildserver.pl";
+
+This module uses Win32::Job to start and stop the clients and server.
+
+If a BuildJob attempts to run on a system that is already running one
+on the same EBS_PORT, the job will not be run and the original job
+will continue unaffected.
+
+=head1 SEE ALSO
+
+L<BuildJob|scripts::BuildJob> is a wrapper to call this module from the command line.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Assertion.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,118 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : Assertion.pm
+# Use    : Nokia Automated Build error definitions.
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+#
+# v1.0 (07/10/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Assertion package;
+#
+#--------------------------------------------------------------------------------------------------
+
+package ISIS::Assertion;
+
+use strict;
+use warnings;
+
+my $__DEBUG_FLAG;
+
+#--------------------------------------------------------------------------------------------------
+# import and unimport package subroutines.
+#--------------------------------------------------------------------------------------------------
+sub import
+{
+  my ($pkg, %symbols) = (@_);
+  
+  die "Invalid symbols defined\n" if(scalar keys %symbols != (0 + (exists $symbols{_DEBUG})));
+  
+  $__DEBUG_FLAG = !($symbols{_DEBUG} || 0);
+
+  no strict 'refs';
+  
+  my $caller = caller;
+  *{$caller.'::__ASSERT'}      = \&__ASSERT;
+  *{$caller.'::__DBG_MESSAGE'} = \&__DBG_MESSAGE;
+}
+
+sub unimport
+{
+  $__DEBUG_FLAG = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Assertion subroutines.
+#--------------------------------------------------------------------------------------------------
+sub __ASSERT($)
+{
+  __ASSERT_AUX() unless(shift || $__DEBUG_FLAG);
+}
+
+sub __ASSERT_AUX()
+{
+  my $__subroutine = 'unknown';
+  
+  my ($__pkg,   $__file,  $__line, $__sub, $__args,
+      $__array, $__eval,  $__req,  $__ind, $__bmsk);
+    
+  if(($__pkg,   $__file,  $__line, $__sub, $__args,
+      $__array, $__eval,  $__req,  $__ind, $__bmsk) = caller(2))
+  {
+    $__subroutine = $__sub;
+  }
+  
+  if(($__pkg,   $__file,  $__line, $__sub, $__args,
+      $__array, $__eval,  $__req,  $__ind, $__bmsk) = caller(1))
+  {
+    
+    my ($__file_handle, $__expression, $__i) = (undef, 'unknown', 0);
+
+    open($__file_handle, $__file);
+    while($__i != $__line) { $__expression = <$__file_handle>; ++$__i; }
+    close($__file_handle);
+    
+    ($__expression) = ($__expression =~ /__ASSERT\((.*)\)/);    
+    
+    die "File \'$__file\' line \'$__line\' - Assertion Failed!\n".
+        "   In $__subroutine : \'$__expression\' was evaluated to false.\n";
+    
+  } 
+}
+
+#--------------------------------------------------------------------------------------------------
+# Debug message output on standard output.
+#--------------------------------------------------------------------------------------------------
+sub __DBG_MESSAGE(@)
+{
+  print STDERR @_ unless($__DEBUG_FLAG);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Build.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : Build.pm
+# Use    : Build an TBS xml using specific tools
+
+#
+# Version History :
+#
+# v1.0 (25/05/2006) :
+#  - Fist version of the script.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# package Build::TBS;
+#------------------------------------------------------------------------------
+package Build::TBS;
+use strict;
+use ISIS::GenBuildTools;
+
+sub Build
+{
+	my ($xml, $logname) = (shift, shift);
+	&GenBuildTools::BuildTBS($xml, $logname);
+}
+
+sub IsAvailable()
+{
+	# TBS is always available
+	return 1;
+}
+1;
+
+#------------------------------------------------------------------------------
+# package Build::EC;
+#------------------------------------------------------------------------------
+package Build::EC;
+use strict;
+use ISIS::ECloud;
+
+sub Build
+{
+	my ($xml, $logname) = (shift, shift);
+	my $ec = new ECloud();
+	$ec->Execute( $xml );	
+}
+
+sub IsAvailable()
+{
+	return (-e "C:\\ECloud\\i686_win32\\bin\\emake.exe");
+}
+1;
+
+#------------------------------------------------------------------------------
+# package Build;
+#------------------------------------------------------------------------------
+package Build;
+use strict;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0.0';
+use constant ISIS_LAST_UPDATE => '25/05/2006';
+
+#------------------------------------------------------------------------------
+# Package Function
+#------------------------------------------------------------------------------
+my %__tools;
+BEGIN {
+%__tools = (  'ec'  => 'Build::EC',
+							'tbs' => 'Build::TBS');
+}
+
+
+sub Build
+{
+	my ( $xml, $logname, $buildtool ) = (shift, shift, shift || 'auto');
+	
+	$buildtool = &GetFirstAvailableBS() if ($buildtool eq "auto");
+	
+	# default is TBS if build tool not found
+	$buildtool = 'tbs' unless ( exists( $__tools{ $buildtool } ) );
+	
+	no strict 'refs';
+	my $method = $__tools{$buildtool}."::Build";
+	return &$method($xml, $logname);	
+}
+
+sub GetFirstAvailableBS()
+{
+	foreach my $tool ( keys (%__tools) )
+	{
+		no strict 'refs';
+		my $method = $__tools{$tool}."::IsAvailable";
+		return $tool if ( &$method() );
+	}
+	return 'tbs';
+}
+
+sub GetSupportedTools()
+{
+	return keys (%__tools);
+}
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/BuildStat/Statistics.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,126 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : Statistics.pm
+# Use    : description.
+
+#
+# Version History :
+#
+# v1.0 (03/05/2006) :
+#  - Fist version of the script.
+#------------------------------------------------------------------------------
+package Statistics;
+use strict;
+use ISIS::XMLManip;
+use Time::HiRes;
+use HTTP::Request::Common;
+use LWP::UserAgent;
+
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0.0';
+use constant ISIS_LAST_UPDATE => '03/05/2006';
+
+#------------------------------------------------------------------------------
+# Package Function
+#------------------------------------------------------------------------------
+
+sub new
+{
+	my ($class, $type, $id, $toolchain) = @_;
+	my $self = {
+			__type => $type,
+			__id => $id,
+			__tools => $toolchain,
+			__date => Time::HiRes::time(),
+			__steps => undef,
+			__cstep => undef,
+		};
+	return bless $self, $class;
+}
+
+
+sub AddStep
+{
+	my ($self, $name, $buildtime) = @_;
+	my $h = { 'name' => $name, 'buildtime' => $buildtime};
+	push 	@{$self->{__steps}}, $h;
+}
+
+sub StartStep
+{
+	my ($self, $name) = @_;
+	$self->{__cstep}->{'name'} = $name;
+	$self->{__cstep}->{'starttime'} = Time::HiRes::time();
+}
+
+sub StopStep
+{
+	my ($self) = @_;
+	$self->{__cstep}->{'buildtime'} = Time::HiRes::time() - $self->{__cstep}->{'starttime'};
+	$self->AddStep($self->{__cstep}->{'name'}, $self->{__cstep}->{'buildtime'});
+	$self->{__cstep} = undef;
+}
+
+sub GenerateXML
+{
+	my ($self, $filename) = @_;
+	open (OUT, $filename);
+	close (OUT);
+	my $rootNode = new XMLManip::Node('statistics');
+ 
+ 	my $buildinfo = new XMLManip::Node('buildinfo',  { type => $self->{__type},
+ 		 					id => $self->{__id},
+			 		  tools => $self->{__tools},
+			 		  date => $self->{__date} });
+ 	$rootNode->PushChild($buildinfo);
+ 	 		
+	foreach my $step ( @{$self->{__steps}} )
+	{
+		my $xstep = new XMLManip::Node('step', {name => $step->{'name'}, time => $step->{'buildtime'}});
+		
+		$buildinfo->PushChild( $xstep );
+	}
+ 
+	&XMLManip::WriteXMLFile($rootNode, $filename);
+}
+
+sub GenerateXMLAndUpload
+{
+	my ($self, $server) = @_;
+	my $filename = '/statistics.xml';
+	$self->GenerateXML( $filename );
+
+	$HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1;
+
+
+	my $hash = {
+			'data_file' => [ $filename ],
+			'filename' => 'statistics.txt'
+		};
+	
+	#my $request = HTTP::Request->new( );
+	my $ua = LWP::UserAgent->new;
+	my $response = $ua->request(POST "$server", 'Content-Type' => 'multipart/form-data', Content => $hash );
+	print $response->as_string."\n";
+
+}
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Cellmo.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : Cellmo.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: Cellmo.pm % (%full_filespec:  Cellmo.pm-6:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Fri Jul  7 15:15:47 2006 %
+#
+# Version History :
+#
+# v1.0 (29/11/2005) :
+#  - Fist version of the package.
+#------------------------------------------------------------------------------
+
+package ISIS::Cellmo;
+use strict;
+use ISIS::Logger2;
+use ISIS::Registry;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0';
+use constant ISIS_LAST_UPDATE => '29/11/2005';
+
+# default configuration file
+use constant ROOT_SCRIPTS_DIR   => "/isis_sw/build_config/";
+use constant REG_CONFIG_FILE    => ROOT_SCRIPTS_DIR."registry.xml";
+
+#------------------------------------------------------------------------------
+# Package's subroutines
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# GetCellmo
+#
+# - Backward compatibility for CreatelocalisationROM.pl
+# - Get Cellmo by product.
+#------------------------------------------------------------------------------
+sub GetCellmo
+{
+	my ( $product ) = @_;
+	return undef unless ( $product );
+
+	# Load the default configuration
+	my $resgistry = new Registry( REG_CONFIG_FILE, { error_level => 1 });
+	
+	# Call method used by NAB
+	return GetCellmoFromConfig($product, "undefined", "undefined",  $resgistry);
+}
+
+#------------------------------------------------------------------------------
+# GetCellmoFromConfig
+#------------------------------------------------------------------------------
+sub GetCellmoFromConfig
+{
+	my ( $product, $buildtype, $flags, $registry ) = @_;
+	
+	my $id = $registry->{'cellmos'}->{$product}->{'id'};
+	my $dir = $registry->{'cellmos'}->{$product}->{'dir'};
+
+	return &__GetCellmoFromDir($dir, $id);
+}
+
+
+#------------------------------------------------------------------------------
+# Internal
+#------------------------------------------------------------------------------
+sub __GetCellmoFromDir
+{
+	my ( $dir, $id ) = @_;
+	
+	my $entry;
+		
+	opendir ( DIRH, $dir )  or OUT2XML::Error ("couldn't open: $!", ERR::INVALID_PATH); 
+	while ($entry  = readdir(DIRH)) {
+		if ($entry =~ m/$id.*\.cmt/i)
+		{
+			return "$dir\\$entry";
+		}			
+	} 
+	closedir ( DIRH ); 
+	return undef;
+}
+
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/CppManip.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,207 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name : CppManip.pm
+# Use  : Generate HTML versions of C/C++ source code.
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+# v1.0.1 (09/02/2006)
+#  - Updated regular expression generations to take place in BEGIN block.
+#
+# v1.0.0 (06/02/2006)
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+package CPPManip;
+
+use strict;
+use warnings;
+
+use constant ISIS_VERSION     => '1.0.1';
+use constant ISIS_LAST_UPDATE => '09/02/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Symbols and Keywords for C++.
+#--------------------------------------------------------------------------------------------------
+my (@__keywords, @__preprocessors, @__symbols);
+my ($symbols, $string, $character, @keywords, @preprocessors, $elememts);
+
+BEGIN
+{
+	@__keywords = 
+	(
+	  'class', 'auto', 'break', 'bool', 'case', 'char', 'const', 'continue', 'catch', 'const_cast',
+	  'default', 'delete', 'do', 'double', 'dynamic_cast', 'else', 'enum', 'explicit', 'export', 'extern',
+	  'false', 'float', 'for', 'friend', 'goto', 'if', 'inline', 'int', 'long', 'mutable', 'new', 'namespace',
+	  'operator', 'private', 'protected', 'public', 'register', 'reinterpret_cast', 'return', 'short',
+	  'signed', 'sizeof', 'static', 'static_cast', 'struct', 'switch', 'template', 'this', 'throw', 'true',
+	  'try', 'typedef', 'typeid', 'typename', 'union', 'unsigned', 'using', 'virtual', 'void', 'volatile',
+	  'wchar_t', 'while', '__asm', '__based', '__cdecl', '__declspec', '__except', '__far', '__fastcall',
+	  '__finally', '__fortran', '__huge', '__inline', '__int16', '__int32', '__int64', '__int8', '__interrupt',
+	  '__leave', '__loadds', '__multiple_inheritance', '__near', '__pascal', '__saveregs', '__segment',
+	  '__segname', '__self', '__single_inheritance', '__stdcall', '__try', '__uuidof', '__virtual_inheritance',
+	);
+	
+	@__preprocessors =
+	( 
+	  'defined', '#define', '#error', '#include', '#elif', '#ifndef', '#ifdef',
+	  '#if', '#line', '#else', '#pragma', '#endif', '#undef',
+	);
+	
+	@__symbols =
+	( 
+	  '\*', '\/', '\+', '\-', '\&', '=', '\!', '\?', '\:', '\;', '\,', '\~',
+	  '\(', '\)', '\<', '\>', '\[', '\]', '\{', '\}', '\s+'
+	);
+	
+	$symbols       = '(['.join('', @__symbols).']+)';
+	$string        = '(\"[^\"]*\")';
+	$character     = "(\'[^\']*\')";
+	@keywords      = map { '[^\w_-]+('.$_.')[^\w_-]+' } @__keywords;
+	@preprocessors = map { '('.$_.')' } @__preprocessors;
+	$elements      = join('|', $string, $character, $symbols, @preprocessors, @keywords);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Main subroutine.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	my ($class, $input, $ostream, $css) = (shift, shift, shift);
+	
+	bless { __input   => $input, 
+		      __ostream => $ostream,
+					__classes => $css || {},
+				}, $class;
+}
+
+sub SetClass
+{
+	my ($self, $type, $class) = (shift, shift, shift);
+	
+	$self->{__classes}->{$type} = $class;
+}
+
+sub Format
+{	
+	my ($self, $code, $cmt, $inCmt) = (shift, undef, undef, 0);
+	my $OUT = $self->{__ostream};
+	
+	open(IN, $self->{__input}) or die "Unable to open file ".$self->{__input}." : $!\n";
+	
+	print $OUT "<PRE class=\"", $self->{__classes}->{pre} || 'code_sample', "\">\n";
+
+	while(my $line = <IN>)
+	{
+		if($line =~ /^\s*$/)
+		{
+			print $OUT $line;
+		}
+		elsif($inCmt)
+		{
+			if(($cmt, $code) = ($line =~ /^(.*\*\/)(.*?)\n$/))
+			{
+				$inCmt = 0;
+				print $OUT $self->__format_comment($cmt),
+				           $self->__format_code($code),
+				           "\n";
+			}
+			else
+			{
+				chomp($line);
+				print $OUT $self->__format_comment($line),
+				           "\n";
+			}
+		}
+		elsif(($code, $cmt) = ($line =~ /^(.*?)(\/\/.*)\n$/))
+		{
+			print $OUT $self->__format_code($code),
+			           $self->__format_comment($cmt),
+			           "\n";
+		}
+		elsif($line =~ s/(\/\*.*\*\/)/<span class=\"code_cmt\">$1<\/span>/g)
+		{
+			print $OUT $line;
+		}
+		elsif(($code, $cmt) = ($line =~ /^(.*?)(\/\*.*)\n$/))
+		{
+			$inCmt = 1;
+			print $OUT $self->__format_code($code),
+			           $self->__format_comment($cmt),
+			           "\n";
+		}
+		else
+		{
+			print $OUT $self->__format_code($line);
+		}
+	}
+	
+	print $OUT "</PRE>\n";
+	
+	close(IN);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Formatting subroutines.
+#--------------------------------------------------------------------------------------------------
+sub __format_code
+{
+	my ($self, $code, $found) = (shift, shift, 0);
+	my @__code = grep{ $_ } split($elements, $code);
+	
+	foreach (@__code)
+	{
+		next if(/^\s*$/);
+		next if(s/^(\".*\")$/"<span class=\"".($self->{__classes}->{str} || 'code_str')."\">$1<\/span>"/e);
+		next if(s/^(\'.*\')$/"<span class=\"".($self->{__classes}->{chr} || 'code_chr')."\">$1<\/span>"/e);
+		next if(s/($symbols)/"<span class=\"".($self->{__classes}->{smb} || 'code_smb')."\">$1<\/span>"/e);
+		
+		$found = 0;
+		
+		foreach my $kwd (@__keywords)
+		{ if(s/^($kwd)$/"<span class=\"".($self->{__classes}->{kwd} || 'code_kwd')."\">$1<\/span>"/e)
+			{ $found = 1; last; }
+		}
+
+		next if($found);
+
+		foreach my $kwd (@__preprocessors)
+		{ if(s/^($kwd)$/"<span class=\"".($self->{__classes}->{pp} || 'code_pp')."\">$1<\/span>"/e)
+			{ $found = 1; last; }
+		}
+	}
+	
+	return join('', @__code);
+}
+
+sub __format_comment
+{
+	my ($self, $cmt) = (shift, shift);
+
+	$cmt =~ s/(.*)/"<span class=\"".($self->{__classes}->{cmt} || 'code_cmt')."\">$1<\/span>"/e;
+	return $cmt;
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/ECloud.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,466 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : ECloud.pm
+# Path   : D:\Work\isis_sw\build_tools\packages\ISIS\
+# Use    : Manage ECloud instances.
+#
+# Synergy :
+# Perl %name: ECloud.pm % (%full_filespec: ECloud.pm-1.1.6:perl:fa1s60p1#2 %)
+# %derived_by: wbernard %
+# %date_created: Fri Jul  7 15:15:54 2006 %
+#
+# Version History :
+# v1.0.1 (30/03/2006)
+#  - Updated ecloud patching.
+#
+# v1.0.0 (16/02/2006) :
+#  - First version of the module.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   ECloud package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package ECloud;
+
+use strict;
+use warnings;
+use ISIS::XMLManip;
+use ISIS::Logger3;
+use ISIS::Registry;
+use Cwd;
+
+use constant ISIS_VERSION     => '1.0.0';
+use constant ISIS_LAST_UPDATE => '16/02/2006';
+use constant ISIS_EC_CONFIG   => '\\isis_sw\\build_tools\\ec_configs.xml';
+
+my @__batchs;
+my @__generators;
+my @__abld;
+
+BEGIN
+{
+	@__batchs = map { $ENV{EPOCROOT}.'epoc32\\tools\\'.$_ } ('alp2csh.bat', 'bldmake.bat', 'CHARCONV.BAT', 'CNVTOOL.BAT', 'cshlpcmp.bat', 'efreeze.bat', 'epocrc.bat', 'eshell.bat', 'evalid.bat', 'fixupsym.bat', 'genbuild.bat', 'hpsym.bat', 'instcol.bat', 'makmake.bat', 'maksym.bat', 'memtrace.bat', 'metabld.bat', 'SNMTOOL.BAT', 'splitlog.bat');
+	@__generators = ($ENV{EPOCROOT}.'epoc32\\tools\\bldmake.pl', $ENV{EPOCROOT}.'src\\cedar\\generic\\tools\\e32toolp\\bldmake\\bldmake.pl');
+	@__abld = ($ENV{EPOCROOT}.'epoc32\\tools\\abld.pl', $ENV{EPOCROOT}.'src\\cedar\\generic\\tools\\e32toolp\\bldmake\\abld.pl');
+}
+
+## @function GetAgentByNodeList
+# This function return a hash of node available on the cluster.
+# Each hash is node contains the number of agent on the cluster.
+#
+sub GetAgentByNodeList
+{	
+	my %list;
+	my $regfile  = new Registry(ISIS_EC_CONFIG, { error_level => 0 });
+	my $registry = $regfile->{'ec_configs'}->{'basic'};
+	my $cmd = "cmtool --cm=".$registry->{'cluster_manager'}." getagents";
+
+	my @res = `$cmd`;
+	shift(@res);
+
+	foreach my $line (@res)
+	{		
+		my @r = split(',', $line);
+		$list{$r[2]}->{$r[1]}->{'BuildId'} = $r[7];
+	}
+	return \%list;
+}
+
+##
+#
+#
+sub ClusterExecute
+{
+	my ($node, $command) = (shift,shift);
+	my $regfile  = new Registry(ISIS_EC_CONFIG, { error_level => 1 });
+	my $registry = $regfile->{'ec_configs'}->{'basic'};
+	my $cm = $registry->{'cluster_manager'};
+	
+	system ( "C:\\ECloud\\i686_win32\\bin\\clusterexec.exe --cm=$cm --nodes=$node --use-shell \"$command\"" );
+}
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	my ($class, $configtype, $custom) = (shift, shift || 'basic', shift || {});
+	
+	my $regfile  = new Registry(ISIS_EC_CONFIG, { error_level => 1 });
+	my $registry = $regfile->{'ec_configs'}->{$configtype};
+	
+	my $var = bless {
+		__volatile_opts   => __ec_volatile_types->new(),
+		__emulation_table => __ec_emulation_table->new(),
+		__root_dir        => $ENV{EPOCROOT},
+	}, $class;
+
+	foreach my $key (keys %$registry)
+	{ $var->{'__'.$key} = $registry->{$key}; }
+
+	foreach my $key (keys %$custom)
+	{ $var->{'__'.$key} = $custom->{$key}; }
+
+	return $var;
+}
+
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	return if $method =~ /::DESTROY$/;
+	
+	my $key = $method;
+	$key =~ s/^.*\:\://g;
+	$key =~ s/([A-Z])/ $1/g;
+	$key = '__'.join('_', map { lc($_) } split(' ', $key));
+
+	unless(exists $self->{$key})
+	{
+		warn "Method $method is invalid!\n";
+		return;
+	}
+
+	$self->{$key} = shift if @_;
+	return $self->{$key};
+}
+
+#--------------------------------------------------------------------------------------------------
+sub Emulation
+{
+	my ($self, $make) = (shift, shift);
+	return $self->{__emulation_table}->Emulation($make, @_);
+}
+
+#--------------------------------------------------------------------------------------------------
+sub AddVolatileType
+{
+	my ($self) = (shift);
+	foreach my $type (@_)
+	{ $self->{__volatile_opts}->VolatileType($type, 1); }
+}
+
+#--------------------------------------------------------------------------------------------------
+sub RemoveVolatileType
+{
+	my ($self) = (shift);
+	foreach my $type (@_)
+	{ $self->{__volatile_opts}->VolatileType($type, 0); }
+}
+
+#--------------------------------------------------------------------------------------------------
+# Parameters:        %1 = log directory                              
+#                    %2 = history filename prefix                    
+#                    %3 = xml/makefile name                          
+#                    %4 = directory (incl. trailing \) of xml file   
+#                    %5 = build label                                
+#                    %6 = Top level target (defaults to all)     
+
+# %EC_BIN_DIR%\emake --emake-priority=%EC_PRIORITY%
+#                    --emake-maxnodes=%EC_MAXNODES%
+#                    --emake-job-limit=%EC_JOBLIMIT%
+#                    --emake-mem-limit=%EC_MAXMEM%
+#                    --emake-volatile=%EC_VOLATILE_OPTS%
+#                    --emake-history=merge
+#                    --emake-emulation-table make=symbian,emake=symbian,nmake=nmake
+#                    --emake-class=%EC_BUILDCLASS%
+#                    --emake-build-label=%EC_BUILDLABEL%
+#                    --emake-cm=%EC_CM%
+#                    --emake-root=%EPOCROOT%
+#                    --emake-debug=%EC_DEBUG_OPTS%
+#                    --emake-logfile=%EC_LOG_DIR%%1\%1.%EC_TARGET%.emake.%EC_DEBUG_OPTS%.dlog
+#                    --emake-annodetail=%EC_ANNO_OPTS%
+#                    --emake-annofile=%EC_LOG_DIR%%1\%1.%EC_TARGET%.emake.anno.xml
+#                    --emake-historyfile=%EC_HISTORY_DIR%%2.%EC_TARGET%.emake.data %EC_NOREG%
+#                    -f %EC_MAKEFILE_DIR%%EC_TARGET% %EC_PRINTDIRECTORY% %EC_TOPLEVELTGT% 2>&1 | \ec\tools\tee %EC_LOG_DIR%%1\%1.%EC_TARGET%.emake.stdout    
+#--------------------------------------------------------------------------------------------------
+sub Command
+{
+	my ($self, $xml) = (shift, shift || '\%TARGET\%');
+	$xml =~ s/\.xml$//;
+	
+	return join('', $self->{__bin_dir}, "emake ",
+	                " --emake-priority=", $self->{__priority},
+	                " --emake-maxnodes=", $self->{__max_nodes},
+	                " --emake-job-limit=", $self->{__job_limit},
+	                " --emake-mem-limit=", $self->{__mem_limit},
+	                " --emake-volatile=", $self->{__volatile_opts}->Print(),
+	                " --emake-history=", $self->{__history_opts},
+	                " --emake-emulation-table ", $self->{__emulation_table}->Print(),
+	                " --emake-class=", $self->{__build_class},
+	                " --emake-build-label=", $self->{__build_label},
+	                " --emake-cm=", $self->{__cluster_manager},
+	                " --emake-root=", $self->{__root_dir},
+	                " --emake-debug=", $self->{__debug_opts},
+	                " --emake-logfile=", $self->{__log_dir}, $xml, ".emake.", $self->{__debug_opts}, ".dlog",
+	                " --emake-annodetail=", $self->{__anno_opts},
+	                " --emake-annofile=", $self->{__log_dir}, $xml, ".emake.anno.xml",
+	                " --emake-historyfile=", $self->{__history_dir}, lc($self->{__build_class}), '_', $xml, '_history.emake.data',
+	                " -f ", $self->{__makefile_dir}, $xml, " ", $self->{__print_dir}, " ", $self->{__top_level_tgt}, " 2>&1",
+	                " | ", $self->{__tools_dir},"tee ", $self->{__log_dir}, lc($self->{__build_class}), '_', $xml, '.emake.stdout');
+}
+
+#--------------------------------------------------------------------------------------------------
+sub Execute
+{
+	my ($self, $xmlInput, $patch) = (shift, shift, shift);
+	$patch = 1 unless (defined($patch));
+	
+	$self->__patch_symbian_code() if ($patch);
+	
+	# Execute emake
+	my $cmd = $self->Command($xmlInput);
+	print "----------------------------------------------------------------------------\n";
+	print "$cmd";
+	print scalar(`$cmd`), "\n";
+	print "----------------------------------------------------------------------------\n";
+	
+	# Collect agent performance metrics for the run
+	system('tclsh '.$self->{__tools_dir}.'agentcmd --cm='.$self->{__cluster_manager}."\"session performance\" > ".$self->{__log_dir}.$xmlInput.'.agentraw');
+	system('tclsh '.$self->{__tools_dir}.'agentsummary '.$self->{__log_dir}.$xmlInput.'.agentraw > '.$self->{__log_dir}.$xmlInput.'.agentstats');
+	system('copy '.$self->{__history_dir}.lc($self->{__build_class}).'_'.$xmlInput.'_history.emake.data '.$self->{__log_dir});
+	
+	$self->__unpatch_symbian_code()  if ($patch);
+}
+
+sub ExecuteXML
+{
+	my ($self, $xmlInput) = (shift, shift);
+	my ($path, $file) = ($xmlInput =~ /^(.*?)([^\\\/]+)\.xml$/);
+	
+	$ENV{PATH} = $self->{__bin_dir}.';'.$ENV{PATH};
+	$self->{__build_label} = uc($file) if($self->{__build_label} eq 'NOLABEL');
+	
+	$self->__generate_makefiles($path, $file);
+	
+	$self->__patch_symbian_code();
+	
+	# Execute emake
+	my $cmd = $self->Command($file);
+	print "----------------------------------------------------------------------------\n";
+	print scalar(`$cmd`), "\n";
+	print "----------------------------------------------------------------------------\n";
+	
+	# Collect agent performance metrics for the run
+	system('tclsh '.$self->{__tools_dir}.'agentcmd --cm='.$self->{__cluster_manager}."\"session performance\" > ".$self->{__log_dir}.$file.'.agentraw');
+	system('tclsh '.$self->{__tools_dir}.'agentsummary '.$self->{__log_dir}.$file.'.agentraw > '.$self->{__log_dir}.$file.'.agentstats');
+	system('copy '.$self->{__history_dir}.lc($self->{__build_class}).'_'.$file.'_history.emake.data '.$self->{__log_dir});
+	
+	$self->__unpatch_symbian_code();
+}
+
+#--------------------------------------------------------------------------------------------------
+sub __generate_makefiles
+{
+	my ($self, $path, $file) = (shift, shift, shift);
+	
+	system('md '.$self->{__makefile_dir}) unless(-e $self->{__makefile_dir});
+
+	my $cmd  = $self->{__perl_dir}.'perl.exe ';
+	$cmd    .= '\\isis_sw\\build_tools\\packages\\ISIS\\xml2mak.pl -multi -noserialize ';
+	$cmd    .= '-name='.$self->{__makefile_dir}.$file.' -input='.$path.$file.'.xml';
+
+	print "----------------------------------------------------------------------------\n";
+	print scalar `$cmd`, "\n";
+}
+
+#--------------------------------------------------------------------------------------------------
+sub __patch_symbian_code
+{
+	my ($self) = (shift);
+	
+	print "---------------------------------------\n";
+	print "current working directory :\n";
+	print cwd(), "\n";
+	print "---------------------------------------\n";
+
+	# backup makefiles.
+	print("backing-up makefiles\n");
+	system('md '.$self->{__ec_dir}.'assets') unless(-e $self->{__ec_dir}.'assets');
+	system('xcopy /Y /I '.$self->{__makefile_dir}.' '.$self->{__ec_dir}.'assets');
+	
+	# backup symbian gnu make.
+	print("backing-up symbian gnu make\n");
+	system('copy /Y '.$ENV{EPOCROOT}.'epoc32\\tools\\make.exe '.$ENV{EPOCROOT}.'epoc32\\tools\\make.symbian.exe');
+	
+	# patch .bat files which call perl using %PATH% to call perl explicitly.
+	print("patching batch files\n");
+	foreach my $bat (@__batchs)
+	{
+		print "Patching file \'$bat\': ";
+		system('attrib -r $bat');
+		system('move /Y '.$bat.'.make_orig '.$bat) if(-e $bat.'.make_orig');
+		system('copy /Y '.$bat.' '.$bat.'.make_orig');
+		system($self->{__perl_dir}."perl.exe -Wpe \"s/perl /C:\\\\\\\\APPS\\\\\\\\actperl_5.6.1_635\\\\\\\\bin\\\\\\\\perl.exe /\" < ".$bat.'.make_orig > '.$bat);
+	}
+
+	# patch abld
+	print("patching abld files\n");
+	foreach my $abld (@__abld)
+	{
+		system("attrib -r $abld");
+		system("move /y $abld.make_orig $abld") if ( -e "$abld.make_orig");
+		system("copy $abld $abld.make_orig");
+		system($self->{__perl_dir}."perl.exe -Wpe \"next if (/WHAT/); s/make -r/emake -i -r/\" < $abld.make_orig > $abld");		
+	}
+	
+	# patch scripts that generate .bat files which call perl using %PATH% to call perl explicitly.
+	print("patching scripts that generate batch files\n");
+	foreach my $gen (@__generators)
+	{
+		print "Patching file \'$gen\': ";
+		system('attrib -r $gen');
+		system('move /Y '.$gen.'.make_orig '.$gen) if(-e $gen.'.make_orig');
+		system('copy /Y '.$gen.' '.$gen.'.make_orig');
+		system($self->{__perl_dir}."perl.exe -Wpe \"s/perl -S /C:\\\\\\\\APPS\\\\\\\\actperl_5.6.1_635\\\\\\\\bin\\\\\\\\perl.exe -S /\" < ".$gen.'.make_orig > '.$gen);
+	}
+}
+
+#--------------------------------------------------------------------------------------------------
+sub __unpatch_symbian_code
+{
+	my ($self) = (shift);
+	
+	system('del '.$self->{__root_dir}.'epoc32\\tools\\make.symbian.exe');
+	
+	# restore default batch files.
+	print ("unpatching batch files\n");
+	foreach my $bat (@__batchs)
+	{
+		print "Restoring file \'$bat\': ";
+		system('move /Y '.$bat.'.make_orig '.$bat) if(-e $bat.'.make_orig');
+	}
+
+	# unpatch abld's.
+	print("patching abld files\n");
+	foreach my $abld (@__abld)
+	{
+		print "Restoring file \'$abld\': ";
+		system('move /Y '.$abld.'.make_orig '.$abld) if(-e $abld.'.make_orig');
+	}
+	
+	# unpatch bldmake.pl s.
+	print ("unpatching generators\n");
+	foreach my $gen (@__generators)
+	{
+		print "Restoring file \'$gen\': ";
+		system('move /Y '.$gen.'.make_orig '.$gen) if(-e $gen.'.make_orig');
+	}
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   ECloud Emulation Table.
+#
+#--------------------------------------------------------------------------------------------------
+package __ec_emulation_table;
+
+sub new
+{
+	bless { make  => 'symbian',
+		      emake => 'symbian',
+		      nmake => 'nmake',
+		    }, shift;
+}
+
+sub Emulation
+{
+	my ($self, $make) = (shift, shift);
+	return unless exists $self->{$make};
+	
+	$self->{$make} = shift if @_;
+	return $self->{$make};
+}
+
+sub Print
+{
+	my $self = shift;
+	return join(',', map { $_.'='.$self->{$_} } keys %{$self});
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   ECloud Volatile Types.
+#
+#--------------------------------------------------------------------------------------------------
+package __ec_volatile_types;
+
+sub new
+{
+	bless { def   => 1,
+		      info  => 1,
+		      class => 1,
+		      mmp   => 1,
+		    }, shift;
+}
+
+sub VolatileType
+{
+	my ($self, $type, $add_or_remove) = (shift, shift, shift);
+	$type =~ s/^\.//g;
+	
+	if($add_or_remove)
+	{ $self->{$type} = 1; }
+	else
+	{ delete $self->{$type}; }
+}
+
+sub Print
+{
+	my $self = shift;
+	return join(',', map { '.'.$_ } keys %{$self});
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+	ISIS::ECloud - Electric Cloud module.
+
+=head1 SYNOPSIS
+
+	use ISIS::ECloud;
+	
+	# Create a new ecloud instance with max nodes to 100.
+	my $ec = new ECloud({ max_nodes => 100 });
+	
+	$ec->MemLimit(100000);
+	
+	$ec->Execute('full_build.xml');
+
+=head1 DESCRIPTION
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/EmbeddedScanLog.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,244 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : EmbeddedScanLog.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: EmbeddedScanLog.pm % (%full_filespec:  EmbeddedScanLog.pm-6:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Fri May  5 15:58:07 2006 %
+#
+# Version History :
+#
+# v1.1.1 (05/05/2006) :
+#  - EmbeddedScanLog::ElectricCloud managed TBS output
+#
+# v1.1.0 (29/03/2006) :
+#  - EmbeddedScanLog::TBS created
+#  - EmbeddedScanLog::ElectricCloud created
+#  - EmbeddedScanLog autoselect correct parser.
+#
+# v1.0.0 (09/02/2006) :
+#  - Fist version of the package.
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# TBS Package's subroutines
+#------------------------------------------------------------------------------
+package EmbeddedScanLog::TBS;
+use strict;
+use ISIS::ScanLogTBS;
+
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.1.0';
+use constant ISIS_LAST_UPDATE => '29/03/2006';
+
+
+sub new
+{
+	my ( $class, $logname ) = @_;		
+  bless { _logname => $logname
+        }, $class;
+}
+
+sub GetDisplayName
+{
+	my $self = shift;
+	$self->{_logname} =~ /\S*(?:\\|\/)(\S+)(_build_tbs)?_bld\.log$/;
+	return "$1";
+}
+
+sub Generate
+{
+	my $self = shift;
+	my $scanlog = new ScanLogTBS  ( $self->{_logname} );
+	return $scanlog->GenerateDataStructure();
+}
+
+sub IsValidLogName($)
+{
+	my $logname = shift;
+	return 1 if ($logname =~ /_bld\.log$/i);
+	return 0;
+}
+
+sub FindLog
+{
+	my ($name,$path)= (shift, shift||'.');
+	my @array = ( "$path/${name}_bld.log",
+							"$path/${name}_build_tbs_bld.log");
+
+	foreach my $n (@array)
+	{
+		return $n if ( -e $n );
+	}
+	return undef;
+}
+
+1;
+
+#------------------------------------------------------------------------------
+# ElectricCloud Package's subroutines
+#------------------------------------------------------------------------------
+package EmbeddedScanLog::ElectricCloud;
+use strict;
+use ISIS::ScanLog;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0.0';
+use constant ISIS_LAST_UPDATE => '29/03/2006';
+
+sub new
+{
+	my ( $class, $logname ) = @_;		
+  bless { _logname => $logname
+        }, $class;
+}
+
+sub GetDisplayName
+{
+	my $self = shift;
+	$self->{_logname} =~ /emake_logs\.(\S+)\.emake\..*$/;
+	return "$1";
+}
+
+sub Generate
+{
+	my $self = shift;
+	if ( $self->{_logname} =~ /\.emake.stdout.ebs.log$/i)
+	{
+		my $scanlog = new ScanLogTBS( $self->{_logname} );
+		return $scanlog->GenerateDataStructure();
+	}
+	else
+	{
+		my $scanlog = new ScanLog( $self->{_logname}, 0, 0 );
+		return $scanlog->GenerateDataStructure();
+	}
+}
+
+sub IsValidLogName($)
+{
+	my $logname = shift;
+	return 1 if ($logname =~ /\.emake.anno.xml$/i );
+	return 1 if ($logname =~ /\.emake.stdout.ebs.log$/i );
+	return 0;
+}
+
+sub FindLog
+{
+	my ($name,$path)= (shift, shift||'./');
+	my $n = "/logs/emake_logs/emake_logs.$name.emake.stdout.ebs.log";
+	return $n if ( -e $n );
+	$n = "/logs/emake_logs/emake_logs.$name.emake.anno.xml";
+	return $n if ( -e $n );
+}
+1;
+
+
+
+#------------------------------------------------------------------------------
+# EmbeddedScanLog Package's subroutines
+#------------------------------------------------------------------------------
+package EmbeddedScanLog;
+use strict;
+use ISIS::Logger3;
+use File::Path; # mkpath
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.1.0';
+use constant ISIS_LAST_UPDATE => '29/03/2006';
+
+my @__engines;
+BEGIN {
+@__engines = ('EmbeddedScanLog::ElectricCloud',
+							'EmbeddedScanLog::TBS');
+}
+
+sub new
+{
+	my ( $class, $logname ) = @_;
+	
+	my $scanlogger => undef;
+	
+	no strict 'refs';
+	foreach my $engine (@__engines)
+	{
+		my $method = $engine."::IsValidLogName";		
+		if (&$method($logname))
+		{
+			$scanlogger = new $engine($logname);
+			last;
+		}
+	}
+  bless { __scanlogger => $scanlogger, __logname => $logname  }, $class;
+}
+
+sub Generate
+{
+	my $self = shift;
+	if ( $self->{__scanlogger} )
+	{                         
+		my $node = $self->{__scanlogger}->Generate();
+		OUT2XML::AppendXmlNode( $node );	
+		$self->__GenerateScanLog( $node );
+	}
+}
+
+sub FindLog
+{
+	my ($name,$path)= (shift, shift);
+		
+	no strict 'refs';
+	foreach my $engine (@__engines)
+	{
+		my $method = $engine."::FindLog";
+		my $logfile =  &$method($name,$path);
+		return $logfile if ($logfile);
+	}
+	return undef;
+}
+
+
+sub __GenerateScanLog
+{
+	my ($self, $node) = (shift, shift);
+	my $destpath = '/logs/scanlog';
+	mkpath ( $destpath );
+	if ( -d $destpath )
+	{
+		my $name = $self->{__scanlogger}->GetDisplayName();
+		my $logger = new Logger3::OUT2XML( "$destpath/$name.xml" );
+		$logger->OpenXMLLog();
+
+		$logger->Header("Scanlog - $name");
+	
+		$logger->OpenMainContent ( "Scanlog" );
+			$logger->AppendXmlNode ( $node );
+		$logger->CloseMainContent ();
+		
+		$logger->CloseXMLLog();	}
+}
+
+1;
+
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/EmbeddedXMLLog.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : EmbeddedXMLLog.pm
+# Use    : description.
+
+#
+# Version History :
+#
+# v1.0.0 (30/05/2006) :
+#  - First version of the script.
+#------------------------------------------------------------------------------
+package EmbeddedXMLLog;
+use strict;
+use ISIS::XMLManip;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0.0';
+use constant ISIS_LAST_UPDATE => '30/05/2006';
+
+#------------------------------------------------------------------------------
+# Package Function
+#------------------------------------------------------------------------------
+
+sub IncludeXMLLog
+{
+	my ($xmllog) = @_;
+	return 0 unless ( -e $xmllog );
+		
+	my $node = XMLManip::ParseXMLFile( $xmllog );
+	return 0 unless ( $node );
+	foreach my $sn ( @{$node->Child("__maincontent")} )
+	{		
+		foreach my $n (@{$sn->Childs()})
+		{
+			OUT2XML::AppendXmlNode( $n );
+		}
+	}
+	return 1;
+}
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/ErrorDefs.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,157 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : ErrorDefs.pm
+# Use    : Nokia Automated Build error definitions.
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+# v1.0.2 (20/03/2006)
+#  - Added PREMATURE_INTERRUPT error code.
+#
+# v1.0.1 (13/03/2006)
+#  - Added CRITICAL_STEP_FAILED error code.
+#
+# v1.0 (07/10/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+# These constant values define the error messages and corresponding exit codes
+# used in the Nokia Automated Build (NAB) tool.
+
+package ERR;
+
+use strict;
+use warnings;
+require Exporter;
+
+our @ISA    = qw(Exporter);
+our @EXPORT = qw(GetError);
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+use constant NO_ERROR             =>   0;
+use constant FILE_NOT_FOUND       =>  -1;
+use constant CONFIG_NOT_FOUND     =>  -2;
+use constant SCRIPT_NOT_FOUND     =>  -3;
+use constant MODULE_NOT_FOUND     =>  -4;
+use constant INVALID_CFG_STEP     =>  -5;
+use constant INVALID_CFG_FLAG     =>  -6;
+use constant FILE_OPEN_FAILED     =>  -7;
+use constant FILE_CREATION_FAILED =>  -8;
+use constant FILE_WRITE_ERROR     =>  -9;
+use constant FILE_READ_ERROR      => -10;
+use constant DIR_OPEN_FAILED      => -11;
+use constant DIR_CREATION_FAILED  => -12;
+use constant DIR_WRITE_ERROR      => -13;
+use constant DIR_READ_ERROR       => -14;
+use constant INVALID_SWITCH       => -15;
+use constant MISSING_SWITCH       => -16;
+use constant MISSING_ATTR         => -17;
+use constant INVALID_PATH         => -18;
+use constant CRITICAL_STEP_FAILED => -19;
+use constant PREMATURE_INTERRUPT  => -20;
+
+my %__ErrorMessage = (
+   0 => "No error to report",
+  -1 => "File not found",
+  -2 => "Configuration file not found",
+  -3 => "Script not found",
+  -4 => "Module file not found",
+  -5 => "Invalid configuration step in file",
+  -6 => "Invalid configuration flag definition in file",
+  -7 => "Unable to open file",
+  -8 => "Unable to create file",
+  -9 => "Unable to write to file",
+ -10 => "Unable to read from file",
+ -11 => "Unable to open directory",
+ -12 => "Unable to create directory",
+ -13 => "Unable to write to directory",
+ -14 => "Unable to read from directory",
+ -15 => "Unknown flag passed",
+ -16 => "Flag was not defined",
+ -17 => "Attribute was not defined",
+ -18 => "Path does not exist",
+ -19 => "Critical step failed",
+ -20 => "Premature interruption of script",
+);
+
+sub GetError
+{
+	my ($errCode) = (shift);
+	my $message = $__ErrorMessage{$errCode};
+	return "Undefined error code" unless(defined $message);
+
+	$message .= " : $!\n" if($!);
+
+	return $message;
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+ISIS::ErrorDefs - A perl module for error codes.
+
+=head1 SYNOPSIS
+
+=begin text
+
+	# Use of error value in code.
+	use ISIS::XMLManip;
+	
+	sub CreateFile
+	{ 
+	 open(FILE, '>'.shift) or return ERR::FILE_CREATION_FAILED;
+	}
+	
+	# Determine error type.
+	use ISIS::XMLManip;
+	
+	my $res = &CreateFile('test.txt');
+	print GetError($res) if($res != 0);
+
+=end text
+
+=head1 DESCRIPTION
+
+This module defines the ERR package that contains all erro constant
+values and equivalent error definitions. The current implementation
+has all error codes but the 'GetError' subroutine should not be used
+yet. An update will come shortly.
+
+=head2 GetError( ERROR_CODE ) :
+
+Returns the corresponding error message for a given error code.
+
+=head1 AUTHOR
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/FileManip.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,323 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : FileManip.pm
+# Use    : File manipulation routines.
+
+#
+# Version History :
+# v1.02 (17/01/2006) :
+#  - Minor fixes.
+#
+# v1.01 (30/11/2005) :
+#  - Updated CopyDir to support 'recursive' flag.
+#  - Updated CopyDir to support 'regex' flag.
+#  - Fix where CopyDir did not return correct number of copied files.
+#
+# v1.00 (18/10/2005) :
+#  - Fist version of the module.
+#--------------------------------------------------------------------------------------------------
+
+package FileManip;
+
+use File::Basename;
+use File::Compare;
+use File::Copy;
+use File::Find;
+use File::Spec;
+use File::stat;
+use Cwd;
+require Exporter;
+
+our @ISA    = qw(Exporter);
+our @EXPORT = qw(UpdateDelimiters CountNbFiles CountNbDirs MakeDir CopyDir Explore GetEntries $Name $Dir);
+
+use constant ISIS_VERSION     => '1.02';
+use constant ISIS_LAST_UPDATE => '17/01/2006';
+
+#--------------------------------------------------------------------------------------------------
+# UpdateDelimiters :
+#--------------------------------------------------------------------------------------------------
+sub UpdateDelimiters
+{
+  my($string) = (shift);
+  
+  @folders = map { !/(?:\/|\\)/ ? $_ : () } split(/(\/|\\)/, $string);
+  push(@folders, "") if($string =~ /.*(?:\/|\\)$/);
+  return File::Spec->catfile(@folders);
+}
+
+#--------------------------------------------------------------------------------------------------
+# CountNbFiles :
+#--------------------------------------------------------------------------------------------------
+sub CountNbFiles
+{
+  my ($nbFiles, @dirNames) = (0, @_ ? @_ : ('.'));
+  my $filter = shift @dirNames if(ref $dirNames[0] eq 'CODE');
+
+  @dirNames = map { &UpdateDelimiters($_) } @dirNames;  
+  Explore({ process => sub { $nbFiles += (-d $_ ? 0 : 1) }, preprocess => sub { grep{ /$filter/ } @_; }}, @dirNames);
+  #find({ wanted => sub { $nbFiles += (-d $_ ? 0 : 1) }, preprocess => $filter }, @dirNames);
+
+  return $nbFiles;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CountNbDirs :
+#--------------------------------------------------------------------------------------------------
+sub CountNbDirs
+{
+  my ($nbDirs, @dirNames) = (0, @_ ? @_ : ('.'));
+  my $filter = shift @dirNames if(ref $dirNames[0] eq 'CODE');
+
+  @dirNames = map { &UpdateDelimiters($_) } @dirNames;
+  Explore({ process => sub { $nbDirs += (-d $_ ? 0 : 1) }, preprocess => sub { grep{ /$filter/ } @_; }}, @dirNames);
+  #find({ wanted => sub { $nbDirs += (-d $_ ? 1 : 0) }, preprocess => $filter }, @dirNames);
+
+  return $nbDirs - 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# MakeDir :
+#--------------------------------------------------------------------------------------------------
+sub MakeDir
+{
+  my ($string, $current) = (shift, undef);
+  my @folders = map { !/(?:\/|\\)/ ? $_ : () } split(/(\/|\\)/, &UpdateDelimiters($string));
+  
+  $current = shift @folders;
+  return 0 if(not mkdir(File::Spec->catfile($current)) and not -e $current);
+  
+  foreach (@folders)
+  {
+    $current = File::Spec->catfile($current, $_);
+    return 0 if(not mkdir($current) and not -e $current);
+  }
+  
+  return 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CopyDir :
+#--------------------------------------------------------------------------------------------------
+sub CopyDir
+{
+  my ($src, $dst, $flags, $res) = (shift, shift, shift, 0);
+
+	my $verbose   = ($flags =~ /verbose/i);
+  my $recursive = ($flags =~ /recursive/i);
+  my $force     = ($flags =~ /force/i);
+  my $regex     = ($flags =~ /regex/i);
+  my $regexpr   = ".*";
+
+	if($regex)
+	{
+		print " src is \'".$src."\'\n" if($verbose);
+		($src, $regexpr) = ($src =~ /(.*\\{2})(.*?)$/);
+		print " regular expression is \'".$regexpr."\'\n" if($verbose);
+	}
+
+  $src =~ s/^\.([^\.].*|)$/@{[&getcwd()]}$1/;
+  $dst =~ s/^\.([^\.].*|)$/@{[&getcwd()]}$1/;
+  $flags = "" if(not defined $flags);
+
+  $src = &UpdateDelimiters($src);
+  $dst = &UpdateDelimiters($dst);
+
+  if($src !~ /^.*(?:\/|\\)$/)
+  {
+    my ($fulldir, $dir) = ($src =~ /^(.*(?:\/|\\))(.*?)$/);
+    return 0 if($fulldir ne "" and not -e $fulldir);
+    $dst = &UpdateDelimiters($dst.'/'.$dir);
+  }
+  
+  print "Creating dir \'".$dst."\' ... " if($verbose);
+  $res = MakeDir($dst);
+  print "".($res == 1 ? 'Done' : "Error : $!")."\n" if($verbose);
+
+  opendir(DIR_HANDLE, $src) or return 0;
+  my (@files, @dirs);
+  foreach (readdir(DIR_HANDLE))
+  {
+    next if(/^\.\.?$/);
+    if(-d &UpdateDelimiters($src.'/'.$_)) { push @dirs, $_; }
+    elsif($regex)                         { push @files, $_ if(/^$regexpr$/); }
+    else                                  { push @files, $_; }
+  }
+  closedir(DIR_HANDLE);
+
+  foreach (@files)
+  {
+    my $uSrc = &UpdateDelimiters($src.'/'.$_);
+    my $uDst = &UpdateDelimiters($dst.'/'.$_);
+
+    print " - Copying file ".$uSrc." to \'".$uDst."\' ... " if($verbose);
+    my $res = copy($uSrc, $uDst);
+    print "".($res == 1 ? 'Done' : "Error : $!")."\n" if($verbose);
+  }
+  
+  my $total = 0;
+  
+  if($recursive)
+  {
+  	foreach (@dirs)
+  	{
+   	  print "------------------------\n" if($verbose);
+   	  print " <> Exploring subdirectory \'".&UpdateDelimiters($src.'/'.$_)."\'\n" if($verbose);
+   	  $total += CopyDir(&UpdateDelimiters($src.'/'.$_), $dst, $flags);
+  	}
+  }
+
+  return scalar(@files) + $total;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Explore :
+#--------------------------------------------------------------------------------------------------
+our ($Name, $Dir);
+
+sub Explore
+{
+  my ($rHash, @src) = (shift, @_);
+  
+  foreach my $src (@src)
+  {
+    opendir(DIR_HANDLE, $src) or return 0;
+    my @entries = grep{ !/^\.\.?$/ } readdir(DIR_HANDLE);
+    closedir(DIR_HANDLE);
+
+    if(exists $$rHash{preprocess})
+    {
+      if(exists $$rHash{args}) { @entries = &{$$rHash{preprocess}}($src, @entries, $$rHash{args}); }
+      else                     { @entries = &{$$rHash{preprocess}}($src, @entries, undef); }
+    }
+
+    foreach (@entries)
+    {
+      $Name = &UpdateDelimiters($src.'/'.$_);
+      $Dir  = &UpdateDelimiters($src);
+      if(exists $$rHash{args}) { &{$$rHash{process}}($$rHash{args}); }
+      else                     { &{$$rHash{process}}(); }
+    }
+
+    if(exists $$rHash{postprocess})
+    {
+      if(exists $$rHash{args}) { @entries = &{$$rHash{postprocess}}($src, @entries, $$rHash{args}); }
+      else                     { @entries = &{$$rHash{postprocess}}($src, @entries, undef); }
+    }
+
+    foreach (@entries)
+    {
+      my $fullDir = &UpdateDelimiters($src.'/'.$_);
+      Explore($rHash, $fullDir) if($rHash{recursive} && -d $fullDir);
+    }
+  }
+}
+
+#--------------------------------------------------------------------------------------------------
+# GetEntries.
+#--------------------------------------------------------------------------------------------------
+sub GetEntries
+{
+	my ($dir, $regex, @files) = (shift, shift);
+
+	opendir(DIR_HANDLE, $dir) or ();
+  @files = map { /$regex/ ? $dir.'\\'.$_ : () } readdir(DIR_HANDLE);
+  closedir(DIR_HANDLE);
+  
+  return @files;
+}
+
+1; # End of FileManip package.
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+ISIS::FileManip - A set of platform independant file manipulation subroutines
+
+=head1 SYNOPSIS
+
+	my $correctPath = &UpdateDelimiters('/usr/bin/perl');
+	
+	print "number of files in dir \'/usr/bin/\'", &CountNbFiles('/usr/bin/'), "\n";
+	print "number of dirs in dir \'/usr/bin/\'", &CountNbDirs('/usr/bin/'), "\n";
+	
+	MakeDir('/tmp/my_tmp_folder/try_1/');
+
+	CopyDir('/code/src/[\w]+_\d\d\.cpp', '/code/backup', 'recursive verbose regex');
+
+=head1 DESCRIPTION
+
+=head2 UpdateDelimiters( PATH ) :
+
+Updates the passed string representing a path to the right representation for the current
+platform the script is running on.
+ - param 0 : String to update.
+ - return  : String formatted for the current platform.
+
+=head2 CountNbFiles( PATH ) :
+
+Recursive function. Counts number of files in full directory tree exploring each subfolder.
+ - param 0 : Directories to explore. If not specified, current directory will be explored.
+ - return  : Number of files in specified folder (recursive).
+ 
+=head2 CountNbDirs( PATH ) :
+
+Recursive function. Counts number of files in full directory tree exploring each subfolder.
+ - param 0 : Directories to explore. If not specified, current directory will be explored.
+ - return  : Number of subdirectories in specified folder (recursive), -1 if string passed as
+             argument was not a valid directory.
+
+=head2 MakeDir( PATH ) :
+
+Recursive function. Creates a directory tree.
+ - param 0 : Directory tree to create.
+ - return  : True if successful, false otherwise.
+
+=head2 CopyDir( SOURCE, DESTINATION, FLAGS ) :
+
+Recursive function. Copies the content of a folder or the folder itself.
+ - param 0 : Directory to copy. If source directory ends with a slash, the directory will be
+             copied to the destination. If source directory does not end with a slash, the
+             content of the directory will be copied to the destination.
+ - param 1 : Destination directory to copy to.
+ - param 2 : String containing copy flags. "recursive" will also copy subdirectories. "force"
+             will copy files even if they exist in destination directory. "verbose" will print
+             to standard output the operation details. "regex" 
+ - return  : Number of copied files.
+
+=head2 Explore( CALLBACKS ) :
+
+Runs through a full directory tree, applying the passed subroutines at the different steps of
+progress.
+ - param 0 : Reference to a hash table containing information on the actions to take during the
+             tree run-through.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/GenBuildTools.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,292 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : GenBuildTools.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: GenBuildTools.pm % (%full_filespec:  GenBuildTools.pm-vc1s60p1#8:perl:fa1s60p1#1 %)
+# %derived_by:  pmackay %
+# %date_created:  Tue May 08 12:49:18 2007 %
+#
+# Version History :
+#
+# v1.2 (03/11/2006)
+#  - Update BuildTBS to use Juno buildjob
+#
+# v1.1 (22/01/2006)
+#  - Update txt file parser, change the drive on a general basis
+#
+# v1.0 (22/12/2005) :
+#  - Fist version of the package.
+#------------------------------------------------------------------------------
+
+package GenBuildTools;
+
+use strict;
+use Cwd;
+use ISIS::XMLManip;
+use BuildJob;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.2';
+use constant ISIS_LAST_UPDATE => '03/11/2005';
+use constant DEBUGGING => 0;
+
+#------------------------------------------------------------------------------
+# Package's subroutines
+#------------------------------------------------------------------------------
+
+sub PreprocessAndCatInputs($$$$$)
+{
+	my ($arg, $inputs, $removes, $options, $output) = @_;
+	
+	my @list;	
+	foreach my $f ( @{$inputs} )
+	{
+		my $output = $f;
+		$output =~ s/\.txt/_parsed.txt/;
+		PreprocessFile( $f , $output, $arg);
+		push @list, $output;
+	}
+	my $res = &CatInputs ( \@list, $removes, $options, $output );
+	foreach (@list)
+	{
+		unlink ( $_ );
+	}
+	return $res;
+}
+
+
+###############################################################################################
+#
+# CatInputs
+#    @param @inputs
+#    @param @removes
+#    @param $output
+#
+###############################################################################################
+sub CatInputs($$$$)
+{
+	print "@_\n" if (DEBUGGING);
+	my ($inputs, $removes, $options, $output) = @_;
+	
+	my @full;
+	my %toremove;
+	foreach my $f ( @{$removes} )
+	{
+			print "Reading remove file: $f\n";
+			if ( open (FILE, "<$f") )
+			{
+				while (<FILE>)
+				{
+					next if ( /^\s*\#.*$/ );
+					next if ( /^\s*\/\/.*$/ );
+					if ( /^\s*(\S+)\s*$/ )
+					{
+						$toremove{ lc("$1") } = 1;
+					}
+				}
+				close FILE;
+			}
+			else
+			{
+				return 0;
+			}
+	}
+	
+	foreach my $f ( @{$inputs} )
+	{
+			print "Reading input file: $f\n";
+			if ( open (FILE, "<$f") )
+			{
+				while (<FILE>)
+				{
+					if (/^\s*$/) {next;}
+					chomp;
+					s/^\s+//;         	  #Delete leading blanks
+					s/\s+$//;            #Delete trailing blanks
+					
+					next if (/<option\s+\w+>/);
+					next if (/^#.*/); # remove comments
+					
+					if (/^(\S+)\s+(\S+)$/)
+					{
+						my $pname = $1;
+						my $pdir = $2;
+						if  ( not exists ( $toremove{ lc($pname) } ) or not $toremove{ lc($pname) } )
+						{
+							$pdir =~ s/^\\(\S+)/$1/;
+							push @full, "$pname    $pdir";
+						}
+						else
+						{
+							print "Removing: '$pname		$pdir'\n";
+						}
+					}
+				}
+				close FILE;
+			}
+			else
+			{
+				return 0;
+			}
+			
+	}	
+	unless ( open FILE, ">$output" ) {  print "Error opening '$output'\n"; return 0;}
+	foreach ( @{$options} )
+	{
+		print FILE "<option $_>\n";
+	}
+	foreach ( @full )
+	{
+		print FILE "$_\n";
+	}
+	close FILE;
+	return 1;
+}
+
+###############################################################################################
+#
+# PreprocessFile
+#    @param $inputfile
+#    @param $outputfile
+#    @param $cpparg
+#
+###############################################################################################
+sub PreprocessFile()
+{
+	my ($input, $output, $arg) = @_;
+	my $drive = cwd(); $drive =~ /^(.:)/; $drive= "$1";
+	
+	$input = "$drive$input";
+	$output = "$drive$output";
+	$arg =~ s/<drive>/$drive/g;
+	my $cmd = "cpp.exe -nostdinc -P -u $arg $input -o $output";
+	print "$cmd\n" if (DEBUGGING);
+	print `$cmd`;
+	print "Preprocessing done.\n" if (DEBUGGING);
+}
+
+sub GenXML
+{
+	my ( $inputs , $output , $root) = @_;
+	
+	$root = "\\" unless ($root);
+		
+	my $files = "";
+	foreach ( @{$inputs} )
+	{
+		$files .= " -d $_ ";
+	}
+	`call \\epoc32\\tools\\build\\genxml.pl $files -s $root -o ${output}.xml -l ${output}_xml_bld.log`;
+	return 0 unless ( -e "${output}.xml" );
+	return 1;
+}
+
+sub BuildTBS
+{
+	my ( $xmlfile, $logname ) = @_;
+
+	$xmlfile =~ s/\.xml$//;
+	$logname = $xmlfile unless ($logname);
+	
+	
+	return 0 if ( not defined ($xmlfile) or not -e "$xmlfile.xml" );
+	
+	print "Starting clients\n";
+	my $id = $ENV{ 'NUMBER_OF_PROCESSORS' } || 2;
+	$id *= 2;
+	print "Number of clients: $id\n";
+	BuildJob::run("${xmlfile}.xml", "${logname}_bld.log", $id);
+	print "Creating logs\n";
+	unlink ("${logname}_scanlog.html") if (-e "${logname}_scanlog.html" );
+	system ("call perl \\epoc32\\tools\\htmlscanlog.pl -l ${logname}_bld.log -o ${logname}_scanlog.html -v");
+	return 1;
+}
+
+
+###############################################################################################
+#
+# CatXML
+#    @param $output
+#    @param @input
+#
+###############################################################################################
+sub CatXML
+{
+	my $output = shift;
+	my @list = @_;
+	if (not defined($output) or not scalar(@list))
+	{
+		return 0;	
+	}
+
+	my $stage = 0;
+	my $id = 0;
+
+	#
+	# Parsing the fisrt file
+	#
+	my $first = shift( @list );
+	print "Parsing '$first'.\n";
+	my $root = XMLManip::ParseXMLFile( $first );
+	
+	my $commandRoot = @{$root->Childs()}[0];
+	$commandRoot->Unlock(); # unlock node for editing.
+	my @a = @{$commandRoot->Childs()};
+	
+	$id = $a[scalar(@a)-1]->Attribute('ID');
+	$stage = $a[scalar(@a)-1]->Attribute('Stage');
+	
+	foreach my $file ( @list )
+	{
+		my $maxstage = 0;
+		my $maxid = 0;
+	
+		print "Parsing '$file'.\n";
+	
+		# parsing a file from list
+		my $r = XMLManip::ParseXMLFile( $file );
+		$r = @{$r->Childs()}[0];
+		# for each command line.... 
+		foreach my $cmd (@{$r->Childs()})
+		{
+			# is it and execute cmd
+			if ($cmd->Type() eq "Execute")
+			{
+				$maxid = $cmd->Attribute("ID",  $id + $cmd->Attribute("ID"));
+				$maxstage = $cmd->Attribute("Stage", $cmd->Attribute("Stage") + $stage );
+			}
+			
+			# add this node to the root
+			$commandRoot->PushChild( $cmd );
+		}
+		
+		$stage = $maxstage;
+		$id = $maxid;
+	}
+	
+	print "Writing output file '$output'.\n";
+	XMLManip::WriteXMLFile($root, $output);
+	return 1;
+}
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/GenXML2.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,134 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : GenBuildTools.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: GenXML2.pm % (%full_filespec:  GenXML2.pm-2:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Wed Apr 26 08:24:25 2006 %
+#
+# Version History :
+#
+# v1.1.0 (26/04/2006) :
+#  - Fix input file loading by managing duplicate id name.
+#
+# v1.0 (22/12/2005) :
+#  - Fist version of the package.
+#------------------------------------------------------------------------------
+package GenXML2;
+use Cwd;
+
+sub new
+{
+	my ($class) = @_;
+	#no strict 'refs';
+  my $self = {
+    		m_CurrentStep => 0,
+				m_Data => {}
+    };
+  bless $self, $class;
+}
+
+sub parseFile
+{
+	my ($self, $filename, @args) = @_;
+
+	my $drive = Cwd::cwd(); $drive =~ /(.:)/; $drive = $1;
+
+	$filename = $drive.$filename if ($filename =~ /^\\/);
+
+	open (INPUT, "cpp.exe -nostdinc -u  @args $filename |");
+	my $id = 0;
+	foreach my $line (<INPUT>)
+	{
+		$line =~ s/#.*$//;
+		next if ($line =~ /^\s*$/);
+		if ($line =~ /^\s*NEWSTEP\s*$/)
+		{
+			#print "NEWSTEP\n";
+			$self->{ m_CurrentStep } = $self->{ m_CurrentStep }+1;
+		}
+		elsif ($line =~ /(\w+)\s*,\s*(\S+)\s*,\s*\"(.*)\"/)
+		{
+			#print "$1, $2, $3\n";
+			
+			my $name = $1;
+			my $path = $2;
+			my $cmd = $3;
+			$self->{ m_Data }->{ $self->{ m_CurrentStep } }->{$id}->{'name'} = $name;
+			$self->{ m_Data }->{ $self->{ m_CurrentStep } }->{$id}->{'path'} = $path;
+			$self->{ m_Data }->{ $self->{ m_CurrentStep } }->{$id}->{'cmd'} = $cmd;
+			++$id;
+		}
+		else
+		{
+			warn "WARNING: error at line $line\n";
+		}
+	}
+
+	close (INPUT)
+}
+
+
+
+sub generateTBSXML
+{
+		my ($self, $filename) = @_;
+		
+		my $id = 1;
+		open (OUTPUT, ">$filename") or die "Cannot open $filename";
+		
+		print OUTPUT "<?xml version=\"1.0\"?>\n";
+        print OUTPUT "<!DOCTYPE Build  [\n";
+        print OUTPUT "<!ELEMENT Product (Commands)>\n";
+        print OUTPUT "<!ATTLIST Product name CDATA #REQUIRED>\n";
+        print OUTPUT "<!ELEMENT Commands (Execute+ | SetEnv*)>\n";
+        print OUTPUT "<!ELEMENT Execute EMPTY>\n";
+        print OUTPUT "<!ATTLIST Execute ID CDATA #REQUIRED>\n";
+        print OUTPUT "<!ATTLIST Execute Stage CDATA #REQUIRED>\n";
+        print OUTPUT "<!ATTLIST Execute Component CDATA #REQUIRED>\n";
+        print OUTPUT "<!ATTLIST Execute Cwd CDATA #REQUIRED>\n";
+        print OUTPUT "<!ATTLIST Execute CommandLine CDATA #REQUIRED>\n";
+        print OUTPUT "<!ELEMENT SetEnv EMPTY>\n";
+        print OUTPUT "<!ATTLIST SetEnv Order ID #REQUIRED>\n";
+        print OUTPUT "<!ATTLIST SetEnv Name CDATA #REQUIRED>\n";
+        print OUTPUT "<!ATTLIST SetEnv Value CDATA #REQUIRED>\n";
+				print OUTPUT "]>\n";
+		
+		print OUTPUT "<Product Name=\"genxml2\">\n";
+    print OUTPUT "   <Commands>\n";
+    print OUTPUT "   		<SetEnv Order=\"1\" Name=\"EPOCROOT\" Value=\"\\\"/>\n";
+		print OUTPUT "   <SetEnv Order=\"2\" Name=\"PATH\" Value=\"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+
+		foreach my $key ( sort { $a <=> $b } keys ( %{$self->{ m_Data }} ) )
+		{
+			foreach my $name ( keys ( %{$self->{ m_Data }->{ $key } } ) )
+			{				
+				print OUTPUT "<Execute ID=\"$id\" Stage=\"$key\" Component=\"".$self->{ m_Data }->{ $key }->{$name}->{'name'}."\" Cwd=\"".$self->{ m_Data }->{ $key }->{$name}->{'path'}."\" CommandLine=\"".$self->{ m_Data }->{ $key }->{$name}->{'cmd'}."\" />\n";
+				$id++;
+			}
+		}
+    print OUTPUT "   </Commands>\n";
+		print OUTPUT "</Product>\n";
+		close (OUTPUT);
+}
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/HtmlManip.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : HtmlManip.pm
+# Use    : Contains an instanciable package to write complex html files.
+
+#
+# Synergy :
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   HTMLManip package - Just a shortcut to load the main OUT module.
+#
+#--------------------------------------------------------------------------------------------------
+
+package HTMLManip;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+
+use constant ISIS_VERSION     => 'v1.00';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+sub new
+{
+	shift;
+	return new OUT::Outputer(@_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+ISIS::HTMLManip - Outputer for complex html files.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+
+=head1 DESCRIPTION
+
+The HTMLManip package provides only a constructor that returns a new L<OUT::Outputer>
+instance from which all HTML generation is done.
+
+=head2 HTMLManip( OSTREAM, CONFIGURATION_FILE, INTERFACE ) :
+
+Returns a newly constructed L<OUT::Outputer> instance that will printout to the passed
+output stream. The configuration file is used for generic values such as icons and 
+colors. The interface determines the root directory from with all the HTML style information
+will be taken.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/HttpServer.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : HttpServer.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: HttpServer.pm % (%full_filespec:  HttpServer.pm-2.1.2:perl:fa1s60p1#1 %)
+# %derived_by:  oligrant %
+# %date_created:  Wed Apr  5 13:29:26 2006 %
+#
+# Version History :
+#
+# v1.0.0 (07/02/2006) :
+#  - Manage resources from ISIS http server.
+#------------------------------------------------------------------------------
+
+package HttpServer;
+
+use strict;
+use warnings;
+
+use HTTP::Request;
+use LWP::UserAgent;
+
+# ISIS constants.
+use constant ISIS_VERSION     => '1.0.0';
+use constant ISIS_LAST_UPDATE => '07/02/2006';
+
+use constant ISIS_HTTP_SERVER => "http://fawww.europe.nokia.com/isis";
+
+#------------------------------------------------------------------------------
+# GetAddress
+# return default ISIS server
+#------------------------------------------------------------------------------
+sub GetAddress
+{
+	return ISIS_HTTP_SERVER;
+}
+
+#------------------------------------------------------------------------------
+# GetFile
+# src			source url
+# dst			destination path
+# return 1 on success or 0 on failure
+#------------------------------------------------------------------------------
+sub GetFile($$)
+{
+	my ($src, $dst) = @_;
+	
+	# if the path is not an http url then append server url
+	$src = ISIS_HTTP_SERVER."/$src" if ( $src !~ /^http:\/\// );
+	
+	# Get the file
+	my $request = HTTP::Request->new( GET => "$src" );
+	my $ua = LWP::UserAgent->new;
+	my $response = $ua->request($request);
+	if ($response->is_success)
+	{
+		# if success writing the content to the dest file
+		open(FILE, '>'.$dst) or return 0;
+		binmode FILE;
+		print FILE $response->content;
+		close(FILE);	
+		return 1;
+	}	
+	# else return error!
+	return 0;
+}
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/IBUSAL.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : IBUSAL.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: IBUSAL.pm % (%full_filespec:  IBUSAL.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Sep 22 15:47:08 2005 %
+#
+# Version History :
+#
+# v1.0 (20/09/2005) :
+#  - Fist version of the package.
+#------------------------------------------------------------------------------
+
+package ISIS::IBUSAL;
+use strict;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0';
+use constant ISIS_LAST_UPDATE => '20/09/2005';
+
+
+#------------------------------------------------------------------------------
+# Package's subroutines
+#------------------------------------------------------------------------------
+
+################################################################################
+#
+#
+#  XLoader for RnD
+#
+#		@param productname
+#		@param hwid
+#
+################################################################################
+sub CopyXLoader($$)
+{
+		my ($target,$hid) = @_;
+		my ($asic,$asic_ver,$asic_key,$flash_size,$rom_size,$pi,$arm_ver,$sec_srvs) = &ReadConfFile($target,$hid);
+		print "Copying prebuilt XLoader\n";
+		system("copy /y /b \\spp_config\\product_config\\Ibusal\\Exports_Adaptation\\rombuild\\prebuilt_xloader_images\\xloader-ext?${target}_2_0_OEM1.fps8 \\epoc32\\INCLUDE\\$target\\PI$pi\\XLoader\\1710V$asic_ver\\udeb\\xloader-ext.fps8");
+		system("copy /y /b \\spp_config\\product_config\\Ibusal\\Exports_Adaptation\\rombuild\\prebuilt_xloader_images\\xloader?${target}_2_0_OEM1.fps8 \\epoc32\\INCLUDE\\$target\\PI$pi\\XLoader\\1710V$asic_ver\\udeb\\xloader.fps8");
+		system("copy /y /b \\spp_config\\product_config\\Ibusal\\Exports_Adaptation\\rombuild\\prebuilt_xloader_images\\xloader-ext?${target}_2_0_OEM1.fps8 \\epoc32\\INCLUDE\\$target\\PI$pi\\XLoader\\1710V$asic_ver\\urel\\xloader-ext.fps8");
+		system("copy /y /b \\spp_config\\product_config\\Ibusal\\Exports_Adaptation\\rombuild\\prebuilt_xloader_images\\xloader?${target}_2_0_OEM1.fps8 \\epoc32\\INCLUDE\\$target\\PI$pi\\XLoader\\1710V$asic_ver\\urel\\xloader.fps8");
+}
+
+
+
+
+#########################################################################
+#
+#		Internal functions
+#
+#########################################################################
+sub ReadConfFile
+{
+    my ($pname,$hid) = @_;
+    if (not -e "\\epoc32\\rom\\$pname\\${pname}.conf")
+    {
+	print("ERROR: Can't open \\epoc32\\rom\\$pname\\${pname}.conf file\n");
+	exit(0);
+    }
+    open INPUTOBYFILE,"\\epoc32\\rom\\$pname\\${pname}.conf" or die "ERROR: Can't open \\epoc32\\rom\\$pname\\${pname}.conf file\n";
+
+    my ($InputObyFile,$hwid,$asic,$asic_ver,$asic_key,$flash_size,$rom_size,$pi,$arm_ver,$sec_srvs);
+    while ( $InputObyFile = <INPUTOBYFILE> )
+    {
+        chomp $InputObyFile;
+
+        ($hwid,$asic,$asic_ver,$asic_key,$flash_size,$rom_size,$pi,$arm_ver,$sec_srvs) = split(/\|+/,$InputObyFile);
+        chomp($hwid,$asic,$asic_ver,$asic_key,$flash_size,$rom_size,$pi,$arm_ver,$sec_srvs);
+        &trim($hwid,$asic,$asic_ver,$asic_key,$flash_size,$rom_size,$pi,$arm_ver,$sec_srvs);
+        if ($hid eq $hwid)
+        {
+            close INPUTOBYFILE;
+            return ($asic,$asic_ver,$asic_key,$flash_size,$rom_size,$pi,$arm_ver,$sec_srvs);
+        }
+    }
+    close INPUTOBYFILE;
+    &usage("ERROR: Hardware Id '$hid' not found in the conf file\n");
+}
+
+sub trim 
+{
+    for (@_) 
+    {
+        s/^\s*//; # trim leading spaces
+        s/\s*$//; # trim trailing spaces
+    }
+    return @_;
+}
+
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Logger2.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1121 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : Logger2.pm
+# Use    : ISIS Logging module.
+
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+# v2.2.5 (25/05/2006):
+#  - Save old html log.
+#
+# v2.2.4 (03/05/2006):
+#  - Added Execute function to launch command and get it's output.
+#
+#
+# v2.2.3 (06/04/2006):
+#  - Reworte the way user defined CSS files are handled to make sure they are the last ones
+#    included in the document body to allow overwriting of certain values.
+#
+# v2.2.2 (05/04/2006):
+#  - Updated OUT2XML and XML2HTML to store CSS and JS files in arrays to preserve order.
+#
+# v2.2.1 (16/03/2006):
+#    - Added SetCustomModule to manage custom Outputer submodules
+#    - Can now specifiy custom Outputer class for Header and Footer.
+#
+# v2.2.0 (27/01/2006):
+#  - Rewrote XML2HTML package :
+#    - Corrected event printout.
+#    - Added special message count.
+#    - Added global special message count.
+#    - Errors, Warnings, Remarks and Notes now have Ids.
+#    - Any type of specific message is printed.
+#
+# v2.1.1 (13/01/2006):
+#  - Updated Die subroutine to print line and file if specified.
+#
+# v2.1.0 (11/01/2006):
+#  - Updated 'OUT2XML' package with following changes :
+#    - General print messages handled by 'AUTOLOAD' now print all their arguments.
+#      The same calls should be replaced by a extra call to 'Die'.
+#    - 'PrintBold' is now depreciated and should be replaced by formatting tags.
+#    - 'PrintItalic' is now depreciated and should be replaced by formatting tags.
+#    - 'PrintUnderline' is now depreciated and should be replaced by formatting tags.
+#    - 'OpenParagraph' and 'CloseParagraph' are now depreciated and should be removed.
+#  - Updated 'XML2HTML' package with following changes :
+#    - contigus 'print' nodes will be printed in one block.
+#
+# v2.0.0 (13/12/2005):
+#  - Updated module to use ISIS::XMLManip.
+#  - Added 'OpenParagraph' and 'CloseParagraph' subroutines to OUT2XML.
+#  - Added 'LinkCSSFile' subroutine to OUT2XML.
+#  - Added 'DiscardMessageType' subroutine to OUT2XML.
+#
+# v1.2.0 (07/11/2005):
+#  - Fixed event id
+#
+# v1.1.0 (30/09/2005) :
+#  - Added C++ formatting routines.
+#  - Added OUT2XML::IncludeCPP to include file in log.
+#  - Added XML2HTML::cpp_include to parse corresponding XML tag.
+#
+# v1.0.0 (20/09/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+package Logger2;
+
+require Exporter;
+
+our @ISA    = qw(Exporter);
+our @EXPORT = qw(OUT2XML XML2HTML);
+
+use constant ISIS_VERSION     => '2.2.5';
+use constant ISIS_LAST_UPDATE => '25/05/2006';
+
+1;
+
+my %ModuleData; # Common data to all packages.
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT2XML package;
+#
+#--------------------------------------------------------------------------------------------------
+
+package OUT2XML;
+
+use strict;
+use warnings;
+use ISIS::ErrorDefs;
+use ISIS::XMLManip;
+
+use constant ISIS_VERSION     => '1.2.0';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# SetXMLLogName
+#--------------------------------------------------------------------------------------------------
+sub SetXMLLogName
+{
+  $ModuleData{htmlFile}  = shift;
+  $ModuleData{xmlFile}   = $ModuleData{htmlFile};
+  $ModuleData{htmlFile}  =~ s/\.xml/\.html/;
+  $ModuleData{xmlFile}   =~ s/\.[^\.]+$//;
+  $ModuleData{xmlFile}  .= '.xml';
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetXMLLogVerbose
+#--------------------------------------------------------------------------------------------------
+sub SetXMLLogVerbose
+{
+  $ModuleData{verbose} = shift;
+  
+  if($ModuleData{verbose} =~ /(?:off|no|0)/i) { $ModuleData{verbose} = 0; }
+  else                                        { $ModuleData{verbose} = 1; }
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetXMLLogInterface    
+#--------------------------------------------------------------------------------------------------
+sub SetXMLLogInterface
+{
+  $ModuleData{interface} = shift;
+  $ModuleData{interface} =~ s/\\$//;
+}
+
+#--------------------------------------------------------------------------------------------------
+# LinkCSSFile
+#--------------------------------------------------------------------------------------------------
+sub LinkCSSFile
+{
+  my ($file) = (shift);
+  
+  foreach my $css (@{$ModuleData{css}})
+  { return if($css eq $file); }
+  
+  push @{$ModuleData{css}}, $file;
+}
+
+#--------------------------------------------------------------------------------------------------
+# LinkJSCFile
+#--------------------------------------------------------------------------------------------------
+sub LinkJSCFile
+{
+  my ($file) = (shift);
+  
+  foreach my $js (@{$ModuleData{jsc}})
+  { return if($js eq $file); }
+  
+  push @{$ModuleData{jsc}}, $file;
+}
+
+#--------------------------------------------------------------------------------------------------
+# DiscardMessageTypes
+#--------------------------------------------------------------------------------------------------
+sub DiscardMessgeTypes
+{
+  $ModuleData{discard} = join('|', @_);
+}
+
+sub DiscardEmptyNodes
+{
+	$ModuleData{discard_empty_nodes} = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# AssociateMessageToClass
+#--------------------------------------------------------------------------------------------------
+sub AssociateMessageToClass
+{
+	my ($type, $class) = (shift, shift);
+	print "Registering $type to HTML class $class\n";
+	$ModuleData{classes}->{lc($type)} = $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenXMLLog
+#--------------------------------------------------------------------------------------------------
+sub OpenXMLLog
+{
+	$ModuleData{classes}->{error}   ||= 'cr_r';
+	$ModuleData{classes}->{warning} ||= 'cr_y';
+	$ModuleData{classes}->{remark}  ||= 'ch_g';
+	$ModuleData{classes}->{note}    ||= 'ch_b';
+	
+	$ModuleData{discard_empty_nodes} ||= '0';
+	
+  $ModuleData{step}         = 0;
+  $ModuleData{rootNode}     = new XMLManip::Node('__log', { date => scalar(localtime) });
+  $ModuleData{currentNode}  = $ModuleData{rootNode};
+
+  $ModuleData{rootNode}->Comment("  Name : ".$ModuleData{xmlFile}."\n  Use  : Temporary XML log file - Generated by OUT2XML");
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseXMLLog
+#--------------------------------------------------------------------------------------------------
+sub CloseXMLLog
+{
+  $ModuleData{rootNode}->PushChild($ModuleData{summaryNode}) if ($ModuleData{summaryNode});
+
+	foreach my $name ( keys ( %{$ModuleData{customizeOutputer}}) )
+	{
+		my $custom = new XMLManip::Node('__customoutputer');
+		$custom->Attribute('type',$name);
+		$custom->Attribute('module',$ModuleData{customizeOutputer}{$name}{module});
+		foreach (@{$ModuleData{customizeOutputer}{$name}{config}})
+		{
+			$custom->PushChild($_);
+		}
+		$ModuleData{rootNode}->PushChild($custom);
+	}
+	&XMLManip::WriteXMLFile($ModuleData{rootNode}, $ModuleData{xmlFile});
+  &XML2HTML::GenHTMLLogFile($ModuleData{xmlFile}, $ModuleData{htmlFile}, $ModuleData{discard});
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenSummary
+#--------------------------------------------------------------------------------------------------
+sub OpenSummary
+{
+	my $summaryNode = new XMLManip::Node('__summary');
+	
+	$summaryNode->Comment(" +++ SUMMARY +++ ");
+	$summaryNode->Attribute('title', shift);
+  
+  $ModuleData{summaryNode} = $summaryNode;
+  $ModuleData{inSummary}   = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseSummary
+#--------------------------------------------------------------------------------------------------
+sub CloseSummary
+{
+	$ModuleData{inSummary} = 0;
+}
+
+#--------------------------------------------------------------------------------------------------
+# SummaryElmt
+#--------------------------------------------------------------------------------------------------
+sub SummaryElmt
+{
+  my ($tag, $val) = (shift, shift);
+  
+  $tag =~ s/\n//g;
+  $val =~ s/\n//g;
+  
+  if($ModuleData{verbose})
+  {
+    print '  ', $tag, " : ", $val, "\n" if($ModuleData{inSummary}); # STDOUT
+  }
+
+	my $elementNode = new XMLManip::Node('__elmt', { tag => $tag, val => $val });
+	$ModuleData{summaryNode}->PushChild($elementNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetCustomModule
+#--------------------------------------------------------------------------------------------------
+sub SetCustomModule($$$)
+{
+	my ($name, $module, $customConfigNode) = (shift, shift, shift);
+	$ModuleData{customizeOutputer} { $name }{module} = $module;
+	$ModuleData{customizeOutputer} { $name }{config} = $customConfigNode;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Header
+#--------------------------------------------------------------------------------------------------
+sub Header
+{
+  my $headerNode = new XMLManip::Node('__header', { title => shift, subtitle => shift });
+
+  $headerNode->Comment(" +++ HEADER +++ ");
+  $ModuleData{rootNode}->PushChild($headerNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Footer
+#--------------------------------------------------------------------------------------------------
+sub Footer
+{
+  my $footerNode = new XMLManip::Node('__footer', { title => shift, subtitle => shift });
+
+  $footerNode->Comment(" +++ FOOTER +++ ");
+  $ModuleData{rootNode}->PushChild($footerNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenMainContent
+#--------------------------------------------------------------------------------------------------
+sub OpenMainContent
+{ 
+  ++$ModuleData{step};
+  my $contentNode = new XMLManip::Node('__maincontent', { title => shift, step => $ModuleData{step} });
+	$contentNode->Comment(" +++ MAIN CONTENT +++ ");
+
+  push @{$ModuleData{parentNodes}}, $ModuleData{currentNode};
+  $ModuleData{currentNode}->PushChild($contentNode);
+  $ModuleData{currentNode} = $contentNode;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseMainContent
+#--------------------------------------------------------------------------------------------------
+sub CloseMainContent
+{
+	$ModuleData{currentNode} = pop @{$ModuleData{parentNodes}};
+}
+
+#--------------------------------------------------------------------------------------------------
+# MainTitle
+#--------------------------------------------------------------------------------------------------
+sub MainTitle
+{
+	my ($title) = (shift);
+	
+	++$ModuleData{step};
+	my $titleNode = new XMLManip::Node('__maintitle', { title => $title, step => $ModuleData{step} });
+	$titleNode->Comment(" +++ ".uc($title)." +++ ");
+	
+	$ModuleData{currentNode}->PushChild($titleNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenEvent
+#--------------------------------------------------------------------------------------------------
+sub OpenEvent
+{
+  my ($title) = (shift);
+  ++$ModuleData{step};
+  
+  my $eventNode = new XMLManip::Node('__event');
+  $eventNode->Attribute('title', $title);
+  $eventNode->Attribute('time', scalar(localtime));
+  $eventNode->Attribute('step', $ModuleData{step});
+
+  if($ModuleData{verbose})
+  {
+    print "----------------------------------------------------------------------------\n",
+          " + ", $title, "\n";
+  }
+  
+	push @{$ModuleData{parentNodes}}, $ModuleData{currentNode};
+	$ModuleData{currentNode}->PushChild($eventNode);
+	$ModuleData{currentNode} = $eventNode;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseEvent
+#--------------------------------------------------------------------------------------------------
+sub CloseEvent
+{
+	$ModuleData{currentNode} = pop @{$ModuleData{parentNodes}};
+}
+
+#--------------------------------------------------------------------------------------------------
+# AUTOLOAD (For text output : Print, Error, Warning, Remark, Note).
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($method, $text) = (our $AUTOLOAD, join('', @_));
+  return unless($text);
+  ++$ModuleData{step};
+  my ($type) = ($method =~ /::(.*)$/);
+
+  if($text =~ s/\[bold\](.*?)\[\/bold\]/<b>$1<\/b>/g)
+  { warn "formatting [bold] ... [/bold] is depreciated: please update your script to use <b> and </b>\n"; }
+  
+  if($text =~ s/\[italic\](.*?)\[\/italic\]/<i>$1<\/i>/g)
+  { warn "formatting [italic] ... [/italic] is depreciated: please update your script to use <i> and </i>\n"; }
+  
+  if($text =~ s/\[underline\](.*?)\[\/underline\]/<u>$1<\/u>/g)
+  { warn "formatting [underline] ... [/underline] is depreciated: please update your script to use <u> and </u>\n"; }
+                                                            
+  if($ModuleData{verbose})                                  
+  {                                                         
+    my $rawText = $text;                                    
+   	$rawText =~ s/\<b>//g;
+  	$rawText =~ s/\<\/b>//g;
+  	$rawText =~ s/\<i>//g;
+  	$rawText =~ s/\<\/i>//g;
+  	$rawText =~ s/\<u>//g;
+  	$rawText =~ s/\<\/u>//g;
+    
+    if($type !~ /^print$/i) { print " \/!\\ ", uc($type)," :\n$rawText\n\n"; }
+    else                    { print "$rawText"; $type = '__'.$type; }
+  }
+
+  my $node = new XMLManip::Node(lc($type));
+  $node->Attribute('time', scalar(localtime));
+  $node->Attribute('step', $ModuleData{step});
+  $node->Content($text);
+
+  $ModuleData{currentNode}->PushChild($node);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Depreciated Print Subroutines - Should be replaced with formatting tags in regular 'Print'.
+#--------------------------------------------------------------------------------------------------
+sub PrintBold
+{ # For backwards compatibility
+  warn "subroutine \'PrintBold\' is depreciated: please update your script and add formatting tags\n";
+	OUT2XML::Print('<b>', @_, '</b>');
+}
+
+sub PrintItalic
+{ # For backwards compatibility
+  warn "subroutine \'PrintItalic\' is depreciated: please update your script and add formatting tags\n";
+	OUT2XML::Print('<i>', @_, '</i>');
+}
+
+sub PrintUnderline
+{ # For backwards compatibility
+  warn "subroutine \'PrintUnderline\' is depreciated: please update your script and add formatting tags\n";
+	OUT2XML::Print('<u>', @_, '</u>');
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenParagraph and CloseParagraph.
+#--------------------------------------------------------------------------------------------------
+sub OpenParagraph
+{ warn "subroutine \'OpenParagraph\' is depreciated: please update your script\n"; }
+
+sub CloseParagraph
+{ warn "subroutine \'CloseParagraph\' is depreciated: please update your script\n"; }
+
+#--------------------------------------------------------------------------------------------------
+# IconText
+#--------------------------------------------------------------------------------------------------
+sub IconPrint
+{
+  my ($icon, $text) = (shift, join('', @_));
+  ++$ModuleData{step};
+
+  my $node = new XMLManip::Node('__icon_print');
+  $node->Attribute('icon', $icon);
+  
+  if($text =~ s/\[bold\](.*?)\[\/bold\]/<b>$1<\/b>/g)
+  { warn "formatting [bold] ... [/bold] is depreciated: please update your script to use <b> and </b>\n"; }
+  
+  if($text =~ s/\[italic\](.*?)\[\/italic\]/<i>$1<\/i>/g)
+  { warn "formatting [italic] ... [/italic] is depreciated: please update your script to use <i> and </i>\n"; }
+  
+  if($text =~ s/\[underline\](.*?)\[\/underline\]/<u>$1<\/u>/g)
+  { warn "formatting [underline] ... [/underline] is depreciated: please update your script to use <u> and </u>\n"; }
+                                                            
+  if($ModuleData{verbose})                                  
+  {                                                         
+    my $rawText = $text;                                    
+   	$rawText =~ s/\<b>//g;
+  	$rawText =~ s/\<\/b>//g;
+  	$rawText =~ s/\<i>//g;
+  	$rawText =~ s/\<\/i>//g;
+  	$rawText =~ s/\<u>//g;
+  	$rawText =~ s/\<\/u>//g;
+    
+    print "$rawText";
+  }
+
+	$node->Attribute('time', scalar(localtime));
+  $node->Attribute('step', $ModuleData{step});
+  $node->Content($text);
+  $ModuleData{currentNode}->PushChild($node);
+}
+
+#--------------------------------------------------------------------------------------------------
+# AppendXmlNode to the structure
+#--------------------------------------------------------------------------------------------------
+sub AppendXmlNode
+{
+	my ($node)	= (shift);	
+	$ModuleData{currentNode}->PushChild($node);		
+}
+
+#--------------------------------------------------------------------------------------------------
+# Allow to execute a command and get it's output into the logger
+#--------------------------------------------------------------------------------------------------
+use IPC::Open3;  
+sub Execute
+{
+	my ( $cmd ) = @_;
+	my $childpid = open3(\*WTRFH, \*RDRFH, \*ERRFH, $cmd);
+	close(WTRFH);
+	close(ERRFH);
+	my $out = "";
+	while(<RDRFH>)
+	{
+			$out .= <RDRFH>;
+	}
+	# Closing cleanly....
+	close(RDRFH);		
+
+	# dump content
+	OUT2XML::Print ( $out."\n" );
+
+	waitpid($childpid, 0);
+}
+
+
+#--------------------------------------------------------------------------------------------------
+# IncludeCPP
+#--------------------------------------------------------------------------------------------------
+sub IncludeCPP
+{
+	my ($file, $line, $width) = (shift, shift, shift);
+	++$ModuleData{step};
+	
+	my $cppNode = new XMLManip::Node('__cpp_include');
+	$cppNode->Attribute('file', $file);
+	$cppNode->Attribute('line', $line);
+	$cppNode->Attribute('width', $width);
+	$cppNode->Attribute('step', $ModuleData{step});
+	
+	$ModuleData{currentNode}->PushChild($cppNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Die
+#--------------------------------------------------------------------------------------------------
+sub Die
+{
+  my ($errCode, $message) = (shift);
+  my ($pkg, $file, $line) = caller;
+
+  if($file and $line){ $message = $errCode." : ".ERR::GetError($errCode)." in file \'".$file."\' at line \'".$line."\'"; }
+  else               { $message = $errCode." : ".ERR::GetError($errCode); }
+
+  Footer("Finished on ".scalar(localtime), "call to OUT2XML::Die( ".$message." )");
+  CloseXMLLog();
+
+  exit($errCode);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#  XML2HTML package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package XML2HTML;
+
+use strict;
+use warnings;
+use File::Copy;
+use ISIS::XMLManip;
+use ISIS::HTMLmanip;
+use ISIS::ErrorDefs;
+
+use constant ISIS_VERSION     => '2.0.0 alpha';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+my $XMLData; # xml file parsed data.
+
+#--------------------------------------------------------------------------------------------------
+# GenHTMLLogFile : Only subroutine to be called.
+#--------------------------------------------------------------------------------------------------
+sub GenHTMLLogFile
+{
+	my ($xmlfile, $htmlfile, $discard, $ostream) = (shift, shift, shift);
+
+  $ModuleData{discard} = $discard || '';
+  
+  # Saving old log id existing
+  if ( -e $htmlfile )
+  {
+  	my $id = 1;
+  	my $nn;
+  	do {
+  		$nn = $htmlfile;
+  		$nn =~ s/\.html/_${id}.html/;
+  		$id++;
+  	}
+  	while ( -e $nn );
+  	print "$htmlfile -> $nn\n";	
+  	move ($htmlfile, $nn);
+  }
+  
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+
+  # Read XML and create document body.
+	$XMLData  = &XMLManip::ParseXMLFile($xmlfile);
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', $ModuleData{interface});
+	
+	foreach my $css (@{$ModuleData{css}})
+	{ $outputer->UserRequireCSSFile($css); }
+	
+	foreach my $js (@{$ModuleData{jsc}})
+	{ $outputer->UserRequireJSFile($js); }
+	
+	my $document = $outputer->Create('Log::Document');
+	
+	my %CustomOutputer;
+	foreach my $c (@{$XMLData->Child('__customoutputer')})
+	{
+		$CustomOutputer{ $c->Attribute('type') }{ module } = $c->Attribute('module');
+		$CustomOutputer{ $c->Attribute('type') }{ config } = $c;
+	}
+	
+	# Create header.
+	my $hNode = ${$XMLData->Child('__header')}[0];
+	if($hNode)
+	{
+	  	if ($CustomOutputer{'__header'})
+	  	{
+			$document->Header($outputer->Create( $CustomOutputer{'__header'}{module},
+	                                    $hNode->Attribute('title'),
+	                                    $hNode->Attribute('subtitle'),
+	                                    $CustomOutputer{'__header'}{config}));
+
+	  	}
+	  	else
+	  	{
+			$document->Header($outputer->Create( 'Log::Header',
+	                                    $hNode->Attribute('title'),
+	                                    $hNode->Attribute('subtitle')));
+	  	}
+ 	}
+	
+	# Create footer.
+	my $fNode = ${$XMLData->Child('__footer')}[0];
+	if ($fNode)
+	{
+	 	if ($CustomOutputer{'__footer'})
+	  	{
+			$document->Footer($outputer->Create( $CustomOutputer{'__footer'}{module},
+	                                    $fNode->Attribute('title'),
+	                                    $fNode->Attribute('subtitle'),
+	                                    $CustomOutputer{'__footer'}{config}));
+
+	  	}
+	  	else
+	  	{
+			$document->Footer($outputer->Create('Log::Footer',
+	                                    $fNode->Attribute('title'),
+	                                    $fNode->Attribute('subtitle')));
+	  	}
+	}
+	
+	# Create summary
+	my $sNode = ${$XMLData->Child('__summary')}[0];
+	$document->Summary(&__Summary($outputer, $sNode, $XMLData));
+	
+	# Merge all contigus prints to one.
+	&__MergePrints($XMLData);
+	
+	# Create main content.
+	&__PrintMainContents($document, $outputer, @{$XMLData->Child('__maincontent')});
+	
+	$document->Print();
+	
+	if($ModuleData{updatedxml})
+	{
+	  $xmlfile =~ s/\.xml/_updated\.xml/;
+	  &XMLManip::WriteXMLFile($XMLData, $xmlfile);
+	}
+
+	return ERR::NO_ERROR;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print main contents in output HTML logfile.
+#--------------------------------------------------------------------------------------------------
+sub __PrintMainContents
+{
+	my ($parent, $outputer) = (shift, shift);
+
+	foreach my $xmlNode (@_)
+	{
+		my $maincontent = $outputer->Create('Log::MainContent');
+		$parent->PushChild($maincontent);
+		
+	  my $title = $outputer->Create('Title1', $xmlNode->Attribute('title'));
+	  $maincontent->PushChild($title);
+
+		foreach (@{$xmlNode->Childs()})
+		{
+			no strict 'refs';
+			my $function = $_->Type();
+			&$function($maincontent, $outputer, $_);
+		}
+	}
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print summary in output HTML logfile.
+#--------------------------------------------------------------------------------------------------
+sub __Summary
+{
+  my ($outputer, $sNode, $rootNode) = (shift, shift, shift);
+  my ($title, $table) = (undef, undef);
+
+  my $summary = $outputer->Create('Log::Summary');
+	my $content = $outputer->Create('Log::SummaryContent');
+	$summary->PushChild($content);
+
+  if($sNode)
+  {
+    $title = $outputer->Create('Title1', $sNode->Attribute('title'));
+    $content->PushChild($title);
+    $table = $outputer->Create('Table2D');
+    $content->PushChild($table);
+  
+    foreach (@{$sNode->Child('__elmt')})
+    {
+      my $tag = $outputer->Create('Text', $_->Attribute('tag'));
+      $tag->Style('s_tag');
+      my $val = $outputer->Create('Text', $_->Attribute('val'));
+      $val->Style('s_val');
+      
+      $table->AddLine($tag, $val);
+    }
+    
+    $table->SetColumnAttr(0, { nowrap => 'nowrap', valign => 'top' });
+  }
+  
+  $title = $outputer->Create('Title1', 'Global Statistics');
+  $content->PushChild($title);
+  $table = $outputer->Create('Table2D');
+  $content->PushChild($table);
+  
+  my @texts;
+  my %counts = &__NbMsgGeneric($rootNode);
+  foreach my $type (sort keys %counts)
+  {
+    my $value = $counts{$type};
+    my $text  = $outputer->Create('Text', "$value $type".($value == 1 ? '' : 's'));
+    $text->Style($value ? "gbl_cnt_$type" : 'gbl_cnt_default');
+    
+    push @texts, $text;
+    $ModuleData{types}{$type} = 0;
+  }
+
+  $table->AddLine(@texts);
+  
+  return $summary;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Main content title.
+#--------------------------------------------------------------------------------------------------
+sub __maintitle
+{
+	my ($parent, $outputer, $xmlNode) = (shift, shift, shift);
+	my $titleNode = $outputer->Create('Title1', $xmlNode->Attribute('title'));
+	
+	$parent->PushChild($titleNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print event.
+#--------------------------------------------------------------------------------------------------
+sub __event
+{
+  my ($parent, $outputer, $xmlNode) = (shift, shift, shift);
+  
+  my $eventNode = $outputer->Create('Node', $xmlNode->Attribute('title'));
+  $eventNode->DiscardIfEmpty() if($ModuleData{discard_empty_nodes});
+
+  my %counts = &__NbMsgGeneric($xmlNode);
+  foreach my $type (sort keys %{$ModuleData{types}})
+  {
+    my $value = $counts{$type} || '0';
+    $eventNode->PushNodeInfo("$value $type".($value == 1 ? '' : 's'),
+                             ($value ? "cnt_$type" : 'cnt_default'));
+  }
+  
+  foreach (@{$xmlNode->Childs()})
+  {
+    no strict 'refs';
+    my $function = $_->Type();
+    &$function($eventNode, $outputer, $_); 
+  }
+  
+  $parent->PushChild($eventNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print text with left side icon.
+#--------------------------------------------------------------------------------------------------
+sub __icon_print
+{
+  my ($parent, $outputer, $xmlnode) = (shift, shift, shift);
+  
+  my $text = $outputer->Create('Text', $xmlnode->Content());
+  $text->Style($outputer->GetAssociatedClass($xmlnode->Attribute('icon')));
+  
+  $parent->PushChild($text);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print all other output types.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+	my ($method, $parent, $outputer, $xmlNode) = (our $AUTOLOAD, shift, shift, shift);
+	
+	#print $method, "\n";
+	return if($xmlNode->Type() =~ /^$ModuleData{discard}$/);
+	
+	my $content = $xmlNode->Content();
+
+	if ($content)
+	{
+		$content =~ s/\&lt;b\&gt;/<b>/g;
+		$content =~ s/\&lt;\/b\&gt;/<\/b>/g;
+		$content =~ s/\&lt;i\&gt;/<i>/g;
+		$content =~ s/\&lt;\/i\&gt;/<\/i>/g;
+		$content =~ s/\&lt;u\&gt;/<u>/g;
+		$content =~ s/\&lt;\/u\&gt;/<\/u>/g;
+	}
+	
+	my $text = $outputer->Create('Text', $content);
+	$text->Style($ModuleData{classes}->{$xmlNode->Type()});
+	
+	foreach (@{$xmlNode->Childs()})
+  {
+    no strict 'refs';
+    my $function = $_->Type();
+    &$function($parent, $outputer, $_); 
+  }
+
+	$parent->PushChild($text);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Merge printouts.
+#--------------------------------------------------------------------------------------------------
+sub __MergePrints
+{
+	my ($node, $i) = (shift, 0);
+	my $rCldArray = $node->Childs();
+	
+	while($i != scalar @$rCldArray)
+	{
+	  my ($chStart, $chEnd) = ($$rCldArray[$i], undef);
+	  if($chStart->Type() eq '__print')
+	  {
+	    my $j = $i + 1;
+	    while(($chEnd = $$rCldArray[$j]) && ($chEnd->Type eq '__print'))
+	    { ++$j; }
+	    --$j;
+	    
+	    if($i != $j)
+	    {
+	      my $node    = new XMLManip::Node('__print', $chStart->Attributes());
+	      my $content = '';
+
+	      for my $k ($i .. $j)
+	      { $content .= $$rCldArray[$k]->Content() || ''; }
+	      
+	      $ModuleData{updatedxml} = 1;
+	      $node->Content($content);
+	      splice(@$rCldArray, $i, $j - $i + 1, $node);
+	    }
+	  }
+	  else
+	  {
+	    __MergePrints($chStart) if(scalar @{$chStart->Childs()} != 0);
+	  }
+
+	  ++$i;
+	}
+}
+
+#--------------------------------------------------------------------------------------------------
+# Count number of specific messages in event - Generic version.
+#--------------------------------------------------------------------------------------------------
+sub __NbMsgGeneric
+{
+  my ($node, %counts) = (shift);
+
+  foreach my $child (@{$node->Childs()})
+  {
+    unless(scalar @{$child->Childs()} == 0)
+    {
+      my %res = __NbMsgGeneric($child);
+      
+      foreach my $type (keys %res)
+      {
+        $counts{$type} = ($counts{$type} || 0);
+        $counts{$type} += $res{$type};
+      }
+    }
+
+    next if($child->Type() =~ /^__.*$/);
+    
+    ++$counts{$child->Type()};
+  }
+
+  return %counts;
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+ISIS::Logger2 - An HTML log generator module.
+
+=head1 SYNOPSIS
+
+	use ISIS::Logger2;
+
+	# Set temporary log name, interface, and verbose.
+	OUT2XML::SetXMLLogName('test_log.xml');
+	OUT2XML::SetXMLLogInterface('isis_interface/');
+	OUT2XML::SetXMLLogVerbose('on');
+	
+	# Link a CSS file to the HTML output.
+	OUT2XML::LinkCSSFile('style.css');
+	
+	# Open the log.
+	OUT2XML::OpenXMLLog();
+	
+	# Print a summary.
+	OUT2XML::OpenSummary("Log Summary");
+	OUT2XML::SummaryElmt("Build Type", "Multibase");
+	OUT2XML::SummaryElmt("Used SymbianOS", "value 2");
+	OUT2XML::SummaryElmt("Used Series 60", "value 3");
+	OUT2XML::CloseSummary();
+	
+	# Print a header.
+	OUT2XML::Header("Log File Logger2 Test v".Logger2::ISIS_VERSION, "Started on ".(localtime));
+	
+	# Create a main content.
+	OUT2XML::OpenMainContent("Main Content 2");
+		OUT2XML::OpenEvent("Event 1 : First step");
+		  OUT2XML::Error("This is an error\non two lines");
+		  OUT2XML::OpenEvent("SubEvent 1 : Test");
+		  	OUT2XML::Print("This is simple text");
+		  	OUT2XML::OpenEvent("SubSubEvent 1 : Test");
+		  		OUT2XML::Warning("This is a warning");
+		  		
+		  		OUT2XML::OpenParagraph('bold');
+		  		my @array = ('tom', 'dick', 'harry');
+		  		foreach (@array) { OUT2XML::Print($_."\n"); }
+		  		OUT2XML::CloseParagraph();
+
+		  	OUT2XML::CloseEvent();
+		  OUT2XML::CloseEvent();
+		OUT2XML::CloseEvent();
+		OUT2XML::OpenEvent("Event 2 : Second step");
+			OUT2XML::Print("This is a normal output");
+		OUT2XML::CloseEvent();
+		OUT2XML::OpenEvent("Event 3 : Third step");
+			OUT2XML::Warning("This is a warning");
+		OUT2XML::CloseEvent();
+		OUT2XML::OpenEvent("Event 4 : Fourth step");
+			OUT2XML::Remark("This is a remark");
+		OUT2XML::CloseEvent();
+	OUT2XML::CloseMainContent();
+	
+	# Print a footer.
+	OUT2XML::Footer("Finished on ".(localtime), "No HTML Generation");
+	
+	# Close the temporary log file.
+	OUT2XML::CloseXMLLog();
+
+=head1 DESCRIPTION
+
+The ISIS::Logger2 module provides several packages used to create a complex, 
+well presented and organised log file. There are two packages within this module :
+C<L<OUT2XML>> and C<L<XML2HTML>>. The first one generates an XML file that will
+be parsed by the second one in order to generate the proper output.
+
+The C<L<OUT2XML>> package provides a set of simple subroutines allowing to print
+regular output to the terminal while logging all the information for HTML log
+generation.
+
+The C<L<XML2HTML>> package contains a set of subroutines that shouldn't be called
+directly by the user. It contains a main subroutine 'GenHTMLLogFile' that will
+automatically be called after a call to 'OUT2XML::CloseXMLLog' or 'OUT2XML::Die'.
+This subroutine parses the whole XML generated by OUT2XML and uses the OUT set of
+modules to generate the equivalent HTML output.
+
+=head1 OUT2XML
+
+=head2 SetXMLLogName( STRING ) :
+
+Defines the temporary XML file name. This subroutine should be called before
+'OpenXMLLog';
+
+=head2 SetXMLLogInterface( STRING ) :
+
+Defines the interface root to be used for the HTML log file. This subroutine
+should be called before 'OpenXMLLog';
+
+=head2 SetXMLLogVerbose( STRING ) :
+
+Defines if logged information should be outputed to the terminal/shell. This
+subroutine should be called before 'OpenXMLLog';
+
+=head2 OpenXMLLog( ) :
+
+Opens the XML log - Should be called after 'SetXMLLogName', 'SetXMLLogInterface' and
+'SetXMLLogVerbose'.
+
+=head2 CloseXMLLog( ) :
+
+Close the XML log file. This subroutine will automatically call 'XML2HTML::GenHTMLLogFile'.
+
+=head2 OpenSummary( ) :
+
+If verbose is set for the logger, this will ensure that a call to 'SummaryElmt'
+prints out its content, otherwise, a call to 'SummaryElmt' will have no effect
+on the terminal/shell and will only log its information.
+
+=head2 CloseSummary(  ) :
+
+Ends the verbose of summary elements. See 'OpenSummary' for more information.
+
+=head2 SummaryElmt( NAME, VALUE ) :
+
+Logs a name and its value pair to generate a summary in the outputed HTML file.
+If called between 'OpenSummary' and 'CloseSummary', an additionnal output to the
+terminal/shell will be performed.
+
+=head2 OpenMainContent( STRING ) :
+
+Creates a new main content in which events can be created. All future calls to
+the print out subroutine or events will be encapsulated in that main event until
+a call to 'CloseMainContent' is made.
+
+=head2 CloseMainContent( STRING ) :
+
+Closes the current main content. Note that all events and print out subroutine
+calls will be discarded.
+
+=head2 OpenEvent( STRING ) :
+
+Creates a new event in which other events and print out subroutine calls can be
+made. These events will hide their content until they are clicked on, allowing
+the final log user to decide what information to display.
+
+=head2 CloseEvent( STRING ) :
+
+Closes the current event. All events and print out subroutine calls will be passed
+to the containing main content or event.
+
+=head2 OpenParagraph( STYLE ) :
+
+This will open a paragraph, and all calls to 'OUT2XML::Print' will be encapsulated in
+one HTML div element. The optional style argument will be set as the class of the div
+element allowing to modify the text's appearence with a css. The 'OUT2XML::Print'
+subroutine can still be called normally.
+
+=head2 CloseParagraph(  ) :
+
+Closes the current paragraph, returning to the previously opened and not closed node.
+
+=head2 Print( STRING ) :
+
+Prints out regular text to the log file. This text will be discarded if not done
+in a main content, event or paragraph. If this subroutine is called outside of a
+paragraph, an automatic paragraph will be generated for this text. Prefer using
+'OUT2XML::OpenParagraph' and 'OUT2XML::CloseParagraph' when calling 'OUT2XML::Print'
+several times in a row.
+
+=head2 <NAME>( STRING, [ERROR_CODE] ) :
+
+Prints out a message as a NAME - The message will be encapsulated in a <div> HTML
+element with a class attribute matching that name. The corresponding CSS file that
+is set with 'SetXMLLogInterface' can have the equivalent definitions to format these
+HTML elements.
+
+If an error code is specified, a call to 'Die' will be made terminating the current
+script.
+
+=head2 Die( STRING, [ERROR_CODE] ) :
+
+Kills the current script execution. Only calls to 'Die' should be made in a script
+using this Logger. Calling subroutines such as 'exit' or 'die' will corrupt the xml
+log file and make the HTML generation impossible.
+
+=head1 XML2HTML
+
+=head2 GenHTMLLogFile( XMLFILE ) :
+
+Generates an HTML log file from an XML log file created by the C<L<OUT2XML>> package.
+See information regarding the C<L<OUT2XML>> package of the ISIS::Logger2 module.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Logger3.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1348 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : Logger3.pm
+# Use    : ISIS Logging module.
+
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+# v3.1.6 (23/05/2006)
+#  - Updated footer message to always specify version of used logger3.
+#  - Updated Header and Footer subroutines to avoid multiple <header> and <footer> nodes.
+#  - Updated CloseXMLLog to create default header and footer if none specified.
+#  - Moved creation of summary node in OpenXMLLog subroutine.
+#
+# v3.1.5 (06/04/2006)
+#  - Reworte the way user defined CSS files are handled to make sure they are the last ones
+#    included in the document body to allow overwriting of certain values.
+#
+# v3.1.4 (05/04/2006)
+#  - Updated OUT2XML to store CSS and JS files in arrays and keep order.
+#  - Updated XML2HTML to store CSS and JS files in arrays and keep order.
+#
+# v3.1.3 (28/03/2006)
+#  - Implement custom outputer for header and footer,
+#  - Implement PrintRawXHTML to write directly XHTML content (To be used carefully).
+#  - Added AppendXmlNode
+#
+# v3.1.2 (20/03/2006)
+#  - Updated Header and Footer subroutines to display titles in verbose mode.
+#  - Minor changes to the script.
+#
+# v3.1.1 (17/03/2006)
+#  - Updated the names of both OUT2XML and XML2HTML to be sub modules of Logger3.
+#
+# v3.1.0 (15/03/2006)
+#  - Updated IconPrint subroutine to printout to shell its text if in verbose mode.
+#  - Updated OpenEvent to allow makeup for node HTML look.
+#  - Added PrintToShell subroutine to OUT2XML package with corresponding changes to XML2HTML.
+#  - Added Separator subroutine to OUT2XML package with corresponding changes to XML2HTML.
+#
+# v3.0.0 (06/02/2006)
+#  - Updated 'OUT2XML' and 'XML2HTML' to be instanciable packages and allow multiple logs at once.
+#
+# v2.2.0 (27/01/2006)
+#  - Rewrote XML2HTML package :
+#    - Corrected event printout.
+#    - Added special message count.
+#    - Added global special message count.
+#    - Errors, Warnings, Remarks and Notes now have Ids.
+#    - Any type of specific message is printed.
+#
+# v2.1.1 (13/01/2006)
+#  - Updated Die subroutine to print line and file if specified.
+#
+# v2.1.0 (11/01/2006)
+#  - Updated 'OUT2XML' package with following changes :
+#    - General print messages handled by 'AUTOLOAD' now print all their arguments.
+#      The same calls should be replaced by a extra call to 'Die'.
+#    - 'PrintBold' is now depreciated and should be replaced by formatting tags.
+#    - 'PrintItalic' is now depreciated and should be replaced by formatting tags.
+#    - 'PrintUnderline' is now depreciated and should be replaced by formatting tags.
+#    - 'OpenParagraph' and 'CloseParagraph' are now depreciated and should be removed.
+#  - Updated 'XML2HTML' package with following changes :
+#    - contigus 'print' nodes will be printed in one block.
+#
+# v2.0.0 (13/12/2005)
+#  - Updated module to use ISIS::XMLManip.
+#  - Added 'OpenParagraph' and 'CloseParagraph' subroutines to OUT2XML.
+#  - Added 'LinkCSSFile' subroutine to OUT2XML.
+#  - Added 'DiscardMessageType' subroutine to OUT2XML.
+#
+# v1.2.0 (07/11/2005)
+#  - Fixed event id
+#
+# v1.1.0 (30/09/2005)
+#  - Added C++ formatting routines.
+#  - Added OUT2XML::IncludeCPP to include file in log.
+#  - Added XML2HTML::cpp_include to parse corresponding XML tag.
+#
+# v1.0.0 (20/09/2005)
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+
+#--------------------------------------------------------------------------------------------------
+#
+#  Logger3::OUT2XML package.
+#
+#--------------------------------------------------------------------------------------------------
+package Logger3::OUT2XML;
+
+use strict;
+use warnings;
+use ISIS::ErrorDefs;
+use ISIS::XMLManip;
+use ISIS::HttpServer;
+use ISIS::Assertion _DEBUG => 1;
+
+use constant ISIS_VERSION     => '3.1.6';
+use constant ISIS_LAST_UPDATE => '23/05/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  my ($class, $xml, $verbose, $interface) = (shift, shift || '', shift || 0, shift || HttpServer::GetAddress().'/isis_interface');
+  my (@parents, @stylesheets, @javascripts);
+  my $html = $xml;
+  
+  if($xml ne '')
+  {
+    $xml  .= '.xml'  unless($xml =~ /\.xml$/i);
+    $html .= '.html' unless($html =~ s/\.xml$/\.html/);
+  }
+  
+  bless { __html_name    => $html,       # html output file name.
+          __xml_name     => $xml,        # xml temp log file name.
+          __interface    => $interface,  # interface (css, javascript, images, ...).
+          __verbose      => $verbose,    # output to shell.
+        	__css_dep      => \@stylesheets, # CSS dependancies.
+          __jsc_dep      => \@javascripts, # Javascript dependancies.
+
+          __discards     => '',          # message types to discard.
+          __associations => {},          # message types to css class associations.
+          __step         => 0,           # unique id attributed to each node in the xml.
+          __has_header   => 0,             # flag to check if a generic header is necessary.
+          __has_footer   => 0,             # flag to check if a generic footer is necessary.
+          __is_generated => 0,           # flag to check correct html output file generation.
+
+          __root_node    => undef,       # xml temp log root node.
+          __summary_node => undef,       # summary node.
+          __current_node => undef,       # current node when creating xml tree.
+          __parent_nodes => \@parents,   # stack containing parent nodes of current node.
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetXMLLogName
+#--------------------------------------------------------------------------------------------------
+sub SetXMLLogName
+{
+  my ($self, $html) = (shift, shift);
+  
+  my $xml = $html;
+
+  $xml  .= '.xml'  unless($xml =~ /\.xml$/i);
+  $html .= '.html' unless($html =~ s/\.xml$/\.html/);
+
+  $self->{__html_name} = $html;
+  $self->{__xml_name}  = $xml;
+  
+  __ASSERT($self->{__html_name} ne $self->{__xml_name});
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetXMLLogVerbose
+#--------------------------------------------------------------------------------------------------
+sub SetXMLLogVerbose
+{
+  my ($self, $verbose) = (shift, shift);
+  
+  $self->{__verbose} = ($verbose =~ /(?:on|yes|1)/i) ? 1 : 0;
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetXMLLogInterface    
+#--------------------------------------------------------------------------------------------------
+sub SetXMLLogInterface
+{
+  my ($self, $interface) = (shift, shift);
+  
+  $interface =~ s/\\$//;
+  $self->{__interface} = $interface;
+}
+
+#--------------------------------------------------------------------------------------------------
+# LinkCSSFile
+#--------------------------------------------------------------------------------------------------
+sub LinkCSSFile
+{
+  my ($self, $file) = (shift, shift);
+  
+  foreach my $css (@{$self->{__css_dep}})
+  { return if($css eq $file); }
+  
+  push @{$self->{__css_dep}}, $file;
+}
+
+#--------------------------------------------------------------------------------------------------
+# LinkJavascriptFile
+#--------------------------------------------------------------------------------------------------
+sub LinkJSCFile
+{
+  my ($self, $file) = (shift, shift);
+  
+  foreach my $js (@{$self->{__jsc_dep}})
+  { return if($js eq $file); }
+  
+  push @{$self->{__jsc_dep}}, $file;
+}
+
+#--------------------------------------------------------------------------------------------------
+# DiscardMessageTypes
+#--------------------------------------------------------------------------------------------------
+sub DiscardMessgeTypes
+{
+  my ($self) = (shift);
+  
+  $self->{__discards} = join('|', @_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# AssociateMessageToClass
+#--------------------------------------------------------------------------------------------------
+sub AssociateMessageToClass
+{
+  my ($self, $type, $class) = (shift, shift, shift);
+  
+  $self->{__associations}->{lc($type)} = $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenXMLLog
+#--------------------------------------------------------------------------------------------------
+sub OpenXMLLog
+{
+  my ($self) = (shift);
+
+  __ASSERT($self->{__xml_name}  =~ /\.xml/i);
+  __ASSERT($self->{__html_name} =~ /\.html/i);
+
+	# create root node.
+	$self->{__root_node} = new XMLManip::Node('__log', { date => scalar(localtime),
+	                                                     interface => $self->{__interface} });
+	
+	# create summary node.
+	$self->{__summary_node} = new XMLManip::Node('__summary');
+	$self->{__summary_node}->Comment(" +++ SUMMARY +++ ");
+	
+	$self->{__root_node}->Comment("  Name : ".$self->{__xml_name}."\n  Use  : Temporary XML log file - Generated by OUT2XML");
+	$self->{__current_node} = $self->{__root_node};
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseXMLLog
+#--------------------------------------------------------------------------------------------------
+sub CloseXMLLog
+{
+  my ($self) = (shift);
+  
+  $self->{__root_node}->PushChild($self->{__summary_node}) if($self->{__summary_node});
+  
+  $self->Header();
+  $self->Footer();
+  
+	foreach my $name ( keys ( %{$self->{__customize_outputer}}) )
+	{
+		my $custom = new XMLManip::Node('__customoutputer');
+		$custom->Attribute('type',$name);
+		$custom->Attribute('module',$self->{__customize_outputer}{$name}{module});
+		foreach (@{$self->{__customize_outputer}{$name}{config}})
+		{
+			$custom->PushChild($_);
+		}
+		$self->{__root_node}->PushChild($custom);
+	}
+	
+  XMLManip::WriteXMLFile($self->{__root_node}, $self->{__xml_name});
+  
+  my $logger = Logger3::XML2HTML->new($self->{__xml_name}, $self->{__html_name}, $self->{__discards});
+  
+  foreach (keys %{$self->{__associations}})
+  { $logger->AssociateMessageToClass($_, $self->{__associations}->{$_}); }
+  
+  foreach my $css (@{$self->{__css_dep}})
+  { $logger->LinkCSSFile($css); }
+  
+  foreach my $js (@{$self->{__jsc_dep}})
+  { $logger->LinkJSCFile($js); }
+  
+  $logger->Generate();
+  $self->{__is_generated} = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenSummary
+#--------------------------------------------------------------------------------------------------
+sub OpenSummary
+{
+  my ($self, $title) = (shift, shift);
+  
+	$self->{__summary_node}->Attribute('title', $title);
+  $self->{__in_summary} = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseSummary
+#--------------------------------------------------------------------------------------------------
+sub CloseSummary
+{
+  my ($self) = (shift);
+  
+	$self->{__in_summary} = 0;
+}
+
+#--------------------------------------------------------------------------------------------------
+# SummaryElmt
+#--------------------------------------------------------------------------------------------------
+sub SummaryElmt
+{
+  my ($self, $tag, $val) = (shift, shift, shift);
+  
+  $tag =~ s/\n//g;
+  $val =~ s/\n//g;
+  
+  if($self->{__verbose} && $self->{__in_summary})
+  { print '  ', $tag, " : ", $val, "\n"; } # STDOUT
+
+  $self->{__summary_node}->PushChild(new XMLManip::Node('__elmt', { tag => $tag, val => $val }));
+}
+
+#--------------------------------------------------------------------------------------------------
+# SetCustomModule
+#--------------------------------------------------------------------------------------------------
+sub SetCustomModule($$$)
+{
+	my ($self, $name, $module, $customConfigNode) = (shift, shift, shift, shift);
+	$self->{__customize_outputer} { $name }{module} = $module;
+	$self->{__customize_outputer} { $name }{config} = $customConfigNode;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Header
+#--------------------------------------------------------------------------------------------------
+sub Header
+{
+  my ($self, $title, $subtitle) = (shift, shift, shift);
+  
+  return if($self->{__has_header} == 1);
+  
+  $title    = $self->{__html_name} unless(defined $title);
+  $subtitle = 'Started on '.(localtime) unless(defined $subtitle);
+  
+  if($self->{__verbose})
+  {
+  	$self->PrintToShell("---------------------------------------------------------------------\n\n",
+  	                    '          ', uc($title), "\n",
+  	                    '          ', lc($subtitle), "\n\n",
+  	                    "---------------------------------------------------------------------\n");
+  }
+
+  my $headerNode = new XMLManip::Node('__header', { title => $title, subtitle => $subtitle });
+	$headerNode->Comment(" +++ HEADER +++ ");
+	
+  $self->{__root_node}->PushChild($headerNode);
+  $self->{__has_header} = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Footer
+#--------------------------------------------------------------------------------------------------
+sub Footer
+{
+  my ($self, $title, $subtitle) = (shift, shift, shift || '');
+  
+  return if($self->{__has_footer} == 1);
+  
+  $title     = 'Finished on '.(localtime) unless(defined $title);
+  $subtitle .= ' - ' if($subtitle ne '');
+  $subtitle .= 'Generated by Logger v'.ISIS_VERSION.' ('.ISIS_LAST_UPDATE.')';
+
+  if($self->{__verbose})
+  {
+  	$self->PrintToShell("---------------------------------------------------------------------\n",
+  	                    '  ', lc($title), "\n",
+  	                    '  ', lc($subtitle), "\n");
+  }
+  
+  my $footerNode = new XMLManip::Node('__footer', { title => $title, subtitle => $subtitle });
+  $footerNode->Comment(" +++ FOOTER +++ ");
+
+  $self->{__root_node}->PushChild($footerNode);
+  $self->{__has_footer} = 1;
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenMainContent
+#--------------------------------------------------------------------------------------------------
+sub OpenMainContent
+{ 
+  my ($self, $title) = (shift, shift);
+  
+  ++$self->{__step};
+
+  my $contentNode = new XMLManip::Node('__maincontent', { title => $title, step => $self->{__step} });
+	$contentNode->Comment(" +++ MAIN CONTENT +++ ");
+	
+	if($self->{__verbose})
+  {
+  	$self->PrintToShell("---------------------------------------------------------------------\n",
+  	                    '  ', lc($title), "\n",
+  	                    "---------------------------------------------------------------------\n");
+  }
+
+  push @{$self->{__parent_nodes}}, $self->{__current_node};
+  $self->{__current_node}->PushChild($contentNode);
+  $self->{__current_node} = $contentNode;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseMainContent
+#--------------------------------------------------------------------------------------------------
+sub CloseMainContent
+{
+  my ($self) = (shift);
+  
+  $self->{__current_node} = pop @{$self->{__parent_nodes}};
+}
+
+#--------------------------------------------------------------------------------------------------
+# MainTitle
+#--------------------------------------------------------------------------------------------------
+sub MainTitle
+{
+	my ($self, $title) = (shift, shift);
+	
+	++$self->{__step};
+
+	my $titleNode = new XMLManip::Node('__maintitle', { title => $title, step => $self->{__step} });
+	$titleNode->Comment(" +++ ".uc($title)." +++ ");
+	
+	$self->{__current_node}->PushChild($titleNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Separator
+#--------------------------------------------------------------------------------------------------
+sub Separator
+{
+	my ($self, $style) = (shift, shift || 'separator');
+	
+	++$self->{__step};
+	
+	my $separatorNode = new XMLManip::Node('__separator', { style => $style, step => $self->{__step}});
+	$self->{__current_node}->PushChild($separatorNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenEvent
+#--------------------------------------------------------------------------------------------------
+sub OpenEvent
+{
+	my ($self, $title, $makeup) = (shift, shift, shift || {});
+  
+  ++$self->{__step};
+  
+  my $eventNode = new XMLManip::Node('__event');
+  $eventNode->Attribute('icon', $makeup->{icon}) if(exists $makeup->{icon});
+  $eventNode->Attribute('anim', $makeup->{anim} || 'button');
+  $eventNode->Attribute('title', $title);
+  $eventNode->Attribute('time', scalar(localtime));
+  $eventNode->Attribute('step', $self->{__step});
+
+  if($self->{__verbose})
+  {
+    $self->PrintToShell("----------------------------------------------------------------------------\n",
+                        " + ", $title, "\n");
+  }
+
+  push @{$self->{__parent_nodes}}, $self->{__current_node};
+  $self->{__current_node}->PushChild($eventNode);
+  $self->{__current_node} = $eventNode;
+}
+
+#--------------------------------------------------------------------------------------------------
+# CloseEvent
+#--------------------------------------------------------------------------------------------------
+sub CloseEvent
+{
+  my ($self) = (shift);
+  
+  $self->{__current_node} = pop @{$self->{__parent_nodes}};
+}
+
+
+sub PrintRawXHTML
+{
+	my ($self,  $text) = (shift, join('', @_));
+  
+  ++$self->{__step};
+  $self->PrintToShell($text);
+  
+  my $node = new XMLManip::Node('__print');
+  $node->Attribute('time', scalar(localtime));
+  $node->Attribute('step', $self->{__step});
+  $node->Content($text);
+
+  $self->{__current_node}->PushChild($node);	
+}
+
+#--------------------------------------------------------------------------------------------------
+# AUTOLOAD (For text output : Print, Error, Warning, Remark, Note).
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($self, $method, $text) = (shift, our $AUTOLOAD, join('', @_));
+  my ($type) = ($method =~ /OUT2XML::(.+?)$/);
+  
+  return unless (defined($text) or ($type !~ /^$self->{__discards}$/i));
+  
+  ++$self->{__step};
+  
+  $self->PrintToShell($text);
+  
+  $type = '__'.$type if($type =~ /^print$/i);
+  $text =~ s/\n/<br\/>/g;
+
+  my $node = new XMLManip::Node(lc($type));
+  $node->Attribute('time', scalar(localtime));
+  $node->Attribute('step', $self->{__step});
+  $node->Content($text);
+
+  $self->{__current_node}->PushChild($node);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Depreciated Print Subroutines - Should be replaced with formatting tags in regular 'Print'.
+#--------------------------------------------------------------------------------------------------
+sub PrintBold
+{ # For backwards compatibility
+  warn "subroutine \'PrintBold\' is depreciated: please update your script and add formatting tags\n";
+	OUT2XML::Print('<b>', @_, '</b>');
+}
+
+sub PrintItalic
+{ # For backwards compatibility
+  warn "subroutine \'PrintItalic\' is depreciated: please update your script and add formatting tags\n";
+	OUT2XML::Print('<i>', @_, '</i>');
+}
+
+sub PrintUnderline
+{ # For backwards compatibility
+  warn "subroutine \'PrintUnderline\' is depreciated: please update your script and add formatting tags\n";
+	OUT2XML::Print('<u>', @_, '</u>');
+}
+
+#--------------------------------------------------------------------------------------------------
+# OpenParagraph and CloseParagraph.
+#--------------------------------------------------------------------------------------------------
+sub OpenParagraph
+{ warn "subroutine \'OpenParagraph\' is depreciated: please update your script\n"; }
+
+sub CloseParagraph
+{ warn "subroutine \'CloseParagraph\' is depreciated: please update your script\n"; }
+
+#--------------------------------------------------------------------------------------------------
+# IconText
+#--------------------------------------------------------------------------------------------------
+sub IconPrint
+{
+  my ($self, $icon, $text) = (shift, shift, join('', @_));
+  
+  ++$self->{__step};
+  
+  $self->PrintToShell($text);
+
+  my $node = new XMLManip::Node('__icon_print');
+  $node->Attribute('icon', $icon);
+	$node->Attribute('time', scalar(localtime));
+  $node->Attribute('step', $self->{__step});
+  $node->Content($text);
+  $self->{__current_node}->PushChild($node);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Execute - This doesn't seem to work on version 5.6.1 of perl.
+#--------------------------------------------------------------------------------------------------
+sub Execute
+{
+  my ($self, $command) = (shift, shift);
+  my $pid = open3(*CMD_IN, *CMD_OUT, *CMD_ERR, $command);
+  
+  close(CMD_IN);
+  
+  my $selector = IO::Select->new();
+  $selector->add(*CMD_OUT, *CMD_ERR);
+  
+  while(my @ready = $selector->can_read())
+  {
+    foreach my $fh (@ready)
+    {
+      $self->Error(scalar <CMD_ERR>) if(fileno($fh) == fileno(CMD_ERR));
+      $self->Print(scalar <CMD_OUT>) if(fileno($fh) == fileno(CMD_OUT));
+      $selector->remove($fh) if eof($fh);
+    } 
+  }
+  
+  close(CMD_OUT);
+  close(CMD_ERR);
+  waitpid($pid, 0);
+}
+
+#--------------------------------------------------------------------------------------------------
+# AppendXmlNode to the structure
+#--------------------------------------------------------------------------------------------------
+sub AppendXmlNode
+{
+	my ($self, $node)	= (shift, shift);	
+	$self->{__current_node}->PushChild($node);		
+}
+
+#--------------------------------------------------------------------------------------------------
+# IncludeCPP
+#--------------------------------------------------------------------------------------------------
+sub IncludeCPP
+{
+	my ($self, $file, $line, $width) = (shift, shift, shift, shift);
+	
+	++$self->{__step};
+	
+	my $cppNode = new XMLManip::Node('__cpp_include');
+	$cppNode->Attribute('file', $file);
+	$cppNode->Attribute('line', $line);
+	$cppNode->Attribute('width', $width);
+	$cppNode->Attribute('step', $self->{__step});
+	
+	$self->{__current_node}->PushChild($cppNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Die
+#--------------------------------------------------------------------------------------------------
+sub Die
+{
+  my ($self, $errCode, $message) = (shift, shift);
+  my ($pkg, $file, $line) = caller;
+
+  if($file and $line){ $message = $errCode." : ".ERR::GetError($errCode)." in file \'".$file."\' at line \'".$line."\'"; }
+  else               { $message = $errCode." : ".ERR::GetError($errCode); }
+
+  $self->Footer("Finished on ".scalar(localtime), "call to OUT2XML::Die( ".$message." )");
+  $self->CloseXMLLog();
+
+  exit($errCode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Make sure html output is generated.
+#--------------------------------------------------------------------------------------------------
+sub DESTROY
+{
+  my ($self) = (shift);
+
+	unless($self->{__is_generated})
+	{
+		$self->Footer("Finished on ".scalar(localtime));
+  	$self->CloseXMLLog();
+	}
+}
+
+#--------------------------------------------------------------------------------------------------
+# PrintToShell
+#--------------------------------------------------------------------------------------------------
+sub PrintToShell
+{
+	my ($self, $text) = (shift, join('', @_));
+	
+  if($text =~ s/\[bold\](.*?)\[\/bold\]/<b>$1<\/b>/g)
+  { warn "formatting [bold] ... [/bold] is depreciated: please update your script to use <b> and </b>\n"; }
+  
+  if($text =~ s/\[italic\](.*?)\[\/italic\]/<i>$1<\/i>/g)
+  { warn "formatting [italic] ... [/italic] is depreciated: please update your script to use <i> and </i>\n"; }
+  
+  if($text =~ s/\[underline\](.*?)\[\/underline\]/<u>$1<\/u>/g)
+  { warn "formatting [underline] ... [/underline] is depreciated: please update your script to use <u> and </u>\n"; }
+                                                            
+  if($self->{__verbose})                                  
+  {                                                         
+    my $rawText = $text;                                    
+   	$rawText =~ s/\<b>//g;
+  	$rawText =~ s/\<\/b>//g;
+  	$rawText =~ s/\<i>//g;
+  	$rawText =~ s/\<\/i>//g;
+  	$rawText =~ s/\<u>//g;
+  	$rawText =~ s/\<\/u>//g;
+    
+    print "$rawText";
+  }
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#  XML2HTML package.
+#
+#--------------------------------------------------------------------------------------------------
+package Logger3::XML2HTML;
+
+use strict;
+use warnings;
+use ISIS::XMLManip;
+use ISIS::HTMLmanip;
+use ISIS::ErrorDefs;
+use ISIS::Assertion _DEBUG => 1;
+
+use constant ISIS_VERSION     => '3.1.5';
+use constant ISIS_LAST_UPDATE => '06/04/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  my ($class, $xmlfile, $htmlfile, $discard) = (shift, shift, shift, shift || '');
+  my (@stylesheets, @javascripts);
+  
+  bless { __xml_name     => $xmlfile,
+          __html_name    => $htmlfile,
+          __discards     => $discard,
+         	__css_dep      => \@stylesheets,
+          __jsc_dep      => \@javascripts,
+          __associations => {},
+          __outputer     => undef,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# LinkCSSFile
+#--------------------------------------------------------------------------------------------------
+sub LinkCSSFile
+{
+  my ($self, $file) = (shift, shift);
+  
+  foreach my $css (@{$self->{__css_dp}})
+  { return if($css == $file); }
+  
+	push @{$self->{__css_dep}}, $file;
+}
+
+#--------------------------------------------------------------------------------------------------
+# LinkJavascriptFile
+#--------------------------------------------------------------------------------------------------
+sub LinkJSCFile
+{
+  my ($self, $file) = (shift, shift);
+  
+	foreach my $js (@{$self->{__jsc_dep}})
+	{ return if($js == $file); }
+	
+	push @{$self->{__jsc_dep}}, $file;
+}
+
+#--------------------------------------------------------------------------------------------------
+# AssociateMessageToClass
+#--------------------------------------------------------------------------------------------------
+sub AssociateMessageToClass
+{
+  my ($self, $type, $class) = (shift, shift, shift);
+  
+  $self->{__associations}->{lc($type)} = $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# GenHTMLLogFile : Only subroutine to be called.
+#--------------------------------------------------------------------------------------------------
+sub Generate
+{
+  my ($self, $ostream) = (shift);
+  
+  open($ostream, '>'.$self->{__html_name}) or return ERR::FILE_CREATION_FAILED;
+  
+  $self->{__xml_data} = XMLManip::ParseXMLFile($self->{__xml_name});
+  my $outputer = new HTMLManip($ostream, 'configuration.xml', $self->{__xml_data}->Attribute('interface') || '');
+  
+  $self->{__outputer} = $outputer;
+  
+  foreach my $css (@{$self->{__css_dep}})
+  { $outputer->UserRequireCSSFile($css); }
+  
+  foreach my $js (@{$self->{__jsc_dep}})
+  { $outputer->UserRequireJSFile($js); }
+
+  # Create document.
+  my $document = $outputer->Create('Log::Document');
+
+	my %CustomOutputer;
+	foreach my $c (@{$self->{__xml_data}->Child('__customoutputer')})
+	{
+		$CustomOutputer{ $c->Attribute('type') }{ module } = $c->Attribute('module');
+		$CustomOutputer{ $c->Attribute('type') }{ config } = $c;
+	}
+
+  # Create header.
+  my $hNode = ${$self->{__xml_data}->Child('__header')}[0];
+	if($hNode)
+	{
+	  	if ($CustomOutputer{'__header'})
+	  	{
+			$document->Header($outputer->Create( $CustomOutputer{'__header'}{module},
+	                                    $hNode->Attribute('title'),
+	                                    $hNode->Attribute('subtitle'),
+	                                    $CustomOutputer{'__header'}{config}));
+
+	  	}
+	  	else
+	  	{
+			$document->Header($outputer->Create( 'Log::Header',
+	                                    $hNode->Attribute('title'),
+	                                    $hNode->Attribute('subtitle')));
+	  	}
+ 	}
+
+	# Create footer.
+  my $fNode = ${$self->{__xml_data}->Child('__footer')}[0];
+	if ($fNode)
+	{
+	 	if ($CustomOutputer{'__footer'})
+	  	{
+			$document->Footer($outputer->Create( $CustomOutputer{'__footer'}{module},
+	                                    $fNode->Attribute('title'),
+	                                    $fNode->Attribute('subtitle'),
+	                                    $CustomOutputer{'__footer'}{config}));
+
+	  	}
+	  	else
+	  	{
+			$document->Footer($outputer->Create('Log::Footer',
+	                                    $fNode->Attribute('title'),
+	                                    $fNode->Attribute('subtitle')));
+	  	}
+	}
+
+	# Create summary
+	my $sNode = ${$self->{__xml_data}->Child('__summary')}[0];
+	$document->Summary($self->__Summary($sNode));
+
+	# Merge all contigus prints to one.
+	$self->__MergePrints($self->{__xml_data});
+
+	# Create main content.
+	$self->__PrintMainContents($document, @{$self->{__xml_data}->Child('__maincontent')});
+
+	$document->Print();
+	
+	if($self->{__updated_xml})
+	{
+	  $self->{__xml_name} =~ s/\.xml/_updated\.xml/;
+	  XMLManip::WriteXMLFile($self->{__xml_data}, $self->{__xml_name});
+	}
+
+	return ERR::NO_ERROR;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print main contents in output HTML logfile.
+#--------------------------------------------------------------------------------------------------
+sub __PrintMainContents
+{
+	my ($self, $parent) = (shift, shift);
+	my $outputer = $self->{__outputer};
+
+	foreach my $xmlNode (@_)
+	{
+		my $maincontent = $outputer->Create('Log::MainContent');
+		$parent->PushChild($maincontent);
+		
+		if($xmlNode->Attribute('title'))
+		{
+	  	my $title = $outputer->Create('Title1', $xmlNode->Attribute('title'));
+	  	$maincontent->PushChild($title);
+		}
+
+		foreach (@{$xmlNode->Childs()})
+		{
+			no strict 'refs';
+			my $function = $_->Type();
+			$self->$function($maincontent, $_);
+		}
+	}
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print summary in output HTML logfile.
+#--------------------------------------------------------------------------------------------------
+sub __Summary
+{
+  my ($self, $sNode) = (shift, shift);
+  my ($outputer, $title, $table) = ($self->{__outputer}, undef, undef);
+
+  my $summary = $outputer->Create('Log::Summary');
+	my $content = $outputer->Create('Log::SummaryContent');
+	$summary->PushChild($content);
+
+  if($sNode)
+  {
+    $title = $outputer->Create('Title1', $sNode->Attribute('title'));
+    $content->PushChild($title);
+    $table = $outputer->Create('Table2D');
+    $content->PushChild($table);
+  
+    foreach (@{$sNode->Child('__elmt')})
+    {
+      my $tag = $outputer->Create('Text', $_->Attribute('tag'));
+      $tag->Style('s_tag');
+      my $val = $outputer->Create('Text', $_->Attribute('val'));
+      $val->Style('s_val');
+      
+      $table->AddLine($tag, $val);
+    }
+    
+    $table->SetColumnAttr(0, { nowrap => 'nowrap', valign => 'top' });
+    $table->SetColumnAttr(1, { width => '100%' });
+  }
+  
+  $title = $outputer->Create('Title1', 'Global Statistics');
+  $content->PushChild($title);
+  $table = $outputer->Create('Table2D');
+  $content->PushChild($table);
+  
+  my @texts;
+  my %counts = __NbMsgGeneric($self->{__xml_data});
+  foreach my $type (sort keys %counts)
+  {
+    my $value = $counts{$type};
+    my $text  = $outputer->Create('Text', "$value $type".($value == 1 ? '' : 's'));
+    $text->Style($value ? "gbl_cnt_$type" : 'gbl_cnt_default');
+    
+    push @texts, $text;
+    $self->{__types}->{$type} = 0;
+  }
+
+  $table->AddLine(@texts);
+  
+  return $summary;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Main content title.
+#--------------------------------------------------------------------------------------------------
+sub __maintitle
+{
+	my ($self, $parent, $xmlNode) = (shift, shift, shift);
+	my $outputer  = $self->{__outputer};
+	my $titleNode = $outputer->Create('Title1', $xmlNode->Attribute('title'));
+	
+	$parent->PushChild($titleNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print event.
+#--------------------------------------------------------------------------------------------------
+sub __event
+{
+  my ($self, $parent, $xmlNode) = (shift, shift, shift);
+  my $outputer = $self->{__outputer};
+  
+  my $eventNode = $outputer->Create('Node', $xmlNode->Attribute('title'),
+  																					{ anim => $xmlNode->Attribute('anim'),
+                                              icon => $xmlNode->Attribute('icon') });
+
+  my %counts = __NbMsgGeneric($xmlNode);
+  foreach my $type (sort keys %{$self->{__types}})
+  {
+    my $value = $counts{$type} || '0';
+    $eventNode->PushNodeInfo("$value $type".($value == 1 ? '' : 's'),
+                             ($value ? "cnt_$type" : 'cnt_default'));
+  }
+  
+  foreach (@{$xmlNode->Childs()})
+  {
+    no strict 'refs';
+    my $function = $_->Type();
+    $self->$function($eventNode, $_); 
+  }
+  
+  $parent->PushChild($eventNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print text with left side icon.
+#--------------------------------------------------------------------------------------------------
+sub __icon_print
+{
+  my ($self, $parent, $xmlnode) = (shift, shift, shift);
+  my $outputer = $self->{__outputer};
+  
+  my $content = $xmlnode->Content();
+
+	if ($content)
+	{
+		$content =~ s/\&lt;b\&gt;/<b>/g;
+		$content =~ s/\&lt;\/b\&gt;/<\/b>/g;
+		$content =~ s/\&lt;i\&gt;/<i>/g;
+		$content =~ s/\&lt;\/i\&gt;/<\/i>/g;
+		$content =~ s/\&lt;u\&gt;/<u>/g;
+		$content =~ s/\&lt;\/u\&gt;/<\/u>/g;
+		$content =~ s/\&lt;br\/\&gt;/\n/g;
+	}
+	
+	my $text = $outputer->Create('Text', $content);
+  $text->Style($outputer->GetAssociatedClass($xmlnode->Attribute('icon')));
+  
+  $parent->PushChild($text);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print separators.
+#--------------------------------------------------------------------------------------------------
+sub __separator
+{
+	my ($self, $parent, $xmlNode) = (shift, shift, shift);
+	my $outputer = $self->{__outputer};
+	
+	my $separator = $outputer->Create('Separator', $xmlNode->Attribute('style'));
+	$parent->PushChild($separator);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print all other output types.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+	my ($method, $self, $parent, $xmlNode) = (our $AUTOLOAD, shift, shift, shift);
+	my $outputer = $self->{__outputer};
+
+	return if($method =~ /::DESTROY$/ or $xmlNode->Type() =~ /^$self->{__discards}$/i);
+	
+	my $content = $xmlNode->Content();
+
+	if ($content)
+	{
+		$content =~ s/\&lt;b\&gt;/<b>/g;
+		$content =~ s/\&lt;\/b\&gt;/<\/b>/g;
+		$content =~ s/\&lt;i\&gt;/<i>/g;
+		$content =~ s/\&lt;\/i\&gt;/<\/i>/g;
+		$content =~ s/\&lt;u\&gt;/<u>/g;
+		$content =~ s/\&lt;\/u\&gt;/<\/u>/g;
+		$content =~ s/\&lt;br\/\&gt;/\n/g;
+	}
+	
+	my $text = $outputer->Create('Text', $content);
+	$text->Style($self->{__associations}->{$xmlNode->Type()} ||
+	             $outputer->GetAssociatedClass($xmlNode->Type()));
+	
+	foreach (@{$xmlNode->Childs()})
+  {
+    no strict 'refs';
+    my $function = $_->Type();
+    $self->$function($parent, $_); 
+  }
+
+	$parent->PushChild($text);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Merge printouts.
+#--------------------------------------------------------------------------------------------------
+sub __MergePrints
+{
+	my ($self, $node, $i) = (shift, shift, 0);
+	my $rCldArray = $node->Childs();
+	
+	while($i != scalar @$rCldArray)
+	{
+	  my ($chStart, $chEnd) = ($$rCldArray[$i], undef);
+	  if($chStart->Type() eq '__print')
+	  {
+	    my $j = $i + 1;
+	    while(($chEnd = $$rCldArray[$j]) && ($chEnd->Type eq '__print'))
+	    { ++$j; }
+	    --$j;
+	    
+	    if($i != $j)
+	    {
+	      my $node    = new XMLManip::Node('__print', $chStart->Attributes());
+	      my $content = '';
+
+	      for my $k ($i .. $j)
+	      { $content .= $$rCldArray[$k]->Content(); }
+	      
+	      $self->{__updated_xml} = 1;
+	      $node->Content($content);
+	      splice(@$rCldArray, $i, $j - $i + 1, $node);
+	    }
+	  }
+	  else
+	  {
+	    $self->__MergePrints($chStart) if(scalar @{$chStart->Childs()} != 0);
+	  }
+
+	  ++$i;
+	}
+}
+
+#--------------------------------------------------------------------------------------------------
+# Count number of specific messages in event - Generic version.
+#--------------------------------------------------------------------------------------------------
+sub __NbMsgGeneric
+{
+  my ($node, %counts) = (shift);
+
+  foreach my $child (@{$node->Childs()})
+  {
+    unless(scalar @{$child->Childs()} == 0)
+    {
+      my %res = __NbMsgGeneric($child);
+      
+      foreach my $type (keys %res)
+      {
+        $counts{$type} = ($counts{$type} || 0);
+        $counts{$type} += $res{$type};
+      }
+    }
+
+    next if($child->Type() =~ /^__.*$/);
+    
+    ++$counts{$child->Type()};
+  }
+
+  return %counts;
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+ISIS::Logger2 - An HTML log generator module.
+
+=head1 SYNOPSIS
+
+	use ISIS::Logger3;
+	use ISIS::HttpServer;
+	
+	my $logger = new Logger3::OUT2XML('test_log.xml', 1, HttpServer::GetAddress()."/isis_interface");
+
+	# Set temporary log name, interface, and verbose.
+	$logger->SetXMLLogName('test_log.xml');
+	
+	# Link a CSS file to the HTML output.
+	$logger->LinkCSSFile('style.css');
+	
+	# Open the log.
+	$logger->OpenXMLLog();
+	
+	# Print a summary.
+	$logger->OpenSummary("Log Summary");
+	$logger->SummaryElmt("Build Type", "Multibase");
+	$logger->SummaryElmt("Used SymbianOS", "value 2");
+	$logger->SummaryElmt("Used Series 60", "value 3");
+	$logger->CloseSummary();
+	
+	# Print a header.
+	$logger->Header("Log File Logger2 Test v".Logger2::ISIS_VERSION, "Started on ".(localtime));
+	
+	# Create a main content.
+	$logger->OpenMainContent("Main Content 2");
+		$logger->OpenEvent("Event 1 : First step");
+		  $logger->Error("This is an error\non two lines");
+		  $logger->OpenEvent("SubEvent 1 : Test");
+		  	$logger->Print("This is simple text");
+		  	$logger->OpenEvent("SubSubEvent 1 : Test");
+		  		$logger->Warning("This is a warning");
+		  		
+		  		$logger->OpenParagraph('bold');
+		  		my @array = ('tom', 'dick', 'harry');
+		  		foreach (@array) { $logger->Print($_."\n"); }
+		  		$logger->CloseParagraph();
+
+		  	$logger->CloseEvent();
+		  $logger->CloseEvent();
+		$logger->CloseEvent();
+		$logger->OpenEvent("Event 2 : Second step");
+			$logger->Print("This is a normal output");
+		$logger->CloseEvent();
+		$logger->OpenEvent("Event 3 : Third step");
+			$logger->Warning("This is a warning");
+		$logger->CloseEvent();
+		$logger->OpenEvent("Event 4 : Fourth step");
+			$logger->Remark("This is a remark");
+		$logger->CloseEvent();
+	$logger->CloseMainContent();
+	
+	# Print a footer.
+	$logger->Footer("Finished on ".(localtime), "No HTML Generation");
+	
+	# Close the temporary log file.
+	$logger->CloseXMLLog();
+
+=head1 DESCRIPTION
+
+The ISIS::Logger2 module provides several packages used to create a complex, 
+well presented and organised log file. There are two packages within this module :
+C<L<OUT2XML>> and C<L<XML2HTML>>. The first one generates an XML file that will
+be parsed by the second one in order to generate the proper output.
+
+The C<L<OUT2XML>> package provides a set of simple subroutines allowing to print
+regular output to the terminal while logging all the information for HTML log
+generation.
+
+The C<L<XML2HTML>> package contains a set of subroutines that shouldn't be called
+directly by the user. It contains a main subroutine 'GenHTMLLogFile' that will
+automatically be called after a call to 'OUT2XML::CloseXMLLog' or 'OUT2XML::Die'.
+This subroutine parses the whole XML generated by OUT2XML and uses the OUT set of
+modules to generate the equivalent HTML output.
+
+=head1 OUT2XML
+
+=head2 SetXMLLogName( STRING ) :
+
+Defines the temporary XML file name. This subroutine should be called before
+'OpenXMLLog';
+
+=head2 SetXMLLogInterface( STRING ) :
+
+Defines the interface root to be used for the HTML log file. This subroutine
+should be called before 'OpenXMLLog';
+
+=head2 SetXMLLogVerbose( STRING ) :
+
+Defines if logged information should be outputed to the terminal/shell. This
+subroutine should be called before 'OpenXMLLog';
+
+=head2 OpenXMLLog( ) :
+
+Opens the XML log - Should be called after 'SetXMLLogName', 'SetXMLLogInterface' and
+'SetXMLLogVerbose'.
+
+=head2 CloseXMLLog( ) :
+
+Close the XML log file. This subroutine will automatically call 'XML2HTML::GenHTMLLogFile'.
+
+=head2 OpenSummary( ) :
+
+If verbose is set for the logger, this will ensure that a call to 'SummaryElmt'
+prints out its content, otherwise, a call to 'SummaryElmt' will have no effect
+on the terminal/shell and will only log its information.
+
+=head2 CloseSummary(  ) :
+
+Ends the verbose of summary elements. See 'OpenSummary' for more information.
+
+=head2 SummaryElmt( NAME, VALUE ) :
+
+Logs a name and its value pair to generate a summary in the outputed HTML file.
+If called between 'OpenSummary' and 'CloseSummary', an additionnal output to the
+terminal/shell will be performed.
+
+=head2 OpenMainContent( STRING ) :
+
+Creates a new main content in which events can be created. All future calls to
+the print out subroutine or events will be encapsulated in that main event until
+a call to 'CloseMainContent' is made.
+
+=head2 CloseMainContent( STRING ) :
+
+Closes the current main content. Note that all events and print out subroutine
+calls will be discarded.
+
+=head2 OpenEvent( STRING ) :
+
+Creates a new event in which other events and print out subroutine calls can be
+made. These events will hide their content until they are clicked on, allowing
+the final log user to decide what information to display.
+
+=head2 CloseEvent( STRING ) :
+
+Closes the current event. All events and print out subroutine calls will be passed
+to the containing main content or event.
+
+=head2 OpenParagraph( STYLE ) :
+
+This will open a paragraph, and all calls to 'OUT2XML::Print' will be encapsulated in
+one HTML div element. The optional style argument will be set as the class of the div
+element allowing to modify the text's appearence with a css. The 'OUT2XML::Print'
+subroutine can still be called normally.
+
+=head2 CloseParagraph(  ) :
+
+Closes the current paragraph, returning to the previously opened and not closed node.
+
+=head2 Print( STRING ) :
+
+Prints out regular text to the log file. This text will be discarded if not done
+in a main content, event or paragraph. If this subroutine is called outside of a
+paragraph, an automatic paragraph will be generated for this text. Prefer using
+'OUT2XML::OpenParagraph' and 'OUT2XML::CloseParagraph' when calling 'OUT2XML::Print'
+several times in a row.
+
+=head2 <NAME>( STRING, [ERROR_CODE] ) :
+
+Prints out a message as a NAME - The message will be encapsulated in a <div> HTML
+element with a class attribute matching that name. The corresponding CSS file that
+is set with 'SetXMLLogInterface' can have the equivalent definitions to format these
+HTML elements.
+
+If an error code is specified, a call to 'Die' will be made terminating the current
+script.
+
+=head2 Die( STRING, [ERROR_CODE] ) :
+
+Kills the current script execution. Only calls to 'Die' should be made in a script
+using this Logger. Calling subroutines such as 'exit' or 'die' will corrupt the xml
+log file and make the HTML generation impossible.
+
+=head1 XML2HTML
+
+=head2 GenHTMLLogFile( XMLFILE ) :
+
+Generates an HTML log file from an XML log file created by the C<L<OUT2XML>> package.
+See information regarding the C<L<OUT2XML>> package of the ISIS::Logger2 module.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Mailer.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,175 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : Mailer.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: Mailer.pm % (%full_filespec:  Mailer.pm-3:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Fri Mar 17 16:28:51 2006 %
+#
+# Version History :
+#
+# v1.0 (17/03/2006) :
+#  - Fist version of the Mailer package.
+#  - Only tested the sending of email with text content.
+#------------------------------------------------------------------------------
+package Mailer;
+use strict;
+use Net::SMTP;
+use MIME::Base64;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0';
+use constant ISIS_LAST_UPDATE => '17/03/2006';
+
+
+#------------------------------------------------------------------------------
+# Package's subroutines
+#------------------------------------------------------------------------------
+#
+# Create a Mailer object!
+#
+sub new
+{
+	my $class = shift;
+	my @empty;
+	bless {
+		__sender => shift,
+		__recipients => shift,
+		__subject => shift || "no subject",
+		__content => shift || "",
+		__attach => shift || \@empty
+		}, $class;
+}
+
+#
+# Send the Email!
+#
+sub Send
+{
+	my ($self) = (shift);
+	my $to = '';
+	foreach my $item ( @{$self->{__recipients}} )
+  {
+	  $to = $to.$item.";";
+  }
+	$to =~ s/(\;)$//;
+	
+	my $boundary = "MailSend.Boundary.".time();
+
+	my %email = (
+            mailfrom => $self->{__sender},
+            from => $self->{__sender},
+            subject => $self->{__subject},
+            mailto => [@{$self->{__recipients}}],
+            to => "$to",
+            attachments => [@{$self->{__attach}}],
+            boundary => "$boundary",
+            plaintext => $self->{__content},
+            );
+
+	my $service = Net::SMTP->new('mgw.nokia.com');
+
+	if ( $service ) 
+  {
+  	foreach my $item ( @{$self->{__recipients}} )
+    {
+    	$self->__SendMail( $service, $item, \%email);
+    }
+  }
+	else 
+  {
+  	print "Cannot create SMTP object!\n";
+  }
+}
+ 
+sub __SendMail
+{
+  #Move call attributes to local attributes
+  my ($self, $smtp, $mailto, $mail) = @_; 
+
+  #Local variables
+  my $encodedattachment;
+  my $file;
+  
+
+  
+  # Fill the sender's and recipient's address
+  $smtp->mail($mail->{from});
+  $smtp->to($mailto);
+
+  # Start the mail
+  $smtp->data();
+
+  # Send the header
+  $smtp->datasend("To: $mail->{to}\n");
+  $smtp->datasend("From: $mail->{from}\n");
+  $smtp->datasend("Subject: $mail->{subject}\n");
+  # adding mime header
+  $smtp->datasend("Mime-Version: 1.0\n");
+  $smtp->datasend("Content-Type: multipart/mixed\; boundary=$mail->{boundary}\n");
+  $smtp->datasend("\n");
+
+  # Send the body - BEGIN
+  $smtp->datasend("--$mail->{boundary}\n");
+  $smtp->datasend("$mail->{plaintext}\n\n");
+  # Send the body - END
+
+  foreach $file (@{$mail->{attachments}})
+  {
+    # Open attachement
+    if (open (FILE, "$file"))
+    {
+      binmode FILE;
+      {
+        # Read whole file to variable
+        undef $/;
+        $encodedattachment = encode_base64(<FILE>);
+      }
+      close FILE;
+    }
+    else
+    {
+      print " Cannot open attachement: $file!!\n"
+    }
+
+    # Attachement
+    $smtp->datasend("--$mail->{boundary}\n");
+    $smtp->datasend("Content-Type: application/octet-stream\; name=\"$file\"\n");
+    $smtp->datasend("Content-Disposition: attachment\; filename=\"$file\"\n");
+    $smtp->datasend("Content-Transfer-Encoding: base64\n");
+    $smtp->datasend("\n");
+    $smtp->datasend("$encodedattachment\n\n");
+    
+  }
+  $smtp->datasend("--$mail->{boundary}--\n");
+  
+  # Finish sending the mail
+  $smtp->datasend("\n");
+  $smtp->dataend();
+
+  # Close the SMTP connection
+  $smtp->quit;
+
+}
+  
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Makefile.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,185 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : Makefile.pm
+# Path   : \isis_sw\isis_scripts\packages\ISIS\
+# Use    : Generate makefiles.
+
+#
+# Synergy :
+# Perl %name: Makefile.pm % (%full_filespec: Makefile.pm-3:perl:fa1s60p1#1 %)
+# %derived_by: oligrant %
+# %date_created: Wed Apr  5 13:29:30 2006 %
+#
+# Version History :
+# v1.0.1 (23/01/2006) :
+#  - Added check to avoid printing out empty rules.
+#
+# v1.0.0 (20/01/2006) :
+#  - First version of the module.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Makefile package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package Makefile;
+
+use strict;
+use warnings;
+use ISIS::ErrorDefs;
+use ISIS::Assertion _Debug => 1;
+
+use constant ISIS_VERSION     => '1.0.1';
+use constant ISIS_LAST_UPDATE => '23/01/2006';
+
+sub new
+{
+  my ($class, $filename) = (shift, shift);
+  
+  bless { __filename  => $filename,
+          __variables => {},
+          __rules     => [],
+          __gbl_id    => 0,
+        }, $class;
+}
+
+sub Name { $_[0]->{__filename} }
+
+sub NewRule
+{
+  my ($self, $rule) = (shift, __Rule->new(@_));
+  return undef unless($rule->{__rule_name});
+  push @{$self->{__rules}}, $rule;
+  return $rule;
+}
+
+sub SetVariable
+{
+  my ($self, $name, $value) = (shift, shift, join('', @_));
+  $self->{__variables}->{$name} = $value;
+}
+
+sub RulesFromTemplate
+{
+  my ($self, $name, $args, $maxIndex, @templates) = (shift, shift, pop || {}, 0, @_);
+  
+  foreach my $arg (sort keys %$args)
+  {
+    __ASSERT(ref $$args{$arg} eq 'ARRAY' or
+             ref $$args{$arg} eq 'SCALAR' or
+             ref $$args{$arg} eq '');
+
+    if(ref $$args{$arg} eq 'SCALAR' or ref $$args{$arg} eq '')
+    {
+      my @array = ($$args{$arg});
+      $$args{$arg} = \@array;
+    }
+    else
+    {
+      my $tmp = scalar @{$$args{$arg}} - 1;
+      __ASSERT($tmp == 0 or $tmp == $maxIndex);
+      $maxIndex = $tmp if($maxIndex < $tmp);
+    }
+  }
+
+  my $mainRule = $self->NewRule($name);
+  $mainRule->AddDependancy(join(' ', map { 'id'.$_ } ($self->{__gbl_id} .. $self->{__gbl_id} + $maxIndex)));
+
+  for my $i (0 .. $maxIndex)
+  {
+  	my $rule = $self->NewRule('id'.$self->{__gbl_id});
+	  ++$self->{__gbl_id};
+
+  	foreach my $template (@templates)
+		{
+			my $tmp = $template;
+	    foreach my $arg (sort keys %$args)
+	    {
+	      my $value = (@{$$args{$arg}} == 1 ? $$args{$arg}->[0] : $$args{$arg}->[$i]);
+	      $tmp =~ s/\$$arg/$value/g;
+	    }
+
+	    $rule->AddCmdLine($tmp);
+	  }
+  }
+}
+
+sub Generate
+{
+  my ($self, $error) = (shift, 0);
+
+  open(MAKEFILE, ">".$self->{__filename}) or return ERR::FILE_CREATION_FAILED;
+
+  foreach my $var (sort keys %{$self->{__variables}})
+  { print MAKEFILE $var, " = ", $self->{__variables}->{$var}, "\n"; }
+
+  print MAKEFILE "\n";
+
+  foreach my $rule (@{$self->{__rules}})
+  { $rule->Print(\*MAKEFILE); }
+
+  close(MAKEFILE);
+  return ERR::NO_ERROR;
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   __Rule package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package __Rule;
+
+use strict;
+use warnings;
+
+sub new
+{
+  my ($class, $name, @dependancies) = (shift, shift, @_);
+  
+  bless { __command_lines => [],
+          __dependancies  => \@dependancies,
+          __rule_name     => $name,
+        }, $class;
+}
+
+sub AddCmdLine    { push @{shift->{__command_lines}}, join('', @_); }
+sub AddDependancy { push @{shift->{__dependancies}}, @_; }
+
+sub Print
+{
+  my ($self, $fh) = (shift, shift);
+  
+  return if(@{$self->{__dependancies}} == 0 and @{$self->{__command_lines}} == 0);
+  
+  print $fh $self->{__rule_name}, ": ", join(' ', @{$self->{__dependancies}}), "\n";
+
+  foreach my $cmd (@{$self->{__command_lines}})
+  { print $fh "\t", $cmd, "\n"; }
+  
+  print $fh "\n";            
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/NAB.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,976 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name    : NAB.pm
+# Use     : Nokia Automated Build.
+
+
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+# v1.3.2 (12/04/2006)
+#  - Fixed sub argument parsing routine __ParseSubArguments where arguments were not
+#    correctly mached.
+#  - Updated argument parsing to allow use of single and double hyphens ('-' and '--').
+#  - Updated code to use correct XMLManip::Node child access.
+#
+# v1.3.1 (07/02/2006)
+#  - NAB display the version of the loaded modules. Modules must use ISIS templates.
+#
+# v1.3.0 (07/02/2006)
+#  - Updated NAB to used HTTP Server with 'Logger2.pm'.
+#
+# v1.2.2 (24/01/2006)
+#  - Fixed non found flags were printed before checking all patterns.
+#  - Removed core module since it was never used.
+#  - Updated help printout for NAB.
+#
+# v1.2.1 (16/01/2006)
+#  - Added an extra hashtable to all steps for global data storage and sharing.
+#  - Add -st|-showsteps, display steps by operation.
+#  - My birthday (Wooohoooo).
+#
+# v1.1.1 (13/01/2006)
+#  - Added eval block around step calls to assure correct script termination if error occurs.
+#
+# v1.1.0 (11/01/2006)
+#  - Added support for 'resume' and 'step' operations.
+#  - Added 'ExecuteResume' to the '__Operation' package.
+#  - Added 'ExecuteSteps' to the '__Operation' package.
+#
+# v1.0.1 (10/01/2006)
+#  - Added unused flag checking.
+#  - Separated global arguments from operation arguments (see documentation).
+#
+# v1.0.0 (06/01/2006) - RELEASE CANDIDATE 1
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   NAB package.
+#
+#--------------------------------------------------------------------------------------------------
+package NAB;
+
+use strict;
+use warnings;
+
+use ISIS::ErrorDefs;
+use ISIS::XMLManip;
+use ISIS::Logger2;
+use ISIS::Registry;
+use ISIS::HttpServer;
+
+# ISIS constants.
+use constant ISIS_VERSION       => '1.3.2';
+use constant ISIS_LAST_UPDATE   => '12/04/2006';
+use constant ISIS_PERL_VERSION  => '5.6.1';
+use constant DEBUG              => 0;
+
+# Script constants.
+use constant ROOT_SCRIPTS_DIR   => "\\isis_sw\\build_config\\";
+use constant OPS_CONFIG_FILE    => ROOT_SCRIPTS_DIR."operations.xml";
+use constant REG_CONFIG_FILE    => ROOT_SCRIPTS_DIR."registry.xml";
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new NAB( ", join(', ', @_), " )\n"  if(DEBUG);
+  my ($class, @args) = (shift, @_);
+  
+  my $self = bless { _ops_cfg    => OPS_CONFIG_FILE,   # operations configuration file.
+                     _reg_cfg    => REG_CONFIG_FILE,   # registry configuration file.
+                     _target     => 'all',             # global target keyword.
+                     _override   => 0,                 # override status.
+                     _args       => \@args,            # passed arguments.
+                     _gbl_mem    => {},                # global shared memory.
+                     _resume     => undef,             # resume information.
+                     _step       => undef              # step information.
+                   }, $class;
+
+  OUT2XML::SetXMLLogName("nab_main_log.html");
+  OUT2XML::SetXMLLogVerbose("on");
+  OUT2XML::SetXMLLogInterface( HttpServer::GetAddress()."/isis_interface" );
+  OUT2XML::OpenXMLLog();
+  OUT2XML::Header("Nokia Automated Build", "Started on ".scalar(localtime));
+
+  $self->__ParseMainArguments();
+  $self->__LoadConfigurationFiles();
+  $self->__ParseSubArguments();
+  $self->__LoadOperationSteps();
+  
+  return $self;
+}
+
+#--------------------------------------------------------------------------------------------------
+# __ParseMainArguments - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __ParseMainArguments
+{
+  warn "NAB::__ParseArguments( ", join(', ', @_), " )\n" if(DEBUG);
+  my ($self, @gblArgs, @subArgs) = (shift);
+  
+  while(defined($_ = shift @{$self->{_args}}))
+  {
+    if(/^--?(?:h|-h|help|-help)$/) { $self->__DisplayHelp();  OUT2XML::Die(0); }
+    if(/^--?(?:st|-showsteps)$/)   { $self->__DisplaySteps(); OUT2XML::Die(0); }
+    if(/^--?(?:ocf|opscfg)=(.+)$/) { $self->{_ops_cfg}  = $1; push @gblArgs, $_; next; }
+    if(/^--?(?:rcf|regcfg)=(.+)$/) { $self->{_reg_cfg}  = $1; push @gblArgs, $_; next; }
+    if(/^--?(?:tg|target)=(.+)$/)  { $self->{_target}   = $1; push @gblArgs, $_; next; }
+    if(/^--?(?:r|resume)=(.+)$/)   { $self->{_resume}   = $1; push @gblArgs, $_; next; }
+    if(/^--?(?:s|step)=(.+)$/)     { $self->{_step}     = $1; push @gblArgs, $_; next; }
+    if(/^--?(?:or|override)$/)     { $self->{_override} =  1; push @gblArgs, $_; next; }
+
+    push @subArgs, $_;
+  }
+
+  @{$self->{_gbl_args}} = @gblArgs;
+  @{$self->{_args}}     = @subArgs;
+  
+  OUT2XML::OpenMainContent('Script Initialisation');
+
+  if(scalar @{$self->{_args}} == 0)
+  {
+    OUT2XML::Error("No arguments passed to NAB. Type \'nab.pl --help\' for more information.");
+    OUT2XML::Die(ERR::MISSING_SWITCH);
+  }
+  
+  OUT2XML::OpenSummary("Nokia Automated Build Configuration");
+  OUT2XML::SummaryElmt("Command line", 'nab.pl '.join(' ', (@{$self->{_gbl_args}}, @{$self->{_args}})));
+  OUT2XML::SummaryElmt("operations configuration file", $self->{_ops_cfg});
+  OUT2XML::SummaryElmt("registry configuration file", $self->{_reg_cfg});
+  OUT2XML::SummaryElmt("operation target", "\'".$self->{_target}."\'");
+  OUT2XML::SummaryElmt("override activated (missing modules will be ignored)") if($self->{_override});
+  OUT2XML::CloseSummary();
+}
+
+#--------------------------------------------------------------------------------------------------
+# __ParseSubArguments - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __ParseSubArguments
+{
+  warn "NAB::__ParseSubArguments( ", join(', ', @_), " )\n" if(DEBUG);
+  my ($self, $mainFlags, $currentFlag, %patterns, %inputs, %mandatory) = (shift);
+
+  $mainFlags = join('|', $self->{_ops_data}->ChildTypes()); 
+
+  foreach my $op (@{$self->{_ops_data}->Childs()})
+  { # determine flag patterns for each op.
+    push @{$patterns{$op->Type()}}, @{$op->Child('flag')};
+    
+    foreach my $step (@{$op->Child('step')})
+    { push @{$patterns{$op->Type()}}, @{$step->Child('flag')}; } 
+  }
+  
+  foreach my $arg (@{$self->{_args}})
+  { # determine arguments for each op.
+    if($arg =~ /^-($mainFlags)$/)
+    {
+      $currentFlag = $1;
+      $inputs{$currentFlag} = [];
+      push @{$self->{_exec}}, $self->{_ops_data}->Child($1, 0);
+    }
+    else
+    {
+      push @{$inputs{$currentFlag}}, $arg;
+    }
+  }
+
+  my $hasError = 0;
+  foreach my $op (sort keys %inputs)
+  {
+    foreach my $flagNode (@{$patterns{$op}})
+    {
+      my $pattern = $flagNode->Attribute('pattern');
+      my $type    = $flagNode->Attribute('type');
+      my $input   = undef;
+
+      $pattern =~ s/^-([^=]+)/-\($1\)/;
+      $pattern = qr($pattern);
+
+      $mandatory{$op}{$1} = 0 if($type eq 'mandatory');
+  
+      if($type !~ /^(?:mandatory|optional)$/)
+      {
+        OUT2XML::Error("Flag \'<b>", $pattern, "</b>\' is of illegal type \'<b>",
+                       $type, "</b>\'. Should be \'optional\' or \'mandatory\'"
+                      );
+        $hasError = 1;
+      }
+      
+      my $i = 0;
+      foreach $input (@{$inputs{$op}})
+      {
+        if($input =~ /^$pattern$/)
+        {
+          $self->{_ops_args}{$op}{$1} = $2 || 1;
+          $mandatory{$op}{$1} = 1;
+          splice(@{$inputs{$op}}, $i, 1);
+        }
+        ++$i;
+      }
+    }
+
+    foreach my $input (@{$inputs{$op}})
+    {
+      OUT2XML::Error("Flag \'<b>${input}</b>\' does not exist");
+      $hasError = 1;
+    }
+  }
+
+  foreach my $op (sort keys %mandatory)
+  {
+    foreach my $flag (sort keys %{$mandatory{$op}})
+    {
+      unless($mandatory{$op}{$flag})
+      {
+        OUT2XML::Error("Mandatory flag \'<b>", $flag, "</b>\' for operation \'<b>", 
+                       $op, "</b>\' was not defined."
+                      );
+        $hasError = 1;
+      }
+    }
+  }
+
+  if($hasError)
+  {
+    OUT2XML::Die(ERR::MISSING_SWITCH);
+  }
+  else
+  {
+    OUT2XML::Print("<b>Passed arguments :</b>\n");
+    foreach my $op (sort keys %{$self->{_ops_args}})
+    {
+      foreach my $switch (sort keys %{$self->{_ops_args}{$op}})
+      {
+        OUT2XML::Print(" - $switch set to \'".$self->{_ops_args}{$op}{$switch}."\'\n");
+      }
+    }
+  }
+}
+
+#--------------------------------------------------------------------------------------------------
+# __LoadConfigurationFiles - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __LoadConfigurationFiles
+{
+  warn "NAB::__LoadOperationsCfg( ", join(', ', @_), " )\n" if(DEBUG);
+  my ($self) = (shift);
+  
+  $self->{_ops_data} = &XMLManip::ParseXMLFile($self->{_ops_cfg}, XMLManip::NO_LOCK);
+  $self->{_reg_data} = new Registry($self->{_reg_cfg}, { error_level => 1 });
+  
+  foreach my $includeNode (@{$self->{_ops_data}->Child('perl_include')})
+  {
+    push @INC, $includeNode->Attribute('path');
+    $self->{_ops_data}->RemoveChild($includeNode);
+  } 
+}
+
+#--------------------------------------------------------------------------------------------------
+# _LoadOperationSteps - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __LoadOperationSteps
+{
+  warn "NAB::__LoadOperationSteps( ", join(', ', @_), " )\n" if(DEBUG);
+  my ($self, $hasError) = (shift, 0);
+
+  foreach my $opNode (@{$self->{_exec}})
+  {
+    push @{$self->{_ops}}, __Operation->new($opNode, $self);
+  }
+
+  OUT2XML::CloseMainContent();
+}
+
+#--------------------------------------------------------------------------------------------------
+# __CheckConcurrentStep - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __CheckConcurrentStep
+{
+  warn "NAB::__CheckConcurrentStep( ", join(', ', @_), " )\n" if(DEBUG);
+  my ($self, $opNode, $stepNode1) = (shift, shift, shift);
+  
+  foreach my $stepNode2 (@{$opNode->Child('step')})
+  {
+    next if($stepNode1 == $stepNode2 or
+            $stepNode1->Attribute('id') ne $stepNode2->Attribute('id') or
+            $stepNode2->Attribute('target') !~ /^(?:all|$self->{_target})$/i);
+
+    my ($target1, $target2) = ($stepNode1->Attribute('target'), $stepNode2->Attribute('target'));
+    
+    if($target1 =~ /^$target2$/i or 'all' =~ /^(?:$target1|$target2)$/i)
+    {
+      my $infoNode1 = $stepNode1->Child('info', 0);
+      my $infoNode2 = $stepNode2->Child('info', 0);
+      my $info1 = $infoNode1 && $infoNode1->Content() || 'No description available';
+      my $info2 = $infoNode2 && $infoNode2->Content() || 'No description available';
+      
+      OUT2XML::Error("Operation <b>".$opNode->Type()."</b> - Found conflicting steps :\n".
+                     "Step \'<b>".$info1."</b>\' has id <b>".$stepNode1->Attribute('id').
+                     "</b> and target <b>".$target1."</b>.\n".
+                     "Step \'<b>".$info2."</b>\' has id <b>".$stepNode2->Attribute('id').
+                     "</b> and target <b>".$target2."</b>.\n"
+                    );
+
+      return 1;
+    }
+  }
+  
+  return 0;
+}
+
+#--------------------------------------------------------------------------------------------------
+# __DisplayHelp - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __DisplayHelp
+{
+  my ($self) = (shift);
+  
+  if(not defined $self->{_ops_data} and not defined $self->{_reg_data})
+  { $self->__LoadConfigurationFiles(); }
+  
+  OUT2XML::OpenMainContent('NAB Help Information');
+  OUT2XML::Print("<b>nab.pl</b> - Nokia Automated Build - v".ISIS_VERSION." (".ISIS_LAST_UPDATE.")\n");
+  OUT2XML::Print("usage : nab.pl [-help] [-st] [-target=xxx] [-OP1_FLG] [-OP1_ARG1 [-OP1_ARG2 ...]] [-OP2_FLG [-OP2_ARG1 [-OP2_ARG2 ...]]]\n");
+
+  OUT2XML::Print("\nFlags:\n");
+  OUT2XML::Print("\t-help\tShow this help message.\n");
+  OUT2XML::Print("\t-st\tList steps available by command flag.\n");
+  
+  OUT2XML::Print("\nCommands:\n");
+  foreach my $op (@{$self->{_ops_data}->Childs()})
+  {
+    OUT2XML::Print("<b>", $op->Type(), "</b> : <i>", $op->Attribute('title')||"", "</i>\n");
+    if(@{$op->Child('info')})
+    {
+      foreach my $info (@{$op->Child('info')})
+      {
+        chomp(my $line = $info->Content());
+        $line =~ s/^\s*//g;
+        $line = "\t".$line; $line =~ s/\s*\n\s*/\n\t/g;
+        OUT2XML::Print($line,"\n");
+      }
+    }
+    else
+    {
+      OUT2XML::Print("No information available for this operation.\n"); 
+    }
+    
+    OUT2XML::Print(" + Flags:\n");
+    if(@{$op->Child('flag')})
+    {
+      foreach my $f (@{$op->Child('flag')})
+      {
+        my $fill = "\t\t";
+        OUT2XML::Print($fill,$f->Attribute('pattern'),$fill,$f->Attribute('info')," [",$f->Attribute('type'),"]\n");
+      }
+    }
+
+    OUT2XML::Print("\n");
+  }
+  
+  OUT2XML::CloseMainContent();
+}
+
+#--------------------------------------------------------------------------------------------------
+# __DisplaySteps - PRIVATE.
+#--------------------------------------------------------------------------------------------------
+sub __DisplaySteps
+{
+  my ($self) = (shift);
+  
+  if(not defined $self->{_ops_data} and not defined $self->{_reg_data})
+  { $self->__LoadConfigurationFiles(); }
+  
+  OUT2XML::OpenMainContent('NAB Help Information');
+  OUT2XML::Print("<b>nab.pl</b> - Nokia Automated Build - v".ISIS_VERSION." (".ISIS_LAST_UPDATE.")\n");
+  foreach my $op (@{$self->{_ops_data}->Childs()})
+  {
+    OUT2XML::Print("\n");
+    OUT2XML::Print("<b>", $op->Type(), "</b> : <i>", $op->Attribute('title')||"", "</i>\n");
+    if(@{$op->Child('step')})
+    {
+      foreach my $s (@{$op->Child('step')})
+      {
+        # calculate heading space
+        my $info = "";
+        foreach my $i (@{$s->Child('info')}) {$info.= $i->Content()||"";}
+        OUT2XML::Print("\t",$s->Attribute('id'),"\t",$info,"\n");
+      }
+    }     
+  }
+  OUT2XML::CloseMainContent();
+}
+
+#--------------------------------------------------------------------------------------------------
+# Public member subroutines.
+#--------------------------------------------------------------------------------------------------
+sub Execute
+{
+  warn "NAB::Execute( ", join(', ', @_), " )\n"  if(DEBUG);
+  my $self = shift;
+  
+  OUT2XML::OpenMainContent("Modules Version");
+  OUT2XML::OpenEvent("Modules Version");
+  foreach my $operation ( @{$self->{_ops}} )
+  {
+    $operation->LogStepVersion();
+  }
+  OUT2XML::CloseEvent();
+  OUT2XML::CloseMainContent();
+  
+  if ( $self->{_resume} )
+  {
+    # Manage only one operation
+    my $operation = $self->{_ops}[0];
+    OUT2XML::OpenMainContent(ucfirst($operation->Type())." Operation");
+    $operation->ExecuteResume($self->{_resume}, $self->{_target},
+                              $self->{_ops_args}{$operation->Type()},
+                              $self->{_reg_data},
+                              $self->{_gbl_mem});
+    OUT2XML::CloseMainContent();
+  }
+  elsif ( $self->{_step} )
+  {
+    # Manage only one operation
+    my $operation = $self->{_ops}[0];
+    OUT2XML::OpenMainContent(ucfirst($operation->Type())." Operation");
+    $operation->ExecuteSteps($self->{_step}, $self->{_target},
+                             $self->{_ops_args}{$operation->Type()},
+                             $self->{_reg_data},
+                             $self->{_gbl_mem});
+    OUT2XML::CloseMainContent();
+  }
+  else
+  {
+    # Normal execution of operation.
+    foreach my $operation ( @{$self->{_ops}} )
+    {
+      OUT2XML::OpenMainContent(ucfirst($operation->Type())." Operation");
+      $operation->Execute($self->{_target},
+                          $self->{_ops_args}{$operation->Type()},
+                          $self->{_reg_data},
+                          $self->{_gbl_mem});
+      OUT2XML::CloseMainContent();
+    }
+  }
+  
+  OUT2XML::Footer("Finished on ".scalar(localtime), "Log file generated by Logger2 v".Logger2::ISIS_VERSION);
+  OUT2XML::CloseXMLLog();
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   __Operation package.
+#
+#--------------------------------------------------------------------------------------------------
+package __Operation;
+
+sub new
+{
+  my ($class, $opNode, $nab, $hasError, @steps) = (shift, shift, shift, 0);
+
+  foreach my $stepNode (@{$opNode->Child('step')})
+  {
+    if($stepNode->Attribute('target') =~ /^(?:all|$nab->{_target})$/i)
+    {
+      $hasError |= $nab->__CheckConcurrentStep($opNode, $stepNode);
+      my $step = __Step->new($opNode, $stepNode, $nab);
+      $hasError |= 1 unless($step->IsValid() or $nab->{_override});
+      push @steps, $step;
+    }
+  }
+  
+  my $infoNode = $opNode->Child('info', 0);
+  my $info     = $infoNode && $infoNode->Content() || 'No information available';
+
+  OUT2XML::Die(ERR::INVALID_CFG_STEP) if($hasError);
+
+  bless { '__Operation::Type'  => $opNode->Type(),
+          '__Operation::Steps' => \@steps,
+          '__Operation::Info'  => $info,
+        }, $class;
+}
+
+sub LogStepVersion
+{
+  my ($self) = (shift);
+  foreach my $step ( @{$self->{'__Operation::Steps'}} )
+  {
+    $step->LogStepVersion();
+  } 
+  
+}
+
+sub ExecuteResume
+{
+  my ($self, $from) = (shift, shift);
+  foreach my $step ( @{$self->{'__Operation::Steps'}} )
+  {
+    $step->Execute(@_) if($step->IsValid() and $step->Id() ge $from);
+  } 
+}
+
+sub ExecuteSteps
+{
+  my ($self, $stepstring) = (shift, shift);
+  my $steps = join('|', split('\s+', $stepstring));
+  foreach my $step ( @{$self->{'__Operation::Steps'}} )
+  {
+    $step->Execute(@_) if($step->IsValid() and $step->Id() =~ /^(?:$steps)$/);
+  } 
+}
+
+sub Execute
+{
+  my $self = shift;
+
+  foreach my $step (@{$self->{'__Operation::Steps'}})
+  {
+    $step->Execute(@_) if($step->IsValid());
+  } 
+}
+
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  $self->{$method} = shift if @_;
+  return $self->{$method};
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   __Step package.
+#
+#--------------------------------------------------------------------------------------------------
+package __Step;
+
+sub new
+{
+  my ($class, $opNode, $stepNode, $nab, $isValid) = (shift, shift, shift, shift, 1);
+
+  my $callNode = $stepNode->Child('call', 0);
+  my $call     = $callNode && $callNode->Content() || 'undefined';
+  
+  my $infoNode = $stepNode->Child('info', 0);
+  my $info     = $infoNode && $infoNode->Content() || 'No information available';
+
+  my $stepId   = $stepNode->Attribute('id') || 'undefined';
+  my $critical = $stepNode->Attribute('critical') || 'no';
+  
+  if($stepId eq 'undefined')
+  {
+    OUT2XML::Error("Step \'<b>".$info."</b>\' with id <b>".$stepId."</b> is invalid :\n".
+                   "No id attribute specified.");
+    $isValid = 0;
+  }
+  
+  if($call eq 'undefined')
+  {
+    OUT2XML::Error("Step \'<b>".$info."</b>\' with id <b>".$stepId."</b> is invalid :\n".
+                   "No call information was found.");
+    $isValid = 0;
+  }
+  
+  if($critical !~ /^(?:yes|no)$/i)
+  {
+    OUT2XML::Error("Step \'<b>".$info."</b>\' with id <b>".$stepId."</b> is invalid :\n",
+                   "The specified critical attribute should be \'yes\' or \'no\', and not \'$critical\'.");
+    $isValid = 0; 
+  }
+  else
+  {
+    $critical = ($critical =~ /^yes$/i) || 0; 
+  }
+  
+  my ($module, $subroutine);
+
+  if(($module, $subroutine) = ($call =~ /^(.+?)::(.+?)$/))
+  {
+    if(eval 'require '.$module.';')
+    {
+      push @{$nab->{_usermodules}}, $module;
+      unless(exists &{$module.'::'.$subroutine})
+      {
+        if($nab->{_override})
+        {
+          OUT2XML::Warning("Operation <b>".$opNode->Type()."</b>, step \'<b>".$info."</b>\' (id <b>".$stepId."</b>) :\n".
+                           "Unable to find subroutine <b>".$subroutine."</b> in module <b>".$module.".pm</b>. ".
+                           "Step will be removed due to <i>-override</i> flag.");
+        }
+        else
+        {
+          OUT2XML::Error("Operation <b>".$opNode->Type()."</b>, step \'<b>".$info."</b>\' (id <b>".$stepId."</b>) :\n".
+                         "Unable to find subroutine <b>".$subroutine."</b> in module <b>".$module.".pm</b>. ".
+                         "Please verify subroutine name in <b>".$nab->{_ops_cfg}."</b> operation file.");
+        }
+        $isValid = 0;
+      }
+    }
+    else
+    {
+      if($nab->{_override})
+      {
+        OUT2XML::Warning("Operation <b>".$opNode->Type()."</b>, step \'<b>".$info."</b>\' (id <b>".$stepId."</b>) :\n".
+                         "Unable to load module <b>".$module.".pm</b>. ".
+                         "Step will be removed due to <i>-override</i> flag.\n$@");
+      }
+      else
+      {
+        OUT2XML::Error("Operation <b>".$opNode->Type()."</b>, step \'<b>".$info."</b>\' (id <b>".$stepId."</b>) :\n".
+                       "Unable to load module <b>".$module.".pm</b>. ".
+                       "Please verify module name in <b>".$nab->{_ops_cfg}."</b> operation file.\n$@");
+      }
+      $isValid = 0;
+    }
+  }
+  else
+  {
+    OUT2XML::Error("Operation <b>".$opNode->Type()."</b>, step \'<b>".$info."</b>\' (id <b>".$stepId."</b>) :\n".
+                   "Call pattern is invalid. Should be <i>module::subroutine</i>.\n".
+                   "Please verify step call in <b>".$nab->{_ops_cfg}."</b> operation file.");
+    $isValid = 0; 
+  }
+
+  my $moduleVersion = undef;
+  if ( $isValid )
+  {   
+      eval{ $moduleVersion = $module->ISIS_VERSION; };
+  }
+
+  bless { '__Step::Id'         => $stepId,
+          '__Step::IsCritical' => $critical,
+          '__Step::Info'       => $info,
+          '__Step::IsValid'    => $isValid,
+          '__Step::Module'     => $module,
+          '__Step::Subroutine' => $subroutine,
+          '__Step::Version'    => $moduleVersion,
+        }, $class;
+}
+
+sub LogStepVersion
+{
+  my $self = shift;
+  OUT2XML::Print("<b>", $self->Module(), "</b> version is <b>", $self->Version(), "</b>\n");
+}
+
+sub Execute
+{
+  my $self = shift;
+  
+  OUT2XML::OpenEvent("Step ".$self->{'__Step::Id'}." : ".$self->{'__Step::Info'});
+  my $function = \&{$self->{'__Step::Module'}.'::'.$self->{'__Step::Subroutine'}};
+  
+  eval { &{$function}(@_); };
+  
+  if($@)
+  {
+    if($self->{'__Step::IsCritical'})
+    {
+      OUT2XML::Error($@);
+      OUT2XML::Die(ERR::CRITICAL_STEP_FAILED);
+    }
+    else
+    {
+      OUT2XML::Warning($@);
+    }
+  }
+  
+  OUT2XML::CloseEvent();
+}
+
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  $self->{$method} = shift if @_;
+  return $self->{$method};
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+NAB - Nokia Automated Build System.
+
+=head1 USER INFORMATION
+
+=head2 Description :
+
+This module is used to execute complex build operations, and allow easy configuration of
+specific steps by the use of independant modules, allowing therefor to configure several
+builds and other operations with the same configuration files.
+
+=head2 Main NAB Arguments :
+
+=over 1
+
+=item * '-ocf=FILE' or '-opscfg=FILE'
+
+This allows the user to specify what XML configuration file to use for determining
+build steps and modules to use. By default, this value is set to 'operations.xml'.
+For more information on how to format the content of this configuration file, see
+L<Operations Configuration File>.
+
+=item * '-rcf=FILE' or '-regcfg=FILE'
+
+This allows the user to specify what XML registry file to use for defining
+build data such as names and supported products. By default, this value is set to
+'registry.xml'. For more information on how to format the content of this configuration
+file, see L<Registry Configuration File>.
+
+=item * '-cm=FILE' or '-coremodule=FILE' :
+
+This defines the core module to be used. This module is used when looking up
+a function call that isn't specified with a module. By default, the module name
+is set to 'corebuild.pm'.
+
+=item * '-tg=TARGET' or '-target=TARGET' :
+
+Sets the target of the operation. Steps in the operations XML configuration can specify
+a target attribute that will define when the corresponding step must be executed based
+on the target value passed as an argument to the script using this flag.
+
+=item * '-or' or '-override' :
+
+This defines the action to take when a step is missing its corresponding module. Without
+the 'override' flag, a missing module or function in a specified module will rase an
+error and terminate the script before it executes any operations. If the flag is defined,
+a missing module or function will only generate a warning and the corresponding step will
+be skipped.
+
+=back
+
+=head2 Operations Configuration File :
+
+This file contains all information regarding the different operations that NAB can execute.
+It is directly used by NAB to determine operation steps, operation flags, and necessary
+modules. It must be configured using the following syntax.
+
+  <operations>
+  
+    <operation_flag>
+  
+      <info>...<info>
+  
+      <flag type="..." pattern="..." info="..." />
+      
+      <step id="..." target="...">
+        <call>...</call>
+        <info>...</info>
+        <flag type="..." pattern="..." info="..." />
+      </step>
+  
+    </operation_flag>
+  
+  </operations>
+
+the <operations> root node is mandatory. All childs of this node (ie: <operation_flag>)
+can have any valid xml tag name, and will define the operation flag to pass to the NAB
+instance to execute it.
+
+The step nodes in each <operation_flag> node defines a step and must have at least the 'id'
+attribute defined. If the 'target' attribute is not defined, it's value will default to 'all'.
+
+For an operation node or a step node, it is possible to define an <info> node that contains a
+description of the action performed by the containing node. It is optional but strongly
+recommended since it clarifies what the operation or step does for further references.
+
+Finally, one or several <flag> nodes can be defined, each of them having at least both
+attributes 'type' and 'pattern' defined. The type determines wether the flag is 'optional'
+or 'mandatory' and the pattern corresponds to the perl regular expression that the passed
+arguments must be tested with, eventually having a captured value (ie: '-flag=(.*)'). An
+'info' attribute can be specified to explain the use of the flag.
+
+=head2 Registry Configuration File :
+
+The registry configuration file is parsed using the L<ISIS::ConfigsData> package. It contains
+all static information that will be passed to all called functions for each operation. This
+file should respect the syntax specified in the L<ISIS::ConfigsData> documentation.
+
+=head1 DEVELOPER INFORMATION
+
+=head2 NAB Internal Data Structure :
+
+A NAB Instance is a blessed hash table containing the following data :
+
+=over 1
+
+=item * _ops_cfg
+
+This is the operations' configuration file. By default set to OPS_CONFIG_FILE defined
+as a constant at the beginning of this file. This XML file contains all steps, generic
+or specific, all flags, and all necessary modules for a given operation.
+
+=item * _bld_cfg
+
+This is the builds' configuration file. By default set to REG_CONFIG_FILE defined
+as a constant at the beginning of this file. This XML file contains all necessary
+information for each type of build possible.
+
+=item * _ops_data
+
+This L<ISIS::XMLManip::Node> reference is the XML tree resulting from the operations' configuraiton
+file set in L<_ops_cfg>. See L<ISIS::XMLManip::Node> for more information.
+
+=item * _reg_data
+
+This L<ISIS::XMLManip::Node> reference is the XML tree resulting from the builds' configuraiton
+file set in L<_bld_cfg>. See L<ISIS::XMLManip::Node> for more information.
+
+=item * _target
+
+This is the only general value passed on to all possible operations. It is by default set
+to 'all' and every step not defining the target attribute will be set to this value as well.
+This value is used to filter out irrelevant steps in a given operation. If an other value
+than 'all' is specified, every step targeting this specific value will be called in addition
+to the steps defined for the 'all' target. On the other hand, when the 'all' target is
+defined, only steps defined for the 'all' target will be called.
+
+=item * _override
+
+This value is used to determine wether the script should halt when encountering a missing
+module required by a function call, or just ignore it after printing out a warning. By
+default, this value is set to '0' and must be activated by having the user pass the
+'-override' flag to the script.
+
+=item * _gbl_args
+
+This array contains all global arguments that are used to define configuration files, the
+general script target and override. For more information on theses flags, see L<Main NAB Arguments>
+
+=item * _args
+
+This value holds a reference to an array containing all dynamic flags. This means it will
+only contain operation flags and their passed on flags. All flags allowing to define NAB
+specific components (such as configuration files) will be stripped out.
+
+=item * _ops_args
+
+This is a hash table of hash tables containing the parsed information necessary for each
+operation. Its structure is as follows :
+
+  %_ops_args
+    |
+    -- %op_type
+         |
+         -- %flag
+              |
+              -- value
+
+For example, a call to $self->{_ops_args}{build}{wa} will return the value of the flag wa for
+the build operation. For boolean flags, the returned value is 1 if set, 0 otherwise.
+
+=item * _exec
+
+This array contains a reference to L<ISIS::XMLManip::Node> objects corresponding to the operations
+the user has decided to execute. The array is populated during the subroutine call 
+L<NAB::__ParseSubArguments>. See L<ISIS::XMLManip::Node> for more information on this package.
+
+=item * _ops
+
+This array contains L<__Operation> objects in the order they must be called. This array is
+populated in the subroutine L<NAB::__LoadOperationSteps>. See L<__Operation> for more
+information on this package.
+
+=item * _gbl_mem
+
+This hash table contains all shared resources and data between the different steps. This space
+is to be used by module developpers to communicate information between different subroutine
+calls and modules.
+
+=back
+
+=head2 NAB INTERFACE
+
+=head2 __Operation PACKAGE
+
+The __Operation package contains all information regarding a specific operation to execute.
+One instance is created for each main operation the user wants to execute, and are created
+directly when the NAB package is instanciated. This package provides a unique public 
+subroutine L<__Operation::Execute> that is automatically called when the L<NAB> instance. There
+is a default accessor for all information contained in a __Operation instance, but it is not
+used throughout the script.
+
+=over 1
+
+=item * __Operation( <OPERATION_NODE>, <NAB_INSTANCE> ) :
+
+The constructor takes the L<XMLManip::Node> operation node, and the L<NAB> instance it is
+attached to. This call will also create all L<__Step> instances corresponding to this operation.
+
+=item * Execute(  ) :
+
+This will execute the full operation and call sequentially L<__Step::Execute> on all contained
+steps for this operation. For more information on the step execution, see L<__Step::Execute>.
+
+=back
+
+=head2 __Step PACKAGE
+
+The __Step package contains all information regarding a specific step for a given operation.
+All instances of this package are contained by an instance of the L<__Operation> that contains
+all information regarding a specific operation. See L<__Operation> for more information. The step
+package provides a unique public subroutine L<__Step::Execute> that is automatically called by
+the L<__Operation> instance it is contained by. There is a default accessor for all information
+contained in a __Step instance, but it is not used throughout the script.
+
+=over 1
+
+=item * __Step( <OPERATION_NODE>, <STEP_NODE>, <NAB_INSTANCE> ) :
+
+The constructor takes the L<XMLManip::Node> operation node the step is attached to, the
+corresponding L<XMLManip::Node> for the step, and the L<NAB> instance all this is attached to.
+This call will create a new instance and check the existance of the necessary module and
+subroutine. The necessary module will also be loaded.
+
+=item * Execute(  ) :
+
+This will actually execute the step by calling the corresponding subroutine from the defined
+module. The function will be passed all build information, taken from the builds' configuraiton
+file, and the operation's arguments that were passed along with the operation target. For more
+information on the builds' configuration file, see L<Configs Configuration File>.
+
+=back
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Box1.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,161 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Box1.pm
+# Use    : Creates a rounded box container in HTML.
+
+#
+# Synergy :
+# Perl %name: Box1.pm % (%full_filespec:  Box1.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Jan 12 10:13:35 2006 %
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Box package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Box1;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '12/11/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Box1( ".join(', ', @_)." )\n" if(DBG::BOX1);
+
+	my $outputer = pop;
+	$outputer->RequireCSSFile('css/box1.css');
+	$outputer->RequireJSFile('javascript/box1.js');
+	
+  bless { _childs   => undef,
+          _outputer => $outputer,
+        }, shift;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Data Element.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+	warn "OUT::Box1::PushChild( ".join(', ', @_)." )\n" if(DBG::BOX1);
+  my ($self, $child) = (shift, shift);
+  warn "pushing undefined value in child array (Box1)\n" unless(defined $child);
+  push @{$self->{_childs}}, $child;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print function.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Box1::Print( ".join(', ', @_)." )\n" if(DBG::BOX1);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+
+  $outputer->Print(
+  	"<div class=\"box1\">\n",
+  	"  <div class=\"box1_content\">\n",
+  	"    <table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n",
+  );
+
+  my $indent2 = $outputer->Indent();
+  $outputer->Indent($indent2 . '      ');
+
+  foreach (@{$self->{_childs}})
+  {
+  	$outputer->_PreArray();
+    $_->Print();
+    $outputer->_PostArray();
+  }
+  
+  $outputer->Indent($indent2);
+  
+  $outputer->Print(
+    "    </table>\n",
+  	"  </div>\n",
+  	"</div>\n"
+  );
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::BOX1);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Box1 - HTML element - A simple blue box with round corners.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $box = $outputer->Create('Box1');
+
+=head1 DESCRIPTION
+
+This module creates a blue bordered HTML box with rounded corners. It requires the box1.css and
+box1.js files that can be found in the isis_interface.
+
+=head2 Box1(  ) :
+
+Create a new box. This constructor should not be called directly and should be created via the
+outputer factory available from the C<L<ISIS::HTMLManip>> module. For more information, see the
+perl documentation of C<L<ISIS::HTMLManip>>.
+
+=head2 PushChild( CHILD ) :
+
+Adds a HTML element to the box instance. These elements will be encapsulated in this box1 element
+and printed automatically when box1 is printed.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Debug.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,91 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Outputer.pm
+# Use    : Contains all debug constant symbols - Activates tracing in OUT packages.
+
+#
+# Synergy :
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT::Debug package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package DBG;
+
+use strict;
+use warnings;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+use constant _DEBUG => 0;
+                              
+use constant OUTPUTER           => _DEBUG && 0; # OUT/Outputer.pm
+use constant LOG_DOCUMENT       => _DEBUG && 0; # OUT/LogDocument.pm
+use constant LOG_HEADER         => _DEBUG && 0; # OUT/Log/Header.pm
+use constant LOG_FOOTER         => _DEBUG && 0; # OUT/Log/Footer.pm
+use constant LOG_MAINCONTENT    => _DEBUG && 0; # OUT/Log/MainContent.pm
+use constant LOG_SUMMARY        => _DEBUG && 0; # OUT/Log/Summary.pm
+use constant LOG_SUMMARYCONTENT => _DEBUG && 0; # OUT/Log/SummaryContent.pm
+use constant BOX1               => _DEBUG && 0; # OUT/Box1.pm
+use constant NODE               => _DEBUG && 0; # OUT/Node.pm
+use constant RAWTEXT            => _DEBUG && 0; # OUT/RawText.pm
+use constant TEXT               => _DEBUG && 0; # OUT/Text.pm
+use constant TITLE1             => _DEBUG && 0; # OUT/Title1.pm
+use constant IMAGE              => _DEBUG && 0; # OUT/Image.pm
+use constant TABLE2D            => _DEBUG && 0; # OUT/Table2D.pm
+use constant SEPARATOR          => _DEBUG && 0; # OUT/Separator.pm
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Debug - Definition of all debug symbols used to (de)activate tracing in the OUT module.
+
+=head1 SYNOPSIS
+
+Setting a constant value to 1 will activate tracing for all instances of the package. each call
+to a member subroutine of that package will be displayed on the terminal/sheel output.
+
+The package influenced by the symbol is written as a comment beside each constant.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Image.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Image.pm
+# Use    : Simple HTML image element.
+
+#
+# Synergy :
+# Perl %name: Image.pm % (%full_filespec:  Image.pm-2:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Feb  2 14:18:22 2006 %
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Image;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '21/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Image( ", join(', ', @_), " )\n" if(DBG::IMAGE);
+  my $outputer = pop;
+  
+  bless { file      => $outputer->Interface().$_[1],
+          height    => pop,
+          width     => pop,
+          alt       => undef,          
+          _outputer => $outputer,
+        }, shift; 
+}
+
+sub Print
+{
+  my $self = shift;
+  my $outputer = $self->{_outputer};
+  $self->{alt} ||= '';
+  
+  $outputer->Print("<div class=\"icon\">\n",
+                   "  <img src=\"", $self->{file}, "\" width=\"", $self->{width}, "\" height=\"", $self->{height}, "\" alt=\"", $self->{alt}, "\" />\n",
+                   "</div>\n"
+                  );
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::IMAGE);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/Document.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,225 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : LogDocument.pm
+# Use    : Creates a HTML document instance.
+
+#
+# Synergy :
+# Perl %name: Document.pm % (%full_filespec:  Document.pm-3:perl:fa1s60p1#1 %)
+# %derived_by:  oligrant %
+# %date_created:  Thu Apr  6 10:52:15 2006 %
+#
+# Version History :
+# v1.0.1 (05/04/2006)
+#  - Updated CSS and JS file dependancy printout to match new storage in Outputer.
+#
+# v1.0 (13/12/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT::Document package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Log::Document;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.0.1';
+use constant ISIS_LAST_UPDATE => '05/04/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	warn "new OUT::Log::Document( ".join(', ', @_)." )\n" if(DBG::LOG_DOCUMENT);
+
+	my ($outputer) = $_[$#_];
+
+	bless { 'OUT::Log::Document::Header'  => undef,
+          'OUT::Log::Document::Footer'  => undef,
+          'OUT::Log::Document::Menu'    => undef,
+          'OUT::Log::Document::Summary' => undef,
+          _childs                       => undef,
+          _outputer                     => $outputer
+				}, shift;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Child.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+	warn "OUT::Log::Document::PushChild( ".join(', ', @_)." )\n" if(DBG::LOG_DOCUMENT);
+  my $self = shift;
+  push @{$self->{_childs}}, shift if(@_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor for header, footer and menu.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_DOCUMENT);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  $self->{$method} = shift if (@_);
+  return $self->{$method};
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Log::Document::Print( ".join(', ', @_)." )\n" if(DBG::LOG_DOCUMENT);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  my $iface    = $outputer->Interface();
+  my $id       = $outputer->Id();
+
+  $outputer->Print(  
+  	"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
+    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n",
+    "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n",
+    "<head>\n",
+    "  <title>Nokia Automated Build</title>\n"
+  );
+  
+	foreach my $css (@{$outputer->CSSFiles()}, @{$outputer->UserCSSFiles()})
+	{ $outputer->Print("  <link href=\"", $iface, $css, "\" rel=\"stylesheet\" type=\"text/css\" />\n"); }
+	
+	foreach my $js (@{$outputer->JSFiles()}, @{$outputer->UserJSFiles()})
+	{ $outputer->Print("  <script type=\"text/javascript\" src=\"", $iface, $js, "\"></script>\n"); }
+
+  $outputer->Print(
+    "</head>\n\n",
+    "<body>\n\n",
+  );
+  
+  $outputer->Indent($indent . '  ');
+  $self->{'OUT::Log::Document::Header'}->Print() if($self->{'OUT::Log::Document::Header'});
+  $outputer->Indent($indent);
+  
+  $outputer->Indent($indent . '  ');
+  $self->{'OUT::Log::Document::Summary'}->Print() if($self->{'OUT::Log::Document::Summary'});
+  $outputer->Indent($indent);
+  
+  $outputer->Print("  <div id=\"mb\">\n");
+  
+  $outputer->Id($id + 1);
+  $outputer->Indent($indent . '    ');
+  if(defined $self->{_childs})
+  { foreach (@{$self->{_childs}}) { $_->Print(); } }
+  $outputer->Indent($indent);
+  
+  $outputer->Print("  </div>\n");
+
+	$outputer->Indent($indent . '  ');
+	$self->{'OUT::Log::Document::Footer'}->Print() if ($self->{'OUT::Log::Document::Footer'});
+	$outputer->Indent($indent);
+
+	$outputer->Print(
+    "</body>\n\n",
+    "</html>\n"
+  );
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Log::Document - A simple HTML template document for log files.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+	
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $document = $outputer->Create('LogDocument');
+	
+	# add childs to the document ...
+	
+	$document->Print();
+	close($ostream);
+
+=head1 DESCRIPTION
+
+This package provides a simple HTML template body for log files, with a header,
+body, and footer parts as described below :
+
+=begin text
+
+	+--------------------+
+	| header             |
+	+--------------------+
+	|                    |
+	| main body          |
+	|                    |
+	+--------------------+
+	| footer             |
+	+--------------------+
+
+=end text
+
+=head2 Header(  ) :
+
+Set or return the current header for the document. By default, the document doesn't
+have any header.
+
+=head2 Footer(  ) :
+
+Set or return the current footer for the document. By default, the document doesn't
+have any footer.
+
+=head2 PushChild( CHILD ) :
+
+Add a child to the document main body. The childs will be printed automatically in
+the order they are pushed.
+
+=head2 Print(  ) :
+
+Prints the full HTML document to the output stream attached to the outputer created
+with 'ISIS::HTMLManip'. This should be the only 'Print' subroutine called in the script
+using 'ISIS::HTMLManip' since all sub elements' Print subourtine will be called
+automatically. for more information, see its documentation.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/Footer.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+#
+#   Log::Footer package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Log::Footer;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '15/12/2005';
+
+sub new
+{
+	warn "new OUT::Log::Footer( ".join(', ', @_)." )\n" if(DBG::LOG_FOOTER);
+	my ($class) = (shift);
+	
+	bless { 'OUT::Log::Footer::Title'    => shift,
+		      'OUT::Log::Footer::Subtitle' => shift,
+		      _outputer                    => shift,
+		    }, $class;
+}
+
+sub Print
+{
+	warn "OUT::Log::Footer::Print( ".join(', ', @_)." )\n" if(DBG::LOG_FOOTER);
+	my $self     = shift;
+	my $outputer = $self->{_outputer};
+	
+	$outputer->Print(
+	  "<div id=\"f_wrapper\">\n",
+	  "  <div class=\"f_elmt\">\n",
+	  "    <div class=\"f_title\">", $self->{'OUT::Log::Footer::Title'}, "</div>\n",
+	  "    <div class=\"f_subtitle\">", $self->{'OUT::Log::Footer::Subtitle'}, "</div>\n",
+	  "  </div>\n",
+	  "</div>\n"
+	);
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_FOOTER);
+	return $self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/Header.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+#
+#   Log::Header package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Log::Header;
+
+sub new 
+{
+	warn "new OUT::Log::Header( ".join(', ', @_)." )\n" if(DBG::LOG_HEADER);
+	my ($class) = (shift);
+	
+	bless { 'OUT::Log::Header::Title'    => shift,
+		      'OUT::Log::Header::Subtitle' => shift,
+		      _outputer                    => shift,
+		    }, $class;
+}
+
+sub Print
+{
+	warn "OUT::Log::Header::Print( ".join(', ', @_)." )\n" if(DBG::LOG_HEADER);
+	my $self     = shift;
+	my $outputer = $self->{_outputer};
+	
+	$outputer->Print(
+	  "<div id=\"h_wrapper\">\n",
+	  "  <div class=\"h_elmt\">\n",
+	  "    <div class=\"h_title\">", $self->{'OUT::Log::Header::Title'}, "</div>\n",
+	  "    <div class=\"h_subtitle\">", $self->{'OUT::Log::Header::Subtitle'}, "</div>\n",
+	  "  </div>\n",
+	  "</div>\n"
+	);
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_HEADER);
+	return $self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/LogoHeader.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : LogoHeader.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: LogoHeader.pm % (%full_filespec:  LogoHeader.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Mar 16 12:49:17 2006 %
+#
+# Version History :
+#
+# v1.0 (16/03/2006) :
+#  - Fist version of the package.
+#------------------------------------------------------------------------------
+
+package OUT::Log::LogoHeader;
+use ISIS::HttpServer;
+
+
+#------------------------------------------------------------------------------
+# Package's subroutines
+#------------------------------------------------------------------------------
+sub new 
+{
+	warn "new OUT::Log::LogoHeader( ".join(', ', @_)." )\n" if(DBG::LOG_HEADER);
+	my ($class) = (shift);
+	
+	bless { 'OUT::Log::LogoHeader::Title'    => shift,
+		      'OUT::Log::LogoHeader::Subtitle' => shift,
+		      'OUT::Log::LogoHeader::Config'   => shift,
+		      _outputer                    => shift,
+		    }, $class;
+}
+
+sub Print
+{
+	warn "OUT::Log::LogoHeader::Print( ".join(', ', @_)." )\n" if(DBG::LOG_HEADER);
+	my $self     = shift;
+	my $outputer = $self->{_outputer};
+
+	my @pics;
+	push @pics, "<div align=\"right\" style=\"position: absolute; top: 0px; right: 0px;\">";
+	foreach my $logo ( @{ $self->{'OUT::Log::LogoHeader::Config'}->Child('__logo') } )
+	{
+		my $param = '';		
+		$param .= "width=\"".$logo->Attribute('width')."\"" if ($logo->Attribute('width'));
+		$param .= "height=\"".$logo->Attribute('height')."\"" if ($logo->Attribute('height'));
+		if ($logo->Attribute('name') and $logo->Attribute('name')=~/^http:\/\//)
+		{			
+			push @pics, "    <img src=\"".$logo->Attribute('name')."\" $param />\n";
+		}
+  	elsif ($logo->Attribute('name'))
+  	{
+			push @pics, "<img src=\"".HttpServer::GetAddress().$logo->Attribute('name')."\" $param />\n";
+  	}
+  }
+
+	push @pics, "</div>";
+	
+	# May put the max size
+	$outputer->Print(
+	  "<div id=\"h_wrapper\" style=\"height: 128px;\">\n",
+	  "  <div class=\"h_elmt\">\n",
+	  "    <div class=\"h_title\">", $self->{'OUT::Log::LogoHeader::Title'}, "</div>\n",
+	  "    <div class=\"h_subtitle\">", $self->{'OUT::Log::LogoHeader::Subtitle'}, "</div>\n",
+	  join("\n", @pics),
+	  "  </div>\n",
+	  "</div>\n"
+	);
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_HEADER);
+	return $self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/MainContent.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,181 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : MainContent.pm
+# Use    : Creates a HTML document instance.
+
+#
+# Synergy :
+# Perl %name: MainContent.pm % (%full_filespec:  MainContent.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Mon Feb  6 14:31:57 2006 %
+#
+# Version History :
+#
+# v1.0 (13/12/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT::Document package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Log::MainContent;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	warn "new OUT::Log::MainContent( ".join(', ', @_)." )\n" if(DBG::LOG_MAINCONTENT);
+
+	my ($outputer) = pop;
+	$outputer->RequireCSSFile('css/logger2.css');
+
+	bless { _childs                    => undef,
+          _outputer                  => $outputer
+				}, shift;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Child.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+	warn "OUT::Log::MainContent::PushChild( ".join(', ', @_)." )\n" if(DBG::LOG_MAINCONTENT);
+  my $self = shift;
+  push @{$self->{_childs}}, shift if(@_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor for header, footer and menu.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_MAINCONTENT);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  $self->{$method} = shift if (@_);
+  return $self->{$method};
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Log::MainContent::Print( ".join(', ', @_)." )\n" if(DBG::LOG_MAINCONTENT);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  
+  $outputer->Print("<div class=\"mc\">\n");
+
+  $outputer->Indent($indent . '  ');
+  if(defined $self->{_childs})
+  { foreach (@{$self->{_childs}}) { $_->Print(); } }
+  $outputer->Indent($indent);
+  
+  $outputer->Print("</div>\n");
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Log::MainContent - A simple HTML template document for log files.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+	
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $document = $outputer->Create('LogDocument');
+	
+	# add childs to the document ...
+	
+	$document->Print();
+	close($ostream);
+
+=head1 DESCRIPTION
+
+This package provides a simple HTML template body for log files, with a header,
+body, and footer parts as described below :
+
+=begin text
+
+	+--------------------+
+	| header             |
+	+--------------------+
+	|                    |
+	| main body          |
+	|                    |
+	+--------------------+
+	| footer             |
+	+--------------------+
+
+=end text
+
+=head2 Header(  ) :
+
+Set or return the current header for the document. By default, the document doesn't
+have any header.
+
+=head2 Footer(  ) :
+
+Set or return the current footer for the document. By default, the document doesn't
+have any footer.
+
+=head2 PushChild( CHILD ) :
+
+Add a child to the document main body. The childs will be printed automatically in
+the order they are pushed.
+
+=head2 Print(  ) :
+
+Prints the full HTML document to the output stream attached to the outputer created
+with 'ISIS::HTMLManip'. This should be the only 'Print' subroutine called in the script
+using 'ISIS::HTMLManip' since all sub elements' Print subourtine will be called
+automatically. for more information, see its documentation.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/Summary.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,181 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Summary.pm
+# Use    : Creates a HTML log summary instance.
+
+#
+# Synergy :
+# Perl %name: Summary.pm % (%full_filespec:  Summary.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Mon Feb  6 14:32:00 2006 %
+#
+# Version History :
+#
+# v1.0 (13/12/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT::Log::Summary package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Log::Summary;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	warn "new OUT::Log::Summary( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARY);
+
+	my ($outputer) = pop;
+	$outputer->RequireCSSFile('css/logger2.css');
+
+	bless { _childs   => undef,
+          _outputer => $outputer
+				}, shift;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Child.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+	warn "OUT::Log::Summary::PushChild( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARY);
+  my $self = shift;
+  push @{$self->{_childs}}, shift if(@_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor for header, footer and menu.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARY);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  $self->{$method} = shift if (@_);
+  return $self->{$method};
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Log::Summary::Print( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARY);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  
+  $outputer->Print("<div id=\"s_mb\">\n");
+
+  $outputer->Indent($indent . '  ');
+  if(defined $self->{_childs})
+  { foreach (@{$self->{_childs}}) { $_->Print(); } }
+  $outputer->Indent($indent);
+  
+  $outputer->Print("</div>\n");
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Log::Summary - A simple HTML template document for log files.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+	
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $document = $outputer->Create('LogDocument');
+	
+	# add childs to the document ...
+	
+	$document->Print();
+	close($ostream);
+
+=head1 DESCRIPTION
+
+This package provides a simple HTML template body for log files, with a header,
+body, and footer parts as described below :
+
+=begin text
+
+	+--------------------+
+	| header             |
+	+--------------------+
+	|                    |
+	| main body          |
+	|                    |
+	+--------------------+
+	| footer             |
+	+--------------------+
+
+=end text
+
+=head2 Header(  ) :
+
+Set or return the current header for the document. By default, the document doesn't
+have any header.
+
+=head2 Footer(  ) :
+
+Set or return the current footer for the document. By default, the document doesn't
+have any footer.
+
+=head2 PushChild( CHILD ) :
+
+Add a child to the document main body. The childs will be printed automatically in
+the order they are pushed.
+
+=head2 Print(  ) :
+
+Prints the full HTML document to the output stream attached to the outputer created
+with 'ISIS::HTMLManip'. This should be the only 'Print' subroutine called in the script
+using 'ISIS::HTMLManip' since all sub elements' Print subourtine will be called
+automatically. for more information, see its documentation.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Log/SummaryContent.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,181 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : SummaryContent.pm
+# Use    : Creates a HTML log summary instance.
+
+#
+# Synergy :
+# Perl %name: SummaryContent.pm % (%full_filespec:  SummaryContent.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Mon Feb  6 14:32:07 2006 %
+#
+# Version History :
+#
+# v1.0 (13/12/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT::Log::SummaryContent package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Log::SummaryContent;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '13/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	warn "new OUT::Log::SummaryContent( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARYCONTENT);
+
+	my ($outputer) = pop;
+	$outputer->RequireCSSFile('css/logger2.css');
+
+	bless { _childs   => undef,
+          _outputer => $outputer
+				}, shift;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Child.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+	warn "OUT::Log::SummaryContent::PushChild( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARYCONTENT);
+  my $self = shift;
+  push @{$self->{_childs}}, shift if(@_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor for header, footer and menu.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  warn "$method( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARYCONTENT);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  $self->{$method} = shift if (@_);
+  return $self->{$method};
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Log::SummaryContent::Print( ".join(', ', @_)." )\n" if(DBG::LOG_SUMMARYCONTENT);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  
+  $outputer->Print("<div class=\"s_mc\">\n");
+
+  $outputer->Indent($indent . '  ');
+  if(defined $self->{_childs})
+  { foreach (@{$self->{_childs}}) { $_->Print(); } }
+  $outputer->Indent($indent);
+  
+  $outputer->Print("</div>\n");
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Log::SummaryContent - A simple HTML template document for log files.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+	
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $document = $outputer->Create('LogDocument');
+	
+	# add childs to the document ...
+	
+	$document->Print();
+	close($ostream);
+
+=head1 DESCRIPTION
+
+This package provides a simple HTML template body for log files, with a header,
+body, and footer parts as described below :
+
+=begin text
+
+	+--------------------+
+	| header             |
+	+--------------------+
+	|                    |
+	| main body          |
+	|                    |
+	+--------------------+
+	| footer             |
+	+--------------------+
+
+=end text
+
+=head2 Header(  ) :
+
+Set or return the current header for the document. By default, the document doesn't
+have any header.
+
+=head2 Footer(  ) :
+
+Set or return the current footer for the document. By default, the document doesn't
+have any footer.
+
+=head2 PushChild( CHILD ) :
+
+Add a child to the document main body. The childs will be printed automatically in
+the order they are pushed.
+
+=head2 Print(  ) :
+
+Prints the full HTML document to the output stream attached to the outputer created
+with 'ISIS::HTMLManip'. This should be the only 'Print' subroutine called in the script
+using 'ISIS::HTMLManip' since all sub elements' Print subourtine will be called
+automatically. for more information, see its documentation.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Node.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,227 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Node.pm
+# Use    : HTML node element that can toggle its content.
+
+#
+# Synergy :
+# Perl %name: Node.pm % (%full_filespec:  Node.pm-4.1.2:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Fri Mar 17 17:14:15 2006 %
+#
+# Version History :
+# v1.1.2 (15/03/2006)
+#  - Updated the package constructor to take an extra hash table as last argument.
+#  - Updated the Print subroutine to reflect added makeup to HTML look of nodes.
+#
+# v1.1.1 (01/02/2006)
+#  - Corrected node info display method to align cells.
+#
+# v1.1.0 (26/01/2006)
+#  - Corrected HTML to display node info correctly.
+#
+# v1.0.0 (12/11/2005)
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   NodeInfo package.
+#
+#--------------------------------------------------------------------------------------------------
+package _NodeInfo;
+
+sub new
+{
+  bless { _outputer => pop,
+          class     => pop,
+          value     => pop,
+        }, shift;
+}
+
+sub AUTOLOAD
+{
+  my $self = shift;
+  $self->{_outputer}->_Accessor($self, our $AUTOLOAD, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Node package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Node;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+use ISIS::HttpServer;
+
+use constant ISIS_VERSION     => '1.1.2';
+use constant ISIS_LAST_UPDATE => '15/03/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Node( ".join(", ", @_)." )\n" if(DBG::NODE);
+  my ($class, $outputer, @childs) = (shift, pop);
+  
+  my $title  = shift || 'No title';
+	my $makeup = shift || {};
+  
+  $outputer->RequireJSFile('javascript/expand2.js');
+
+  bless { title     => $title,
+          style     => $makeup->{style} || 'node_details',
+          anim      => $makeup->{anim} || 'button',
+          icon      => $makeup->{icon} || undef,
+          _info     => undef,
+          _childs   => \@childs,
+          _outputer => $outputer,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Node Information.
+#--------------------------------------------------------------------------------------------------
+sub PushNodeInfo
+{
+  warn "OUT::Node::PushNodeInfo( ", join(', ', @_), " )\n" if(DBG::NODE);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+
+  push @{$self->{_info}}, new _NodeInfo(shift, shift || 'text_default', $outputer) if(@_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Push Child.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+  warn "OUT::Node::PushChild( ", join(', ', @_), " )\n" if(DBG::NODE);
+  my $self = shift;
+  push @{$self->{_childs}}, shift if(@_);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print function.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+  warn "OUT::Node::Print( ", join(', ', @_), " )\n" if(DBG::NODE);
+  my $self     = shift;
+  
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  my $iface    = $outputer->Interface();
+  my $id       = $outputer->Id();
+
+  $outputer->Id($id + 1);
+  
+  $outputer->Print("<div class=\"node_head\">\n");
+  
+  if(scalar @{$self->{_childs}})
+  {	
+  	$outputer->Print("  <a href=\"javascript:ToggleNode(\'Img", $id, "\')\">\n");
+  	$outputer->Indent($indent . '  ');
+  }
+                   
+  $outputer->Print("  <span id=\"Img", $id, "\" style=\"background:url(".HttpServer::GetAddress()."/isis_interface/img/icons/", $self->{anim}, "_", (scalar @{$self->{_childs}} ? 'open' : 'invalid'), ".gif) no-repeat\">\n",
+                   "    <span class=\"node_title\">\n",
+                   (defined $self->{icon} ? "<span class=\"".$self->{icon}."\">\n" : ""),
+                   "      ", $self->{title}, "\n",
+                   (defined $self->{icon} ? "</span>\n" : ""),
+                   "    </span>\n",
+                   "  </span>\n"
+                   );
+
+  if(scalar @{$self->{_childs}})
+  {
+  	$outputer->Indent($indent);
+  	$outputer->Print(
+  									 "  </a>\n",
+	                   "  <a href=\"javascript:ShowChilds(\'Img", $id, "\')\"><span class=\"node_action\">\[Show All\]</span></a>\n",
+	                   "  <a href=\"javascript:HideChilds(\'Img", $id, "\')\"><span class=\"node_action\">\[Hide All\]</span></a>\n",
+	                   "  <a href=\"javascript:ToggleNode(\'Img", $id, "\')\">\n"
+	                  );
+	  $outputer->Indent($indent . '  ');
+  }
+                  
+  if($self->{_info})
+  {
+  	$outputer->Print("  <span class=\"node_info\">\n");
+    foreach my $info (@{$self->{_info}})
+    { $outputer->Print("    <span class=\"", $info->Class(), "\">", $info->Value(), "</span>\n"); }
+    $outputer->Print("  </span>\n");
+  }
+  
+  if(scalar @{$self->{_childs}})
+  {
+  	$outputer->Indent($indent);
+  	$outputer->Print("  </a>\n");
+  }
+  
+  $outputer->Print("</div>\n");
+  
+  if(scalar @{$self->{_childs}})
+  {
+  	$outputer->Print(
+	                   "<div id=\"Content", $id, "\" style=\"display:none\">\n",
+	                   "  <div class=\"node_content\">\n"
+	                  );
+  	
+    $outputer->Indent($indent . '    ');
+    foreach (@{$self->{_childs}})
+    { $_->Print(); }
+    $outputer->Indent($indent);
+    
+    $outputer->Print(
+	                   "   </div>\n",
+	                   "</div>\n"
+	                  );
+  }
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  warn "$method( ".join(', ', @_)." )\n" if(DBG::NODE);
+  $self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Outputer.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,414 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Outputer.pm
+# Use    : Contains an instanciable package to write complex html files.
+
+#
+# Synergy :
+#
+# Version History :
+# v1.0.3 (06/04/2006)
+#  - Reworte the way user defined CSS files are handled to make sure they are the last ones
+#    included in the document body to allow overwriting of certain values.
+#
+# v1.0.2 (05/04/2006)
+#  - Changed storage for CSS and JS files to arrays to keep inputed order.
+#
+# v1.0.1 (07/02/2006)
+#  - Updated 'Outputer' package to use HTTP Server.
+#
+# v1.0.0 (12/11/2005)
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   OUT::Outputer package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Outputer;
+
+use strict;
+use warnings;
+use ISIS::HttpServer;
+use ISIS::XMLManip;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => 'v1.0.3';
+use constant ISIS_LAST_UPDATE => '05/04/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Outputer( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $ostream, $config, $interface_root, %vars) = (shift, shift, shift, shift);
+  my (@stylesheets, @javascripts, @user_stylesheets, @user_javascripts);
+  
+  if(not defined $interface_root) { $interface_root = ''; }
+  else { $interface_root .= '/' if($interface_root !~ /.+\/$/); }
+  
+  $vars{'OUT::Outputer::Ofile'}        = $ostream;
+  $vars{'OUT::Outputer::Indent'}       = '';
+  $vars{'OUT::Outputer::Id'}           = 0;
+  $vars{'OUT::Outputer::Interface'}    = $interface_root;
+  $vars{'OUT::Outputer::CSSFiles'}     = \@stylesheets;
+  $vars{'OUT::Outputer::JSFiles'}      = \@javascripts;
+  $vars{'OUT::Outputer::UserCSSFiles'} = \@user_stylesheets;
+  $vars{'OUT::Outputer::UserJSFiles'}  = \@user_javascripts;
+
+	if ($interface_root =~ /^http:\/\//)
+	{
+		my $temp = $ENV{'TEMP'} || $ENV{'TMP'} || '.';
+		HttpServer::GetFile("$interface_root$config", "$temp/$config"); # or die "Unable to retrieve configuration file $config";
+		$vars{_cfg} = &XMLManip::ParseXMLFile("$temp/$config");
+	}
+	else
+	{
+		$vars{_cfg} = &XMLManip::ParseXMLFile($interface_root.$config);
+	}
+  
+  foreach (@{$vars{_cfg}->Childs()})
+  {
+    if(defined @{$vars{_cfg}->Childs()})
+    { 
+      $vars{'_cfg_'.$_->Type()} = $_->Childs();
+    }
+  }
+
+  bless \%vars, $self;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Factory
+#--------------------------------------------------------------------------------------------------
+sub Create
+{
+  warn "OUT::Outputer::Create( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $type) = (shift, 'OUT::'.shift);
+  
+  eval "require ISIS::$type";
+  if($@){ warn $@; return undef; }
+  return $type->new(@_, $self);
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+  warn "OUT::Outputer::Print( ".$_[0]." )\n" if(DBG::OUTPUTER);
+  my $self   = shift;
+  my $indent = $self->{'OUT::Outputer::Indent'};
+  my $out    = $self->{'OUT::Outputer::Ofile'};
+
+  my @lines = map{ $indent.$_."\n" } split('\n', join('', @_));
+
+  $out->print(join('', @lines)) if @_;
+}
+
+#--------------------------------------------------------------------------------------------------
+# RequireCSSFile
+#--------------------------------------------------------------------------------------------------
+sub RequireCSSFile
+{
+  warn "OUT::Outputer::RequireCSSFile( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $filename) = (shift, shift);
+  
+  foreach my $css (@{$self->{'OUT::Outputer::CSSFiles'}})
+  { return if($css eq $filename); }
+  
+  push @{$self->{'OUT::Outputer::CSSFiles'}}, $filename;
+}
+
+#--------------------------------------------------------------------------------------------------
+# RequireJavaScript
+#--------------------------------------------------------------------------------------------------
+sub RequireJSFile
+{
+  warn "OUT::Outputer::RequireJSFile( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $filename) = (shift, shift);
+  
+  foreach my $js (@{$self->{'OUT::Outputer::JSFiles'}})
+  { return if($js eq $filename); }
+  
+  push @{$self->{'OUT::Outputer::JSFiles'}}, $filename;
+}
+
+#--------------------------------------------------------------------------------------------------
+# RequireCSSFile
+#--------------------------------------------------------------------------------------------------
+sub UserRequireCSSFile
+{
+  warn "OUT::Outputer::UserRequireCSSFile( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $filename) = (shift, shift);
+
+  foreach my $css (@{$self->{'OUT::Outputer::UserCSSFiles'}})
+  { return if($css eq $filename); }
+
+  push @{$self->{'OUT::Outputer::UserCSSFiles'}}, $filename;
+}
+
+#--------------------------------------------------------------------------------------------------
+# RequireJavaScript
+#--------------------------------------------------------------------------------------------------
+sub UserRequireJSFile
+{
+  warn "OUT::Outputer::UserRequireJSFile( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $filename) = (shift, shift);
+  
+  foreach my $js (@{$self->{'OUT::Outputer::UserJSFiles'}})
+  { return if($js eq $filename); }
+  
+  push @{$self->{'OUT::Outputer::UserJSFiles'}}, $filename;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Get icon based on keyword.
+#--------------------------------------------------------------------------------------------------
+sub GetAssociatedImage
+{
+  warn "OUT::Outputer::GetAssociatedImage( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $type, $res) = (shift, shift);
+  
+  foreach (@{$self->{_cfg_icons}})
+  {
+    my $pattern = $_->Attribute('type');
+    if($type =~ /^$pattern$/)
+    {
+      return $self->Create('Image', $_->Attribute('img'),
+                                    $_->Attribute('width'),
+                                    $_->Attribute('height'),
+                          );
+    }
+  }
+  
+  return undef;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Get class based on keyword.
+#--------------------------------------------------------------------------------------------------
+sub GetAssociatedClass
+{
+  warn "OUT::Outputer::GetAssociatedClass( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  my ($self, $type, $res) = (shift, shift);
+  
+  $res = "undefined_type_".join('_', split(' ', $type));
+  
+  foreach (@{$self->{_cfg_icons}})
+  {
+    my $pattern = $_->Attribute('type');
+    if($type =~ /^$pattern$/)
+    { return $_->Attribute('class'); }
+  }
+  
+  return $res;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{ 
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  warn "$method( ".join(', ', @_)." )\n" if(DBG::OUTPUTER);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+ 
+  $self->{$method} = shift if @_;
+  return $self->{$method}; 
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor subroutine to be called by OUT packages by their AUTOLOAD overload.
+# Takes the normal method autoload name, ie : 'OUT::Node::Text', and strips out all package
+# reference, adds an underscore and lowercases the method name, ie '_text'.
+#--------------------------------------------------------------------------------------------------
+sub _Accessor
+{
+  my ($self, $object, $method) = (shift, shift, shift);
+  return if($method =~ /::DESTROY$/);
+  
+  $method =~ s/^.*:://;
+  $method = lc($method);
+  return if not exists $object->{$method};
+  
+  $object->{$method} = shift if @_;
+  return $object->{$method};
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Outputer - OUT object factory and printer for complex html files.
+
+=head1 SYNOPSIS
+
+  use ISIS::HTMLManip;
+
+  open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+  my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+  
+  my $object = $outputer->Create('ObjectType', $arg1, $arg2, ...);
+
+=head1 DESCRIPTION
+
+The Outputer package provides the mechanics necessary to have all objects of the
+OUT module coexist and communicate. From a user's point of view, it acts as an 
+OUT object factory. The 'Create' function calls the object type constructor and
+passes itself as the last argument of the constructor, allowing created objects
+to directly interact with the outputer they will be using.
+
+=head2 Outputer ( OSTREAM, CONFIGURATION, INTERFACE ) :
+
+Returns a newly constructed L<OUT::Outputer> instance that will printout to the passed
+output stream. The configuration file is used for generic values such as icons and 
+colors. The interface determines the root directory from with all the HTML style information
+will be taken. For a simpler use, this constructor should not be called directly, but
+the user should load the L<ISIS::HTMLManip> module that provides a wrapper constructor.
+
+The Outputer contains at least one hidden hash key '_cfg' that accesses the root node
+of the parsed XML configuration file using the L<ISIS::XMLManip> module. All child nodes
+of the root node of the XML configuration file will be used as keys '_cfg_.name'for access
+to an array containing itself all their child nodes for easier access :
+
+Such an XML configuration file :
+
+  <htmloutput>
+    <icons>
+      <icon type="error"   class=".msg_error"   img="img/icons/error.gif"   width="16" height="16"/>
+      <icon type="warning" class=".msg_warning" img="img/icons/warning.gif" width="16" height="16"/>
+      <icon type="good"    class=".msg_good"    img="img/icons/good.gif"    width="16" height="16"/>
+      <icon type=".*"      class=".msg_default" img="img/icons/default.png" width="20" height="16"/>
+    </icons>
+  </htmloutput>
+
+Will result in this hash table :
+
+  $vars{_cfg} => htmloutputNode;
+  $vasr{_cfg_icons} => @{ iconNode, iconNode, iconNode, iconNode };
+
+For more information on how to access data from that root node, see the L<ISIS::XMLManip>
+documentaion.
+
+=head2 Create ( OBJECTTYPE, [ARG1, [ARG2, ...]] ) :
+
+Returns an OUT object created by a call to the object type constructor. Arguments that
+need to be passed to the constructor can be passed via this subroutine. The necessary
+OUT:: submodule for creating the object will be loaded. If the module is not found, or
+the constructor fails, undef will be returned. Note that the objecttype should not contain
+the 'OUT::' prefix, as the only place the factory will look for the module is in the OUT
+subdirectory.
+
+=head2 RequireCSSFile( PATH ) :
+
+Should be called by an OUT object's constructor. This registers a CSS file necessary for
+the correct displaying of the caller object's class. The same file can be specified several
+times without harm.
+
+=head2 RequireJSFile( PATH ) :
+
+Should be called by an OUT object's constructor. This registers a JavaScript file necessary
+for the correct displaying of the caller object's class. The same file can be specified
+several times without harm.
+
+=head2 GetAssociatedImage( FILETYPE ) :
+
+Returns the correct image based on a file type. Icons should be specified in the
+configuration XML file used by the outputer, for more information on the XML configuration
+file, see L<CONFIGURATION FILE>.
+
+=head2 GetAssociatedClass( FILETYPE ) :
+
+Returns the correct class based on a file type. Icons should be specified in the configuration
+XML file used by the outputer, for more information on the XML configuration file, see
+L<CONFIGURATION FILE>.
+
+=head2 Print( TEXT ) :
+
+Prints the text to the output stream associated to the outputer. There is no need to take
+care of the indentation prior to a call to print since it will automatically be formatted.
+
+=head2 Indent(  ) :
+
+Sets or returns the current indent used when printing to the output stream to respect HTML
+node indentations. This value can be freely changed by the user.
+
+=head2 Interface(  ) :
+
+Sets or returns the interface root to be used when looking for javascript, css and image files.
+
+=head2 Id(  ) :
+
+Sets or returns the current global id used when printing out HTML nodes. This Id is used to
+uniquely identify certain HTML nodes throughout the HTML document allowing javascripts to
+access these nodes using the javascript 'GetElementById' function. Users should remember to
+increment this value as soon as they do not require it anymore.
+
+=head2 _Accessor(  ) :
+
+This subroutine is a simple AUTOLOAD accessor that can be called directly by OUT objects. OUT
+object authors can easily define an accessor with the following syntax.
+
+  sub new
+  {
+    bless { # other hash elements ...
+            _outputer => pop,
+          }, shift;
+  }
+
+  sub AUTOLOAD
+  {
+    my ($self, $method) = (shift, our $AUTOLOAD);
+    return $self->{_outputer}->_Accessor($self, $method, @_);
+  }
+
+This allows to avoid having long hash strings as keys like the classic AUTOLOAD mechanism. For
+example, if the OUT object has an 'icon' object in its hash :
+
+  sub new
+  {
+    bless { icon      => undef, # initialization
+            _outputer => pop,
+          }, shift;
+  }
+
+And having the same AUTOLOAD definition as above, you can just call:
+
+  my $obj = $outputer->Create('obj_type'); # and other eventual args.
+  $obj->Icon()         # will return $obj->{icon}.
+  $obj->Icon($my_icon) # will set $obj->{icon} = $my_icon.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/RawText.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,130 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : RawText.pm
+# Use    : Creates a preformatted text using a <PRE> HTML element.
+
+#
+# Synergy :
+# Perl %name: RawText.pm % (%full_filespec:  RawText.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Jan 12 10:13:56 2006 %
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   RawText package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::RawText;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '20/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::RawText( <text> )\n" if(DBG::RAWTEXT);
+
+  my $class    = shift;
+	my $outputer = pop;
+	my $text     = join('', @_);
+	
+  bless { content   => $text,
+          _outputer => $outputer,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print function.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::RawText::Print( ".join(', ', @_)." )\n" if(DBG::RAWTEXT);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+
+  $outputer->Print("<PRE class=\"raw_text\">\n");
+  $outputer->Indent('');
+  $outputer->Print($self->{content});
+  $outputer->Indent($indent);
+  $outputer->Print("</PRE>\n");
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::RAWTEXT);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::RawText - HTML element - A simple raw text for displaying preformatted text.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $rawtext = $outputer->Create('RawText');
+
+=head1 DESCRIPTION
+
+This module creates a simple raw text HTML element using the <pre> HTML element.
+
+=head2 RawText( [TEXT1, [TEXT2, ...]], OUTPUTER ) :
+
+Creates a new raw text html element. This constructor should not be called directly and should be
+created via the outputer factory available from the C<L<ISIS::HTMLManip>> module. For more
+information, see the perl documentation of C<L<ISIS::HTMLManip>>.
+
+=head2 Content( [TEXT] ) :
+
+Sets or returns the current text associated to the raw text element.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Separator.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,123 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Separator.pm
+# Use    : Normal HTML separator.
+
+#
+# Synergy :
+#
+# Version History :
+#
+# v1.0.0 (16/03/2006) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Separator package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Separator;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.0.0';
+use constant ISIS_LAST_UPDATE => '16/03/2006';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Separator( ", join(', ', @_), " )\n" if(DBG::SEPARATOR);
+
+  my $class    = shift;
+	my $outputer = pop;
+
+  bless { style     => shift,
+          _outputer => $outputer,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print function.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Separator::Print( ".join(', ', @_)." )\n" if(DBG::SEPARATOR);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+ 	              
+	$outputer->Print("<div class=\"".($self->{style})."\" ></div>\n");
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::SEPARATOR);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Separator - HTML element - A simple separator element.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $text = $outputer->Create('Separator', 'css_separator_style');
+
+=head1 DESCRIPTION
+
+This module creates a simple separator HTML element as an HTML <div> element.
+
+=head2 Separator( <STYLE> ) :
+
+Creates a new separator html element. This constructor should not be called directly and should be
+created via the outputer factory available from the C<L<ISIS::HTMLManip>> module. For more
+information, see the perl documentation of C<L<ISIS::HTMLManip>>.
+
+=head2 Style( [STYLE] ) :
+
+Sets or returns the current style that will be associated to the text. The style should be a
+css class definition. By default, the class associated to the <div> element is 'text_default'.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Table2D.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,184 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Table2D.pm
+# Use    : Fast simple HTML table of any dimension.
+
+#
+# Synergy :
+# Perl %name: Table2D.pm % (%full_filespec:  Table2D.pm-3:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Mon Feb  6 13:34:47 2006 %
+#
+# Version History :
+# v1.1.0 (01/02/2006)
+#  - Added 'SetColumnAttr', 'SetRowAttr', 'SetCellAttr' subroutines to Table2D.
+#
+# v1.0.0 (24/11/2005)
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+package OUT::Table2D;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Table2D( ", join(', ', @_), " )\n" if(DBG::TABLE2D);
+  
+  my ($class, $outputer, $lines) = (shift, pop, shift || {});
+  
+  $outputer->RequireCSSFile('css/logger2.css');
+  
+  my $self = bless { width     => 0,
+                     height    => 0,
+                     _childs   => undef,
+                     _widths   => undef,
+                     _outputer => $outputer,
+                   }, $class;
+  
+  foreach (sort keys %{$lines}) { $self->AddLine($_, ${$lines}{$_}); }
+  
+  return $self;
+}
+
+#--------------------------------------------------------------------------------------------------
+# AddLine
+#--------------------------------------------------------------------------------------------------
+sub AddLine
+{
+  warn "OUT::Table2D::AddLine( ", join(', ', @_), ")\n" if(DBG::TABLE2D);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+
+  my @line = map { ref $_ eq '' ? $outputer->Create('Text', $_) : $_ } @_;
+  push @{$self->{_childs}}, \@line;
+
+	my @attrs = map { {} } @_;
+	push @{$self->{_attrs}}, \@attrs;
+
+  $self->{width} = scalar(@_) if(scalar(@_) > $self->{width});
+  ++$self->{height};
+}
+
+sub SetRowAttr
+{
+	my ($self, $idx, $attrs) = (shift, shift, shift);
+	
+	foreach my $rowAttr (@{$self->{_attrs}->[$idx]})
+	{ 
+		foreach my $attr (keys %$attrs)
+		{ print $$attrs{$attr}, "\n"; $$rowAttr{$attr} = $$attrs{$attr}; }
+	}
+}
+
+sub SetColumnAttr
+{
+	my ($self, $idx, $attrs) = (shift, shift, shift);
+	
+	foreach my $columnAttr (@{$self->{_attrs}})
+	{ 
+		foreach my $attr (keys %$attrs)
+		{ $columnAttr->[$idx]->{$attr} = $$attrs{$attr}; }
+	}
+}
+
+sub SetCellAttr
+{
+	my ($self, $col, $row, $attrs) = (shift, shift, shift, shift);
+	
+	foreach my $attr (keys %$attrs)
+	{ $self->{_attrs}->[$col]->[$row]->{$attr} = $$attrs{$attr}; }
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+  warn "OUT::Table2D::Print( ", join(', ', @_), " )\n" if(DBG::TABLE2D);
+	my $self     = shift;
+	my $outputer = $self->{_outputer};
+	my $indent   = $outputer->Indent();
+
+  $outputer->Print("<div class=\"t_wrapper\">\n",
+                   "  <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n"
+                  );
+
+	for my $col (0 .. $#{$self->{_childs}})
+	{
+		$outputer->Print("    <tr>\n");
+		
+		for my $row (0 .. $#{$self->{_childs}->[$col]})
+		{
+			my $attrs = $self->{_attrs}->[$col]->[$row];
+			if(keys %$attrs)
+			{
+				$outputer->Print("      <td ", join(' ', map { "$_=\"".$attrs->{$_}."\"" } keys %$attrs), ">\n");
+			}
+			else
+			{
+				$outputer->Print("      <td>\n");
+			}
+			
+			$outputer->Indent($indent . '        ');
+			$self->{_childs}->[$col]->[$row]->Print();
+			$outputer->Indent($indent);
+			$outputer->Print("      </td>\n");
+		}
+		
+		$outputer->Print("    </tr>\n");
+	}
+	
+	$outputer->Print("  </table>\n",
+	                 "</div>\n"
+	                );
+}
+
+#--------------------------------------------------------------------------------------------------
+# Accessor.
+#--------------------------------------------------------------------------------------------------
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::TABLE2D);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Text.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,158 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Text.pm
+# Use    : Normal HTML text with optional icon.
+
+#
+# Synergy :
+# Perl %name: Text.pm % (%full_filespec:  Text.pm-10:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Fri Mar 31 14:04:50 2006 %
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Text package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Text;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+use HTML::Entities;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '21/12/2005';
+
+use overload q("") => \&_AsString;
+
+sub _AsString
+{
+  my ($self) = (shift);
+  return $self->{content};
+}
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Text( <text> )\n" if(DBG::TEXT);
+
+  my $class    = shift;
+	my $outputer = pop;
+	my $text = join('', @_);
+	$text =~ s/\n/<br\/>/g;
+	&__String2XML($text);
+
+  bless { style     => undef,
+  	      content   => $text,
+          _outputer => $outputer,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print function.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Text::Print( ".join(', ', @_)." )\n" if(DBG::TEXT);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  
+  $self->{style} ||= 'text_default';
+ 	              
+	$outputer->Print("<div class=\"".($self->{style})."\" >\n");
+	$outputer->Indent($indent . '  ');
+	$outputer->Print($self->{content});
+	$outputer->Indent($indent);
+	$outputer->Print("</div>\n");
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::TEXT);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+sub __String2XML
+{
+  my $str = shift || '';
+  $str =~ s/\e/e/;
+  $str = HTML::Entities::encode_entities($str);
+  return $str;
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Text - HTML element - A simple text element with optional icon.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $rawtext = $outputer->Create('RawText');
+
+=head1 DESCRIPTION
+
+This module creates a simple text HTML element encapsulated in a HTML <div> element.
+
+=head2 Text( [TEXT1, [TEXT2, ...]], OUTPUTER ) :
+
+Creates a new text html element. This constructor should not be called directly and should be
+created via the outputer factory available from the C<L<ISIS::HTMLManip>> module. For more
+information, see the perl documentation of C<L<ISIS::HTMLManip>>.
+
+=head2 Icon( [ICON] ) :
+
+Sets or returns the current icon attached to the text. By default, there is no icon set.
+Icons should be set only by passing a reference to a C<L<OUT::Image>> instance.
+
+=head2 Style( [STYLE] ) :
+
+Sets or returns the current style that will be associated to the text. The style should be a
+css class definition. By default, the class associated to the <div> element is 'text_default'.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OUT/Title1.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,139 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/perl -w
+#--------------------------------------------------------------------------------------------------
+# Name   : Title1.pm
+# Use    : Normal HTML title with optional icon.
+
+#
+# Synergy :
+# Perl %name: Title1.pm % (%full_filespec:  Title1.pm-1:perl:fa1s60p1#1 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Jan 12 10:14:06 2006 %
+#
+# Version History :
+#
+# v1.0 (12/11/2005) :
+#  - Fist version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Title1 package.
+#
+#--------------------------------------------------------------------------------------------------
+package OUT::Title1;
+
+use strict;
+use warnings;
+use ISIS::OUT::Outputer;
+use ISIS::OUT::Debug;
+
+use constant ISIS_VERSION     => '1.00';
+use constant ISIS_LAST_UPDATE => '21/12/2005';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  warn "new OUT::Title1( <text> )\n" if(DBG::TITLE1);
+
+  my $class    = shift;
+	my $outputer = pop;
+	my $text     = join('', @_);
+	
+  bless { icon      => undef,
+  	      content   => $text,
+          _outputer => $outputer,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print function.
+#--------------------------------------------------------------------------------------------------
+sub Print
+{
+	warn "OUT::Title1::Print( ".join(', ', @_)." )\n" if(DBG::TITLE1);
+  my $self     = shift;
+  my $outputer = $self->{_outputer};
+  my $indent   = $outputer->Indent();
+  my $icon     = $self->{icon};
+  
+  $self->{content} =~ s/\n//g;
+
+	if(defined $icon and ref $icon eq 'OUT::Image')
+	{
+		$outputer->Indent($indent . '        ');
+	 	$icon->Print();
+	 	$outputer->Indent($indent);
+	}
+
+ 	$outputer->Print("<h1>", $self->{content}, "</h1>\n");
+}
+
+sub AUTOLOAD
+{
+	my ($self, $method) = (shift, our $AUTOLOAD);
+	warn "$method( ".join(', ', @_)." )\n" if(DBG::TITLE1);
+	$self->{_outputer}->_Accessor($self, $method, @_);
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+OUT::Title1 - A simple title using the <h1> HTML element.
+
+=head1 SYNOPSIS
+
+	use ISIS::HTMLManip;
+
+	open($ostream, '>'.$htmlfile) or return ERR::FILE_CREATION_FAILED;
+	my $outputer = new HTMLManip($ostream, 'configuration.xml', 'isis_interface');
+	my $title = $outputer->Create('Title1');
+
+=head1 DESCRIPTION
+
+This module creates a simple text HTML element encapsulated in a HTML <div> element.
+
+=head2 Title( [TITLE] ) :
+
+Creates a new title element. An optional image type that will be looked up in the configuration XML
+file will be used. See C<L<ISIS::HTMLManip>> for more information. This constructor should not be
+called directly and should be created via the outputer factory available from the C<L<ISIS::HTMLManip>>
+module. For more information, see the perl documentation of C<L<ISIS::HTMLManip>>.
+
+=head2 Icon( [ICON] ) :
+
+Sets or returns the current icon attached to the text. By default, there is no icon set.
+Icons should be set only by passing a reference to a C<L<OUT::Image>> instance.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/OutputParser.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : OutputParser.pm
+# Use    : description.
+
+#
+# Synergy :
+# Perl %name: OutputParser.pm % (%full_filespec:  OutputParser.pm-1:perl:fa1s60p1#2 %)
+# %derived_by:  wbernard %
+# %date_created:  Thu Feb  9 08:24:25 2006 %
+#
+# Version History :
+#
+# v1.0 (24/10/2005) :
+#  - Fist version of the package.
+#  - Based on localisation one.
+#------------------------------------------------------------------------------
+
+package ISIS::OutputParser;
+use strict;
+use ISIS::Logger2;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0';
+use constant ISIS_LAST_UPDATE => '24/10/2005';
+
+
+#------------------------------------------------------------------------------
+# Package's subroutines
+#------------------------------------------------------------------------------
+
+sub ParseMakeFPSX
+{
+	my ($output) = @_;
+	my $buffer = "";
+	foreach my $line ( split(/\n/, $output) )
+	{
+		
+		if ( $line  =~ /ERROR:/i )
+		{
+			OUT2XML::Print ( $buffer );	$buffer = "";
+			OUT2XML::Error ( $line  );
+		}
+		elsif ( $line  =~ /WARNING:/i )
+		{
+			OUT2XML::Print ( $buffer );	$buffer = "";
+			OUT2XML::Warning ( $line  );
+		}
+		elsif ( $line  =~ /\s*Invalid\s+Image\s+name:/i )
+		{
+			OUT2XML::Print ( $buffer );	$buffer = "";
+			OUT2XML::Warning ( $line  );
+		}		
+		elsif ( $line  =~ /\s*Missing\s+file:/i )
+		{
+			OUT2XML::Print ( $buffer );	$buffer = "";
+			OUT2XML::Warning ( $line  );
+		}
+		elsif ( $line =~ /^#+/ )
+		{
+			OUT2XML::Print ( $buffer );	$buffer = "";
+			OUT2XML::Print ( "<b>$line</b>" );
+		}
+		else
+		{
+			$buffer .= $line."\n"
+		}
+		
+	}
+}
+
+sub ParseCopy
+{
+	my ( $output, $expected_result ) = @_;
+	if ( ( $output =~ /(\d+) file\(s\) copied\./i ) and
+			( (defined ($expected_result) and $1==$expected_result) or (not defined ($expected_result) and $1>0) ) )		
+	{
+		OUT2XML::Print ( $output );	
+	}
+	else
+	{
+		OUT2XML::Error ( $output );	
+	}
+}
+
+
+1;
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/Registry.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,261 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : Registry.pm
+# Use    : Parse and allow easy data manipulation from configs.xml files.
+
+#
+# History :
+#  v1.1.1 (11/01/2006)
+#   - Added flag passing to Registry constructor. Allows to modify its general behaviour.
+#   - Added error_level flag to '__Data' package to raise warning/error if wrong key is fetched.
+#
+#  v1.1.0 (09/01/2006)
+#   - Added 'Inheritance' and 'TiedRegister' to the Registry package.
+#
+#  v1.0.0 (05/01/2006)
+#   - First version of the script.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   Registry package.
+#
+#--------------------------------------------------------------------------------------------------
+package Registry;
+
+use strict;
+use warnings;
+use ISIS::XMLManip;
+
+use constant ISIS_VERSION     => '11/01/2006';
+use constant ISIS_LAST_UPDATE => '1.1.1';
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  my ($class, $file, $flags, %cfgData) = (shift, shift, shift || {});
+  my $cfgXmlRoot = XMLManip::ParseXMLFile($file, XMLManip::LOCK);
+  
+  foreach my $groupNode (@{$cfgXmlRoot->Childs()})
+  {
+    my %group;
+    foreach my $node (@{$groupNode->Childs()})
+    {
+      tie my %data, '__Data', \%group, $node, $flags;
+      $group{$node->Attribute('type')} = \%data;
+    }
+
+    $cfgData{$groupNode->Type()} = \%group;
+  }
+  
+  bless \%cfgData, $class;
+}
+
+sub Inheritance
+{
+  my ($self, $group, $type, @result) = (shift, shift, shift);
+
+  while($type)
+  {
+    push @result, $type;
+    
+    $type = $self->{$group} &&
+            $self->{$group}->{$type} &&
+            tied(%{$self->{$group}->{$type}})->{__inherit};
+  }
+  
+  return @result;
+}
+
+sub TiedRegister
+{
+  my ($self, $group, $type) = (shift, shift, shift);
+  
+  return $self->{$group} &&
+         $self->{$group}->{$type} &&
+         tied(%{$self->{$group}->{$type}})->{__registry};
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   __Data package.
+#
+#--------------------------------------------------------------------------------------------------
+package __Data;
+
+sub TIEHASH
+{
+  my ($class, $group, $xmlNode, $flags) = (shift, shift, shift, shift);
+
+  my %registry;
+  foreach my $regkey (@{$xmlNode->Child('regkey')})
+  {
+    $registry{$regkey->Attribute('name')} = $regkey->Attribute('value');
+  }
+  
+  my $internalHash = { __type     => $xmlNode->Attribute('type'),
+                       __inherit  => $xmlNode->Attribute('inherit'),
+                       __group    => $group,
+                       __registry => \%registry,
+                     };
+  
+  foreach my $flag (sort keys %$flags) { $$internalHash{'__'.$flag} = $$flags{$flag}; }
+        
+  bless $internalHash, $class;
+}
+
+sub FETCH
+{
+  my ($self, $key) = (shift, shift);  
+  my $value = $self->{__registry}{$key} || $self->{__inherit} && $self->{__group}{$self->{__inherit}}{$key};
+  
+  if($self->{__error_level} > 0 and not defined $value)
+  { 
+    if($self->{__error_level} > 1) { die "Key \'$key\' does not exist for \'".$self->{__type}."\'"; }
+    else                           { warn "Key \'$key\' does not exist for \'".$self->{__type}."\'"; }
+  }
+  
+  return $value;
+}
+
+sub STORE
+{
+  my ($self, $key, $value) = (shift, shift, shift);
+  $self->{__registry}{$key} = $value;
+}
+
+sub DELETE
+{
+  my ($self, $key) = (shift, shift);
+  delete $self->{__registry}{$key};
+}
+
+sub CLEAR
+{
+  my $self = shift;
+  $self->{__registry} = (); 
+}
+
+sub EXISTS
+{
+  my ($self, $key) = (shift, shift);
+  return exists $self->{__registry}{$key} || $self->{__inherit} && exists $self->{__group}{$self->{__inherit}}{$key};
+}
+
+sub FIRSTKEY
+{
+  my $self = shift;
+  my %tmp  = keys %{$self->{__registry}};
+  return scalar each %{$self->{__registry}}; 
+}
+
+sub NEXTKEY
+{
+  my $self = shift;
+  return scalar each %{$self->{__registry}};
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+Registry - XML configuration file reader with inheritance support.
+
+=head1 SYNOPSIS
+
+in the configs.xml file :
+
+  <configs>
+    <builds>
+      
+      <build type='wakeup'>
+        <registry name='year' value='2006' />
+        <registry name='week' value='31' />
+      </build>
+      
+      <build type='multibase' inherit='wakeup'>
+        <registry name='week' value='32' />
+      </build>
+      
+    </builds>
+  </configs>
+
+in the script file :
+
+  use ISIS::ConfigsData;
+
+  my $registry = new Registry('configs.xml');
+  
+  print $registry->{'builds'}->{'multibase'}->{'week'}; # prints '32' since defined in multibase.
+  print $registry->{'builds'}->{'multibase'}->{'year'}; # prints '2006' since multibase inherits wakeup.
+
+=head1 DESCRIPTION
+
+This module is used to parse XML configuration files following a certain formatting, and allows to
+reduce data redudancy by allowing different elements from the configuration file to inherit from
+one another.
+
+This allows for common data to be shared between several elements of a group as shown in the given
+example.
+
+=head2 Register( <FILE>, [FLAG1, [FLAG2, ...]] ) :
+
+Creates a new register from the specified file. The file must be in XML and follow the syntax described
+in the synopsis. The flags are passed as a hash table - key/value pairs - and must be one of the flags
+described in L<Registry Flags>.
+
+=head2 Inheritance( <GROUP>, <TYPE> ) :
+
+Returns the inherited type of the specified type in the specified group. This allows to access the
+'__inherit' key of the '__Data' package's internal hash table.
+
+=head2 TiedRegister( <GROUP>, <TYPE> ) :
+
+Returns a reference to the register tied to a specific type in a given group. This allows to directly
+access the '__Data' package's internal hash table.
+
+=head1 REGISTRY FLAGS
+
+The flags allow to modify the registry's behaviour and are directly passed to the registry constructor
+as a hash table - key/value pairs. Here are the following accepted flags :
+
+=head2 error_level :
+
+Sets the registry's error level. If a key fetched does not exist, a warning is issued if the error_level
+is set to 1, and an error is raised followed by a die if the error_level is set to 2.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/ScanLog.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,364 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : ScanLog.pm
+# Path   : N:\isis_scripts\packages\ISIS\
+# Use    : .
+
+#
+# Synergy :
+# Perl %name: ScanLog.pm % (%full_filespec: ScanLog.pm-2.1.5:perl:fa1s60p1#1 %)
+# %derived_by: oligrant %
+# %date_created: Wed Apr  5 13:29:34 2006 %
+#
+# Version History :
+#
+# v1.0.0 (30/01/2006) :
+#  - First version of the module.
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   ScanLog package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package ScanLog;
+
+use strict;
+use warnings;
+use ISIS::Assertion _DEBUG => 1;
+use ISIS::XMLManip;
+use ISIS::HttpServer;
+
+use constant ISIS_VERSION     => '1.0.0';
+use constant ISIS_LAST_UPDATE => '30/01/2006';
+
+my @__error_patterns;
+my @__warning_patterns;
+my @__remark_patterns;
+my @__ignore_patterns;
+
+BEGIN
+{
+  @__error_patterns = (
+    'FLEXlm error:',
+    '(?:ABLD|BLDMAKE) ERROR:',
+    'FATAL ERROR\(S\):',
+    'fatal error U1077',
+    'warning U4010',
+    'make(?:\[\d+\])?: \*\*\* ',
+    'make(?:\[\d+\])?: .* not remade ',
+    '\".*\", line \d+: Error: +.\d+.*?:.*$',
+    'error: Internal fault:.*$',
+    'Exception: STATUS_ACCESS_VIOLATION',
+    'target .* given more than once in the same rule',
+    '^ERROR: ',
+    '^ERROR\t',
+    '^MISSING:\s+\\\\',
+  );
+  
+  @__warning_patterns = (
+    '(?i:Warning: Unmatched)',
+    '^BLDMAKE WARNING:',
+    'WARNING\(S\)',
+    '^WARNING: ',
+    '\(\d+\) : warning C',
+    'LINK : warning',
+    ':\d+: warning:',
+    '\".*\", line \d+: Warning: +.\d+.*?:.*$',
+    'Usage Warning:',
+    'mwld.exe:',
+    '^Command line warning',
+    '^MAKEDEF WARNING:',
+    'ERROR: bad relocation:',
+    '^\d+ warning/',
+    '^EventType:\s+Error\s+Source:\s+SweepNT',
+    '^WARN\t',
+  );
+  
+  @__remark_patterns = (
+    '\".*\", line \d+: Warning: +.\d+.*?:',
+    'Command line warning D4025 : ',
+    '^REMARK: ',
+    '^EventType:\s+Error\s+Source:\s+GNU\s+Make',
+    ':\d+: warning: cannot find matching deallocation function',
+  );
+  
+  @__ignore_patterns = (
+    '\".*\", line \d+: Warning: +#68-D:',
+    '\".*\", line \d+: Warning: +#108-D:',
+    '\".*\", line \d+: Warning: +#128-D:',
+    '\".*\", line \d+: Warning: +#191-D:',
+    '\".*\", line \d+: Warning: +A1608W:',
+    '\".*\", line \d+: Warning: +#1446-D:',
+  );
+}
+
+#--------------------------------------------------------------------------------------------------
+# Contructor - takes (parent xml node, annotation file, current step).
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  bless { __current_step  => pop,
+          __parent_node   => pop,
+          __anno_file     => pop,
+          __xml_output    => undef,
+          __discards      => '',
+          __message_types => { '1_remark'  => \@__remark_patterns,
+                               '2_ignore'  => \@__ignore_patterns,
+                               '3_warning' => \@__warning_patterns,
+                               '4_error'   => \@__error_patterns,
+                             },
+        }, shift;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Generate.
+#--------------------------------------------------------------------------------------------------
+sub Generate
+{
+  my ($self, $interface) = (shift, HttpServer::GetAddress().'/isis_interface');
+
+  $self->{__xml_file}   = $self->{__anno_file};
+  $self->{__xml_file}  .= '.scanlog.xml' unless($self->{__xml_file}  =~ s/\.xml$/\.scanlog\.xml/);
+  $self->{__anno_data}  = XMLManip::ParseXMLFile($self->{__anno_file});
+  
+  $self->{__xml_data}   = new XMLManip::Node('__scanlog', { date => scalar(localtime),
+                                                            interface => $interface });
+
+  $self->{__current_node} = new XMLManip::Node('__maincontent', { title => 'Build details',
+                                                                  step => $self->{__current_step} });
+  
+  $self->{__xml_data}->PushChild(new XMLManip::Node('__header', { title => 'Electric Cloud ScanLog',
+  	                                                              subtitle => 'Started on '.(localtime) } ));
+  
+  $self->{__xml_data}->PushChild($self->{__current_node});
+  
+  $self->{__xml_data}->PushChild(new XMLManip::Node('__footer', { title => 'Generated using ScanLog.pm v'.(ISIS_VERSION),
+  	                                                              subtitle => 'Finished on '.(localtime) } ));
+  
+  $self->__PrintProperties();
+  $self->__ParseChilds($self->{__anno_data});
+  
+  foreach my $child (@{$self->{__xml_data}->Child('__maincontent', 0)->Child('__event')})
+  { $self->__DiscardEmptyNodes($self->{__xml_data}->Child('__maincontent', 0), $child); }
+
+  XMLManip::WriteXMLFile($self->{__xml_data}, $self->{__xml_file});
+}
+
+#--------------------------------------------------------------------------------------------------
+# GenerateDataStructure.
+#--------------------------------------------------------------------------------------------------
+sub GenerateDataStructure
+{
+  my ($self, $interface) = (shift, HttpServer::GetAddress().'/isis_interface');
+  
+  $self->{__anno_data} = XMLManip::ParseXMLFile($self->{__anno_file});
+  
+  $self->{__xml_data} = new XMLManip::Node('__event', { step => $self->{__current_step} });
+  
+  $self->{__current_node} = $self->{__xml_data};
+  $self->__ParseChilds($self->{__anno_data});
+  
+  foreach my $child (@{$self->{__xml_data}->Child('__event', 0)->Child('__event')})
+  { $self->__DiscardEmptyNodes($self->{__xml_data}->Child('__event', 0), $child); }
+  
+  return $self->{__xml_data};
+}
+
+#--------------------------------------------------------------------------------------------------
+# Message types to discard - Avoid big logs.
+#--------------------------------------------------------------------------------------------------
+sub DiscardMessageTypes
+{
+  my ($self, $types) = (shift, join('|', @_));
+  $self->{__discards} = $types;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Main parsing function.
+#--------------------------------------------------------------------------------------------------
+sub __ParseChilds
+{
+  my ($self, $xmlNode) = (shift, shift);
+  
+  foreach my $child (@{$xmlNode->Childs()})
+  { 
+    no strict 'refs';
+    my $func = $child->Type();
+    $self->$func($child);
+  }
+}
+
+#--------------------------------------------------------------------------------------------------
+# DiscardEmptyNodes.
+#--------------------------------------------------------------------------------------------------
+sub __DiscardEmptyNodes
+{
+  my ($self, $parent, $node, $removed) = (shift, shift, shift, 1);
+
+  do
+  {
+    $removed = 0;
+    foreach my $child (@{$node->Child('__event')})
+    { $removed += $self->__DiscardEmptyNodes($node, $child); }
+  }
+  while($removed != 0);
+  
+  if($node->NbChilds() == 0)
+  {
+    my $tmp = $parent->NbChilds();
+    $parent->RemoveChild($node);
+    __ASSERT($parent->NbChilds() < $tmp);
+    return 1;
+  }
+  
+  return 0;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Print build properties.
+#--------------------------------------------------------------------------------------------------
+sub __PrintProperties
+{
+  my ($self) = (shift);
+  
+  my $properties = $self->{__anno_data}->Child('properties')->[0];
+  return unless($properties);
+  
+  my $summaryNode = new XMLManip::Node('__summary');
+	$summaryNode->Comment(" +++ SCANLOG SUMMARY +++ ");
+	$summaryNode->Attribute('title', "Build ".$self->{__anno_data}->Attribute('id').' '.
+	                                 "started on ".$self->{__anno_data}->Attribute('start'));
+  
+  $summaryNode->PushChild(new XMLManip::Node('__elmt', { tag => 'Cluster Manager',
+                                                         val => $self->{__anno_data}->Attribute('cm') }));
+  
+  foreach my $property (@{$properties->Child('property')})
+  {
+    my $tag = $property->Attribute('name');
+    my $val = $property->Content();
+  
+    $tag =~ s/([A-Z][a-z]+)/$1 /g; $tag =~ s/ $//;
+    $val =~ s/\n$//g; $val =~ s/\n/ /g;
+  
+  	my $elementNode = new XMLManip::Node('__elmt', { tag => $tag, val => $val });
+    $summaryNode->PushChild($elementNode);
+  }
+  
+  $self->{__xml_data}->PushChild($summaryNode);
+}
+
+#--------------------------------------------------------------------------------------------------
+# make nodes.
+#--------------------------------------------------------------------------------------------------
+sub make
+{
+  my ($self, $xmlNode) = (shift, shift);
+  ++$self->{__current_step};
+  
+  my $makeNode = new XMLManip::Node('__event');
+  my ($title)  = ($xmlNode->Attribute('cmd') =~ /-f (.*?) /);
+  $makeNode->Attribute('title', $title || 'unknown');
+  $makeNode->Attribute('time', $self->__make_starttime($makeNode));
+  $makeNode->Attribute('step', $self->{__current_step});
+  
+  push @{$self->{__parent_nodes}}, $self->{__current_node};
+  $self->{__current_node}->PushChild($makeNode);
+  $self->{__current_node} = $makeNode;
+  
+  $self->__ParseChilds($xmlNode);
+  
+  $self->{__current_node} = pop @{$self->{__parent_nodes}};
+}
+
+sub __make_starttime
+{
+  my ($self, $makeNode) = (shift, shift);
+  
+  my $jobNode  = $makeNode->Child('job')->[0] or return 'unknown';
+  my $timeNode = $jobNode->Child('timing')->[0] or return 'unknown';
+  return $timeNode->Attribute('invoked') || 'unknown';
+}
+
+sub job
+{
+	my ($self, $jobNode) = (shift, shift);
+
+	foreach my $cmdNode (@{$jobNode->Child('command')})
+	{
+		foreach my $outputNode (@{$cmdNode->Child('output')})
+		{
+			next if(($outputNode->Attribute('src') || 'undef') !~ /^prog$/ or
+			        not defined $outputNode->Content());
+			
+			++$self->{__current_step};
+			my $timeNode = $jobNode->Child('timing')->[0];
+			my $invoked = $timeNode && $timeNode->Attribute('invoked') || 'unknown';
+			my $errorNode = $self->__parse_message($outputNode, $invoked);
+			
+			$self->{__current_node}->PushChild($errorNode) if($errorNode);
+		}
+	}
+}
+
+sub __parse_message
+{
+  my ($self, $node, $invoked) = (shift, shift, shift);
+  my $discards = $self->{__discards};
+  
+  foreach my $line (split('\n', $node->Content()))
+  {
+	  foreach my $type (sort keys %{$self->{__message_types}})
+	  {
+	    my ($__type) = ($type =~ /\d+_(.+)$/);
+	    next if($__type =~ /$discards/i);
+
+	    if($self->__match_patterns($line, $self->{__message_types}->{$type}))
+	    {
+	    	my $msg_node = new XMLManip::Node($__type);
+	      $msg_node->Attribute('step', $self->{__current_step});
+	      $msg_node->Attribute('time', $invoked);
+	      $msg_node->Content( $line );
+	      return $msg_node;
+	    }
+	  }
+  }
+  return undef;
+}
+
+sub __match_patterns
+{
+  my ($self, $text, $patterns) = (shift, shift, shift);
+
+  foreach my $pattern (@$patterns)
+  { return 1 if($text =~ /$pattern/); }
+  
+  return 0;
+}
+
+sub AUTOLOAD
+{ # Dummy debug method.
+  my ($self, $method, $node) = (shift, our $AUTOLOAD, shift || '');
+  warn " called $method : $node\n";
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/ScanLogTBS.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,284 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name   : ScanLogTBS.pm
+# Path   : N:\isis_scripts\packages\ISIS\
+# Use    : .
+
+#
+# Synergy :
+# Perl %name: ScanLogTBS.pm % (%full_filespec: ScanLogTBS.pm-2:perl:fa1s60p1#1 %)
+# %derived_by: wbernard %
+# %date_created: Tue May  9 08:29:21 2006 %
+#
+# Version History :
+#
+# v1.0.1 (09/05/2006) :
+#  - Fix for compatibility with pseudo EBS logs of EC builds.
+#
+# v1.0.0 (30/01/2006) :
+#  - First version of the module.
+#	 - Generate directly XML nodes compatible with the logger
+#--------------------------------------------------------------------------------------------------
+
+#--------------------------------------------------------------------------------------------------
+#
+#   ScanLog package.
+#
+#--------------------------------------------------------------------------------------------------
+
+package ScanLogTBS;
+
+use strict;
+use warnings;
+use ISIS::Assertion _DEBUG => 1;
+use ISIS::XMLManip;
+use ISIS::HttpServer;
+
+use constant ISIS_VERSION     => '1.0.1';
+use constant ISIS_LAST_UPDATE => '09/05/2006';
+
+my @__error_patterns;
+my @__warning_patterns;
+my @__remark_patterns;
+my @__ignore_patterns;
+
+BEGIN
+{
+  @__error_patterns = (
+    'FLEXlm error:',
+    '(?:ABLD|BLDMAKE) ERROR:',
+    'FATAL ERROR\(S\):',
+    'fatal error U1077',
+    'warning U4010',
+    'make(?:\[\d+\])?: \*\*\* ',
+    'make(?:\[\d+\])?: .* not remade ',
+    '\".*\", line \d+: Error: +.\d+.*?:.*$',
+    'error: Internal fault:.*$',
+    'Exception: STATUS_ACCESS_VIOLATION',
+    'target .* given more than once in the same rule',
+    '^ERROR: ',
+    '^ERROR\t',
+    '^MISSING:\s+\\\\',
+  );
+  
+  @__warning_patterns = (
+    '(?i:Warning: Unmatched)',
+    '^BLDMAKE WARNING:',
+    'WARNING\(S\)',
+    '^WARNING: ',
+    '\(\d+\) : warning C',
+    'LINK : warning',
+    ':\d+: warning:',
+    '\".*\", line \d+: Warning: +.\d+.*?:.*$',
+    'Usage Warning:',
+    'mwld.exe:',
+    '^Command line warning',
+    '^MAKEDEF WARNING:',
+    'ERROR: bad relocation:',
+    '^\d+ warning/',
+    '^EventType:\s+Error\s+Source:\s+SweepNT',
+    '^WARN\t',
+  );
+  
+  @__remark_patterns = (
+    '\".*\", line \d+: Warning: +.\d+.*?:',
+    'Command line warning D4025 : ',
+    '^REMARK: ',
+    '^EventType:\s+Error\s+Source:\s+GNU\s+Make',
+    ':\d+: warning: cannot find matching deallocation function',
+  );
+  
+  @__ignore_patterns = (
+    '\".*\", line \d+: Warning: +#68-D:',
+    '\".*\", line \d+: Warning: +#108-D:',
+    '\".*\", line \d+: Warning: +#128-D:',
+    '\".*\", line \d+: Warning: +#191-D:',
+    '\".*\", line \d+: Warning: +A1608W:',
+    '\".*\", line \d+: Warning: +#1446-D:',
+  );
+}
+
+#--------------------------------------------------------------------------------------------------
+# Contructor - takes (parent xml node, annotation file, current step).
+#
+#	$logname path to the log
+# $fast option (on|off) (optional parameter)
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+	my ($class, $logname, $fast) = (shift, shift, shift||'off');
+	my $self = {__logname  => $logname,
+							__currentcomponent => undef,
+							__currentcomponent_command => undef,
+							__fast => $fast,
+          		__message_types => { '1_remark'  => \@__remark_patterns,
+                               '2_ignore'  => \@__ignore_patterns,
+                               '3_warning' => \@__warning_patterns,
+                               '4_error'   => \@__error_patterns,
+                             },
+						};
+  bless $self, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Generate.
+#--------------------------------------------------------------------------------------------------
+sub GenerateDataStructure
+{
+  my $self = shift;
+  
+	my $interface = HttpServer::GetAddress().'/isis_interface';
+	
+	$self->{ __xml_data } = new XMLManip::Node('__event', { title => "ScanLog" });
+	
+	unless (open (LOG, $self->{__logname}))	{OUT2XML::Error("Cannot open ".$self->{__logname}); return 0;};
+	my $line;
+  while ($line=<LOG>)
+  {
+
+    # Hostname is
+    # capture the hostname if available
+    if ($line =~ /^Hostname is (.*)$/)
+    {
+      $self->{ _hostname } = "$1";
+    }
+
+		
+		#++ Finished at Wed Feb  8 19:55:33 2006
+		if ( $line =~ /^\+\+\s+Finished\s+at(.*)/ )
+		{
+			$self->{ __currentcomponent } = undef;
+			$self->{ __currentcomponent_command } = undef;
+			next;
+		}
+		
+		
+		#++ Started at Wed Feb  8 19:55:32 2006
+		#+++ HiRes Start 1139428532.36375
+		if ( $line =~ /^\+\+\+\s+HiRes\s+Start\s+(\d+)/ and $self->{ __currentcomponent } )
+		{
+			$self->{ __currentcomponent_starttime }= $1;
+		}
+		
+		#+++ HiRes End 1139428533.39499
+		if ( $line =~ /^\+\+\+\s+HiRes\s+End\s+(\d+)/ and $self->{ __currentcomponent } )
+		{
+			$self->{ __currentcomponent_endtime }= $1;
+		}
+		
+		#-- bldmake bldfiles -k
+		if ( $line =~ /^\-\-\s+(.*)/ and $self->{ __currentcomponent } )
+		{
+				if ($self->{__fast} eq "on")
+				{
+					my $p = new XMLManip::Node('__print');
+					$p->Content("<b>$1</b><br/>");
+					$self->{ __currentcomponent }->PushChild( $p );
+					$self->{ __currentcomponent_command } = $self->{ __currentcomponent };
+					
+				}
+				else
+				{
+					$self->{ __currentcomponent_command } = new XMLManip::Node('__event',{ title => "$1"});
+					$self->{ __currentcomponent }->PushChild( $self->{ __currentcomponent_command } );
+				}
+				next;
+		}
+
+		#--- Client8 Executed ID 2
+		if ( $line =~ /^\-\-\-\s+(\w+)\s+Executed\s+ID\s+(\d+)/ and $self->{ __currentcomponent_command } )
+		{
+				$self->{ __currentcomponent_command }->Attribute( 'step', "$2" );
+				next;
+		}
+
+		#Chdir \s60\Cdl\CdlCompiler\group
+		if ( $line =~ /^Chdir\s+(.*)/ and $self->{ __currentcomponent } )
+		{
+				#$self->{ __currentcomponent_command }->( 'step', "$2" );
+				next;
+		}
+		
+		
+		# === Stage=2 == CdlCompiler
+		if ( $line =~ /^===\s+Stage=(\d+)\s+==\s+(.*)/  )
+		{
+			unless ( $self->{ __currentcomponent } )
+			{
+				my $name = "$2";
+				if ( $self->{ _components }{ "$name" } )
+				{
+					$self->{ __currentcomponent } = $self->{ _components }{ "$name" };
+				}
+				else
+				{
+					$self->{ __currentcomponent } = new XMLManip::Node('__event',{ title => "$name"});
+					$self->{ _components }{ "$name" } = $self->{ __currentcomponent };
+					$self->{ __xml_data }->PushChild( $self->{ __currentcomponent } );
+				}
+			}
+			next;			
+		}		
+
+		if ( $self->{ __currentcomponent_command } and $self->{ __currentcomponent } )
+		{		
+			my $n = $self->__parse_message( $line );
+		}
+	}
+	close (LOG);
+		
+	return $self->{ __xml_data };
+}
+
+
+sub __parse_message
+{
+  my ($self, $line) = (shift, shift);
+  
+
+  foreach my $type (sort keys %{$self->{__message_types}})
+  {
+    my ($__type) = ($type =~ /\d+_(.*)$/);
+    if($self->__match_patterns($line, $self->{__message_types}->{$type}))
+    {
+		  my $msg_node = new XMLManip::Node( "$__type" );
+      $msg_node->Attribute('time', $self->{ __currentcomponent_starttime });
+      $msg_node->Content( $line );
+      $self->{__currentcomponent_command}->PushChild( $msg_node );
+      return $msg_node;
+    }
+  }
+  
+  return undef;
+}
+
+sub __match_patterns
+{
+  my ($self, $line, $patterns) = (shift, shift, shift);
+
+  foreach my $pattern (@$patterns)
+  { return 1 if($line =~ /$pattern/); }
+  
+  return 0;
+}
+
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/XmlManip.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,852 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#--------------------------------------------------------------------------------------------------
+# Name    : XMLManip.pm
+# Use     : Parse and write XML files.
+
+#
+# Synergy :
+# Perl %name    : % (%full_filespec :  %)
+# %derived_by   : %
+# %date_created : %
+#
+# History :
+#  v1.6.3 (10/07/2006)
+#   - Fixed where closing tags were not correctly aligned with the opening tag.
+#
+#  v1.6.2 (21/06/2006)
+#   - Modified 'ChildRegex' subroutine to allow specification of the child to return. Still returns an
+#     array if no index is specified. This is so 'Child' and 'ChildRegex' have the same functionning.
+#   - Fixed '__String2XML' where specifying an index equal to 0 returned an empty string.
+#
+#  v1.6.1 (29/03/2006)
+#   - Fix issue with \n! (Finally...)
+#
+#  v1.6.0 (15/03/2006)
+#   - Added subroutine to check for attribute existance to the XMLManip::Node package.
+#
+#  v1.5.3 (08/02/2006)
+#   - Modified 'XMLManip::Node' constructor to be copy constructor if 'XMLManip::Node' instance is
+#     passed as argument.
+#   - Fixed subroutine 'Child' of XMLManip::Node package where specifying an index equal to
+#     0 returned all childs.
+#
+#  v1.5.2 (01/02/2006)
+#   - Modified 'Child' subroutine to allow specification of the child to return. Still returns an
+#     array if no index is specified.
+#   - Removed 'Exporter' code since it was useless.
+#
+#  v1.5.1 (26/01/2006)
+#   - Removed chomping of content in '__UpdateContents' subroutine.
+#   - Added CDATA wrappers around content.
+#
+#  v1.5.0 (24/01/2006)
+#   - Modified 'Child' subroutine of the XMLManip::Node package to check complete equality
+#     between passed type and child node type.
+#   - Added 'ChildRegex' subroutine of the XMLManip::Node package to select child nodes according
+#     to their type based on a regular expression.
+#
+#  v1.4.0 (06/01/2006)
+#   - Added 'NbChilds' and 'NbChild' subroutines to the XMLManip::Node package.
+#   - Added two locking constants 'LOCK' and 'NO_LOCK' to packages 'XMLManip' and 'XMLManip::Node'
+#   - Minor modifications to improve code.
+#
+#  v1.3.0 (04/01/2006)
+#   - Added 'RemoveNode' subroutine to the XMLManip::Node package.
+#   - Added '==' overload to XMLManip::Node package.
+#   - Added '__UpdateContents' to remove XML formatting spaces at start of each content line.
+#
+#  v1.2.0 (21/12/2005)
+#   - Updated XMLManip::Node subroutines 'PushChild' and 'Attribute' to check if node is locked.
+#   - Added 'LockAll' and 'UnlockAll' to the XMLManip::Node package.
+#   - Updated 'ParseXMLFile' to take an optional extra argument corresponding to the lock state
+#     of returned node tree.
+#
+#  v1.1.0 (19/12/2005)
+#   - Added 'ChildTypes' subroutine to the XMLManip::Node package.
+#   - ParseXMLFile now locks all nodes in the returned data structure.
+#
+#  v1.0.0 (08/12/2005)
+#   - First version of the module.
+#--------------------------------------------------------------------------------------------------
+
+package XMLManip;
+
+use strict;
+use warnings;
+use XML::Parser;
+use HTML::Entities;
+use ISIS::Assertion _DEBUG => 1;
+
+use constant ISIS_VERSION     => '1.6.3';
+use constant ISIS_LAST_UPDATE => '10/07/2006';
+
+use constant LOCK             => 1;
+use constant NO_LOCK          => 0;
+
+my %ModuleData;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   XMLManip::ParseXMLFile
+#
+#--------------------------------------------------------------------------------------------------
+sub ParseXMLFile
+{
+  my ($file, $lock) = (shift, shift || NO_LOCK);
+  my $parser = new XML::Parser(Style => 'Subs',
+                               Pkg => 'SubHandlers',
+                               Handlers => { Char => \&__Content },
+                               ErrorContext => 2);
+  
+  $ModuleData{rootNode}    = new XMLManip::Node('root');
+  $ModuleData{currentNode} = $ModuleData{rootNode};
+  $ModuleData{lock}        = $lock;
+
+  eval { $parser->parsefile($file); };
+  
+  if($@)
+  {
+    warn "XML Parsing Error : $@\nTree might not be complete\n";
+  }
+  
+  __UpdateContents($ModuleData{currentNode}, '');
+  $ModuleData{currentNode}->LockAll() if($ModuleData{lock} == LOCK);
+  return $ModuleData{rootNode}->Childs()->[0];
+}
+
+
+sub ParseXMLFileHandle
+{
+  my ($file, $lock) = (shift, shift || NO_LOCK);
+  my $parser = new XML::Parser(Style => 'Subs',
+                               Pkg => 'SubHandlers',
+                               Handlers => { Char => \&__Content },
+                               ErrorContext => 2);
+  
+  $ModuleData{rootNode}    = new XMLManip::Node('root');
+  $ModuleData{currentNode} = $ModuleData{rootNode};
+  $ModuleData{lock}        = $lock;
+
+  eval { $parser->parse($file); };
+  
+  if($@)
+  {
+    warn "XML Parsing Error : $@\nTree might not be complete\n";
+  }
+  
+  __UpdateContents($ModuleData{currentNode}, '');
+  $ModuleData{currentNode}->LockAll() if($ModuleData{lock} == LOCK);
+  return $ModuleData{rootNode}->Childs()->[0];
+}
+
+sub __Content
+{
+	my ($self, $string) = (shift, shift);  
+	$ModuleData{currentNode}{'XMLManip::Node::Content'} .= $string;
+}
+
+sub __UpdateContents
+{
+  my ($node, $indent) = (shift, shift);
+  
+  if(defined $node->Content())
+  {
+    my $content = $node->Content();
+    $content =~ s/^$indent//gm;
+    $node->Content($content);
+  }
+  
+  foreach my $child (@{$node->Childs()}){ __UpdateContents($child, $indent.'  '); }
+}
+
+#--------------------------------------------------------------------------------------------------
+#
+#   XMLManip::WriteXMLFile
+#
+#--------------------------------------------------------------------------------------------------
+sub WriteXMLFile
+{
+  my ($rootNode, $filename, $dst) = (shift, shift, undef);
+  
+  open($dst, '>'.$filename) or die "Unable to create file \'$filename\' : $!\n";
+  print $dst "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+  WriteToOStream($dst, $rootNode);
+  close($dst);
+}
+
+sub WriteToOStream
+{
+	my ($dst, $rootNode) = (shift, shift);
+	
+	$ModuleData{dst}    = $dst;
+  $ModuleData{indent} = '';
+
+  __WriteNode($rootNode);
+}
+
+sub __WriteNode
+{
+  my ($node, $dst, $indent, $closed) = (shift, $ModuleData{dst}, $ModuleData{indent}, 0);
+  
+  if(defined $node->Comment() and my @lines = map{ __String2XML($_)."\n" } split("\n", $node->Comment()))
+  {
+  	$lines[$#lines] =~ s/\n$//;
+  	print $dst $indent, "<!-- ";
+  	if(scalar @lines > 1)
+  	{
+  		@lines = map { $indent.'  '.$_ } @lines;
+  		print $dst "\n", @lines, "\n", $indent;
+  	}
+  	else
+  	{
+  		print $dst @lines;
+  	}
+  	print $dst " -->\n";
+ 	}
+  
+  print $dst $indent, '<'.$node->Type();
+
+  foreach (sort keys %{$node->Attributes()})
+  {
+    print $dst ' ', $_, "=\"", __String2XML($node->Attribute($_)), "\"";
+  }
+  
+  if( defined $node->Content() )  
+  {
+  	my @lines =  __String2XML($node->Content());
+  	unless( $closed )
+  	{
+  		print $dst ">" ;
+  		$closed = 1;
+  	}
+  	
+  	if(scalar @lines > 1)
+  	{
+  		@lines = map { $indent.'  '.$_ } @lines;
+  		print $dst @lines, "\n", $indent;
+  	}
+  	else
+  	{
+  		print $dst @lines;
+  	}  	
+  }
+  
+  if(scalar @{$node->Childs()})
+  {
+  	unless( $closed )
+  	{
+  		print $dst ">\n" ;
+  		$closed = 1;
+  	}
+    foreach (@{$node->Childs()})
+    {
+      $ModuleData{indent} = $indent.'  ';
+      __WriteNode($_);
+      $ModuleData{indent} = $indent;
+    }
+  }
+ 	if ($closed)
+ 	{
+ 		print $dst $indent, '</', $node->Type(), ">\n" ;
+  }
+  else
+  {
+  	print $dst " />\n";
+  }
+}
+
+sub __String2XML
+{
+  my $str = shift;
+  return '' unless(defined $str);
+  $str =~ s/\e/e/g;
+  $str = HTML::Entities::encode_entities($str);
+  # Part1
+	$str =~ s/&nbsp;/\&\#160;/g;
+	$str =~ s/&iexcl;/\&\#161;/g;
+	$str =~ s/&curren;/\&\#164;/g;
+	$str =~ s/&cent;/\&\#162;/g;
+	$str =~ s/&pound;/\&\#163;/g;
+	$str =~ s/&yen;/\&\#165;/g;
+	$str =~ s/&brvbar;/\&\#166;/g;
+	$str =~ s/&sect;/\&\#167;/g;
+	$str =~ s/&uml;/\&\#168;/g;
+	$str =~ s/&copy;/\&\#169;/g;
+	$str =~ s/&ordf;/\&\#170;/g;
+	$str =~ s/&laquo;/\&\#171;/g;
+	$str =~ s/&not;/\&\#172;/g;
+	$str =~ s/&shy;/\&\#173;/g;
+	$str =~ s/&reg;/\&\#174;/g;
+	$str =~ s/&trade;/\&\#8482;/g;
+	$str =~ s/&macr;/\&\#175;/g;
+	$str =~ s/&deg;/\&\#176;/g;
+	$str =~ s/&plusmn;/\&\#177;/g;
+	$str =~ s/&sup2;/\&\#178;/g;
+	$str =~ s/&sup3;/\&\#179;/g;
+	$str =~ s/&acute;/\&\#180;/g;
+	$str =~ s/&micro;/\&\#181;/g;
+	$str =~ s/&para;/\&\#182;/g;
+	$str =~ s/&middot;/\&\#183;/g;
+	$str =~ s/&cedil;/\&\#184;/g;
+	$str =~ s/&sup1;/\&\#185;/g;
+	$str =~ s/&ordm;/\&\#186;/g;
+	$str =~ s/&raquo;/\&\#187;/g;
+	$str =~ s/&frac14;/\&\#188;/g;
+	$str =~ s/&frac12;/\&\#189;/g;
+	$str =~ s/&frac34;/\&\#190;/g;
+	$str =~ s/&iquest;/\&\#191;/g;
+	$str =~ s/&times;/\&\#215;/g;
+	$str =~ s/&divide;/\&\#247;/g;
+  # Part 2
+	$str =~ s/&Agrave;/\&\#192;/g;
+	$str =~ s/&Aacute;/\&\#193;/g;
+	$str =~ s/&Acirc;/\&\#194;/g;
+	$str =~ s/&Atilde;/\&\#195;/g;
+	$str =~ s/&Auml;/\&\#196;/g;
+	$str =~ s/&Aring;/\&\#197;/g;
+	$str =~ s/&AElig;/\&\#198;/g;
+	$str =~ s/&Ccedil;/\&\#199;/g;
+	$str =~ s/&Egrave;/\&\#200;/g;
+	$str =~ s/&Eacute;/\&\#201;/g;
+	$str =~ s/&Ecirc;/\&\#202;/g;
+	$str =~ s/&Euml;/\&\#203;/g;
+	$str =~ s/&Igrave;/\&\#204;/g;
+	$str =~ s/&Iacute;/\&\#205;/g;
+	$str =~ s/&Icirc;/\&\#206;/g;
+	$str =~ s/&Iuml;/\&\#207;/g;
+	$str =~ s/&ETH;/\&\#208;/g;
+	$str =~ s/&Ntilde;/\&\#209;/g;
+	$str =~ s/&Ograve;/\&\#210;/g;
+	$str =~ s/&Oacute;/\&\#211;/g;
+	$str =~ s/&Ocirc;/\&\#212;/g;
+	$str =~ s/&Otilde;/\&\#213;/g;
+	$str =~ s/&Ouml;/\&\#214;/g;
+	$str =~ s/&Oslash;/\&\#216;/g;
+	$str =~ s/&Ugrave;/\&\#217;/g;
+	$str =~ s/&Uacute;/\&\#218;/g;
+	$str =~ s/&Ucirc;/\&\#219;/g;
+	$str =~ s/&Uuml;/\&\#220;/g;
+	$str =~ s/&Yacute;/\&\#221;/g;
+	$str =~ s/&THORN;/\&\#222;/g;
+	$str =~ s/&szlig;/\&\#223;/g;
+	$str =~ s/&agrave;/\&\#224;/g;
+	$str =~ s/&aacute;/\&\#225;/g;
+	$str =~ s/&acirc;/\&\#226;/g;
+	$str =~ s/&atilde;/\&\#227;/g;
+	$str =~ s/&auml;/\&\#228;/g;
+	$str =~ s/&aring;/\&\#229;/g;
+	$str =~ s/&aelig;/\&\#230;/g;
+	$str =~ s/&ccedil;/\&\#231;/g;
+	$str =~ s/&egrave;/\&\#232;/g;
+	$str =~ s/&eacute;/\&\#233;/g;
+	$str =~ s/&ecirc;/\&\#234;/g;
+	$str =~ s/&euml;/\&\#235;/g;
+	$str =~ s/&igrave;/\&\#236;/g;
+	$str =~ s/&iacute;/\&\#237;/g;
+	$str =~ s/&icirc;/\&\#238;/g;
+	$str =~ s/&iuml;/\&\#239;/g;
+	$str =~ s/&eth;/\&\#240;/g;
+	$str =~ s/&ntilde;/\&\#241;/g;
+	$str =~ s/&ograve;/\&\#242;/g;
+	$str =~ s/&oacute;/\&\#243;/g;
+	$str =~ s/&ocirc;/\&\#244;/g;
+	$str =~ s/&otilde;/\&\#245;/g;
+	$str =~ s/&ouml;/\&\#246;/g;
+	$str =~ s/&oslash;/\&\#248;/g;
+	$str =~ s/&ugrave;/\&\#249;/g;
+	$str =~ s/&uacute;/\&\#250;/g;
+	$str =~ s/&ucirc;/\&\#251;/g;
+	$str =~ s/&uuml;/\&\#252;/g;
+	$str =~ s/&yacute;/\&\#253;/g;
+	$str =~ s/&thorn;/\&\#254;/g;
+	$str =~ s/&yuml;/\&\#255;/g;
+
+  return $str;
+}
+
+#--------------------------------------------------------------------------------------------------
+#
+#   XMLManip::PrintToShell
+#
+#--------------------------------------------------------------------------------------------------
+sub PrintToShell
+{
+  my ($node, $indent) = (shift, shift || '');
+  
+  __ASSERT($node);
+  
+  print $indent, $node, "\n";
+  
+  foreach my $child(@{$node->Childs()})
+  { PrintToShell($child, $indent.'  '); } 
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   SubHandlers package for ParseXMLFile.
+#
+#--------------------------------------------------------------------------------------------------
+package SubHandlers;
+
+sub AUTOLOAD
+{
+  my ($method, $xpat, $elmt, %attr) = (our $AUTOLOAD, shift, shift, @_);
+
+  if($method !~ /^.*_$/)
+  { # opening tag.
+    my $node = new XMLManip::Node($elmt, \%attr);
+    
+    if(exists $ModuleData{currentNode})
+    {
+      $ModuleData{currentNode}->PushChild($node);
+      push @{$ModuleData{parentNodes}}, $ModuleData{currentNode};
+    }
+
+    $ModuleData{currentNode} = $node;
+  }
+  else
+  { # closing tag
+    $ModuleData{currentNode} = pop @{$ModuleData{parentNodes}};
+  }
+}
+
+1;
+
+#--------------------------------------------------------------------------------------------------
+#
+#   XML Node
+#
+#--------------------------------------------------------------------------------------------------
+
+package XMLManip::Node;
+
+use strict;
+use warnings;
+
+use constant LOCK    => XMLManip::LOCK;
+use constant NO_LOCK => XMLManip::NO_LOCK;
+
+#--------------------------------------------------------------------------------------------------
+# Overloaded methods.
+#--------------------------------------------------------------------------------------------------
+use overload q("")  => \&__AsString,
+             q(0+)  => \&__AsNumber,
+             q(==)  => \&__AreEqual;
+
+sub __AsString
+{
+  my ($self) = (shift);
+  $self->{'XMLManip::Node::Type'}.'('.
+    scalar (keys %{$self->{'XMLManip::Node::Attributes'}}).','.
+    scalar (@{$self->{'XMLManip::Node::Childs'}}).')';
+}
+
+sub __AsNumber
+{
+  my ($self, $nb) = (shift, 1);
+  foreach my $child (@{$self->{'XMLManip::Node::Childs'}})
+  {
+    $nb += $child->__AsNumber();
+  }
+  
+  return $nb;
+}
+
+sub __AreEqual
+{
+  my ($lhs, $rhs) = (shift, shift);
+  return 1 if(overload::StrVal($lhs) eq overload::StrVal($rhs));
+  return 0;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Constructor.
+#--------------------------------------------------------------------------------------------------
+sub new
+{
+  my ($class, $arg, $attrs) = (shift, shift || 'node', shift || {});
+	
+	if(ref $arg eq 'XMLManip::Node')
+	{
+	  my @childs;
+	  
+	  if(exists $$attrs{childs})
+	  {
+  	  if($$attrs{childs} == 'copy')
+  	  {
+  	    foreach my $child (@{$arg->Childs()})
+  	    { push @childs, new XMLManip::Node($child, { childs => 'copy' }); } 
+  	  }
+  	  elsif($$attrs{childs} == 'refs')
+  	  {
+  	    push @childs, @{$arg->Childs()};
+  	  }
+  	}
+	  
+  	return bless { 'XMLManip::Node::Type'       => $arg->Type(),
+                   'XMLManip::Node::Attributes' => $arg->Attributes(),
+                   'XMLManip::Node::Content'    => $arg->Content(),
+                   'XMLManip::Node::Comment'    => $arg->Comment(),
+                   'XMLManip::Node::Childs'     => \@childs,
+                   _lock                        => $arg->{_lock},
+                 }, $class;
+	}
+
+  bless { 'XMLManip::Node::Type'       => $arg,
+          'XMLManip::Node::Attributes' => $attrs,
+          'XMLManip::Node::Content'    => undef,
+          'XMLManip::Node::Comment'    => undef,
+          'XMLManip::Node::Childs'     => [],
+          _lock                        => 0,
+        }, $class;
+}
+
+#--------------------------------------------------------------------------------------------------
+# Other methods.
+#--------------------------------------------------------------------------------------------------
+sub PushChild
+{
+  my ($self, $node) = (shift, shift);
+  
+  if(ref $node eq 'XMLManip::Node')
+  {
+    if($self->{_lock}) { warn "trying to push child node \'$node\' while node is locked.\n"; }
+    else               { push @{$self->{'XMLManip::Node::Childs'}}, $node; }
+  }
+  else { warn "trying to push non 'XMLManip::Node' element (type is \'", ref $node || 'undefined', "\').\n"; }
+}
+
+sub RemoveChild
+{
+  my ($self, $node, $i) = (shift, shift, 0);
+  
+  if($self->{_lock})
+  {
+    warn "trying to remove child while node is locked.\n";
+  }
+  elsif(ref $node eq 'XMLManip::Node')
+  {
+    foreach my $child (@{$self->{'XMLManip::Node::Childs'}})
+    {
+      if($child == $node) { splice @{$self->{'XMLManip::Node::Childs'}}, $i, 1; }
+      else { ++$i; }
+    }
+  }
+  else
+  {
+    foreach my $child (@{$self->Child($node)})
+    {
+      RemoveChild($child);
+    }
+  }
+}
+
+sub Attribute
+{
+  my ($self, $attr) = (shift, shift);
+
+  if(@_)
+  {
+    if($self->{_lock}) { warn "trying to modify value of attribute \'$attr\' while node is locked.\n"; }
+    else               { $self->{'XMLManip::Node::Attributes'}{$attr} = shift; }
+  }
+
+  return $self->{'XMLManip::Node::Attributes'}{$attr};
+}
+
+sub HasAttribute
+{
+	my ($self, $attr) = (shift, shift);
+	
+	return exists $self->{'XMLManip::Node::Attributes'}{$attr};
+}
+
+sub ChildRegex
+{
+  my ($self, $type, $idx, @result) = (shift, shift || '.*', shift);
+
+  @result = grep{ $_->{'XMLManip::Node::Type'} =~ /$type/ } @{$self->{'XMLManip::Node::Childs'}};
+
+  return \@result unless(defined $idx);
+  return $result[$idx];
+}
+
+sub Child
+{
+  my ($self, $type, $idx, @result) = (shift, shift || '.*', shift);
+
+  @result = grep{ $_->{'XMLManip::Node::Type'} eq $type } @{$self->{'XMLManip::Node::Childs'}};
+  
+  return \@result unless(defined $idx);
+  return $result[$idx];
+}
+
+sub ChildAt
+{
+	my ($self, $idx) = (shift, shift);
+	__ASSERT($idx >= 0 && $idx <= $#{$self->{'XMLManip::Node::Childs'}});
+  return ${$self->{'XMLManip::Node::Childs'}}[$idx];
+}
+
+sub ChildTypes
+{
+	my ($self) = (shift);
+	
+	my %types;
+	foreach my $child (@{$self->{'XMLManip::Node::Childs'}})
+	{ $types{$child->Type()} = 1; }
+	
+	return sort keys %types;
+}
+
+sub NbChild
+{
+  my ($self, $type, $nb) = (shift, shift || '.*', 0);
+  return scalar grep{ $_->{'XMLManip::Node::Type'} =~ /^$type$/ } @{$self->{'XMLManip::Node::Childs'}};
+}
+
+sub NbChilds
+{
+  my ($self) = (shift);
+  return scalar @{$self->{'XMLManip::Node::Childs'}};
+}
+
+sub NbAttributes
+{
+  my ($self) = (shift);
+  return scalar keys %{$self->{'XMLManip::Node::Attributes'}};
+}
+
+sub Lock     { $_[0]->{_lock} = LOCK; }
+sub Unlock   { $_[0]->{_lock} = NO_LOCK; }
+sub IsLocked { return $_[0]->{_lock}; }
+
+sub LockAll
+{
+  my ($self) = (shift);
+  
+  $self->{_lock} = LOCK;
+  foreach my $child (@{$self->{'XMLManip::Node::Childs'}})
+  { $child->LockAll(); } 
+}
+
+sub UnlockAll
+{
+  my ($self) = (shift);
+  
+  $self->{_lock} = NO_LOCK;
+  foreach my $child (@{$self->{'XMLManip::Node::Childs'}})
+  { $child->UnlockAll(); }
+}
+
+sub AUTOLOAD
+{
+  my ($self, $method) = (shift, our $AUTOLOAD);
+  return if($method =~ /::DESTROY$/ or not exists $self->{$method});
+  
+  if(@_)
+  {
+    if($self->{_lock}) { warn "trying to modify value of $method while node is locked.\n"; }
+    else               { $self->{$method} = shift; }
+  }
+
+  return $self->{$method};
+}
+
+1;
+
+__END__
+
+#--------------------------------------------------------------------------------------------------
+# Documentation.
+#--------------------------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+ISIS::XMLManip - A perl module for generating data structures from XML files.
+
+=head1 SYNOPSIS
+
+	use ISIS::XMLManip;
+	
+	# Reading an XML.
+	my $rootNode = &ParseXMLFile('myfile.xml');
+	
+	print "Node type : \'", $rootNode->Type(), "\'\n";
+	
+	print "Node attributes :\n";
+	foreach (sort keys %{$rootNode->Attributes()})
+	{
+	 print "  $_ => ", $rootNode->Attribute($_), "\n";
+	}
+	
+	if(defined $rootNode->Content())
+	{
+	 print "Node content :\n", $rootNode->Content(), "\n";
+	}
+
+	print "Node childs :\n";
+	foreach (@{$rootNode->Childs()})
+	{
+	 print "  ", $_->Type(), "\n";
+	}
+ 
+ # Writing an XML.
+ my $newNode = new XMLManip::Node('test', { time => scalar(localtime), type => 'new' });
+ $newNode->Content("This is a test node added to the root");
+ $newNode->Attribute('size', '23');
+ 
+ $rootNode->PushChild($newNode);
+ 
+ &WriteXMLFile($rootNode, 'output.xml');
+
+=head1 DESCRIPTION
+
+This module generates a data structure from an XML file just as XML::Simple does
+but preserving child node order and differenciating attributes from childs. It
+is built on top of L<XML::Parser> that uses James Clark's expat library.
+
+The module exposes only two subroutine 'ParseXMLFile' who takes a file name as
+argument and returns a reference to a Node (the root node of the XML document) and
+'WriteXMLFile' that takes a 'Node' instance and a file name to write to.
+The nodes are encapsulated in a 'Node' package with the following interface :
+
+=head1 XMLManip::Node INTERFACE
+
+=head2 XMLManip::Node( [TYPE, [ATTRS]] | [NODE] )
+
+The constructor takes a type as a string and a reference to a hash table containing its
+attributes or takes a node reference as parameters. As a copy constructor, it will
+duplicate the node and, based on the second argument passed, will determine if it must
+copy also the child nodes recursively, copy just the references to the child nodes, or
+not copy any child information.
+
+=head2 Type( ) :
+
+Returns the tag of the node (ex : operation in '<operation>').
+
+=head2 Content( ) :
+
+Returns the node's content if available. Will return undef if the node did not
+contain any char data.
+
+=head2 Comment( ) :
+
+Returns the node's comment if available. Will return undef if the node did not
+contain any char data. Comment will be printed to the xml file just before the
+node it corresponds to.
+
+=head2 Attribute( NAME, [VALUE] ) :
+
+Returns the value of the corresponding attribute, and sets the attribute's value
+if a second argument is specified.
+
+=head2 Attributes( ) :
+
+Returns a reference to a hash table containing all the node's attributes. Each key
+is an attribute name and will return the corresponding attribute value.
+
+=head2 Child( [TYPE, [INDEX]] ) :
+
+Returns an array containing all nodes who's type matches the regular expression
+passed by argument. If no type is passed, the Child function has the same effect
+as 'Childs'. If an index is specified, 'Child' will return the Nth child of that
+type or undef if it does not exist.
+
+=head2 Childs( ) :
+
+Returns an array of 1 or more childs, or undef otherwise. The nodes in this array
+appear in the same order of the xml file.
+
+=head2 ChildTypes(  ) :
+
+Returns an array containing the list of all existing child types for the node.
+
+=head2 PushChild( <NODE> ) :
+
+Adds a child node. The node must be of type 'XMLManip::Node' or a warning will be issued.
+
+=head2 RemoveChild( <NODE|TYPE> ) :
+
+Removes a child or a type of childs from the current node. If a node is passed, the
+corresponding node will be removed. If a type is passed, all childs of that type will
+be removed.
+
+=head2 NbChild( [TYPE] ) :
+
+Returns the number of childs with type TYPE. If no type is specified, 'NbChild' has the
+same effet and return value as 'NbChilds'.
+
+=head2 NbChilds(  ) :
+
+Returns the number of child nodes for the given node.
+
+=head2 NbAttributes(  ) :
+
+Returns the number of attributes for the give node.
+
+=head1 LOCKING SAFETY
+
+The 'Node' package interface allows its user to fully modify a node's content. The
+three following member functions of the 'Node' package allow to control node editing.
+But default, a node is unlocked.
+
+=head2 Lock( ) :
+
+Lock the current node to prohibit modification of its data.
+
+=head2 LockAll(  ) :
+
+Locks the node it is called on and all its childs.
+
+=head2 Unlock( ) :
+
+Unlock the current node to allow modification of its data.
+
+=head2 UnlockAll(  ) :
+
+Unlocks the node it is called on and all its childs.
+
+=head2 IsLocked( ) :
+
+Return the current editing status of the node.
+
+=head1 SCALAR AND NUMERICAL CONTEXT
+
+A 'Node' instance will return the total number of child nodes plus one (self count) in
+a scalar context. In a string context, the printout will follow the pattern :
+
+'type(nb_attributes, nb_childs)'
+
+=head1 NODE COMPARAISON
+
+The 'Node' package has an overloaded '==' operator to allow comparaison at a memory level.
+Two nodes are equal if they are at the same localtion in memory.
+
+=head1 AUTHOR
+
+
+
+=cut
+
+#--------------------------------------------------------------------------------------------------
+# End of file.
+#--------------------------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/genxml2.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+#!/usr/bin/perl -w
+
+#============================================================================ 
+#Name        : genxml2.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+#------------------------------------------------------------------------------
+# Name   : genxml2.pl
+# Use    : description.
+#
+# Synergy :
+# Perl %name: genxml2.pl % (%full_filespec:  genxml2.pl-1:perl:fa1s60p1#2 %)
+# %date_created:  Thu Jan 12 10:13:06 2006 %
+#
+# Version History :
+#
+# 1 (19/09/2005) :
+#  - Fist version of the script.
+#  - This script takes a text input file and translate it to a TBS XML compliant file.
+#------------------------------------------------------------------------------
+
+use strict;
+use Getopt::Long;
+use ISIS::GenXML2;
+Getopt::Long::Configure ("bundling_override");
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.0';
+use constant ISIS_LAST_UPDATE => '19/09/2005';
+
+#------------------------------------------------------------------------------
+# Main script.
+#------------------------------------------------------------------------------
+
+
+my $input = undef;
+my $help = 0;
+my @defines = ();
+GetOptions("D=s@" => \@defines,"i|input=s" =>\$input,"h|help" => \$help );
+
+&Usage() if ($help);
+unless ($input) { print "You must specify an input file.\n"; &Usage();	 }
+
+my $parser = new GenXML2();
+my @args;
+foreach(@defines)
+{
+	push @args, "-D$_";
+}
+
+my $output = $input;
+$output  =~ s/\..*$/\.xml/;
+print "Output file: $output\n";
+$parser -> parseFile("$input", @args);
+$parser -> generateTBSXML("$output");
+
+
+
+#------------------------------------------------------------------------------
+# Script usage.
+#------------------------------------------------------------------------------
+sub Usage
+{
+	print " genxml2.pl - v".ISIS_VERSION." - ".ISIS_LAST_UPDATE."\n";
+	print " Usage : genxml2 \n";
+	print <<EOC;
+	
+	-h, -help        this help screen
+	-i               an input file
+	-DXXX            a define
+	
+	Input file specification
+		Keywords:
+			- 'NEWSTEP' Increment step ID
+		
+		line format is the following:
+		name,path,"cmd"
+			name is a display name,
+			path to the location you want to execute the command 'cmd'
+			cmd is the command to execute.
+			
+EOC
+	exit 0;
+}
+
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/ISIS/xml2mak.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,308 @@
+#!perl -w
+
+#============================================================================ 
+#Name        : xml2make.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+# ==============================================================================
+#  %name:          xml2mak.pl %
+#  Part of:        Juno Build Tools
+#
+#  %derived_by:    wbernard %
+#  %version:	   6.1.2 %
+#  %date_modified: Fri Jul  7 14:42:30 2006 %
+#
+#
+#  V2
+#    - Custom version that use ISIS framework.
+#
+#  See POD text at the end of this file for usage details.
+# ==============================================================================
+
+BEGIN
+{
+	push @INC, "/isis_sw/build_tools/packages";
+}
+
+use strict;
+use IO::Handle;
+use ISIS::XMLManip;
+use File::Basename;
+use Getopt::Long;
+use Pod::Usage;
+
+my $MAKNAME = 'Makefile';
+my $INPUT   = '';
+my $MAXDEPS = 0;
+my $PHONY   = 0;
+my $MULTI   = 0;
+my $SERIALIZE = 1;
+my $help    = 0;
+my $man     = 0;
+my $verbose = 0;
+
+GetOptions('name=s'     => \$MAKNAME,
+           'i|input=s'    => \$INPUT,
+           'maxdeps=i'  => \$MAXDEPS,
+           'multi!'     => \$MULTI,
+           'phony!'     => \$PHONY,
+           'serialize!' => \$SERIALIZE,
+           'verbose'    => \$verbose,
+           'man'        => \$man,
+           'help|?'     => \$help)
+  or pod2usage(2);
+pod2usage(1) if ($help);
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+
+# Parallelizable build commands are grouped in "stages" by genxml,
+# while commands that must be run in series are placed in their own
+# single command stage.  We combine stages containing only a single
+# command into a "sequence" by specifying consecutive command rules to
+# be dependent.  Both sequences and stages may be put into submake
+# files if the multi option is specified.
+
+my $currstage = undef;
+my %stage     = ();
+my @sequence  = ();
+
+print "Creating '$MAKNAME'...\n" if ($verbose);
+open(MAINMAKE, ">$MAKNAME")
+  or die("Can't open makefile \"$MAKNAME\" for write: $!\n");
+
+print(MAINMAKE "SHELL=cmd.exe\n\n");
+print(MAINMAKE "ALL: ALL_END\n\n");
+
+#<ISIS - oligrant - Replace simple text opening with xml parsing>
+my $xmlInput;
+if ($INPUT)
+{
+	$xmlInput = XMLManip::ParseXMLFile($INPUT);
+}
+else
+{
+	my $stdin = new IO::Handle;
+	$stdin->fdopen(fileno(STDIN), "r") or die("Couldn't open STDIN: $!\n");
+	$xmlInput = XMLManip::ParseXMLFileHandle($stdin);
+	$stdin->close();
+}
+my $cmdNode  = $xmlInput->Child('Commands', 0);
+#or die("Can't parse $INPUT TBS file\n");
+#</ISIS>
+
+my @steps = ();
+my @allstage = ();
+foreach my $execNode (@{$cmdNode->Child('Execute')})
+{
+    if($execNode->Attribute('ID') and
+       $execNode->Attribute('Stage') and
+       $execNode->Attribute('Cwd') and
+       $execNode->Attribute('CommandLine')
+      )
+    {
+    		unless ($currstage)
+    		{
+    			$currstage = $execNode->Attribute('Stage');
+    		}
+                
+        if ($execNode->Attribute('Stage') ne $currstage)
+        {
+        	
+        	# generate stages
+        	if ( $MULTI )
+        	{        		
+    			&GenerateSubMake($currstage, \@steps, $MULTI );
+			print (MAINMAKE &GenerateStageRule("stage$currstage", (($currstage-1>0)?"stage".($currstage-1):''), $currstage, "${MAKNAME}_${currstage}"));
+       			#print (MAINMAKE &GenerateRule( "stage$currstage", (($currstage-1>0)?"stage".($currstage-1):''), undef, "-\$(MAKE) -k -f ${MAKNAME}_${currstage}"));
+        	}
+        	else
+        	{
+        		print (MAINMAKE &GenerateStage( $currstage, \@steps , $MULTI)."\n");
+        	}
+        	
+        	push @allstage, "stage".$currstage;
+        	# Adding current to the list
+        	@steps = ();
+        	$currstage = $execNode->Attribute('Stage');
+        	push @steps, $execNode;
+        }
+        else
+        {
+        	# Adding new step to the list
+        	#print "Adding\n";
+        	push @steps, $execNode;
+        }
+    }
+}
+
+if (scalar(@steps))
+{
+	if ( $MULTI )
+	{        		
+		&GenerateSubMake($currstage, \@steps, $MULTI );
+		print (MAINMAKE &GenerateStageRule("stage$currstage", (($currstage-1>0)?"stage".($currstage-1):''), $currstage, "${MAKNAME}_${currstage}"));
+#		print (MAINMAKE &GenerateRule( "stage$currstage", (($currstage-1>0)?"stage".($currstage-1):''), undef, "\$(MAKE) -k -f ${MAKNAME}_${currstage}"));
+	}
+	else
+	{
+		print (MAINMAKE &GenerateStage( $currstage, \@steps , $MULTI)."\n");
+	}
+ 	push @allstage, "stage".$currstage;
+}
+
+if ( $MULTI )
+{
+	print (MAINMAKE "ALL_END: stage$currstage\n") if ( $currstage );		
+}
+else
+{
+	print (MAINMAKE "ALL_END: ".join (' ',@allstage)."\n");
+}
+
+close (MAINMAKE);
+
+
+
+sub GenerateSubMake
+{
+	my ($currstage, $steps) = @_;
+	print "Creating '${MAKNAME}_${currstage}'...\n" if ($verbose);
+	open (SUBMAKE, ">${MAKNAME}_${currstage}");
+	print(SUBMAKE "ALL: ALL_END\n\n");
+	print (SUBMAKE &GenerateStage( $currstage, $steps , 1)."\n");
+	print (SUBMAKE "ALL_END: ");
+	foreach (@$steps) { print (SUBMAKE "id".$_->Attribute('ID')." "); }
+	print (SUBMAKE "\n");
+	close (SUBMAKE);
+}
+
+sub GenerateStage
+{
+	my ($stage, $steps, $multi) = @_;
+		
+	my $txt = '';
+	unless ($multi)
+	{
+		$txt  .= "stage$stage: ";
+		$txt .= "stage".($stage-1)." " if ($stage-1>0);
+		
+		foreach my $s ( @$steps ) {	$txt .= "id".$s->Attribute('ID')." ";	}
+		$txt.= "\n";
+	}
+	
+	foreach my $s ( @$steps )
+	{
+		$txt .= &GenerateRule("id".$s->Attribute('ID'), '', $s->Attribute('Cwd'), $s->Attribute('CommandLine'), $s->Attribute('Component'), $stage, $s->Attribute('ID'));
+	}	
+	return $txt;
+}
+
+sub GenerateStageRule
+{
+	my ($left, $right, $stage, $makefile) = (shift, shift, shift, shift);
+	my $txt = "$left : $right\n";
+	$txt .= "\t\@echo ===-------------------------------------------------\n";
+	$txt .= "\t\@echo === Stage=$stage\n";
+	$txt .= "\t\@echo ===-------------------------------------------------\n";
+	$txt .= "\t\@timestamp \"=== Stage=$stage started at \"\n";
+	$txt .= "\t\$(MAKE) -k -f $makefile\n";
+	$txt .= "\t\@timestamp \"=== Stage=20 finished \"\n\n";
+	return $txt;
+}
+
+sub GenerateRule
+{
+	my ($left, $right, $dir, $cmd, $component, $stage, $id) = (shift,shift || '', shift, shift, shift, shift, shift);
+	my $commandline = $cmd;
+	$commandline =~ s/\|/^|/g;
+	my $txt = "$left: $right\n";
+	$txt .= "\t\@echo === Stage=$stage == $component\n";
+	$txt .= "\t\@echo -- $commandline\n";
+	$txt .= "\t\@echo --- ElectricCloud Executed ID $id\n";
+	$txt .= "\t\@timestamp \"++ Started at \"\n";
+	$txt .= "\t\@timestamp_hires \"+++ HiRes Start \"\n";
+	$txt .= "\t\@echo Chdir $dir \n";
+	$txt .= "\t\@-cd $dir && $cmd\n";
+	$txt .= "\t\@timestamp_hires \"+++ HiRes End \"\n";
+	$txt .= "\t\@timestamp \"++ Finished at \"\n\n";
+	return $txt;
+}
+
+__END__
+
+=head1 NAME
+
+xml2mak - Create a makefile from an EBS XML file
+
+=head1 SYNOPSIS
+
+perl xml2mak.pl [-h] [-man]  [-multi]  [-name=<makefile name>] [-i=<XML file>]
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exits.
+
+=item B<-man>
+
+Prints the manual page and exits.
+
+=item B<-name=F<makefile name>>
+
+Specify the root makefile name.  Defaults to F<Makefile>.  If
+B<-multi> is specified, the additional makefiles will be named
+<root>_<#>.<root extension>.
+
+=item B<-[no]phony>
+
+If phony is specified, targets are defined as C<.PHONY> in the
+makefile.  Default is not to declare phony targets.
+
+=item B<-[no]serialize>
+
+B<-noserialize> removes dependencies between adjacent rules in a
+sequence, even though these dependencies may be specified in the XML
+file.  Sequenced rules are then free to be executed concurrently.
+Default is to serialize sequences as defined in the XML file.
+
+=item B<-maxdeps=<number>>
+
+Specify the maximum number of dependencies for a given target.  This
+will split the target into multiple rules if necessary.
+
+=item B<-multi>
+
+Split the makefile into multiple files, separating them by stages and
+sequences.
+
+=back
+
+=head1 DESCRIPTION
+
+Extracts the component list and commands from an EBS XML and generates
+a makefile using the same command staging order.  Default make target
+is "ALL".
+
+=head1 SEE ALSO
+
+L<xml2cmp|scripts::xml2cmp>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/Utils.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!perl -w
+# ==============================================================================
+#  %name:            Utils.pm %
+#  Part of:        juno_build
+#  Requires:
+#
+#  %version:	     to1r1103#6 %
+#  %date_modified:   Fri Oct  6 11:53:35 2006 %
+#
+#  See POD text at the end of this file for usage and other details.
+# ==============================================================================
+
+package Utils;
+
+use strict;
+use File::Copy;
+
+
+
+BEGIN
+{
+    use Exporter ();
+    our (@ISA, @EXPORT, @EXPORT_OK);
+    @ISA    = qw(Exporter);
+    @EXPORT =
+      qw( &replace_env_vars &do_copy );
+
+    # your exported package globals go here,
+    # as well as any optionally exported functions
+    @EXPORT_OK = qw();
+}
+
+
+
+# This will replace any text strings of the form:
+#   ${<ENV_VARIABLE>} or
+#   ${env.<ENV_VARIABLE>}
+# with the corresponding value of the matching environment variable, i.e.
+# ENV_VARIABLE.
+sub replace_env_vars
+{
+    local $_ = shift;
+    if ( defined( $_ ) )
+    {
+        foreach my $varname (keys %ENV)
+        {
+            s/\$\{${varname}\}/${ENV{$varname}}/g;
+            s/\$\{env\.${varname}\}/${ENV{$varname}}/g;
+        }
+    }
+    return $_;
+}
+
+
+
+sub do_copy
+{
+    my ( $from, $to ) = @_;
+    print( "copy: $from -> $to\n" );
+    copy( $from, $to ) or die "ERROR: Copy failed: $!";
+}
+
+
+
+1;
+
+__END__
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/packages/xml2tree.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,322 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#****h*	lib/xml2tree.pm
+#	NAME
+#		xml2tree.pm
+#	DESCRIPTION
+#		This module	is used	to parse the data	from a xml file and convert it to tree like data structure for further processing
+#  		Each node is connected two way and looks like as follows
+#	   +---------+------+------------+------------+--------------+----------------------+
+#	   |prev			|el_name	 |attr		  |value	  	 |next               	|
+#	   |(Reference to 	|(Name of    |(Hash of the|(String value)|Reference of array to	|
+#	   |the parent node)|the element)|atrributes) |		         |next child elements)	|
+#	   +----------------+------------+------------+--------------+----------------------+	 
+#	RETURN VALUE
+#   	0 if successfull, 1 on error
+# 	EXAMPLE
+#		use xml2tree;
+#		.
+#		.
+#   	my $pr = xml2tree->new();
+#		$pr->parseFile(dct5_release_note.xml);
+#		.
+#		.
+#		my $trees = $getNode('Document');
+#	SEE ALSO
+#		sbt/data//subcon/dct5_release_note.xml
+#   	sbt/make_dct5_upload.pl
+#   	sbt/lib/sbt_common.pm
+#	HISTORY
+#		Version			:	0.1
+#		Date				:	
+#		Author			:	rownak
+#   TODO
+#		Case insensitive search
+#		Support non recursive search in case of attachment
+#******
+
+
+
+
+package	xml2tree;
+
+use	strict;
+use	XML::Parser;
+
+    	
+my %entities = ();
+my %root;
+my $parser;
+my $curr_elem;
+
+my $xml_file;
+my $count=0;
+
+#my @found_nodes;
+
+#==========================================================
+#		Intialization Part
+#
+#		Constructor. and others
+#==========================================================
+
+#usage(); 
+#exit 0;
+
+sub	new{
+	
+	$parser	= new	XML::Parser(ParseParamEnt	=> 1,Handlers	=> 
+				{Entity	=> \&entityHandler,	
+				 Char	=> \&charHandler,
+				 Start =>	\&startHandler,
+				 End =>	\&endHandler});
+
+	 
+	
+}
+
+#   Parse a given XML file.
+sub parseFile{
+     my $file = shift; 
+     $parser->parsefile($file);
+}		
+
+#==========================================================
+#		Data Processing Part
+#
+#		
+#==========================================================
+
+#   XML::Parser uses this function when it finds  an xml entity.
+sub entityHandler{
+    my ($p, $name, $val) = @_;
+    		
+    eval {$entities{$name} = $val;};
+    die ("Error in handling xml characters " .
+        "at line $p->current_line") if $@;
+        
+}
+
+#   XML::Parser uses this function when it finds an xml element start entry.
+sub startHandler{
+    my ($p, $element, %attr) = @_;
+    #Root of the tree
+	
+    if($element eq ''){
+    	return;
+	}
+	$p->{cdata_buffer}='';
+	#making a two way linked list of tree value
+	if(not defined($curr_elem)){
+    	$root{'el_name'} = $element;
+    	$root{'attr'} = \%attr;
+    	$root{'prev'} = 0;
+    	$root{'next'} = 0;
+    	$root{'value'}= 0;
+    	
+    	$curr_elem = \%root;
+    }else{
+	   	my %element;
+		
+		$element{'el_name'} = $element;
+		$element{'attr'} = \%attr;
+		$element{'prev'} = $curr_elem;
+		$element{'next'} = 0;
+		$element{'value'}= 0;
+		if($curr_elem->{'next'} == 0){
+			my @child_element;
+			push(@child_element,\%element);	
+			$curr_elem->{'next'}=\@child_element;
+		
+		}
+		else{
+			my $child_element = $curr_elem->{'next'};
+			push(@$child_element,\%element);	
+			$curr_elem->{'next'}=$child_element;
+		
+		}
+	
+		$curr_elem = \%element;
+   	}
+}
+
+#   XML::Parser uses this function when it finds  an xml element end entry.
+sub endHandler{
+	my($p) = @_;
+	$curr_elem->{'value'} = $p->{cdata_buffer} ;
+	$curr_elem = $curr_elem->{'prev'};
+}
+
+
+#   XML::Parser uses this function when it finds an xml character entry.
+sub charHandler{
+
+	my ($p, $str) = @_;
+    my $element;
+    my @context = $p->context;
+    $str =~ s/^\s+//;
+    $str =~ s/\s+$//;
+	
+	if($str eq ""){
+		return;
+	}
+	$p->{cdata_buffer} .= $str;
+	
+
+}
+
+
+
+
+##==========================================================
+##		External interface part
+##
+##		This methods will be used by its client
+##==========================================================
+
+#
+
+sub usage
+{
+   
+    print"\n\n";
+    print "Functionality: \n";
+    print"======================\n";
+    print "it parse any xml and convert the data into a two way trre like linked list \n\n";
+    print "use xml2tree\n";
+	print "\.\n";
+	print "\.\n";
+   	print 'my $pr = xml2tree->new()'."\n";
+	print '$pr->parseFile(dct5_release_note.xml)'."\n";
+	print "\.\n";
+	print "\.\n";
+	print 'my $trees = $getNode(\'Document\')'."\n";
+        
+}
+
+#Depending on the search criteria it returns array of nodes.
+# Input is 
+# 	el_name    => element name of searching node(compulsory)
+# 	attributes => Hash input of attributes to be searched. It will retun true even if it is a subset.(optional)
+# 	value      => value of the element(optional)
+#
+#Output is 
+#	Array of nodes that has been found . Each node has following type of structure
+#	   +---------+------+------------+------------+--------------+----------------------+
+#	   |prev			|el_name	 |attr		  |value	  	 |next               	|
+#	   |(Reference to 	|(Name of    |(Hash of the|(String value)|Reference of array to	|
+#	   |the parent node)|the element)|atrributes) |		         |next child elements)	|
+#	   +----------------+------------+------------+--------------+----------------------+	 
+sub getNode{
+	my $tmp_el_name  = shift;
+	my $tmp_attr     = shift;
+	my $tmp_value    = shift;
+	my @found_nodes=();	
+	if ($tmp_el_name eq '0' ){
+		return;	
+	}
+	
+	if(not defined $tmp_attr){$tmp_attr=0;}
+	if(not defined $tmp_value){$tmp_value=0;}
+	
+	
+	
+	searchTree($root{'next'},$tmp_el_name,$tmp_attr,  $tmp_value,\@found_nodes);
+	
+	return \@found_nodes; 
+}
+
+sub getPrevSibling{
+	my $curr_element = shift;
+	my $parent = $curr_element->{'prev'}; 	
+	my $child_array = $parent->{'next'};
+	my $prevSibling=undef;
+	foreach my $tmp_sibling (@$child_array){
+		if ($tmp_sibling == $curr_element){
+			last;	
+			
+		}
+	} 
+	return $prevSibling
+} 
+sub getEntities{
+	return \%entities;
+}
+
+sub getRoot{
+	return \%root;
+}
+##==========================================================
+##		Private functions part
+##
+##		This functions  will be used by external interface part
+##==========================================================
+
+#
+sub searchTree{
+	my $xml_sub_tree = shift;
+	my $tmp_el_name  = shift;
+	my $tmp_attr     = shift;
+	my $tmp_value    = shift;
+	my $found_nodes_ref = shift;
+	my $is_attr_exist = 0; 
+	my $is_value_exists=0;
+	my $is_el_name_exists=0;
+	if($xml_sub_tree eq '0'){return;}
+	foreach my $node (@$xml_sub_tree){
+			
+		my $prev_node = $node->{'prev'}; 
+		my $tmp_attr_node= $node->{'attr'};
+		if($tmp_attr ne '0'){
+			$is_attr_exist = is_LsubsetR($tmp_attr,$tmp_attr_node); 
+		}
+		
+		if((($tmp_el_name eq '0')||(($tmp_el_name ne '0') && ($node->{'el_name'} eq $tmp_el_name))) &&
+			(($tmp_value eq '0')||(($tmp_value ne '0') && ($node->{'value'} eq $tmp_value)))&&
+			(($tmp_attr eq '0')||(($tmp_attr ne '0') && $is_attr_exist))){
+			
+			push (@$found_nodes_ref, $node)		
+	    }
+		  
+		searchTree ($node->{'next'}, $tmp_el_name, $tmp_attr, $tmp_value, $found_nodes_ref);
+	}
+}
+
+
+sub is_LsubsetR(){
+	my $left_hash  = shift;
+	my $right_hash = shift;
+	if ((keys(%$left_hash) == 0) || (keys(%$right_hash) ==0)){
+		return 0;	
+		
+	}
+	my $is_match=1;
+	my $is_match_single;
+	
+	while(my($key, $value) = each(%$left_hash)){
+		$is_match_single=0;
+		while(my ($r_key,$r_value) = each(%$right_hash)){
+			if(($key eq $r_key ) && ($value eq $r_value)){
+				$is_match_single=1;
+			}
+		}
+		$is_match = $is_match & $is_match_single;
+	} 
+	return $is_match;
+}
+
+
+1;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/CreateZipInput.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+#============================================================================ 
+#Name        : CreateZipInput.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Script that generate makefile for single archiving configuration. """
+import os
+# setting the egg cache directory to a pid specific location.
+# this should prevent issues with concurrent threads.
+if not os.environ.has_key('PYTHON_EGG_CACHE') or os.environ['PYTHON_EGG_CACHE'] == None: 
+    os.environ['PYTHON_EGG_CACHE'] = os.environ['TEMP'] + "/" + str(os.getpid())
+
+import configuration
+import archive
+import logging
+import sys
+from optparse import OptionParser
+
+_logger = logging.getLogger('CreateZipInput')
+_logger.setLevel(logging.INFO)
+
+def main():
+    """ The application main. """
+    cli = OptionParser(usage="%prog [options]")
+    cli.add_option("--filename", help="Configuration file") 
+    cli.add_option("--config", help="Config to load (spec name).")
+    cli.add_option("--id", help="Config number to execute", type="int")
+    cli.add_option("--output", help="Output file")
+    cli.add_option("--writertype", help="Writer Type")
+                   
+    opts, dummy_args = cli.parse_args()
+    if not opts.filename:
+        cli.print_help()
+        sys.exit(-1)
+    if not opts.config:
+        cli.print_help()
+        sys.exit(-2)
+    if opts.id == None:
+        cli.print_help()
+        sys.exit(-3)
+    if not opts.output:
+        cli.print_help()
+        sys.exit(-4)
+    if not opts.writertype:
+        cli.print_help()
+        sys.exit(-5)
+
+    _logger.info("Loading %s..." % opts.filename) 
+    builder = configuration.NestedConfigurationBuilder(open(opts.filename, 'r'))
+    configset = builder.getConfiguration()
+    _logger.info("Getting %s..." % opts.config)
+    configs = configset.getConfigurations(opts.config)
+
+    if len(configs) > 0 and int(opts.id) >= 0 and int(opts.id) < len(configs):
+        _logger.info("Generating %s.%s as %s..." % (opts.config, opts.id, opts.output))
+        prebuilder = archive.ArchivePreBuilder(configuration.ConfigurationSet(configs), opts.config, opts.writertype, int(opts.id))
+        prebuilder.write(opts.output)
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ant.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+#============================================================================ 
+#Name        : ant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This module defines helper functions to be used in python Ant tasks. """
+
+
+import logging
+import re
+import os.path
+
+
+def get_property(property_name):
+    """ This function return None if a property has not been replaced by Ant. """
+    if len(property_name) > 0 and property_name.startswith('${'):
+        return None
+    return property_name
+
+
+def get_previous_build_number(build_number):
+    """ Determines the previous build number if possible. """
+    match = re.match(r'(?P<bn_txt>\w[a-zA-Z0-9_.]*\.)?(?P<bn_num>\d+)', build_number)
+    if match != None:
+        bn_txt = match.group('bn_txt')
+        bn_num = match.group('bn_num')
+        try:
+            bn_num_int = int(bn_num)
+            if bn_num_int > 1:
+                previous_bn_num_int = bn_num_int - 1
+                previous_bn_num = str(previous_bn_num_int).rjust(len(bn_num), '0')
+                previous_bn = previous_bn_num
+                if bn_txt != None:
+                    previous_bn = '%s%s' % (bn_txt, previous_bn_num)
+                return previous_bn
+        except ValueError:
+            logging.warning('Parsing of Ant build number failed.')
+    return ''
+    
+    
+def get_next_build_number(build_number):
+    """ Determines the next build number if possible. """
+    match = re.match(r'(?P<bn_txt>\w[a-zA-Z0-9_.]*\.)?(?P<bn_num>\d+)', build_number)
+    if match != None:
+        bn_txt = match.group('bn_txt')
+        bn_num = match.group('bn_num')
+        try:
+            bn_num_int = int(bn_num)
+            previous_bn_num_int = bn_num_int + 1
+            previous_bn_num = str(previous_bn_num_int).rjust(len(bn_num), '0')
+            previous_bn = previous_bn_num
+            if bn_txt != None:
+                previous_bn = '%s%s' % (bn_txt, previous_bn_num)
+            return previous_bn
+        except ValueError:
+            logging.warning('Parsing of Ant build number failed.')
+    return ''
+
+def get_filesets_content(project, task, elements):
+    """ Extract all files selected by the filesets in a script's elements. """
+    for eid in range(elements.get("fileset").size()):
+        dirscanner = elements.get("fileset").get(int(eid)).getDirectoryScanner(project)
+        dirscanner.scan()
+        for jfilename in dirscanner.getIncludedFiles():
+            filename = str(jfilename)
+            task.log("Parsing %s" % filename)
+            filename = os.path.join(str(dirscanner.getBasedir()), filename)
+
+
+class AntHandler(logging.Handler):
+    """ Implement a logger hanlder that prints error message using an Ant object.
+        See Python documentation on how to use it.
+        e.g:
+        logging.getLogger("").addHandler(AntHandler(anttask))
+        This line will redirect messages to Ant logging system.
+    """
+    def __init__(self, task, level=logging.NOTSET):
+        logging.Handler.__init__(self, level)
+        self._task = task
+    
+    def emit(self, record):
+        """ Handle the record using Ant. """
+        self._task.log(str(self.format(record)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,21 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" The archive module. """
+from archive.builders import ArchivePreBuilder
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/builders.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,217 @@
+#============================================================================ 
+#Name        : builders.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+This modules contains the archive builders.
+An archive builder is a class that is able to use data from a configuration
+and generate a set of shell commands.
+"""
+import archive.tools
+import archive.selectors
+import archive.mappers
+import archive.scanners
+import logging
+import pathaddition
+import buildtools
+import os
+import codecs
+import configuration
+import fileutils
+
+_logger = logging.getLogger('archive')
+_logger.setLevel(logging.INFO)
+
+class ArchivePreBuilder(buildtools.PreBuilder):
+    """ Processes an archive build specification. """
+    def __init__(self, config_set, config_name, writerType='ant', index = None):
+        buildtools.PreBuilder.__init__(self, config_set)
+        self.configs = config_set.getConfigurations()
+        self.spec_name = config_name
+        self.index = index
+        self.writerType = writerType
+        self.listToFindPrefix = []
+
+    def build_manifest(self, config):
+        """ Generate a manifest file from the a configuration. """
+        _logger.info('Processing archive config: ' + config['name'])
+        _scanners = archive.scanners.get_scanners(config.get_list('scanners', ['default']), config)
+        
+        content_list = {}
+    
+        if not os.path.exists(config['temp.build.dir']):
+            os.makedirs(config['temp.build.dir'])
+        manifest_file_path = os.path.abspath(os.path.join(config['temp.build.dir'], config['name'] + '_includefile.txt'))
+        out = codecs.open(manifest_file_path, 'w+', 'utf-8')
+        
+        # zip.root.dir can be set to root.dir so that when zipping from another dir,
+        # the manifest is relative to that dir
+        (drive, root_dir) = os.path.splitdrive(os.path.normpath(config.get('zip.root.dir', config['root.dir'])))
+        _logger.info("   * Scanning")
+        for scanner in _scanners:
+            _logger.debug("Scanner %s" % scanner)
+            for subpath in scanner.scan():
+                (drive, subpath) = os.path.splitdrive(subpath)
+                if pathaddition.relative.abs2rel(subpath, root_dir):
+                    _logger.debug(subpath)
+                    subpath = subpath[len(root_dir):]
+                    if subpath.startswith(os.sep):
+                        subpath = subpath[1:]
+                # normpath is to remove any occurances of "..\.." before checking for duplicates
+                subpath = os.path.normpath(subpath)
+                if subpath not in content_list:
+                    out.write(u"".join([subpath, u'\n']))
+                    content_list[subpath] = True
+    
+        out.close()
+        return manifest_file_path
+
+    def manifest_to_commands(self, config, manifest):
+        """ Generate return a command list. Commands are stored in a two dimension array."""
+        _logger.info("   * Generating commands")
+        tool = archive.tools.get_tool(config['archive.tool'])
+        mapper_name = 'default'
+        if config.has_key('mapper'):
+            mapper_name = config['mapper']
+        mapper = archive.mappers.get_mapper(mapper_name, config, tool)
+        return mapper.create_commands(manifest)
+    
+    def create_command_list(self, commands):
+        """ Convert a two dimensions array of command to a CommandList object. """
+        stages = buildtools.CommandList()
+        newstage = False
+        for cmds_stage in commands:
+            _logger.debug("Stage: %s" % cmds_stage)
+            for cmd in cmds_stage:
+                stages.addCommand(cmd, newstage)
+                newstage = False
+            newstage = True
+        return stages
+    
+    def writeTopLevel(self, build_file_path, output_path, xml_file):
+        """Creates a build tool config makefile that executes archieve build."""
+        config_name_list = []
+        for config in self.configs:
+            config_name_list.append(config['name'])
+            if not os.path.exists(config['archives.dir']):
+                os.makedirs(config['archives.dir'])
+            
+        writer = buildtools.get_writer(self.writerType, build_file_path)
+        writer.writeTopLevel(config_name_list, self.spec_name, output_path, xml_file)
+        writer.close()
+
+    def getCommonUncRoots(self, uncPaths):
+        commonRoots = {}
+        for p in uncPaths:
+            commonRoots["\\\\" + os.sep.join(p[2:].split(os.sep)[0:2]) + os.sep] = 1
+        return commonRoots.keys()
+
+    def getPrefix(self, dir, commonUncRoots):
+        for root in commonUncRoots:
+            if dir.startswith(root):
+                return root
+        raise Exception("Could not find root for %s." % dir)
+    
+    def checkRootDirValue(self, builder, parse_xml_file, build_drive, config_type):
+        """Checks UNC path in root.dir and adds the substituted drive into EMAKEROOT."""
+        substDrives = []
+        if build_drive:
+            substDrives.append(build_drive + os.sep)
+        
+        # Read all the config's root.dir to get UNC Path if any
+        # Of course this is only on windows platform
+        if os.sep == '\\':
+            for config in self.configs:
+                (drive, root_dir) = os.path.splitdrive(os.path.normpath(config['root.dir']))
+                _logger.debug("drive=%s, root_dir=%s" % (drive, root_dir))
+                if drive == "":
+                    self.listToFindPrefix.append(root_dir)
+        
+            commonUncRoots = self.getCommonUncRoots(self.listToFindPrefix)
+            _logger.debug("Common roots %s" % (commonUncRoots))
+            driveMapping = {}
+            for root in commonUncRoots:
+                _logger.info("Substing %s" % (root))
+                driveMapping[root] = self.substUncPath(root)
+                _logger.debug("%s subst as %s" % (root, driveMapping[root]))
+                substDrives.append(driveMapping[root] + os.sep)
+
+            for config in self.configs:
+                (drive, root_dir) = os.path.splitdrive(os.path.normpath(config['root.dir']) + os.sep) 
+                if drive == "":
+                    for root in driveMapping:
+                        if root_dir.startswith(root):
+                            config['root.dir'] = os.path.normpath(driveMapping[root] + os.sep + root_dir[len(root):len(root_dir)])
+                            _logger.info("Updated %s in %s" % (root_dir, config['root.dir']))
+                            config['unsubst.dir'] = driveMapping[root]
+                            break                
+                elif drive != build_drive:
+                    if config['root.dir'] not in substDrives:
+                        substDrives.append(config['root.dir'])
+        else:
+            for config in self.configs:
+                if config['root.dir'].startswith('\\\\'):
+                    _logger.error("UNC path are not supported under this platform: %s" % (config['root.dir']))
+        builder.writeToXML(parse_xml_file, self.configs, config_type)
+        return os.path.pathsep.join(substDrives)
+       
+
+    def substUncPath(self, path):
+        freedrive = fileutils.get_next_free_drive()
+        fileutils.subst(freedrive, path)
+        return freedrive
+
+    def cleanupSubstDrives(self):
+        # Read all the config's root.dir to get UNC Path if any
+        drives = {}
+        for config in self.configs:
+            _logger.debug("Checking configuration...")
+            _logger.debug("unsubst.dir: %s" % 'unsubst.dir' in config)
+            _logger.debug("drives: %s" % drives)
+            if 'unsubst.dir' in config and not config['unsubst.dir'] in drives:
+                _logger.debug("Found drive to unsubst %s" % (config['unsubst.dir']))
+                self.unSubStituteDrives(config['unsubst.dir'])
+                drives[config['unsubst.dir']] = config['unsubst.dir']
+                    
+    def unSubStituteDrives(self, drive):
+        _logger.info("Unsubsting %s" % (drive))
+        fileutils.unsubst(drive)
+        
+    def write(self, outputname):
+        """Creates a build tool configuration file that executes archive build operations.
+
+        The input to each archive build operation is an includefile that lists
+        all the files to be included in the archive. These text files are
+        generated before the build file by scanning the filesystem.
+        """
+        stages = buildtools.CommandList()
+
+        commands = []
+        if self.index > len(self.configs):
+            raise Exception("index not found in configuration")
+        config = self.configs[self.index]
+        stages = self.manifest_to_commands(config, self.build_manifest(config))
+                
+        # merging the commands            
+        while len(commands) < len(stages):
+            commands.append([])
+        for i in range(len(stages)):
+            commands[i].extend(stages[i])
+
+        writer = buildtools.get_writer(self.writerType, outputname)
+        writer.write(self.create_command_list(commands))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/mappers.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,425 @@
+#============================================================================ 
+#Name        : mappers.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Archive mappers that map how the input files are divided into archives.
+
+
+"""
+
+import buildtools
+import os
+import sys
+import codecs
+import fileutils
+import logging
+import symrec
+import re
+import csv
+import shutil
+
+_logger = logging.getLogger('logger.mappers')
+_logger.setLevel(logging.INFO)
+
+# Default value for missing/invalid policy files.
+MISSING_POLICY = "9999"
+
+
+class Mapper(object):
+    """ Mapper Abstract class. Any custom implementation must derive it!.
+    
+    It handles metadata creation.
+    """
+    
+    def __init__(self, config, tool):
+        self._tool = tool
+        self._config = config
+        self._metadata = None
+        if not os.path.exists(self._config['archives.dir']):
+            os.makedirs(self._config['archives.dir'])
+        if self._config.has_key("grace.metadata") and self._config.get_boolean("grace.metadata", False):
+            if self._config.has_key("grace.template") and os.path.exists(self._config["grace.template"]) and \
+             not os.path.exists(os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml")):
+                shutil.copy(config["grace.template"], os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml"))
+            self._metadata = symrec.ReleaseMetadata(os.path.join(self._config['archives.dir'], self._config['name']+ ".metadata.xml"),
+                                       service=self._config['grace.service'],
+                                       product=self._config['grace.product'],
+                                       release=self._config['grace.release'])
+            self._metadata.save()            
+        
+    def declare_package(self, filename, extract="single"):
+        """ Add a package to the metadata file. """
+        if self._metadata is None:
+            return
+        self._metadata.add_package(os.path.basename(filename), extract=extract, filters=self._config.get_list('grace.filters', None), default=self._config.get_boolean('grace.default', True))
+        self._metadata.save()
+    
+    def create_commands(self, manifest):
+        """ Return a list of command list. """
+        return [[self._tool.create_command(self._config['name'], manifests=[manifest])]]
+        
+    
+class DefaultMapper(Mapper):
+    """ The default mapper. It splits the content based on size characteristics.
+    
+    'the max.files.per.archive' and 'max.uncompressed.size' properties define how the input files
+    are split between a number of part zips.
+    """
+    def __init__(self, config, archiver):
+        """ Initialization. """
+        Mapper.__init__(self, config, archiver)
+
+    def create_commands(self, manifest):
+        """ Return a list of command lists. """
+        result = []
+
+        _logger.info("  * Input manifest: " + manifest)
+        manifests = self._split_manifest_file(self._config['name'], manifest)
+        if not os.path.exists(self._config['archives.dir']):
+            _logger.info("  * Mkdir " + self._config['archives.dir'])
+            os.makedirs(self._config['archives.dir'])
+
+        for manifest in manifests:
+            _logger.info("  * Creating command for manifest: " + manifest)
+            filename = os.path.join(self._config['archives.dir'], os.path.splitext(os.path.basename(manifest))[0])
+            if len(manifests) == 1:
+                filename = os.path.join(self._config['archives.dir'], self._config['name'])
+            _logger.info("  * " + filename + self._tool.extension())
+            self.declare_package(filename + self._tool.extension(), self._config.get('grace.extract', 'single'))
+            result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
+        
+        return [result]
+
+    def _split_manifest_file(self, name, manifest_file_path):
+        """ This method return a list of files that contain the content of the zip parts to create. """
+        filenames = []
+        
+        if (self._config.has_key('max.files.per.archive') or self._config.has_key('max.uncompressed.size')):
+            size = 0
+            files = 0
+            part = 0
+            filename = ""
+            output = None
+                        
+            if os.path.exists(self._config['root.dir']) and os.path.isdir(self._config['root.dir']):
+                curdir = os.path.abspath(os.curdir)
+                os.chdir(self._config.get('zip.root.dir', self._config['root.dir']))            
+                maxfiles = self._config.get('max.files.per.archive', 100000000)
+                _logger.info("Max number of files per archive: " + str(maxfiles))
+                max_uncompressed_size = self._config.get('max.uncompressed.size', 100000000)
+                _logger.info("Max uncompressed size per archive: " + str(max_uncompressed_size))
+                
+                file_handle = codecs.open(manifest_file_path, "r", "utf-8" )
+        
+                for line in file_handle.readlines():
+                    line = line.rstrip()
+        
+                    if(os.path.isfile(line)):
+                        if part == 0 or files == int(maxfiles) or size + os.path.getsize(line) >= int(max_uncompressed_size):
+                            if output != None:
+                                output.close()
+        
+                            size = 0
+                            files = 0
+                            part += 1
+        
+                            filename = "%s_part%02d" % (name, part)
+                            filenames.append(os.path.join(self._config['temp.build.dir'], filename + ".txt"))
+        
+                            output = codecs.open(os.path.join(self._config['temp.build.dir'], filename + ".txt"), 'w', "utf-8" )
+        
+                        files += 1
+                        size += os.path.getsize(line)
+        
+                        output.write(u"".join([line, u'\n']))
+                    elif(os.path.isdir(line)):
+                        if (len(os.listdir(line)) == 0):
+                            if part == 0 or files == int(maxfiles):
+                                if output != None:
+                                    output.close()
+        
+                                size = 0
+                                files = 0
+                                part += 1
+        
+                                filename = "%s_part%02d" % (name, part)
+                                filenames.append(os.path.join(self._config['temp.build.dir'], filename + ".txt"))
+                                
+                                output = open(os.path.abspath(os.path.join(self._config['temp.build.dir'], filename + ".txt")), 'w')
+        
+                            files += 1
+        
+                            output.write(u"".join([line, u'\n']))
+                    else:
+                        _logger.warning('Not recognized as file or directory: %s' % line)
+        
+                if output != None:
+                    output.close()
+        
+                file_handle.close()
+                os.chdir(curdir)
+        else:
+            filenames.append(manifest_file_path)
+        
+        return filenames
+
+
+class PolicyMapper(Mapper):
+    """ Implements a policy content mapper.
+    
+    It transforms a list of files into a list of commands with their inputs.
+    All files with policy 0 will be under the main archive.
+    All other files will get backed up by policy and then store into an second archive. 
+    """
+    
+    def __init__(self, config, archiver):
+        """ Initialization. """
+        Mapper.__init__(self, config, archiver)
+        self._policies = {}
+        self._policy_cache = {}
+        self._binary = {}
+        # Load csv
+        if self._config.has_key('policy.csv'):
+            if os.path.exists(self._config['policy.csv']):
+                self.load_policy_binary(self._config['policy.csv'])
+            else:
+                _logger.error("POLICY_ERROR: File not found '%s'." % self._config['policy.csv'])
+
+    def load_policy_binary(self, csvfile, column=1):
+        """ Loads the binary IDs from the CSV file. """
+        _logger.info("POLICY_INFO: Loading policy definition '%s'." % csvfile)
+        reader = csv.reader(open(csvfile, "rU"))
+        for row in reader:
+            if re.match(r"^((?:\d+)|(?:0842[0-9a-zA-Z]{3}))$", row[0].strip()):                
+                _logger.info("POLICY_INFO: Adding policy: '%s' => '%s'" % (row[0].strip(), row[column].strip().lower()))
+                self._binary[row[0].strip()] = row[column].strip().lower()
+            else:
+                _logger.warning("POLICY_WARNING: Discarding policy: '%s'." % row[0].strip())
+
+    def zip2zip(self):
+        """ Should the non public zip be zipped up under a specific zip. """
+        return self._config.get_boolean('policy.zip2zip', False)
+    
+    def create_commands(self, manifest):
+        """ Generates a list of build commands. """
+        result = []
+        stages = []
+
+        # Create the archive output directory
+        if not os.path.exists(self._config['archives.dir']):
+            _logger.info("  * Mkdir " + self._config['archives.dir'])
+            os.makedirs(self._config['archives.dir'])
+        
+        # Sort the manifest content, splitting it by policy
+        file_handle = codecs.open(manifest, "r", "utf-8")
+        for line in file_handle.readlines():
+            line = line.rstrip()
+            self._sort_by_policy(line)
+        file_handle.close()
+        
+        # Generating sublists.
+        for key in self._policies.keys():
+            self._policies[key].close()
+            manifest = os.path.join(self._config['temp.build.dir'], self._config['name'] + "_%s" % key + ".txt")
+            filename = os.path.join(self._config['archives.dir'], self._config['name'] + "_%s" % key)
+            _logger.info("  * " + filename + self._tool.extension())
+            result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
+        stages.append(result)
+        
+        # See if any internal archives need to be created
+        content = []
+        for key in self._policies.keys():
+            if not self.zip2zip():
+                self.declare_package(self._config['name'] + "_%s" % key + self._tool.extension())
+            else:
+                if key != "0":
+                    content.append(os.path.join(self._config['archives.dir'], self._config['name'] + "_%s" % key + self._tool.extension()))
+                else:
+                    self.declare_package(self._config['name'] + "_%s" % key + self._tool.extension())
+
+        # Creating zip that contains each policy zips.
+        if self.zip2zip() and len(content) > 0:
+            manifest = os.path.join(self._config['temp.build.dir'], self._config['name'] +  ".internal.txt")
+            file_handle = codecs.open( manifest, "w+", "utf-8" )
+            file_handle.write(u"\n".join(content))
+            file_handle.close()
+            internal = "internal"
+            if self._config.has_key('policy.internal.name'):
+                internal = self._config['policy.internal.name']
+            filename = os.path.join(self._config['archives.dir'], self._config['name'] +  "_" + internal)
+            _logger.info("  * " + filename + self._tool.extension())
+            self.declare_package(filename + self._tool.extension(), "double")
+            stages.append(self._tool.create_command(self._config['archives.dir'], filename, manifests=[manifest]))
+
+            cmds = []
+            for filename in content:
+                cmds.append(buildtools.Delete(filename=filename))
+            stages.append(cmds)
+        return stages
+    
+    def get_dir_policy(self, dirname):
+        """ Get policy value for a specific directory. """
+        dirname = os.path.normpath(dirname)
+        if not self._policy_cache.has_key(dirname):
+            policyfile = None
+            for name in self.get_policy_filenames():
+                if os.sep != '\\':
+                    for filename in os.listdir(dirname):
+                        if filename.lower() == name.lower():
+                            policyfile = os.path.join(dirname, filename)
+                            break
+                elif os.path.exists(os.path.join(dirname, name)): 
+                    policyfile = os.path.join(dirname, name)
+                    break
+            
+            value = self._config.get('policy.default.value', MISSING_POLICY)
+            if policyfile != None:
+                try:
+                    value = fileutils.read_policy_content(policyfile)
+                    if value not in self._binary.keys():
+                        _logger.error("POLICY_ERROR: policy file found %s but policy %s value not exists in csv" % (policyfile, value))
+                except Exception, exc:
+                    _logger.error("POLICY_ERROR: %s" % exc)         
+                    value = self._config.get('policy.default.value', MISSING_POLICY)
+            else:
+                _logger.error("POLICY_ERROR: could not find a policy file under: '%s'" % dirname)
+            # saving the policy value for that directory.
+            self._policy_cache[dirname] = value
+        return self._policy_cache[dirname]
+        
+    def get_policy_filenames(self):
+        """ Returns the list of potential policy filenames. """
+        return self._config.get_list('policy.filenames', ['Distribution.policy.s60'])
+        
+    def _sort_by_policy(self, filename):
+        """ Store the input file sorted by its policy number. """
+        path = os.path.join(self._config['root.dir'], filename)
+        parentdir = os.path.dirname(path)
+        if os.path.isdir(path):
+            parentdir = path
+        value = self.get_dir_policy(parentdir)
+        if not value in self._policies:
+            self._policies[value] = codecs.open( os.path.join(self._config['temp.build.dir'], self._config['name'] + "_%s" % value + ".txt"), "w+", "utf-8" )
+        self._policies[value].write(u"%s\n" % filename)
+
+
+class PolicyRemoverMapper(PolicyMapper):
+    """ This class implements a variant of the policy mapper.
+        
+    It removes the internal source. Only binary flagged content is kept.
+    """
+    
+    def __init__(self, config, archiver):
+        """ Initialization. """
+        PolicyMapper.__init__(self, config, archiver)
+        self._rm_policy_cache = {}
+
+    def get_policy_root_dir(self):
+        """ Return the policy.root.dir or root.dir if not set or not under root.dir."""
+        if not self._config.has_key("policy.root.dir"):
+            return os.path.normpath(self._config['root.dir'])
+        else:
+            if fileutils.destinsrc(self._config['root.dir'], self._config['policy.root.dir']):
+                return os.path.normpath(self._config['policy.root.dir'])
+            else:
+                return os.path.normpath(self._config['root.dir'])
+
+    def get_rmdir_policy(self, dirname):
+        """ check if the directory should be dropped or not"""
+        dirname = os.path.normpath(dirname)
+        # check if parent is banned...
+        prootdir = os.path.normpath(self.get_policy_root_dir())
+        rootdir = os.path.normpath(self._config['root.dir'])
+        if os.sep == '\\':
+            dirname = dirname.lower()
+            prootdir = prootdir.lower()
+            rootdir = rootdir.lower()        
+        
+        # else get real value...
+        if not self._rm_policy_cache.has_key(dirname):
+            self._rm_policy_cache[dirname] = self.get_dir_policy(dirname)
+        
+        return self._rm_policy_cache[dirname]
+        
+    def create_commands(self, manifest):
+        """ Generates a list of build commands. """
+        stages = PolicyMapper.create_commands(self, manifest)
+        
+        if not self._config.has_key('policy.csv'):
+            _logger.error("POLICY_ERROR: Property 'policy.csv' not defined everything will get removed.")
+        cmds = []
+        file_handle = codecs.open( manifest, "r", "utf-8" )
+        for line in file_handle.readlines():
+            line = line.rstrip()
+            filepath = os.path.normpath(os.path.join(self._config.get('zip.root.dir', self._config['root.dir']), line))
+            value = self.get_rmdir_policy(os.path.dirname(filepath))            
+            delete = True
+            if value in self._binary.keys():
+                if self._binary[value] == "yes":
+                    _logger.info("POLICY_INFO: Keeping %s (%s=>yes)!" % (filepath, value))
+                    delete = False
+                elif self._binary[value] == "bin":
+                    _logger.info("POLICY_INFO: Keeping %s (%s=>bin)!" % (filepath, value))
+                    delete = False
+            else:
+                _logger.error("POLICY_ERROR: %s value for %s not in csv file. Will be removed!!" % (value, filepath))
+               
+            if delete:
+                _logger.info("POLICY_INFO: File %s will be removed!" % filepath)
+                cmds.append(buildtools.Delete(filename=filepath))
+        file_handle.close()
+        if len(cmds) > 0:
+            stages.append(cmds)
+        return stages
+
+
+class SFPolicyRemoverMapper(PolicyRemoverMapper):
+    """ Implement an SFL column based policy remover. """
+
+    def __init__(self, config, archiver):
+        """ Initialization. """
+        PolicyRemoverMapper.__init__(self, config, archiver)
+
+    def load_policy_binary(self, csvfile):
+        """ Loading the policy using the 3rd column. """
+        _logger.info("POLICY_INFO: Loading actions from the 3rd column")
+        PolicyRemoverMapper.load_policy_binary(self, csvfile, column=3)
+
+class EPLPolicyRemoverMapper(PolicyRemoverMapper):
+    """ Implement an EPL column based policy remover. """
+    def __init__(self, config, archiver):
+        """ Initialization. """
+        PolicyRemoverMapper.__init__(self, config, archiver)
+
+    def load_policy_binary(self, csvfile):
+        """ Loading the policy using the 4th column. """
+        _logger.info("POLICY_INFO: Loading actions from the 4th column")
+        PolicyRemoverMapper.load_policy_binary(self, csvfile, column=4)
+        
+        
+MAPPERS = {'default': DefaultMapper,
+             'policy': PolicyMapper,
+             'policy.remover': PolicyRemoverMapper,
+             'sfl.policy.remover': SFPolicyRemoverMapper,
+             'epl.policy.remover': EPLPolicyRemoverMapper,}
+
+def get_mapper(name, config, archiver):
+    """ Get mapper instance from its string id. """
+    if name in MAPPERS:
+        return MAPPERS[name](config, archiver)
+    raise Exception("ERROR: Could not find mapper '%s'." % name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/scanners.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,196 @@
+#============================================================================ 
+#Name        : scanners.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Implementation of the available scanner for """
+
+import os
+import fileutils
+import selectors
+import logging
+import codecs
+import pathaddition
+
+logger = logging.getLogger('archive.scanners')
+logger_abld = logging.getLogger('archive.scanners.abld')
+logging.basicConfig()
+#logger_abld.setLevel(logging.DEBUG)
+
+class Scanner(fileutils.AbstractScanner):
+    """ Abstract class that represent and input source. """
+    
+    def __init__(self, config):
+        fileutils.AbstractScanner.__init__(self)
+        self._config = config
+        self.setup()
+        
+    def setup(self):
+        """ Setting up the scanner. """
+        [self.add_include(inc) for inc in self._config.get_list('include', [])]
+        [self.add_exclude(ex) for ex in self._config.get_list('exclude', [])]
+        [self.add_exclude_file(ex) for ex in self._config.get_list('exclude_file', [])]
+        [self.add_exclude_lst(filename) for filename in self._config.get_list('exclude.lst', [])]
+        [self.add_filetype(filetype) for filetype in self._config.get_list('filetype', [])]
+        [self.add_selector(selectors.get_selector(selector, self._config)) for selector in self._config.get_list('selector', [])]        
+        # To support old features.
+        # TODO: inform customers and remove.
+        if 'distribution.policy.s60' in self._config:            
+            self.add_selector(selectors.get_selector('distribution.policy.s60', self._config))
+    
+    def add_exclude_lst(self, filename):
+        """ Adding excludes from exclude list. """
+        if not os.path.exists(filename):
+            raise Exception("Could not find '%s'." % filename)
+        root_dir = os.path.normpath(self._config['root.dir'])
+        flh = codecs.open(filename, 'r', 'utf-8')
+        for line in flh:
+            path = os.path.normpath(line.strip())
+            if os.path.splitdrive(root_dir)[0] != "":
+                path = os.path.join(os.path.splitdrive(root_dir)[0], path)
+            if fileutils.destinsrc(root_dir, path):
+                pathrel = pathaddition.relative.abs2rel(path, root_dir)
+                logger.debug("pathrel: %s" % (pathrel))
+                self.add_exclude(pathrel)
+            else:
+                logger.warning("path '%s' is not under '%s', ignoring." % (path, root_dir))
+        flh.close()
+        
+    def scan(self):
+        """ Generator method that scan the relevant input source.
+            This method need to be overloaded by the specialized class.
+            return fullpath name
+        """
+        raise  NotImplementedError()
+
+
+class AbldWhatScanner(Scanner):
+    """ Scanning the filesystem. """    
+    
+    def __init__(self, config):
+        Scanner.__init__(self, config)
+        self.root_dir = unicode(os.path.normpath(self._config['root.dir']))
+        
+    def scan(self):
+        """
+            Abld what commands.
+            include property have not effect on the selection mechanism.
+        """
+        os.environ["SYMBIANBUILD_DEPENDENCYOFF"] = "1"
+        for path in self._config.get_list('abld.exportpath', []):
+            logger_abld.debug("abld.exportpath: %s" % path)
+            if os.path.exists(os.path.join(self.root_dir, path, 'bld.inf')):
+                os.chdir(os.path.join(self.root_dir, path))                
+                os.popen('bldmake bldfiles -k')
+                for result in self._scan_abld_what("abld export -what -k"):
+                    yield result
+        
+        for path in self._config.get_list('abld.buildpath', []):
+            logger_abld.debug("abld.buildpath: %s" % path)
+            if os.path.exists(os.path.join(self.root_dir, path, 'bld.inf')):
+                for type_ in self._config.get_list('abld.type', ['armv5']):
+                    os.environ["EPOCROOT"] = self._config.get('abld.epocroot','\\')
+                    os.environ["PATH"] = os.environ["EPOCROOT"] + "epoc32\\tools;" + os.environ["EPOCROOT"] + "epoc32\\gcc\\bin;" + os.environ["PATH"]
+                    logger_abld.debug("abld.type: %s" % type_)
+                    os.chdir(os.path.join(self.root_dir, path))
+                    os.popen("bldmake bldfiles -k")
+                    os.popen("abld makefile %s -k" % type_)
+                    for result in self._scan_abld_what("abld build -what %s" % type_):
+                        yield result
+    
+    def _run_cmd(self, cmd):
+        """ Run command."""
+        logger_abld.debug("command: %s" % cmd)
+        process = os.popen(cmd)
+        abld_output = process.read()
+        err = process.close()
+        return (err, abld_output)
+
+    def _scan_abld_what(self, cmd):
+        """ Abld what output parser."""
+        (err, abld_output) = self._run_cmd(cmd)
+        logger_abld.debug("abld_output: %s" % abld_output)
+        for what_path in abld_output.split("\n"):
+            what_path = what_path.strip()
+            if (what_path.startswith('\\') or what_path.startswith('/')) and self.is_filetype(what_path) \
+                and not self.is_excluded(what_path) and self.is_selected(what_path):
+                if os.path.exists(what_path):
+                    logger_abld.debug("adding: %s" % what_path)
+                    yield what_path
+                else:
+                    logger.error("Could not find '%s'." % what_path)
+    
+    
+class FileSystemScanner(fileutils.FileScanner, Scanner):
+    """ Scanning the filesystem. """    
+    
+    def __init__(self, config):
+        fileutils.FileScanner.__init__(self, unicode(os.path.normpath(config['root.dir'])))
+        Scanner.__init__(self, config)
+    
+    def scan(self):
+        """ 
+            Implement the scanning of the filesystem.
+            Actually delegate scanning of a directory to Filescanner.
+        """
+        for path in fileutils.FileScanner.scan(self):
+            yield path
+
+
+class InputFileScanner(fileutils.FileScanner, Scanner):
+    """ Scanning the filesystem. """    
+    
+    def __init__(self, config):
+        """ Initialisation. """
+        fileutils.FileScanner.__init__(self, unicode(os.path.normpath(config['root.dir'])))
+        Scanner.__init__(self, config)
+    
+    def scan(self):
+        """
+        ::
+        
+            <set name="scanners" value="input.file"/>
+            <set name="root.dir" value="${build.drive}"/>
+            <set name="input.files" value="file1.lst,file2.lst,file3.lst"/>
+            <set name="exclude" value="epoc32/**/*.dll"/>
+        """
+        for input_file in self._config.get_list('input.files', []):
+            logger.info("Include content from: %s" % input_file)
+            handle = open(input_file, "r")
+            for line in handle.readlines():
+                path = os.path.join(self._config['root.dir'], line.strip())
+                if os.path.exists(path):
+                    if self.is_filetype(path) \
+                        and not self.is_excluded(path) and self.is_selected(path):
+                        yield path
+                else:
+                    logger.info("File not found: %s" % path)
+            handle.close()
+        
+__scanners = {'default': FileSystemScanner,
+              'input.file': InputFileScanner,
+              'abld.what': AbldWhatScanner,
+              }
+
+def get_scanners(names, config):
+    result = []
+    for name in names:
+        if name in __scanners:
+            result.append(__scanners[name](config))
+        else:
+            raise Exception("ERROR: Could not find scanner '%s'." % name)
+    return result
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/selectors.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,153 @@
+#============================================================================ 
+#Name        : selectors.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import re
+import os
+import sys
+import logging
+import fileutils
+import archive
+
+# Getting logger for the module
+logger = logging.getLogger("archive.selectors")
+
+
+class DistributionPolicySelector:
+    """ A selector that selects files based on other criteria.
+    
+    It is similar to the Ant file selector objects in design. This one selects files
+    based on whether the root-most Distribution.Policy.S60 file matches the given value.
+    """
+    
+    def __init__(self, policy_files, value, ignoremissingpolicyfiles=False):
+        """ Initialization. """
+        self._negate = False
+        self.values = [v.strip() for v in value.split() if v.strip()!=""]
+        self._policy_files = policy_files
+        self._ignoremissingpolicyfiles = ignoremissingpolicyfiles
+
+    def get_value_and_negate(self, value):
+        if value.startswith('!'):
+            return (value[1:], True)
+        return (value, False)
+        
+    def is_selected(self, path):
+        """ Determines if the path is selected by this selector. """
+        current_dir = os.path.abspath(os.path.dirname(path))
+        logger.debug('is_selected: current dir = ' + current_dir + '  ' + str(os.path.exists(current_dir)))
+        result = False
+        policy_file = None
+        # finding the distribution policy from the filelist.
+        for filename in self._policy_files:
+            #slow method on case sensitive system
+            if os.sep != '\\':
+                for f in os.listdir(current_dir):
+                    if f.lower() == filename.lower():
+                        policy_file = os.path.join(current_dir, f)
+                        break
+            elif os.path.exists(os.path.join(current_dir, filename)):            
+                policy_file = os.path.join(current_dir, filename)
+                logger.debug('Using Policy file: ' + policy_file)
+                break
+
+        policy_value = None
+        if policy_file is None:
+            if not self._ignoremissingpolicyfiles:
+                logger.error("POLICY_ERROR: Policy file not found under '%s' using names [%s]" % (current_dir, ", ".join(self._policy_files)))
+            policy_value = archive.mappers.MISSING_POLICY
+        else:
+            try:
+                policy_value = fileutils.read_policy_content(policy_file)
+            except Exception:
+                logger.warning('POLICY_ERROR: Exception thrown parsing policy file: ' + policy_file)
+                policy_value = archive.mappers.MISSING_POLICY
+        # loop through the possible values
+        for value in self.values:
+            (val, negate) = self.get_value_and_negate(value)
+            logger.debug('Policy value: ' + str(policy_value) + '  ' + val)
+            if (not negate and policy_value == val) or (negate and policy_value != val):
+                return True
+        return False
+
+
+class SymbianPolicySelector:
+    """ A selector that selects files based on other criteria.
+    
+    It is similar to the Ant file selector objects in design. This one selects files
+    based on whether the root-most distribution.policy file matches the given value.
+    """
+    
+    def __init__(self, policy_files, value):
+        """ Initialization. """
+        self._negate = False
+        self.values = [v.strip() for v in value.split() if v.strip()!=""]
+        self._policy_files = policy_files
+               
+
+    def get_value_and_negate(self, value):
+        if value.startswith('!'):
+            return (value[1:], True)
+        return (value, False)
+        
+    def is_selected(self, path):
+        """ Determines if the path is selected by this selector. """
+        current_dir = os.path.abspath(os.path.dirname(path))
+        logger.debug('is_selected: current dir = ' + current_dir + '  ' + str(os.path.exists(current_dir)))
+        result = False
+        policy_file = None
+        # finding the distribution policy from the filelist.
+        for filename in self._policy_files:
+            if os.sep != '\\':
+                for f in os.listdir(current_dir):
+                    if f.lower() == filename.lower():
+                        policy_file = os.path.join(current_dir, f)
+                        logger.debug('Using Policy file: ' + policy_file)
+                        break
+            elif os.path.exists(os.path.join(current_dir, filename)):            
+                policy_file = os.path.join(current_dir, filename)
+                logger.debug('Using Policy file: ' + policy_file)
+                break
+
+        policy_value = None
+        if policy_file is  None:
+            logger.error("POLICY_ERROR: Policy file not found under '%s' using names [%s]" % (current_dir, ", ".join(self._policy_files)))
+            policy_value = archive.mappers.MISSING_POLICY
+        else:
+            try:
+                policy_value = fileutils.read_symbian_policy_content(policy_file)
+            except Exception:
+                logger.warning('POLICY_ERROR: Exception thrown parsing policy file: ' + policy_file)
+                policy_value = archive.mappers.MISSING_POLICY
+        # loop through the possible values
+        for value in self.values:
+            (val, negate) = self.get_value_and_negate(value)
+            logger.debug('Policy value: ' + str(policy_value) + '  ' + val)
+            if (not negate and policy_value == val) or (negate and policy_value != val):
+                return True
+        return False
+
+SELECTORS = {'policy': lambda config: DistributionPolicySelector(config.get_list('policy.filenames', ['Distribution.Policy.S60']), config['policy.value']),
+               'symbian.policy': lambda config: SymbianPolicySelector(config.get_list('policy.filenames', ['distribution.policy']), config['policy.value']),
+             'distribution.policy.s60': lambda config: DistributionPolicySelector(['Distribution.Policy.S60'], config['distribution.policy.s60'], config['ignore.missing.policyfiles'] == 'true'),
+             }
+
+def get_selector(name, config):
+    if not 'ignore.missing.policyfiles' in config:
+        config['ignore.missing.policyfiles'] = 'false'
+    return SELECTORS[name](config)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/tools.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+#============================================================================ 
+#Name        : tools.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Archiving operations. """
+import os
+import logging
+import buildtools
+import codecs
+
+_logger = logging.getLogger('archive')
+#_logger.addHandler(logging.FileHandler('archive.log'))
+#logging.basicConfig(level=logging.DEBUG)
+logging.basicConfig()
+
+class Tool(object):
+    """ Tool abstract class. """
+    def extension(self):
+        """ This method should return the extension of the generated file. """
+        raise NotImplementedError()
+
+    def create_command(self, path, filename, manifests=None):
+        """ This method should return an array of buildtools.Command.
+            That list will get use to generate a build file (e.g make, ant).
+            The list of command should support in parallel calling.
+        """
+        raise NotImplementedError()
+
+
+class SevenZipArchiver(Tool):
+    """ Creates task definitions for executing 7zip archive operations."""
+
+    def __init__(self):
+        Tool.__init__(self)
+
+    def extension(self):
+        """ Always return '.zip'. """
+        return '.zip'
+
+    def create_command(self, path, name, manifests=None):
+        """ Returns a list of one command that will use 7za to archive the content."""
+        cmd = buildtools.Command('7za', path)
+        cmd.addArg('a')
+        cmd.addArg('-tzip')
+        # Include all in the current directory by default, assuming that
+        # an include file or specific includes will be given
+        cmd.addArg(name + self.extension())
+        for manifest in manifests:
+            cmd.addArg('@' + os.path.normpath(manifest))
+        return [cmd]
+
+
+class ZipArchiver(Tool):
+    """ Creates task definitions for executing zip archive operations."""
+
+    def __init__(self):
+        Tool.__init__(self)
+
+    def extension(self):
+        """ Always return '.zip'. """
+        return '.zip'
+
+    def create_command(self, path, name, manifests=None):
+        """ Returns a list of one command that will use zip to archive the content."""
+        cmd = buildtools.Command('zip', path)
+        cmd.addArg('-R')
+        cmd.addArg(name + self.extension())
+        # Include all in the current directory by default, assuming that
+        # an include file or specific includes will be given
+        cmd.addArg('.')
+        for manifest in manifests:
+            cmd.addArg('-i@' + os.path.normpath(manifest))
+        return [cmd]
+
+
+class Remover(Tool):
+    """ Creates task definitions for executing zip archive operations."""
+    def __init__(self):
+        Tool.__init__(self)
+
+    def extension(self):
+        """ Always return '' """
+        return ''
+
+    def create_command(self, dummy_path, dummy_filename, manifests=None):
+        """ Returns a list of one command that will use zip to archive the content."""
+        cmds = []
+        for manifest in manifests:
+            file_input = codecs.open(manifest, 'r', "utf-8" )
+            for line in file_input.readlines():
+                if line.strip() != "":
+                    cmds.append(buildtools.Delete(filename=line.strip()))
+            file_input.close()
+        return cmds
+        
+
+def get_tool(name):
+    """ Return a tool using its id name. """
+    constructor = TOOL_CONSTRUCTORS[name]
+    return constructor()
+
+
+TOOL_CONSTRUCTORS = {'zip': ZipArchiver,
+                      '7za': SevenZipArchiver,
+                      'remover': Remover}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,448 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""ATS3 test drop generation."""
+
+#w0142 => * and ** were used
+#R*    => will be fixed while refactoring
+#F0401 => pylint didn't find "path" module
+#C0302 => Too many lines
+
+from optparse import OptionParser
+from xml.etree import ElementTree as et
+from xml.sax.saxutils import quoteattr
+import ats3.testconfigurator as acp
+import ats3.dropgenerator as adg
+import logging
+import os
+import re
+import zipfile
+
+import ats3.parsers as parser
+from path import path
+
+_logger = logging.getLogger('ats')
+
+
+
+class Configuration(object):
+    """
+    ATS3 drop generation configuration.
+    """
+    
+    def __init__(self, opts, tsrc_paths):
+        """
+        Initialize from optparse configuration options.
+        """
+        self._opts = opts
+        CParser = parser.CppParser()
+        temp_dict = {}
+        pkg_parser = parser.PkgFileParser()
+        
+        # Customize some attributes from how optparse leaves them.
+        self.build_drive = path(self._opts.build_drive)
+        self.file_store = path(self._opts.file_store)
+        self.flash_images = split_paths(self._opts.flash_images)
+        self.sis_files = split_paths(self._opts.sis_files)
+        self.config_file = self._opts.config
+        self.obey_pkgfiles = to_bool(self._opts.obey_pkgfiles)
+        self.tsrc_paths_dict = {}
+
+        ats_nd = self._opts.ats_network_drive.strip()
+        if ats_nd != "":
+            ats_nd = ats_nd.split("#")[0].strip()
+            if ats_nd == "":
+                self._opts.ats_network_drive = ""
+                _logger.warning("Property \'ats.atsnetwork.drive\' is not set. Code coverage measurement report(s) will not be created.")
+                
+        main_comps = []
+                
+        for tsrc in tsrc_paths:
+            hrh = os.path.join(self.build_drive + os.sep, 'epoc32', 'include', 'feature_settings.hrh')
+            if os.path.exists(hrh):
+                temp_dict = CParser.get_cpp_output(path(tsrc), "d", hrh)
+            else:
+                temp_dict = CParser.get_cpp_output(path(tsrc), "d")
+            for t_key, t_value in temp_dict.items():
+                self.tsrc_paths_dict[t_key] = t_value
+        
+        #preparing a list of main components
+        for main_component in self.tsrc_paths_dict.keys():
+            if self.obey_pkgfiles == "True":
+                if pkg_parser.get_pkg_files(main_component) != []:
+                    main_comps.append(main_component)
+            else:
+                main_comps.append(main_component)    
+                    
+                    
+        self.tsrc_paths = main_comps
+
+    def __getattr__(self, attr):
+        return getattr(self._opts, attr)
+    
+    def __str__(self):
+        dump = "Configuration:\n"
+        seen = set()
+        for key, value in vars(self).items():
+            if not key.startswith("_"):
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)
+        for key, value in vars(self._opts).items():
+            if key not in seen:
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)                
+        return dump
+    
+
+class Ats3TestPlan(object):
+    """
+    Tells ATS3 server what to test and how.
+    
+    The ATS3 test plan from which the test.xml file can be written. The test
+    plan captures all the data related to a test run: flashing, installation
+    of data files and configuration files, test cases, and the notifications.
+    
+    """
+
+    EMAIL_SUBJECT = (u"ATS3 report for §RUN_NAME§ §RUN_START_DATE§ "
+                     u"§RUN_START_TIME§")
+    REPORT_PATH = u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§"
+
+    def __init__(self, config):
+        self.diamonds_build_url = config.diamonds_build_url
+        self.ats_network_drive = config.ats_network_drive
+        self.testrun_name = config.testrun_name
+        self.harness = config.harness
+        self.device_type = config.device_type
+        self.device_hwid = config.device_hwid
+        self.plan_name = config.plan_name
+        self.report_email = config.report_email
+        self.file_store = config.file_store
+        self.test_timeout = config.test_timeout
+        self.eunitexerunner_flags = config.eunitexerunner_flags
+        self.sets = []
+        self.src_dst = []
+        self.pmd_files = []
+        self.trace_activation_files = []
+        self.trace_enabled = to_bool(config.trace_enabled)
+        self.ctc_enabled = to_bool(config.ctc_enabled)
+        self.multiset_enabled = to_bool(config.multiset_enabled)
+        self.monsym_files = config.monsym_files
+        self.component_path = ""
+        self.custom_dir = None
+        
+    def insert_set(self, data_files=None, config_files=None, 
+                   engine_ini_file=None,  image_files=None, sis_files=None,
+                   testmodule_files=None, test_timeout=None,eunitexerunner_flags=None , test_harness=None,
+                   src_dst=None, pmd_files=None, trace_activation_files=None, custom_dir=None, component_path=None):
+        """
+        Insert a test set into the test plan.
+        """
+        
+        if not custom_dir is None:
+            self.custom_dir = custom_dir
+        if data_files is None:
+            data_files = []
+        if config_files is None:
+            config_files = []
+        if image_files is None:
+            image_files = []
+        if sis_files is None:
+            sis_files = []
+        if testmodule_files is None:
+            testmodule_files = []
+        if test_timeout is None:
+            test_timeout = []
+        if eunitexerunner_flags is None:
+            eunitexeruner_flags = []
+        if test_harness is None:
+            test_harness = self.harness
+        if src_dst is None:
+            src_dst = []
+        if pmd_files is None:
+            pmd_files = []
+        if trace_activation_files is None:
+            trace_activation_files = []
+        if component_path is None:
+            component_path = self.component_path
+            
+        setd = dict(name="set%d" % len(self.sets),
+                    image_files=image_files, engine_ini_file=engine_ini_file, ctc_enabled=self.ctc_enabled, component_path=component_path)
+        
+        setd = dict(setd, custom_dir=custom_dir)
+        if sis_files:
+            setd = dict(setd, sis_files=sis_files, test_timeout=test_timeout, eunitexerunner_flags=eunitexerunner_flags, test_harness=test_harness, )
+        else:
+            setd = dict(setd, data_files=data_files, config_files=config_files,
+                        testmodule_files=testmodule_files, test_timeout=test_timeout, eunitexerunner_flags=eunitexerunner_flags, test_harness=test_harness,
+                        src_dst=src_dst)
+        if self.trace_enabled != "":
+            if self.trace_enabled.lower() == "true":
+                setd = dict(setd, pmd_files=pmd_files, 
+                            trace_path=self.file_store.joinpath(self.REPORT_PATH, "traces", setd["name"], "tracelog.blx"),
+                            trace_activation_files=trace_activation_files)
+            else:
+                setd = dict(setd, pmd_files=[], 
+                            trace_path="",trace_activation_files=[])
+        self.sets.append(setd)
+
+    def set_plan_harness(self):
+        """setting up test harness for a plan"""
+        eunit = False
+        stif = False
+        stifunit = False
+        for setd in self.sets:
+            if setd["test_harness"] == "STIF":
+                stif = True
+            elif setd["test_harness"] == "EUNIT":
+                eunit = True
+            elif setd["test_harness"] == "STIFUNIT":
+                stifunit = True
+                
+        if eunit and stif:
+            self.harness = "MULTI_HARNESS"
+        elif eunit:
+            self.harness = "EUNIT"
+        elif stif:
+            self.harness = "STIF"
+        elif stifunit:
+            self.harness = "STIFUNIT"
+        else:
+            self.harness = "GENERIC"
+
+    @property
+    def post_actions(self):
+        """ATS3 post actions."""
+        actions = []
+        temp_var = ""
+        report_path = self.file_store.joinpath(self.REPORT_PATH)
+        
+        if self.ctc_enabled and adg.CTC_PATHS_LIST != [] and self.monsym_files != "":
+            ctc_params = "--ctcdata_files="
+            for cdl in adg.CTC_PATHS_LIST:
+                ctc_params += cdl + ";"
+                temp_var = cdl
+            
+            network_path = r"\\" + self.ats_network_drive.rsplit("#", 1)[0]
+            temp_var = temp_var.split("ctc_helium"+os.sep)[1]
+            diamonds_id = temp_var.split(os.sep)[0]
+            drop_id = temp_var.split(os.sep)[1].split(os.sep)[0]
+            output_path = os.path.join(network_path, "ctc_helium_http_root", diamonds_id, drop_id)
+            ctc_params += r" --output_dir_html=" + output_path  
+            ctc_params += r" --monsym_files=" + self.monsym_files
+            ctc_params += r" --diamonds_build_id=" + diamonds_id
+            
+            #ctc_params += r" --monsym_files=\\10.11.3.2\ctc_helium\<diamonds>\mon_syms\<number>\mon.sym"  
+            
+            runprocess_action = ("RunProcessAction", 
+                            (("file", r"c:/apps/catsctc2html/catsctc2html.exe"),
+                             ("dir", r"c:/apps/catsctc2html/"),
+                             ("parameters", ctc_params)))
+            
+            #"&lt;a href=&quot;http://" + self.ats_network_drive.rsplit("#", 1)[0] + "/" + diamonds_id + "/" + drop_id + "/index.html&quot;&gt;CTC Coverage Reports&lt;/a&gt;"
+            email_url = " CTC report can be found from: http://" + self.ats_network_drive.rsplit("#", 1)[0] + "/" + diamonds_id + "/" + drop_id + "/index.html"
+            
+
+            email_action = ("SendEmailAction", 
+                            (("subject", self.EMAIL_SUBJECT),
+                             ("type", "ATS3_REPORT"),
+                             ("send-files", "true"),
+                             ("additional-description", email_url),
+                             ("to", self.report_email)))
+        else:
+            email_action = ("SendEmailAction", 
+                            (("subject", self.EMAIL_SUBJECT),
+                             ("type", "ATS3_REPORT"),
+                             ("send-files", "true"),
+                             ("to", self.report_email)))
+        ats3_report = ("FileStoreAction", 
+                       (("to-folder", report_path.joinpath("ATS3_REPORT")),
+                        ("report-type", "ATS3_REPORT"),
+                        ("date-format", "yyyyMMdd"),
+                        ("time-format", "HHmmss")))
+        stif_report = ("FileStoreAction", 
+                       (("to-folder", report_path.joinpath("STIF_REPORT")),
+                        ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+                        ("run-log", "true"),
+                        ("date-format", "yyyyMMdd"),
+                        ("time-format", "HHmmss")))
+        eunit_report = ("FileStoreAction", 
+                       (("to-folder", report_path.joinpath("EUNIT_REPORT")),
+                        ("report-type", "EUNIT_COMPONENT_REPORT_ALL_CASES"),
+                        ("run-log", "true"),
+                        ("date-format", "yyyyMMdd"),
+                        ("time-format", "HHmmss")))
+        diamonds_action = ("DiamondsAction", ())
+
+        
+        if self.ctc_enabled == "True" and adg.CTC_PATHS_LIST != [] and self.monsym_files != "":
+            actions.append(runprocess_action)
+            
+        if self.diamonds_build_url:
+            actions.append(diamonds_action)
+        if self.file_store:
+            actions.append(ats3_report)
+            if self.harness == "STIF":
+                actions.append(stif_report)
+            elif self.harness == "EUNIT":
+                actions.append(eunit_report)
+        if self.report_email:
+            actions.append(email_action)
+        return actions               
+
+    def __getitem__(self, key):
+        return self.__dict__[key]
+
+def encode_for_xml(unicode_data, encoding='ascii'):
+    """
+    Encode unicode_data for use as XML or HTML, with characters outside
+    of the encoding converted to XML numeric character references.
+    """
+    try:
+        return unicode_data.encode(encoding, 'xmlcharrefreplace')
+    except ValueError:
+        # ValueError is raised if there are unencodable chars in the
+        # data and the 'xmlcharrefreplace' error handler is not found.
+        # Pre-2.3 Python doesn't support the 'xmlcharrefreplace' error
+        # handler, so we'll emulate it.
+        return _xmlcharref_encode(unicode_data, encoding)
+
+def _xmlcharref_encode(unicode_data, encoding):
+    """Emulate Python 2.3's 'xmlcharrefreplace' encoding error handler."""
+    chars = []
+    # Step through the unicode_data string one character at a time in
+    # order to catch unencodable characters:
+    for char in unicode_data:
+        try:
+            chars.append(char.encode(encoding, 'strict'))
+        except UnicodeError:
+            chars.append('&#%i;' % ord(char))
+    return ''.join(chars)
+
+
+def create_drop(config):
+    """Create a test drop."""
+    _logger.debug("initialize test plan")
+        
+    test_plan = Ats3TestPlan(config)
+    parser = acp.Ats3ComponentParser(config)
+    
+    for tsrc in config.tsrc_paths:
+        lst_check_harness = []
+        _logger.info("inspecting tsrc path: %s" % tsrc)
+        #checking if there are components without harness
+        for sub_component in config.tsrc_paths_dict[tsrc]['content'].keys():
+            _harness_ = config.tsrc_paths_dict[tsrc]['content'][sub_component]['harness']
+            if _harness_ != "":
+                lst_check_harness.append(_harness_)
+
+        #if component has harness then insert to test set 
+        if len(lst_check_harness) > 0:
+            parser.insert_test_set(test_plan, path(tsrc), config.tsrc_paths_dict)
+
+    test_plan.set_plan_harness()
+
+    generator = adg.Ats3TestDropGenerator()
+    _logger.info("generating drop file: %s" % config.drop_file)
+    generator.generate(test_plan, output_file=config.drop_file, config_file=config.config_file)
+
+def split_paths(arg, delim=","):
+    """
+    Split the string by delim, removing extra whitespace.
+    """
+    return [path(part.strip()) 
+            for part in arg.split(delim) if part.strip()]
+
+def to_bool(param):
+    param = str(param).lower()
+    if "true" == param or "t" == param or "1" == param:
+        return "True"
+    else:
+        return "False"
+
+def main():
+    """Main entry point."""
+    cli = OptionParser(usage="%prog [options] TSRC1 [TSRC2 [TSRC3 ...]]")
+    cli.add_option("--build-drive", help="Build area root drive")
+    cli.add_option("--data-dir", help="Data directory name", action="append", 
+                   default=[])
+    cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", 
+                   default="unknown")
+    cli.add_option("--device-hwid", help="Device hwid", 
+                   default="")
+    cli.add_option("--trace-enabled", help="Tracing enabled", default="False")
+    cli.add_option("--ctc-enabled", help="CTC enabled", default="False")
+    cli.add_option("--multiset-enabled", help="Multiset enabled", default="False")
+    cli.add_option("--diamonds-build-url", help="Diamonds build url")
+    cli.add_option("--ats-network-drive", help="ATS Network drive where MON.sym files are stored")
+    cli.add_option("--drop-file", help="Name for the final drop zip file",
+                   default="ATS3Drop.zip")
+    cli.add_option("--file-store", help="Destination path for reports.",
+                   default="")
+    cli.add_option("--flash-images", help="Paths to the flash image files",
+                   default="")     
+    cli.add_option("--minimum-flash-images", help="Minimum amount of flash images",
+                   default=2)    
+    cli.add_option("--harness", help="Test harness (default: %default)",
+                   default="")
+    cli.add_option("--report-email", help="Email notification receivers", 
+                   default="")
+    cli.add_option("--plan-name", help="Name of the test plan", 
+                   default="plan")
+    cli.add_option("--sis-files", help="Paths to the sis files",
+                   default="")
+    cli.add_option("--monsym-files", help="Paths to MON.sym files, for ctc useage",
+                   default="")
+    cli.add_option("--target-platform", help="Target platform (default: %default)",
+                   default="armv5 urel")
+    cli.add_option("--test-timeout", help="Test execution timeout value (default: %default)",
+                   default="60")
+    cli.add_option("--eunitexerunner-flags", help="Eunitexerunner flags",
+                   default="")
+    cli.add_option("--testrun-name", help="Name of the test run", 
+                   default="run")
+    cli.add_option("--config", help="Path to the config file",
+                   default="")
+    cli.add_option("--obey-pkgfiles", help="If this option is True, then only test components having PKG file are executable and if the compnents don't have PKG files they will be ignored.", default="False")
+    cli.add_option("--verbose", help="Increase output verbosity", 
+                   action="store_true", default=False)
+    
+    opts, tsrc_paths = cli.parse_args()
+
+    if not tsrc_paths:
+        cli.error("no tsrc directories given")
+    if not opts.flash_images:
+        cli.error("no flash image files given")
+    if not opts.build_drive:
+        cli.error("no build drive given")      
+    if len(opts.flash_images.split(",")) < int(opts.minimum_flash_images):
+        cli.error("Not enough flash files: %i defined, %i needed" % (len(opts.flash_images.split(",")), int(opts.minimum_flash_images) ))
+
+    if opts.verbose:
+        _logger.setLevel(logging.DEBUG)
+        logging.basicConfig(level=logging.DEBUG)
+    
+    config = Configuration(opts, tsrc_paths)
+    create_drop(config)
+
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/aste.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,426 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : aste.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""ASTE test drop generation."""
+
+from optparse import OptionParser
+from textwrap import dedent
+from xml.etree import ElementTree as et
+from xml.sax.saxutils import quoteattr
+import logging
+import os
+import re
+import sys
+import tempfile
+import zipfile
+
+from path import path
+import amara
+
+_logger = logging.getLogger('ats3')
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+TEMP_PATH = None
+
+class Configuration(object):
+    """
+    ASTE drop generation configuration.
+    """
+    
+    def __init__(self, opts):
+        """
+        Initialize from optparse configuration options.
+        """
+        self._opts = opts
+        # Customize some attributes from how optparse leaves them.
+        self.build_drive = path(self._opts.build_drive)
+        self.file_store = path(self._opts.file_store)
+        self.flash_images = self.split_paths(self._opts.flash_images)
+    
+    def split_paths(self, arg, delim=","):
+        """
+        Split the string by delim, removing extra whitespace.
+        """
+        return [path(part.strip()) 
+                for part in arg.split(delim) if part.strip()]
+    
+    def __getattr__(self, attr):
+        return getattr(self._opts, attr)
+    
+    def __str__(self):
+        dump = "Configuration:\n"
+        seen = set()
+        for key, value in vars(self).items():
+            if not key.startswith("_"):
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)
+        for key, value in vars(self._opts).items():
+            if key not in seen:
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)                
+        return dump
+    
+
+class AsteTestPlan(object):
+    """
+    Tells ASTE server what to test and how.
+    
+    The ASTE test plan from which the test.xml file can be written. The test
+    plan requires TestAsset(s) to perform the tests
+    """
+
+    EMAIL_SUBJECT = (u"ATS3 report for §RUN_NAME§ §RUN_START_DATE§ "
+                     u"§RUN_START_TIME§")
+    REPORT_PATH = u"§RUN_NAME§\§RUN_START_DATE§_§RUN_START_TIME§"
+
+    def __init__(self, config):
+        self.diamonds_build_url = config.diamonds_build_url
+        self.testrun_name = config.testrun_name
+        self.harness = "ASTE"
+        self.device_type = config.device_type
+        self.test_type = config.test_type
+        self.device_hwid = config.device_hwid
+        self.plan_name = config.plan_name
+        self.report_email = config.report_email
+        self.file_store = config.file_store
+        self.test_timeout = config.test_timeout
+        self.testasset_location = config.testasset_location
+        self.testasset_caseids = config.testasset_caseids
+        self.software_version = config.software_version
+        self.device_language = config.device_language
+        self.software_release = config.software_release
+        self.sets = []
+        self.temp_directory = path(tempfile.mkdtemp())
+
+    def insert_set(self, image_files=None, test_timeout=None, ):
+        """
+        Insert a test set into the test plan.
+        """
+        if image_files is None:
+            image_files = []
+        if test_timeout is None:
+            test_timeout = []
+        test_harness = self.harness
+        setd = dict(name="set%d" % len(self.sets), image_files=image_files)
+        setd = dict(setd, test_timeout=test_timeout, test_harness=test_harness)
+        
+        self.sets.append(setd)
+
+    @property
+    def post_actions(self):
+        """ATS3 and ASTE post actions."""
+        actions = []
+        report_path = self.file_store.joinpath(self.REPORT_PATH)
+        email_action = ("SendEmailAction", 
+                        (("subject", self.EMAIL_SUBJECT),
+                         ("type", "ATS3_REPORT"),
+                         ("send-files", "true"),
+                         ("to", self.report_email)))
+        ats3_report = ("FileStoreAction", 
+                       (("to-folder", report_path.joinpath("ATS3_REPORT")),
+                        ("report-type", "ATS_REPORT"),
+                        ("date-format", "yyyyMMdd"),
+                        ("time-format", "HHmmss")))
+        aste_report = ("FileStoreAction", 
+                       (("to-folder", report_path.joinpath("ASTE_REPORT")),
+                        ("report-type", "ASTE_REPORT"),
+                        ("run-log", "true"),
+                        ("date-format", "yyyyMMdd"),
+                        ("time-format", "HHmmss")))
+
+        diamonds_action = ("DiamondsAction", ())
+        if self.report_email:
+            actions.append(email_action)
+        if self.file_store:
+            actions.append(ats3_report)
+            actions.append(aste_report)
+        if self.diamonds_build_url:
+            actions.append(diamonds_action)
+        return actions               
+
+    def __getitem__(self, key):
+        return self.__dict__[key]
+
+
+
+class AsteTestDropGenerator(object):
+    """
+    Generate test drop zip file for ATS3.
+
+    Generates drop zip files file from a TestPlan instance. The main
+    responsibility of this class is to serialize the plan into a valid XML
+    file and build a zip file for the drop.
+    
+    Creates one <set> for ASTE tests.
+
+    ASTE harness, normal operation
+    ------------------------------
+    
+    - create logging dir for aste             makedir (to C:\logs\TestFramework)
+    - execute asset from the testasset.zip    execute-asset
+    - fetch logs                              fetch-log
+
+    """
+
+    ASTE_LOG_DIR = r"c:\logs\testframework"
+
+    def __init__(self):
+        self.drop_path_root = path("ATS3Drop")
+        self.drop_path = None
+        self.defaults = {}
+
+    def generate(self, test_plan, output_file):
+        """Generate a test drop file."""
+        xml = self.generate_xml(test_plan)
+        return self.generate_drop(test_plan, xml, output_file)
+
+    def generate_drop(self, test_plan, xml, output_file):
+        """Generate test drop zip file."""
+        zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
+        try:
+            for drop_file, src_file in self.drop_files(test_plan):
+                _logger.info("   + Adding: %s" % src_file.strip())
+                zfile.write(src_file.strip(), drop_file.encode('utf-8'))
+            doc = amara.parse(et.tostring(xml.getroot()))
+            _logger.debug("XML output: %s" % doc.xml(indent=u"yes"))
+            zfile.writestr("test.xml", doc.xml(indent="yes"))
+        finally:
+            zfile.close()
+        return zfile
+
+    def generate_xml(self, test_plan):
+        """Generate test drop XML."""
+        self.defaults = {"enabled": "true", 
+                         "passrate": "100", 
+                         "significant": "false",
+                         "harness": "%s" % test_plan["harness"]} 
+        root = E("test")
+        root.append(et.XML("<name>%(testrun_name)s</name>" % test_plan))
+        if test_plan["diamonds_build_url"]:
+            root.append(
+                et.XML("<buildid>%(diamonds_build_url)s</buildid>" % test_plan))
+        self.generate_target(test_plan, root)
+        root.append(self.generate_plan(test_plan))
+        for post_action in self.generate_post_actions(test_plan):
+            root.append(post_action)
+        root.append(self.generate_files(test_plan))
+        etree = et.ElementTree(root)
+        return etree
+
+    def generate_target(self, test_plan, root):
+        """Append target(s) into the XML"""
+        target = E("target")
+        device = SE(target, "device", rank="none", alias="DEFAULT")
+        SE(device, "property", name="harness", value=test_plan["harness"])
+        SE(device, "property", name="hardware", value=test_plan["device_type"])
+        SE(device, "setting", name="softwareVersion", value=test_plan["software_version"])
+        SE(device, "setting", name="softwareRelease", value=test_plan["software_release"])
+        SE(device, "setting", name="language", value=test_plan["device_language"])
+        
+        if test_plan["device_hwid"] != "":
+            SE(device, "property", name="HWID", value=test_plan["device_hwid"])
+        root.append(target)
+                    
+    def generate_plan(self, test_plan):
+        """Generate the test <plan> with multiple <set>s."""
+        plan = E("plan", name="Plan %s %s" % (test_plan["test_type"], test_plan["device_type"]), **self.defaults)
+        session = SE(plan, "session", name="session", **self.defaults)
+        # One set for each component.
+        for setd in test_plan.sets:
+            self.drop_path = self.drop_path_root.joinpath(setd["name"])
+            elem = SE(session, "set", name=setd["name"], **self.defaults)
+            SE(SE(elem, "target"), "device", rank="master", alias="DEFAULT")
+            case = SE(elem, "case", name="%s case" % setd["name"], **self.defaults)
+            self.generate_steps(setd, case, test_plan)
+        return plan
+
+    def generate_steps(self, setd, case, test_plan):
+        """Generate the test plan <step>s."""
+        # Flash images.
+        images = self.drop_path_root.joinpath("images")
+        for image_file in setd["image_files"]:
+            flash = SE(case, "flash", images=images.joinpath(image_file.name))
+            flash.set("target-alias", "DEFAULT")
+
+        # If tracing enabled:
+        self.generate_execute_asset_steps(case, test_plan)
+
+    def generate_execute_asset_steps(self, case, test_plan):
+        """Executes steps for TestAsset"""
+        time_out = test_plan["test_timeout"]
+        step = SE(case, "step", 
+                      name="Execute asset zip step" , **self.defaults)
+        SE(step, "command").text = "execute-asset"
+        params = SE(step, "params")
+        SE(params, "param", repeat="1")        
+        elem = SE(params, "param")
+        elem.set("asset-source", path(r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"))
+        elem = SE(params, "param")
+        elem.set("testcase-ids", test_plan["testasset_caseids"])
+        SE(params, "param", timeout=time_out)
+
+
+    def generate_post_actions(self, test_plan):
+        """Generate post actions."""
+        actions = []
+        for action_type, parameters in test_plan.post_actions:
+            action = E("postAction")
+            SE(action, "type").text = action_type
+            params = SE(action, "params")
+            for name, value in parameters:
+                SE(params, "param", name=name, value=value)
+            actions.append(action)
+        return actions
+
+    def generate_testasset_zip(self, test_plan, output_file=None):
+        """Generate TestAsset.zip for the ASTE server"""
+        filename = test_plan["temp_directory"].joinpath(r"TestAsset.zip")
+        if output_file != None:
+            filename = output_file
+        testasset_location = path(test_plan["testasset_location"])
+        if re.search(r"[.]zip", testasset_location):
+            return testasset_location
+        else:
+            zfile = zipfile.ZipFile(filename, "w", zipfile.ZIP_DEFLATED)
+            try:
+                for file_ in list(testasset_location.walkfiles()):
+                    file_mod = file_.replace(testasset_location, "")
+                    zfile.write(file_, file_mod.encode('utf-8'))
+            finally:
+                zfile.close()
+            return filename
+            
+    def drop_files(self, test_plan):
+        """Yield a list of drop files."""
+        drop_set = set()
+        drop_files = []
+        zip_file = path(self.generate_testasset_zip(test_plan)) ##check here, I changed the variable name from "zipfile" to "zip_file"
+        for setd in test_plan.sets:
+            drop_path = self.drop_path_root.joinpath(setd["name"])
+            drop_files = ((drop_path.parent, "images", setd["image_files"]),
+                          (drop_path.parent, "TestAssets", [zip_file]))
+            for drop_dir, sub_dir, files in drop_files:
+                for file_path in files:
+                    if file_path != None:
+                        drop_file = drop_dir.joinpath(sub_dir, file_path.name)
+                        drop_file = drop_file.normpath()
+                        if drop_file not in drop_set:
+                            drop_set.add(drop_file)
+                            yield (drop_file, file_path.normpath())
+           
+
+    def generate_files(self, test_plan):
+        """Generate the <files> section."""
+        files_elem = E("files")
+        for drop_file, _ in self.drop_files(test_plan):
+            SE(files_elem, "file").text = drop_file
+        return files_elem
+
+class AsteComponentParser(object):
+    """
+   
+    Add information to the test_plan
+    
+    """
+
+    def __init__(self, config):
+        self.flash_images = [path(p) for p in config.flash_images]
+        self.build_drive = config.build_drive
+        self.test_timeout = config.test_timeout
+
+     
+    def insert_test_set(self, test_plan):
+        """Parse flash images and creates inserts into 'sets'"""
+
+        test_plan.insert_set(image_files=self.flash_images,
+                             test_timeout=list(self.test_timeout))
+                                
+
+def create_drop(config):
+    """Create a test drop."""    
+    _logger.debug("initialize test plan")
+    
+    test_plan = AsteTestPlan(config)
+    parser = AsteComponentParser(config)
+    parser.insert_test_set(test_plan) ######check here if something goes wrong, removed ", path(tsrc)"
+    generator = AsteTestDropGenerator()
+    _logger.info("generating drop file: %s" % config.drop_file)
+    generator.generate(test_plan, output_file=config.drop_file)
+
+
+def main():
+    """Main entry point."""    
+    cli = OptionParser(usage="%prog [options] TSRC1 [TSRC2 [TSRC3 ...]]")
+    cli.add_option("--build-drive", help="Build area root drive")
+    cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", 
+                   default="unknown")
+    cli.add_option("--device-hwid", help="Device hwid", 
+                   default="")
+    cli.add_option("--diamonds-build-url", help="Diamonds build url")
+    cli.add_option("--drop-file", help="Name for the final drop zip file",
+                   default="ATS3Drop.zip")
+    cli.add_option("--file-store", help="Destination path for reports.",
+                   default="")
+    cli.add_option("--flash-images", help="Paths to the flash image files",
+                   default="")     
+    cli.add_option("--minimum-flash-images", help="Minimum amount of flash images",
+                   default=2)
+    cli.add_option("--report-email", help="Email notification receivers", 
+                   default="")
+    cli.add_option("--plan-name", help="Name of the test plan", 
+                   default="plan")
+    cli.add_option("--test-timeout", help="Test execution timeout value (default: %default)",
+                   default="60")
+    cli.add_option("--testrun-name", help="Name of the test run", 
+                   default="run")
+    cli.add_option("--testasset-location", help="Path to the ASTE test assets location",
+                   default="")     
+    cli.add_option("--testasset-caseids", help="Test case IDs to run",
+                   default="")     
+    cli.add_option("--software-version", help="Sofwtare version",
+                   default="")     
+    cli.add_option("--test-type", help="Sofwtare version",
+                   default="smoke")     
+    cli.add_option("--device-language", help="language name e.g. English",
+                   default="English")     
+    cli.add_option("--software-release", help="Software release or product name e.g. PPD 52.50",
+                   default="")     
+    cli.add_option("--verbose", help="Increase output verbosity",
+                   action="store_true", default=False)
+
+    opts, _ = cli.parse_args()
+
+    if not opts.flash_images:
+        cli.error("no flash image files given")
+    if len(opts.flash_images.split(",")) < int(opts.minimum_flash_images):
+        cli.error("Not enough flash files: %i defined, %i needed" % (len(opts.flash_images.split(",")), int(opts.minimum_flash_images) ))
+
+    if opts.verbose:
+        _logger.setLevel(logging.DEBUG)
+        logging.basicConfig(level=logging.DEBUG)
+    TEMP_PATH = tempfile.mkdtemp()
+    config = Configuration(opts)
+    create_drop(config)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/atsconfigparser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,127 @@
+#============================================================================ 
+#Name        : atsconfigparser.py
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import configuration
+import amara
+
+class TestXML:
+    def __init__(self, testxml):
+        self.testxml = testxml
+        self.doc = amara.parse(testxml)
+
+    def containsproperty(self, name, value):
+        for p in self.doc.xml_xpath("//property"):
+            if str(p.name) == name:
+                return str(p.value) == value
+        return False
+    
+    def containssetting(self, name, value):
+        for p in self.doc.xml_xpath("//setting"):
+            if str(p.name) == name:
+                return str(p.value) == value
+        return False
+    
+    def addorreplacesetting(self, name, value):
+        changed = False
+        for p in self.doc.xml_xpath("//setting"):
+            if str(p.name) == name:
+                p.value = value
+                changed = True
+        if not changed:
+            for device in self.doc.test.target.device:
+                device.xml_append(self.doc.xml_create_element(u"setting", attributes = {u'name': unicode(name), u'value': unicode(value)}))
+        
+    def containsattribute(self, name, value):
+        for p in self.doc.xml_xpath("//*[@" + name + "]"):
+            if p[name] == value:
+                return True
+        return False
+        
+    def replaceattribute(self, name, value):
+        for p in self.doc.xml_xpath("//*[@" + name + "]"):
+            p[name] = value
+            
+    def addorreplaceproperty(self, name, value):
+        changed = False
+        for p in self.doc.xml_xpath("//property"):
+            if str(p.name) == name:
+                p.value = value
+                changed = True
+        if not changed:
+            for device in self.doc.test.target.device:
+                device.xml_append(self.doc.xml_create_element(u"property", attributes = {u'name': unicode(name), u'value': unicode(value)}))
+
+
+class ATSConfigParser:
+    def __init__(self, specfilename):
+        specfile = open(specfilename)
+        builder = configuration.NestedConfigurationBuilder(specfile)
+        self.configs = builder.getConfigurations("common")
+    
+    def properties(self):
+        props = {}
+        for config in self.configs:
+            if (config.type == "properties"):
+                for subconfig in config:
+                    props[subconfig] = config[subconfig]
+        return props
+        
+    def settings(self):
+        settings = {}
+        for config in self.configs:
+            if (config.type == "settings"):
+                for subconfig in config:
+                    settings[subconfig] = config[subconfig]
+        return settings
+
+def converttestxml(specfilename, testxmldata):
+    specfile = open(specfilename)
+    
+    builder = configuration.NestedConfigurationBuilder(specfile)
+    configs = builder.getConfigurations("common")# + builder.getConfigurations("ats3")
+    
+    testxml = TestXML(testxmldata)
+    
+    for config in configs:
+        if (config.type == "properties"):
+            for subconfig in config:
+                testxml.addorreplaceproperty(subconfig, config[subconfig])
+        if (config.type == "conditional_properties"):
+            check = config.name.split(',')
+            if testxml.containsproperty(check[0], check[1]):
+                for subconfig in config:
+                    testxml.addorreplaceproperty(subconfig, config[subconfig])
+        if (config.type == "settings"):
+            for subconfig in config:
+                testxml.addorreplacesetting(subconfig, config[subconfig])
+        if (config.type == "conditional_settings"):
+            check = config.name.split(',')
+            if testxml.containssetting(check[0], check[1]):
+                for subconfig in config:
+                    testxml.addorreplacesetting(subconfig, config[subconfig])
+        if (config.type == "attributes"):
+            for subconfig in config:
+                testxml.replaceattribute(subconfig, config[subconfig])
+        if (config.type == "conditional_attributes"):
+            check = config.name.split(',')
+            if testxml.containsattribute(check[0], check[1]):
+                for subconfig in config:
+                    testxml.replaceattribute(subconfig, config[subconfig])
+    
+    return testxml.doc.xml(indent=u"yes")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/dropgenerator.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,880 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : dropgenerator.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+#w0142 => * and ** were used
+#F0401 => pylint didn't find "path" module
+#C0302 => Too many lines
+
+import codecs
+from  xml.parsers.expat import ExpatError
+
+from xml.etree import ElementTree as et
+from xml.sax.saxutils import quoteattr
+from path import path
+import logging
+import os
+import re
+import zipfile
+import amara
+import atsconfigparser
+
+# pylint: disable-msg=W0404
+from ntpath import sep as atssep
+import ntpath as atspath
+from ntpath import sep as sossep
+
+_logger = logging.getLogger('ats')
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+CTC_PATHS_LIST = []
+
+class Ats3TestDropGenerator(object):
+    """
+    Generate test drop zip file for ATS3.
+
+    Generates drom zip files file from a TestPlan instance. The main
+    responsibility of this class is to serialize the plan into a valid XML
+    file and build a zip file for the drop.
+    
+    Creates one <set> for each component's tests.
+
+    Stif harness, normal operation
+    ------------------------------
+    
+    - create logging dir for stif             makedir (to C:\logs\TestFramework)
+    - install data files                      install (to E:\testing\data)
+    - install configuration (.cfg) files      "       (to E:\testing\conf)
+    - install testmodule (.dll) files         "       (to C:\sys\bin)
+    - install engine ini (testframework.ini)  "       (to C:\testframework)
+    - execute cases from the engine ini       run-cases
+    - fetch logs                              fetch-log
+
+    Stif harness, SIS package installation
+    --------------------------------------
+    
+    - like above but with data and config files replaced by sis files
+    - install sis to the device               install-software
+
+    """
+
+    STIF_LOG_DIR = r"c:" + os.sep + "logs" + os.sep + "testframework"
+    TEF_LOG_DIR = r"c:" + os.sep + "logs" + os.sep + "testexecute"
+    MTF_LOG_DIR = r"c:" + os.sep + "logs" + os.sep + "testresults"
+    STIFUNIT_LOG_DIR = r"c:" + os.sep + "logs" + os.sep + "testframework"
+    EUNIT_LOG_DIR = r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs"
+    #QT_LOG_DIR = r"c:" + os.sep + "private" + os.sep + "Qt" + os.sep + "logs"
+    QT_LOG_DIR = r"c:" + os.sep + "shared" + os.sep + "EUnit" + os.sep + "logs"
+    CTC_LOG_DIR = r"c:" + os.sep + "data" + os.sep + "ctc"
+
+    def __init__(self):
+        self.drop_path_root = path("ATS3Drop")
+        self.drop_path = None
+        self.defaults = {}
+
+    def generate(self, test_plan, output_file, config_file=None):
+        """Generate a test drop file."""
+        xml = self.generate_xml(test_plan)
+        
+        if config_file:
+            xmltext = et.tostring(xml.getroot(), "ISO-8859-1")
+            xmltext = atsconfigparser.converttestxml(config_file, xmltext)
+            xml = et.ElementTree(et.XML(xmltext))
+            
+        return self.generate_drop(test_plan, xml, output_file)
+
+    def generate_drop(self, test_plan, xml, output_file):
+        """Generate test drop zip file."""
+        zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
+        try:
+            for drop_file, src_file in self.drop_files(test_plan):
+                _logger.info("   + Adding: %s" % src_file.strip())
+                try:
+                    zfile.write(src_file.strip(), drop_file.encode('utf-8'))
+                except OSError, expr:
+                    _logger.error(expr)
+            doc = amara.parse(et.tostring(xml.getroot(), "ISO-8859-1"))
+            _logger.debug("XML output: %s\n" % doc.xml(indent=u"yes", encoding="ISO-8859-1"))
+            zfile.writestr("test.xml", doc.xml(indent="yes", encoding="ISO-8859-1"))
+        finally:
+            zfile.close()
+
+        return zfile
+
+    def generate_xml(self, test_plan):
+        """Generate test drop XML."""
+        self.defaults = {"enabled": "true", 
+                         "passrate": "100", 
+                         "significant": "false"}
+        root = E("test")
+        root.append(et.XML("<name>%(testrun_name)s</name>" % test_plan))
+        if test_plan["diamonds_build_url"]:
+            root.append(
+                et.XML("<buildid>%(diamonds_build_url)s</buildid>" % test_plan))
+        generate_target(test_plan, root)
+        root.append(self.generate_plan(test_plan))
+        for post_action in generate_post_actions(test_plan):
+            root.append(post_action)
+        root.append(self.generate_files(test_plan))
+        etree = et.ElementTree(root)
+        return etree
+            
+    def generate_plan(self, test_plan):
+        """Generate the test <plan> with multiple <set>s."""
+        plan = E("plan", name="%s Plan" % test_plan["testrun_name"],
+                 harness=test_plan["harness"], **self.defaults)
+        session = SE(plan, "session", name="session", harness=test_plan["harness"], **self.defaults)
+
+        if not test_plan.custom_dir is None:
+            insert_custom_file(session, test_plan.custom_dir.joinpath("preset_custom.xml"))
+        
+        # One set for each component.
+        for setd in test_plan.sets:
+            self.drop_path = self.drop_path_root.joinpath(setd["name"])
+            elem = SE(session, "set", name=setd["name"]+"-"+setd["component_path"], harness=setd["test_harness"], **self.defaults)
+            SE(SE(elem, "target"), "device", rank="master", alias="DEFAULT_%s" % setd["test_harness"])
+             
+            if not test_plan.custom_dir is None:
+                insert_custom_file(elem, test_plan.custom_dir.joinpath("precase_custom.xml"))
+        
+            case = SE(elem, "case", name="%s case" % setd["name"],
+                      harness=setd["test_harness"], **self.defaults)
+            self.generate_steps(setd, case, test_plan)
+            if not test_plan.custom_dir is None:
+                insert_custom_file(elem, test_plan.custom_dir.joinpath("postcase_custom.xml"))
+
+        if not test_plan.custom_dir is None:
+            insert_custom_file(session, test_plan.custom_dir.joinpath("postset_custom.xml"))
+
+        return plan
+
+    def generate_steps_logdir(self, setd, case):
+        """generates STIF log dir."""
+        
+        _qt_test_ = check_qt_harness(setd)
+        if _qt_test_:
+            step = SE(case, "step", name="Create QT log dir", harness=setd["test_harness"], **self.defaults)
+        else:
+            step = SE(case, "step", name="Create %s log dir" % setd["test_harness"], harness=setd["test_harness"], **self.defaults)
+        SE(step, "command").text = "makedir"
+        if setd["test_harness"] == "STIF":
+            SE(SE(step, "params"), "param", dir=self.STIF_LOG_DIR)
+        if setd["test_harness"] == "GENERIC":
+            if check_mtf_harness(setd):
+                SE(SE(step, "params"), "param", dir=self.MTF_LOG_DIR)
+            else:
+                SE(SE(step, "params"), "param", dir=self.TEF_LOG_DIR)
+        elif setd["test_harness"] == "EUNIT":
+            if _qt_test_:
+                SE(SE(step, "params"), "param", dir=self.QT_LOG_DIR)
+            else: 
+                SE(SE(step, "params"), "param", dir=self.EUNIT_LOG_DIR)
+                
+        elif setd["test_harness"] == "STIFUNIT":
+            SE(SE(step, "params"), "param", dir=self.STIFUNIT_LOG_DIR)
+            
+        if setd.has_key("sis_files") and setd["sis_files"]:
+            setd = dict(setd, src_dst=[]) # Added to pass the Sis tests, if removed - gives KeyError
+            for sis_file in setd["sis_files"]:
+                self.generate_install_step(case, "sis", sis_file.name, "sis", 
+                                           r"c:" + os.sep + "testframework", setd["test_harness"])
+        else:
+            if setd["src_dst"] != []:
+                self.generate_install_step(case, "", "", 
+                                               "", r"", setd["test_harness"], setd["src_dst"])
+            else:
+                # Data file install.
+                for data_file in setd["data_files"]:                                
+                    self.generate_install_step(case, "data", data_file.name, "data", 
+                                               r"e:\testing\data", setd["test_harness"])
+
+                # Configuration file install.
+                for conf_file in setd["config_files"]:
+                    self.generate_install_step(case, "conf", conf_file.name, "conf", 
+                                               r"e:\testing\conf", setd["test_harness"])
+
+                # Test module install.
+                for test_file in setd["testmodule_files"]:
+                    self.generate_install_step(case, "testmodule", test_file.name, 
+                                               "testmodules", r"c:\sys\bin", setd["test_harness"]) 
+        return setd
+
+    def generate_steps_engineini(self, setd, case):
+        """Engine ini install ( if one exists )"""
+        if setd.has_key("sis_files") and setd["sis_files"]:
+            self.generate_install_step(case, "engine_ini",
+                                       setd["engine_ini_file"].name,
+                                       "init",
+                                       r"c:" + os.sep + "testframework", setd["test_harness"])
+        else:
+            if setd["src_dst"] == []:
+                self.generate_install_step(case, "engine_ini",
+                                       setd["engine_ini_file"].name,
+                                       "init",
+                                       r"c:" + os.sep + "testframework", setd["test_harness"])
+
+    def generate_steps_sisfiles(self, setd, case, test_plan):
+        """generating steps for sis files"""
+        for sis_file in setd["sis_files"]:
+            step = SE(case, "step", name="Install SIS to the device: %s" % \
+                      sis_file.name, harness=setd["test_harness"], **self.defaults)
+            SE(step, "command").text = "install-software"
+            params = SE(step, "params")
+            sis_name = path(r"c:" + os.sep + "testframework").joinpath(sis_file.name)
+            for key, value in (("timeout", test_plan["test_timeout"]),
+                               ("overWriteAllowed", "true"),
+                               ("upgradeData", "true"),
+                               ("downloadAllowed", "false"),
+                               ("packageInfoAllowed", "true"),
+                               ("untrustedAllowed", "true"),
+                               ("ignoreOCSPWarnings", "true"),
+                               ("userCapGranted", "true"),
+                               ("optionalItemsAllowed", "true"),
+                               ("killApp", "true"),
+                               ("installDrive", "C"),
+                               ("upgradeAllowed", "true"),
+                               ("OCSP_Done", "true"),
+                               ("sisPackageName", sis_name.normpath())):
+                SE(params, "param").set(key, value)
+
+    def generate_steps_tracestart(self, setd, case, pmds):
+        """Tracing steps are added (Trace Start)"""
+        step = SE(case, "step", 
+                  name="Start tracing", harness=setd["test_harness"],
+                  **self.defaults)
+        SE(step, "command").text = "trace-start"
+        params = SE(step, "params")
+        if setd.has_key("trace_activation_files") and setd["trace_activation_files"]:
+            #find out the group to activate
+            trace_group = et.parse(setd["trace_activation_files"][0]).getroot().find("Configurations").find("TraceActivation").find("Configuration").get("Name")
+            SE(params, "param", ta=self.drop_path.joinpath(r"trace_activation", setd["trace_activation_files"][0].name)) 
+            SE(params, "param", tgrp=trace_group )                                            
+        if setd.has_key("pmd_files") and setd["pmd_files"]:
+            SE(params, "param", pmd=pmds.joinpath(setd["pmd_files"][0].name))
+        SE(params, "param", log=setd["trace_path"])            
+        SE(params, "param", timeout="60")
+        elem = SE(params, "param")
+        elem.set('date-format', "yyyyMMdd")
+        elem = SE(params, "param")
+        elem.set('time-format', "HHmmss")
+
+    def generate_steps_createstep(self, setd, case, test_plan):
+        """generates core steps for a single set"""
+        if setd["test_harness"] == "STIF" or setd["test_harness"] == "STIFUNIT" or setd["test_harness"] == "GENERIC":
+            if setd["src_dst"] == []:
+                # Test case execution. If ini file exists, use that
+                if setd["engine_ini_file"] != None:
+                    step = SE(case, "step", 
+                              name="Execute test: %s" % setd["engine_ini_file"].name, 
+                              harness=setd["test_harness"], **self.defaults)
+                    SE(step, "command").text = "run-cases"
+                    params = SE(step, "params")
+                    SE(params, "param", filter="*")
+                    SE(params, "param", timeout=test_plan["test_timeout"])
+                    ini_name = setd["engine_ini_file"].name
+                    SE(params, "param", engineini=path(r"c:" + os.sep + "testframework") / ini_name)            
+                    
+                # if no inifile, but cfg files defined, use those
+                elif setd["config_files"]!=[]:
+                    for config_file in setd["config_files"]:
+                        step = SE(case, "step", 
+                                  name="Execute test: %s" % config_file.name, 
+                                  harness=setd["test_harness"], **self.defaults)
+                        SE(step, "command").text = "run-cases"
+                        params = SE(step, "params")
+                        SE(params, "param", module="TESTSCRIPTER")
+                        elem = SE(params, "param" )
+                        elem.set('testcase-file', path(r"e:\testing\conf") / config_file.name )
+                        SE(params, "param", filter="*")
+                        SE(params, "param", timeout=test_plan["test_timeout"])
+
+                # if no ini or cfg files, use dll directly
+                else:
+                    for testmodule_file in setd["testmodule_files"]:
+                        step = SE(case, "step", 
+                                  name="Execute test: %s" %  testmodule_file.name, harness=setd["test_harness"], 
+                                  **self.defaults)
+                        SE(step, "command").text = "run-cases"
+                        params = SE(step, "params")
+                        SE(params, "param", module=testmodule_file.name)
+                        SE(params, "param", filter="*")
+                        SE(params, "param", timeout=test_plan["test_timeout"])
+            elif setd["src_dst"] != []:
+                self.generate_run_steps(case, setd, test_plan["test_timeout"], test_plan["eunitexerunner_flags"])
+        elif setd["test_harness"] == "EUNIT":
+            self.generate_run_steps(case, setd, test_plan["test_timeout"], test_plan["eunitexerunner_flags"])
+
+    def generate_steps_tracestop(self, setd, case, pmds):
+        """Tracing steps are added (Trace Stop)"""
+        step = SE(case, "step", name="Stop tracing",
+                  harness=setd["test_harness"], **self.defaults)        
+        SE(step, "command").text = "trace-stop"
+        params = SE(step, "params")
+        SE(params, "param", timeout="60")
+
+        step = SE(case, "step", name="Convert tracing",
+                  harness=setd["test_harness"], **self.defaults)        
+        SE(step, "command").text = "trace-convert"
+        params = SE(step, "params")
+        if setd.has_key("pmd_files") and setd["pmd_files"]:
+            SE(params, "param", pmd=pmds.joinpath(setd["pmd_files"][0].name))
+        SE(params, "param", log=setd["trace_path"])            
+        SE(params, "param", timeout="60")
+        elem = SE(params, "param")
+        elem.set('date-format', "yyyyMMdd")
+        elem = SE(params, "param")
+        elem.set('time-format', "HHmmss")
+
+    def generate_steps_ctcdata(self, setd, case, test_plan):
+        """generates steps for installing CTC data"""
+        global CTC_PATHS_LIST
+        ctc_helium_path_list = []
+        
+        step = SE(case, "step", name="Save CTC data", harness=setd["test_harness"], **self.defaults)
+        SE(step, "command").text = "execute"
+        params = SE(step, "params")
+        SE(params, "param", parameters="writelocal")
+        SE(params, "param", file=path(r"z:\sys\bin\ctcman.exe"))
+        step = SE(case, "step", name="Save CTC data", harness=setd["test_harness"], **self.defaults)
+        SE(step, "command").text = "execute"
+        params = SE(step, "params")
+        SE(params, "param", parameters="writefile")
+        SE(params, "param", file=path(r"z:\sys\bin\ctcman.exe"))
+            
+        if test_plan["ats_network_drive"].strip() != "":
+            #preparing local-path for CTC step
+            #getting '39865' as diamonds ID out of 'http://diamonds.nmp.nokia.com/diamonds/builds/39865/'
+            if test_plan["diamonds_build_url"].rfind("/", 0):
+                diamonds_id = test_plan["diamonds_build_url"].rsplit(r"/", 2)[1]
+            else:
+                diamonds_id = test_plan["diamonds_build_url"].rsplit(r"/", 1)[1]
+            
+            #separating network id and drop number from 10.11.3.2\share#ats\drop2.zip
+            #'drop2' from the other part of the string conjuncted with a # sign
+            ats_network = r"\\" + test_plan["ats_network_drive"].rsplit("#", 1)[0] #network host
+            temp_drop_id = path(test_plan["ats_network_drive"].rsplit("#", 1)[1].rsplit(".", 1)[0]).normpath() #drop ID
+            drop_id = temp_drop_id.rsplit(atssep, 1)[1]
+            
+            ats_network_path = atspath.join(ats_network, "ctc_helium" , diamonds_id, drop_id, setd["name"], "ctcdata")
+            ctc_helium_path_list.append(ats_network_path)
+            
+            step = SE(case, "step", name="Fetch CTC data for post commands execution", harness=setd["test_harness"], **self.defaults)
+            SE(step, "command").text = "fetch-log"
+            params = SE(step, "params")
+            SE(params, "param", delete="false")
+            elem = SE(params, "param")
+            elem.set('local-path', ats_network_path)
+            SE(params, "param", path=path(self.CTC_LOG_DIR).joinpath(r"ctcdata.txt"))
+
+            CTC_PATHS_LIST += ctc_helium_path_list #creating list of ctcdata.txt files for runProcess postaction
+        
+        step = SE(case, "step", name="Fetch and clean CTC data", harness=setd["test_harness"], **self.defaults)
+        SE(step, "command").text = "fetch-log"
+        params = SE(step, "params")
+        SE(params, "param", delete="true")
+        SE(params, "param", path=path(self.CTC_LOG_DIR).joinpath(r"ctcdata.txt"))
+        
+    def generate_steps_logfetching(self, setd, case):
+        """generates steps for fetching log file"""
+        step = SE(case, "step", name="Fetch test module logs", harness=setd["test_harness"], **self.defaults)
+        SE(step, "command").text = "fetch-log"
+        params = SE(step, "params")
+        SE(params, "param", type="text")
+        SE(params, "param", delete="true")
+        if setd["test_harness"] == "STIF":
+            SE(params, "param", path=path(self.STIF_LOG_DIR).joinpath(r"*"))
+        if setd["test_harness"] == "GENERIC":
+            if check_mtf_harness(setd):
+                SE(params, "param", path=path(self.MTF_LOG_DIR).joinpath(r"*"))
+            else:
+                SE(params, "param", path=path(self.TEF_LOG_DIR).joinpath(r"*"))
+        elif setd["test_harness"] == "STIFUNIT":
+            SE(params, "param", path=path(self.STIFUNIT_LOG_DIR).joinpath(r"*"))
+        elif setd["test_harness"] == "EUNIT":
+            if check_qt_harness(setd):
+                SE(params, "param", path=path(self.QT_LOG_DIR).joinpath(r"*"))
+            else:
+                SE(params, "param", path=path(self.EUNIT_LOG_DIR).joinpath(r"*"))
+
+    def generate_steps(self, setd, case, test_plan):
+        """Generate the test plan <step>s."""
+        # Flash images.
+        images = self.drop_path_root.joinpath("images")
+        pmds = self.drop_path_root.joinpath("pmds")
+        
+        sorted_images = []
+        for image_file in setd["image_files"]:
+            if 'core' in image_file.name:
+                sorted_images.append(image_file.name)
+        for image_file in setd["image_files"]:
+            if 'rofs2' in image_file.name:
+                sorted_images.append(image_file.name)
+        for image_file in setd["image_files"]:
+            if 'rofs3' in image_file.name:
+                sorted_images.append(image_file.name)
+        for image_file in setd["image_files"]:
+            if 'core' not in image_file.name and 'rofs2' not in image_file.name and 'rofs3' not in image_file.name:
+                sorted_images.append(image_file.name)
+                
+        for image_file in sorted_images:
+            flash = SE(case, "flash", images=images.joinpath(image_file))
+            flash.set("target-alias", "DEFAULT_%s" % setd["test_harness"])
+
+        if not test_plan.custom_dir is None:
+            insert_custom_file(case, test_plan.custom_dir.joinpath("prestep_custom.xml"))
+
+        if setd["ctc_enabled"] == "True":
+            step = SE(case, "step", name="Create CTC log dir", harness=setd["test_harness"], **self.defaults)
+            SE(step, "command").text = "makedir"
+            params = SE(step, "params")
+            SE(params, "param", dir=self.CTC_LOG_DIR)
+            step = SE(case, "step", name="CTC start", harness=setd["test_harness"], **self.defaults)
+            SE(step, "command").text = "execute"
+            params = SE(step, "params")
+            SE(params, "param", file=path(r"z:\sys\bin\ctcman.exe"))
+            
+        # STIF log dir.
+        setd = self.generate_steps_logdir(setd, case)
+
+        # Engine ini install ( if one exists )
+        if setd["engine_ini_file"] != None:
+            self.generate_steps_engineini(setd, case)
+        
+        #If sis files
+        if setd.has_key("sis_files") and setd["sis_files"]:
+            self.generate_steps_sisfiles(setd, case, test_plan)    
+
+        # If tracing enabled, Start Tracing:
+        if setd.has_key("trace_path") and setd["trace_path"] != "":
+            self.generate_steps_tracestart(setd, case, pmds)
+
+        #core steps of a step
+
+        if not test_plan.custom_dir is None:
+            insert_custom_file(case, test_plan.custom_dir.joinpath("prerun_custom.xml"))
+        self.generate_steps_createstep(setd, case, test_plan)
+
+        if not test_plan.custom_dir is None:
+            insert_custom_file(case, test_plan.custom_dir.joinpath("postrun_custom.xml"))
+        
+        # If tracing enabled, Stop Tracing
+        if setd.has_key("trace_path") and setd["trace_path"] != "":
+            self.generate_steps_tracestop(setd, case, pmds)
+
+        #install CTC data
+        if setd["ctc_enabled"] == "True":
+            self.generate_steps_ctcdata(setd, case, test_plan)
+            
+        # Log file fetching.
+        self.generate_steps_logfetching(setd, case)
+
+        if not test_plan.custom_dir is None:
+            insert_custom_file(case, test_plan.custom_dir.joinpath("poststep_custom.xml"))
+
+
+    def generate_runsteps_tef(self, setd, case, src_dst, time_out):
+        """generates runsteps for tef"""
+        for file1 in src_dst:
+            if 'testscript' in file1[2]:
+                filename = file1[1]
+                filename = filename[file1[1].rfind(os.sep)+1:]
+                harness = "testexecute.exe"
+                if file1[2] == "testscript:mtf":
+                    harness = "testframework.exe"
+                step = SE(case, "step", 
+                              name="Execute test: %s" %  filename, harness=setd["test_harness"], 
+                              **self.defaults)
+                SE(step, "command").text = "execute"
+                params = SE(step, "params")
+                SE(params, "param", file=harness)
+                SE(params, "param", parameters=file1[1])
+                
+                if file1[2] == "testscript:mtf":
+                    SE(params, "param", {'result-file': self.MTF_LOG_DIR + os.sep + filename.replace('.script', '.htm')})
+                else:
+                    SE(params, "param", {'result-file': self.TEF_LOG_DIR + os.sep + filename.replace('.script', '.htm')})
+                SE(params, "param", timeout=time_out)
+                SE(params, "param", parser="TEFTestResultParser")
+            if 'testmodule' in file1[2]:
+                filename = file1[1]
+                filename = filename[file1[1].rfind(os.sep)+1:]
+                step = SE(case, "step", 
+                              name="Execute test: %s" %  filename, harness=setd["test_harness"], 
+                              **self.defaults)
+                SE(step, "command").text = "execute"
+                params = SE(step, "params")
+                SE(params, "param", file=file1[1])
+                SE(params, "param", {'result-file': self.TEF_LOG_DIR + os.sep + filename.replace(filename.split(".")[-1], 'htm')})
+                SE(params, "param", timeout=time_out)
+                SE(params, "param", parser="RTestResultParser")
+    
+    def generate_runsteps_stif(self, setd, case, src_dst, time_out):
+        """generates runsteps for stif"""
+        ini = cfg = dll = has_tf_ini = False
+        ini_file = None
+        cfg_files = dll_files = []
+
+        for tf_ini in src_dst:
+            if "testframework.ini" in tf_ini[1].lower():
+                has_tf_ini = True
+        
+        for file1 in src_dst:
+                
+            if "testframework.ini" in file1[1].lower() and file1[2] == "engine_ini" and has_tf_ini:
+                ini = True
+                ini_file = file1
+                
+            elif file1[2] == "engine_ini" and not has_tf_ini:
+                pipe_ini = open(file1[0], 'r')
+                if "[engine_defaults]" in str(pipe_ini.readlines()).lower():
+                    ini = True
+                    ini_file = file1
+            elif file1[2] == "conf":
+                if not ini:
+                    cfg = True
+                    cfg_files.append(file1)
+            elif file1[2] == "testmodule":
+                if not cfg and not ini:
+                    dll = True
+                    dll_files.append(file1)
+        if ini:
+            filename = ini_file[1]
+            filename = filename[ini_file[1].rfind(os.sep)+1:]
+            step = SE(case, "step",
+                      name="Execute test: %s" % filename, 
+                      harness=setd["test_harness"], **self.defaults)
+            SE(step, "command").text = "run-cases"
+            params = SE(step, "params")
+            SE(params, "param", filter="*")
+            SE(params, "param", timeout=time_out)
+            SE(params, "param", engineini=ini_file[1]) 
+        elif cfg:
+            for conf_file in cfg_files:
+                if ".dll" in conf_file[1].lower():
+                    continue
+                filename = conf_file[1]
+                filename = filename[conf_file[1].rfind(os.sep)+1:]
+                step = SE(case, "step", 
+                              name="Execute test: %s" % filename, 
+                              harness=setd["test_harness"], **self.defaults)
+                SE(step, "command").text = "run-cases"
+                params = SE(step, "params")
+                SE(params, "param", module="TESTSCRIPTER")
+                elem = SE(params, "param" )
+                elem.set('testcase-file', conf_file[1] )
+                SE(params, "param", filter="*")
+                SE(params, "param", timeout=time_out)
+        elif dll:
+            for dll_file in dll_files:
+                filename = dll_file[1]
+                filename = filename[dll_file[1].rfind(os.sep)+1:]
+                step = SE(case, "step", 
+                              name="Execute test: %s" %  filename, harness=setd["test_harness"], 
+                              **self.defaults)
+                SE(step, "command").text = "run-cases"
+                params = SE(step, "params")
+                SE(params, "param", module=filename)
+                SE(params, "param", filter="*")
+                SE(params, "param", timeout=time_out)
+
+    def generate_runsteps_eunit(self, setd, case, src_dst, time_out, eunit_flags):
+        """generates runsteps for eunit"""
+
+        for sdst in src_dst:
+            if "." in sdst[1]:
+                fileextension = sdst[1].rsplit(".")[1].lower()
+            filename = sdst[1]
+            filename = filename[filename.rfind(os.sep)+1:]
+            if fileextension == "dll" or fileextension == "exe":
+                re_dll = re.compile(r'[.]+%s' % fileextension, re.IGNORECASE)
+                no_dll = re_dll.sub('', filename)
+                no_dll_xml = ''.join([no_dll, u'_log.xml'])
+
+
+            
+            #for EUnit or other executables
+            if sdst[2] == "testmodule":
+                eunit_exe = "EUNITEXERUNNER.EXE"
+                if re_dll.search(filename):                    
+                    step = SE(case, "step", name = "Execute test: %s" % filename, harness=setd["test_harness"],
+                              **self.defaults)
+                    SE(step, "command").text = "execute"
+                    params = SE(step, "params")
+                    SE(params, "param", file=path(r"z:" + os.sep + "sys" + os.sep + "bin") / eunit_exe)
+                    elem = SE(params, "param")
+                    elem.set('result-file', path(self.EUNIT_LOG_DIR) / no_dll_xml)
+                    SE(params, "param", parameters="%s /F %s /l xml %s" % (eunit_flags, no_dll, filename))
+                    SE(params, "param", timeout=time_out)
+            
+            #for QtTest.lib executables
+            elif sdst[2] == "testmodule:qt":
+                step = SE(case, "step", name = "Execute Qt-test: %s" % filename, harness=setd["test_harness"],
+                          **self.defaults)
+                SE(step, "command").text = "execute"
+                params = SE(step, "params")
+                SE(params, "param", file=path(sdst[1]))
+                SE(params, "param", parameters=r"-lightxml -o %s\%s" % (path(self.QT_LOG_DIR),  no_dll_xml))
+                elem = SE(params, "param")
+                elem.set('result-file', path(self.QT_LOG_DIR) / no_dll_xml)
+                SE(params, "param", parser="QTestResultParser")
+                elem = SE(params, "param")
+                elem.set('delete-result',"true")
+                SE(params, "param", async="false")
+                SE(params, "param", timeout=time_out)
+
+                
+
+    def generate_run_steps(self, case, setd, time_out, eunit_flags):
+        """Generates run-steps"""
+        src_dst = setd["src_dst"]
+              
+        if setd["test_harness"] == "STIF":
+            self.generate_runsteps_stif(setd, case, src_dst, time_out)
+        if setd["test_harness"] == "GENERIC":
+            self.generate_runsteps_tef(setd, case, src_dst, time_out)
+        if setd["test_harness"] == "STIFUNIT":
+            self.generate_runsteps_stif(setd, case, src_dst, time_out)
+            
+        if setd["test_harness"] == "EUNIT":
+            self.generate_runsteps_eunit(setd, case, src_dst, time_out, eunit_flags)
+
+    def generate_install_step(self, case, step_type, filename, src_dir, 
+                              dst_dir, case_harness, src_dst=None):
+        """Generate install <step>."""
+        if src_dst == None or src_dst == []:
+            src_dst = []
+            step = SE(case, "step", name="Install %s: %s" % (step_type, filename), 
+                      harness=case_harness, **self.defaults)
+            SE(step, "command").text = "install"
+            params = SE(step, "params")
+            SE(params, "param", src=self.drop_path.joinpath(src_dir, filename))
+            SE(params, "param", dst=path(dst_dir).joinpath(filename))
+        else:
+            for sdst in src_dst:
+                dst = sdst[1]
+                type_ = sdst[2]
+                if "testmodule" in type_ or ".dll" in dst:
+                    src_dir = dst.replace(":","")
+                    src_dir = path(src_dir[:src_dir.rfind(os.sep)])
+                    step_type = type_
+                    filename = dst[dst.rfind(os.sep)+1:]
+                    step = SE(case, "step", name="Install %s: %s" % (step_type, filename), 
+                              harness=case_harness, **self.defaults)
+                    SE(step, "command").text = "install"
+                    params = SE(step, "params")
+                    SE(params, "param", src=self.drop_path.joinpath(src_dir, filename))
+                    SE(params, "param", dst=path(dst))
+            for sdst in src_dst:
+                dst = sdst[1]
+                type_ = sdst[2]
+                if "testmodule" not in type_ and ".dll" not in dst:
+                    src_dir = dst.replace(":","")
+                    src_dir = path(src_dir[:src_dir.rfind(os.sep)])
+                    step_type = type_
+                    filename = dst[dst.rfind(os.sep)+1:]
+                    step = SE(case, "step", name="Install %s: %s" % (step_type, filename), 
+                              harness=case_harness, **self.defaults)
+                    SE(step, "command").text = "install"
+                    params = SE(step, "params")
+                    SE(params, "param", src=self.drop_path.joinpath(src_dir, filename))
+                    SE(params, "param", dst=path(dst))
+
+    def drop_files(self, test_plan):
+        """Yield a list of drop files."""
+        drop_set = set()
+        drop_files = []
+        pkg_files = []
+        for setd in test_plan.sets:
+            drop_path = self.drop_path_root.joinpath(setd["name"])
+            if setd.has_key("sis_files") and setd["sis_files"]:
+                if setd.has_key("pmd_files") and setd["pmd_files"]:
+                    drop_files = ((drop_path.parent, "images", setd["image_files"]),
+                                  (drop_path.parent, "pmds", setd["pmd_files"]),
+                                  (drop_path, "sis", setd["sis_files"]),
+                                  (drop_path, "init", [setd["engine_ini_file"]]),
+                                  (drop_path, "trace_init", setd["trace_activation_files"]))
+                else:
+                    drop_files = ((drop_path.parent, "images", setd["image_files"]),
+                                  (drop_path, "sis", setd["sis_files"]),
+                                  (drop_path, "init", [setd["engine_ini_file"]]))
+            elif setd["src_dst"] == []:
+                if setd.has_key("pmd_files") and setd["pmd_files"]:
+                    drop_files = ((drop_path.parent, "images", setd["image_files"]),
+                                  (drop_path.parent, "pmds", setd["pmd_files"]),
+                                  (drop_path, "data", setd["data_files"]),
+                                  (drop_path, "conf", setd["config_files"]),
+                                  (drop_path, "testmodules", setd["testmodule_files"]),
+                                  (drop_path, "init", [setd["engine_ini_file"]]),
+                                  (drop_path, "trace_init", setd["trace_activation_files"]))
+                else:
+                    drop_files = ((drop_path.parent, "images", setd["image_files"]),
+                                  (drop_path, "data", setd["data_files"]),
+                                  (drop_path, "conf", setd["config_files"]),
+                                  (drop_path, "testmodules", setd["testmodule_files"]),
+                                  (drop_path, "init", [setd["engine_ini_file"]]))
+            elif setd["src_dst"] != []:
+                for x in setd["src_dst"]:
+                    src = x[0]
+                    dst = x[1]
+                    dst2 = dst.replace(":","")
+                    pkg_files.append((drop_path, dst2, src))
+                if setd.has_key("pmd_files") and setd["pmd_files"]:
+                    drop_files = ((drop_path.parent, "images", setd["image_files"]),
+                                  (drop_path.parent, "pmds", setd["pmd_files"]),
+                                  (drop_path, "trace_init", setd["trace_activation_files"]))
+                else:
+                    drop_files = ((drop_path.parent, "images", setd["image_files"]),)
+            for drop_dir, sub_dir, files in drop_files:
+                for file_path in files:
+                    if file_path != None:
+                        drop_file = drop_dir.joinpath(sub_dir, file_path.name)
+                        drop_file = drop_file.normpath()
+                        if drop_file not in drop_set:
+                            drop_set.add(drop_file)
+                            yield (drop_file, file_path.normpath())
+            for drop_dir, sub_dir, files in pkg_files:
+                drop_file = drop_dir.joinpath(sub_dir)
+                drop_file = drop_file.normpath()
+                file_path = path(files)
+                if drop_file not in drop_set:
+                    drop_set.add(drop_file)
+                    yield (drop_file, file_path.normpath())
+
+    def generate_files(self, test_plan):
+        """Generate the <files> section."""
+        files_elem = E("files")
+        for drop_file, _ in self.drop_files(test_plan):
+            SE(files_elem, "file").text = drop_file
+        return files_elem
+
+def generate_target(test_plan, root):
+    """Generate targets"""
+    harness = test_plan["harness"]
+    if harness == "MULTI_HARNESS":
+        input_targets(test_plan, root, ["STIF", "EUNIT"])
+    elif harness == "STIF":
+        input_targets(test_plan, root, ["STIF"])
+    elif harness == "EUNIT":
+        input_targets(test_plan, root, ["EUNIT"])
+    elif harness == "STIFUNIT":
+        input_targets(test_plan, root, ["STIFUNIT"])
+    elif harness == "GENERIC":
+        input_targets(test_plan, root, ["GENERIC"])
+                
+def input_targets(test_plan, root, harness_type):
+    """Append target(s) into the XML"""
+    target = E("target")
+    for har in harness_type:
+        device = SE(target, "device", rank="none", alias="DEFAULT_%s" % har)
+        SE(device, "property", name="HARNESS", value=har)
+        SE(device, "property", name="TYPE", value=test_plan["device_type"])
+        if test_plan["device_hwid"] != "":
+            SE(device, "property", name="HWID", value=test_plan["device_hwid"])
+        if test_plan["trace_enabled"] != "":
+            if test_plan["trace_enabled"].lower() == "true":
+                SE(device, "property", name="TRACE_ENABLED", value=test_plan["trace_enabled"])
+    root.append(target)
+
+
+def insert_custom_file(xmltree, filename):
+    """
+    Inserts into the given XML tree the given customization file
+    Broken input XML inserts a comment to the XML tree
+    """
+    try:
+        custom_action_file = codecs.open(filename, "r", "iso-8859-15")
+        loop = ''
+        cust = unicode(custom_action_file.read(1))
+        try:
+            # try to read the file  and addcharacter by character until the 
+            # elementtree is happy and then reset the loop and continue until the file is 
+            # completely processed. Known issue: file ending in comment will cause a warning.
+            while cust:
+                if loop != '' :
+                  # if we have something left from the previous try
+                    cust = loop + cust
+#                _logger.debug("what is cust  \n %s \n" % cust)
+                try: 
+                    xmltree.append(et.XML(cust.encode("ISO-8859-15")))
+                except ExpatError, err:
+#                    _logger.debug("Error %s in XML when prosessing file %s \n Line and column refer to section:\n%s\n" % ( err, filename, loop))
+                    loop = cust
+                else:
+                # clear the loop variable 
+                    loop = ''
+                cust = unicode(custom_action_file.read(1))
+        except Exception, err:
+            _logger.error("Error %s in XML when prosessing %s\n" % ( err, filename))
+            xmltree.append(et.Comment("Error in XML file when prosessing %s\n" % ( filename)))
+
+        if loop != '' :
+            # we should have used all the input and cleared loop variable
+            _logger.warning("Issues in customization file %s in XML when prosessing issue %s \n Line and column refer to section:\n%s\n" % ( filename, err,  loop))
+
+        custom_action_file.close()
+    except IOError, err:
+#        _logger.debug("This is for debugging only. Do not treat this as anything else. Anything is OK... The data: %s when prosessing %s\n" % (err, filename))
+        pass
+    else: 
+        _logger.info("Included file %s" % ( filename))
+
+def check_qt_harness(_setd_):
+    _setd_ = _setd_
+    is_qt_test = False
+    if _setd_.has_key("sis_files"):
+        _dict_key_ = "sis_files"
+    else:
+        _dict_key_ = "src_dst"
+        
+    for _srcdst_ in _setd_[_dict_key_]:
+        if "testmodule:qt" == _srcdst_[2]:
+            is_qt_test = True
+    return is_qt_test 
+
+def check_mtf_harness(_setd_):
+    for _srcdst_ in _setd_['src_dst']:
+        if _srcdst_[2] == "testscript:mtf":
+            return True
+    return False
+
+def generate_post_actions(test_plan):
+    """Generate post actions."""
+    import string
+    actions = []
+    
+    if not test_plan.custom_dir is None:
+        insert_custom_file(actions, test_plan.custom_dir.joinpath("prepostaction.xml"))
+    
+    for action_type, parameters in test_plan.post_actions:
+        action = E("postAction")
+        SE(action, "type").text = action_type
+        params = SE(action, "params")
+        for name, value in parameters:
+            SE(params, "param", name=name, value=value)
+        actions.append(action)
+
+    if not test_plan.custom_dir is None:
+        insert_custom_file(actions, test_plan.custom_dir.joinpath("postpostaction.xml"))
+
+    return actions
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/matti/MattiDrops.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,239 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================
+#Name        : MattiDrops.py
+#Part of     : Helium
+    
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: Script for test drop generation and sending to execution to 
+#ATS3-system
+#===============================================================================
+
+import os
+import re
+import sys
+import string
+import zipfile
+import logging 
+from optparse import OptionParser
+from xml.etree import ElementTree as et
+from xml.sax.saxutils import quoteattr
+from xml.dom.minidom import Document
+from jinja2 import Template, Environment, PackageLoader
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Configuration(object):
+    """
+    ATS3 drop generation configuration.
+    """
+    
+    def __init__(self, opts):
+        """
+        Initialize from optparse configuration options.
+        """
+        self._opts = opts
+        
+        # Customize some attributes from how optparse leaves them.
+        self.build_drive = os.path.normpath(self._opts.build_drive)
+        self.file_store = os.path.normpath(self._opts.file_store)
+        self.matti_scripts = os.path.normpath(self._opts.matti_scripts)
+        self.template_location = os.path.normpath(self._opts.template_loc)
+        if self._opts.flash_images:
+            self.flash_images = self._opts.flash_images.split(',')
+        else:
+            self.flash_images = []
+            logging.error("No flash files defined!")
+        if not re.search(r'\A\s*?\Z', self._opts.sis_files):
+            self.sis_files = self._opts.sis_files.split(',')
+        else:
+            self.sis_files = None
+        self.step_list = []
+        self.filelist = []
+        self.image_list = []
+        self.sis_list = []
+        self.device_type = self._opts.device_type
+        self.device_hwid = self._opts.device_hwid
+        self.drop_file = self._opts.drop_file
+        self.minimum_flash_images = self._opts.minimum_flash_images
+        self.plan_name = self._opts.plan_name
+        self.test_timeout = self._opts.test_timeout 
+        self.diamonds_build_url = self._opts.diamonds_build_url
+        self.testrun_name = self._opts.testrun_name    
+        self.report_email = self._opts.report_email
+        self.harness = self._opts.harness
+        self.sis_enabled = False
+        if self.sis_files:
+            if len(self.sis_files) >= 1:
+                self.sis_enabled = True
+        
+    
+    def __getattr__(self, attr):
+        return getattr(self._opts, attr)
+    
+    def __str__(self):
+        dump = "Configuration:\n"
+        seen = set()
+        for key, value in vars(self).items():
+            if not key.startswith("_"):
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)
+        for key, value in vars(self._opts).items():
+            if key not in seen:
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)                
+        return dump
+            
+class MattiDrop(object):
+    """
+    ATS3 testdrop generation for MATTI tool
+    """
+    
+    def __init__(self, config=None):
+        self.configuration = config
+        self.matti_cases = {}
+        self.tmp_path = os.getcwd()
+        self.files = []
+        self.test_files = []
+    
+    def fetch_testfiles(self):
+        """Needed flash files, sis-files and testscripts from given matti scripts -folder are added to file list."""
+        tmp_case_list = []
+#        tmp_image_list = []
+        os.chdir(os.path.normpath(self.configuration.matti_scripts))
+        try:
+            for path, subdirs, names in os.walk(os.getcwd()):
+                for name in names:
+                    if re.search(r'.*?[.]rb\Z', name):
+                        tmp_case_list.append((os.path.normpath(os.path.join(path, name)), os.path.join("ATS3Drop", "MATTISCRIPTS", name)))
+            if tmp_case_list:
+                for tmp_case in tmp_case_list:
+                    self.configuration.step_list.append(dict(path=os.path.join("&#x00A7;TEST_RUN_ROOT&#x00A7;", str(tmp_case[1])), name="Test case"))
+            if self.configuration.flash_images:
+                for image in self.configuration.flash_images:
+                    tmp = string.rsplit(image, os.sep)
+                    image_name = tmp[len(tmp)-1] 
+                    self.configuration.image_list.append(os.path.join("ATS3Drop", "images", image_name))
+            if self.configuration.sis_files:
+                for sis in self.configuration.sis_files:
+                    tmp = string.rsplit(sis, os.sep)
+                    sis_name = tmp[len(tmp)-1] 
+                    self.configuration.sis_list.append(dict(path=os.path.join("ATS3Drop", "sis", sis_name), dest=sis_name))
+        except KeyError, error:
+            logging.error("Error in file reading / fetching!")
+            sys.stderr.write(error)
+        if tmp_case_list:
+            for tmp_case in tmp_case_list:
+                self.configuration.filelist.append(tmp_case[1])
+            return tmp_case_list
+        else:
+            logging.error("No test cases/files available!")
+            return None
+    
+    
+    def create_testxml(self):
+        """This method will use Jinja2 template engine for test.xml creation"""
+        os.chdir(self.tmp_path)
+        env = Environment(loader=PackageLoader('MattiDrops', 'template'))
+        template = env.from_string(open(self.configuration.template_location).read())
+        xml_file = open("test.xml", 'w')
+        xml_file.write(template.render(configuration=self.configuration))
+        xml_file.close()
+    
+    def create_testdrop(self, output_file=None, file_list=None):
+        """Creates testdrop zip-file to given location."""
+        #env = Environment(loader=PackageLoader('MattiDrops', 'template'))
+        os.chdir(self.tmp_path)
+        if output_file and file_list:
+            zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
+            try:
+                logging.info("Adding files to testdrop:")
+                for src_file, drop_file in file_list:
+                    logging.info("   + Adding: %s" % src_file.strip())
+                    zfile.write(str(src_file.strip()), str(drop_file))
+                if self.configuration.flash_images:
+                    for image in self.configuration.flash_images:
+                        tmp = string.rsplit(image, os.sep)
+                        image_name = tmp[len(tmp)-1] 
+                        logging.info("   + Adding: %s" % image_name)
+                        zfile.write(image, os.path.join("ATS3Drop", "images", image_name))
+                if self.configuration.sis_enabled:
+                    if self.configuration.sis_files:
+                        for sis in self.configuration.sis_files:
+                            tmp = string.rsplit(sis, os.sep)
+                            sis_name = tmp[len(tmp)-1] 
+                            logging.info("   + Adding: %s" % sis_name)
+                            zfile.write(sis, os.path.join("ATS3Drop", "sis", sis_name))
+                zfile.write(os.path.normpath(os.path.join(os.getcwd(),"test.xml")), "test.xml")
+            finally:
+                logging.info("Testdrop created! %s" % output_file)            	   
+                zfile.close()
+            return zfile
+    
+def create_drop(configuration):
+    """Testdrop creation"""
+    if configuration:
+        md = MattiDrop(configuration)
+        md.fetch_testfiles()
+        md.create_testxml()
+        return md.create_testdrop(configuration.drop_file, md.fetch_testfiles())
+    else:
+        logging.error("No configuration available for test drop creation")        
+        
+def main():
+    """Main entry point."""    
+    cli = OptionParser(usage="%prog [options] TSRC1 [TSRC2 [TSRC3 ...]]")
+    cli.add_option("--build-drive", help="Build area root drive", default='X:')
+    cli.add_option("--matti-scripts", help="Path to the directory where the MATTI test scripts are saved.", default="")
+    cli.add_option("--flash-images", help="Flash image files as a list",
+                   default="")
+    cli.add_option("--report-email", help="Email notification receivers", 
+                   default="")
+    cli.add_option("--harness", help="Test harness (default: %default)",
+                   default="unknown")
+    cli.add_option("--file-store", help="Destination path for reports.",
+                   default="")
+    cli.add_option("--testrun-name", help="Name of the test run", 
+                   default="run")
+    cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", 
+                   default="unknown")
+    cli.add_option("--device-hwid", help="Device hwid", 
+                   default="")
+    cli.add_option("--diamonds-build-url", help="Diamonds build url")
+    cli.add_option("--drop-file", help="Name for the final drop zip file",
+                   default="")
+    cli.add_option("--minimum-flash-images", help="Minimum amount of flash images",
+                   default=2)    
+    cli.add_option("--plan-name", help="Name of the test plan", 
+                   default="plan")
+    cli.add_option("--sis-files", help="Sis files as a list",
+                   default="")
+    cli.add_option("--template-loc", help="location of template file",
+                   default="..\template")
+    cli.add_option("--test-timeout", help="Test execution timeout value (default: %default)",
+                   default="60")
+    cli.add_option("--verbose", help="Increase output verbosity", 
+                   action="store_true", default=True)
+    opts, tsrc_paths = cli.parse_args()
+
+    if opts.verbose:
+        logging.basicConfig(level=logging.DEBUG)
+    config = Configuration(opts)
+    create_drop(config)
+    
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/matti/template/matti_demo.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- 
+============================================================================ 
+Name        : matti.demo.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+--><test>
+  <name>{{ configuration.testrun_name }}</name>
+  <target>
+    <device alias="{{ configuration.harness }}" rank="none">
+      <property name="HARNESS" value="{{ configuration.harness }}"/>
+      <property name="TYPE" value="{{ configuration.device_type }}"/>
+      <property name="HARDWARE" value="{{ configuration.device_type }}"/>
+    </device>
+  </target>
+  <plan passrate="100" enabled="true" name="MATTI test {{ configuration.plan_name }}" significant="false" harness="{{ configuration.harness }}">
+    <session name="session" harness="{{ configuration.harness }}" enabled="true" passrate="100">
+    	{%- set i = 0 -%}
+    	<set name="MATTI test set{{ i }}" harness="{{ configuration.harness }}" enabled="true" passrate="100">
+    			<target>
+          	<device alias="{{ configuration.harness }}" rank="master"/>
+        	</target>
+    			<case name="MATTI test case" passrate="100" harness="STIF" enabled="true" significant="false"> 
+          {% if configuration.image_list -%}
+          	{% for flash in configuration.image_list -%}
+          	<flash target-alias="{{ configuration.harness }}" images="{{ flash }}" />
+          	{% endfor -%}
+          {% endif %}
+          <step name="Create logs folder" harness="STIF" enabled="true" passrate="100" significant="false">
+          <command>makedir</command>
+                        <params>
+                            <param dir="c:\logs\testability"/>
+                        </params>
+          </step>
+          {% if configuration.sis_list -%}
+          	{% for sis in configuration.sis_list -%}
+          	<step name="Copy sis" harness="STIF" enabled="true" passrate="100" significant="false">
+                        <command>install</command>
+                        <params>
+                            <param src="{{ sis['path'] }}"/>
+                            <param dst="E:\{{ sis['dest'] }}"/>
+                            <param overwrite="false"/>
+                        </params>
+                    </step>
+
+                    <step name="Install SIS" harness="STIF" enabled="true" passrate="100" significant="false">
+	                    <command>install-software</command>
+		    								<params>
+                            <param sisPackageName="E:\{{ sis['dest'] }}"/>
+                            <param upgradeAllowed="true"/>
+                            <param optionalItemsAllowed="true"/>
+                            <param OCSP_Done="true"/>
+                            <param ignoreOCSPWarnings="true"/>
+                            <param untrustedAllowed="true"/>
+                            <param packageInfoAllowed="true"/>
+                            <param userCapGranted="true"/>
+                            <param killApp="true"/>
+                            <param overWriteAllowed="true"/>
+                            <param downloadAllowed="false"/>
+                            <param downloadUsername="user"/>
+                            <param downloadPassword="passwd"/>
+                            <param installDrive="C"/>
+                            <param upgradeData="true"/>
+                            <param timeout="40"/>                       	
+										    </params>
+										</step>
+          	{% endfor -%}
+          {% endif %}          
+          {% for step in configuration.step_list -%}
+          <step name="{{ step['name'] }}" harness="{{ configuration.harness }}" enabled="true" passrate="100" significant="false">
+                        <command>execute</command>
+                        <params>
+    			    							<param dir="C:\ruby\bin\"/>
+    			    							<param file="C:\ruby\bin\ruby.exe"/>
+                            <param parameters="{{ step['path'] }}"/>
+                            <param timeout="60"/>
+                            <param local="true"/>
+                            <param async="false"/>
+			    									<param needs-connection="true"/>
+                        </params>
+                    </step>
+          {% endfor -%}
+          </case>
+      </set>
+      {%- set i = i + 1 -%}
+    </session>
+  </plan>
+  {% if configuration.report_email %}
+  <postAction>
+        <type>SendEmailAction</type>
+        <params>
+            <param name="subject" value="ATS3 report for &#x00A7;RUN_NAME&#x00A7; &#x00A7;RUN_START_DATE&#x00A7; &#x00A7;RUN_START_TIME&#x00A7;"/>
+            <param name="type" value="ATS3_REPORT"/>
+            <param name="send-files" value="true"/>
+            <param name="to" value="{{ configuration.report_email }}"/>
+        </params>
+    </postAction>
+  {% endif %}
+  {% if configuration.filelist %}
+  <files>
+  	{% for img in configuration.image_list -%}
+  	<file>{{ img }}</file>
+    {% endfor -%}
+    {% for sis in configuration.sis_list -%}
+  	<file>{{ sis['path'] }}</file>
+    {% endfor -%}
+  	{% for file in configuration.filelist -%}
+  	<file>{{ file }}</file>
+    {% endfor -%}
+  </files>
+  {% endif %}
+</test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/parsers.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,735 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : parsers.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" The ATS related parsers """
+
+
+#w0142 => * and ** were used
+#F0401 => pylint didn't find "path" module
+#C0302 => Too many lines
+
+
+import os
+import re
+import sys
+import string
+import logging
+from path import path
+from textwrap import dedent
+import fnmatch
+import subprocess
+import codecs
+
+_logger = logging.getLogger('ats-parser')
+
+import configuration
+def split_config_to_attributes_and_properties(specfile):
+    """Split the specfile to its parts"""
+    attributes = {}
+    properties = {}
+    builder = configuration.NestedConfigurationBuilder(specfile)
+    configs = builder.getConfigurations()
+    # the supported configs are either attributes or properties
+    # collect each in a dictionary and return them.
+    for config in configs:
+        if config.name == 'attributes' :
+            for attr in config:
+                attributes[attr] = config[attr]
+        if config.name == 'properties' :
+            for prop in config:
+                properties[prop] = config[prop]
+    return (properties, attributes)
+
+
+class CppParser(object):
+    """
+    Parser for CPP tool output. Returns cleaned output from the execution
+    of CPP with or without parent paths included in the output.
+    """
+
+    def __init__(self):
+        pass
+
+    def get_cpp_output(self, bld_path = None, output_parameter = "n", imacros = None):
+        """
+        To clean out conditionals from the compilation it is necessary to 
+        use C preprocessing to clean out those.
+        
+        If ('n' - normal) output is chosen, parser returns list of paths
+        If ('e' - extended) output is chosen parser returns list of (path, parent_path) tuples
+        If ('d' - dependency) output is chosen parser returns a dicitionary (can be a nested dictionary) 
+                  of paths dependency (-ies). 
+                  
+        'imacros' can also be given as parameters for CPP options.
+        
+        if bld file is not given, the function will try to find the file(s) on the given location with extension ".inf"
+        """
+
+        clean_path_list = []
+        path_list = []
+        temp_path = os.getcwd()
+        if "bld.inf" in str(bld_path).lower():
+            os.chdir(os.path.normpath(os.path.join(bld_path, os.pardir)))
+        else:
+            os.chdir(os.path.normpath(os.path.join(bld_path)))
+        if imacros is not None:
+            includedir = os.path.join(os.path.splitdrive(bld_path)[0] + os.sep, 'epoc32', 'include')
+            command = r"cpp -imacros %s -I %s bld.inf" % (str(imacros), includedir)
+        else:
+            command = u"cpp bld.inf"
+        process = subprocess.Popen(command, shell = True, stdout = subprocess.PIPE)
+        pipe = process.stdout
+        
+        if output_parameter == "d":
+            return self.create_dependency_dictionary(pipe, bld_path)
+
+        for line in pipe.readlines():
+            #_logger.debug(line.strip())
+            if re.search(r"\A#\s.*?", line.strip()) or re.search(r"\A#.*?[0-9]", line.strip()):
+                if line.strip() not in path_list:
+                    path_list.append(line.strip())
+        process.wait()
+        if process.returncode == 1:
+            _logger.error('CPP failed: ' + command + ' in: ' + os.getcwd())
+        pipe.close()
+
+        os.chdir(temp_path)
+        if output_parameter is "n":
+            for _path in self.clean_cpp_output(bld_path, path_list):
+                clean_path_list.append(_path[0])
+        elif output_parameter is "e":
+            clean_path_list = self.clean_cpp_output(bld_path, path_list)
+
+        clean_path_list = list(set(clean_path_list))
+
+        bfp = BldFileParser()
+
+        for tsrc in clean_path_list:
+            mmp_path = bfp.get_test_mmp_files(tsrc[0])
+            if tsrc[0] == tsrc[1]:
+                if mmp_path == None or mmp_path == []:
+                    clean_path_list.remove(tsrc)
+
+        return clean_path_list
+    
+    def create_dependency_dictionary(self, _pipe_, path_to_bld):
+        """
+        The output from CPP is cleaned in a fashion that the output is
+        a dictionary (or nested dictionary) of paths and their dependencies.
+        """
+        bld_parser = BldFileParser()
+        pkg_parser = PkgFileParser()
+        mmp_parser = MmpFileParser()
+        
+        temp_path = os.getcwd()
+        parent = os.getcwd()
+        self.path_to_bld = path_to_bld
+        
+        test_sets = {}
+        harness = ""
+        main_level = ""
+        test_case = []
+        test_cases = []
+        output_list = []
+        for line in _pipe_.readlines():
+            if re.match(r"#.*", line.lower()):
+                #_logger.debug(line)
+                tpat =  re.findall(r'"(.*bld.inf?)"', line.lower())
+                if tpat != []:
+                    output_list.append((line, os.path.dirname(os.path.normpath(os.path.join(self.path_to_bld, tpat[0])))))
+        _pipe_.close()
+        
+        #Creating dependencies
+        for case in output_list:
+            if re.match(r".*[bld.inf][^0-9]\Z", string.strip(string.lower(case[0]))):
+                
+                if main_level == "":
+                    main_level = case[1]
+                parent = case[1]
+                os.chdir(case[1])
+                test_cases.append((parent, case[1]))
+            elif re.match(r".*[1]\Z", string.strip(string.lower(case[0]))):
+                parent = os.getcwd()
+                os.chdir(case[1])
+                
+                test_cases.append((parent, case[1]))
+            elif re.match(r".*[2]\Z", string.strip(string.lower(case[0]))):
+                if test_cases:
+                    for tcase in test_cases:
+                        if parent in tcase[1]:
+                            parent = tcase[0]
+                            os.chdir(tcase[1])
+                            break
+                        
+        for t_case in test_cases:
+            if t_case[0] == t_case[1] and (not bld_parser.get_test_mmp_files(t_case[1])):
+                del t_case
+            elif t_case[0] in main_level:
+                test_sets[t_case[1]] = {}
+                test_sets[t_case[1]]['content'] = {}
+                test_sets[t_case[1]]['content'][t_case[1]] = {}
+                harness = mmp_parser.get_harness(t_case[1])
+                #if harness == "": harness = None
+                test_sets[t_case[1]]['content'][t_case[1]]['type'] = mmp_parser.get_dll_type(t_case[1])
+                test_sets[t_case[1]]['content'][t_case[1]]['harness'] = harness
+                test_sets[t_case[1]]['content'][t_case[1]]['pkg_files'] = pkg_parser.get_pkg_files(t_case[1], False)
+                test_sets[t_case[1]]['content'][t_case[1]]['mmp_files'] = bld_parser.get_test_mmp_files(t_case[1], False)
+            else:
+                for key, value in test_sets.items():
+                    if t_case[0] in value['content'].keys():
+                        harness = mmp_parser.get_harness(t_case[1])
+                        if harness is "" or harness in test_sets[key]['content'][t_case[0]]['harness']:
+                            test_sets[key]['content'][t_case[1]] = {}
+                            test_sets[key]['content'][t_case[1]]['type'] = mmp_parser.get_dll_type(t_case[1])
+                            test_sets[key]['content'][t_case[1]]['harness'] = harness
+                            test_sets[key]['content'][t_case[1]]['pkg_files'] = pkg_parser.get_pkg_files(t_case[1], False)
+                            test_sets[key]['content'][t_case[1]]['mmp_files'] = bld_parser.get_test_mmp_files(t_case[1], False)
+                        else:
+                            test_sets[t_case[1]] = {}
+                            test_sets[t_case[1]]['content'] = {}
+                            test_sets[t_case[1]]['content'][t_case[1]] = {}
+                            test_sets[t_case[1]]['content'][t_case[1]]['type'] = mmp_parser.get_dll_type(t_case[1])
+                            test_sets[t_case[1]]['content'][t_case[1]]['harness'] = harness
+                            test_sets[t_case[1]]['content'][t_case[1]]['pkg_files'] = pkg_parser.get_pkg_files(t_case[1], False)
+                            test_sets[t_case[1]]['content'][t_case[1]]['mmp_files'] = bld_parser.get_test_mmp_files(t_case[1], False)
+
+        os.chdir(temp_path)
+        if test_sets == {}:
+            for x in output_list:
+                _logger.debug(x)
+            for x in test_cases:
+                _logger.debug(x)
+            _logger.error(path_to_bld + ' test_sets are empty')
+        return test_sets
+
+    
+    def clean_cpp_output(self, bld_path, path_list):
+        """
+        The output from CPP needs to be "cleaned" so that extra chars needs
+        to be removed and also hierarchy which cpp is following is preserved
+        and returned as an output. 
+        """
+
+        pat = ""
+        value = ""
+        cleaned_output = []
+        if "bld.inf" in bld_path:
+            path_to_parent = os.path.dirname(bld_path)
+        else:
+            path_to_parent = bld_path
+        pat = re.compile(r'\A#\s*?.*?[\"](.*?)[\"].*?')
+        for _path in path_list:
+            if re.match(r".*[bld.inf]\s*?[^0-9]\Z", string.strip(string.lower(_path))):
+                value = pat.match(_path.strip())
+                path_to_tc = os.path.dirname(os.path.normpath(os.path.join((bld_path), value.group(1))))
+                cleaned_output.append((path_to_tc, path_to_parent))
+            if re.match(r".*[1]\s*?\Z", string.strip(string.lower(_path))):
+                value = pat.match(_path.strip())
+                path_to_tc = os.path.dirname(os.path.normpath(os.path.join(bld_path, value.group(1))))
+                cleaned_output.append((path_to_tc, path_to_parent))
+            if re.match(r".*[2]\s*?\Z", string.strip(string.lower(_path))):
+                if cleaned_output:
+                    for cout in cleaned_output:
+                        if string.lower(path_to_parent) == string.lower(cout[0]):
+                            path_to_tc = cout[1]
+            path_to_parent = path_to_tc
+        return cleaned_output
+
+
+class BldFileParser(object):
+    """
+    Parser for bld.inf files. Returns MACRO values.
+    Parsing Paths can be done using CPP parser  
+    """
+    def __init__(self):
+        pass
+
+    #def get_mmp_files():
+    #    """
+    #    returns mmp files from PRJ_MMPFILES macro
+    #   """    
+
+    def get_test_mmp_files(self, bld_file_path = None, with_full_path = True):
+        """
+        returns a list of test mmp files 
+        Usage: if "x:\abc\bldfile", "PRJ_TESTMMPFILES". 
+        1. get_test_mmp_files("x:\abc\bldfile") - with full paths e.g. ["x:\abc\abc.mmp"]
+        2. get_test_mmp_files("x:\abc\bldfile", False) - without full paths e.g. ["abc.mmp"]
+        
+        if bld file is not given, the function will try to find the file(s) on the given location with extension ".inf"
+        """
+        
+        if bld_file_path == None:
+            _logger.warning("Incorrect bld file")
+            return None
+        else:
+            self.bld_file_path = path(bld_file_path)
+            if not "bld.inf" in str(self.bld_file_path).lower():
+                self.bld_file_path = os.path.join(os.path.normpath(self.bld_file_path), "bld.inf")
+
+            if not os.path.exists(self.bld_file_path):
+                _logger.error(r"bld file path does not exist: '%s'" % self.bld_file_path)
+                return None
+
+        return self.get_files(path(self.bld_file_path), "PRJ_TESTMMPFILES", with_full_path)
+
+
+    def get_files(self, bld_inf_path, bld_macro, with_full_path = True):
+        """
+        Component's MMP files, as stored in BLD.INF.
+        """
+        
+        mmp_files = []
+        self.bld_inf_path = path(bld_inf_path)
+        bld_inf = self.bld_inf_path.text()
+        if bld_inf.count(bld_macro) > 1:
+            _logger.error(bld_macro + ' in ' + bld_inf_path + ' more than once')
+        try:
+            bld_inf = re.compile(r"%s" % bld_macro).split(bld_inf)[1].strip()
+            bld_inf = re.compile(r"PRJ_+\S").split(bld_inf)[0].strip()
+            
+        except IndexError:
+            try:
+                bld_inf = re.compile(r"%s" % bld_macro).split(bld_inf)[0].strip()
+                bld_inf = re.compile(r"PRJ_+\S").split(bld_inf)[0].strip()
+                
+            except IndexError:
+                _logger.warning("Index Error while parsing bld.inf file")
+        
+        comments_free_text = self.ignore_comments_from_input(bld_inf)
+        
+        mmp_files = re.findall(r"(\S+?[.]mmp)", comments_free_text)
+        
+        
+        
+        if with_full_path:
+            self.bld_dir = self.bld_inf_path.dirname()
+            return [path.joinpath(self.bld_dir, mmp).normpath()
+                    for mmp in mmp_files]
+        else:
+            return mmp_files
+
+    def ignore_comments_from_input(self, input_str = ""):
+        """
+        Removes comments from the input string. Enables the use of examples
+        in bld.inf.
+        """
+        _input = ""
+        for i in input_str.split("\n"):
+            _input += "\n" + i.split("//")[0]
+
+        if not _input == "":
+            input_str = _input
+        count = input_str.count("/*")
+        count2 = input_str.count("*/")
+        if (count == count2):
+            idx_1 = input_str.find('/*')
+            idx_2 = input_str.find('*/') + 2
+            while count > 0:
+                substr_1 = input_str[:idx_1].strip()
+                substr_2 = input_str[idx_2:].strip()
+                input_str = substr_1 + " " + substr_2
+                idx_1 = input_str.find('/*')
+                idx_2 = input_str.find('*/') + 2
+                count = input_str.count('/*')
+            return input_str.strip()
+        else:
+            _logger.warning("Comments in bld.inf-file inconsistent. "
+                            "Check comments in bld.inf.")
+            return input_str.strip()
+
+
+    #def get_exports():
+    #    """
+    #    returns exports from the macro PRJ_EXPORTS
+    #    """
+
+class MmpFileParser(object):
+    """
+    Parser for .mmp files. Returns wanted information from the mmp-file
+    - file type (executable dll, plugin, exe, etc)
+    - test harness (STIF, EUNIT) if mmp is related to the test component
+    - file name
+    - libraries listed in the mmp
+    """
+
+    def __init__(self):
+        pass
+
+    def get_target_filetype(self, path_to_mmp = None):
+        """
+        Filetype given using TARGETTYPE in .mmp file is returned.
+        If "c:\path\to\mmp" is a location where mmp file is stored
+        get_target_filetype("c:\path\to\mmp")
+        
+        if mmp file is not given, the function will try to find the file(s) on the given location with extension ".mmp"
+        """
+        return self.read_information_from_mmp(path_to_mmp, 4)
+
+    def get_target_filename(self, path_to_mmp = None):
+        """
+        Filename given using TARGET in .mmp file is returned
+        If "c:\path\to\mmp" is a location where mmp file is stored
+        get_target_filename("c:\path\to\mmp")
+        
+        if mmp file is not given, the function will try to find the file(s) on the given location with extension ".mmp"
+        """
+        return self.read_information_from_mmp(path_to_mmp, 3)
+
+    def get_libraries(self, path_to_mmp = None):
+        """
+        Libraries listed in the MMP file are returned in a list
+        If "c:\path\to\mmp" is a location where mmp file is stored
+        get_libraries("c:\path\to\mmp")
+        
+        if mmp file is not given, the function will try to find the file(s) on the given location with extension ".mmp"
+        """
+        return self.read_information_from_mmp(path_to_mmp, 5)
+
+    def get_harness(self, path_to_mmp = None):
+        """
+        Returns harness of test component
+        If "c:\path\to\mmp" is a location where mmp file is stored
+        get_harness("c:\path\to\mmp")
+        
+        if mmp file is not given, the function will try to find the file(s) on the given location with extension ".mmp"
+        """
+        return self.read_information_from_mmp(path_to_mmp, 6)
+
+    def get_dll_type(self, path_to_mmp = None):
+        """
+        Returns type of test whether 'executable' or 'dependent' (dependent can be a stub or plugin)
+        If "c:\path\to\mmp" is a location where mmp file is stored
+        get_dll_type("c:\path\to\mmp")
+        
+        if mmp file is not given, the function will try to find the file(s) on the given location with extension ".mmp"
+        """
+        return self.read_information_from_mmp(path_to_mmp, 7)
+
+    def read_information_from_mmp(self, path_to_mmp, flag = 0):
+        """
+        Returns wanted information - user can define 
+        the wanted information level by setting a flag
+        value following way:
+        0 - (targetfilename, filetype, libraries, harness)
+        1 - (targetfilename, filetype, libraries)
+        2 - (targetfilename, filetype)
+        3 - targetfilename
+        4 - filetype
+        5 - libraries
+        6 - harness (in case of test component)
+        7 - mmpfilename
+        """
+
+
+        filename = ""
+        filetype = ""
+        dll_type = ""
+        libraries = []
+        self.mmp_files = []
+        lst_mmp_paths = []
+        harness = ""
+        stif = False
+        eunit = False
+        stifunit = False
+        tef = False
+        self.path_to_mmp = path_to_mmp
+        try:
+            if isinstance(path_to_mmp, list):
+                lst_mmp_paths = self.path_to_mmp
+            else:    
+                self.path_to_mmp = path(self.path_to_mmp)
+                if not ".mmp" in str(self.path_to_mmp).lower():
+                    bld_parser = BldFileParser()
+                    self.mmp_files = bld_parser.get_test_mmp_files(self.path_to_mmp, False)
+    
+                    for mpath in self.mmp_files:
+                        lst_mmp_paths.append(os.path.join(self.path_to_mmp, mpath))
+                else:
+                    lst_mmp_paths.append(self.path_to_mmp)
+
+            for mmp in lst_mmp_paths:
+                mmp_file = open(mmp, 'r')
+                for line in mmp_file:
+                    if re.match(r"\A(target\s).*([.]\w+)", string.strip(string.lower(line))):
+                        filename = re.findall(r"\Atarget[\s]*(\w+[.]\w+)", string.lower(line))[0]
+                    elif re.match(r"\A(targettype\s).*", string.strip(string.lower(line))):
+                        filetype = re.findall(r"\Atargettype[\s]*(\w+)", string.lower(line))[0]
+
+                libraries = libraries + re.findall(r"\b(\w+[.]lib)\b", mmp.text().lower())
+                if '//rtest' in mmp.text().lower() or '* rtest' in mmp.text().lower() or '// rtest' in mmp.text().lower():
+                    libraries.append('rtest')
+            
+            if libraries:
+                if "stiftestinterface.lib" in libraries:
+                    stif = True
+                if "eunit.lib" in libraries or "qttest.lib" in libraries:
+                    eunit = True
+                if "stifunit.lib" in libraries:
+                    stifunit = True
+                elif "testexecuteutils.lib" in libraries or 'testframeworkclient.lib' in libraries or 'rtest' in libraries:
+                    tef = True
+#                else:
+#                    _logger.debug('No harness found')
+#                    _logger.debug(lst_mmp_paths)
+#                    _logger.debug(libraries)
+            if tef:
+                harness = "GENERIC"
+            elif stif and eunit:
+                #_logger.warning("both eunit.lib and stiftestinterface.lib listed in mmp file - choosing STIF.")
+                harness = "STIF"
+            elif stif and not eunit:
+                harness = "STIF"
+            elif eunit and not stif:
+                harness = "EUNIT"
+            elif stifunit and not stif and not eunit:
+                harness = "STIFUNIT"
+
+            if harness is "":
+                dll_type = "dependent"
+            elif harness is "EUNIT":
+                dll_type = "executable"
+            elif harness is "STIF":
+                dll_type = "executable"
+
+
+        finally:
+            if flag == 0:
+                return (filename, filetype, libraries, harness)
+            elif flag == 1:
+                return (filename, filetype, libraries)
+            elif flag == 2:
+                return (filename, filetype)
+            elif flag == 3:
+                return filename
+            elif flag == 4:
+                return filetype
+            elif flag == 5:
+                return libraries
+            elif flag == 6:
+                return harness
+            elif flag == 7:
+                return dll_type
+
+class PkgFileParser(object):
+    """
+    Parses .pkg files. Returns a list of:
+      a. src path of the file
+      b. dst path on the phone
+      c. type of the file
+    for every file in the pkg file
+    """
+
+    def __init__(self, platform = None):
+        self.platform = platform
+
+    def get_pkg_files(self, location = None, with_full_path = True):
+        """
+        Returns list of PKG files on the given location. If True, full path is returned 
+        otherwise only filenames. Default is set to True
+        
+        Assume at location "c:\abd\files", two pkg file '1.pkg' and '2.pkg', then the funtion
+        can be called as:
+        1. get_pkg_files("c:\abd\files")        - will return a list of pkg files with full paths. 
+                                                  like ['c:\abd\files\1.pkg', 'c:\abd\files\2.pkg']
+        2. get_pkg_files("c:\abd\files", False) - will return a list of pkg files only. 
+                                                  like ['1.pkg', '2.pkg']
+        """
+        self.location = path(location)
+        self.pkg_files = []
+        if not self.location.exists():
+            return None
+
+        for p, subdirs, files in os.walk(self.location):
+            pfiles = [f for f in files if self.platform != None and f.endswith(self.platform)]
+            if self.platform != None and len(pfiles)>0:
+                if with_full_path:
+                    self.pkg_files.append(os.path.join(p, pfiles[0]))
+                else:
+                    self.pkg_files.append(str(pfiles[0]))
+            else:
+                for name in files:
+                    if fnmatch.fnmatch(name, "*.pkg"):
+                        if with_full_path:
+                            self.pkg_files.append(os.path.join(p, name))
+                        else:
+                            self.pkg_files.append(str(name))
+
+        return self.pkg_files
+
+    def get_data_files(self, location = [], drive = "", exclude = ""):
+        """
+        Returns data files, source and destination of the files to be installed 
+        on the phone 
+        e.g. location = tsrc\testComponent\group
+        
+        Function can be called in any of the following ways:
+        1. get_data_files("c:\abc\abc.pkg")                 - only data files' paths are returnd 
+                                                              as they are mention in the pkg file
+        2. get_data_files("c:\abc\abc.pkg", "x:")           - Proper data files' paths are returnd 
+                                                              with drive letter included 
+        3. get_data_files("c:\abc\abc.pkg", "x:", "\.dll")  - Data files' paths are returnd with 
+                                                              drive letter included but the dll 
+                                                              files will be excluded if found in 
+                                                              the pkg file
+        
+        if pkg file is not given, the function will try to find the file(s) on the given location with extension ".pkg"
+        """
+
+        self.drive = drive
+        self.exclude = exclude
+        self._files = []
+
+        if type(location) is not list:
+            locations = [location]
+        else:
+            locations = location
+        
+        for _file_ in locations:
+            
+            #if location is already a file
+            if ".pkg" in str(_file_).lower():
+                self._files = _file_
+            else:
+                self.location = path(_file_)
+
+                if not self.location.exists():
+                    continue
+                for p_file in self.get_pkg_files(self.location, True):
+                    self._files.append(p_file)
+
+        return self.__read_pkg_file(self._files)
+
+    def __map_pkg_path(self, pkg_line, pkg_file_path, pkg_file):
+        """Parse package file to get the src and dst paths" for installing files"""
+        mmp_parser = MmpFileParser()
+        ext = ""
+        val1 = ""
+        val2 = ""
+        map_src = ""
+        map_dst = ""
+        self.pkg_file_path = pkg_file_path
+        
+        if not self.exclude == "":
+            if re.search(r'%s' % self.exclude, pkg_line) is not None:
+                return None
+        #searches for the file path (src and dst) in the pkg file
+        #e.g.: "..\conf\VCXErrors.inc"-"C:\TestFramework\VCXErrors.inc"
+        result = re.search(r'^\s*"(.*?)".*?-.*?"(.*?)"', pkg_line)
+
+        if result is None:
+            return None
+        val1, val2 = result.groups()
+
+        if val1 != "":
+            if path.isabs(path(val1).normpath()):
+                map_src = str(path.joinpath(self.drive, val1).normpath())
+            elif re.search(r"\A\w", val1, 1):
+                map_src = str(path.joinpath(self.pkg_file_path + os.sep, os.path.normpath(val1)).normpath())
+            else:
+                map_src = str(path.joinpath(self.pkg_file_path, path(val1)).normpath())
+            map_dst = str(path(val2).normpath())
+        else:
+            map_src, map_dst = val1, val2
+        map_src = map_src.strip()
+        
+        #replaces the characters with the drive letters
+        map_dst = map_dst.replace("!:", "c:")
+        map_dst = map_dst.replace("$:", "c:")
+        map_dst = re.sub(r'^(\w)', r'\1', map_dst).strip()
+        indx = map_dst.rsplit(".")
+        try:
+            ext = indx[1]
+        except IndexError:
+            _logger.warning("Index Error in map_pkg_path()")
+
+        _test_type_ = ""
+        _target_filename_ = ""
+        
+        _target_filename_ = mmp_parser.get_target_filename(self.pkg_file_path)
+        _test_type_ = mmp_parser.get_dll_type(self.pkg_file_path)
+        _harness_ = mmp_parser.get_harness(self.pkg_file_path)
+        _libraries_ = mmp_parser.get_libraries(self.pkg_file_path)
+        
+        if ext == "ini":
+            file_type = "engine_ini"
+        elif ext == "cfg":
+            file_type = "conf"
+        elif ext == "dll":
+            #adding type of dll (executable or dependent), if file type is dll
+            if _test_type_ == "dependent":
+                file_type = "data" + ":%s" % _test_type_
+            else:
+                file_type = "testmodule"
+        
+        elif ext == "exe":
+            if _test_type_ == "dependent":
+                file_type = "data" + ":%s" % _test_type_
+            else:
+                if "qttest.lib" in _libraries_:
+                    file_type = "testmodule:qt"
+                else:
+                    file_type = "testmodule"
+
+        elif ext == "sisx":
+            file_type = ""
+        elif ext == "xml":
+            file_type = "trace_init"
+        elif ext == "pmd":
+            file_type = "pmd"
+        elif ext == "script":
+            if "testframeworkclient.lib" in _libraries_:
+                file_type = "testscript:mtf"
+            else:
+                file_type = "testscript"
+        elif ext == 'bat' and 'rtest' in _libraries_:
+            file_type = "testmodule"
+        else:
+            file_type = "data"
+
+        if not map_src or map_src == "." or not map_dst or map_dst == ".":
+            return None
+
+        return path(map_src).normpath(), path(map_dst).normpath(), file_type, pkg_file
+
+    def __read_pkg_file(self, pkg_files):
+        """Reads contents of PKG file"""
+        pkg_paths = []
+        for pkg_file in pkg_files:
+            if not os.path.exists( pkg_file ):
+                _logger.error("No PKG -file in path specified")
+                continue
+            else:
+                file1 = codecs.open(pkg_file, 'r', 'utf16')
+                try:
+                    lines = file1.readlines()
+                except UnicodeError:
+                    file1 = open(pkg_file, 'r')
+                    lines = file1.readlines()
+                pkg_file_path = path((pkg_file.rsplit(os.sep, 1))[0])
+                for line in lines:
+                    pkg_path = self.__map_pkg_path(line, pkg_file_path, os.path.basename(pkg_file))
+                    if pkg_path is None:
+                        continue
+                    else:
+                        pkg_paths.append(pkg_path)
+
+        return pkg_paths
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/testconfigurator.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,330 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : testconfigurator.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+from path import path
+import ats3.parsers as parser
+import logging
+import os
+import re
+import subprocess
+
+_logger = logging.getLogger('ats')
+
+class Ats3ComponentParser(object):
+    """
+    Parse Symbian SW component for ATS3 testing related information.
+    
+    Parses a component's source directories for testing related settings and
+    files, and generates a TestPlan out of the findings.
+    
+    """
+
+    def __init__(self, config):
+        
+        self.target_platform = config.target_platform
+        self.pkg_parser = parser.PkgFileParser(self.target_platform.replace(" ", "_")+".pkg")
+        
+        self.bld_parser = parser.BldFileParser()
+        self.mmp_parser = parser.MmpFileParser()
+        
+        self.data_dirs = config.data_dir
+        self.flash_images = [path(p) for p in config.flash_images]
+        self.tsrc_dir = None
+        self.build_drive = config.build_drive
+        self.target_platform = config.target_platform
+        self.sis_files = config.sis_files
+        self.cfg_harness = config.harness
+        self.test_timeout = config.test_timeout
+        self.trace_enabled = config.trace_enabled
+        self.excludable_dlls = []
+        self.custom_dir = None
+
+    def insert_testset_stif(self, src_dst, pkg_paths):
+        """Inserts test set data to test plan for stif"""
+        if not pkg_paths:    
+            try:
+                
+                tsrc_testdata_files = self.tsrc_data_files()
+                for data_file in tsrc_testdata_files:
+                    if "\\mmc\\" in data_file.lower():
+                        src_dst.append((data_file, path(r"e:\testing\data").joinpath(data_file.name), "data"))
+                    elif "\\c\\" in data_file.lower():
+                        src_dst.append((data_file, path(r"c:\testing\data").joinpath(data_file.name), "data"))
+                    else:
+                        src_dst.append((data_file, path(r"c:\testing\data").joinpath(data_file.name), "data"))
+            except OSError:
+                _logger.warning("No testdata folder" )
+                tsrc_testdata_files = None
+
+        else:
+            try:
+                src_dst = pkg_paths
+            except OSError:
+                _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                src_dst = []
+            except IndexError:
+                _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                src_dst = []
+        
+        return src_dst
+                
+    def insert_test_set(self, test_plan, tsrc_dir, _paths_dict_):
+        """Parse tsrc directory, storing data into the test plan."""
+        self.tsrc_dir = path(tsrc_dir)  # Store current test source dir.
+        tsrc_testdata_files = []
+        tsrc_config_files = []
+        self.custom_dir = None
+        engine_ini_file = None
+        test_harness = self.cfg_harness
+        src_dst = []
+        pmd_files = []
+        trace_activation_files = []
+
+        if not os.path.exists( self.tsrc_dir ):
+            _logger.error("Missing test source directory: %s", self.tsrc_dir)
+        else:
+            self.custom_dir = self.tsrc_dir.joinpath("custom")
+            _logger.debug("using customized testing from %s" % self.custom_dir)
+            if os.path.exists(self.tsrc_bld_dir.joinpath("group","bld.inf")):
+                mmp_files = self.bld_parser.get_test_mmp_files(self.tsrc_bld_dir.joinpath("group","bld.inf"))                
+            else:
+                mmp_files = self.bld_parser.get_test_mmp_files(self.tsrc_bld_dir.joinpath("bld.inf"))
+                
+            test_harness = self.mmp_parser.get_harness(mmp_files)
+            
+            pkg_paths = self.pkg_parser.get_data_files(self.tsrc_pkg_files(_paths_dict_), self.build_drive)
+            if self.trace_enabled == "True":
+                try:
+                    pmd_files = self.tsrc_pmd_files()
+                except OSError:
+                    _logger.warning("No pmd file in output-folder.")
+                try:
+                    trace_activation_files = self.tsrc_trace_activation_files()
+                except OSError:
+                    _logger.warning("No trace activation files in trace init folder")
+                if trace_activation_files and not pmd_files:
+                    _logger.warning("Trace activation files available but NOT pmd file.")
+                elif pmd_files and not trace_activation_files:
+                    _logger.warning("Pmd file available but NO trace activation files.")
+            
+            if test_harness == "STIF" or test_harness == "STIFUNIT" or test_harness == "GENERIC":
+                src_dst = self.insert_testset_stif(src_dst, pkg_paths)
+                        
+            elif test_harness == "EUNIT":
+                try:
+                    src_dst  = self.pkg_parser.get_data_files(self.tsrc_pkg_files(_paths_dict_), self.build_drive)
+
+                except OSError:
+                    _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                    src_dst = []
+                except IndexError:
+                    _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                    src_dst = []
+            try:
+                testmodule_files = self.tsrc_dll_files()
+
+                for dll_file in testmodule_files:
+                    if not self.check_dll_duplication(dll_file.name, src_dst):
+                        _dll_type_ = self.mmp_parser.get_dll_type(self.tsrc_bld_dir)
+
+                        if dll_file.name in self.excludable_dlls:
+                            src_dst.append((dll_file, path(r"c:\sys\bin").joinpath(dll_file.name), "data:%s" % _dll_type_))
+                        else:
+                            src_dst.append((dll_file, path(r"c:\sys\bin").joinpath(dll_file.name), "testmodule"))
+
+            except OSError:
+                _logger.warning("No dll files in dll folders" )
+                tsrc_testdata_files = None
+            temp_list = []
+            
+            if test_plan['multiset_enabled'] == 'True':
+                backup = []
+                temp_src_dst = {}
+                for x in src_dst:
+                    if len(x) < 4:
+                        backup.append(x)
+                for x in src_dst:
+                    if len(x) > 3:
+                        if temp_src_dst.has_key(x[3]):
+                            temp_src_dst[x[3]].append(x)
+                        else:
+                            temp_src_dst[x[3]] = [x] + backup
+                
+                for pkg in temp_src_dst.keys():
+                    src_dst = temp_src_dst[pkg]
+                    
+                    if self.trace_enabled == "True":
+                        test_plan.insert_set(data_files=tsrc_testdata_files,
+                                             config_files=tsrc_config_files,
+                                             engine_ini_file=engine_ini_file,
+                                             image_files=self.flash_images,
+                                             sis_files=self.sis_files,
+                                             #testmodule_files=self.tsrc_dll_files(),
+                                             test_timeout=list(self.test_timeout),
+                                             test_harness=test_harness,
+                                             src_dst=src_dst,
+                                             pmd_files=pmd_files,
+                                             trace_activation_files=trace_activation_files,
+                                             custom_dir=self.custom_dir,
+                                             component_path=tsrc_dir)
+                    else:
+                        test_plan.insert_set(image_files=self.flash_images,
+                                             sis_files=self.sis_files,
+                                             test_timeout=list(self.test_timeout),
+                                             test_harness=test_harness,
+                                             src_dst=src_dst,
+                                             custom_dir=self.custom_dir,
+                                             component_path=tsrc_dir)
+            else:
+                if self.trace_enabled == "True":
+                    test_plan.insert_set(data_files=tsrc_testdata_files,
+                                         config_files=tsrc_config_files,
+                                         engine_ini_file=engine_ini_file,
+                                         image_files=self.flash_images,
+                                         sis_files=self.sis_files,
+                                         #testmodule_files=self.tsrc_dll_files(),
+                                         test_timeout=list(self.test_timeout),
+                                         test_harness=test_harness,
+                                         src_dst=src_dst,
+                                         pmd_files=pmd_files,
+                                         trace_activation_files=trace_activation_files,
+                                         custom_dir=self.custom_dir,
+                                         component_path=tsrc_dir)
+                else:
+                    test_plan.insert_set(image_files=self.flash_images,
+                                         sis_files=self.sis_files,
+                                         test_timeout=list(self.test_timeout),
+                                         test_harness=test_harness,
+                                         src_dst=src_dst,
+                                         custom_dir=self.custom_dir,
+                                         component_path=tsrc_dir)
+
+    def check_dll_duplication(self, _dll_file_, _src_dst_ ):
+        """Checks if the dll is already in the dictionary, created by pkg file"""
+        for item in _src_dst_:
+            first = item[0]
+            second = item[1]
+            return _dll_file_.lower() in first.lower()
+            
+    @property
+    def tsrc_bld_dir(self):
+        """Component's build directory."""
+        return self.tsrc_dir
+
+    @property
+    def tsrc_conf_dir(self):
+        """Component's configuration file directory."""
+        return self.tsrc_dir.joinpath("conf")
+
+    @property
+    def tsrc_custom_dir(self):
+        """Component's test customization directory."""
+        return self.tsrc_dir.joinpath("custom")
+
+
+    @property
+    def tsrc_data_dirs(self):
+        """Component's data directories."""
+        return [self.tsrc_dir.joinpath(d) for d in self.data_dirs]
+
+    @property
+    def tsrc_init_dir(self):
+        """Component's initialization file directory."""
+        return self.tsrc_dir.joinpath("init")
+    
+    @property
+    def tsrc_pkg_dir(self):
+        """Component's .pkg -file directory"""
+        return self.tsrc_dir
+    
+    @property
+    def tsrc_trace_activation_dir(self):
+        """Component's trace activation file directory"""
+        return self.tsrc_dir.joinpath("trace_init")
+
+    @property
+    def tsrc_pmd_dir(self):
+        """Component's pmd file directory"""
+        pmd_dir = self.build_drive + os.sep
+        return pmd_dir.joinpath("output", "pmd")
+
+    def tsrc_pmd_files(self):
+        """Component's trace pmd files from the {build_drive}\output directory"""
+        return list(self.tsrc_pmd_dir.walkfiles("*.pmd"))
+
+    def tsrc_trace_activation_files(self):
+        """Component's trace activation files, from the rtace_init directory."""
+        return list(self.tsrc_trace_activation_dir.walkfiles("*.xml"))
+    
+    def tsrc_config_files(self):
+        """Component's configuration files, from the conf directory."""
+        return list(self.tsrc_conf_dir.walkfiles("*.cfg"))
+
+    def tsrc_ini_files(self):
+        """Component's initialiation files, from the ini directory."""
+        return list(self.tsrc_init_dir.walkfiles("*.ini"))
+
+    def tsrc_data_files(self):
+        """Component's data files, from data directories."""
+        files = []
+        files2 = []
+        for data_dir in self.tsrc_data_dirs:            
+            if data_dir.exists():
+                files.extend(list(data_dir.walkfiles()))        
+        
+        #Remove dist policy files
+        for data_file in files:
+            if data_file.name.lower() != "distribution.policy.s60":
+                files2.append(data_file)
+        return files2
+
+    def tsrc_dll_files(self):
+        """Component's DLL files, reported by ABLD BUILD."""
+
+        dlls = []
+        orig_dir = os.getcwd()
+        try:
+            os.chdir(self.tsrc_bld_dir)
+            os.system("bldmake bldfiles")
+            #os.system("abld test build %s" % self.target_platform)
+            process = subprocess.Popen("abld -w test build %s" % self.target_platform, shell=True, stdout=subprocess.PIPE)
+            pipe = process.communicate()[0]
+            for line in pipe.split('\n'):
+                _logger.debug(line.strip())
+                target = path(line.strip())
+                if target.ext == ".dll":
+                    
+                    build_target = self.build_drive.joinpath(target).normpath()
+                    if not build_target.exists():
+                        _logger.warning("not found: %s" % build_target)
+                    else:
+                        dlls.append(build_target)
+        finally:
+            os.chdir(orig_dir)
+        return dlls
+
+    def tsrc_pkg_files(self, _dict_):
+        """Component's package files, from the group directory"""
+        pkg_dirs = []
+        for sub_component in _dict_[self.tsrc_pkg_dir]['content'].keys():
+            pkg_dirs.append(sub_component)
+        return pkg_dirs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/bsf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,127 @@
+#============================================================================ 
+#Name        : bsf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper module to read bsf files.
+"""
+import dircache
+import os.path
+import re
+
+class BSF(object):
+    """ Class that parse and abstract a bsf file.
+    """    
+    def __init__(self, filename, bsflist):
+        self._filename = filename
+        self._is_variant = False
+        self._is_virtual_variant = False
+        self._customize = None
+        self._compile_with_parent = False
+        self._list = bsflist
+        self.parse()
+        
+    def parse(self):
+        """ Parse the bsf file
+        """ 
+        bsffile = open(self._filename)
+        for line in bsffile.readlines():
+            # skipping empty lines and comment
+            if re.match(r"^(\s*|\s*#.*)$", line) != None:
+                continue
+
+            res = re.search(r"^^\s*(?P<key>\w+)\s+(?P<value>\w+)\s*$", line)
+            if res != None:
+                if res.groupdict()['key'].lower() == "customizes":
+                    self._customize = res.groupdict()['value']
+            
+            if re.match(r"^^\s*VARIANT\s*$", line) != None:
+                self._is_variant = True
+            if re.match(r"^^\s*VIRTUALVARIANT\s*$", line) != None:
+                self._is_virtual_variant = True
+            if re.match(r"^^\s*COMPILEWITHPARENT\s*$", line) != None:
+                self._compile_with_parent = True
+                
+         
+        bsffile.close()
+
+    def is_variant(self):
+        """ I am a variant
+        """
+        return self._is_variant
+
+    def is_virtual_variant(self):
+        """ I am a virtual variant
+        """
+        return self._is_virtual_variant
+    
+    def customize(self):
+        """ who am I customizing?
+        """
+        return self._customize.lower()
+    
+    def compile_with_parent(self):
+        """ who am I customizing?
+        """
+        return self._compile_with_parent
+
+    def get_name(self):
+        """ get my name...
+        """
+        return os.path.splitext((os.path.basename(self._filename)))[0].lower()
+    
+    def get_path_as_array(self):        
+        """ return myself plus my parents
+        """
+        result = [self.get_name()]      
+        parent = self._list[self.customize()]
+        while not parent.is_virtual_variant():
+            result.append(parent.get_name())
+            parent = self._list[parent.customize()]
+        result.reverse()
+        return result
+  
+    def get_path(self):        
+        """ return the path section
+        """
+        path = self.get_name()      
+        parent = self._list[self.customize()]
+        while not parent.is_virtual_variant():
+            path = parent.get_name()+'/'+path
+            parent = self._list[parent.customize()]
+        return path
+            
+
+def read_all(path="/epoc32/tools"):   
+    """ Read all bsfs from a directory
+    """
+    result = {}
+    for bsf in dircache.listdir(path):
+        if os.path.splitext(bsf)[1]==".bsf":
+            bsf = BSF(path+"/"+bsf, result)
+            result[bsf.get_name()] = bsf
+    return result
+
+def get_includes(bsfs, product):
+    """ Return an array representing all include path from specific path (product) to generic (platform)
+    """
+    result = []
+    configs = bsfs[product].get_path_as_array()
+    configs.reverse()
+    for customisation in configs:
+        result.append(bsfs[customisation].get_path())
+    return result
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Package for functionality related to features of a build. """
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/ec/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" build.ec framework.  """
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/ec/history.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+#============================================================================ 
+#Name        : history.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" History file management related functionalities. """
+
+
+import sys
+import os
+from os.path import join
+
+
+class HistoryFileManager:
+    """ To manage EC history files. """
+    
+    weak_num = ""
+    branch_name = ""
+    file_dict = {}
+
+    def __init__(self, arg1, arg2, arg3):
+        """ Constructor. """
+        self.path = str(arg1)
+        self.weak_num = str(arg2)
+        self.branch_name = str(arg3)
+
+    def findActualFilePath(self):
+        """Find the new path where the history file will be updated based on the week number and branch.
+        
+        This will normally the same path as used to copy from net drive to local drive.
+        But for new branch / week number, the path will be different. """
+        branch_dir_list = self.branch_name.split(".")
+        for dir_ in branch_dir_list:
+            self.path = os.path.join(self.path, dir_)
+        if(self.path.endswith("\\0")):
+            self.path = self.path[0:-2]
+        return str(self.path)
+        
+    def findHistoryFilePath(self):
+        """ Finds the path of the history file based on input
+        branch and week number. """
+        branch_dir_list = self.branch_name.split(".")
+        for dir_ in branch_dir_list:
+            if(not os.path.exists(os.path.join(self.path, dir_))):
+                break
+            else:
+                self.path = os.path.join(self.path, dir_)
+        if(self.path.endswith("\\0")):
+            self.path = self.path[0:-2]
+
+    def findFile(self):
+        """ Finds the closest history file match to week number. """
+        ret_file_name = None
+        file_names = os.listdir(self.path)
+        file_names_alone = file_names[:]
+
+        # Find the history files without sub directory
+        for name in file_names:
+            if(os.path.isdir(os.path.join(self.path, name))):
+                file_names_alone.remove(name)
+
+        if(len(file_names_alone) > 0):
+            file_names_alone.sort()
+            low_index = 0
+            high_index = len(file_names_alone) - 1
+
+            if(high_index == 0):
+                temp_name = file_names_alone[low_index]
+                if(self.weak_num >= temp_name[0:4]):
+                    return temp_name
+                else:
+                    return ret_file_name
+
+            # Find the matching history file using binary search
+            while(low_index < high_index):
+                mid_index = (low_index + high_index) / 2
+                temp_name = file_names_alone[mid_index]
+                if(temp_name[0:4] < self.weak_num):
+                    low_index = mid_index + 1
+                else:
+                    high_index = mid_index
+                    
+                temp_name = file_names_alone[high_index]
+            if( self.weak_num >= temp_name[0:4]):
+                ret_file_name = file_names_alone[high_index]
+            else:
+                if(high_index != 0):
+                    ret_file_name = file_names_alone[high_index - 1]
+
+        return str(ret_file_name)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/io.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,111 @@
+#============================================================================ 
+#Name        : io.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" IO classes for handling build-related objects, e.g. log files.
+"""
+
+import logging
+import re
+import symbian.log
+
+
+_logger = logging.getLogger('build.io')
+
+
+class AbldLogWhatReader(symbian.log.Parser):
+    """ Reader that parses a Symbian build log and extracts abld -what sections.
+    
+    This reader will return, using the iterator protocol, tuples containing:
+    * Unit name.
+    * List of binaries for that unit.
+    
+    """
+    def __init__(self, logpath):
+        symbian.log.Parser.__init__(self, open(logpath, 'r'))
+        self.__match_what = re.compile("abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I)        
+        self._releasable = {}      
+        self.parse()
+
+    def __iter__(self):
+        for key in self._releasable.keys():
+            yield (key, self._releasable[key])
+    
+    def task(self, name, cmdline, path, output):
+        """ Scans abld what build jobs to extract the list of releasable. """
+        _logger.debug("%s, %s, %s, %s" % (name, cmdline, path, output))
+        if self.__match_what.match(cmdline) == None:
+            return
+        
+        if name not in self._releasable:
+            self._releasable[name] = []
+        for line in output.splitlines():
+            line = line.strip()
+            if line.startswith("\\") or line.startswith("/"):  
+                self._releasable[name].append(line)
+
+                    
+class RombuildLogBinarySizeReader(object):
+    """ Reader that parses a Symbian ROM build log and extracts binary sizes.
+    
+    This reader will return, using the iterator protocol, tuples containing:
+    * Binary name.
+    * Size of binary.\t(\d+)
+    """
+    rom_binary_size_regex = re.compile(r'(\\epoc32[\w\\\.]+)\t(\d+)')
+    rofs_binary_size_regex = re.compile(r"ile '([\w\\\.]+)' size: (\w+)")
+    image_type_regex = re.compile(r'[._]([^._]+)\.log')
+    
+    def __init__(self, logpath):
+        """ Initialisation. 
+        
+        :param logpath: The path to the Symbian log file.
+        """
+        self._logpath = logpath
+        
+    def __iter__(self):
+        """ Implement the iterator protocol. """
+        loghandle = open(self._logpath, 'r')
+        
+        # Find the ROM image type
+        type_match = self.image_type_regex.search(self._logpath)
+        image_type = type_match.group(1)
+        if image_type == 'rom' or image_type.startswith('rofs'):
+            # Extract the binary and size info 
+            for line in loghandle:
+                if image_type == 'rom':
+                    match = self.rom_binary_size_regex.match(line)
+                    if match != None:
+                        # Number is in decimal
+                        size = int(match.group(2))
+                        yield (match.group(1), size, image_type)
+                elif image_type.startswith('rofs'):
+                    match = self.rofs_binary_size_regex.search(line)
+                    if match != None:
+                        # Number is in hexidecimal
+                        size = int(match.group(2), 16)
+                        yield (match.group(1), size, image_type)
+        else:
+            _logger.error('ROM type not matched')
+    
+            
+            
+        
+        
+        
+                    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/model.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,656 @@
+#============================================================================ 
+#Name        : model.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Models the concepts and objects that exist in a software build. """
+
+import itertools
+import logging
+import re
+import os
+
+from amara import bindery
+import amara
+
+import ccm
+import ccm.extra
+import configuration
+import nokia.nokiaccm
+from xmlhelper import node_scan, recursive_node_scan
+import symrec
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+_logger = logging.getLogger("bom")
+#_logger.setLevel(logging.DEBUG)
+logging.basicConfig(level=logging.DEBUG)
+
+
+class SessionCreator(object):
+    """ Session Creator object. """
+    def __init__(self, username=None, password=None, provider=None):
+        """ Init the SessionCreator object."""
+        self.__provider = provider
+        self.__username = username
+        self.__password = password
+    
+    def session(self, database):
+        """ Get a session for a database. If no session exists just create a new one."""
+        _logger.info("Creating session for %s" % database)
+        return self.__provider.get(username=self.__username, password=self.__password, database=database)
+        
+    def close(self):
+        self.__provider = None
+
+
+class BOM(object):
+    """ The Bill of Materials for a build. """
+    def __init__(self, config, ccm_project=None, username=None, password=None, provider=None):
+        """ Initialization.
+        
+        :param config: The build configuration properties.
+        :param ccm_project: The Synergy project used for reading the BOM.
+        """
+        self.config = config
+        self._sessioncreator = SessionCreator(username=username, password=password, provider=provider)
+        self.ccm_project = ccm_project
+        self.build = ""
+        self._projects = []
+        if self.ccm_project != None: 
+            self._projects = [Project(ccm_project, config)]
+        self._icd_icfs = []
+        self._flags = []
+        
+        self._capture_projects()
+        self._capture_icd_icfs()
+        self._capture_flags()
+    
+    def _capture_projects(self):
+        # grab data from new format of delivery.xml
+        configBuilder = configuration.NestedConfigurationBuilder(open(self.config['delivery'], 'r'))
+        for config in configBuilder.getConfiguration().getConfigurations():            
+            _logger.debug('Importing project %s from delivery config.' % str(config.name))            
+            ccm_project = self._sessioncreator.session(config['database']).create(config.name)
+            project = Project(self.__find_project(ccm_project, config), config)
+            self._projects.append(project)
+
+    def __find_project(self, project, config):
+        if (os.path.exists(os.path.join(config['dir'], project.name, "project.version"))):
+            return project
+        
+        path = os.path.join(config['dir'], project.name, project.name)
+        if (not os.path.exists(path)):
+            return project
+        try:
+            result = project.session.get_workarea_info(path)
+            return result['project']           
+        except ccm.CCMException:            
+            return project
+        
+    def _capture_icd_icfs(self):
+        prep_xml_path = self.config['prep.xml']
+        if prep_xml_path is not None and os.path.exists(prep_xml_path):
+            prep_doc = amara.parse(open(prep_xml_path,'r'))
+            if hasattr(prep_doc.prepSpec, u'source'):
+                for source in prep_doc.prepSpec.source:
+                    if hasattr(source, u'unzipicds'):
+                        for  unzipicds in source.unzipicds:
+                            if hasattr(unzipicds, u'location'):
+                                for location in unzipicds.location:
+                                    excludes = []
+                                    excluded = False
+                                    if hasattr(location, 'exclude'):
+                                        for exclude in location.exclude:
+                                            _logger.debug('Exclude added: %s' % str(exclude.name))
+                                            excludes.append(str(exclude.name))                                
+                                            excluded = False
+                                    path = str(location.name)                                    
+                                    if os.path.exists(path):
+                                        files = os.listdir(str(location.name))
+                                        for file_ in files:
+                                            for exclude in excludes:
+                                                if file_.endswith(exclude):
+                                                    excluded = True
+                                            if file_.endswith('.zip') and not excluded:
+                                                self._icd_icfs.append(file_)
+                                                self._icd_icfs.sort(key=str)
+        
+    def _capture_flags(self):
+        pass
+        
+    def _getprojects(self):
+        return self._projects
+        
+    projects = property(_getprojects)
+    
+    def all_baselines(self):
+        baselines = {}
+        for project in self._projects:
+            for baseline, baseline_attrs in project.baselines.iteritems():
+                baselines[baseline] = baseline_attrs
+        return baselines
+    
+    def all_tasks(self):
+        tasks = []
+        for project in self._projects:
+            tasks.extend(project.all_tasks())
+        tasks.sort(key=str)
+        return tasks
+            
+    def __str__(self):
+        return str(self._projects)
+        
+    def close(self):
+        self._sessioncreator.close()
+
+
+class Project(object):
+    """ An SCM project.
+    
+    An input to the build area, typically copied from an SCM work area.
+    """
+    def __init__(self, ccm_project, config, action=None):
+        """ Initialisation. """
+        self._ccm_project = ccm_project
+        self._baselines = {}
+        #TODO : could querying release attribute return the ccm object? Or add a release attribute to Project
+        # class
+        release = self._ccm_project['release']
+        _logger.debug("Project release: '%s'" % release)
+        self._ccm_release = None
+        if release != '':
+            self._ccm_project.session.create(release)
+
+        # capturing the frozen baseline.
+        _logger.debug('Capture baselines')
+        project_status = self._ccm_project['status']
+        bproject = self._get_toplevel_baselines(self._ccm_project).pop()
+        if bproject != None:        
+            self._baselines[unicode(bproject)] = {u'overridden':u'true'}
+            # This section finds the baselines of all of the checked out projects
+            if project_status == "prep" or project_status == "working":
+                for subproject in self._ccm_project.subprojects:
+                    overridden = u'false'
+                    subprojbaseline = subproject.baseline
+                    if config.has_key('subbaselines'):
+                        for subbaseline in config['subbaselines']:
+                            if str(subbaseline) == str(subprojbaseline):
+                                overridden = u'true'
+                    
+                    if subprojbaseline != None:
+                        self._baselines[unicode(subprojbaseline)] = {u'overridden': overridden}
+            # When a project is a snapshot, the baselines are the projects themselves
+            else:
+                for subproject in bproject.subprojects:            
+                    self._baselines[unicode(subproject)] = {u'overridden':u'false'}
+
+        self._tasks = []
+        self._folders = []
+        
+        # Get Synergy reconfigure properties for folders and tasks
+        if action == None:
+            self._import_baseline_config()
+            # Get tasks from Synergy if using reconfigure template
+            if config.get_boolean("use.reconfigure.template", False):
+                self._tasks = self._ccm_project.tasks
+                self._folders = self._ccm_project.folders
+                        
+        # Or get folders and tasks defined in configuration file
+        elif action != None and action.nodeName == "checkout":
+            if not config.get_boolean("use.reconfigure.template", False):
+                for task_node in action.xml_xpath(u'./task[@id]'):
+                    for task in [x.strip() for x in task_node.id.split(',')]:
+                        self._tasks.append(ccm_project.session.create("Task %s" % task))
+                for folder_node in action.xml_xpath(u'./folder[@id]'):
+                    for folder in [x.strip() for x in folder_node.id.split(',')]:
+                        self._folders.append(ccm_project.session.create("Folder %s" % folder))
+            else:
+                self._tasks = self._ccm_project.tasks
+                self._folders = self._ccm_project.folders
+            self._import_baseline_config()
+
+    def _import_baseline_config(self):
+        """ Import the baseline folders and tasks. """
+        baselines = self._get_toplevel_baselines(self._ccm_project)
+        baselines.pop()
+        for baseline in baselines:
+            for task in baseline.tasks:
+                if task not in self._tasks:                     
+                    self._tasks.append(task)
+            for folder in baseline.folders:
+                if folder not in self._folders:                     
+                    self._folders.append(folder)
+        
+    def _get_toplevel_baselines(self, project):
+        if project == None:
+            return []
+        project_status = project['status']
+        if project_status == "prep" or project_status == "working":
+            result = [project]
+            baseline = project.baseline
+            if baseline != None:
+                result.extend(self._get_toplevel_baselines(baseline))
+            return result
+        else:
+            return [project]
+
+    def _getbaselines(self):
+        return self._baselines
+        
+    baselines = property(_getbaselines)
+       
+    def _getfolders(self):
+        return self._folders
+        
+    folders = property(_getfolders)
+    
+    def all_tasks(self):
+        """ Get all the tasks (individual and folder based). """
+        tasks = [Task(ccm_task) for ccm_task in self._tasks]
+        for folder in self._folders:
+            [tasks.append(Task(ccm_task)) for ccm_task in folder.tasks]
+        tasks.sort(key=str)
+        return tasks
+        
+    def _gettasks(self):
+        return [Task(ccm_task) for ccm_task in self._tasks]
+        
+    tasks = property(_gettasks)
+        
+    def _getsupplier(self):
+        if self._ccm_release != None:
+            component = self._ccm_release.component
+            comparisons = {'MC': '^mc',
+                           'S60': 'S60',
+                           'SPP/NCP': '^spp_config|spp_psw|spp_tools|ncp_sw$',
+                           'IBUSAL': '^IBUSAL'}
+            for supplier, regexp in comparisons.iteritems():
+                if re.search(regexp, component) != None:
+                    return supplier
+        return "Unknown"
+        
+    supplier = property(_getsupplier)
+    
+    def __repr__(self):
+        """ Object representation. """
+        return str(self._ccm_project)
+        
+    def __str__(self):
+        """ String representation. """
+        return str(self._ccm_project)
+
+
+class Fix(object):
+    """ A generic fix. """
+    def __init__(self, description):
+        """ Initialisation. """
+        self._description = description
+        
+    def __str__(self):
+        """ String representation. """
+        return str(self._description)
+        
+        
+class TSWError(Fix):
+    """ A TSW database error. """
+    regex = '([A-Z]{4}-[A-Z0-9]{6})'
+    groupname = 'TSW Errors'
+
+    def __init__(self, description):
+        """ Initialisation. """
+        Fix.__init__(self, description)
+
+
+class PCPError(Fix):
+    """ A PCP database error. """
+    regex = '([A-Z]{2}-[0-9]{11})'
+    groupname = 'PCP Errors'
+
+    def __init__(self, description):
+        """ Initialisation. """
+        Fix.__init__(self, description)
+
+
+class TAChange(Fix):
+    """ A Type Approval change. """
+    regex = '^_TA:(\s*)(.*?)(\s*)$'
+    groupname = 'TA Changes'
+    
+    def __init__(self, description):
+        """ Initialisation. """
+        Fix.__init__(self, description)
+        
+        
+class Task(object):
+    """ A task or unit of change from the SCM system. """
+    fix_types = [TSWError, PCPError, TAChange]
+    
+    def __init__(self, ccm_task):
+        """ Initialisation. """
+        self.ccm_task = ccm_task
+
+    def __getitem__(self, name):
+        """ Dictionary of tasks support. """
+        return self.ccm_task[name]
+            
+    def has_fixed(self):
+        """ Returns an object representing what this task fixed, if anything. """
+        text = str(self.ccm_task)
+        fix_object = None
+        for fix_type in self.fix_types:
+            match = re.search(fix_type.regex, str(self.ccm_task))
+            if match != None:
+                fix_object = fix_type(text)
+                break
+        return fix_object
+        
+    def __cmp__(self, other):
+        """ Compare tasks based on their task number only. """
+        self_task = str(self.ccm_task)
+        other_task = str(other.ccm_task)
+        return cmp(self_task[:self_task.find(':')], other_task[:other_task.find(':')])
+        
+    def __hash__(self):
+        """ Hash support. """
+        self_task = str(self.ccm_task)
+        return hash(self_task[:self_task.find(':')])
+    
+    def __repr__(self):
+        """ Object representation. """
+        self_task = repr(self.ccm_task)
+        return self_task[:self_task.find(':')]
+        
+    def __str__(self):
+        """ String representation. """
+        return str(self.ccm_task)
+        
+        
+class ICD_ICF(object):
+    """ A ICD or ICF patch zip file provided by Symbian. """
+    pass
+
+
+class Flag(object):
+    """ A compilation flag. """
+    pass
+    
+
+class BOMDeltaXMLWriter(object):
+    def __init__(self, bom, bom_log):
+        """ Initialisation. """
+        self._bom = bom
+        self._bom_log = bom_log
+    
+    def write(self, path):
+        """ Write the BOM delta information to an XML file. """
+        bom_log = amara.parse(open(self._bom_log, 'r'))
+        doc = amara.create_document(u'bomDelta')
+        # pylint: disable-msg=E1101
+        doc.bomDelta.xml_append(doc.xml_create_element(u'buildFrom', content=unicode(bom_log.bom.build)))
+        doc.bomDelta.xml_append(doc.xml_create_element(u'buildTo', content=unicode(self._bom.config['build.id'])))
+        content_node = doc.xml_create_element(u'content')
+        doc.bomDelta.xml_append(content_node)
+        
+        old_baselines = {}
+        baselines = {}
+        old_folders = {}
+        folders = {}
+        old_tasks = {}
+        tasks = {}
+        if hasattr(bom_log.bom.content, 'project'):
+            for project in bom_log.bom.content.project:
+                if hasattr(project, 'baseline'):
+                    for baseline in project.baseline:
+                        if not old_baselines.has_key(unicode(baseline)):
+                            old_baselines[unicode(baseline)] = {}
+                        if hasattr(baseline, 'xml_attributes'):
+                            _logger.debug('baseline.xml_attributes: %s' % baseline.xml_attributes)
+                            for attr_name, junk_tuple in sorted(baseline.xml_attributes.iteritems()):
+                                _logger.debug('attr_name: %s' % attr_name)
+                                old_baselines[unicode(baseline)][unicode(attr_name)] = unicode(getattr(baseline, attr_name))
+                if hasattr(project, 'folder'):
+                    for folder in project.folder:
+                        if hasattr(folder, 'name'):
+                            for name in folder.name:
+                                folder_name = unicode(name)
+                                _logger.debug('folder_name: %s' % folder_name)
+                            if not old_folders.has_key(unicode(folder_name)):
+                                old_folders[unicode(folder_name)] = {}
+                            if hasattr(name, 'xml_attributes'):
+                                for attr_name, junk_tuple in sorted(name.xml_attributes.iteritems()):
+                                    _logger.debug('attr_name: %s' % attr_name)
+                                    old_folders[unicode(folder_name)][unicode(attr_name)] = unicode(getattr(name, attr_name))
+        for task in recursive_node_scan(bom_log.bom.content, u'task'):
+            _logger.debug('task: %s' % task)
+            _logger.debug('task: %s' % task.id)
+            _logger.debug('task: %s' % task.synopsis)
+            task_id = u"%s: %s" % (task.id, task.synopsis)
+            if not old_tasks.has_key(task_id):
+                old_tasks[task_id] = {}
+            if hasattr(task, 'xml_attributes'):
+                for attr_name, junk_tuple in sorted(task.xml_attributes.iteritems()):
+                    _logger.debug('attr_name: %s' % attr_name)
+                    old_tasks[task_id][unicode(attr_name)] = unicode(getattr(task, attr_name))
+        for project in self._bom.projects:
+            for folder in project.folders:
+                folders[unicode(folder.instance + "#" + folder.name + ": " + folder.description)] = {u'overridden':u'true'}
+                for task in folder.tasks:
+                    _logger.debug("task_bom:'%s'" % unicode(task))
+                    tasks[unicode(task)] = {u'overridden':u'false'}
+            for task in project.tasks:
+                _logger.debug("task_bom:'%s'" % unicode(task))
+                tasks[unicode(task)] = {u'overridden':u'true'}
+
+        baselines = self._bom.all_baselines()
+
+        self._write_items_with_attributes(content_node, u'baseline', baselines, old_baselines)
+        self._write_items_with_attributes(content_node, u'folder', folders, old_folders)
+        self._write_items_with_attributes(content_node, u'task', tasks, old_tasks)
+        
+        out = open(path, 'w')
+        doc.xml(out, indent='yes')
+        out.close()
+        
+    
+    def validate_delta_bom_contents(self, delta_bom_log, bom_log, old_bom_log):
+        """ To validate delta bom contents with current bom and old bom. """
+        delta_bom_log = amara.parse(open(delta_bom_log, 'r'))
+        bom_log = amara.parse(open(bom_log, 'r'))
+        old_bom_log = amara.parse(open(old_bom_log, 'r'))
+        bom_contents_are_valid = None
+        if hasattr(delta_bom_log.bomDelta.content, 'folder'):
+            for delta_foder in delta_bom_log.bomDelta.content.folder:
+                if(getattr(delta_foder, 'status'))=='added':
+                    for bom_foder in bom_log.bom.content.project.folder:
+                        if(unicode(getattr(bom_foder, 'name')) == unicode(delta_foder)):
+                            bom_contents_are_valid = True
+                        else:
+                            bom_contents_are_valid = False
+                if(getattr(delta_foder, 'status'))=='deleted':
+                    for old_bom_foder in old_bom_log.bom.content.project.folder:
+                        if(unicode(getattr(old_bom_foder, 'name')) == unicode(delta_foder)):
+                            bom_contents_are_valid = True
+                        else:
+                            bom_contents_are_valid = False
+                        
+        if hasattr(delta_bom_log.bomDelta.content, 'task'):
+            for delta_task in delta_bom_log.bomDelta.content.task:
+                if(getattr(delta_task, 'status'))=='added':
+                    for bom_task in recursive_node_scan(bom_log.bom.content, u'task'):
+                        bom_task_id = u"%s: %s" % (bom_task.id, bom_task.synopsis)
+                        if(bom_task_id == unicode(delta_task)):
+                            bom_contents_are_valid = True
+                        else:
+                            bom_contents_are_valid = False
+                if(getattr(delta_task, 'status'))=='deleted':
+                    for old_bom_task in recursive_node_scan(old_bom_log.bom.content, u'task'):
+                        old_bom_task_id = u"%s: %s" % (old_bom_task.id, old_bom_task.synopsis)
+                        if(old_bom_task_id == unicode(delta_task)):
+                            bom_contents_are_valid = True
+                        else:
+                            bom_contents_are_valid = False
+        return bom_contents_are_valid
+     
+    def _write_items(self, node, item_name, items, older_items):
+        items = frozenset(items)
+        older_items = frozenset(older_items)
+        
+        items_added = list(items.difference(older_items))
+        items_added.sort()
+        for item in items_added:
+            node.xml_append(node.xml_create_element(item_name, \
+                            attributes={u'status': u'added'}, content=unicode(item)))
+            
+        items_deleted = list(older_items.difference(items))
+        items_deleted.sort()
+        for item in items_deleted:
+            node.xml_append(node.xml_create_element(item_name, \
+                            attributes={u'status': u'deleted'}, content=unicode(item)))
+
+    # This method takes dictionaries as input to pass along attributes
+    def _write_items_with_attributes(self, node, item_name, items, older_items):
+        fr_items = frozenset(items)
+        fr_older_items = frozenset(older_items)
+        
+        items_added = list(fr_items.difference(fr_older_items))
+        items_added.sort()
+        for item in items_added:
+            item_attributes = {u'status': u'added'}
+            for attr_name, attr_value in sorted(items[item].iteritems()):
+                _logger.debug('item: %s' % item)
+                _logger.debug('attr_name: %s' % attr_name)
+                _logger.debug('attr_value: %s' % attr_value)
+                item_attributes[attr_name] = attr_value
+            node.xml_append(node.xml_create_element(item_name, \
+                            attributes=item_attributes, content=unicode(item)))
+            
+        items_deleted = list(fr_older_items.difference(fr_items))
+        items_deleted.sort()
+        for item in items_deleted:
+            item_attributes = {u'status': u'deleted'}
+            for attr_name, attr_value in sorted(older_items[item].iteritems()):
+                _logger.debug('item: %s' % item)
+                _logger.debug('attr_name: %s' % attr_name)
+                _logger.debug('attr_value: %s' % attr_value)
+                item_attributes[attr_name] = attr_value
+            node.xml_append(node.xml_create_element(item_name, \
+                            attributes=item_attributes, content=unicode(item)))
+
+            
+class BOMXMLWriter(object):
+    def __init__(self, bom):
+        """ Initialisation. """
+        self._bom = bom
+        
+    def write(self, path):
+        """ Write the BOM information to an XML file. """
+        doc = amara.create_document(u'bom')
+        # pylint: disable-msg=E1101
+        doc.bom.xml_append(doc.xml_create_element(u'build', content=unicode(self._bom.config['build.id'])))
+        doc.bom.xml_append(doc.xml_create_element(u'content'))
+        for project in self._bom.projects:
+            project_node = doc.xml_create_element(u'project')
+            project_node.xml_append(doc.xml_create_element(u'name', content=unicode(project)))
+            project_node.xml_append(doc.xml_create_element(u'database', content=unicode(self._bom.config['ccm.database'])))
+            doc.bom.content.xml_append(project_node)
+            _logger.debug('baselines dictionary: %s' % project.baselines)
+            for baseline, baseline_attrs in sorted(project.baselines.iteritems()):
+                _logger.debug('baseline: %s' % baseline)
+                _logger.debug('baseline_attrs: %s' % baseline_attrs)
+                project_node.xml_append(doc.xml_create_element(u'baseline', content=unicode(baseline), attributes=baseline_attrs))
+            for folder in project.folders:
+                folder_node = doc.xml_create_element(u'folder')
+                folder_node.xml_append(doc.xml_create_element(u'name', content=unicode(folder.instance + "#" + folder.name + ": " + folder.description), \
+                            attributes={u'overridden':u'true'}))
+                project_node.xml_append(folder_node)
+                for task in folder.tasks:
+                    task_node = doc.xml_create_element(u'task', attributes={u'overridden':u'false'})
+                    task_node.xml_append(doc.xml_create_element(u'id', content=(unicode(task['displayname']))))
+                    task_node.xml_append(doc.xml_create_element(u'synopsis', content=(unicode(task['task_synopsis']))))
+                    task_node.xml_append(doc.xml_create_element(u'owner', content=(unicode(task['owner']))))
+                    #task_node.xml_append(doc.xml_create_element(u'completed', content=(unicode(self.parse_status_log(task['status_log'])))))
+                    folder_node.xml_append(task_node)
+            for task in project.tasks:
+                task_node = doc.xml_create_element(u'task', attributes={u'overridden':u'true'})
+                task_node.xml_append(doc.xml_create_element(u'id', content=(unicode(task['displayname']))))
+                task_node.xml_append(doc.xml_create_element(u'synopsis', content=(unicode(task['task_synopsis']))))
+                task_node.xml_append(doc.xml_create_element(u'owner', content=(unicode(task['owner']))))
+                #task_node.xml_append(doc.xml_create_element(u'completed', content=(unicode(self.parse_status_log(task['status_log'])))))
+                project_node.xml_append(task_node)
+                
+                fix = task.has_fixed()
+                if fix != None:
+                    fix_node = doc.xml_create_element(u'fix', content=(unicode(task)), attributes = {u'type': unicode(fix.__class__.__name__)})
+                    project_node.xml_append(fix_node)
+
+        # Add ICD info to BOM
+        doc.bom.content.xml_append(doc.xml_create_element(u'input'))
+
+        # Add default values to unused fields so icds are visible in the BOM
+        empty_bom_str = u'N/A'
+        empty_bom_tm = u'0'
+        doc.bom.content.input.xml_append(doc.xml_create_element(u'name', content=(unicode(empty_bom_str))))
+        doc.bom.content.input.xml_append(doc.xml_create_element(u'year', content=(unicode(empty_bom_tm))))
+        doc.bom.content.input.xml_append(doc.xml_create_element(u'week', content=(unicode(empty_bom_tm))))
+        doc.bom.content.input.xml_append(doc.xml_create_element(u'version', content=(unicode(empty_bom_str))))
+
+        doc.bom.content.input.xml_append(doc.xml_create_element(u'icds'))
+
+        # pylint: disable-msg=R0914
+        for i, icd in enumerate(self._bom._icd_icfs):
+            doc.bom.content.input.icds.xml_append(doc.xml_create_element(u'icd'))
+            doc.bom.content.input.icds.icd[i].xml_append(doc.xml_create_element(u'name', content=(unicode(icd))))
+        #If currentRelease.xml exists then send s60 <input> tag to diamonds
+        current_release_xml_path = self._bom.config['currentRelease.xml']
+        if current_release_xml_path is not None and os.path.exists(current_release_xml_path):
+            metadata = symrec.ReleaseMetadata(current_release_xml_path)
+            service = metadata.service
+            product = metadata.product
+            release = metadata.release
+            # Get name, year, week and version from baseline configuration
+            s60_input_node = doc.xml_create_element(u'input')
+            s60_version = self._bom.config['s60_version']
+            s60_release = self._bom.config['s60_release']
+            if s60_version != None:
+                s60_year = s60_version[0:4]
+                s60_week = s60_version[4:]
+            else:
+                s60_year = u'0'
+                s60_week = u'0'
+            s60_input_node.xml_append(doc.xml_create_element(u'name', content=(unicode("s60"))))
+            s60_input_node.xml_append(doc.xml_create_element(u'year', content=(unicode(s60_year))))
+            s60_input_node.xml_append(doc.xml_create_element(u'week', content=(unicode(s60_week))))
+            s60_input_node.xml_append(doc.xml_create_element(u'version', content=(unicode(s60_release))))
+
+            s60_input_source = s60_input_node.xml_create_element(u'source')
+            s60_input_source.xml_append(doc.xml_create_element(u'type', content=(unicode("grace"))))
+            s60_input_source.xml_append(doc.xml_create_element(u'service', content=(unicode(service))))
+            s60_input_source.xml_append(doc.xml_create_element(u'product', content=(unicode(product))))
+            s60_input_source.xml_append(doc.xml_create_element(u'release', content=(unicode(release))))
+            s60_input_node.xml_append(s60_input_source)
+            doc.bom.content.xml_append(s60_input_node)
+        out = open(path, 'w')
+        doc.xml(out, indent='yes')
+        out.close()
+        
+    def parse_status_log(self, log):
+        _log_array = log.split('\r')
+        if(len(_log_array) == 3 and log.find('completed') > 0):
+            _completed_line = _log_array[2]
+            return _completed_line[:_completed_line.rfind(':')].strip()
+        else:
+            return u'None'
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/buildmanagement.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,137 @@
+#============================================================================ 
+#Name        : buildmanagement.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" BuildManagement module """
+
+import os
+import logging
+import types
+import string
+
+import ant
+import ccm
+import configuration
+import nokia.nokiaccm
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger("buildmanagement")
+
+def buildmanager(synergyhost, databasepath, configfile, specname):
+    """ Buildmanager  """
+    logger.debug("Start buildmanger")
+    session = None
+    session = nokia.nokiaccm.open_session(engine=synergyhost, dbpath=databasepath)
+    print ('session = %s', session)
+    session.role = "build_mgr"
+    configBuilder = configuration.NestedConfigurationBuilder(open(configfile, 'r'))
+    configSet = configBuilder.getConfiguration()
+    logger.debug('Getting configuration: "' + specname + '" from: "' + configfile + '"')
+    configs = configSet.getConfigurations(specname)
+    for config in configs:
+        for k in sorted(config.keys()):
+            value = config[k]
+            if isinstance(value, types.UnicodeType):
+                value = value.encode('ascii', 'ignore')
+            #logger.debug( k + ': ' + str(value))
+        logger.debug(config['function.name'])
+        result = eval(config['function.name'])(session, config)
+        logger.debug("got result:" + result) 
+    logger.debug('Finished parsing configs')
+    session.close()
+    del(session)
+
+def add_approved_tasks(session, config):
+    """ add approved tasks to be updated to project """
+    logger.debug("Start adding approved tasks")
+    #this assumes there is only one folder in the reconfigure properties:
+    if config['project.release.folder'] == "automatic":
+        toplevelproject = ccm.Project(session, config['project.four.part.name'])
+        releasefolders = toplevelproject.folders
+        releasefolder = releasefolders[0]
+        logger.debug("Release folder found from rp is: " + releasefolder.name)
+    else:
+        releasefolder = ccm.Folder(session, config['project.release.folder'])
+
+    folderlist = force_list(config['project.approval.folders'])
+
+    for approvalfolderfpn in folderlist:
+        approvalfolder = ccm.Folder(session, approvalfolderfpn)
+        logger.debug("Copying tasks from folder " + approvalfolder.name + ", to folder " + releasefolder.name)
+        approvalfolder.copy(releasefolder)
+        
+    logger.debug("Finished adding approved tasks")
+    
+def reconcile(session, config):
+    """ reconcile """
+    logger.debug("Start reconciling: " + config['project.four.part.name'])
+    toplevelproject = ccm.Project(session, config['project.four.part.name'])
+    toplevelproject.reconcile(updatewa=True, recurse=True, consideruncontrolled=True, missingwafile=True, report=True)
+    logger.debug("Finished reconciling: " + config['project.four.part.name'])
+    
+def set_latest_baseline(session, config):
+    """ Setting latest baseline """
+    logger.debug("Start updating the baseline of: " + config['project.name'])
+    toplevelproject = ccm.Project(session, config['project.four.part.name'])
+    latestbaseline = toplevelproject.get_latest_baseline(config['project.version.filter'], config['project.baseline.state'])
+    logger.debug("Using: " + latestbaseline)
+    toplevelproject.set_baseline(latestbaseline, recurse=True)
+    logger.debug("Finished updating the baseline of: " + config['project.name'])
+
+def reconfigure(session, config):
+    """ recongifure """
+    logger.debug("Start reconfiguring: " + config['project.four.part.name'])
+    toplevelproject = ccm.Project(session, config['project.four.part.name'])
+    replacesubprojects = config.get_boolean('replace.subprojects', True)
+    recursesubprojects = config.get_boolean('recurse.subprojects', True)
+    updatekeepgoing = not config.get_boolean('update.failonerror', True)
+    toplevelproject.update(recursesubprojects, replacesubprojects, updatekeepgoing)
+    logger.debug("Finished reconfiguring: " + config['project.four.part.name'])
+    
+def update_release_tags(session, config):
+    """ update release tags """
+    logger.debug("Start updating release tags in folder: " + config['project.release.folder'])
+    if config['project.release.folder'] == "automatic":
+        toplevelproject = ccm.Project(session, config['project.four.part.name'])
+        releasefolders = toplevelproject.folders
+        releasefolder = releasefolders[0]
+        logger.debug("Release folder found from rp is: " + releasefolder.name)
+    else:
+        releasefolder = ccm.Folder(session, config['project.release.folder'])
+    for task in releasefolder.tasks:
+        if str(task.get_release_tag()).strip() == config['task.release.tag.from']:
+            logger.debug("Changing release tag of %s to %s" % (task.name, config['task.release.tag.to']))
+            task.set_release_tag(config['task.release.tag.to'])
+    logger.debug("Finished updating release tags in folder: " + config['project.release.folder'])
+    
+def create_baseline(session, config):
+    """ Create baseline """
+    logger.debug("Start creating the baseline(s): " + config['project.name'] + "-" + config['baseline.tag'])
+    project = ccm.Project(session, config['project.four.part.name'])
+    logger.debug("Project: " + project.name)
+    project.create_baseline(config['project.name'] + "-" + config['baseline.tag'], config['project.release.tag'], config['baseline.tag'], config['baseline.purpose'], config['baseline.state'])
+    logger.debug("Finished creating the baseline: " + config['project.name'] + "-" + config['baseline.tag'])
+
+def force_list(myobject):
+    """ force list of objects """
+    if isinstance(myobject, list):
+        return myobject
+    else:
+        return [myobject]
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/buildtools.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,503 @@
+#============================================================================ 
+#Name        : buildtools.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Enables creation of build command list in several formats.
+
+This module implements class that represent shell commands.
+It supports build stage and command parallelization (depends of the output format).
+CommandList can be generated in different format: ant, make, ebs, batch.
+
+Example:
+from mc.buildtools import CommandList, Convert
+list = CommandList()
+list.addCommand("\\epoc32\\rombuild", "make_fpsx.bat..yy...", "build_xx_rom")
+list.addCommand("\\epoc32\\rombuild", "make_fpsx.bat..xx...", "build_yy_rom")
+list.addCommand("\\epoc32\\rombuild", "copy \\foo \\bar", "simple copy", False)
+
+convert(list, "outputfile.mk", "make")
+convert(list, "outputfile.ant.xml", "ant")
+convert(list, "outputfile.ebs.xml", "ebs")
+convert(list, "outputfile.bat", "bat")
+
+"""
+import os
+import types
+import xml.dom.minidom
+import sys
+
+class PreBuilder(object):
+    """ This class implements an abstract prebuilder.
+        A prebuilder takes a configurationset as input and generates a build file.
+    """
+    def __init__(self, configSet):
+        self.configSet = configSet
+        # Select the first configuration as a default, for referencing common properties
+        self.config = configSet.getConfigurations()[0]
+
+    def writeBuildFile(self, taskList, buildFilePath, output='ant'):
+        """ Converting a task list into output format and writing it into buildFilePath file. """
+        writer = None
+        #if 'build.tool' in self.config:
+            # Choose appropriate build tool
+        #    print 'choosing build tool!'
+        #    pass
+        #else:
+        # Choose Ant by default for now
+        print self.config.keys()
+        buildFileDir = os.path.dirname(buildFilePath)
+        if not os.path.exists(buildFileDir):
+            os.makedirs(buildFileDir)
+        writer = get_writer(output, open(buildFilePath, 'w'))
+        writer.write(taskList)
+
+class Task(object):
+    """ Abstract Task object. """
+    pass
+        
+class Command(Task):
+    """
+        This class implements a command definition.
+        It handles command id and stage.
+        All command from one stage should be finished before starting the next stage.
+    """
+    def __init__(self, executable, path, args=None, name=''):
+        Task.__init__(self)
+        if args == None:
+            args = []
+        self._id  = 1
+        self._stage = 1
+        self._name = name
+        self._executable = executable
+        self._path = path
+        self._args = args
+
+    def setJobId(self, idn):
+        """ Set the command id. """
+        self._id = idn
+
+    def setStage(self, stage):
+        """ Set the command stage. """
+        self._stage = stage
+
+    def jobId(self):
+        """ Get the command id. """
+        return self._id
+
+    def stage(self):
+        """ Get the command stage. """
+        return self._stage
+
+    def name(self):
+        """ Get the command name. """
+        return self._name
+
+    def executable(self):
+        """ Get the command executable. """
+        return self._executable
+
+    def path(self):
+        """ Get the command path. """
+        return self._path
+
+    def cmd(self):
+        """ Get the command line. """
+        return ' '.join(self._args)
+
+    def addArg(self, arg):
+        """ Add a command line argument. """
+        self._args.append(arg)
+
+    def __repr__(self):
+        argsString = ' '.join(self._args)
+        return "%s: %s: %s" % (self.name(), self.path(), argsString)
+
+class AntTask(Task):
+    """ Interface that defines supports for an Ant task rendering. """
+    
+    def toAntTask(self, doc):
+        """ Override this method to convert a specific command into Ant command.
+            e.g: Delete Class will use delete task from Ant, else convert into perl ... remove filename.__getCommandByStage
+        """ 
+        pass
+    
+class Delete(AntTask, Command):
+    """ Implements file/directory deleletion mechanism. """
+    
+    def __init__(self, filename=None, dirname=None):
+        Command.__init__(self, "perl", "")
+        AntTask.__init__(self)
+        self._filename = filename
+        self._dir = dirname
+        self._args.append("-MExtUtils::Command")
+        self._args.append("-e")
+        if self._filename != None:
+            self._args.append("rm_f")
+            self._args.append('"' + self._filename + '"')
+        elif self._dir != None:
+            self._args.append("rm_rf")
+            self._args.append('"' + self._dir + '"')
+
+    def toAntTask(self, doc):
+        """ Render the delete as an Ant task. """
+        node = doc.createElementNS("", "delete")
+        node.setAttributeNS("", "verbose", "true")
+        node.setAttributeNS("", "failonerror", "false")
+        if self._filename != None:
+            node.setAttributeNS("", "file", self._filename)
+        elif self._dir != None:
+            node.setAttributeNS("", "dir", self._dir)
+        return node
+
+
+class Copy(AntTask, Command):
+    """ Implement copy command. """
+    def __init__(self, srcFile, todir):
+        Command.__init__(self, "perl", os.path.dirname(srcFile))
+        AntTask.__init__(self)
+        self.srcFile = srcFile
+        self.todir = todir
+        self._args.append("-MExtUtils::Command")
+        self._args.append("-e")
+        self._args.append("cp")
+        self._args.append('"' + self.srcFile + '"')
+        self._args.append('"' + os.path.join(self.todir, os.path.basename(self.srcFile)) + '"')
+        
+    def toAntTask(self, doc):
+        """ Render the copy as an Ant task. """
+        node = doc.createElementNS("", "copy")
+        node.setAttributeNS("", "verbose", "true")
+        node.setAttributeNS("", "failonerror", "false")
+        node.setAttributeNS("", "file", self.srcFile)
+        node.setAttributeNS("", "todir", self.todir)
+        return node
+         
+
+class CommandList(object):
+    """
+        This class allows to safely handle Command object into lists
+    """
+    def __init__(self):
+        self.__cmds = []
+
+    def allCommands(self):
+        """ Returns all command list. """
+        return self.__cmds
+
+    def addCommand(self, cmd, newstage=False):
+        """ Add a Command to the list. """
+        stage = 1
+        idn = 1
+        if len(self.__cmds) > 0:
+            lastcmd = self.__cmds[-1]
+            idn = lastcmd.jobId() + 1
+            stage = lastcmd.stage()
+            if newstage:
+                stage = stage + 1
+        cmd.setStage(stage)
+        cmd.setJobId(idn)
+        self.__cmds.append(cmd)
+
+
+class AbstractOutputWriter:
+    """Base class which contains define an AbstractOutputWriter.
+
+    The subclass must implement a convert method which compute a command list into
+    some output file.
+    """
+    def __init__(self, fileOut):
+        if isinstance(fileOut, basestring):
+            self._fileOut = open(fileOut, 'w')
+        else:
+            self._fileOut = fileOut
+
+    def write(self, cmdList):
+        """ Method to override to implement format specific output. """
+    def writeTopLevel(self, config_list, spec_name, output_path, xml_file):
+        """ Method to override to implement top level commands. """
+
+    def __call__(self, cmdList):
+        self.write(cmdList)
+
+    def close(self):
+        """ Close the output stream. """
+        self._fileOut.close()
+
+    def __del__(self):
+        self.close()
+
+class StringWriter(AbstractOutputWriter):
+    """ Implements a Writer which is able to directly write to the output stream. """
+    
+    def __init__(self, fileOut):
+        AbstractOutputWriter.__init__(self, fileOut)
+
+    def write(self, content):
+        """ Write content to the output. """
+        self._fileOut.write(content)
+
+
+class EBSWriter(AbstractOutputWriter):
+    """ Implements EBS XML output format. """
+    
+    def __init__(self, fileOut):
+        AbstractOutputWriter.__init__(self, fileOut)
+
+    def write(self, cmdList):
+        """ Write the command list to EBS format. """
+        doc = xml.dom.minidom.Document()
+        productnode = doc.createElementNS("", "Product")
+        cmdsnode = doc.createElementNS("", "Commands")
+        productnode.appendChild(cmdsnode)
+        doc.appendChild(productnode)
+
+        for cmd in cmdList.allCommands():
+            cmdsnode.appendChild(self.__commandToXml(doc, cmd))
+
+        self._fileOut.write(doc.toprettyxml())
+
+    @staticmethod
+    def __commandToXml(doc, cmd):
+        """ Convert a Command into an EBS command. """
+        # <Execute ID="1" Stage="1" Component="MAS" Cwd="%EPOCROOT%" CommandLine="getrel MAS 92_013_Symbian_OS"/>
+        cmdsnode = doc.createElementNS("", "Execute")
+        cmdsnode.setAttributeNS("", "ID", "%d" % cmd.jobId())
+        cmdsnode.setAttributeNS("", "Stage", "%d" % cmd.stage())
+        cmdsnode.setAttributeNS("", "Component", cmd.name())
+        cmdsnode.setAttributeNS("", "Cwd", cmd.path())
+        cmdsnode.setAttributeNS("", "CommandLine", cmd.executable()+" "+cmd.cmd())
+        return cmdsnode
+
+
+class AntWriter(AbstractOutputWriter):
+    """ Implements Ant XML output format. """
+    
+    def __init__(self, fileOut):
+        AbstractOutputWriter.__init__(self, fileOut)
+
+    def writeTopLevel(self, config_list, spec_name, output_path, xml_file):
+        doc = xml.dom.minidom.Document()
+        projectnode = doc.createElementNS("", "project")
+        projectnode.setAttributeNS("", "name", '')
+        projectnode.setAttributeNS("", "default", "all")
+        doc.appendChild(projectnode)
+        target = doc.createElementNS("", "target")
+        target.setAttributeNS("", "name", "all")
+        projectnode.appendChild(target)
+
+        parallel = doc.createElementNS("", "parallel")
+        parallel.setAttributeNS("", "threadCount", "${number.of.threads}")
+        target.appendChild(parallel)
+        index = 0
+        script_loc = os.path.normpath(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/lib/CreateZipInput.py'))
+        for config in config_list:
+            sequential = doc.createElementNS("", "sequential")
+            outputfile = os.path.normpath(os.path.join(output_path, config + ".xml"))
+            exec_element = doc.createElementNS("", "exec")
+            exec_element.setAttributeNS("", "executable", "python")
+            exec_element.setAttributeNS("", "failonerror", "true")
+
+            args = doc.createElementNS("", "arg")
+            args.setAttributeNS("", "value", "%s" % script_loc)
+            exec_element.appendChild(args)
+
+            args = doc.createElementNS("", "arg")
+            args.setAttributeNS("", "line", "--output=%s" % outputfile)
+            exec_element.appendChild(args)
+            args = doc.createElementNS("", "arg")
+            args.setAttributeNS("", "line", "--config=%s" % spec_name)
+            exec_element.appendChild(args)
+            args = doc.createElementNS("", "arg")
+            args.setAttributeNS("", "line", "--filename=%s" % xml_file)
+            exec_element.appendChild(args)
+            args = doc.createElementNS("", "arg")
+            args.setAttributeNS("", "line", "--id=%d" % index)
+            exec_element.appendChild(args)
+            args = doc.createElementNS("", "arg")
+            args.setAttributeNS("", "line", "--writertype=ant")
+            exec_element.appendChild(args)
+            sequential.appendChild(exec_element)
+            index += 1
+            ant_exec = doc.createElementNS("", "ant")
+            ant_exec.setAttributeNS("", "antfile", outputfile)
+            sequential.appendChild(ant_exec)
+            parallel.appendChild(sequential)
+        
+        self._fileOut.write(doc.toprettyxml())
+        self._fileOut.close()
+        
+    def write(self, cmdList):
+        """ Writes the command list to Ant format. """
+        doc = xml.dom.minidom.Document()
+        projectnode = doc.createElementNS("", "project")
+        projectnode.setAttributeNS("", "name", '')
+        projectnode.setAttributeNS("", "default", "all")
+        doc.appendChild(projectnode)
+
+        stages = self.__getCommandByStage(cmdList)
+
+        for stage in stages.keys():
+            projectnode.appendChild(self.__stageToTarget(doc, stage, stages[stage]))
+
+        target = doc.createElementNS("", "target")
+        target.setAttributeNS("", "name", "all")
+        def __toStage(stage):
+            """ Convert the stage id into and Ant target name. """
+            return "stage%s" % stage
+        target.setAttributeNS("", "depends", ','.join([__toStage(stage) for stage in stages.keys()]))
+        projectnode.appendChild(target)
+
+        self._fileOut.write(doc.toprettyxml())
+
+    def __stageToTarget(self, doc, stage, cmds):
+        """ Convert a stage into an Ant target. """
+        target = doc.createElementNS("", "target")
+        target.setAttributeNS("", "name", "stage%s" % stage)
+        parallel = doc.createElementNS("", "parallel")
+        parallel.setAttributeNS("", "threadCount", "${number.of.threads}")
+        target.appendChild(parallel)
+
+        for cmd in cmds:
+            parallel.appendChild(self.__commandToAnt(doc, cmd))
+        return target
+
+    @staticmethod
+    def __commandToAnt(doc, cmd):
+        """ Convert a command into an Ant task. """
+        # does the API support Ant task conversion.
+        # else treat it as a cmd
+        if issubclass(type(cmd), AntTask):
+            return cmd.toAntTask(doc)
+        else:
+            execnode = doc.createElementNS("", "exec")
+            execnode.setAttributeNS("", "executable", cmd.executable())
+            execnode.setAttributeNS("", "dir", cmd.path())
+            arg = doc.createElementNS("", "arg")
+            arg.setAttributeNS("", "line", cmd.cmd())
+            execnode.appendChild(arg)
+            return execnode
+
+    @staticmethod
+    def __getCommandByStage(cmdList):
+        """ Reorder a CommandList into a list of stages. """
+        stages = {}
+        for cmd in cmdList.allCommands():
+            if not stages.has_key(cmd.stage()):
+                stages[cmd.stage()]=[]
+            stages[cmd.stage()].append(cmd)
+
+        return stages
+
+
+class MakeWriter(AbstractOutputWriter):
+    """ Implements Makefile writer. """
+    
+    def __init__(self, fileOut):
+        AbstractOutputWriter.__init__(self, fileOut)
+
+    def writeTopLevel(self, config_list, spec_name, output_path, xml_file):
+        content = "\n\nall: zip_inputs zip_files\n\n"
+        index = 0
+        input_list = "zip_inputs: "
+        zip_list = "\n\nzip_files: "
+        full_content = ""
+        script_path =  os.path.normpath(os.path.join(os.environ['HELIUM_HOME'], 'tools/compile/ec'))
+        for config in config_list:
+            outputfile = os.path.normpath(os.path.join(output_path, config + ".mk"))
+            input_list += " \\\n\t zip_input%d" % index
+            zip_list += " \\\n\t zip_files%d" % index
+            content += "\n\nzip_input%d :\n" % index
+            content += "\t@echo === identifying files for %s\n" % config
+            
+            content += "\tpython $(HELIUM_HOME)\\tools\\common\\python\\lib\\CreateZipInput.py --config=%s --filename=%s --id=%d --output=%s --writertype=%s\n\n" % (spec_name, xml_file, index, outputfile,'make')
+            content += "\n\nzip_files%d :zip_input%d\n" % (index, index)
+            content += "\t@echo === identifying files for %s\n" % config
+            content += "\t$(MAKE) -f %s" % (outputfile)
+            index += 1
+        
+        full_content += input_list
+        full_content += zip_list
+        full_content += content
+        self._fileOut.write(full_content)
+    def write(self, cmdList):
+        """ Converts the list of command into Makefile. """
+        stages = {}
+        for cmd in cmdList.allCommands():
+            if not stages.has_key(cmd.stage()):
+                stages[cmd.stage()] = []
+            stages[cmd.stage()].append(cmd)
+        
+        # Write the all rule
+        def __toStage(stage):
+            """ Convert stage Id into a target name. """
+            return "stage%s" % stage
+                
+        #self._fileOut.write("all : %s\n" % ' '.join(map(__toStage, max(stages.keys())))
+        if len(stages.keys()) > 0:
+            self._fileOut.write("all : stage%s ;\n" % max(stages.keys()))
+        else:
+            self._fileOut.write("all: ;\n")
+            
+        for stage in stages.keys():
+            # Write each stage rule
+            def __toId(cmd):
+                """ Convert command Id into a target name. """
+                self.__commandToTarget(cmd)
+                return "id%s" % cmd.jobId()
+            self._fileOut.write("stage%s : %s\n" % (stage, ' '.join([__toId(task) for task in stages[stage]])))
+        
+
+    def __commandToTarget(self, cmd):
+        """ Converting a Command into a Makefile target. """
+        deps = ""
+        if cmd.stage() > 1:
+            deps = " stage%s" % (cmd.stage() - 1)
+        self._fileOut.write("id%s:%s\n" % (cmd.jobId(), deps))
+        self._fileOut.write("\t@echo Target %s\n" % cmd.name())
+        winargs = ""
+        if os.sep == '\\':
+            winargs = "/d"
+        self._fileOut.write("\tcd %s %s && %s " % (winargs, cmd.path(), cmd.executable()))
+        self._fileOut.write("%s\n" % cmd.cmd())
+        self._fileOut.write("\n")
+
+
+__writerConstructors = { 'ant': AntWriter,
+                         'make': MakeWriter,
+                         'ebs': EBSWriter }
+
+def convert(cmdList, filename, outputtype="ant"):
+    """ Helper to directly convert a command list into a specific runnable command format.
+        e.g:
+        cmdList = CommandList()
+        cmdList.addCommand(...)
+        convert(cmdList, "echo Hello world", "ant")
+    """
+    writer = __writerConstructors[outputtype](filename)
+    writer(cmdList)
+
+def get_writer(buildTool, fileOut):
+    """ Get a Writer for a specific format. """
+    return __writerConstructors[buildTool](fileOut)
+
+
+def supported_writers():
+    """ Return the list of supported Writer. """
+    return __writerConstructors.keys()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ccm/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1917 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" CM/Synergy Python toolkit.
+
+"""
+
+import logging
+import netrc
+import os
+import re
+import subprocess
+import sys
+import threading
+
+import fileutils
+import nokia.gscm
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+_logger = logging.getLogger("ccm")
+#logging.basicConfig(level=logging.DEBUG)
+
+
+VALID_OBJECT_STATES = ('working', 'checkpoint', 'public', 'prep', 'integrate', 'sqa', 'test','released')
+STATIC_OBJECT_STATES = ('integrate', 'sqa', 'test','released')
+CCM_SESSION_LOCK = os.path.join(os.environ['TEMP'], "ccm_session.lock")
+
+def _execute(command, timeout=None):
+    """ Runs a command and returns the result data. """
+    launcher = os.path.join(os.environ['HELIUM_HOME'], 'tools', 'common', 'python', 'scripts', 'timeout_launcher.py')
+    targ = ""
+    if timeout is not None:
+        targ = "--timeout=%s" % timeout
+    process = subprocess.Popen("python %s %s -- %s" % (launcher, targ, command), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+    stdout = process.communicate()[0]
+    process.wait()
+    _logger.debug(stdout)
+    _logger.debug("Return code: %s" % process.returncode)
+    return (stdout, process.returncode)
+   
+   
+class CCMException(Exception):
+    """ Base exception that should be raised by methods of this framework. """
+    def __init__(self, reason, result = None):
+        Exception.__init__(self, reason)
+        self.result = result
+
+
+class Result(object):
+    """Class that abstracts ccm call result handling.
+    
+    Subclass it to implement a new generic output parser.
+    """
+    def __init__(self, session):
+        self._session = session
+        self.status = None
+        self._output = None
+        self._output_str = None
+    
+    def _setoutput(self, output):
+        self._output = output
+        
+    def __setoutput(self, output):
+        """ Internal function to allow overloading, you must override _setoutput.
+        """
+        # the output is automatically converted to ascii before any treatment 
+        if isinstance(output, unicode):
+            self._output_str = output.encode('ascii', 'replace')
+        else:
+            self._output_str = output.decode('ascii', 'ignore')
+        _logger.debug("output ---->")
+        for line in self._output_str.splitlines():
+            _logger.debug(line)
+        _logger.debug("<----")
+        self._setoutput(self._output_str)
+                
+    def _getoutput(self):
+        """ Returns the content of _output. """
+        return self._output
+        
+    def __str__(self):
+        """ Synergy output log. """
+        return self._output_str.encode('ascii', 'replace')
+        
+    output = property(_getoutput, __setoutput)
+
+class ResultWithError(Result):
+	
+    def __init__(self, session):
+        Result.__init__(self, session)
+        self._error = None
+        self._error_str = None    
+
+    def _seterror(self, error):
+        self._error = error
+        
+    def __seterror(self, error):
+        """ Internal function to allow overloading, you must override _seterror.
+        """
+        # the error output is automatically converted to ascii before any treatment 
+        if isinstance(error, unicode):
+            self._error_str = error.encode('ascii', 'replace')
+        else:
+            self._error_str = error.decode('ascii', 'ignore')
+        _logger.debug("error ---->")
+        for line in self._error_str.splitlines():
+            _logger.debug(line)
+        _logger.debug("<----")
+        self._seterror(self._error_str)
+                
+    def _geterror(self):
+        """ Returns the content of _output. """
+        _logger.debug("_geterror")
+        return self._error
+
+    error = property(_geterror, __seterror)
+    
+class ProjectCheckoutResult(Result):
+    """ Project checkout output parser. 
+        Sets project to the created project or None if failed.
+    """
+    def __init__(self, session, project):
+        Result.__init__(self, session)
+        self.__project = project
+        self.__result_project = None
+    
+    def _setoutput(self, output):
+        """ Parsing the output of the checkout command. """
+        self._output = output
+        for line in output.splitlines():
+            mresult = re.match(r"Saved work area options for project: '(.+)'", line, re.I)
+            #(?P<name>.+)-(?P<version>.+?)(:(?P<type>\S+):(?P<instance>\S+))?
+            if mresult != None:
+                #self.__project.name + "-" + mo.groupdict()['version'] + ":" + self.__project.type + ":" + self.__project.instance
+                self.__result_project = self._session.create(mresult.group(1))
+                _logger.debug("ProjectCheckoutResult: project: '%s'" % self.__result_project)
+                return
+
+    def __get_result_project(self):
+        """ return the checked out project. """
+        return self.__result_project
+    
+    project = property(__get_result_project)
+
+
+class ProjectPurposeResult(Result):
+    """ Parses purpose query output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+
+    def _setoutput(self, output):
+        self._output = {}
+        for line in output.splitlines():
+            mresult = re.match(r"(?P<purpose>.+?)\s+(?P<member_status>\w+)\s+(?P<status>\w+)$", line)
+            if mresult != None:
+                data = mresult.groupdict()                
+                if re.match(r'^\s+Purpose\s+Member$', data['purpose'], re.I) == None:
+                    self._output[data['purpose'].strip()] = {'member_status' : data['member_status'].strip(),
+                                                  'status' : data['status'].strip()
+                                                  }
+
+class ConflictsResult(Result):
+    """ Parses purpose query output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+
+    def _setoutput(self, output):
+        self._output = {}
+        project = None
+                
+        for line in output.splitlines():            
+            mresult = re.match(r"Project:\s*(.+)\s*$", line)
+            if mresult != None:
+                project = self._session.create(mresult.group(1))
+                self._output[project] = []
+            mresult = re.match(r"^(.*)\s+(\w+#\d+)\s+(.+)$", line)
+            if mresult != None and project != None:
+                self._output[project].append({'object': self._session.create(mresult.group(1)),
+                                              'task': self._session.create("Task %s" % mresult.group(2)),
+                                              'comment': mresult.group(3)})
+            mresult = re.match(r"^(\w+#\d+)\s+(.+)$", line)
+            if mresult != None and project != None:
+                self._output[project].append({'task': self._session.create("Task %s" % mresult.group(1)),
+                                              'comment': mresult.group(2)})
+
+
+class FinduseResult(Result):
+    """ Parses finduse query output. """
+    def __init__(self, ccm_object):
+        Result.__init__(self, ccm_object.session)
+        self.__object = ccm_object
+
+    def _setoutput(self, output):
+        self._output = []
+        for line in output.splitlines():
+            _logger.debug("FinduseResult: ---->%s<----" % line)
+            _logger.debug("FinduseResult: ---->%s-%s<----" % (self.__object.name, self.__object.version))
+            
+            # MCNaviscroll\NaviAnim-username7@MCNaviscroll-username6            
+            mresult = re.match(r"^\s*(?P<path>.+)[\\/]%s-%s@(?P<project>.+)" % (self.__object.name, self.__object.version), line, re.I)
+            if mresult != None:
+                data = mresult.groupdict()
+                _logger.debug("FinduseResult: %s" % data)               
+                project = self._session.create(data['project'])
+                self._output.append({'path' : data['path'], 'project' : project})
+        
+        
+class UpdateTemplateInformation(Result):
+    """ Parse update template information output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+    
+    def _setoutput(self, output):
+        """
+Baseline Selection Mode: Latest Baseline Projects
+Prep Allowed:            No
+Versions Matching:       *abs.50*
+Release Purposes:
+Use by Default:          Yes
+Modifiable in Database:  tr1s60
+In Use For Release:      Yes
+Folder Templates and Folders:
+- Template assigned or completed tasks for %owner for release %release
+- Template all completed tasks for release %release
+- Folder   tr1s60#4844: All completed Xuikon/Xuikon_rel_X tasks
+- Folder   tr1s60#4930: All tasks for release AppBaseDo_50        
+        """
+        self._output = {}
+        for line in output.splitlines():
+            rmo = re.match(r"^\s*(.+):\s*(.*)\s*", line)
+            if rmo != None:
+                if rmo.group(1) == "Baseline Selection Mode":
+                    self._output['baseline_selection_mode'] = rmo.group(2) 
+                elif rmo.group(1) == "Prep Allowed":
+                    self._output['prep_allowed'] = (rmo.group(2) != "No") 
+                elif rmo.group(1) == "Versions Matching":
+                    self._output['version_matching'] = rmo.group(2) 
+                elif rmo.group(1) == "Release Purposes":
+                    self._output['release_purpose'] = rmo.group(2) 
+                elif rmo.group(1) == "Use by Default":
+                    self._output['default'] = (rmo.group(2) != "No") 
+                elif rmo.group(1) == "Modifiable in Database":
+                    self._output['modifiable_in_database'] = rmo.group(2).strip()
+                elif rmo.group(1) == "In Use For Release":
+                    self._output['in_use_for_release'] = (rmo.group(2) != "No") 
+                
+
+class UpdatePropertiesRefreshResult(Result):
+    """ Parse update template refresh output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+
+    def _setoutput(self, output):
+        self._output = {'added': [], 'removed': []}
+        match_added = re.compile(r"^Added the following tasks")
+        match_removed = re.compile(r"^Removed the following tasks")
+        match_task_new = re.compile(r"^\s+(Task \S+#\d+)")        
+        section = None
+                
+        for line in output.splitlines():
+            res = match_added.match(line)
+            if res != None:
+                section = 'added'
+                continue
+            res = match_removed.match(line)
+            if res != None:
+                section = 'removed'
+                continue
+            if section is not None:
+                res = match_task_new.match(line)
+                if res != None:
+                    self._output[section].append(self._session.create(res.group(1)))
+                    continue
+
+
+class UpdateResultSimple(Result):
+    """ Parse update output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+        self._success = True
+
+    def _setoutput(self, output):
+        self._output = output
+        match_failed = re.compile(r"(Update failed)")        
+        for line in output.splitlines():
+            res = match_failed.match(line)
+            if res != None:                
+                self._success = False
+    
+    @property
+    def successful(self):
+        return self._success
+         
+class UpdateResult(UpdateResultSimple):
+    """ Parse update output. """
+    def __init__(self, session):
+        UpdateResultSimple.__init__(self, session)
+
+    def _setoutput(self, output):
+        self._output = {"tasks":[], "modifications": [], "errors": [], "warnings": []}
+        match_object_update = re.compile(r"^\s+'(.*)'\s+replaces\s+'(.*)'\s+under\s+'(.*)'\.")
+        match_object_new = re.compile(r"^\s+(?:Subproject\s+)?'(.*)'\s+is now bound under\s+'(.*)'\.")
+        match_task_new = re.compile(r"^\s+(Task \S+#\d+)")
+        match_no_candidate = re.compile(r"^\s+(.+) in project (.+) had no candidates")
+        match_update_failure = re.compile(r"^\s+Failed to use selected object\s+(.+)\s+under directory\s+(.+)\s+in project\s+(.+)\s+:\s+(.+)")
+        match_warning = re.compile(r"^Warning:(.*)")
+        match_failed = re.compile(r"(Update failed)")
+        
+        # TODO: cleanup the parsing to do that in a more efficient way.
+        for line in output.splitlines():
+            _logger.info(line)
+            res = match_object_update.match(line)
+            if res != None:
+                self._output['modifications'].append({ "new": self._session.create(res.group(1)),
+                                      "old": self._session.create(res.group(2)),
+                                      "project": self._session.create(res.group(3))
+                                    })
+                continue
+            res = match_object_new.match(line)
+            if res != None:                
+                self._output['modifications'].append({ "new": self._session.create(res.group(1)),
+                                      "old": None,
+                                      "project": self._session.create(res.group(2))
+                                    })
+                continue
+            res = match_task_new.match(line)
+            if res != None:                
+                self._output['tasks'].append(self._session.create(res.group(1)))
+                continue
+            res = match_no_candidate.match(line)
+            if res != None:                
+                self._output['errors'].append({'family': res.group(1),
+                                               'project': self._session.create(res.group(2)),
+                                               'comment': "had no candidates",
+                                               'line': line,
+                                               })
+                continue
+            res = match_update_failure.match(line)
+            if res != None:                
+                self._output['errors'].append({'family': res.group(1),
+                                               'dir': self._session.create(res.group(2)),
+                                               'project': self._session.create(res.group(3)),
+                                               'comment': res.group(4),
+                                               'line': line,
+                                               })
+                continue
+            res = match_warning.match(line)            
+            if res != None:                
+                self._output['warnings'].append({'family': None,
+                                               'project': None,
+                                               'comment': res.group(1),
+                                               'line': line,
+                                               })
+                continue
+            res = match_failed.match(line)
+            if res != None:
+                self._success = False
+                self._output['errors'].append({'Serious': res.group(1),
+                                               })
+                continue
+                
+            
+
+class WorkAreaInfoResult(Result):
+    """ Parse work area info output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+
+    def _setoutput(self, output):
+        """ Returns a dict with the following fields:
+               * project: a ccm.Project instance
+               * maintain: a boolean
+               * copies: a boolean
+               * relative: a boolean
+               * time: a boolean
+               * translate: a boolean
+               * modify: a boolean
+               * path: a string representing the project wa path
+        """
+        self._output = None
+        for line in output.splitlines():
+            mresult = re.match(r"(?P<project>.*)\s+(?P<maintain>TRUE|FALSE)\s+(?P<copies>TRUE|FALSE)\s+(?P<relative>TRUE|FALSE)\s+(?P<time>TRUE|FALSE)\s+(?P<translate>TRUE|FALSE)\s+(?P<modify>TRUE|FALSE)\s+'(?P<path>.*)'", line)            
+            if mresult != None:
+                data = mresult.groupdict()
+                self._output = {'project': self._session.create(data['project']),
+                                'maintain' : data['maintain'] == "TRUE",
+                                'copies' : data['copies'] == "TRUE",
+                                'relative' : data['relative'] == "TRUE",
+                                'time' : data['time'] == "TRUE",
+                                'translate' : data['translate'] == "TRUE",
+                                'modify' : data['modify'] == "TRUE",
+                                'path' : data['path']
+                                }
+                return
+
+
+class CreateNewTaskResult(Result):
+    
+    def __init__(self, session):
+        Result.__init__(self, session)
+
+    def _setoutput(self, output):
+        self._output = None
+        for line in output.splitlines():
+            mresult = re.match(r"Task\s+(?P<task>\S+\#\d+)\s+created\.", line)
+            if mresult != None:
+                self._output = self._session.create("Task " + mresult.groupdict()['task'])
+                return
+    
+    
+class AttributeNameListResult(Result):
+    """ Class that abstract ccm call result handling.
+        Subclass it to implement a new generic output parser.
+    """
+    def __init__(self, session):
+        Result.__init__(self, session)
+    
+    def _setoutput(self, obj):
+        def _create(arg):
+            mresult = re.match(r"^\s*(?P<name>\w+)", arg.strip())
+            if mresult != None:
+                return mresult.groupdict()['name']
+            return None
+        self._output = [_create(line) for line in obj.strip().splitlines()]
+
+
+class ObjectListResult(Result):
+    """ Parses an object list Synergy output. """
+    def __init__(self, session):
+        Result.__init__(self, session)
+    
+    def _setoutput(self, obj):        
+        self._output = []
+        if re.match(r"^None|^No tasks|^Warning", obj, re.M) != None:
+            return
+        def _create(arg):
+            arg = arg.strip()
+            if arg != "":
+                return self._session.create(arg)
+            return None
+        result = [_create(line) for line in obj.strip().splitlines()]
+        for result_line in result:
+            if result_line != None:
+                self._output.append(result_line)
+
+class DataMapperListResult(Result):
+    """ Parses an object list Synergy output. """        
+    
+    dataconv = {'ccmobject': lambda x, y: x.create(y),
+                'string': lambda x, y: y,
+                'int': lambda x, y: int(y),
+                'boolean': lambda x, y: (y.lower() == "true")}    
+    
+    def __init__(self, session, separator, keywords, datamodel):
+        self._separator = separator
+        self._keywords = keywords
+        self._datamodel = datamodel
+        Result.__init__(self, session)
+    
+    def format(self):
+        formatted_keywords = ["%s%s%s%%%s" % (self._separator, x, self._separator, x) for x in self._keywords]
+        return "".join(formatted_keywords) + self._separator
+   
+    def regex(self):
+        regex_keywords = [r'%s%s%s(.*?)' % (self._separator, x, self._separator) for x in self._keywords]
+        regex = r''.join(regex_keywords)
+        regex = r"%s%s\s*\n" % (regex, self._separator)
+        return re.compile(regex, re.MULTILINE | re.I | re.DOTALL | re.VERBOSE | re.U)
+    
+    def _setoutput(self, obj):
+        self._output = []
+        regex = self.regex()
+        _logger.debug("Regex %s" % (regex.pattern))
+        for match in regex.finditer(obj):
+            _logger.debug("Found: %s" % (match))
+            if match != None:
+                output_line = {}
+                for i in range(len(self._datamodel)):
+                    _logger.debug("Found %d: %s" % (i, match.group(i + 1)))
+                    model = self._datamodel[i]
+                    output_line[self._keywords[i]] = self.dataconv[model](self._session, match.group(i + 1))
+                    i += 1
+                self._output.append(output_line)
+                
+
+class FolderCopyResult(Result):
+    """ Parses a folder copy result """
+    def __init__(self, session):
+        Result.__init__(self, session)
+
+    def _setoutput(self, output):
+        self._output = None
+        for line in output.splitlines():
+            mo = re.match(r"appended to", line)
+            if mo != None:
+                self._output = self._session.create(line)
+                return
+
+CHECKOUT_LOG_RULES = [[r'^Derive failed for', logging.ERROR],
+                      [r'^Serious:', logging.ERROR],
+                      [r'^Warning: .* failed.', logging.ERROR],
+                      [r'^WARNING:', logging.WARNING],
+                      [r'^Warning:', logging.WARNING],]
+
+
+UPDATE_LOG_RULES = [[r'^Update failed.', logging.ERROR],
+                    [r'^Serious:', logging.ERROR],
+                    [r'^\s+Failed to', logging.ERROR],
+                    [r'^\d+ failures to', logging.ERROR],
+                    [r"^Warning: This work area '.+' cannot be reused", logging.ERROR],
+                    [r'^Rebind of .* failed', logging.ERROR],
+                    [r'^Warning: .* failed.', logging.ERROR],
+                    [r'^Skipping \'.*\'\.  You do not have permission to modify this project.', logging.ERROR],
+                    [r'^Work area conflict exists for file', logging.ERROR],
+                    [r'^Warning:  No candidates found for directory entry', logging.ERROR],
+                    [r'^WARNING:', logging.WARNING],
+                    [r'^Warning:', logging.WARNING],]
+
+CONFLICTS_LOG_RULES = [[r'^\w+#\d+\s+Implicit', logging.WARNING],
+                       [r'^(.*)\s+(\w+#\d+)\s+(.+)', logging.WARNING],
+                       [r'.*Explicitly specified but not included', logging.WARNING],]
+
+SYNC_LOG_RULES = [[r'^\s+0\s+Conflict\(s\) for project', logging.INFO],
+                  [r'^\s+\d+\s+Conflict\(s\) for project', logging.ERROR],
+                  [r'^Project \'.*\' does not maintain a workarea.', logging.ERROR],
+                  [r'^Work area conflict exists for file', logging.ERROR],
+                  [r'^Warning: Conflicts detected during synchronization. Check your logs.', logging.ERROR],
+                  [r'^Warning:', logging.WARNING],]
+
+def log_result(result, rules, logger=None):
+    """ Rules it a list of tuple defining a regular expression and an log level. """
+    if logger is None:
+        logger = _logger
+    crules = []
+    if rules is not None:
+        for rule in rules:
+            crules.append([re.compile(rule[0]), rule[1]])
+                
+    for line in str(result).splitlines():
+        for rule in crules:
+            if rule[0].match(line) != None:
+                logger.log(rule[1], line)
+                break
+        else:
+            logger.info(line)
+    
+class AbstractSession(object):
+    """An abstract Synergy session.
+
+    Must be overridden to implement either a single session or
+    multiple session handling.
+    """
+    def __init__(self, username, engine, dbpath, ccm_addr):
+        self.username = username
+        self.engine = engine
+        self.dbpath = dbpath
+        self._session_addr = ccm_addr
+        # internal object list
+        self.__ccm_objects = {}
+    
+    def addr(self):
+        """ Returns the Synergy session id."""
+        return self._session_addr
+    
+    def database(self):
+        _logger.debug("AbstractSession: database")
+        self.__find_dbpath()
+        _logger.debug("AbstractSession: database: %s" % self.dbpath)
+        return os.path.basename(self.dbpath)
+    
+    def __find_dbpath(self):
+        """ retrieve the database path from current session status. """
+        _logger.debug("AbstractSession: __find_dbpath")
+        if (self.dbpath != None):            
+            return
+        result = self.execute("status")
+        for match in re.finditer(r'(?:(?:Graphical)|(?:Command)) Interface\s+@\s+(?P<ccmaddr>\w+:\d+(?:\:\d+\.\d+\.\d+\.\d+)+)(?P<current_session>\s+\(current\s+session\))?\s*\nDatabase:\s*(?P<dbpath>\S+)', result.output, re.M | re.I):
+            d = match.groupdict()
+            if (d['current_session'] != None):
+                _logger.debug("AbstractSession: __find_dbpath: Found dbpath: %s" % d['dbpath'])
+                self.dbpath = d['dbpath']
+        assert self.dbpath != None
+    
+    def execute(self, _, result=None):
+        """ Abstract function that should implement the execution of ccm command
+            line call.
+        """
+        return result
+
+    def create(self, fpn):
+        """ Object factory, this is the toolkit entry point to create objects from
+            four part names. Objects are stored into a dictionary, so you have
+            only one wrapper per synergy object.
+        """
+        result = re.search(r"^(?P<project>.+)-(?P<version>[^:]+?)$", fpn)
+        if result != None:
+            matches = result.groupdict()
+            fpn = "%s-%s:project:%s#1" % (matches['project'], matches['version'], self.database())
+        _logger.debug("session.create('%s')" % fpn)
+        ofpn = FourPartName(fpn)
+        if not self.__ccm_objects.has_key(str(fpn)):
+            obj = None
+            if ofpn.type == 'project':
+                obj = Project(self, fpn)
+            elif ofpn.type == 'dir':
+                obj = Dir(self, fpn)
+            elif ofpn.type == 'task':
+                obj = Task(self, fpn)
+            elif ofpn.type == 'folder':
+                obj = Folder(self, fpn)
+            elif ofpn.type == 'releasedef':
+                obj = Releasedef(self, fpn)
+            else:
+                obj = File(self, fpn)
+            self.__ccm_objects[str(fpn)] = obj
+        return self.__ccm_objects[str(fpn)]
+
+    def get_workarea_info(self, dir_):
+        """ Return a dictionary containing workarea info from directory dir.
+        """
+        if (not os.path.exists(dir_)):
+            raise CCMException("Error retrieving work_area info for the directory '%s' (doesn't exists)" % dir_)
+        path = os.path.abspath(os.path.curdir)        
+        path_ccmwaid = os.path.join(dir_,"_ccmwaid.inf");
+        if(not os.path.exists(path_ccmwaid)):
+            raise CCMException("No work area in '%s'" % dir_)
+        os.chdir(dir_)
+        result = self.execute("wa -show", WorkAreaInfoResult(self))
+        os.chdir(path)
+        if result.output == None:
+            raise CCMException("Error retrieving work_area info for the directory '%s'" % dir_)
+        return result.output
+
+    def _get_role(self):
+        result = self.execute("set role")
+        return result.output.strip()
+    
+    def _set_role_internal(self, role):
+        """ method to be override by child class else property accession is not working properly. """
+        if  role == None or len(role) == 0:
+            raise CCMException("You must provide a role.")
+        result = self.execute("set role %s" % role)
+        if re.match(r'^Warning:', result.output, re.M) != None:
+            raise CCMException("Error switching to role %s: %s" %(role, result.output.strip()))
+
+    def _set_role(self, role):
+        self._set_role_internal(role)
+        
+    role = property(fget=_get_role, fset=_set_role)
+    
+    def _get_home(self):
+        result = self.execute("set Home")
+        return result.output.strip()
+        
+    def _set_home(self, home):
+        if len(home) == 0 or home == None:
+            raise CCMException("You must provide a home.")
+        result = self.execute("set Home %s" % home)
+        if re.match(r'^Warning:', result.output, re.M) != None:
+            raise CCMException("Error switching to Home %s: %s" %(home, result.output.strip()))
+    
+    home = property(_get_home, _set_home)
+    
+    def close(self):
+        pass
+    
+    def __str__(self):
+        self.__find_dbpath()
+        return self._session_addr + ':' + self.dbpath
+        
+    def __repr__(self):
+        return self.__str__()
+    
+    def __del__(self):
+        self.close()
+
+    def purposes(self, role=None):
+        """ Returns available purposes. """
+        args = ""
+        if role != None:
+            args = "-role \"%s\"" % role
+        result = self.execute("project_purpose -show %s" % args, ProjectPurposeResult(self))
+        return result.output        
+
+class Session(AbstractSession):
+    """A Synergy session.
+    """
+    def __init__(self, username, engine, dbpath, ccm_addr, close_on_exit=True):
+        AbstractSession.__init__(self, username, engine, dbpath, ccm_addr)
+        self._execute_lock = threading.Lock()
+        self.close_on_exit = close_on_exit
+
+    @staticmethod
+    def start(username, password, engine, dbpath, timeout=300):
+        if username == None:
+            raise CCMException('username is not valid')
+        if password == None:
+            raise CCMException('password is not valid')
+        if CCM_BIN == None:
+            raise CCMException("Could not find CM/Synergy executable in the path.")
+        command = "%s start -m -q -nogui -n %s -pw %s -h %s -d %s" % \
+                    (CCM_BIN, username, password, engine, dbpath)
+        _logger.debug('Starting new session:' + command.replace(password, "***"))
+        (result, status) = _execute(command, timeout=timeout)
+        if status != 0:
+            raise Exception("Error creating a session: result:\n%s" % result)
+        session_addr = result.strip()
+        _logger.debug(session_addr)
+        if not re.match(r'\w+:\d+:\d+.\d+.\d+.\d+(:\d+.\d+.\d+.\d+)?', session_addr):
+            raise Exception("Error creating a session: result:\n%s" % result)
+        return Session(username, engine, dbpath, session_addr)        
+            
+    def execute(self, cmdline, result=None):
+        """ Executes a Synergy CLI operation. """
+        if self._session_addr == None:
+            raise CCMException("No Synergy session running")        
+        if CCM_BIN == None:
+            raise CCMException("Could not find CM/Synergy executable in the path.")
+        self._execute_lock.acquire()
+        output = ""
+        error = ""
+        try:
+            if result == None:
+                result = Result(self)
+            if os.sep == '\\':
+                command = "set CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " %s" % cmdline
+            else:
+                command = "export CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " %s" % cmdline
+            _logger.debug('Execute > ' + command)
+
+            if hasattr(result, 'error'):
+                process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                output = process.stdout.read()
+                error = process.stderr.read()
+                result.status = process.returncode
+            else:
+                process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+                output = process.stdout.read()
+                result.status = process.returncode
+        finally:
+            self._execute_lock.release()
+        result.output = output.strip()
+        if hasattr(result, 'error'):
+            result.error = error.strip()
+        return result
+
+    def close(self):
+        """ Closes this Synergy session if it was not previously running anyway. """
+        _logger.debug("Closing session %s" % self._session_addr)
+        if self._session_addr != None and self.close_on_exit:
+            _logger.debug("Closing session %s" % self._session_addr)
+            self._execute_lock.acquire()
+            if os.sep == '\\':
+                command = "set CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " stop"
+            else:
+                command = "export CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " stop"
+            _logger.debug('Execute > ' + command)
+            pipe = os.popen(command)
+            pipe.close()
+            self._session_addr = None
+            self._execute_lock.release()
+        elif self._session_addr != None and not self.close_on_exit:
+            _logger.debug("Keeping session %s alive." % self._session_addr)
+
+
+class SessionPool(AbstractSession):
+    """ Session that transparently handled several subsession, to easily enable
+        multithreaded application.
+    """
+    def __init__(self, username, password, engine, dbpath, database=None, size=4, opener=None):
+        AbstractSession.__init__(self, username, engine, dbpath, None)
+        self._opener = opener
+        if self._opener is None:
+            self._opener = open_session
+        self._free_sessions = []
+        self._used_sessions = []
+        self._thread_sessions = {}
+        self._pool_lock = threading.Condition()
+        self._lock_pool = False
+        self.__password = password
+        self.__database = database        
+        self.size = size
+    
+    def _set_size(self, size):
+        """ Set the pool size """ 
+        self._pool_lock.acquire()
+        poolsize = len(self._free_sessions) + len(self._used_sessions)
+        if  poolsize > size:
+            to_be_remove = poolsize - size
+            self._lock_pool = True
+            while len(self._free_sessions) < to_be_remove:
+                self._pool_lock.wait()            
+            for _ in range(to_be_remove):
+                self._free_sessions.pop().close()
+            self._lock_pool = False
+        else: 
+            for _ in range(size - poolsize):
+                self._free_sessions.append(self._opener(self.username, self.__password, self.engine, self.dbpath, self.__database, False))
+        self._pool_lock.release()
+
+    def _get_size(self):
+        self._pool_lock.acquire()
+        poolsize = len(self._free_sessions) + len(self._used_sessions)
+        self._pool_lock.release()
+        return poolsize
+
+    size = property (_get_size, _set_size)
+    
+    def execute(self, cmdline, result=None):
+        """ Executing a ccm command on a free session. """        
+        _logger.debug("SessionPool:execute: %s %s" % (cmdline, type(result)))
+        
+        # waiting for a free session
+        self._pool_lock.acquire()        
+        
+        # check for recursion, in that case reallocate the same session,
+        if threading.currentThread() in self._thread_sessions:
+            _logger.debug("Same thread, reusing allocation session.")
+            # release the pool and reuse associated session
+            self._pool_lock.release()
+            return self._thread_sessions[threading.currentThread()].execute(cmdline, result)
+
+        while len(self._free_sessions)==0 or self._lock_pool:
+            self._pool_lock.wait()
+        session = self._free_sessions.pop(0)
+        self._used_sessions.append(session)
+        self._thread_sessions[threading.currentThread()] = session
+        self._pool_lock.release()
+        
+        # running command
+        try:
+            result = session.execute(cmdline, result)
+        finally:
+            # we can now release the session - anyway
+            self._pool_lock.acquire()
+            self._thread_sessions.pop(threading.currentThread())                
+            self._used_sessions.remove(session)
+            self._free_sessions.append(session)
+            self._pool_lock.notifyAll()
+            self._pool_lock.release()
+        return result
+
+    def close(self):
+        """ Closing all subsessions. """
+        _logger.debug("Closing session pool sub-sessions")
+        self._lock_pool = True
+        self._pool_lock.acquire()
+        while len(self._used_sessions) > 0:
+            _logger.debug("Waiting to free used sessions.")
+            _logger.debug("Waiting to free used sessions. %s %s" % (len(self._used_sessions), len(self._free_sessions)))            
+            _logger.debug(self._used_sessions)
+            _logger.debug(self._free_sessions)            
+            self._pool_lock.wait()
+        _logger.debug("Closing all free session from the pool.")
+        while len(self._free_sessions) > 0:
+            self._free_sessions.pop().close()
+        self._lock_pool = False
+        self._pool_lock.notifyAll()
+        self._pool_lock.release()
+    
+    def _set_role_internal(self, role):
+        """ Set role on all subsessions. """
+        self._lock_pool = True
+        self._pool_lock.acquire()
+        while len(self._used_sessions)!=0:
+            self._pool_lock.wait()
+            
+        try:
+            for session in self._free_sessions:
+                session.role = session._set_role(role)
+        finally:                
+            self._lock_pool = False
+            self._pool_lock.notifyAll()
+            self._pool_lock.release()
+
+
+class Query(object):
+    """ This object wrap a synergy query, it takes a query as input as well as the
+    attribute you want as output, and get them translated using the model configuration.
+    e.g 
+    Query(session, "type='task' and release='test/next'", ['objectname', 'task_synopsis'], ['ccmobject', 'string'])
+    
+    This will return a list of hash: [{'objectname': Task(xxx), 'task_synopsis': 'xxx'}, ...]
+    """
+    
+    def __init__(self, session, query, keywords, model, cmd="query"):
+        """ Initialize a Synergy query."""
+        self._session = session
+        self._query = query
+        self._keywords = keywords
+        self._model = model
+        self._cmd = cmd
+        
+    def execute(self):
+        """ Executing the query on the database. """
+        mapper = DataMapperListResult(self._session, '@@@', self._keywords, self._model)        
+        query = "%s %s -u -f \"%s\"" % (self._cmd, self._query, mapper.format())
+        return self._session.execute(query, mapper)
+        
+    
+
+class InvalidFourPartNameException(CCMException):
+    """ Badly formed Synergy four-part name. """
+    def __init__(self, fpn = ""):
+        CCMException.__init__(self, fpn)
+
+
+class FourPartName(object):
+    """ This class handle four part name parsing and validation.
+    """
+
+    def __init__(self, ifpn):
+        """ Create a FourPartName object based on a ifpn string.
+        
+        The string have to match the following patterns:
+        - name-version:type:instance
+        - name:version:releasedef:instance
+        - Task database#id
+        - Folder database#id
+        
+        Anything else is considered as old release string format.
+            
+        """
+        _logger.debug("FourPartName: '%s'", ifpn)
+        fpn = FourPartName.convert(ifpn)
+        result = re.search(r"^(?P<name>.+)-(?P<version>.+?):(?P<type>\S+):(?P<instance>\S+)$", fpn)
+        if result == None:
+            result = re.search(r"^(?P<name>.+):(?P<version>.+?):(?P<type>releasedef):(?P<instance>\S+)$", fpn)            
+            if result == None:
+                raise InvalidFourPartNameException(fpn)
+        # set all attributes
+        self._name = result.groupdict()['name']
+        self._version = result.groupdict()['version']
+        self._type = result.groupdict()['type']
+        self._instance = result.groupdict()['instance']    
+
+    def __getname(self):
+        """ Returns the name of the object. """
+        return self._name
+    
+    def __getversion(self):
+        """ Returns the version of the object. """
+        return self._version
+    
+    def __gettype(self):
+        """ Returns the type of the object. """
+        return self._type
+    
+    def __getinstance(self):
+        """ Returns the instance of the object. """
+        return self._instance
+    
+    def __getobjectname(self):
+        """ Returns the objectname of the object. """
+        if (self.type == 'releasedef'):
+            return "%s:%s:%s:%s" % (self.name, self.version, self.type, self.instance)
+        return "%s-%s:%s:%s" % (self.name, self.version, self.type, self.instance)
+    
+    def __str__(self):
+        """ Returns the string representation of the object. """
+        return self.objectname
+    
+    def __repr__(self):
+        """ Returns the string representation of the python object. """
+        if (self.type == 'releasedef'):
+            return "<%s:%s:%s:%s>" % (self.name, self.version, self.type, self.instance)
+        return "<%s-%s:%s:%s>" % (self.name, self.version, self.type, self.instance)
+    
+    def is_same_family(self, ccmobject):
+        """ Returns True if the ccmobject is part of the same family (=same name, type and instance) as self. """
+        assert isinstance(ccmobject, FourPartName)
+        return (self.name == ccmobject.name and self.type == ccmobject.type and self.instance == ccmobject.instance)
+    
+    def __getfamily(self):
+        return "%s:%s:%s" % (self.name, self.type, self.instance)
+    
+    def __eq__(self, ccmobject):
+        """ Returns True if object four parts name are identical. """
+        if ccmobject == None:
+            return False
+        assert isinstance(ccmobject, FourPartName)
+        return (self.name == ccmobject.name and self.version == ccmobject.version and self.type == ccmobject.type and self.instance == ccmobject.instance)
+    
+    def __ne__(self, ccmobject):
+        """ Returns True if object four parts name are different. """
+        if ccmobject == None:
+            return True
+        assert isinstance(ccmobject, FourPartName)
+        return (self.name != ccmobject.name or self.version != ccmobject.version or self.type != ccmobject.type or self.instance != ccmobject.instance)
+    
+    @staticmethod
+    def is_valid(fpn):
+        """ Check if a given string represents a valid four part name.
+        """        
+        return (re.match(r"^(.+)-(.+?):(\S+):(\S+)|(.+):(.+?):releasedef:(\S+)$", fpn) != None)
+    
+    @staticmethod
+    def convert(fpn):
+        """ Update a CCM output string to a valid four part name. This is due to the inconsistent
+             output of CM/Synergy CLI.
+        """
+        fpn = fpn.strip()
+        if FourPartName.is_valid(fpn):
+            return fpn
+        result = re.search(r"^(?P<type>Task|Folder)\s+(?P<instance>\w+)#(?P<id>\d+)$", fpn)
+        if result != None:
+            matches = result.groupdict()
+            if matches["type"] == "Task":
+                return "task%s-1:task:%s" % (matches["id"], matches["instance"])
+            elif matches["type"] == "Folder":
+                return "%s-1:folder:%s" % (matches['id'], matches['instance'])
+        else:
+            result = re.search(r"^(?P<project>\S+)/(?P<version>\S+)$", fpn)
+            if result != None:
+                matches = result.groupdict()
+                return "%s:%s:releasedef:1" % (matches['project'], matches['version'])        
+            else:
+                # Check the name doesn't contains any of the following character: " :-"
+                result = re.search(r"^[^\s^:^-]+$", fpn)
+                if result != None:
+                    return "none:%s:releasedef:1" % (fpn)
+        raise InvalidFourPartNameException(fpn)
+
+    name = property (__getname)
+    version = property (__getversion)
+    type = property (__gettype)
+    instance = property (__getinstance)
+    objectname = property (__getobjectname)
+    family = property(__getfamily)
+                
+                
+class CCMObject(FourPartName):
+    """ Base class for any Synergy object. """
+               
+    def __init__(self, session, fpn):
+        FourPartName.__init__(self, fpn)
+        self._session = session
+    
+    def _getsession(self):
+        return self._session
+    
+    session = property(_getsession)
+    
+    def exists(self):
+        """ Check if an the object exists in the database. """
+        return (len(self._session.execute("query \"name='%s' and version='%s' and type='%s' and instance='%s'\" -u -f \"%%objectname\"" % (self.name, self.version, self.type, self.instance), ObjectListResult(self._session)).output) == 1)
+    
+    def __setitem__(self, name, value):
+        project = ""
+        if self.type == 'project':
+            project = "-p"
+        if value.endswith("\\"):
+            value += "\\"
+        result = self._session.execute("attribute -modify \"%s\" -v \"%s\" %s \"%s\"" % (name, value, project, self))
+        if result.status != 0 and result.status != None:
+            raise CCMException("Error modifying '%s' attribute. Result: '%s'" % (name, result.output), result)
+        
+    def __getitem__(self, name):
+        """ Provides access to Synergy object attributes through the dictionary
+        item interface.
+        """
+        result = self._session.execute("query \"name='%s' and version='%s' and type='%s' and instance='%s'\" -u -f \"%%%s\"" % (self.name, self.version, self.type, self.instance, name), ResultWithError(self._session))
+        if result.status != 0 and result.status != None:
+            raise CCMException("Error retrieving '%s' attribute. Result: '%s'" % (name, result.output), result)
+        if len(result.error.strip()) > 0:
+            raise CCMException("Error retrieving '%s' attribute. Reason: '%s'" % (name, result.error), result)
+        if result.output.strip() == "<void>":
+            return None
+        return result.output.strip()
+    
+    def create_attribute(self, name, type_, value=None):
+        if name in self.keys():
+            raise CCMException("Attribute '%s' already exist." % (name))
+        args = ""
+        proj_arg = ""
+        if value != None:
+            args += " -value \"%s\"" % value
+        if self.type == "project":
+            proj_arg = "-p"
+        result = self._session.execute("attribute -create \"%s\" -type \"%s\" %s %s \"%s\"" % (name, type_, args, proj_arg, self.objectname))
+        if result.status != 0 and result.status != None:
+            raise CCMException("Error creating '%s' attribute. Result: '%s'" % (name, result.output), result)
+        
+    def keys(self):
+        """ The list of supported Synergy attributes. """
+        result = self._session.execute("attribute -la \"%s\"" % self, AttributeNameListResult(self._session))
+        return result.output
+    
+    def is_predecessor_of(self, o):
+        result = self._session.execute("query \"is_predecessor_of('%s') and name='%s'and version='%s'and type='%s'and instance='%s'\" -u -f \"%%objectname\"" % (o, self.name, self.version, self.type, self.instance), ObjectListResult(self._session))        
+        if len(result.output):
+            return True
+        return False
+        
+    def predecessors(self):
+        result = self._session.execute("query \"is_predecessor_of('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))        
+        return result.output
+
+    def successors(self):
+        result = self._session.execute("query \"is_successor_of('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))        
+        return result.output
+
+    def is_recursive_predecessor_of(self, o):
+        result = self._session.execute("query \"has_predecessor('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
+        for s in result.output:
+            if s == o:
+                return True
+        for s in result.output:
+            if s.is_recursive_predecessor_of(o):
+                return True
+        return False
+
+    def is_recursive_predecessor_of_fast(self, o):
+        """ Fast implementation of the recursive is_predecessor_of method. """
+        input_objects = [self]
+        while len(input_objects) > 0:
+            query = " or ".join(["has_predecessor('%s')" % x for x in input_objects])
+            result = self._session.execute("query \"query\" -u -f \"%%objectname\"" % query, ObjectListResult(self._session))    
+            for s in result.output:
+                if s == o:
+                    return True
+        return False
+
+    def is_recursive_sucessor_of(self, o):
+        result = self._session.execute("query \"has_successor('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
+        for s in result.output:
+            if s == o:
+                return True
+        for s in result.output:
+            if s.is_recursive_sucessor_of(o):
+                return True
+        return False
+
+    def is_recursive_successor_of_fast(self, o):
+        """ Fast implementation of the recursive is_successor_of method. """
+        input_objects = [self]
+        while len(input_objects) > 0:
+            query = " or ".join(["has_successor('%s')" % x for x in input_objects])
+            result = self._session.execute("query \"query\" -u -f \"%%objectname\"" % query, ObjectListResult(self._session))    
+            for s in result.output:
+                if s == o:
+                    return True
+        return False
+    
+    def relate(self, ccm_object):
+        result = self._session.execute("relate -name successor -from \"%s\" -to \"%s\"" % self, ccm_object, Result(self._session))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error relating objects %s to %s\n%s" % (self, ccm_object, result.output))
+        
+    def finduse(self):
+        """ Tries to find where an object is used. """
+        result = self._session.execute("finduse \"%s\"" % self, FinduseResult(self))
+        return result.output
+    
+    
+class File(CCMObject):
+    """ Wrapper for any Synergy file object """
+    
+    def __init__(self, session, fpn):
+        CCMObject.__init__(self, session, fpn)
+    
+    def content(self):
+        result = self._session.execute("cat \"%s\"" % self)
+        return result.output
+    
+    def to_file(self, path):
+        if os.path.exists(path):
+            _logger.error("Error file %s already exists" % path)
+        if not os.path.exists(os.path.dirname(path)):
+            os.makedirs(os.path.dirname(path))
+        # Content to file        
+        result = self._session.execute("cat \"%s\" > \"%s\"" % (self, os.path.normpath(path)))
+        if result.status != 0 and result.status != None:
+            raise CCMException("Error retrieving content from object %s in %s (error status: %s)\n%s" % (self, path, result.status, result.output), result)
+    
+    def merge(self, ccm_object, task):
+        assert(ccm_object != None, "object must be defined.")
+        assert(task != None, "task must be defined.")
+        assert(task.type == "task", "task parameter must be of 'task' type.")
+        result = self._session.execute("merge -task %s \"%s\" \"%s\"" % (task['displayname'], self, ccm_object))
+        
+        validity = 0
+        for line in result.output.splitlines():
+            if re.match(r"Merge Source completed successfully\.", line):
+                validity = 2
+            elif re.match(r"Warning: Merge Source warning. \(overlaps during merge\)\.", line):
+                validity = 1
+            else:                
+                result = re.match(r"Associated object\s+(?P<object>.+)\s+with task", line)
+                if result != None:
+                    return (self._session.create(result.groupdict()['object']), validity)
+                    
+        raise CCMException("Error during merge operation.\n" + result.output, result)
+
+    def checkin(self, state, comment=None):
+        if comment != None:
+            comment = "-c \"%s\"" % comment
+        else:
+            comment = "-nc"
+        result = self._session.execute("checkin -s \"%s\" %s \"%s\" " % (state, comment, self))
+        for line in result.output.splitlines():
+            _logger.debug(line)
+            _logger.debug(r"Checked\s+in\s+'.+'\s+to\s+'%s'" % state)
+            if re.match(r"Checked\s+in\s+'.+'\s+to\s+'%s'" % state, line) != None:
+                return
+        raise CCMException("Error checking in object %s,\n%s" % (self, result.output), result)
+        
+
+class Project(CCMObject):
+    """ Wrapper class for Synergy project object. """
+    
+    def __init__(self, session, fpn):
+        CCMObject.__init__(self, session, fpn)
+        self._release = None
+        self._baseline = None
+
+    def _gettasks(self):
+        result = self._session.execute("rp -show tasks \"%s\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
+        return result.output
+
+    def add_task(self, task):
+        """ Add a task to the update properties. """
+        result = self._session.execute("up -add -task %s \"%s\"" % (task['displayname'], self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error adding task %s to project '%s'\n%s" % (task, self, result.output))
+        
+    def remove_task(self, task):
+        """ Remove a task to the update properties. """
+        result = self._session.execute("up -remove -task %s \"%s\"" % (task['displayname'], self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error removing task %s from project '%s'\n%s" % (task, self, result.output))
+
+    def add_folder(self, folder):
+        """ Add a folder to the update properties. """
+        result = self._session.execute("up -add -folder %s \"%s\"" % (folder['displayname'], self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error adding folder %s to project '%s'\n%s" % (folder, self, result.output))
+        
+    def remove_folder(self, folder):
+        """ Remove a folder to the update properties. """
+        result = self._session.execute("up -remove -folder %s \"%s\"" % (folder['displayname'], self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error removing folder %s to project '%s'\n%s" % (folder, self, result.output))
+    
+    def _getfolders(self):
+        """ Wrapper method to return the folder list from the update properties - please use the folders attribute to access it. """
+        result = self._session.execute("up -show folders \"%s\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
+        return result.output
+        
+    def _getsubprojects(self):
+        """ Wrapper method to return the subprojects list - please use the subprojects attribute to access it. """
+        result = self._session.execute("query -t project \"recursive_is_member_of('%s', none)\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
+        return result.output
+    
+    def get_members(self, recursive=False, **kargs):
+        query = "is_member_of('%s')" % self.objectname
+        if recursive:
+            query = "recursive_is_member_of('%s', none)" % self.objectname           
+        for k in kargs.keys():
+            query += " and %s='%s'" % (k, kargs[k])
+        result = self._session.execute("query \"%s\" -u -f \"%%objectname\"" % query, ObjectListResult(self._session))
+        return result.output
+        
+    def _getrelease(self):
+        """ Get the release of the current object. Returns a Releasedef object. """
+        self._release = Releasedef(self._session, self['release'])
+        return self._release
+
+    def _setrelease(self, release):
+        """ Set the release of the current object. """
+        self['release'] = release['displayname']
+    
+    def refresh(self):
+        """ Refresh project update properties. """
+        result = self._session.execute("up -refresh \"%s\"" % self.objectname, UpdatePropertiesRefreshResult(self._session))
+        return result.output
+    
+    def _getbaseline(self):
+        """ Get the baseline of the current project. """
+        if self._baseline == None:
+            result = self._session.execute("up -show baseline_project \"%s\" -f \"%%displayname\" -u" % self.objectname)
+            if result.output.strip().endswith('does not have a baseline project.'):
+                return None
+            self._baseline = self._session.create(result.output)
+        _logger.debug('baseline: %s' % self._baseline)
+        return self._baseline
+    
+    def set_baseline(self, baseline, recurse=False):
+        """ Set project baseline. raise a CCMException in case or error. """
+        args = ""
+        if recurse:
+            args += " -r"
+        self._baseline = None
+        result = self._session.execute("up -mb \"%s\" %s \"%s\"" % (baseline, args, self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error setting basline of project '%s'\n%s" % (self.objectname, result.output))
+
+    def set_update_method(self, name, recurse = False):
+        """ Set the update method for the project (and subproject if recurse is True). """
+        assert name != None, "name must not be None."
+        assert len(name) > 0, "name must not be an empty string."
+        args = "-ru %s" % name
+        if recurse:
+            args += " -r"
+        result = self._session.execute("up %s \"%s\"" % (args, self))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error setting reconfigure properties to %s for project '%s'\nStatus: %s\n%s" % (name, self.objectname, result.status, result.output))
+   
+    def apply_update_properties(self, baseline = True, tasks_and_folders = True, recurse=True):
+        """ Apply update properties to subprojects. """
+        args = ""
+        if not baseline:
+            args += "-no_baseline"
+        if not tasks_and_folders:
+            args += " -no_tasks_and_folders"
+        if recurse:
+            args += " -apply_to_subprojs"
+        result = self._session.execute("rp %s \"%s\"" % (args, self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error applying update properties to subprojects for '%s'\n%s" % (self.objectname, result.output))
+    
+    def root_dir(self):
+        """ Return the directory attached to a project. """
+        result = self._session.execute("query \"is_child_of('%s','%s')\" -u -f \"%%objectname\"" % (self.objectname, self.objectname), ObjectListResult(self._session))
+        return result.output[0]
+    
+    def snapshot(self, targetdir, recursive=False):
+        """ Take a snapshot of the project. """
+        assert(targetdir != None, "targetdir must be defined.")
+        if recursive:
+            recursive = "-recurse"
+        else:
+            recursive = ""
+        result = self._session.execute("wa_snapshot -path \"%s\"  %s \"%s\"" % (os.path.normpath(targetdir), recursive, self.objectname))
+        for line in result.output.splitlines():
+            if re.match(r"^Creation of snapshot work area complete.|Copying to file system complete\.\s*$", line):
+                return result.output
+        raise CCMException("Error creation snapshot of %s,\n%s" % (self.objectname, result.output), result)
+    
+    def checkout(self, release, version=None, purpose=None, subprojects=True):
+        """ Create a checkout of this project. 
+        
+        This will only checkout the project in Synergy. It does not create a work area.
+        
+        :param release: The Synergy release tag to use.
+        :param version: The new version to use for the project. This is applied to all subprojects.
+        :param purpose: The purpose of the checkout. Determines automatically the role from the purpose
+         and switch it automatically (Could be any role from the DB).
+        """    
+        assert release != None, "Release object must be defined."
+        if not release.exists():
+            raise CCMException("Release '%s' must exist in the database." % release)
+            
+        args = ''
+        if version != None:
+            args += '-to "%s"' % version
+        role = None
+        if purpose:
+            #save current role before changing
+            role = self._session.role
+
+            self._session.role = get_role_for_purpose(self._session, purpose)
+            
+            args += " -purpose \"%s\"" % purpose
+        if subprojects:
+            args += " -subprojects"
+        result = self._session.execute("checkout -project \"%s\" -release \"%s\" -no_wa %s" \
+                                  % (self, release['displayname'], args), ProjectCheckoutResult(self._session, self.objectname))
+        if not role is  None:
+            self._session.role = role
+        if result.project == None:
+            raise CCMException("Error checking out project %s,\n%s" % (self.objectname, result.output), result)
+        return result
+    
+    def work_area(self, maintain, recursive=None, relative=None, path=None, pst=None, wat=False):
+        """ Configure the work area. This allow to enable it or disable it, set the path, recursion... """
+        args = ""
+        if maintain:
+            args += "-wa"
+        else:
+            args += "-nwa"
+        # path
+        if path != None:
+            args += " -path \"%s\"" % path        
+        # pst
+        if pst != None:
+            args += " -pst \"%s\"" % pst
+        # relative
+        if relative != None and relative:
+            args += " -relative"
+        elif relative != None and not relative:
+            args += " -not_relative"
+        # recursive
+        if recursive != None and recursive:
+            args += " -recurse"
+        elif recursive != None and not recursive:
+            args += " -no_recurse"        
+        #wat            
+        if wat:
+            args += " -wat"
+        result = self._session.execute("work_area -project \"%s\" %s" \
+                                  % (self.objectname, args), Result(self._session))
+        return result.output
+        
+    def update(self, recurse=True, replaceprojects=True, keepgoing=False, result=None):
+        """ Update the project based on its reconfigure properties. """
+        args = ""
+        if recurse:
+            args += " -r "
+        if replaceprojects:
+            args += " -rs "
+        else:
+            args += " -ks "
+        if result == None:
+            result = UpdateResult(self._session)
+        result = self._session.execute("update %s -project %s" % (args, self.objectname), result)
+        if not result.successful and not keepgoing:
+            raise CCMException("Error updating %s" % (self.objectname), result)
+        return result
+    
+    def reconcile(self, updatewa=True, recurse=True, consideruncontrolled=True, missingwafile=True, report=True):
+        """ Reconcile the project to force the work area to match the database. """
+        args = ""
+        if updatewa:
+            args += " -update_wa "
+        if recurse:
+            args += " -recurse "
+        if consideruncontrolled:
+            args += " -consider_uncontrolled "
+        if missingwafile:
+            args += " -missing_wa_file "
+        if report:
+            args += " -report reconcile.txt "
+        result = self._session.execute("reconcile %s -project %s" % (args, self.objectname), Result(self._session))
+        if re.search(r"There are no conflicts in the Work Area", result.output) == None and re.search(r"Reconcile completed", result.output) == None:
+            raise CCMException("Error reconciling %s,\n%s" % (self.objectname, result.output), result)        
+        return result.output
+
+    def get_latest_baseline(self, filterstring="*", state="released"):
+        result = self._session.execute("query -n %s -t project -f \"%%displayname\" -s %s -u -ns \"version smatch'%s'\"" % (self.name, state, filterstring))
+        lines = result.output.splitlines()
+        return lines[-1]
+
+    def create_baseline(self, baseline_name, release, baseline_tag, purpose="System Testing", state="published_baseline"):
+        result = self._session.execute("baseline -create %s -release %s -purpose \"%s\" -vt %s -project \"%s\" -state \"%s\"" % (baseline_name, release, purpose, baseline_tag, self.objectname, state))
+        return result.output
+    
+    def sync(self, recurse=False, static=False):
+        """ Synchronize project content. By default it is not been done recusively. (Not unittested)"""
+        args = ""
+        if recurse:
+            args += " -recurse"
+        if static:
+            args += " -static"
+        result = self._session.execute("sync %s -project \"%s\"" % (args, self.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error during synchronization of %s: %s." % (self.objectname, result.output))
+        return result.output
+
+    def conflicts(self, recurse=False, tasks=False):
+        args = "-noformat "
+        if recurse:
+            args += " -r"
+        if tasks:
+            args += " -t"
+        
+        result = self._session.execute("conflicts %s  \"%s\"" % (args, self.objectname), ConflictsResult(self._session))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error during conflict detection of %s: %s." % (self.objectname, result))
+        return result
+    
+    tasks = property(_gettasks)
+    folders = property(_getfolders)
+    subprojects = property(_getsubprojects)
+    release = property(_getrelease, _setrelease)
+    baseline = property(_getbaseline, set_baseline)
+
+
+class Dir(CCMObject):
+    """ Wrapper class for Synergy dir object """
+    
+    def __init__(self, session, fpn):
+        CCMObject.__init__(self, session, fpn)
+
+    def children(self, project):
+        assert(project.type == 'project')
+        result = self._session.execute("query \"is_child_of('%s','%s')\" -u -f \"%%objectname\"" % (self.objectname, project), ObjectListResult(self._session))
+        return result.output
+        
+
+class Releasedef(CCMObject):
+    """ Wrapper class for Synergy releasedef object """
+    
+    def __init__(self, session, fpn):
+        CCMObject.__init__(self, session, fpn)
+    
+    def _getcomponent(self):
+        return self.name
+            
+    component = property(_getcomponent)
+
+
+class Folder(CCMObject):
+    """ Wrapper class for Synergy folder object """
+    
+    def __init__(self, session, fpn):
+        CCMObject.__init__(self, session, fpn)
+
+    def _gettasks(self):
+        """ Accessor for 'tasks' property. """
+        result = self._session.execute("folder -show tasks \"%s\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
+        return result.output
+
+    def _getobjects(self):
+        result = self._session.execute("folder -show objects \"%s\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
+        return result.output
+
+    def _getmode(self):
+        """ Get the mode used by the folder. """
+        result = self._session.execute("folder -show mode \"%s\"" % self.objectname)
+        return result.output.strip()
+
+    def _getquery(self):
+        """ Get the query that populate the folder. """
+        if self.mode.lower() == "query":
+            result = self._session.execute("folder -show query \"%s\"" % self.objectname)
+            return result.output.strip()
+        else:
+            raise CCMException("%s is not a query base folder." % (self.objectname))
+    
+    def _getdescription(self):
+        """ Get the description associated with the folder. """
+        r = self._session.execute("query -t folder -n %s -i %s -u -f \"%%description\"" % (self.name, self.instance))
+        return r.output.strip()
+
+    def remove(self, task):
+        """ Remove task from this folder. """
+        result = self._session.execute("folder -m \"%s\" -remove_task \"%s\"" % (self.objectname, task.objectname))
+        if result.status != None and result.status != 0:
+            raise CCMException("Error removing task %s from %s: %s." % (task.objectname, self.objectname, result.output))
+
+    def update(self):
+        result = self._session.execute("folder -m -update -f \"%%objectname\"" % self.objectname)
+        if result.status != None and result.status != 0:
+            raise CCMException("Error updating the folder content %s: %s." % (self.objectname, result.output))
+        
+    def append(self, task):
+        """ Associate an object to a task """
+        class AddTaskException(CCMException):
+            def __init__(self, reason, task, result):
+                CCMException.__init__(self, reason, result)
+                self.task = task
+        
+        result = self._session.execute("folder -m -at \"%s\" \"%s\"" % (task.objectname, self.objectname))
+        if re.search(r"(Added 1 task to)|(is already in folder)", result.output, re.M) is None:
+            raise AddTaskException(result.output, result, task)
+    
+    def copy(self, existing_folder):
+        """ Copy the contents of existing_folder into this folder.
+        
+        This appends to the destination folder by default.
+        
+        :param existing_folder: The destination Folder object.
+        """
+        result = self._session.execute("folder -copy %s -existing %s -append" % (self.objectname, existing_folder), FolderCopyResult(self._session))
+        return result.output
+        
+    objects = property(_getobjects)
+    tasks = property(_gettasks)
+    mode = property(_getmode)
+    query = property(_getquery)
+    is_query_based = property(lambda x: x.mode.lower() == "query")
+    description = property(_getdescription)
+
+
+class Task(CCMObject):
+    """ Wrapper class for Synergy task object """
+    
+    def __init__(self, session, fpn):
+        CCMObject.__init__(self, session, fpn)
+        self.__unicode_str_text = None
+
+    def _getobjects(self):
+        result = self._session.execute("task -show objects \"%s\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
+        return result.output
+    
+    def append(self, ccm_object):
+        """ Associate an object to a task """
+        class AddObjectException(CCMException):
+            def __init__(self, comment, ccm_object):
+                CCMException.__init__(self, comment)
+                self.ccm_object = ccm_object
+        
+        result = self._session.execute("task -associate \"%s\" -object \"%s\"" % (self.objectname, ccm_object.objectname))
+        if not re.match(r"Associated object .+ with task .*\.", result.output, re.M):
+            raise AddObjectException(result.output)
+
+    def assign(self, username):
+        result = self._session.execute("task -modify \"%s\" -resolver %s" % (self.objectname, username))
+        if not re.match(r"Changed resolver of task", result.output, re.M):
+            raise CCMException("Error assigning task to user '%s',\n%s" % (username, result.output), result)
+        
+    def _getsynopsis(self):
+        return self['task_synopsis']    
+        
+    @staticmethod
+    def create(session, release_tag, synopsis=""):
+        assert release_tag.type == "releasedef", "release_tag must be a CCM object wrapper of releasedef type"    
+        result = session.execute("task -create -synopsis \"%s\" -release \"%s\"" % (synopsis, release_tag['displayname']), CreateNewTaskResult(session))
+        return result.output
+        
+    objects = property(_getobjects)
+    
+    def __unicode__(self):
+        # TODO: use optimised query that makes only 1 ccm query with suitable format
+        if self.__unicode_str_text == None:
+            self.__unicode_str_text = u'%s: %s' % (self['displayname'], self['task_synopsis'])
+        return self.__unicode_str_text
+        
+    def __str__(self):
+        return self.__unicode__().encode('ascii', 'replace')
+    
+    def get_release_tag(self):
+        """ Get task release. Use release property!"""
+        result = self._session.execute("attribute -show release \"%s\"" % (self.objectname), Result(self._session))
+        return result.output
+    
+    def set_release_tag(self, release_tag):
+        """ Set task release. Use release property!"""        
+        result = self._session.execute("attribute -modify release -value \"%s\" \"%s\"" % (release_tag, self.objectname), Result(self._session))
+        return result.output
+
+    release = property(get_release_tag, set_release_tag)
+
+class UpdateTemplate:
+    """ Allow to access Update Template property using Release and Purpose. """
+    def __init__(self, releasedef, purpose):
+        assert(releasedef != None)
+        assert(purpose != None)
+        self._releasedef = releasedef
+        self._purpose = purpose
+        
+    def objectname(self):
+        """ Return the objectname representing this virtual object. """
+        return "%s:%s" % (self._releasedef['displayname'], self._purpose)
+
+    def baseline_projects(self):
+        """ Query all projects for this UpdateTemplate. """
+        result = self._releasedef.session.execute("ut -sh baseline_projects \"%s\"" % self.objectname(), ObjectListResult(self._releasedef.session))
+        print result.output
+        return result.output
+
+    def information(self):
+        """ Query all projects for this UpdateTemplate. """
+        result = self._releasedef.session.execute("ut -sh information \"%s\"" % self.objectname(), UpdateTemplateInformation(self._releasedef.session))
+        print result.output
+        return result.output
+
+    def baseline_selection_mode(self):
+        """ The current Baseline selection mode """
+        result = self._releasedef.session.execute("ut -sh bsm \"%s\"" % self.objectname())
+        print result.output.strip()
+        return result.output.strip()
+
+
+def read_ccmwaid_info(filename):
+    """ Read data from a ccmwaid file. This method is an helper to retreive a project from a physical location. """
+    ccmwaid = open(filename, 'r')
+    # first line: database
+    dbpath = os.path.dirname(ccmwaid.readline().strip())
+    database = os.path.basename(dbpath)
+    # 2nd line should be a timestamp
+    ccmwaid.readline().strip()
+    # 3rd line is the objectname
+    objectref = ccmwaid.readline().strip()
+    ccmwaid.close()    
+    return {'dbpath': dbpath, 'database': database, 'objectname': objectref}
+
+def create_project_from_path(session, path):
+    """ Uses the (_|.)ccmwaid.inf file to create a Project object. """
+    ccmwaid = ".ccmwaid.inf"
+    if os.name == 'nt':
+        ccmwaid = "_ccmwaid.inf"
+        
+    if (not os.path.exists(path + "/" + ccmwaid)):
+        return None    
+    result = read_ccmwaid_info(path + "/" + ccmwaid)
+    
+    return session.create(result['objectname'])
+
+
+def open_session(username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
+    """Provides a Session object.
+    
+    Attempts to return a Session, based either on existing Synergy
+    sessions or by creating a new one.
+    
+    - If a .netrc file can be found on the user's personal drive,
+      that will be read to obtain Synergy login information if it 
+      is defined there. This will be used to fill in any missing 
+      parameters not passed in the call to open_session().
+      
+      The format of the .netrc file entries should be:
+      
+      machine synergy login USERNAME password foobar account DATABASE_PATH@SERVER
+      
+      If the details refer to a specific database, the machine can be the database name,
+      instead of "synergy".
+    - If an existing session is running that matches the supplied
+      parameters, it will reuse that.
+    
+    """
+    # See if a .netrc file can be used
+    if CCM_BIN == None:
+        raise CCMException("Could not find CM/Synergy executable in the path.")
+    if password == None or username == None or engine == None or dbpath == None:
+        if os.sep == '\\':
+            os.environ['HOME'] = "H:" + os.sep
+        _logger.debug('Opening .netrc file')
+        try:
+            netrc_file = netrc.netrc()
+            netrc_info = None
+            # If settings for a specific database 
+            if database != None:
+                netrc_info = netrc_file.authenticators(database)            
+
+            # if not found just try generic one
+            if netrc_info == None:
+                netrc_info = netrc_file.authenticators('synergy')
+                
+            if netrc_info != None:
+                (n_username, n_account, n_password) = netrc_info
+                if username == None:
+                    username = n_username
+                if password == None:
+                    password = n_password
+                if n_account != None:
+                    (n_dbpath, n_engine) = n_account.split('@')
+                    if dbpath == None and n_dbpath is not None:
+                        _logger.info('Database path set using .netrc (%s)' % n_dbpath)
+                        dbpath = n_dbpath
+                    if engine == None and n_engine is not None:
+                        _logger.info('Database engine set using .netrc (%s)' % n_engine)
+                        engine = n_engine
+        except IOError:
+            _logger.debug('Error accessing .netrc file')
+
+    # last chance...
+    if username == None:
+        username = os.environ['USERNAME']
+
+    # looking for dbpath using GSCM database
+    if dbpath == None and database != None:
+        _logger.info('Database path set using the GSCM database.')
+        dbpath = nokia.gscm.get_db_path(database)        
+
+    # looking for engine host using GSCM database
+    if engine == None and database != None:
+        _logger.info('Database engine set using the GSCM database.')
+        engine = nokia.gscm.get_engine_host(database)
+    
+    _sessions = []
+    # See if any currently running sessions can be used, only if no password submitted, else use a brand new session!
+    if password == None and reuse:
+        _logger.debug('Querying for existing Synergy sessions')
+        command = "%s status" % (CCM_BIN)
+        pipe = os.popen(command, 'r')
+        result = pipe.read()
+        pipe.close()
+        _logger.debug('ccm status result: ' + result)
+        for match in re.finditer(r'(?P<ccmaddr>\w+:\d+:\d+.\d+.\d+.\d+(:\d+.\d+.\d+.\d+)?)(?P<current_session>\s+\(current\s+session\))?\nDatabase:\s*(?P<dbpath>\S+)', result, re.M):
+            d = match.groupdict()
+            _logger.debug(d['ccmaddr'])
+            _logger.debug(os.environ['COMPUTERNAME'])
+            _logger.debug(d['current_session'])
+            if d['ccmaddr'].lower().startswith(os.environ['COMPUTERNAME'].lower()):
+                # These session objects should not close the session on deletion,
+                # because they did not initially create the session
+                existing_session = Session(username, engine, d['dbpath'], d['ccmaddr'], close_on_exit=False)
+                _logger.debug('Existing session found: %s' % existing_session)
+                _sessions.append(existing_session)
+        # looking for session using dbpath
+        for session in _sessions:
+            if session.dbpath == dbpath:
+                return session
+    else:
+        # looking for router address using GSCM database
+        router_address = None
+        if database == None and dbpath != None:
+            database = os.path.basename(dbpath)
+        
+        lock = fileutils.Lock(CCM_SESSION_LOCK)
+        try:
+            lock.lock(wait=True)
+            # if we have the database name we can switch to the correct Synergy router
+            if database != None:
+                _logger.info('Getting router address.')
+                router_address = nokia.gscm.get_router_address(database)
+                if os.sep == '\\' and router_address != None:
+                    routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), 'r')
+                    current_router = routerfile.read().strip()
+                    routerfile.close()
+                    if current_router != router_address.strip():
+                        _logger.info('Updating %s' % (os.path.normpath(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"))))
+                        routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), "w+")
+                        routerfile.write("%s\n" % router_address)
+                        routerfile.close()
+        
+            # If no existing sessions were available, start a new one
+            _logger.info('Opening session.')
+            new_session = Session.start(username, password, engine, dbpath)
+            lock.unlock()
+            return new_session
+        finally:
+            lock.unlock()
+    raise CCMException("Cannot open session for user '%s'" % username)
+
+
+def get_role_for_purpose(session, purpose):
+    """  return role needed to modify project with checkout for purpose. """
+    purposes = session.purposes()
+    if purpose in purposes:
+        if purposes[purpose]['status'] == 'prep':
+            return 'build_mgr'
+    else:
+        raise CCMException("Could not find purpose '%s' in the database.\n Valid purpose are: %s." % (purpose, ','.join(purposes.keys())))
+    return 'developer'
+
+def get_role_for_status(session, status):
+    """  return role needed to modify project with a specific status. """
+    if status == 'prep':
+        return 'build_mgr'
+    elif status == 'working':
+        return 'developer'
+    else:
+        raise CCMException("Unknow status '%s'" % status)
+
+def running_sessions(database=None):
+    """ Return the list of synergy session currently available on the local machine.
+        If database is given then it tries to update the router address.
+    """
+    _logger.debug('Querying for existing Synergy sessions')
+    if CCM_BIN == None:
+        raise CCMException("Could not find CM/Synergy executable in the path.")
+    command = "%s status" % (CCM_BIN)
+
+    lock = fileutils.Lock(CCM_SESSION_LOCK)
+    result = ""
+    output = []
+    try:
+        # if we have the database name we can switch to the correct Synergy router
+        if database != None:
+            lock.lock(wait=True)
+            _logger.info('Updating router address.')
+            router_address = nokia.gscm.get_router_address(database)
+            if os.sep == '\\' and router_address != None:
+                routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), 'r')
+                current_router = routerfile.read().strip()
+                routerfile.close()
+                if current_router != router_address.strip():
+                    _logger.info('Updating %s' % (os.path.normpath(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"))))
+                    routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), "w+")
+                    routerfile.write("%s\n" % router_address)
+                    routerfile.close()
+
+        _logger.debug('Command: ' + command)
+        (result, status) = _execute(command)
+        if database != None:
+            lock.unlock()
+        if (status != 0):
+            raise CCMException("Ccm status execution returned an error.")
+        _logger.debug('ccm status result: ' + result)
+        for match in re.finditer(r'Command Interface\s+@\s+(?P<ccmaddr>\w+:\d+:\d+.\d+.\d+.\d+(:\d+.\d+.\d+.\d+)*)(?P<current_session>\s+\(current\s+session\))?\s+Database:\s*(?P<dbpath>\S+)', result, re.M):
+            data = match.groupdict()
+            _logger.debug(data['ccmaddr'])
+            _logger.debug(os.environ['COMPUTERNAME'])
+            _logger.debug(data['current_session'])
+            if data['ccmaddr'].lower().startswith(os.environ['COMPUTERNAME'].lower()):
+                # These session objects should not close the session on deletion,
+                # because they did not initially create the session
+                existing_session = Session(None, None, data['dbpath'], data['ccmaddr'], close_on_exit=False)
+                _logger.debug('Existing session found: %s' % existing_session)
+                output.append(existing_session)                
+    finally:
+        if database != None:
+            lock.unlock()        
+    return  output
+
+def session_exists(sessionid, database=None):
+    for session in running_sessions(database=database):
+        _logger.debug(session.addr() + "==" + sessionid + "?")
+        if session.addr() == sessionid:
+            return True
+    return False
+
+# The location of the ccm binary must be located to know where the _router.adr file is, to support
+# switching databases.
+CCM_BIN = fileutils.which("ccm")
+if os.sep == '\\':
+    CCM_BIN = fileutils.which("ccm.exe")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ccm/conflict.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,262 @@
+#============================================================================ 
+#Name        : conflict.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" CCM conflict detection module. """
+
+
+import threading
+
+import ccm
+import threadpool
+
+
+def get_tasks_from_project(project):
+    result = []
+    for folder in project.folders:
+        result.extend(get_tasks(folder))    
+    result.extend(project.tasks)    
+    return result
+
+
+def get_tasks_information_from_project(project):
+    result = []
+    for folder in project.folders:
+        result.extend(get_tasks_information(folder))    
+    for task in project.tasks:
+        query = ccm.Query(folder.session, "name= '%s'and version='%s' and type='%s'and instance='%s'" % (task.name, task.version, task.type, task.instance),
+                          ['objectname', 'owner', 'task_synopsis', 'displayname'],
+                          ['ccmobject', 'string', 'string', 'string'])
+        result.extend(query.execute().output)
+    return result
+
+
+def get_tasks_information(folder):
+    """ Get tasks from folder. If the folder is query based it uses the query to determine the list of task.
+        But the folder contents itself remains untouch.
+    """
+    query = None
+    if folder.is_query_based:
+        query = ccm.Query(folder.session, "type='task' and " + folder.query,
+                          ['objectname', 'owner', 'task_synopsis', 'displayname'],
+                          ['ccmobject', 'string', 'string', 'string'])
+    else:
+        query = ccm.Query(folder.session, folder.objectname,
+                          ['objectname', 'owner', 'task_synopsis', 'displayname'],
+                          ['ccmobject', 'string', 'string', 'string'],
+                          "folder -show tasks")        
+    # executing the query
+    return query.execute().output
+
+
+
+def get_tasks(folder):
+    """ Get tasks from folder. If the folder is query based it uses the query to determine the list of task.
+        But the folder contents itself remains untouch.
+    """
+    if folder.is_query_based:
+        r = folder.session.execute("query -u -t task \"%s\" -f \"%%objectname\"" % folder.query, ccm.ObjectListResult(folder.session))
+        return r.output
+    else:
+        return folder.tasks
+
+
+class ObjectAndTask:
+    """ Wrapper object which link an object to a task. """
+    def __init__(self, object, task):
+        self.object = object
+        self.task = task
+        self.overridenby = []
+    
+    def has_successor_in_list(self, oatl):
+        """ Has our object any successor in the list. """
+        for oat in oatl:
+            if self.object.__ne__(oat.object) and oat.object.is_recursive_successor_of_fast(self.object):
+                self.overridenby.append(oat)
+                return True
+        return False
+    
+    def __repr__(self):
+        return "<ObjectAndTask %s, %s>" % (self.object.objectname, self.task.objectname)
+
+
+class TaskModel:
+    """ Task wrapper object which contains objectandtask object. """
+    
+    def __init__ (self, task):
+        """ Init from task object. """
+        self.task = task
+        self.objectandtasks = {}        
+        for object in self.task.objects:
+            self.objectandtasks[str(object)] = ObjectAndTask(object, task)
+
+    def is_useless(self):
+        """ Is the task containing any usable objects. """
+        count = 0
+        for object in self.objectandtasks.keys():
+            oat = self.objectandtasks[object]
+            if len(oat.overridenby) > 0:
+                count += 1
+        if len(self.objectandtasks.keys()) == 0 or count == len(self.objectandtasks.keys()):
+            return True
+        return False
+                
+    
+def tasks_to_objectandtask(tasks):
+    object_families = {}
+    for task in tasks:
+        for object in task.objects:
+            if not object.family in object_families:
+                object_families[object.family] = []
+            object_families[object.family].append(ObjectAndTask(object, task))
+    return object_families
+
+
+def tasks_to_families_and_taskmodels(tasks, size=1):
+    object_families = {}
+    taskmodels = []
+    lock = threading.Lock()
+
+    def __work(task):
+        tm = TaskModel(task)
+        
+        lock.acquire()
+        taskmodels.append(tm)
+        lock.release()
+        
+        for oatk in tm.objectandtasks.keys():
+            oat = tm.objectandtasks[oatk]
+            lock.acquire()
+            if not oat.object.family in object_families:                
+                object_families[oat.object.family] = []            
+            object_families[oat.object.family].append(oat)
+            lock.release()
+
+    
+    if size > 1:
+        pool = threadpool.ThreadPool(size)
+        for task in tasks:
+            pool.addWork(__work, args=[task])
+        pool.wait()
+    else:
+        for task in tasks:
+            __work(task)
+    
+    return (object_families, taskmodels)
+
+
+def check_task_conflicts(tasks, size=1):
+    """ Validates objects a list of task.
+        It returns a list of list of conflicting ObjectAndTask.
+    """
+    
+    object_families, taskmodels = tasks_to_families_and_taskmodels(tasks, size)
+    conflicts = []
+    lock = threading.Lock()
+
+    pool = threadpool.ThreadPool(size)
+
+    def __work(family):
+        result = []
+        for oat in object_families[family]:
+            if oat.has_successor_in_list(object_families[family]) == False:
+                add = True
+                for roat in result:
+                    if roat.object == oat.object:
+                        add = False
+                        break
+                if add: 
+                    result.append(oat)
+                     
+        if len(result)>1:
+            lock.acquire()
+            conflicts.append(result)
+            lock.release()
+
+    for family in object_families.keys():        
+        pool.addWork(__work, args=[family])
+    
+    pool.wait()
+    
+    return conflicts, taskmodels
+
+
+class Conflict:
+    def __init__(self, baseline, comment):
+        self.baseline = baseline
+        self._comment = comment
+
+    def comment(self):
+        return self._comment
+
+
+class MultipleObjectInBaselineConflict(Conflict):
+    def __init__(self, baseline, objectlist):
+        Conflict.__init__(self, baseline, "")        
+        self.objectlist = objectlist
+        
+    def comment(self):
+        output = "Multiple objects from the same family found under the baseline (%s).\n" % self.baseline.objectname
+        output += "\n".join(lambda x: x.objectname, self.objectlist)
+        return output
+
+
+class ObjectAndBaselineConflict(Conflict):
+    def __init__(self, baseline, object, oat):
+        Conflict.__init__(self, baseline, "")
+        self.object = object
+        self.oat = oat
+    
+    def comment(self):
+        pass
+    
+    
+class ObjectNotFoundInBaselineConflict(Conflict):
+    def __init__(self, baseline, object):
+        Conflict.__init__(self, baseline, "")
+        self.object = object
+    
+    def comment(self):
+        return "No object fom '%s' family found under the baseline." % self.object.family
+
+
+def check_task_and_baseline_conflicts(tasks, baseline):
+    """ Validates objects a list of task.
+        It returns a list of list of conflicting ObjectAndTask.
+    """
+    
+    object_families = tasks_to_objectandtask(tasks)
+    conflicts = []
+
+    for family in object_families:
+        result = family[0].session.execute("query \"name='%s' and type='%s' and instance='%s'\" and recursive_is_member_of('%s', none) " % 
+                                                        (family[0].name, family[0].type, family[0].instance, baseline.objectname),
+                                                        ccm.ObjectListResult(family[0].session))
+        if len(result.output) == 1:
+            bo = result.output[0]
+            potential_conflicts = []
+            for oat in family:
+                if bo.recursive_predecessor_of(oat.object):
+                    potential_conflicts.append(ObjectAndBaselineConflict(baseline, bo, oat, "Conflict between baseline object and task object"))
+            if len(family) == len(potential_conflicts):
+                conflicts.extend(potential_conflicts)
+        elif len(result.output) > 1:
+            conflicts.append(MultipleObjectInBaselineConflict(baseline, result.output))
+        else:
+            conflicts.append(ObjectNotFoundInBaselineConflict(baseline, family[0]))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ccm/extra.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,349 @@
+#============================================================================ 
+#Name        : extra.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Library that contains custom Synergy functionnlities: e.g
+        * Snapshotter that can snapshot unfrozen baselines
+        * Threaded snapshotter.
+"""
+import ccm
+import os
+import shutil
+import threading
+import threadpool
+import traceback
+import sys
+import logging
+import xml.dom.minidom
+from xml.dom.minidom import getDOMImplementation, parse
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger('ccm.extra')
+
+class CCMExtraException(ccm.CCMException):
+    """ Exception raised by the methods of this module. """
+    def __init__(self, description, subexceptions):
+        ccm.CCMException.__init__(self, description)
+        self.subexceptions = subexceptions
+    
+    
+
+def Snapshot(project, targetdir, dir=None):
+    """ This function can snapshot anything from Synergy, even prep/working projects """
+    assert (project != None, "a project object must be supplied")
+    assert (project.type == "project", "project must be of project type")
+    if not dir:
+        dir = project.root_dir()
+    targetdir = os.path.join(targetdir, dir.name)
+    os.makedirs(targetdir)
+    for object in dir.children(project):
+        if object.type == 'dir':
+            Snapshot(project, targetdir, object)
+        elif object.type == 'project':
+            Snapshot(object, targetdir)
+        else:
+            object.to_file(os.path.join(targetdir, object.name))
+
+class __FileSnapshot:
+    def __init__(self, object, targetdir):
+        self.object = object
+        self.targetdir = targetdir
+    def __call__(self):
+        _logger.info("Getting %s (%s)" % (os.path.join(self.targetdir, self.object.name), self.object))
+        self.object.to_file(os.path.join(self.targetdir, self.object.name))
+        return "Getting %s (%s)" % (os.path.join(self.targetdir, self.object.name), self.object)
+
+class __ProjectSnapshot:
+    def __init__(self, project, targetdir):
+        self.project = project
+        self.targetdir = targetdir
+    def __call__(self):
+        _logger.info("Snapshotting '%s' under '%s'" % (self.project, self.targetdir))
+        status = self.project['status']
+        if status == 'released' or status == 'sqa' or status == 'test' or status == 'integrate':
+            _logger.info("Using Synergy wa_snapshot")
+            return self.project.snapshot(self.targetdir, True)
+        else:
+            _logger.info("Non static project, using custom snapshot.")
+            Snapshot(self.project, self.targetdir)
+            return ""
+
+def __FastSnapshot(pool, project, targetdir, callback, exc_hld, dir=None):
+    if not dir:
+        dir = project.root_dir()
+    targetdir = os.path.join(targetdir, dir.name)    
+    os.makedirs(targetdir)
+    for object in dir.children(project):
+        if isinstance(object, ccm.Dir):
+            __FastSnapshot(pool, project, targetdir, callback, exc_hld, object)
+        elif isinstance(object, ccm.Project):
+            pool.addWork(__ProjectSnapshot(object, targetdir), callback=callback, exc_callback=exc_hld)
+        else:
+            _logger.info("Getting %s (%s)" % (os.path.join(targetdir, object.name), object))
+            object.to_file(os.path.join(targetdir, object.name))            
+            # Can't snapshot files in parallel.
+            #pool.addWork(__FileSnapshot(object, targetdir), callback=callback, exc_callback=exc_hld)
+    
+def FastSnapshot(project, targetdir, threads=4):
+    """ Create snapshot running by running sbsnapshot concurently. """
+    assert (threads > 0, "Number of threads must be > 0.")
+    assert (project != None, "a project object must be supplied.")
+    assert (project.type == "project", "project must be of project type.")    
+    
+    # error handling
+    exceptions = []
+    results = []
+    def handle_exception(request, exc_info):
+        _logger.error( "Exception occured in request #%s: %s" % (request.requestID, exc_info[1]))
+        exceptions.append(exc_info[1])                        
+
+    def handle_result(request, result):        
+        results.append(result)
+   
+    pool = threadpool.ThreadPool(threads)
+    __FastSnapshot(pool, project, targetdir, handle_result, handle_exception)
+    pool.wait()
+    
+    if len(exceptions):
+        raise CCMExtraException("Errors occured during snapshot.", exceptions)
+
+    return "\n".join(results)
+
+
+
+def FastMaintainWorkArea(project, path, pst=None, threads=4, wat=False):
+    """ Maintain the workarea of a project in parallel. """
+    assert (threads > 0, "Number of threads must be > 0.")
+    assert (isinstance(project, ccm.Project), "a valid project object must be supplied.")
+            
+    # error handling
+    exceptions = []
+    results = []
+    def handle_exception(request, exc_info):
+        _logger.error( "Exception occured in request #%s: %s\n%s" % (request.requestID, exc_info[1], traceback.format_exception(exc_info[0], exc_info[1], exc_info[2])))
+        exceptions.append(exc_info[1])
+    
+    def handle_result(request, result):        
+        results.append(result)
+
+    class __MaintainProject:
+        def __init__(self, subproject, toplevel, wat=False):
+            self.subproject = subproject
+            self.toplevel = toplevel
+            self.wat = wat
+        
+        def __call__(self):
+            output = ""
+            _logger.info("Maintaining project %s" % self.subproject)
+            for tuple in self.subproject.finduse():
+                if tuple['project'] == self.toplevel:
+                    self.subproject['wa_path'] = os.path.join(self.toplevel['wa_path'], tuple['path'])
+                    self.subproject["project_subdir_template"] = ""
+                    _logger.info("Maintaining project %s under %s" % (self.subproject, self.subproject['wa_path']))
+                    output = self.subproject.work_area(True, True, True, wat=self.wat)
+            _logger.info("Project %s maintained" % self.subproject)
+            return output
+            
+    pool = threadpool.ThreadPool(threads)
+    project.work_area(True, False, True, path, pst, wat=wat)
+    for subproject in project.get_members(type="project"):
+        _logger.info("Adding project %s" % subproject)
+        pool.addWork(__MaintainProject(subproject, project, wat), callback=handle_result, exc_callback=handle_exception)
+    pool.wait()
+    
+    if len(exceptions) > 0:
+        raise CCMExtraException("Errors occured during work area maintenance.", exceptions)
+    
+    return "\n".join(results)
+
+
+
+def get_toplevel_project(session, path):
+    try:
+        wainfo = session.get_workarea_info(path)
+        project = get_toplevel_project(session, os.path.dirname(wainfo['path']))
+        if project == None:
+            project = wainfo['project']
+        return project
+    except ccm.CCMException, e:
+        return None
+
+
+class SessionProvider:
+    def __init__(self, opener=None):
+        self._opener = opener
+        if self._opener is None:
+            self._opener = ccm.open_session
+        
+    def get(self, username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
+        _logger.debug("SessionProvider: Creating a new session.")
+        return self._opener(username, password, engine, dbpath, database, reuse)
+
+    def __del__(self):
+        _logger.info("Deleting the session provider.")
+        self.close()
+
+    def close(self):
+        pass
+        
+        
+class CachedSessionProvider(SessionProvider):
+    """
+<sessions>
+    <session database="foobar" ccmaddr="xxxx"/>
+    <session database="foobarx" ccmaddr="xxxx"/>
+</sessions>
+    """
+
+    def __init__(self, opener=None, cache=None):
+        """ Creates CachedSessionProvider, with a specific 
+            opener and cache file.
+        """
+        SessionProvider.__init__(self, opener=opener)
+        _logger.info("Using CachedSessionProvider.")
+        self.__closed = False
+        self._lock = threading.Lock()
+        self.cacheXml = cache
+        self.cacheFree = {}
+        self.cacheUsed = []
+        self.load()
+
+    
+    def close(self):
+        """ Closing the SessionProvider. """
+        _logger.info("Closing the CachedSessionProvider.")
+        self.save()
+        if self.cacheXml == None:
+            _logger.info("Cleaning up opened sessions.")
+            self._lock.acquire()
+            for dbname in self.cacheFree.keys():
+                while len(self.cacheFree[dbname]) > 0:
+                    session = self.cacheFree[dbname].pop()
+                    session.close_on_exit = True
+                    session.close()
+            while len(self.cacheUsed) > 0:
+                session = self.cacheUsed.pop()
+                session.close_on_exit = True
+            self._lock.release()
+        self.__closed = True   
+    
+    def save(self):
+        if self.cacheXml is not None and not self.__closed:
+            _logger.info("Writing %s" % self.cacheXml)
+            impl = getDOMImplementation()
+            sessions = impl.createDocument(None, "sessions", None)
+            top_element = sessions.documentElement
+            self._lock.acquire()
+            def add_session(dbname, session):
+                sessionNode = sessions.createElement("session")
+                sessionNode.setAttribute("database", dbname)
+                sessionNode.setAttribute("ccmaddr", session.addr())
+                top_element.appendChild(sessionNode)
+            for dbname in self.cacheFree.keys():
+                for session in self.cacheFree[dbname]:
+                    add_session(dbname, session)
+            for session in self.cacheUsed:
+                add_session(session.database(), session)
+            self._lock.release()
+            o = open(self.cacheXml, "w+")
+            o.write(sessions.toprettyxml())
+            o.close()
+            _logger.debug(sessions.toprettyxml())
+            
+    
+    def load(self):
+        if self.cacheXml is not None and os.path.exists(self.cacheXml):
+            _logger.info("Loading %s" % self.cacheXml)
+            doc = parse(open(self.cacheXml, 'r')) 
+            sessions = doc.documentElement
+            self._lock.acquire()
+            try:
+                for child in sessions.childNodes:
+                    if child.nodeType == child.ELEMENT_NODE and child.tagName == "session" and child.hasAttribute('database') and child.hasAttribute('ccmaddr'):
+                        if child.getAttribute('database') not in self.cacheFree:
+                            self.cacheFree[child.getAttribute('database')] = []
+                        if ccm.session_exists(child.getAttribute('ccmaddr'), child.getAttribute('database')):
+                            _logger.info(" + Session: database=%s, ccmaddr=%s" % (child.getAttribute('database'), child.getAttribute('ccmaddr')))
+                            self.cacheFree[child.getAttribute('database')].append(ccm.Session(None, None, None, ccm_addr=child.getAttribute('ccmaddr'), close_on_exit=False))
+                        else:
+                            _logger.info(" - Session database=%s, ccmaddr=%s doesn't seem to be valid anymore." % (child.getAttribute('database'), child.getAttribute('ccmaddr')))
+            finally:
+                self._lock.release()
+
+    
+    def get(self, username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
+        if self.__closed:
+            raise Exception("Could not create further session the provider is closed.")
+        _logger.debug("CachedSessionProvider: Getting a session.")
+        if database is not None and database in self.cacheFree and len(self.cacheFree[database]) > 0:
+            _logger.info("CachedSessionProvider: Reusing session.")
+            self._lock.acquire()
+            s = self.cacheFree[database].pop()
+            self.cacheUsed.append(s)
+            self._lock.release()
+            return CachedProxySession(self, s) 
+        else:
+            _logger.debug("CachedSessionProvider: Creating new session.")
+            session = SessionProvider.get(self, username, password, engine, dbpath, database, False)
+            session.close_on_exit = False
+            s = CachedProxySession(self, session)
+            db = s.database()
+            self._lock.acquire()
+            if db not in self.cacheFree:
+                self.cacheFree[db] = []
+            self.cacheUsed.append(session)
+            self._lock.release()
+            return s
+
+    def free(self, session):
+        _logger.debug("CachedSessionProvider: Freeing session: %s" % session)
+        db = session.database()
+        if session in self.cacheUsed:
+            _logger.debug("CachedSessionProvider: Removing session from used list.")
+            self._lock.acquire()
+            self.cacheUsed.remove(session)
+            self.cacheFree[db].append(session)
+            self._lock.release()
+
+class CachedProxySession:
+    """ Proxy session which will cleanup the session and free it from the provider """
+    
+    def __init__(self, provider, session):
+        """ Constructor. """
+        self.__session = session 
+        self.__provider = provider
+    
+    def __getattr__(self, attrib):
+        """ Delegate attributes to the session object. """
+        _logger.debug("CachedProxySession.__getattr__(%s)" % attrib)
+        if attrib == "close":
+            return self.__close
+        return getattr(self.__session, attrib)
+
+    def __close(self):
+        """ Overriding the session closing. """
+        _logger.debug("CachedProxySession.__close")
+        self.__provider.free(self.__session)
+        self.__session.close()
+        
+    def __del__(self):
+        """ Free the session on destruction. """
+        _logger.debug("CachedProxySession.__del__")
+        self.__close()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/comments.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+#============================================================================ 
+#Name        : comments.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper to parse branch information.
+"""
+import amara
+import logging
+import os
+import re
+import string
+
+
+COMMENT_SYMBOLS = {
+    '.java': ['//'],
+    '.hrh': ['//'],
+    '.cpp': ['//'],
+    '.h': ['//'],
+    '.inf': ['//'],
+    '.mmp': ['//'],
+    '.iby': ['//'],
+    '.pl':['#'],
+    '.py':['#'],
+    '.mk':['#'],
+    '.bat':['REM'],
+    '.xml':['<!--'],
+    '.txt':['//'],
+    '.cmd':['#','REM']
+    }
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere   
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger("comments")
+
+
+class CommentParser(object):
+    """ Parse branch information. """
+    def __init__(self, files, element_name):
+        self.files = files
+        self.element_name = element_name
+
+    def scan(self):
+        """ This method goes processes the input files.
+        
+        It returns an xml document.  """
+        doc = amara.create_document(u"commentLog")
+        for path in self.files:
+            open_file = open(path)
+            CommentParser.scan_content(path, open_file.read(), self.element_name, doc)
+            open_file.close()
+
+        #print doc.xml()
+        return doc
+    
+    @staticmethod
+    def scan_content(filename, content, element_name, doc=None):
+        """ This method scan the defined content to find any custom comment tags.
+        
+        It returns an xml document.
+        """
+        # Creating a doc if not defined
+        if not doc:
+            doc = amara.create_document(u"commentLog")
+            
+        # Search the file for any XML elements matching the given element name
+        regex = string.Template(r"<${element_name}.*</${element_name}>").substitute(element_name=element_name)
+        comment_elements = re.findall(regex, content, re.DOTALL)
+        for comment in comment_elements:
+            (_, file_type) = os.path.splitext(filename)
+            file_type = file_type.lower()
+            if COMMENT_SYMBOLS.has_key(file_type):
+                for i in range(len(COMMENT_SYMBOLS[file_type])): 
+                    comment = comment.replace(COMMENT_SYMBOLS[file_type][i], "")
+            try:
+                doc.commentLog.xml_append_fragment(comment)
+                # Add a generic file attribute to the comment to label which file it comes from
+                doc.commentLog.xml_children[-1].xml_set_attribute(u'file', unicode(filename))
+            except Exception:
+                _logger.warning("A comment in '%s' is not valid XML." % filename)
+
+        #print doc.xml()
+        return doc
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/configuration.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,726 @@
+#============================================================================ 
+#Name        : configuration.py 
+#Part of     : Helium 
+#
+#Partly Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+# 
+#==============================================================================
+
+"""Defines an interface for accessing configurations, typically for SW builds.
+
+This interface is generally based on the Jakarta Commons Configuration API. A
+configuration is a collection of properties. Builders create Configuration
+objects from various source inputs.
+
+"""
+
+
+import copy
+import logging
+import os
+import re
+import sys
+import time
+import types
+import UserDict
+import xml.dom.minidom
+
+
+
+_logger = logging.getLogger('configuration')
+logging.basicConfig(level=logging.INFO)
+
+class Configuration(object, UserDict.DictMixin):
+    """ Base Configuration objects. """
+    
+    key_re = re.compile(r'\${(?P<name>[._a-zA-Z0-9]+)}', re.M)
+    
+    def __init__(self, data=None):
+        """ Initialization. """
+        if data == None:
+            data = {}
+        self.name = None
+        self.data = data
+
+    def __contains__(self, key):
+        """ Check if a keys is defined in the dict. """
+        return self.data.__contains__(key)
+    
+    def __getitem__(self, key, interpolate=True):
+        """ Get an item from the configuration via dictionary interface. """
+        if interpolate:
+            return self.interpolate(self.data[key])
+        return self.data[key]
+
+    def __setitem__(self, key, item):
+        """ Set an item from the configuration via dictionary interface. """
+        self.data[key] = item
+
+    def __delitem__(self, key):
+        """ Remove an item from the configuration via dictionary interface. """
+        del self.data[key]
+
+    def keys(self):
+        """ Get the list of item keys. """
+        return self.data.keys()
+
+    def match_name(self, name):
+        """ See if the given name matches the name of this configuration. """
+        return self.name == name
+
+    def get(self, key, default_value):
+        """ Get an item from the configuration. """
+        try:
+            return self.__getitem__(key)
+        except KeyError:
+            return default_value
+
+    def get_list(self, key, default_value):
+        try:
+            itemlist = self.__getitem__(key)
+            if not isinstance(itemlist, types.ListType):
+                itemlist = [itemlist]
+            return itemlist
+        except KeyError:
+            return default_value
+        
+    def get_int(self, key, default_value):
+        try:
+            value = self.__getitem__(key)
+            return int(value)
+        except KeyError:
+            return default_value
+        
+    def get_boolean(self, key, default_value):
+        try:
+            value = self.__getitem__(key)
+            return value == "true" or value == "yes" or value == "1"
+        except KeyError:
+            return default_value
+        
+    def interpolate(self, value):
+        """ Search for patterns of the form '${..}' and insert matching values. """
+        if isinstance(value, types.ListType):
+            value = [self.interpolate(elem) for elem in value]
+        else:
+            if isinstance(value, types.StringType) or \
+               isinstance(value, types.UnicodeType) or \
+               isinstance(value, types.ListType):
+                for match in self.key_re.finditer(value):
+                    for property_name in match.groups():
+                        if self.has_key(property_name):
+                            property_value = self.__getitem__(property_name)
+                            if isinstance(property_value, types.ListType):
+                                property_value = ",".join(property_value)
+                            else:
+                                property_value = re.sub(r'\\', r'\\\\', property_value, re.M)
+                            value = re.sub('\${' + property_name + '}', property_value, value, re.M)
+        return value
+    
+    def __str__(self):
+        return self.__class__.__name__ + '[' + str(self.name) + ']'
+        
+    def __cmp__(self, other):
+        return cmp(self.__str__, other.__str__)
+       
+       
+class PropertiesConfiguration(Configuration):
+    """ A Configuration that parses a plain text properties file.
+    
+    This typically follows the java.util.Properties format.
+    
+    Note: This code is mostly based on this recipe
+    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496795.
+    Copyright (c) Anand Balachandran Pillai
+    """
+    def __init__(self, stream=None, data=None):
+        Configuration.__init__(self, data)
+        
+        self.othercharre = re.compile(r'(?<!\\)(\s*\=)|(?<!\\)(\s*\:)')
+        self.othercharre2 = re.compile(r'(\s*\=)|(\s*\:)')
+        self.bspacere = re.compile(r'\\(?!\s$)')
+        
+        if stream is not None:
+            self.load(stream)
+        
+#    def __str__(self):
+#        s='{'
+#        for key,value in self.data.items():
+#            s = ''.join((s,key,'=',value,', '))
+#
+#        s=''.join((s[:-2],'}'))
+#        return s
+
+    def __parse(self, lines):
+        """ Parse a list of lines and create
+        an internal property dictionary """
+
+        # Every line in the file must consist of either a comment
+        # or a key-value pair. A key-value pair is a line consisting
+        # of a key which is a combination of non-white space characters
+        # The separator character between key-value pairs is a '=',
+        # ':' or a whitespace character not including the newline.
+        # If the '=' or ':' characters are found, in the line, even
+        # keys containing whitespace chars are allowed.
+
+        # A line with only a key according to the rules above is also
+        # fine. In such case, the value is considered as the empty string.
+        # In order to include characters '=' or ':' in a key or value,
+        # they have to be properly escaped using the backslash character.
+
+        # Some examples of valid key-value pairs:
+        #
+        # key     value
+        # key=value
+        # key:value
+        # key     value1,value2,value3
+        # key     value1,value2,value3 \
+        #         value4, value5
+        # key
+        # This key= this value
+        # key = value1 value2 value3
+        
+        # Any line that starts with a '#' is considerered a comment
+        # and skipped. Also any trailing or preceding whitespaces
+        # are removed from the key/value.
+        
+        # This is a line parser. It parses the
+        # contents like by line.
+
+        lineno = 0
+        i = iter(lines)
+
+        for line in i:
+            lineno += 1
+            line = line.strip()
+            # Skip null lines
+            if not line: continue
+            # Skip lines which are comments
+            if line[0] == '#': continue
+
+            # Position of first separation char
+            sepidx = -1
+            # A flag for performing wspace re check
+            #flag = 0
+            # Check for valid space separation
+            # First obtain the max index to which we
+            # can search.
+            m = self.othercharre.search(line)
+            if m:
+                first, last = m.span()
+                start, end = 0, first
+                #flag = 1
+                wspacere = re.compile(r'(?<![\\\=\:])(\s)')        
+            else:
+                if self.othercharre2.search(line):
+                    # Check if either '=' or ':' is present
+                    # in the line. If they are then it means
+                    # they are preceded by a backslash.
+                    
+                    # This means, we need to modify the
+                    # wspacere a bit, not to look for
+                    # : or = characters.
+                    wspacere = re.compile(r'(?<![\\])(\s)')        
+                start, end = 0, len(line)
+                
+            m2 = wspacere.search(line, start, end)
+            if m2:
+                # print 'Space match=>',line
+                # Means we need to split by space.
+                first, last = m2.span()
+                sepidx = first
+            elif m:
+                # print 'Other match=>',line
+                # No matching wspace char found, need
+                # to split by either '=' or ':'
+                first, last = m.span()
+                sepidx = last - 1
+                # print line[sepidx]
+                
+                
+            # If the last character is a backslash
+            # it has to be preceded by a space in which
+            # case the next line is read as part of the
+            # same property
+            while line[-1] == '\\':
+                # Read next line
+                try:
+                    nextline = i.next()
+                    nextline = nextline.strip()
+                    lineno += 1
+                    # This line will become part of the value
+                    line = line[:-1] + nextline
+                except StopIteration:
+                    break
+
+            # Now split to key,value according to separation char
+            if sepidx != -1:
+                key, value = line[:sepidx], line[sepidx+1:]
+            else:
+                key, value = line,''
+
+            self.processPair(key, value)
+            
+    def processPair(self, key, value):
+        """ Process a (key, value) pair """
+
+        oldkey = key
+        oldvalue = value
+        
+        # Create key intelligently
+        keyparts = self.bspacere.split(key)
+        # print keyparts
+
+        strippable = False
+        lastpart = keyparts[-1]
+
+        if lastpart.find('\\ ') != -1:
+            keyparts[-1] = lastpart.replace('\\','')
+
+        # If no backspace is found at the end, but empty
+        # space is found, strip it
+        elif lastpart and lastpart[-1] == ' ':
+            strippable = True
+
+        key = ''.join(keyparts)
+        if strippable:
+            key = key.strip()
+            oldkey = oldkey.strip()
+        
+        oldvalue = self.unescape(oldvalue)
+        value = self.unescape(value)
+        
+        self.data[key] = value.strip()
+
+#        # Check if an entry exists in pristine keys
+#        if self._keymap.has_key(key):
+#            oldkey = self._keymap.get(key)
+#            self._origprops[oldkey] = oldvalue.strip()
+#        else:
+#            self._origprops[oldkey] = oldvalue.strip()
+#            # Store entry in keymap
+#            self._keymap[key] = oldkey
+        
+    def escape(self, value):
+
+        # Java escapes the '=' and ':' in the value
+        # string with backslashes in the store method.
+        # So let us do the same.
+        newvalue = value.replace(':','\:')
+        newvalue = newvalue.replace('=','\=')
+
+        return newvalue
+
+    def unescape(self, value):
+
+        # Reverse of escape
+        newvalue = value.replace('\:',':')
+        newvalue = newvalue.replace('\=','=')
+
+        return newvalue    
+        
+    def load(self, stream):
+        """ Load properties from an open file stream """
+        
+        # For the time being only accept file input streams
+        if not(hasattr(stream, 'readlines') and callable(stream.readlines)):
+            raise TypeError,'Argument should be a file object!'
+        # Check for the opened mode
+        if hasattr(stream, 'mode') and stream.mode != 'r':
+            raise ValueError,'Stream should be opened in read-only mode!'
+
+        try:
+            lines = stream.readlines()
+            self.__parse(lines)
+        except IOError:
+            raise
+
+    def store(self, out):
+        """ Serialize the properties back to a file. """
+
+        if out.mode[0] != 'w':
+            raise ValueError, 'Stream should be opened in write mode!'
+
+        try:
+            # Write timestamp
+            out.write(''.join(('# ', time.strftime('%a %b %d %H:%M:%S %Z %Y', time.localtime()), '\n')))
+            
+            # Write properties from the  dictionary
+            for key in self.data.keys():
+                value = self.data[key]
+                out.write(''.join((key, '=', self.escape(value), '\n')))
+                
+            out.close()
+        except IOError, e:
+            raise
+            
+
+class NestedConfiguration(Configuration):
+    def __init__(self):
+        """ Initialization. """
+        Configuration.__init__(self, None)
+        self.parent = None
+        self.type = None
+        self.abstract = None
+
+    def isBuildable(self):
+        return self.abstract == None
+
+    def _addPropertyValue(self, key, value, parseList=True):
+        """Adds a property value to the configuration.
+
+        If the property does not exist, it is added without modification.
+        If there is already a single value matching the key, the value is replaced by a list
+        containing the original and new values.
+        If there is already a list, the new value is added to the list.
+
+        The value is first processed in case it also represents a list of values,
+        e.g. comma-separated values.
+        """
+        if parseList and value.find(',') != -1:
+            value = value.split(',')
+            # Remove all whitespace
+            value = [v.strip() for v in value]
+
+        if key in self.data:
+            currentValue = self.data[key]
+
+            # Make sure current value is a list
+            if not isinstance(currentValue, types.ListType):
+                currentValue = [currentValue]
+
+            # Add new value(s)
+            if isinstance(value, types.ListType):
+                currentValue.extend(value)
+            else:
+                currentValue.append(value)
+            self.data[key] = currentValue
+        else:
+            self.data[key] = value
+
+    def __getitem__(self, key, interpolate=True):
+        #print "__getitem__(%s, %s)" % (self.name, key)
+        if self.data.has_key(key):
+            value = super(NestedConfiguration, self).__getitem__(key, False)
+            if interpolate:
+                return self.interpolate(value)
+            return value
+        elif self.parent != None:
+            value = self.parent.__getitem__(key, False)
+            if interpolate:
+                return self.interpolate(value)
+            return value
+        raise KeyError('Cannot find key: ' + key)
+
+    def __setitem__(self, key, item):
+        self.data[key] = item
+
+    def __delitem__(self, key):
+        del self.data[key]
+
+    def __contains__(self, key):
+        """ Check if a keys is defined in the dict. """
+        if self.data.__contains__(key):
+            return True 
+        elif self.parent:
+            return self.parent.__contains__(key)
+        return False
+            
+    def keys(self):
+        myKeys = self.data.keys()
+        if self.parent != None:
+            parentKeys = self.parent.keys()
+            for key in parentKeys:
+                if not key in myKeys:
+                    myKeys.append(key)
+        return myKeys
+
+    def match_name(self, name):
+        if self.name == name:
+            return True
+        if self.parent != None:
+            return self.parent.match_name(name)
+        return False
+
+
+class Specification(NestedConfiguration):
+    """ Deprecated. This should be removed in future, it adds no value. """
+    
+    def __init__(self):
+        """ Initialization. """
+        NestedConfiguration.__init__(self)
+
+
+class ConfigurationSet(Configuration):
+    """A ConfigurationSet represents a set of configurations.
+
+    Each configuration should be processed separately. This is matching
+    the Raptor model where a single XML file can contain definitions
+    of multiple specifications and configurations.
+
+    It is however somewhat different from the Commons Configuration classes
+    that combine configurations, e.g. CombinedConfiguration,
+    CompositeConfiguration. These act to combine configurations in a way
+    such that a single configuration interface is still presented to the
+    client.
+    """
+    
+    def __init__(self, configs):
+        """ Initialization. """
+        Configuration.__init__(self)
+        self._configs = configs
+
+    def getConfigurations(self, name=None, type=None):
+        """ Return a list of configs that matches the name and type specified. 
+        
+        This can be queried multiple times to retrieve different named configurations.
+        """
+        result = []
+        for c in self._configs:
+            if ((name != None and c.match_name(name)) or name == None) and ((type != None and c.type == type) or type == None):
+                result.append(c)        
+        return result
+
+
+class ConfigurationBuilder(object):
+    """ Base class for builders that can create Configuration objects. """
+    
+    def getConfiguration(self):
+        """Returns a Configuration object."""
+        raise NotImplementedError
+
+
+class NestedConfigurationBuilder(ConfigurationBuilder):
+    """ Builder for building Configuration objects from nested configurations. """
+    
+    _constructors = {'spec':Specification, 'config':NestedConfiguration}
+
+    def __init__(self, inputfile, configname=''):
+        """ Initialization. """
+        self.inputfile = inputfile
+        self.configname = configname
+        self._warn_on_deprecated_spec = False
+
+    def getConfiguration(self):
+        """ Returns a ConfigurationSet object.
+
+        A ConfigurationSet represents a number of Configuration objects
+        that all may need to be processed.
+        """
+        try:
+            dom = xml.dom.minidom.parse(self.inputfile)
+        except Exception, exc:
+            raise Exception("XML file '%s' cannot be parsed properly: %s" % (self.inputfile, exc))
+
+        # The root element is typically <build> but can be anything
+        self.rootNode = dom.documentElement
+        configs = []
+
+        # Create a flat list of buildable configurations
+        for child in self.rootNode.childNodes:
+            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
+                _logger.debug('Parsing children')
+                self.parseConfiguration(child, configs)
+
+        # Add configuration references
+        references = []
+        for reference in self.getReferences():
+            for conf in configs:
+                if conf.match_name(reference[1]):
+                    newConf = copy.deepcopy(conf)
+                    newConf.name = reference[0]
+                    references.append(newConf)
+
+        configs = configs + references
+
+        dom.unlink()
+        _logger.debug('Set of configs: ' + str(configs))
+        
+        if self._warn_on_deprecated_spec:
+            _logger.warning("Use of deprecated 'spec' element name in this configuration. Please rename to config")
+        return ConfigurationSet(configs)
+
+    def writeToXML(self, output, config_list, config_name=None):
+        document = """
+<build>
+</build>"""        
+        doc = xml.dom.minidom.parseString(document)
+        docRootNode = doc.documentElement
+        configNode = doc.createElement( 'config')
+        docRootNode.appendChild(configNode)
+        if config_name is not None:
+            configNode.setAttribute( 'name', config_name)        
+        configNode.setAttribute( 'abstract', 'true')
+
+        for config in config_list:
+            configSubNode = doc.createElement( 'config')
+            configNode.appendChild(configSubNode)
+            if config.name is not None:
+                configSubNode.setAttribute( 'name', config.name)
+
+            for key in config.keys():
+                if type(config.__getitem__(key)) == types.ListType:
+                    for i in range(len(config.__getitem__(key))):
+                        setNode = doc.createElement( 'set')
+                        configSubNode.appendChild(setNode)
+                        setNode.setAttribute( 'name', key)
+                        setNode.setAttribute( 'value', config.__getitem__(key)[i]) 
+                else:
+                    setNode = doc.createElement( 'set')
+                    configSubNode.appendChild(setNode)
+                    setNode.setAttribute( 'name', key)
+                    setNode.setAttribute( 'value', config.__getitem__(key))
+        out = open(output, 'w+')
+        out.write(doc.toprettyxml())
+        out.close()            
+
+
+    def getConfigurations(self, name=None, type=None):
+        """ Get a list of the individual configurations. 
+        
+        Once read a new builder must be opened to retrieve a differently filtered set of configurations.
+        """
+        config_set = self.getConfiguration()
+        return config_set.getConfigurations(name, type)
+
+    def getReferences(self):
+        references = []
+        for rootNode in self.rootNode.childNodes:
+            if rootNode.nodeType == xml.dom.Node.ELEMENT_NODE:
+                for child in rootNode.childNodes:
+                    if child.nodeType == xml.dom.Node.ELEMENT_NODE:
+                        for conf in child.childNodes:
+                            if conf.nodeName == 'specRef':
+                                for ref in conf.getAttribute('ref').split(','):
+                                    if not ( child.getAttribute('abstract') and str(self.configname) == '' ):
+                                        references.append([child.getAttribute('name'), ref])
+        return references
+
+    def parseConfiguration(self, configNode, configs, parentConfig=None):
+        """ Parse an individual nested configuration. """
+        # Create appropriate config object
+        if configNode.nodeName == 'spec':
+            self._warn_on_deprecated_spec = True
+        constructor = self._constructors[configNode.nodeName]
+        config = constructor()
+        _logger.debug('Configuration created: ' + str(config))
+        if parentConfig != None:
+            config.parent = parentConfig
+            #config.data.update(parentConfig.data)
+
+        # Add any attribute properties
+        for i in range(configNode.attributes.length):
+            attribute = configNode.attributes.item(i)
+            if hasattr(config, attribute.name):
+                _logger.debug('Adding config attribute: ' + str(attribute.name))
+                setattr(config, str(attribute.name), attribute.nodeValue)
+            else:
+                raise Exception('Invalid attribute for configuration: ' + attribute.name)
+
+        # Process the config element's children
+        configChildNodes = []
+
+        for child in configNode.childNodes:
+            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
+                # <append> directives should add to parent values. In
+                # this case initially set the value to the parent value.
+                if child.nodeName == 'append':
+                    name = child.getAttribute('name')
+                    if parentConfig != None and parentConfig.has_key(name):
+                        parent_value = parentConfig.__getitem__(name, False)
+                        if not isinstance(parent_value, types.ListType):
+                            parent_value = [parent_value]
+                        for value in parent_value:
+                            config._addPropertyValue(name, value)
+
+                if child.nodeName == 'set' or child.nodeName == 'append':
+                    name = child.getAttribute('name')
+                    if child.hasAttribute('value'):
+                        value = child.getAttribute('value')
+                        config._addPropertyValue(name, value)
+                    elif child.hasChildNodes():
+                        value = ""
+                        for textchild in child.childNodes:
+                            value += textchild.data
+                        config._addPropertyValue(name, value, False)
+                elif child.nodeName == 'specRef':
+                    for ref in child.getAttribute('ref').split(','):
+                        node = self.getNodeByReference(ref)
+                        if not node:
+                            raise Exception('Referenced spec not found: ' + ref)
+                elif self._constructors.has_key(child.nodeName):
+                    configChildNodes.append(child)
+                else:
+                    raise Exception('Bad configuration xml element: ' + child.nodeName)
+
+        for childConfigNode in configChildNodes:
+            self.parseConfiguration(childConfigNode, configs, config)
+
+        # Only save the buildable configurations
+        if config.isBuildable():
+            _logger.debug('Adding config to buildable set: ' + str(config))
+            configs.append(config)
+
+    def getNodeByReference(self, refName):
+        """ Find a node based on a reference to it. """
+        for child in self.rootNode.childNodes:
+            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
+                for conf in child.childNodes:
+                    if conf.nodeName == 'spec':
+                        if refName == conf.getAttribute('name'):
+                            return conf
+
+
+class HierarchicalConfiguration(Configuration):
+    """ Represents hierarchical configurations such as XML documents. """
+    
+    def __init__(self):
+        """ Initialization. """
+        Configuration.__init__(self, None)
+        self._root = None
+        
+    def __getitem__(self, key, interpolate=True):
+        """ Get an item as a dict. """
+        elements = self._root.xpath(_Key(key).to_xpath())
+        values = [element.text for element in elements]
+        value = ','.join(values)
+        if interpolate:
+            value = self.interpolate(value)
+        return value
+        
+    
+class _Key(object):
+    """ A hierarchical configuration key. """
+    
+    def __init__(self, string):
+        """ Initialization. """
+        self.string = string
+        
+    def to_xpath(self):
+        return self.string.replace('.', '/')
+        
+        
+class XMLConfiguration(HierarchicalConfiguration):
+    """ A XML-based hierarchical configuration. """
+    
+    def __init__(self, file_):
+        """ Initialization. """
+        from lxml import etree
+        HierarchicalConfiguration.__init__(self)
+        
+        self._root = etree.parse(file_)
+        
+        
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/configuration_model.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,217 @@
+#============================================================================ 
+#Name        : configuration_model.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import amara
+from amara import bindery
+import logging
+import types
+import copy
+
+_logger = logging.getLogger('configurationmodel')
+#logging.basicConfig(level=logging.DEBUG)
+_handler = logging.StreamHandler()
+_handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
+_logger.addHandler(_handler)
+
+
+class PropertyDef(object):
+    """ The model definition of a property. """
+    
+    def __init__(self, property_node):
+        """ Initialization. """
+        if not hasattr(property_node, 'name'):
+            raise Exception("Name is not defined for '" + str(property_node) + "'")
+        if not hasattr(property_node, 'type'):
+            raise Exception("Type is not defined for '" + str(property_node.name) + "'")
+        if not hasattr(property_node, 'description'):
+            raise Exception("Description is not defined for '" + str(property_node.name) + "'")
+            
+        self.name = str(property_node.name)
+        self.editStatus = str(property_node.editStatus)
+        self.type = str(property_node.type)
+        self.description = str(property_node.description).strip()
+        
+        if len(self.description) == 0:
+            _logger.log(logging.ERROR, "Description has no content for '" + str(property_node.name) + "'")
+        
+        if hasattr(property_node, 'deprecated'):
+            self.deprecated = str(property_node.deprecated)
+                        
+    def __repr__(self):
+        return self.name
+        
+    def __str__(self):
+        return self.name
+    
+    
+class GroupDef(object):
+    """ The model definition of a group of properties. """
+    def __init__(self, group_node):
+        """ Initialization. """
+        self.name = str(group_node.name)
+        self.description = str(group_node.description)
+        self.properties = {}
+        self.propref = []
+        for property_ in group_node.propertyRef:
+            self.properties[str(property_)] = property_.usage
+            
+    def check_config(self, config, items):
+        """ Checks that the set of properties in a group are properly defined. """
+        defined_props = [p for p in self.properties.keys() if config.has_key(p)]
+        if len(defined_props) > 0:
+            required_props = [p for p in self.properties.keys() if self.properties[p] == 'required']
+            required_not_defined_props = set(required_props).difference(set(defined_props))
+            for undefined_property in required_not_defined_props:
+                items.append(UndefinedRequiredInGroupItem((self.name, undefined_property)))
+        
+        
+class DataModel(object):
+    """ A model of the configuration properties. """
+    def __init__(self, modelpath):
+        """ Initialization. """
+        doc = amara.parse(open(modelpath, 'r'))
+        
+        self.properties = {}
+        self.required_props = []
+        for property_ in doc.heliumDataModel.property:
+            self.properties[str(property_.name)] = PropertyDef(property_)
+                   
+        self.nongroupedproperties = copy.copy(self.properties)
+        self.groups = {}
+        for group in doc.heliumDataModel.group:
+            groupobj = GroupDef(group)
+            self.groups[str(group.name)] = groupobj
+            
+            for prop in groupobj.properties:
+                groupobj.propref.append(self.properties[prop])
+                if prop in self.nongroupedproperties:
+                    del self.nongroupedproperties[prop]
+                    
+            groupobj.propref.sort()
+            
+            required_props_in_group = [p for p in group.propertyRef if p.usage == 'required']
+            
+            for required_prop in required_props_in_group:
+                self.required_props.append(required_prop)
+                if not self.properties.has_key(str(required_prop)):
+                    raise Exception("Required property " + str(required_prop) + " is not defined!")
+        
+    def validate_config(self, config):
+        """ Validate the Ant configuration against the model. """
+        items = []
+        self._check_deprecated_properties(config, items)
+        self._check_undefined_properties(config, items)
+        self._check_undefined_properties_in_groups(config, items)
+        self._check_type_validation(config, items)
+        self._check_defined_properties_not_in_groups(config, items)
+        return items
+    
+    def validate_config_at_startup(self, config):
+        """ Validate the Ant configuration against the model at build startup. """
+        items = []
+        
+        for p in self.required_props:
+            if not config.has_key(str(p)):
+                print "Required property " + str(p) + " is not defined!"
+        
+        return items
+    
+    def _check_deprecated_properties(self, config, items):
+        """ Check that deprecated properties not being used. """
+        deprecated_props = [p for p in self.properties.values() if hasattr(p, 'deprecated')]
+        for deprecated_prop in deprecated_props:
+            _logger.debug('Checking deprecated property: ' + str(deprecated_prop))
+            if config.has_key(str(deprecated_prop)):
+                items.append(UsingDeprecatedItem(deprecated_prop))
+    
+    def _check_undefined_properties(self, config, items):
+        """ Check for any defined properties that are not in the model. """ 
+        undefined_properties = [p for p in config.keys() if p not in self.properties]
+        undefined_properties.sort()
+        for undefined_property in undefined_properties:
+            items.append(MissingFromDataModelItem(undefined_property))
+
+    def _check_undefined_properties_in_groups(self, config, items):
+        for group in self.groups.values():
+            _logger.debug('Checking group: %s' % group.name)
+            group.check_config(config, items)
+    
+    def _check_defined_properties_not_in_groups(self, config, items):
+        gp = []
+        for group in self.groups.values():
+            gp = gp + group.properties.keys()
+        for p in self.properties.values():
+            if not str(p) in gp:
+                raise Exception(str(p) + ' not in a group')
+    
+    def _check_type_validation(self, config, items):
+        prop_string = [p for p in self.properties.values() if p.type == 'string']
+        prop_integer = [p for p in self.properties.values() if p.type == 'integer']
+        prop_boolean = [p for p in self.properties.values() if p.type == 'boolean']
+        prop_flag = [p for p in self.properties.values() if p.type == 'flag']
+        
+        for prop in prop_integer:
+            if config.has_key(str(prop)):
+                if not config[str(prop)].isdigit():
+                    items.append(WrongTypeItem(("integer", prop)))            
+               
+        for prop in prop_boolean:
+            if config.has_key(str(prop)) :
+                if not (config[str(prop)] == 'false' or 'true'):
+                    items.append(WrongTypeItem(("boolean", prop)))
+                    
+        for prop in prop_string:
+            if config.has_key(str(prop)):
+                if len(config[str(prop)]) == 0:
+                    items.append(WrongTypeItem(("string", prop)))
+
+        
+class Item(object):
+    level = logging.INFO
+    message = ''
+
+    def __init__(self, values):
+        """ Initialization. """
+        self.values = values
+    
+    def log(self, logger):
+        logger.log(self.level, str(self))
+        
+    def __str__(self):
+        return self.message % self.values
+
+
+class MissingFromDataModelItem(Item):
+    level = logging.INFO
+    message = 'Property not in data model: %s'
+
+    
+class UsingDeprecatedItem(Item):
+    level = logging.WARNING
+    message = 'Deprecated property used: %s'
+
+
+class UndefinedRequiredInGroupItem(Item):
+    level = logging.WARNING
+    message = 'Required property in %s group is not defined: %s'
+
+    
+class WrongTypeItem(Item):
+    level = logging.WARNING
+    message = 'Invalid %s value: %s'
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ctc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,74 @@
+#============================================================================ 
+#Name        : ctc.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import ftplib
+
+
+class MonSymFTPUploader:
+    """ This class implement an uploader for MON.SYM file. """
+    
+    def __init__(self, server, paths, diamondsid):
+        """ Upload the files discovered under the paths,
+            and upload them under the FTP server.
+        """
+        self.server = server
+        self.paths = paths
+        self.diamondsid = diamondsid
+        self.ftp = None
+    
+    def upload(self):
+        self._open()
+        """ Proceed to the upload. """
+        monsyms = []
+        i = 1
+        for p in self.paths:
+            if os.path.exists(p) and os.path.isfile(p):
+                # ftp://1.2.3.4/ctc_helium/[diamonds_id]/mon_syms/2/mon.sym
+                outputdir = "ctc_helium/%s/mon_syms/%d" % (self.diamondsid , i)
+                output = outputdir + "/MON.SYM"
+                self._ftpmkdirs(outputdir)
+                print "Copying %s under %s" % (p, output)
+                self._send(p, output)
+                monsyms.append(output)
+                i += 1
+        self._close()
+        return monsyms
+
+    def _open(self):
+        self.ftp = ftplib.FTP(self.server, 'anonymous', '')
+    
+    def _close(self):
+        self.ftp.quit()
+
+    def _ftpmkdirs(self, dir):
+        pwd = self.ftp.pwd()
+        for d in dir.split('/'):
+            if len(d)!=0:
+                try:
+                    print "Creating %s under %s" % (d, self.ftp.pwd())
+                    self.ftp.mkd(d)
+                except ftplib.error_perm, exc:
+                    pass
+                self.ftp.cwd(d)
+        self.ftp.cwd(pwd)
+    
+    def _send(self, src, dst):
+        self.ftp.storbinary("STOR " + dst, open(src, "rb"), 1024)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/dataurl.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+#============================================================================ 
+#Name        : dataurl.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This module implements method to create dataurl """
+import mimetypes
+import base64
+import urllib
+
+def from_url(url):
+    """ This function returns a data url using content pointed by url. """
+    (mimetype, encoding) = mimetypes.guess_type(url)
+    if mimetype == None:
+        return url
+    if encoding != None:
+        encoding = "charset=%s;" % encoding
+    else:
+        encoding = ""
+    data = urllib.urlopen(url).read()
+    return "data:%s;%sbase64,%s" % (mimetype, encoding, base64.encodestring(data).replace("\n",""))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/delta_zip.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,331 @@
+#============================================================================ 
+#Name        : delta_zip.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import re
+import fileutils
+import buildtools
+import logging
+
+_logger = logging.getLogger('delta_zip')
+logging.basicConfig(level=logging.INFO)
+
+class MD5SignatureBuilder(object):
+    """ MD5 CRC creation base class"""
+    def __init__(self, build_area_root, nb_split, temp_dir, exclude_dirs, list_of_files):
+        """constructor"""
+        if not build_area_root.endswith(os.sep):
+            self.build_area_root = build_area_root + os.sep
+        self.nb_split = int(nb_split)
+        self.temp_dir = temp_dir
+        self.exclude_dirs = exclude_dirs
+        self.list_of_files = list_of_files
+        
+    def create_file_list(self):
+        """Create list of files (was list_files.pl)"""
+        #list_of_files_symbol = os.path.join(self.temp_dir, "list_files_sym.txt")
+        
+        if not os.path.exists(self.temp_dir):
+            os.mkdir(self.temp_dir)
+      
+        fp_filelist = open(self.list_of_files, 'w')
+        #fp_filelist_sym = open(list_of_files_symbol, 'w')
+                        
+        scanner = fileutils.FileScanner(self.build_area_root)
+        scanner.add_include('**')
+        
+        for _dir in self.exclude_dirs.split(','):
+            _dir = _dir.replace(self.build_area_root, "")
+            scanner.add_exclude(_dir)
+
+        for path in scanner.scan():
+            if (not os.path.isdir(path)) or (os.path.isdir(path) and (os.listdir(path) != []  and os.listdir(path) != ['.svn'])):
+                (drive, _) = os.path.splitdrive(path)
+                path = path.replace(drive + os.sep, "")
+                fp_filelist.write(path + "\n")
+            
+    def split_file_list(self):
+        """Split the list of files for parallelalisation"""
+        md5_dir = os.path.join(self.temp_dir, "md5_temp")
+        self.dest_dir = os.path.join(md5_dir, str(self.nb_split))
+        if not os.path.exists(self.dest_dir):
+            os.makedirs(self.dest_dir)
+        fp_split = []
+        #Open files
+        #White list_of_lists.txt
+        self.list_of_lists = self.dest_dir + "/list_of_lists.txt"
+        fp_list_of_lists = open(self.list_of_lists, 'w')
+        for i in range(self.nb_split):
+            filename = self.dest_dir + "/" + str(i) + ".txt"
+            _fp = open(filename, 'w')
+            fp_split.append(_fp)
+            #Write in list_of_lists
+            fp_list_of_lists.write(filename + "\n")
+            
+        #Write in files
+        fp_read = open(self.list_of_files, 'r') 
+        line = fp_read.readline()
+        line_number = 0
+        while(line != ""):
+            fp_split[line_number % len(fp_split)].write(line)
+            line = fp_read.readline()
+            line_number += 1
+        
+        fp_list_of_lists.close()    
+        fp_read.close()
+        for _fp in fp_split:
+            _fp.close()
+            
+    def create_command_list(self):        
+        """ create the command to run evalid on each file in the list of files"""
+        liste = buildtools.CommandList()
+        
+        #tools_dir = os.path.join(self.build_area_root, "/epoc32/tools")
+        
+        for i in range(self.nb_split):
+            #liste.addCommand(buildtools.Command("perl -I"+tools_dir, tools_dir, [os.path.join(tools_dir,"evalid_multiple.pl"), "-f", self.__get_partial_input_file_name(i), "> "+self.__get_partial_signature_file_name(i) ]))
+            liste.addCommand(buildtools.Command("evalid", os.sep, ["", "-f", self.__get_partial_input_file_name(i) + " "+self.build_area_root, self.__get_partial_signature_file_name(i) ]))
+            
+        return liste
+    
+    def __get_partial_input_file_name(self, _nb):
+        """ get the input file name string as has been created so far and add .txt to it"""
+        return os.path.join(self.dest_dir, str(_nb) + ".txt")
+            
+    def __get_partial_signature_file_name(self, _nb):
+        """ get the signature file name string as has been created so far and add .md5 to it"""
+        return os.path.join(self.dest_dir, str(_nb) + ".md5")
+        
+    def concatenate_signature_files(self, signature_file):
+        """ concatenate all the files with the MD5 CRC in """
+        # Get header
+        _fp = open(self.__get_partial_signature_file_name(0), 'r')
+        line = ""
+        header_temp = ""
+        header = ""
+        while (re.search(r'(\S+).*MD5=(\S+)', line) == None):
+            header_temp = header_temp + line
+            line = _fp.readline()
+        
+        for line in header_temp.splitlines():
+            if re.match(r'Directory:.*', line):
+                line =  "Directory:" + self.build_area_root
+            if re.match(r'FileList:.*', line):
+                line = "FileList:" + self.list_of_files
+            header = header + line + "\n"
+        
+        #re.sub(r'(Directory:).*\n', "\1"+self.build_area_root, header)
+        #re.sub(r'(FileList:).*\n', "\1"+self.list_of_files, header)
+            
+        header_size = len(header.splitlines())
+        
+        fp_md5_signatures_file = open(signature_file, 'w')
+        fp_md5_signatures_file.write(header)
+        for i in range(self.nb_split):
+            _fp = open(self.__get_partial_signature_file_name(i), 'r')
+
+            for i in range(header_size): # Skip header
+                _fp.readline()
+            
+            fp_md5_signatures_file.write(_fp.read())
+            _fp.close()
+        fp_md5_signatures_file.close()
+
+    def write_build_file(self):
+        """ create the file of the list of files to have a CRC created"""
+        self.create_file_list()
+        self.split_file_list()
+        self.create_build_file()
+    
+    def create_build_file(self):
+        """ there should always be an overloaded version of this method in sub-classes"""
+        raise NotImplementedError()
+    
+    def build(self, signature_file):
+        """create the list of files generate the MD5 CRC and create the final file with CRCs in"""
+        self.write_build_file()
+        self.compute_evalid_MD5()
+        self.concatenate_signature_files(signature_file)
+            
+    def compute_evalid_MD5(self):
+        """ there should always be an overlaoded version in the methos sub-class"""
+        raise NotImplementedError()
+    
+class MD5SignatureBuilderEBS(MD5SignatureBuilder):
+    """ build the MD5 CRCs for all the files in the list of files"""
+    def create_build_file(self):
+        """Create EBS XML"""
+        liste = self.create_command_list()
+        self.makefile = self.dest_dir + "/ebs.xml"
+        buildtools.convert(liste, self.makefile, "ebs")
+
+    def compute_evalid_MD5(self):
+        """Compute MD5 using the requested parallel build system"""
+        os.chdir(self.build_area_root)
+        os.system("perl -I%HELIUM_HOME%/tools/common/packages %HELIUM_HOME%/tools/compile/buildjob.pl -d " + self.makefile + " -l " + os.path.join(self.dest_dir, "md5.log") + " -n " + str(int(os.environ['NUMBER_OF_PROCESSORS'])*2))
+
+"""
+Run the delta zipping over the EC build system
+"""
+class MD5SignatureBuilderEC(MD5SignatureBuilder):
+    """ The MD5 CRC creation for delta zippinf for use on EC machines"""
+    def __init__(self, build_area_root, nb_split, temp_dir, exclude_dirs, ec_cluster_manager, ec_build_class, list_of_files):
+        MD5SignatureBuilder.__init__(self, build_area_root, nb_split, temp_dir, exclude_dirs, list_of_files)
+        self.ec_cluster_manager = ec_cluster_manager
+        self.ec_build_class = ec_build_class
+    
+    def create_build_file(self):
+        """Create makefile"""
+        liste = self.create_command_list()
+        self.makefile = self.dest_dir + "/Makefile"
+        buildtools.convert(liste, self.makefile, "make")
+
+    def compute_evalid_MD5(self):
+        """Compute MD5 using the requested parallel build system"""
+        root_path = os.environ['EMAKE_ROOT'] +";" + "c:\\apps;"
+        os.chdir(self.build_area_root)
+        
+        print "emake --emake-cm=" + self.ec_cluster_manager + " --emake-class=" + self.ec_build_class + " --emake-root="+root_path+ " --emake-emulation-table make=symbian,emake=symbian,nmake=nmake -f " + self.makefile
+        os.system("emake --emake-cm=" + self.ec_cluster_manager + " --emake-annodetail=basic,history,file,waiting --emake-annofile="+self.temp_dir+"\\delta_zip_anno.xml"+ " --emake-class=" + self.ec_build_class + " --emake-root="+root_path+" --emake-emulation-table make=symbian,emake=symbian,nmake=nmake -f " + self.makefile)
+
+class DeltaZipBuilder(object):
+    """methods to create the delta zip after all the prep"""
+    def __init__(self, build_area_root, temp_path, old_md5_signature, new_md5_signature):
+        self.build_area_root = os.path.join(build_area_root, os.sep)
+        self.temp_path = temp_path
+        self.old_md5_signature = old_md5_signature
+        self.new_md5_signature = new_md5_signature
+        self.sign_dic = SignaturesDict()
+        
+    def __fill_signature_dict(self, signature_file, old_new):
+        """ read each line of signature file search for .MD5"""
+        _fp = open(signature_file, 'r')
+        lines = _fp.read().splitlines()
+        _fp.close()
+        for line in lines:
+            info = re.search(r'([ \S]+) TYPE=.*MD5=(\S+)', line)
+            if info != None:
+                filename = info.group(1)
+                if not self.sign_dic.has_key(filename):
+                    self.sign_dic[filename] = ["", ""]
+                self.sign_dic[filename][old_new] = info.group(2)                
+    
+    def create_delta_zip(self, zip_file, delete_list_file, no_of_zips, ant_file):
+        """Create Delta zip and list of file to delete."""
+        
+        no_of_zips = int(no_of_zips)
+        self.__fill_signature_dict(self.old_md5_signature, 0)
+        self.__fill_signature_dict(self.new_md5_signature, 1)
+        
+        #fp_dic = open(zip_file + ".dic.txt", 'w')
+        #fp_dic.write(str(self.sign_dic))
+        #fp_dic.close()
+        
+        delete_list = []
+        
+        if not os.path.exists(os.path.dirname(delete_list_file)):
+            os.mkdir(os.path.dirname(delete_list_file))
+        if not os.path.exists(self.temp_path):
+            os.mkdir(self.temp_path)
+        
+        archive_txt = open(os.path.join(self.temp_path, 'create_zips.txt'), 'w')
+
+        for _file in self.sign_dic.keys():
+            filepath = os.path.join(self.build_area_root, _file)
+            
+            signatures = self.sign_dic[_file]
+            
+            ( _, rest) = os.path.splitdrive(filepath)
+            (frontpath, rest) = os.path.split(rest)
+            
+            if (signatures[0] != signatures[1]):  #File changed between the 2 BAs
+                if (signatures[0] != "") and  (signatures[1] != ""): # File is present in both BAs and has changed
+                    if os.path.exists(filepath): # File could have been deleting after running 'build-md5':
+                        archive_txt.write(_file + "\n")
+                else:
+                    if (signatures[1] != ""): # New file
+                        if os.path.exists(filepath):
+                            archive_txt.write(_file + "\n")
+                    else: # Deleted file
+                        delete_list.append(filepath)
+        
+        archive_txt.close()
+        
+        splitter = MD5SignatureBuilder('', no_of_zips, self.temp_path, '', os.path.join(self.temp_path, 'create_zips.txt'))
+        splitter.split_file_list()
+        
+        os.chdir(self.build_area_root)
+        
+        (frontpath, rest) = os.path.split(zip_file)
+        stages = buildtools.CommandList()
+        
+        for i in range(no_of_zips):
+            md5_dir = os.path.join(self.temp_path, "md5_temp")
+            path = os.path.join(md5_dir, os.path.join(str(no_of_zips), str(i) + '.txt'))
+            output = os.path.join(frontpath, rest.replace(".zip", "_part_%sof%s.zip" % (str(i+1), str(no_of_zips))))
+            
+            cmd = buildtools.Command('7za.exe', self.build_area_root)
+            cmd.addArg('a')
+            # Set the format to be zip-compatible
+            cmd.addArg('-tzip')
+            cmd.addArg(output)
+            cmd.addArg('@' + path)
+            
+            stages.addCommand(cmd)
+
+        writer = buildtools.AntWriter(ant_file)
+        writer.write(stages)
+
+        fp_delete = open(delete_list_file, 'w')
+        fp_delete.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
+        fp_delete.write("<updateinstructions>\n")
+        for i in delete_list:
+            fp_delete.write("<deletefileaction target=\"" + i[2:] + "\"/>\n")
+        fp_delete.write("</updateinstructions>\n")
+        fp_delete.close()
+        
+                
+class SignaturesDict(dict):
+    """ class to handle signature comparison"""
+    def __init__(self):
+        """ constructor"""
+        dict.__init__(self)
+    
+    def __str__(self):
+        """ compare the tree structures"""
+        string = ""
+        #o = OldNewBA()
+        both = False
+        only_old = False
+        only_new = False
+        for filename in self.keys():
+            signatures = self[filename]
+            if signatures[0] == signatures[1]: #File did not change
+                both = True
+            elif (signatures[0] != "") and  (signatures[1] != ""): # File is present in both BAs and has changed
+                both = False
+            else:
+                if (signatures[1] != ""): # New file
+                    only_old = True
+                else: # Deleted file
+                    only_new = True
+            
+            string = string + filename + " " + str(both) + " " + " " + str(only_old) + " " + str(only_new) + " " + self[filename][0] + " " + self[filename][1] + "\n"
+        
+        return string
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/dependancygraph.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,350 @@
+#============================================================================ 
+#Name        : dependancygraph.py
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import amara
+import codecs
+import zipfile
+from Ft.Lib import Uri
+
+class Library:
+    def __init__(self, name, license, version=''):
+        self.name = name
+        self.license = license
+        self.version = version
+        self.requires = []
+
+class ModuleGroup:
+    def __init__(self):
+        self.libraries = {}
+    def addConf(self, name, des, color):
+        self.libraries[name] = (des, [], color)
+    def addLibrary(self, conf, library):
+        for lib in self.getLibraries(conf):
+            if lib.name.lower() == library.name.lower():
+                lib.license = library.license
+                return
+        self.getLibraries(conf).append(library)
+    def getLibraries(self, conf):
+        (_, libs, _) = self.libraries[conf]
+        return libs
+    def getDescription(self, conf):
+        (des, _, _) = self.libraries[conf]
+        return des
+    def getColor(self, conf):
+        (_, _, color) = self.libraries[conf]
+        return color
+
+COLORS = ['pink', 'red', 'lightblue', 'orange', 'green', 'yellow', 'turquoise', 'limegreen']
+
+class ReadIvyConfig:
+    def __init__(self, ivyfilename):
+        self.ivyfilename = ivyfilename
+        self.ivyxml = amara.parse(Uri.OsPathToUri(ivyfilename))
+        self.group = ModuleGroup()
+
+    def readConfigurations(self):
+        for conf in self.ivyxml['ivy-module'].configurations.conf:
+            color = COLORS.pop()
+            self.group.addConf(conf.name, conf.description, color)
+
+    def readModules(self):
+        license = ''
+        for module in self.ivyxml['ivy-module'].dependencies.xml_children:
+            if hasattr(module, 'data'):
+                if 'License:' in module.data:
+                    license = module.data.strip()
+            elif hasattr(module, 'name'):
+                modulename = module.name.replace('-', '_')
+            
+                if module.org != 'SWEPT':
+                    self.group.addLibrary(module.conf, Library(modulename, license))
+                    license = ''
+
+    def readSubModules(self):
+        for module in self.ivyxml['ivy-module'].dependencies.xml_children:
+            if hasattr(module, 'name'):
+                if 'jars' in module.name:
+                    ivydir = os.path.dirname(self.ivyfilename)
+                    ivydir = os.path.join(ivydir, 'modules')
+                    ivyjarfile = os.path.join(ivydir, module.name + '-1.0.ivy.xml')
+                    ivymodulexml = amara.parse(Uri.OsPathToUri(ivyjarfile))
+                    license = ''
+                    for artifact in ivymodulexml['ivy-module'].publications.xml_children:
+                        if hasattr(artifact, 'data'):
+                            if 'License:' in artifact.data:
+                                license = artifact.data.strip()
+                        elif hasattr(artifact, 'name'):
+                            bits = artifact.name.split('-')
+                            name = bits[0]
+                            version = ''
+                            if len(bits) > 1:
+                                version = bits[1]
+                            self.group.addLibrary(module.conf, Library(name, license, version))
+                            license = ''
+
+PYTHON_GROUP = True
+SUBCON_PYTHON_GROUP = False
+
+def readEggs(libraries, dirtosearch, internaldir):
+    libraries.addConf(PYTHON_GROUP, 'Python libs', libraries.getColor('core_install'))
+    libraries.addConf(SUBCON_PYTHON_GROUP, 'Python subcon libs', libraries.getColor('subcon'))
+    
+    for x in [os.walk(dirtosearch, topdown=False), os.walk(internaldir, topdown=False)]:
+        for root, _, files in x:
+            notinsubcon = os.path.normpath(internaldir) in os.path.normpath(root)
+            
+            for fname in files:
+                filename = os.path.join(root, fname)
+                if fname == 'PKG-INFO':
+                    pkgmetafile = open(filename)
+                    library = readPkgInfo(pkgmetafile)
+                    pkgmetafile.close()
+                    
+                    requirefilename = os.path.join(filename, '..', 'requires.txt')
+                    if os.path.exists(requirefilename):
+                        requiresfile = open(requirefilename)
+                        readRequiresFile(requiresfile, library)
+                        requiresfile.close()
+                        
+                    libraries.addLibrary(notinsubcon, library)
+                    
+                if os.path.isfile(filename) and fname.endswith('.egg'):
+                    eggfile = zipfile.ZipFile(filename, 'r', zipfile.ZIP_DEFLATED)
+                    
+                    data = eggfile.read('EGG-INFO/PKG-INFO')
+                    
+                    library = readPkgInfo(data.split('\n'))
+                    
+                    if 'EGG-INFO/requires.txt' in eggfile.namelist():
+                        requiresdata = eggfile.read('EGG-INFO/requires.txt')
+                        readRequiresFile(requiresdata.split('\n'), library)
+                        
+                    libraries.addLibrary(notinsubcon, library)
+                    
+                    eggfile.close()
+
+def readRequiresFile(data, library):
+    for line in data:
+        line = line.strip()
+        if line != '' and not (line.startswith('[') and line.endswith(']')):
+            library.requires.append(line.split('>=')[0].strip())
+
+def readPkgInfo(data):
+    name = ''
+    version = ''
+    license = ''
+    license2 = ''
+  
+    for line in data:
+        if 'Name:' in line:
+            name = line.strip().replace('Name: ', '')
+        if 'Version:' in line:
+            version = line.strip().replace('Version: ', '')
+        if 'License:' in line:
+            license = line.strip().replace('License: ', '')                    
+        if 'Classifier: License :: ' in line:
+            license2 = license2 + ' ' + line.strip().replace('Classifier: License :: ', '').replace('OSI Approved :: ', '')
+    
+    if license.lower() == 'unknown' or license == '' or license2 != '':
+        license = license2
+    
+    return Library(name, license, version)
+
+def addLicensesColors(graphdata, group):
+    newgraphdata = []
+    for line in graphdata:
+        newline = line
+        for conf in group.libraries:
+            for module in group.getLibraries(conf):
+                if module.name.lower() in line.lower() and 'label=' in line:
+                    newline = line.replace('label=', 'color=%s,label=' % group.getColor(conf))
+                    
+                    if module.license != '':
+                        newline = newline.replace("\"];", "|%s\"];" % module.license)
+                    
+                    break
+        newgraphdata.append(newline)
+    return newgraphdata
+    
+def createKey(group):
+    key = """subgraph cluster1 {
+    label = "Key";
+    style=filled;
+    color=lightgrey;
+    """
+    
+    for conf in group.libraries:
+        if conf != PYTHON_GROUP and conf != SUBCON_PYTHON_GROUP:
+            key = key + "\"%s: %s\" [style=filled,color=%s];" % (conf, group.getDescription(conf), group.getColor(conf))
+    
+    key = key + "}"
+    return key
+
+def createGraph(ivyxmlfilename, graphfilename, dirtosearch, internaldir, subcon):
+    readivy = ReadIvyConfig(ivyxmlfilename)
+    readivy.readConfigurations()
+    readivy.readModules()
+    readivy.readSubModules()
+    
+    group = readivy.group
+    
+    readEggs(group, dirtosearch, internaldir)
+    
+    key = createKey(group)
+    
+    graphdata = loadGraphFile(graphfilename)
+    
+    newgraphdata = addLicensesColors(graphdata, group)
+    
+    #add key to graph
+    newgraphdata[-1] = newgraphdata[-1].replace('}', key + '\n}')
+    
+    graphwritefile = codecs.open(graphfilename, 'w', 'utf8')
+    graphwritefile.writelines(newgraphdata)
+    graphwritefile.close()
+    
+    linkPythonLibs(group, graphfilename, subcon)
+
+def loadGraphFile(graphfilename):
+    destgraphfile = codecs.open(graphfilename, 'r', 'utf8')
+    graphdata = []
+    for line in destgraphfile:
+        graphdata.append(line)
+    destgraphfile.close()
+    return graphdata
+
+def addToGraph(graphfilenametoadd, destgraphfilename):
+    graphdata = loadGraphFile(destgraphfilename)
+    
+    graphfile = codecs.open(graphfilenametoadd, 'r', 'utf8')
+    graphdatatoadd = ''
+    for line in graphfile:
+        line = line.replace('digraph {', '')
+        graphdatatoadd = graphdatatoadd + line
+    graphfile.close()
+    
+    graphdata[-1] = graphdata[-1].replace('}', graphdatatoadd)
+    
+    graphwritefile = codecs.open(destgraphfilename, 'w', 'utf8')
+    graphwritefile.writelines(graphdata)
+    graphwritefile.close()
+
+def linkPythonLibs(libraries, destgraphfilename, subcon):    
+    graphdata = loadGraphFile(destgraphfilename)
+  
+    output = "helium_ant -> helium_python;\n"
+    
+    if subcon:
+        list = [SUBCON_PYTHON_GROUP]
+    else:
+        list = [SUBCON_PYTHON_GROUP, PYTHON_GROUP]
+    
+    for group in list:
+        for lib in libraries.getLibraries(group):
+            output = output + ("helium_python -> \"%s\";\n" % lib.name)
+            output = output + ("\"%s\" [style=filled,shape=record,color=%s,label=\"%s %s|%s\"];\n" % (lib.name, libraries.getColor(group), lib.name, lib.version, lib.license))
+            
+            for require in lib.requires:
+                output = output + ("\"%s\" -> \"%s\";\n" % (lib.name, require))
+    
+    graphdata.reverse()
+    for line in graphdata:
+        if line.strip() == '':
+            graphdata.pop(0)
+        else:
+            break
+    graphdata.reverse()
+    
+    graphdata[-1] = graphdata[-1].replace('}', output + '}')
+    
+    graphwritefile = codecs.open(destgraphfilename, 'w', 'utf8')
+    graphwritefile.writelines(graphdata)
+    graphwritefile.close()
+
+def externalDependancies(database, output):
+    out = open(output, 'w')
+    db = amara.parse(Uri.OsPathToUri(database))
+    out.write('digraph G {\n')
+    for p in db.antDatabase.project:
+        items = []
+        if hasattr(p, 'property'):
+            for prop in p.property:
+                if 'external' + os.sep in os.path.abspath(str(prop.defaultValue)):
+                    items.append(str(prop.defaultValue))
+        if hasattr(p, 'fileDependency'):
+            for dep in p.fileDependency:
+                dep = str(dep).split(' ')[0]
+                if 'external' + os.sep in os.path.abspath(str(dep)):
+                    items.append(str(dep))
+                    
+        items = set(items)
+        for i in items:
+            out.write('\"%s\" -> \"%s\"\n' % (str(p.name), i.replace(os.environ['HELIUM_HOME'], 'helium').replace(os.sep, '/')))
+    out.write('}')                
+    out.close()
+
+def appendLogs(t, p, output, macro=False):
+    if hasattr(t, 'signal'):
+        for signal in t.signal:
+            if macro:
+                output.append("\"%s\" [fontname=\"Times-Italic\"];" % str(t.name))
+            output.append('subgraph \"cluster%s\" {label = \"%s\"; \"%s\"}\n' % (str(p.name), str(p.name), str(t.name)))
+            s = str(signal).split(',')
+            if len(s) > 1:
+                if s[1] == 'now':
+                    color = 'red'
+                elif s[1] == 'defer':
+                    color = 'yellow'
+                else:
+                    color = 'green'
+                output.append('subgraph \"cluster%s\" {color=%s;style=filled;label = \"Failbuild: %s\"; \"%s\"}\n' % (str(s[1]), color, str(s[1]), str(s[0])))
+            output.append('\"%s\" -> \"%s\" [style=dotted]\n' % (str(t.name), str(s[0])))
+    if hasattr(t, 'log'):
+        for log in t.log:
+            logdir = '/output/logs/'
+            logname = os.path.basename(str(log))
+            if not ('**' in logname):
+                logname = logname.replace('*', '${sysdef.configuration}').replace('--logfile=', '')
+                if not logdir in logname:
+                    logname = logdir + logname
+                logname = logname.replace(os.sep, '/')
+                
+                if macro:
+                    output.append("\"%s\" [fontname=\"Times-Italic\"];" % str(t.name))
+                output.append('subgraph \"cluster%s\" {label = \"%s\"; \"%s\"}\n' % (str(p.name), str(p.name), str(t.name)))
+                output.append('\"%s\" -> \"%s\"\n' % (str(t.name), logname))
+
+def findLogFiles(database, output):
+    out = open(output, 'w')
+    db = amara.parse(Uri.OsPathToUri(database))
+    out.write('digraph G {\n')
+    output = []
+    
+    for p in db.antDatabase.project:
+        if hasattr(p, 'macro'):
+            for t in p.macro:
+                appendLogs(t, p, output, True)
+        if hasattr(p, 'target'):
+            for t in p.target:
+                appendLogs(t, p, output)
+    for l in set(output):
+        out.write(l)
+    out.write('}')                
+    out.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/escapeddict.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,86 @@
+#============================================================================ 
+#Name        : escapeddict.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This class enables developer to use ${xxx} pattern in their dict and 
+    get them replaced recursively.
+"""
+import re
+import types
+import UserDict
+
+
+class _CustomArray(list):
+    """ Internal class
+    """
+    def __str__(self):
+        string = ""
+        for elem in self:
+            string += " "+elem
+        return string
+
+
+class EscapedDict(UserDict.UserDict):
+    """ Implements a dictionary that escapes the key values recursively. """        
+    
+    def __init__(self, dict={}, failonerror=False):
+        UserDict.UserDict.__init__(self, dict)
+        self.__failonerror = failonerror
+        
+    def __getitem__(self, key):
+        """ Overrides the usual __getitem__ to insert values of other keys referenced in this key's
+        value. """
+        if key in self.data:
+            value = self.data[key]
+            result = value
+            if isinstance(value, types.ListType):
+                result = _CustomArray()
+                for elem in value:
+                    (string, changes) = re.subn(r'\${(?P<name>[._a-zA-Z0-9]+)}', r'%(\g<name>)s', elem)
+                    if changes > 0:
+                        result.append(string % self)
+                    else:
+                        result.append(elem)
+            else:
+                (string, changes) = re.subn(r'\${(?P<name>[._a-zA-Z0-9]+)}', r'%(\g<name>)s', value)
+                if changes > 0:
+                    result = string % self
+            return result
+        elif not self.__failonerror:
+            return "${%s}" % key
+        raise KeyError("Could not find key '%s'" % key)
+        
+
+
+def escapeString(input_string, config):
+    """ Escape a string recursively.
+    
+    :param input_string: the string to be escaped.
+    :param config: a dictionnary containing the values to escape.
+    :return: the escaped string.
+    """
+    data = EscapedDict(config)
+    match = re.search(r'\${(?P<name>[._a-zA-Z0-9]+)}', input_string)
+    if match != None:
+        for property_name in match.groups():
+            property_value = data[property_name]
+            property_value = re.sub(r'\\', r'\\\\', property_value)
+            input_string = re.sub('\${' + property_name + '}', property_value, input_string)
+    return input_string
+
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/fileutils.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,665 @@
+#============================================================================ 
+#Name        : fileutils.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+File manipulation related functionalities:
+ * Filescanner
+ * rmtree (fixed version)
+ * move (fixed version)
+"""
+import codecs
+import fnmatch
+import locale
+import logging
+import os
+import re
+import sys
+import shutil
+import StringIO
+import hashlib
+import subprocess
+import string
+
+import pathaddition.match
+import stat
+
+if os.name == 'nt':
+    import win32api
+
+LOGGER = logging.getLogger('fileutils')
+LOGGER_LOCK = logging.getLogger('fileutils.lock')
+#LOGGER.addHandler(logging.FileHandler('default.log'))
+#logging.basicConfig(level=logging.DEBUG)
+#LOGGER.setLevel(logging.DEBUG)
+
+class AbstractScanner(object):
+    """ This class implements all the required infrastructure for filescanning. """
+
+    def __init__(self):
+        """ Initialization. """
+        self.includes = []
+        self.excludes = []
+        self.includes_files = []
+        self.excludes_files = []
+        self.selectors = []
+        self.filetypes = []
+
+    def add_include(self, include):
+        """ Adds an include path to the scanner. """
+        if include.endswith('/') or include.endswith('\\'):
+            include = include + '**'
+
+        self.includes.append(include)
+
+    def add_exclude(self, exclude):
+        """ Adds an exclude path to the scanner. """
+        if exclude.endswith('/') or exclude.endswith('\\'):
+            exclude = exclude + '**'
+
+        self.excludes.append(exclude)
+        
+    def add_exclude_file(self, exclude):
+        """ Adds an exclude file to the scanner. """
+        self.excludes_files.append(exclude)
+    
+    def add_selector(self, selector):
+        """ Add selector to the scanner. """
+        self.selectors.append(selector)
+        
+    def add_filetype(self, filetype):
+        """ Adds a filetype selection to the scanner. """
+        self.filetypes.append(filetype)
+
+    def is_included(self, path):
+        """ Returns if path is included by the scanner. """
+        LOGGER.debug("is_included: path = " + path)
+        if path.replace('\\', '/') in self.includes_files or path in self.includes_files:
+            return True
+        for inc in self.includes:
+            if self.match(path, inc):
+                LOGGER.debug("Included: " + path + " by " + inc)
+                return True
+        return False
+
+    def is_excluded(self, path):
+        """ Returns if path is excluded by the scanner. """
+        LOGGER.debug("is_excluded: path = " + path)
+        if path.replace('\\', '/') in self.excludes_files or path in self.excludes_files:
+            return True
+        for ex in self.excludes:
+            if self.match(path, ex):
+                LOGGER.debug("Excluded: " + path + " by " + ex)
+                return True
+        return False
+    
+    def is_selected(self, path):
+        """ Returns if path is selected by all selectors in the scanner. """
+        LOGGER.debug("is_selected: path = " + path)
+        for selector in self.selectors:
+            if not selector.is_selected(path):
+                return False
+        LOGGER.debug("Selected: " + path)
+        return True
+
+    def is_filetype(self, path):
+        """ Test if a file matches one filetype. """
+        if len(self.filetypes) == 0:
+            return True
+        LOGGER.debug("is_filetype: path = " + path)
+        for filetype in self.filetypes:
+            if self.match(path, filetype):
+                LOGGER.debug("Filetype: " + path + " by " + filetype)
+                return True
+        return False
+
+    def match(self, filename, pattern):
+        """ Is filename matching pattern? """
+        return pathaddition.match.ant_match(filename, pattern, casesensitive=(os.sep != '\\'))
+
+    def test_path(self, root, relpath):
+        """ Test if a path matches filetype, include, exclude, and selection process."""
+        return self.is_filetype(relpath) and self.is_included(relpath) \
+                         and not self.is_excluded(relpath) and \
+                         self.is_selected(os.path.join(root, relpath))
+
+    def __str__(self):
+        """ Returns a string representing this instance. """
+        content = []
+        for inc in self.includes:
+            content.append('include:' + os.path.normpath(inc))
+        for ex in self.excludes:
+            content.append('exclude:' + os.path.normpath(ex))
+        return ';'.join(content)
+
+    def __repr__(self):
+        """ Returns a string representing this instance. """
+        return self.__str__()
+
+    def scan(self):
+        """ Abstract method which much be overriden to implement the scanning process. """
+        raise Exception("scan method must be overriden")
+
+
+class FileScanner(AbstractScanner):
+    """Scans the filesystem for files that match the selection paths.
+
+    The scanner is configured with a root directory. Any number of include
+    and exclude paths can be added. The scan() method is a generator that
+    returns matching files one at a time when called as an iterator.
+
+    This is a revisited implementation of the filescanner. It now relies on
+    the module pathaddition.match that implements a Ant-like regular expression matcher.
+    
+    Rules:
+    - Includes and excludes should not start with *
+    - Includes and excludes should not have wildcard searches ending with ** (e.g. wildcard**)
+    
+    Supported includes and excludes:
+    - filename.txt
+    - filename.*
+    - dir/
+    - dir/*
+    - dir/**    
+    """
+    def __init__(self, root_dir):
+        """ Initialization. """
+        AbstractScanner.__init__(self)
+        self.root_dir = os.path.normpath(root_dir)
+        if not self.root_dir.endswith(os.sep):
+            self.root_dir = self.root_dir + os.sep
+        # Add 1 so the final path separator is removed
+        #self.root_dirLength = len(self.root_dir) + 1
+
+    def scan(self):
+        """ Scans the files required to zip"""
+        #paths_cache = []
+        
+        excludescopy = self.excludes[:]
+        for f in excludescopy:
+            if os.path.exists(os.path.normpath(os.path.join(self.root_dir, f))):
+                self.excludes_files.append(f)
+                self.excludes.remove(f)
+        
+        includescopy = self.includes[:]
+        for f in includescopy:
+            if os.path.exists(os.path.normpath(os.path.join(self.root_dir, f))):
+                self.includes_files.append(f)
+                self.includes.remove(f)
+        
+        LOGGER.debug('Scanning sub-root directories')
+        for root_dir in self.find_subroots():
+            for dirpath, subdirs, files in os.walk(unicode(root_dir)):
+                subroot = dirpath[len(self.root_dir):]
+
+                dirs_to_remove = []
+                for subdir in subdirs:
+                    if self.is_excluded(os.path.join(subroot, subdir)):
+                        dirs_to_remove.append(subdir)
+                
+                for dir_remove in dirs_to_remove:
+                    subdirs.remove(dir_remove)
+                
+                LOGGER.debug('Scanning directory: ' + dirpath)
+                for file_ in files:
+                    path = os.path.join(subroot, file_)
+                    if self.is_filetype(path) and self.is_included(path) and \
+                        self.is_selected(os.path.join(dirpath, file_)) and not self.is_excluded(path):
+                        ret_path = os.path.join(dirpath, file_)
+                        yield ret_path
+            
+                LOGGER.debug('Checking for empty directory: ' + dirpath)
+                # Check for including empty directories
+                if self.is_included(subroot) and not self.is_excluded(subroot):
+                    if len(files) == 0 and len(subdirs) == 0:
+                        yield dirpath
+                    
+
+    def find_subroots(self):
+        """Finds all the subdirectory roots based on the include paths.
+
+        Often large archive operations define a number of archives from the root
+        of the drive. Walking the tree from the root is very time-consuming, so
+        selecting more specific subdirectory roots improves performance.
+        """
+        def splitpath(path):
+            """ Returns the splitted path"""
+            return path.split(os.sep)
+
+        root_dirs = []
+        
+        # Look for includes that start with wildcards.
+        subdirs_not_usable = False
+        for inc in self.includes + self.includes_files:
+            first_path_segment = splitpath(os.path.normpath(inc))[0]
+            if first_path_segment.find('*') != -1:
+                subdirs_not_usable = True
+                
+        # Parse all includes for sub-roots
+        if not subdirs_not_usable:
+            for inc in self.includes + self.includes_files:
+                include = None
+                LOGGER.debug("===> inc %s" % inc)
+                contains_globs = False                
+                for pathcomp in splitpath(os.path.normpath(inc)):
+                    if pathcomp.find('*') != -1:
+                        contains_globs = True
+                        break
+                    else:
+                        if include == None:
+                            include = pathcomp
+                        else:
+                            include = os.path.join(include, pathcomp)
+                if not contains_globs:
+                    include = os.path.dirname(include) 
+    
+                LOGGER.debug("include %s" % include)
+                if include != None:
+                    root_dir = os.path.normpath(os.path.join(self.root_dir, include))
+                    is_new_root = True
+                    for root in root_dirs[:]:
+                        if destinsrc(root, root_dir):
+                            LOGGER.debug("root contains include, skip it")
+                            is_new_root = False
+                            break
+                        if destinsrc(root_dir, root):
+                            LOGGER.debug("include contains root, so remove root")
+                            root_dirs.remove(root)
+                    if is_new_root:
+                        root_dirs.append(root_dir)    
+
+        if len(root_dirs) == 0:
+            root_dirs = [os.path.normpath(self.root_dir)]
+        LOGGER.debug('Roots = ' + str(root_dirs))
+        return root_dirs
+
+    def __str__(self):
+        return os.path.normpath(self.root_dir) + ';' + AbstractScanner.__str__(self) 
+
+    def __repr__(self):
+        return self.__str__()
+
+        
+def move(src, dst):
+    """Recursively move a file or directory to another location.
+
+    If the destination is on our current filesystem, then simply use
+    rename.  Otherwise, copy src to the dst and then remove src.
+    A lot more could be done here...  A look at a mv.c shows a lot of
+    the issues this implementation glosses over.
+
+    """
+    try:
+        os.rename(src, dst)
+    except OSError:
+        if os.path.isdir(src):
+            if destinsrc(src, dst):
+                raise Exception, "Cannot move a directory '%s' into itself '%s'." % (src, dst)
+            shutil.copytree(src, dst, symlinks=True)
+            rmtree(src)
+        else:
+            shutil.copy2(src, dst)
+            os.unlink(src)
+
+def rmtree(rootdir):
+    """ Catch shutil.rmtree failures on Windows when files are read-only. Thanks Google!""" 
+    if sys.platform == 'win32':
+        rootdir = os.path.normpath(rootdir)
+        if not os.path.isabs(rootdir):
+            rootdir = os.path.join(os.path.abspath('.'), rootdir)
+        if not rootdir.startswith('\\\\'):
+            rootdir = u"\\\\?\\" + rootdir
+
+    def cb_handle_error(fcn, path, excinfo):
+        """ Error handler, removing readonly and deleting the file. """
+        os.chmod(path, 0666)
+        if os.path.isdir(path):
+            rmdir(path)
+        elif os.path.isfile(path):
+            remove(path)
+        else:
+            fcn(path)
+    return shutil.rmtree(rootdir, onerror=cb_handle_error)
+
+def destinsrc(src, dst):
+    """ Fixed version of destinscr, that doesn't match dst with same root name."""
+    if os.sep == '\\':
+        src = src.lower()
+        dst = dst.lower()
+    src = os.path.abspath(src)
+    dst = os.path.abspath(dst)
+    if not src.endswith(os.path.sep):
+        src += os.path.sep
+    if not dst.endswith(os.path.sep):
+        dst += os.path.sep
+    return dst.startswith(src)
+
+
+def which(executable):
+    """ Search for executable in the PATH."""
+    pathlist = os.environ['PATH'].split(os.pathsep)
+    for folder in pathlist:
+        filename = os.path.join(folder, executable)
+        try:
+            status = os.stat(filename)
+        except os.error:
+            continue
+        # Check if the path is a regular file
+        if stat.S_ISREG(status[stat.ST_MODE]):
+            mode = stat.S_IMODE(status[stat.ST_MODE])
+            if mode & 0111:
+                return os.path.normpath(filename)
+    return None
+
+
+def read_policy_content(filename):
+    """ Read the policy number from the policy file.
+        strict allows to activate the new policy scanning.
+    """
+    value = None
+    error = ""
+    try:
+        LOGGER.debug('Opening policy file: ' + filename)
+        policy_data = load_policy_content(filename)            
+        match = re.match(r'^((?:\d+)|(?:0842[0-9a-zA-Z]{3}))\s*$', policy_data, re.M|re.DOTALL)
+        if match != None:
+            value = match.group(1)
+        else:
+            error = "Content of '%s' doesn't match r'^\d+|0842[0-9a-zA-Z]{3}\s*$'." % filename
+    except Exception, exc:
+        error = str(exc)
+    if value is not None:
+        return value
+    # worse case....
+    raise Exception(error)  
+
+def load_policy_content(filename):
+    """ Testing policy content loading. """
+    try:
+        fileh = codecs.open(filename, 'r', 'ascii')
+        data = fileh.read()
+        fileh.close()
+        return data
+    except:
+        raise Exception("Error loading '%s' as an ASCII file." % filename)
+
+ENCODING_MATRIX = {
+   codecs.BOM_UTF8: 'utf_8',
+   codecs.BOM_UTF16: 'utf_16',
+   codecs.BOM_UTF16_BE: 'utf_16_be',
+   codecs.BOM_UTF16_LE: 'utf_16_le',
+}
+
+def guess_encoding(data):
+    """Given a byte string, guess the encoding.
+
+    First it tries for UTF8/UTF16 BOM.
+
+    Next it tries the standard 'UTF8', 'ISO-8859-1', and 'cp1252' encodings,
+    Plus several gathered from locale information.
+
+    The calling program *must* first call locale.setlocale(locale.LC_ALL, '')
+
+    If successful it returns (decoded_unicode, successful_encoding)
+    If unsuccessful it raises a ``UnicodeError``.
+
+    This was taken from http://www.voidspace.org.uk/python/articles/guessing_encoding.shtml
+    """
+    for bom, enc in ENCODING_MATRIX.items():
+        if data.startswith(bom):
+            return data.decode(enc), enc
+    encodings = ['ascii', 'UTF-8']
+    successful_encoding = None
+    try:
+        encodings.append(locale.getlocale()[1])
+    except (AttributeError, IndexError):
+        pass
+    try:
+        encodings.append(locale.getdefaultlocale()[1])
+    except (AttributeError, IndexError):
+        pass
+    # latin-1
+    encodings.append('ISO8859-1')
+    encodings.append('cp1252')
+    for enc in encodings:
+        if not enc:
+            continue
+        try:
+            decoded = unicode(data, enc)
+            successful_encoding = enc
+            break
+        except (UnicodeError, LookupError):
+            pass
+    if successful_encoding is None:
+        raise UnicodeError('Unable to decode input data. Tried the'
+                           ' following encodings: %s.' %
+                           ', '.join([repr(enc) for enc in encodings if enc]))
+    else:
+        if successful_encoding == 'ascii':
+            # our default ascii encoding
+            successful_encoding = 'ISO8859-1'
+        return (decoded, successful_encoding)
+        
+def getmd5(fullpath, chunk_size=2**16):
+    """ returns the md5 value"""
+    file_handle = open(fullpath, "rb")
+    md5 = hashlib.md5()
+    while 1:
+        chunk = file_handle.read(chunk_size)
+        if not chunk:
+            break
+        md5.update(chunk)
+    file_handle.close()
+    return md5.hexdigest()
+
+def read_symbian_policy_content(filename):
+    """ Read the policy category from the policy file. """
+    value = None
+    error = ""
+    try:
+        LOGGER.debug('Opening symbian policy file: ' + filename)
+        try:
+            fileh = codecs.open(filename, 'r', 'ascii')
+        except:
+            raise Exception("Error loading '%s' as an ASCII file." % filename)        
+        for line in fileh:
+            match = re.match(r'^Category\s+([A-Z])\s*$', line, re.M|re.DOTALL)
+            if match != None:
+                value = match.group(1)
+                return value
+        if match == None:
+            error = "Content of '%s' doesn't match r'^Category\s+([A-Z])\s*$'." % filename
+    except Exception, exc:
+        error = str(exc)
+    if value is not None:
+        return value
+    # worse case....
+    raise Exception(error)
+
+
+class LockFailedException(Exception):
+    pass
+
+if os.name == 'nt':
+    import win32file
+    import win32con
+    import winerror
+    import time
+    import pywintypes
+    import win32netcon
+    import win32wnet
+    
+    class Lock:
+        """ This object implement file locking for windows. """
+        
+        def __init__(self, filename):
+            LOGGER_LOCK.debug("__init__")
+            self._filename = filename
+            self.fd = None
+
+        def lock(self, wait=False):
+            LOGGER_LOCK.debug("lock")
+            # Open the file
+            if self.fd == None:
+                self.fd = open(self._filename, "w+")
+            wfd = win32file._get_osfhandle(self.fd.fileno())
+            if not wait:
+                try:
+                    win32file.LockFile(wfd, 0, 0, 0xffff, 0)
+                except:
+                    raise LockFailedException()
+            else:    
+                while True:
+                    try:
+                        win32file.LockFile(wfd, 0, 0, 0xffff, 0)
+                        break
+                    except win32file.error, exc:
+                        if exc[0] != winerror.ERROR_LOCK_VIOLATION:
+                            raise exc
+                    LOGGER_LOCK.debug("waiting")
+                    time.sleep(1)
+                    
+        def unlock(self):
+            LOGGER_LOCK.debug("unlock")
+            if self.fd == None:
+                LOGGER_LOCK.debug("already unlocked")
+                return
+            wfd = win32file._get_osfhandle(self.fd.fileno())
+            try:
+                # pylint: disable-msg=E1101
+                win32file.UnlockFile(wfd, 0 , 0, 0xffff, 0)
+                self.fd.close()
+                self.fd = None
+            except win32file.error, exc:
+                if exc[0] != 158:
+                    raise
+            
+            
+        def __del__(self):
+            LOGGER_LOCK.debug("__del__")
+            self.unlock()
+
+    def rmdir(path):
+        """ Catch os.rmdir failures on Windows when path is too long (more than 256 chars)."""
+        path = win32api.GetShortPathName(path)        
+        win32file.RemoveDirectory(path)
+
+    def remove(filename):
+        """ Catch os.rmdir failures on Windows when path is too long (more than 256 chars)."""
+        filename = win32api.GetShortPathName(filename)
+        filename = filename.lstrip("\\\\?\\")
+        os.remove(filename)
+
+    def mount(drive, unc, username=None, password=None, persistent=False):
+        """ Windows helper function to map a network drive. """
+        flags = 0
+        if persistent:
+            flags = win32netcon.CONNECT_UPDATE_PROFILE
+        win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK, drive, unc, None, username, password, flags)
+
+
+    def umount(drive):
+        """ Windows helper function to map a network drive. """
+        drive_type = win32file.GetDriveType(drive)
+        if drive_type == win32con.DRIVE_REMOTE:
+            win32wnet.WNetCancelConnection2(drive, win32netcon.CONNECT_UPDATE_PROFILE, 1)
+        else:
+            raise Exception("%s couldn't be umount." % drive)
+
+else:
+    def rmdir(path):
+        return os.rmdir(path)
+
+    def remove(path):
+        return os.remove(path)
+
+    class Lock:
+        def __init__(self, filename):
+            pass
+        def lock(self, wait=False):
+            pass
+        def unlock(self):
+            pass
+            
+if os.sep == '\\':
+    def get_next_free_drive():
+        """ Return the first free drive found else it raise an exception. """
+        if os.name == 'nt':
+            DRIVE_LABELS = sorted(list(set(string.ascii_uppercase) - set(win32api.GetLogicalDriveStrings())), reverse=True)
+            if len(DRIVE_LABELS) != 0 :
+                return DRIVE_LABELS[0] + ":"
+            raise Exception("No free drive left.")        
+        if 'java' in sys.platform:
+            import java.io        
+            used = []
+            for x in java.io.File.listRoots():
+                used.append(str(x).replace(':\\', ''))
+            DRIVE_LABELS = sorted(list(set(string.ascii_uppercase) - set(used)), reverse=True)
+            if len(DRIVE_LABELS) != 0 :
+                return DRIVE_LABELS[0] + ":"
+            raise Exception("No free drive left.")
+
+    def subst(drive, path):
+        """ Substing path as a drive. """
+        path = os.path.normpath(path)
+        p = subprocess.Popen("subst %s %s" % (drive, path),  shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        errmsg = p.communicate()[0]
+        if p.returncode != 0:
+            raise Exception("Error substing '%s' under '%s': %s" % (path, drive, errmsg))
+    
+    def unsubst(drive):
+        """ Unsubsting the drive. """
+        p = subprocess.Popen("subst /D %s" % (drive), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        errmsg = p.communicate()[0]
+        if p.returncode != 0:
+            raise Exception("Error unsubsting '%s': %s" % (drive, errmsg))
+    
+    def getSubstedDrives():
+        driveInformation = {}
+        subStedDriveList = []
+        p = subprocess.Popen("subst",  shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        subStedDriveList = re.split('\\n', p.communicate()[0])
+        del subStedDriveList[len(subStedDriveList)-1]
+        for path in subStedDriveList:        
+            subStedDrivePath = []
+            if(re.search(r'UNC', path) is not None):
+                subStedDrivePath = re.split('=>', path)
+                (drive_to_unsubst, root_dir_path) = os.path.splitdrive(os.path.normpath(subStedDrivePath[0]))
+                uncPath = re.sub('UNC', r'\\', subStedDrivePath[1].strip())
+                if(uncPath != subStedDrivePath[1].strip()):
+                    driveInformation[drive_to_unsubst] = uncPath
+            else:
+                subStedDrivePath = re.split('=>', path)                
+                (drive_to_unsubst, root_dir_path) = os.path.splitdrive(os.path.normpath(subStedDrivePath[0]))
+                driveInformation[drive_to_unsubst] = os.path.normpath(subStedDrivePath[1].strip())
+    
+        return driveInformation
+
+def touch(srcdir):
+    """
+    Recursively touches all the files in the source path mentioned.
+    It does not touch the directories.
+    """
+    srcnames = os.listdir(srcdir)
+    for name in srcnames:
+        srcfname = os.path.join(srcdir, name)
+        if os.path.isdir(srcfname):
+            touch(srcfname)
+        else:
+            if os.path.exists(srcfname):
+                os.utime(srcfname, None)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/flash_config.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,286 @@
+#============================================================================ 
+#Name        : flash_config.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This modules implements flash configuration writer.
+"""
+import logging
+import os
+import re
+import rom
+import types
+import imaker
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger("flash_config")
+
+class ImagePack:
+    """ Local storage of image type
+    """
+    
+    def __init__(self, config, type):
+        """ init from config
+        """
+        config['image.type'] = '${image.type.temp}'
+        self._type = type
+        self._id = config[type + '.id']
+        self._image_name = config[type + '.image.name']
+        self._image_path = config[type + '.image.path']
+        
+    def set_config(self, config):
+        """ Set the image type in a config
+        """
+        config[self._type + '.id'] = self._id
+        config[self._type + '.image.name'] = self._image_name
+        config[self._type + '.image.path'] = self._image_path 
+        
+    def __repr__(self):
+        """ String representation the class
+        """
+        return self._id + " " + self._image_name + " " + self._image_path
+
+class FlashConfigurationWriter:
+    """ Builder that creates the flash configuration files
+    """
+    def __init__(self, configs, product):
+        """ FlashConfigurationWriter init 
+        """
+        self._configs = configs
+        self._product = product
+        self._all_languagepacks = {} # pylint recomendation
+        self._all_udas = {}
+        self._all_mms = {}
+        self._all_mcs = {}
+        
+    def _get_all_languagepacks(self):
+        """ Collect all language packs and store them internally 
+        """
+        self._all_languagepacks = {}
+        for config in self._configs.getConfigurations(self._product):
+            if (config.type == "languagepack"):
+                lp = ImagePack(config, 'languagepack')
+                self._all_languagepacks[lp._id] = lp
+    
+    def _get_compatible_languagepacks(self, config):
+        """ Get language packs compatible with a customer variant 
+        """
+        languagepack_list = []
+        if config.has_key('compatible.languagepack'):
+            lp_list = config['compatible.languagepack']
+            if not isinstance(lp_list, types.ListType):
+                lp_list = [lp_list]
+            for lp_id in lp_list:
+                if self._all_languagepacks.has_key(lp_id):
+                    languagepack_list.append(self._all_languagepacks[lp_id])
+                else:
+                    print "Compatible languagepack " + str(lp_id) + " does not exists"
+        else:
+            languagepack_list = self._all_languagepacks.values()        
+            
+        return languagepack_list
+        
+    def _get_all_udas(self):
+        """ Collect all udas and store them internally 
+        """
+        self._all_udas = {}
+        for config in self._configs.getConfigurations(self._product):
+            if (config.type == "uda"):
+                lp = ImagePack(config, 'uda')
+                self._all_udas[lp._id] = lp
+                
+    def _get_all_mms(self):
+        """ Collect all mm's and store them internally 
+        """
+        self._all_mms = {}
+        for config in self._configs.getConfigurations(self._product):
+            if (config.type == "massmemory"):
+                lp = ImagePack(config, 'massmemory')
+                self._all_mms[lp._id] = lp
+                
+    def _get_all_mcs(self):
+        """ Collect all mc's and store them internally 
+        """
+        self._all_mcs = {}
+        for config in self._configs.getConfigurations(self._product):
+            if (config.type == "memorycard"):
+                lp = ImagePack(config, 'memorycard')
+                self._all_mcs[lp._id] = lp
+    
+    def _get_compatible_udas(self, config):
+        """ Get uda's compatible with a customer variant 
+        """
+        uda_list = []
+        if config.has_key('compatible.uda'):
+            lp_list = config['compatible.uda']
+            if not isinstance(lp_list, types.ListType):
+                lp_list = [lp_list]
+            for lp_id in lp_list:
+                if self._all_udas.has_key(lp_id):
+                    uda_list.append(self._all_udas[lp_id])
+                else:
+                    print "Compatible uda " + str(lp_id) + " does not exists"
+        else:
+            return None
+            
+        return uda_list
+        
+    def _get_compatible_mms(self, config):
+        """ Get mm's compatible with a customer variant 
+        """
+        mm_list = []
+        if config.has_key('compatible.massmemory'):
+            lp_list = config['compatible.massmemory']
+            
+            if not isinstance(lp_list, types.ListType):
+                lp_list = [lp_list]
+            for lp_id in lp_list:
+                if self._all_mms.has_key(lp_id):
+                    mm_list.append(self._all_mms[lp_id])
+                else:
+                    print "Compatible massmemory " + str(lp_id) + " does not exists"
+        else:
+            return None
+            
+        return mm_list
+        
+    def _get_compatible_mcs(self, config):
+        """ Get mc's compatible with a customer variant 
+        """
+        mc_list = []
+        if config.has_key('compatible.memorycard'):
+            lp_list = config['compatible.memorycard']
+            if not isinstance(lp_list, types.ListType):
+                lp_list = [lp_list]
+            for lp_id in lp_list:
+                if self._all_mcs.has_key(lp_id):
+                    mc_list.append(self._all_mcs[lp_id])
+                else:
+                    print "Compatible memorycard " + str(lp_id) + " does not exists"
+        else:
+            return None
+            
+        return mc_list
+    
+    def _write_file(self, config, romtype, uda, mm, mc):
+        """ Write an xml flash configuration file 
+        """
+        
+        #data = escapeddict.EscapedDict(config)
+        template = rom.read_file_content(config['flash.config.template'])
+        
+        if not uda:
+            #templatexml = amara.parse(template)
+            
+            #for image in templatexml.flash_config.image_set.image:
+            #    if image.type == u'uda':
+            #        templatexml.flash_config.image_set.xml_remove_child(image)
+            
+            #template = templatexml.xml(indent=u"yes")
+            #needed to avoid customer complaints about empty lines
+            #template = template.replace('\n\t\t\n', '\n')
+            
+            #workaround for makeupct, can't use real xml library
+            template = re.sub(r".*<image type=\"uda\".*/>\n", '', template)
+            
+        if not mm:
+            template = re.sub(r".*<image type=\"massmemory\".*/>\n", '', template)
+        if not mc:
+            template = re.sub(r".*<image type=\"memorycard\".*/>\n", '', template)
+        
+        if not os.path.exists(config['flash.config.publish.dir']):
+            print "Creating " + config['flash.config.publish.dir']
+            os.makedirs(config['flash.config.publish.dir'])
+            
+        fp = open(os.path.join(config['flash.config.publish.dir'], config['flash.config.name']), 'w')
+        print "Writing file " + fp.name
+        fp.write(rom.escape_string(template, config))
+        fp.close()        
+        
+    def _append_to_makefile(self, config, romtype):
+        template = rom.read_file_content(config['flash.config.makefile.template'])
+        out = config.interpolate(template) + "\n"
+        self._makefile_content += out + "\n"
+        self._targets += rom.get_makefile_target(out) + " "
+
+    def write(self):
+        """ Go throught the config and creates the flash configuration files
+        """
+        
+        # Pass #1: Store all language packs
+        self._get_all_languagepacks()
+        self._get_all_udas()
+        self._get_all_mcs()
+        self._get_all_mms()
+        self._makefile_content = ""
+        self._targets = "flash_config: "
+        
+        # Pass #2: Create all flash config files
+        for config in self._configs.getConfigurations(self._product):
+            if (config.type == "customer") or (config.type == "operator"):
+                image_types = config['image.type']
+                if not isinstance(config['image.type'], types.ListType):
+                    image_types = [config['image.type']]
+                
+                for lp in self._get_compatible_languagepacks(config):
+                    lp.set_config(config)
+                    config['image.type.temp'] = '${image.type}'
+                    
+                    enable_uda = True
+                    enable_mm = True
+                    enable_mc = True
+                    compatible_uda = self._get_compatible_udas(config)
+                    compatible_mm = self._get_compatible_mms(config)
+                    compatible_mc = self._get_compatible_mcs(config)
+                    
+                    if compatible_uda == None:
+                        enable_uda = False
+                        compatible_uda = [None]
+                    if compatible_mm == None:
+                        enable_mm = False
+                        compatible_mm = [None]
+                    if compatible_mc == None:
+                        enable_mc = False
+                        compatible_mc = [None]
+                        
+                    for uda in compatible_uda:
+                        if uda:
+                            uda.set_config(config)
+                        for mm in compatible_mm:
+                            if mm:
+                                mm.set_config(config)
+                            for mc in compatible_mc:
+                                if mc:
+                                    mc.set_config(config)
+                                for romtype in image_types:
+                                    config['image.type'] = romtype
+                                    self._write_file(config, romtype, enable_uda, enable_mm, enable_mc)
+                                    self._append_to_makefile(config, romtype)
+        
+        if self._makefile_content == "":
+            logger.warning("No customer's or operator's found in rom config") 
+        
+        # Write makefile
+        makefile_filename = "%s/mc_flash_config.mk" % imaker.get_product_dir(self._product)
+        print "Writing makfile " + makefile_filename
+        fp = open(makefile_filename, 'w')
+        fp.write("include $(E32ROMCFG)/helium_features.mk\n")
+        fp.write(self._makefile_content)
+        fp.write(self._targets)
+        fp.close()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,20 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Functionality that is closely tied to the Helium framework. """
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/documentation.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,94 @@
+#============================================================================ 
+#Name        : documentation.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helium API documentation processing. """
+
+from lxml import etree
+
+
+class APIDeltaWriter(object):
+    """ Creates an XML delta of the Helium API between releases. """
+    def __init__(self, old_database, new_database):
+        """ Initialisation. """
+        self.old_database = old_database
+        self.new_database = new_database
+        
+    def write(self, path):
+        """ Write the API delta information to an XML file. """
+        root = etree.Element('apiChanges')
+        
+        old_db = etree.parse(self.old_database)
+        new_db = etree.parse(self.new_database)
+        
+        
+        old_macro_names = set([macro[0].text for macro in old_db.findall('/project/macro')])
+        new_macro_names = set([macro[0].text for macro in new_db.findall('/project/macro')])
+        
+        old_target_names = set([target[0].text for target in old_db.findall('/project/target')])
+        new_target_names = set([target[0].text for target in new_db.findall('/project/target')])
+        
+        old_property_names = set([property[0].text for property in old_db.findall('/project/property')])
+        new_property_names = set([property[0].text for property in new_db.findall('/project/property')])
+        
+        old_project_names = set([project[0].text for project in old_db.findall('/project')])
+        new_project_names = set([project[0].text for project in new_db.findall('/project')])
+        
+        projects_removed = old_project_names.difference(new_project_names)
+        for project in projects_removed:
+            project_element = etree.SubElement(root, 'project', attrib={'state': 'removed'})
+            project_element.text = project
+        projects_added = new_project_names.difference(old_project_names)
+        for project in projects_added:
+            project_element = etree.SubElement(root, 'project', attrib={'state': 'added'})
+            project_element.text = project
+        
+        propertys_removed = old_property_names.difference(new_property_names)
+        for property in propertys_removed:
+            property_element = etree.SubElement(root, 'property', attrib={'state': 'removed'})
+            property_element.text = property
+        propertys_added = new_property_names.difference(old_property_names)
+        for property in propertys_added:
+            property_element = etree.SubElement(root, 'property', attrib={'state': 'added'})
+            property_element.text = property
+                    
+        macros_removed = old_macro_names.difference(new_macro_names)
+        for macro in macros_removed:
+            macro_element = etree.SubElement(root, 'macro', attrib={'state': 'removed'})
+            macro_element.text = macro
+        macros_added = new_macro_names.difference(old_macro_names)
+        for macro in macros_added:
+            macro_element = etree.SubElement(root, 'macro', attrib={'state': 'added'})
+            macro_element.text = macro
+        targets_removed = old_target_names.difference(new_target_names)
+        
+        for target in targets_removed:
+            target_element = etree.SubElement(root, 'target', attrib={'state': 'removed'})
+            target_element.text = target
+        targets_added = new_target_names.difference(old_target_names)
+        for target in targets_added:
+            target_element = etree.SubElement(root, 'target', attrib={'state': 'added'})
+            target_element.text = target
+            
+        etree.dump(root)
+        tree = etree.ElementTree(root)
+        tree.write(path, pretty_print=True)
+        
+        
+        
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/logger.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,250 @@
+#============================================================================ 
+#Name        : logger.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+##
+# Logger module
+# Description : Port to python of the ISIS::Logger3 perl module
+#
+# 1.0.0 (13/12/2006)
+#  - First version of the module.
+##
+
+# pylint: disable-msg=E1101,E1103
+
+import codecs
+import xml.dom.minidom
+import datetime
+from os import popen
+import traceback
+
+#
+# This is an Internal helper call. 
+#
+class _CustomizePrint(object):
+    
+    ##
+    # Initialise the instance content 
+    # @param logger a Logger instance
+    # @param name method name (e.g. Print, Error), could be any strings
+    def __init__(self, logger, name):
+        self.__logger = logger
+        self.__name = name
+    
+    ##
+    # Make this object callable. Call _print from the logger instance.
+    # @params *args a list of arguments
+    def __call__(self, *args):
+        self.__logger._print(self.__name, args)        
+    
+##
+# The Logger enables to create xml logging in Python.
+#
+class Logger(object):
+    
+    ##
+    # Constructor of the Logger.
+    def __init__(self):
+        self.__step = 1
+        self.__doc = xml.dom.minidom.Document()
+        self.__lognode = self.__doc.createElementNS("", "__log")        
+        self.__header = self.__doc.createElementNS("", "__header")
+        self.__footer = self.__doc.createElementNS("", "__footer")
+        self.__summary = self.__doc.createElementNS("", "__summary")
+        self.__lognode.appendChild(self.__header)
+        self.__lognode.appendChild(self.__summary)
+        self.__lognode.appendChild(self.__footer)        
+        self.__lognode.setAttributeNS("", "date", "%s" % datetime.datetime.now().ctime())
+        self.__footer.setAttributeNS("", "title", "")
+        self.__footer.setAttributeNS("", "subtitle", "")
+        self.__doc.appendChild(self.__lognode)
+        self.__build = self.__doc.createElementNS("", "build")
+        self.__lognode.appendChild(self.__build)
+        self.__current_node = self.__build
+        self.__stack = []
+        self.__verbose = True
+        #<__log date="Wed Dec  6 03:07:25 2006">
+
+    ##
+    # Set the url of interface to use.
+    def SetInterface(self, url):
+        self.__lognode.setAttributeNS("", "interface", url)
+
+    ##
+    # Enable/Disable shell output
+    # @param v boolean to set the logger output
+    def SetVerbose(self, v):
+        self.__verbose = v
+    
+    ##
+    # Set the title of the document
+    # @param title the title to set
+    def SetTitle(self, title):        
+        self.__header.setAttributeNS("", "title", title)
+        
+    ##
+    # Set the subtitle of the document
+    # @param subtitle the subtitle to set
+    def SetSubTitle(self, title):        
+        self.__header.setAttributeNS("", "subtitle", title)
+
+    ##
+    # Set the sumamry title
+    # @param title the title to set
+    def SetSummaryTitle(self, title):
+        self.__summary.setAttributeNS("", "title", title)
+        
+    ##
+    # Creates a summary couple.
+    # @param tag the description
+    # @param value the value
+    def AddSummaryElement(self, tag, value):
+        e = self.__doc.createElementNS("", "__elmt")
+        e.setAttributeNS("", "tag", tag)
+        e.setAttributeNS("", "val", value)
+        self.__summary.appendChild(e)
+        
+        
+    ##
+    # Open a MainContent section.
+    # @param title title of the MainContent section
+    def OpenMainContent(self, title=""):
+        self.__stack.append(self.__current_node)
+        n = self.__doc.createElementNS("", "task")
+        n.setAttributeNS("", "name", title)
+        n.setAttributeNS("", "type", "maincontent")
+        n.setAttributeNS("", "time", datetime.datetime.now().ctime())
+        self.__current_node.appendChild(n)
+        self.__current_node = n
+        if self.__verbose:
+            print ("---------------------------------------------------------------------")
+            print ("  %s" % title)
+            print ("---------------------------------------------------------------------")
+
+        
+    ##
+    # Close the current main content section.
+    # Make sure you have closed other Event/Section first
+    def CloseMainContent(self):
+        if self.__current_node.nodeName != "task" and not (self.__current_node.attributes.has_key('type') and self.__current_node.attributes['type']=="maincontent"):
+            raise Exception("not closing a 'maincontent' typed node")
+        self.__current_node = self.__stack.pop()
+        
+        
+    ##
+    # Create an Event section (can be opened/closed)
+    # @param title title of the MainContent section
+    def OpenEvent(self, title=""):
+        self.__stack.append(self.__current_node)
+        n = self.__doc.createElementNS("", "task")
+        n.setAttributeNS("", "name", title)
+        n.setAttributeNS("", "type", "event")
+        n.setAttributeNS("", "time", datetime.datetime.now().ctime())
+        self.__current_node.appendChild(n)
+        self.__current_node = n
+        if self.__verbose:
+            print ("---------------------------------------------------------------------")
+            print (" + %s" % title)
+
+    def SetCustomOutputer(self, type, classname, config = None):
+        n = self.__doc.createElementNS("", "__customoutputer")
+        n.setAttributeNS("", "type", type)
+        n.setAttributeNS("", "module", classname)
+        if config != None:
+            n.appendChild(config)
+        self.__lognode.appendChild(n)
+        
+    ##
+    # Close the current Event
+    # Make sure you have closed other Event/Section first
+    def CloseEvent(self):
+        if self.__current_node.nodeName != "task" and (self.__current_node.attributes.has_key('type') and self.__current_node.attributes['type']=="event"):
+            raise Exception("not closing a 'event' typed node")
+        self.__current_node = self.__stack.pop()
+    
+    ##
+    # __getattribute__ has been overrided to enable dynamic messaging.
+    # @param attr the name of the method (or attribute...)
+    def __getattribute__(self, attr):
+        try:
+            return object.__getattribute__(self, attr)  
+        except AttributeError:
+            return _CustomizePrint(self, attr)        
+            
+    ##
+    # Generic method that handle the print in the XML document
+    # @param kind type of output
+    # @param *args a list of arguments (must be strings)
+    def _print(self, kind, *args):
+        output = u"".join(map(lambda x: u"%s" % x, list(*args)))
+        nodetype = kind.lower()
+        msgtype = ""
+        if nodetype != "print" and nodetype != "info" and nodetype != "debug":
+            msgtype = "%s:" % nodetype.upper()
+        if self.__verbose:
+            print "%s %s" % (msgtype, output.encode('utf-8'))
+        
+                
+        n = self.__doc.createElementNS("", "message")
+        n.setAttributeNS("", "priority", nodetype)
+        #n.setAttributeNS("", "time", datetime.datetime.now().ctime())
+        n.appendChild(self.__doc.createCDATASection(output))
+        self.__current_node.appendChild(n)
+#        nodetype = kind.lower()
+#        if kind.lower() != "print" and kind.lower() != "printraw":
+#            nodename = kind.lower()
+#
+#        if nodename=="__print" and self.__current_node.lastChild!=None and self.__current_node.lastChild.nodeName  == nodename:
+#            self.__current_node.lastChild.appendChild(self.__doc.createTextNode("".join(*args).decode('iso-8859-1')))
+#        else:
+#            n = self.__doc.createElementNS("", nodename)
+#            n.setAttributeNS("", "step", "%d" % self.__step)
+#            self.__step += 1
+#            n.setAttributeNS("", "time", datetime.datetime.now().ctime())
+#            text_content = "".join(map(lambda x: str(x), list(*args))).decode('iso-8859-1')
+#            n.appendChild(self.__doc.createTextNode(text_content))
+#            self.__current_node.appendChild(n)
+    
+    
+    ##
+    #
+    def SetFooterTitle(self, title):
+        self.__footer.attributes['title'] = title
+        
+    def SetFooterSubTitle(self, subtitle):
+        self.__footer.attributes['subtitle'] = subtitle
+    
+    def Die(self, title, subtitle, exception):
+        self.SetFooterTitle(title)
+        self.SetFooterSubTitle("%s\nException raised: %s\n%s" % (subtitle, exception, traceback.format_exc()))
+
+    ##
+    # Write the DOM tree into a file.
+    # @param filename the file to write in.
+    def WriteToFile(self, filename):        
+        file_object = open(filename, "w")
+        file_object.write(codecs.BOM_UTF8)
+        file_object.write(self.__doc.toprettyxml(encoding = "utf-8"))
+        file_object.close()
+
+
+    ##
+    # Write the DOM tree into a file.
+    # @param filename the file to write in.
+    def __str__(self):        
+        return self.__doc.toprettyxml(encoding="utf-8")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/output/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/output/widgets.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,301 @@
+#============================================================================ 
+#Name        : widgets.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+# pylint: disable-msg=E1101
+
+import xml.dom.minidom
+class Widget:
+    def __init__(self):
+        pass
+    
+    def getDOMContainer(self):
+        pass
+    
+    
+class Box(Widget):
+    def __init__(self, doc, container, divId = "mb", divClass = "mc"):
+        Widget.__init__(self)
+        d1 = doc.createElementNS("", "div")
+        d1.setAttributeNS("", "id", divId)
+        container.appendChild(d1)
+        mc = doc.createElementNS("", "div")
+        mc.setAttributeNS("", "class", divClass)
+        d1.appendChild(mc)        
+        self.__doc = doc
+        self.__title = None
+        self.__mc = mc
+        
+    def setTitle(self, title=""):
+        if self.__title == None:
+            t = self.__doc.createElementNS("", "h1")
+            self.__mc.insertBefore(t, self.__mc.firstChild)            
+            self.__title = self.__doc.createTextNode(title)
+            t.appendChild(self.__title)
+        self.__title.data = title
+
+    def getDOMContainer(self):
+        return self.__mc
+    
+class Summary(Box):    
+    def __init__(self, doc, container):
+        Box.__init__(self, doc, container, divId = "s_mb", divClass = "s_mc")
+        self.__table = doc.createElementNS("", "table")
+        self.__table.setAttributeNS("", "cellspacing", "0")
+        self.__table.setAttributeNS("", "cellpadding", "0")
+        self.__table.setAttributeNS("", "border", "0")
+        self.__table.setAttributeNS("", "width", "100%")
+        self.__table.appendChild(self._Box__doc.createTextNode(""))
+        div = self._Box__doc.createElementNS("", "div")
+        div.setAttributeNS("", "class", "t_wrapper")
+        div.appendChild(self.__table)
+        self.getDOMContainer().appendChild(div)
+        self.__table_stat = None
+        self.setTitle()
+
+    
+    def addElement(self, tag, value):
+        row = self._Box__doc.createElementNS("", "tr")
+        #Tag
+        td = self._Box__doc.createElementNS("", "td")
+        td.setAttributeNS("", "valign", "top")
+        td.setAttributeNS("", "nowrap", "nowrap")        
+        div = self._Box__doc.createElementNS("", "div")
+        div.setAttributeNS("", "class", "s_tag")
+        div.appendChild(self._Box__doc.createTextNode(tag))
+        td.appendChild(div)        
+        row.appendChild(td)
+        
+        # Value
+        td = self._Box__doc.createElementNS("", "td")
+        td.setAttributeNS("", "width", "100%")        
+        div = self._Box__doc.createElementNS("", "div")
+        div.setAttributeNS("", "class", "s_val")
+        div.appendChild(self._Box__doc.createTextNode(value))
+        td.appendChild(div)
+        row.appendChild(td)
+
+        self.__table.appendChild(row)
+
+    def addStatistics(self, type, value):
+        if self.__table_stat == None:
+            h1 = self._Box__doc.createElementNS("", "h1")
+            h1.appendChild(self._Box__doc.createTextNode("Global Statistics"))
+            self.getDOMContainer().appendChild(h1)
+                            
+            div = self._Box__doc.createElementNS("", "div")
+            div.setAttributeNS("", "class", "t_wrapper")
+            self.getDOMContainer().appendChild(div)
+            self.__table_stat = self._Box__doc.createElementNS("", "table")
+            self.__table_stat.setAttributeNS("", "cellspacing", "0")
+            self.__table_stat.setAttributeNS("", "cellpadding", "0")
+            self.__table_stat.setAttributeNS("", "border", "0")
+            self.__table_stat.setAttributeNS("", "width", "100%")
+            div.appendChild(self.__table_stat)
+        
+            row = self._Box__doc.createElementNS("", "tr")
+            self.__table_stat.appendChild(row)
+            self.__table_stat = row
+
+        td = self._Box__doc.createElementNS("", "td")
+        div = self._Box__doc.createElementNS("", "div")
+        div.setAttributeNS("", "class", "gbl_cnt_" + type)
+        div.appendChild(self._Box__doc.createTextNode("%d %ss" % (value, type)))
+        td.appendChild(div)
+        self.__table_stat.appendChild(td)
+          
+    
+    
+class Event(Widget):
+    def __init__(self, doc, container, id):
+        Widget.__init__(self)
+        self.__doc = doc
+        node_head = doc.createElementNS("", "div")
+        node_head.setAttributeNS("", "class", "node_head")
+        container.appendChild(node_head)
+
+        link = doc.createElementNS("", "a")
+        link.setAttributeNS("", "href", "javascript:ToggleNode('Img%d')" % id)
+        node_head.appendChild(link)
+        
+        span = doc.createElementNS("", "span")
+        span.setAttributeNS("", "id", "Img%d" % id)
+        span.setAttributeNS("", "style", "background:url(http://fawww.europe.nokia.com/isis/isis_interface/img/icons/button_open.gif) no-repeat")
+        link.appendChild(span)
+
+        stitle = doc.createElementNS("", "span")
+        stitle.setAttributeNS("", "class", "node_title")
+        self.__title = doc.createTextNode("")
+        stitle.appendChild(self.__title)
+        span.appendChild(stitle)
+        
+        # shaow all
+        showall = doc.createElementNS("", "a")
+        showall.setAttributeNS("", "href", "javascript:ShowChilds('Img%d')"  % id)
+        span = doc.createElementNS("", "span")
+        span.setAttributeNS("", "class", "node_action")
+        span.appendChild(doc.createTextNode("[Show All]"))
+        showall.appendChild(span)
+        
+        #hide all
+        hideall = doc.createElementNS("", "a")
+        hideall.setAttributeNS("", "href", "javascript:HideChilds('Img%d')" % id)
+        span = doc.createElementNS("", "span")
+        span.setAttributeNS("", "class", "node_action")
+        span.appendChild(doc.createTextNode("[Hide All]"))
+        hideall.appendChild(span)
+        
+        #toggle node
+        self.__togglenode = doc.createElementNS("", "a")
+        self.__togglenode.setAttributeNS("", "href", "javascript:ToggleNode('Img%d')" % id)
+        self.__togglenode.appendChild(doc.createTextNode(""))
+        # append container
+        node_head.appendChild(showall)
+        node_head.appendChild(hideall)
+        node_head.appendChild(self.__togglenode)        
+
+        contentx = doc.createElementNS("", "div")
+        contentx.setAttributeNS("", "id", "Content%d" % id)
+        contentx.setAttributeNS("", "style", "display:none")
+        container.appendChild(contentx)
+        content = doc.createElementNS("", "div")
+        content.setAttributeNS("", 'class', "node_content")
+        content.appendChild(doc.createTextNode(""))
+        contentx.appendChild(content)
+        self.__container = content
+        self.__node_info = None
+        
+    def setTitle(self, title = ""):
+        self.__title.data = title
+
+    def addStatistics(self, type, value):
+        if self.__node_info == None:
+            self.__node_info = self.__doc.createElementNS("", "span")
+            self.__node_info.setAttributeNS("", "class", "node_info")
+            self.__togglenode.appendChild(self.__node_info)
+        span = self.__doc.createElementNS("", "span")
+        span.setAttributeNS("", "class","cnt_%s" % type)
+        span.appendChild(self.__doc.createTextNode("%d %ss" % (value, type)))
+        self.__node_info.appendChild(span)
+          #<span class="node_info">
+          #  <span class="cnt_warning">2 warnings</span>
+          #</span>
+
+    def getDOMContainer(self):
+        return self.__container
+
+
+class Header(Widget):
+    def __init__(self, doc, container):
+        Widget.__init__(self)
+        self.__doc = doc
+        h_wrapper = self.__doc.createElementNS("", "div")
+        h_wrapper.setAttributeNS("", "id", "h_wrapper")
+        h_elmt = self.__doc.createElementNS("", "div")
+        h_elmt.setAttributeNS("", "class", "h_elmt")
+        h_wrapper.appendChild(h_elmt)
+        container.appendChild(h_wrapper)
+        #title
+        t = self.__doc.createElementNS("", "div")
+        self.__title = doc.createTextNode("")
+        t.appendChild(self.__title)
+        t.setAttributeNS("", "class", "h_title")
+        h_elmt.appendChild(t)
+        #subtitle
+        t = self.__doc.createElementNS("", "div")
+        self.__subtitle = doc.createTextNode("")
+        t.appendChild(self.__subtitle)
+        t.setAttributeNS("", "class", "h_subtitle")
+        h_elmt.appendChild(t)
+        
+        
+        
+    def setTitle(self, title):            
+        self.__title.data = title
+        
+    def setSubTitle(self, title):            
+        self.__subtitle.data = title
+
+    def getDOMContainer(self):
+        return None
+
+class Footer(Widget):
+    def __init__(self, doc, container):
+        Widget.__init__(self)
+        self.__doc = doc
+        h_wrapper = self.__doc.createElementNS("", "div")
+        h_wrapper.setAttributeNS("", "id", "f_wrapper")
+        h_elmt = self.__doc.createElementNS("", "div")
+        h_elmt.setAttributeNS("", "class", "f_elmt")
+        h_wrapper.appendChild(h_elmt)
+        container.appendChild(h_wrapper)
+        #title
+        t = self.__doc.createElementNS("", "div")
+        self.__title = doc.createTextNode("")
+        t.appendChild(self.__title)
+        t.setAttributeNS("", "class", "f_title")
+        h_elmt.appendChild(t)
+        #subtitle
+        t = self.__doc.createElementNS("", "div")
+        self.__subtitle = doc.createTextNode("")
+        t.appendChild(self.__subtitle)
+        t.setAttributeNS("", "class", "f_subtitle")
+        h_elmt.appendChild(t)
+        
+    def setTitle(self, title):            
+        self.__title.data = title
+        
+    def setSubTitle(self, title):            
+        self.__subtitle.data = title
+    
+class Text(Widget):
+    def __init__(self, doc, container):
+        Widget.__init__(self)
+        self.__doc = doc
+        self.__div = self.__doc.createElementNS("", "div")
+        self.__div.setAttributeNS("", "class", "icn_dft")
+        container.appendChild(self.__div)
+    
+    def setIcon(self, name):
+        self.__div.setAttributeNS("", "class", name)
+
+    def appendText(self, text):            
+        def pushContent(arg):
+            self.getDOMContainer().appendChild(self.__doc.createTextNode(arg))
+            self.getDOMContainer().appendChild(self.__doc.createElementNS("","br"))
+        map(pushContent, text.strip().split("\n"))            
+
+    def getDOMContainer(self):
+        return self.__div
+
+class RawText(Text):
+    def appendText(self, text):
+        for child in xml.dom.minidom.parseString("<xhtml>" + text.strip() + "</xhtml>").documentElement.childNodes:
+            self.getDOMContainer().appendChild(child.cloneNode(True))
+
+class BoldText(Text):
+    def __init__(self, doc, container):
+        Text.__init__(self, doc, container)
+        self.__bold = doc.createElementNS("","b")
+        self._Text__div.appendChild(self.__bold)
+        
+    def getDOMContainer(self):
+        return self.__bold
+    
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/outputer.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,306 @@
+#============================================================================ 
+#Name        : outputer.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+##
+# Outputer module
+# Description : Port to python of the ISIS::Logger3::XML2HTML perl module
+#
+# 1.0.0 (13/12/2006)
+#  - First version of the module.
+##
+import codecs
+import xml.dom.minidom
+from helium.output.widgets import *
+import urllib2
+import amara
+import re
+import dataurl
+
+class Configuration:
+    def __init__(self, url):
+        f = urllib2.urlopen(url)#
+        data = f.read()
+        f.close()
+        self.__xml = amara.parse(data)
+        
+    def getClass(self, type, default = None):
+        return self._getValue(type, "class", default)
+
+    def getImg(self, type, default = None):
+        return self._getValue(type, "img", default)
+    
+    def getWidth(self, type, default = None):
+        return self._getValue(type, "width", default)
+    
+    def getHeight(self, type, default = None):
+        return self._getValue(type, "height", default)
+    
+    def _getValue(self, type, attr, default = None):
+        r = self.__xml.xml_xpath("/htmloutput/icons/icon[@type='%s']" % type)
+        if len(r) == 0:
+            if default == None:
+                raise Exception("Not found")
+            else:
+                return default
+        return r[0][attr]
+    
+class XML2XHTML:
+    
+    def __init__(self, filename, url="http://fawww.europe.nokia.com/isis/isis_interface/configuration.xml", usedataurl=False):
+        self.__config = Configuration(url)
+        self.__filename = filename
+        self.__srcdoc = xml.dom.minidom.parse(filename)
+        self.__srcdoc.normalize()
+        self.__usedataurl = usedataurl
+        
+        # xhtml output
+        dom = xml.dom.minidom.getDOMImplementation()
+        doctype = dom.createDocumentType("html", 
+              "-//W3C//DTD XHTML 1.0 Strict//EN", 
+              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd")
+        self.__doc = dom.createDocument(None, "html", doctype)
+        self.__xhtml = self.__doc.getElementsByTagName("html")[0]
+        self.__xhtml.setAttributeNS("", "xmlns", "http://www.w3.org/1999/xhtml")        
+        self.__id = 0
+        self.__xhtml_summary = None
+        self.__tags = {}
+        self.__css = ["http://fawww.europe.nokia.com/isis/isis_interface/css/logger2.css"]
+        self.__javascript = ["http://fawww.europe.nokia.com/isis/isis_interface/javascript/expand2.js"]
+        self.__factory = {'__header' : XML2XHTML.forname('helium.output.widgets.Header'),
+                          '__footer' : XML2XHTML.forname('helium.output.widgets.Footer'),
+                          '__maincontent' : XML2XHTML.forname('helium.output.widgets.Box'),
+                          '__summary' : XML2XHTML.forname('helium.output.widgets.Summary'),
+                          '__print' : XML2XHTML.forname('helium.output.widgets.Text'),
+                          '__printraw' : XML2XHTML.forname('helium.output.widgets.RawText'),
+                          '__event' : XML2XHTML.forname('helium.output.widgets.Event')}
+    
+    def _getId(self):
+        self.__id += 1
+        return self.__id
+
+    def addCSSLink(self, url):
+        self.__css.append(url)
+        
+    def addJScriptLink(self, url):
+        self.__javascript.append(url)
+        
+    def _generateCSSLinks(self, container):
+        for link in self.__css:
+            l = self.__doc.createElementNS("", "link")
+            if self.__usedataurl:
+                l.setAttributeNS("", "href", dataurl.from_url(link))
+            else:
+                l.setAttributeNS("", "href", link)
+            l.setAttributeNS("", "rel", "stylesheet")
+            l.setAttributeNS("", "type", "text/css")
+            container.appendChild(l)
+            
+    def _generateJScriptLink(self, container):
+        for link in self.__javascript:
+            l = self.__doc.createElementNS("", "script")
+            if self.__usedataurl:
+                l.setAttributeNS("", "src", dataurl.from_url(link))
+            else:
+                l.setAttributeNS("", "src", link)
+            l.setAttributeNS("", "type", "text/javascript")
+            l.appendChild(self.__doc.createTextNode(""))
+            container.appendChild(l)
+        
+        
+    def generate(self):
+        root = self.__srcdoc.documentElement
+        if root.tagName != "__log":
+            raise Exception("Invalid document must be __log.")
+
+        for c in root.getElementsByTagName("__customoutputer"):
+            self.__factory[c.attributes['type'].value] = XML2XHTML.forname(c.attributes['module'].value)
+
+        
+        head = self.__doc.createElementNS("", "head")
+        title = self.__doc.createElementNS("", "title")
+        self.__title = self.__doc.createTextNode("")
+        title.appendChild(self.__title)
+        head.appendChild(title)
+        
+        self._generateCSSLinks(head)
+        self._generateJScriptLink(head)
+        
+        body = self.__doc.createElementNS("", "body") 
+        self.__xhtml.appendChild(head)
+        self.__xhtml.appendChild(body)
+        
+                    
+        for c in root.childNodes:            
+            if c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "__header":
+                self._handleHeader(c, body)
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "__summary":
+                self._handleSummary(c, body)
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "__maincontent":
+                self._handleMainContent(c, body)
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "build":
+                self._handleBuild(c, body)
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "task" and c.attributes.has_key('type') and c.attributes['type'] == "maincontent":
+                self._handleMainContent(c, body)
+
+        try:
+            footer = root.getElementsByTagName("__footer")[0]
+            f = self.__factory["__footer"](self.__doc, body)
+            if footer.attributes.has_key("title"):
+                f.setTitle(footer.attributes['title'].value)
+            if footer.attributes.has_key("subtitle"):
+                f.setSubTitle(footer.attributes['subtitle'].value)
+        except Exception:            
+            pass
+        # Generate summary
+        self._createSummary()
+
+    def _handleHeader(self, node, container):
+        h = self.__factory["__header"](self.__doc, container)
+        if node.attributes.has_key('title'):
+            self.__title.data = node.attributes['title'].value
+            h.setTitle(node.attributes['title'].value)        
+        if node.attributes.has_key("subtitle"):
+            h.setSubTitle(node.attributes['subtitle'].value)
+        
+    def _handleSummary(self, node, container):
+        box = self.__factory["__summary"](self.__doc, container)
+        if node.attributes.has_key('title'):
+            box.setTitle(node.attributes["title"].value)
+        
+        for c in node.getElementsByTagName("__elmt"):           
+            box.addElement(c.attributes['tag'].value, c.attributes['val'].value)
+        self.__xhtml_summary = box
+    
+    def _handleBuild(self, node, container):
+        for c in node.childNodes:
+            if c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "task" and c.attributes.has_key('type') and c.attributes['type'].value == 'maincontent':
+                self._handleMainContent(c, container)
+                
+
+    def _handleMainContent(self, node, container):
+        box = self.__factory["__maincontent"](self.__doc, container)
+        if node.attributes.has_key("title"):
+            box.setTitle(node.attributes["title"].value)
+        if node.attributes.has_key("name"):
+            box.setTitle(node.attributes["name"].value)
+        for c in node.childNodes:
+            if c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "__event":
+                self._handleEvent(c, box.getDOMContainer())
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "task" and c.attributes.has_key('type') and c.attributes['type'].value == 'event':
+                self._handleEvent(c, box.getDOMContainer())
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "message":
+                self._handleMessage(c, box.getDOMContainer())
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE:
+                self._handlePrint(c, box.getDOMContainer())
+
+    def _handleEvent(self, node, container):
+        tags = self.__tags
+        self.__tags = {}
+        event = self.__factory["__event"](self.__doc, container, self._getId())
+        if node.attributes.has_key('title'):
+            event.setTitle(node.attributes['title'].value)
+        elif node.attributes.has_key('name'):
+            event.setTitle(node.attributes['name'].value)
+        for c in node.childNodes:            
+            if c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "__event":
+                self._handleEvent(c, event.getDOMContainer())
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "task" and c.attributes.has_key('type') and c.attributes['type'].value == 'event':
+                self._handleEvent(c, event.getDOMContainer())
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE and c.tagName == "message":
+                self._handleMessage(c, event.getDOMContainer())
+            elif c.nodeType == xml.dom.Node.ELEMENT_NODE:
+                self._handlePrint(c, event.getDOMContainer())
+                
+        keys = self.__tags.keys()
+        keys.sort()
+        for name in keys:         
+            event.addStatistics(name.replace("__", ""), self.__tags[name])
+        self.__tags = self._mergeStatistics(tags, self.__tags)
+        
+    def _handleMessage(self, node, container):
+        if node.attributes['priority'].value == "printraw":
+            t = self.__factory["__printraw"](self.__doc, container)
+            for n in node.childNodes:
+                if n.nodeType == xml.dom.Node.CDATA_SECTION_NODE:
+                    t.appendText(n.data)
+        else:
+            t = self.__factory["__print"](self.__doc, container)
+            for n in node.childNodes:
+                if n.nodeType == xml.dom.Node.CDATA_SECTION_NODE:
+                    t.appendText(n.data)
+            if node.attributes['priority'].value != "print":
+                t.setIcon(self.__config.getClass(node.attributes['priority'].value, "icn_dft"))
+                if self.__tags.has_key(node.attributes['priority'].value):
+                    self.__tags[node.attributes['priority'].value] += 1
+                else:
+                    self.__tags[node.attributes['priority'].value] = 1
+
+    def _handlePrint(self, node, container):
+        if node.tagName == "__printraw":
+            t = self.__factory["__printraw"](self.__doc, container)
+            for n in node.childNodes:
+                if n.nodeType == xml.dom.Node.CDATA_SECTION_NODE or n.nodeType == xml.dom.Node.TEXT_NODE:
+                    t.appendText(n.data)
+        else:
+            t = self.__factory["__print"](self.__doc, container)
+            for n in node.childNodes:
+                if n.nodeType == xml.dom.Node.CDATA_SECTION_NODE or n.nodeType == xml.dom.Node.TEXT_NODE:
+                    t.appendText(n.data)
+            if node.tagName != "__print":
+                t.setIcon(self.__config.getClass(node.tagName, "icn_dft"))
+                if self.__tags.has_key(node.tagName):
+                    self.__tags[node.tagName] += 1
+                else:
+                    self.__tags[node.tagName] = 1
+
+    def _createSummary(self):
+        # pylint: disable-msg=E1101
+        if self.__xhtml_summary == None:
+            self.__xhtml_summary = Summary(self.__doc, self.__body)
+            self.__xhtml_summary.setTitle("Global Statistics")
+        keys = self.__tags.keys()
+        keys.sort()
+        for name in keys:
+            self.__xhtml_summary.addStatistics(name.replace("__", ""), self.__tags[name])
+
+   
+    def _mergeStatistics(self, tags, newTags):
+        for name in newTags.keys():
+            if tags.has_key(name):
+                tags[name] += newTags[name]
+            else:
+                tags[name] = newTags[name]
+        return tags
+        
+    def WriteToFile(self, filename):        
+        file_object = open(filename, "w")
+        file_object.write(codecs.BOM_UTF8)
+        file_object.write(self.__doc.toprettyxml(encoding="utf-8"))
+        file_object.close()
+    
+    
+    @staticmethod
+    def forname(classname):
+        r = re.match("^(?P<modname>(?:\w+\.?)*)\.(?P<classname>(\w+?))$", classname)
+        if r != None:
+            return getattr(__import__(r.groupdict()['modname'], [], [], r.groupdict()['classname']), r.groupdict()['classname'])
+        else:
+            raise Exception("Error retreiving module and classname for %s" % classname)
+        
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/heliumlogging.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+#============================================================================ 
+#Name        : heliumlogging.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import logging
+import logging.config
+if os.environ.has_key("HELIUM_CACHE_DIR"):
+    logconf = os.path.join(os.environ['HELIUM_CACHE_DIR'], "logging." + os.environ['PID'] + ".conf")
+else:
+    logconf = os.path.join(os.getcwd(), "logging.conf")
+
+assert os.path.exists(logconf)
+logging.config.fileConfig(logconf)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ido.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+#============================================================================ 
+#Name        : ido.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+IDO specific features
+    * find layer_real_source_path from sysdef file.
+    * time manipulation for robot releasing.
+"""
+import re
+import datetime
+
+MATCH_ENTITY = re.compile(r".*ENTITY\s+layer_real_source_path\s+\"(.+)\"\s*>?.*")
+
+def get_sysdef_location(sysdef):
+    """ Search for layer_real_source_path entity inside the sysdef file. """
+    input = open(sysdef, 'r')
+    for line in input.readlines():
+        result = MATCH_ENTITY.match(line)
+        if result != None:
+            input.close()
+            return result.groups()[0]
+    input.close()
+    print 'layer_real_source_path entity not found in ' + sysdef
+    return None
+
+
+def get_first_day_of_cycle(now = datetime.datetime.now()):
+    """ This function returns a datetime object representing the monday from closest
+        even week.
+    """
+    week = int(now.strftime("%W"))
+    day = int(now.strftime("%w")) - 1
+    monday = now - datetime.timedelta(days=day + week.__mod__(2) * 7)
+    monday = monday.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
+    return monday
+
+def get_absolute_date(day, time, now = datetime.datetime.now()):
+    """ Get the absolute date from the day and time. """
+    time = datetime.datetime.strptime(time, "%H:%M")
+    delta = datetime.timedelta(days = day-1, hours = time.hour, minutes= time.minute)
+    return get_first_day_of_cycle(now) + delta
+
+
+def is_in_interval(day1, time1, day2, time2, now = datetime.datetime.now()):
+    """ Return True is get_absolute_date(day1, time1) < now < get_absolute_date(day2, time2). """
+    delta1 = get_absolute_date(day1, time1, now)
+    delta2 = get_absolute_date(day2, time2, now)
+    if now <= delta1:
+        return False
+    if delta2 <= now:
+        return False
+    return True
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/imaker/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,23 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" iMaker framework. """
+from ant import *
+from api import *
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/imaker/ant.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,199 @@
+#============================================================================ 
+#Name        : ant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+    iMaker related functionalities.
+    * configuration introspection
+    * target introspection 
+"""
+import os
+import pathaddition.match
+import re
+import fileutils
+import imaker.api
+
+def ant_run(task, config, target, variables=None):
+    """ Running iMaker under Ant. """
+    if variables == None:
+        variables = {}
+    cmdline = "imaker"
+    cmdline += " -f %s" % config
+    cmdline += " %s" % target    
+    for key in  variables.keys():
+        cmdline += ' "%s=%s"' % (key, variables[key])
+    # run imaker and log to Ant.
+    task.log("Running %s" % cmdline)
+    handle = os.popen(cmdline)
+    for line in handle.read().splitlines():
+        task.log(line)
+    return handle.close()
+
+
+def is_included(incs, target):
+    """ Does target matches an include pattern. """
+    for inc in incs:
+        if inc.match(target):
+            return True
+    return False
+
+def is_excluded(excs, target):
+    """ Does target matches an exclude pattern. """
+    for exc in excs:
+        if exc.match(target):
+            return True
+    return False
+        
+
+def ant_task_configuration(project, task, elements, attributes):
+    """ Implementation of the Ant task. """
+    # assert attributes.get('property') != None, "'property' attribute is not defined."
+    configIndex = 0
+    if attributes.get('dir') != None:
+        os.chdir(str(attributes.get('dir')))
+    tdd = "[\n"
+    if elements.get("imakerconfigurationset") is not None:
+        if elements.get("imakerconfigurationset").size() == 0:
+            task.log(str("No configuration defined."))
+        for cid in range(elements.get("imakerconfigurationset").size()):
+            configurationset = elements.get("imakerconfigurationset").get(int(cid))            
+            if configurationset.isReference() == 1:
+                task.log("Using configuration from reference '%s'." % str(configurationset.getRefid().getRefId()))
+                ref = project.getReference(str(configurationset.getRefid().getRefId()))
+                if ref == None:
+                    raise Exception("Could not find reference '%s'" % str(configurationset.getRefid().getRefId()))
+                configurationset = ref            
+            for configuration in configurationset.getImakerConfiguration().toArray():
+                configIndex += 1
+                tdd += handle_configuration(project, task, elements, attributes, configuration, configIndex)
+    else:
+        task.log(str("No configuration defined."))
+    tdd += "]\n"
+    
+    if attributes.get('property') != None:
+        task.log("Setting property '%s'." % str(attributes.get('property')))
+        project.setProperty(str(attributes.get('property')), str(tdd))
+    if attributes.get('file') != None:
+        task.log("Creating file '%s'." % str(attributes.get('file')))
+        out = open(str(attributes.get('file')), "w")
+        out.write(tdd)
+        out.close()
+        
+def handle_configuration(project, task, elements, attributes, configuration,  configIndex):
+    """ Convert a configuration into a TDD for future FMPP transformation. """
+    includes = []
+    excludes = []
+    tincludes = []
+    texcludes = []
+    variables = {}
+    
+    for configs in configuration.getMakefileSet().toArray():
+        incs = configs.getIncludePatterns(project)
+        if incs is not None:
+            for inc in incs:
+                includes.append(str(inc))
+        excs = configs.getExcludePatterns(project)
+        if excs is not None:
+            for exc in excs:
+                excludes.append(str(exc))
+    if len(includes)==0:
+        task.log("WARNING: config %s has no makefile and hence not executed" % configIndex)
+        
+    
+    for targets in configuration.getTargetSet().toArray():
+        incs = targets.getIncludePatterns(project)
+        if incs is not None:
+            for inc in incs:
+                tincludes.append(re.compile(str(inc)))
+        excs = targets.getExcludePatterns(project)
+        if excs is not None:
+            for exc in excs:
+                texcludes.append(re.compile(str(exc)))
+    if len(tincludes) == 0:
+        tincludes.append(re.compile(r".*"))
+    
+    # Reading the variables
+    for variableset in configuration.getVariableSet().toArray():
+        vector = variableset.getVariables()
+        for variable in vector.toArray():
+            variables[str(variable.getName())] = str(variable.getValue())
+
+    configs = imaker.api.scan_configs(includes, excludes)
+    targets = {}
+    for config in configs:
+        task.log("Configuration: %s" % config)
+        if config not in targets:
+            targets[config] = []
+        for target in imaker.api.targets_for_config(config):
+            if is_included(tincludes, target) and not is_excluded(texcludes, target)\
+                    and target not in targets[config]:
+                targets[config].append(target)
+
+    task.log(str("Regional variation: %s" % configuration.getRegionalVariation()))
+    if configuration.getRegionalVariation():
+        task.log("Sorting target by region.")
+        regiontargets = {}
+        for config in targets.keys():
+            task.log(" * %s:" % config)
+            for target in targets[config]:
+                region = imaker.api.get_variable('LANGPACK_REGION', target=target, config=config, default="western")                
+                task.log("    - %s: %s" % (target, region))
+                if not regiontargets.has_key(region):
+                    regiontargets[region] = {}
+                if not regiontargets[region].has_key(config):
+                    regiontargets[region][config] = []
+                regiontargets[region][config].append(target)                
+            # sort by region
+        tdd = ""
+        for region in regiontargets.keys():
+            tdd += region_switch_to_tdd(region)
+            tdd += imaker_command_to_tdd(regiontargets[region], variables)
+        return tdd
+
+    # generating the TDD
+    return imaker_command_to_tdd(targets, variables)
+
+
+def region_switch_to_tdd(region):
+    tdd = "{\n"
+    tdd += "\t\"command\": \"switch_region\",\n"
+    tdd += "\t\"region\": \"%s\",\n" % region
+    tdd += "},\n"
+    return tdd
+    
+
+def imaker_command_to_tdd(targets, variables):
+    # generating the TDD
+    tdd = "{\n"
+    tdd += "\t\"command\": \"imaker\",\n"
+    tdd += "\t\"config\": {\n"
+    for config in targets.keys():
+        tdd += "\t\t\"%s\": [\n" % config
+        for target in targets[config]:
+            tdd += "\t\t\t{\n"
+            tdd += "\t\t\t\"target\": \"%s\",\n" % target
+            tdd += "\t\t\t\"variables\": {\n"
+            for varname in variables.keys():
+                tdd += "\t\t\t\t\"%s\": \"%s\",\n" % (varname, variables[varname])  
+            tdd += "\t\t\t\t},\n"
+            tdd += "\t\t\t},\n"
+        tdd += "\t\t],\n"
+    tdd += "\t},\n"
+    tdd += "},\n"
+    return tdd
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/imaker/api.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,98 @@
+#============================================================================ 
+#Name        : api.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This module is an helper to interface iMaker. """
+import os
+import re
+import pathaddition.match
+import fileutils
+import tempfile
+import logging
+import subprocess
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger("imaker.api")
+
+class IMakerConfigScanner(fileutils.AbstractScanner):
+    """ Specialize the abstract filescanner to support detection of the configuration. """
+    def scan(self):
+        """ Implement scanning of relevant configuration. """
+        p = subprocess.Popen("imaker help-config", shell=True, stdout=subprocess.PIPE)
+        handle = p.communicate()[0]
+        for line in handle.splitlines():
+            line = line.strip()
+            if line.startswith('/') and self.is_included(line) \
+                and not self.is_excluded(line):
+                yield line
+        
+def scan_configs(includes, excludes):
+    """ Use iMaker to scan the available buildable configurations. """
+    scanner = IMakerConfigScanner()
+    for inc in includes:
+        scanner.add_include(inc)
+    for exc in excludes:
+        scanner.add_exclude(exc)
+    return [r for r in scanner.scan()]
+
+def targets_for_config(config):
+    """ Return the list of target supported by the provided configuration of iMaker. """
+    cmd = "imaker -f %s help-target-*-list" % config
+    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+    handle = p.communicate()[0]
+    result = []
+    for line in handle.splitlines():
+        line = line.strip()
+        if line == "" or line.startswith("Total duration"):
+            continue
+        result.append(line)
+    return result
+
+
+def get_product_dir(product):
+    """ Return the PRODUCT_DIR variable from iMaker. """
+    return get_variable("PRODUCT_DIR", product=product)
+
+    
+def get_variable(variable, target=None, product=None, config=None, default=None):
+    """ Get variable value from iMaker. """
+    cmdline = ""
+    if product != None:
+        cmdline = "-p%s" % product
+    if config != None:
+        cmdline += " -f %s" % config
+    if target != None:
+        cmdline += " %s" % target
+    
+    logdir = tempfile.mkdtemp()
+    logger.info("imaker %s print-%s WORKDIR=%s" % (cmdline, variable, logdir))
+    (_, handle, child_stderr) = os.popen3("imaker %s print-%s WORKDIR=%s" % (cmdline, variable, logdir))
+    logger.info(child_stderr.read())
+    result = []
+    for line in handle.read().splitlines():
+        line = line.strip()
+        if line == "" or line.startswith("Total duration"):
+            continue
+        if variable in line:
+            result.append(line)
+    handle.close()
+    result = re.match("%s\s*=\s*`(.*)'" % variable, "\n".join(result), re.DOTALL)
+    if result != None:
+        return result.group(1)
+    assert (result != None)
+    return default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/imaker/ecore.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,69 @@
+#============================================================================ 
+#Name        : ecore.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Implements few eclipse ecore XML parser helpers. """
+import re
+
+class Reference(object):
+    """ Reference to real instance. """
+    
+    def __init__(self, node, reference):
+        """ The constructor. """
+        self.reference = reference
+        self.node = node
+    
+    def __getattr__(self, name):
+        """ Delegate to the reference object.
+            So the reference object can behave the
+            same way as the real object.
+        """
+        return getattr(self.instance(), name)
+        
+    def instance(self):
+        """ Retrieve the real object instance from the object hierarchy. """
+        ref = self.reference
+        cnode = self.node
+        if ref.startswith("//"):
+            cnode = self.node.get_root()    
+            ref = ref[2:]
+        for pel in ref.split("/"):
+            res = re.match(r"@([^.]+)(?:\.(\d+))?", pel)
+            if res != None:
+                name = res.group(1)
+                
+                if res.group(2) != None:
+                    cnode = getattr(cnode, name)[int(res.group(2))]
+                else:
+                    cnode = getattr(cnode, name)
+            else:
+                raise Exception("Invalid reference %s" % ref)
+        return cnode
+
+
+class ContainerBase(object):
+    """ Container class that implements a parent relationship. """
+    def __init__(self, parent=None):
+        self.parent = parent
+    
+    def get_root(self):
+        """ Retrieving the root container. """
+        if self.parent == None:
+            return self
+        else:
+            return self.parent.get_root()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/imaker/iqrf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,168 @@
+#============================================================================ 
+#Name        : iqrf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+    Implements iQRF model.
+    
+    How to use it:
+    import imaker.iqrf
+    root = imaker.iqrf.load(filename)
+    root.result
+"""
+import amara
+import logging
+from  imaker.ecore import ContainerBase, Reference       
+
+logging.basicConfig()
+logger = logging.getLogger("iqrf.model")
+#logger.setLevel(logging.DEBUG)
+
+        
+class IMaker(ContainerBase):
+    """ IMaker container. """
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.result = None
+
+    def load(self, node):
+        """ Load data from XML node. """
+        if hasattr(node, 'result'):
+            logger.debug("IMaker has result attribute.")
+            self.result = Result(self)
+            self.result.load(node.result)
+
+
+class Result(ContainerBase):
+    """ Result container. """
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.interfaces = []
+        self.configurations = []
+        self.targets = []
+
+    def load(self, node):
+        """ Load data from XML node. """
+        logger.debug("Loading Result")
+        for elem in node.interfaces:
+            interface = Interface(self)
+            interface.load(elem)
+            self.interfaces.append(interface)
+        for elem in node.configurations:
+            configuration = Configuration(self)
+            configuration.load(elem)
+            self.configurations.append(configuration)
+        for elem in node.targets:
+            target = Target(self)
+            target.load(elem)
+            self.targets.append(target)
+
+class Configuration(ContainerBase):
+    """ Configuration container. """
+
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.name = None
+        self.settings = []
+        self.filePath = None
+        self.targetrefs = []
+
+    def load(self, node):
+        """ Load data from XML node. """
+        logger.debug("Loading Configuration")
+        self.name = node.name        
+        self.filePath = node.filePath
+        for elem in node.xml_xpath('./settings'):
+            setting = Setting(self)
+            setting.load(elem)
+            self.settings.append(setting)
+            
+        for ref in node.targetrefs.split(" "):
+            self.targetrefs.append(Reference(self, ref))
+
+class Setting(ContainerBase):
+
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.name = None
+        self.value = None
+        self.ref = None
+
+    def load(self, node):        
+        logger.debug("Loading Setting")
+        self.name = node.name        
+        self.value = node.value        
+        self.ref = Reference(node.ref)        
+
+    
+class Interface(ContainerBase):
+    """ Interface container. """
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.name = None
+        self.configurationElements = []
+
+    def load(self, node):
+        """ Load data from XML node. """
+        logger.debug("Loading Interface")
+        self.name = node.name        
+        for cel in node.configurationElements:
+            conf = ConfigurationElement(self)
+            conf.load(cel)
+            self.configurationElements.append(conf)
+    
+class ConfigurationElement(ContainerBase):
+    """ ConfigurationElement container. """
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.name = None
+        self.description = None
+        self.values = None
+
+    def load(self, node):
+        """ Load data from XML node. """
+        logger.debug("Loading ConfigurationElement")
+        self.name = node.name        
+        self.description = node.description
+        self.values = node.values
+
+class Target(ContainerBase):
+    """ Target container. """
+
+    def __init__(self, parent=None):
+        ContainerBase.__init__(self, parent)
+        self.name = None
+        self.description = None
+
+    def load(self, node):
+        """ Load data from XML node. """
+        logger.debug("Loading Target")
+        self.name = node.name        
+        self.description = node.description
+
+        
+
+
+def load(filename):
+    """ Load IMaker serialized ecore configuration. """
+    doc = amara.parse(open(filename, 'r'))
+    imaker = IMaker()    
+    imaker.load(doc.IMaker)
+    return imaker
+    
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/integration/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/integration/ant.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+#============================================================================ 
+#Name        : ant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Quality Ant task implementation. """
+import integration.quality
+import os
+import traceback
+
+def check_build_duplicates_task(project, task, attributes, elements):
+    """ This is the implementation of the checkBuildDuplicatesMacro Ant task."""
+    try:
+        if attributes.get('output') == None:
+            raise Exception("'output' attribute is not defined.")
+        output = str(attributes.get('output'))
+        task.log("Creating %s" % output)
+        output = open(output, "w+")
+        output.write("<?xml version=\"1.0\"?>\n<buildconflicts>\n")
+        components_per_file = {}
+        for eid in range(elements.get("fileset").size()):
+            dirscanner = elements.get("fileset").get(int(eid)).getDirectoryScanner(project)
+            dirscanner.scan()
+            for jfilename in dirscanner.getIncludedFiles():
+                filename = str(jfilename)
+                task.log("Parsing %s" % filename)
+                filename = os.path.join(str(dirscanner.getBasedir()), filename)
+                parser = integration.quality.AbldWhatParser(open(filename, 'r'))
+                parser.components_per_file = components_per_file
+                parser.parse()
+            
+        for filename in components_per_file.keys():
+            if len(components_per_file[filename]) > 1:
+                output.write("    <file name=\"%s\">\n" % filename)
+                output.write("".join(map(lambda x: "        <component name=\"%s\"/>\n" % x, components_per_file[filename])))
+                output.write("    </file>\n")
+        output.write("</buildconflicts>\n")
+        output.close()
+    except Exception, exc:
+        task.log('ERROR: %s' % exc)
+        traceback.print_exc()
+        raise exc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/integration/quality.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,184 @@
+#============================================================================ 
+#Name        : quality.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+Symbian log based analyser.
+
+ * Internal export parser
+ * Duplicate generation parser (relying on abld -what)
+
+Policy validation.
+"""
+
+import symbian.log
+import re
+import os
+import sys
+import csv
+import fileutils
+import pathaddition.match
+import logging
+
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger("integration.quality")
+
+class InternalExportParser(symbian.log.Parser):
+    """ This class extends the Symbian log parser class and implement
+        an "abld -what" analyser which detects file generated/exported inside
+        the source tree.
+    """
+    def __init__(self, _file):
+        """The constructor """
+        symbian.log.Parser.__init__(self, _file)
+        self.__match_what = re.compile("abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I)
+        self.internalexports = {}
+        
+    def task(self, name, _cmd, _dir, content):
+        """ Analyse task log. """
+        if self.__match_what.match(_cmd) != None:
+            for line in content.splitlines():
+                if line.startswith(os.path.sep) \
+                    and not os.path.normpath(line.strip().lower()).startswith(os.path.sep+"epoc32"+os.path.sep) \
+                    and os.path.splitext(line.strip().lower())[1] != '':
+                    if name not in self.internalexports:
+                        self.internalexports[name] = []
+                    self.internalexports[name].append(line)
+
+
+class AbldWhatParser(symbian.log.Parser):
+    """ This class extends the Symbian log parser class and implement
+        an "abld -what" analyser which sort the generated files by component. 
+    """
+    def __init__(self, _file):
+        """The constructor """
+        symbian.log.Parser.__init__(self, _file)
+        self.__match_what = re.compile(r"abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I)
+        self.__match_cmaker_what = re.compile(r"cmaker(\.cmd)?(\s+.*)*\s+ACTION=what", re.I)
+        self.files_per_component = {}
+        self.components_per_file = {}
+        
+    def task(self, name, _cmd, _dir, content):
+        """ Analyse task log. """
+        if _cmd != None and self.__match_what.match(_cmd) != None:
+            for line in content.splitlines():
+                line = line.strip()
+                if not os.path.normpath(line).startswith(os.path.sep):
+                    continue
+                # component per file
+                if line.lower() not in self.components_per_file:
+                    self.components_per_file[line.lower()] = []
+                if name not in self.components_per_file[line.lower()]:
+                    self.components_per_file[line.lower()].append(name)
+
+                # file per components
+                if name not in self.files_per_component:
+                    self.files_per_component[name] = []
+                self.files_per_component[name].append(line)
+        elif _cmd != None and self.__match_cmaker_what.match(_cmd) != None:
+            for line in content.splitlines():
+                line = line.strip()
+                if not line.startswith('"'):
+                    continue
+                if not line.endswith('"'):
+                    continue
+                line = os.path.normpath(line.strip('"')).lower()
+                # component per file
+                if line not in self.components_per_file:
+                    self.components_per_file[line] = []
+                if name not in self.components_per_file[line]:
+                    self.components_per_file[line].append(name)
+            
+                # file per components
+                if name not in self.files_per_component:
+                    self.files_per_component[name] = []
+                self.files_per_component[name].append(line)
+
+
+class PolicyValidator(object):
+    """ Validate policy files on a hierarchy. """    
+    def __init__(self, policyfiles=None, csvfile=None, ignoreroot=False):
+        """The constructor """
+        if policyfiles is None:
+            policyfiles = ['distribution.policy.s60']
+        self._policyfiles = policyfiles
+        self._ids = None
+        self._ignoreroot = ignoreroot
+
+    def load_policy_ids(self, csvfile):
+        """ Load the icds from the CSV file.
+            report format by generating array: ['unknownstatus', value, description]
+        """
+        self._ids = {}
+        reader = csv.reader(open(csvfile, "rU"))
+        for row in reader:            
+            if len(row)>=3 and re.match(r"^\s*\d+\s*$", row[0]): 
+                self._ids[row[0]] = row
+                if row[1].lower() != "yes" and row[1].lower() != "no" and row[1].lower() != "bin":
+                    yield ["unknownstatus", row[0], row[2]]
+
+    def validate_content(self, filename):
+        """  Validating the policy file content. If it cannot be decoded, 
+            it reports an 'invalidencoding'.            
+            Case 'notinidlist': value is not defined under the id list.
+        """
+        value = None
+        try:
+            value = fileutils.read_policy_content(filename)
+        except Exception:
+            yield ["invalidencoding", filename, None]
+        if value is not None:                        
+            if self._ids != None:
+                if value not in self._ids:
+                    yield ["notinidlist", filename, value]
+    
+    def find_policy(self, path):
+        """ find the policy file under path using filenames under the list. """
+        for filename in self._policyfiles:
+            if os.sep != '\\':
+                for f in os.listdir(path):
+                    if f.lower() == filename.lower():
+                        return os.path.join(path, f)
+            if os.path.exists(os.path.join(path, filename)):
+                return os.path.join(path, filename)
+        return None
+
+    def validate(self, path):
+        """ Return a list couple [errortype, location, policy].
+            errortype: missing, invalidencoding, notinidlist .
+            missing: location is a directory.
+            otherwise the doggie policy file.
+        """
+        path = os.path.normpath(path)
+        for dirpath, _, _ in os.walk(path):
+            # skipping the root
+            if dirpath == path and self._ignoreroot:
+                continue
+            # skip svn dirs
+            if pathaddition.match.ant_match(dirpath, "**/.svn/**"):
+                continue
+            # Skipping j2me content. Shouln't this be done differently?
+            if pathaddition.match.ant_match(dirpath, "**/j2me/**"):
+                continue
+            filename = self.find_policy(dirpath)
+            if filename != None:
+                for result in self.validate_content(filename):
+                    yield result
+            else:
+                yield ['missing', dirpath, None]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/integration/templatebuilder.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+#============================================================================ 
+#Name        : templatebuilder.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" The template builder. """
+import logging
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger('integration.templatebuilder')
+
+class TemplateBuilder:
+    """ This class implements a template builder.
+    """
+    
+    def __init__(self, config, product):
+        self._config = config
+        self._product = product
+        
+    def build(self):
+        """ Render all the templates for the current product. """
+        for config in self._config.getConfigurations(self._product, 'TemplateBuilder'):
+            self._build_config(config)
+
+    def __read_template(self, config):
+        """ Read the whole file content.
+        """
+        logger.info("Using template '%s'..." % config['template.file'])
+        ftr = open(config['template.file'], "r")
+        content = ftr.read()
+        ftr.close()
+        return content
+
+            
+    def _build_config(self, config):
+        """ Open config and render the template. """
+        if config.name != None:
+            logger.info("Building config '%s'..." % config.name)
+        logger.info("Creating file '%s'..." % config['output.file'])
+        output = open(config['output.file'], 'w+')        
+        output.write(config.interpolate(self.__read_template(config)))
+        output.close()
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/localisation.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,221 @@
+#============================================================================ 
+#Name        : localisation.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Localisation related function. 
+        * Parsing of languages.xml
+"""
+import re
+import amara
+import os
+import bsf
+import os.path
+
+class Languages:
+    """ Languages.xml file parser. """
+
+    def __init__(self, filename):
+        self.__filename = filename
+        self.__xml = amara.parse(open(filename,"r"))        
+    
+    def get_language_ids(self):
+        """ returns languages id list """
+        result = []
+        for language in self.__xml.xml_xpath("/languages/language"):
+            result.append(language.id.strip())
+        return result
+            
+
+    def get_name(self, lid):
+        """ returns languages id list """
+        for language in self.__xml.xml_xpath("/languages/language[@id='%s']" % lid):
+            return language.name.strip()
+
+    def get_attribute(self, lid, name, default=None):
+        """ returns the value for a specific language attribute name. It returns default if not found. """
+        for language in self.__xml.xml_xpath("/languages/language[@id='%s']/%s" % (lid, name)):
+            return language.xml_child_text.strip()
+        return default
+    
+    
+    def get_fallbacks(self, lid):        
+        """ Return the list of available fallbacks
+            None if not any.
+        """
+        string = self.get_attribute(lid, 'fallbacks')
+        if (string != None):
+            return string.split(',')
+        return None
+    
+    def find_first_fallback(self, lid, exists):
+        """ Find recursively the first reasonable alternative
+            lid the language id
+            exists an existance function that takes a language id
+            as parameter and return a boolean
+        """
+        
+        if (exists(lid)):
+            return lid
+        
+        # get fallback list
+        fallbacks = self.get_fallbacks(lid)
+        if fallbacks == None:
+            return None
+        
+        for fallback in fallbacks:
+            if exists(fallback):
+                return fallback
+        
+        for fallback in fallbacks:
+            ffallback = self.find_first_fallback(fallback)
+            if ffallback != None:
+                return ffallback
+
+        return None
+        
+
+
+def get_all_variations(languages_xml):
+    """ Returns a list of all regional variations supported by platform. """
+    variations = {'western':1}
+    xml = Languages(languages_xml)
+    for lid in xml.get_language_ids():
+        variations[xml.get_attribute(lid, 'core', 'western')] = 1
+    return variations.keys()
+
+def get_languages_for_variation(languages_xml, variation='western'):
+    """ Returns alist of all supported languages for a specific region. """
+    xml = Languages(languages_xml)
+    result = []
+    for lid in xml.get_language_ids():
+        if (xml.get_attribute(lid, 'core', 'western') == variation):
+            result.append(lid)
+    return result
+
+
+def _apply_override(overrides, line):
+    res = re.match(r'\s*(data|file)=\s*(\S+)\s+(\S+)', line)
+    if res != None and overrides.has_key(res.group(3).lower()):
+        print "OVERRIDE: %s => %s" % (res.group(2), overrides[res.group(3).lower()])         
+        return "%s=%s %s" % (res.group(1), overrides[res.group(3).lower()], res.group(3))
+    return line 
+        
+
+def create_locales_iby(product, lid, flags=None, prefix='', suffix=''):
+    """ Function that generates locales_xx.iby into rom product folder.
+    """
+    if flags is None:
+        flags = []
+    bsfs = bsf.read_all()
+    if not bsfs.has_key(product):
+        raise Exception("Product not defined, could not find %s.bsf" % product)
+    
+    variantpath = bsfs[product].get_path()
+    if lid == "sc":
+        return
+    outputfile = "/epoc32/rom/%s/locales_%s.iby" % (variantpath, lid)
+    
+    print ("Generating %s..." % outputfile)
+
+    
+    output = open (outputfile, "w+")
+    output.write("#ifndef __LOCALES_%s_IBY__\n" % lid)
+    output.write("#define __LOCALES_%s_IBY__\n" % lid)
+    
+    args = ''
+    configs = bsfs[product].get_path_as_array()
+    configs.reverse()
+    for customisation in configs:
+        args += "-I \"./%s\" " % bsfs[customisation].get_path()
+        args += "-I \"../include/%s\" " % bsfs[customisation].get_path()
+    
+    args += "-I ..\\include\\oem"
+    for flag in flags:
+        args = args + " -D%s" % flag
+    
+    cdir = os.curdir
+    os.chdir ("/epoc32/rom")
+    cmd = "cpp -nostdinc -u %s %s include\\locales_sc.iby -include .\\include\\header.iby %s" % (prefix, args, suffix)
+    print ("Calling %s\n" % cmd)
+    stdin, stdout, stderr = os.popen3(cmd)
+    stdin.close()
+    result = stdout.read()
+    errors =  stderr.read()
+    stderr.close()
+    status = stdout.close() or 0
+    
+    print errors
+
+    # parsing overrides first    
+    overrides = {}
+    for line in result.splitlines():
+        res = re.match(r'^\s*(?:ROM_IMAGE\[\d+\]\s+)?data-override\s*=\s*(\S+)\s+(\S+)', line)
+        if res != None:
+            print "Found override directive %s -> %s" % (res.group(2).lower(), res.group(1))
+            overrides[res.group(2).lower()] = res.group(1)
+        
+    for line in result.splitlines():        
+        if re.match(r'^\s*(ROM_IMAGE\[\d+\]\s+)?data-override\s*=\s*(\S+)\s+(\S+)', line):            
+            pass
+        else:
+            line = _apply_override(overrides, line)
+            if re.match("^\\s*data\\s*=\\s*MULTI_LINGUIFY", line):
+                res = re.search(r"MULTI_LINGUIFY\s*\(\s*(\S+)\s+(\S+)\s+(\S+)\s*\)", line)
+                if res.group(1).lower() == "rsc":
+                    ext = "r%s" % lid
+                    output.write("data=%s.%s %s.%s\n" % (res.group(2), res.group(1), res.group(3), ext))
+                else:
+                    print "WARNING: Cannot extract '%s'" % line
+            
+            elif re.search(r"\.rsc", line, re.I) != None:
+                output.write(re.sub(r"\.[rR][sS][cC]", r".r%s" % lid, line) + "\n")
+            elif re.search(r"\.dbz", line, re.I):
+                output.write(re.sub(r"\.[dD][bB][zZ]", r".d%s" % lid, line) + "\n")
+            elif re.search(r"\.hlp", line, re.I):
+                output.write(re.sub(r"\.[hH][lL][pP]", r".h%s" % lid, line) + "\n")
+            elif re.search(r"Content\\01", line, re.I):
+                #rename Content\01 to Content\xx (where xx is language id). This is for handlng DTD files
+                output.write(re.sub(r"Content\\01", r"Content\\%s" % lid, line) + "\n")
+            elif re.search(r"\.o0001", line, re.I):
+                lang = lid
+                while (len(lang)<4):
+                    lang = "0%s" % lang
+                output.write(re.sub(r"\.[oO]\d+", ".o%s" % lang, line) + "\n")
+            elif re.search(r"elocl\.dll", line, re.I):
+                output.write(re.sub(r"\.[lL][oO][cC]|\.[dD][lL][lL]", ".%s" % lid, line) + "\n")
+            elif re.search(r"^\s*(data|file)=", line, re.I):
+                print ("WARNING: This should not be included in resource.iby '%s'\nThis file should be included using an 'applicationnameVariant.iby' file.\n" % line)
+    output.write("#endif\n")
+    output.close()
+    os.chdir(cdir)
+    return status    
+
+
+
+VARIANT_ID_KEY = 'variant.id'
+VARIATION_DIR_KEY = 'variation.dir'
+
+def find_variant_path(config, key=VARIANT_ID_KEY):
+    """ This function helps to find the variant directory
+        using variant configuration
+    """
+    if config.has_key(VARIATION_DIR_KEY) and os.path.exists(config[VARIATION_DIR_KEY]):
+        for directory in os.listdir(config[VARIATION_DIR_KEY]):
+            if (config.has_key(key) and re.match(r".*_%s$" % config[key], directory) != None):
+                return os.path.join(config[VARIATION_DIR_KEY], directory)
+    return None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/log2xml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,416 @@
+#============================================================================ 
+#Name        : log2xml.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Symbian log converter.
+"""
+import xml.dom.minidom
+import sys
+import os
+import re
+import shutil
+import codecs
+import time
+import datetime
+from xml.sax import make_parser 
+from xml.sax.handler import ContentHandler 
+from xml.sax.saxutils import escape
+
+
+DEFAULT_CONFIGURATION = {"FATAL": [r"mingw_make.exe"],
+                         "ERROR": [r'^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:',
+                                   r"^MISSING:",
+                                   r"Error:\s+",
+                                   r"^Error:",
+                                   r"'.+' is not recognized as an internal or external command",
+                                   r"FLEXlm error:",
+                                   r"(ABLD|BLDMAKE) ERROR:",
+                                   r"FATAL ERROR\(S\):",
+                                   r"fatal error U1077",
+                                   r"warning U4010",
+                                   r"^make(?:\[\d+\])?\: \*\*\*",
+                                   r"^make(?:\[\d+\])?:\s+.*\s+not\s+remade",
+                                   r"\"(.*)\", line (\d+): (Error: +(.\d+.*?):.*)$",
+                                   r"error: ((Internal fault):.*)$",
+                                   r"Exception: [A-Z0-9_]+",
+                                   r"target .* given more than once in the same rule",
+                                   r"^ERROR:",
+                                   r"^ERROR EC\d+:",
+                                   r"^ERROR\t",
+                                   r"syntax error at line",],
+                         "CRITICAL": [r"[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049)"],
+                         "WARNING": [r'\): Missing file:',
+                                      r'^(\d+\))?\s*WARNING:', r'^MAKEDEF WARNING:',
+                                      r'line \d+: Warning:', r':\s+warning\s+\w+:',
+                                      r"\\\\(.*?)\(\d+\)\s:\sWarning:\s\(\d+\)",
+                                      r"^(BLDMAKE |MAKEDEF )?WARNING:",
+                                      r"WARNING\(S\)",
+                                      r"\(\d+\) : warning C",
+                                      r"LINK : warning",
+                                      r":\d+: warning:",
+                                      r"\"(.*)\", line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)$",
+                                      r"Usage Warning:",
+                                      r"mwld.exe:",
+                                      r"^Command line warning",
+                                      r"ERROR: bad relocation:",
+                                      r"^(\d+) warning",
+                                      r"EventType:\s+Error\s+Source:\s+SweepNT",
+                                      r"^WARN\t",
+                                      ],
+                        "REMARK": [r"Command line warning D4025 : ",
+                                   r"^REMARK: ",
+                                   r"^EventType:\s+Error\s+Source:\s+GNU\s+Make",
+                                   r":\d+: warning: cannot find matching deallocation function",
+                                   r"((:\d+)*: note: )",
+                                   ],
+                        "INFO": [r"^INFO:"]
+                        }
+
+
+def find_priority(line, config):
+    keys = config.keys()
+    keys.reverse()    
+    for category in keys:
+        for rule in config[category]:
+            if rule.search(line) != None:
+                return category.lower()
+    return "stdout"
+
+class Stack:
+    """ Bottomless stack. If empty just pop a default element. """
+    
+    def __init__(self, default):
+        self.__default = default
+        self.__stack = []
+  
+    def pop(self):
+        result = None
+        try:
+            result = self.__stack.pop()
+        except IndexError, e:
+            result = self.__default
+        return result
+  
+    def push(self, item):
+        self.__stack.append(item)
+  
+    def __len__(self):
+        return len(self.__stack)
+
+def to_cdata(text):
+    """ Cleanup string to match CDATA requiements.
+        These are the only allowed characters: #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF].
+    """
+    result = ""
+    for c in list(text):
+        v = ord(c)        
+        if v == 0x9 or v == 0xa or v == 0xd:
+            result += c
+        elif v>=0x20 and v <= 0xd7ff:
+            result += c
+        elif v>=0xe000 and v <= 0xfffd:
+            result += c
+        elif v>=0x10000 and v <= 0x10ffff:
+            result += c
+        else:
+            result += " " 
+    return result
+
+class LogWriter(object):
+    """ XML Log writer. """
+    
+    def __init__(self, stream, filename):
+        self.__stream = stream
+        self.__stream.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
+        self.__stream.write("<log filename=\"%s\">\n" % filename)
+        self.__stream.write("\t<build>\n")
+        self.__indent = "\t"
+        self.__intask = 0
+
+    def close(self):
+        # closing open tasks...
+        while self.__intask > 0:
+            self.close_task()
+        self.__stream.write("\t</build>\n")
+        self.__stream.write("</log>\n")
+        self.__stream.close()
+
+    def open_task(self, name):
+        self.__indent += "\t"
+        self.__intask += 1
+        self.__stream.write("%s<task name=\"%s\">\n" % (self.__indent, name))
+
+    def close_task(self):
+        if self.__intask > 0:
+            self.__intask -= 1
+            self.__stream.write("%s</task>\n" % (self.__indent))
+            self.__indent = self.__indent[:-1]
+    
+    def message(self, priority, msg):
+        try:
+            acdata = to_cdata(msg.decode('utf-8', 'ignore'))
+            self.__stream.write("%s<message priority=\"%s\"><![CDATA[%s]]></message>\n" % (self.__indent+"\t", priority, acdata))
+        except UnicodeDecodeError, e:
+            print e
+        
+
+
+def convert(inputfile, outputfile, fulllogging=True, configuration=DEFAULT_CONFIGURATION):
+    """ Convert an input log into an XML log and write an outputfile. """
+    
+    # Compiling the regexp  
+    built_config = {}
+    for category in configuration.keys():
+        built_config[category] = []
+        for rule in configuration[category]:
+            built_config[category].append(re.compile(rule))
+    
+    # Generating the XML log
+    log = open(inputfile, 'r')
+    olog = codecs.open(outputfile, 'w+', 'utf-8', errors='ignore')
+    xmllog = LogWriter(olog, inputfile)
+
+    
+    match_finnished = re.compile(r"^===\s+.+\s+finished") 
+    match_started = re.compile(r"^===\s+(.+)\s+started") 
+    match_component = re.compile(r"^===\s+(.+?)\s+==\s+(.+)")
+    match_logger_component = re.compile(r'^\s*\[.+?\]\s*')
+    #match_ant_target_start = re.compile(r'.*INFO\s+-\s+Target\s+####\s+(.+)\s+####\s+has\s+started')
+    #match_ant_target_end = re.compile(r'.*INFO\s+-\s+Target\s+####\s+(.+)\s+####\s+has\s+finnished')
+    match_ant_target_start = re.compile(r'^([^\s=\[\]]+):$')
+    match_ant_target_end = re.compile(r'^([^\s=]+):\s+duration')
+    symbian = False
+    ant_has_open_task = False
+    # looping
+    for line in log:
+                
+        # matching Ant logging
+        if not symbian and match_ant_target_end.match(line):
+            xmllog.close_task()
+            ant_has_open_task = False
+            continue
+        elif not symbian and match_ant_target_start.match(line):
+            result = match_ant_target_start.match(line)
+            if result != None:
+                if ant_has_open_task:
+                    xmllog.close_task()
+                    ant_has_open_task = False
+                xmllog.open_task(result.group(1))
+                ant_has_open_task = True
+            continue
+        # matching Symbian logging
+        line = match_logger_component.sub(r'', line)
+        line = line.strip()
+        if line.startswith("++ Finished at"):
+            xmllog.close_task()
+        elif line.startswith("=== "):
+            if match_finnished.match(line):
+                xmllog.close_task()
+            else:
+                # This is a symbian log
+                symbian = True
+                result = match_component.match(line)
+                if result != None:
+                    xmllog.open_task(result.group(2))
+                # === cenrep_s60_32 started
+                result = match_started.match(line)
+                if result != None:
+                    xmllog.open_task(result.group(1))
+        else:
+            # Type?
+            priority = find_priority(line, built_config)
+            if (fulllogging or priority != 'stdout'):
+                xmllog.message(priority, line)
+    # end file
+    xmllog.close()
+    
+def convert_old(inputfile, outputfile, fulllogging=True, configuration=DEFAULT_CONFIGURATION):
+    """ Convert an input log into an XML log and write an outputfile. """
+    
+    # Compiling the regexp  
+    built_config = {}
+    for category in configuration.keys():
+        built_config[category] = []
+        for rule in configuration[category]:
+            built_config[category].append(re.compile(rule))
+    
+    # Generating the XML log
+    log = open (inputfile, 'r')
+    doc = xml.dom.minidom.Document()
+    root = doc.createElementNS("", "log")
+    root.setAttributeNS("", "name", inputfile)
+    doc.appendChild(root)
+    build = doc.createElementNS("", "build")
+    root.appendChild(build)
+    # current group/task
+    current = build
+    # bottomless stask, if losing sync all message will be at top level.
+    stack = Stack(build)
+    
+    match_finnished = re.compile(r"^===\s+.+\s+finished") 
+    match_started = re.compile(r"===\s+(.+)\s+started") 
+    match_component = re.compile(r"^===\s+(.+?)\s+==\s+(.+)")
+    match_logger_component = re.compile(r'^\s*\[.+?\]\s*')
+    #match_ant_target_start = re.compile(r'.*INFO\s+-\s+Target\s+####\s+(.+)\s+####\s+has\s+started')
+    #match_ant_target_end = re.compile(r'.*INFO\s+-\s+Target\s+####\s+(.+)\s+####\s+has\s+finnished')
+    match_ant_target_start = re.compile(r'^([^\s=]+):$')
+    match_ant_target_end = re.compile(r'^([^\s=]+):\s+duration')
+    # looping
+    for line in log:
+                
+        # matching Ant logging
+        if match_ant_target_end.match(line):
+            current = stack.pop()
+            continue
+        elif match_ant_target_start.match(line):
+            result = match_ant_target_start.match(line)
+            if result != None:
+                stack.push(current)
+                task = doc.createElementNS("", "task")
+                task.setAttributeNS("", "name", result.group(1))
+                current.appendChild(task)
+                current = task
+            continue
+        # matching Symbian logging
+        line = match_logger_component.sub(r'', line)
+        line = line.strip()
+        if line.startswith("++ Finished at"):
+            current = stack.pop()
+        elif line.startswith("==="):
+            if match_finnished.match(line):
+                current = stack.pop()
+            else:
+                result = match_component.match(line)
+                if result != None:
+                    stack.push(current)
+                    task = doc.createElementNS("", "task")
+                    task.setAttributeNS("", "name", result.group(2))
+                    current.appendChild(task)
+                    current = task
+                # === cenrep_s60_32 started
+                result = match_started.match(line)
+                if result != None:
+                    task = doc.createElementNS("", "task")
+                    task.setAttributeNS("", "name", result.group(1))
+                    stack.push(current)
+                    current.appendChild(task)
+                    current = task
+        else:
+            msg = doc.createElementNS("", "message")
+            # Type?
+            priority = find_priority(line, built_config)
+            if (fulllogging or priority != 'stdout'):
+                msg.setAttributeNS("", "priority", priority)
+                msg.appendChild(doc.createCDATASection(to_cdata(line.decode("utf-8"))))
+                current.appendChild(msg)
+        
+    file_object = codecs.open(outputfile, 'w', "utf_8")
+    file_object.write(doc.toprettyxml())
+    file_object.close()
+
+class ContentWriter(ContentHandler):
+    """ SAX Content writer. Parse and write an XML file. """
+    def __init__(self, os, indent=""):
+        self.os = os
+        self.indent = indent
+        self.__content = u""
+    
+    def startElement(self, name, attrs):
+        self.os.write(self.indent + "<" + name)        
+        if attrs.getLength() > 0:
+            self.os.write(" ")        
+        self.os.write(" ".join(map(lambda x: "%s=\"%s\"" % (x, attrs.getValue(x)), attrs.getNames())))            
+        self.os.write(">\n")
+        self.indent += "\t"
+        self.__content = ""
+    
+    def endElement(self, name):
+        if len(self.__content) > 0:
+            self.os.write(self.indent + self.__content + "\n")                
+        self.indent = self.indent[:-1]
+        self.os.write("%s</%s>\n" % (self.indent, name))
+        self.__content = ""
+        
+    def characters(self, content):        
+        self.__content += unicode(escape(content.strip()))
+
+class AppendSummary(ContentWriter):
+    """ SAX content handler to add an XML log to the summary. """
+    def __init__(self, output, xmllog):
+        ContentWriter.__init__(self, output)
+        self.xmllog = xmllog
+
+    def startDocument(self):
+        self.os.write('<?xml version="1.0" encoding="utf-8"?>\n')
+    
+    def startElement(self, name, attrs):
+        ContentWriter.startElement(self, name, attrs)
+        if name == "logSummary":
+            parser = make_parser()
+            parser.setContentHandler(ContentWriter(self.os, self.indent))
+            parser.parse(open(self.xmllog, 'r'))
+    
+
+def append_summary(summary, xmllog, maxmb=80):
+    """ Append content to the summary xml file. """
+    if os.path.getsize(summary) + os.path.getsize(xmllog) > (maxmb*1024*1024):
+        print 'Error: ' + summary + ' larger than ' + str(maxmb) + 'MB, not appending'
+        return
+    
+    outfile = codecs.open(summary + ".tmp", 'w', "utf8")
+    parser = make_parser()
+    parser.setContentHandler(AppendSummary(outfile, xmllog))
+    
+    input = open(summary, 'r')
+    parser.parse(input)
+    input.close()
+    outfile.close()
+    # Updating the summary file.
+    os.unlink(summary)
+    os.rename(summary + ".tmp", summary)    
+    
+
+def symbian_log_header(output, config, command, dir):
+    output.log("===-------------------------------------------------")
+    output.log("=== %s" % config)
+    output.log("===-------------------------------------------------")
+    output.log("=== %s started %s" % (config, datetime.datetime.now().ctime()))
+    output.log("=== %s == %s" % (config, dir))
+    output.log("-- %s" % command)
+    output.log("++ Started at %s" % datetime.datetime.now().ctime())
+    output.log("+++ HiRes Start %f" % time.time())
+    output.log("Chdir %s" % dir)
+    
+
+def symbian_log_footer(output):
+    output.log("+++ HiRes End %f" % time.time())
+    output.log("++ Finished at %s" % datetime.datetime.now().ctime())
+    
+    
+if __name__ == "__main__":
+    convert(sys.argv[1], "%s.xml" % sys.argv[1], fulllogging=False)
+    """ An empty summary:
+        <?xml version=\"1.0\" encoding=\"UTF-8\"?><logSummary/>
+    """
+    #s = open(r"z:\summary.xml", "w")
+    #s.write("""<?xml version=\"1.0\" encoding=\"UTF-8\"?><logSummary/>""")
+    #s.close()
+    #append_summary(r'Z:\summary.xml', r'Z:\output\logs\test_0.0.1.mc_5132_2_build.log2.xml')
+    #append_summary(r'Z:\summary.xml', r'Z:\output\logs\test_0.0.1_BOM.xml')
+    
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/nokia/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/nokia/gscm.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,71 @@
+#============================================================================ 
+#Name        : gscm.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Wrapper module that get CCM info using GSCM framework. """
+
+
+import logging
+import os
+import subprocess
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger("gscm")
+
+
+def _execute(command):
+    """ Runs a command and returns the result data. """
+    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    output = process.stdout.read()
+    process.poll()
+    status = process.returncode
+    return (output, status)
+
+
+def __get_gscm_info(method, dbname):
+    """ Generic method that call function 'method' on GSCM wrapper script. """
+    command = "perl " + os.path.join(os.environ['HELIUM_HOME'], "tools/common/bin/get_gscm_info.pl")
+    command += " %s %s" % (method, dbname)    
+    _logger.debug("Running command: %s" % command)
+    (output, status) = _execute(command)
+    _logger.debug("Status: %s" % status)
+    _logger.debug("Output: %s" % output)
+    if status == 0 or status == None and not ("Can't locate" in output):
+        return output.strip()
+    if not 'HLM_SUBCON' in os.environ:
+        raise Exception("Error retrieving get_db_path info for '%s' database.\nOUTPUT:%s" % (dbname, output.strip()))
+    return None
+
+def get_db_path(dbname):
+    """ Returns the database path for dbname database. """
+    _logger.debug("get_db_path: %s" % dbname)
+    return __get_gscm_info('get_db_path', dbname)
+
+
+def get_router_address(dbname):
+    """ Returns the database router address for dbname database. """
+    _logger.debug("get_router_address: %s" % dbname)
+    return __get_gscm_info('get_router_address', dbname)
+
+
+def get_engine_host(dbname):
+    """ Returns the database engine host for dbname database. """
+    _logger.debug("get_engine_host: %s" % dbname)
+    return __get_gscm_info('get_engine_host', dbname)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/nokia/nokiaccm.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,147 @@
+#============================================================================ 
+#Name        : nokiaccm.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Nokia specific interface to Synergy sessions. """
+
+import logging
+import netrc
+import os
+import os.path
+import sys
+import fileutils
+
+import ccm
+import nokia.gscm
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger("nokia.nokiaccm")
+
+
+def open_session(username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
+    """Provides a Session object.
+    
+    Attempts to return a Session, based either on existing Synergy
+    sessions or by creating a new one.
+    
+    - If a .netrc file can be found on the user's personal drive,
+      that will be read to obtain Synergy login information if it 
+      is defined there. This will be used to fill in any missing 
+      parameters not passed in the call to open_session().
+      
+      The format of the .netrc file entries should be:
+      
+      machine synergy login USERNAME password foobar account DATABASE_PATH@SERVER
+      
+      If the details refer to a specific database, the machine can be the database name,
+      instead of "synergy".
+    - If an existing session is running that matches the supplied
+      parameters, it will reuse that.
+    
+    """    
+    # See if a .netrc file can be used
+    if password == None or username == None or engine == None or dbpath == None:
+        if os.sep == '\\':
+            os.environ['HOME'] = "H:" + os.sep
+        _logger.debug('Opening .netrc file')
+        try:
+            netrc_file = netrc.netrc()
+            netrc_info = None
+            # If settings for a specific database 
+            if database != None:
+                netrc_info = netrc_file.authenticators(database)            
+
+            # if not found just try generic one
+            if netrc_info == None:
+                netrc_info = netrc_file.authenticators('synergy')
+                
+            if netrc_info != None:
+                (n_username, n_account, n_password) = netrc_info
+                if username == None:
+                    username = n_username
+                if password == None:
+                    password = n_password
+                if n_account != None:
+                    (n_dbpath, n_engine) = n_account.split('@')
+                    if dbpath == None and n_dbpath is not None:
+                        _logger.info('Database path set using .netrc (%s)' % n_dbpath)
+                        dbpath = n_dbpath
+                    if engine == None and n_engine is not None:
+                        _logger.info('Database engine set using .netrc (%s)' % n_engine)
+                        engine = n_engine
+        except IOError:
+            _logger.debug('Error accessing .netrc file')
+
+    # using environment username in case username is not defined.
+    if username == None:
+        username = os.environ['USERNAME']
+
+    # looking for dbpath using GSCM database
+    if dbpath == None and database != None:
+        _logger.info('Database path set using the GSCM database.')
+        dbpath = nokia.gscm.get_db_path(database)        
+
+    # looking for engine host using GSCM database
+    if engine == None and database != None:
+        _logger.info('Database engine set using the GSCM database.')
+        engine = nokia.gscm.get_engine_host(database)
+            
+    
+    _sessions = []
+    # See if any currently running sessions can be used, only if no password submitted, else use a brand new session!
+    if password == None and reuse:
+        current_sessions = ccm.running_sessions()
+        for current_session in current_sessions:
+            if current_session.dbpath == dbpath:
+                return current_session
+    else:
+        if ccm.CCM_BIN == None:
+            raise ccm.CCMException("Could not find CM/Synergy executable in the path.")
+        # Looking for router address using GSCM database
+        router_address = None
+        if database == None and dbpath != None:
+            database = os.path.basename(dbpath)
+
+        lock = fileutils.Lock(ccm.CCM_SESSION_LOCK)
+        try:
+            lock.lock(wait=True)
+            # if we have the database name we can switch to the correct Synergy router
+            if database != None:
+                router_address = nokia.gscm.get_router_address(database)
+                if os.sep == '\\' and router_address != None:
+                    routerfile = open(os.path.join(os.path.dirname(ccm.CCM_BIN), "../etc/_router.adr"), 'r')
+                    current_router = routerfile.read().strip()
+                    routerfile.close()
+                    if current_router != router_address.strip():
+                        _logger.info('Updating %s' % (os.path.normpath(os.path.join(os.path.dirname(ccm.CCM_BIN), "../etc/_router.adr"))))
+                        routerfile = open(os.path.join(os.path.dirname(ccm.CCM_BIN), "../etc/_router.adr"), "w+")
+                        routerfile.write("%s\n" % router_address)
+                        routerfile.close()
+        
+            # If no existing sessions were available, start a new one
+            new_session = ccm.Session.start(username, password, engine, dbpath)
+            lock.unlock()
+            return new_session
+        finally:
+            lock.unlock()
+    raise ccm.CCMException("Cannot open session for user '%s'" % username)
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/parsedatalistening.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,143 @@
+#============================================================================ 
+#Name        : parsedatalistening.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import urllib
+import gzip
+import tempfile
+import os
+import sys
+import xml.etree.ElementTree as ElementTree
+from processing import Pool, freezeSupport
+
+class Target:
+    def __init__(self, name, start, end):
+        self.name = name
+        self.start = start
+        self.end = end
+      
+class Build:
+    def __init__(self, id, user, success, targets):
+        self.id = id
+        self.user = user
+        self.success = success
+        self.targets = targets
+
+def parseXml(infile):
+    f = gzip.open(infile, 'r')
+    success = True
+    username = ''
+    targets = []
+    for event, elem in ElementTree.iterparse(f):
+        if elem.tag == 'build':
+            name = elem.get('status')
+            if name != 'successful':
+                success = False
+        if elem.tag == 'target':
+            name = elem.get('name')
+            id = elem.get('id')
+            if name != None:
+                targets.append(Target(name, id, 0))
+        if elem.tag == 'targetRef':
+            ref = elem.get('reference')
+            if ref != None:
+                for t in targets:
+                    if t.start == ref:
+                        t.start = int(elem.get('startTime'))
+                        t.end = int(elem.get('endTime'))
+        if elem.tag == 'property':
+            if elem.get('name') == 'user.name':
+                username = elem.get('value')
+            
+        elem.clear()
+    
+    f.close()
+
+    return Build(infile, username, success, targets)
+
+if __name__ == '__main__':
+    freezeSupport()
+        
+    outdir = os.path.join(tempfile.gettempdir(), 'helium_data')
+    if not os.path.exists(outdir):
+        os.mkdir(outdir)
+    
+    files = []
+    pool = Pool()
+    
+    for n in range(1, 100):
+    
+        try:
+            #r'C:\USERS\helium\helium_data'
+            infile = os.path.join(outdir, '%(#)08d_data.xml.gz' % {"#": n})
+            #print infile
+            if not os.path.exists(infile):
+                urllib.urlretrieve("http://helium.nmp.nokia.com/data/internaldata/%(#)08d_data.xml.gz" % {"#": n}, infile)
+            
+            files.append(infile)
+    
+        except Exception, e:
+            print e
+    
+    builds = pool.map(parseXml, files)
+    
+    targets = {}
+    targetsfailing = {}
+    users = {}
+    
+    for build in builds:
+
+        if users.has_key(build.user):
+            users[build.user] = users[build.user] + 1
+        else:
+            users[build.user] = 1
+        
+        for value in build.targets:
+            #print build.targets
+            #value = build.targets.pop()
+            #print value.name
+            #print (value.end - value.start)/1000
+                
+            if targets.has_key(value.name):
+                #targets[value.name] = targets[value.name] + 1
+                (no, time) = targets[value.name]
+                targets[value.name] = (no + 1, time + (value.end - value.start))
+            else:
+                targets[value.name] = (1, (value.end - value.start))
+            
+            if not build.success:
+                if targetsfailing.has_key(value.name):
+                    targetsfailing[value.name] = targetsfailing[value.name] + 1
+                else:
+                    targetsfailing[value.name] = 1
+    
+    print 'Users:'
+        
+    for key in users.keys():
+        print '%05d' % users[key] + ' ' + key
+    
+    print 'Calls,Targets,TimeSeconds'
+    
+    for key in targets.keys():
+        (no, time) = targets[key]
+        print '%05d' % no + ',' + key + ',%07d' % int(time/1000)
+    
+    print 'Targets failing:'
+    
+    for key in targetsfailing.keys():
+        print '%05d' % targetsfailing[key] + ' ' + key
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/pathaddition/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/pathaddition/match.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,110 @@
+#============================================================================ 
+#Name        : match.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This module provides support for Ant-style wildcards,
+    which are not the same as regular expressions (which are documented in the re module).
+"""
+import os
+import pathaddition.relative
+import logging
+import fnmatch
+import re
+import sys
+
+_logger = logging.getLogger('path.match')
+#logging.basicConfig()
+
+# local regular expression cache.
+_cache = {}
+
+def ant_match(name, pattern, casesensitive=True):
+    """Check if name matches pattern (Ant-style wildcards).
+    """
+    _logger.debug("ant_match: path='%s' pattern='%s'" % (name, pattern))
+    if pattern.endswith('/') or pattern.endswith('\\'):
+        pattern = pattern + '**'
+        _logger.debug("ant_match: pattern ending with / or \ pattern='%s'" % (pattern))
+    name = os.path.normpath(name)
+    pattern = os.path.normpath(pattern)
+    name = name.replace('/', os.sep)
+    name = name.replace('\\', os.sep)
+    pattern = pattern.replace('/', os.sep)
+    pattern = pattern.replace('\\', os.sep)
+    _logger.debug("ant_match:normpath: path='%s' pattern='%s'" % (name, pattern))
+    
+    if not _cache.has_key(pattern):
+        res = translate(pattern)
+        _logger.debug("ant_match: regexp=%s" % (res))
+        if os.sep == '\\' or not casesensitive:
+            _cache[pattern] = re.compile(res, re.I)
+        else:
+            _cache[pattern] = re.compile(res)
+    return _cache[pattern].match(name) is not None
+
+
+def translate(pat):
+    """Translate a Ant-style PATTERN to a regular expression.
+
+    There is no way to quote meta-characters.
+    """
+
+    i, n = 0, len(pat)
+    res = ''
+    while i < n:
+        c = pat[i]
+        i = i+1
+        if c == '*':
+            # identifying a **
+            if i < len(pat) and pat[i] == '*':
+                res = res + "(?:(?:^|%s)[^%s]+)*(?:^|%s|$)" % (os.sep.replace('\\','\\\\'), os.sep.replace('\\','\\\\'), os.sep.replace('\\','\\\\'))
+                i = i+1
+                # skipping next \ or / 
+                if i < len(pat) and pat[i] == os.sep:
+                    i = i+1
+            else:
+                res = res + '[^%s]*' % os.sep.replace('\\','\\\\')
+        elif c == '?':
+            res = res + '[^%s]*' % os.sep.replace('\\','\\\\')
+        elif c == '[':
+            j = i
+            if j < n and pat[j] == '!':
+                j = j+1
+            if j < n and pat[j] == ']':
+                j = j+1
+            while j < n and pat[j] != ']':
+                j = j+1
+            if j >= n:
+                res = res + '\\['
+            else:
+                stuff = pat[i:j].replace('\\','\\\\')
+                i = j+1
+                if stuff[0] == '!':
+                    stuff = '^' + stuff[1:]
+                elif stuff[0] == '^':
+                    stuff = '\\' + stuff
+                res = '%s[%s]' % (res, stuff)
+        else:
+            
+            if c == os.sep and i+2 <= len(pat) and pat[i] == "*" and pat[i+1] == "*":
+#                res = res + "?"
+                pass
+            else:
+                res = res + re.escape(c)
+    return res + "$"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/pathaddition/relative.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,129 @@
+#============================================================================ 
+#Name        : relative.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+    Additional path functionnality.
+    abs2rel
+    rel2abs
+"""
+import os
+import os.path
+import re
+
+# matches http:// and ftp:// and mailto://
+protocolPattern = re.compile(r'^\w+://')
+
+def isabs(string):
+    """ 
+    
+    @return true if string is an absolute path or protocoladdress
+    for addresses beginning in http:// or ftp:// or ldap:// - 
+    they are considered "absolute" paths.
+    """
+    if protocolPattern.match(string): 
+        return True
+    return os.path.isabs(string)
+
+def rel2abs(path, base = None):
+    """ converts a relative path to an absolute path.
+
+    @param path the path to convert - if already absolute, is returned
+    without conversion.
+    @param base - optional. Defaults to the current directory.
+    The base is intelligently concatenated to the given relative path.
+    @return the relative path of path from base
+    """
+    if isabs(path):
+        return path
+    if base is None:
+        base = os.curdir
+    retval = os.path.join(base, path)
+    return os.path.abspath(retval)
+    
+
+def pathsplit(p, rest=None):
+    """ Split path to pieces """
+    if rest is None:
+        rest = []
+    (h, t) = os.path.split(p)
+    if len(h) < 1: 
+        return [t]+rest
+    if len(t) < 1: 
+        return [h]+rest
+    return pathsplit(h, [t]+rest)
+
+def commonpath(l1, l2, common=None):
+    """ return the common path"""
+    if common is None:
+        common = []
+    if len(l1) < 1:
+        return (common, l1, l2)
+    if len(l2) < 1:
+        return (common, l1, l2)
+    if l1[0] != l2[0]:
+        return (common, l1, l2)
+    return commonpath(l1[1:], l2[1:], common+[l1[0]])
+
+
+def relpath(p1, p2):
+    (common, l1, l2) = commonpath(pathsplit(p1), pathsplit(p2))
+    p = []
+    if len(l1) > 0:
+        p = [ '../' * len(l1) ]
+    p = p + l2
+    if len(p) is 0:
+        return "."
+    return os.path.join( *p )
+    
+    
+def abs2rel(path, base = None):
+    """ @return a relative path from base to path.
+    
+    base can be absolute, or relative to curdir, or defaults
+    to curdir.
+    """
+    if protocolPattern.match(path):
+        return path
+    if base is None:
+        base = os.curdir
+    base = rel2abs(base)
+    path = rel2abs(path) # redundant - should already be absolute
+    return relpath(base, path)
+
+
+def commonprefix(paths):
+    """ 
+    Returns the common prefix base on the path components.
+    """
+    if len(paths) == 0:
+        return ''
+    if len(paths) == 1:
+        return paths[0]
+
+    def _commonprefix_internal(p1, p2):
+        c = commonpath(pathsplit(p1), pathsplit(p2))[0]
+        if len(c) == 0:
+            return ''
+        return os.path.join(*c)
+    common = _commonprefix_internal(paths[0], paths[1])
+    for p in paths[2:]:
+        common = _commonprefix_internal(common, p)
+    return common
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/precompile.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+#============================================================================ 
+#Name        : precompile.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import os
+import py_compile
+import sys
+from optparse import OptionParser
+
+module_list = ['buildtools.py', 'CreateZipInput.py', 'fileutils.py', 'configuration.py', 'archive\\tools.py', 'archive\\selectors.py', 
+				'archive\\scanners.py', 'archive\\mappers.py', 'archive\\builders.py', 'archive\\__init__.py' ]
+def main():
+    """ The application main. """
+    cli = OptionParser(usage="%prog [options]")
+    cli.add_option("--modulepath", help="input text to display") 
+                   
+    opts, dummy_args = cli.parse_args()
+    if not opts.modulepath:
+        cli.print_help()
+        sys.exit(-1)
+    
+    for module in module_list:
+        py_compile.compile(os.path.join(opts.modulepath, module))
+    
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/preparation.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,604 @@
+#============================================================================ 
+#Name        : preparation.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This package implements the new update work area functionality.
+
+"""
+
+import logging
+import os
+import shutil
+import time
+import xml.dom.minidom
+
+import ccm
+import ccm.extra
+import configuration
+import fileutils
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.INFO)
+_logger = logging.getLogger("preparation.ccmgetinput")
+
+
+DEFAULT_THREADS = 1
+THREADS_MIN_TOTAL = 1
+THREADS_MAX_TOTAL = 10
+
+
+def find(function, seq):
+    """Return first item in sequence where f(item) == True."""
+    for item in seq:
+        if function(item): 
+            return item
+    return None
+
+
+class PreparationAction(object):
+    """ Implements an abstract preparation function. """
+    
+    def __init__(self, config, builder):
+        self._config = config
+        self._builder = builder
+
+    def check(self):
+        """ Checks if project is available in synergy. """
+        self._check_object(self._config.name)
+        
+    def _check_object(self, fpn):
+        """ Check if ccmobject exists in synergy database. """
+        session = self.get_session()
+        ccm_object = session.create(fpn)
+        if ccm_object.exists():
+            _logger.info("Checking '%s'...Ok" % fpn)
+        else:
+            _logger.info("Checking '%s'...Not Found!" % fpn)
+            raise Exception("Could not find  object %s in the database." % fpn)
+
+    def execute(self):
+        """ This method needs to be override by child class.
+        
+        It should implement the action to achieve.
+        """
+        pass
+
+    def get_session(self):
+        """ Helper that retreive the session from the builder. Setting threads correctly. """
+        if self._config.has_key('database'):
+            return self._builder.session(self._config['database'], self.get_threads())
+        if not self._config.has_key('host'):
+            raise Exception("Database engine host configuration is not found")
+        elif not self._config.has_key('dbpath'):
+            raise Exception("Database path configuration is not found")
+        else:
+            return self._builder.session(None, self.get_threads(), self._config['host'], self._config['dbpath'])
+
+    def get_threads(self):
+        """ Returning the number of threads that should be used. """
+        threads = self._config.get_int('threads', DEFAULT_THREADS)
+        if threads < THREADS_MIN_TOTAL:
+            threads = THREADS_MIN_TOTAL
+        if threads > THREADS_MAX_TOTAL:
+            threads = THREADS_MAX_TOTAL
+        return threads
+
+
+class PreparationSnapshot(PreparationAction):
+    """ Implements a Snapshot preparation function. 
+    
+    Support the parallel snapshotter.
+    """
+    
+    def __init__(self, config, builder):
+        """ Initialization. """
+        PreparationAction.__init__(self, config, builder)
+
+    def execute(self):
+        """ Method that implements snapshoting of the project into a folder. """        
+        _logger.info("=== Stage=snapshot = %s" % self._config.name)
+        _logger.info("++ Started at %s" % time.strftime("%H:%M:%S", time.localtime()))
+        session = self.get_session()
+        project = session.create(self._config.name)
+
+        target_dir = os.path.normpath(os.path.join(self._config['dir'], project.name))
+        if not self._check_version(project, target_dir):
+            if not os.path.exists(target_dir):
+                _logger.info("Creating '%s'." % target_dir)
+                os.makedirs(target_dir)
+            else:
+                _logger.info("Project needs to be updated, so deleting '%s'." % target_dir)
+                fileutils.rmtree(target_dir)
+            
+            try:
+                _logger.info("Snapshotting project.")                
+                if self.get_threads() == 1:                    
+                    _logger.info(project.snapshot(target_dir, True))
+                else:
+                    _logger.info(ccm.extra.FastSnapshot(project, target_dir, self.get_threads()))
+                                    
+                # writing version file                
+                _logger.info("Saving project version information.")
+                versionfile = open(os.path.join(self._config['dir'], project.name, 'project.version'), "w+")
+                versionfile.write(str(project))
+                versionfile.close()                
+            except Exception, exc:
+                if isinstance(exc, ccm.extra.CCMExtraException):
+                    for sexc in exc.subexceptions:
+                        _logger.info(sexc)
+                _logger.info("ERROR: snapshotting %s" % self._config.name)
+                _logger.info(exc)
+                raise exc
+        else:
+            _logger.info("Project snapshot is still up to date. Nothing to do.")
+
+        _logger.info("++ Finished at %s" % time.strftime("%H:%M:%S", time.localtime()))
+    
+    def _check_version(self, project, targetdir):
+        """ Check the version file for snaphot and identify if the project has to be snapshot or not.
+            Returns True if the content of the file matches the project to snapshot (nothing to do).
+            Returns falls either if the file is missing, or the content is different.
+        """
+        versionfile = os.path.join(targetdir, 'project.version')
+        if (os.path.exists(versionfile)):
+            file_ = open(versionfile, "r")
+            projectname = file_.read().strip()
+            file_.close()
+            if (projectname == project.objectname):
+                return True
+        return False
+    
+    
+class PreparationCheckout(PreparationAction):
+    """ Handle the checkout and update of project content. """
+    def __init__(self, config, builder):
+        """ Initialization. """
+        PreparationAction.__init__(self, config, builder)
+
+    def check(self):
+        """ Checks if all synergy resources are available. """
+        PreparationAction.check(self)
+        if self._config.has_key('release'):
+            self._check_object(str(self._config['release']))
+        else:
+            raise Exception("'release' property is not defined for %s" % self._config.name)
+
+        for task in self.__get_tasks():
+            self._check_object("Task %s" % task)
+        for folder in self.__get_folders():
+            self._check_object("Folder %s" % folder)
+        
+        for project in self.__get_subbaselines():
+            self._check_object(project)
+            
+        # checking if the purpose exists
+        if self._config.has_key('purpose'):
+            session = self.get_session()
+            purposes = session.purposes()
+            if purposes.has_key(str(self._config['purpose'])):
+                _logger.info("Checking purpose '%s'...Ok" % (self._config['purpose']))
+            else:
+                _logger.info("Checking purpose '%s'...Not Found!" % (self._config['purpose']))
+                raise Exception("Could not find purpose %s in the database." % self._config['purpose'])
+            
+            role = session.role
+            co_role = ccm.get_role_for_purpose(session, str(self._config['purpose']))
+            _logger.info("Try to switch user to role: %s" % co_role)
+            session.role = co_role
+            session.role = role
+            
+    def execute(self):
+        """ Creates a checkout of the project, or updates an existing checkout if one is found.
+        
+        The work area is maintained as part of this.
+        """
+        _logger.info("=== Stage=checkout = %s" % self._config.name)
+        _logger.info("++ Started at %s" % time.strftime("%H:%M:%S", time.localtime()))
+        session = self.get_session()
+        project = session.create(self._config.name)
+        
+        session.home = self._config['dir']
+        
+        result = self.__find_project(project)
+        # for testing: result = session.create("ppd_sw-fa1f5132#wbernard2:project:sa1spp#1")
+        if (result != None):
+            _logger.info("Project found: '%s'" % result)
+
+            # setting up the project
+            self.__setup_project(project, result)
+        else:
+            _logger.info("Checking out from '%s'." % project)
+            
+            purpose = None
+            if self._config.has_key('purpose'):
+                purpose = self._config['purpose']
+                _logger.info("Using purpose: '%s'" % purpose)
+                
+            version = None
+            if self._config.has_key('version'):
+                version = self._config['version']
+                _logger.info("Using version: '%s'" % version)
+
+            try:
+                result = project.checkout(session.create(self._config['release']), version=version, purpose=purpose)
+                ccm.log_result(result, ccm.CHECKOUT_LOG_RULES, _logger)
+            except ccm.CCMException, exc:
+                ccm.log_result(exc.result, ccm.CHECKOUT_LOG_RULES, _logger)
+                raise exc
+            _logger.info('Checkout complete')
+            
+            if result.project != None and result.project.exists():                
+                _logger.info("Project checked out: '%s'" % result.project)
+                
+                
+                _logger.info("Maintaining the workarea...")
+                if self.get_threads() == 1:
+                    _logger.info(result.project.work_area(True, True, True, self._config['dir'], result.project.name))
+                else:
+                    #pool = self._builder.session(self._config['database'], self.get_threads())
+                    _logger.info(ccm.extra.FastMaintainWorkArea(result.project, self._config['dir'], result.project.name, self.get_threads()))
+                self.__setup_project(project, result.project)
+            else:
+                raise Exception("Error checking out '%s'" % project)
+        _logger.info("++ Finished at %s" % time.strftime("%H:%M:%S", time.localtime()))
+
+    def __find_project(self, project):
+        """ Private method. """
+        if (os.path.exists(os.path.join(self._config['dir'], project.name, "project.version"))):
+            _logger.info("Snapshot to checkout deleting '%s'." % os.path.join(self._config['dir'], project.name))
+            fileutils.rmtree(os.path.join(self._config['dir'], project.name))
+            return None
+        
+        path = os.path.join(self._config['dir'], project.name, project.name)
+        try:
+            result = project.session.get_workarea_info(path)
+            if(result == None):
+                fileutils.rmtree(path)
+                return result
+            return result['project']
+        except ccm.CCMException:
+            # Delete the project dir if found
+            if os.path.exists(os.path.dirname(path)):
+                fileutils.rmtree(os.path.dirname(path))
+            return None
+
+    def __setup_project(self, project, coproject):
+        """ Private method. """
+        session = self.get_session()
+        role = session.role
+        if self._config.has_key('purpose'):
+            co_role = ccm.get_role_for_purpose(session, self._config['purpose'])
+            _logger.info("Switching user to role: %s" % co_role)
+            session.role = co_role
+        
+        newprojs = []
+        if not self._config.get_boolean('use.reconfigure.template', False):
+            _logger.info("Validating release")
+            self.__set_release(coproject)
+            _logger.info("Setting update properties to manual")
+            coproject.set_update_method('manual', True)
+            _logger.info("Setting the baseline to '%s'" % project)
+            coproject.set_baseline(project, True)
+            self.__set_subbaselines(coproject)
+            _logger.info("Cleaning up update properties")
+            self._clean_update_properties(coproject)
+            _logger.info("Setting update properties.")
+            self._set_tasks_and_folders(coproject)
+            _logger.info("Applying update properties.")
+            coproject.apply_update_properties(baseline=False)
+        else:
+            _logger.info("Validating release")
+            self.__set_release(coproject)
+                        
+        replace_subprojects = True
+        if not self._config.get_boolean('replace.subprojects', True):
+            _logger.info("NOT replacing subprojects")
+            replace_subprojects = False
+        update_keepgoing = True
+        if self._config.get_boolean('update.failonerror', False):
+            _logger.info("The build will fail with update errors")
+            update_keepgoing = False
+        _logger.info("Updating...")
+        result = coproject.update(True, replace_subprojects, update_keepgoing, result=ccm.UpdateResultSimple(coproject.session))
+        
+        if self._config.get_boolean('fix.missing.baselines', False) and replace_subprojects:
+            newprojs = self.__fix_baseline(coproject)
+            if len(newprojs) > 0:
+                result = coproject.update(True, replace_subprojects, update_keepgoing, result=ccm.UpdateResultSimple(coproject.session))
+                ccm.log_result(result, ccm.UPDATE_LOG_RULES, _logger)
+                _logger.info("Detected additional projects into baseline - Maintaining the whole toplevel project again...")
+                coproject.work_area(True, True)
+            else:
+                ccm.log_result(result, ccm.UPDATE_LOG_RULES, _logger)
+        else:
+            ccm.log_result(result, ccm.UPDATE_LOG_RULES, _logger)
+
+        # Running sync
+        self._sync(coproject)
+
+        # Running check conflicts
+        self._check_conflicts(coproject)
+        
+        _logger.info("Switching user to role: %s" % role)
+        session.role = role
+
+    def _sync(self, coproject):
+        """ Run the sync if the 'sync' property is defined to true in the 
+            configuration
+        """
+        if self._config.get_boolean('sync', False):
+            _logger.info("Synchronizing...")
+            result = coproject.sync(True, True)
+            ccm.log_result(result, ccm.SYNC_LOG_RULES, _logger)
+
+
+    def __set_release(self, project):
+        """ Update the release of the project hierarchy if required. """
+        release = project.session.create(self._config['release'])
+        _logger.info("Current release: '%s'" % project.release)
+        _logger.info("Configuration release: '%s'" % release)
+        if project.release != release:
+            _logger.info("Updating release on the project hierarchy.")
+            for subp in [project] + project.subprojects:
+                subp.release = release
+        
+    def __fix_baseline(self, coproject):
+        """ Check for project in a different status, then check them out. """
+        newprojs = []
+        _logger.info("Looking for new projects in the check out.")
+        status = coproject['status']
+        for subproj in coproject.subprojects:
+            if subproj['status'] == status:
+                continue           
+            _logger.info("New project detected in the checkout '%s'" % subproj.objectname)
+            purpose = None
+            if self._config.has_key('purpose'):
+                purpose = self._config['purpose']
+                _logger.info("Using purpose: '%s'" % purpose)
+                
+            version = None
+            if self._config.has_key('version'):
+                version = self._config['version']
+                _logger.info("Using version: '%s'" % version)
+
+            result = subproj.checkout(subproj.session.create(self._config['release']), version=version, purpose=purpose, subprojects=False)
+            _logger.info('Checkout complete')
+            if result.project != None and result.project.exists():
+                newcop = result.project
+                newprojs.append(newcop)
+                
+                _logger.info("Setting is_relative to true")                    
+                if "is_relative" in newcop.keys():
+                    newcop["is_relative"] = "TRUE"
+                else:
+                    newcop.create_attribute("is_relative", "boolean", "TRUE")
+                
+                if not self._config.get_boolean('use.reconfigure.template', False):
+                    newcop.set_update_method('manual', False)
+                    
+                    _logger.info("Setting the baseline to '%s'" % subproj)
+                    newcop.set_baseline(subproj, True)
+                                            
+                    _logger.info("Cleaning up update properties")
+                    self._clean_update_properties(newcop)
+                    
+                    _logger.info("Setting update properties.")
+                    self._set_tasks_and_folders(newcop)
+        return newprojs        
+
+    def _check_conflicts(self, coproject):
+        """ Private method. """
+        conflictsobjects = self._config.get_boolean('show.conflicts.objects', False)
+        
+        if self._config.get_boolean('show.conflicts', False) or conflictsobjects:
+            result = coproject.conflicts(True, not conflictsobjects)
+            ccm.log_result(result, ccm.CONFLICTS_LOG_RULES, _logger)
+#        for project in result.keys():
+#            for error in result[project]:
+#                if 'object' in error:
+#                    _logger.info("CONFLICTS: %s" % error['comment'])
+#                else:
+#                    _logger.info("CONFLICTS: %s" % error['comment'])
+        
+    @staticmethod
+    def _clean_update_properties(project):
+        """ Private method. """
+        for task in project.tasks:
+            project.remove_task(task)        
+        for folder in project.folders:
+            project.remove_folder(folder)
+
+    @staticmethod
+    def __find_subproject(subprojects, project):
+        """ Private method. """
+        for subproj in subprojects:
+            if subproj.is_same_family(project):
+                return subproj
+        raise Exception("Error could not identify check out project for '%s'" % project)
+    
+    def __set_subbaselines(self, project):
+        """ Private method. """
+        if len(self.__get_subbaselines()) > 0:
+            subprojects = project.subprojects
+            for subbaseline in self.__get_subbaselines():
+                subbaseline = project.session.create(subbaseline)
+                subproj = self.__find_subproject(subprojects, subbaseline)
+                _logger.info("Setting subproject '%s' baseline to '%s'" % (subproj, subbaseline))
+                subproj.set_baseline(subbaseline, True)
+    
+    def __get_array(self, key):
+        """ Private method. """
+        result = []
+        if (self._config.has_key(key)):
+            if isinstance(self._config[key], type([])):                
+                for value in self._config[key]:
+                    value = value.strip()
+                    if len(value) > 0:
+                        result.append(value) 
+            else:
+                value = self._config[key].strip()
+                if len(value) > 0:
+                    result.append(value)
+        return result
+
+    def __get_subbaselines(self):
+        """ Private method. """
+        return self.__get_array('subbaselines')
+    
+    def __get_tasks(self):
+        """ Private method. """
+        return self.__get_array('tasks')
+
+    def __get_folders(self):
+        """ Private method. """
+        return self.__get_array('folders')
+    
+    def _set_tasks_and_folders(self, project):
+        """ Private method. """
+        for task in self.__get_tasks():
+            _logger.info("Adding task %s" % task)
+            project.add_task(project.session.create("Task %s" % task))
+        for folder in self.__get_folders():
+            _logger.info("Adding folder %s" % folder)
+            project.add_folder(project.session.create("Folder %s" % folder))
+
+class PreparationUpdate(PreparationCheckout):
+    """ Synergy project updater. """
+    
+    def __init__(self, config, builder):
+        """ Initialization. """
+        PreparationCheckout.__init__(self, config, builder)
+
+    def check(self):
+        """ Checks if all synergy resources are available. """
+        PreparationAction.check(self)
+
+        session = self.get_session()
+        ccm_object = session.create(self._config.name)
+        role = session.role
+        co_role = ccm.get_role_for_status(session, ccm_object['status'])
+        _logger.info("Try to switch user to role: %s" % co_role)
+        session.role = co_role
+        session.role = role
+
+    def execute(self):
+        """ Updating the mentioned project. """
+
+        session = self.get_session()
+        ccmproject = session.create(self._config.name)
+        role = session.role
+
+        status = ccmproject['status']
+        co_role = ccm.get_role_for_status(session, status)
+        session.role = co_role
+
+        if not self._config.get_boolean('use.reconfigure.template', False):
+            _logger.info("Setting update properties to manual")
+            ccmproject.set_update_method('manual', True)
+            _logger.info("Cleaning up update properties")
+            self._clean_update_properties(ccmproject)
+            _logger.info("Setting update properties.")
+            self._set_tasks_and_folders(ccmproject)
+            _logger.info("Applying update properties.")
+            ccmproject.apply_update_properties(baseline=False)
+        replace_subprojects = True
+        if not self._config.get_boolean('replace.subprojects', True):
+            _logger.info("NOT replacing subprojects")
+            replace_subprojects = False
+        update_keepgoing = True
+        if self._config.get_boolean('update.failonerror', False):
+            _logger.info("The build will fail with update errors")
+            update_keepgoing = False
+
+        _logger.info("Updating %s..." % ccmproject.objectname)
+        result = ccmproject.update(True, replace_subprojects, update_keepgoing, result=ccm.UpdateResultSimple(ccmproject.session))
+        ccm.log_result(result, ccm.UPDATE_LOG_RULES, _logger)
+        
+        self._sync(ccmproject)
+        
+        self._check_conflicts(ccmproject)
+        
+        session.role = role
+
+class PreparationBuilder(object):
+    """ Creates an updated work area from a configuration. """
+    def __init__(self, configs, username = None, password = None, cache=None):
+        """ Initialization. """
+        self._configs = configs
+        self._sessions = {}
+        self._actions = []
+        self.__username = username
+        self.__password = password
+        self.__provider = ccm.extra.CachedSessionProvider(cache=cache)
+        for config in self._configs:
+            if config.type == "snapshot":
+                self._actions.append(PreparationSnapshot(config, self))
+            elif config.type == "checkout":
+                self._actions.append(PreparationCheckout(config, self))        
+            elif config.type == "update":
+                self._actions.append(PreparationUpdate(config, self))
+        
+    def check(self):
+        """ Check that all dependencies are there. """
+        for action in self._actions:
+            action.check()
+    
+    def get_content(self):
+        """ Run the each action. """
+        for action in self._actions:
+            action.execute()
+
+    def session(self, database, size=1, engine=None, dbpath=None):
+        """ Handles pool rather that sessions. """
+        assert size > 0, "The pool must contains at least one session!"
+        if self.__provider is None:
+            raise Exception("The builder has been closed.") 
+        if not self._sessions.has_key(database):
+            _logger.info("Get a session for %s" % database)
+            session = ccm.SessionPool(self.__username, self.__password, engine, dbpath, database, size, opener=self.__provider.get)
+            self._sessions[database] = session
+            # be developer by default
+            session.role = "developer"
+        session = self._sessions[database]
+        if session.size < size:
+            _logger.info("Resizing the pool for database %s to %d" % (database, size))
+            session.size = size
+            # be developer by default
+            session.role = "developer"
+        return session
+    
+    def close(self):
+        """ This is the preparation cleanup method.
+            It closes all opened sessions.
+        """
+        _logger.debug("Closing sessions...")
+        dbs = self._sessions.keys()
+        while len(dbs) > 0:
+            session = self._sessions.pop(dbs.pop())
+            session.close()
+        if self.__provider is not None:
+            self.__provider.close()
+            self.__provider = None
+        
+    
+    def __del__(self):
+        self.close()
+            
+        
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/rom.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,353 @@
+#============================================================================ 
+#Name        : rom.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This modules implements rombuilders.
+"""
+import logging
+import os
+import sys
+import shutil
+import types
+from version import Version
+import re
+import escapeddict
+import imaker
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger("rom")
+
+
+def get_abstract_parents(config):
+    """ Create from a config element a list of parent
+        that are abstract (not buildable).
+    """
+    result = []
+    while (config.parent != None):
+        if config.parent.abstract != None:
+            result.append(config.parent)
+        config = config.parent
+    return result
+
+def read_file_content(filename):
+    """ Read the whole file content.
+    """
+    ftr = open(filename, "r")
+    content = ftr.read()
+    ftr.close()
+    return content
+
+def escape_string(string, config):
+    """ Escape a string recursively.
+    """
+    #data = escapeddict.EscapedDict(config)
+    #string = re.sub(r'\${(?P<name>[._a-zA-Z0-9]+)}', r'%(\g<name>)s', string)
+    #return string % data
+    return config.interpolate(string)
+
+def get_makefile_target(text):
+    """ Retrieve the target name of a step
+    """
+    result = re.search(r"^(?P<target>.+?)\s*:", text, re.M)
+    if (result != None):
+        return result.groupdict()['target']
+    raise Exception("Could'nt determine target name")
+
+def remove_duplicates(array):
+    """ Remove dusplicates values from an array. """
+    elements = {}
+    for element in array: elements[element] = element
+    return elements.keys()
+
+def get_product_path_bsf(product):
+    """ Get product path using the BSF. """
+    import bsf
+    # read product hierarchy
+    bsfs = bsf.read_all()
+    return bsfs[product].get_path()
+    
+def get_product_path_var(product):
+    """ Get product path using the new tool. """
+    return imaker.get_product_dir(product)
+
+class IMakerRomBuilder:
+    """ Configuration Builder for iMaker tool.
+        This tool generate a makefile.
+    """
+    
+    def __init__(self, config, product, usevar=False):
+        self._config = config
+        self._product = product
+
+    def process_my_traces(self, config):
+        """ Generates a mytraces.txt file under \epoc32 based on the <mytraces/>
+            XML sub-elements defined for the image.
+        """
+        sys.stdout.flush()
+        if config.has_key('mytraces.binaries') and len(str(config['mytraces.binaries'])) > 0:
+            mytracestxt = escape_string(config['mytraces.file'], config)
+            logger.debug("Writing %s file" % mytracestxt)
+            binaries = config['mytraces.binaries']
+            traces_file = open(mytracestxt, 'w')
+            for binary in binaries:
+                traces_file.write(str(binary) + "\n")
+            traces_file.close()
+
+    def build(self):
+        """ Generate the makefile from xml configuration.
+            That method should be splitted....it's to long!!!
+        """
+        configs = self._config.getConfigurations(self._product)
+        if (len(configs) > 0):
+            
+            # creating additional targets
+            targets = {}
+            
+            master_filename = configs[0]['main.makefile.template']
+            
+            outputfilename = os.path.basename(master_filename)
+            if configs[0].has_key('output.makefile.filename'):
+                outputfilename = configs[0]['output.makefile.filename']
+            
+            filename = "%s/%s" % (get_product_path_var(self._product), outputfilename)
+            output = open(filename, "w+")
+            output.write("# DO NOT EDIT - FILE AUTOMATICALLY GENERATED\n")
+            output.write("# HELIUM variant configuration tool (C) Nokia - 2007\n\n")
+            mkdefine = '__' + re.sub(r'[^\w]', '_', os.path.basename(outputfilename)).upper() + '__'
+            output.write("ifndef %s\n" % mkdefine)
+            output.write("%s := 1\n\n" % mkdefine)
+            master_template = read_file_content(master_filename)
+            output.write(configs[0].interpolate(master_template) + "\n")
+                        
+            for config in configs:
+                # generating traces
+                #self.process_my_traces(config)
+                                                 
+                
+                if config.type == None:
+                    raise Exception("Type not defined for configuration '%s'" % config.name)
+                
+                # generate makefile targets from templates
+                if config.has_key("%s.makefile.template" % config.type):
+                    template = read_file_content(config["%s.makefile.template" % config.type])
+                    image_types = config['image.type']
+                    if not isinstance(config['image.type'], types.ListType):
+                        image_types = [config['image.type']]
+                    for romtype in image_types:
+                        config['image.type'] = romtype
+                        out = config.interpolate(str(template))
+                        output.write(out+"\n")
+                        subtargets = [get_makefile_target(out)]
+                        for parent in get_abstract_parents(config):
+                            if not targets.has_key(parent.name):
+                                targets[parent.name] = {}
+                                targets[parent.name]['parent'] = parent
+                                targets[parent.name]['subtargets'] = []
+                            targets[parent.name]['subtargets'].extend(subtargets)
+                            targets[parent.name]['subtargets'] = remove_duplicates(targets[parent.name]['subtargets'])
+                            subtargets = [parent.name]
+                    config['image.type'] = image_types
+                else:
+                    # Do not raise error anymore when template is not found. 
+                    print "WARNING: Could not find template for %s (%s)" % (config.name,"%s.makefile.template" % config.type)
+                    #raise Exception("Could not find template for %s (%s)" % (config.name,"%s.makefile.template" % config.type))
+               
+                    
+            output.write("###############################################################################\n")
+            output.write("# Generated group target\n")
+            output.write("###############################################################################\n\n")
+            for target in targets.keys():
+                if targets[target]['parent']['build.parallel'] == 'true':
+                    output.write("%s: %s\n\n" % (target, " ".join(targets[target]['subtargets'])))
+                    output.write("%s-dryrun:\n" % target)
+                    output.write("\t@$(CALL_TARGET) -n %s\n\n" % target)
+                else:
+                    output.write("%s-dryrun:\n" % target)
+                    for subtarget in targets[target]['subtargets']:
+                        output.write("\t@$(CALL_TARGET) -n %s\n" % subtarget)
+                    output.write("\n")
+                    output.write("%s:\n" % target)
+                    output.write("\t@echo === %s started\n" % target)
+                    for subtarget in targets[target]['subtargets']:
+                        output.write("\t$(CALL_TARGET) %s\n" % subtarget)
+                    output.write("\t@echo === %s finished\n" % target)
+                    output.write("\n")
+            output.write("\nendif # %s\n" % mkdefine)
+            output.close()
+            print "File %s has been generated." % filename
+        else:
+            raise Exception("Could not find configuration: '%s'" % self._product)
+
+
+class RomBuilder:
+    """ Builder that create roms using makefpsx.
+    """
+    def __init__(self, configs):
+        self.configs = configs
+
+    def build(self):
+        """ Go throught the config and build each roms.
+        """
+        for config in self.configs:
+            for k in sorted(config.keys()):
+                value = config[k]
+                if isinstance(value, types.UnicodeType):
+                    value = value.encode('ascii', 'ignore')
+                print k + ': ' + str(value)
+            image = Image(config)
+            image.build()
+            print '======================================'
+            print
+
+class Image:
+    """ An Image object represents a ROM image, or .fpsx file.
+    """
+
+    def __init__(self, config):
+        """ Initialise the Image object.
+        """
+        self.config = config
+
+    def build(self):
+        """ Main method that handles the whole sequence of building the rom and
+            moving all related files to the correct location.
+        """
+        self._create_destination()
+        self._process_cmt()
+        self._write_version()
+        self._process_my_traces()
+        self._callrommake()
+        self._clean_mytraces()
+        self._move_image_files()
+        print
+
+    def _create_destination(self):
+        """ Creates the destination directory of the ROM files if it does not exist.
+        """
+        dest = self.config['rom.output.dir']
+        if not os.path.exists( dest ):
+            os.makedirs( dest )
+
+    def _process_cmt(self):
+        """ Copies the CMT image under \epoc32 and to the destination directory of
+            the ROM image, if the image will include the CMT.
+        """
+        # Check if a CMT is needed
+        if self.config['image.nocmt'] != 'true':
+            dest = self.config['rom.output.dir']
+            logger.debug("Copying " + self.config['cmt'] + " to " + dest)
+            shutil.copy( self.config['cmt'], dest )
+            logger.debug("Copying " + self.config['cmt'] + " to " + self.config['rommake.cmt.path'])
+            shutil.copy( self.config['cmt'], self.config['rommake.cmt.path'] )
+
+    def _write_version(self):
+        """ Generates the version text files that define the version of the ROM image.
+            These are in UTF16 little endian (Symbian) format.
+        """
+        Version('sw', self.config).write()
+        Version('langsw', self.config).write()
+        Version('model', self.config).write()
+
+    def _process_my_traces(self):
+        """ Generates a mytraces.txt file under \epoc32 based on the <mytraces/>
+            XML sub-elements defined for the image.
+        """
+        sys.stdout.flush()
+        if self.config.has_key('mytraces.binaries'):
+            logger.debug("Writing mytraces.txt file")
+            binaries = self.config['mytraces.binaries']
+            traces_file = open( str(self.config['rommake.mytraces.file']), 'w' )
+            for binary in binaries:
+                traces_file.write( str(binary) + "\n" )
+            traces_file.close()
+        else:
+            self._clean_mytraces()
+
+    def _callrommake(self):
+        """ Calls the make_fpsx.cmd to build a ROM image.
+        """
+        logger.debug("Building rom image: " + str(self))
+        sys.stdout.flush()
+
+        args = [str(self.config['rommake.command']),
+                '-hid',
+                str(self.config['rommake.hwid']),
+                '-p',
+                str(self.config['rommake.product.name']),
+                '-iby',
+                str(self.config['image.iby']),
+                '-type',
+                str(self.config['image.type']),
+                '-traces',
+                '-verbose',
+                '-target',
+                self.config['rom.output.dir'],
+                '-o' + str(self)]
+        if 'rommake.args' in self.config:
+            extra_args = str(self.config['rommake.args']).split( ' ' )
+            args += extra_args
+        logger.debug("with args: " + str(args))
+        os.chdir(os.path.dirname(str(self.config['rommake.command'])))
+        os.spawnv(os.P_WAIT, str(self.config['rommake.command']), args)
+
+    def _clean_mytraces(self):
+        logger.debug("Removing mytraces.txt file")
+        if os.path.exists( str( self.config['rommake.mytraces.file'] ) ):
+            os.remove( str( self.config['rommake.mytraces.file'] ) )
+    
+    def _move_image_files(self):
+        os.chdir( self.config['rom.output.dir'] )
+        if not( os.path.isdir('temp') ):
+            os.mkdir( 'temp' )
+        if not( os.path.isdir('logs') ):
+            os.mkdir( 'logs' )
+        if not( os.path.isdir('obys') ):
+            os.mkdir( 'obys' )
+        
+        for element in os.listdir('.'):
+            if( os.path.isfile(element) ):
+                if( element.endswith('.img') or element.endswith('.bin') or element.endswith('.bb5') ):
+                    shutil.move( element, 'temp' )
+                if( element.endswith('.log') or element.endswith('.dir') or element.endswith('.symbol') ):
+                    shutil.move( element, 'logs' )
+                if( element.endswith('.oby') ):
+                    shutil.move( element, 'obys' )
+
+                
+    # Returns the name of this ROM image
+    def __str__(self):
+        """ Returns the filename of the image file once copied to the
+            \*_flash_images directory.
+        """
+        # Get the unique build ID for these ROM image names
+        name = str(self.config['rom.id']) + '_' + self.config['image.type']
+
+        # Add a flag if the ROM is textshell
+        if self.config['image.ui'] == 'text':
+            name += "_text"
+
+        # Add a flag if the image does not a CMT
+        if self.config['image.nocmt'] == 'true':
+            name += "_nocmt"
+
+        # Add any differentiating name extension if present3
+        if self.config['image.name.extension'] != '':
+            name += '_' + self.config['image.name.extension']
+
+        return name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/rtfutils.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,172 @@
+#============================================================================ 
+#Name        : rtfutils.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import csv
+import os
+import PyRTF
+import StringIO
+import re
+import logging
+
+class RTFUtils(object):
+  
+    def __init__(self, template):
+        """ template would be a RTF file to modify """
+        self.template = template
+        
+        self.logger = logging.getLogger('test.relnotes')
+        logging.basicConfig(level=logging.DEBUG)
+        
+    def rtftable(self, errorsfilename, outputfilename, tagtoreplace):
+        """ Create a .rtf file from the errors.csv file. """
+        
+        errors = file(errorsfilename, 'rb')
+        template = file(self.template, 'rb' )
+        output = file(outputfilename, 'w' )
+        
+        self._rtftable(errors, output, tagtoreplace, template)
+        
+        errors.close()
+        output.close()
+        template.close()
+        
+    def _rtftable(self, errors, output, tagtoreplace, template):
+        PyRTF.Elements.StandardColours.append(PyRTF.PropertySets.Colour('NokiaBlue', 153, 204, 255))    
+       
+        DR = PyRTF.Renderer()
+        doc     = PyRTF.Document()
+        ss      = doc.StyleSheet
+        section = PyRTF.Section()
+        doc.Sections.append( section )
+    
+        table = PyRTF.Table( PyRTF.TabPS.DEFAULT_WIDTH * 7,
+                             PyRTF.TabPS.DEFAULT_WIDTH * 3,
+                             PyRTF.TabPS.DEFAULT_WIDTH * 3 )
+                       
+        reader = csv.reader(errors)
+        
+        style = None    
+        for row in reader:
+            assert len(row) == 3
+            
+            if style == None:
+                style = ss.ParagraphStyles.Heading2
+            else:
+                style = ss.ParagraphStyles.Normal
+            
+            # Handle each value from the row
+            rowcell = []
+            
+            for value in row:           
+                cell = PyRTF.Text( value )
+                rowcell.append(PyRTF.Cell( PyRTF.Paragraph(style, cell) ))
+            table.AddRow( *rowcell )
+    
+        section.append( table )
+        string = StringIO.StringIO()
+        DR.Write( doc, string )
+                
+        keep = ''
+        for line in string.getvalue().splitlines():
+            if keep != '' or line.startswith('{\\trowd'):
+                keep += line
+                    
+        #remove last '}'
+        keep = keep[0:-1]
+        
+        for line in template:
+            line = line.replace(tagtoreplace, keep)
+            output.write(line)
+    
+    def rtfimage(self, image, outputfilename, tagtoreplace):
+        """ Replaces tagtoreplace in a RTF file with a image """
+        
+        template = file(self.template, 'rb' )
+        output = file(outputfilename, 'w' )
+        
+        self._rtfimage(image, output, tagtoreplace, template)
+        
+        output.close()
+        template.close()
+    
+    def _rtfimage(self, image, output, tagtoreplace, template):
+        TEMP_FILE = 'image_temp.rtf'
+        
+        DR = PyRTF.Renderer()
+        doc = PyRTF.Document()
+        ss = doc.StyleSheet
+        section = PyRTF.Section()
+        doc.Sections.append( section )
+    
+        section.append( PyRTF.Image( image ) )    
+        
+        tempOutput = file( TEMP_FILE, 'w' )
+        DR.Write( doc, tempOutput )
+        
+        tempOutput = file( TEMP_FILE, 'rb' )
+        
+        keep = ''
+        for line in tempOutput:
+            if keep != '':
+                keep += line
+            elif line.startswith('{\pict'):
+                keep = line
+        
+        #remove last '}'
+        keep = keep[0:-1]
+        
+        tempOutput.close()
+        
+        for line in template:
+            line = line.replace(tagtoreplace, keep)
+            output.write(line)
+        
+        os.remove(TEMP_FILE)
+        
+    def rtfconvert(self, inputfilename, outputfilename):
+        """ Converts a property file to be RTF link syntax """
+        inputfile = file( inputfilename, 'r' )
+        outputfile = file( outputfilename, 'w' )
+        
+        self._rtfconvert(inputfile, outputfile)
+        
+        inputfile.close()
+        outputfile.close()
+        
+    def _rtfconvert(self, inputfile, outputfile):
+        p = re.compile(r'(.+=)((\\\\|http|\.\\|ftp)(.+))')
+        for line in inputfile:
+            newline = line
+            
+            #fix bad links generated in ant
+            if newline.count('\\\\')>0:
+                newline = newline.replace('//','\\')
+                newline = newline.replace('/','\\')
+                
+            if "\\n" in newline:
+                newline = newline.replace("\\n", " \\\\line ")
+            else:
+                newline = newline.replace('\\','\\\\\\\\\\\\\\\\')
+                
+            
+            newline = p.sub('\g<1>{_backslash_field{_backslash_*_backslash_fldinst HYPERLINK \g<2>}}', newline)
+            
+            newline = newline.replace('_backslash_', r'\\')
+            
+            outputfile.write(newline)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/sis.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+#============================================================================ 
+#Name        : sis.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+
+import configuration
+import buildtools
+
+
+class SisPreBuilder(buildtools.PreBuilder):
+    """"""
+    def __init__(self, config):
+        buildtools.PreBuilder.__init__(self, config)
+
+    def write(self, buildFilePath):
+        sisConfigs = self.configSet.getConfigurations()
+        commandList = buildtools.CommandList()
+        for config in sisConfigs:
+            sis_filename = config['name'] + '.sis'
+            if config.get('sis.name', None) != None:
+                sis_filename = config['sis.name'] + '.sis'
+            makeSisArgs = ['-v', config['name'] + '.pkg', sis_filename]
+            makeSisCommand = buildtools.Command(config['makesis.tool'], config['path'], makeSisArgs)
+            commandList.addCommand(makeSisCommand)
+            
+            if config.get_boolean('publish.unsigned', False):
+                # This is hardcoded xcopy operation that should be replaced by a more generic
+                # definition of tasks that can be created in build files
+                srcFile = os.path.join(config['path'], sis_filename)
+                todir = config['build.sisfiles.dir']
+                copyCommand = buildtools.Copy(srcFile, todir)
+                commandList.addCommand(copyCommand, newstage=True)
+
+            sisx_filename = sis_filename + 'x'
+            signSisArgs = ['-v', sis_filename, sisx_filename, config['cert'], config['key']]
+            signSisCommand = buildtools.Command(config['signsis.tool'], config['path'], signSisArgs)
+            commandList.addCommand(signSisCommand, newstage=True)
+
+            # This is hardcoded xcopy operation that should be replaced by a more generic
+            # definition of tasks that can be created in build files
+            srcFile = os.path.join(config['path'], sisx_filename)
+            todir = config['build.sisfiles.dir']
+            copyCommand = buildtools.Copy(srcFile, todir)
+            commandList.addCommand(copyCommand, newstage=True)
+
+        self.writeBuildFile(commandList, buildFilePath)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/symbian/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/symbian/log.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,145 @@
+#============================================================================ 
+#Name        : log.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+Library that support Symbiam log parsing:
+
+===-------------------------------------------------
+=== Stage=1
+===-------------------------------------------------
+=== Stage=1 started Fri Apr 18 21:09:55 2008
+=== Stage=1 == ncp_psw
+-- xcopy *.*  \\ /F /R /Y /S
+--- Client0 Executed ID 1
+++ Started at Fri Apr 18 21:09:55 2008
++++ HiRes Start 1208542195.09307
+Chdir \\psw\\ncp_psw\\psw
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\ct.ini -> S:\\s60\\tools\\customizationtool\\ct.ini
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPAudioEqualizer_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPAudioEqualizer_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPHWGeneral_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPHWGeneral_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPLight_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPLight_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPSysAp_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPSysAp_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\VariantFeatures.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\VariantFeatures.xml
+6 File(s) copied
++++ HiRes End 1208542195.28056
+++ Finished at Fri Apr 18 21:09:55 2008
+=== Stage=1 finished Fri Apr 18 21:09:55 2008
+...
+"""
+import re
+import logging
+import StringIO
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger('symbian.log')
+
+class Parser(object):
+    """ Generic Symbian log parser. You just need to derive that class an override few methods
+     from the interface to implement your own functionnalities.
+    """
+    
+    def __init__(self, fileobject):
+        """ The constructor, it accepts a file object:
+            parser = Parser(open('output.log', 'r'))
+        """
+        self.__file = fileobject
+
+    def parse(self):
+        """ Function that run the parsing of the log.        
+        """
+        #=== Stage=1 started Fri Apr 18 21:09:55 2008
+        match_stage = re.compile(r"===\s+(?:Stage=)?(.+)\s+(started|finished)\s+(.+)")
+
+        # === Stage=1 == ncp_psw 
+        match_component_start = re.compile(r"===\s+(?:Stage=)?(.+?)\s+==\s+(.+)")
+        match_component_finished = re.compile(r"\+\+\s+Finished\s+at")        
+        # === Stage=1 == ncp_psw 
+        match_component_cmdline = re.compile(r"--\s+(.+)")
+        match_component_chdir = re.compile(r"Chdir\s+(.+)|cd\s+(.*?)\s+.*")
+        component_name =  None
+        cmdline =  None
+        chdir =  None
+        content = StringIO.StringIO()
+        
+        # parsing the content
+        for line in self.__file:
+            line = line.strip()
+            _logger.debug(line)
+            if component_name == None:
+                _logger.debug("Searching stage")            
+                m = match_stage.match(line)
+                _logger.debug(m)
+                if m != None:
+                    _logger.debug("Found stage %s, %s" % (m.group(2), m.group(3)))
+                    if m.group(2) == "started":
+                        self.start_stage(m.group(1), m.group(3))
+                    else:                        
+                        component_name = None  
+                        cmdline = None
+                        chdir = None
+                        content = StringIO.StringIO()
+                        self.end_stage(m.group(1), m.group(3))
+                else:
+                    _logger.debug("Searching for component")
+                    m = match_component_start.match(line)
+                    if  m != None:
+                        _logger.debug("Found component: %s" % m.group(2))
+                        component_name = m.group(2)
+            else:
+                _logger.debug("Searching for component end")
+                m = match_component_finished.match(line)
+                if m != None:
+                    self.task(component_name, cmdline, chdir, content.getvalue())
+                    component_name = None  
+                    cmdline = None
+                    chdir = None
+                    content = StringIO.StringIO()                
+                if cmdline == None:
+                    _logger.debug("Searching for component command line")
+                    m = match_component_cmdline.match(line)
+                    if m != None:
+                        _logger.debug("Found command line: %s" % m.group(1))
+                        cmdline = m.group(1)
+                else:
+                    _logger.debug("Searching for component dir")
+                    if chdir == None:
+                        m = match_component_chdir.match(line)
+                        if m != None:
+                            chdir = m.group(1)
+                            if chdir == None:
+                                chdir = m.group(2)
+                            _logger.debug("Found dir: %s" % chdir)
+                            continue
+                    if not line.startswith("++ ") and not line.startswith("+++ "):                            
+                        _logger.debug("Adding content")
+                        content.write(line + "\n")
+                
+    def start_stage(self, name, date):
+        """ Method to override to catch the start stage event. """
+        pass
+    
+    def end_stage(self, name, date):
+        """ Method to override to catch the end stage event. """
+        pass
+    
+    def task(self, name, cmdline, dir, output):
+        """ Method to override to catch the task event. """
+        pass
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/symrec.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,491 @@
+#============================================================================ 
+#Name        : symrec.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" SYMREC metadata file generation. """
+import xml.dom.minidom
+import codecs
+import os
+import re
+import logging
+import fileutils
+import csv
+
+LOGGER = logging.getLogger("symrec")
+logging.basicConfig(level=logging.INFO)
+
+def _cleanup_list(input):
+    result = []
+    for chars in input:
+        if chars is not None and chars.strip() != "":
+            result.append(chars)
+    return result
+
+def xml_setattr(node, attr, value):
+    """ Create the attribute if needed. """
+    node.setAttribute(attr, value)
+
+class ServicePack(object):
+    
+    def __init__(self, node):
+        self.__xml = node
+    
+    @property
+    def name(self):
+        return self.__xml.getAttribute('name')
+    
+    @property
+    def files(self):
+        result = []
+        for filen in self.__xml.getElementsByTagName('file'):
+            result.append(filen.getAttribute('name'))
+        return result
+
+    @property
+    def instructions(self):
+        result = []
+        for instr in self.__xml.getElementsByTagName('instructions'):
+            result.append(instr.getAttribute('name'))
+        return result
+
+class ReleaseMetadata(object):
+    """ Create or read Metadata XML from SYMREC/SYMDEC. """
+    
+    def __init__(self, filename, service=None, product=None, release=None):
+        self._filename = filename
+        if os.path.exists(filename):
+            self._xml = xml.dom.minidom.parse(open(filename, "r"))
+            releaseInformation = self._xml.getElementsByTagName(u"releaseInformation")
+            if releaseInformation != []:
+                self._releaseInformation = releaseInformation[0]
+            else:
+                self._releaseInformation = self._xml.createElement(u"releaseInformation")
+            releaseDetails = self._xml.getElementsByTagName(u'releaseDetails')
+            if releaseDetails != []:
+                self._releaseDetails = releaseDetails[0]
+            else:
+                self._releaseDetails = self._xml.createElement(u'releaseDetails')
+            releaseFiles = self._xml.getElementsByTagName(u'releaseFiles')
+            if releaseFiles != []:
+                self._releaseFiles = releaseFiles[0]
+            else:
+                self._releaseFiles = self._xml.createElement(u'releaseFiles')
+                
+            if service != None:
+                self.service = service
+            if product != None:
+                self.product = product
+            if release != None:
+                self.release = release
+        elif service!=None and product!=None and release!=None:
+            self._xml = xml.dom.minidom.Document()
+            self._releaseInformation = self._xml.createElement(u"releaseInformation")
+            self._xml.appendChild(self._releaseInformation)
+            self._releaseDetails = self._xml.createElement(u'releaseDetails')
+            self._releaseInformation.appendChild(self._releaseDetails)
+            releaseID = self._xml.createElement(u'releaseID')
+            self._releaseDetails.appendChild(releaseID)
+            
+            #           service
+            serv = self._xml.createElement(u'service')            
+            xml_setattr(serv, 'name', unicode(service))
+            releaseID.appendChild(serv)
+            #           product
+            prod = self._xml.createElement(u'product')
+            xml_setattr(prod, 'name', unicode(product))
+            releaseID.appendChild(prod)
+            #           release
+            rel = self._xml.createElement(u'release')
+            xml_setattr(rel, 'name', unicode(release))
+            releaseID.appendChild(rel)
+            
+            #    releaseFiles
+            self._releaseFiles = self._xml.createElement(u'releaseFiles')
+            self._releaseInformation.appendChild(self._releaseFiles)
+
+            #    releaseFiles
+            self._releaseInformation.appendChild(self._xml.createElement(u'externalFiles'))
+        else:
+            raise Exception("Error metadata file doesn't exists.")
+
+
+    def get_dependsof(self):
+        """ Return a ReleaseMetada object pointing to the dependency release. """
+        if self.dependsof_service != None and self.dependsof_product != None and self.dependsof_release != None:
+            filename = os.path.join(os.path.dirname(self._filename), "../../..",
+                                self.dependsof_service,
+                                self.dependsof_product,
+                                self.dependsof_release)
+            return ReleaseMetadata(find_latest_metadata(filename))
+        else:
+            return None
+
+
+    def set_dependsof(self, filename):
+        """ Setting the dependency release. """
+        metadata  = ReleaseMetadata(filename)
+        self.dependsof_service  = metadata.service
+        self.dependsof_product  = metadata.product
+        self.dependsof_release  = metadata.release
+
+    def add_package(self, name, type=None, default=True, filters=None, extract="single", md5checksum=None, size=None):
+        """ Adding a package to the metadata file. """
+        # check if update mode
+        package = None
+        
+        for pkg in self._xml.getElementsByTagName('package'):
+            if (pkg.getAttribute('name').lower() == os.path.basename(name).lower()):
+                package = pkg
+                break
+        
+        # if not found create new package.
+        if package is None:
+            package = self._xml.createElement(u'package')
+            self._releaseFiles.appendChild(package)
+            
+        xml_setattr(package, 'name', os.path.basename(name))
+        if type != None:
+            xml_setattr(package, 'type', type)
+        else:
+            xml_setattr(package, 'type', os.path.splitext(name)[1].lstrip('.'))
+        xml_setattr(package, 'default', str(default).lower())
+        xml_setattr(package, 'extract', extract)
+        if filters and len(filters)>0:
+            xml_setattr(package, 'filters', ','.join(filters))
+            xml_setattr(package, 's60filter', ','.join(filters))
+        else:
+            xml_setattr(package, 'filters', '')
+            xml_setattr(package, 's60filter', '')
+        if md5checksum != None:
+            xml_setattr(package, unicode("md5checksum"), unicode(md5checksum))
+        if size != None:
+            xml_setattr(package, unicode("size"), unicode(size))
+        
+
+    def keys(self):
+        keys = []
+        for pkg in self._releaseFiles.getElementsByTagName('package'):
+            keys.append(pkg.getAttribute('name'))
+        return keys
+
+    def __getitem__(self, key):
+        for pkg in self._releaseFiles.getElementsByTagName('package'):
+            if pkg.getAttribute('name').lower() == key.lower():
+                filters = []
+                s60filters = []
+                md5checksum = None
+                size = None
+                if pkg.hasAttribute(u'filters'):
+                    filters = _cleanup_list(pkg.getAttribute('filters').split(','))
+                if pkg.hasAttribute(u's60filter'):
+                    s60filters = _cleanup_list(pkg.getAttribute('s60filter').split(','))
+                if pkg.hasAttribute(u'md5checksum'):
+                    md5checksum = pkg.getAttribute('md5checksum')
+                if pkg.hasAttribute(u'size'):
+                    size = pkg.getAttribute('size')
+                return {'type': pkg.getAttribute('type'), 'extract': pkg.getAttribute('extract'), 'default': (pkg.getAttribute('default')=="true"), \
+                         'filters': filters, 's60filter': s60filters, 'md5checksum': md5checksum, 'size': size}
+        raise Exception("Key '%s' not found." % key)
+
+    def __setitem__(self, key, value):
+        self.add_package(key, value['type'], value['default'], value['filters'], value['extract'], value['md5checksum'], value['size'])
+
+    def set_releasedetails_info(self, name, value, details="releaseID"):
+        """ Generic function to set releaseid info. """
+        detailsnode = None
+        if self._releaseDetails.getElementsByTagName(details) == []:
+            detailsnode = self._xml.createElement(details)
+            self._releaseDetails.appendChild(detailsnode)
+        else:
+            detailsnode = self._releaseDetails.getElementsByTagName(details)[0]
+        namenode = None
+        if detailsnode.getElementsByTagName(name) == []:
+            namenode = self._xml.createElement(name)
+            namenode.setAttribute(u'name', unicode(value))
+            detailsnode.appendChild(namenode)
+        else:  
+            namenode = detailsnode.getElementsByTagName(name)[0]
+            namenode.setAttribute('name', value)
+
+    
+    def get_releasedetails_info(self, name, details="releaseID"):
+        """ Generic function to extract releaseid info. """
+        for group in self._releaseDetails.getElementsByTagName(details):
+            for i in group.getElementsByTagName(name):
+                return i.getAttribute('name')
+        return None
+
+    def getVariantPackage(self, variant_name):
+        for variant in self._xml.getElementsByTagName('variant'):
+            if variant.getAttribute('name').lower() == variant_name.lower():
+                for x in variant.getElementsByTagName('file'):
+                    return x.getAttribute('name')        
+
+    def xml(self):
+        """ Returning the XML as a string. """
+        return self._xml.toxml()
+        
+    def save(self, filename = None):
+        """ Saving the XML into the provided filename. """
+        if filename == None:
+            filename = self._filename
+        file_object = codecs.open(os.path.join(filename), 'w', "utf_8")
+        file_object.write(self.xml())
+        file_object.close()
+
+    @property
+    def servicepacks(self):
+        """ Getting the service pack names. """
+        result = []
+        for sp in self._releaseInformation.getElementsByTagName('servicePack'):
+            result.append(ServicePack(sp))
+        return result
+
+    filename = property(lambda self:self._filename)
+    service = property(lambda self:self.get_releasedetails_info('service'), lambda self, value:self.set_releasedetails_info('service', value))
+    product = property(lambda self:self.get_releasedetails_info('product'), lambda self, value:self.set_releasedetails_info('product', value))
+    release = property(lambda self:self.get_releasedetails_info('release'), lambda self, value:self.set_releasedetails_info('release', value))
+    dependsof_service = property(lambda self:self.get_releasedetails_info('service', 'dependsOf'), lambda self, value:self.set_releasedetails_info('service', value, 'dependsOf'))
+    dependsof_product = property(lambda self:self.get_releasedetails_info('product', 'dependsOf'), lambda self, value:self.set_releasedetails_info('product', value, 'dependsOf'))
+    dependsof_release = property(lambda self:self.get_releasedetails_info('release', 'dependsOf'), lambda self, value:self.set_releasedetails_info('release', value, 'dependsOf'))
+    baseline_service = property(lambda self:self.get_releasedetails_info('service', 'previousBaseline'), lambda self, value:self.set_releasedetails_info('service', value, 'previousBaseline'))
+    baseline_product = property(lambda self:self.get_releasedetails_info('product', 'previousBaseline'), lambda self, value:self.set_releasedetails_info('product', value, 'previousBaseline'))
+    baseline_release = property(lambda self:self.get_releasedetails_info('release', 'previousBaseline'), lambda self, value:self.set_releasedetails_info('release', value, 'previousBaseline'))
+
+
+class MD5Updater(ReleaseMetadata):
+    """ Update Metadata XML already created from SYMREC/SYMDEC. """
+    def __init__(self, filename):
+        ReleaseMetadata.__init__(self, filename)
+        self._filepath = os.path.dirname(filename)
+                  
+    def update(self):
+        """ Update each existing package md5checksum and size attribute."""
+        for name in self.keys():
+            fullname = os.path.join(self._filepath, name)                
+            if os.path.exists(fullname):
+                result = self[name]
+                result['md5checksum'] = unicode(fileutils.getmd5(fullname))
+                result['size'] = unicode(os.path.getsize(fullname))
+                self[name] = result
+
+
+class ValidateReleaseMetadata(ReleaseMetadata):
+    """ This class validate if a metadata file is stored in the correct location and
+        if all deps exists.
+    """
+    def __init__(self, filename):
+        ReleaseMetadata.__init__(self, filename)
+        self.location = os.path.dirname(filename)
+    
+    def is_valid(self, checkmd5=True, checkPath=True):
+        """ Run the validation mechanism. """
+        status = os.path.join(os.path.dirname(self._filename), 'HYDRASTATUS.xml')
+        if os.path.exists(status):
+            hydraxml = xml.dom.minidom.parse(open(status, "r"))
+            for t in hydraxml.getElementsByTagName('state')[0].childNodes:
+                if t.nodeType == t.TEXT_NODE:
+                    if t.nodeValue != 'Ready':
+                        LOGGER.error("HYDRASTATUS.xml is not ready")
+                        return False
+        if checkPath:
+            if os.path.basename(self.location) != self.release:
+                LOGGER.error("Release doesn't match.")
+                return False
+            if os.path.basename(os.path.dirname(self.location)) != self.product:
+                LOGGER.error("Product doesn't match.")
+                return False
+            if os.path.basename(os.path.dirname(os.path.dirname(self.location))) != self.service:
+                LOGGER.error("Service doesn't match.")
+                return False
+        
+        for name in self.keys():
+            path = os.path.join(self.location, name)
+            if not os.path.exists(path):
+                LOGGER.error("%s doesn't exist." % path)
+                return False
+            try:
+                LOGGER.debug("Trying to open %s" % path)
+                content_file = open(path)
+                content_file.read(1)
+            except IOError:
+                LOGGER.error("%s is not available yet" % path)
+                return False
+                
+            if checkmd5 and self[name].has_key('md5checksum'):
+                if self[name]['md5checksum'] != None:
+                    if fileutils.getmd5(path).lower() != self[name]['md5checksum']:
+                        LOGGER.error("%s md5checksum missmatch." % path)
+                        return False
+
+        for sp in self.servicepacks:
+            for name in sp.files:
+                path = os.path.join(self.location, name)
+                if not os.path.exists(path):
+                    LOGGER.error("%s doesn't exist." % path)
+                    return False
+            for name in sp.instructions:
+                path = os.path.join(self.location, name)
+                if not os.path.exists(path):
+                    LOGGER.error("%s doesn't exist." % path)
+                    return False
+        
+        dependency = self.get_dependsof()
+        if dependency != None:
+            return ValidateReleaseMetadata(dependency.filename).is_valid(checkmd5)
+        return True
+
+class MetadataMerger(object):
+    """ Merge packages definition to the root metadata. """
+    
+    def __init__(self, metadata):
+        """ Construct a metadata merger providing root metadata filename. """ 
+        self._metadata = ReleaseMetadata(metadata)
+                
+    def merge(self, filename):
+        """ Merge the content of filename into the root metadata. """
+        metadata = ReleaseMetadata(filename)
+        for name in metadata.keys():
+            if name in self._metadata.keys():
+                LOGGER.warning('Package %s already declared, overriding previous definition!' % name)        
+            self._metadata[name] = metadata[name]
+
+    def xml(self):
+        """ Returning the XML as a string. """
+        return self._metadata.xml()
+
+    def save(self, filename = None):
+        """ Saving the XML into the provided filename. """
+        return self._metadata.save(filename)
+ 
+class Metadata2TDD(ReleaseMetadata):
+
+    def __init__(self, filename, includes=None, excludes=None):
+        ReleaseMetadata.__init__(self, filename)
+        if includes is None:
+            includes = []
+        if excludes is None:
+            excludes = []
+        self.location = os.path.dirname(filename)
+        self.includes = includes
+        self.excludes = excludes
+
+    def archives_to_tdd(self, metadata):
+        tdd = "\t[\n"
+        for name in metadata.keys():
+            path_ = os.path.join(os.path.dirname(metadata.filename), name)
+            if (((len(self.includes) == 0) and metadata[name]['extract']) or (self.includes in metadata[name]['s60filter'])) and self.excludes not in metadata[name]['s60filter']:
+                tdd += "\t\t{\n"
+                tdd += "\t\t\t\"command\": \"unzip_%s\",\n" % metadata[name]['extract']
+                tdd += "\t\t\t\"src\": \"%s\",\n" % os.path.normpath(path_).replace('\\', '/')
+                tdd += "\t\t},\n"
+        tdd += "\t],\n"
+        return tdd
+        
+    def to_tdd(self):
+        """ Generating a TDD file that contains a list of list of filenames. """
+        tdd = "[\n"
+        # generates unarchiving steps for dependency
+        dependency = self.get_dependsof()
+        if dependency != None:
+            tdd += self.archives_to_tdd(dependency)
+        # generates unarchiving steps
+        tdd += self.archives_to_tdd(self)
+        tdd += "]\n"
+        return tdd
+
+
+
+def find_latest_metadata(releasedir):
+    """ Finding the release latest release metadata file. """ 
+    metadatas = []
+    for filename in os.listdir(releasedir):
+        if re.match(r'^release_metadata(_\d+)?\.xml$', filename, re.I) is not None:
+            LOGGER.debug("Found %s" % filename)
+            metadatas.append(filename)
+    # reverse the order...
+    metadatas.sort(reverse=True)
+    if len(metadatas) > 0:
+        return os.path.normpath(os.path.join(releasedir, metadatas[0]))
+    return None
+
+class ValidateReleaseMetadataCached(ValidateReleaseMetadata):
+    """ Cached version of the metadata validation. """
+    def __init__(self, filename, cachefile=None):
+        ValidateReleaseMetadata.__init__(self, filename)
+        self.__cachefile = cachefile
+
+    def is_valid(self, checkmd5=True, checkPath=True):
+        """ Check if file is in the local cache.
+            Add valid release to the cache.
+        """
+        metadatas = self.load_cache()
+        if self.in_cache(metadatas, os.path.normpath(self._filename)):
+            LOGGER.debug("Release found in cache.")
+            return self.value_from_cache(metadatas, os.path.normpath(self._filename))
+        else:
+            result = ValidateReleaseMetadata.is_valid(self, checkmd5, checkPath)        
+            LOGGER.debug("Updating the cache.")
+            metadatas.append([os.path.normpath(self._filename), result])
+            self.update_cache(metadatas)
+        return result
+
+    def in_cache(self, metadatas, key):
+        for metadata in metadatas:
+            if metadata[0] == key:
+                return True 
+        return False
+    
+    def value_from_cache(self, metadatas, key):
+        for metadata in metadatas:
+            if metadata[0] == key:
+                return metadata[1]
+        return None
+    
+    def load_cache(self):
+        metadatas = []
+        if self.__cachefile is not None and os.path.exists(self.__cachefile):
+            for row in csv.reader(open(self.__cachefile, "rb")):
+                if len(row) == 2:
+                    metadatas.append([os.path.normpath(row[0]), row[1].lower() == "true"])
+                elif len(row) == 1:
+                    # backward compatibility with old cache.
+                    metadatas.append([os.path.normpath(row[0]), True])
+        return metadatas
+
+    def update_cache(self, metadatas):
+        if self.__cachefile is not None and os.path.exists(os.path.dirname(self.__cachefile)):
+            writer = csv.writer(open(self.__cachefile, "wb"))
+            writer.writerows(metadatas)
+
+class ValidateTicklerReleaseMetadata(ValidateReleaseMetadataCached):
+    """ This class validate if a metadata file is stored in the correct location and
+        if all deps exists.
+    """
+    def __init__(self, filename):
+        ReleaseMetadata.__init__(self, filename)
+        self.location = os.path.dirname(filename)
+    
+    def is_valid(self, checkmd5=True):
+        """ Run the validation mechanism. """
+        tickler_path = os.path.join(self.location,"TICKLER")
+        if not os.path.exists(tickler_path):
+            LOGGER.error("Release not available yet")
+            return False
+        else:
+            return ValidateReleaseMetadataCached.is_valid(self, checkmd5)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/sysdef/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/sysdef/api.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,615 @@
+#============================================================================ 
+#Name        : api.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" System Definition file parser.
+
+Priority are not handled yet.
+Nested task unitlist are not handled properly yet.
+    
+How to use it::
+
+    sdf = SystemDefinition(filename)
+    for name in sdf.layers:
+        print " + Units in layer %s" % name
+        for unit in sdf.layers[name].units:
+            print "     - " +  sdf.units[name].id
+
+    for name in sdf.units:
+        print sdf.units[name].id
+    
+"""
+
+import logging
+import os
+import re
+import sys
+import types
+
+from xmlhelper import node_scan, recursive_node_scan
+from xml.dom import Node
+import xml.dom.minidom
+
+import buildtools
+
+logging.basicConfig(level=logging.INFO)
+_logger = logging.getLogger('sysdef.api')
+
+
+def filter_out(config_filters, unit_filters):
+    """ Function that determines if a unit should be included or not. 
+        returns None => could be included, string reason.
+    """
+
+    def hasvalue(filter_list, value):
+        """ Check if a filter list contains a particular value.
+            It handles list's item negation using "!".
+        """
+        for list_value in filter_list:
+            if list_value == value:
+                return True
+        return False
+    for filter_ in unit_filters:
+        if filter_.startswith("!"):
+            if hasvalue(config_filters, filter_[1:]):
+                return filter
+        else:
+            if not hasvalue(config_filters, filter_):
+                return filter_
+    return None
+
+
+def extract_filter_list(filters):
+    """ Convert a comma separated list of filters into a python list.
+        The method will skip empty filters (empty strings).
+    """
+    result = []
+    for filter_ in [filter_.strip() for filter_ in filters.split(",")]:
+        if len(filter_) > 0:
+            result.append(filter_)
+    return result
+
+
+class SysDefElement(object):
+    """ A generic element of a System Definition. """
+    def __init__(self, sysDef):
+        """ Initialisation """
+        self._sysDef = sysDef
+        
+    def _getname(self):
+        """ Name getter method """
+        return NotImplementedError()
+        
+    def get_id(self):
+        """ Use name as default ID. """
+        return getattr(self, 'name').lower()
+    
+    def __str__(self):
+        return self.get_id()
+        
+        
+class Unit(SysDefElement):
+    """ Abstract unit from SDF file. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+        self.binaries = []
+
+    def __getid(self):
+        """ Id getter. """
+        return self.__xml.getAttribute('unitID')
+
+    def _getname(self):
+        """ Name getter. """
+        if self.__xml.hasAttribute('name'):
+            return self.__xml.getAttribute('name')
+        if self.__xml.hasAttribute('bldFile'):
+            return self.__xml.getAttribute('bldFile')
+        return self.__xml.getAttribute('mrp')
+    
+    def __getpath(self):
+        """ Path getter. """
+        return os.path.join(os.path.sep, self.__xml.getAttribute('bldFile'))
+            
+    def __getfilters(self):
+        """ filter getter. """
+        filters = []
+        if self.__xml.hasAttribute('filter'):
+            filters = extract_filter_list(self.__xml.getAttribute('filter'))
+        return filters
+
+    id = property(__getid)
+    name = property(_getname)
+    path = property(__getpath)
+    filters = property(__getfilters)
+    
+    
+class _UnitGroup(SysDefElement):
+    """ A group of units. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self._xml = node
+        self._units = []
+
+    def __getname(self):
+        """ Name getter method """
+        return self._xml.getAttribute('name')
+
+    def __getunits(self):
+        """ Units getter method """
+        return self._units
+
+    name = property(__getname)
+    units = property(__getunits)
+
+
+class Layer(_UnitGroup):
+    """ Abstract layer from SDF file. """    
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        _UnitGroup.__init__(self, node, sysDef)
+        self._modules = []
+        self._module_count = 0
+        for unitNode in recursive_node_scan(self._xml, 'unit'):
+            unit = Unit(unitNode, self._sysDef)
+            self._units.append(unit)
+            self._sysDef.addElement(unit)
+
+        for moduleNode in recursive_node_scan(self._xml, 'module') + recursive_node_scan(self._xml, 'component'):
+            module = Module(moduleNode, self._sysDef)
+            self._modules.append(module)
+            self._module_count += 1
+            # Not added to the model.
+            #self._sysDef.addElement(module) 
+    
+    def __getmodules(self):
+        """ Module list accessor. """
+        return self._modules
+
+    def __getmodulescount(self):
+        """ Module cound accessor. """
+        return self._module_count
+    
+    modules = property(__getmodules)
+    modules_count = property(__getmodulescount)
+    
+    
+class Module(_UnitGroup):
+    """ Abstract module from SDF file. """    
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        _UnitGroup.__init__(self, node, sysDef)
+        for unitNode in recursive_node_scan(self._xml, "unit"):
+            unit = Unit(unitNode, self._sysDef)
+            self._units.append(unit)
+
+
+class UnitList(_UnitGroup):
+    """ Abstract unitlist from SDF file. """
+    def __init__(self, node, units, sysDef):
+        """ Initialisation """
+        _UnitGroup.__init__(self, node, sysDef)
+        for unitRef in node_scan(self._xml, "unitRef"):
+            try:
+                self._units.append(units[unitRef.getAttribute('unit')])
+            except KeyError, error:
+                sys.stderr.write("ERROR: Could not find unit '%s'\n" % unitRef.getAttribute('unit') + str(error) + "\n")
+
+
+class BuildLayer(SysDefElement):
+    """ Abstract buildlayer. """
+    def __init__(self, node, config, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+        self.config = config
+        self.targetList = []
+        if self.__xml.hasAttribute('targetList'):
+            for tlname in re.split(r'\s+', self.__xml.getAttribute('targetList').strip()):
+                for target in self._sysDef.targetlists[tlname].targets:
+                    self.targetList.append(target)                
+    
+    def __getcommand(self):
+        """ Command getter method. """
+        return self.__xml.getAttribute('command')
+    
+    def __getunitParallel(self):
+        """ Unit Parallel getter method (boolean). """
+        return (self.__xml.getAttribute('unitParallel').upper() == "Y")
+
+    command = property(__getcommand)
+    unitParallel = property(__getunitParallel)
+    
+    
+class Option(SysDefElement):
+    """ Represents an option used in abld calls. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+    
+    def __getname(self):
+        """ Name getter method. """
+        return self.__xml.getAttribute('name')
+    
+    def __getabldOption(self):
+        """ Abld option getter method. """
+        return self.__xml.getAttribute('abldOption')
+    
+    def __getenable(self):
+        """ Unit Parallel getter method (boolean). """
+        return (self.__xml.getAttribute('enable').upper() == 'Y')
+
+    def __getfilteredOption(self):
+        """ Filtered abld option getter method. """
+        if not self.enable:
+            return ''
+        return self.abldOption
+   
+    name = property(__getname)
+    abldOption = property(__getabldOption)
+    enable = property(__getenable)
+    filteredOption = property(__getfilteredOption)
+    
+
+class SpecialInstruction(SysDefElement):
+    """ Reads special instruction command. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+
+    def __getname(self):
+        """ Name getter method """
+        return self.__xml.getAttribute('name')
+    
+    def __getcommand(self):
+        """ Command getter method """
+        return self.__xml.getAttribute('command')
+
+    def __getpath(self):
+        """ Path getter method """
+        return self.__xml.getAttribute('cwd')
+    
+    name = property(__getname)
+    command = property(__getcommand)
+    path = property(__getpath)
+    
+    
+class Task(SysDefElement):
+    """ Abstract task node from SDF xml. """
+    def __init__(self, node, config, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+        self._config = config
+        self.__job = None
+
+    def units(self):
+        """ Process unit list from layers """
+        result = []
+        for ref in node_scan(self.__xml, "unitListRef"):
+            units = []
+            try:
+                units = self._config.sdf.unitlists[ref.getAttribute('unitList')].units
+                for unit in units:
+                    reason = filter_out(self._config.filters, unit.filters)
+                    if reason == None:
+                        result.append(unit)
+                    else:
+                        sys.stderr.write("Filter-out: %s (%s)\n" % (unit.id, reason)) 
+            except KeyError, error:
+                sys.stderr.write("ERROR: Could not find unitList of layer %s\n" % error)
+        return result
+        
+    def __getjob(self):
+        """ Return the job contained inside the task. """
+        for job in node_scan(self.__xml, r"buildLayer|specialInstructions"):
+            if job.nodeName == 'specialInstructions':
+                self.__job = SpecialInstruction(job, self._sysDef)
+            elif job.nodeName == 'buildLayer':
+                self.__job = BuildLayer(job, self._config, self._sysDef)
+        return self.__job
+
+    job = property(__getjob)
+
+
+class Configuration(SysDefElement):
+    """ Abstract configuration from SDF file. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+    
+    def __getname(self):
+        """ Name getter method """
+        return self.__xml.getAttribute('name')    
+
+    def __getfilters(self):
+        """ Filters getter method. """
+        filters = []
+        if self.__xml.hasAttribute('filter'):
+            filters = extract_filter_list(self.__xml.getAttribute('filter'))
+        return filters  
+    
+    def __getlayerrefs(self):
+        """ Layer's references getter method. """
+        result = []
+        for ref in node_scan(self.__xml, "layerRef"):
+            try:
+                result.append(self._sysDef.layers[ref.getAttribute('layerName')])
+            except KeyError, error:
+                sys.stderr.write("ERROR: Could not find layer '%s'\n" % error)
+        return result
+    
+    def __getunitlistrefs(self):
+        """ Unit list references getter method. """
+        result = []
+        for ref in node_scan(self.__xml, "unitListRef"):
+            try:
+                result.append(self._sysDef.unitlists[ref.getAttribute('unitList')])
+            except KeyError, error:
+                sys.stderr.write("ERROR: Could not find unitList %s\n" % error)
+        return result
+        
+    def __getunits(self):
+        """ Return unit from unitList or layer. """
+        result = []            
+        for ref in node_scan(self.__xml, "unitListRef|layerRef"):
+            units = []
+            try:
+                if ref.nodeName == 'unitListRef':
+                    units = self._sysDef.unitlists[ref.getAttribute('unitList')].units
+                else:
+                    units = self._sysDef.layers[ref.getAttribute('layerName')].units
+                for unit in units:
+                    reason = filter_out(self.filters, unit.filters)
+                    if reason == None:
+                        # Get the unit object from the cache if this is a string
+                        # TODO - remove once unitlist returns list of Unit objects
+                        if isinstance(unit, types.UnicodeType):
+                            unit = self._sysDef[unit]
+                        result.append(unit)
+                    else:
+                        sys.stderr.write("Filter-out: %s (%s)\n" % (unit.id, reason)) 
+            except KeyError, error:
+                sys.stderr.write("ERROR: Could not find unitList or layer %s\n" % error)
+        return result
+    
+    def __gettasks(self):
+        """ Tasks getter method. """
+        result = []
+        for task in node_scan(self.__xml, "task"):
+            result.append(Task(task, self, self._sysDef))
+        return result
+    
+    name = property(__getname)
+    filters = property(__getfilters)    
+    layerrefs = property(__getlayerrefs)
+    unitlistrefs = property(__getunitlistrefs)
+    units = property(__getunits)
+    tasks = property(__gettasks)
+
+
+class Target(SysDefElement):
+    """ Abstract target from SDF file. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+
+    def __getname(self):
+        """ Name getter method. """
+        return self.__xml.getAttribute('name')    
+
+    def __getabldTarget(self):
+        """ Abld target getter method. """
+        return self.__xml.getAttribute('abldTarget')
+
+    name = property(__getname)
+    abldTarget = property(__getabldTarget)
+
+
+class TargetList(SysDefElement):
+    """ Abstract targetlist from SDF file. """
+    def __init__(self, node, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.__xml = node
+
+    def __getname(self):
+        """ Name getter method. """
+        return self.__xml.getAttribute('name')    
+
+    def __gettargets(self):
+        """ Targets getter method. """
+        result = []
+        for target in re.split(r'\s+', self.__xml.getAttribute('target')):
+            result.append(self._sysDef.targets[target.strip()])
+        return result
+        
+    name = property(__getname)
+    targets = property(__gettargets)    
+
+
+class SystemDefinition(object):
+    """ Logical representation of the System Definition.
+    
+    The System Definition is defined in terms of a system model and a
+    build model. The default physical representation of this is the Symbian
+    XML format. """
+    def __init__(self, filename):
+        """ Initialisation """
+        self.__xml = xml.dom.minidom.parse(open(filename, "r"))
+        self._cache = {}
+        #TODO - why store these as hashes?
+        self._units = {}
+        self._layers = {}
+        self._modules = {}
+        self._unitlists = {}
+        self._configurations = {}
+        self._options = {}
+        self._targets = {}
+        self._targetlists = {}
+        self.__parse()
+    
+    def __getunits(self):
+        """ Units getter method. """
+        return self._units
+    
+    def __getmodules(self):
+        """ Modules getter method. """
+        return self._modules
+
+    def __getlayers(self):
+        """ Layers getter method. """
+        return self._layers
+    
+    def __getunitlists(self):
+        """ Unit lists getter method. """
+        return self._unitlists
+    
+    def __getoptions(self):
+        """ Options getter method. """
+        return self._options    
+    
+    def __getconfigurations(self):
+        """ Configurations getter method. """
+        return self._configurations
+
+    def __gettargetlists(self):
+        """ Targets lists getter method. """
+        return self._targetlists
+
+    def __gettargets(self):
+        """ Targets getter method. """
+        return self._targets
+    
+    units = property(__getunits)
+    unitlists = property(__getunitlists)
+    layers = property(__getlayers)
+    options = property(__getoptions)
+    configurations = property(__getconfigurations)
+    targetlists = property(__gettargetlists)
+    targets = property(__gettargets)
+    modules = property(__getmodules)
+    
+    def __parse(self):
+        for l in self.__xml.getElementsByTagName('layer'):
+            layer = Layer(l, self)
+            self.layers[layer.name] = layer
+            self.addElement(layer)
+            for unit in layer.units:
+                self._units[unit.get_id()] = unit
+            for mod in layer.modules:
+                self._modules[mod.name] = mod
+            
+        for build in self.__xml.getElementsByTagName('build'):
+            for ul in build.getElementsByTagName('unitList'):
+                unitlist = UnitList(ul, self._units, self)
+                self.unitlists[unitlist.name] = unitlist
+                self.addElement(unitlist)
+
+            for xml_config in build.getElementsByTagName('configuration'):
+                config = Configuration(xml_config, self)
+                self.configurations[config.name] = config
+                self.addElement(config)
+
+            for option_node in build.getElementsByTagName('option'):         
+                option = Option(option_node, self)
+                if option.name == 'SAVESPACE':
+                    continue
+                self.options[option.name] = option 
+                self.addElement(option)
+
+            for target_node in build.getElementsByTagName('target'):
+                target = Target(target_node, self)
+                self.targets[target.name] = target
+                self.addElement(target)
+
+            for targetlist_node in build.getElementsByTagName('targetList'):
+                targetlist = TargetList(targetlist_node, self)
+                self.targetlists[targetlist.name] = targetlist
+                self.addElement(targetlist)
+            
+    def addElement(self, element):
+        """ Adds SysDef element to cache. """
+        #TODO - handle duplicate names of different types
+        if not self._cache.has_key(element.get_id()):
+            self._cache[element.get_id()] = element
+            _logger.info('Adding SysDef element to cache: %s' % str(element))
+        else:
+            _logger.warning("Element already exists: %s" % element.name)
+        
+    def __getitem__(self, key):
+        """ Item getter method. """
+        return self._cache[key]
+    
+    def merge_binaries(self, binaries_reader):
+        """ Merge binaries based on build log and system definition. """
+        for (unit_name, binaries) in binaries_reader:
+            unit_name = unit_name.lower()
+            if self.units.has_key(unit_name):
+                for bin in binaries:
+                    #if bin.find('_stolon_ekern') != -1:
+                    _logger.debug("Merging: %s" % bin)
+                unit = self.units[unit_name]
+                unit.binaries = [Binary(bin.lower(), self) for bin in binaries]
+                for binary in unit.binaries:
+                    self.addElement(binary)
+                    _logger.info('Merging binary: %s' % str(binary))
+            else:
+                _logger.warning('Component found in the build log but not in sysdef: %s' % unit_name)
+                
+    def merge_binary_sizes(self, binary_sizes_reader):
+        """ Merge binary size base on binary sizes input and system definition. """
+        for (binary_name, size, rom_type) in binary_sizes_reader:
+            #if binary_name.find('_stolon_ekern') != -1:
+            
+            binary_name = binary_name.lower()
+            _logger.debug("Merging binary size: %s" % binary_name)
+            if self._cache.has_key(binary_name):
+                binary = self._cache[binary_name]
+                binary.size = size
+                binary.rom_type = rom_type
+            else:
+                _logger.warning('Binary found in the binary sizes input but not in the system definition: %s' % binary_name)
+                
+
+class Binary(SysDefElement):
+    """ A binary file that may go into a ROM image. """
+    
+    def __init__(self, name, sysDef):
+        """ Initialisation """
+        SysDefElement.__init__(self, sysDef)
+        self.name = name
+        
+    
+          
+          
+          
+                                 
+#if __name__ == "__main__":
+#    sdf = SystemDefinitionFile("Z:/output/build/canonical_system_definition.xml")
+#    writer = MakeWriter2("Z:/output/build/makefile")
+#    writer.write(sdf)
+#    writer.close()
+#    print sdf.toMakefile()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/sysdef/io.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,583 @@
+#============================================================================ 
+#Name        : io.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+# pylint: disable-msg=W0212,W0141
+""" IO module for SystemDefinitionFile.
+    - Allow convertion to m,a 
+"""
+import re
+import sys
+import os
+import buildtools
+import sysdef.api
+
+def path_to_makefile_echo(path):
+    """ Cleanup the path to transfer it to the makefile.
+        This is needed for echo command for example.
+    """
+    result = os.path.join(os.environ['EPOCROOT'], path)
+    result = re.sub(r'(.*(?:\\\\)*)\\$', r'\1\\\\', result)
+    return result
+
+def path_to_makefile_command(path):
+    """ Cleanup the path to transfer it to the makefile.
+        This is needed for echo command for example.
+    """
+    result = re.sub(r'%EPOCROOT%', '', path)
+    return result
+
+
+def command_to_makefile(cmd):
+    return re.sub(r'(.*(?:\\\\)*)\\\s*$', r'\1\\\\', cmd)
+
+def command_to_echo(cmd):
+    """ Precede special characters with a caret so
+        that they can output with the DOS echo command 
+    """
+    result = re.sub(r'\|', r'^|', cmd)
+    result = re.sub(r'&', r'^&', result)
+    result = re.sub(r'>', r'^>', result)
+    result = re.sub(r'<', r'^<', result)
+    return result
+
+def get_localtime_command(title='Started at'): 
+    return "perl -e \"print '++ %s '.localtime().\\\"\\n\\\"\"" % title
+
+def get_hires_command(title='Start'): 
+    return "perl -e \"use Time::HiRes; print '+++ HiRes %s '.Time::HiRes::time().\\\"\\n\\\";\"" % title
+
+def is_abld_what_or_check_command(command):
+    """ This function is used to determined if the command is using -c/-w/-what/-check flag. """
+    return re.match(r'abld\s+(\w+\s+)*(-c(heck)?|-w(hat)?)(\s+.*)?', command) != None
+
+def to_target(name):
+    return re.sub("\s", "_", name)
+
+
+class MakeWriter(buildtools.AbstractOutputWriter):
+    def __init__(self, output):
+        buildtools.AbstractOutputWriter.__init__(self, output)
+                 
+    def write(self, sdf):
+        self._fileOut.write("# Generated makefile\n")
+        for option in sdf._options:
+            self._fileOut.write("%s := %s\n\n" % (option, sdf._options[option].filteredOption))
+        for cf in sdf._configurations:
+            self._configuration_to_makefile(sdf._configurations[cf])
+    
+    def _configuration_to_makefile(self, config):
+        sys.stderr.write(" * Generating configuration %s\n" % config.name)
+        
+        self._fileOut.write("%s-UNITLIST := " % config.target)
+        
+        for unit in config.units():
+            self._fileOut.write(" \\\n   %s" % unit.path)
+        
+        self._fileOut.write("\n\n")    
+        self._fileOut.write("%s:\n" % config.target)
+        mainoutput = ""
+        for task in config.tasks:
+            self._fileOut.write(self._task_to_makefile_target(task))
+            mainoutput +=  task._task_to_makefile()
+        
+        self._fileOut.write("\n\n" + mainoutput)
+       
+    def _task_to_makefile(self, task):
+        output = ""
+        if isinstance(task.job, sysdef.api.BuildLayer):
+            if len(task.job.targetList) > 0:        
+                output += "%s-buildLayer-%s:" % (task.job.config.target, task.job.target)
+                for target in task.job.targetList:
+                    output += " $(foreach UNIT,$(%s-UNITLIST),$(UNIT)-command-%s-%s)" % (task.job.config.target, task.job.target, target.target)
+                output += "\n\n"                 
+                for target in task.job.targetList:
+                    if is_abld_what_or_check_command(task.job.command):
+                        command = "%s %s" % (task.job.command, target.abldTarget)
+                    else: 
+                        command = "%s $(KEEPGOING) %s" % (task.job.command, target.abldTarget) 
+                    output += "%%-command-%s-%s:\n" % (task.job.target, target.target) 
+                    output += "\t@echo === Stage=%s == $*\n" % task.job.target             
+                    output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(command))
+                    output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(command))
+                    output += "\t-@%s\n" % get_localtime_command()
+                    output += "\t-@%s\n" % get_hires_command()
+                    output += "\t@echo Chdir $*\n" 
+                    output += "\t-@cd $* && %s\n" % command_to_makefile(command) 
+                    output += "\t-@%s\n" % get_localtime_command("End")
+                    output += "\t-@%s\n" % get_localtime_command("Finished at")
+            else:
+                if not is_abld_what_or_check_command(task.job.command):
+                    command = "%s $(KEEPGOING)" % task.job.command
+                else:
+                    command = task.job.command
+                output += "%s-buildLayer-%s: $(foreach UNIT,$(%s-UNITLIST),$(UNIT)-command-%s)\n\n" % (task.job.config.target, task.job.target, task.job.config.target, task.job.target)
+                output += "%%-command-%s:\n" % task.job.target 
+                output += "\t@echo === Stage=%s == $*\n" % task.job.target           
+                output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(command))
+                output += "\t@echo -- %s\n" % re.sub(r'\|', r'^|', command)
+                output += "\t-@%s\n" % get_localtime_command()
+                output += "\t-@%s\n" % get_hires_command()
+                output += "\t@echo Chdir $*\n" 
+                output += "\t-@cd $* && %s\n" % command_to_makefile(command) 
+                output += "\t-@%s\n" % get_localtime_command("End")
+                output += "\t-@%s\n\n" % get_localtime_command("Finished at")
+            
+        return output
+    
+    def _task_to_makefile_target(self, task):
+        output = ""
+        if isinstance(task.job, sysdef.api.SpecialInstruction):
+            output = ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t@echo === Stage=%s\n" % task.job.name)
+            output += ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t-@perl -e \"print '=== Stage=%s started '.localtime().\\\"\\n\\\"\"\n" % task.job.name)
+            output += "\t@echo === Stage=%s == %s\n" % (task.job.name, task.job.name)
+            output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(task.job.command))
+            output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(task.job.command))
+            output += "\t-@%s\n" % get_localtime_command()
+            output += "\t-@%s\n" % get_hires_command()
+            output += "\t@echo Chdir %s\n" % path_to_makefile_echo(task.job.path)
+            output += "\t-@cd %s && %s\n" % (os.path.join(os.path.sep, path_to_makefile_command(task.job.path)), command_to_makefile(task.job.command))
+            output += "\t-@%s\n" % get_localtime_command("End")
+            output += "\t-@%s\n\n" % get_localtime_command("Finished at")
+            output += ("\t-@perl -e \"print '=== Stage=%s finished '.localtime().\\\"\\n\\\"\"\n\n" % task.job.name)
+        else:
+            output = ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t@echo === Stage=%s\n" % task.job.target)
+            output += ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t-@perl -e \"print '=== Stage=%s started '.localtime().\\\"\\n\\\"\"\n" % task.job.target)
+            output += "\t-@$(MAKE) -k %s-buildLayer-%s\n" % (task.job.config.target, task.job.target)
+            output += ("\t-@perl -e \"print '=== Stage=%s finished '.localtime().\\\"\\n\\\"\"\n\n" % task.job.target)    
+        return output
+        
+        
+class MakeWriter2(buildtools.AbstractOutputWriter):
+    def __init__(self, output):
+        buildtools.AbstractOutputWriter.__init__(self, output)
+        self._command_targets = {}
+               
+    def __read_file(self, filename):
+        f = open(filename)
+        content = f.read()
+        f.close()
+        return content
+     
+    def write(self, sdf):
+        self._fileOut.write("# Generated makefile\n")
+        self._fileOut.write(self.__read_file(os.path.join(os.environ['HELIUM_HOME'], 'tools/compile/ec/ec_functions.mk')))
+        self._fileOut.write("\n\n")
+
+        # options
+        self._fileOut.write("\n# Options\n")
+        for option in sdf._options:
+            self._fileOut.write("%s := %s\n\n" % (option, sdf._options[option].filteredOption))
+        self._fileOut.write("\n# Units\n")
+        for unitid in sdf.units.keys():
+            self._unit_to_makefile(sdf.units[unitid])
+        self._fileOut.write("\n# Layers\n")
+        for layerid in sdf.layers.keys():
+            self._group_to_makefile(sdf.layers[layerid], "LAYER")        
+        self._fileOut.write("\n# Unitlists\n")
+        for unitlistid in sdf.unitlists.keys():            
+            self._group_to_makefile(sdf.unitlists[unitlistid], "UNITLIST")
+
+        self._fileOut.write("\n# Configurations\n")
+        for cf in sdf.configurations.keys():
+            self._configuration_to_makefile(sdf._configurations[cf])
+
+        self._fileOut.write("\n# Helps\n")
+        self._fileOut.write("\nhelp:\n")
+        self._fileOut.write("\t@echo (e)make configurations           display all available configurations.\n")
+        self._fileOut.write("\t@echo (e)make units                    display all available units.\n")
+        
+        self._fileOut.write("\nconfigurations:\n")
+        for cf in sdf.configurations.keys():
+            self._fileOut.write("\t@echo %s\n" % sdf._configurations[cf].name)
+
+        self._fileOut.write("\nunits:\n")
+        for unit in sdf.units.keys():
+            self._fileOut.write("\t@echo %s\n" % sdf.units[unit].id)
+                    
+        
+    def _unit_to_makefile(self, unit):
+        self._fileOut.write("UNIT_%s:=%s|%s|%s\n" % (unit.id, unit.name, unit.path, " ".join(unit.filters)))
+
+    def _group_to_makefile(self, group, gtype):
+        self._fileOut.write("%s_%s:=" % (gtype, to_target(group.name)))
+        for unit in group.units:
+            self._fileOut.write(" \\\n%s" % unit.id)
+        self._fileOut.write(" \n\n")
+        
+    def _configuration_to_makefile(self, config):        
+        for task in config.tasks:
+            self._fileOut.write(self._task_to_makefile(task))
+        self._fileOut.write("\n\n")
+         
+        self._fileOut.write("%s: FILTERS=%s\n" % (config.name, " ".join(config.filters)))
+        self._fileOut.write("%s:\n" % (config.name))        
+        for task in config.tasks:
+            self._fileOut.write(self._task_to_makefile_target(task))
+            
+        self._fileOut.write("\n\n")
+
+    def _task_to_makefile(self, task):
+        output = ""
+        if isinstance(task.job, sysdef.api.BuildLayer):
+            
+            # generating the list of required unit groups
+            glist = []
+            for unitlist in task.job.config.unitlistrefs:
+                glist.append("$(UNITLIST_%s)" % to_target(unitlist.name))
+            for layer in task.job.config.layerrefs:
+                glist.append("$(LAYER_%s)" % to_target(layer.name))
+
+            if len(task.job.targetList) > 0:
+                
+                if not self._buildlayer_target_dep(task.job) in self._command_targets:                    
+                    self._command_targets[self._buildlayer_target_dep(task.job)] = True
+                    output += "%s:" % self._buildlayer_target_dep(task.job)
+                    if task.job.unitParallel:                    
+                        for target in task.job.targetList:
+                            output += " $(foreach unit,$(call filter-unitlist,%s),$(unit)-command-%s-%s)" % (" ".join(glist), self._buildlayer_target(task.job), to_target(target.name))
+                        output += "\n\n"
+                    else:
+                        output += " ; "
+                        for target in task.job.targetList:
+                            output += " $(foreach unit,$(call filter-unitlist,%s),$(call serialize,$(unit)-command-%s-%s))" % (" ".join(glist), self._buildlayer_target(task.job), to_target(target.name))
+                        output += "\n\n"
+                        
+                                                 
+                for target in task.job.targetList:
+                    target_name = "%%-command-%s-%s" % (self._buildlayer_target(task.job), to_target(target.name))
+                    if not target_name in self._command_targets:
+                        self._command_targets[target_name] = True
+                        if is_abld_what_or_check_command(task.job.command):
+                            command = "%s %s" % (task.job.command, target.abldTarget)
+                        else: 
+                            command = "%s $(KEEPGOING) %s" % (task.job.command, target.abldTarget) 
+                        output += "%s:\n" % target_name 
+                        output += "\t@echo === Stage=%s == $(call get_unit_name,$*)\n" % self._buildlayer_target(task.job)            
+                        output += "\t@echo --- ElectricCloud Executed ID $(call get_unit_name,$*)\n"
+                        output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(command))
+                        output += "\t-@%s\n" % get_localtime_command()
+                        output += "\t-@%s\n" % get_hires_command()
+                        output += "\t@echo Chdir $(call get_unit_path,$*)\n" 
+                        output += "\t-@cd $(call get_unit_path,$*) && %s\n" % command_to_makefile(command) 
+                        output += "\t-@%s\n" % get_localtime_command("End")
+                        output += "\t-@%s\n" % get_localtime_command("Finished at")
+                        output += "\n\n"                 
+            else:                
+                if not self._buildlayer_target_dep(task.job) in self._command_targets:
+                    self._command_targets[self._buildlayer_target_dep(task.job)] = True
+                    if task.job.unitParallel:
+                        output += "%s: $(foreach unit,$(call filter-unitlist,%s),$(unit)-command-%s)\n\n" % (self._buildlayer_target_dep(task.job), 
+                                                                                                         " ".join(glist), 
+                                                                                                         self._buildlayer_target(task.job))
+                    else:
+                        output += "%s: ; $(foreach unit,$(call filter-unitlist,%s),$(call serialize,$(unit)-command-%s))\n\n" % (self._buildlayer_target_dep(task.job),
+                                                                                                         " ".join(glist),
+                                                                                                         self._buildlayer_target(task.job))
+                        
+                cmd_target_name = "%%-command-%s" % self._buildlayer_target(task.job)                
+                if not cmd_target_name in self._command_targets: 
+                    self._command_targets[cmd_target_name] = True                                    
+                    if not is_abld_what_or_check_command(task.job.command):
+                        command = "%s $(KEEPGOING)" % task.job.command
+                    else:
+                        command = task.job.command
+                    output += "%s:\n" % cmd_target_name 
+                    output += "\t@echo === Stage=%s == $(call get_unit_name,$*)\n" % self._buildlayer_target(task.job)           
+                    output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(command))
+                    output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(task.job.command))
+                    output += "\t-@%s\n" % get_localtime_command()
+                    output += "\t-@%s\n" % get_hires_command()
+                    output += "\t@echo Chdir $(call get_unit_path,$*)\n" 
+                    output += "\t-@cd $(call get_unit_path,$*) && %s\n" % command_to_makefile(command) 
+                    output += "\t-@%s\n" % get_localtime_command("End")
+                    output += "\t-@%s\n\n" % get_localtime_command("Finished at")            
+        return output
+
+    def _task_to_makefile_target(self, task):
+        output = ""        
+        if isinstance(task.job, sysdef.api.SpecialInstruction):
+            output = ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t@echo === Stage=%s\n" % task.job.name)
+            output += ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t-@perl -e \"print '=== Stage=%s started '.localtime().\\\"\\n\\\"\"\n" % task.job.name)
+            output += "\t@echo === Stage=%s == %s\n" % (task.job.name, task.job.name)
+            output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(task.job.command))
+            output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(task.job.command))
+            output += "\t-@%s\n" % get_localtime_command()
+            output += "\t-@%s\n" % get_hires_command()
+            output += "\t@echo Chdir %s\n" % path_to_makefile_echo(task.job.path)
+            output += "\t-@cd %s && %s\n" % (os.path.join(os.path.sep, path_to_makefile_command(task.job.path)), command_to_makefile(task.job.command))
+            output += "\t-@%s\n" % get_localtime_command("End")
+            output += "\t-@%s\n" % get_localtime_command("Finished at")
+            output += ("\t-@perl -e \"print '=== Stage=%s finished '.localtime().\\\"\\n\\\"\"\n\n" % task.job.name)
+        else:
+            output = ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t@echo === Stage=%s\n" % self._buildlayer_target(task.job))
+            output += ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t-@perl -e \"print '=== Stage=%s started '.localtime().\\\"\\n\\\"\"\n" % self._buildlayer_target(task.job))
+            output += "\t-@$(MAKE) $(MAKEFILE_CMD_LINE) -k %s \"FILTERS=$(FILTERS)\"\n" % self._buildlayer_target_dep(task.job)
+            output += ("\t-@perl -e \"print '=== Stage=%s finished '.localtime().\\\"\\n\\\"\"\n\n" % self._buildlayer_target(task.job))    
+        return output
+    
+    def _buildlayer_target(self, bl):
+        cmd = bl.command + "_".join(map(lambda x: x.name, bl.targetList))
+        cmd = re.sub("[\s]", "_", cmd)
+        cmd = re.sub("[|]", "_pipe_", cmd)
+        cmd = re.sub("[&]", "_and_", cmd)
+        return cmd
+
+    def _buildlayer_target_dep(self, bl):
+        """ Generating target name for buildlayer:
+             <config_name>-buildLayer-<_buildlayer_target_cmd>
+        """
+        return "%s-buildLayer-%s" % (to_target(bl.config.name), self._buildlayer_target(bl))
+
+class MakeWriter3(buildtools.AbstractOutputWriter):    
+    
+    def __init__(self, output):
+        buildtools.AbstractOutputWriter.__init__(self, output)
+        self._command_targets = {}
+        self.build_layers_always_parallel = True
+               
+    def __read_file(self, filename):
+        f = open(filename)
+        content = f.read()
+        f.close()
+        return content
+     
+    def write(self, sdf):
+        self._fileOut.write("# Generated makefile\n")
+        self._fileOut.write(self.__read_file(os.path.join(os.environ['HELIUM_HOME'], 'tools/compile/ec/ec_functions.mk')))
+        self._fileOut.write("\n\n")
+
+        # options
+        self._fileOut.write("\n# Options\n")
+        for option in sdf._options:
+            self._fileOut.write("%s := %s\n\n" % (option, sdf._options[option].filteredOption))
+        self._fileOut.write("\n# Units\n")
+        for unitid in sdf.units.keys():
+            self._unit_to_makefile(sdf.units[unitid])
+        self._fileOut.write("\n# Layers\n")
+        for layerid in sdf.layers.keys():
+            self._group_to_makefile(sdf.layers[layerid], "LAYER")        
+        self._fileOut.write("\n# Unitlists\n")
+        for unitlistid in sdf.unitlists.keys():            
+            self._group_to_makefile(sdf.unitlists[unitlistid], "UNITLIST")
+
+        self._fileOut.write("\n# Configurations\n")
+        for cf in sdf.configurations.keys():
+            self._configuration_to_makefile(sdf._configurations[cf])
+
+        self._fileOut.write("\n# Helps\n")
+        self._fileOut.write("\nhelp:\n")
+        self._fileOut.write("\t@echo (e)make configurations           display all available configurations.\n")
+        self._fileOut.write("\t@echo (e)make units                    display all available units.\n")
+        
+        self._fileOut.write("\nconfigurations:\n")
+        for cf in sdf.configurations.keys():
+            self._fileOut.write("\t@echo %s\n" % sdf._configurations[cf].name)
+
+        self._fileOut.write("\nunits:\n")
+        for unit in sdf.units.keys():
+            self._fileOut.write("\t@echo %s\n" % sdf.units[unit].id)
+                    
+        
+    def _unit_to_makefile(self, unit):
+        self._fileOut.write("UNIT_%s:=%s|%s|%s\n" % (unit.id, unit.name, unit.path, " ".join(unit.filters)))
+
+    def _group_to_makefile(self, group, gtype):
+        self._fileOut.write("%s_%s:=" % (gtype, to_target(group.name)))
+        for unit in group.units:
+            self._fileOut.write(" \\\n%s" % unit.id)
+        self._fileOut.write(" \n\n")
+        
+    def _configuration_to_makefile(self, config):        
+        for task in config.tasks:
+            self._fileOut.write(self._task_to_makefile(task))
+        self._fileOut.write("\n\n")
+         
+        self._fileOut.write("%s: FILTERS=%s\n" % (config.name, " ".join(config.filters)))
+        self._fileOut.write("%s:" % (config.name))
+        if len(config.tasks)>0:
+            self._fileOut.write(" %s-task-%d" % (config.name, len(config.tasks)-1))
+        else:
+            self._fileOut.write(" ; @echo Nothing to do for configuration %s" % (config.name))
+        self._fileOut.write("\n\n")
+        
+        count = 0
+        for task in config.tasks:
+            if count == 0:
+                self._fileOut.write("%s-task-%d:\n" % (config.name, count))
+            else:    
+                self._fileOut.write("%s-task-%d: %s-task-%d\n" % (config.name, count, config.name, count-1))
+            self._fileOut.write(self._task_to_makefile_target(task))
+            count += 1
+            
+        self._fileOut.write("\n\n")
+
+    def _task_to_makefile(self, task):
+        output = ""
+        if isinstance(task.job, sysdef.api.BuildLayer):
+            
+            # generating the list of required unit groups
+            glist = []
+            for unitlist in task.job.config.unitlistrefs:
+                glist.append("$(UNITLIST_%s)" % to_target(unitlist.name))
+            for layer in task.job.config.layerrefs:
+                glist.append("$(LAYER_%s)" % to_target(layer.name))
+
+            if len(task.job.targetList) > 0:
+                
+                if not self._buildlayer_target_dep(task.job) in self._command_targets:                    
+                    self._command_targets[self._buildlayer_target_dep(task.job)] = True
+                    output += "%s:" % self._buildlayer_target_dep(task.job)
+                    if task.job.unitParallel or self.build_layers_always_parallel:                    
+                        for target in task.job.targetList:
+                            output += " $(foreach unit,$(call filter-unitlist,%s),$(unit)-command-%s-%s)" % (" ".join(glist), self._buildlayer_target(task.job), to_target(target.name))
+                        output += "\n\n"
+                    else:
+                        output += " ; "
+                        for target in task.job.targetList:
+                            output += " $(foreach unit,$(call filter-unitlist,%s),$(call serialize,$(unit)-command-%s-%s))" % (" ".join(glist), self._buildlayer_target(task.job), to_target(target.name))
+                        output += "\n\n"
+                        
+                                                 
+                for target in task.job.targetList:
+                    target_name = "%%-command-%s-%s" % (self._buildlayer_target(task.job), to_target(target.name))
+                    if not target_name in self._command_targets:
+                        self._command_targets[target_name] = True
+                        if is_abld_what_or_check_command(task.job.command):
+                            command = "%s %s" % (task.job.command, target.abldTarget)
+                        else: 
+                            command = "%s $(KEEPGOING) %s" % (task.job.command, target.abldTarget) 
+                        output += "%s:\n" % target_name 
+                        output += "\t@echo === Stage=%s == $(call get_unit_name,$*)\n" % self._buildlayer_target(task.job)            
+                        output += "\t@echo --- ElectricCloud Executed ID $(call get_unit_name,$*)\n"
+                        output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(command))
+                        output += "\t-@%s\n" % get_localtime_command()
+                        output += "\t-@%s\n" % get_hires_command()
+                        output += "\t@echo Chdir $(call get_unit_path,$*)\n" 
+                        output += "\t-@cd $(call get_unit_path,$*) && %s\n" % command_to_makefile(command) 
+                        output += "\t-@%s\n" % get_localtime_command("End")
+                        output += "\t-@%s\n" % get_localtime_command("Finished at")
+                        output += "\n\n"                 
+            else:                
+                if not self._buildlayer_target_dep(task.job) in self._command_targets:
+                    self._command_targets[self._buildlayer_target_dep(task.job)] = True
+                    if task.job.unitParallel or self.build_layers_always_parallel:
+                        output += "%s: $(foreach unit,$(call filter-unitlist,%s),$(unit)-command-%s)\n\n" % (self._buildlayer_target_dep(task.job), 
+                                                                                                         " ".join(glist), 
+                                                                                                         self._buildlayer_target(task.job))
+                    else:
+                        output += "%s: ; $(foreach unit,$(call filter-unitlist,%s),$(call serialize,$(unit)-command-%s))\n\n" % (self._buildlayer_target_dep(task.job),
+                                                                                                         " ".join(glist),
+                                                                                                         self._buildlayer_target(task.job))
+                        
+                cmd_target_name = "%%-command-%s" % self._buildlayer_target(task.job)                
+                if not cmd_target_name in self._command_targets: 
+                    self._command_targets[cmd_target_name] = True                                    
+                    if not is_abld_what_or_check_command(task.job.command):
+                        command = "%s $(KEEPGOING)" % task.job.command
+                    else:
+                        command = task.job.command
+                    output += "%s:\n" % cmd_target_name 
+                    output += "\t@echo === Stage=%s == $(call get_unit_name,$*)\n" % self._buildlayer_target(task.job)           
+                    output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(command))
+                    output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(task.job.command))
+                    output += "\t-@%s\n" % get_localtime_command()
+                    output += "\t-@%s\n" % get_hires_command()
+                    output += "\t@echo Chdir $(call get_unit_path,$*)\n" 
+                    output += "\t-@cd $(call get_unit_path,$*) && %s\n" % command_to_makefile(command) 
+                    output += "\t-@%s\n" % get_localtime_command("End")
+                    output += "\t-@%s\n\n" % get_localtime_command("Finished at")            
+        return output
+
+    def _task_to_makefile_target(self, task):
+        output = ""        
+        if isinstance(task.job, sysdef.api.SpecialInstruction):
+            output = ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t@echo === Stage=%s\n" % task.job.name)
+            output += ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t-@perl -e \"print '=== Stage=%s started '.localtime().\\\"\\n\\\"\"\n" % task.job.name)
+            output += "\t@echo === Stage=%s == %s\n" % (task.job.name, task.job.name)
+            output += "\t@echo --- ElectricCloud Executed ID %s\n" % command_to_makefile(command_to_echo(task.job.command))
+            output += "\t@echo -- %s\n" % command_to_makefile(command_to_echo(task.job.command))
+            output += "\t-@%s\n" % get_localtime_command()
+            output += "\t-@%s\n" % get_hires_command()
+            output += "\t@echo Chdir %s\n" % path_to_makefile_echo(task.job.path)
+            output += "\t-@cd %s && %s\n" % (os.path.join(os.path.sep, path_to_makefile_command(task.job.path)), command_to_makefile(task.job.command))
+            output += "\t-@%s\n" % get_localtime_command("End")
+            output += "\t-@%s\n" % get_localtime_command("Finished at")
+            output += ("\t-@perl -e \"print '=== Stage=%s finished '.localtime().\\\"\\n\\\"\"\n\n" % task.job.name)
+        else:
+            output = ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t@echo === Stage=%s\n" % self._buildlayer_target(task.job))
+            output += ("\t@echo ===-------------------------------------------------\n")
+            output += ("\t-@perl -e \"print '=== Stage=%s started '.localtime().\\\"\\n\\\"\"\n" % self._buildlayer_target(task.job))
+            output += "\t-@$(MAKE) $(MAKEFILE_CMD_LINE) -k %s \"FILTERS=$(FILTERS)\"\n" % self._buildlayer_target_dep(task.job)
+            output += ("\t-@perl -e \"print '=== Stage=%s finished '.localtime().\\\"\\n\\\"\"\n\n" % self._buildlayer_target(task.job))    
+        return output
+    
+    def _buildlayer_target(self, bl):
+        cmd = bl.command + "_".join(map(lambda x: x.name, bl.targetList))
+        cmd = re.sub("[\s]", "_", cmd)
+        cmd = re.sub("[|]", "_pipe_", cmd)
+        cmd = re.sub("[&]", "_and_", cmd)
+        return cmd
+
+    def _buildlayer_target_dep(self, bl):
+        """ Generating target name for buildlayer:
+             <config_name>-buildLayer-<_buildlayer_target_cmd>
+        """
+        return "%s-buildLayer-%s" % (to_target(bl.config.name), self._buildlayer_target(bl))
+
+
+class FlashImageSizeWriter(object):
+    """ Writes a .csv file listing the content of the flash images. """
+    def __init__(self, output):
+        """ Initialisation. """
+        self.output = output
+        self._out = file(output, 'w')
+        
+    def write(self, sys_def, config_list):
+        """ Write the .csv data to a file for the given System Definition and configuration name. """
+        self._out.write('component,binary,rom,rofs1,rofs2,rofs3\n')
+        for configuration in sys_def.configurations.values():
+            #print configuration.name  
+            if configuration.name in config_list:
+                for unit in configuration.units:
+                    #print str(unit.name) + '  ' + str(unit.binaries)
+                    for binary in unit.binaries:
+                        # Only print out the binaries for which there is size information
+                        if hasattr(binary, 'size'):
+                            rom_types = {'rom': 0, 'rofs1': 1, 'rofs2': 2, 'rofs3': 3}
+                            rom_type_values = ['', '', '', '']
+                            rom_type_values[rom_types[binary.rom_type]] = str(binary.size)
+                            rom_type_text = ','.join(rom_type_values)
+                            self._out.write('%s,%s,%s\n' % (unit.name, binary.name, rom_type_text))
+                    
+    def close(self):
+        """ Closing the writer. """
+        self._out.close()
+    
+    
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ant.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+#============================================================================ 
+#Name        : test_ant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" ant.py module tests. """
+
+
+import ant
+
+
+def test_get_property():
+    """ Test get_property function. """
+    assert ant.get_property('') == ''
+    
+    # Property was not defined in Ant
+    assert ant.get_property('${foo}') == None
+    
+    # Property was defined, should provide value
+    assert ant.get_property('foo') == 'foo'
+    
+    
+def test_get_previous_build_number():
+    """ Test get_previous_build_number function. """
+    assert ant.get_previous_build_number('01') == ''
+    
+    assert ant.get_previous_build_number('02') == '01'
+    
+    assert ant.get_previous_build_number('oci.01') == ''
+    
+    assert ant.get_previous_build_number('t.02') == 't.01'
+    
+    assert ant.get_previous_build_number('oci.02') == 'oci.01'
+    
+    assert ant.get_previous_build_number('oci.002') == 'oci.001'
+    
+    assert ant.get_previous_build_number('oci.12') == 'oci.11'
+    
+    assert ant.get_previous_build_number('oci.patch.02') == 'oci.patch.01'
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_archive.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,957 @@
+#============================================================================ 
+#Name        : test_archive.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Test the archive.py module."""
+
+import os
+import amara
+import unittest
+import sys
+
+import archive
+import configuration
+import logging
+import fileutils
+import xml.dom.minidom
+
+import test.test_fileutils
+
+
+_logger = logging.getLogger('test.archive')
+    
+    
+root_test_dir = test.test_fileutils.root_test_dir
+
+def setup_module():
+    """ Creates some test data files for file-related testing. """
+    test.test_fileutils.setup_module()
+    
+def teardown_module():
+    """ Cleans up test data files for file-related testing. """
+    test.test_fileutils.teardown_module()
+    
+    
+class ArchivePreBuilderTest(unittest.TestCase):
+    EXEC_FILE = "archive_create.ant.xml"
+
+    def test_ant_exec(self):
+        """Tests that an archive configuration file successfully creates an Ant exec file."""
+        builder = configuration.NestedConfigurationBuilder('tests/data/archive_test.cfg.xml')
+        archiveConfigSet = builder.getConfiguration()
+        archivePreBuilder = archive.ArchivePreBuilder(archiveConfigSet, "config", index=0)
+        buildFilePath = os.path.join(root_test_dir, r'archive_test.ant.xml')
+        archivePreBuilder.write(buildFilePath)
+        build_file = open(buildFilePath, 'r')
+        build_file_content = build_file.read()
+        _logger.debug(build_file_content)
+        resultDoc = amara.parse(build_file_content)
+        build_file.close()
+        # The last target in the Ant file should be called 'all'. Other targets
+        # are named stage1, stage2, etc.
+        assert resultDoc.project.target[-1].name == 'all'
+        os.remove(buildFilePath)
+        
+
+
+class LogicalArchiveTest(unittest.TestCase):
+##    def setup(self):
+##        """Test setup."""
+#        builder = configuration.NestedConfigurationBuilder('tests/data/archive_test.cfg.xml')
+#        self.archiveConfigSet = builder.getConfiguration()
+#        self.config = self.archiveConfigSet.getConfigurations()[0]
+#        self.archivePreBuilder = archive.ArchivePreBuilder(self.archiveConfigSet)
+
+    def test_manifest_files(self):
+        """ A LogicalArchive can create a correct manifest. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'dir1/*.txt',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = [os.path.normpath('dir1/file1.txt')]
+
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        content = open(includeFilePath, 'r').readlines()
+        print content
+        print expectedPaths
+        content = [s.strip().lower() for s in content]
+        assert content == expectedPaths
+    
+    def test_empty_manifest_file(self):
+        """ A LogicalArchive can handle empty manifest. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'nothing',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = []
+
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        content = open(includeFilePath, 'r').readlines()
+        print content
+        print expectedPaths
+        content = [s.strip().lower() for s in content]
+        assert content == expectedPaths
+
+    def test_manifest_files_with_exclude_list(self):
+        """ A LogicalArchive can create a correct manifest. """
+        excludelst = os.path.join(root_test_dir, 'exclude.lst')
+        flh = open(excludelst, 'w+')
+        flh.write("/epoc32/tools/variant/variant.cfg\n")
+        flh.write("\\epoc32\\tools\\abld.pl\n")
+        flh.write(os.path.join(root_test_dir, 'dir1', 'file1.txt') + "\n")
+        flh.write(os.path.join(root_test_dir, 'dir1/subdir1/subdir1_file.txt') + "\n")
+        flh.close()
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'dir1/**',
+                  'exclude.lst': excludelst,
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = [os.path.normpath('dir1/file2.doc'),
+                         os.path.normpath('dir1/file3_no_extension'),
+                         os.path.normpath('dir1/subdir2/subdir2_file_no_extension'),
+                         os.path.normpath('dir1/subdir3/'),
+                         ]
+        expectedPaths.sort()
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        content = open(includeFilePath, 'r').readlines()
+        print content
+        print expectedPaths
+        content = [s.strip().lower() for s in content]
+        content.sort()
+        assert content == expectedPaths
+
+    def test_manifest_files_with_exclude_list_abs_nodrive(self):
+        """ A LogicalArchive can create a correct manifest with external list and drive. """
+        rtd = os.path.splitdrive(os.path.abspath(root_test_dir))[1]
+        excludelst = os.path.join(root_test_dir, 'exclude.lst')
+        flh = open(excludelst, 'w+')
+        flh.write("/epoc32/tools/variant/variant.cfg\n")
+        flh.write("\\epoc32\\tools\\abld.pl\n")
+        flh.write(os.path.join(rtd, 'dir1', 'file1.txt') + "\n")
+        flh.write(os.path.join(rtd, 'dir1/subdir1/subdir1_file.txt') + "\n")
+        flh.close()
+        configDict = {'root.dir': os.path.abspath(root_test_dir),
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'dir1/**',
+                  'exclude.lst': excludelst,
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = [os.path.normpath('dir1/file2.doc'),
+                         os.path.normpath('dir1/file3_no_extension'),
+                         os.path.normpath('dir1/subdir2/subdir2_file_no_extension'),
+                         os.path.normpath('dir1/subdir3/'),
+                         ]
+        expectedPaths.sort()
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        content = open(includeFilePath, 'r').readlines()
+        if sys.platform == "win32":
+            content = [s.strip().lower() for s in content]
+        else:
+            content = [s.strip() for s in content]
+        content.sort()
+        print content
+        print expectedPaths
+        assert content == expectedPaths
+
+    
+    def test_distribution_policy_config(self):
+        expected_paths = [os.path.normpath('s60/component_public/component_public_file.txt'),
+                         os.path.normpath('s60/component_public/Distribution.Policy.S60'),
+                         os.path.normpath('s60/Distribution.Policy.S60'),
+                         os.path.normpath('s60/missing/subdir/Distribution.Policy.S60'),
+                         os.path.normpath('s60/missing/subdir/not_to_be_removed_0.txt'),
+                         os.path.normpath('s60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60'),
+                         os.path.normpath('s60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt'),]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        self.do_distribution_policy_config(expected_paths, policy='0')
+         
+        expected_paths = [os.path.normpath('s60/component_private/component_private_file.txt'),
+                         os.path.normpath('s60/component_private/Distribution.Policy.S60'),]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        self.do_distribution_policy_config(expected_paths, policy='1')
+
+        expected_paths = [os.path.normpath('s60/missing/subdir/another_subdir/to_be_removed_9999.txt'),
+                          os.path.normpath('s60/missing/to_be_removed_9999.txt'),
+                          os.path.normpath('s60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt'),
+                          os.path.normpath('s60/UPPERCASE_MISSING/to_be_removed_9999.txt')]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        self.do_distribution_policy_config(expected_paths, policy=archive.mappers.MISSING_POLICY)
+        
+    def do_distribution_policy_config(self, expected_paths, policy):
+        """ . """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_test',
+                  'include': 's60/',
+                  'distribution.policy.s60': policy,
+                  'selectors': 'policy',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_test_includefile.txt')
+        
+        content = open(includeFilePath, 'r').readlines()
+        if sys.platform == "win32":
+            content = [s.strip().lower() for s in content]
+        else:
+            content = [s.strip() for s in content]
+        content.sort()
+
+        print content
+        if sys.platform == "win32":
+            expected_paths = [s.strip().lower() for s in expected_paths]
+        else:
+            expected_paths = [s.strip() for s in expected_paths]
+        expected_paths.sort()
+        print expected_paths
+        assert content == expected_paths
+        
+    def test_split_manifest_file_unicode(self):
+        """ A LogicalArchive can split a manifest correctly. """
+        configDict = {'root.dir': os.path.abspath(root_test_dir),
+                  'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
+                  'archives.dir': os.path.abspath(root_test_dir),
+                  'name': 'manifest_test_unicode',
+                  'max.files.per.archive': '1',
+                  'include': 'test_unicode/',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)        
+        builder.manifest_to_commands(config, manifest_file_path)
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_includefile.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part01.txt')
+        includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part02.txt')
+        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part03.txt')
+
+        content = open(includeFilePath, 'r').readlines()
+        content1 = open(includeFilePath1, 'r').readlines()
+        content2 = open(includeFilePath2, 'r').readlines()
+        content3 = open(includeFilePath3, 'r').readlines()
+        print "content: ", content
+        print "content1: ", content1
+        print "content2: ", content2
+        print "content3: ", content2
+        content = [s.strip() for s in content]
+        assert len(content) == 3
+        assert len(content1) == 1
+        assert len(content2) == 1
+        assert len(content3) == 1
+
+    def test_distribution_policy_mapper_config(self):
+        """ Testing the policy mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_mapper_test',
+                  'include': 's60/',
+                  'archive.tool': '7za',
+                  'policy.zip2zip': 'true',
+                  'mapper': 'policy',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+
+        
+        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',                           
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths9999 = ['s60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths9999)):
+                expected_paths9999[i] = expected_paths9999[i].lower()
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
+        includeFilePath9999 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_9999.txt')
+        includeFilePathInternal = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test.internal.txt')
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print "Content"
+        print content
+        print "Expected"
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+        
+        content = self.__read_manifest(includeFilePath9999)
+        expected_paths9999.sort()
+        print content
+        print expected_paths9999
+        assert content == expected_paths9999
+
+        assert os.path.exists(includeFilePathInternal) == True
+        print "Commands : ", cmds
+        assert len(cmds) == 3
+
+
+    def test_distribution_policy_mapper_config_no_zip2zip(self):
+        """ Testing the policy mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_mapper_test_noz2z',
+                  'include': 's60/',
+                  'archive.tool': '7za',
+                  'policy.zip2zip': 'false',
+                  'mapper': 'policy'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+
+        
+        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',                           
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths9999 = ['s60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths9999)):
+                expected_paths9999[i] = expected_paths9999[i].lower()
+
+        expected_paths.sort()
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
+        includeFilePath9999 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_9999.txt')
+        includeFilePathInternal = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_noz2z.internal.txt')
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+        
+        content = self.__read_manifest(includeFilePath9999)
+        expected_paths9999.sort()
+        print content
+        print expected_paths9999
+        assert content == expected_paths9999
+
+        assert os.path.exists(includeFilePathInternal) == False
+        print "Commands : ", cmds
+        assert len(cmds) == 1
+
+
+    def test_distribution_policy_mapper_remover_config(self):
+        """ Testing the policy remover mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_mapper_test',
+                  'include': 's60/',
+                  'policy.root.dir': os.path.join(root_test_dir, 's60'),
+                  'archive.tool': '7za',
+                  'mapper': 'policy.remover',
+                  'policy.zip2zip': 'true',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+        
+        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',                           
+                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',                           
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',                           
+                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths.sort()
+        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',                           
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths1.sort()
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+
+        print cmds        
+        assert len(cmds[3]) == 7
+
+
+    def test_distribution_policy_mapper_sf_remover_config(self):
+        """ Testing the policy SFL remover mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'sf_policy_sf_mapper_test',
+                  'include': 'sf/',
+                  'policy.root.dir': os.path.join(root_test_dir, 'sf'),
+                  'archive.tool': '7za',
+                  'mapper': 'sfl.policy.remover',
+                  'policy.zip2zip': 'false',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.extended_for_sf.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+        
+        expected_paths = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',                           
+                           'sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if sys.platform == "win32":
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths3 = ['sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths3)):
+                expected_paths3[i] = expected_paths3[i].lower()
+        expected_paths7 = ['sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths7)):
+                expected_paths7[i] = expected_paths7[i].lower()
+        expected_paths9 = ['sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths9)):
+                expected_paths9[i] = expected_paths9[i].lower()
+ 
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_1.txt')
+        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_3.txt')
+        includeFilePath7 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_7.txt')
+        includeFilePath9 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_9999.txt')
+        
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+
+        content = self.__read_manifest(includeFilePath3)
+        expected_paths3.sort()
+        print content
+        print expected_paths3
+        assert content == expected_paths3
+
+        content = self.__read_manifest(includeFilePath7)
+        expected_paths7.sort()
+        print content
+        print expected_paths7
+        assert content == expected_paths7
+
+        content = self.__read_manifest(includeFilePath9)
+        expected_paths9.sort()
+        print content
+        print expected_paths9
+        assert content == expected_paths9
+        
+        # checking the number of command generated
+        assert len(cmds) == 2, "Must only have 2 steps in the archiving (archiving, removing)."
+        assert len(cmds[0]) == 5, "Must only have 5 output files."
+        print len(cmds[1])
+        for cmd in cmds[1]:
+            print cmd
+        assert len(cmds[1]) == len(expected_paths)-len(expected_paths3), "Remore must be equal to len(expected_paths) - len(expected_paths3)"
+
+    def test_distribution_policy_mapper_epl_remover_config(self):
+        """ Testing the policy EPL remover mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'sf_policy_epl_mapper_test',
+                  'include': 'sf/',
+                  'policy.root.dir': os.path.join(root_test_dir, 'sf'),
+                  'archive.tool': '7za',
+                  'mapper': 'epl.policy.remover',
+                  'policy.zip2zip': 'false',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.extended_for_sf.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+        
+        expected_paths = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths3 = ['sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths3)):
+                expected_paths3[i] = expected_paths3[i].lower()
+        expected_paths7 = ['sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths7)):
+                expected_paths7[i] = expected_paths7[i].lower()
+        expected_paths9 = ['sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if sys.platform == "win32":
+            for i in range(len(expected_paths9)):
+                expected_paths9[i] = expected_paths9[i].lower()
+
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_1.txt')
+        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_3.txt')
+        includeFilePath7 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_7.txt')
+        includeFilePath9 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_9999.txt')
+        
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+
+        content = self.__read_manifest(includeFilePath3)
+        expected_paths3.sort()
+        print content
+        print expected_paths3
+        assert content == expected_paths3
+
+        content = self.__read_manifest(includeFilePath7)
+        expected_paths7.sort()
+        print content
+        print expected_paths7
+        assert content == expected_paths7
+
+        content = self.__read_manifest(includeFilePath9)
+        expected_paths9.sort()
+        print content
+        print expected_paths9
+        assert content == expected_paths9
+        
+        # checking the number of command generated
+        assert len(cmds) == 2, "Must only have 2 steps in the archiving (archiving, removing)."
+        assert len(cmds[0]) == 5, "Must only have 5 output files."
+        assert len(cmds[1]) == len(expected_paths)-len(expected_paths3), "Remore must be equal to len(expected_paths) - len(expected_paths3)"
+
+
+
+
+    def __read_manifest(self, manifest):
+        content = open(manifest, 'r').readlines()
+        if sys.platform == "win32":
+            content = [s.strip().lower() for s in content]
+        else:
+            content = [s.strip() for s in content]
+        content.sort()
+        return content
+        
+
+    def test_split_manifest_file(self):
+        """ A LogicalArchive can split a manifest correctly. """
+        configDict = {'root.dir': os.path.abspath(root_test_dir),
+                  'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
+                  'archives.dir': os.path.abspath(root_test_dir),
+                  'name': 'manifest_test',
+                  'max.files.per.archive': '1',
+                  'include': 'dir/',
+                  'exclude': 'dir/emptysubdir3',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        builder.manifest_to_commands(config, manifest_file_path)
+
+        expectedPaths = ['dir' + os.sep + 'emptysubdir1','dir' + os.sep + 'emptysubdir2']
+        expectedPaths1 = ['dir' + os.sep + 'emptysubdir1\n']
+        expectedPaths2 = ['dir' + os.sep + 'emptysubdir2\n']
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_part01.txt')
+        includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_part02.txt')
+
+        content = open(includeFilePath, 'r').readlines()
+        content1 = open(includeFilePath1, 'r').readlines()
+        content2 = open(includeFilePath2, 'r').readlines()
+        print "content: ", content
+        print "content1: ", content1
+        print "content2: ", content2
+        print "expectedPaths: ", expectedPaths
+        print "expectedPaths1: ", expectedPaths1
+        print "expectedPaths2: ", expectedPaths2
+        content = [s.strip().lower() for s in content]
+        assert content == expectedPaths
+        assert content1 == expectedPaths1
+        assert content2 == expectedPaths2
+
+class CheckRootDirValueTest(unittest.TestCase):
+    
+    def test_checkRootDirValue(self):
+        """ Testing the root drive value. """
+        configDict = {'root.dir': root_test_dir,
+                'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                'archives.dir': root_test_dir,
+                'name': 'regular_path_test',
+                'include': 'dir1/*.txt',
+                'archive.tool': '7za'
+               }
+        configDictUnc = {'root.dir': "\\\\server\\share\\dir",
+                'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                'archives.dir': root_test_dir,
+                'name': 'unc_test',
+                'include': 'dir1/*.txt',
+                'archive.tool': '7za'
+               }
+        config = configuration.Configuration(configDict)
+        configUnc = configuration.Configuration(configDictUnc)
+        builder = MockedArchivePreBuilder(configuration.ConfigurationSet([config, configUnc]), "config", writerType='make', index=0)
+        builder.rewriteXMLFile(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml.parsed'))
+        (build_drive, path) = os.path.splitdrive(os.path.normpath(os.environ['TEMP']))
+        rootList = builder.checkRootDirValue(MockedConfigBuilder(), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml.parsed'), build_drive, 'wvdo_sources')
+        assert rootList is not None
+        if sys.platform == 'win32':
+            roots = builder.getCommonUncRoots(['\\\\server\\share\\dir', 
+                                               '\\\\server\\share', 
+                                               '\\\\server\\share1\\dir',
+                                               '\\\\server2\\share\\somedir'])
+            assert len(roots) == 3
+            assert '\\\\server\\share\\' in roots
+            assert '\\\\server\\share1\\' in roots
+            assert '\\\\server2\\share\\' in roots
+
+class MockedConfigBuilder:
+
+    def writeToXML(self, xml_file, configs, parse_xml_file):
+        pass
+    
+
+class MockedArchivePreBuilder(archive.ArchivePreBuilder):
+    
+    def substUncPath(self, path):
+        if sys.platform != 'win32':
+            return None
+        return fileutils.get_next_free_drive()
+          
+    def unSubStituteDrives(self, drive):
+        pass
+    
+    def rewriteXMLFile(self, xml_file, parse_xml_file):
+        doc = xml.dom.minidom.parse(xml_file)
+        out = open(parse_xml_file, 'w')
+        doc.writexml(out, indent='')
+        out.close()
+            
+  
+
+
+#class ZipArchiverTest(unittest.TestCase):
+#    def setUp(self):
+#        archiveConfig = amara.parse(open('tests/data/zip_archive_test.cfg.xml', 'r'))
+#        self.archivePreBuilder = archive.ArchivePreBuilder(archiveConfig)
+#
+#    def testZipArchiverCommand(self):
+#        """Zip archiver creates correct command."""
+#        archiver = archive.ZipArchiver(self.archivePreBuilder)
+#        archiver._start_archive('foo')
+#        archiver.end_archive()
+#        commands = archiver.commandList.allCommands()
+#        assert len(commands) == 1
+#        command = commands[0]
+#        assert command.executable() == 'zip.exe'
+#        assert command.cmd() == '-R . c:\\temp\\foo.zip'
+#
+#    def testZipArchiverOperation(self):
+#        """Zip archiver runs zip operation correctly."""
+#        buildFilePath = self.archivePreBuilder.createArchiveBuildFile('zip_exec.ant.xml')
+#        result = run(r'ant -f c:\temp\output\temp_build_files\zip_exec.ant.xml all -Dnumber.of.threads=1')
+#        print result
+
+def run( command ):
+    #print "Run command: " + command
+    ( stdin, stdout ) = os.popen4( command )
+    result = stdout.read()
+    return result
+
+
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ats3.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1630 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_ats3.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing ATS3 framework. """
+# pylint: disable-msg=E1101,C0302,w0142,w0603,R0912,F0401,R0902,R0903,R0201,W0404
+#w0142 => * and ** were used
+#w0603 => global variables used TSRC_PATH etc
+#R*    => will be fixed while refactoring
+#F0401 => pylint didn't find "path" module
+#E1101 => Mocker shows mockery
+
+
+from cStringIO import StringIO
+from pprint import pprint
+from xml.etree.ElementTree import fromstring, tostring
+from xml.etree import ElementTree as et
+import difflib
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import tempfile
+import zipfile
+import os
+import subprocess
+
+from path import path
+import amara
+import mocker
+
+from ntpath import sep as atssep
+from ntpath import sep as sossep
+
+
+import ats3
+import ats3.testconfigurator as atc
+import ats3.dropgenerator as adg
+import ats3.parsers as parser
+
+
+TEST_PATH = None
+TEST_FILES = {}
+TSRC = None
+OUTPUT = None
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Bunch(object):
+    """ Configuration object. Argument from constructor are converted into class attributes. """
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+        
+def equal_xml(xml1, xml2):
+    """Check the equality of the given XML snippets.
+    
+    Tag name equality:
+    
+    >>> equal_xml('<a/>', '<a/>')
+    True
+    >>> equal_xml('<a/>', '<b/>')
+    False
+    
+    Attribute equality:
+    
+    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
+    True
+    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
+    False
+    
+    Text content equality:
+    
+    >>> equal_xml('<a>v</a>', '<a>v</a>')
+    True
+    >>> equal_xml('<a>v</a>', '<a>w</a>')
+    False
+    >>> equal_xml('<a>v</a>', '<a></a>')
+    False
+    
+    Text content equality when whitespace differs:
+    >>> equal_xml('<a>v</a>', '<a>v </a>')
+    True
+
+    Equality of child elements:
+    
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
+    True
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
+    True
+    
+    """
+    def __init__():
+        check_instance(xml1, xml2)
+    
+    def check_instance(xml1, xml2):
+        """if xml1 and xml2 are instances, converts to strings"""
+        if isinstance(xml1, basestring):
+            xml1 = fromstring(xml1)
+        if isinstance(xml2, basestring):
+            xml2 = fromstring(xml2)
+        check_tags(xml1, xml2)
+
+    def check_tags(xml1, xml2):
+        """check xml tags and text equality"""
+        if xml1.tag != xml2.tag:
+            return False
+        if xml1.attrib != xml2.attrib:
+            return False
+        if xml1.text:
+            if not xml2.text:
+                return False
+        if xml2.text:
+            if not xml1.text:
+                return False
+
+        produce_xml_children(xml1, xml2)
+
+    def produce_xml_children(xml1, xml2):
+        """checks if xml children are of same length and are equal?"""
+        if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+            return False
+        if xml1.tail is not None and xml2.tail is not None:
+            if xml1.tail.strip() != xml2.tail.strip():
+                return False
+        elif xml1.tail != xml2.tail:
+            return False
+        
+        children1 = list(xml1.getchildren())
+        children2 = list(xml2.getchildren())
+        if len(children1) != len(children2):
+            return False
+        for child1, child2 in zip(children1, children2):
+            return equal_xml(child1, child2)
+    return True        
+
+
+def setup_module():
+    """ Setup test environment. """
+    global TEST_PATH, TSRC, OUTPUT
+    TEST_PATH = path(tempfile.mkdtemp())
+    OUTPUT = TEST_PATH.joinpath(r"output")
+    component = TEST_PATH
+    component.joinpath("group").makedirs()
+    for path_parts in (("tsrc", "group", "bld.inf"),
+                       ("tsrc", "group", "test.pkg"),
+                       ("tsrc", "testmodules", "file1.dll"),
+                       ("tsrc", "testmodules", "file2.dll"),
+                       ("tsrc", "data", "file1"),
+                       ("tsrc", "data", "file2"),
+                       ("tsrc", "data", "file3"),
+                       ("tsrc", "data", "mmc", "file4"),
+                       ("tsrc", "data", "c", "file5"),
+                       ("tsrc", "conf", "file1.cfg"),
+                       ("tsrc", "conf", "file2.cfg"),
+                       ("tsrc", "init", "TestFramework.ini"),
+                       ("tsrc", "custom", "prepostaction.xml"),
+                       ("tsrc", "custom", "postpostaction.xml"),
+                       # These do not have to be under 'tsrc':
+                       ("tsrc", "output", "images", "file1.fpsx"),
+                       ("tsrc", "output", "images", "file2.fpsx"),
+                       ("tsrc", "sis", "file1.sisx"),
+                       ("tsrc", "sis", "file2.sisx"),
+                       ("tsrc", "sis", "file3.sisx"),
+                       ("tsrc", "trace_init", "trace_activation_1.xml")):
+        filepath = component.joinpath(*path_parts)
+        if not filepath.parent.exists():
+            filepath.parent.makedirs()
+        filepath.touch()
+        TEST_FILES.setdefault(path_parts[1], []).append(filepath)
+    TSRC = component.joinpath("tsrc")
+    filepath = OUTPUT.joinpath("pmd", "pmd_file.pmd")
+    if not filepath.parent.exists():
+        filepath.parent.makedirs()
+    filepath.touch()
+    TEST_FILES.setdefault("pmd_file", []).append(filepath)
+    tracing = component.joinpath("tsrc", "trace_init")
+    root = E('ConfigurationFile')
+    confs = E("Configurations")
+    trace_act = SE(confs, "TraceActivation")
+    conf = SE(trace_act, "Configuration")
+    conf.set('Name', 'MCU')
+    mcu = SE(conf, "MCU")
+    sett = SE(mcu, "settings")
+    SE(sett, "timestamp")
+    root.append(confs)
+    ettree = et.ElementTree(root)
+    doc = amara.parse(et.tostring(ettree.getroot()))
+    handle = open(tracing.joinpath("trace_activation_1.xml"), "w")
+    handle.write(doc.xml(indent="yes"))
+    handle.close()
+#    tracing.writestr("trace_activation_1.xml", doc.xml(indent=u"yes"))
+    group = component.joinpath("tsrc", "group")
+    group.joinpath("bld.inf").write_text(
+        r"""
+        PRJ_TESTMMPFILES
+        stif.mmp /* xyz.mmp */ abcd.mmp
+        /*xyz.mmp*/
+        eunit.mmp /* xyz.mmp */
+        both.mmp
+        ..\sub-component\group\sub-component.mmp
+        """.replace('\\', os.sep))
+
+    group.joinpath("test.pkg").write_text(
+        r"""
+        ;Language - standard language definitions
+        &EN
+        
+        ; standard SIS file header
+        #{"BTEngTestApp"},(0x04DA27D5),1,0,0
+        
+        ;Supports Series 60 v 3.0
+        (0x101F7961), 0, 0, 0, {"Series60ProductID"}
+        
+        ;Localized Vendor Name
+        %{"BTEngTestApp"}
+        
+        ;Unique Vendor name
+        :"Nokia"
+        
+        ; Files to copy
+        "\tsrc\testmodules\file1.dll"-"c:\sys\bin\file1.dll"
+        "\tsrc\testmodules\file2.dll"-"c:\sys\bin\file2.dll"
+        "\tsrc\data\file1"-"e:\sys\bin\file1"
+        "\tsrc\data\file2"-"e:\sys\bin\file2"
+        "\tsrc\data\file3"-"e:\sys\bin\file3"
+        "\tsrc\conf\file1.cfg"-"!:\sys\bin\file1.cfg"
+        "\tsrc\conf\file2.cfg"-"!:\sys\bin\file2.cfg"
+        "\tsrc\init\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
+        "\tsrc\sis\file1.sisx"-"!:\sys\bin\file1.sisx"
+        "\tsrc\sis\file2.sisx"-"!:\sys\bin\file2.sisx"
+        """.replace('\\', os.sep))
+    group.joinpath("stif.mmp").write_text("LIBRARY stiftestinterface.lib")
+    group.joinpath("eunit.mmp").write_text("LIBRARY eunit.lib")
+    group.joinpath("both.mmp").write_text("LIBRARY stiftestinterface.lib eunit.lib")
+    init = component.joinpath("tsrc", "init")
+    
+    init.joinpath("TestFramework.ini").write_text(
+        r"""
+#     - Sets a device reset module's dll name(Reboot).
+#        + If Nokia specific reset module is not available or it is not correct one
+#          StifHWResetStub module may use as a template for user specific reset
+#          module. 
+
+[Engine_Defaults]
+
+TestReportMode= FullReport        # Possible values are: 'Empty', 'Summary', 'Environment',
+                                                               'TestCases' or 'FullReport'
+
+CreateTestReport= YES            # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT            # Possible values: TXT or HTML
+        
+        """)
+
+
+def teardown_module():
+    """ Cleanup environment after testing. """    
+    def __init__():
+        path(TEST_PATH).rmtree()
+
+# CTC related functions    
+def check_ctc_write(steps):
+    """Checks if CTC data is written on the CTC log"""
+    step = steps.next()
+    assert step.get("name") == "Save CTC data"
+    assert step.findtext("./command") == "execute"
+    params = step.findall("./params/param")
+    assert params[0].get("parameters") == "writelocal"
+    assert params[1].get("file") == path(r"z:\sys\bin\ctcman.exe")
+    step = steps.next()
+    assert step.get("name") == "Save CTC data"
+    assert step.findtext("./command") == "execute"
+    params = step.findall("./params/param")
+    assert params[0].get("parameters") == "writefile"
+    assert params[1].get("file") == path(r"z:\sys\bin\ctcman.exe")
+
+def check_ctc_log(steps, testtype=""):
+    """Fetches CTC Log"""
+    #For the ctcdata.txt to be published on the ATS network drive
+    step = steps.next()
+    assert step.get("name") == "Fetch CTC data for post commands execution" #"Fetch and clean CTC data"
+    assert step.findtext("./command") == "fetch-log"
+    params = step.findall("./params/param")
+    assert params[0].get("delete") == "false"
+    if testtype == "withpkgfiles":
+        assert params[1].get("local-path") == r"\\10.0.0.1\ctc_helium\builds\drop0\set1\ctcdata"
+    else:
+        assert params[1].get("local-path") == r"\\10.0.0.1\ctc_helium\builds\drop0\set0\ctcdata"
+    assert params[2].get("path") == path(r"c:" + os.sep + "data" + os.sep + "ctc" + os.sep + "ctcdata.txt")
+    
+    #For the ctcdata.txt to be published on the build network drive
+    step = steps.next()
+    assert step.get("name") == "Fetch and clean CTC data" #"Fetch and clean CTC data"
+    assert step.findtext("./command") == "fetch-log"
+    params = step.findall("./params/param")
+    assert params[0].get("delete") == "true"
+    assert params[1].get("path") == path(r"c:" + os.sep + "data" + os.sep + "ctc" + os.sep + "ctcdata.txt")
+
+def check_ctc_start(steps):
+    """Checks if CTC starts in ATS"""
+    step = steps.next()
+    assert step.get("name") == "Create CTC log dir"
+    assert step.findtext("./command") == "makedir"
+    params = step.findall("./params/param")
+    assert params[0].get("dir") == path(r"c:" + os.sep + "data" + os.sep + "ctc")
+    step = steps.next()
+    assert step.get("name") == "CTC start"
+    assert step.findtext("./command") == "execute"
+    params = step.findall("./params/param")
+    assert params[0].get("file") == path(r"z:\sys\bin\ctcman.exe")   
+
+def check_fetch_logs(steps):
+    """Checks fetching log directory is created"""
+    step = steps.next()
+    if "Fetch test" in step.get("name"):
+        assert step.get("name") == "Fetch test module logs"
+        assert step.findtext("./command") == "fetch-log"
+        params = step.findall("./params/param")
+        assert params[0].get("type") == "text"
+        assert params[1].get("delete") == "true"
+        if step.get("harness") == "STIF":
+            assert params[2].get("path") == path(r"c:" + os.sep + "logs" + os.sep + "testframework" + os.sep + "*")
+        elif step.get("harness") == "EUNIT":
+            assert params[2].get("path") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "*")
+    else:
+        step = steps.next()
+        assert step.get("name") == "Fetch test module logs"
+        assert step.findtext("./command") == "fetch-log"
+        params = step.findall("./params/param")
+        assert params[0].get("type") == "text"
+        assert params[1].get("delete") == "true"
+        assert params[2].get("path") == path(r"c:" + os.sep + "logs" + os.sep + "testframework" + os.sep + "*")  
+
+def check_diamonds_action(action):
+    """ Testing Diamonds action. """
+    assert action.findtext("./type") == "DiamondsAction"
+    assert not action.findall("./params/param") 
+
+def check_send_email_action(action, reportemail):
+    """verifies if sening email option works"""
+    assert action.findtext("./type") == "SendEmailAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "subject"
+    assert params[0].get("value") == "email subject"
+    assert params[1].get("name") == "type"
+    assert params[1].get("value") == "ATS3_REPORT"
+    assert params[2].get("name") == "send-files"
+    assert params[2].get("value") == "true"
+    assert params[3].get("name") == "to"
+    assert params[3].get("value") == reportemail
+
+def check_ats_report_action(action, filestore):
+    """verifies if sening ATS report option works"""
+    assert action.findtext("./type") == "FileStoreAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "to-folder"
+    assert params[0].get("value") == filestore
+    assert params[1].get("name") == "report-type"
+    assert params[1].get("value") == "ATS_REPORT"
+    assert params[2].get("name") == "date-format"
+    assert params[2].get("value") == "yyyyMMdd"
+    assert params[3].get("name") == "time-format"
+    assert params[3].get("value") == "HHmmss"
+
+def check_stif_report_action(action, filestore):
+    """verifies if sening STIF report option works"""
+    assert action.findtext("./type") == "FileStoreAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "to-folder"
+    assert params[0].get("value") == filestore
+    assert params[1].get("name") == "report-type"
+    assert params[1].get("value") == "STIF_COMPONENT_REPORT_ALL_CASES"
+    assert params[2].get("name") == "run-log"
+    assert params[2].get("value") == "true"
+    assert params[3].get("name") == "date-format"
+    assert params[3].get("value") == "yyyyMMdd"
+    assert params[4].get("name") == "time-format"
+    assert params[4].get("value") == "HHmmss"
+
+def check_log_dir(steps):
+    """ Test the log dir. """
+    step = steps.next()
+    if step.get("harness") is "STIF":
+        assert step.get("name") == "Create STIF log dir"
+    elif step.get("harness") is "EUNIT":
+        assert step.get("name") == "Create EUNIT log dir"
+    assert step.findtext("./command") == "makedir"
+
+def check_trace_start(steps, filestore):
+    """Checks if tracing is started on the ATS"""
+    step = steps.next()
+    assert step.get("name") == "Start tracing"
+    assert step.findtext("./command") == "trace-start"
+    params = step.findall("./params/param")
+    assert params[0].get("ta") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_activation" + os.sep + "trace_activation_1.xml")
+    assert params[1].get("tgrp") == "MCU"
+    assert params[2].get("pmd") == path(r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd")
+    assert params[3].get("log") == filestore.joinpath("traces", "set0", "tracelog.blx")
+    assert params[4].get("timeout") == "60"
+    assert params[5].get("date-format") == "yyyyMMdd"
+    assert params[6].get("time-format") == "HHmmss"
+    
+def check_trace_end_steps(steps, filestore):
+    """ Test trace end step. """
+    step = steps.next()
+    assert step.get("name") == "Stop tracing"
+    assert step.findtext("./command") == "trace-stop"
+    params = step.findall("./params/param")
+    assert params[0].get("timeout") == "60"
+    step = steps.next()
+    assert step.get("name") == "Convert tracing"
+    assert step.findtext("./command") == "trace-convert"
+    params = step.findall("./params/param")
+    assert params[0].get("pmd") == path(r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd")
+    assert params[1].get("log") == filestore.joinpath("traces", "set0", "tracelog.blx")
+    assert params[2].get("timeout") == "60"
+    assert params[3].get("date-format") == "yyyyMMdd"
+    assert params[4].get("time-format") == "HHmmss"
+
+class TestTestPlan(mocker.MockerTestCase):
+    """Creates TestPlan mocker setup"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)  
+          
+    def setUp(self):
+        """ Setup TestTestPlan testsuite. """
+        opts = Bunch(testrun_name="testrun", harness="STIF", 
+                     device_type="product", plan_name="ats3_test_plan",
+                     diamonds_build_url="", report_email="", file_store=path(), test_timeout="60",
+                     device_hwid="5425", trace_enabled="True", ctc_enabled="True", eunitexerunner_flags="/E S60AppEnv /R Off", 
+                     multiset_enabled=False, ats_network_drive=r"10.0.0.1#x:\ats\drop0.zip", monsym_files="")
+        self.atp = ats3.Ats3TestPlan(opts)
+        self.config_files = TEST_FILES["conf"]
+        self.data_files = TEST_FILES["data"]
+        self.engine_ini_file = TEST_FILES["init"][0]
+        self.image_files = TEST_FILES["output"]
+        self.sis_files = TEST_FILES["sis"]
+        self.testmodule_files = TEST_FILES["testmodules"]
+        self.ctc_enabled = self.atp["ctc_enabled"]
+        self.custom_dir = "CustomD"
+        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
+        if self.atp["trace_enabled"].lower() == "true":
+            self.trace_activation_files = TEST_FILES["trace_init"]    
+            self.pmd_files = TEST_FILES["pmd_file"]
+        else:
+            self.trace_activation_files = []    
+            self.pmd_files = []
+        self.test_timeout = self.atp["test_timeout"]
+        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
+        self.device_hwid = self.atp["device_hwid"]
+        self.test_harness = self.atp["harness"]
+        self.src_dst = [("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file1.dll", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll", "testmodule"),
+            ("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file2.dll", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll", "testmodule"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file1", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file2", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file3", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file1.cfg", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg", "conf"),
+            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file2.cfg", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg", "conf"),
+            ("" + os.sep + "tsrc" + os.sep + "init" + os.sep + "TestFramework.ini", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini", "engine_ini"),
+            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file1.sisx", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.sisx", ""),
+            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file2.sisx", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.sisx", ""),]
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+
+    def test_creation(self):
+        """ Testing creation. """        
+        assert self.atp["testrun_name"] == "testrun"
+        assert self.atp["harness"] == "STIF"
+        assert self.atp["device_type"] == "product"
+    
+    def test_insert_set(self):
+        """ Inserting a set of file. """        
+        self.atp.insert_set(data_files=self.data_files,
+                           config_files=self.config_files,
+                           engine_ini_file=self.engine_ini_file,
+                           image_files=self.image_files,
+                           testmodule_files=self.testmodule_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(image_files=self.image_files,                           
+                           engine_ini_file=self.engine_ini_file,
+                           sis_files=self.sis_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(data_files=self.data_files,
+                           config_files=self.config_files,
+                           engine_ini_file=self.engine_ini_file,
+                           image_files=self.image_files,
+                           testmodule_files=self.testmodule_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           src_dst=self.src_dst,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(engine_ini_file=self.engine_ini_file,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           image_files=self.image_files,
+                           test_harness=self.test_harness,
+                           src_dst=self.src_dst,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(test_timeout=self.test_timeout,      
+                           eunitexerunner_flags=self.eunitexerunner_flags,               
+                           image_files=self.image_files,                        
+                           test_harness=self.test_harness,                      
+                           src_dst=self.src_dst,                                
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)  
+
+        assert self.atp.sets[0] == dict(name="set0",
+                                       data_files=self.data_files,
+                                       config_files=self.config_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=self.testmodule_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=[],
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set0", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        assert self.atp.sets[1] == dict(name="set1",
+                                       image_files=self.image_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       sis_files=self.sis_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set1", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+
+        assert self.atp.sets[2] == dict(name="set2",
+                                       data_files=self.data_files,
+                                       config_files=self.config_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=self.testmodule_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set2", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        assert self.atp.sets[3] == dict(name="set3",
+                                       data_files=[],
+                                       config_files=[],
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=[],
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set3", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+
+        assert self.atp.sets[4] == dict(name="set4",
+                                       data_files=[],
+                                       config_files=[],
+                                       engine_ini_file=None,
+                                       image_files=self.image_files,
+                                       testmodule_files=[],
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set4", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        
+    def test_post_actions_email(self):
+        """ Testing the send email post-action. """        
+        assert not self.atp.post_actions
+        receiver = "joe.average@example.com"
+        self.atp.report_email = receiver
+        assert len(self.atp.post_actions) == 1
+        action, items = self.atp.post_actions[0]
+        items = dict(items)
+        assert action == "SendEmailAction"
+        assert items["to"] == receiver
+    
+    def test_post_actions_ats3_report_only(self):
+        """ Testing the ats3 report only post-action. """        
+        file_store = path("path/to/files")
+        self.atp.file_store = file_store
+        self.atp.harness = "EUNIT"
+        assert len(self.atp.post_actions) == 2
+        action, items = self.atp.post_actions[0]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ATS3_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ATS3_REPORT")
+    
+    def test_post_actions_stif(self):
+        """ Testing STIF post-actions. """        
+        file_store = path("path/to/files")
+        self.atp.file_store = file_store
+        assert len(self.atp.post_actions) == 2
+        action, items = self.atp.post_actions[1]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "STIF_COMPONENT_REPORT_ALL_CASES"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("STIF_REPORT")
+        
+    def test_post_actions_diamonds(self):
+        """ Testing Diamonds post-actions. """        
+        self.atp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        assert len(self.atp.post_actions) == 1
+        action, items = self.atp.post_actions[0]
+        assert action == "DiamondsAction"
+        assert not items
+
+
+class TestComponentParser(mocker.MockerTestCase):
+    """ Testing the Ats3ComponentParser component parser. """
+    
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+    
+    def assert_paths(self, path1, path2):
+        """ Checking the path. Validates that path1 and path2 are instance of path and they are equals. """
+        if not isinstance(path1, path):
+            path1 = path(path1)
+        if not isinstance(path2, path):
+            path2 = path(path2)            
+        return self.assertEqual(path1.normpath(), path2.normpath())
+    
+    def setUp(self):
+        """ Setting up TestComponentParser testsuite."""
+        opts = Bunch(build_drive=path(TEST_PATH+os.sep), target_platform="target platform", eunitexerunner_flags="/E S60AppEnv /R Off",
+                     data_dir=["data"], flash_images=[], sis_files=[], test_timeout="60", harness="STIF", trace_enabled="True")
+        self.acp = atc.Ats3ComponentParser(opts)
+        self.acp.tsrc_dir = TSRC
+      
+    def test_detect_dlls(self):
+        """ Testing dlls detection. """
+        # Setup mock objects.
+        process = self.mocker.mock()
+        process.communicate()
+        self.mocker.result(["lib1.dll\npath/to/another/library.dll\nsome/other/file.txt\nlib2.dll\nlib3.dll\n"])
+        obj = self.mocker.replace("subprocess.Popen")
+        obj("abld -w test build target platform", shell=True, stdout=subprocess.PIPE)
+        self.mocker.result(process)
+        
+        exists = self.mocker.replace("os.path.exists")
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(False)
+        
+        self.mocker.replay()
+        
+        self.assertEqual([u"lib1.dll", u"library.dll", u"lib2.dll"],
+                         [dll.name for dll in self.acp.tsrc_dll_files()])
+
+    def test_harness(self):
+        """ Detect test harness."""
+        mmp_parser = parser.MmpFileParser()
+        group = TSRC.joinpath("group")
+        for harness, mmp in [
+            ("STIF", group / "stif.mmp"),
+            ("EUNIT", group / "eunit.mmp"),
+            ("STIF", group / "both.mmp"),
+            ]:
+            self.assertEqual(harness, mmp_parser.get_harness(mmp))
+
+class TestXMLGeneration(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.data_files = None
+        self.config_files = None
+        self.testmodule_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.test_harness = None     
+        self.src_dst = []
+        self.trace_enabled = None
+        self.pmd_files = None
+        self.trace_activation_files = None
+        self.ctc_enabled = None
+        self.eunitexerunner_flags = None
+        self.test_plan = None
+        self.gen = None
+        self.custom_dir = None
+            
+    def generate_xml(self, trace_enabled="False"):
+        """ Generating the XML. """
+        def files(*paths):
+            """creating tsrc path list"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
+        self.data_files = files("data/file1", "data/file2", "data/file3")
+        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path(r"path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.test_harness = "STIF"        
+        self.src_dst = []
+        self.trace_enabled = trace_enabled
+        self.pmd_files = TEST_FILES["pmd_file"]
+        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
+        self.ctc_enabled = "True"
+        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
+        self.custom_dir = "CustomB"
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ats_network_drive = r"10.0.0.1#x:\ats\drop0.zip"
+
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("STIF")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["custom_dir"]).result("custom")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        
+        mocker.expect(test_plan["ats_network_drive"]).result(self.ats_network_drive)
+                
+        if self.trace_enabled.lower() == "true":
+            mocker.expect(test_plan["trace_enabled"]).result("True")
+        else:
+            mocker.expect(test_plan["trace_enabled"]).result("False")
+        if self.trace_enabled == "False":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir=self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir=self.custom_dir, component_path=self.component_path),
+            ])
+        elif self.trace_enabled == "True":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
+            ])
+        mocker.expect(test_plan.post_actions).result([
+            ("SendEmailAction", (("subject", "email subject"),
+                                 ("type", "ATS3_REPORT"),
+                                 ("send-files", "true"),
+                                 ("to", self.report_email))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ATS_REPORT"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+                                 ("run-log", "true"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        """ Check that the overall test.xml structure is valid. """
+        xml = self.generate_xml()
+        # Check basics.
+        assert xml.find(".").tag == "test"
+        assert xml.find("./name").text == "test"
+        assert xml.find("./buildid").text == self.diamonds_build_url
+        assert xml.find("./target").tag
+        assert xml.find("./target/device").tag
+        harness, type_, device_hwid = xml.findall("./target/device/property")
+        assert harness.get("value") == "STIF"
+        assert type_.get("value") == "product"
+        assert device_hwid.get("value") == "5425"
+        
+        # Check generation of the test plan.
+        assert xml.find("./plan").get("name") == "test Plan"
+        assert xml.find("./plan/session").tag 
+        sets = xml.findall("./plan/session/set")
+        assert len(sets) == 2
+        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
+        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        """ Check that a <set> element's structure is valid. """
+        xml = self.generate_xml()
+        tstset = xml.find("./plan/session/set")
+        assert tstset.tag
+        case = tstset.find("./case")
+        assert case.tag
+        assert case.get("name") == "set0 case"
+        
+    def test_case_flash_elems(self):
+        """ Test case flash elems. """
+        xml = self.generate_xml()
+        case = xml.find("./plan/session/set/case")
+        flashes = case.findall("./flash")
+        assert len(flashes) == len(self.image_files)
+        for i, flash_file in enumerate(self.image_files):
+            assert flashes[i].get("target-alias") == "DEFAULT_STIF"
+            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
+        
+    def test_case_steps(self):
+        """ Test case steps. """
+        xml = self.generate_xml()
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        check_ctc_start(steps)
+        check_log_dir(steps)
+        self.check_install_data(steps)
+        self.check_install_configuration(steps)
+        self.check_install_tmodules(steps)
+        self.check_install_engine_ini(steps)
+        self.check_run_cases(steps)
+        check_ctc_write(steps)
+        check_ctc_log(steps)
+        check_fetch_logs(steps)
+
+    def check_install_data(self, steps):
+        """ Test install data. """
+        for filename in self.data_files:
+            step = steps.next()
+            assert step.get("name") == "Install data: %s" % filename.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")            
+            src = params[0].get("src")
+            assert src.name == filename.name
+            assert src.parent == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "data")            
+            dst = params[1].get("dst")
+            assert dst.name == filename.name
+            assert dst.parent == path(r"e:\testing\data")
+    
+    def check_install_configuration(self, steps):
+        """ Test install configuration. """
+        for filepath in self.config_files:
+            step = steps.next()
+            assert step.get("name") == "Install conf: %s" % filepath.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")
+            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "conf") / filepath.name
+            assert params[1].get("dst") == path(r"e:\testing\conf") / filepath.name
+
+    def check_install_tmodules(self, steps):
+        """ Test install tmodules. """
+        for filepath in self.testmodule_files:
+            step = steps.next()
+            assert step.get("name") == "Install testmodule: %s" % filepath.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")
+            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules") / filepath.name
+            assert params[1].get("dst") == path(r"c:\sys\bin") / filepath.name            
+    
+    def check_install_engine_ini(self, steps):
+        """ Test install engine ini. """
+        filepath = self.engine_ini_file
+        step = steps.next()
+        assert step.get("name") == "Install engine_ini: %s" % filepath.name
+        assert step.findtext("./command") == "install"
+        params = step.findall("./params/param")
+        assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "init") / filepath.name
+        assert params[1].get("dst") == path(r"c:" + os.sep + "testframework") / filepath.name
+    
+    def check_run_cases(self, steps):
+        """ Test run cases. """
+        step = steps.next()
+        filepath = self.engine_ini_file
+        assert step.get("name") == "Execute test: %s" % filepath.name
+        assert step.findtext("./command") == "run-cases"
+        params = step.findall("./params/param")
+        assert params[0].get("filter") == "*"
+        assert params[1].get("timeout") == "60"
+        assert params[2].get("engineini") == path(r"c:" + os.sep + "testframework") / self.engine_ini_file.name
+
+    def test_steps_trace_enabled(self):
+        """ Test steps trace enabled. """
+        xml = self.generate_xml(trace_enabled="True")
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        check_ctc_start(steps)
+        check_log_dir(steps)
+        self.check_install_data(steps)
+        self.check_install_configuration(steps)
+        self.check_install_tmodules(steps)
+        self.check_install_engine_ini(steps)
+        check_trace_start(steps, self.file_store)
+        self.check_run_cases(steps)
+        check_trace_end_steps(steps, self.file_store)
+        check_ctc_write(steps)
+        check_ctc_log(steps)
+        check_fetch_logs(steps) 
+    
+    def test_post_actions(self):
+        """ Post actions are inserted into XML. """
+        xml = self.generate_xml()        
+        post_actions = xml.findall("./postAction")
+        check_send_email_action(post_actions[0], self.report_email)
+        check_ats_report_action(post_actions[1], self.file_store)
+        check_stif_report_action(post_actions[2], self.file_store)
+        check_diamonds_action(post_actions[3])
+    
+    def test_files(self):
+        """ Testing files. """
+        xml = self.generate_xml()
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini"        
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini"        
+        self.assertRaises(StopIteration, files.next)
+        xml = self.generate_xml(trace_enabled="True")
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"        
+        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_drop(self):
+        """ Manifest for ATS3Drop directory structure is generated. """
+        xml = self.generate_xml()
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+    def test_generate_drop_trace (self):
+        "Manifest for ATS3Drop directory structure is generated when trace enabled."
+        xml = self.generate_xml(trace_enabled="True")
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+
+class TestXMLGenerationWithPKG(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.src_dst1 = []
+        self.data_files = None
+        self.config_files = None
+        self.testmodule_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.trace_enabled = None
+        self.pmd_files = None
+        self.trace_activation_files = None
+        self.ctc_enabled = None
+        self.eunitexerunner_flags = None
+        self.test_plan = None
+        self.gen = None
+        self.src_dst0 = []
+        self.custom_dir = None
+        
+    def generate_xml(self, harness, trace_enabled="False"):
+        """Generates XML"""
+        def files(*paths):
+            """generates paths for the files"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.src_dst1 = []
+        self.data_files = files("data/file1", "data/file2", "data/file3")
+        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
+        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path("path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.trace_enabled = trace_enabled
+        self.pmd_files = TEST_FILES["pmd_file"]
+        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
+        self.ctc_enabled = "True"
+        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
+        self.custom_dir = "custom"
+        self.custom_files = files("custom/postpostaction.xml", "custom/prepostaction.xml")
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ats_network_drive = r"10.0.0.1#x:\ats\drop0.zip"
+        
+        
+        self.src_dst0 = [
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
+            ]
+        if harness == "STIF" or harness == "MULTI_HARNESS":
+            harness0 = harness1 = "STIF"
+            if "MULTI_HARNESS" in harness:
+                harness1 = "EUNIT"
+                self.src_dst1 = [
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
+                    ] 
+            self.src_dst0 = [
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file1.cfg"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"), "conf"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file2.cfg"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"), "conf"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "init" + os.sep + "TestFramework.ini"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"), "engine_ini"),
+                ]
+            if "STIF" in harness:
+                self.src_dst1 = self.src_dst0
+            
+        elif harness == "EUNIT":
+            harness0 = harness1 = harness
+            self.src_dst1 = self.src_dst0
+            
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result(harness)
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
+        mocker.expect(test_plan["eunitexerunner?flags"]).result(self.eunitexerunner_flags)
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["trace_enabled"]).result(self.trace_enabled)
+        mocker.expect(test_plan["ctc_enabled"]).result(self.ctc_enabled)
+        mocker.expect(test_plan["custom_dir"]).result("custom1A")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["ats_network_drive"]).result(self.ats_network_drive)
+        if self.trace_enabled == "False":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness0,src_dst=self.src_dst0,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+            ])
+        else:
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness0, src_dst=self.src_dst0,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+            ])
+        mocker.expect(test_plan.post_actions).result([
+            ("SendEmailAction", (("subject", "email subject"),
+                                 ("type", "ATS3_REPORT"),
+                                 ("send-files", "true"),
+                                 ("to", self.report_email))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ATS_REPORT"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+                                 ("run-log", "true"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        "Check that the overall test.xml structure is valid."
+        
+        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+        
+        for thar in test_harness:
+            xml = self.generate_xml(thar)
+            # Check basics.
+            assert xml.find(".").tag == "test"
+            assert xml.find("./name").text == "test"
+            assert xml.find("./buildid").text == self.diamonds_build_url
+            assert xml.find("./target").tag
+            assert xml.find("./target/device").tag
+            if self.test_plan["harness"] == "MULTI_HARNESS":
+                harness_1, type_1, device_hwid_1, harness_2, type_2, device_hwid_2 = xml.findall("./target/device/property")
+            else:
+                harness_1, type_1, device_hwid_1 = xml.findall("./target/device/property")
+            
+            if self.test_plan["harness"] == "MULTI_HARNESS":
+                assert harness_1.get("value") == "STIF"
+                assert type_1.get("value") == "product"
+                assert device_hwid_1.get("value") == "5425"
+                assert harness_2.get("value") == "EUNIT"
+                assert type_2.get("value") == "product"
+                assert device_hwid_2.get("value") == "5425"
+            else:
+                assert harness_1.get("value") == thar
+                assert type_1.get("value") == "product"
+                assert device_hwid_1.get("value") == "5425"
+
+        # Check generation of the test plan.
+        assert xml.find("./plan").get("name") == "test Plan"
+        assert xml.find("./plan/session").tag 
+        sets = xml.findall("./plan/session/set")
+        assert len(sets) == 2
+        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
+        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        "Check that a <set> element's structure is valid."
+        xml = self.generate_xml("STIF")
+        tstset = xml.find("./plan/session/set")
+        assert tstset.tag
+        case = tstset.find("./case")
+        assert case.tag
+        assert case.get("name") == "set0 case"
+        
+    def test_case_flash_elems(self):
+        """Checks flash target element in the test.xml file"""
+        xml = self.generate_xml("STIF")
+        case = xml.find("./plan/session/set/case")
+        flashes = case.findall("./flash")
+        assert len(flashes) == len(self.image_files)
+        for i, flash_file in enumerate(self.image_files):
+            assert flashes[i].get("target-alias") == "DEFAULT_STIF"
+            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
+        
+    def test_case_steps(self):
+        """Checks cases in steps in the test.xml file"""
+        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+        for thar in test_harness:
+            xml = self.generate_xml(thar)
+            steps = iter(xml.findall("./plan/session/set/case/step"))
+            check_ctc_start(steps)
+            check_log_dir(steps)
+            if "MULTI_HARNESS" in thar:            
+                self.check_install_step(steps, "STIF")
+                self.check_run_cases(steps)
+                check_ctc_write(steps)
+                check_ctc_log(steps)
+                check_fetch_logs(steps)
+                check_ctc_start(steps)
+                check_log_dir(steps)
+                self.check_install_step(steps, "EUNIT", set_count="1")
+                self.check_run_cases(steps)
+                check_ctc_write(steps)
+                check_ctc_log(steps, "withpkgfiles")
+                check_fetch_logs(steps)
+            else:
+                self.check_install_step(steps, thar)
+                self.check_run_cases(steps)
+                check_ctc_write(steps)
+                check_ctc_log(steps)
+                check_fetch_logs(steps)
+
+    def check_install_step(self, steps, harness, set_count="0"):
+        """Checks install steps in the test.xml file"""
+        if harness == "MULTI_HARNESS":
+            dst = [self.src_dst0, self.src_dst1]
+        else:
+            dst = [self.src_dst0]
+        if set_count == "1":
+            dst = [self.src_dst1]
+        
+        for dest in dst:
+            for file1 in dest:
+                step = steps.next()
+                filename = file1[1]
+                letter = filename[filename.rfind(":")-1:filename.rfind(":")]
+                filename = filename[filename.rfind(os.sep)+1:]
+                if "Install" in step.get("name"):
+                    assert step.get("name") == "Install %s: %s" %  (file1[2], filename)
+                    assert step.findtext("./command") == "install"
+                    params = step.findall("./params/param")            
+                    src = params[0].get("src")
+                    assert src.name == filename
+                    assert src.parent == path(r"ATS3Drop" + os.sep + "set" + set_count + os.sep + letter + os.sep + "sys" + os.sep + "bin")
+                    dst = params[1].get("dst")
+                    assert dst.name == filename
+                    assert dst.parent == path(letter + ":" + os.sep + "sys" + os.sep + "bin")
+            
+    
+    def check_run_cases(self, steps):
+        """Checks run cases in the test.xml file"""
+        step = steps.next()
+        if step.get("harness") == "STIF":
+            file_ = self.engine_ini_file 
+            assert step.get("name") == "Execute test: %s" % file_.name
+            assert step.findtext("./command") == "run-cases"
+            params = step.findall("./params/param")
+            assert params[0].get("filter") == "*"
+            assert params[1].get("timeout") == "60"
+            assert params[2].get("engineini") == path(r"c:" + os.sep + "sys" + os.sep + "bin") / self.engine_ini_file.name
+        elif step.get("harness") == "EUNIT":
+            file_ = self.testmodule_files[0]
+            if "Execute" in step.get("name"):
+                assert step.get("name") == "Execute test: %s" % file_.name
+                assert step.findtext("./command") == "execute"
+                params = step.findall("./params/param")
+                assert params[0].get("file") == path(r"z:" + os.sep + "sys" + os.sep + "bin" + os.sep + "EUNITEXERUNNER.EXE")
+                assert params[1].get("result-file") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "file1_log.xml")
+                assert params[2].get("parameters") == "/E S60AppEnv /R Off /F file1 /l xml file1.dll"
+                assert params[3].get("timeout") == "60"
+                step = steps.next()
+                file_ = self.testmodule_files[1]
+                assert step.get("name") == "Execute test: %s" % file_.name
+                assert step.findtext("./command") == "execute"
+                params = step.findall("./params/param")
+                assert params[0].get("file") == path(r"z:" + os.sep + "sys" + os.sep + "bin" + os.sep + "EUNITEXERUNNER.EXE")
+                assert params[1].get("result-file") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "file2_log.xml")
+                assert params[2].get("parameters") == "/E S60AppEnv /R Off /F file2 /l xml file2.dll"
+                assert params[3].get("timeout") == "60"
+
+    def test_steps_trace_enabled(self):
+        """checks if traing is enabled"""
+        test_harness = ["STIF"]
+        for thar in test_harness:
+            xml = self.generate_xml(thar, trace_enabled="True")
+            steps = iter(xml.findall("./plan/session/set/case/step"))
+            check_ctc_start(steps)
+            check_log_dir(steps)
+            self.check_install_step(steps, thar)
+            check_trace_start(steps, self.file_store)
+            self.check_run_cases(steps)
+            check_trace_end_steps(steps, self.file_store)
+            check_ctc_write(steps)
+            check_ctc_log(steps)
+            check_fetch_logs(steps)
+        
+    def test_post_actions(self):
+        "Post actions are inserted into XML."
+        xml = self.generate_xml("STIF")
+        post_actions = xml.findall("./postAction")
+        check_send_email_action(post_actions[0], self.report_email)
+        check_ats_report_action(post_actions[1], self.file_store)
+        check_stif_report_action(post_actions[2], self.file_store)
+        check_diamonds_action(post_actions[3])
+        
+    def test_files(self):
+        """Tests if the files are created for mock"""
+        xml = self.generate_xml("STIF")
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"        
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+        self.assertRaises(StopIteration, files.next)
+        xml = self.generate_xml(harness="STIF", trace_enabled="True")
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+
+        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_drop(self):
+        "Manifest for ATS3Drop directory structure is generated."        
+        xml = self.generate_xml("STIF")
+        strbuffer = StringIO()
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+    def test_generate_drop_trace_enabled(self):
+        "Manifest for ATS3Drop directory structure is generated when trace enabled."
+        xml = self.generate_xml(harness="STIF", trace_enabled="True")
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+            
+class TestDropGenerationWithSis(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation with sis files.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.sis_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.harness = None
+        self.test_plan = None
+        self.gen = None
+        self.src_dst = []
+        
+    def generate_xml(self):
+        """Geberates XML if sis files"""
+        def files(*paths):
+            """generates paths for the files"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.sis_files = files("sis/file1.sisx", "sis/file2.sisx", "sis/file3.sisx")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path("path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.harness = "STIF"
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ats_network_drive = r"10.0.0.1#x:\ats\drop0.zip"
+        
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("STIF")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["ctc_enabled"]).result("False")
+        mocker.expect(test_plan["trace_enabled"]).result("False")
+        mocker.expect(test_plan["custom_dir"]).result("CustomC")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["ats_network_drive"]).result(self.ats_network_drive)
+        mocker.expect(test_plan.sets).result([
+            dict(name="set0", image_files=self.image_files, sis_files=self.sis_files,
+                 engine_ini_file=self.engine_ini_file, test_harness=self.harness, ctc_enabled="False", component_path=self.component_path),
+             ])
+        mocker.expect(test_plan.post_actions).result([])
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_case_steps(self):
+        """Checks cases in steps in the test.xml file"""
+        xml = self.generate_xml()
+        #print doc.xml(indent="yes")        
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        steps.next() # Stif log dir creation.
+        self.check_install_sis_files(steps)
+        steps.next() # Install engine ini.
+        self.check_install_sis_to_device(steps)
+        steps.next() # Run cases.
+        steps.next() # Fetch logs.
+        self.assertRaises(StopIteration, steps.next)
+
+    def check_install_sis_files(self, steps):
+        """Checks sis files install steps in the test.xml file"""
+        for filename in self.sis_files:
+            step = steps.next()
+            assert step.get("name") == "Install sis: %s" % filename.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")
+            # TO DO: Should sis files be specified outside of the set?
+            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "sis") / filename.name
+            assert params[1].get("dst") == path(r"c:" + os.sep + "testframework") / filename.name
+
+    def check_install_sis_to_device(self, steps):
+        """Checks sis files installation on the device"""
+        for filename in self.sis_files:
+            step = steps.next()
+            assert step.get("name") == "Install SIS to the device: %s" % filename.name
+            assert step.findtext("./command") == "install-software"
+            params = step.findall("./params/param")
+            assert params[-1].get("sisPackageName") == path(r"c:" + os.sep + "testframework") / filename.name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ats3_aste.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,493 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_ats3_aste.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing ATS3 ASTE framework. """
+
+# pylint: disable-msg=E1101,W0603,W0142
+
+from cStringIO import StringIO
+from pprint import pprint
+from xml.etree.ElementTree import fromstring, tostring
+from xml.etree import ElementTree as et
+import difflib
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import re
+import tempfile
+import zipfile
+import os
+
+from path import path
+import amara
+import mocker
+
+import ats3.aste
+
+TEST_PATH = None
+TEST_FILES = {}
+TEST_ASSET_FILES = {}
+TSRC = None
+OUTPUT = None
+TEST_ZIP_PATH = None
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Bunch(object):
+    
+    def __init__(self, **kwargs): 
+        self.__dict__.update(kwargs)
+    
+
+def equal_xml(xml1, xml2):
+    """Check the equality of the given XML snippets.
+    
+    Tag name equality:
+    
+    >>> equal_xml('<a/>', '<a/>')
+    True
+    >>> equal_xml('<a/>', '<b/>')
+    False
+    
+    Attribute equality:
+    
+    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
+    True
+    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
+    False
+    
+    Text content equality:
+    
+    >>> equal_xml('<a>v</a>', '<a>v</a>')
+    True
+    >>> equal_xml('<a>v</a>', '<a>w</a>')
+    False
+    >>> equal_xml('<a>v</a>', '<a></a>')
+    False
+    
+    Text content equality when whitespace differs:
+    >>> equal_xml('<a>v</a>', '<a>v </a>')
+    True
+
+    Equality of child elements:
+    
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
+    True
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
+    True
+    
+    """
+    if isinstance(xml1, basestring):
+        xml1 = fromstring(xml1)
+    if isinstance(xml2, basestring):
+        xml2 = fromstring(xml2)
+    if xml1.tag != xml2.tag:
+        return False
+    if xml1.attrib != xml2.attrib:
+        return False
+    if xml1.text:
+        if not xml2.text:
+            return False
+    if xml2.text:
+        if not xml1.text:
+            return False
+    if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+        return False
+    if xml1.tail is not None and xml2.tail is not None:
+        if xml1.tail.strip() != xml2.tail.strip():
+            return False
+    elif xml1.tail != xml2.tail:
+        return False
+    children1 = list(xml1.getchildren())
+    children2 = list(xml2.getchildren())
+    if len(children1) != len(children2):
+        return False
+    for child1, child2 in zip(children1, children2):
+        return equal_xml(child1, child2)
+    return True        
+
+
+def setup_module():
+    global TEST_PATH, OUTPUT, TEST_ZIP_PATH
+    TEST_PATH = path(tempfile.mkdtemp())
+    OUTPUT = TEST_PATH.joinpath("TestAsset")
+    TEST_ZIP_PATH = TEST_PATH.joinpath("test_zip")
+    asset = TEST_PATH
+    component = TEST_PATH
+    component.joinpath("group").makedirs()
+    for path_parts in (("output", "images", "file1.fpsx"),
+                       ("output", "images", "file2.fpsx")):
+        filename = component.joinpath(*path_parts)
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        TEST_FILES.setdefault(path_parts[1], []).append(file)
+    for path_parts in (("TestAsset", "Localisation", "S60", "localisation.txt"),
+                       ("TestAsset", "TestCases", "TC_100_Test0", "file1.sis"),
+                       ("TestAsset", "TestCases", "TC_100_Test0", "file2.tcf"),
+                       ("TestAsset", "Tools", "TestCaseCreator", "test_creator.ini"),
+                       ("TestAsset", "testdrop.xml"),):
+        filename = asset.joinpath(*path_parts)
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        TEST_ASSET_FILES.setdefault(path_parts[1], []).append(file)
+    try:
+        zip_component = TEST_ZIP_PATH
+        filename = zip_component.joinpath("TestAsset.zip")
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        zfile = zipfile.ZipFile(zip_component.joinpath("TestAsset.zip"), "w", zipfile.ZIP_DEFLATED)
+        for p in TEST_ASSET_FILES:
+            print p
+            zfile.write(p)
+        zfile.close()
+        TEST_ASSET_FILES.setdefault("ZIP", []).append(file)
+    except OSError:
+        print "Got except OSError. Continuing...\n"  
+        
+    
+def teardown_module():
+    path(TEST_PATH).rmtree()
+    
+    
+class TestTestPlan(mocker.MockerTestCase):
+
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+             
+    def setUp(self):
+        opts = Bunch(testrun_name="testrun", harness="ASTE", 
+                     device_type="product", plan_name="ats3_test_plan", diamonds_build_url="",
+                     software_version="W810", software_release="SPP 51.32", device_language="English",
+                     testasset_location=TEST_PATH.joinpath("TestAsset"), testasset_caseids="100",repeat="1", report_email="",
+                     file_store=path(), test_timeout="60", device_hwid="5425", test_type="smoke")
+        self.tp = ats3.aste.AsteTestPlan(opts)
+        self.image_files = TEST_FILES["images"]
+        self.test_timeout = self.tp["test_timeout"]
+        self.device_hwid = self.tp["device_hwid"]
+        self.test_harness = self.tp["harness"]
+        self.device_language = self.tp["device_language"]
+        self.software_release = self.tp["software_release"]
+        self.software_version = self.tp["software_version"]
+        self.testasset_caseids = self.tp["testasset_caseids"]
+        self.testasset_location = self.tp["testasset_location"]
+        self.test_type = self.tp["test_type"]
+        
+        if self.testasset_location != "":
+            self.test_asset_testcases = [self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file1.sis"), self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file2.tcf")]
+            self.test_asset_tools = [self.testasset_location.joinpath("Tools", "TestCaseCreator", "test_creator.ini")]
+            self.test_asset_localisation = [self.testasset_location.joinpath("Localisation", "S60", "localisation.txt")]
+            self.test_asset_testdrop = self.testasset_location.joinpath("testdrop.xml")
+        else:
+            self.test_asset_testcases = TEST_ASSET_FILES["TestCases"]
+            self.test_asset_tools = TEST_ASSET_FILES["Tools"]
+            self.test_asset_localisation = TEST_ASSET_FILES["Localisation"]
+            self.test_asset_testdrop = TEST_ASSET_FILES["testdrop.xml"]
+
+            
+    def test_creation(self):        
+        assert self.tp["testrun_name"] == "testrun"
+        assert self.tp["harness"] == "ASTE"
+        assert self.tp["device_type"] == "product"
+    
+    def test_insert_set(self):
+        
+        self.tp.insert_set(image_files=self.image_files,
+                           test_timeout=self.test_timeout)
+        
+        assert self.tp.sets[0] == dict(name="set0",
+                                       image_files=self.image_files,
+                                       test_timeout=self.test_timeout,
+                                       test_harness=self.test_harness)
+
+    def test_post_actions_email(self):
+        assert not self.tp.post_actions
+        receiver = "joe.average@example.com"
+        self.tp.report_email = receiver
+        assert len(self.tp.post_actions) == 1
+        action, items = self.tp.post_actions[0]
+        items = dict(items)
+        assert action == "SendEmailAction"
+        assert items["to"] == receiver
+    
+    def test_post_actions_ats3_report_only(self):
+        file_store = path("path/to/files")
+        self.tp.file_store = file_store
+        self.tp.harness = "EUNIT"
+        assert len(self.tp.post_actions) == 2
+        action, items = self.tp.post_actions[0]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ATS_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ATS3_REPORT")
+    
+    def test_post_actions_aste(self):
+        file_store = path("path/to/files")
+        self.tp.file_store = file_store
+        assert len(self.tp.post_actions) == 2
+        action, items = self.tp.post_actions[1]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ASTE_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ASTE_REPORT")
+        
+    def test_post_actions_diamonds(self):
+        self.tp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        assert len(self.tp.post_actions) == 1
+        action, items = self.tp.post_actions[0]
+        assert action == "DiamondsAction"
+        assert not items
+
+
+            
+class TestXMLGeneration(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """    
+
+    def __init__(self, methodName="runTest"):
+        self.image_files = None
+        self.report_email = None
+        self.diamonds_build_url = None
+        self.test_harness = None
+        self.file_store = None
+        self.testasset_location = None
+        self.test_plan = None
+        self.gen = None
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+        
+    def generate_xml(self):
+        def files(*paths):
+            return [TEST_PATH.joinpath(p) for p in paths]
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.report_email = "test.receiver@company.com"
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.test_harness = "ASTE"
+        self.file_store = path(r"path/to/reports")
+        self.testasset_location = OUTPUT
+        
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("ASTE")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["testasset_location"]).result(self.testasset_location)
+        mocker.expect(test_plan["testasset_caseids"]).result("100")
+        mocker.expect(test_plan["software_release"]).result("SPP 51.32")
+        mocker.expect(test_plan["software_version"]).result("W810")
+        mocker.expect(test_plan["device_language"]).result("English")
+        mocker.expect(test_plan["test_type"]).result("smoke")
+        mocker.expect(test_plan["temp_directory"]).result(TEST_PATH)
+        mocker.expect(test_plan.sets).result([
+            dict(name="set0", image_files=self.image_files, test_harness="ASTE")])
+        mocker.expect(test_plan.post_actions).result([
+            ("SendEmailAction", (("subject", "email subject"),
+                                 ("type", "ATS3_REPORT"),
+                                 ("send-files", "true"),
+                                 ("to", self.report_email))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ATS_REPORT"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ASTE_REPORT"),
+                                 ("run-log", "true"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = ats3.aste.AsteTestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        "Check that the overall test.xml structure is valid."
+        xml = self.generate_xml()
+        # Check basics.
+        assert xml.find(".").tag == "test"
+        assert xml.find("./name").text == "test"
+        assert xml.find("./buildid").text == self.diamonds_build_url
+        assert xml.find("./target").tag
+        assert xml.find("./target/device").tag
+        harness, hardware, device_hwid = xml.findall("./target/device/property")
+        softwareVersion, softwareRelease, deviceLanguage = xml.findall("./target/device/setting")
+        assert harness.get("value") == "ASTE"
+        assert hardware.get("value") == "product"
+        assert softwareVersion.get("value") == "W810"
+        assert softwareRelease.get("value") == "SPP 51.32"
+        assert deviceLanguage.get("value") == "English"
+        assert device_hwid.get("value") == "5425"
+        
+        # Check generation of the test plan.
+        assert xml.find("./plan").get("name") == "Plan smoke product"
+        assert xml.find("./plan/session").tag 
+        sets = xml.findall("./plan/session/set")
+        assert len(sets) == 1
+        assert sets[0].get("name") == "set0"
+        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        "Check that a <set> element's structure is valid."
+        xml = self.generate_xml()
+        tstset = xml.find("./plan/session/set")
+        assert tstset.tag
+        case = tstset.find("./case")
+        assert case.tag
+        assert case.get("name") == "set0 case"                
+        
+    def test_case_flash_elems(self):
+        xml = self.generate_xml()
+        case = xml.find("./plan/session/set/case")
+        flashes = case.findall("./flash")
+        assert len(flashes) == len(self.image_files)
+        for i, flash_file in enumerate(self.image_files):
+            assert flashes[i].get("target-alias") == "DEFAULT"
+            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
+    
+    def test_steps(self):
+        xml = self.generate_xml()
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        self.check_executeasset_step(steps)
+
+    def check_executeasset_step(self, steps):
+        step = steps.next()
+        assert step.get("name") == "Execute asset zip step"
+        assert step.findtext("./command") == "execute-asset"
+        params = step.findall("./params/param")
+        assert params[0].get("repeat") == "1"
+        assert params[1].get("asset-source") == "ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
+        assert params[2].get("testcase-ids") == "100"
+
+    def test_post_actions(self):
+        "Post actions are inserted into XML."
+        xml = self.generate_xml()        
+        post_actions = xml.findall("./postAction")
+        self.check_send_email_action(post_actions[0])
+        self.check_ats_report_action(post_actions[1])
+        self.check_aste_report_action(post_actions[2])
+        self.check_diamonds_action(post_actions[3])
+
+    def check_send_email_action(self, action):
+        assert action.findtext("./type") == "SendEmailAction"
+        params = action.findall("./params/param")
+        assert params[0].get("name") == "subject"
+        assert params[0].get("value") == "email subject"
+        assert params[1].get("name") == "type"
+        assert params[1].get("value") == "ATS3_REPORT"
+        assert params[2].get("name") == "send-files"
+        assert params[2].get("value") == "true"
+        assert params[3].get("name") == "to"
+        assert params[3].get("value") == self.report_email
+
+    def check_ats_report_action(self, action):
+        assert action.findtext("./type") == "FileStoreAction"
+        params = action.findall("./params/param")
+        assert params[0].get("name") == "to-folder"
+        assert params[0].get("value") == self.file_store
+        assert params[1].get("name") == "report-type"
+        assert params[1].get("value") == "ATS_REPORT"
+        assert params[2].get("name") == "date-format"
+        assert params[2].get("value") == "yyyyMMdd"
+        assert params[3].get("name") == "time-format"
+        assert params[3].get("value") == "HHmmss"
+
+    def check_aste_report_action(self, action):
+        assert action.findtext("./type") == "FileStoreAction"
+        params = action.findall("./params/param")
+        assert params[0].get("name") == "to-folder"
+        assert params[0].get("value") == self.file_store
+        assert params[1].get("name") == "report-type"
+        assert params[1].get("value") == "ASTE_REPORT"
+        assert params[2].get("name") == "run-log"
+        assert params[2].get("value") == "true"
+        assert params[3].get("name") == "date-format"
+        assert params[3].get("value") == "yyyyMMdd"
+        assert params[4].get("name") == "time-format"
+        assert params[4].get("value") == "HHmmss"
+        
+    def check_diamonds_action(self, action):
+        assert action.findtext("./type") == "DiamondsAction"
+        assert not action.findall("./params/param")
+    
+    def test_files(self):
+        xml = self.generate_xml()
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
+        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_testasset_zip(self):
+        self.generate_xml()
+        if re.search(r"[.]zip", self.test_plan["testasset_location"]):
+            pass
+        else:
+            strbuffer = StringIO()
+            assert strbuffer == self.gen.generate_testasset_zip(self.test_plan, strbuffer)
+            zfile = zipfile.ZipFile(strbuffer, "r")
+            try:
+                contents = sorted(path(p).normpath() for p in zfile.namelist())
+                expected = sorted(path(p).normpath()
+                               for p in [(r"Localisation" + os.sep + "S60" + os.sep + "localisation.txt"),
+                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file1.sis"),
+                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file2.tcf"),
+                                         (r"Tools" + os.sep + "TestCaseCreator" + os.sep + "test_creator.ini"),
+                                         (r"testdrop.xml")])
+                diff = difflib.context_diff(expected, contents)
+                assert contents == expected, "\n".join(diff)
+            finally:
+                zfile.close()
+        
+    def test_generate_drop(self):
+        "Manifest for ATS3Drop directory structure is generated."
+        xml = self.generate_xml()
+        strbuffer = StringIO()
+
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(p).normpath() for p in zfile.namelist())
+            expected = sorted(path(p).normpath()
+                           for p in [r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_atsconfigparser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,101 @@
+#============================================================================ 
+#Name    : test_atsconfigparser.py
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing the ATS configuration file """
+
+import os
+import logging
+import tempfile
+import unittest
+
+import ats3.atsconfigparser
+
+_logger = logging.getLogger('test.atsconfigparser')
+logging.basicConfig(level=logging.INFO)
+
+class AtsConfigParserTest(unittest.TestCase):
+      
+    def test_x(self):
+        spectext = """<ATSConfigData>
+    <config name="common" abstract="true">
+
+        <!-- Properties to add/modify -->
+        <config type="properties">
+           <set name="HARNESS" value="STIFx" />
+           <set name="HARNESS2" value="STIF2"/>
+           <set name="HARNESS3" value="STIF2"/>
+           <set name="2" value="3" />
+        </config>
+
+        <!-- Attributes to modify -->
+        <config type="attributes">
+           <set name="xyz" value="2" />
+           <set name="significant" value="true" />
+        </config>
+
+        <!-- Settings to add/modify -->
+        <config type="settings">
+           <set name="HARNESS" value="STIF" />
+           <set name="2" value="3" />
+        </config>
+
+    </config>
+</ATSConfigData>
+        """
+
+        testxmldata = """<test>
+  <name>helium_clock</name>
+  <target>
+    <device alias="DEFAULT_STIF" rank="none">
+      <property name="HARNESS" value="STIF"/>
+      <property name="HARNESS2" value="STIF"/>
+      <property name="HARNESS3" value="STIF"/>
+    </device>
+    <device alias="DEFAULT_EUIT" rank="none">
+      <property name="HARNESS" value="STIF"/>
+      <property name="HARNESS2" value="STIF3"/>
+    </device>
+  </target>
+  <plan passrate="100" harness="STIF" enabled="true" name="helium_clock Plan" significant="false">
+    <session passrate="100" harness="STIF" enabled="true" name="session" significant="false">
+      <set passrate="100" harness="STIF" enabled="true" name="set0" significant="false">
+        <target>
+          <device alias="DEFAULT_STIF" rank="master"/>
+        </target>
+      </set>
+    </session>
+  </plan>
+</test>
+        """
+        
+        (fd, filename) = tempfile.mkstemp()
+        f = os.fdopen(fd, 'w')
+        f.write(spectext)
+        f.close()
+        
+        output = ats3.atsconfigparser.converttestxml(filename, testxmldata)
+        os.remove(filename)
+        _logger.info(output)
+        assert '<property name="2" value="3"/>' in output
+        assert '<property name="HARNESS" value="STIFx"/>' in output
+        assert '<property name="HARNESS" value="STIF"/>' not in output
+        assert '<property name="HARNESS2" value="STIF2"/>' in output
+        assert '<property name="HARNESS2" value="STIF3"/>' not in output
+        assert '<property name="HARNESS3" value="STIF2"/>' in output
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_atsconfiguration.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name    : test_ATSconfiguration.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing the ATS configuration file """
+
+import logging
+import StringIO
+import unittest
+
+import configuration
+import ats3.parsers
+
+_logger = logging.getLogger('test.atsconfiguration')
+logging.basicConfig(level=logging.INFO)
+
+
+
+def test_ATS_element():
+    """ ATS elements can be used in configuration. """
+    config_text = """
+<ATSConfigData>
+    <config name="properties">
+    <set name="PA" value="foo"/>
+    </config>
+    <config name="attributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+</ATSConfigData>"""
+
+    builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+    config = builder.getConfiguration().getConfigurations()
+    assert config[0]['PA'] == 'foo'
+    assert config[1]['AB'] == '100'
+
+
+
+def test_ATS_config_attirbutes():
+    """ ATS elements can be used attributes only. """
+    config_text = """
+<ATSConfigData>
+    <config name="attributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+</ATSConfigData>"""
+    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
+
+    print attrs
+    print params
+    assert params ==  {}
+    assert attrs ==  {u'attrs': u'foo', u'AC': u'101', u'AB': u'100'}
+
+def test_ATS_config_properties():
+    """ ATS elements can be used properties only. """
+    config_text = """
+<ATSConfigData>
+    <config name="noattributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+    <config name="properties">
+    <set name="HW" value="foo"/>
+    </config>
+</ATSConfigData>"""
+    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
+
+    print attrs
+    print params
+    assert params ==  {u'HW': u'foo' }
+    assert attrs ==  { }
+
+
+def test_ATS_element3():
+    """ All alements can be used and several times. """
+    config_text = """
+<ATSConfigData>
+    <config name="attributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+    <config name="properties">
+    <set name="PA" value="foo"/>
+    </config>
+    <config name="properties">
+    <set name="HW" value="bar"/>
+    </config>
+</ATSConfigData>"""
+    	
+    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
+
+    print attrs
+    print params
+    assert params ==  {u'PA': u'foo' , u'HW': u'bar'}
+    assert attrs ==  {u'attrs': u'foo', u'AC': u'101', u'AB': u'100'}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_bsf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+#============================================================================ 
+#Name        : test_bsf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Some test cases for BSF file handling.
+"""
+
+import logging
+import os
+import unittest
+
+import bsf
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.bsf')
+
+
+class BSFTest(unittest.TestCase):
+    """ Implementation of BSF test cases. """
+    
+    def test_bsf(self):
+        """ Testing all methods from bsf class.
+        """
+        bsfs = bsf.read_all(os.path.join(os.environ['HELIUM_HOME'],'tests/data/bsf'))
+        assert len(bsfs.keys()) == 9, "Could not find 9 bsf files."
+        assert bsfs['product'] is not  None, "Could not find product."
+        assert bsfs['product'].is_variant() == True, "'product' should be a variant"
+        assert bsfs['product'].is_virtual_variant() == False, "'product' should not be a virtual variant"
+        assert bsfs['variant'].is_virtual_variant() == True, "'variant' should be a virtual variant"
+        assert bsfs['variant'].customize() == "armv5", "'variant' should customize armv5."
+        assert bsfs['product'].customize() == "platform", "'product' should customize armv5."
+        assert bsfs['variant'].compile_with_parent() == True, "'variant' should be compile with its parent."
+        assert bsfs['product'].compile_with_parent() == False, "'product' should not be compile with its parent."
+
+
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_build_io.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,84 @@
+#============================================================================ 
+#Name        : test_build_io.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test the build.io module. """
+
+import logging
+import unittest
+
+import build.io
+
+
+logger = logging.getLogger('test.build.io')
+
+
+class AbldLogWhatReaderTest(unittest.TestCase):
+    """ Test reading Symbian build logs for extracting abld -what sections. """
+    
+    def test_abld_what_parsing(self):
+        """ Basic abld -what section parsing. """ 
+        reader = build.io.AbldLogWhatReader('tests/data/build/io/abld_what.log')
+        reader_iter = iter(reader)
+        (component1, binaries1) = reader_iter.next()
+        assert component1 == 'ibusal_chipset_product2'
+        assert binaries1 == [r'\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd',
+                             r'\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd.map']
+        
+        (component2, binaries2) = reader_iter.next()
+        assert component2 == 'ibusal_chipset_product'
+        assert binaries2 == [r'\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd',
+                             r'\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd.map']
+
+
+class RombuildLogBinarySizeReaderTest(unittest.TestCase):
+    """ Test reading Symbian ROM build logs for extracting binaries and their sizes. """
+    
+    def test_rom_log_parsing(self):
+        """ Basic ROM log binary size parsing. """ 
+        reader = build.io.RombuildLogBinarySizeReader('tests/data/build/io/test_rom.log')
+        reader_iter = iter(reader)
+        (binary, size, rom_type) = reader_iter.next()
+        assert binary == r'\epoc32\release\ARMV5\urel\__ekern.exe'
+        assert size == 221788
+        assert rom_type == 'rom'
+        
+        (binary, size, rom_type) = reader_iter.next()
+        assert binary == r'\epoc32\release\ARMV5\urel\elocd.ldd'
+        assert size == 15192
+        assert rom_type == 'rom'
+        
+        (binary, size, rom_type) = reader_iter.next()
+        assert binary == r'\epoc32\release\ARMV5\urel\__medint.pdd'
+        assert size == 2320
+        assert rom_type == 'rom'
+        
+    def test_rofs_log_parsing(self):
+        """ Basic ROFS log binary size parsing. """ 
+        reader = build.io.RombuildLogBinarySizeReader('tests/data/build/io/test_rofs.log')
+        reader_iter = iter(reader)
+        (binary, size, rom_type) = reader_iter.next()
+        assert binary == r'\epoc32\data\Z\Resource\ICL\jpegcodec_extra.rsc'
+        assert size == 202
+        assert rom_type == 'rofs'
+        
+        (binary, size, rom_type) = reader_iter.next()
+        assert binary == r'\epoc32\release\ARMV5\urel\jpegcodec.dll'
+        assert size == 89728
+        assert rom_type == 'rofs'
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_buildmodel.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,129 @@
+#============================================================================ 
+#Name        : test_buildmodel.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test build.model module. """
+
+import os
+import sys
+import unittest
+
+import build.model
+import configuration
+import ccm
+import amara
+
+database = "to1tobet"
+
+class BOMMockFolder:    
+    def __init__(self, name, instance, description, tasks):
+        self.name = name
+        self.instance = instance
+        self.description = description
+        self.tasks = tasks
+        
+class BOMMockProject:
+    def __init__(self, name):
+        self.name = name
+    
+    def __str__(self):
+        return self.name
+    
+    @property
+    def tasks(self):
+        return []
+    
+    @property
+    def folders(self):
+        return [BOMMockFolder('5856', 'tr1s60', "all completed tasks for release ABS_domain/abs.mcl for collaborative projects", [])] 
+    
+class BOMMock:
+    
+    def __init__(self):
+        self.config = {}
+        self.config['build.id'] = "mock"
+    
+    @property
+    def projects(self):    
+        return [BOMMockProject('ABS_domain-abs.mcl_200843:project:tr1s60#1')] 
+
+    def all_baselines(self):
+        return []
+
+# Refactor required: See http://delivery.nmp.nokia.com/trac/helium/ticket/1517
+class BOMTest(unittest.TestCase):
+    """ Test BOM and related classes. """
+    
+# TODO - removed until non-Synergy dependent tests can be provided.
+
+#    def test_bom_output(self):
+#        """ Test basic BOM execution. Only new spec format will be covered!"""
+#        try:
+#            session = ccm.open_session(database=database)
+#        except ccm.CCMException:
+#            print "Skipping BOMTest test cases."
+#            return
+#            
+#        project = session.create('helium-helium_0.1:project:vc1s60p1#1')
+#        config_dict = {'delivery': 'tests/data/test_delivery.xml',
+#                       'prep.xml': 'tests/data/test_prep.xml',
+#                       'build.id': "test_0.0",
+#                       'ccm.database': session.database()}
+#        config = configuration.Configuration(config_dict)
+#        bom = build.model.BOM_new_spec_config(config, project)
+#        writer = build.model.BOMHTMLWriter(bom)
+#        writer.write("bom2.html")
+#        session.close()
+#        os.remove("bom2.html")
+#        os.remove("bom2.html.xml")
+
+    def test_bom_delta(self):
+        """ Testing BOM delta creation... """
+        delta = build.model.BOMDeltaXMLWriter(BOMMock(), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/build_model_bom.xml'))
+        delta.write(os.path.join(os.environ['HELIUM_HOME'], 'build','delta.xml'))
+        xml = amara.parse(open(os.path.join(os.environ['HELIUM_HOME'], 'build','delta.xml'), 'r'))
+        assert xml.bomDelta[0].buildFrom[0] == "ido_raptor_mcl_abs_MCL.52.57"
+        assert xml.bomDelta[0].buildTo[0] == "mock"
+
+        print "baselines: ", len(xml.bomDelta.content.baseline)
+        print "folders: ", len(xml.bomDelta.content.folder)
+        print "tasks: ", len(xml.bomDelta.content.task)
+        print "baseline[@overridden='false']:", len(xml.bomDelta.content.xml_xpath("baseline[@overridden='false']"))
+        print "baseline[@overridden='true']: ", len(xml.bomDelta.content.xml_xpath("baseline[@overridden='true']"))
+        print "folder[@status='deleted']: ", len(xml.bomDelta.content.xml_xpath("folder[@status='deleted']"))
+        print "task[@status='deleted']: ", len(xml.bomDelta.content.xml_xpath("task[@status='deleted']"))
+
+        assert len(xml.bomDelta.content.baseline) == 156
+        assert len(xml.bomDelta.content.folder) == 1
+        assert len(xml.bomDelta.content.task) == 1
+        assert len(xml.bomDelta.content.xml_xpath("baseline[@overridden='false']")) == 155
+        assert len(xml.bomDelta.content.xml_xpath("baseline[@overridden='true']")) == 1
+
+        assert len(xml.bomDelta.content.xml_xpath("folder[@status='deleted']")) == 1
+
+        assert len(xml.bomDelta.content.xml_xpath("task[@status='deleted']")) == 1
+        
+    def test_validate_bom_delta(self):
+        """ Testing BOM delta validation... """
+        bom_delta_validate = build.model.BOMDeltaXMLWriter((os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml')), (os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml')))
+        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml'))
+        self.assertEqual(True, delta_bom_content_validity) 
+        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_104_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml'))
+        self.assertEqual(False, delta_bom_content_validity) 
+        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_103_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_103_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'))
+        self.assertEqual(None, delta_bom_content_validity) 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_buildtools.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+#============================================================================ 
+#Name        : test_buildtools.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+import os.path
+import shutil
+import unittest
+
+from buildtools import *
+
+
+class AntWriterTest(unittest.TestCase):
+    
+    def setUp(self):
+        self.temp = "temp"
+        os.makedirs(self.temp)
+    
+    def tearDown(self):
+        shutil.rmtree(self.temp)
+
+    def testOutput(self):
+        writer = AntWriter(os.path.join(self.temp, "buildtools_antwriter_test.ant.xml"))
+        commands = CommandList()
+        commands.addCommand(Command(self.temp, "foo"))
+        writer.write(commands)
+        writer.close()
+
+class MakerWriterTest(unittest.TestCase):
+    
+    def setUp(self):
+        self.temp = "temp"
+        os.makedirs(self.temp)
+    
+    def tearDown(self):
+        shutil.rmtree(self.temp)
+
+    def testOutput(self):
+        writer = AntWriter(os.path.join(self.temp, "buildtools_makewriter_test.mk"))
+        commands = CommandList()
+        commands.addCommand(Command(self.temp, "foo"))
+        writer.write(commands)
+        writer.close()
+
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ccm.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+#============================================================================ 
+#Name        : test_ccm.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for ccm python toolkit.
+
+"""
+
+# pylint: disable-msg=E1101
+
+import logging
+import os
+import subprocess
+import sys
+import unittest
+
+import mocker
+
+import ccm
+import nokia.nokiaccm
+
+
+_logger = logging.getLogger('test.ccm')
+
+
+class CcmTest(mocker.MockerTestCase):
+    """ Tests the ccm module using mocker to prevent accessing a real Synergy database. """
+
+    def test_running_sessions(self):
+        """ Running sessions can be checked. """
+        obj = self.mocker.replace(ccm._execute)
+        if sys.platform == "win32":
+            obj('c:\\apps\\ccm65\\bin\\ccm.exe status')
+        else:
+            obj('/nokia/fa_nmp/apps/cmsynergy/6.5/bin/ccm status')
+        self.mocker.result(("""Sessions for user pmackay:
+
+Command Interface @ 1CAL01176:1553:10.241.72.23
+Database: /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1
+
+Current project could not be identified.
+""", 0))
+
+        self.mocker.replay()
+
+        sessions = ccm.running_sessions()
+        print sessions
+
+#    def test_open_session(self):
+#        """ ccm session can be opened. """
+#        gscm_obj = self.mocker.replace(nokia.gscm._execute)
+#        gscm_obj('perl f:\\helium\\svn\\trunk\\helium\\tools/common/bin/get_gscm_info.pl get_router_address /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
+#        self.mocker.result(("vccmsr65:55414:172.18.95.98:172.18.95.61:172.18.95.95:172.18.95.96:172.18.95.97", 0))
+#        
+#        obj = self.mocker.replace(ccm._execute)
+#        obj('c:\\apps\\ccm65\\bin\\ccm.exe start -m -q -nogui -n username -pw foobar -h vccmsweh.americas.company.com -d /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
+#        self.mocker.result(("1CAL01176:1333:10.186.216.77:10.241.72.68", 0))
+#        
+#        self.mocker.replay()
+#        session = nokia.nokiaccm.open_session(password='foobar', engine='vccmsweh.americas.company.com', dbpath='/nokia/vc_nmp/groups/gscm/dbs/vc1s60p1', database='/nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
+        
+        
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ccm_4pn.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,145 @@
+#============================================================================ 
+#Name        : test_ccm_4pn.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for ccm python toolkit.
+
+"""
+import unittest
+import sys
+import ccm
+import logging
+
+
+logger = logging.getLogger('test.ccm')
+
+
+class FourPartNameTest(unittest.TestCase):
+
+    def testSimpleFourPartNameParsing(self):
+        """Test the parsing of a simple four part name"""
+        strfpn = "simple.test-myversion1:ascii:mydb#1"
+        fpn = ccm.FourPartName(strfpn)
+        assert fpn.name == "simple.test"
+        assert fpn.version == "myversion1"
+        assert fpn.type == "ascii"
+        assert fpn.instance == "mydb#1"
+        assert strfpn == str(fpn)
+        assert strfpn == fpn.objectname
+
+    def testSpacesFourPartNameParsing(self):
+        """Test the parsing of a four part name that contains spaces"""
+        strfpn = "simple test.ext - myversion1 :ascii:mydb#1"
+        fpn = ccm.FourPartName(strfpn)
+        assert fpn.name == "simple test.ext "
+        assert fpn.version == " myversion1 "
+        assert fpn.type == "ascii"
+        assert fpn.instance == "mydb#1"
+        assert strfpn == str(fpn)
+        assert strfpn == fpn.objectname
+
+    def testHyphenedFourPartNameParsing(self):
+        """Test the parsing of a hyphened four part name"""
+        strfpn = "simple-test.ext-myversion1:ascii:mydb#1"
+        fpn = ccm.FourPartName(strfpn)
+        assert fpn.name == "simple-test.ext"
+        assert fpn.version == "myversion1"
+        assert fpn.type == "ascii"
+        assert fpn.instance == "mydb#1"
+        assert strfpn == str(fpn)
+        assert strfpn == fpn.objectname
+   
+    def testReleasedefParsing(self):
+        """Test the parsing of a releasedef four part name"""
+        strfpn = "myproject:myversion1:releasedef:mydb#1"
+        fpn = ccm.FourPartName(strfpn)
+        assert fpn.name == "myproject"
+        assert fpn.version == "myversion1"
+        assert fpn.type == "releasedef"
+        assert fpn.instance == "mydb#1"
+        assert strfpn == str(fpn)
+        assert strfpn == fpn.objectname
+
+    def testEquality(self):
+        """Test equality and same familly function"""
+        # testing different name
+        fpn1 = ccm.FourPartName("simple.test-myversion1:ascii:mydb#1")
+        fpn2 = ccm.FourPartName("simple.testx-myversion1:ascii:mydb#1")
+        assert fpn1 != fpn2
+        assert not fpn1.is_same_family(fpn2), "Should not be from the same family"
+        # testing different version
+        fpn2 = ccm.FourPartName("simple.test-myversion2:ascii:mydb#1")
+        assert fpn1 != fpn2
+        assert fpn1.is_same_family(fpn2), "Should be from the same family"
+        # testing different type
+        fpn2 = ccm.FourPartName("simple.test-myversion1:ascii2:mydb#1")
+        assert fpn1 != fpn2
+        assert not fpn1.is_same_family(fpn2), "Should not be from the same family"
+        # testing different instance
+        fpn2 = ccm.FourPartName("simple.test-myversion1:ascii:mydb#2")
+        assert fpn1 != fpn2
+        assert not fpn1.is_same_family(fpn2), "Should not be from the same family"
+
+    def testConvert(self):
+        # Test task displayname tranformation
+        fpn = ccm.FourPartName("Task mydb#123")
+        assert fpn.type == "task"
+        # Test folder displayname tranformation
+        fpn = ccm.FourPartName("Folder mydb#123")
+        assert fpn.type == "folder"
+        # Test Release tag displayname tranformation
+        fpn = ccm.FourPartName("mc/integration")
+        assert fpn.name == "mc"
+        assert fpn.version == "integration"
+        assert fpn.type == "releasedef"
+        assert fpn.instance == "1"
+
+        fpn = ccm.FourPartName("BTHID/3.2_2007_wk03")
+        assert fpn.name == "BTHID"
+        assert fpn.version == "3.2_2007_wk03"
+        assert fpn.type == "releasedef"
+        assert fpn.instance == "1"
+        
+        fpn = ccm.FourPartName("DRM_0.9")
+        assert fpn.name == "none"
+        assert fpn.version == "DRM_0.9"
+        assert fpn.type == "releasedef"
+        assert fpn.instance == "1"
+
+        try:
+            fpn = ccm.FourPartName("task mydb#123")
+            assert False, "Should raise InvalidFourPartNameException when parsing'task mydb#123'"
+        except ccm.InvalidFourPartNameException, e:
+            pass
+
+        try:
+            fpn = ccm.FourPartName("folder mydb#123")
+            assert False, "Should raise InvalidFourPartNameException when parsing'folder mydb#123'"
+        except ccm.InvalidFourPartNameException, e:
+            pass
+            
+            
+class InvalidFourPartNameExceptionTest(unittest.TestCase):
+    def testOutput(self):
+        """ Test the exception shows the arguments. """
+        ex = ccm.InvalidFourPartNameException('foo')
+        assert str(ex) == 'foo'
+
+
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ccm_object.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,117 @@
+#============================================================================ 
+#Name        : test_ccm_object.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for ccm python toolkit.
+    unitesting CCMObject functionality
+"""
+import unittest
+import sys
+import ccm
+import logging
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.ccm_objects')
+#
+#class CCMObjectTest(unittest.TestCase):
+#    """ Module related to CCMObject (and related) function testing. """
+#    
+#    def setUp(self):
+#        #vc1tltst
+#        self.session = ccm.open_session(database = 'to1tobet')
+#        if self.session is None:
+#            logger.error("Error creating connection.")
+#            raise Exception("Couldn't open a session.")
+#
+#    def tearDown(self):
+#        """ End of test: close opened synergy sessions. """
+#        if self.session is not None:
+#            self.session.close()
+#            self.session = None
+#        
+#    def test_query(self):
+#        """ Test simple synergy query that returns an object list. """
+#        result = self.session.execute("query \"name='mc'and type='project' and status='released'\" /u /f \"%objectname\"", ccm.ObjectListResult(self.session))
+#        for o in result.output:
+#            assert o.type == 'project'
+#            assert o['status'] == 'released'
+#                    
+#    def _test_checkout(self):
+#        """ Test project checkout. """
+#        project = self.session.create("mc-mc_4032_0728:project:vc1s60p1#1")
+#        release = self.session.create("mc/next")
+#        if not project.exists():
+#           logger.error("Project doesn't exists.")
+#           return       
+#        if not release.exists():           
+#           logger.error("Release doesn't exists.")
+#           return
+#           
+#        coproject = project.checkout(release).project
+#        assert coproject != None
+#        assert coproject.name == project.name
+#        assert coproject.type == project.type
+#        assert coproject.instance == project.instance
+#        try:
+#            coproject2 = project.checkout(release, coproject.version).project
+#            assert False, "Should fail as we are specifying an already existing version."
+#        except Exception, e:
+#            pass
+#        
+#
+
+class MockResultSession(ccm.AbstractSession):
+    """ Fake session used to test Result"""
+    def __init__(self, behave = {}, database="fakedb"):
+        ccm.AbstractSession.__init__(self, None, None, None, None)
+        self._behave = behave
+        self._database = database
+    
+    def database(self):
+        return self._database
+    
+    def execute(self, cmdline, result=None):
+        logger.debug(cmdline)
+        if result == None:
+            result = ccm.Result(self)        
+        if self._behave.has_key(cmdline):
+            result.status = 0  
+            result.output = self._behave[cmdline]
+        else:
+            result.status = -1  
+        return result
+
+class CCMObjectTest(unittest.TestCase):
+    
+    def test_get_baseline(self):
+        behave = {'up -show baseline_project "foo-1.0:project:db#1" -f "%displayname" -u': """foo-1.0:project:db#1 does not have a baseline project.
+""",
+                  'up -show baseline_project "foo-2.0:project:db#1" -f "%displayname" -u': """foo-1.0:project:db#1
+"""}
+        session = MockResultSession(behave)
+        objv1 = session.create('foo-1.0:project:db#1')
+        assert objv1.baseline == None
+        objv2 = session.create('foo-2.0:project:db#1')
+        assert objv2.baseline == objv1
+
+
+if __name__ == "__main__":
+    unittest.main()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ccm_results.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,485 @@
+#============================================================================ 
+#Name        : test_ccm_results.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for ccm python toolkit.
+
+"""
+import unittest
+import sys
+import ccm
+import os
+import logging
+
+
+logger = logging.getLogger('test.ccm_results')
+logging.basicConfig(level=logging.INFO)
+
+class CounterHandler(logging.Handler):
+    """ 
+    """
+    def __init__(self, level=logging.NOTSET):
+        logging.Handler.__init__(self, level)
+        self.warnings = 0
+        self.errors = 0
+        self.infos = 0
+    
+    def emit(self, record):
+        """ Handle the count the errors. """
+        if record.levelno == logging.INFO:
+            self.infos += 1
+        elif record.levelno == logging.WARNING:
+            self.warnings += 1
+        elif record.levelno == logging.ERROR:
+            self.errors += 1
+
+class MockResultSession(ccm.AbstractSession):
+    """ Fake session used to test Result"""
+    def __init__(self, behave = {}, database="fakedb"):
+        ccm.AbstractSession.__init__(self, None, None, None, None)
+        self._behave = behave
+        self._database = database
+    
+    def database(self):
+        return self._database
+    
+    def execute(self, cmdline, result=None):
+        if result == None:
+            result = ccm.Result(self)        
+        if self._behave.has_key(cmdline):
+            result.statuserrors = 0  
+            result.output = self._behave[cmdline]
+        else:
+            result.status = -1  
+        return result
+
+    
+class ResultTest(unittest.TestCase):
+    """ Testing Results parsers. """
+    def test_Result(self):
+        """ Test result. """
+        result = ccm.Result(None)
+        result.output = u"Nokia"
+        assert result.output == u"Nokia"
+
+    def test_Result_unicode_character(self):
+        """ Test result with unicode character. """
+        result = ccm.Result(None)
+        result.output = u"Nokia\xc2"
+        print result.output.encode('ascii', 'replace')
+        assert result.output == u"Nokia?"
+
+    def test_Result_str(self):
+        """ Test result from str. """
+        result = ccm.Result(None)
+        result.output = "Nokia"
+        assert result.output == "Nokia"
+
+    def test_Result_str_not_ascii(self):
+        """ Test result from str with not ascii. """
+        result = ccm.Result(None)
+        result.output = "Noki\xe4"
+        print result.output
+        assert result.output == "Noki"
+
+   
+    def test_ObjectListResult(self):
+        behave = { 'test_ObjectListResult': """mc-mc_0638:project:vc1s60p1#1
+mc-mc_4031_0642:project:vc1s60p1#1
+mc-mc_4031_0646:project:vc1s60p1#1
+mc-mc_4031_0650:project:vc1s60p1#1
+mc-mc_4031_0702:project:vc1s60p1#1
+mc-mc_4031_0704:project:vc1s60p1#1
+mc-mc_4031_0706:project:vc1s60p1#1
+mc-mc_4031_0706_v2:project:vc1s60p1#1
+mc-mc_4032_0708:project:vc1s60p1#1
+mc-mc_4032_0710:project:vc1s60p1#1
+mc-mc_4032_0712:project:vc1s60p1#1
+mc-mc_4032_0714:project:vc1s60p1#1
+mc-mc_4032_0716:project:vc1s60p1#1
+mc-mc_4032_0718:project:vc1s60p1#1
+mc-mc_4032_0720:project:vc1s60p1#1
+mc-mc_4032_0722:project:vc1s60p1#1
+mc-mc_4032_0724:project:vc1s60p1#1
+mc-mc_4032_0726.lum.09:project:vc1s60p1#1
+mc-mc_4032_0726:project:vc1s60p1#1
+mc-mc_4032_0728:project:vc1s60p1#1
+mc-mc_4032_0730:project:vc1s60p1#1
+mc-mc_4032_0732:project:vc1s60p1#1
+mc-mc_4032_0734:project:vc1s60p1#1
+mc-mc_4032_0736:project:vc1s60p1#1
+
+"""}
+        session = MockResultSession(behave)
+        result = session.execute('test_ObjectListResult', ccm.ObjectListResult(session))
+        assert len(result.output) == 24, "output doesn't contains the right number of result project."
+        for o in result.output:
+            assert o.type == 'project'
+            assert o.name == 'mc'
+
+    def test_WorkAreaInfoResult(self):
+        behave = { 'test_WorkAreaInfoResult': """
+Project                                            Maintain Copies Relative Time Translate Modify Path
+-------------------------------------------------------------------
+mc_5132_build-fa1f5132#loc_0734:project:jk1f5132#1 TRUE     TRUE   TRUE     TRUE TRUE      FALSE  'E:\\WBERNARD\\ccm_wa\\fa1f5132\\mc-fa1f5132#loc_0734\\mc\\mc_build'
+
+"""}
+        session = MockResultSession(behave)
+        result = session.execute('test_WorkAreaInfoResult', ccm.WorkAreaInfoResult(session))
+        print result.output
+        print result.output['path']
+        assert str(result.output['project']) == "mc_5132_build-fa1f5132#loc_0734:project:jk1f5132#1", "wrong project name."
+        assert result.output['maintain'] == True, "maintain value is wrong."
+        assert result.output['copies'] == True, "copies value is wrong."
+        assert result.output['relative'] == True, "relative value is wrong."
+        assert result.output['time'] == True, "time value is wrong."
+        assert result.output['translate'] == True, "translate value is wrong."
+        assert result.output['modify'] == False, "modify value is wrong."
+        assert result.output['path'] == "E:\\WBERNARD\\ccm_wa\\fa1f5132\\mc-fa1f5132#loc_0734\\mc\\mc_build", "path value is wrong."
+            
+    def test_FinduseResult(self):
+        """ Test the parsing of the FinduseResult class. """
+        behave = { 'test_FinduseResult': """
+Ibusal_internal-fa1f5132#wbernard16:project:jk1imeng#1 working wbernard project Ibusal_internal jk1imeng#1 fa1f5132#2561
+        IBUSAL_RapidoYawe\Ibusal_internal-fa1f5132#wbernard16@IBUSAL_RapidoYawe-fa1f5132#wbernard16:project:jk1imeng#1
+        
+"""}
+        session = MockResultSession(behave)
+        object = session.create("Ibusal_internal-fa1f5132#wbernard16:project:jk1imeng#1")
+        result = session.execute('test_FinduseResult', ccm.FinduseResult(object))
+        print result.output
+        assert len(result.output) == 1
+        assert result.output[0]['project'].objectname == "IBUSAL_RapidoYawe-fa1f5132#wbernard16:project:jk1imeng#1"
+        assert result.output[0]['path'] == "IBUSAL_RapidoYawe"
+          
+          
+    def test_read_ccmwaid_info(self):
+        """ Testing read_ccmwaid_info, open a _ccmwaid.inf file and check the extracted data. """
+        data = ccm.read_ccmwaid_info(os.path.join(os.environ["HELIUM_HOME"], 'tests', 'data', 'test_ccmwaid.inf'))
+        logger.debug(data)
+        assert data['database'] == "jk1f5132"
+        assert data['objectname'] == "sa1spp#1/project/S60/jk1f5132#wbernard"
+
+    def test_update_result(self):
+        """ Validating UpdateResult."""        
+        behave = {'test_update' :"""Starting update process...
+
+Updating project 'Cartman-wbernard5:project:tr1test1#1' from object version 'Cartman-wbernard5:project:tr1test1#1'...
+Refreshing baseline and tasks for project grouping 'My cartman/060530_v2 Collaborative Development Projects'.
+Replacing tasks in folder tr1test1#2008
+  Contents of folder tr1test1#2008 have not changed.
+Replacing tasks in folder tr1test1#2009
+  Contents of folder tr1test1#2009 have not changed.
+Added the following tasks to project grouping 'My cartman/060530_v2 Collaborative Development Projects':
+    Task tr1test1#3426: Update Cartman subprojects
+    Task tr1test1#3429: Create Kyle subprojects
+    Task tr1test1#3430: Add Kyle02 subpr hierarchy
+    Task tr1test1#3431: Add a file to cartman_sub_sub02
+
+
+Updating project 'Cartman_sub01-wbernard3:project:tr1test1#1', reselecting root object version...
+Update for 'Cartman-wbernard5:project:tr1test1#1' complete with 0 out of 3 objects replaced.
+
+Updating project 'Cartman_sub_sub01-wbernard3:project:tr1test1#1', reselecting root object version...
+Update for 'Cartman_sub01-wbernard3:project:tr1test1#1' complete with 0 out of 2 objects replaced.
+
+Updating project 'Cartman_sub02-wbernard3:project:tr1test1#1', reselecting root object version...
+Update for 'Cartman_sub_sub01-wbernard3:project:tr1test1#1' complete with 0 out of 1 objects replaced.
+    'Cartman_sub02-2:dir:tr1test1#1' replaces 'Cartman_sub02-1:dir:tr1test1#1' under 'Cartman_sub02-wbernard3:project:tr1test1#1'.
+
+Updating project 'Cartman_sub_sub02-wbernard6:project:tr1test1#1', reselecting root object version...
+Update for 'Cartman_sub02-wbernard3:project:tr1test1#1' complete with 2 out of 2 objects replaced.
+    Subproject 'Cartman_sub_sub02-wbernard6:project:tr1test1#1' is now bound under 'Cartman_sub02-2:dir:tr1test1#1'.
+    'Cartman_sub_sub02-2:dir:tr1test1#1' replaces 'Cartman_sub_sub02-1:dir:tr1test1#1' under 'Cartman_sub_sub02-wbernard6:project:tr1test1#1'.
+Update for 'Cartman_sub_sub02-wbernard6:project:tr1test1#1' complete with 2 out of 2 objects replaced.
+    'xzx.iby-1:epocrom:tr1test1#1' is now bound under 'Cartman_sub_sub02-2:dir:tr1test1#1'.
+
+
+Update Summary:
+ Cartman_sub_sub02:dir:tr1test1#1 in project Cartman_sub_sub02-wbernard2:project:tr1test1#1 had no candidates
+
+Update complete.
+"""}
+        session = MockResultSession(behave)
+        result = session.execute('test_update', ccm.UpdateResult(session))
+        #logger.debug(result.output)
+        assert(len(result.output['tasks'])==4, "Number of tasks doesn't match.")
+        assert(len(result.output['modifications'])==4, "Number of modifications doesn't match.")
+        assert(len(result.output['errors'])==1, "Number of errors doesn't match.")
+
+    def test_update_result_serious_failure(self):
+        """ Validating UpdateResult with serious failure."""        
+        behave = {'test_update' :"""Starting update process...
+
+Updating project 'MinibuildDomain-wbernard3:project:tr1test1#1' from object version 'MinibuildDomain-wbernard3:project:tr1test1#1'...
+Refreshing baseline and tasks for project grouping 'My MinibuildDomain/next Insulated Development Projects'.
+Replacing tasks in folder tr1test1#2068
+  Contents of folder tr1test1#2068 have not changed.
+Setting path for work area of 'helloworldcons-wbernard2' to 'c:\users\ccm65\ccm_wa\tr1test1\MinibuildDomain'...
+Warning: 'c:\users\ccm65\ccm_wa\tr1test1\MinibuildDomain\helloworldcons' already used as work area for project 'helloworldcons-wbernard'
+Warning: Unable to update path for work area of 'helloworldcons-wbernard2'
+Warning: Unable to update membership of project 'MinibuildDomain-wbernard3'
+Work area delete of 'helloworldcons-wbernard2:project:tr1test1#1' failed
+Warning: Unable to update membership of project MinibuildDomain-wbernard3 with MinibuildDomain-2:dir:tr1test1#1
+Rebind of MinibuildDomain-1:dir:tr1test1#1 failed
+Warning: Update for project 'MinibuildDomain-wbernard3:project:tr1test1#1' failed.
+
+Update Summary
+2 failures to use the selected object version
+    Failed to remove selected object helloworldcons-wbernard2:project:tr1test1#1 under directory MinibuildDomain-1:dir:tr1test1#1 from project MinibuildDomain-wbernard3 : work area delete failed
+    Failed to use selected object MinibuildDomain-2:dir:tr1test1#1 under directory MinibuildDomain-wbernard3:project:tr1test1#1 in project MinibuildDomain-wbernard3
+Serious: 
+Update failed.
+"""}
+        session = MockResultSession(behave)
+        result = session.execute('test_update', ccm.UpdateResult(session))
+        #logger.debug(result.output)
+        #logger.debug(result.output.keys())
+        #logger.debug(len(result.output['tasks']))
+        #logger.debug(len(result.output['modifications']))
+        #logger.debug(len(result.output['errors']))
+        #logger.debug(len(result.output['warnings']))
+        
+        assert ((len(result.output['tasks'])==0), "Number of tasks doesn't match.")
+        assert ((len(result.output['modifications'])==0), "Number of modifications doesn't match.")
+        assert ((len(result.output['errors'])==3), "Number of errors doesn't match.")
+        assert ((len(result.output['warnings'])==5), "Number of warnings doesn't match.")
+
+
+    def test_UpdateTemplateInformation_result(self):        
+        """ Validating UpdateTemplateInformation."""                
+        behave = {'test_update' : """Baseline Selection Mode: Latest Baseline Projects
+Prep Allowed:            No
+Versions Matching:       *abs.50*
+Release Purposes:
+Use by Default:          Yes
+Modifiable in Database:  tr1s60
+In Use For Release:      Yes
+Folder Templates and Folders:
+    Template assigned or completed tasks for %owner for release %release
+    Template all completed tasks for release %release
+    Folder   tr1s60#4844: All completed Xuikon/Xuikon_rel_X tasks
+    Folder   tr1s60#4930: All tasks for release AppBaseDo_50        
+        """}
+        session = MockResultSession(behave)
+        result = session.execute('test_update', ccm.UpdateTemplateInformation(session))
+        #logger.debug(result.output)
+        assert(result.output['baseline_selection_mode']== "Latest Baseline Projects", "BSM doesn't match.")
+        assert(result.output['prep_allowed']== False, "Prep allowed doesn't match.")
+        assert(result.output['version_matching']== "*abs.50*", "Version matching doesn't match.")
+        assert(result.output['release_purpose']== "", "Release purpose doesn't match.")
+        assert(result.output['modifiable_in_database']== "tr1s60", "Modifiable in Database doesn't match.")
+        assert(result.output['in_use_for_release']== True, "In Use For Release doesn't match.")
+    
+    def test_ConflictsResult_result(self):        
+        """ Validating ConflictsResult."""                
+        behave = {'test_update' : """        
+Project: Cartman-Release_v4
+
+         No conflicts detected.
+
+Project: Cartman_sub03-next
+
+         No conflicts detected.
+
+Project: Cartman_sub01-Release_v2
+
+         No conflicts detected.
+
+Project: Cartman_sub02-Release_v4
+
+         No conflicts detected.
+
+Project: Cartman_sub_sub01-Release_v2
+
+         No conflicts detected.
+
+Project: Cartman_sub_sub02-Release_v4
+
+         No conflicts detected.
+
+Project: Cartman_sub_sub_sub02-Release_v4
+
+tr1test1#5224   Explicitly specified but not included
+tr1test1#5226   Explicitly specified but not included
+        """}
+        session = MockResultSession(behave)
+        result = session.execute('test_update', ccm.ConflictsResult(session))
+        #logger.debug(result.output)
+        # pylint: disable-msg=E1103
+        assert len(result.output.keys()) == 7, "Should detect 7 projects."
+        subproj = session.create("Cartman_sub_sub_sub02-Release_v4:project:%s#1" % session.database())
+        assert len(result.output[subproj]) == 2, "%s should contain 2 conflicts" % subproj.objectname
+
+
+    def test_DataMapperListResult_result(self):        
+        """ Validating DataMapperListResult."""                        
+        behave = {'test_query' : """>>>objectname>>>task5204-1:task:tr1test1>>>task_synopsis>>>Create Cartman_sub03>>>
+>>>objectname>>>task5223-1:task:tr1test1>>>task_synopsis>>>cartman/next test1>>>
+>>>objectname>>>task5224-1:task:tr1test1>>>task_synopsis>>>test.txt>>>
+>>>objectname>>>task5225-1:task:tr1test1>>>task_synopsis>>>test.txt 2>>>
+>>>objectname>>>task5226-1:task:tr1test1>>>task_synopsis>>>test.txt merge>>>
+>>>objectname>>>task5240-1:task:tr1test1>>>task_synopsis>>>add calculator>>>
+"""}
+        session = MockResultSession(behave)
+        result = session.execute('test_query', ccm.DataMapperListResult(session, '>>>', ['objectname', 'task_synopsis'], ['ccmobject', 'string']))        
+        logger.debug(result.output)
+        assert len(result.output) == 6
+        
+    def test_UpdatePropertiesRefreshResult_result(self):        
+        """ Validating UpdatePropertiesRefreshResult."""                        
+        behave = {'test_refresh' : """Refreshing baseline and tasks for project grouping 'All cartman/next Integration Testing Projects from Database tr1test1'.
+Replacing tasks in folder tr1test1#2045
+  Removed the following tasks from folder tr1test1#2045
+        Task tr1test1#5225: test.txt 2
+
+  Added the following tasks to folder tr1test1#2045
+        Task tr1test1#5223: cartman/next test1
+
+Added the following tasks to project grouping 'All cartman/next Integration Testing Projects from Database tr1test1':
+        Task tr1test1#5223: cartman/next test1
+
+Removed the following tasks from project grouping 'All cartman/next Integration Testing Projects from Database tr1test1':
+        Task tr1test1#5225: test.txt 2
+"""}
+        session = MockResultSession(behave)
+        result = session.execute('test_refresh', ccm.UpdatePropertiesRefreshResult(session))        
+        logger.debug(result.output)
+        assert result.output['added'] == [session.create("Task tr1test1#5223")]
+        assert result.output['removed'] == [session.create("Task tr1test1#5225")]
+
+    def test_update_log_result(self):
+        """ Testing update log parsing. """
+        log = """Starting update process...
+
+Updating project 'MinibuildDomain-wbernard3:project:tr1test1#1' from object version 'MinibuildDomain-wbernard3:project:tr1test1#1'...
+Refreshing baseline and tasks for project grouping 'My MinibuildDomain/next Insulated Development Projects'.
+Replacing tasks in folder tr1test1#2068
+  Contents of folder tr1test1#2068 have not changed.
+Setting path for work area of 'helloworldcons-wbernard2' to 'c:\users\ccm65\ccm_wa\tr1test1\MinibuildDomain'...
+Warning: 'c:\users\ccm65\ccm_wa\tr1test1\MinibuildDomain\helloworldcons' already used as work area for project 'helloworldcons-wbernard'
+Warning: Unable to update path for work area of 'helloworldcons-wbernard2'
+Warning: Unable to update membership of project 'MinibuildDomain-wbernard3'
+Work area delete of 'helloworldcons-wbernard2:project:tr1test1#1' failed
+Warning: Unable to update membership of project MinibuildDomain-wbernard3 with MinibuildDomain-2:dir:tr1test1#1
+Rebind of MinibuildDomain-1:dir:tr1test1#1 failed
+Warning: Update for project 'MinibuildDomain-wbernard3:project:tr1test1#1' failed.
+Warning: This work area 'c:\users\ccm65\ccm_wa\tr1sido\mrurlparserplugin\mrurlparserplugin' cannot be reused
+Warning:  No candidates found for directory entry ecompluginnotifier.cpp:cppsrc:e003sa01#1.  It will be left empty!
+WARNING: There is no matching baseline project for 'ci-hitchcock_nga' in baseline 'tr1s60#ABS_domain_mcl92-abs.mcl.92_200907'.  This baseline might not be complete
+
+Update Summary
+2 failures to use the selected object version
+    Failed to remove selected object helloworldcons-wbernard2:project:tr1test1#1 under directory MinibuildDomain-1:dir:tr1test1#1 from project MinibuildDomain-wbernard3 : work area delete failed
+    Failed to use selected object MinibuildDomain-2:dir:tr1test1#1 under directory MinibuildDomain-wbernard3:project:tr1test1#1 in project MinibuildDomain-wbernard3
+Serious: 
+Update failed.
+"""
+        logger = logging.getLogger('count.logger')
+        logger.setLevel(logging.WARNING)
+        handler = CounterHandler()
+        logger.addHandler(handler)
+        ccm.log_result(log, ccm.UPDATE_LOG_RULES, logger)
+        print handler.warnings
+        print handler.errors
+        assert handler.warnings == 5
+        assert handler.errors == 9
+
+
+    def test_checkout_log_result(self):
+        """ Testing checkout log parsing. """
+        log = """Setting path for work area of 'swservices_domain-ssdo_7132_200912_Shakira_Gwen1' to 'E:\Build_E\DaveS\Integration\_no_context_\swservices_domain'...
+Saved work area options for project: 'swservices_domain-ssdo_7132_200912_Shakira_Gwen1'
+Derive failed for MobileSearch-MobileSearch_4_10_09w09_S60_3_2:project:sa1mosx1#1
+Warning: Project name is either invalid or does not exist: 
+Warning: fa1ssdo#MobileSearch_4_10_09w09_S60_3_3 too long, use name less than 32 characters long.
+Warning: Object version 'fa1ssdo#MobileSearch_4_10_09w09_S60_3_3' too long, use version less than 32 characters long.
+Copy Project complete with 1 errors.
+WARNING: There is no matching baseline project for 'ci-hitchcock_nga' in baseline 'tr1s60#ABS_domain_mcl92-abs.mcl.92_200907'.  This baseline might not be complete
+"""
+        logger = logging.getLogger('count.logger')
+        logger.setLevel(logging.WARNING)
+        handler = CounterHandler()
+        logger.addHandler(handler)
+        ccm.log_result(log, ccm.CHECKOUT_LOG_RULES, logger)
+        print handler.warnings
+        print handler.errors
+        assert handler.warnings == 4
+        assert handler.errors == 1
+
+        
+    def test_sync_log_result(self):
+        """ Testing sync log parsing. """
+        log = """Synchronization summary:
+       0 Update(s) for project MinibuildDomain-wbernard7
+       0 Update(s) for project helloworldapi-wbernard7
+       0 Update(s) for project helloworldcons-wbernard5
+       0 Conflict(s) for project MinibuildDomain-wbernard7
+       1 Conflict(s) for project helloworldapi-wbernard7
+       0 Conflict(s) for project helloworldcons-wbernard5
+You can use Reconcile to resolve work area conflicts
+Warning: Conflicts detected during synchronization. Check your logs.
+"""
+        logger = logging.getLogger('count.logger')
+        logger.setLevel(logging.WARNING)
+        handler = CounterHandler()
+        logger.addHandler(handler)
+        ccm.log_result(log, ccm.SYNC_LOG_RULES, logger)
+        print handler.warnings
+        print handler.errors
+        assert handler.warnings == 0
+        assert handler.errors == 2
+
+    def test_ResultWithError(self):
+        """ Test result. """
+        result = ccm.ResultWithError(None)
+        result.output = u"Nokia"
+        result.error = u"Nokio"
+        assert result.output == u"Nokia"
+        assert result.error == u"Nokio"
+
+    def test_ResultWithError_unicode_character(self):
+        """ Test result with unicode character. """
+        result = ccm.ResultWithError(None)
+        result.output = u"Nokia\xc2"
+        result.error = u"Nokio\xc2"
+        print result.output.encode('ascii', 'replace')
+        print result.error.encode('ascii', 'replace')
+        assert result.output == u"Nokia?"
+        assert result.error == u"Nokio?"
+
+    def test_ResultWithError_str(self):
+        """ Test result from str. """
+        result = ccm.ResultWithError(None)
+        result.output = "Nokia"
+        result.error = "Nokio"
+        assert result.output == "Nokia"
+        assert result.error == "Nokio"
+
+    def test_ResultWithError_str_not_ascii(self):
+        """ Test result from str with not ascii. """
+        result = ccm.ResultWithError(None)
+        result.output = "Noki\xe4"
+        result.error = "Nokio\xe5"
+        print result.output
+        print result.error
+        assert result.output == "Noki"
+        assert result.error == "Nokio"
+
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_comments.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+#============================================================================ 
+#Name        : test_comments.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for Comments.py. """
+import unittest
+import comments
+import logging
+import amara
+
+
+class CommentParserTest(unittest.TestCase):
+    """ Test cases for Comments.py. """
+    
+    def setUp(self):
+        # Initialize the sample files into two Comment Parsers.
+        self.parser1 = comments.CommentParser( [r'tests/data/comments_test.txt'], 'branchInfo' )
+        self.parser2 = comments.CommentParser( [r'tests/data/comments_test.cpp', r'tests/data/comments_test.bat',
+                                                r'tests/data/comments_test.h', r'tests/data/comments_test.hrh',
+                                                r'tests/data/comments_test.iby', r'tests/data/comments_test.inf',
+                                                r'tests/data/comments_test.mk', r'tests/data/comments_test.mmp',
+                                                r'tests/data/comments_test.pl', r'tests/data/comments_test.xml',
+                                                r'tests/data/comments_test.py', r'tests/data/comments_test.java',
+                                                r'tests/data/comments_test1.cmd', r'tests/data/comments_test2.cmd'], 'branchInfo' )
+     #   self.parser3 = comments.CommentParser( [r'tests/data/comments_test2.cmd'], 'branchInfo' )
+     
+        
+
+    """ Unit test for method scan() in comments.py. It also tested scan_content by using scan()
+    """
+    def test_scan(self):
+        #doc1 for only one txt file. 
+        doc1 = amara.parse(self.parser1.scan().xml())
+        #doc2 for all other 14 types of files. It also included two types of cmd files.
+        doc2 = amara.parse(self.parser2.scan().xml())
+        
+        # doc1's test verifies all the information the xml comment provides.
+        self.assertEquals(doc1.commentLog.branchInfo.originator, "sanummel")
+        self.assertEquals(doc1.commentLog.branchInfo.category, "")
+        self.assertEquals(doc1.commentLog.branchInfo.since, "07-03-22")
+        self.assertEquals(doc1.commentLog.branchInfo.file, r'tests/data/comments_test.txt')
+        self.assertEquals(doc1.commentLog.branchInfo.error, "kkk")
+        self.assertEquals(str(doc1.commentLog.branchInfo).strip(),"Add rofsfiles for usage in paged images")
+        # s = (str(doc1.commentLog.xml()))
+        # print s
+        # doc2's test only verifies the main comment content.
+        self.assertEquals(str(doc2.commentLog.branchInfo[0]).strip(), "We need TwistOpen and TwistClose to cause display to change between\n landscape and portrait, but SysAp is consuming the key events.  Try\n treating them as Flip events are handled already by SysAp.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[1]).strip(), "Testing if it's good~~~")
+        self.assertEquals(str(doc2.commentLog.branchInfo[2]).strip(), "We need TwistOpen and TwistClose to cause display to change between\n landscape and portrait, but SysAp is consuming the key events.  Try\n treating them as Flip events are handled already by SysAp.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[3]).strip(), "puikko ME SCD DeSW: wk21 Flag fix")
+        self.assertEquals(str(doc2.commentLog.branchInfo[4]).strip(), "Since Catalogs is not compiling at this point, and we are not building it, don't try to\n pull it into the rom.  Also, tfxserver is crashing, so don't build or pull it in either.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[5]).strip(), "Fix target export, which cause issue when cleanexport.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[6]).strip(), "Move command to makmake as EBS does not call abld build")
+        self.assertEquals(str(doc2.commentLog.branchInfo[7]).strip(), "Activate PCFW for Screensaver")
+        self.assertEquals(str(doc2.commentLog.branchInfo[8]).strip(), "Support SPP mechanism for flags support.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[9]).strip(), "Enabling all the HWRM light zones target for product")
+        self.assertEquals(str(doc2.commentLog.branchInfo[10]).strip(), "Again, it is just a test")
+        self.assertEquals(str(doc2.commentLog.branchInfo[11]).strip(), "Test info, so whatever~")
+        self.assertEquals(str(doc2.commentLog.branchInfo[12]).strip(), "k")
+        self.assertEquals(str(doc2.commentLog.branchInfo[13]).strip(), "")
+          
+    
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_configuration.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,289 @@
+#============================================================================ 
+#Name        : test_configuration.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+import StringIO
+import unittest
+import os
+import tempfile
+from path import path
+
+import configuration
+
+_logger = logging.getLogger('test.configuration')
+logging.basicConfig(level=logging.INFO)
+
+class NestedConfigurationBuilderTest(unittest.TestCase):
+    def setUp(self):
+        """ Setup. """
+        config_file = open('tests/data/config_test.cfg.xml', 'r')
+        self._builder = configuration.NestedConfigurationBuilder(config_file)
+        
+    def test_config_parsing(self):
+        """A basic configuration can be parsed."""
+        config_set = self._builder.getConfiguration()
+        configs = config_set.getConfigurations()
+        
+        assert len(configs) == 10
+        for config in configs:
+            print
+            for k in config.keys():
+                print k + ': ' + str(config[k])
+
+        assert configs[0]['A'] == 'foo'
+        assert configs[0]['B'] == 'child -> foo'
+        assert configs[0]['C'] == 'missing value test ${does_not_exist}'
+        assert configs[0]['node.content'].strip() == 'This is the value!'
+        assert configs[1]['A'] == 'foo'
+        assert configs[1]['B'] == 'parent: foo'
+        assert configs[1]['C'] == ['one', 'two']
+        assert 'C' in configs[1]
+        assert 'Z' not in configs[1]
+
+        configs = config_set.getConfigurations('spec.with.type')
+        assert len(configs) == 1
+        assert configs[0].type == 'test.type', "config.type must match 'test.type'."
+        
+        configs = config_set.getConfigurations(type='test.type')
+        assert len(configs) == 2
+        assert configs[0].type == 'test.type', "config.type must match 'test.type'."
+
+        configs = config_set.getConfigurations(name='test_spec', type='test.type')
+        assert len(configs) == 2
+        assert configs[0].type == 'test.type', "config.type must match 'test.type'."
+        
+    def test_append(self):
+        """A child value can be appended to a parent value."""
+        configs = self._builder.getConfigurations()
+        config = configs[4]
+        assert config['A'] == ['foo', 'bar']
+        
+    def test_parent_interpolated_by_child(self):
+        """ A child value can be interpolated into a parent template. """
+        configs = self._builder.getConfigurations()
+        parent_config = configs[6]
+        child_config = configs[5]
+        assert parent_config['template'] == 'value -> from parent'
+        assert child_config['template'] == 'value -> from child'
+     
+    def test_property_escaping(self):
+        """ Property values can be escaped in the values of other properties. """
+        config_text = """
+<build>
+    <config name="test_spec">
+        <set name="A" value="foo"/>
+        <set name="B" value="A = ${A}"/>
+    </config>
+</build>"""
+
+        builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+        config = builder.getConfiguration().getConfigurations()[0]
+        print config['B']
+        #assert configs[1]['C'] == ['one', 'two']
+
+    def test_any_root_element(self):
+        """ Any root element name can be used. """
+        config_text = """
+<someConfigData>
+    <config name="test_spec">
+        <set name="A" value="foo"/>
+    </config>
+</someConfigData>"""
+
+        builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+        config = builder.getConfiguration().getConfigurations()[0]
+        assert config['A'] == 'foo'
+
+    def test_list_templating(self):
+        """ Testing list templating. """
+        configs = self._builder.getConfigurations('test_list_config1')
+        # should return only one config.
+        assert len(configs) == 1
+        
+        _logger.debug(configs[0].get_list('include', []))
+        result = configs[0].get_list('include', [])
+        result.sort()
+        print result
+        assert len(result) == 3
+        assert result == [u'bar1_config1', u'bar2_config1', u'foo_config1']        
+
+    def test_list_templating2(self):
+        """ Testing list templating 2. """
+        configs = self._builder.getConfigurations('test_list_config2')
+        # should return only one config.
+        assert len(configs) == 1
+        
+        _logger.debug(configs[0].get_list('include', []))
+        result = configs[0].get_list('include', [])
+        result.sort()
+        print result
+        assert len(result) == 3
+        assert result == [u'bar1_config2', u'bar2_config2', u'foo_config2']        
+        
+
+    def test_append_list(self):
+        """ Testing if append handles the list correctly..."""
+        config_text = """
+<build>
+<config name="prebuild_zip" abstract="true">
+   <set name="exclude" value="**/_ccmwaid.inf" />
+   <set name="exclude" value="build/**" />
+   <set name="exclude" value="config/**" />
+   <set name="exclude" value="ncp_sw/**" />
+   <set name="exclude" value="ppd_sw/**" />
+   <set name="exclude" value="psw/**" />
+   <set name="exclude" value="tools/**" />
+   <set name="include" value="foo/**" />
+   <config>
+    <set name="root.dir" value="X:/rootdir" />
+    <set name="name" value="PF5250_200832_internal_code" />
+    <set name="include" value="**/internal/**" />
+    <set name="grace.filters" value="tsrc" />
+    <set name="grace.default" value="false" />
+   </config>
+   <config>
+    <set name="root.dir" value="X:/rootdir" />
+    <set name="name" value="PF5250_200832_doc" />
+    <append name="include" value="**/doc/**" />
+    <set name="include" value="**/docs/**" />
+    <append name="exclude" value="**/internal/**" />                            <!-- set changed to append -->
+    <set name="grace.filters" value="tsrc" />
+    <set name="grace.default" value="false" />
+   </config>
+  </config>
+</build>
+"""        
+        builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+        configs = builder.getConfigurations()
+        config = configs[1]
+        print config['exclude']
+        print config['include']
+        exclude_match = [u'**/_ccmwaid.inf', u'build/**', u'config/**',
+                                          u'ncp_sw/**', u'ppd_sw/**', u'psw/**', u'tools/**',
+                                          u'**/internal/**']
+        exclude_result = config['exclude']
+        exclude_match.sort()
+        exclude_result.sort()
+        assert len(config['include']) == 3
+        assert exclude_result == exclude_match
+
+        config = configs[0]
+        assert config['include'] == '**/internal/**'
+        assert len(config['exclude']) == 7
+        
+    def test_writeToXML(self):
+        """ To write the configurations into XML file. """
+        config_text = """
+<build>
+    <config name="test_spec">
+        <set name="A" value="foo"/>
+        <set name="B" value="A = ${A}"/>
+        <config name="test_spec_1">
+            <set name="A" value="foo"/>
+            <set name="B" value="A = ${A}"/>        
+        </config>
+        <config name="test_spec_2">
+            <set name="A" value="foo"/>
+            <set name="B" value="A = ${A}"/>
+            <config name="test_spec_3">
+                <set name="A" value="foo"/>
+                <set name="B" value="A = ${A}"/>        
+            </config>        
+        </config>        
+    </config>
+</build>"""    
+        
+        builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+        configSet = builder.getConfiguration()
+        configs = configSet.getConfigurations('test_spec_1')
+        (out, outputFile) = tempfile.mkstemp('.tmp', 'zip_test')
+        builder.writeToXML(outputFile, configs, 'test_spec_1')
+        
+        builder = configuration.NestedConfigurationBuilder(open(outputFile), 'r')
+        configSet = builder.getConfiguration()
+        configs = configSet.getConfigurations('test_spec_1')
+        config = configs[0]
+        assert config['A'] == 'foo'
+        
+        builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+        configSet = builder.getConfiguration()
+        configs = configSet.getConfigurations('test_spec')
+        (out, outputFile) = tempfile.mkstemp('.tmp', 'zip_test')
+        builder.writeToXML(outputFile, configs )
+        
+        builder = configuration.NestedConfigurationBuilder(open(outputFile), 'r')
+        configSet = builder.getConfiguration()
+        configs = configSet.getConfigurations('test_spec')
+        config = configs[0]
+        assert config['B'] == 'A = foo'
+        
+        
+
+        
+class PropertiesConfigurationTest(unittest.TestCase):
+    """ Test plain text configuration files. """
+    def test_text_config(self):
+        """ Basic text properties can be read. """
+        config = configuration.PropertiesConfiguration(open('tests/data/ant_config_test.txt', 'r'))
+        
+        assert config['text.a'] == 'text.value.A'
+        assert config['text.b'] == 'text.value.B'
+
+    def test_text_config_store(self):
+        """ Basic text properties can be read. """
+        config = configuration.PropertiesConfiguration(open('tests/data/ant_config_test.txt', 'r'))
+
+        config['foo'] = "bar"
+        
+        config.store(open('build/test.ini', "w+"))
+        config = configuration.PropertiesConfiguration(open('build/test.ini', 'r'))
+        
+        assert config['text.a'] == 'text.value.A'
+        assert config['text.b'] == 'text.value.B'
+        assert config['foo'] == 'bar'
+        
+        
+        
+class XMLConfigurationTest(unittest.TestCase):
+    """ Test XML format configuration files. """
+    
+    def test_single_node_xml(self):
+        """ Properties can be read from 1 level of XML sub-elements. """
+        config = configuration.XMLConfiguration(open('tests/data/ant_config_test.xml', 'r'))
+        
+        assert config['foo'] == 'bar'
+        assert config['interpolated'] == 'foo value = bar'
+        
+    def test_nested_node_xml(self):
+        """ Properties can be read from multiple levels of XML sub-elements. """
+        config = configuration.XMLConfiguration(open('tests/data/ant_config_test.xml', 'r'))
+        
+        assert config['xml.c'] == 'C'
+        
+    def test_xml_list(self):
+        """ Multiple XML elements can be read as a list. """
+        config = configuration.XMLConfiguration(open('tests/data/ant_config_test.xml', 'r'))
+        
+        assert config['array.value'] == 'one,two,three'
+        
+        
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_configuration_model.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+#============================================================================ 
+#Name        : test_configuration_model.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+import os
+import sys
+import unittest
+import nose
+
+import configuration
+import configuration_model
+
+
+logger = logging.getLogger('test.configuration_model')
+#logging.basicConfig(level=logging.DEBUG)
+
+class GroupDefTest(unittest.TestCase):
+    """ Check config model groups are correctly defined. """
+    
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_test.xml')
+        
+    def test_init_model(self):
+        """ Test groups can be created. """
+        assert len(self.model.properties.keys()) == 3
+        assert len(self.model.groups.keys()) == 1
+        
+        prop1 = self.model.properties['test.property.1']
+        assert prop1.description == 'Test property one.'
+        
+        prop2 = self.model.properties['test.property.2']
+        assert prop2.description == 'Test property two.'
+        
+        assert self.model.groups['testGroup'] != None
+
+    def test_property_not_in_model(self):
+        """ Property not in model is identified. """
+        data = {'missing.property': 'foobar', 'test.property.1': '1'}
+        config = configuration.Configuration(data)
+        items = self.model.validate_config(config)
+        
+        assert len(items) == 2
+        assert isinstance(items[0], configuration_model.MissingFromDataModelItem)
+    
+    def test_required_property_in_group_not_defined(self):
+        """ Required property in a group missing from config is identified. """
+        config = configuration.Configuration({'test.property.1': '1', 'test.property.3': '3'})
+        items = self.model.validate_config(config)
+        
+        assert len(items) == 1
+        assert isinstance(items[0], configuration_model.UndefinedRequiredInGroupItem)
+ 
+        
+class MissingFromDataModelItemTest(unittest.TestCase):
+    """ Item class operations. """
+    def test_create(self):
+        """ Basic validation item usage. """
+        item = configuration_model.MissingFromDataModelItem('test.property')
+        assert str(item) == 'Property not in data model: test.property'
+        item.log(logger)
+        
+        
+class DataModelTest(unittest.TestCase):
+    """ Checks Data Model is properly defined """
+    
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_validation_test.xml')    
+       
+    def test_init_model(self):
+        """ Test groups can be created. """
+        assert len(self.model.properties.keys()) == 3
+        assert len(self.model.groups.keys()) == 1
+        
+        prop1 = self.model.properties['test.property.1']
+        assert prop1.type == 'string'
+        assert prop1.description == 'Test property one.'
+        
+        prop2 = self.model.properties['test.property.2']
+        assert prop2.type == 'string'
+        assert prop2.description == 'Test property two.'
+        
+        assert self.model.groups['testGroup'] != None
+        
+        
+class DataModelPropertyTest(unittest.TestCase):
+    """ Checks Data Model that an exception is thrown if properties are not properly defined """
+    
+    @nose.tools.raises(Exception)
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_validation__property_test.xml')
+        
+        
+class DataModelGroupTest(unittest.TestCase):
+    """ Checks Data Model that an exception is thrown if there is a required property in groups is missing"""
+    
+    @nose.tools.raises(Exception)
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_validation_group_test.xml')
+        
+             
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ctc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,98 @@
+#============================================================================ 
+#Name        : test_ctc.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import unittest
+import ctc
+import logging
+import time
+import os
+import fileutils
+
+_logger = logging.getLogger('test.configuration')
+logging.basicConfig(level=logging.INFO)
+
+root_test_dir = "build/_test_" + str(time.strftime("%H.%M.%S"))
+_test_file_paths = [
+                    "ctc/dir/component1/group/MON.SYM",
+                    "ctc/dir/component2/group/",
+                    "ctc/dir/component3/group/MON.SYM",
+]
+
+def _testpath(subpath):
+    """ Normalised path for test paths. """
+    return os.path.normpath(os.path.join(root_test_dir, subpath))
+
+_test_file_content = {}
+
+def setup_module():
+    """ Setup files test config. 
+    
+    This creates a number of empty files in a temporary directory structure
+    for testing various file selection and archiving operations.
+    """
+    for child_path in _test_file_paths:
+        path = os.path.join(root_test_dir, child_path)
+        path_dir = path
+        path_dir = os.path.dirname(path)
+        
+        if (not os.path.exists(path_dir)):
+            _logger.debug('Creating dir:  ' + path_dir)
+            os.makedirs(path_dir)
+
+        if(not path.endswith('/') and not path.endswith('\\')):
+            _logger.debug('Creating file: ' + path)
+            handle = open(path, 'w')
+            # Write any file content that is needed
+            if _test_file_content.has_key(child_path):
+                handle.write(_test_file_content[child_path])
+            handle.close()
+
+def teardown_module():
+    """ Teardown test config. """
+    if os.path.exists(root_test_dir):
+        fileutils.rmtree(root_test_dir)
+    
+
+class MockUploader(ctc.MonSymFTPUploader):
+    
+    def _open(self):
+        pass
+    
+    def _close(self):
+        pass
+
+    def _ftpmkdirs(self, dir):
+        pass    
+    
+    def _send(self, src, dst):
+        pass
+
+class NestedConfigurationBuilderTest(unittest.TestCase):
+        
+    def test_uploader(self):
+        paths = [   "ctc/dir/component1/group/MON.SYM",
+                    "ctc/dir/component2/group/MON.SYM",
+                    "ctc/dir/component3/group/MON.SYM",
+                    ]
+        uploader = MockUploader("server", [_testpath(p) for p in paths], "1234")
+        result = uploader.upload()
+        print result
+        assert len(result) == 2
+        assert result[0] == "ctc_helium/1234/mon_syms/1/MON.SYM"
+        assert result[1] == "ctc_helium/1234/mon_syms/2/MON.SYM"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_deltazip.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+#============================================================================ 
+#Name        : test_deltazip.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Unit tests for the delta zip tool.
+
+"""
+
+import unittest
+import delta_zip
+import logging
+import os
+
+class DeltaZipTest( unittest.TestCase ):
+    
+    def setUp(self):
+        self.cwd_backup = os.getcwd()
+        self.helium_home = os.environ["HELIUM_HOME"]
+        self.logger = logging.getLogger('test.deltazip')
+        self.root = os.path.join(self.helium_home, r'tools\common\python\lib')
+        self.output = os.path.join(os.environ['TEMP'], 'deltazip')
+        self.output2 = os.path.join(os.environ['TEMP'], 'deltazip2')
+        
+        logging.basicConfig(level=logging.INFO)
+
+    def test_MD5SignatureBuilder(self):
+        
+        output = os.path.join(self.output2, 'md5_list.txt')
+        md5output = os.path.join(self.output2, 'delta.md5')
+        
+        if os.path.exists(output):
+            os.remove(output)
+        
+        sig = delta_zip.MD5SignatureBuilderEBS(self.root, 1, self.output2, '', output)
+        sig.write_build_file()
+        
+        assert os.path.exists(output)
+
+    def test_DeltaZipBuilder(self):
+        if not os.path.exists(self.output):
+            os.mkdir(self.output)
+      
+        md5output = os.path.join(self.output, 'delta.md5')
+        oldmd5output = os.path.join(self.output, 'olddelta.md5')
+      
+        thisfile = os.path.abspath(__file__)
+        md5string = """
+Host:fasym014
+Username:ssteiner
+Date-Time:Fri Aug 17 08:47:40 2007
+Version:0.02
+Directory:z:\
+FileList:z:\output/delta_zip\list_files.txt
+Exclusion(s):
+Inclusion(s):
+----------------
+%s TYPE=unknown format MD5=34dcda0d351c75e4942b55e1b2e2422f
+        """ % thisfile
+        
+
+        tempoutput = open(md5output, 'w')
+        tempoutput.write(md5string)
+        tempoutput.close()
+        
+        md5string = """
+Host:fasym014
+Username:ssteiner
+Date-Time:Fri Aug 17 08:47:40 2007
+Version:0.02
+Directory:z:\
+FileList:z:\output/delta_zip\list_files.txt
+Exclusion(s):
+Inclusion(s):
+----------------
+%s TYPE=unknown format MD5=34dcda0d351c75e4942b55e1b2e2422g
+        """ % thisfile
+        
+        tempoutput = open(oldmd5output, 'w')
+        tempoutput.write(md5string)
+        tempoutput.close()
+        
+        deltazipfile = os.path.join(self.output, 'delta.zip')
+        deltaantfile = os.path.join(self.output, 'delta.ant.xml')
+        deletefile = os.path.join(self.output, 'delta_zip_specialInstructions.xml')
+        
+      
+        delta = delta_zip.DeltaZipBuilder(self.root, self.output, oldmd5output, md5output)
+        delta.create_delta_zip(deltazipfile, deletefile, 1, deltaantfile)
+
+    def tearDown(self):
+        """ Restore path """
+        os.chdir(self.cwd_backup)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_escapeddict.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+#============================================================================ 
+#Name        : test_escapeddict.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+import unittest
+
+import escapeddict
+
+
+logger = logging.getLogger('test.escapeddict')
+
+
+class EscapedDictTest(unittest.TestCase):
+    def test_escape(self):
+        testdict = escapeddict.EscapedDict({'key1': 'value1', 'key2': 'value2 ${key1}'})
+        for key in testdict.keys():
+            logger.info(testdict[key])
+        assert testdict['key1'] == 'value1'
+        assert testdict['key2'] == 'value2 value1'
+        
+    def test_escape_no_value_present(self):
+        testdict = escapeddict.EscapedDict({'key1': 'value1', 'key2': 'value2 ${key_not_present} ${key1}'})
+        for key in testdict.keys():
+            print testdict[key]
+        assert testdict['key1'] == 'value1'
+        assert testdict['key2'] == 'value2 ${key_not_present} value1'
+        
+    def test_escape_value_as_list(self):
+        testdict = escapeddict.EscapedDict({'key1': 'value1', 'key2': ['value2', '${key1}']})
+        for key in testdict.keys():
+            print testdict[key]
+        assert testdict['key1'] == 'value1'
+        assert testdict['key2'] == ['value2', 'value1']
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_fileutils.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,641 @@
+#============================================================================ 
+#Name        : test_fileutils.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test fileutils module. """
+
+import unittest
+import logging
+import os
+import shutil
+import time
+import sys
+import fileutils
+import archive
+
+_logger = logging.getLogger('test.fileutils')
+
+
+_test_file_paths = [
+    'root_file1.txt',
+    'root_file2.doc',
+    'root_file3_no_extension',
+
+    'dir1/file1.txt',
+    'dir1/file2.doc',
+    'dir1/file3_no_extension',
+    'dir1/subdir1/subdir1_file.txt',
+    'dir1/subdir2/subdir2_file_no_extension',
+    'dir1/subdir3/',
+
+    'dir2/',
+    'dir3/subdir/',
+    
+    'wildcard1.txt',
+    'wildcard2.doc',
+    'wildcard3',
+    'wildcard4/',
+    'wildcard5/file.txt',
+    
+    'dir/emptysubdir1/',
+    'dir/emptysubdir2/',
+    'dir/emptysubdir3/',
+    
+    u'test_unicode/test_\u00e9.txt',
+    u'test_unicode/test_\u00e7.txt',
+    u'test_unicode/test_\u00e4.txt',
+    
+    's60/Distribution.Policy.S60',
+    's60/component_public/Distribution.Policy.S60',
+    's60/component_public/component_public_file.txt',
+    's60/component_private/Distribution.Policy.S60',
+    's60/component_private/component_private_file.txt',
+    's60/missing/to_be_removed_9999.txt',    
+    's60/missing/subdir/Distribution.Policy.S60',
+    's60/missing/subdir/not_to_be_removed_0.txt',    
+    's60/missing/subdir/another_subdir/to_be_removed_9999.txt',    
+    's60/UPPERCASE_MISSING/to_be_removed_9999.txt',
+    's60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60',
+    's60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt',
+    's60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt',
+    's60/not_in_cvs/Distribution.Policy.S60',
+    'test_policies/1/Distribution.Policy.S60',
+    'test_policies/2/Distribution.Policy.S60',
+    'test_policies/3/Distribution.Policy.S60',
+    'test_policies/4/Distribution.Policy.S60',
+    'test_policies/5/Distribution.Policy.S60',
+    'test_policies/6/Distribution.Policy.S60',
+    'test_policies/7/Distribution.Policy.S60',
+    'test_policies/8/Distribution.Policy.S60',
+    'test_policies/9/Distribution.Policy.S60',
+    'symbian/distribution.policy',
+    'symbian/dir1/distribution.policy',
+    'symbian/dir2/distribution.policy',
+    'symbian/dir3/distribution.policy',
+    'symbian/dir4/distribution.policy',
+    'symbian/dir5/distribution.policy',
+    's60src/src-a/distribution.policy',
+    's60src/src-b/distribution.policy',
+    's60src/src-c/distribution.policy',
+
+    'sf/Distribution.Policy.S60',
+    'sf/component_public/Distribution.Policy.S60',
+    'sf/component_public/component_public_file.txt',
+    'sf/component_epl/Distribution.Policy.S60',
+    'sf/component_epl/component_epl_file.txt',
+    'sf/component_sfl/Distribution.Policy.S60',
+    'sf/component_sfl/component_sfl_file.txt',
+    'sf/component_private/Distribution.Policy.S60',
+    'sf/component_private/component_private_file.txt',
+    'sf/missing/to_be_removed_9999.txt',
+    'sf/missing/subdir/Distribution.Policy.S60',
+    'sf/missing/subdir/to_be_removed_9999.txt',
+    'sf/UPPERCASE_MISSING/to_be_removed_9999.txt',
+    'sf/UPPERCASE_MISSING/subdir/Distribution.Policy.S60',
+    'sf/UPPERCASE_MISSING/subdir/to_be_removed_9999.txt',
+    'sf/not_in_cvs/Distribution.Policy.S60',
+    ]
+
+_test_file_content = {
+    's60/Distribution.Policy.S60': '0',
+    's60/missing/subdir/Distribution.Policy.S60' : '0',
+    's60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60': '0',
+    's60/component_public/Distribution.Policy.S60': '0',
+    's60/component_private/Distribution.Policy.S60': '1\r\n',
+    'test_policies/1/Distribution.Policy.S60': '\xFF\xFE\x30\x00\x0D\x00\x0D\x00\x0D\x00\x0A\x00',
+    'test_policies/2/Distribution.Policy.S60': '\xEF\xBB\xBF\x30\x0D\x0D\x0A',
+    'test_policies/3/Distribution.Policy.S60': '0 ; %version: 1 %',
+    'test_policies/4/Distribution.Policy.S60': '10 ; %version: 1 %',
+    'test_policies/5/Distribution.Policy.S60': '10ABC10',
+    'test_policies/6/Distribution.Policy.S60': '10ABC10 ; %version: 1 %',
+    'test_policies/7/Distribution.Policy.S60': '08421A2', # good
+    'test_policies/8/Distribution.Policy.S60': '08421A2 ; %version: 1 %', # bad
+    'test_policies/9/Distribution.Policy.S60': '1110A12', # bad
+    's60/not_in_cvs/Distribution.Policy.S60': '77777',
+    'symbian/distribution.policy': 'Category A',
+    'symbian/dir1/distribution.policy': 'Category B',
+    'symbian/dir2/distribution.policy': 'Line one \r\nAnother one \r\nCategory C',
+    'symbian/dir3/distribution.policy': 'Line one \r\nAnother one \r\nAnother one \r\nCategory D',
+    'symbian/dir4/distribution.policy': 'Line one \r\nAnother one \r\nNo Category',
+    'symbian/dir5/distribution.policy': 'Line one \r\nAnother one \r\nagain no category',
+    's60src/src-a/distribution.policy': 'Category A',
+    's60src/src-b/distribution.policy': 'Category B',
+    's60src/src-c/distribution.policy': 'Category C',
+    'sf/Distribution.Policy.S60': '0',
+    'sf/missing/subdir/Distribution.Policy.S60' : '0',
+    'sf/UPPERCASE_MISSING/subdir/Distribution.Policy.S60': '0',
+    'sf/component_public/Distribution.Policy.S60': '0',
+    'sf/component_sfl/Distribution.Policy.S60': '3',
+    'sf/component_epl/Distribution.Policy.S60': '7',
+    'sf/component_private/Distribution.Policy.S60': '1',
+    }
+    
+""" Used by test_archive. """
+root_test_dir = "build/_test_" + str(time.strftime("%H.%M.%S"))
+    
+def _testpath(subpath):
+    """ Normalised path for test paths. """
+    return os.path.normpath(os.path.join(root_test_dir, subpath))
+    
+def setup_module():
+    """ Setup files test config. 
+    
+    This creates a number of empty files in a temporary directory structure
+    for testing various file selection and archiving operations.
+    """
+    #print 'setup_module()'
+    #print _test_file_content.keys()
+    for child_path in _test_file_paths:
+        path = os.path.join(root_test_dir, child_path)
+        path_dir = path
+        path_dir = os.path.dirname(path)
+        
+        if (not os.path.exists(path_dir)):
+            _logger.debug('Creating dir:  ' + path_dir)
+            os.makedirs(path_dir)
+
+        if(not path.endswith('/') and not path.endswith('\\')):
+            _logger.debug('Creating file: ' + path)
+            handle = open(path, 'w')
+            # Write any file content that is needed
+            if _test_file_content.has_key(child_path):
+                handle.write(_test_file_content[child_path])
+            handle.close()
+
+def teardown_module():
+    """ Teardown test config. """
+    if os.path.exists(root_test_dir):
+        fileutils.rmtree(root_test_dir)
+    
+
+class FileScannerTest(unittest.TestCase):
+    """ Test FileScanner class. """
+    def test_1_scanner_paths(self):
+        """1) String representation of a constructed FileScanner is correct."""
+        scanner = fileutils.FileScanner(_testpath('test'))
+        scanner.add_include('python/')
+        # new implementation of the scanner doesn't convert modify the pattern strings...
+        expected_result = _testpath('test') + ';include:' + os.path.normpath('python/**')
+        assert str(scanner) == expected_result
+
+    def test_2_include_1(self):
+        """Files from root are included, no subdirs."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/*')
+        testpaths = [_testpath('dir1/file1.txt'),
+                     _testpath('dir1/file2.doc'),
+                     _testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir3')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        
+        # sorting the resuts
+        testpaths.sort()
+        result.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_include_single_file(self):
+        """A single file from root is included."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/file1.txt')
+        testpaths = [_testpath('dir1/file1.txt')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_include_single_file_and_glob_path(self):
+        """A single file from root and a glob path are included."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/file1.txt')
+        scanner.add_include('s60/component_public/')
+        testpaths = [_testpath(u'dir1/file1.txt'),
+                     _testpath(u's60/component_public/Distribution.Policy.S60'),
+                     _testpath(u's60/component_public/component_public_file.txt'),]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        
+        if sys.platform == "win32":
+            testpaths = [s.lower() for s in testpaths]
+            result = [s.lower() for s in result]
+        result.sort()
+        testpaths.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_3_include_2(self):
+        """Files and subdirs are included."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/**')
+        testpaths = [_testpath('dir1/file1.txt'),
+                     _testpath('dir1/file2.doc'),
+                     _testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir1/subdir1_file.txt'),
+                     _testpath('dir1/subdir2/subdir2_file_no_extension'),
+                     _testpath('dir1/subdir3')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_4_include_3(self):
+        """Wildcard includes in root."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('wild*')
+        testpaths = [_testpath('wildcard1.txt'),
+                     _testpath('wildcard2.doc'),
+                     _testpath('wildcard3'),
+                     _testpath('wildcard4')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_5_include_4(self):
+        """Include empty dirs."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir2/')
+        scanner.add_include('dir3/**')
+        testpaths = [_testpath('dir2'),
+                     _testpath('dir3/subdir')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_6_include_exclude_1(self):
+        """Wildcard excludes."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('root*')
+        scanner.add_include('wild*')
+        scanner.add_exclude('root_*')
+        testpaths = [_testpath('wildcard1.txt'),
+                     _testpath('wildcard2.doc'),
+                     _testpath('wildcard3'),
+                     _testpath('wildcard4')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_7_include_exclude_2(self):
+        """Directory can be excluded."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/')
+        scanner.add_exclude('dir1/subdir1/')
+        scanner.add_exclude('dir1/subdir2/')
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('dir1/file1.txt'),
+                     _testpath('dir1/file2.doc'),
+                     _testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir3')]                   
+        result.sort()
+        testpaths.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_8_include_exclude_3(self):
+        """Wildcard exclude."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/')
+        scanner.add_exclude('**/*.doc')
+        scanner.add_exclude('**/*.txt')
+        result = []
+        testpaths = [_testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir2/subdir2_file_no_extension'),
+                     _testpath('dir1/subdir3')]                   
+        [result.append(path) for path in scanner.scan()]
+        result.sort()
+        testpaths.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_case_sensitivity(self):
+        """ Test if returned list has correct case. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60/UPPERCASE_MISSING/')
+        result = []
+        testpaths = [_testpath('s60/UPPERCASE_MISSING/to_be_removed_9999.txt'),
+                     _testpath('s60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60'),
+                     _testpath('s60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt'),
+                     _testpath('s60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt')
+                     ]                   
+        [result.append(path) for path in scanner.scan()]
+        
+        testpaths.sort()
+        result.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+
+
+    def test_emptydir(self):
+        """Empty dir."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/emptysubdir1/')
+        result = []
+        testpaths = [_testpath('dir/emptysubdir1')]                   
+        [result.append(path) for path in scanner.scan()]
+        
+        result.sort()
+        testpaths.sort()
+
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_emptydirs(self):
+        """Empty dirs."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/')
+        scanner.add_exclude('dir/emptysubdir3/')
+        result = []
+        testpaths = [_testpath('dir/emptysubdir1'),
+                     _testpath('dir/emptysubdir2')]                   
+        [result.append(path) for path in scanner.scan()]
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_distribution_policy_include(self):
+        """ Distribution policy files can determine file selection - include. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60/component_public/')
+        selector = archive.selectors.DistributionPolicySelector(['Distribution.policy.s60'], '0')
+        scanner.add_selector(selector)
+        
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('s60/component_public/component_public_file.txt'),
+                     _testpath('s60/component_public/distribution.policy.s60')]                   
+        
+        result = [s.lower() for s in result]
+        result.sort()
+        testpaths.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+        
+        
+    def test_distribution_policy_exclude(self):
+        """ Distribution policy files can determine file selection - exclude. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60/component_private/')
+        selector = archive.selectors.DistributionPolicySelector(['Distribution.policy.s60'], '0')
+        scanner.add_selector(selector)
+        
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = []                   
+        
+        assert result == testpaths
+        
+        
+    def test_symbian_distribution_policy_cat_a(self):
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60src/src-a/')
+        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], 'A')
+        scanner.add_selector(selector)
+                
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('s60src/src-a/distribution.policy')] 
+ 
+        assert result == testpaths
+        
+    def test_symbian_distribution_policy_cat_b(self):        
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60src/src-b/')
+        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], 'B')
+        scanner.add_selector(selector)
+                       
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('s60src/src-b/distribution.policy')] 
+              
+        assert result == testpaths     
+        
+    def test_symbian_distribution_policy_cat_not_a_not_b(self):        
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60src/src-c/')
+        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], '!A,!B')
+        scanner.add_selector(selector)
+                       
+        result = []
+        [result.append(path) for path in scanner.scan()]
+                  
+        testpaths = [_testpath('s60src/src-c/distribution.policy')] 
+        
+        assert result == testpaths     
+    
+        
+    def test_find_subroots(self):
+        """ Testing the find_subroots method. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/emptysubdir1')
+        scanner.add_include('dir/**/dir')
+        scanner.add_include('foo/**/dir')
+        scanner.add_include('bar/subdir/dir1/**')
+        scanner.add_include('bar/subdir/dir2/**')
+        scanner.add_include('bar/subdir/dir3/x/**')
+        scanner.add_include('bar/subdir/dir3/**')
+        result = scanner.find_subroots()
+        _logger.debug(result)
+        print result              
+        assert result == [_testpath('dir'), _testpath('foo'), 
+                          _testpath('bar/subdir/dir1'), 
+                          _testpath('bar/subdir/dir2'), 
+                          _testpath('bar/subdir/dir3')]
+
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/emptysubdir1')
+        scanner.add_include('**/dir')
+        scanner.add_include('foo/**/dir')
+        result = scanner.find_subroots()
+        _logger.debug(result)              
+        assert result == [_testpath('')]
+
+
+    def test_load_policy_content(self):
+        try:
+            fileutils.load_policy_content(_testpath('test_policies/1/Distribution.Policy.S60'))
+            assert "Should fail while loading 'test_policies/1/Distribution.Policy.S60'."
+        except:
+            pass
+        
+        try:
+            fileutils.load_policy_content(_testpath('s60/Distribution.Policy.S60'))
+        except:
+            assert "Should not fail while loading 's60/Distribution.Policy.S60'."
+
+
+    def assert_policy_file(self, filename, value=None, exception=False):
+        if exception:
+            try:
+                fileutils.read_policy_content(filename)
+                assert "Should fail while loading '%s'." % filename
+            except:
+                pass
+        else:
+            assert fileutils.read_policy_content(filename) == value
+    def assert_symbian_policy_file(self, filename, value=None, exception=False):
+        if exception:
+            try:
+                fileutils.read_symbian_policy_content(filename)
+                assert "Should fail while loading '%s'." % filename
+            except:
+                pass
+        else:
+            assert fileutils.read_symbian_policy_content(filename) == value
+        
+    def test_read_policy_content_strict(self):
+        """ Test policy content using strict rules. """
+
+        self.assert_policy_file(_testpath('s60/Distribution.Policy.S60'), value='0')
+        self.assert_policy_file(_testpath('s60/component_private/Distribution.Policy.S60'), value='1')
+        self.assert_policy_file(_testpath('test_policies/1/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/2/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/3/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/4/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/5/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/6/Distribution.Policy.S60'), exception=True)
+
+    def test_read_policy_content_strict_focalid(self):
+        """ Testing Focal ID support. """
+        self.assert_policy_file(_testpath('test_policies/7/Distribution.Policy.S60'), value='08421A2')
+        self.assert_policy_file(_testpath('test_policies/8/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/9/Distribution.Policy.S60'), exception=True)
+
+    def test_read_symbian_policy_content_strict(self):
+        """ Test symbian policy content using strict rules. """
+
+        self.assert_symbian_policy_file(_testpath('symbian/distribution.policy'), value='A')
+        self.assert_symbian_policy_file(_testpath('symbian/dir1/distribution.policy'), value='B')
+        self.assert_symbian_policy_file(_testpath('symbian/dir2/distribution.policy'), value='C')
+        self.assert_symbian_policy_file(_testpath('symbian/dir3/distribution.policy'), value='D')
+        self.assert_symbian_policy_file(_testpath('symbian/dir4/distribution.policy'), exception=True)
+        self.assert_symbian_policy_file(_testpath('symbian/dir5/distribution.policy'), exception=True)
+
+class TestLongPath(unittest.TestCase):
+
+    long_path = os.path.join(root_test_dir, '01234567890123456789012345678901234567890123456789', 
+                     '01234567890123456789012345678901234567890123456789', '01234567890123456789012345678901234567890123456789',
+                     '01234567890123456789012345678901234567890123456789', '01234567890123456789012345678901234567890123456789')
+    def setUp(self):
+        self.mkdirs(os.path.join(self.long_path, r'dir1'))
+        self.mkdirs(os.path.join(self.long_path, r'dir2'))
+        if not '\\\\?\\' + os.path.abspath((os.path.join( self.long_path, r'foo.txt'))):
+            import win32file
+            win32file.CreateFileW('\\\\?\\' + os.path.abspath(os.path.join(self.long_path, r'foo.txt')), 0, 0, None, win32file.CREATE_NEW, 0, None)
+
+    def mkdirs(self, path):
+        if not os.path.isabs(path):
+            path = os.path.join(os.path.abspath('.'), os.path.normpath(path))
+        if not os.path.exists(os.path.dirname(path)):
+            self.mkdirs(os.path.dirname(path))
+        self.mkdir(path)
+
+    def mkdir(self, path):
+        if not os.path.exists(path):
+            if sys.platform == "win32":
+                try:
+                    import win32file
+                    win32file.CreateDirectoryW('\\\\?\\' + path, None)
+                except:
+                    pass
+            else:
+                os.mkdir(path)
+
+    def test_rmtree_long_path(self):
+        fileutils.rmtree(root_test_dir)
+        assert not os.path.exists(self.long_path)
+        assert not os.path.exists(root_test_dir)
+
+    def test_rmtree_long_path_unc_format(self):
+        if sys.platform == "win32":
+            fileutils.rmtree(u"\\\\?\\" + os.path.join(os.path.abspath('.'), root_test_dir))
+            assert not os.path.exists(self.long_path)
+            assert not os.path.exists(root_test_dir)
+        
+class DestInSrcTest(unittest.TestCase):
+    
+    def test_destinsrc(self):
+        """ Verify that Z:/a/b/c/d is under Z:/a/b/c """
+        src = r"Z:/a/b/c"
+        dst = r"Z:/a/b/c/d"
+        assert fileutils.destinsrc(src, dst) is True
+    
+    def test_destinsrc2(self):
+        """ Verify that Z:/a/b/c/d is not under Z:/a/b/cc """
+        src = r"Z:/a/b/cc"
+        dst = r"Z:/a/b/c/d"
+        assert fileutils.destinsrc(src, dst) is False
+
+    def test_destinsrc_nt(self):
+        """ Verify that Z:/a/b/c/d is under Z:/a/b/C """
+        src = r"Z:/a/b/C"
+        dst = r"Z:/a/b/c/d"
+        if sys.platform == "win32":
+            assert fileutils.destinsrc(src, dst) is True
+        else:
+            assert fileutils.destinsrc(src, dst) is False
+
+    def test_destinsrc2_nt(self):
+        """ Verify that Z:/a/b/c/d is not under Z:/a/b/CC """
+        if sys.platform == "win32":
+            src = r"Z:/a/b/CC"
+            dst = r"Z:/a/b/c/d"
+            assert fileutils.destinsrc(src, dst) is False
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_flash_config.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+#============================================================================ 
+#Name        : test_flash_config.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test flash_config.py module. """
+
+import unittest
+import configuration
+import flash_config
+import os
+
+class FlashConfigTest(unittest.TestCase):
+    
+    def setUp(self):
+        input_file = os.path.join(os.environ['HELIUM_HOME'], \
+                                  'tests/data/flash_config/rom_image_config_test.xml')
+        configBuilder = configuration.NestedConfigurationBuilder(open(input_file, 'r'))
+        configSet = configBuilder.getConfiguration()
+        self._configs = configSet.getConfigurations('product')
+        self._writer = flash_config.FlashConfigurationWriter(configSet, 'product')
+    
+    def test_language_pack(self):
+        """ Testing languagepack class. """
+        for conf in self._configs:
+            if conf.has_key('languagepack.id') and conf['languagepack.id'] == "01":
+                lp = flash_config.ImagePack(conf, 'languagepack')
+        
+        assert lp != None
+        
+        assert lp._id == "01"
+        assert lp._image_name == "RM-235_0.0728.3.0.1_${image.type.temp}_01"
+        assert lp._image_path == "${image.type.temp}/language/01_variant_EURO1/"
+        
+    def test_get_all_languagepacks(self):
+        """ Testing _get_all_languagepacks method. """
+        self._writer._get_all_languagepacks()
+        assert len(self._writer._all_languagepacks.keys()) == 4
+        
+    def test_get_compatible_languagepacks(self):
+        """ Testing _get_compatible_languagepacks method. """
+        self._writer._get_all_languagepacks()
+        for config in self._configs:
+            if (config.type == "customer"):
+                customer_config = config
+        
+        assert customer_config != None
+        # Only 2 valid compatible LPs. LP 03 is not a valid one b/c it is absent from rom_image_config_test.txt
+        assert len(self._writer._get_compatible_languagepacks(customer_config)) == 2
+        
+    def test_write(self):
+        """ Testing FlashConfigurationWriter method. """
+        #self._writer.write()
+        
+        #Test the numbert of created files
+        
+        
+        #Tes the content of one file
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_freedisk.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,111 @@
+#============================================================================ 
+#Name        : test_freedisk.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Acceptance tests for freedisk.py
+
+"""
+
+import unittest
+import logging
+import os, string
+import sys
+
+if sys.platform == "win32":
+    from win32api import GetLogicalDriveStrings
+    
+    logger = logging.getLogger('test_freedisk')
+    
+    ## MAKE SURE that the drive being tested MUST be there.
+    class ToolTest(unittest.TestCase):
+        """
+        Setup and Tests for the script
+        """
+    
+        def setUp(self):
+            """
+            All the settings related to the tests are defined here
+            """
+            self.drive_letter = next_free_label()
+            self.str_path = "%HELIUM_HOME%\\tools\\preparation\\"
+    
+    
+            
+        def test_when_enough_space(self):
+            """
+            Both drive and space parameters are correct with minimum required space
+            """
+            output = os.system('python ' + self.str_path+"freedisk.py -d c: -s 1")
+            assert(output==0)
+                       
+    
+        def test_when_not_enough_space(self):
+            """
+            Both drive and space parameters are correct with maximum required space
+            """
+            output = os.system('python ' + self.str_path+\
+                               "freedisk.py -d c: -s 10000000000")
+            assert(output==-1)
+    
+        def test_wrong_drive_letter(self):
+            """
+            Tests with drive which does not exist
+            """
+            output = os.system('python ' + self.str_path+\
+                               "freedisk.py -d %s: -s 10 "%self.drive_letter)
+            assert(output==-2)
+            
+        def test_missing_parameters(self):
+            """
+            Several cases to give invalid parameters
+            """
+    
+            ##Required space parameter is missing
+            output = os.system('python ' + self.str_path+"freedisk.py -d c:")
+            assert(output==-3)
+            ##Drive parameter is missing
+            output = os.system('python ' + self.str_path+"freedisk.py -s 1")
+            assert(output==-3)
+            ##Both parameters are missing
+            output = os.system('python ' + self.str_path+"freedisk.py")
+            assert(output==-3)
+    
+        def test_wrong_drive_parameters(self):
+            """
+            Drive parameter is incorrect
+            """
+            output = os.system('python ' + self.str_path+"freedisk.py -d c -s 10")
+            assert(output==0)
+    
+    
+    def next_free_label():
+        """
+        Detects the next free drive letter for test_wrong_drive_letter
+        """
+        for letter in set(string.ascii_uppercase)-set(GetLogicalDriveStrings()):
+            try:
+                drv_letter = letter
+                os.chdir(drv_letter+":\\")
+            except OSError:
+                break
+        else:
+            raise ValueError("Out of drives")
+        return drv_letter
+    
+    if __name__ == '__main__':
+        unittest.main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_gscm.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+#============================================================================ 
+#Name        : test_gscm.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for gscm python wrapper.
+
+"""
+
+import logging
+import sys
+import unittest
+
+import nokia.gscm
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger('test.gscm')
+
+
+class TestGSCM(unittest.TestCase):
+
+    def test_get_db_path(self):
+        """ Test the get_db_path function. """
+        dbpath = nokia.gscm.get_db_path('fa1f5132')
+        _logger.info("get_db_path('fa1f5132'): %s" % dbpath)
+        assert dbpath == "/nokia/fa_nmp/groups/gscm/dbs/fa1f5132", "Wrong value returned!"
+        
+    def test_get_db_path2(self):
+        """ Test the get_db_path function with unexistant database. """
+        try:        
+            _logger.info("get_db_path('not_valid_db'): %s" % nokia.gscm.get_db_path('not_valid_db'))
+            assert False, "Should raise Exception when giving unexisting db.'"
+        except Exception, exc:
+            _logger.info(exc)
+
+    def test_get_engine_host(self):
+        """ Test the get_engine_host function. """
+        engine = nokia.gscm.get_engine_host('fa1f5132')
+        _logger.info("get_engine_host('fa1f5132'): %s" % engine)
+        print engine
+        assert engine == "facmsweh.europe.nokia.com" or "faccm" in engine, "Wrong value returned!"
+        
+    def test_get_engine_host2(self):
+        """ Test the get_engine_host function with unexistant database. """
+        try:        
+            _logger.info("get_engine_host('not_valid_db'): %s" % nokia.gscm.get_engine_host('not_valid_db'))
+            assert False, "Should raise Exception when giving unexisting db.'"
+        except Exception, exc:
+            _logger.info(exc)
+
+    def test_get_router_address(self):
+        """ Test the get_router_address function. """
+        _logger.info("get_router_address('fa1f5132'): %s" % nokia.gscm.get_router_address('fa1f5132'))
+        
+    def test_get_router_address2(self):
+        """ Test the get_router_address function with unexistant database. """
+        try:        
+            _logger.info("get_router_address('not_valid_db'): %s" % nokia.gscm.get_router_address('not_valid_db'))
+            assert False, "Should raise Exception when giving unexisting db.'"
+        except Exception, exc:
+            _logger.info(exc)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_help32.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,80 @@
+#============================================================================ 
+#Name        : test_help32.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for the generation of help delivery IBY include file.
+
+"""
+import unittest
+import sys
+import imp
+import os
+import logging
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.help32')
+
+
+class TestHelp32(unittest.TestCase):
+    """ Test cases for S60 3.2 help deliveries handling. """
+    
+    def test_basket(self):
+        """ Test the basket class. Basket class is a container that sort
+            content for a root directory into common and language specific content.
+        """
+        sys.path.append(os.path.join(os.environ['HELIUM_HOME'],'tools/localisation/helps'))
+        generate_iby = __import__('generate_iby_32')
+        basket = generate_iby.Basket(os.path.join(os.environ['HELIUM_HOME'],'tests/data/help_delivery/Data'), excludes=['**/distribution.policy.S60'])
+        print basket.common
+        print basket.language
+        assert len(basket.common) == 1
+        assert len(basket.language['01']) == 2
+        assert len(basket.language['02']) == 1
+        assert not basket.language.has_key('03')
+        
+        
+    def test_basket_with_tag(self):
+        """ Test the basket class. Basket class is a container that sort
+            content for a root directory into common and language specific content.
+        """
+        sys.path.append(os.path.join(os.environ['HELIUM_HOME'],'tools/localisation/helps'))
+        generate_iby = __import__('generate_iby_32')
+        basket = generate_iby.Basket(os.path.join(os.environ['HELIUM_HOME'],'tests/data/help_delivery/Data'), '_3g', excludes=['**/distribution.policy.S60'])
+        print basket.common
+        print basket.language
+        assert len(basket.common) == 1
+        assert len(basket.language['01']) == 2
+        assert len(basket.language['02']) == 1
+        assert basket.language.has_key('03')
+
+        
+    def test_basket_exclude(self):
+        """ Testing the basket exclude list.
+        """
+        sys.path.append(os.path.join(os.environ['HELIUM_HOME'],'tools/localisation/helps'))
+        generate_iby = __import__('generate_iby_32')
+        basket = generate_iby.Basket(os.path.join(os.environ['HELIUM_HOME'],'tests/data/help_delivery/Data'), excludes=['**/subdir/**', '**/distribution.policy.S60'])
+        print basket.common
+        print basket.language
+        assert len(basket.common) == 0
+        assert not basket.language.has_key('01')
+        assert not basket.language.has_key('02')
+        assert not basket.language.has_key('03')
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_iqrf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+#============================================================================ 
+#Name        : test_iqrf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for iqrf module. """
+import unittest
+import os
+import imaker.iqrf
+
+
+class Test_iQRF(unittest.TestCase):
+    """ Test for iQRF data access. """
+    
+    def test_file_parsing_5250(self):
+        """ Testing if the iqrf module is able to load the 5250 configuration. """
+        root = imaker.iqrf.load(os.path.join(os.environ['HELIUM_HOME'], "tests/data/iqrf/imaker_5250.xml"))        
+        assert root.result != None
+        assert len(root.result.targets) == 228
+        assert len(root.result.interfaces) == 1
+        assert len(root.result.configurations) == 6
+        
+        # testing a configurations
+        assert root.result.configurations[0].name == "image_conf_product52.mk"
+        assert root.result.configurations[0].filePath == r"\epoc32\rom\config\platform\product52\image_conf_product52.mk"
+        assert len(root.result.configurations[0].targetrefs) == 38
+        assert root.result.configurations[0].targetrefs[0].name == "all"
+        
+        # testing interfaces
+        print "root.result.configurations[0].filePath: %s" % root.result.configurations[0].filePath
+        assert len(root.result.interfaces[0].configurationElements) == 516
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_log2xml.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+#============================================================================ 
+#Name        : test_log2xml.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Acceptance tests for freedisk.py
+
+"""
+
+import unittest
+import logging
+import os
+import log2xml
+from xml.dom import minidom
+
+logger = logging.getLogger('test.log2xml')
+
+
+class Log2XMLTest(unittest.TestCase):
+
+    def test_log_conversion(self):
+        """
+        Convert a log into xml.
+        """
+        logfile = os.path.join(os.environ["HELIUM_HOME"], 'tests', 'data', 'log2xml_test.log')
+        testfile = os.path.join(os.environ["TEMP"], "log2xml_test.xml")
+        log2xml.convert(logfile, testfile)        
+        minidom.parse(testfile)        
+
+    def test_log_utf16_conversion(self):
+        """
+        Convert a log into xml.
+        """
+        logfile = os.path.join(os.environ["HELIUM_HOME"], 'tests', 'data', 'log2xml_failure.log')
+        testfile = os.path.join(os.environ["TEMP"], "log2xml_test2.xml")
+        log2xml.convert(logfile, testfile)        
+        minidom.parse(testfile)        
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_logger.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,100 @@
+#============================================================================ 
+#Name        : test_logger.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+import os
+import unittest
+
+import helium.logger
+import helium.outputer
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.helium.logger')
+
+
+class TestHeliumLogger(unittest.TestCase):
+            
+    def test_mc_logger_xml_generation(self):
+        """ Test simple XML logging generation. """
+        mclogger = helium.logger.Logger()
+        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
+        mclogger.SetTitle("Validate Overlay")
+        mclogger.SetSubTitle("Validating: ")
+        mclogger.OpenMainContent("test")
+        mclogger.PrintRaw("<a href=\"google.com\">test</a>")
+        mclogger.Print("test")
+        mclogger.Print(u"\u00A9")
+        mclogger.error("test")
+        mclogger.CloseMainContent()
+        mclogger.OpenMainContent("test2")
+        mclogger.OpenEvent("test2")
+        mclogger.Print("test2")
+        mclogger.error("test2")
+        mclogger.CloseEvent()
+        mclogger.CloseMainContent()
+        mclogger.WriteToFile('log.xml')
+        
+        logger.info(mclogger)
+        
+        os.unlink('log.xml')
+        
+        #out = helium.outputer.XML2XHTML("log.xml")
+        #out.generate()
+        #out.WriteToFile("log.html")
+
+    def test_helium_logger_unicode_handling(self):
+        """ Test simple XML logging generation with unicode handling. """
+        mclogger = helium.logger.Logger()
+        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
+        mclogger.SetTitle("Validate Overlay")
+        mclogger.SetSubTitle("Validating: ")
+        mclogger.OpenMainContent("test")
+        mclogger.Print(u"Test unicode handling: \u00A9")
+        mclogger.CloseMainContent()
+        mclogger.WriteToFile('log.xml')
+        
+        logger.info(mclogger)
+        
+        os.unlink('log.xml')
+
+    def test_helium_logger_outputer(self):
+        """ Test simple XML logging generation with unicode handling and XHTML generation. """
+        mclogger = helium.logger.Logger()
+        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
+        mclogger.SetTitle("Validate Overlay")
+        mclogger.SetSubTitle("Validating: ")
+        mclogger.OpenMainContent("test")
+        mclogger.Print(u"Test unicode handling: \u00A9")
+        mclogger.CloseMainContent()
+        mclogger.WriteToFile('log.xml')
+        
+        logger.info(mclogger)
+        
+        out = helium.outputer.XML2XHTML('log.xml')
+        out.generate()
+        out.WriteToFile('log.html')
+        
+        os.unlink('log.xml')
+        os.unlink('log.html')
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_misc.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,55 @@
+#============================================================================ 
+#Name        : test_misc.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Miscellaneous tests.
+
+"""
+
+
+def test_optparse_import():
+    """Ensure 'optparse' module is not imported from within docutils.
+    
+    Docutils, as of docutils-0.5 at least, comes bundled with a version of the
+    `optparse` module that is older than what comes with Python 2.4 standard
+    library.
+    
+    This test, although implemented in a slightly unpythonic manner (thinking
+    pythonically, we should only care about a module's behaviour, not its
+    version), checks that the `optparse` module acquired without any import
+    magic is not the old buggy one from within docutils.
+    
+    """
+    import optparse
+    assert "docutils" not in optparse.__file__
+    
+def test_optparse_help():
+    """Test for this issue:
+    SF #960515: don't crash when generating help for callback
+    options that specify 'type', but not 'dest' or 'metavar'.from 
+    http://sourceforge.net/project/shownotes.php?release_id=278548&group_id=38019
+    """
+    
+    import optparse
+    
+    def testCallback(option, opt, value, parser):
+        pass
+    
+    parser = optparse.OptionParser()
+    parser.add_option("--x", help="x", callback=testCallback, action="callback", type="string", default=True)
+    parser.print_help()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_parsers.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,689 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_parsers.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import sys
+import tempfile
+import mocker
+from path import path
+import StringIO
+
+import ats3.parsers
+import ats3.testconfigurator
+
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+
+TSRC_DIR = None
+
+def setup_module():
+    """Setup the test environment. The testing of the test parser script requires spesific
+    structure to be available with bld.inf files (with the content written into those)."""
+    global TSRC_DIR
+    TSRC_DIR = path(tempfile.mkdtemp()).normpath()
+    test_component = TSRC_DIR
+    for path_parts in (("tsrc", "group"),
+                       ("tsrc", "tc1", "group"),
+                       ("tsrc", "tc1", "data"),
+                       ("tsrc", "tc1", "dependent_1", "group"),
+                       ("tsrc", "tc1", "dependent_2", "group"),
+                       ("tsrc", "tc1", "subtest", "group"),
+                       ("tsrc", "tc1", "subtest", "data"),
+                       ("tsrc", "tc1", "subtest", "if_test", "group"),
+                       ("tsrc", "tc2", "group"),
+                       ("tsrc", "tc2", "data"),
+                       ("tsrc", "tc3", "group"),
+                       ("tsrc", "tc3", "data"),
+                       ("tmp", "macros"),
+                       ):
+        filepath = path.joinpath(test_component, *path_parts).normpath()
+        if not filepath.exists():
+            os.makedirs(filepath)
+    
+        
+    tsrc = open(path.joinpath(TSRC_DIR, "tsrc", "group", "bld.inf"), 'w')
+    tsrc.write(
+            r"""
+#include "../tc1/group/bld.inf"
+#include "../tc2/group/bld.inf"
+#include "../tc3/group/bld.inf" 
+
+PRJ_TESTMMPFILES
+
+            """)
+    tsrc.close()
+    
+    tc1 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "bld.inf"), 'w')
+    tc1.write(
+            r"""
+#include "../dependent_1/group/bld.inf"
+#include "../dependent_2/group/bld.inf"
+#include "../subtest/group/bld.inf"
+
+PRJ_TESTMMPFILES
+tc1.mmp
+
+PRJ_MMPFILES
+not_included.mmp
+            """)
+    tc1.close()
+    
+    tc1_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.mmp"), 'w')
+    tc1_mmp.write(
+            r"""
+TARGET          tc1.dll
+TARGETTYPE      dll
+LIBRARY         stiftestinterface.lib
+LIBRARY         user.lib
+            """)
+    tc1_mmp.close()
+    
+    tc1_sub = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "group", "bld.inf"), "w")
+    tc1_sub.write(
+            r"""
+PRJ_TESTMMPFILES
+sub_test.mmp    
+#ifndef RD_TEST1
+#include "../if_test/group/bld.inf"
+#endif
+            """)
+    tc1_sub.close()
+    tc1_sub_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "group", "sub_test.mmp"), 'w')
+    tc1_sub_mmp.write(
+            r"""
+TARGET          sub_test.dll
+TARGETTYPE      dll
+LIBRARY         stiftestinterface.lib
+            """)
+    tc1_sub_mmp.close()
+
+    
+    tc1_if = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "if_test", "group", "bld.inf"), "w")
+    tc1_if.write(
+            r"""
+PRJ_TESTMMPFILES
+if_test.mmp
+            """)
+    tc1_if.close()
+    tc1_if_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "if_test", "group", "if_test.mmp"), 'w')
+    tc1_if_mmp.write(
+            r"""
+TARGET          tc1_if.dll
+TARGETTYPE      dll
+LIBRARY         stifunit.lib
+            """)
+    tc1_if_mmp.close()
+
+    tc1_dep1 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_1", "group", "bld.inf"), "w")
+    tc1_dep1.write(
+            r"""
+PRJ_TESTMMPFILES
+dependent_1.mmp
+onemore.mmp
+            """)
+    tc1_dep1.close()
+
+    tc1_dep1_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_1", "group", "dependent_1.mmp"), 'w')
+    tc1_dep1_mmp.write(
+            r"""
+TARGET          dependent_1.dll
+TARGETTYPE      PLUGIN
+            """)
+    tc1_dep1_mmp.close()
+        
+    tc1_dep2 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_2", "group", "bld.inf"), "w")
+    tc1_dep2.write(
+            r"""
+PRJ_TESTMMPFILES
+dependent_2.mmp
+            """)
+    tc1_dep2.close()
+    
+    tc1_dep2_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_2", "group", "dependent_2.mmp"), 'w')
+    tc1_dep2_mmp.write(
+            r"""
+TARGET          dependent_2.dll
+TARGETTYPE      PLUGIN
+            """)
+    tc1_dep2_mmp.close()
+    
+    tc1_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.pkg"), 'w')
+    tc1_pkg.write(
+                  r"""
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+;Supports Series 60 v 3.0
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localized Vendor Name
+%{"BTEngTestApp"}
+
+;Unique Vendor name
+:"Nokia"
+
+; Files to copy
+"..\data\file1.dll"-"c:\sys\bin\file1.dll"
+"..\data\file1.txt"-"e:\sys\bin\file1.txt" , FF   ; FF stands for Normal file
+"..\data\file2.mp3"-"e:\sys\bin\file2.mp3"
+"..\data\TestFramework.ini"-"c:\sys\bin\TestFramework.ini"
+;"..\xyz\TestFramework.ini"-"!:\sys\bin\TestFramework.ini" (commented line)
+"../data/temp.ini"-"!:/sys/bin/temp.ini" , FF ; "something here"
+"..\data\tc1.cfg"-"e:\sys\bin\tc1.cfg"
+"..\data\tc1.sisx"-"e:\sys\bin\tc1.sisx"
+"..\data\DUMP.xyz"-"e:\sys\bin\DUMP.xyz"
+
+            
+        """.replace('\\', os.sep))
+    tc1_pkg.close()
+    
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file1.dll"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file1.txt"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file2.mp3"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "TestFramework.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "temp.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "DUMP.xyz"), 'w').close()
+    
+    tc2 = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "bld.inf"), "w")
+    tc2.write(
+            r"""
+PRJ_TESTMMPFILES
+tc2.mmp
+            """)
+    tc2.close()
+    tc2_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.mmp"), 'w')
+    tc2_mmp.write(
+            r"""
+TARGET          tc2.dll
+TARGETTYPE      dll
+LIBRARY         EUnit.lib
+            """)
+    tc2_mmp.close()
+    
+    tc2_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.pkg"), 'w')
+    tc2_pkg.write(
+                  r"""
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+;Supports Series 60 v 3.0
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localized Vendor Name
+%{"BTEngTestApp"}
+
+;Unique Vendor name
+:"Nokia"
+
+; Files to copy
+"..\data\file1.dll"-"c:\sys\bin\file1.dll"
+"..\data\file1.txt"-"e:\sys\bin\file1.txt"
+"..\data\file2.mp3"-"e:\sys\bin\file2.mp3"
+"..\data\TestFramework.ini"-"!:\sys\bin\TestFramework.ini" , FF   ; FF stands for Normal file
+"..\data\tc2.cfg"-"!:\sys\bin\tc2.cfg"
+        """.replace('\\', os.sep))
+    tc2_pkg.close()
+    
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file1.dll"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file1.txt"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file2.mp3"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "TestFramework.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "tc2.cfg"), 'w').close()
+
+    
+    tc3 = open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "group", "bld.inf"), "w")
+    tc3.write(
+            r"""
+PRJ_TESTMMPFILES
+tc3.mmp
+            """)
+    tc3.close()
+    tc3_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "group", "tc3.mmp"), 'w')
+    tc3_mmp.write(
+            r"""
+TARGET          tc3.dll
+TARGETTYPE      dll
+LIBRARY         EUnit.lib
+            """)
+    tc3_mmp.close()
+    
+    tc3_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.pkg"), 'w')
+    tc3_pkg.write(
+                  r"""
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+;Supports Series 60 v 3.0
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localized Vendor Name
+%{"BTEngTestApp"}
+
+;Unique Vendor name
+:"Nokia"
+
+; Files to copy
+"..\data\file1.dll"-"c:\sys\bin\file1.dll"
+"..\data\file1.txt"-"e:\sys\bin\file1.txt"
+"..\data\file2.mp3"-"e:\sys\bin\file2.mp3" , FF   ; FF stands for Normal file
+"..\data\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
+"..\data\temp.ini"-"!:\sys\bin\temp.ini"
+"..\data\tc2.cfg"-"!:\sys\bin\tc2.cfg"
+        """.replace('\\', os.sep))
+    tc3_pkg.close()
+    
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file1.dll"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file1.txt"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file2.mp3"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "TestFramework.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "temp.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "tc2.cfg"), 'w').close()
+    
+    macros = open(path.joinpath(TSRC_DIR, "tmp", "macros", "bldcodeline.hrh"), 'w')
+    macros.write(
+              r"""
+#ifndef __BLDCODELINE_HRH
+#define __BLDCODELINE_HRH
+
+/** #RD_TEST */
+#define RD_TEST1
+
+/** #RD_TEST2 */
+#define RD_TEST2
+
+/** #RD_TEST3 */
+#define RD_TEST3
+
+#endif  // __BLDCODELINE_HRH
+
+    """)
+    macros.close()
+
+    
+def teardown_module():
+    """ Cleanup environment after testing. """    
+    def __init__():
+        TSRC_DIR.rmtree()
+        
+        
+#        list_of_paths = []
+#        list_of_paths = path.walk(TSRC_DIR)
+#        for file in list_of_paths[2]:
+#            continue
+#        for dir in list_of_paths[1]:
+#            continue
+        
+
+class TestPkgFileParser(mocker.MockerTestCase):
+    """Testing Package file parser"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+
+    def setUp(self):
+        """Setup for PkgFile parser"""
+        self.pkg_file_path1 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc1", "group"))
+        self.pkg_file_path2 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc2", "group"))
+        self.pkg_file_path3 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc3", "group"))
+        self.tcp = ats3.parsers.PkgFileParser("tc1.pkg")        
+        
+        self.data_files = [
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file1.dll").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll").normpath(), "testmodule", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file1.txt").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.txt").normpath(), "data", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file2.mp3").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.mp3").normpath(), "data", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "TestFramework.ini").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini").normpath(), "engine_ini", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "temp.ini").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "temp.ini").normpath(), "engine_ini", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "tc1.cfg").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "tc1.cfg").normpath(), "conf", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "tc1.sisx").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "tc1.sisx").normpath(), "", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "DUMP.xyz").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "DUMP.xyz").normpath(), "data", 'tc1.pkg'),
+            ]
+
+    def test_get_pkg_files(self):
+        """Test if pkg files are returned from a specified location"""
+        assert self.tcp.get_pkg_files(self.pkg_file_path1, False) == ["tc1.pkg"]
+
+
+
+    def test_parser_receives_path(self):      
+        """Test if None is returned when a path to PKG file is incorrect"""
+        assert self.tcp.get_data_files("string") == []
+            
+    def test_data_files_creation_without_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected without exclude"""
+        assert self.tcp.get_data_files(self.pkg_file_path1, "d:") == self.data_files
+        
+    def test_data_files_creation_with_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected with exclude"""
+        self.data_files.pop()
+        assert self.tcp.get_data_files(self.pkg_file_path1, "d:", "\.xyz") == self.data_files
+
+    def test_data_files_creation_without_drive_with_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected without drive with exclude"""
+        
+        self.data_files.pop()
+        assert self.tcp.get_data_files(self.pkg_file_path1, "", "\.xyz") == self.data_files
+
+    def test_data_files_creation_without_drive_without_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected without drive without exclude"""
+        
+        assert self.tcp.get_data_files(self.pkg_file_path1, "") == self.data_files
+            
+
+class TestCppParser(mocker.MockerTestCase):
+    """Testing CPP parser"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+
+    def setUp(self):
+        self.bld_path = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "group"))
+        self.bld_path_comp1 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc1", "group"))
+        self.tcp = ats3.parsers.CppParser()
+        upper_bld_path = os.path.dirname(self.bld_path)
+        self.bldDir = r'C:\DOCUME~1\wbernard\LOCALS~1\Temp\tmpbrgo0s\tsrc'
+
+        
+        self.dependent_paths_dictionary = {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/if_test/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/if_test/group"))): {'pkg_files': [], 'mmp_files': ['if_test.mmp'], 'harness': 'STIFUNIT', 'type': ''}}},
+                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2//group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group"))): {'pkg_files': ['tc2.pkg'], 'mmp_files': ['tc2.mmp'], 'harness': 'EUNIT', 'type': 'executable'}}}, 
+                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group"))): {'pkg_files':[], 'mmp_files': ['tc3.mmp'], 'harness': 'EUNIT', 'type': 'executable'}}},
+                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/group"))): {'pkg_files': [], 'mmp_files': ['sub_test.mmp'], 'harness': 'STIF', 'type': 'executable'}, 
+                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/dependent_1/group"))): {'pkg_files': [], 'mmp_files': ['dependent_1.mmp', 'onemore.mmp'], 'harness': "", 'type':''}, 
+                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/dependent_2/group"))): {'pkg_files': [], 'mmp_files': ['dependent_2.mmp'], 'harness': "", 'type': 'dependent'}, 
+                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group"))): {'pkg_files': ['tc1.pkg'], 'mmp_files': ['tc1.mmp'],'harness': 'STIF', 'type': 'executable'}}}} 
+        
+        self.extended_path_list = [(os.path.normpath(upper_bld_path), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group")), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_1/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_2/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group/../if_test/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group")), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group")), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/group/group")), upper_bld_path),
+                           ]
+        self.path_list = [os.path.normpath(os.path.join(upper_bld_path, "group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group/../if_test/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group")),
+                           ]
+        self.path_list_without_undefined = [os.path.normpath(upper_bld_path),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc3/group")),
+                           ]
+        self.cpp_output = ['# 1 "bld.inf"', 
+                           '# 1 "../tc1/group/bld.inf" 1', 
+                           '# 1 "../tc1/group/../dependent_1/group/bld.inf" 1', 
+                           '# 4 "../tc1/group/bld.inf" 2', 
+                           '# 1 "../tc1/group/../dependent_2/group/bld.inf" 1', 
+                           '# 5 "../tc1/group/bld.inf" 2', 
+                           '# 1 "../tc1/group/../subtest/group/bld.inf" 1', 
+                           '# 1 "../tc1/group/../subtest/group/../if_test/group/bld.inf" 1', 
+                           '# 4 "../tc1/group/../subtest/group/bld.inf" 2', 
+                           '# 6 "../tc1/group/bld.inf" 2', 
+                           '# 3 "bld.inf" 2', 
+                           '# 1 "../tc2/group/bld.inf" 1', 
+                           '# 4 "bld.inf" 2', 
+                           '# 1 "../tc3/group/bld.inf" 1', 
+                           '# 5 "bld.inf" 2']
+        
+        
+         
+    def test_pathlist_output(self):
+        """Test get_cpp_output-method using "n" -parameter"""
+        assert self.path_list.sort() == self.tcp.get_cpp_output(self.bld_path, "n").sort()
+        
+    def test_extended_pathlist_output(self):
+        """Test get_cpp_output-method using "e" -parameter"""
+        assert self.extended_path_list.sort() == self.tcp.get_cpp_output(self.bld_path, "e").sort()
+
+    def test_dictionary_pathlist_output(self):
+        """Test get_cpp_output-method using "d" -parameter (dependent paths)"""
+        output = """# 1 "bld.inf"
+
+# 1 "../tc1/group/bld.inf" 1
+
+# 1 "../tc1/group/../dependent_1/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+dependent_1.mmp
+onemore.mmp
+            
+# 2 "../tc1/group/bld.inf" 2
+
+# 1 "../tc1/group/../dependent_2/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+dependent_2.mmp
+            
+# 3 "../tc1/group/bld.inf" 2
+
+# 1 "../tc1/group/../subtest/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+sub_test.mmp    
+
+# 1 "../tc1/group/../subtest/group/../if_test/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+if_test.mmp
+            
+# 5 "../tc1/group/../subtest/group/bld.inf" 2
+
+
+            
+# 4 "../tc1/group/bld.inf" 2
+
+
+PRJ_TESTMMPFILES
+tc1.mmp
+
+PRJ_MMPFILES
+not_included.mmp
+            
+# 2 "bld.inf" 2
+
+# 1 "../tc2/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+tc2.mmp
+            
+# 3 "bld.inf" 2
+
+# 1 "../tc3/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+tc3.mmp
+            
+# 4 "bld.inf" 2
+
+
+PRJ_TESTMMPFILES
+
+            
+"""
+        
+        result = self.tcp.create_dependency_dictionary(StringIO.StringIO(output), self.bld_path)
+        print "INPUT :", self.dependent_paths_dictionary
+        print "OUTPUT:", result 
+
+        assert self.dependent_paths_dictionary == result
+        
+    def test_conditional_cpp_parsing(self):
+        """Test functionality of cpp parser when removing conditionals"""
+        assert self.path_list_without_undefined.sort() == self.tcp.get_cpp_output(bld_path=self.bld_path, output_parameter="n", imacros=os.path.normpath(os.path.join(TSRC_DIR, "tmp", "macros", "bldcodeline.hrh"))).sort()
+
+class TestBldFileParser(mocker.MockerTestCase):
+    """Testing BldFileParser Class"""
+    
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+    
+    def setUp(self):
+        """Setup for BldFile parser"""
+
+        self.bld_path = path.joinpath(TSRC_DIR, "tsrc", "group", "bld.inf").normpath()
+        upper_bld_path = self.bld_path.dirname()
+        self.tcp = ats3.parsers.BldFileParser()
+        
+        self.test_mmp_files = [
+                               ['tc1.mmp'], 
+                               ['dependent_1.mmp', 'onemore.mmp'], 
+                               ['dependent_2.mmp'], 
+                               ['sub_test.mmp'], 
+                               ['if_test.mmp'], 
+                               ['tc2.mmp'], 
+                               ["tc3.mmp"],
+                               ]
+
+        self.path_list = [path.joinpath(upper_bld_path, "../tc1/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../dependent_1/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../dependent_2/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../subtest/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../subtest/group/../if_test/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc2/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc3/group").normpath(),
+                           ]
+
+
+    def test_testmmp_files_with_full_path(self):
+        """Test if mmp file is returned with its full path"""
+        self.mmp_file_path = [path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.mmp").normpath()]
+        assert self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(self.path_list[0], "bld.inf"))) == self.mmp_file_path
+        
+        
+
+    def test_testmmp_files(self):
+        """Tests if test mmp files are included"""
+        self.lst_test_mmp = []
+        
+        for p in self.path_list:
+            self.lst_test_mmp.append(self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(p, "bld.inf")), False))
+
+        assert self.lst_test_mmp == self.test_mmp_files
+        
+    def test_ignore_comments(self):
+        """ Test if comments are ignored correctly. """
+        for input_, output in [
+            ("abc.mmp /* apuva.mmp */ xyz.mmp", ("abc.mmp xyz.mmp")),
+            ("abc.mmp /* apuva.mmp */", ("abc.mmp")),
+            ("/* apuva.mmp */", ""),
+            ("  // apuva.mmp", ""),
+            ("   apuva.mmp", "apuva.mmp"),
+            ("xyz.mmp // apuva.mmp", "xyz.mmp"),
+            ("abc.mmp /* apuva.mmp */ xyz.mmp //rst.mmp", ("abc.mmp xyz.mmp")),
+            ]:
+            assert self.tcp.ignore_comments_from_input(input_) == output
+        
+    def test_broken_path(self):
+        """Tests if 'None' is returned when path is broken"""
+        upper_bld_path = os.path.dirname(self.bld_path)
+        assert self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(upper_bld_path, "../tc99/group"))) == None
+    
+    def test_empty_parameter(self):
+        """Tests if 'None' is returned when bld file path is empty"""
+        upper_bld_path = os.path.dirname(self.bld_path)
+        assert self.tcp.get_test_mmp_files("") == None
+
+    
+class TestMmpFileParser(mocker.MockerTestCase):
+    """Testing MmpFileParser Class"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+    def setUp(self):
+        self.bld_path = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "group", "bld.inf"))
+        upper_bld_path = os.path.dirname(self.bld_path)
+        self.tcp = ats3.parsers.MmpFileParser()
+        self.tc1_type = "dll"
+        self.tc1_name = "tc1.dll"
+        self.tc1_dll_type = "executable"
+        self.tc1_harness = "STIF"
+        self.tc1_libraries = ['stiftestinterface.lib', 'user.lib']
+        self.tc1_all = (self.tc1_name, self.tc1_type, self.tc1_libraries, self.tc1_harness)
+        self.tc1_no_harness = (self.tc1_name, self.tc1_type, self.tc1_libraries)
+        self.tc1_name_type = (self.tc1_name, self.tc1_type) 
+        self.tc1_iftest_harness = "STIFUNIT"
+        self.tc1_iftest_name = "tc1_if.dll"
+        self.tc1_iftest_type = "dll"
+        
+        self.test_mmp_files = [['tc1.mmp'], ['dependent_1.mmp', 'onemore.mmp'], ['dependent_2.mmp'], ['sub_test.mmp'], ['if_test.mmp'], 
+                               ['tc2.mmp'], ["tc3.mmp"]]
+
+        self.path_list = [os.path.normpath(os.path.join(upper_bld_path, "../tc1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group/../if_test/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc3/group")),
+                           ]
+    
+    def test_get_dlltype(self):
+        """Test if get_filetype returns right type for given mmp"""
+        assert self.tc1_dll_type == self.tcp.get_dll_type(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp'))) 
+    
+    def test_get_target_filename(self):
+        """Test if get_filename returns right name for dll for given mmp"""
+        assert self.tc1_name == self.tcp.get_target_filename(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
+    
+    def test_get_libraries(self):
+        """Test if get_harness returns right harness for given mmp"""
+        assert self.tc1_libraries == self.tcp.get_libraries(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
+    
+    def test_get_harness(self):
+        """Test if get_harness returns right harness for given mmp"""
+        assert self.tc1_harness == self.tcp.get_harness(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
+    
+    def test_read_information_method(self):
+        """Test if read_information_from_mmp returns wanted output for given parameter and mmp-file"""
+        assert self.tc1_all == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 0)
+        assert self.tc1_no_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 1)
+        assert self.tc1_name_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 2)
+        assert self.tc1_name == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 3)
+        assert self.tc1_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 4) 
+        assert self.tc1_libraries == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 5)
+        assert self.tc1_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 6)
+        assert self.tc1_iftest_name == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 3)
+        assert self.tc1_iftest_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 4) 
+        assert self.tc1_iftest_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 6)
+
+class TestParsers(mocker.MockerTestCase):
+    """Testing Parsers functionality"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+    def setUp(self):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_path_match.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+#============================================================================ 
+#Name        : test_path_match.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" path/match.py module tests. """
+
+import pathaddition.match
+
+
+def test_path_match_ant_match():
+    # Matching stuff
+    assert pathaddition.match.ant_match(r"CVS/Repository", r"**/CVS/*") == True
+    assert pathaddition.match.ant_match(r"org/apache/CVS/Entries", r"**/CVS/*") == True
+    assert pathaddition.match.ant_match(r"org/apache/jakarta/tools/ant/CVS/Entries", r"**/CVS/*") == True
+
+    assert pathaddition.match.ant_match(r"org/apache/jakarta/tools/ant/docs/index.html", r"org/apache/jakarta/**") == True
+    assert pathaddition.match.ant_match(r"org/apache/jakarta/test.xml", r"org/apache/jakarta/**") == True
+
+    assert pathaddition.match.ant_match(r"org/apache/CVS/Entries", r"org/apache/**/CVS/*") == True
+    assert pathaddition.match.ant_match(r"org/apache/jakarta/tools/ant/CVS/Entries", r"org/apache/**/CVS/*") == True
+
+    assert pathaddition.match.ant_match(r"/test/foo", r"**/test/**") == True
+    assert pathaddition.match.ant_match(r"/test", r"**/test/**") == True
+    
+    assert pathaddition.match.ant_match(r"C:\development\test\7zip.exe", r"**\*.exe") == True
+    assert pathaddition.match.ant_match(r"C:\development\test\7zip.exe", r"**\?zip.exe") == True
+    assert pathaddition.match.ant_match(r"C:\development\test\7zip.exe", r"**\?zip.*?") == True
+    assert pathaddition.match.ant_match(r"C:\development\test\7zip.exe", r"**/development/*/7zip.exe") == True
+    assert pathaddition.match.ant_match(r"C:\development\test\7zip.exe", r"C:\development\**") == True
+    assert pathaddition.match.ant_match(r"C:\deve.lopment\te.st\7zip.exe", r"**\*.exe") == True
+
+    # Not matching stuff
+    assert pathaddition.match.ant_match(r"org/apache/CVS/foo/bar/Entries", r"**/CVS/*") == False
+    assert pathaddition.match.ant_match(r"org/apache/xyz.java", r"org/apache/jakarta/**") == False
+    assert pathaddition.match.ant_match(r"org/apache/CVS/foo/bar/Entries", r"org/apache/**/CVS/*") == False
+
+    assert pathaddition.match.ant_match(r"C:\development\test\7zip.exe", r"**/foo/**\?zip.*?") == False
+    
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_pathaddition_relative.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+#============================================================================ 
+#Name        : test_pathaddition_relative.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" path/match.py module tests. """
+
+import pathaddition.relative
+import os
+
+
+def test_commonprefix():
+    paths = ['E:/Build_E/ido_wa/ido_lcdo_mcl_product_52_ec/LC_Domain/LC_Domain/localconnectivity',
+             'E:/Build_E/ido_wa/ido_lcdo_mcl_product_52_ec/LC_Domain_osext/LC_Domain_osext/localconnectivityextensions',
+             'E:/Build_E/ido_wa/ido_lcdo_mcl_product_52_ec/LC_Domain_osext/LC_Domain_osext/localconnectivityextensions/src',
+             'E:/Build_E/ido_wa/different_root/LC_Domain_osext/LC_Domain_osext/localconnectivityextensions/src',
+             ]
+
+    paths2 = ['Y:/Build_E']
+    paths2.extend(paths)
+
+    # basic tests
+    # empty list => empty string 
+    assert pathaddition.relative.commonprefix([]) == ''
+    # one element list => return the element
+    assert pathaddition.relative.commonprefix(['foo']) == 'foo'
+    
+    print pathaddition.relative.commonprefix([paths[0], paths[1]])
+    assert os.path.normpath(pathaddition.relative.commonprefix([paths[0], paths[1]])) == os.path.normpath('E:/Build_E/ido_wa/ido_lcdo_mcl_product_52_ec')
+
+    assert os.path.normpath(pathaddition.relative.commonprefix(paths)) == os.path.normpath('E:/Build_E/ido_wa')
+
+    assert pathaddition.relative.commonprefix(paths2) == ''
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_policy_validator.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,148 @@
+#============================================================================ 
+#Name        : test_policy_validator.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Test the integration.quality module."""
+
+import os
+import unittest
+import sys
+import time
+import shutil
+
+import integration.quality
+import logging
+
+import test.test_fileutils
+
+
+_logger = logging.getLogger('test.archive')
+    
+    
+_test_file_paths = [
+    's60/Distribution.Policy.S60',
+    's60/ADO/Distribution.Policy.S60',
+    's60/ADO/group/Distribution.Policy.S60',
+    's60/ADO/internal/Distribution.Policy.S60',
+    's60/ADO/internal/good/Distribution.Policy.S60',
+    's60/ADO/internal/bad/Distribution.Policy.S60',
+    's60/ADO/tsrc/Distribution.Policy.S60',
+    's60/ADO/tsrc/group/Distribution.Policy.S60',
+    's60/ADO/tsrc/private/Distribution.Policy.S60',
+    's60/component_public/Distribution.Policy.S60',
+    's60/component_public/component_public_file.txt',
+    's60/component_private/Distribution.Policy.S60',
+    's60/component_private/component_private_file.txt',    
+    's60/missing/to_be_removed_9999.txt',
+    's60/missing/subdir/Distribution.Policy.S60',
+    's60/missing/subdir/to_be_removed_9999.txt',
+    's60/invalid/Distribution.Policy.S60',
+    's60/invalid/comment/Distribution.Policy.S60',
+    's60/invalid/utf16/Distribution.Policy.S60',
+    's60/invalid/letter/Distribution.Policy.S60',
+    ]
+
+_test_file_content = {
+    's60/Distribution.Policy.S60': '0',
+    's60/missing/subdir/Distribution.Policy.S60' : '0',
+    's60/component_public/Distribution.Policy.S60': '0',
+    's60/component_private/Distribution.Policy.S60': '1',
+    's60/ADO/Distribution.Policy.S60': '0',
+    's60/ADO/group/Distribution.Policy.S60': '0',
+    's60/ADO/internal/Distribution.Policy.S60': '1',
+    's60/ADO/internal/good/Distribution.Policy.S60': '1',
+    's60/ADO/internal/bad/Distribution.Policy.S60': '0',
+    's60/ADO/tsrc/Distribution.Policy.S60': '950',
+    's60/ADO/tsrc/group/Distribution.Policy.S60': '0',
+    's60/ADO/tsrc/private/Distribution.Policy.S60': '0',
+    's60/invalid/Distribution.Policy.S60': '0',
+    's60/invalid/comment/Distribution.Policy.S60': '0 ; some comment',
+    's60/invalid/utf16/Distribution.Policy.S60': '\xFF\xFE\x30\x00\x0D\x00\x0D\x00\x0D\x00\x0A\x00',
+    's60/invalid/letter/Distribution.Policy.S60': '9A0',
+    }
+    
+""" Used by test_archive. """
+root_test_dir = "_test_" + str(time.strftime("%H.%M.%S"))
+    
+def _testpath(subpath):
+    """ Normalised path for test paths. """
+    return os.path.normpath(os.path.join(root_test_dir, subpath))
+    
+def setup_module():
+    """ Setup files test config. 
+    
+    This creates a number of empty files in a temporary directory structure
+    for testing various file selection and archiving operations.
+    """
+    #print 'setup_module()'
+    #print _test_file_content.keys()
+    for child_path in _test_file_paths:
+        path = os.path.join(root_test_dir, child_path)
+        path_dir = path
+        path_dir = os.path.dirname(path)
+        
+        if (not os.path.exists(path_dir)):
+            _logger.debug('Creating dir:  ' + path_dir)
+            os.makedirs(path_dir)
+
+        if(not path.endswith('/') and not path.endswith('\\')):
+            _logger.debug('Creating file: ' + path)
+            handle = open(path, 'w')
+            # Write any file content that is needed
+            if _test_file_content.has_key(child_path):
+                handle.write(_test_file_content[child_path])
+            handle.close()
+
+def teardown_module():
+    """ Teardown test config. """
+    shutil.rmtree(root_test_dir)
+    
+    
+class PolicyValidatorTest(unittest.TestCase):
+    EXEC_FILE = "archive_create.ant.xml"
+
+    def test_policy_validator(self):
+        """ Testing the policy validator behaviour. """
+        validator = integration.quality.PolicyValidator()
+        errors = [] 
+        errors.extend(validator.validate(_testpath('s60')))
+        errors.sort()
+        print errors
+        assert len(errors) == 4
+
+        
+        # Invalid encoding: contains other stuff than policy id.
+        assert errors[0][0] == "invalidencoding"
+        assert errors[0][1].lower() == _testpath('s60' + os.sep + 'invalid' + os.sep + 'comment' + os.sep + 'distribution.policy.s60')
+        assert errors[0][2] == None
+        
+        # Invalid encoding: ID contains a letter.
+        assert errors[1][0] == "invalidencoding"
+        assert errors[1][1].lower() == _testpath('s60' + os.sep + 'invalid' + os.sep + 'letter' + os.sep + 'distribution.policy.s60')
+        assert errors[1][2] == None
+        
+        # Invalid encoding: not ascii.
+        assert errors[2][0] == "invalidencoding"
+        assert errors[2][1].lower() == _testpath('s60' + os.sep + 'invalid' + os.sep + 'utf16' + os.sep + 'distribution.policy.s60')
+        assert errors[2][2] == None
+        
+        # Policy file is missing
+        assert errors[3][0] == "missing"
+        assert errors[3][1].lower() == _testpath('s60' + os.sep + 'missing')
+        assert errors[3][2] == None
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_relnotes.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,93 @@
+#============================================================================ 
+#Name        : test_relnotes.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Unit tests for the relnotes tool.
+
+"""
+import unittest
+import StringIO
+import rtfutils
+import logging
+import os
+
+def test_initialization():
+    "Modules are imported properly, i.e. PyRTF is there etc."
+    import PyRTF
+
+def test_pyrtf():
+    import PyRTF
+    
+    DR = PyRTF.Renderer()
+    doc     = PyRTF.Document()
+    ss      = doc.StyleSheet
+    section = PyRTF.Section()
+    doc.Sections.append( section )
+    
+    string = StringIO.StringIO()
+    DR.Write(doc, string)
+    assert string.getvalue() != ""
+    string.close()
+    
+class RelNotesTest( unittest.TestCase ):
+    
+    def setUp(self):
+        self.helium_home = os.environ["HELIUM_HOME"]
+        self.logger = logging.getLogger('test.relnotes')
+        logging.basicConfig(level=logging.INFO)
+      
+    def test_rtfconvert(self):
+        props = {r'my.val1=hello world' : r'my.val1=hello world',
+        r'my.val2=http://www.company.com/a' : r'my.val2={\\field{\\*\\fldinst HYPERLINK http://www.company.com/a}}',
+        r'my.val3=ftp://ftp.company.com/a' : r'my.val3={\\field{\\*\\fldinst HYPERLINK ftp://ftp.company.com/a}}',
+        r'my.val4=\\server\share1\dir' : r'my.val4={\\field{\\*\\fldinst HYPERLINK \\\\\\\\\\\\\\\\server\\\\\\\\share1\\\\\\\\dir}}',
+        r'my.val5=.\projects' : r'my.val5={\\field{\\*\\fldinst HYPERLINK .\\\\\\\\projects}}'}
+        
+        for p, output in props.iteritems():
+            self._check_rtfconvert(p, output)
+        
+    def _check_rtfconvert(self, value, correctoutput):
+        output = StringIO.StringIO()
+        rtfu = rtfutils.RTFUtils('')
+        rtfu._rtfconvert([value], output)
+        self.logger.info(output.getvalue())
+        self.logger.info(correctoutput) 
+        assert output.getvalue() == correctoutput #.strip()
+        output.close()
+
+    def test_rtftable(self):
+        output = StringIO.StringIO()
+        errors = ["component,error,warning", "app2,1,2"]
+        input = ["text <tag> text"]
+        
+        rtfu = rtfutils.RTFUtils('')
+        rtfu._rtftable(errors, output, '<tag>', input)
+        
+        self.logger.info(output.getvalue())
+        output.close()
+        
+    def test_rtfimage(self):
+        output = StringIO.StringIO()
+        image = os.path.join(self.helium_home, 'extensions', 'nokia', 'config', 'relnotes', 'logo.png')
+        input = ["text <tag> text"]
+        
+        rtfu = rtfutils.RTFUtils('')
+        rtfu._rtfimage(image, output, '<tag>', input)
+        
+        self.logger.info(output.getvalue())
+        output.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_rom.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,59 @@
+#============================================================================ 
+#Name        : test_rom.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+import unittest, amara, os
+from rom import *
+import configuration
+
+
+
+class ImageTest( unittest.TestCase ):
+    def setUp( self ):
+        pass #productConfig = amara.parse( PRODUCT_CONFIG )
+    
+    def test_mytraces(self):
+        """ mytraces.txt file can be added and deleted. """
+        config = configuration.Configuration({'rom.output.dir': '',
+                                            'rommake.mytraces.file': 'mytraces.txt',
+                                            'mytraces.binaries': ['foo.dll', 'bar.dll']})
+        image = Image(config)
+        image._clean_mytraces()
+        
+        image._process_my_traces()
+        assert os.path.exists('mytraces.txt')
+        
+        # Check content
+        mytraces_lines = open( 'mytraces.txt', 'r' ).readlines()
+        print mytraces_lines[0]
+        assert mytraces_lines[0] == 'foo.dll\n'
+        assert mytraces_lines[1] == 'bar.dll\n'
+        
+        image._clean_mytraces()
+        assert not os.path.exists('mytraces.txt')
+
+    def test_mytraces_not_needed(self):
+        """ mytraces.txt file not used if config does not define. """
+        config = configuration.Configuration({'rom.output.dir': '',
+                                            'rommake.mytraces.file': 'mytraces.txt'})
+        image = Image(config)
+        image._clean_mytraces()
+        
+        image._process_my_traces()
+        assert not os.path.exists('mytraces.txt')
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_session_provider.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,155 @@
+#============================================================================ 
+#Name        : test_session_provider.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for ccm python toolkit.
+
+"""
+import unittest
+import sys
+import ccm
+import ccm.extra
+import os
+import logging
+
+
+_logger = logging.getLogger('test.test_session_provider')
+logging.basicConfig(level=logging.INFO)
+
+class MockResultSession(ccm.AbstractSession):
+    """ Fake session used to test Result"""
+    def __init__(self, behave = {}, database="fakedb"):
+        ccm.AbstractSession.__init__(self, None, None, None, None)
+        self._behave = behave
+        self._database = database
+        self.dbpath = "/path/to/" + database
+        self._session_addr = "LOCALHOST:127.0.0.1:1234"
+    
+    def database(self):
+        _logger.info("running database from MockResultSession")
+        return self._database
+    
+    def execute(self, cmdline, result=None):
+        if result == None:
+            result = ccm.Result(self)        
+        if self._behave.has_key(cmdline):
+            result.statuserrors = 0  
+            result.output = self._behave[cmdline]
+        else:
+            result.status = -1  
+        return result
+
+class MockOpener:
+    def __init__(self):
+        self.failOnNewOpen = False
+    
+    def __call__(self, username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
+        assert self.failOnNewOpen == False, "This method should not be called again."
+        if database != "fakedb":
+            raise ccm.CCMException("Invalid database")
+        return MockResultSession()
+    
+class SessionProviderTest(unittest.TestCase):
+    """ Testing Results parsers. """
+    def test_get_valid_db(self):
+        """ Test the opening of a valid database. """
+        p = ccm.extra.SessionProvider(opener=MockOpener())
+        db = p.get(database="fakedb")
+        assert db is not None
+
+    def test_get_invalid_db(self):
+        """ Test the opening of an invalid database. """
+        p = ccm.extra.SessionProvider(opener=MockOpener())
+        try:            
+            db = p.get(database="invaliddb")
+            assert False, "Should raise Exception when giving unexisting db.'"
+        except Exception, exc:
+            _logger.info(exc)
+        
+        
+        
+class CachedSessionProviderTest(unittest.TestCase):
+    """ Testing Results parsers. """
+    session_cache = "build/session_cache.xml"
+    
+    def setUp(self):
+        if not os.path.exists(os.path.dirname(self.session_cache)):
+            os.makedirs(os.path.dirname(self.session_cache))
+        if os.path.exists(self.session_cache):
+            os.remove(self.session_cache)
+    
+    def tearDown(self):
+        if os.path.exists(self.session_cache):
+            os.remove(self.session_cache)
+    
+    def test_get_valid_db(self):
+        """ Test the opening of a valid database (cached). """
+        p = ccm.extra.CachedSessionProvider(opener=MockOpener())
+        db = p.get(database="fakedb")
+        assert db is not None
+
+    def test_get_invalid_db(self):
+        """ Test the opening of an invalid database (cached). """
+        p = ccm.extra.CachedSessionProvider(opener=MockOpener())
+        try:
+            db = p.get(database="invaliddb")
+            assert False, "Should raise Exception when giving unexisting db.'"
+        except Exception, exc:
+            _logger.info(exc)
+        
+    def test_open_session_twice(self):
+        """ Open session then free it then open it again... """
+        opener = MockOpener()
+        p = ccm.extra.CachedSessionProvider(opener=opener)
+        db = p.get(database="fakedb")
+        assert db is not None
+        del db
+        opener.failOnNewOpen = True
+        db2 = p.get(database="fakedb")
+        assert db2 is not None
+        
+    def test_write_cache(self):
+        p = ccm.extra.CachedSessionProvider(opener=MockOpener(), cache=self.session_cache)
+        db = p.get(database="fakedb")
+        assert db is not None
+        del db
+        p.save()
+        assert os.path.exists(self.session_cache), "Cache file %s is missing." % self.session_cache
+        
+    def test_write_and_load_cache(self):
+        
+        # patching the default implementation
+        def always_true(sid, db=None):
+            return True
+        ccm.session_exists = always_true
+        
+        p = ccm.extra.CachedSessionProvider(opener=MockOpener(), cache=self.session_cache)
+        db = p.get(database="fakedb")
+        assert db is not None
+        del db
+        del p
+        assert os.path.exists(self.session_cache), "Cache file %s is missing." % self.session_cache
+        
+        opener = MockOpener()
+        opener.failOnNewOpen = True
+        p = ccm.extra.CachedSessionProvider(opener=opener, cache=self.session_cache)        
+        assert 'fakedb' in p.cacheFree
+        assert len(p.cacheFree['fakedb']) == 1
+        
+        
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_symbian_log.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,121 @@
+#============================================================================ 
+#Name        : test_symbian_log.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+"""
+import unittest
+import logging
+import StringIO
+import symbian.log
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.symbian.log')
+
+test_output = """
+===-------------------------------------------------
+=== Stage=1
+===-------------------------------------------------
+=== Stage=1 started Fri Apr 18 21:09:55 2008
+=== Stage=1 == ncp_psw
+-- xcopy *.*  \\ /F /R /Y /S
+--- Client0 Executed ID 1
+++ Started at Fri Apr 18 21:09:55 2008
++++ HiRes Start 1208542195.09307
+Chdir \\psw\\ncp_psw\\psw
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\ct.ini -> S:\\s60\\tools\\customizationtool\\ct.ini
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPAudioEqualizer_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPAudioEqualizer_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPHWGeneral_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPHWGeneral_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPLight_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPLight_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\NCPSysAp_settings.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\NCPSysAp_settings.xml
+S:\\psw\\ncp_psw\\psw\\s60\\tools\\customizationtool\\xml_data\\VariantFeatures.xml -> S:\\s60\\tools\\customizationtool\\xml_data\\VariantFeatures.xml
+6 File(s) copied
++++ HiRes End 1208542195.28056
+++ Finished at Fri Apr 18 21:09:55 2008
+=== Stage=1 finished Fri Apr 18 21:09:55 2008
+===-------------------------------------------------
+=== Stage=2
+===-------------------------------------------------
+=== Stage=2 started Fri Apr 18 21:29:33 2008
+=== Stage=2 == localconnectivityextensions
+-- abld export -keepgoing
+--- Client2 Executed ID 213
+++ Started at Fri Apr 18 21:29:33 2008
++++ HiRes Start 1208543373.36786
+Chdir \s60\osext\localconnectivityextensions\group
+  make -r  -k -f "\EPOC32\BUILD\s60\osext\localconnectivityextensions\group\EXPORT.make" EXPORT VERBOSE=-s KEEPGOING=-k
+copy "\s60\osext\localconnectivityextensions\lcext_dom\bluetooth_audio_adaptation_api\inc\btaudiostreaminputbase.h" "\epoc32\include\domain\osextensions\btaudiostreaminputbase.h"
+        1 file(s) copied.
+copy "\s60\osext\localconnectivityextensions\lcext_dom\bluetooth_power_management_api\inc\btpm.h" "\epoc32\include\domain\osextensions\btpm.h"
+        1 file(s) copied.
++++ HiRes End 1208543373.72723
+++ Finished at Fri Apr 18 21:29:33 2008
+=== Stage=2 == messagingextensions
+-- abld export -keepgoing
+--- Client6 Executed ID 217
+++ Started at Fri Apr 18 21:29:33 2008
++++ HiRes Start 1208543373.36786
+Chdir \s60\osext\messagingextensions\group
+  make -r  -k -f "\EPOC32\BUILD\s60\osext\messagingextensions\group\EXPORT.make" EXPORT VERBOSE=-s KEEPGOING=-k
+Creating \epoc32\include\domain\osextensions\loc\sc
+Creating \epoc32\rom\include\language\osext
+copy "\s60\osext\messagingextensions\msgbranched\rom\messageserver_rsc.iby" "\epoc32\rom\include\language\osext\messageserver_rsc.iby"
+        1 file(s) copied.
+copy "\s60\osext\messagingextensions\msgbranched\rom\gtemailmtmResources.iby" "\epoc32\rom\include\language\osext\gtemailmtmResources.iby"
+        1 file(s) copied.
+copy "\s60\osext\messagingextensions\msgbranched\messaging\email\clientmtms\loc\imcm.loc" "\epoc32\include\domain\osextensions\loc\sc\imcm.loc"
+        1 file(s) copied.
+copy "\s60\osext\messagingextensions\msgbranched\messaging\email\clientmtms\loc\imcm_default_charset.loc" "\epoc32\include\domain\osextensions\loc\sc\imcm_default_charset.loc"
+        1 file(s) copied.
+copy "\s60\osext\messagingextensions\msgbranched\messaging\framework\server\loc\msgs.loc" "\epoc32\include\domain\osextensions\loc\sc\msgs.loc"
+        1 file(s) copied.
++++ HiRes End 1208543373.80535
+++ Finished at Fri Apr 18 21:29:33 2008
+=== Stage=2 finished Fri Apr 18 21:09:55 2008
+"""
+
+
+
+class Parser(symbian.log.Parser):
+    def __init__(self, content=StringIO.StringIO(test_output)):        
+        symbian.log.Parser.__init__(self, content)
+        self.stages = []
+        self.tasks = []
+
+    def start_stage(self, name, time):
+        logger.debug(name) 
+        self.stages.append(name)
+
+    def task(self, name, cmdline, dir, output):
+        logger.debug("%s, %s, %s, %s" % (name, cmdline, dir, output)) 
+        self.tasks.append({'name': name, 'cmdline': cmdline, 'dir': dir, 'output': output})
+
+
+class TestSymbianLog(unittest.TestCase):
+    """ Test cases for Helium Symbian log parser. """
+    
+    def test_parser(self):
+        """ Test the parser
+        """
+        parser = Parser()
+        parser.parse()
+        assert len(parser.stages) == 2
+        assert len(parser.tasks) == 3
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_symrec.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,244 @@
+#============================================================================ 
+#Name        : test_symrec.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" ant.py module tests. """
+
+
+import symrec
+import logging
+import os
+from xml.dom.minidom import *
+import amara
+
+logger = logging.getLogger("test.symrec")
+logging.basicConfig()
+logger.setLevel(logging.DEBUG)
+
+def test_symrec_creation():
+    """ Test metadata generation functions. """
+    metadata = symrec.ReleaseMetadata("release_metadata.xml",
+                                   service="myservice",
+                                   product="myproduct",
+                                   release="myrelease")
+    metadata.add_package(name="my_archive.zip")
+    metadata.add_package(name="my_archive2.zip", filters=['foo', 'bar'])
+    logger.debug(metadata.xml())
+    print metadata.service
+    assert metadata.service == "myservice"
+    assert metadata.product == "myproduct"
+    assert metadata.release == "myrelease"
+    assert metadata.dependsof_service == None
+    assert metadata.dependsof_product == None
+    assert metadata.dependsof_release == None
+    # Package validation
+    assert metadata.keys() == ['my_archive.zip', 'my_archive2.zip']
+    assert metadata['my_archive.zip'] == {'type': u'zip', 'extract': u'single', 'default': True, 'filters': [], 's60filter':[], 'md5checksum': None, 'size': None}
+    assert metadata['my_archive2.zip'] == {'type': u'zip', 'extract': u'single', 'default': True, 'filters': ['foo', 'bar'], 's60filter': ['foo', 'bar'], 'md5checksum': None, 'size': None}
+
+def test_symrec_loading():
+    """ Test loading generated metadata. """
+    filename = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec", "generated_release_metadata.xml")    
+    metadata = symrec.ReleaseMetadata(filename)
+    assert metadata.dependsof_service == None
+    assert metadata.dependsof_product == None
+    assert metadata.dependsof_release == None
+    print metadata.keys()
+    assert metadata.keys() == [u's60_app_organizer_clock.zip', u's60_app_organizer_clock_binary.zip', u's60_mw_classicui_and_app_radio.zip', u's60_mw_classicui_and_app_radio_internal.zip']
+    for name in metadata.keys():
+        print metadata[name]
+        assert metadata[name]['md5checksum'] == None
+        assert metadata[name]['size'] == None
+        assert metadata[name]['type'] == "zip"
+                           
+def test_symrec_update():
+    """ Testing symrec MD5updater class. """
+    filename = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/GRACE", "service/product/release_1/release_metadata.xml")
+    updatemd5 = symrec.MD5Updater(filename)
+    updatemd5.update()
+    print updatemd5['test1.zip']['md5checksum']
+    print updatemd5['test2.zip']['md5checksum']
+    assert updatemd5['test1.zip']['md5checksum'] == "29b6ddc0265958641949c15e5c16c580"
+    assert updatemd5['test2.zip']['md5checksum'] == "433fd286bcf7e55be9d0e7e88f0cd84c"
+    assert updatemd5['test1.zip']['size'] == "112"
+    assert updatemd5['test2.zip']['size'] == "112"
+
+
+def test_symrec_releaseinfo_modification():
+    """ Testing symrec release information modifications. """
+    filename = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/GRACE", "service/product/release_1/release_metadata.xml")
+    metadata = symrec.ReleaseMetadata(filename)
+    metadata.service = "test_service"
+    metadata.product = "test_product"
+    metadata.release = "test_release"
+    assert metadata.service == "test_service"
+    assert metadata.product == "test_product"
+    assert metadata.release == "test_release"
+    
+    metadata.dependsof_service = "test_service_dep"
+    metadata.dependsof_product = "test_product_dep"
+    metadata.dependsof_release = "test_release_dep"
+    assert metadata.dependsof_service == "test_service_dep"
+    assert metadata.dependsof_product == "test_product_dep"
+    assert metadata.dependsof_release == "test_release_dep"
+
+      
+def test_release_validator():
+    """ Testing release metadata xml validator. """
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1/release_metadata.xml"))
+    assert validator.is_valid() == True
+
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_2/release_metadata.xml"))
+    assert validator.is_valid() == False
+
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1_001/release_metadata.xml"))
+    assert validator.is_valid() == True
+    
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1_001/release_metadata_1.xml"))
+    assert validator.is_valid() == True
+
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1_002/release_metadata.xml"))
+    assert validator.is_valid() == True
+    
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_5/release_metadata.xml"))
+    assert validator.is_valid() == True
+    validator = symrec.ValidateReleaseMetadata(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_6/release_metadata.xml"))
+    assert validator.is_valid() == False
+def test_xml_merge():
+    """ Testing the merge of metadata files. """
+    merger = symrec.MetadataMerger(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/merge/main_metadata_1.xml"))
+    merger.merge(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/merge/main_metadata_2.xml"))
+    merger.merge(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/merge/main_metadata_3.xml"))
+    logger.debug(merger.xml())
+    output = open(os.path.join(os.environ['TEMP'], "release_data.xml"), "w+")
+    output.write(merger.xml())
+    output.close()
+    
+    metadata = symrec.ReleaseMetadata(os.path.join(os.environ['TEMP'], "release_data.xml"))
+    logger.debug(metadata.keys())
+    assert len(metadata.keys()) == 4
+    assert metadata.keys() == [u'test1.zip', u'test2.zip', u'test3_1.zip', u'test3_2.zip']
+    
+    
+
+def test_symrec_loading_sp_invalid():
+    """ Test loading generated metadata. """
+    filename = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/GRACE/service/product/release_1_001", "release_metadata.xml")    
+    metadata = symrec.ReleaseMetadata(filename)
+    assert metadata.service == "service"
+    assert metadata.product == "product"
+    assert metadata.release == "release_1_001"
+    assert metadata.dependsof_service == "service"
+    assert metadata.dependsof_product == "product"
+    assert metadata.dependsof_release == "release_1"
+    assert metadata.keys() == [u'sp1.zip']
+
+    validator = symrec.ValidateReleaseMetadata(filename)
+    assert validator.is_valid() == True
+
+def test_symrec_loading_sp_valid():
+    """ Test loading generated metadata. """
+    filename = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/GRACE/service/product/release_1_001", "release_metadata_1.xml")    
+    metadata = symrec.ReleaseMetadata(filename)
+    assert metadata.service == "service"
+    assert metadata.product == "product"
+    assert metadata.release == "release_1_001"
+    assert metadata.dependsof_service == "service"
+    assert metadata.dependsof_product == "product"
+    assert metadata.dependsof_release == "release_1"
+    assert metadata.keys() == []    
+    assert len(metadata.servicepacks) == 1
+    assert metadata.servicepacks[0].name == u'SP1'
+    assert metadata.servicepacks[0].files == [u'sp1.zip']
+    assert metadata.servicepacks[0].instructions == [u'specialInstructions.xml']
+
+    validator = symrec.ValidateReleaseMetadata(filename)
+    assert validator.is_valid() == True
+
+
+def test_symrec_to_tdd():
+    filename = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/GRACE/service/product/release_1_001", "release_metadata.xml")        
+    logger.info(symrec.Metadata2TDD(filename).to_tdd())
+
+
+def test_find_latest_metadata():
+    assert symrec.find_latest_metadata(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/override/none")) == None
+    
+    expected = os.path.normpath(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/override/one", "release_metadata.xml"))
+    filename = symrec.find_latest_metadata(os.path.dirname(expected))
+    assert expected == filename, "Should be %s (%s)" % (expected, filename)
+
+    expected = os.path.normpath(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/override/several", "release_metadata_2.xml"))
+    filename = symrec.find_latest_metadata(os.path.dirname(expected))
+    assert expected == filename, "Should be %s (%s)" % (expected, filename)
+
+
+def test_cached_release_validator():
+    """ Testing the cached release metadata xml validator. """
+    
+    cachefile = os.path.join(os.environ['HELIUM_HOME'], 'build', 'test_cache.txt')
+    if not os.path.exists(os.path.dirname(cachefile)):
+        os.makedirs(os.path.dirname(cachefile))
+    if os.path.exists(cachefile):
+        os.remove(cachefile)
+    # 1st release
+    validator = symrec.ValidateReleaseMetadataCached(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_2/release_metadata.xml"), cachefile)
+    assert validator.is_valid() == False
+    assert os.path.exists(cachefile), "Cache file has not been created"
+    assert len(validator.load_cache()) == 1
+    
+    # 2nd release
+    validator = symrec.ValidateReleaseMetadataCached(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1/release_metadata.xml"), cachefile)
+    assert validator.is_valid() == True
+    assert os.path.exists(cachefile), "Cache file has not been created"
+    assert len(validator.load_cache()) == 2
+
+    # 3st release
+    validator = symrec.ValidateReleaseMetadataCached(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1_001/release_metadata_1.xml"), cachefile)
+    assert validator.is_valid() == True
+    assert os.path.exists(cachefile), "Cache file has not been created"
+    print validator.load_cache()
+    assert len(validator.load_cache()) == 3
+
+    # testing 2nd release again
+    validator = symrec.ValidateReleaseMetadataCached(os.path.join(os.environ['HELIUM_HOME'],
+                                                            "tests/data/symrec/GRACE",
+                                                            "service/product/release_1/release_metadata.xml"), cachefile)
+    assert validator.is_valid() == True
+    assert os.path.exists(cachefile), "Cache file has not been created"
+    assert len(validator.load_cache()) == 3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_sysdef.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,63 @@
+#============================================================================ 
+#Name        : test_sysdef.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for the sysdef module. """
+
+import logging
+import sys
+import unittest
+import os
+import sysdef.api
+import sysdef.io
+import StringIO
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.sysdef')
+
+class SysdefTest(unittest.TestCase):
+    """ Testing sydef module. """
+    
+    def test_basic_parsing(self):
+        """ A System Definition file can be parsed and information extracted. """
+        sysDef = sysdef.api.SystemDefinition(os.path.join(os.environ["HELIUM_HOME"], r'tests', 'data', 'sysdef2make', 'SDF.xml'))
+        assert len(sysDef.configurations) == 4
+        assert len(sysDef.layers) == 1
+        assert len(sysDef.unitlists) == 1
+        
+        # UnitList
+        assert sysDef.unitlists['unitlist1'].name == 'unitlist1'
+        assert len(sysDef.unitlists['unitlist1'].units) == 3
+        
+        # Layer
+        assert sysDef.layers['layer1'].name == 'layer1'
+        assert len(sysDef.layers['layer1'].units) == 3
+
+        # Configs
+        assert sysDef.configurations['config1'].name == 'config1'
+        assert len(sysDef.configurations['config1'].tasks) == 12
+
+    def test_makefile_generation(self):
+        sysDef = sysdef.api.SystemDefinition(os.path.join(os.environ["HELIUM_HOME"], r'tests', 'data', 'sysdef2make', 'SDF.xml'))
+        output = StringIO.StringIO()
+        writer = sysdef.io.MakeWriter2(output)
+        writer.write(sysDef)
+        logger.debug(output.getvalue())
+        writer.close()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_threadpool.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,86 @@
+#============================================================================ 
+#Name        : test_threadpool.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for threadpool module.
+
+"""
+
+import logging
+import sys
+import time
+import unittest
+
+import threadpool
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+logging.basicConfig(level=logging.DEBUG)
+_logger = logging.getLogger('test.threadpool')
+
+class Job:
+    def __init__(self, jid):
+        self.__id = jid
+        
+    def __call__(self):
+        _logger.debug("Job %d" % self.__id)
+        self.work()
+        _logger.debug("Job %d - done" % self.__id)
+        
+    def work(self):
+        time.sleep(1)
+
+class LeavingJob(Job):
+
+    def work(self):
+        time.sleep(1)
+        raise Exception("Error!")
+    
+
+class TestThreadPool(unittest.TestCase):
+
+    def test_thread_pool(self):
+        """ Test the thread pool.
+        """
+        pool = threadpool.ThreadPool(4)
+        pool.addWork(Job(1))
+        pool.addWork(Job(2))
+        pool.addWork(Job(3))
+        pool.addWork(Job(4))
+        pool.addWork(Job(5))
+        pool.addWork(Job(6))
+        pool.wait()
+ 
+    def test_thread_pool_leaving(self):
+        """ Test the thread pool when exception happens.
+        """
+        exceptions = []
+        def handle_exception(request, exc_info):
+            _logger.debug( "Exception occured in request #%s: %s" % (request.requestID, exc_info[1]))
+            exceptions.append(exc_info[1])                        
+        pool = threadpool.ThreadPool(4)
+        pool.addWork(LeavingJob(1), exc_callback=handle_exception)
+        pool.addWork(LeavingJob(2), exc_callback=handle_exception)
+        pool.addWork(LeavingJob(3), exc_callback=handle_exception)
+        pool.addWork(LeavingJob(4), exc_callback=handle_exception)
+        pool.addWork(LeavingJob(5), exc_callback=handle_exception)
+        pool.addWork(LeavingJob(6), exc_callback=handle_exception)
+        pool.wait()
+        assert len(exceptions)==6
+        _logger.debug(exceptions)
+ 
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_vbaconf.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+#============================================================================ 
+#Name        : test_vbaconf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Some test cases for VBA config generation.
+"""
+import unittest
+import logging
+import os
+import vbaconf
+import vbaconf.new_delivery
+import amara
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.vbaconf')
+
+
+class TestVBAConf(unittest.TestCase):
+    """ Implementation of VBA test cases. """
+    
+    def test_vba_conf_generation(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/prep.xml.parsed')
+        doc = vbaconf.generate_config(delivery, prep)
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+        
+    def test_vba_conf_generation_new_delivery_format(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/prep.xml.parsed')
+        doc = vbaconf.new_delivery.generate_config(delivery, prep)
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        ##assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+        
+    def test_vba_conf_generation_new_api(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/prep.xml.parsed')
+        conv = vbaconf.ConfigConverter(delivery, prep)
+        doc = conv.generate_config()
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+
+    def test_vba_conf_generation_new_api_new_delivery_format(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/prep.xml.parsed')
+        conv = vbaconf.ConfigConverterNewDelivery(delivery, prep)
+        doc = conv.generate_config()
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/validateoverlay.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,305 @@
+#============================================================================ 
+#Name        : validateoverlay.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+
+import StringIO
+import sys
+import os
+import optparse
+import traceback
+
+import amara
+
+import ccm
+import comments
+import helium.logger
+from helium.outputer import XML2XHTML
+import nokia.nokiaccm
+import virtualbuildarea
+
+
+def __findChild(p, d, name):
+    if (p is None or d is None):
+        return None
+    for child in d.children(p):
+        if name.lower() == child.name.lower():
+            return child
+    return None
+
+def __getDir(p, o):
+    if (o.type == 'project'):
+        return o, o.root_dir()
+    return p, o
+
+class ValidateOverlayInfo:
+    UNKNOW = 0
+    STILL_VALID = 1
+    MERGE = 2
+    def __init__(self, name):
+        self.name = name
+        #self.status = status
+        self.overlayObject = None
+        self.deliveryObjects = []
+
+def ValidateOverlay(vproject, vdir, oproject, odir, extraobject = None):
+    """ This function scan an the virtual build area and the overlay to validate
+        if the overlay content is still up to date compare to the delivery.
+    """
+    if extraobject is None:
+        extraobject = []
+    print "ValidateOverlay(%s,%s,%s,%s)" % (vproject, vdir, oproject, odir)
+    result = {'name': odir.name, 'content': []}
+    for child in odir.children(oproject):
+        o = __findChild(vproject, vdir, child.name)
+        if o is None:
+            if (child.type == 'dir' or child.type == 'project'):
+                op, oo = __getDir(oproject, child)
+                result['content'].append(ValidateOverlay(None, None, op, oo, extraobject))
+            else:
+                info = ValidateOverlayInfo(child.name)
+                info.overlayObject = child
+                result['content'].append(info)
+        else:
+            if (child.type == 'dir' or child.type == 'project'):
+                vp, vo = __getDir(vproject, o)
+                op, oo = __getDir(oproject, child)
+                result['content'].append(ValidateOverlay(vp, vo, op, oo, extraobject))
+            else:
+                info = ValidateOverlayInfo(child.name)
+                info.overlayObject = child
+                info.deliveryObjects.append({'status': ValidateOverlayInfo.UNKNOW, 'object': o})
+                
+                for eo in extraobject:
+                    if eo.is_same_family(o):
+                        info.deliveryObjects.append({'status': ValidateOverlayInfo.UNKNOW, 'object': eo})
+                
+                for delivery in info.deliveryObjects:
+                    if child.is_recursive_sucessor_of(delivery['object']):
+                        delivery['status'] = ValidateOverlayInfo.STILL_VALID
+                    else:
+                        delivery['status'] = ValidateOverlayInfo.MERGE
+
+                result['content'].append(info)
+    return result
+
+def getObjectPath(project, spath, dir=None):
+    name = spath.pop(0)
+    if (dir == None):        
+        if project.root_dir().name.lower() == name.lower():
+            return getObjectPath(project, spath, project.root_dir())
+        raise Exception("project.root_dir().name.lower()!=name.lower():")
+    else:
+        for o in dir.children(project):
+            if o.name.lower() == name.lower():
+                if len(spath) == 0:
+                    return o
+                elif o.type == 'dir':
+                    return getObjectPath(project, spath, o)
+                else:
+                    raise Exception("Object could not be accessed")
+        raise Exception("Object not found")
+ 
+def showBranchInfo(logger, object):    
+    doc = comments.CommentParser.scan_content(str(object.overlayObject), object.overlayObject.content(), "branchInfo")
+    if len(doc.commentLog.xml_xpath('branchInfo'))>0:
+        for child in doc.commentLog.xml_xpath('branchInfo'):
+            logger.PrintRaw("<b>Branch Information:</b>\n")
+            if hasattr(child, 'xml_attributes'):
+                for attr in child.xml_attributes:
+                    logger.PrintRaw("<b>%s:</b> %s\n" % (attr, getattr(child, attr)))
+                    if hasattr(child, 'branch'):
+                        logger.PrintRaw("<b>Should validate compare to file:</b> %s\n" % child.branch)
+    else:
+        logger.Print("No branch info...\n")
+
+def showValidity(logger, obj):
+    if len(obj.deliveryObjects)==0:
+        logger.NotFound("Could not find %s relative objects." % (obj.overlayObject))                
+    else:
+        for delivery in obj.deliveryObjects:
+            if (delivery['status'] == ValidateOverlayInfo.MERGE):
+                logger.Merge("Overlay object %s requires a merge with %s." % (obj.overlayObject, delivery['object']))
+            elif (delivery['status'] == ValidateOverlayInfo.STILL_VALID):
+                logger.Valid("%s is still a successor of %s." % (obj.overlayObject, delivery['object']))
+    
+
+def showValidateOverlayInfo(logger, data, comments=False):
+    logger.OpenEvent(data['name'])
+    for o in data['content']:
+        if isinstance(o, ValidateOverlayInfo):            
+            logger.OpenEvent(o.name)
+            showValidity(logger, o)                    
+            # Showing branch information.
+            if comments:
+                showBranchInfo(logger, o)
+            logger.CloseEvent()
+        else:
+            showValidateOverlayInfo(logger, o, comments)
+    logger.CloseEvent()
+
+def mergeObjects(logger, data, task):
+    for obj in data['content']:
+        if isinstance(obj, ValidateOverlayInfo):
+            mergedobject = None
+            for delivery in obj.deliveryObjects:
+                if (delivery['status'] == ValidateOverlayInfo.MERGE):
+                    try:
+                        if not mergedobject:
+                            (mergedobject, validity) = obj.overlayObject.merge(delivery['object'], task)
+                            mergedobject.checkin('public', 'Makes object public.')
+                            logger.Print("%s (%s, %s)" % (mergedobject, obj.overlayObject, delivery['object']))
+                        else:
+                            delivery['object'].relate(mergedobject)
+                            logger.Print("%s (%s, %s)" % (mergedobject, obj.overlayObject, delivery['object']))
+                            #mergedobject
+                    except Exception, e:
+                        logger.Error("%s" % e)
+#            if o.status == ValidateOverlayInfo.MERGE:            
+#                try:
+#                    (object, validity) = o.overlayObject.merge(o.deliveryObject, task)
+#                    object.checkin('public', 'Makes object public.')
+##                   logger.Print("%s (%s, %s)" % (object, o.overlayObject, o.deliveryObject))
+#                except Exception, e:
+#                    logger.Error("%s" % e)
+        else:
+            mergeObjects(logger, obj, task)
+
+
+def validate(session, inputfile, overlaydir, showBranchInfo, createtask=False, releasetag = None, extra_objects = None, logname = "validate_overlay"):
+    """ Validate an overlay uisng data from the inputfile to generate the virtual build area. """
+    vba = virtualbuildarea.create(session, open(inputfile, 'r'))
+    print overlaydir
+    if extra_objects is None:
+        extra_objects = []
+    overlay = session.get_workarea_info(overlaydir)['project']
+    voresult = ValidateOverlay(vba, vba.root_dir(), overlay, getObjectPath(overlay, [overlay.name, 'common', 'files']), extra_objects)
+
+    mclogger = helium.logger.Logger()
+    mclogger.SetInterface("http://fawww.europe.nokia.com/isis/isis_interface/")
+    mclogger.SetTitle("Validate Overlay")
+    mclogger.SetSubTitle("Validating: %s" % overlay)
+    mclogger.OpenMainContent("Analysing %s" % overlay)
+    showValidateOverlayInfo(mclogger, voresult, showBranchInfo)
+    mclogger.CloseMainContent()
+    if createtask and releasetag != None:
+        mclogger.OpenMainContent("Creating merge task")
+        team = 'TEAM_NAME'
+        if os.environ.has_key('TEAM'):
+            team = os.environ['TEAM']            
+        try:
+            task = ccm.Task.create(session, session.create(releasetag), "%s: %s: %s: Merge task" % (team, overlay.name, os.environ['USERNAME']))
+            #task = session.create("Task fa1f5132#17458")
+            task.assign(os.environ['USERNAME'])
+            mclogger.Print("Created task %s.\n" % task['displayname'])
+            mergeObjects(mclogger, voresult, task)
+        except Exception, e:
+            traceback.print_exc(file=sys.stdout)
+            mclogger.Error(e)
+        mclogger.CloseMainContent()
+    
+    mclogger.WriteToFile(logname + ".xml")
+    g = XML2XHTML(logname+".xml")    
+    g.addCSSLink("http://fawww.europe.nokia.com/isis/isis_interface/css/overlaycheck.css")
+    g.generate()
+    g.WriteToFile(logname + ".html")
+
+
+def main():
+
+    usage = "usage: %prog [options] arg1 arg2"
+    parser = optparse.OptionParser(usage=usage)
+    parser.add_option("--host", dest="ccm_host", action="store",
+                                help="Synergy Host")
+    parser.add_option("-d", "--db", dest="ccm_db", action="store",
+                                help="Synergy database")
+    parser.add_option("-u", "--username", dest="ccm_login",  action="store",                    
+                                help="Synergy username")
+    parser.add_option("-p", "--password", dest="ccm_password",  action="store",                    
+                                help="Synergy user password")    
+    parser.add_option("-c",  "--config", dest="inputfile", action="store",
+                                help="Configuration file", metavar="PATH")
+    parser.add_option("-o", "--overlay", dest="overlaydir", action="store",
+                                help="Overlay work area directory", metavar="PATH")
+    parser.add_option("--showBranchInfo", dest="showBranchInfo", action="store_true",
+                                help="Show up branch information", default=False)
+    parser.add_option("--ct", dest="createtask", action="store_true",
+                                help="Create merge task", default=False)
+    parser.add_option("--rt", dest="releasetag", action="store",
+                                help="Release tag", default=None)
+
+    (options, args) = parser.parse_args()
+    session = nokia.nokiaccm.open_session(options.ccm_login, options.ccm_password, options.ccm_host, options.ccm_db)
+    validate(session, options.inputfile, options.overlaydir, options.showBranchInfo, options.createtask, options.releasetag)
+    session.close()
+
+if __name__ == "__main__":
+    main()
+
+#vba = virtualbuildarea.VirtualProject(session,'vba')
+
+#try:
+#    #dom = xml.dom.minidom.parse(input)
+#    dom = xml.dom.minidom.parseString(input)
+#except Exception, e:
+#    raise Exception("XML cannot be parsed properly %s" % e)
+#
+#virtualBA = dom.documentElement
+#for child in virtualBA.childNodes:
+#    if (child.nodeType == xml.dom.Node.ELEMENT_NODE) and (child.nodeName=='add'):
+#        print "add node :%s (%d)" % (child.getAttribute('project'),len(child.childNodes))
+#        pathobject = createVirtualPath(child.getAttribute('to').split('/'),vba)
+#        if len(child.childNodes)==0:
+#            p = session.create(child.getAttribute('project'))
+#            pathobject.addChild(p,p)
+#        else:
+#            project = session.create(child.getAttribute('project'))
+#            for subChild in child.childNodes:
+#                if (subChild.nodeType == xml.dom.Node.ELEMENT_NODE) and (subChild.nodeName=='objects'):
+#                    spath = removeEmptyStrings(subChild.getAttribute('from').split('/'))
+#                    for t in getObjects(project,spath):
+#                        pathobject.addChild(t['object'],t['project'])
+#                    
+
+
+#print "******************************************"
+def showVirtualContent(project, path, indent=''):
+    if not isinstance(path, virtualbuildarea.VirtualDir):
+        return
+    print "%s+ %s" % (indent, path)
+    indent += "   "
+    for obj in path.children(project):        
+        if (obj.type == 'dir'):
+            showVirtualContent(project, obj, indent)
+        else:
+            print "%s- %s" % (indent, obj)
+    
+#showVirtualContent(vba, vba.root_dir())
+
+def get_additional_delivery_objects(session, deliveryinput):
+    objects = []
+    delivery = amara.parse(open(deliveryinput, 'r'))
+    for t in delivery.xml_xpath('/deliveryConfiguration//task[@id]'):
+        for task in map(lambda x: x.strip(), t.id.split(',')):
+            objects.extend(session.create("Task %s" % task).objects)
+    for f in delivery.xml_xpath('/deliveryConfiguration//folder[@id]'):
+        for folder in map(lambda x: x.strip(), f.id.split(',')):
+            objects.extend(session.create("Folder %s" % folder).objects)
+    return objects
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/vbaconf/__init__.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,220 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper to convert delivery.xml and prep.xml to VirtualBuildArea
+    configuration file.
+"""
+from  xml.dom.minidom import getDOMImplementation
+import amara
+import ccm
+import re
+import os.path
+import sys
+import configuration
+
+def cleanup_path(path):
+    """ Returns path without any sequence of '/' and replacing '\' by '/' """
+    return re.sub(r'/+', '/', re.sub(r'\\', '/', path))
+    
+def generate_config(deliveryinput, prepinput):
+    """ deliveryinput: path to delivery conf file (old format).
+        prepinput: path to the prep conf file.
+        Return XML Document object.
+    """
+    impl = getDOMImplementation()
+    doc = getDOMImplementation().createDocument(None, "virtualBuildArea", None)
+    vba = doc.getElementsByTagName("virtualBuildArea")[0]
+
+    # Loading delivery content
+    delivery = amara.parse(open(deliveryinput, 'r'))
+    # loading prep file
+    prep = amara.parse(open(prepinput, 'r'))
+    # analysing preparation creation
+    for source in prep.xml_xpath('/prepSpec/source'):
+        basedir = cleanup_path(source.basedir)
+        for copy in source.xml_xpath('./copy'):            
+            src = cleanup_path(copy.name)
+            for p in delivery.xml_xpath('/deliveryConfiguration/*'):
+                ccmp = ccm.FourPartName(p.project)                
+                p_dir = cleanup_path(p.dir)
+                #print "ccmp: %s" % ccmp
+                #print "pdir: %s" % p_dir
+                # looking for project_name/project_name pattern, and if dest doesn't exist
+                if (re.match(r"%s/%s" % (ccmp.name, ccmp.name), src, re.I) is not None) and not hasattr(copy, 'dest'):
+                    print "All object from root."
+                    add = doc.createElementNS("", "add")
+                    add.setAttributeNS("", "project", str(ccmp))                    
+                    vba.appendChild(add)
+                    objs = doc.createElementNS("", "objects")
+                    objs.setAttributeNS("", "from", ccmp.name)
+                    add.appendChild(objs)
+                # looking for project_name/project_name pattern, and if dest exists
+                elif (re.match(r"%s/%s" % (ccmp.name, ccmp.name), src, re.I) is not None) and hasattr(copy, 'dest'):
+                    if os.path.basename(copy.dest).lower() == ccmp.name.lower():                        
+                        add = doc.createElementNS("", "add")
+                        add.setAttributeNS("", "project", str(ccmp))
+                        add.setAttributeNS("", "to", cleanup_path('/' + os.path.dirname(copy.dest)))
+                        vba.appendChild(add)
+                    else:                        
+                        add = doc.createElementNS("", "add")
+                        add.setAttributeNS("", "project", str(ccmp))
+                        add.setAttributeNS("", "to", cleanup_path('/' + copy.dest))
+                        vba.appendChild(add)
+                # for directory copy
+                elif cleanup_path(basedir + "/" + src) == p_dir:
+                    print "Adding to subdirectory"
+                    print ccmp.name, basedir + "/" + src, p_dir
+                    add = doc.createElementNS("", "add")
+                    add.setAttributeNS("", "project", str(ccmp))                
+                    if hasattr(copy, 'dest'):
+                        add.setAttributeNS("", "to", cleanup_path('/' + copy.dest + '/' + ccmp.name))
+                    else:
+                        add.setAttributeNS("", "to", cleanup_path('/'+ ccmp.name))
+                    vba.appendChild(add)
+                elif p_dir.startswith(cleanup_path(basedir + "/" + src + '/')):
+                    print "Adding to subdirectory"
+                    delta = p_dir[len(cleanup_path(basedir)):]
+                    add = doc.createElementNS("", "add")                    
+                    add.setAttributeNS("", "project", str(ccmp))
+                    if hasattr(copy, 'dest'):
+                        add.setAttributeNS("", "to", cleanup_path('/' + os.path.dirname(copy.dest) + '/' + delta + '/' + ccmp.name))
+                    else:
+                        add.setAttributeNS("", "to", cleanup_path(delta + '/' + ccmp.name))
+                    vba.appendChild(add)                        
+    return doc
+
+
+
+class AbstractConfigConverter:
+
+    def __init__(self):
+        pass
+    
+    def _get_projects_configs(self):
+        raise Exception("Todo: not implemented.")
+
+    def _get_prep_configs(self):
+        raise Exception("Todo: not implemented.")
+    
+    def generate_config(self):
+        """ deliveryinput: path to delivery conf file (old format).
+            prepinput: path to the prep conf file.
+            Return XML Document object.
+        """
+        impl = getDOMImplementation()
+        doc = getDOMImplementation().createDocument(None, "virtualBuildArea", None)
+        vba = doc.getElementsByTagName("virtualBuildArea")[0]
+    
+        # analysing preparation creation
+        for copy in self._get_prep_configs():
+            basedir = cleanup_path(copy.basedir)
+            src = cleanup_path(copy.name)
+            for p in self._get_projects_configs():
+                ccmp = ccm.FourPartName(p.project)                
+                p_dir = cleanup_path(p.dir)
+                #print "ccmp: %s" % ccmp
+                #print "pdir: %s" % p_dir
+                # looking for project_name/project_name pattern, and if dest doesn't exist
+                if (re.match(r"%s/%s" % (ccmp.name, ccmp.name), src, re.I) is not None) and not hasattr(copy, 'dest'):
+                    print "All object from root."
+                    add = doc.createElementNS("", "add")
+                    add.setAttributeNS("", "project", str(ccmp))                    
+                    vba.appendChild(add)
+                    objs = doc.createElementNS("", "objects")
+                    objs.setAttributeNS("", "from", ccmp.name)
+                    add.appendChild(objs)
+                # looking for project_name/project_name pattern, and if dest exists
+                elif (re.match(r"%s/%s" % (ccmp.name, ccmp.name), src, re.I) is not None) and hasattr(copy, 'dest'):
+                    if os.path.basename(copy.dest).lower() == ccmp.name.lower():                        
+                        add = doc.createElementNS("", "add")
+                        add.setAttributeNS("", "project", str(ccmp))
+                        add.setAttributeNS("", "to", cleanup_path('/' + os.path.dirname(copy.dest)))
+                        vba.appendChild(add)
+                    else:                        
+                        add = doc.createElementNS("", "add")
+                        add.setAttributeNS("", "project", str(ccmp))
+                        add.setAttributeNS("", "to", cleanup_path('/' + copy.dest))
+                        vba.appendChild(add)
+                # for directory copy
+                elif cleanup_path(basedir + "/" + src) == p_dir:
+                    print "Adding to subdirectory"
+                    print ccmp.name, basedir + "/" + src, p_dir
+                    add = doc.createElementNS("", "add")
+                    add.setAttributeNS("", "project", str(ccmp))                
+                    if hasattr(copy, 'dest'):
+                        add.setAttributeNS("", "to", cleanup_path('/' + copy.dest + '/' + ccmp.name))
+                    else:
+                        add.setAttributeNS("", "to", cleanup_path('/'+ ccmp.name))
+                    vba.appendChild(add)
+                elif p_dir.startswith(cleanup_path(basedir + "/" + src + '/')):
+                    print "Adding to subdirectory"
+                    delta = p_dir[len(cleanup_path(basedir)):]
+                    add = doc.createElementNS("", "add")                    
+                    add.setAttributeNS("", "project", str(ccmp))
+                    if hasattr(copy, 'dest'):
+                        add.setAttributeNS("", "to", cleanup_path('/' + os.path.dirname(copy.dest) + '/' + delta + '/' + ccmp.name))
+                    else:
+                        add.setAttributeNS("", "to", cleanup_path(delta + '/' + ccmp.name))
+                    vba.appendChild(add)                        
+        return doc
+
+
+class ConfigConverter(AbstractConfigConverter):
+    def __init__(self, deliveryinput, prepinput):
+        AbstractConfigConverter.__init__(self)
+        self._deliveryinput = deliveryinput
+        self._prepinput = prepinput
+    
+    def _get_projects_configs(self):
+        # Loading delivery content
+        delivery = amara.parse(open(self._deliveryinput, 'r'))
+        return delivery.xml_xpath('/deliveryConfiguration/*')
+
+    def _get_prep_configs(self):
+        # loading prep file        
+        prep = amara.parse(open(self._prepinput, 'r'))
+        class __ConfigWrapper:
+            """ wrapper object to access directly conf property. """
+            def __init__(self, source, config):
+                self.basedir = source.basedir
+                self.name = config.name
+                if hasattr(copy, 'dest'):
+                    self.dest = copy.dest
+        
+        result = []
+        for source in prep.xml_xpath('/prepSpec/source'):
+            for copy in source.xml_xpath('./copy'):
+                result.append(__ConfigWrapper(source, copy))
+        return result
+
+
+class ConfigConverterNewDelivery(ConfigConverter):
+    def __init__(self, deliveryinput, prepinput):
+        ConfigConverter.__init__(self, deliveryinput, prepinput)
+        configBuilder = configuration.NestedConfigurationBuilder(open(self._deliveryinput, 'r'))
+        self.__configs = configBuilder.getConfiguration().getConfigurations()
+    
+    def _get_projects_configs(self):
+        class __ConfigWrapper:
+            """ wrapper object to access directly conf property. """
+            def __init__(self, config):
+                self.project = config.name
+                self.dir = config['dir']
+        # Loading delivery content
+        return map(lambda c: __ConfigWrapper(c), self.__configs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/vbaconf/new_delivery.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,110 @@
+#============================================================================ 
+#Name        : new_delivery.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper to convert delivery.xml and prep.xml to VirtualBuildArea
+    configuration file.
+"""
+from  xml.dom.minidom import getDOMImplementation
+import amara
+import ccm
+import re
+import os.path
+import sys
+import configuration
+
+def cleanup_path(path):
+    """ Returns path without any sequence of '/' and replacing '\' by '/' """
+    return re.sub(r'/+', '/', re.sub(r'\\', '/', path))
+
+class config_wrapper:
+    """ wrapper object to access directly conf property. """
+    def __init__(self, config):
+        self.project = config.name
+        self.dir = config['dir']
+
+def generate_config(deliveryinput, prepinput):
+    """ deliveryinput: path to delivery conf file (old format).
+        prepinput: path to the prep conf file.
+        Return XML Document object.
+    """
+    impl = getDOMImplementation()
+    doc = getDOMImplementation().createDocument(None, "virtualBuildArea", None)
+    vba = doc.getElementsByTagName("virtualBuildArea")[0]
+
+    # Loading delivery content
+    configBuilder = configuration.NestedConfigurationBuilder(open(deliveryinput, 'r'))
+    deliveryConfigs = configBuilder.getConfiguration().getConfigurations()
+
+    # loading prep file
+    prep = amara.parse(open(prepinput, 'r'))
+    # analysing preparation creation
+    for source in prep.xml_xpath('/prepSpec/source'):
+        basedir = cleanup_path(source.basedir)
+        for copy in source.xml_xpath('./copy'):            
+            src = cleanup_path(copy.name)
+            for config in deliveryConfigs:
+                p = config_wrapper(config)
+                ccmp = ccm.FourPartName(p.project)                
+                p_dir = cleanup_path(p.dir)
+                #print "ccmp: %s" % ccmp
+                #print "pdir: %s" % p_dir
+                # looking for project_name/project_name pattern, and if dest doesn't exist
+                if (re.match(r"%s/%s" % (ccmp.name, ccmp.name), src, re.I) is not None) and not hasattr(copy, 'dest'):
+                    print "All object from root."
+                    add = doc.createElementNS("", "add")
+                    add.setAttributeNS("", "project", str(ccmp))                    
+                    vba.appendChild(add)
+                    objs = doc.createElementNS("", "objects")
+                    objs.setAttributeNS("", "from", ccmp.name)
+                    add.appendChild(objs)
+                # looking for project_name/project_name pattern, and if dest exists
+                elif (re.match(r"%s/%s" % (ccmp.name, ccmp.name), src, re.I) is not None) and hasattr(copy, 'dest'):
+                    if os.path.basename(copy.dest).lower() == ccmp.name.lower():                        
+                        add = doc.createElementNS("", "add")
+                        add.setAttributeNS("", "project", str(ccmp))
+                        add.setAttributeNS("", "to", cleanup_path('/' + os.path.dirname(copy.dest)))
+                        vba.appendChild(add)
+                    else:                        
+                        add = doc.createElementNS("", "add")
+                        add.setAttributeNS("", "project", str(ccmp))
+                        add.setAttributeNS("", "to", cleanup_path('/' + copy.dest))
+                        vba.appendChild(add)
+                # for directory copy
+                elif cleanup_path(basedir + "/" + src) == p_dir:
+                    print "Adding to subdirectory"
+                    print ccmp.name, basedir + "/" + src, p_dir
+                    add = doc.createElementNS("", "add")
+                    add.setAttributeNS("", "project", str(ccmp))                
+                    if hasattr(copy, 'dest'):
+                        add.setAttributeNS("", "to", cleanup_path('/' + copy.dest + '/' + ccmp.name))
+                    else:
+                        add.setAttributeNS("", "to", cleanup_path('/'+ ccmp.name))
+                    vba.appendChild(add)
+                elif p_dir.startswith(cleanup_path(basedir + "/" + src + '/')):
+                    print "Adding to subdirectory"
+                    delta = p_dir[len(cleanup_path(basedir)):]
+                    add = doc.createElementNS("", "add")                    
+                    add.setAttributeNS("", "project", str(ccmp))
+                    if hasattr(copy, 'dest'):
+                        add.setAttributeNS("", "to", cleanup_path('/' + os.path.dirname(copy.dest) + '/' + delta + '/' + ccmp.name))
+                    else:
+                        add.setAttributeNS("", "to", cleanup_path(delta + '/' + ccmp.name))
+                    vba.appendChild(add)                        
+    return doc
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/version.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,87 @@
+#============================================================================ 
+#Name        : version.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" S60 Version Management module.
+
+::
+
+    config = {'model.name': 'NXX',
+              'variant.id': '01',
+              'variant.revision' : '0',
+              'model.template': '${model.name} (${variant.id}.${variant.revision})'}
+    v = Version('model',config)
+    print v.version_string()
+
+"""
+
+from datetime import date
+import codecs
+import os
+import re
+
+class Version:
+    """ Version template.
+    """
+    def __init__(self, vtype, config):
+        """ Initialise the Version object.
+        """
+        self.vtype = vtype
+        self.config = config
+        today = date.today().strftime( "%d-%m-%y" )
+        self.config['today'] = today
+  
+    def version_string( self ):
+        """ Returns the formatted version string.
+        """
+        # Insert the attributes of this object into the format string
+        # Make all Ant-like substitution match the Python format for string substitution
+        return self.__unescape(self.config["%s.template" % self.vtype])
+
+    def write(self):
+        """ Write the version string to the vtype.txt.path file.
+        """
+        self.__write(self.__unescape(self.config["%s.txt.path" % self.vtype]), self.version_string())
+
+    def __write( self, path, content ):
+        print 'Writing version file: ' + path
+        #print 'Content: ' + content
+        if os.path.exists( path ):
+            os.remove( path )
+        newfile = open( path, 'w+' )
+        newfile.write( codecs.BOM_UTF16_LE )
+        newfile.close()
+        vout = codecs.open( path, 'a', 'utf-16-le' )
+        vout.write( unicode( content ) )
+        vout.close()
+
+    
+    def __unescape(self, text):
+        previous = u''
+        while previous != text:
+            previous = text
+            text = re.sub(r'\${(?P<name>[._a-zA-Z0-9]+)}', r'%(\g<name>)s', text)
+            text = text % self.config
+        return text
+        
+
+    def __str__(self):
+        """ The string representation of the version object is the full version string.
+        """
+        return self.version_string()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/virtualbuildarea.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,194 @@
+#============================================================================ 
+#Name        : virtualbuildarea.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+This modules helps to recreate a fake synergy project for the 
+ccm toolkit. The fake project can be composed of any real synergy 
+objects. 
+"""
+
+
+# pylint: disable-msg=E1103
+
+
+import ccm
+import xml.dom.minidom
+import traceback
+import sys
+DEBUG_VIRTUALDIR = True
+
+class VirtualDir(ccm.Dir):
+    """ Fake directory object.
+        The four parts name will be: <dirname>-1:dir:fakedb#1
+    """
+    def __init__(self, session, name, project):
+        fpn = "%s-1:dir:fakedb#1" % name
+        ccm.Dir.__init__(self, session, fpn)
+        self.__data = []
+        self._project = project
+        
+    def addChild(self, o, project):
+        """ Add an object to the directory. """
+        if (o.type == 'dir'):
+            if DEBUG_VIRTUALDIR:
+                print "Dir adding %s to %s" % (o, self)
+            vdir = self.getDirNamed(o.name)            
+            if vdir == None:
+                # Adding a directory, convert it into a virtual one
+                if DEBUG_VIRTUALDIR:
+                    print "Dir not found creating a virtual one"
+                vdir = VirtualDir(self._session, o.name, self._project)
+                self.__data.append(vdir)
+            elif vdir.type == 'project':
+                # this is a project, covert it into a directory
+                self.__data.remove(vdir)
+                self.addChild(vdir.root_dir(), vdir)
+                vdir = self.getDirNamed(o.name)
+                
+            # Adding content of the directory into the virtual one
+            for child in o.children(project):
+                vdir.addChild(child, project)
+        elif (o.type == 'project'):
+            # Adding a project
+            if DEBUG_VIRTUALDIR:
+                print "Project adding %s to %s" % (o, self)
+            # check for directory with the same name first            
+            vdir = self.getDirNamed(o.name)
+            if vdir == None:
+                # if it is new, just add it 
+                if DEBUG_VIRTUALDIR:
+                    print "Adding project directly"
+                self.__data.append(o)
+            else:
+                if vdir.type == 'project':
+                    if DEBUG_VIRTUALDIR:
+                        print "Replacing project by dir %s" % vdir
+                    self.__data.remove(vdir)
+                    self.addChild(vdir.root_dir(), vdir)
+                    vdir = self.getDirNamed(o.name)                    
+                # if a directory already exist grab the content
+                if DEBUG_VIRTUALDIR:
+                    print "Adding childs under %s" % vdir
+                for child in o.root_dir().children(o):
+                    vdir.addChild(child, o)
+        else:
+            self.__data.append(o)
+            
+    def getDirNamed(self, name):
+        """ Look for a subdirectory named in its children.
+        The test is done in a case insensitive way.
+        """
+        for o in self.__data:
+            if (o.name.lower() == name.lower()):
+                return o
+        return None
+    
+    def children(self, project):
+        """ Returns a copy of the children list. """
+        return self.__data[:]
+    
+    def virtualproject(self):
+        """ Return the associated virtual project. """
+        return self._project
+    
+    
+class VirtualProject(ccm.Project):
+    """ Create a fake project containing on fake directory.
+    The four part name will be <projectname>-1:project:fakedb#1.
+    """
+    def __init__(self, session, name):
+        fpn = "%s-1:project:fakedb#1" % name
+        ccm.Project.__init__(self, session, fpn)
+        self._root_dir = VirtualDir(session, name, self)
+    
+    def root_dir(self):
+        """ Returns the associated virtual directory object. """
+        return self._root_dir
+
+
+def __removeEmptyStrings(a):
+    o = []
+    for e in a:
+        if (len(e)>0):
+            o.append(e)
+    return o
+
+def __createVirtualPath(vpath, root):
+    """ Creating a directory structure using the vpath list given as input.    
+    """
+    vpath = __removeEmptyStrings(vpath)
+    if (root.type == 'project'):
+        root = root.root_dir()
+    if (len(vpath) == 0):
+        return root
+    else:
+        name = vpath.pop(0)
+        root.addChild(VirtualDir(root.session, name, root.virtualproject()), root.virtualproject())
+        return __createVirtualPath(vpath, root.getDirNamed(name))
+
+def __getObjects(project, spath, dir=None):
+    name = spath.pop(0)
+    if (len(spath) == 0 and dir == None):
+        result = []
+        for o in project.root_dir().children(project):
+            result.append({'project':project, 'object':o})
+        return result
+    
+    if (dir == None):
+        root_dir = project.root_dir()
+        if (root_dir.name.lower() == name.lower()):
+            return __getObjects(project, spath, root_dir)
+        else:
+            Exception("getObjects: root_dir.name(%s)!=name(%s)" % (root_dir.name, name))
+    else:
+        for d in dir.children(project):
+            if d.type == 'dir' and d.name.lower() == name.lower():
+                return __getObjects(project, spath, d)
+        raise Exception("Could not find object %s" % name)
+                
+
+
+def create(session, file, name = "vba"):
+    """ Creates a virtual toplevel project using the XML configuration. """
+    try:
+        dom = xml.dom.minidom.parse(file)
+        #dom = xml.dom.minidom.parseString(input)
+
+        vba = VirtualProject(session, name)
+        virtualBA = dom.documentElement
+        for child in virtualBA.childNodes:
+            if (child.nodeType == xml.dom.Node.ELEMENT_NODE) and (child.nodeName == 'add'):
+                print "add node :%s (%d)" % (child.getAttribute('project'), len(child.childNodes))
+                pathobject = __createVirtualPath(child.getAttribute('to').split('/'), vba)
+                if len(child.childNodes) == 0:
+                    p = session.create(child.getAttribute('project'))
+                    pathobject.addChild(p, p)
+                else:
+                    project = session.create(child.getAttribute('project'))
+                    for subChild in child.childNodes:
+                        if (subChild.nodeType == xml.dom.Node.ELEMENT_NODE) and (subChild.nodeName == 'objects'):
+                            spath = __removeEmptyStrings(subChild.getAttribute('from').split('/'))
+                            for t in __getObjects(project, spath):
+                                pathobject.addChild(t['object'], t['project'])
+        virtualBA.unlink()
+        return vba
+    except Exception, e:
+        traceback.print_exc(file = sys.stdout)
+        raise Exception("XML cannot be parsed properly %s" % e)
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/xmlhelper.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+#============================================================================ 
+#Name        : xmlhelper.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import re
+from xml.dom import Node
+
+def node_scan(node, name):
+    """
+        Replacement function for node.xml_xpath('./name').
+        name is a regular expression.
+    """
+    results = []
+    for subnode in node.childNodes:
+        if subnode.nodeType == Node.ELEMENT_NODE and re.match(name, subnode.nodeName) is not None:
+            results.append(subnode)
+    return results
+
+def recursive_node_scan(node, name):
+    """
+        Replacement function for node.xml_xpath('.//name').
+        name is a regular expression.
+    """
+    results = node_scan(node, name)
+    for subnode in node.childNodes:        
+        results.extend(recursive_node_scan(subnode, name))
+    return results
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/filter_heliumlog.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+#============================================================================ 
+#Name        : filter_heliumlog.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import sys
+import raptor
+import filter_interface
+import re
+import xml.sax
+import datetime
+import time
+from xml.sax.handler import ContentHandler
+from xml.dom.minidom import parse, parseString
+from xml.sax.saxutils import XMLGenerator
+from xml.sax.xmlreader import AttributesNSImpl
+import codecs
+from sbsscanlog import SBSScanlog
+from optparse import OptionParser
+
+
+
+
+""" Log scanner for filter logs
+"""
+class FilterHeliumLog(filter_interface.Filter):
+
+    def open(self, raptor_instance):
+        """Open a log file for the various I/O methods to write to."""
+        self.raptor = raptor_instance
+        self.logFileName = self.raptor.logFileName
+        self.scanlog = SBSScanlog()
+
+        # insert the time into the log file name
+        if self.logFileName:
+            self.logFileName.path = self.logFileName.path.replace("%TIME",
+                    self.raptor.timestring)
+    
+            try:
+                dirname = str(self.raptor.logFileName.Dir())
+                if dirname and not os.path.isdir(dirname):
+                    os.makedirs(dirname)
+            except Exception, e:
+                return False
+            return  self.scanlog.initialize(self.logFileName)
+        else:
+            self.out = sys.stdout
+                
+        return True
+
+    def write(self, text):
+        return self.scanlog.write(text)
+
+    def summary(self):
+        return self.scanlog.summary()
+
+    def close(self):
+        return self.scanlog.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/filter_metadatalog.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+#============================================================================ 
+#Name        : filter_heliumlog.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import sys
+import raptor
+import filter_interface
+import re
+import xml.sax
+import datetime
+import time
+from xml.sax.handler import ContentHandler
+from xml.dom.minidom import parse, parseString
+from xml.sax.saxutils import XMLGenerator
+from xml.sax.xmlreader import AttributesNSImpl
+import codecs
+from sbsscanlogmetadata import SBSScanlogMetadata
+from optparse import OptionParser
+
+
+
+
+""" Log scanner for filter logs
+"""
+class FilterMetadataLog(filter_interface.Filter):
+
+    def open(self, raptor_instance):
+        """Open a log file for the various I/O methods to write to."""
+        self.raptor = raptor_instance
+        self.logFileName = self.raptor.logFileName
+        self.scanlog = SBSScanlogMetadata()
+
+        # insert the time into the log file name
+        if self.logFileName:
+            self.logFileName.path = self.logFileName.path.replace("%TIME",
+                    self.raptor.timestring)
+    
+            try:
+                dirname = str(self.raptor.logFileName.Dir())
+                if dirname and not os.path.isdir(dirname):
+                    os.makedirs(dirname)
+            except Exception, e:
+                return False
+            return  self.scanlog.initialize(self.logFileName)
+        else:
+            self.out = sys.stdout
+                
+        return True
+
+    def write(self, text):
+        return self.scanlog.write(text)
+
+    def summary(self):
+        return self.scanlog.summary()
+
+    def close(self):
+        return self.scanlog.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/sbslogscanner.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,300 @@
+#============================================================================ 
+#Name        : sbs2logxml.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Temporary solution to extract raptor logs.
+Should be replace by a log listenner when raptor will support it.
+"""
+import xml.sax
+import xml.sax.handler
+import xml.dom.minidom
+import re
+import codecs
+import os
+import sys
+from optparse import OptionParser
+
+
+DEFAULT_CONFIGURATION = {"FATAL": [r"mingw_make.exe"],
+                         "ERROR": [ r'\): Missing file:', r'^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:',
+                                   r"^MISSING:",
+                                   r"Error:\s+", r"'.+' is not recognized as an internal or external command",
+                                   r"FLEXlm error:",
+                                   r"(ABLD|BLDMAKE) ERROR:",
+                                   r"FATAL ERROR\(S\):",
+                                   r"fatal error U1077",
+                                   r"warning U4010",
+                                   r"^make(?:\[\d+\])?\: \*\*\*",
+                                   r"^make(?:\[\d+\])?:\s+.*\s+not\s+remade",
+                                   r"\"(.*)\", line (\d+): (Error: +(.\d+.*?):.*)$",
+                                   r"error: ((Internal fault):.*)$",
+                                   r"Exception: [A-Z0-9_]+",
+                                   r"target .* given more than once in the same rule",
+                                   r"^ERROR:",
+                                   r"^ERROR EC\d+:",
+                                   r"^ERROR\t",],
+                         "CRITICAL": [r"[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049)"],
+                         "WARNING": [r'^(\d+\))?\s*WARNING:', r'^MAKEDEF WARNING:',
+                                      r'line \d+: Warning:', r':\s+warning\s+\w+:',
+                                      r"\\\\(.*?)\(\d+\)\s:\sWarning:\s\(\d+\)",
+                                      r"^(BLDMAKE |MAKEDEF )?WARNING:",
+                                      r"WARNING\(S\)",
+                                      r"\(\d+\) : warning C",
+                                      r"LINK : warning",
+                                      r":\d+: warning:",
+                                      r"\"(.*)\", line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)$",
+                                      r"Usage Warning:",
+                                      r"mwld.exe:",
+                                      r"^Command line warning",
+                                      r"ERROR: bad relocation:",
+                                      r"^(\d+) warning",
+                                      r"EventType:\s+Error\s+Source:\s+SweepNT",
+                                      r"^WARN\t",
+                                      ],
+                        "REMARK": [r"Command line warning D4025 : ",
+                                   r"^REMARK: ",
+                                   r"^EventType:\s+Error\s+Source:\s+GNU\s+Make",
+                                   r":\d+: warning: cannot find matching deallocation function",
+                                   r"((:\d+)*: note: )",
+                                   ],
+                        "INFO": [r"^INFO:"]
+                        }
+
+
+def find_priority(line, config):
+    keys = config.keys()
+    keys.reverse()    
+    for category in keys:
+        for rule in config[category]:
+            if rule.search(line) != None:
+                return category.lower()
+    return "stdout"
+
+
+class SymbianLogHandler(xml.sax.handler.ContentHandler):
+    def __init__ (self):
+        xml.sax.handler.ContentHandler.__init__(self)
+        self._in_recipe = False
+        self._in_error = False
+        self._in_warning = False
+        self._recipe_status = None
+        self._recipe_log = ""
+        self._recipe_component = None
+        self.errors = []
+        self.warnings = []
+        self.components = {}
+        self.scan_config = {}
+        for category in DEFAULT_CONFIGURATION.keys():
+            self.scan_config[category] = []
+            for rule in DEFAULT_CONFIGURATION[category]:
+                self.scan_config[category].append(re.compile(rule))
+
+    
+    
+    def startElement(self, name, attrs):
+        if name == "recipe":
+            self._in_recipe = True
+            self._recipe_component = attrs.get('bldinf', None)
+            if self._recipe_component not in self.components:
+                self.components[self._recipe_component] = {}
+                for cat in self.scan_config.keys():
+                    self.components[self._recipe_component][cat.lower()] = []
+            self._recipe_log = ""
+            self._recipe_status = None
+        elif name == "status" and self._in_recipe:
+            self._recipe_status = attrs.get('exit', 'ok')
+        elif name == "error":  
+            self._in_error = True
+            self._recipe_log = ""
+        elif name == "warning":  
+            self._in_warning = True
+            self._recipe_log = ""
+              
+    def endElement(self, name):
+        if name == "recipe":
+            for line in self._recipe_log.splitlines():
+                if not line.startswith('+ '):
+                    priority = find_priority(line, self.scan_config)
+                    if priority == "stdout":
+                        continue
+                    else:
+                        self.components[self._recipe_component][priority].append(line)
+            #if self._recipe_status == 'failed':
+            #    self.components[self._recipe_component]['error'].append(self._recipe_log.strip())
+            self._in_recipe = False
+            self._recipe_log = ""
+            self._recipe_status = None
+            self._recipe_component = None
+        elif name == "error":
+            self.errors.append(self._recipe_log)  
+            self._in_error = False
+        elif name == "warning":
+            self.warnings.append(self._recipe_log)
+            self._in_warning = False
+      
+    def characters (self, ch):
+        if self._in_recipe or self._in_error or self._in_warning:
+            self._recipe_log += ch
+
+
+def create_logxml(components, logname, outname):
+    """
+    Converting the output to Helium log xml format.
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="K:\output\logs\ido_raptor_mcl_ipmsdo_MCL.52.61.s60_build_compile.log">
+    <build>
+        <task name="all">
+            <message priority="warning"><![CDATA[E:/apps/sbs_2.2.0/win32/mingw/bin/cpp.exe: K:/s60/mw/ipappservices/rtp/rtpstack/group/RtpStpPacket.mmp:43:7: warning: extra tokens at end of #else directive]]></message>
+    """
+    impl = xml.dom.minidom.getDOMImplementation()
+
+    xmllog = impl.createDocument(None, "log", None)
+    root = xmllog.documentElement
+    root.setAttribute('filename', logname)
+    build = xmllog.createElement('build')
+    root.appendChild(build)
+    
+    mtask = xmllog.createElement('task')
+    mtask.setAttribute('name', os.path.basename(logname))
+    build.appendChild(mtask)
+    
+    for cname in components.keys():
+        task = xmllog.createElement('task')
+        task.setAttribute('name', cname)
+        mtask.appendChild(task)
+        for category in components[cname].keys():
+            for msg in components[cname][category]:
+                msgnode = xmllog.createElement('message')
+                msgnode.setAttribute('priority', category)
+                msgnode.appendChild(xmllog.createCDATASection(msg))
+                task.appendChild(msgnode)
+
+    print "Writing %s" % outname
+    fh = codecs.open(outname, 'w+', 'UTF-8')
+    fh.write(xmllog.toprettyxml(encoding="UTF-8"))
+    fh.close()
+
+def create_scanlog(components, logname, outname):
+    """
+    Converting the output to Helium log html scanlog format.
+<table border="1" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+    <th width="55%">Component</th>
+    <th width="15%">Errors</th>
+    <th width="15%">Criticals</th>
+    <th width="15%">Warnings</th>
+    <th width="15%">Notes</th>
+</tr>
+    """
+
+    html = """<html>
+    <head><title>%s</title></head>
+    <body>
+    <h1>%s</h1>
+    <h2>By Component</h2>
+<table border="1" cellpadding="0" cellspacing="0" width="100%%">
+<tr>
+    <th width="55%%">Component</th>
+    <th width="15%%">Errors</th>
+    <th width="15%%">Criticals</th>
+    <th width="15%%">Warnings</th>
+    <th width="15%%">Notes</th>
+</tr>""" % (os.path.basename(logname), os.path.basename(logname))
+        
+    cid = 0
+    for cname in components.keys():
+        html += "<tr>"
+        html += "<td>%s</td>" % cname
+        def add_category(cat):
+            color = {'error': 'FF0000', 'critical': 'FF7000', 'warning': 'FFF000', 'remark': '0000FF', 'note': '000088'}
+            val = len(components[cname][cat])
+            if val > 0:
+                if cat == 'error':
+                    return "<td align=\"center\" bgcolor=\"%s\"><a href=\"#section%s\">%s</a></td>" % (color[cat], cid, val)
+                else:
+                    return "<td align=\"center\" bgcolor=\"%s\">%s</td>" % (color[cat], val)
+            return "<td align=\"center\">%s</td>" % val
+        html += add_category('error')     
+        html += add_category('critical')     
+        html += add_category('warning')     
+        html += add_category('remark')     
+        html += "</tr>"
+        cid += 1
+    html += "</table>"
+
+    cid = 0
+    html += "<h2>Error Details by Component</h2>"
+    for cname in components.keys():
+        html += "<h3><a name=\"section%s\">%s</a></h3>" % (cid, cname)
+        def add_dump(cat):
+            out = ""
+            for line in components[cname][cat]:
+                out += line + "<br/>"
+            return out
+        html += add_dump('error')
+        cid += 1
+        
+    html += """
+<body>
+</html>
+    """
+
+    print "Writing %s" % outname
+    fh = codecs.open(outname, 'w+', 'utf8')
+    fh.write(html.encode('utf8'))
+    fh.close()
+
+if __name__ == "__main__":
+
+    """ The application main. """
+    cli = OptionParser(usage="%prog [options]")
+    cli.add_option("--log", help="Raptor log file") 
+    cli.add_option("--logxml", help="Logxml output file.")
+    cli.add_option("--scanlog", help="HTML scanlog parsing")
+                   
+    opts, dummy_args = cli.parse_args()
+    if not opts.log:
+        cli.print_help()
+        sys.exit(-1)
+    
+    #logname = 'log/ido_raptor_mcl_ipmsdo_MCL.52.61.s60_build_compile.log'
+    parser = xml.sax.make_parser()   
+    handler = SymbianLogHandler()
+    parser.setContentHandler(handler)
+    parser.parse(open(opts.log, 'r')) 
+
+    # adding parsing issues
+    components = handler.components.copy()
+    components['raptor_parsing'] = {}
+    for category in DEFAULT_CONFIGURATION.keys():
+        components['raptor_parsing'][category.lower()] = []
+    components['raptor_parsing']['error'] = handler.errors
+    components['raptor_parsing']['warning'] = handler.warnings
+
+    print "Summary:"
+    print "%s\t%s%s%s%s" % ("Component".ljust(40), "Errors".ljust(10), "Criticals".ljust(10), "Warnings".ljust(10), "Remarks".ljust(10))
+    for cname in components.keys():
+        print "%s\t%s%s%s%s" % (cname.ljust(40), str(len(components[cname]['error'])).ljust(10),
+                                             str(len(components[cname]['critical'])).ljust(10),
+                                             str(len(components[cname]['warning'])).ljust(10),
+                                             str(len(components[cname]['remark'])).ljust(10))
+
+    if opts.logxml is not None:
+        create_logxml(components, opts.log, opts.logxml)
+    if opts.scanlog is not None:
+        create_scanlog(components, opts.log, opts.scanlog)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/sbsscanlog.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,413 @@
+#============================================================================ 
+#Name        : filter_heliumlog.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import sys
+import re
+import xml.sax
+import datetime
+import time
+from xml.sax.handler import ContentHandler
+from xml.dom.minidom import parse, parseString
+from xml.sax.saxutils import XMLGenerator
+from xml.sax.xmlreader import AttributesNSImpl
+import codecs
+from optparse import OptionParser
+
+START_TAG_REG_EX = "<recipe|<error|<warning"
+
+IGNORE_TEXT_REG_EX = "warning: no newline at end of file"
+
+DEFAULT_STRING = "general"
+
+END_TAG_REG_EX = "</recipe>|</error>|</warning>"
+
+DEFAULT_CONFIGURATION = {    "FATAL":     [r"mingw_make.exe"],
+                            "ERROR": [ r'\): Missing file:', r'^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:',
+                                        r"^MISSING:",
+                                        r"Error:\s+", r"'.+' is not recognized as an internal or external command",
+                                        r"FLEXlm error:",
+                                        r"(ABLD|BLDMAKE) ERROR:",
+                                        r"FATAL ERROR\(S\):",
+                                        r"fatal error U1077",
+                                        r"warning U4010",
+                                        r"^make(?:\[\d+\])?\: \*\*\*",
+                                        r"^make(?:\[\d+\])?:\s+.*\s+not\s+remade",
+                                        r"\"(.*)\", line (\d+): (Error: +(.\d+.*?):.*)$",
+                                        r"error: ((Internal fault):.*)$",
+                                        r"Exception: [A-Z0-9_]+",
+                                        r"target .* given more than once in the same rule",
+                                        r"^ERROR:",
+                                        r"^ERROR EC\d+:",
+                                        r"Errors caused tool to abort.",
+                                        r"^ERROR\t",],
+                         "CRITICAL": [r"[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049)"],
+                         "WARNING": [r'^(\d+\))?\s*WARNING:', r'^MAKEDEF WARNING:',
+                                        r'line \d+: Warning:', r':\s+warning\s+\w+:',
+                                        r"\\\\(.*?)\(\d+\)\s:\sWarning:\s\(\d+\)",
+                                        r"^(BLDMAKE |MAKEDEF )?WARNING:",
+                                        r"WARNING\(S\)",
+                                        r"\(\d+\) : warning C",
+                                        r"LINK : warning",
+                                        r":\d+: warning:",
+                                        r"\"(.*)\", line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)$",
+                                        r"Usage Warning:",
+                                        r"mwld.exe:",
+                                        r"^Command line warning",
+                                        r"ERROR: bad relocation:",
+                                        r"^(\d+) warning",
+                                        r"EventType:\s+Error\s+Source:\s+SweepNT",
+                                        r"^WARN\t",
+                                      ],
+                        "REMARK": [r"Command line warning D4025 : ",
+                                        r"^REMARK: ",
+                                        r"^EventType:\s+Error\s+Source:\s+GNU\s+Make",
+                                        r":\d+: warning: cannot find matching deallocation function",
+                                        r"((:\d+)*: note: )",
+                                   ],
+                        "INFO": [r"^INFO:"]
+                        }
+
+def find_priority(line, config):
+    """ finds the error prioroty of the given line of text"""
+    keys = config.keys()
+    keys.reverse()    
+    for category in keys:
+        for rule in config[category]:
+            if rule.search(line) != None:
+                return category.lower()
+    return "stdout"
+
+def getText(nodelist):
+    rc = ""
+    for node in nodelist:
+        if node.nodeType == node.TEXT_NODE:
+            rc = rc + node.data
+    return rc
+
+class SBSScanlog():
+    def initialize(self, logFile):
+        """Initialize helium log filter"""
+    #try:
+        self.scan_config = {}
+        self.component_level_messages = {}
+        self.error_level_counts = {}
+        self.inReceipe = False
+        self.logContents = ""
+        self.logFileName = logFile
+        self.startTagCompileObject = re.compile(START_TAG_REG_EX);
+        self.endTagCompileObject = re.compile(END_TAG_REG_EX);
+        self.ignoreTextCompileObject = re.compile(IGNORE_TEXT_REG_EX);
+        self.startRecording = False
+        self.inReceipe = False
+        self.logContents = ""
+        self.lineNumber = 0
+        self.startLineNumber = 0
+        self.start_time = datetime.datetime.now()
+        for category in DEFAULT_CONFIGURATION.keys():
+            self.scan_config[category] = []
+            self.error_level_counts[category.lower()] = 0
+
+            for rule in DEFAULT_CONFIGURATION[category]:
+                self.scan_config[category].append(re.compile(rule))
+                
+        self.logName = str(self.logFileName) + ".xml"
+        self.loggerout = open(str(self.logFileName),"w")
+        print "logName: %s\n" % self.logName
+        #self.out = open(str(self.logFileName), "w")
+        self.outxml = open(self.logName, "w")
+        self.scanlogName = str(self.logFileName) +".scan2.html"
+        self.logger = XMLGenerator(self.outxml, 'utf-8')
+        self.logger.startDocument()
+        empty_attrs = AttributesNSImpl({}, {})
+        filename_attrs = {
+            (None, u'filename'): str(self.logFileName) ,
+        }
+        filename_qnames = {
+            (None, u'filename'): u'filename',
+        }
+        attrs = AttributesNSImpl(filename_attrs, filename_qnames)
+        self.logger.startElementNS((None, u'log'), u'log', attrs)
+        self.logger.characters("\n")
+        self.logger.startElementNS((None, u'build'), u'build', empty_attrs)
+        self.logger.characters("\n")
+        return True
+    #except:
+        #self.out = None
+        #sys.stderr.write("%s : error: cannot write log %s\n" %\
+        #    (str(raptor.name), self.logFileName.GetShellPath()))
+        #return False
+
+    def open(self, logFile):
+        self.logFileName = logFile
+        self.initialize(logFile)
+        
+        
+    def write(self, text):
+        """ callback function which is to process the logs"""
+        for textLine in text.splitlines():
+            if(self.ignoreTextCompileObject.search(textLine)):
+                continue
+
+            self.lineNumber += 1
+            if(self.startTagCompileObject.search(textLine) != None):
+                self.logContents = ""
+                self.startRecording = True
+                self.startLineNumber =  self.lineNumber
+    
+            if(self.endTagCompileObject.search(textLine)!= None):
+                self.logContents += textLine + "\n"
+                self.startRecording = False
+                try:
+                    self.parseContents()
+                except:
+                    print " error during helium log parsing"
+                    print self.logContents
+                
+            self.loggerout.write(textLine + "\n")
+            if self.startRecording:
+                self.logContents += textLine + "\n"
+            else:
+                error_level = find_priority(textLine, self.scan_config)
+                if(error_level != 'stdout'):
+                    if DEFAULT_STRING not in self.component_level_messages:
+                        self.component_level_messages[DEFAULT_STRING] = {}
+                        for error_level in self.scan_config.keys():
+                            self.component_level_messages[DEFAULT_STRING][error_level.lower()] = []
+                    self.component_level_messages[DEFAULT_STRING][error_level.lower()].append("%s : line-number: %d " % 
+                        (textLine, self.lineNumber))
+                    self.error_level_counts[error_level.lower()] +=1
+        return True
+
+    def parseContents(self):
+        """ Parse the contents within the tag, check if the errors within the tag is 
+        matching the error list, using minidom.
+        """        
+        doc = parseString((self.logContents))
+        for node in doc.childNodes:
+            if (node.nodeType == node.ELEMENT_NODE):
+                if(node.tagName == "recipe"):
+                    component_name = node.getAttribute("bldinf")
+                    self.process_output(component_name)
+                elif(node.tagName == "warning" or node.tagName == "error"):
+                    self.error_level_counts[node.tagName] += 1
+                    if DEFAULT_STRING not in self.component_level_messages:
+                        self.component_level_messages[DEFAULT_STRING] = {}
+                        for error_level in self.scan_config.keys():
+                            self.component_level_messages[DEFAULT_STRING][error_level.lower()] = []
+                    self.component_level_messages[DEFAULT_STRING][str(node.tagName.lower())].append(
+                    "%s : line-number: %d" % 
+                    (getText(node.childNodes), self.lineNumber))
+                    
+
+    def writeToXMLFile(self):
+        """ Writes the log output to diamonds understandable xml format."""
+        try:
+            components_size = (len(self.component_level_messages.keys()))
+            if(components_size > 0):
+                for component_name in self.component_level_messages.keys():
+                    name_attr = {
+                        (None, u'name'): component_name,
+                    }
+                    name_attr_qnames = {
+                        (None, u'name'): u'name',
+                    }
+                    name_attrs = AttributesNSImpl(name_attr, name_attr_qnames)
+                    self.logger.startElementNS((None, u'task'), u'task', name_attrs)
+                    for err_level in self.component_level_messages[component_name].keys():
+                        message_attr = {
+                        (None, u'priority'): err_level,
+                        }
+                        message_attr_qnames = {
+                            (None, u'priority'): u'priority',
+                        }
+                        for err in self.component_level_messages[component_name][err_level.lower()]:
+                            message_attrs = AttributesNSImpl(message_attr, message_attr_qnames)
+                            self.logger.characters("\n")
+                            self.logger.characters("  ")
+                            self.logger.startElementNS((None, u'message'), u'message', message_attrs)
+                            self.logger.characters(err)
+                            self.logger.endElementNS((None, u'message'), u'message')
+                            #self.out.write(err)
+    
+                    self.logger.characters("\n")
+                    self.logger.endElementNS((None, u'task'), u'task')
+                    self.logger.characters("\n")
+        
+        except:
+            print " error during writing log xml"
+                
+        
+    def process_output(self, component_name):
+        """ Process the log output for errors and stores it in dictionary"""    
+        #self.component_level_messages.clear()
+        count = 0
+        for line in self.logContents.splitlines():
+            error_level = find_priority(line, self.scan_config)
+            if component_name not in self.component_level_messages:
+                self.component_level_messages[component_name] = {}
+                for error_level in self.scan_config.keys():
+                    self.component_level_messages[component_name][error_level.lower()] = []
+            if(error_level != 'stdout'):
+                if(error_level not in self.component_level_messages[component_name]):
+                    self.component_level_messages[component_name][error_level.lower()] = []
+                self.component_level_messages[component_name][error_level.lower()].append(
+                "%s : line-number: %d" % 
+                    ((line, self.startLineNumber + count)))
+                self.error_level_counts[error_level.lower()] +=1
+            count += 1
+
+    def summary(self):
+        """Writes finally the logs in xml format using SAX and creates the scanlog"""
+        self.writeToXMLFile()
+        self.end_time = datetime.datetime.now()
+        total_time = self.end_time - self.start_time
+        create_scanlog(self.component_level_messages, self.logName, self.scanlogName, 
+            self.error_level_counts,total_time)
+        return True
+
+    def close(self):
+        """Close the log file"""
+
+        try:
+            self.logger.endElementNS((None, u'build'), u'build')
+            self.logger.endElementNS((None, u'log'), u'log')
+            #self.logger.close()
+            self.loggerout.close()
+            self.outxml.close()
+            #self.scanlogName.close()
+            return True
+        except:
+            return False
+
+def create_scanlog(components_level_messages, logname, outname, error_level_counts, total_time):
+    """
+    Converting the output to Helium log html scanlog format.
+    """
+
+    fh = codecs.open(outname, 'w+', 'utf8')
+    html = """<html>
+    <head><title>%s</title></head>
+    <body>
+    <h2>Overall</h2>
+    <table border="1" cellpadding="0" cellspacing="0" width="100%%">
+    <tr>
+        <th width="22%%">&nbsp;</th>
+        <th width="12%%">Time</th>
+        <th width="12%%">Errors</th>
+        <th width="12%%">Warnings</th>
+        <th width="12%%">Critical</th>
+        <th width="30%%">Migration Notes</th>
+    </tr>
+    <tr>""" % ( os.path.basename(logname))
+    html += "<td width=\"22%%\">Total</td>"
+    html += "<td width=\"12%%\" align=\"center\">%s</td>" % time.strftime("%H:%M:%S", time.gmtime(total_time.seconds))
+    def add_err_count(error_level, count):
+        color = {'error': 'FF0000', 'warning': 'FFF000', 'critical': 'FF7000', 'remark': '0000FF', 'info': 'FFFFFF'}
+        if error_level.lower() in color:
+            if count > 0:
+                if error_level == 'error':
+                    return "<td width=\"12%%\" align=\"center\" bgcolor=\"%s\">%d</td>" % (color[error_level], count)
+                else:
+                    return "<td align=\"center\" bgcolor=\"%s\">%d</td>" % (color[error_level], count)
+            return "<td align=\"center\">%s</td>" % count
+    html += add_err_count('error', error_level_counts['error'] )
+    html += add_err_count('warning', error_level_counts['warning'])
+    html += add_err_count('critical', error_level_counts['critical'])
+    html += add_err_count('info', error_level_counts['info'])
+    html += """</tr></table>
+    <h1>%s</h1>
+    <h2>By Component</h2>
+        <table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%%\">
+            <tr>
+                <th width=\"55%%\">Component</th>
+                <th width=\"15%%\">Errors</th>
+                <th width=\"15%%\">Warnings</th>
+                <th width=\"15%%\">Criticals</th>
+                <th width=\"15%%\">Notes</th>
+            </tr>""" % ( os.path.basename(logname))
+        
+    cid = 0
+    for component_name in components_level_messages.keys():
+        html += "<tr>"
+        html += "<td>%s</td>" % component_name
+        def add_category(error_level):
+            color = {'error': 'FF0000', 'critical': 'FF7000', 'warning': 'FFF000', 'remark': '0000FF', 'info': 'FFFFFF'}
+            val = len(components_level_messages[component_name][error_level])
+            if val > 0:
+                if error_level == 'error':
+                    return "<td align=\"center\" bgcolor=\"%s\"><a href=\"#section%s\">%s</a></td>" % (color[error_level], cid, val)
+                else:
+                    return "<td align=\"center\" bgcolor=\"%s\">%s</td>" % (color[error_level], val)
+            return "<td align=\"center\">%s</td>" % val
+        html += add_category('error')     
+        html += add_category('warning')
+        html += add_category('critical')     
+        html += add_category('info')
+        html += "</tr>"
+        cid += 1
+    html += "</table>"
+    cid = 0
+    html += "<h2>Error Details by Component</h2>"
+    fh.write(html.encode('utf8'))
+    for component_name in components_level_messages.keys():
+        html = "<h3><a name=\"section%s\">%s</a></h3>" % (cid, component_name)
+        def add_dump(cat):
+            """ adds the list of errors of the build """
+            out = ""
+            if ( components_level_messages[component_name][cat]):
+                out = "<h1>%s</h1>" % (cat)
+            for line in components_level_messages[component_name][cat]:
+                out += line + "<br/>"
+            return out
+        html += add_dump('error')     
+        html += add_dump('warning')     
+        html += add_dump('critical')     
+        html += add_dump('info')     
+        fh.write(html.encode('utf8'))
+        cid += 1
+    html = """
+<body>
+</html>
+    """
+    fh.write(html.encode('utf8'))
+    fh.close()
+
+if __name__ == "__main__":
+
+    """ standalone app """
+    cli = OptionParser(usage="%prog [options]")
+    cli.add_option("--log", help="Raptor log file")
+    cli.add_option("--output", help="Raptor log file")
+                   
+    opts, dummy_args = cli.parse_args()
+    if not opts.log:
+        cli.print_help()
+        sys.exit(-1)
+
+    filter = SBSScanlog()
+    filter.open(opts.output)
+
+    logFile = open(opts.log, 'r')
+
+    for line in logFile:
+        filter.write(line)
+
+    filter.summary()
+    filter.close() 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/sbsscanlogmetadata.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,109 @@
+#============================================================================ 
+#Name        : filter_heliumlog.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import sys
+import re
+import xml.sax
+import datetime
+import time
+from xml.sax.handler import ContentHandler
+from xml.dom.minidom import parse, parseString
+from xml.sax.saxutils import XMLGenerator
+from xml.sax.xmlreader import AttributesNSImpl
+import codecs
+from optparse import OptionParser
+
+
+IGNORE_TEXT_REG_EX = "warning: no newline at end of file"
+
+WARNING_TAG = "<warning>.*</warning>"
+
+class SBSScanlogMetadata():
+    def initialize(self, logFile):
+        """Initialize helium log filter"""
+        self.ignoreTextCompileObject = re.compile(IGNORE_TEXT_REG_EX);
+        self.warningCompileObject = re.compile(WARNING_TAG);
+        self.startRecording = False
+        self.logFileName = logFile
+        self.warningFileName = "%s%s" % (logFile, "exceptions.xml")
+        self.inReceipe = False
+        self.start_time = datetime.datetime.now()
+        self.loggerout = open(str(self.logFileName),"w")
+        self.warningout = open(str(self.warningFileName),"w")
+        print "logName: %s\n" % self.logFileName
+        return True
+
+    def open(self, logFile):
+        self.logFileName = logFile
+        self.initialize(logFile)
+        
+        
+    def write(self, text):
+        """ callback function which is to process the logs"""
+        for textLine in text.splitlines():
+            textLine = textLine + '\n'
+            if(self.ignoreTextCompileObject.search(textLine)):
+                continue
+
+            #only temporary until the fix for special character handling from raptor is available
+            if(self.warningCompileObject.search(textLine)):
+                self.warningout.write(textLine + "\n")
+                continue
+            self.loggerout.write(textLine)
+        return True
+        
+    def summary(self):
+        """Write Summary"""
+        sys.stdout.write("sbs: build log in %s\n" % str(self.logFileName))
+        return False
+
+    def close(self):
+        """Close the log file"""
+
+        try:
+            self.warningout.close()
+            self.loggerout.close()
+            return True
+        except:
+            self.loggerout = None
+        return False
+
+if __name__ == "__main__":
+
+    """ standalone app """
+    cli = OptionParser(usage="%prog [options]")
+    cli.add_option("--log", help="Raptor log file")
+    cli.add_option("--output", help="Raptor log file")
+                   
+    opts, dummy_args = cli.parse_args()
+    if not opts.log:
+        cli.print_help()
+        sys.exit(-1)
+
+    filter = SBSScanlogMetadata()
+    filter.open(opts.output)
+
+    logFile = open(opts.log, 'r')
+
+    for line in logFile:
+        filter.write(line)
+
+    filter.summary()
+    filter.close()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/searchnextdrive.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+#============================================================================ 
+#Name        : searchnextdrive.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+    Script that prints the next free drive on the current system.
+    If none available it returns "Error: No free drive!". 
+    win32 only!
+"""
+import string
+from win32api import GetLogicalDriveStrings
+
+DRIVE_LABELS = sorted(list(set(string.ascii_uppercase) - set(GetLogicalDriveStrings())), reverse=True)
+if len(DRIVE_LABELS) != 0 :
+    print DRIVE_LABELS[0] + ":"
+else:
+    print "Error: No free drive!"
+        
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/test_scanlog.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_scanlog.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_scanlog" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Testing scanlog implementation.
+    </description>
+    <property environment="env"/>
+
+    <dirname property="test.scanlog.dir" file="${ant.file.test_scanlog}"/>
+    
+    <property name="helium.dir" location="${test.scanlog.dir}/../../../.."/>
+    <import file="${helium.dir}/helium.ant.xml"/>
+
+    <!-- Macro to process the log to generate scanlog. -->
+    <macrodef name="scanlogTest" uri="http://www.nokia.com/helium">
+        <attribute name="log"/>
+        <attribute name="output"/>
+        <sequential>
+            <exec executable="python" dir="${test.scanlog.dir}" failonerror="false">
+                <arg value="sbsscanlog.py"/>
+                <arg value="--log"/>
+                <arg value="@{log}"/>
+                <arg value="--output"/>
+                <arg value="@{output}"/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+    <!-- Macro to process the log to generate scanlog. -->
+    <macrodef name="scanlogMetadataTest" uri="http://www.nokia.com/helium">
+        <attribute name="log"/>
+        <attribute name="output"/>
+        <sequential>
+            <exec executable="python" dir="${test.scanlog.dir}" failonerror="false">
+                <arg value="sbsscanlogmetadata.py"/>
+                <arg value="--log"/>
+                <arg value="@{log}"/>
+                <arg value="--output"/>
+                <arg value="@{output}"/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+    <target name="test-scanlog-1">
+        <echo message="log.dir:${env.TEMP}/" />
+        <delete file="${env.TEMP}/test-scanlog-1.log" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-1.log.xml" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-1.log.scan2.html" failonerror="false"/>
+        <hlm:scanlogTest log="${helium.dir}\tests\data\scanlog\ido_lcdo_tb92-ci_mcl.92.400__armv5_winscw_armv5.test_multiple_thread_dfs_build_compile.log"
+            output="${env.TEMP}/test-scanlog-1.log" />
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-1.log"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-1.log.xml"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-1.log.scan2.html"/>
+    </target>
+
+    <target name="test-scanlog-2">
+        <echo message="log.dir:${env.TEMP}/" />
+        <delete file="${env.TEMP}/test-scanlog-1.log" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-1.log.xml" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-1.log.scan2.html" failonerror="false"/>
+        <hlm:scanlogTest log="${helium.dir}\tests\data\scanlog\ido_lcdo_tb92-ci_mcl.92.400__armv5_winscw_armv5.test_multiple_threadreallyclean_dfs_build_clean_compile.log"  output="${env.TEMP}/test-scanlog21.log" />
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-1.log"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-1.log.xml"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-1.log.scan2.html"/>
+    </target>
+
+    <target name="test-scanlog-3">
+        <echo message="log.dir:${env.TEMP}/" />
+        <delete file="${env.TEMP}/test-scanlog-3.log" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-3.log.xml" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-3.log.scan2.html" failonerror="false"/>
+        <hlm:scanlogTest log="${helium.dir}\tests\data\scanlog\all_regex_type.log"
+            output="${env.TEMP}/test-scanlog-3.log" />
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-3.log"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-3.log.xml"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-3.log.scan2.html"/>
+    </target>
+
+    <target name="test-scanlog-metadata-1">
+        <echo message="log.dir:${env.TEMP}/" />
+        <delete file="${env.TEMP}/test-scanlog-metadata-1.log" failonerror="false"/>
+        <delete file="${env.TEMP}/test-metadata-1.sqlite" failonerror="false"/>
+        <delete file="${env.TEMP}/test-scanlog-metadata-1.log.scan2.html" failonerror="false"/>
+        
+        <hlm:scanlogMetadataTest log="${helium.dir}\tests\data\scanlog\S60.MCL_7952_200932_5000__all_variants_multiple_thread_pf_7952_build_compile.log"
+            output="${env.TEMP}/test-scanlog-metadata-1.log" />
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-metadata-1.log"/>
+        <hlm:metadatarecord database="${env.TEMP}/test-metadata-1.sqlite">
+            <hlm:sbsmetadatainput>
+                <fileset casesensitive="false" file="${env.TEMP}/test-scanlog-metadata-1.log"/>
+                <metadatafilterset refid="filterset.sbs" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/log/scan2.html.ftl"
+                     outputfile="${env.TEMP}/test-scanlog-metadata-1.log.scan2.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${helium.dir}/tools/common/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${env.TEMP}/test-metadata-1.sqlite
+                doc: xml(${helium.dir}/tests/data/scanlog/all_regex_type.log_sbs_info.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <hlm:generateBuildStatus dbfile="${env.TEMP}/test-metadata-1.sqlite" output-dir="${env.TEMP}" file="test-scanlog-metadata-1.log"/>
+        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-metadata-1.log.scan2.html"/>
+    </target>
+    
+    <target name="test-metadata-signal">
+        <antcall target="test-scanlog-metadata-1" />
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/scripts/timeout_launcher.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+#============================================================================ 
+#Name        : timeout_launcher.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Application launcher supporting timeout. """
+import os
+import sys
+import re
+import subprocess
+import logging
+import time
+
+_logger = logging.getLogger('timeout_launcher')
+logging.basicConfig(level=logging.INFO)
+
+
+# Platform
+windows = False
+if sys.platform == "win32":
+    import win32process
+    import win32con
+    import win32api
+    windows = True
+
+
+if __name__ == '__main__':
+    cmdarg = False
+    cmdline = []
+    timeout = None
+    
+    for arg in sys.argv:
+        res = re.match("^--timeout=(\d+)$", arg)
+        if not cmdarg and res is not None:
+            timeout = int(res.group(1))
+            _logger.debug("Set timeout to %s" % timeout)
+        elif not cmdarg and arg == '--':
+            _logger.debug("Parsing command start")
+            cmdarg = True
+        elif cmdarg:
+            _logger.debug("Adding arg: %s" % arg)
+            cmdline.append(arg)
+    
+    if len(cmdline) == 0:
+        print "Empty command line."
+        print "e.g: timeout_launcher.py --timeout=1 -- cmd /c sleep 10"
+        sys.exit(-1)
+    else:
+        _logger.debug("Start command")
+        if timeout != None:
+            finish = time.time() + timeout
+            timedout = False
+            shell = True
+            if windows:
+                shell = False
+            p = subprocess.Popen(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
+            while (p.poll() == None):
+                if time.time() > finish:
+                    timedout = True
+                    break
+                time.sleep(1)
+            if timedout:
+                print "ERROR: Application has timed out (timeout=%s)." % timeout
+                if windows:
+                    try:
+                        print "ERROR: Trying to kill the process..."
+                        handle = win32api.OpenProcess(True, win32con.PROCESS_TERMINATE, p.pid)
+                        win32process.TerminateProcess(handle, -1)
+                        print "ERROR: Process killed..."
+                    except Exception, exc:
+                        print "ERROR: %s" % exc
+                else:
+                    # pylint: disable-msg=E1101
+                    os.kill(p.pid, 9)
+                print "ERROR: exiting..."
+                raise Exception("Timeout exception.")
+            else:
+                print p.communicate()[0]
+                sys.exit(p.returncode)
+        else:
+            p = subprocess.Popen(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+            print p.communicate()[0]
+            sys.exit(p.returncode)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/schema/ant.xsd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="ant.apache.org"
           xmlns:au="org.apache.ant.antunit"
           xmlns:hlm="http://www.nokia.com/helium"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
    <xs:import namespace="org.apache.ant.antunit" schemaLocation="antunit.xsd"/>
    <xs:import namespace="http://www.nokia.com/helium" schemaLocation="helium_ant.xsd"/>
    <xs:complexType name="taskcontainerType" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyfile" type="propertyfileType"/>
            <xs:element name="propertycopy" type="propertycopyType"/>
            <xs:element name="importtypelib" type="importtypelibType"/>
            <xs:element name="sql" type="sqlType"/>
            <xs:element name="cvspass" type="cvspassType"/>
            <xs:element name="p4reopen" type="p4reopenType"/>
            <xs:element name="csc" type="cscType"/>
            <xs:element name="dirname" type="dirnameType"/>
            <xs:element name="p4label" type="p4labelType"/>
            <xs:element name="p4revert" type="p4revertType"/>
            <xs:element name="replaceregexp" type="replaceregexpType"/>
            <xs:element name="get" type="getType"/>
            <xs:element name="jjtree" type="jjtreeType"/>
            <xs:element name="sleep" type="sleepType"/>
            <xs:element name="jarlib-display" type="jarlib-displayType"/>
            <xs:element name="dependset" type="dependsetType"/>
            <xs:element name="zip" type="zipType"/>
            <xs:element name="patch" type="patchType"/>
            <xs:element name="jspc" type="jspcType"/>
            <xs:element name="style" type="styleType"/>
            <xs:element name="test" type="testType"/>
            <xs:element name="tstamp" type="tstampType"/>
            <xs:element name="unwar" type="unwarType"/>
            <xs:element name="icontract" type="icontractType"/>
            <xs:element name="cvschangelog" type="cvschangelogType"/>
            <xs:element name="p4submit" type="p4submitType"/>
            <xs:element name="p4change" type="p4changeType"/>
            <xs:element name="bzip2" type="bzip2Type"/>
            <xs:element name="sync" type="syncType"/>
            <xs:element name="p4delete" type="p4deleteType"/>
            <xs:element name="javadoc" type="javadocType"/>
            <xs:element name="p4integrate" type="p4integrateType"/>
            <xs:element name="translate" type="translateType"/>
            <xs:element name="signjar" type="signjarType"/>
            <xs:element name="chown" type="chownType"/>
            <xs:element name="vajload" type="vajloadType"/>
            <xs:element name="jarlib-available" type="jarlib-availableType"/>
            <xs:element name="buildnumber" type="buildnumberType"/>
            <xs:element name="jpcovmerge" type="jpcovmergeType"/>
            <xs:element name="war" type="warType"/>
            <xs:element name="rename" type="renameType"/>
            <xs:element name="sequential" type="sequentialType"/>
            <xs:element name="serverdeploy" type="serverdeployType"/>
            <xs:element name="property" type="propertyType"/>
            <xs:element name="subant" type="subantType"/>
            <xs:element name="move" type="moveType"/>
            <xs:element name="ildasm" type="ildasmType"/>
            <xs:element name="copydir" type="copydirType"/>
            <xs:element name="fixcrlf" type="fixcrlfType"/>
            <xs:element name="pathconvert" type="pathconvertType"/>
            <xs:element name="record" type="recordType"/>
            <xs:element name="p4sync" type="p4syncType"/>
            <xs:element name="exec" type="execType"/>
            <xs:element name="ccmklabel" type="ccmklabelType"/>
            <xs:element name="p4edit" type="p4editType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="maudit" type="mauditType"/>
            <xs:element name="antlr" type="antlrType"/>
            <xs:element name="jpcovreport" type="jpcovreportType"/>
            <xs:element name="execon" type="execonType"/>
            <xs:element name="ant" type="antType"/>
            <xs:element name="xmlvalidate" type="xmlvalidateType"/>
            <xs:element name="xslt" type="xsltType"/>
            <xs:element name="p4resolve" type="p4resolveType"/>
            <xs:element name="gzip" type="gzipType"/>
            <xs:element name="native2ascii" type="native2asciiType"/>
            <xs:element name="ccrmtype" type="ccrmtypeType"/>
            <xs:element name="ear" type="earType"/>
            <xs:element name="input" type="inputType"/>
            <xs:element name="presetdef" type="presetdefType"/>
            <xs:element name="rmic" type="rmicType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="mail" type="mailType"/>
            <xs:element name="loadfile" type="loadfileType"/>
            <xs:element name="loadresource" type="loadresourceType"/>
            <xs:element name="mimemail" type="mimemailType"/>
            <xs:element name="gunzip" type="gunzipType"/>
            <xs:element name="concat" type="concatType"/>
            <xs:element name="cab" type="cabType"/>
            <xs:element name="touch" type="touchType"/>
            <xs:element name="parallel" type="parallelType"/>
            <xs:element name="splash" type="splashType"/>
            <xs:element name="antcall" type="antcallType"/>
            <xs:element name="typedef" type="typedefType"/>
            <xs:element name="p4have" type="p4haveType"/>
            <xs:element name="filter" type="filterType"/>
            <xs:element name="xmlproperty" type="xmlpropertyType"/>
            <xs:element name="import" type="importType"/>
            <xs:element name="copy" type="copyType"/>
            <xs:element name="jsharpc" type="jsharpcType"/>
            <xs:element name="symlink" type="symlinkType"/>
            <xs:element name="antstructure" type="antstructureType"/>
            <xs:element name="script" type="scriptType"/>
            <xs:element name="rpm" type="rpmType"/>
            <xs:element name="delete" type="deleteType"/>
            <xs:element name="replace" type="replaceType"/>
            <xs:element name="attrib" type="attribType"/>
            <xs:element name="waitfor" type="waitforType"/>
            <xs:element name="untar" type="untarType"/>
            <xs:element name="loadproperties" type="loadpropertiesType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="echoproperties" type="echopropertiesType"/>
            <xs:element name="chgrp" type="chgrpType"/>
            <xs:element name="vajexport" type="vajexportType"/>
            <xs:element name="bunzip2" type="bunzip2Type"/>
            <xs:element name="whichresource" type="whichresourceType"/>
            <xs:element name="copyfile" type="copyfileType"/>
            <xs:element name="p4labelsync" type="p4labelsyncType"/>
            <xs:element name="macrodef" type="macrodefType"/>
            <xs:element name="unjar" type="unjarType"/>
            <xs:element name="vbc" type="vbcType"/>
            <xs:element name="mkdir" type="mkdirType"/>
            <xs:element name="condition" type="conditionType"/>
            <xs:element name="cvs" type="cvsType"/>
            <xs:element name="tempfile" type="tempfileType"/>
            <xs:element name="junit" type="junitType"/>
            <xs:element name="junitreport" type="junitreportType"/>
            <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
            <xs:element name="cobertura-report" type="cobertura-reportType"/>
            <xs:element name="taskdef" type="taskdefType"/>
            <xs:element name="echo" type="echoType"/>
            <xs:element name="java" type="javaType"/>
            <xs:element name="renameext" type="renameextType"/>
            <xs:element name="basename" type="basenameType"/>
            <xs:element name="javadoc2" type="javadoc2Type"/>
            <xs:element name="tar" type="tarType"/>
            <xs:element name="vajimport" type="vajimportType"/>
            <xs:element name="p4fstat" type="p4fstatType"/>
            <xs:element name="setproxy" type="setproxyType"/>
            <xs:element name="p4counter" type="p4counterType"/>
            <xs:element name="ilasm" type="ilasmType"/>
            <xs:element name="apply" type="applyType"/>
            <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
            <xs:element name="jlink" type="jlinkType"/>
            <xs:element name="cvstagdiff" type="cvstagdiffType"/>
            <xs:element name="javacc" type="javaccType"/>
            <xs:element name="chmod" type="chmodType"/>
            <xs:element name="pvcs" type="pvcsType"/>
            <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
            <xs:element name="jar" type="jarType"/>
            <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
            <xs:element name="sound" type="soundType"/>
            <xs:element name="scriptdef" type="scriptdefType"/>
            <xs:element name="defaultexcludes" type="defaultexcludesType"/>
            <xs:element name="blgenclient" type="blgenclientType"/>
            <xs:element name="uptodate" type="uptodateType"/>
            <xs:element name="jjdoc" type="jjdocType"/>
            <xs:element name="genkey" type="genkeyType"/>
            <xs:element name="javah" type="javahType"/>
            <xs:element name="ccmreconfigure" type="ccmreconfigureType"/>
            <xs:element name="fail" type="failType"/>
            <xs:element name="unzip" type="unzipType"/>
            <xs:element name="javac" type="javacType"/>
            <xs:element name="p4add" type="p4addType"/>
            <xs:element name="jpcoverage" type="jpcoverageType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="deltree" type="deltreeType"/>
            <xs:element name="ddcreator" type="ddcreatorType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="assertions" type="assertionsType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="filterreader" type="filterreaderType"/>
            <xs:element name="scriptfilter" type="scriptfilterType"/>
            <xs:element name="concatfilter" type="concatfilterType"/>
            <xs:element name="extension" type="extensionType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="classfileset" type="classfilesetType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="description" type="descriptionType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="substitution" type="substitutionType"/>
            <xs:element name="extensionSet" type="extensionSetType"/>
            <xs:element name="regexp" type="regexpType"/>
            <xs:element name="foreach" type="foreachType"/>
            <xs:element name="doxygen" type="doxygenType"/>
            <xs:element name="var" type="varType"/>
            <xs:element name="propertyregex" type="propertyregexType"/>
            <xs:element name="if" type="ifType"/>
            <xs:element name="for" type="forType"/>
            <xs:element name="mergelogs" type="mergelogsType"/>
            <xs:element name="reviewplan" type="reviewplanType"/>
            <xs:element name="processreviewplan" type="processreviewplanType"/>
            <xs:element name="convertreviewlog" type="convertreviewlogType"/>
            <xs:element name="lint" type="lintType"/>
            <xs:element name="customcopy" type="customcopyType"/>
            <xs:element name="fop" type="fopType"/>
            <xs:element name="xmltask" type="xmltaskType"/>
            <xs:element name="ftp" type="ftpType"/>
            <xs:element name="abld" type="abldType"/>
            <xs:element name="getsize" type="getsizeType"/>
            <xs:element name="grand" type="grandType"/>
            <xs:element name="svn" type="svnType"/>
            <xs:element name="antunit" type="antunitType"/>
            <xs:element name="schemavalidate" type="schemavalidateType"/>
            <xs:element name="python" type="pythonType"/>
            <xs:element name="antform" type="antformType"/>
            <xs:element name="math" type="mathType"/>
            <xs:element name="antserver" type="antserverType"/>
            <xs:element name="shellscript" type="shellscriptType"/>
            <xs:element name="runtarget" type="runtargetType"/>
            <xs:element name="echoxml" type="echoxmlType"/>
            <xs:element name="trycatch" type="trycatchType"/>
            <xs:element name="resourcecount" type="resourcecountType"/>
            <xs:element name="remoteant" type="remoteantType"/>
            <xs:element name="retry" type="retryType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="then" type="thenType"/>
            <xs:element name="antcallback" type="antcallbackType"/>
            <xs:element name="diagnostics" type="diagnosticsType"/>
            <xs:element name="sshexec" type="sshexecType"/>
            <xs:element name="scp" type="scpType"/>
            <xs:element name="xcluder" type="xcluderType"/>
            <xs:element name="assertTrue" type="assertTrueType"/>
            <xs:element name="assertFileExists" type="assertFileExistsType"/>
            <xs:element name="fmpp" type="fmppType"/>
            <xs:element name="timestampselector" type="timestampselectorType"/>
            <xs:element name="preset.exec" type="preset.execType"/>
            <xs:element name="preset.mail" type="preset.mailType"/>
            <xs:element name="createDeltaZipMacro" type="createDeltaZipMacroType"/>
            <xs:element name="zipContentMacro" type="zipContentMacroType"/>
            
            <xs:element ref="au:assertPropertyEquals"/>
            <xs:element ref="au:assertLogDoesntContain"/>
            <xs:element ref="au:assertPropertySet"/>
            
            <xs:element ref="hlm:configuration"/>
            <xs:element ref="hlm:database"/>
            <xs:element ref="hlm:logextract"/>
            <xs:element ref="hlm:signal"/>
            <xs:element ref="hlm:dependencies"/>
            <xs:element ref="hlm:compileHtmlscanlogMacro"/>
            <xs:element ref="hlm:cmakerMacro"/>
            <xs:element ref="hlm:compileEbsMacro"/>
            <xs:element ref="hlm:buildEbsXmlMacro"/>
            <xs:element ref="hlm:logHtmlMacro"/>
            <xs:element ref="hlm:compileGenxmlMacro"/>
            <xs:element ref="hlm:bldmakeBldfilesMacro"/>
            <xs:element ref="hlm:abldMacro"/>
            <xs:element ref="hlm:filterRecordStartMacro"/>
            <xs:element ref="hlm:filterRecordStopMacro"/>
            <xs:element ref="hlm:updateStatusMacro"/>
            <xs:element ref="hlm:createCshelpBldinfMacro"/>
            <xs:element ref="hlm:imakerMacro"/>
            <xs:element ref="hlm:rombuildImakerMacro"/>
            <xs:element ref="hlm:ecImakerMacro"/>
            <xs:element ref="hlm:preECImakerMacro"/>
            <xs:element ref="hlm:ccmAvailableMacro"/>
            <xs:element ref="hlm:publishMacro"/>
            <xs:element ref="hlm:rombuildMacro"/>
            <xs:element ref="hlm:notifyMacro"/>
            <xs:element ref="hlm:diskspaceMacro"/>
            <xs:element ref="hlm:netrcPasswordMacro"/>
            <xs:element ref="hlm:netrcUsernameMacro"/>
            <xs:element ref="hlm:compileGenxmlMergeMacro"/>
            <xs:element ref="hlm:declareIdMacro"/>
            <xs:element ref="hlm:mailTargetCompletedMacro"/>
            <xs:element ref="hlm:deleteFotaConfMacro"/>
            <xs:element ref="hlm:rombuildValueMacro"/>
            <xs:element ref="hlm:assert"/>
            <xs:element ref="hlm:assertFileExists"/>
            <xs:element ref="hlm:referenceToFileMacro"/>
            <xs:element ref="hlm:xmlToFmtlMacro"/>
            <xs:element ref="hlm:tempRecordStartMacro"/>
            <xs:element ref="hlm:tempRecordStopMacro"/>
            <xs:element ref="hlm:fooMacro"/>
            <!-- Presets -->
            <!-- Macros -->
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="resourceCollectionContainerType" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="first" type="firstType"/>
            <xs:element name="sort" type="sortType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="addfilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="andType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="os" type="osType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="property" type="propertyType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="inheritAll">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="antfile" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antcallType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="inheritAll">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antlrType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="trace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tracetreewalker">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="html">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tracelexer">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="diagnostic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="traceparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="glib" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antstructureType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="applyType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="archivesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="argType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="argumentType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="assertionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="disable" type="disableType"/>
            <xs:element name="enable" type="enableType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="enablesystemassertions">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="attribType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="readonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="hidden">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="system">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="archive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="attributeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="default" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="availableType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="filepath" type="filepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="ignoresystemclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="filepath" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="basenameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="suffix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="blgenclientType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="mode" type="xs:string"/>
        <xs:attribute name="ejbjar" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="clientjar" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bootclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bottomType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="buildnumberType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="buildpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="buildpathelementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bunzip2Type">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bzip2Type">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cabType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cabfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="options" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="catalogpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccmklabelType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="recurse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccmklbtypeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="global">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="shared">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="pbranch">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
        <xs:attribute name="ordinary">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="ccmreconfigureType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="ccmaction" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="ccmproject" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="recurse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ccmdir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccrmtypeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="rmall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="ignore">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="typekind" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="checksumType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="fileext" type="xs:string"/>
        <xs:attribute name="totalproperty" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="readbuffersize" type="xs:string"/>
        <xs:attribute name="verifyproperty" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="algorithm" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="provider" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chgrpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chmodType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="arg" type="argType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="perm" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chownType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="owner" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="classType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classconstantsType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="classesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="rootfileset" type="rootfilesetType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="root" type="rootType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rootclass" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="commandlineType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="marker" type="markerType"/>
            <xs:element name="argument" type="argumentType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="executable" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="commentType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="compilerargType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="implementation" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="compilerclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="concatType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="propertyresource" type="propertyresourceType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="eol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="cr"/>
                    <xs:enumeration value="lf"/>
                    <xs:enumeration value="crlf"/>
                    <xs:enumeration value="mac"/>
                    <xs:enumeration value="unix"/>
                    <xs:enumeration value="dos"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="fixlastline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="concatfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="prepend" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="conditionType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsconditionType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="ignorewhitespace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="text" type="xs:string"/>
    </xs:complexType>
    <!-- Used for <contains> in <fail> -->
    <xs:complexType name="containsconditionType">
        <xs:attribute name="casesensitive" type="xs:boolean"/>
        <xs:attribute name="string" type="xs:string"/>
        <xs:attribute name="substring" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsregexType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsregexpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsstringType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="contains" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enablemultiplemappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="preservelastmodified">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="copydirType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="filtering" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="coveragepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cscType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="definitions" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
        <xs:attribute name="fullpaths">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="incremental">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="noconfig">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="docfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="unsafe">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filealign" type="xs:string"/>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="customType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="commandline" type="commandlineType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvschangelogType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="user" type="userType"/>
            <xs:element name="commandline" type="commandlineType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="end" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="start" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="usersfile" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="daysinpast" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvspassType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="passfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvstagdiffType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="commandline" type="commandlineType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="endtag" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="starttag" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="enddate" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="startdate" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="daemonsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="propertyfile" type="propertyfileType"/>
                <xs:element name="importtypelib" type="importtypelibType"/>
                <xs:element name="sql" type="sqlType"/>
                <xs:element name="cvspass" type="cvspassType"/>
                <xs:element name="p4reopen" type="p4reopenType"/>
                <xs:element name="csc" type="cscType"/>
                <xs:element name="dirname" type="dirnameType"/>
                <xs:element name="p4label" type="p4labelType"/>
                <xs:element name="p4revert" type="p4revertType"/>
                <xs:element name="replaceregexp" type="replaceregexpType"/>
                <xs:element name="get" type="getType"/>
                <xs:element name="jjtree" type="jjtreeType"/>
                <xs:element name="sleep" type="sleepType"/>
                <xs:element name="jarlib-display" type="jarlib-displayType"/>
                <xs:element name="dependset" type="dependsetType"/>
                <xs:element name="zip" type="zipType"/>
                <xs:element name="patch" type="patchType"/>
                <xs:element name="jspc" type="jspcType"/>
                <xs:element name="style" type="styleType"/>
                <xs:element name="test" type="testType"/>
                <xs:element name="tstamp" type="tstampType"/>
                <xs:element name="unwar" type="unwarType"/>
                <xs:element name="icontract" type="icontractType"/>
                <xs:element name="cvschangelog" type="cvschangelogType"/>
                <xs:element name="p4submit" type="p4submitType"/>
                <xs:element name="p4change" type="p4changeType"/>
                <xs:element name="bzip2" type="bzip2Type"/>
                <xs:element name="sync" type="syncType"/>
                <xs:element name="p4delete" type="p4deleteType"/>
                <xs:element name="javadoc" type="javadocType"/>
                <xs:element name="p4integrate" type="p4integrateType"/>
                <xs:element name="translate" type="translateType"/>
                <xs:element name="signjar" type="signjarType"/>
                <xs:element name="chown" type="chownType"/>
                <xs:element name="vajload" type="vajloadType"/>
                <xs:element name="jarlib-available" type="jarlib-availableType"/>
                <xs:element name="buildnumber" type="buildnumberType"/>
                <xs:element name="jpcovmerge" type="jpcovmergeType"/>
                <xs:element name="war" type="warType"/>
                <xs:element name="rename" type="renameType"/>
                <xs:element name="sequential" type="sequentialType"/>
                <xs:element name="serverdeploy" type="serverdeployType"/>
                <xs:element name="property" type="propertyType"/>
                <xs:element name="subant" type="subantType"/>
                <xs:element name="move" type="moveType"/>
                <xs:element name="ildasm" type="ildasmType"/>
                <xs:element name="copydir" type="copydirType"/>
                <xs:element name="fixcrlf" type="fixcrlfType"/>
                <xs:element name="pathconvert" type="pathconvertType"/>
                <xs:element name="record" type="recordType"/>
                <xs:element name="p4sync" type="p4syncType"/>
                <xs:element name="exec" type="execType"/>
                <xs:element name="ccmklabel" type="ccmklabelType"/>
                <xs:element name="p4edit" type="p4editType"/>
                <xs:element name="manifest" type="manifestType"/>
                <xs:element name="maudit" type="mauditType"/>
                <xs:element name="antlr" type="antlrType"/>
                <xs:element name="jpcovreport" type="jpcovreportType"/>
                <xs:element name="execon" type="execonType"/>
                <xs:element name="ant" type="antType"/>
                <xs:element name="xmlvalidate" type="xmlvalidateType"/>
                <xs:element name="xslt" type="xsltType"/>
                <xs:element name="p4resolve" type="p4resolveType"/>
                <xs:element name="gzip" type="gzipType"/>
                <xs:element name="native2ascii" type="native2asciiType"/>
                <xs:element name="ccrmtype" type="ccrmtypeType"/>
                <xs:element name="ear" type="earType"/>
                <xs:element name="input" type="inputType"/>
                <xs:element name="presetdef" type="presetdefType"/>
                <xs:element name="rmic" type="rmicType"/>
                <xs:element name="checksum" type="checksumType"/>
                <xs:element name="mail" type="mailType"/>
                <xs:element name="loadfile" type="loadfileType"/>
                <xs:element name="mimemail" type="mimemailType"/>
                <xs:element name="gunzip" type="gunzipType"/>
                <xs:element name="concat" type="concatType"/>
                <xs:element name="cab" type="cabType"/>
                <xs:element name="touch" type="touchType"/>
                <xs:element name="parallel" type="parallelType"/>
                <xs:element name="splash" type="splashType"/>
                <xs:element name="antcall" type="antcallType"/>
                <xs:element name="typedef" type="typedefType"/>
                <xs:element name="p4have" type="p4haveType"/>
                <xs:element name="filter" type="filterType"/>
                <xs:element name="xmlproperty" type="xmlpropertyType"/>
                <xs:element name="import" type="importType"/>
                <xs:element name="copy" type="copyType"/>
                <xs:element name="jsharpc" type="jsharpcType"/>
                <xs:element name="symlink" type="symlinkType"/>
                <xs:element name="antstructure" type="antstructureType"/>
                <xs:element name="script" type="scriptType"/>
                <xs:element name="rpm" type="rpmType"/>
                <xs:element name="delete" type="deleteType"/>
                <xs:element name="replace" type="replaceType"/>
                <xs:element name="attrib" type="attribType"/>
                <xs:element name="waitfor" type="waitforType"/>
                <xs:element name="untar" type="untarType"/>
                <xs:element name="loadproperties" type="loadpropertiesType"/>
                <xs:element name="available" type="availableType"/>
                <xs:element name="echoproperties" type="echopropertiesType"/>
                <xs:element name="chgrp" type="chgrpType"/>
                <xs:element name="vajexport" type="vajexportType"/>
                <xs:element name="bunzip2" type="bunzip2Type"/>
                <xs:element name="whichresource" type="whichresourceType"/>
                <xs:element name="copyfile" type="copyfileType"/>
                <xs:element name="p4labelsync" type="p4labelsyncType"/>
                <xs:element name="macrodef" type="macrodefType"/>
                <xs:element name="unjar" type="unjarType"/>
                <xs:element name="vbc" type="vbcType"/>
                <xs:element name="mkdir" type="mkdirType"/>
                <xs:element name="condition" type="conditionType"/>
                <xs:element name="cvs" type="cvsType"/>
                <xs:element name="tempfile" type="tempfileType"/>
                <xs:element name="junit" type="junitType"/>
                <xs:element name="junitreport" type="junitreportType"/>
                <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
                <xs:element name="cobertura-report" type="cobertura-reportType"/>
                <xs:element name="taskdef" type="taskdefType"/>
                <xs:element name="echo" type="echoType"/>
                <xs:element name="java" type="javaType"/>
                <xs:element name="renameext" type="renameextType"/>
                <xs:element name="basename" type="basenameType"/>
                <xs:element name="javadoc2" type="javadoc2Type"/>
                <xs:element name="tar" type="tarType"/>
                <xs:element name="vajimport" type="vajimportType"/>
                <xs:element name="p4fstat" type="p4fstatType"/>
                <xs:element name="setproxy" type="setproxyType"/>
                <xs:element name="p4counter" type="p4counterType"/>
                <xs:element name="ilasm" type="ilasmType"/>
                <xs:element name="apply" type="applyType"/>
                <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
                <xs:element name="jlink" type="jlinkType"/>
                <xs:element name="cvstagdiff" type="cvstagdiffType"/>
                <xs:element name="javacc" type="javaccType"/>
                <xs:element name="chmod" type="chmodType"/>
                <xs:element name="pvcs" type="pvcsType"/>
                <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
                <xs:element name="jar" type="jarType"/>
                <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
                <xs:element name="sound" type="soundType"/>
                <xs:element name="scriptdef" type="scriptdefType"/>
                <xs:element name="defaultexcludes" type="defaultexcludesType"/>
                <xs:element name="blgenclient" type="blgenclientType"/>
                <xs:element name="uptodate" type="uptodateType"/>
                <xs:element name="jjdoc" type="jjdocType"/>
                <xs:element name="genkey" type="genkeyType"/>
                <xs:element name="javah" type="javahType"/>
                <xs:element name="fail" type="failType"/>
                <xs:element name="unzip" type="unzipType"/>
                <xs:element name="javac" type="javacType"/>
                <xs:element name="p4add" type="p4addType"/>
                <xs:element name="jpcoverage" type="jpcoverageType"/>
                <xs:element name="depend" type="dependType"/>
                <xs:element name="deltree" type="deltreeType"/>
                <xs:element name="ddcreator" type="ddcreatorType"/>
                <xs:element name="retry" type="retryType"/>
            </xs:choice>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="dateType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="when">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="before"/>
                    <xs:enumeration value="after"/>
                    <xs:enumeration value="equal"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="millis" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="checkdirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="granularity" type="xs:string"/>
        <xs:attribute name="datetime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ddcreatorType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="descriptors" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="defaultexcludesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="remove" type="xs:string"/>
        <xs:attribute name="echo">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="default">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="add" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="defineType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deleteType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deletecharactersType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="chars" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deltreeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="granularity" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="targetfileset" type="targetfilesetType"/>
            <xs:element name="srcfileset" type="srcfilesetType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="srcfilelist" type="srcfilelistType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="targetfilelist" type="targetfilelistType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="depthType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="max" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="min" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="descriptionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="refid" type="xs:IDREF"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="differentType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="ignoreFileTimes" type="xs:string"/>
        <xs:attribute name="ignoreContents" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="ignorefiletimes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="granularity" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dirnameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dirsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="disableType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dnameType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="param" type="paramType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="docletType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="doctitleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="dtdType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="publicid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="earType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="archives" type="archivesType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="earfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="appxml" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="echoType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="append">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="file" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
                <xs:attribute name="level">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="error"/>
                            <xs:enumeration value="warning"/>
                            <xs:enumeration value="info"/>
                            <xs:enumeration value="verbose"/>
                            <xs:enumeration value="debug"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="echopropertiesType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyset" type="propertysetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="xml"/>
                    <xs:enumeration value="text"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="elementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="implicit" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="enableType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="entityType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="publicid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="entryType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="operation" type="xs:string"/>
        <xs:attribute name="default" type="xs:string"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="int"/>
                    <xs:enumeration value="date"/>
                    <xs:enumeration value="string"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="unit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                    <xs:enumeration value="month"/>
                    <xs:enumeration value="year"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pattern" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="envType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="redirectorType">
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="logError" type="xs:string"/>
        <xs:attribute name="append" type="xs:boolean"/>
        <xs:attribute name="createemptyfiles" type="xs:boolean"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="inputencoding" type="xs:string"/>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="errorencoding" type="xs:string"/>
        <xs:attribute name="alwayslog" type="xs:boolean"/>
        <xs:attribute name="loginputstring" type="xs:boolean"/>
    </xs:complexType>
    <xs:complexType name="equalsType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="trim">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="arg2" type="xs:string"/>
        <xs:attribute name="arg1" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="escapeunicodeType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="excludeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="excludepackageType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="excludesfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="execType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="redirector" type="redirectorType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="osfamily" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="execonType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="existingType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="expandpropertiesType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="extdirsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="implementationversion" type="xs:string"/>
        <xs:attribute name="specificationversion" type="xs:string"/>
        <xs:attribute name="extensionname" type="xs:string"/>
        <xs:attribute name="implementationvendorid" type="xs:string"/>
        <xs:attribute name="specificationvendor" type="xs:string"/>
        <xs:attribute name="implementationurl" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="implementationvendor" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionSetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="factoryType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="failType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="condition" type="conditionType"/>
        </xs:choice>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="failsoundType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="loops" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="duration" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filenameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="negate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="filepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcesType">
        <xs:attribute name="refid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filesmatchType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file2" type="xs:string"/>
        <xs:attribute name="file1" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filetokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="filterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filterchainType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="headfilter" type="headfilterType"/>
            <xs:element name="classconstants" type="classconstantsType"/>
            <xs:element name="linecontains" type="linecontainsType"/>
            <xs:element name="filterreader" type="filterreaderType"/>
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="replacetokens" type="replacetokensType"/>
            <xs:element name="escapeunicode" type="escapeunicodeType"/>
            <xs:element name="ignoreblank" type="ignoreblankType"/>
            <xs:element name="tailfilter" type="tailfilterType"/>
            <xs:element name="tabstospaces" type="tabstospacesType"/>
            <xs:element name="prefixlines" type="prefixlinesType"/>
            <xs:element name="expandproperties" type="expandpropertiesType"/>
            <xs:element name="striplinebreaks" type="striplinebreaksType"/>
            <xs:element name="trim" type="trimType"/>
            <xs:element name="striplinecomments" type="striplinecommentsType"/>
            <xs:element name="replacestring" type="replacestringType"/>
            <xs:element name="tokenfilter" type="tokenfilterType"/>
            <xs:element name="stripjavacomments" type="stripjavacommentsType"/>
            <xs:element name="containsregex" type="containsregexType"/>
            <xs:element name="deletecharacters" type="deletecharactersType"/>
            <xs:element name="linecontainsregexp" type="linecontainsregexpType"/>
            <xs:element name="concatfilter" type="concatfilterType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtermapperType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="scriptfilter" type="scriptfilterType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="scriptmapperType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="setbeans">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="filterreaderType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtersType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="exclude" type="excludeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="defaultexclude">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="filtersetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="filter" type="filterType"/>
            <xs:element name="filtersfile" type="filtersfileType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="begintoken" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="filtersfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtersfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fixcrlfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tab">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="cr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="eol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="cr"/>
                    <xs:enumeration value="lf"/>
                    <xs:enumeration value="crlf"/>
                    <xs:enumeration value="mac"/>
                    <xs:enumeration value="unix"/>
                    <xs:enumeration value="dos"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javafiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="eof">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tablength" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fixlast">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="footerType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="formatType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="timezone" type="xs:string"/>
        <xs:attribute name="unit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                    <xs:enumeration value="month"/>
                    <xs:enumeration value="year"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pattern" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="offset" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fromType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="genericType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="server" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="username" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="genkeyType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="dname" type="dnameType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="storepass" type="xs:string"/>
        <xs:attribute name="sigalg" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keypass" type="xs:string"/>
        <xs:attribute name="dname" type="xs:string"/>
        <xs:attribute name="keysize" type="xs:string"/>
        <xs:attribute name="alias" type="xs:string"/>
        <xs:attribute name="keyalg" type="xs:string"/>
        <xs:attribute name="validity" type="xs:string"/>
        <xs:attribute name="keystore" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="storetype" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="getType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ignoreerrors">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="usetimestamp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="grantType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="actions" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="groupType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="package" type="packageType"/>
            <xs:element name="title" type="titleType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="packages" type="xs:string"/>
        <xs:attribute name="title" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="gunzipType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="gzipType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="headerType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="headfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="lines" type="xs:string"/>
        <xs:attribute name="skip" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="httpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="errorsbeginat" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="icontractType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classdir" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="repositorydir" type="xs:string"/>
        <xs:attribute name="instrumentdir" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="builddir" type="xs:string"/>
        <xs:attribute name="updateicontrol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pre">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="controlfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="invariant">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="post">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="failthrowable" type="xs:string"/>
        <xs:attribute name="verbosity" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="repbuilddir" type="xs:string"/>
        <xs:attribute name="targets" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ignoreblankType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="ilasmType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="owner" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resourcefile" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="listing">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keyfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ildasmType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="assembler">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="ascii"/>
                    <xs:enumeration value="utf8"/>
                    <xs:enumeration value="unicode"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="progressbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="linenumbers">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rawexceptionhandling">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="showsource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="metadata">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="bytes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resourcedir" type="xs:string"/>
        <xs:attribute name="quoteallnames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="header">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visibility" type="xs:string"/>
        <xs:attribute name="sourcefile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="item" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="importType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="importtypelibType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="unsafe">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="usesysarray">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="namespace" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="includeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="includesfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="inputType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="addproperty" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="defaultvalue" type="xs:string"/>
                <xs:attribute name="validargs" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="isfalseType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="isreferenceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="issetType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="istrueType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-availableType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="extensionset" type="extensionsetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-displayType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-manifestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="options" type="optionsType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="depends" type="dependsType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-resolveType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ant" type="antType"/>
            <xs:element name="location" type="locationType"/>
            <xs:element name="url" type="urlType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="checkextension">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="javaType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="syspropertyset" type="syspropertysetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="permissions" type="permissionsType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="assertions" type="assertionsType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="jvmargs" type="xs:string"/>
        <xs:attribute name="args" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="jvm" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="jvmversion" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javacType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="compilerarg" type="compilerargType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="debuglevel" type="xs:string"/>
        <xs:attribute name="memoryinitialsize" type="xs:string"/>
        <xs:attribute name="deprecation">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeantruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="depend">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="includejavaruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tempdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="nowarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="proceed">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="memorymaximumsize" type="xs:string"/>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="listfiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extdirs" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javaccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debugparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="forcelacheck">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimizetokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="commontokenaction">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildtokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sanitycheck">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="otherambiguitycheck" type="xs:string"/>
        <xs:attribute name="lookahead" type="xs:string"/>
        <xs:attribute name="debuglookahead">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="choiceambiguitycheck" type="xs:string"/>
        <xs:attribute name="unicodeinput">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="usercharstream">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debugtokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keeplinecolumn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="cachetokens">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javaunicodeescape">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="static">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="ignorecase">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="usertokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorreporting">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="javadocType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="taglet" type="tagletType"/>
            <xs:element name="doclet" type="docletType"/>
            <xs:element name="package" type="packageType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="link" type="linkType"/>
            <xs:element name="doctitle" type="doctitleType"/>
            <xs:element name="bottom" type="bottomType"/>
            <xs:element name="group" type="groupType"/>
            <xs:element name="packageset" type="packagesetType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="source" type="sourceType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="excludepackage" type="excludepackageType"/>
            <xs:element name="tag" type="tagType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bottom" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="header" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="noindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="access">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="protected"/>
                    <xs:enumeration value="public"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="private"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="doclet" type="xs:string"/>
        <xs:attribute name="noqualifier" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="author">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="footer" type="xs:string"/>
        <xs:attribute name="docletpath" type="xs:string"/>
        <xs:attribute name="package">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useexternalfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="protected">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="breakiterator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nonavbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="linkoffline" type="xs:string"/>
        <xs:attribute name="additionalparam" type="xs:string"/>
        <xs:attribute name="linksource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="private">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="nodeprecatedlist">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="stylesheetfile" type="xs:string"/>
        <xs:attribute name="docencoding" type="xs:string"/>
        <xs:attribute name="excludepackagenames" type="xs:string"/>
        <xs:attribute name="docletpathref" type="xs:IDREF"/>
        <xs:attribute name="packagenames" type="xs:string"/>
        <xs:attribute name="windowtitle" type="xs:string"/>
        <xs:attribute name="notree">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="splitindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelist" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="doctitle" type="xs:string"/>
        <xs:attribute name="serialwarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="use">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="helpfile" type="xs:string"/>
        <xs:attribute name="version">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcefiles" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="nohelp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nodeprecated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overview" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javadoc2Type">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="taglet" type="tagletType"/>
            <xs:element name="doclet" type="docletType"/>
            <xs:element name="package" type="packageType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="link" type="linkType"/>
            <xs:element name="doctitle" type="doctitleType"/>
            <xs:element name="bottom" type="bottomType"/>
            <xs:element name="group" type="groupType"/>
            <xs:element name="packageset" type="packagesetType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="source" type="sourceType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="excludepackage" type="excludepackageType"/>
            <xs:element name="tag" type="tagType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bottom" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="header" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="noindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="access">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="protected"/>
                    <xs:enumeration value="public"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="private"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="doclet" type="xs:string"/>
        <xs:attribute name="noqualifier" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="author">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="footer" type="xs:string"/>
        <xs:attribute name="docletpath" type="xs:string"/>
        <xs:attribute name="package">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useexternalfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="protected">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="breakiterator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nonavbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="linkoffline" type="xs:string"/>
        <xs:attribute name="additionalparam" type="xs:string"/>
        <xs:attribute name="linksource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="private">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="nodeprecatedlist">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="stylesheetfile" type="xs:string"/>
        <xs:attribute name="docencoding" type="xs:string"/>
        <xs:attribute name="excludepackagenames" type="xs:string"/>
        <xs:attribute name="docletpathref" type="xs:IDREF"/>
        <xs:attribute name="packagenames" type="xs:string"/>
        <xs:attribute name="windowtitle" type="xs:string"/>
        <xs:attribute name="notree">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="splitindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelist" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="doctitle" type="xs:string"/>
        <xs:attribute name="serialwarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="use">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="helpfile" type="xs:string"/>
        <xs:attribute name="version">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcefiles" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="nohelp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nodeprecated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overview" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javahType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="class" type="classType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="stubs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jjdocType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="text">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="onetable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jjtreeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="nodedefaultvoid">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildnodefiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="static">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="nodeprefix" type="xs:string"/>
        <xs:attribute name="nodefactory">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="multi">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visitor">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="nodeusesparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visitorexception" type="xs:string"/>
        <xs:attribute name="nodescopehook">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="nodepackage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jlinkType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="mergefiles" type="mergefilesType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="addfiles" type="addfilesType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="outfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="addfiles" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="mergefiles" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jonasType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="jonasroot" type="xs:string"/>
        <xs:attribute name="keepgeneric">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="additionalargs" type="xs:string"/>
        <xs:attribute name="javac" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="orb" type="xs:string"/>
        <xs:attribute name="jarsuffix" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="genericjarsuffix" type="xs:string"/>
        <xs:attribute name="nogenic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rmicopts" type="xs:string"/>
        <xs:attribute name="javacopts" type="xs:string"/>
        <xs:attribute name="novalidation">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepgenerated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nocompil">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="secpropag">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jpcoverageType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="triggers" type="triggersType"/>
            <xs:element name="filters" type="filtersType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="applet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="recordfromstart">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="coverage"/>
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="all"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="vm">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="java2"/>
                    <xs:enumeration value="jdk118"/>
                    <xs:enumeration value="jdk117"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="workingdir" type="xs:string"/>
        <xs:attribute name="inputfile" type="xs:string"/>
        <xs:attribute name="snapshotdir" type="xs:string"/>
        <xs:attribute name="seedname" type="xs:string"/>
        <xs:attribute name="javaexe" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="exitprompt" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="finalsnapshot" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tracknatives">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jpcovmergeType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jpcovreportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="coveragepath" type="coveragepathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="snapshot" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="filters" type="xs:string"/>
        <xs:attribute name="percent" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="executive"/>
                    <xs:enumeration value="summary"/>
                    <xs:enumeration value="detailed"/>
                    <xs:enumeration value="verydetailed"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="html"/>
                    <xs:enumeration value="text"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jsharpcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="baseaddress" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="securescoping">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="purejava">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jspcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="compilerclasspath" type="compilerclasspathType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="webapp" type="webappType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="mapped">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ieplugin" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="compilerclasspath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="uribase" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="webxml" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="uriroot" type="xs:string"/>
        <xs:attribute name="webinc" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="junitType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="formatter" type="formatterType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="batchtest" type="batchtestType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
        </xs:choice>
        <xs:attribute name="fork" type="xs:string"/>
        <xs:attribute name="printsummary" type="xs:string"/>
        <xs:attribute name="haltonfailure" type="xs:string"/>
        <xs:attribute name="showoutput" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="junitreportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="report" type="reportType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cobertura-instrumentType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ignore" type="ignoreType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="datafile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cobertura-reportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded"/>
        <xs:attribute name="format" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="datafile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="formatterType">
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="usefile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="batchtestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="formatter" type="formatterType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="fork" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ignoreType">
        <xs:attribute name="regex" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jvmargType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="libType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="libfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="urlbase" type="xs:string"/>
        <xs:attribute name="includeimpl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeurl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="linecontainsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="contains" type="linecontains_containsType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="linecontains_containsType">
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="linecontainsregexpType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="regexp" type="regexpType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="linetokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="includedelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="linkType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="href" type="xs:string"/>
        <xs:attribute name="offline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelistloc" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="loadfileType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="srcFile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="loadresourceType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyresource" type="propertyresourceType"/>
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="quiet" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="loadpropertiesType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="srcFile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="locationType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macrodefType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="sequential" type="sequentialType"/>
            <xs:element name="element" type="elementType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="text" type="textType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mailType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="bcc" type="bccType"/>
            <xs:element name="message" type="messageType"/>
            <xs:element name="replyto" type="replytoType"/>
            <xs:element name="cc" type="ccType"/>
            <xs:element name="to" type="toType"/>
            <xs:element name="from" type="fromType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cclist" type="xs:string"/>
        <xs:attribute name="messagefile" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="auto"/>
                    <xs:enumeration value="mime"/>
                    <xs:enumeration value="uu"/>
                    <xs:enumeration value="plain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
        <xs:attribute name="subject" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="ssl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tolist" type="xs:string"/>
        <xs:attribute name="mailport" type="xs:string"/>
        <xs:attribute name="messagemimetype" type="xs:string"/>
        <xs:attribute name="bcclist" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="replyto" type="xs:string"/>
        <xs:attribute name="mailhost" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="includefilenames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="majorityType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="allowtie">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="manifestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="section" type="sectionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="mapType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mapperType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="chainedmapper" type="chainedmapperType"/>
            <xs:element name="filtermapper" type="filtermapperType"/>
            <xs:element name="scriptmapper" type="scriptmapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="identity"/>
                    <xs:enumeration value="flatten"/>
                    <xs:enumeration value="glob"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="regexp"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="unpackage"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
        <!-- TODO: define separate globmapper type because it has extra attributes -->
        <!--<xs:attribute name="casesensitive" type="xs:string"/>-->
    </xs:complexType>
    <xs:complexType name="globmapperType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
        <xs:attribute name="casesensitive" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="markerType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="mauditType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="rulespath" type="rulespathType"/>
            <xs:element name="searchpath" type="searchpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="exit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="offsets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="unused">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="fix">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="metamatahome" type="xs:string"/>
        <xs:attribute name="list">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="fullsemanticize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mergefilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="messageType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="mimetype" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="charset" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="metainfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="methodType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="event" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="param" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mimemailType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="bcc" type="bccType"/>
            <xs:element name="message" type="messageType"/>
            <xs:element name="replyto" type="replytoType"/>
            <xs:element name="cc" type="ccType"/>
            <xs:element name="to" type="toType"/>
            <xs:element name="from" type="fromType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cclist" type="xs:string"/>
        <xs:attribute name="messagefile" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="auto"/>
                    <xs:enumeration value="mime"/>
                    <xs:enumeration value="uu"/>
                    <xs:enumeration value="plain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
        <xs:attribute name="subject" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="ssl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tolist" type="xs:string"/>
        <xs:attribute name="mailport" type="xs:string"/>
        <xs:attribute name="messagemimetype" type="xs:string"/>
        <xs:attribute name="bcclist" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="replyto" type="xs:string"/>
        <xs:attribute name="mailhost" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="includefilenames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mkdirType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="modifiedType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="param" type="paramType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="comparator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="equal"/>
                    <xs:enumeration value="rule"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="seldirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="cache">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="propertyfile"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="algorithm">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="hashvalue"/>
                    <xs:enumeration value="digest"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="moveType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enablemultiplemappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="preservelastmodified">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="native2asciiType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="ext" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reverse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="noneType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="notType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="optionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="orType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="osType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="family" type="xs:string"/>
        <xs:attribute name="arch" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="outputpropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4addType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="changelist" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="commandlength" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4changeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4counterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4deleteType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4editType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4fstatType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="changelist" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="showfilter" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4haveType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4integrateType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="branch" type="xs:string"/>
        <xs:attribute name="leavetargetrevision">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="forceintegrate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="enablebaselessmerges">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fromfile" type="xs:string"/>
        <xs:attribute name="reversebranchmappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="propagatesourcefiletype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="nocopynewtargetfiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="restoredeletedrevisions">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4labelType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="desc" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="lock" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4labelsyncType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="delete">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="add">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="p4reopenType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tochange" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4resolveType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="forcetextmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="markersforall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resolvemode" type="xs:string"/>
        <xs:attribute name="redoall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="p4revertType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="revertonlyunchanged">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4submitType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="needsresolveproperty" type="xs:string"/>
        <xs:attribute name="changeproperty" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4syncType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="label" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="packageType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="packagesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="parallelType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="pollinterval" type="xs:string"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="threadsperprocessor" type="xs:string"/>
                <xs:attribute name="timeout" type="xs:string"/>
                <xs:attribute name="threadcount" type="xs:string"/>
                <xs:attribute name="failonany">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="paramType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="patchType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="strip" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="originalfile" type="xs:string"/>
        <xs:attribute name="patchfile" type="xs:string"/>
        <xs:attribute name="reverse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="backups">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ignorewhitespace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathconvertType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="map" type="mapType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="first" type="firstType"/>
            <xs:element name="globmapper" type="globmapperType"/>
            <xs:element name="chainedmapper" type="chainedmapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="pathsep" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="dirsep" type="xs:string"/>
        <xs:attribute name="setonempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="targetos" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathelementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="patternsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="includesfile" type="includesfileType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="permissionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="grant" type="grantType"/>
            <xs:element name="revoke" type="revokeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="prefixlinesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="presentType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="present">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="srconly"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="presetdefType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="name" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="uri" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="project">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="target" type="targetType"/>
                <xs:element name="propertyfile" type="propertyfileType"/>
                <xs:element name="importtypelib" type="importtypelibType"/>
                <xs:element name="sql" type="sqlType"/>
                <xs:element name="cvspass" type="cvspassType"/>
                <xs:element name="p4reopen" type="p4reopenType"/>
                <xs:element name="csc" type="cscType"/>
                <xs:element name="dirname" type="dirnameType"/>
                <xs:element name="p4label" type="p4labelType"/>
                <xs:element name="p4revert" type="p4revertType"/>
                <xs:element name="replaceregexp" type="replaceregexpType"/>
                <xs:element name="get" type="getType"/>
                <xs:element name="jjtree" type="jjtreeType"/>
                <xs:element name="sleep" type="sleepType"/>
                <xs:element name="jarlib-display" type="jarlib-displayType"/>
                <xs:element name="dependset" type="dependsetType"/>
                <xs:element name="zip" type="zipType"/>
                <xs:element name="patch" type="patchType"/>
                <xs:element name="jspc" type="jspcType"/>
                <xs:element name="style" type="styleType"/>
                <xs:element name="test" type="testType"/>
                <xs:element name="tstamp" type="tstampType"/>
                <xs:element name="unwar" type="unwarType"/>
                <xs:element name="icontract" type="icontractType"/>
                <xs:element name="cvschangelog" type="cvschangelogType"/>
                <xs:element name="p4submit" type="p4submitType"/>
                <xs:element name="p4change" type="p4changeType"/>
                <xs:element name="bzip2" type="bzip2Type"/>
                <xs:element name="sync" type="syncType"/>
                <xs:element name="p4delete" type="p4deleteType"/>
                <xs:element name="javadoc" type="javadocType"/>
                <xs:element name="p4integrate" type="p4integrateType"/>
                <xs:element name="translate" type="translateType"/>
                <xs:element name="signjar" type="signjarType"/>
                <xs:element name="chown" type="chownType"/>
                <xs:element name="vajload" type="vajloadType"/>
                <xs:element name="jarlib-available" type="jarlib-availableType"/>
                <xs:element name="buildnumber" type="buildnumberType"/>
                <xs:element name="jpcovmerge" type="jpcovmergeType"/>
                <xs:element name="war" type="warType"/>
                <xs:element name="rename" type="renameType"/>
                <xs:element name="sequential" type="sequentialType"/>
                <xs:element name="serverdeploy" type="serverdeployType"/>
                <xs:element name="property" type="propertyType"/>
                <xs:element name="subant" type="subantType"/>
                <xs:element name="move" type="moveType"/>
                <xs:element name="ildasm" type="ildasmType"/>
                <xs:element name="copydir" type="copydirType"/>
                <xs:element name="fixcrlf" type="fixcrlfType"/>
                <xs:element name="pathconvert" type="pathconvertType"/>
                <xs:element name="record" type="recordType"/>
                <xs:element name="p4sync" type="p4syncType"/>
                <xs:element name="exec" type="execType"/>
                <xs:element name="ccmklabel" type="ccmklabelType"/>
                <xs:element name="p4edit" type="p4editType"/>
                <xs:element name="manifest" type="manifestType"/>
                <xs:element name="maudit" type="mauditType"/>
                <xs:element name="antlr" type="antlrType"/>
                <xs:element name="jpcovreport" type="jpcovreportType"/>
                <xs:element name="execon" type="execonType"/>
                <xs:element name="ant" type="antType"/>
                <xs:element name="xmlvalidate" type="xmlvalidateType"/>
                <xs:element name="xslt" type="xsltType"/>
                <xs:element name="p4resolve" type="p4resolveType"/>
                <xs:element name="gzip" type="gzipType"/>
                <xs:element name="native2ascii" type="native2asciiType"/>
                <xs:element name="ccrmtype" type="ccrmtypeType"/>
                <xs:element name="ear" type="earType"/>
                <xs:element name="input" type="inputType"/>
                <xs:element name="presetdef" type="presetdefType"/>
                <xs:element name="rmic" type="rmicType"/>
                <xs:element name="checksum" type="checksumType"/>
                <xs:element name="mail" type="mailType"/>
                <xs:element name="loadfile" type="loadfileType"/>
                <xs:element name="mimemail" type="mimemailType"/>
                <xs:element name="gunzip" type="gunzipType"/>
                <xs:element name="concat" type="concatType"/>
                <xs:element name="cab" type="cabType"/>
                <xs:element name="touch" type="touchType"/>
                <xs:element name="parallel" type="parallelType"/>
                <xs:element name="splash" type="splashType"/>
                <xs:element name="antcall" type="antcallType"/>
                <xs:element name="typedef" type="typedefType"/>
                <xs:element name="p4have" type="p4haveType"/>
                <xs:element name="filter" type="filterType"/>
                <xs:element name="xmlproperty" type="xmlpropertyType"/>
                <xs:element name="import" type="importType"/>
                <xs:element name="copy" type="copyType"/>
                <xs:element name="jsharpc" type="jsharpcType"/>
                <xs:element name="symlink" type="symlinkType"/>
                <xs:element name="antstructure" type="antstructureType"/>
                <xs:element name="script" type="scriptType"/>
                <xs:element name="rpm" type="rpmType"/>
                <xs:element name="delete" type="deleteType"/>
                <xs:element name="replace" type="replaceType"/>
                <xs:element name="attrib" type="attribType"/>
                <xs:element name="waitfor" type="waitforType"/>
                <xs:element name="untar" type="untarType"/>
                <xs:element name="loadproperties" type="loadpropertiesType"/>
                <xs:element name="available" type="availableType"/>
                <xs:element name="echoproperties" type="echopropertiesType"/>
                <xs:element name="chgrp" type="chgrpType"/>
                <xs:element name="vajexport" type="vajexportType"/>
                <xs:element name="bunzip2" type="bunzip2Type"/>
                <xs:element name="whichresource" type="whichresourceType"/>
                <xs:element name="copyfile" type="copyfileType"/>
                <xs:element name="p4labelsync" type="p4labelsyncType"/>
                <xs:element name="macrodef" type="macrodefType"/>
                <xs:element name="unjar" type="unjarType"/>
                <xs:element name="vbc" type="vbcType"/>
                <xs:element name="mkdir" type="mkdirType"/>
                <xs:element name="condition" type="conditionType"/>
                <xs:element name="cvs" type="cvsType"/>
                <xs:element name="tempfile" type="tempfileType"/>
                <xs:element name="junit" type="junitType"/>
                <xs:element name="junitreport" type="junitreportType"/>
                <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
                <xs:element name="taskdef" type="taskdefType"/>
                <xs:element name="echo" type="echoType"/>
                <xs:element name="java" type="javaType"/>
                <xs:element name="renameext" type="renameextType"/>
                <xs:element name="basename" type="basenameType"/>
                <xs:element name="javadoc2" type="javadoc2Type"/>
                <xs:element name="tar" type="tarType"/>
                <xs:element name="vajimport" type="vajimportType"/>
                <xs:element name="p4fstat" type="p4fstatType"/>
                <xs:element name="setproxy" type="setproxyType"/>
                <xs:element name="p4counter" type="p4counterType"/>
                <xs:element name="ilasm" type="ilasmType"/>
                <xs:element name="apply" type="applyType"/>
                <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
                <xs:element name="jlink" type="jlinkType"/>
                <xs:element name="cvstagdiff" type="cvstagdiffType"/>
                <xs:element name="javacc" type="javaccType"/>
                <xs:element name="chmod" type="chmodType"/>
                <xs:element name="pvcs" type="pvcsType"/>
                <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
                <xs:element name="jar" type="jarType"/>
                <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
                <xs:element name="sound" type="soundType"/>
                <xs:element name="scriptdef" type="scriptdefType"/>
                <xs:element name="defaultexcludes" type="defaultexcludesType"/>
                <xs:element name="blgenclient" type="blgenclientType"/>
                <xs:element name="uptodate" type="uptodateType"/>
                <xs:element name="jjdoc" type="jjdocType"/>
                <xs:element name="genkey" type="genkeyType"/>
                <xs:element name="javah" type="javahType"/>
                <xs:element name="ccmreconfigure" type="ccmreconfigureType"/>
                <xs:element name="fail" type="failType"/>
                <xs:element name="unzip" type="unzipType"/>
                <xs:element name="javac" type="javacType"/>
                <xs:element name="p4add" type="p4addType"/>
                <xs:element name="jpcoverage" type="jpcoverageType"/>
                <xs:element name="depend" type="dependType"/>
                <xs:element name="deltree" type="deltreeType"/>
                <xs:element name="ddcreator" type="ddcreatorType"/>
                <xs:element name="patternset" type="patternsetType"/>
                <xs:element name="assertions" type="assertionsType"/>
                <xs:element name="propertyset" type="propertysetType"/>
                <xs:element name="filterset" type="filtersetType"/>
                <xs:element name="libfileset" type="libfilesetType"/>
                <xs:element name="filterreader" type="filterreaderType"/>
                <xs:element name="scriptfilter" type="scriptfilterType"/>
                <xs:element name="concatfilter" type="concatfilterType"/>
                <xs:element name="extension" type="extensionType"/>
                <xs:element name="fileset" type="filesetType"/>
                <xs:element name="dirset" type="dirsetType"/>
                <xs:element name="filelist" type="filelistType"/>
                <xs:element name="filterchain" type="filterchainType"/>
                <xs:element name="path" type="pathType"/>
                <xs:element name="classfileset" type="classfilesetType"/>
                <xs:element name="selector" type="selectorType"/>
                <xs:element name="xmlcatalog" type="xmlcatalogType"/>
                <xs:element name="description" type="descriptionType"/>
                <xs:element name="mapper" type="mapperType"/>
                <xs:element name="zipfileset" type="zipfilesetType"/>
                <xs:element name="substitution" type="substitutionType"/>
                <xs:element name="extensionSet" type="extensionSetType"/>
                <xs:element name="regexp" type="regexpType"/>
                <xs:element name="var" type="varType"/>
                <xs:element name="if" type="ifType"/>
                <xs:element name="retry" type="retryType"/>
            </xs:choice>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="default" type="xs:string"/>
            <xs:attribute name="basedir" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="propertyType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="userproperty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="environment" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyfileType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="entry" type="entryType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="comment" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertycopyType">
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyrefType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="builtin">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="all"/>
                    <xs:enumeration value="system"/>
                    <xs:enumeration value="commandline"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="regex" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertysetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyref" type="propertyrefType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="negate" type="xs:boolean"/>
        <xs:attribute name="dynamic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="pvcsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="pvcsproject" type="pvcsprojectType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="updateonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="force" type="xs:string"/>
        <xs:attribute name="config" type="xs:string"/>
        <xs:attribute name="workspace" type="xs:string"/>
        <xs:attribute name="pvcsbin" type="xs:string"/>
        <xs:attribute name="pvcsproject" type="xs:string"/>
        <xs:attribute name="filenameformat" type="xs:string"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="repository" type="xs:string"/>
        <xs:attribute name="ignorereturncode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="revision" type="xs:string"/>
        <xs:attribute name="linestart" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="promotiongroup" type="xs:string"/>
        <xs:attribute name="label" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pvcsprojectType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="recordType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="loglevel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="error"/>
                    <xs:enumeration value="warn"/>
                    <xs:enumeration value="info"/>
                    <xs:enumeration value="verbose"/>
                    <xs:enumeration value="debug"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="emacsmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="action">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="start"/>
                    <xs:enumeration value="stop"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="referenceType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="torefid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="regexpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="renameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="renameextType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="toextension" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fromextension" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="replacefilter" type="replacefilterType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="replacetoken" type="replacetokenType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="replacevalue" type="replacevalueType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="propertyfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="summary">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="replacefilterfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacefilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceregexType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceregexpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="substitution" type="substitutionType"/>
            <xs:element name="regexp" type="regexpType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="match" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacestringType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacetokenType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="replacetokensType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="token" type="tokenType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="begintoken" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacevalueType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="replytoType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="reportType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="styledir" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="frames"/>
                    <xs:enumeration value="noframes"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="embed">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="revokeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="actions" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rmicType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="compilerarg" type="compilerargType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verify">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="iiop">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="idlopts" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="sourcebase" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeantruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includejavaruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="idl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="iiopopts" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="stubversion" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rootType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rootfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rpmType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="removesource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="cleanbuilddir">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="removespec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="specfile" type="xs:string"/>
        <xs:attribute name="topdir" type="xs:string"/>
        <xs:attribute name="rpmbuildcommand" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rulespathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="scriptType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="scriptdefType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="element" type="elementType"/>
            <xs:element name="attribute" type="attributeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="language" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="scriptfilterType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="byline">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="token" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="searchpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sectionType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="selectorType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="timestampselectorType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="property" type="xs:string"/>
                <xs:attribute name="outputsetid" type="xs:string"/>
                <xs:attribute name="count" type="xs:string"/>
                <xs:attribute name="age" type="xs:string"/>
                <xs:attribute name="pathSep" type="xs:string"/>
                <xs:attribute name="pathref" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="sequentialType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="serverdeployType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="generic" type="genericType"/>
            <xs:element name="jonas" type="jonasType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="setproxyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="nonproxyhosts" type="xs:string"/>
        <xs:attribute name="proxyhost" type="xs:string"/>
        <xs:attribute name="socksproxyhost" type="xs:string"/>
        <xs:attribute name="proxyport" type="xs:string"/>
        <xs:attribute name="socksproxyport" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="proxyuser" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="proxypassword" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="signjarType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="storepass" type="xs:string"/>
        <xs:attribute name="lazy">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keypass" type="xs:string"/>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="alias" type="xs:string"/>
        <xs:attribute name="sectionsonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keystore" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="sigfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="internalsf">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="storetype" type="xs:string"/>
        <xs:attribute name="signedjar" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sizeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="when">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="less"/>
                    <xs:enumeration value="more"/>
                    <xs:enumeration value="equal"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="units">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="K"/>
                    <xs:enumeration value="k"/>
                    <xs:enumeration value="kilo"/>
                    <xs:enumeration value="KILO"/>
                    <xs:enumeration value="Ki"/>
                    <xs:enumeration value="KI"/>
                    <xs:enumeration value="ki"/>
                    <xs:enumeration value="kibi"/>
                    <xs:enumeration value="KIBI"/>
                    <xs:enumeration value="M"/>
                    <xs:enumeration value="m"/>
                    <xs:enumeration value="mega"/>
                    <xs:enumeration value="MEGA"/>
                    <xs:enumeration value="Mi"/>
                    <xs:enumeration value="MI"/>
                    <xs:enumeration value="mi"/>
                    <xs:enumeration value="mebi"/>
                    <xs:enumeration value="MEBI"/>
                    <xs:enumeration value="G"/>
                    <xs:enumeration value="g"/>
                    <xs:enumeration value="giga"/>
                    <xs:enumeration value="GIGA"/>
                    <xs:enumeration value="Gi"/>
                    <xs:enumeration value="GI"/>
                    <xs:enumeration value="gi"/>
                    <xs:enumeration value="gibi"/>
                    <xs:enumeration value="GIBI"/>
                    <xs:enumeration value="T"/>
                    <xs:enumeration value="t"/>
                    <xs:enumeration value="tera"/>
                    <xs:enumeration value="TERA"/>
                    <xs:enumeration value="Ti"/>
                    <xs:enumeration value="TI"/>
                    <xs:enumeration value="ti"/>
                    <xs:enumeration value="tebi"/>
                    <xs:enumeration value="TEBI"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sleepType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="hours" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="milliseconds" type="xs:string"/>
        <xs:attribute name="minutes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="seconds" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="socketType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="server" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="soundType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fail" type="failsoundType"/>
            <xs:element name="success" type="successType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sourceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sourcepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="splashType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="proxy" type="xs:string"/>
        <xs:attribute name="imageurl" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="showduration" type="xs:string"/>
        <xs:attribute name="useproxy">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="sqlType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="transaction" type="transactionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="continue"/>
                    <xs:enumeration value="stop"/>
                    <xs:enumeration value="abort"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="autocommit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rdbms" type="xs:string"/>
        <xs:attribute name="print">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="driver" type="xs:string"/>
        <xs:attribute name="showheaders">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="delimitertype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="normal"/>
                    <xs:enumeration value="row"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="escapeprocessing">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="caching">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepformat">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delimiter" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfileType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="srcfilelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="stringtokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="suppressdelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delimsaretokens">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delims" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="stripjavacommentsType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="striplinebreaksType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="linebreaks" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="striplinecommentsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="comment" type="commentType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="styleType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="factory" type="factoryType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="param" type="paramType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="outputproperty" type="outputpropertyType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="processor" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="scanincludeddirectories">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reloadstylesheet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="style" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="subantType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="buildpathelement" type="buildpathelementType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="buildpath" type="buildpathType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="property" type="propertyType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="genericantfile" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="inheritall" type="xs:boolean"/>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="antfile" type="xs:string"/>
        <xs:attribute name="buildpathref" type="xs:IDREF"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="buildpath" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="substitutionType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="successType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="loops" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="duration" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="supportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="symlinkType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="linkfilename" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="syncType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="syspropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="syspropertysetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyref" type="propertyrefType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="dynamic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tabstospacesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tablength" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tagType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enabled">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="scope" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tagletType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tailfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="lines" type="xs:string"/>
        <xs:attribute name="skip" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="tarfileset" type="tarfilesetType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tarfile" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="gzip"/>
                    <xs:enumeration value="bzip2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="longfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="warn"/>
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="truncate"/>
                    <xs:enumeration value="gnu"/>
                    <xs:enumeration value="omit"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tarfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="preserveleadingslashes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="mode" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="targetType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="name" type="xs:string" use="required"/>
                <xs:attribute name="if" type="xs:string"/>
                <xs:attribute name="unless" type="xs:string"/>
                <xs:attribute name="depends" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="targetfileType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="targetfilelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="targetfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="taskdefType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="adaptto" type="xs:string"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="report"/>
                    <xs:enumeration value="ignore"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="adapter" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="properties"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tempfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="suffix" type="xs:string"/>
        <xs:attribute name="deleteonexit" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="testType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="syspropertyset" type="syspropertysetType"/>
            <xs:element name="permissions" type="permissionsType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="assertions" type="assertionsType"/>
            <xs:element name="testlet" type="testletType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="jvmargs" type="xs:string"/>
        <xs:attribute name="args" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="forceshowtrace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="jvm" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="showsuccess">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="jvmversion" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="showbanner" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="showtrace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="testletType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="textType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="trim">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="titleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="toType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tokenType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tokenfilterType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="containsstring" type="containsstringType"/>
            <xs:element name="linetokenizer" type="linetokenizerType"/>
            <xs:element name="trim" type="trimType"/>
            <xs:element name="stringtokenizer" type="stringtokenizerType"/>
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="replacestring" type="replacestringType"/>
            <xs:element name="ignoreblank" type="ignoreblankType"/>
            <xs:element name="deletecharacters" type="deletecharactersType"/>
            <xs:element name="containsregex" type="containsregexType"/>
            <xs:element name="filetokenizer" type="filetokenizerType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="delimoutput" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="touchType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="millis" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="datetime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="transactionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="src" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="translateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bundlecountry" type="xs:string"/>
        <xs:attribute name="bundlelanguage" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcencoding" type="xs:string"/>
        <xs:attribute name="bundle" type="xs:string"/>
        <xs:attribute name="bundleencoding" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destencoding" type="xs:string"/>
        <xs:attribute name="bundlevariant" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="starttoken" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="triggersType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="method" type="methodType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="trimType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tstampType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="format" type="formatType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="typeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="typedefType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="adaptto" type="xs:string"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="report"/>
                    <xs:enumeration value="ignore"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="adapter" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="properties"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="unjarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="untarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="gzip"/>
                    <xs:enumeration value="bzip2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="unwarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="unzipType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="uptodateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="srcfiles" type="srcfilesType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="targetfile" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="urlType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="userType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="displayname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vajexportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="exclude" type="excludeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="exportclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportresources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportsources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportdebuginfo">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vajimportType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="importsources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="project" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="importresources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="importclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="vajloadType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="vajproject" type="vajprojectType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="vajprojectType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vbcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="removeintchecks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="optionstrict">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="rootnamespace" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optionexplicit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="optioncompare" type="xs:string"/>
        <xs:attribute name="imports" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="waitforType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="checkeveryunit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="checkevery" type="xs:string"/>
        <xs:attribute name="maxwaitunit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxwait" type="xs:string"/>
        <xs:attribute name="timeoutproperty" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="warType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="lib" type="libType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="classes" type="classesType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="webinf" type="webinfType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="webxml" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warfile" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="wasclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="webappType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="basedir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="webinfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="whichresourceType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="wlclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmlcatalogType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="entity" type="entityType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="catalogpath" type="catalogpathType"/>
            <xs:element name="dtd" type="dtdType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="catalogpathref" type="xs:IDREF"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmlpropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="semanticattributes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keeproot">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="collapseattributes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="validate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="rootdirectory" type="xs:string"/>
        <xs:attribute name="includesemanticattribute">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="xmlvalidateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="dtd" type="dtdType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="lenient">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="xsltType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="factory" type="factoryType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="param" type="paramType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="outputproperty" type="outputpropertyType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="processor" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="scanincludeddirectories">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reloadstylesheet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="style" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipgroupfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="doxygenType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="property">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="fileset" type="filesetType"/>
                    </xs:choice>
                    <xs:attribute name="name" type="xs:string" use="required"/>
                    <xs:attribute name="value" type="xs:string" use="optional"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="versionCompatible" type="xs:string"/>
        <xs:attribute name="doxygenPath" type="xs:string"/>
        <xs:attribute name="configFilename" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="foreachType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="list" type="xs:string"/>
        <xs:attribute name="target" type="xs:string" use="required"/>
        <xs:attribute name="param" type="xs:string"/>
        <xs:attribute name="delimiter" type="xs:string"/>
        <xs:attribute name="inheritall" type="xs:string"/>
        <xs:attribute name="inheritrefs" type="xs:string"/>
        <xs:attribute name="parallel" type="xs:string"/>
        <xs:attribute name="maxThreads" type="xs:string"/>
        <xs:attribute name="trim" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="varType">
        <xs:choice minOccurs="0" maxOccurs="unbounded"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="unset" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ifType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
            <xs:element name="then" type="thenType"/>
            <xs:element name="elseif" type="elseifType"/>
            <xs:element name="else" type="elseType"/>
            <xs:element name="resourcecount" type="resourcecountType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="propertyregexType">
        <xs:attribute name="property" type="xs:string" use="required"/>
        <xs:attribute name="override" type="xs:boolean"/>
        <xs:attribute name="input" type="xs:string" use="required"/>
        <xs:attribute name="regexp" type="xs:string"/>
        <xs:attribute name="select" type="xs:string"/>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="casesensitive" type="xs:string"/>
        <xs:attribute name="global" type="xs:boolean"/>
        <xs:attribute name="defaultValue" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="thenType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="elseifType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="elseType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="mergelogsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="log" type="logType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="destfile" type="xs:string" use="required"/>
        <xs:attribute name="stdout" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="logType">
        <xs:attribute name="file" type="xs:string" use="required"/>
        <xs:attribute name="tool" type="xs:string" use="required"/>
        <xs:attribute name="regex" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="reviewplanType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="destdir" type="xs:string" use="required"/>
        <xs:attribute name="component" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="processreviewplanType">
        <xs:attribute name="in" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="convertreviewlogType">
        <xs:attribute name="input" type="xs:string" use="required"/>
        <xs:attribute name="template" type="xs:string" use="required"/>
        <xs:attribute name="review" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="lintType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="option">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="fileset" type="filesetType"/>
                        <xs:element name="dirset" type="dirsetType"/>
                    </xs:choice>
                    <xs:attribute name="type" type="xs:string" use="optional"/>
                    <xs:attribute name="value" type="xs:string" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="output" type="xs:string" use="required"/>
        <xs:attribute name="lintPath" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="customcopyType">
        <xs:complexContent>
            <xs:extension base="copyType">
                <xs:attribute name="preservereadonly">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="checkcontents">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fopType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="messagelevel" type="xs:string"/>
        <xs:attribute name="userconfig" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmltaskType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="cut" type="cutXmlType"/>
            <xs:element name="copy" type="copyXmlType"/>
            <xs:element name="insert" type="insertXmlType"/>
            <xs:element name="rename" type="renameXmlType"/>
            <xs:element name="remove" type="removeXmlType"/>
            <xs:element name="attr" type="attrXmlType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="sourcebuffer" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="report" type="xs:string"/>
        <xs:attribute name="public" type="xs:string"/>
        <xs:attribute name="system" type="xs:string"/>
        <xs:attribute name="preservetype" type="xs:string"/>
        <xs:attribute name="failWithoutMatch" type="xs:string"/>
        <xs:attribute name="indent" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="outputter" type="xs:string"/>
        <xs:attribute name="omitHeader" type="xs:string"/>
        <xs:attribute name="standalone" type="xs:string"/>
        <xs:attribute name="clearBuffers" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cutXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="buffer" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="attrValue" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="buffer" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="attrValue" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="insertXmlType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="path" type="xs:string" use="required"/>
                <xs:attribute name="buffer" type="xs:string" use="optional"/>
                <xs:attribute name="file" type="xs:string" use="optional"/>
                <xs:attribute name="xml" type="xs:string" use="optional"/>
                <xs:attribute name="position" type="xs:string" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="renameXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="removeXmlType">
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="attrXmlType">
        <xs:attribute name="path" type="xs:string" use="required"/>
        <xs:attribute name="attr" type="xs:string" use="required"/>
        <xs:attribute name="value" type="xs:string" use="optional"/>
        <xs:attribute name="remove" type="xs:boolean" use="optional"/>
    </xs:complexType>
    <xs:complexType name="ftpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="server" type="xs:string"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="getsizeType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="output" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="abldType">
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="output" type="xs:string" use="optional"/>
        <xs:attribute name="test" type="xs:boolean" use="optional"/>
        <xs:attribute name="command" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:token">
                    <xs:enumeration value="build"/>
                    <xs:enumeration value="clean"/>
                    <xs:enumeration value="cleanall"/>
                    <xs:enumeration value="cleanexport"/>
                    <xs:enumeration value="export"/>
                    <xs:enumeration value="final"/>
                    <xs:enumeration value="freeze"/>
                    <xs:enumeration value="help"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="listing"/>
                    <xs:enumeration value="makefile"/>
                    <xs:enumeration value="reallyclean"/>
                    <xs:enumeration value="resource"/>
                    <xs:enumeration value="target"/>
                    <xs:enumeration value="tidy"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="platform" use="optional">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="wins"/>
                    <xs:enumeration value="winscw"/>
                    <xs:enumeration value="gccxml"/>
                    <xs:enumeration value="thumb"/>
                    <xs:enumeration value="arm4at"/>
                    <xs:enumeration value="vc6"/>
                    <xs:enumeration value="cw_ide"/>
                    <xs:enumeration value="armv5"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="variant" use="optional">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="udeb"/>
                    <xs:enumeration value="urel"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="grandType">
        <xs:attribute name="buildfile" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="svnType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="update" type="updateSvnType"/>
            <xs:element name="status" type="statusSvnType"/>
        </xs:choice>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="updateSvnType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string" use="optional"/>
        <xs:attribute name="dir" type="xs:string" use="optional"/>
        <xs:attribute name="recurse" type="xs:string" use="optional"/>
        <xs:attribute name="revision" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="statusSvnType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="textStatusProperty" type="xs:string" use="optional"/>
        <xs:attribute name="propStatusProperty" type="xs:string" use="optional"/>
        <xs:attribute name="revisionProperty" type="xs:string" use="optional"/>
        <xs:attribute name="lastChangedRevisionProperty" type="xs:string" use="optional"/>
        <xs:attribute name="lastCommitAuthorProperty" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="antunitType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="plainlistener" type="plainlistenerType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="plainlistenerType"/>
    <xs:complexType name="schemavalidateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="schema" type="schemaType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="noNamespaceFile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pythonType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="outputproperty" type="xs:string"/>
                <xs:attribute name="resultproperty" type="xs:string"/>
                <xs:attribute name="failonerror" type="xs:string"/>
                <xs:attribute name="script" type="xs:string"/>
                <xs:attribute name="dir" type="xs:string"/>
                <xs:attribute name="output" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="forType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="sequential" type="sequentialType"/>
        </xs:choice>
        <xs:attribute name="list" type="xs:string"/>
        <xs:attribute name="param" type="xs:string"/>
        <xs:attribute name="delimiter" type="xs:string"/>
        <xs:attribute name="parallel" type="xs:string"/>
        <xs:attribute name="keepgoing" type="xs:string"/>
        <xs:attribute name="threadCount" type="xs:string"/>
        <xs:attribute name="trim" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="chainedmapperType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="flattenmapper" type="flattenmapperType"/>
            <xs:element name="globmapper" type="globmapperType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="flattenmapperType"/>
    <xs:complexType name="antformType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="label" type="xs:string"/>
            <xs:element name="separator"/>
            <xs:element name="tab">
                <xs:complexType>
                    <xs:attribute name="label" type="xs:string"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="fileSelectionProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="directoryChooser" type="xs:string"/>
                    <xs:attribute name="required" type="xs:boolean"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="selectionProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="values" type="xs:string"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="separator" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="textProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="required" type="xs:boolean"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="password" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="title" type="xs:string"/>
        <xs:attribute name="image" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mathType">
        <xs:attribute name="result" type="xs:string"/>
        <xs:attribute name="datatype" type="xs:string"/>
        <xs:attribute name="strict" type="xs:boolean"/>
        <xs:attribute name="operation" type="xs:string"/>
        <xs:attribute name="operand1" type="xs:string"/>
        <xs:attribute name="operand2" type="xs:string"/>
        <!-- TODO: define nested elements -->
    </xs:complexType>
    <xs:complexType name="antserverType">
        <xs:attribute name="port" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="shellscriptType" mixed="true">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="arg">
                <xs:complexType>
                    <xs:attribute name="value" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="shell" type="xs:string"/>
        <xs:attribute name="tmpsuffix" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="runtargetType">
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="echoxmlType">
        <xs:choice maxOccurs="unbounded">
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="trycatchType">
        <xs:sequence>
            <xs:element name="try">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="taskcontainerType"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="catch">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="taskcontainerType"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcecountType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
        </xs:choice>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="when" type="xs:string"/>
        <xs:attribute name="count" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="remoteantType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="runtarget" type="runtargetType"/>
        </xs:choice>
        <xs:attribute name="machine" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="persistent" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyresourceType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="firstType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="count" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="sortType">
        <xs:choice maxOccurs="unbounded">
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="schemaType">
        <xs:attribute name="namespace" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="retryType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="sleepTime" type="xs:string"/>
                <xs:attribute name="retryCount" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="antcallbackType">
        <xs:complexContent>
            <xs:extension base="antcallType">
                <xs:attribute name="return" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="diagnosticsType"/>
    <xs:complexType name="sshexecType">
        <xs:attribute name="host" type="xs:string"/>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="trust" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:boolean"/>
    </xs:complexType>
    <xs:complexType name="scpType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="localFile" type="xs:string"/>
        <xs:attribute name="remoteFile" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="localTodir" type="xs:string"/>
        <xs:attribute name="localTofile" type="xs:string"/>
        <xs:attribute name="remoteTodir" type="xs:string"/>
        <xs:attribute name="remoteTofile" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="trust" type="xs:string"/>
        <xs:attribute name="knownhosts" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="keyfile" type="xs:string"/>
        <xs:attribute name="passphrase" type="xs:string"/>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="sftp" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xcluderType">
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="assertTrueType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="assertFileExistsType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="file" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fmppType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="data">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="expandProperties" type="xs:string"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="sourceFile" type="xs:string"/>
        <xs:attribute name="outputFile" type="xs:string"/>
        <xs:attribute name="sourceRoot" type="xs:string"/>
        <xs:attribute name="outputRoot" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="replaceExtension" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="databaseType">
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="logextractType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="file" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="signalType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="result" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependenciesType">
        <xs:attribute name="format" type="xs:string"/>
    </xs:complexType>
    <!-- Presets -->
    <xs:complexType name="preset.mailType">
        <xs:complexContent>
            <xs:extension base="mailType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="preset.execType">
        <xs:complexContent>
            <xs:extension base="execType"/>
        </xs:complexContent>
    </xs:complexType>
    <!-- Macros -->
    <xs:complexType name="macro.compile.htmlscanlogType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.cmakerType">
        <xs:attribute name="ncp" type="xs:string"/>
        <xs:attribute name="s60" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.genxmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="configuration" type="xs:string"/>
        <xs:attribute name="log" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.ebsType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="log" type="xs:string"/>
        <xs:attribute name="threads" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.build.ebs.xmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="logname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.log.htmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.bldmake-bldfilesType">
        <xs:attribute name="dir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.abldType">
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="platform" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.filtered-record-startType"/>
    <xs:complexType name="macro.filtered-record-stopType">
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.update-statusType"/>
    <xs:complexType name="macro.create-cshelp-bldinfType">
        <xs:attribute name="delivery" type="xs:string"/>
        <xs:attribute name="product" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="createDeltaZipMacroType">
        <xs:attribute name="variant" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.rombuild-imakerType">
        <xs:attribute name="product" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.imakerType">
        <xs:attribute name="product" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="makefile" type="xs:string"/>
        <xs:attribute name="cmd" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.ccm-availableType">
        <xs:attribute name="resultproperty" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.publishType"/>
    <xs:complexType name="macro.rom-buildType">
        <xs:attribute name="stage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.disk-spaceType">
        <xs:attribute name="drive" type="xs:string"/>
        <xs:attribute name="space" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.notifyType">
        <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.netrc-passwordType">
        <xs:attribute name="output-prop" type="xs:string"/>
        <xs:attribute name="result-prop" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.netrc-usernameType">
        <xs:attribute name="output-prop" type="xs:string"/>
        <xs:attribute name="result-prop" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.genxml-mergeType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.declare.idType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="macro.mail-target-completedType">
        <xs:attribute name="section" type="xs:string"/>
        <xs:attribute name="sms" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipContentMacroType">
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.delete-fota-confType">
        <xs:attribute name="product" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.rombuild.valueType">
        <xs:attribute name="product.name" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="rombuild.value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="hlm-assertType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="hlm-assertFileExistsType">
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="reference-to-fileType">
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.xml.to.fmtlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="xmlroot" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.temp.record.startType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.temp.record.stopType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <!--
    
    <xs:complexType name="Type">
        <xs:attribute name="" type="xs:string"/>
    </xs:complexType>
    -->
</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/schema/antunit.xsd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="org.apache.ant.antunit"
+           xmlns:au="org.apache.ant.antunit"
+           xmlns:ant="ant.apache.org"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+    
+    <xs:element name="assertPropertyEquals">
+    <xs:complexType>
+        <xs:attribute name="name" type="xs:string"/>
+        <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+    <xs:element name="assertLogDoesntContain">
+    <xs:complexType>
+        <xs:attribute name="text" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+    <xs:element name="assertPropertySet">
+    <xs:complexType>
+        <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+   
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/schema/helium_ant.xsd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.nokia.com/helium"
+           xmlns:ant="ant.apache.org"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+    <xs:import schemaLocation="ant.xsd"/>
+    
+    <xs:element name="configuration">
+    <xs:complexType>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="fileset" type="ant:filesetType"/>
+        </xs:choice>
+        <xs:attribute name="file" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+    <xs:element name="database">
+    <xs:complexType>
+        <xs:attribute name="output" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+    <xs:element name="logextract">
+    <xs:complexType>
+        <xs:complexContent>
+            <xs:extension base="ant:resourceCollectionContainerType">
+                <xs:attribute name="file" type="xs:string"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+    </xs:element>
+    <xs:element name="signal">
+    <xs:complexType>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="fileset" type="ant:filesetType"/>
+        </xs:choice>
+        <xs:attribute name="name" type="xs:string"/>
+        <xs:attribute name="result" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+    <xs:element name="dependencies">
+    <xs:complexType>
+        <xs:attribute name="format" type="xs:string"/>
+    </xs:complexType>
+    </xs:element>
+    
+    <xs:element name="fooMacro">
+        <xs:complexType/>
+    </xs:element>
+    <xs:element name="compileHtmlscanlogMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="output" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="cmakerMacro">
+        <xs:complexType>
+            <xs:attribute name="ncp" type="xs:string"/>
+            <xs:attribute name="s60" type="xs:string"/>
+            <xs:attribute name="action" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="compileGenxmlMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="output" type="xs:string"/>
+            <xs:attribute name="configuration" type="xs:string"/>
+            <xs:attribute name="log" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="compileEbsMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="log" type="xs:string"/>
+            <xs:attribute name="threads" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="buildEbsXmlMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="logname" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="logHtmlMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="output" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="bldmakeBldfilesMacro">
+        <xs:complexType>
+            <xs:attribute name="dir" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="abldMacro">
+        <xs:complexType>
+            <xs:attribute name="dir" type="xs:string"/>
+            <xs:attribute name="command" type="xs:string"/>
+            <xs:attribute name="platform" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="filterRecordStartMacro">
+        <xs:complexType/>
+    </xs:element>
+    <xs:element name="filterRecordStopMacro">
+        <xs:complexType>
+            <xs:attribute name="pattern" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="updateStatusMacro">
+        <xs:complexType/>
+    </xs:element>
+    <xs:element name="createCshelpBldinfMacro">
+        <xs:complexType>
+            <xs:attribute name="delivery" type="xs:string"/>
+            <xs:attribute name="product" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="createDeltaZipMacro">
+        <xs:complexType>
+            <xs:attribute name="variant" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="rombuildImakerMacro">
+        <xs:complexType>
+            <xs:attribute name="product" type="xs:string"/>
+            <xs:attribute name="target" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="ecImakerMacro">
+        <xs:complexType>
+            <xs:attribute name="makefile.target" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="preECImakerMacro">
+        <xs:complexType/>
+    </xs:element>
+    <xs:element name="imakerMacro">
+        <xs:complexType>
+            <xs:attribute name="product" type="xs:string"/>
+            <xs:attribute name="target" type="xs:string"/>
+            <xs:attribute name="makefile" type="xs:string"/>
+            <xs:attribute name="cmd" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="ccmAvailableMacro">
+        <xs:complexType>
+            <xs:attribute name="resultproperty" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="publishMacro">
+        <xs:complexType/>
+    </xs:element>
+    <xs:element name="rombuildMacro">
+        <xs:complexType>
+            <xs:attribute name="stage" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="diskspaceMacro">
+        <xs:complexType>
+            <xs:attribute name="drive" type="xs:string"/>
+            <xs:attribute name="space" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="notifyMacro">
+        <xs:complexType>
+            <xs:attribute name="message" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="netrcPasswordMacro">
+        <xs:complexType>
+            <xs:attribute name="output-prop" type="xs:string"/>
+            <xs:attribute name="result-prop" type="xs:string"/>
+            <xs:attribute name="type" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="netrcUsernameMacro">
+        <xs:complexType>
+            <xs:attribute name="output-prop" type="xs:string"/>
+            <xs:attribute name="result-prop" type="xs:string"/>
+            <xs:attribute name="type" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="compileGenxmlMergeMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="output" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="declareIdMacro">
+        <xs:complexType>
+            <xs:attribute name="id" type="xs:ID"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="mailTargetCompletedMacro">
+        <xs:complexType>
+            <xs:attribute name="section" type="xs:string"/>
+            <xs:attribute name="sms" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="zipContentMacro">
+        <xs:complexType>
+            <xs:attribute name="type" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="deleteFotaConfMacro">
+        <xs:complexType>
+            <xs:attribute name="product" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="rombuildValueMacro">
+        <xs:complexType>
+            <xs:attribute name="product.name" type="xs:string"/>
+            <xs:attribute name="outputproperty" type="xs:string"/>
+            <xs:attribute name="rombuild.value" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="assert">
+        <xs:complexType>
+            <xs:attribute name="message" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="assertFileExists">
+        <xs:complexType>
+            <xs:attribute name="file" type="xs:string"/>
+            <xs:attribute name="message" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="referenceToFileMacro">
+        <xs:complexType>
+            <xs:attribute name="refid" type="xs:string"/>
+            <xs:attribute name="output" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="xmlToFmtlMacro">
+        <xs:complexType>
+            <xs:attribute name="input" type="xs:string"/>
+            <xs:attribute name="xmlroot" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="tempRecordStartMacro">
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="tempRecordStopMacro">
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/schema/helium_config.xsd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSPY v2004 rel. 3 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="build">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="spec"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="set">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="value" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="spec">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="spec" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="abstract" type="xs:boolean"/>
            <xs:attribute name="type">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="checkout"/>
                        <xs:enumeration value="snapshot"/>
                        <xs:enumeration value="flash"/>
                        <xs:enumeration value="core"/>
                        <xs:enumeration value="languagepack"/>
                        <xs:enumeration value="customer"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/schema/helium_data_model.xsd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1 @@
+<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSPY v2004 rel. 3 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="description" type="xs:string"/>
    <xs:element name="deprecated" type="xs:string"/>
    <xs:element name="enumeration">
        <xs:complexType>
            <xs:attribute name="value" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="ebs"/>
                        <xs:enumeration value="ec"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="group">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="description"/>
                <xs:element ref="propertyRef" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="heliumDataModel">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="property" maxOccurs="unbounded"/>
                <xs:element ref="group" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="property">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element ref="name"/>
                <xs:element ref="usage" minOccurs="0"/>
                <xs:element ref="type" minOccurs="0"/>
                <xs:element name="editStatus">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="must"/>
                            <xs:enumeration value="recommended"/>
                            <xs:enumeration value="allowed"/>
                            <xs:enumeration value="discouraged"/>
                            <xs:enumeration value="never"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element ref="description"/>
                <xs:element ref="deprecated" minOccurs="0"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="propertyRef">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="usage" use="required">
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="optional"/>
                                <xs:enumeration value="required"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="restriction">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="enumeration" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="base" type="xs:QName" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="type">
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="restriction"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="usage">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="optional"/>
                <xs:enumeration value="required"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/schema/helium_internaldata.xsd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) by William Bernardet (None) -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+	<xs:complexType name="T_tasks">
+		<xs:sequence>
+			<xs:element ref="task" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="T_taskRef">
+		<xs:attribute name="thread" type="xs:string"/>
+		<xs:attribute name="startTime" type="xs:long" use="required"/>
+		<xs:attribute name="reference" type="xs:string"/>
+		<xs:attribute name="endTime" type="xs:long" use="required"/>
+	</xs:complexType>
+	<xs:complexType name="T_task">
+		<xs:attribute name="name" type="xs:string" use="required"/>
+		<xs:attribute name="id" type="xs:string"/>
+	</xs:complexType>
+	<xs:complexType name="T_targets">
+		<xs:sequence>
+			<xs:element ref="target"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="T_targetRef">
+		<xs:sequence>
+			<xs:element ref="taskRef" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="thread" type="xs:string"/>
+		<xs:attribute name="startTime" type="xs:long" use="required"/>
+		<xs:attribute name="reference" type="xs:string" use="required"/>
+		<xs:attribute name="endTime" type="xs:long" use="required"/>
+	</xs:complexType>
+	<xs:complexType name="T_target">
+		<xs:attribute name="name" type="xs:string" use="required"/>
+		<xs:attribute ref="line" use="required"/>
+		<xs:attribute name="id" type="xs:string" use="required"/>
+		<xs:attribute ref="file" use="required"/>
+	</xs:complexType>
+	<xs:complexType name="T_statistics">
+		<xs:sequence>
+			<xs:element ref="database"/>
+			<xs:element ref="targets"/>
+			<xs:element ref="tasks"/>
+			<xs:element ref="executionTree"/>
+			<xs:element ref="properties"/>
+		</xs:sequence>
+		<xs:attribute ref="version" use="required"/>
+	</xs:complexType>
+	<xs:complexType name="T_property">
+		<xs:attribute ref="value" use="required"/>
+		<xs:attribute name="name" use="required"/>
+	</xs:complexType>
+	<xs:complexType name="T_properties">
+		<xs:sequence>
+			<xs:element ref="property" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="T_executionTree">
+		<xs:sequence>
+			<xs:element ref="build"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="T_build">
+		<xs:sequence>
+			<xs:element ref="targetRef"/>
+		</xs:sequence>
+		<xs:attribute name="thread" type="xs:string"/>
+		<xs:attribute name="startTime" type="xs:long" use="required"/>
+		<xs:attribute name="name" use="required"/>
+		<xs:attribute name="endTime" type="xs:long" use="required"/>
+	</xs:complexType>
+	<xs:attribute name="version">
+		<xs:simpleType>
+			<xs:restriction base="xs:string">
+				<xs:enumeration value="1.0"/>
+			</xs:restriction>
+		</xs:simpleType>
+	</xs:attribute>
+	<xs:attribute name="value"/>
+	<xs:attribute name="line" type="xs:int"/>
+	<xs:attribute name="file" type="xs:string"/>
+	<xs:element name="tasks" type="T_tasks"/>
+	<xs:element name="taskRef" type="T_taskRef"/>
+	<xs:element name="task" type="T_task"/>
+	<xs:element name="targets" type="T_targets"/>
+	<xs:element name="targetRef" type="T_targetRef"/>
+	<xs:element name="target" type="T_target"/>
+	<xs:element name="statistics" type="T_statistics">
+		<xs:key name="targetKey">
+			<xs:selector xpath="./targets/target"/>
+			<xs:field xpath="@id"/>
+		</xs:key>
+		<xs:keyref name="targetKeyRef" refer="targetKey">
+			<xs:selector xpath="./executionTree/targetRef"/>
+			<xs:field xpath="@reference"/>
+		</xs:keyref>
+		<xs:key name="taskKey">
+			<xs:selector xpath="./tasks/task"/>
+			<xs:field xpath="@id"/>
+		</xs:key>
+		<xs:keyref name="taskKeyRef" refer="taskKey">
+			<xs:selector xpath="./executionTree/taskRef"/>
+			<xs:field xpath="@reference"/>
+		</xs:keyref>
+	</xs:element>
+	<xs:element name="property" type="T_property"/>
+	<xs:element name="properties" type="T_properties"/>
+	<xs:element name="executionTree" type="T_executionTree"/>
+	<xs:element name="database" type="xs:string"/>
+	<xs:element name="build" type="T_build"/>
+	<xs:complexType name="T_database"/>
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/svn-ccm-sync.bc.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,13 @@
+
+criteria rules-based
+filter "-.svn\;-*.class"
+
+load %1 %2
+select diff.files
+expand all
+
+#file-report layout:side-by-side output-to:%3
+folder-report layout:side-by-side options:display-mismatches output-to:"bc_diff.txt"
+#file-report layout:side-by-side options:display-mismatches output-to:"bc_diff.txt"
+
+#copy lt->rt
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/clean_pc.ant.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+<#--
+============================================================================ 
+Name        : clean_pc.ant.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+    
+
+<project default="do-clean-build-areas">
+    <target name="do-clean-build-areas">
+        <antform title="Clean build areas">
+        <#list buildAreaDirs as dir>
+            <booleanProperty label="${dir}" property="${dir_index}"/>
+        </#list>
+        </antform>
+        
+        <parallel threadCount="${r'$'}{number.of.threads}">
+            <#list buildAreaDirs as dir>
+            <if>
+                <isset property="${dir_index}"/>
+                <then>
+                    <shellscript shell="cmd.exe" tmpsuffix=".bat" dir="${prepRootDir}">
+                        <arg value="/c"/>
+                        <arg value="call"/>
+                        rmdir /s/q ${dir}
+                    </shellscript>
+                </then>
+            </if>
+            </#list>
+        </parallel>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/codescanner/codescanner.ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<#--
+============================================================================ 
+Name        : codescanner.ant.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="codescanner_fmpp" default="all">
+<#assign dollar="$"/>
+    <target name="all">
+<#assign scanid=1/>
+<#assign config=""/>
+        <#list data['inputs'] as input>
+            <exec executable="${data['executable']}">
+                <arg line="-c ${data['config']}"/>
+                <arg line="-o${data['output_fmt']}"/>
+                <arg line="${input}"/>
+                <arg line="${data['output_dir']}\${data['outputs'][scanid - 1]}"/>
+            </exec>
+            <#assign scanid=scanid+1/>
+        </#list>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/codescanner/codescanner.mk.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+<#--
+============================================================================ 
+Name        : codescanner.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+###################################################################
+# Template for CodeScanner.
+###################################################################
+<#assign all_target="codescanner: "/>
+<#assign scanid=1/>
+<#list data['inputs'] as input>
+codescan${scanid}:
+	${data['executable']} -c ${data['config']} -o${data['output_fmt']} ${input} ${data['output_dir']}\${data['outputs'][scanid - 1]}
+
+<#assign all_target ="${all_target}\\\n\tcodescan${scanid} "/>
+<#assign scanid=scanid + 1/>
+</#list>
+
+
+${all_target}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/coveragerecord.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#assign totalTargets=0>
+<#assign execTargets=0>
+<#assign totalTasks=0>
+<#assign execTasks=0>
+<#list database.antDatabase.project.target as target>
+<#if target_has_next == false>
+<#assign totalTargets = target_index>
+</#if>
+<#list target?children as targetElement>
+<#if targetElement?node_name == "tasks">
+<#assign totalTasks = totalTasks + (targetElement.@@text)?number>
+</#if>
+</#list>
+</#list>
+<#list doc.build?children as childElement>
+<#if childElement?node_name == "task">
+<#list childElement?children as child>
+<#if child?node_name == "target">
+<@elementFunc element=child/>
+</#if>
+</#list>
+</#if>
+</#list>
+<#macro elementFunc element>
+<#if element?node_name == "target">
+<#assign execTargets = execTargets + 1>
+<#list element?children as child>
+<@elementFunc element=child/>
+</#list>
+<#elseif element?node_name == "task">
+<#assign execTasks = execTasks + 1>
+<#list element?children as child>
+<@elementFunc element=child/>
+</#list>
+</#if>
+</#macro>
+<h2>Ant Code Coverage</h2>
+<p>Total Targets: ${totalTargets}</p>
+<p>Executed Targets: ${execTargets}</p>
+<p>Percentage Targets: ${(execTargets/totalTargets*100)?int}</p>
+<p>Total Tasks: ${totalTasks}</p>
+<p>Executed Tasks: ${execTasks}</p>
+<p>Percentage Tasks: ${(execTasks/totalTasks*100)?int}</p>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/coveragerecord.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+<#--
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#assign totalTargets=0>
+<#assign execTargets=0>
+<#assign totalTasks=0>
+<#assign execTasks=0>
+<#list database.antDatabase.project.target as target>
+<#if target_has_next == false>
+<#assign totalTargets = target_index>
+</#if>
+<#list target?children as targetElement>
+<#if targetElement?node_name == "tasks">
+<#assign totalTasks = totalTasks + (targetElement.@@text)?number>
+</#if>
+</#list>
+</#list>
+<#list doc.build?children as childElement>
+<#if childElement?node_name == "task">
+<#list childElement?children as child>
+<#if child?node_name == "target">
+<@elementFunc element=child/>
+</#if>
+</#list>
+</#if>
+</#list>
+<#macro elementFunc element>
+<#if element?node_name == "target">
+<#assign execTargets = execTargets + 1>
+<#list element?children as child>
+<@elementFunc element=child/>
+</#list>
+<#elseif element?node_name == "task">
+<#assign execTasks = execTasks + 1>
+<#list element?children as child>
+<@elementFunc element=child/>
+</#list>
+</#if>
+</#macro>
+Ant Code Coverage
+------------------
+
++---------+-------+-----------+-----------+
+|type     |total  |executed   |%executed  |
++=========+=======+===========+===========+
+|target   |${totalTargets}      |${execTargets}      |${(execTargets/totalTargets*100)?int}     |
++---------+-------+-----------+-----------+
+|task     |${totalTasks}      |${execTasks}        |${(execTasks/totalTasks*100)?int}     |
++---------+-------+-----------+-----------+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/db2xml.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+<#--
+============================================================================ 
+Name        : bmd.macros.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader', "${dbPath}") >
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="${log}">
+<build>
+
+<#list table_info['select * from metadata INNER JOIN logfiles ON logfiles.id=metadata.logpath_id INNER JOIN priority ON priority.id=metadata.priority_id where priority=\'ERROR\' and path like \'${r\'%\'}${log}\''] as recordentry >
+<message priority="error"><![CDATA[${recordentry['data']}]]></message>
+</#list>
+
+</build>
+</log>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/apimetrics.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+<#--
+============================================================================ 
+Name        : apimetrics.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl">
+    <#if (doc)??>
+    <apis>
+        <count type="sdk"><@totalNoOfRelease type="sdk"/></count>
+        <count type="domain"><@totalNoOfRelease type="domain"/></count>
+        <count type="internal"><@totalNoOfRelease type="internal"/></count>
+        <count type="private"><@totalNoOfRelease type="private"/></count>
+    <illegal-apis>
+    <#list doc.api_dataset.api as illegal>
+        <#if illegal.release.@category == 'private'>
+            <api>${illegal.buildfiles.file.path}</api>
+        </#if>
+        <#if illegal.release.@category == 'internal'>
+            <api>${illegal.buildfiles.file.path}</api>
+        </#if>
+    </#list>
+    </illegal-apis>
+    </apis>
+    </#if>
+<#include "diamonds_footer.ftl">
+<#if (doc)?? >
+<#macro totalNoOfRelease type>
+    <#assign count = 0>
+<#list doc.api_dataset.api as apinode>
+        <#if apinode.release.@category == '${type}'>
+            <#assign count = count + 1>
+        </#if>
+    </#list>
+${count}</#macro>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/codescanner.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+  <#--
+============================================================================ 
+Name        : codescanner.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#include "diamonds_header.ftl">
+  <faults>
+    <#if (doc)?? >
+      <total severity="codescanner_high"><@totalNoOfSeverity type="high"/></total>
+      <total severity="codescanner_medium"><@totalNoOfSeverity type="medium"/></total>
+      <total severity="codescanner_low"><@totalNoOfSeverity type="low"/></total>
+    </#if>
+  </faults>
+<#include "diamonds_footer.ftl">
+<#macro totalNoOfSeverity type>
+  <#assign count = 0>
+<#if (doc)?? >
+<#list doc["problemIndex/category/problem[@severity='${type}']/file"] as problem>
+    <#list problem?split("\n") as lineNo>
+        <#if lineNo?matches(".*[0-9].*")>
+            <#assign count = count + 1>
+        </#if>
+    </#list>
+</#list>
+</#if>
+${count}</#macro>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/compile.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+<#--
+============================================================================ 
+Name        : compile.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+    <build>    
+        <#if ant?keys?seq_contains("object.files")><objects>${ant["object.files"]}</objects></#if>
+        <#if ant?keys?seq_contains("generated.files")><generated_files>${ant["generated.files"]}</generated_files></#if>
+    </build>
+<#if doc?? >
+    <faults>
+        <#list doc.compile.components.component as component>
+        <component>
+            <name>${component.@name}</name>
+            <total severity="error">${component.@error}</total>
+            <total severity="warning">${component.@warning}</total>
+        </component>
+        </#list>
+        <!-- print summary of the errors -->
+        <total severity="error">${doc.compile.total.@error}</total>      
+        <total severity="warning">${doc.compile.total.@warning}</total>
+        <total severity="warning_rvct_other">0</total>
+        <!-- todo update to calculate the correct value -->
+        <total severity="warning_rvct_bad">${doc.compile.total.@critical}</total>
+    </faults>
+    <components>
+        <#list doc.compile.components.component as component>
+        <component>${component.@name}</component>
+        </#list>
+    </components>
+</#if>
+<#include "diamonds_footer.ftl"> 
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_build.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+<#--
+============================================================================ 
+Name        : build.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <category>${ant["build.family"]}</category>
+    <name>${ant["build.id"]}</name>
+    <#if diamonds?keys?seq_contains("build.start.time")><started>${diamonds["build.start.time"]}</started></#if>
+    <#if diamonds?keys?seq_contains("build.end.time")><finished>${diamonds["build.end.time"]}</finished></#if>
+        <creator>${ant["env.USERNAME"]}</creator>
+        <hostname>${ant["env.COMPUTERNAME"]}</hostname>
+        <product>${ant["build.name"]}</product>
+        <build_system>${ant["build.system"]}</build_system>
+    <#if ant?keys?seq_contains("env.NUMBER_OF_PROCESSORS")><processor_count>${ant["env.NUMBER_OF_PROCESSORS"]}</processor_count></#if>
+</build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_faults.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+<#--
+============================================================================ 
+Name        : faults.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_macro.ftl"> 
+  <#if doc?? >
+      <@printall type='error'/>
+  </#if>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_finish.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<#--
+============================================================================ 
+Name        : finish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+  <build>
+    <#if diamonds?keys?seq_contains("build.end.time")><finished>${diamonds["build.end.time"]}</finished></#if>
+  </build>
+<#include "diamonds_footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_footer.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : footer.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+</diamonds-build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_header.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+<#--
+============================================================================ 
+Name        : header.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_macro.ftl">
+<?xml version="1.0" encoding="UTF-8"?>
+<diamonds-build>
+    <schema>${schema_version}</schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_locations.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+<#--
+============================================================================ 
+Name        : locations.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<locations>
+    <#if ant?keys?seq_contains("release.grace.dir") &&  !(ant["release.grace.dir"]?contains("${"))>
+        <location>
+               <link>${ant["release.grace.dir"]}</link>
+               <description>GRACE server</description>
+        </location>
+    </#if>
+    <#if ant?keys?seq_contains("publish.dir.list")>
+        <#list ant["publish.dir.list"]?split(",") as path>
+            <#if !path?contains("${")>
+                <location>
+                       <link>${path}</link>
+                       <description>Shared drive</description>
+                </location>
+            </#if>
+        </#list>
+    </#if>
+    <#if (ant?keys?seq_contains("publish.dir") && !ant["publish.dir"]?contains("${"))>
+        <location>
+            <link>${ant["publish.dir"]}</link>
+            <description>Shared drive</description>
+        </location>
+    </#if>
+</locations>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_macro.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+<#--
+============================================================================ 
+Name        : macro.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#setting number_format="0">
+<#macro numberof regex type>
+    <#assign count = 0>
+<#if doc?? >
+    <#list doc.logSummary.log as lognode>
+        <#if lognode.@filename[0]?matches(regex)>
+            <#assign count = count + lognode.build[".//message[@priority='${type}']"]?size>
+        </#if>
+    </#list>
+</#if>
+${count}</#macro>
+<#macro printfaults regex type>
+</#macro>
+
+<#macro printcomponents regex>
+</#macro>
+<#macro printall type>
+    <#if doc?? >
+        <#assign componentname="">
+        <#assign components="">
+        <#assign componenterrors = 0>
+        <#assign totalerrors = 0>
+        <#assign totalwarnings = 0>
+        <#assign componentwarnings = 0>
+        <#assign componentcriticals = 0>
+        <#assign totalcriticals = 0>
+        <#assign ls=doc.logSummary["//task/task/@name"]?sort>
+        <!-- print all the fault info -->
+        <faults>
+        <#list ls as task>
+            <#assign currenttask=task?parent>
+            <#assign parenttask=currenttask?parent>
+            <#assign currentcomponentname="${task}">
+            <#if componentname == "">
+                <#assign componentname="${task?parent.@name}">
+                <#assign components="${componentname}">
+            </#if>
+            <#if componentname != currentcomponentname>
+            <component>
+                <name>${componentname}</name>
+                <total severity="error">${componenterrors}</total>
+                <total severity="warning">${componentwarnings}</total>
+            </component>
+                <#assign componentname=currentcomponentname>
+                <#assign components= components + ",${componentname}">
+                <#assign totalerrors = totalerrors + componenterrors>
+                <#assign totalwarnings = totalwarnings + componentwarnings>
+                <#assign totalcriticals = totalcriticals + componentcriticals>
+                <#assign componenterrors = 0>
+                <#assign componentwarnings = 0>
+                <#assign componentcriticals = 0>
+            </#if>
+            <#assign componenterrors = componenterrors + currenttask[".//message[@priority='error']"]?size>
+            <#assign componentwarnings = componentwarnings + currenttask[".//message[@priority='warning']"]?size>
+            <#assign componentcriticals = componentcriticals + currenttask[".//message[@priority='critical']"]?size>
+        </#list>
+        <#if componentname!= "">
+            <component>
+                <name>${componentname}</name>
+                <total severity="error">${componenterrors}</total>
+                <total severity="warning">${componentwarnings}</total>
+                <total severity="critical">${componentcriticals}</total>
+            </component>
+        </#if>
+            <!-- print summary of the errors -->
+            <#assign totalerrors = totalerrors + componenterrors>
+            <#assign totalwarnings = totalwarnings + componentwarnings>
+            <total severity="error">${totalerrors}</total>      
+            <total severity="warning">${totalwarnings}</total>
+            <total severity="warning_rvct_other">${totalwarnings}</total>
+            <!-- todo update to calculate the correct value -->
+            <total severity="warning_rvct_bad">${totalcriticals}</total>
+        </faults>
+        <components>
+        <!-- all components -->
+        <#list components?split(",") as component >
+            <#if component != "">
+            <component>${component}</component>
+            </#if>
+        </#list>
+        </components>
+    </#if>
+</#macro>
+<#assign schema_version=13/>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_signal.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<#--
+============================================================================ 
+Name        : finish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+  <signals>
+      <#assign diamondsignalname = ""/>
+      <#assign diamondkeys = diamondSignal?keys>
+      <#list diamondkeys as diamondkey>
+      <#if diamondkey?contains("diamond.signal.name")>
+      <#list diamondkey?split(".") as index>
+      <#assign signalIndex = index/>
+      </#list>
+      <signal>
+      <#list diamondkeys as diamondkey>
+      <#if diamondkey?contains("${signalIndex}")>
+          <#if diamondkey?contains("diamond.signal.name.${signalIndex}")><name>${diamondSignal[diamondkey]}</name></#if>
+          <#if diamondkey?contains("diamond.error.message.${signalIndex}")><message>${diamondSignal[diamondkey]}</message></#if>
+          <#if diamondkey?contains("diamond.time.stamp.${signalIndex}")><timestamp>${diamondSignal[diamondkey]}</timestamp></#if>
+      </#if>
+      </#list>
+      </signal>
+      </#if>
+      </#list>
+  </signals>
+<#include "diamonds_footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_stage.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<#--
+============================================================================ 
+Name        : stage.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+    <stages>
+      <stage>    
+            <name>${ant["logical.stage"]}</name>
+            <#if ant?keys?seq_contains("stage.start.time")><started>${ant["stage.start.time"]}</started></#if>
+            <#if ant?keys?seq_contains("stage.end.time")><finished>${ant["stage.end.time"]}</finished></#if>
+     </stage>
+    </stages>
+<#include "diamonds_footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_start.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<#--
+============================================================================ 
+Name        : start.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+<#include "diamonds_build.xml.ftl">
+<#include "diamonds_locations.ftl">    
+<#include "diamonds_tags.ftl">    
+<#include "diamonds_footer.ftl"> 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_status.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+<#--
+============================================================================ 
+Name        : finish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+  <build>
+    <#if diamonds?keys?seq_contains("build.status")><status>${diamonds["build.status"]}</status></#if>
+  </build>
+<#include "diamonds_footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_tags.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+<#--
+============================================================================ 
+Name        : diamonds-tags.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#if ant?keys?seq_contains("diamonds.build.tags")>
+  <tags>
+  <#list ant["diamonds.build.tags"]?split(",") as key>
+   <#if key?length<=50>
+    <tag>${key}</tag>
+   <#else>
+      <#stop "--> The build tag '${key}' defined in property 'diamonds.build.tags' is too long. The maximum length allowed is 50. Please adjust it accordingly.">
+   </#if>
+  </#list> 
+  </tags>
+</#if>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/faults_metadata.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+<#--
+============================================================================ 
+Name        : macro.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+
+<#setting number_format="0">
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+    <#assign priority_table = table_info['select * from priority'] >
+    <#assign logpath_table = table_info['select * from logfiles'] >
+    <#assign priority_ids = priority_table?keys>
+    <#assign logpath_id = logpath_table?keys>
+    <#assign components = table_info['select * from component where logPath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\'))'] >
+    <faults>
+        <total severity="error">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'ERROR\') and logpath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\'))'][0]['COUNT']}</total>
+        <total severity="warning">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\') )'][0]['COUNT']}</total>
+        <total severity="warning_rvct_other">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'WARNING\') and logpath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\'))'][0]['COUNT']}</total>
+        <!-- todo update to calculate the correct value -->
+        <total severity="warning_rvct_bad">${table_info['select count(data) as COUNT from metadata where priority_id=(select id from priority where priority=\'REMARK\')'][0]['COUNT']}</total>
+    <#list components as component>
+        <component>
+            <name>${component['component']}</name>
+            <total severity="error">${table_info['select count(data) as COUNT from metadata where component_id =${component[\'id\']} and priority_id=(select id from priority where priority=\'ERROR\') and logpath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\'))'][0]['COUNT']}</total>
+            <total severity="warning">${table_info['select count(data) as COUNT from metadata where component_id =${component[\'id\']} and priority_id=(select id from priority where priority=\'WARNING\') and logpath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\'))'][0]['COUNT']}</total>
+            <total severity="critical">${table_info['select count(data) as COUNT from metadata where component_id =${component[\'id\']} and priority_id=(select id from priority where priority=\'REMARK\') and logpath_id in (select id from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\'))'][0]['COUNT']}</total>
+        </component>
+    </#list>
+    </faults>
+    <components>
+    <#list components as component>
+    <!-- all components -->
+        <component>${component['component']}</component>
+    </#list>
+    </components>
+<#include "diamonds_footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/tool.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+<#--
+============================================================================ 
+Name        : tool.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+<#include "diamonds_macro.ftl">
+       <tools>        
+<#if ant?keys?seq_contains("env.SYMSEE_VERSION")>         
+        <tool>
+           <name>SymSEE</name>
+           <version>${ant["env.SYMSEE_VERSION"]}</version>
+         </tool>
+</#if>
+<#if (doc)??>
+<#list doc["ivy-report/dependencies/module"] as module>
+         <tool>
+           <name>${module.@name}</name>
+           <version>${module.revision.@name}</version>
+         </tool>
+</#list>
+</#if>
+         <tool>
+           <name>Helium</name>
+           <version>${ant["helium.version"]}</version>
+         </tool>
+       </tools>
+<#include "diamonds_footer.ftl">        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/diamonds/validate-policy-log.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+<#--
+============================================================================ 
+Name        : validate-policy-log.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "diamonds_header.ftl"> 
+<policyvalidation>
+<#if (doc)??!""?keys?seq_contains('policyvalidation')>
+<#list doc['policyvalidation'].error as error>
+      <error type="${error.@type}" message="${error.@message}" value="${error.@value}"/>
+</#list>
+</#if>
+</policyvalidation>
+<#include "diamonds_footer.ftl"> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/help_text.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+<#--
+============================================================================ 
+Name        : help_text.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#list xml["//target[name='${helpTarget}']"] as target>
+
+Target ${target.name}:
+-----------------------------
+Location: ${target.location}
+
+<#if target.description?length &gt; 0>
+Description:
+${target.description}
+</#if>
+Documentation:<#recurse target.documentation>
+
+Property dependencies:
+<#list target.propertyDependency as property>
+* ${property}
+</#list>
+</#list>
+
+<#macro tt> "<#recurse>" </#macro>
+
+<#macro p>
+
+<#recurse></#macro>
+
+<#macro ul>
+
+<#recurse></#macro>
+
+<#macro li> * <#recurse>
+</#macro>
+
+<#macro b><#recurse>*</#macro>
+
+<#macro @text>${.node?trim}</#macro>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-ant-copy.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,44 @@
+<#--
+============================================================================ 
+Name        : ido-ant-copy.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="ido-ant-copy" default="all">
+    <target name="all">
+        <parallel threadCount="${r'$'}{number.of.threads}">
+        <#list data?keys as component>
+            <sequential>
+                <mkdir dir="${data[component]}"/>
+                <copy todir="${data[component]}" verbose="false" failonerror="false" overwrite="true">
+                    <fileset dir="${component}" casesensitive="false" >
+                        <exclude name="**/_ccmwaid.inf"/>
+                        <#if (!ant?keys?seq_contains('keep.internals'))>
+                        <exclude name="**/internal/**"/>
+                        </#if>
+                    </fileset>
+                </copy>
+                <exec executable="attrib" dir="${data[component]}">
+                    <arg line="-R /S /D .\*"/>
+                </exec>
+            </sequential>
+        </#list>
+        </parallel>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-ant-delete.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+<#--
+============================================================================ 
+Name        : ido-ant-copy.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="ido-ant-copy" default="all">
+    <target name="all">
+        <parallel threadCount="${r'$'}{number.of.threads}">
+        <#list data?keys as component>
+            <sequential>
+                <#if ant?keys?seq_contains('ido.keep.old')>
+                <delete dir="${data[component]}_old" failonerror="false"/>
+                <move file="${data[component]}" todir="${data[component]}_old" failonerror="false"/>
+                <#else>
+                <delete dir="${data[component]}" failonerror="false"/>
+                </#if>
+            </sequential>
+        </#list>
+        </parallel>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-ant-fixslashes.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<#--
+============================================================================ 
+Name        : ido-ant-copy.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="ido-ant-fixslashes" default="all">
+    <target name="all">
+        <parallel threadCount="${r'$'}{number.of.threads}">
+<#assign scanid=1/>
+        <#list data?keys as component>
+            <sequential>
+                  <exec executable="perl" dir="${component}" output="${ant['build.log.dir']}/fixslashes_${ant['ido.name']}.log" append="true" failonerror="false">
+                    <arg value="${ant['ido.common.config.dir']}/scripts/fixslashes_test.pl"/>
+                    <arg line="-verbose -recursive -dir ${data[component]}"/>
+                   </exec>
+                  <exec executable="perl" dir="${component}" output="${ant['build.log.dir']}/fixrsg_${ant['ido.name']}.log" append="true" failonerror="false">
+                    <arg value="${ant['ido.common.config.dir']}/scripts/fixrsg.pl"/>
+                    <arg line="-v ${data[component]}"/>
+                   </exec>
+            </sequential>
+            <#assign scanid=scanid+1/>
+        </#list>
+        </parallel>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-cmt-ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+<#--
+============================================================================ 
+Name        : ido-cmt-ant.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="ido-cmt-ant" default="all" xmlns:hlm="http://www.nokia.com/helium">
+<import file="${ant['helium.dir']}/helium.ant.xml"/>
+<#assign targetlist=""/>
+<#assign cmtid=1/>
+    <#list data?keys as component>
+    <#if (cmtid > 1)>
+    <#assign targetlist="${targetlist}" + ","/>
+    </#if>
+    <hlm:argSet id="cmttool.refid.${cmtid}">
+        <hlm:arg name="input" value="${data[component]}" />
+        <hlm:arg name="output" value="${ant['build.log.dir']}/${ant['build.id']}_${ant['ido.name']}_${cmtid}.xml" />
+        <hlm:arg name="pattern" value="**/*.h,**/*.cpp" />
+    </hlm:argSet>
+
+    <target name="cmt-${cmtid}">
+        <hlm:toolMacro name="cmt">
+            <toolvarset refid="cmttool.refid.${cmtid}"/>
+        </hlm:toolMacro>
+    </target>
+    <#assign targetlist="${targetlist}" + "cmt-${cmtid}"/>
+    <#assign cmtid=cmtid+1/>
+    </#list>
+    <target name="all" depends="${targetlist}" >
+      <move todir="${ant['build.output.dir']}/codecomplexity" overwrite="true" preservelastmodified="true" failonerror="${ant['failonerror']}">
+          <fileset dir="${ant['build.log.dir']}/CMTHTML"/>
+      </move>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-export.ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,47 @@
+<#--
+============================================================================ 
+Name        : ido-export.ant.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="ido-copy">
+
+    <target name="ido-copy-iby">
+        <#list data?keys as name>
+        <copy todir="${ant['ido.romtree']}" verbose="true" overwrite="true" flatten="true">
+            <fileset dir="${data[name]}" casesensitive="no">
+                <include name="**/rom/*.iby"/>
+                <exclude name="**/internal/**"/>
+                <exclude name="**/tsrc/**"/>
+            </fileset>
+        </copy>
+        </#list>
+    </target>
+
+    <target name="ido-copy-cenrep">
+        <#list data?keys as name>
+        <copy todir="${ant['ido.cenrep.root']}" verbose="true" overwrite="true" flatten="true">
+            <fileset dir="${data[name]}" casesensitive="no">
+                <include name="**/cenrep/keys_*.xls"/>
+            </fileset>
+        </copy>
+        </#list>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-robot-zip.ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+<#--
+============================================================================ 
+Name        : ido-robot-zip.ant.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="ido-zip" default="all">
+    <target name="all">
+        <delete file="${ant['build.output.dir']}/s60Sources.7z" failonerror="false"/>
+        <#if ((data?keys?size > 0) && (ant['do.robot.release']?split(';')?size > 0))>
+            <#list data?keys as name>
+                <#list ant['do.robot.release']?split(',') as project>
+                    <#if name?replace('\\', '/')?lower_case?contains("/${project}/${project}"?lower_case)>
+                    <#-- 7za u test.7z  output/analysisdata/ -->
+                    <exec executable="7za" dir="${data[name]}/../">
+                        <arg value="u"/>
+                        <arg value="-xr!*/internal/*"/>
+                        <arg value="-xr!*/doc/*"/>
+                        <arg value="-xr!_ccmwaid.inf"/>
+                        <arg value="-xr!abld.bat"/>
+                        <arg value="${ant['build.output.dir']}/s60Sources.7z"/>
+                        <arg value="${data[name]?split("/")?last}/"/>
+                    </exec>                    
+                    </#if>
+                </#list>
+            </#list>
+        </#if>
+        <copy todir="${ant['s60.build.robot.path']}" file="${ant['build.output.dir']}/s60Sources.7z" failonerror="false" />        
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ready.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<#--
+============================================================================ 
+Name        : ready.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+ido_name:${ant['build.name']}
+date(gt):${pp.now?string("EEE MMM d HH:mm:ss yyyy")}
+source_path:${ant['ccm.project.wa_path']}
+<#if ant?keys?seq_contains('email.from')>email:${ant['email.from']}</#if>
+<#if ant?keys?seq_contains('robot.email.to')><#list ant['robot.email.to']?split(',') as email>
+email:${email}
+</#list></#if>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/task-publish.ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+<#--
+============================================================================ 
+Name        : task-publish.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="task-publish" default="all" xmlns:hlm="http://www.nokia.com/helium">
+    
+    <target name="all">
+        <#if (ant?keys?seq_contains('ccm.cache.xml'))>
+        <hlm:createSessionMacro database="${ant['ccm.database']}" reference="publish.session" cache="${ant['ccm.cache.xml']}"/>
+        <#else>
+        <hlm:createSessionMacro database="${ant['ccm.database']}" reference="publish.session"/>
+        </#if>
+        <hlm:ccm verbose="false">
+            <!-- Defining some session to use. -->
+            <hlm:sessionset refid="publish.session"/>
+
+            <hlm:addtask folder="${ant['publish.ccm.folder']}">
+                <#list bom['/bom/content//task/id'] as task>
+                <task name="${task?trim}"/>
+                </#list>
+            </hlm:addtask>
+            <#if (!ant?keys?seq_contains('ccm.cache.xml'))>
+            <hlm:close/>
+            </#if>
+        </hlm:ccm>
+    </target>
+    
+    <!-- this is needed to include ccmtask support. -->
+    <import file="${ant['helium.dir']}/helium.ant.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/ido/zip-ant-wa-copy.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,34 @@
+<#--
+============================================================================ 
+Name        : zip-ant-wa-copy.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="zip-wa-ant-copy" default="all">
+    <target name="all">
+        <#list data?keys as component>
+            <sequential>
+                <#assign ba_path= data[component]?substring(3)/>
+                <zip destfile="${ant['zip.wa.file']}" update="true" excludes="_ccmwaid.inf">
+                    <zipfileset dir="${component}" prefix="${ba_path}"/>
+                 </zip>
+            </sequential>
+        </#list>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/imaker/build_imaker_roms.ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+<#--
+============================================================================ 
+Name        : build_imaker_roms.ant.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="build_imaker_roms" default="all">
+    <#assign dollar="$"/>
+    <#assign romnumber=0/>
+    
+    <property name="imaker.temp.dir" location="${dollar}{build.drive}/epoc32/rombuild/imaker/temp"/>
+    
+    <target name="all">
+        <#list data as configuration>
+            <#if configuration['command'] == "switch_region">
+                <echo>Switching to ${configuration['region']}.</echo>
+                <unzip src="${dollar}{zips.loc.dir}/delta_${configuration['region']}_package.zip" 
+                dest="${dollar}{build.drive}/" overwrite="true"/>
+            </#if>
+            
+            <#assign romproperties=pp.newWritableSequence()/>
+            <#if configuration['command'] == "imaker">
+                <!--<parallel>-->
+                <#list configuration['config']?keys as config>
+                    <#list configuration['config'][config] as target>
+                        <@pp.add seq=romproperties value="imaker.output.${romnumber}" />
+                        <sequential>
+                            <mkdir dir="${dollar}{imaker.temp.dir}/conf_${romnumber}"/>
+                            <!--  outputproperty="imaker.output.${romnumber}" -->
+                            <exec executable="${dollar}{imaker.command}" dir="${dollar}{build.drive}/">
+                                <arg line="-f ${config?xml}"/>
+                                <#list target['variables']?keys as varname>
+                                    <arg value="${varname?xml}=${target['variables'][varname]?xml}"/>
+                                </#list>
+                                <arg value="${target['target']?xml}"/>
+                                <arg value="WORKDIR=${dollar}{imaker.temp.dir}/conf_${romnumber}"/>
+                            </exec>
+                        </sequential>
+                        <#assign romnumber=romnumber+1/>
+                    </#list>
+                </#list>
+                <!--</parallel>
+                <#list romproperties as romproperty>
+                    <echo>${dollar}{${romproperty}}</echo>
+                </#list>-->
+            </#if>
+        </#list>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/imaker/build_imaker_roms.mk.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<#--
+============================================================================ 
+Name        : build_imaker_roms.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+###################################################################
+#
+# Generated build file.
+#
+#
+###################################################################
+<#assign deps=""/>
+<#assign configid=1/>
+<#list data as configuration>	
+	<#list configuration?keys as config>
+		<#list configuration[config] as target>
+			<#assign deps="${deps} configuration${configid}_${config}_${target['target']}"/>
+###################################################################
+# building configuration${configid}_${config}_${target['target']}
+###################################################################
+configuration${configid}_${config}_${target['target']}:
+	-imaker -f ${config} <#list target['variables']?keys as varname>"${varname}=${target['variables'][varname]}" </#list> ${target['target']}
+
+
+		</#list>
+	</#list>
+	<#assign configid= configid + 1/>
+</#list>
+
+
+###################################################################
+# Toplevel target
+###################################################################
+all: ${deps} ;
+
+# End of config
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/imaker/build_imaker_roms_signing.mk.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+<#--
+============================================================================ 
+Name        : build_imaker_roms_signing.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#assign dollar="$"/>
+
+IMAKER_WORKDIR=\epoc32\rombuild\imaker_temp
+
+${dollar}(IMAKER_WORKDIR):
+	-mkdir ${dollar}(IMAKER_WORKDIR)
+
+
+###################################################################
+#
+# Generated build file.
+#  * Implements Electic Cloud signing optimizations.
+#
+###################################################################
+<#assign deps_image=""/>
+<#assign deps_all=""/>
+<#assign configid=1/>
+<#assign romid=0/>
+<#list data as configuration>
+
+	<#if configuration['command'] == "switch_region">
+###################################################################
+# Config${configid} : Switching region (${configuration['region']})
+###################################################################
+
+build-configuration${configid}: <#if (configid-1 > 0) >build-configuration${configid-1}</#if>
+	@echo Switching to ${configuration['region']}.
+	-@unzip -o -d $(subst \,/,$(EPOCROOT)) ${ant['zips.loc.dir']}/delta_${configuration['region']}_package.zip 
+
+   		<#assign deps_all="build-configuration${configid}"/>
+ 		<#assign configid= configid + 1/>
+	</#if>
+
+	<#if configuration['command'] == "imaker">
+		<#assign deps_conf_image=""/>
+		<#assign deps_conf_signing=""/>
+		<#list configuration['config']?keys as config>
+			<#list configuration['config'][config] as target>
+				<#assign deps_conf_image="${deps_conf_image} configuration${configid}_${config}_${target['target']}"/>
+				<#assign deps_conf_signing="${deps_conf_signing} signing_configuration${configid}_${config}_${target['target']}"/>
+###################################################################
+# building configuration${configid}_${config}_${target['target']}
+###################################################################
+configuration${configid}_${config}_${target['target']}:  ${dollar}(IMAKER_WORKDIR) <#if (configid-1 > 0) >build-configuration${configid-1}</#if>
+	@echo === config_${configid} == configuration${configid}_${config}_${target['target']}
+	@echo -- imaker -f ${config} image ... ${target['target']}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	-imaker -f ${config} <#list target['variables']?keys as varname>"${varname}=${target['variables'][varname]}" </#list> ${target['target']}-image  WORKDIR=${dollar}(IMAKER_WORKDIR)/conf_${romid}
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+#pragma runlocal
+signing_configuration${configid}_${config}_${target['target']}: ${dollar}(IMAKER_WORKDIR) all-image-conf${configid}
+	@echo === config_${configid} == signing_configuration${configid}_${config}_${target['target']}
+	@echo -- imaker -f ${config} elf2flash ... ${target['target']}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"	
+	-imaker -f ${config} <#list target['variables']?keys as varname>"${varname}=${target['variables'][varname]}" </#list> ${target['target']}-e2flash  WORKDIR=${dollar}(IMAKER_WORKDIR)/conf_${romid}
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+		<#assign romid= romid + 1/>
+            </#list>
+		</#list>
+
+        <#if deps_conf_image != "" && deps_conf_signing!= "" >
+all-image-conf${configid}: ${deps_conf_image} ;
+build-configuration${configid}: ${deps_conf_signing} ;
+            <#assign deps_all="build-configuration${configid}"/>
+            <#assign configid= configid + 1/>
+        </#if>
+    </#if>
+</#list>
+
+
+###################################################################
+# Toplevel target
+###################################################################
+
+all: ${deps_all} ;
+
+# End of config
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/imaker/image_conf_buildinfo.mk.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<#--
+============================================================================ 
+Name        : image_conf_buildinfo.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+##########################################################################
+#
+# Helium - iMaker buildinfo template.
+#
+# This is a generated file please to not edit! 
+#
+##########################################################################
+
+<#assign dollar="$"/>
+<#assign properties = ['build.number', 'build.id', 'minor.version', 'major.version', 'build.output.dir', 'release.images.dir', 'fota.a.build']/>
+<#list properties as key>
+<#if ant?keys?seq_contains(key)>
+	<#if key?ends_with(".dir")>
+${key?upper_case?replace(".", "_")} = ${dollar}(call upddrive,${dollar}(subst \,/,${ant[key]}))
+	<#else> 
+${key?upper_case?replace(".", "_")} = ${ant[key]}
+	</#if>
+<#else>
+$(warning '${key}' is not a valid Helium property.)
+</#if>
+</#list>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/integration/build-duplicates.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+<#--
+============================================================================ 
+Name        : build-duplicates.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+    <#include "/@macro/logger/logger.ftl" />
+    <head>
+        <title>Build duplicates</title>
+        <@helium_logger_html_head/>
+    </head>
+    <body>
+
+<#macro printconflict node>
+    <#assign helium_node_id = helium_node_id + 1>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
+        <@helium_message_box nodeid="${helium_node_id}" type="conflict" count=node[".//component"]?size/>
+    </@helium_logger_node_head>    
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <#list node[".//component"] as component>
+            <@helium_logger_print type="conflict">
+                <a href="${component.@name}">${component.@name}</a>
+            </@helium_logger_print>
+        </#list>
+    </@helium_logger_node_content>
+</#macro>
+
+    
+    <@helium_logger_header title="${ant['build.id']} build"/>
+    
+    
+    <@helium_logger_content title="Errors and warnings details">
+        <#list doc.buildconflicts["./file"] as conflict>
+            <@printconflict conflict/>
+        </#list>
+    </@helium_logger_content>
+    
+    </body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/integration/internal-exports.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+<#--
+============================================================================ 
+Name        : internal-exports.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+    <#include "/@macro/logger/logger.ftl" />
+    <head>
+        <title>Internal Exports</title>
+        <@helium_logger_html_head/>
+    </head>
+    <body>
+
+<#macro printconflict node>
+    <#assign helium_node_id = helium_node_id + 1>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
+        <@helium_message_box nodeid="${helium_node_id}" type="InternalExport" count=node[".//file"]?size/>
+    </@helium_logger_node_head>    
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <#list node[".//file"] as file>
+            <@helium_logger_print type="InternalExport">
+                <a href="${file.@name}">${file.@name}</a>
+            </@helium_logger_print>
+        </#list>
+    </@helium_logger_node_content>
+</#macro>
+
+    
+    <@helium_logger_header title="${ant['build.id']} build"/>
+        
+    <@helium_logger_content title="Errors and warnings details">
+        <#list doc.internalexports["./component"] as component>
+            <@printconflict component/>
+        </#list>
+    </@helium_logger_content>
+    
+    </body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/integration/validate-policy.log.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<#--
+============================================================================ 
+Name        : validate-policy.log.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+CSV validation:
+<#list doc["./policyvalidation/error[@type='unknownstatus']"] as unknownstatus>
+    ${unknownstatus.@message} (${unknownstatus.@value})
+</#list>
+
+Errors:
+<#list doc["./policyvalidation/error"] as error>
+    <#if error.@type=='A' || error.@type=='B' || error.@type=='C' || error.@type=='D'>
+    ${error.@type}  Found incorrect for ${error.@message?replace('([\\\\/][^\\\\/]+?)$', '', 'ris')}, ${error.@value}
+    </#if>
+</#list>
+
+Missing policy files in:
+<#list doc["./policyvalidation/error[@type='missing']"] as missing>
+    ${missing.@message}
+</#list>
+
+
+Incorrect policy files in:
+<#list doc["./policyvalidation/error[@type='invalidencoding']"] as error>
+    ${error.@message}
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/integration/validate-policy.log.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+<#--
+============================================================================ 
+Name        : validate-policy.log.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="${ant['validate.policy.log']}">
+    <build>
+        <task name="CSV validation">
+<#list doc["./policyvalidation/error[@type='unknownstatus']"] as unknownstatus>
+            <message priority="error"><![CDATA[${unknownstatus.@message} (${unknownstatus.@value})]]></message>
+</#list>
+        </task>
+        <task name="Issues">
+<#list doc["./policyvalidation/error"] as error>
+    <#if error.@type=='A' || error.@type=='B' || error.@type=='C' || error.@type=='D'>
+            <message priority="error"><![CDATA[${error.@type}  Found incorrect for ${error.@message?replace('([\\\\/][^\\\\/]+?)$', '', 'ris')}, ${error.@value}]]></message>
+    </#if>
+</#list>
+        </task>
+        <task name="Missing">
+Missing policy files in:
+<#list doc["./policyvalidation/error[@type='missing']"] as missing>
+            <message priority="error"><![CDATA[${missing.@message}]]></message>
+</#list>
+        </task>
+        <task name="Incorrect policy files">
+<#list doc["./policyvalidation/error[@type='invalidencoding']"] as error>
+            <message priority="error"><![CDATA[${error.@message}]]></message>
+</#list>
+        </task>
+    </build>
+</log>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/bt_email.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,118 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a bootability test has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <!-- section -->
+    <#macro create_section title type>
+        <div id="foldername">
+            <h5>${title}</h5>
+            <p class="maintext">
+                <!-- content span -->
+                <span class="${type}"><#nested></span>
+            </p>
+        </div>
+    </#macro>
+    
+    <#macro dumplog>
+        <#list doc["diamonds-build/tests/test_results/test"] as testdoc>
+            Total       : ${testdoc.total} <br>
+            Executed    : ${testdoc.executed} <br>
+            Successfull : ${testdoc.successful} <br>
+            Failed      : ${testdoc.failed} <br>
+            
+            <#list testdoc.images as curimage>
+            Image       : ${curimage.image.name}
+            </#list>
+        </#list>    
+    </#macro>
+    
+    <@create_section title="Bootability test status" type="data">
+        <@dumplog/>
+    </@create_section>
+    
+    
+    
+    </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/bt_email_subject.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+<#--
+============================================================================ 
+Name        : bt_email_subject.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#if ant?keys?seq_contains("blacktusk.build.id")>
+[signal]:${ant["env.COMPUTERNAME"]}: ${signalname} check
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/bt_sms_content.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+<#--
+============================================================================ 
+Name        : bt_sms_content.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#if ant?keys?seq_contains("blacktusk.build.id")>
+${ant["blacktusk.build.id"]}:${ant["env.COMPUTERNAME"]}: ${signalname} alert
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/build_status.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<build-status>
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+<#assign priority_table = table_info['select * from priority'] >
+<#assign priority_ids = priority_table?keys>
+
+<#list priority_ids as priority>
+    <#assign priority_count = table_info['select count(data) as COUNT from metadata where priority_id = ${priority} and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+    <#if (priority_count >= 0)>
+        <${priority_table['${priority}']?lower_case} count= "${priority_count}" />
+    </#if>
+</#list>
+</build-status>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/cc_summary.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+<#--
+============================================================================ 
+Name        : cc_summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<h1>${ant['build.id']}</h1>
+
+<#if ant?keys?seq_contains('publish')>
+    <#if ant?keys?seq_contains('publish.dir.list')>
+        <h2>Publish locations</h2>
+        <p>
+        <#list ant['publish.dir.list']?split(',') as site>
+          <a href="${site}">${site}</a></br>
+        </#list>
+        </p>
+    <#else>
+        <#if ant?keys?seq_contains('publish.dir')>
+        <h2>Publish locations</h2>
+        <p><a href="${ant['publish.dir']}">${ant['publish.dir']}</a></p>
+        </#if>
+    </#if>
+</#if>
+
+<#if (doc["/logSummary/log[contains(@filename,'_ccm_get_input.log')]"]?size > 0)>
+<h2>Synergy errors</h2>
+    <p>
+    <#list doc["/logSummary/log[contains(@filename,'_ccm_get_input.log')]//message"] as msg>
+        <#if msg.@priority?matches('error|warning') >${msg}<br/></#if>
+    </#list>
+    </p>
+</#if>
+
+<h2>Build errors</h2>
+<#assign components = pp.newWritableHash()/>
+<#assign colors = {'error': 'FF0000', 'critical': 'FF7000', 'warning': 'FFF000', 'note': '0000FF'}/>
+<#list doc["/logSummary/log[@filename]"] as log>
+    <#if log.@filename?matches(".*_compile.log$") && !log.@filename?matches(".*(?:_ant|_clean)_compile.log$")>
+        <#list log[".//task"] as task>
+            <#assign name = task.@name/>
+            <#if !components?keys?seq_contains(name)>
+                <@pp.set hash=components key="${name}" value=pp.newWritableHash() />
+            </#if>
+            <#list task["./message"] as msg>
+                <#if components[name]?keys?seq_contains(msg.@priority)>
+                    <@pp.set hash=components[name] key=msg.@priority value=1+components[name][msg.@priority] />
+                <#else>
+                    <@pp.set hash=components[name] key=msg.@priority value=1 />
+                </#if>
+            </#list>
+        </#list>
+    </#if>
+</#list>
+
+<table border="1" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+    <th width="55%">Component</th>
+    <th width="15%">Errors</th>
+    <th width="15%">Criticals</th>
+    <th width="15%">Warnings</th>
+    <th width="15%">Notes</th>
+</tr>
+<#list components?keys as component>
+<tr>
+<td>${component}</td>
+    <#list colors?keys as type>
+        <#if components[component]?keys?seq_contains(type)>
+<td align="center" bgcolor="#${colors[type]}">${components[component][type]}</td>
+        <#else>
+<td align="center">0</td>
+        </#if>
+    </#list>
+</tr>
+</#list>
+</table>
+
+<#list doc["/logSummary/log[@filename]"] as log>
+    <#if log.@filename?matches(".*roms.log$")>
+    <h2>ROMs (${log.@filename})</h2>
+        <p>
+        <#list log[".//message"] as message>
+            ${message}<br/>
+        </#list>    
+        </p>    
+    </#if>
+</#list>
+
+<#list doc["/logSummary/log[@filename]"] as log>
+    <#if log.@filename?matches(".*_validate_policy\\....$")>
+        <h2>Distribution Policy validation</h2>
+        <p>
+        <#list log[".//message"] as msg>
+        ${msg}<br/>
+        </#list>
+        </p>
+    </#if>
+</#list>
+
+<#if ant?keys?seq_contains('diamonds.build.id')>
+<p>
+<h2>ATS Test Results</h2>
+    <a href="http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4" >http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4 </a>
+</p>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/cc_summary_metadata.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+<#--
+============================================================================ 
+Name        : cc_summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+ 
+<h1>${ant['build.id']}</h1>
+
+<#if ant?keys?seq_contains('publish')>
+    <#if ant?keys?seq_contains('publish.dir.list')>
+        <h2>Publish locations</h2>
+        <p>
+        <#list ant['publish.dir.list']?split(',') as site>
+          <a href="${site}">${site}</a></br>
+        </#list>
+        </p>
+    <#else>
+        <#if ant?keys?seq_contains('publish.dir')>
+        <h2>Publish locations</h2>
+        <p><a href="${ant['publish.dir']}">${ant['publish.dir']}</a></p>
+        </#if>
+    </#if>
+</#if>
+
+<#assign ccm_logpath_table = table_info['select * from logfiles where path like \'%_ccm_get_input.log%\''] >
+
+<#assign logpath_id = ccm_logpath_table?keys>
+<#list logpath_id as logpath>
+<#assign metadata_ccm_records = table_info['select * from metadata where logpath_id = ${logpath} and (priority_id in (select id from priority where priority=\'ERROR\')  or priority_id in (select id from priority where priority=\'WARNING\'))'] >
+<h2>Synergy errors</h2>
+    <p>
+    <#list metadata_ccm_records as recordentry>
+        ${recordentry['data']}
+    </#list>
+    </p>
+</#list>
+
+<h2>Build errors</h2>
+<#assign compile_logpath_table = table_info['select * from logfiles where (path like \'%_compile.log\'  and path not like \'%_clean_compile.log\')'] >
+<#assign colors = {'error': 'FF0000', 'critical': 'FF7000', 'warning': 'FFF000', 'remark': '0000FF'}/>
+
+<table border="1" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+    <th width="55%">Component</th>
+    <th width="15%">Errors</th>
+    <th width="15%">Criticals</th>
+    <th width="15%">Warnings</th>
+    <th width="15%">Notes</th>
+</tr>
+<#assign logpath_id = compile_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign component_table = table_info['select id, component from component where logPath_id=${logpath}'] >
+    <#assign component_ids = component_table?keys?sort >
+
+<#list component_ids as component_id>
+<tr>
+<td>"${component_table['${component_id}']}"</td>
+    <#list colors?keys as type>
+        <#assign count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and (priority_id in (select id from priority where priority like \"${type}\"))'][0]['COUNT']}" >
+        <#if ( count?number &gt; 0)>
+<td align="center" bgcolor="#${colors[type]}">${count}</td>
+        <#else>
+<td align="center">0</td>
+        </#if>
+    </#list>
+</tr>
+</#list>
+</#list>
+</table>
+
+<#assign rom_logpath_table = table_info['select * from logfiles where (path like \'%roms.log\')'] >
+<#assign logpath_id = rom_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign romlog_table = table_info['select * from metadata where logpath_id = ${logpath}'] >
+    <h2>ROMs ${rom_logpath_table['${logpath}']}</h2>
+        <p>
+    <#list romlog_table as recordentry>
+        ${recordentry['data']}<br/>
+    </#list>
+        </p>
+</#list>
+
+<#assign policy_logpath_table = table_info['select * from logfiles where (path like \'%validate_policy.xml\')'] >
+<#assign logpath_id = policy_logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign policy_table = table_info['select * from metadata where logpath_id = ${logpath}'] >
+        <h2>Distribution Policy validation</h2>
+        <p>
+        <#list policy_table as recordentry>
+            ${recordentry['data']}<br/>
+        </#list>
+        </p>
+</#list>
+
+<#if ant?keys?seq_contains('diamonds.build.id')>
+<p>
+<h2>ATS Test Results</h2>
+    <a href="http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4" >http://${ant['diamonds.host']}${ant['diamonds.build.id']}#tab=4 </a>
+</p>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/email.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,161 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <!-- section -->
+    <#macro create_section title type>
+           <div id="foldername">
+               <h5>${title}</h5>
+               <p class="maintext">
+                   <!-- content span -->
+                   <span class="${type}"><#nested></span>
+               </p>
+           </div>
+       </#macro>
+
+    <#macro dumplog regex>
+        <#list doc.logSummary.log as lognode>
+
+            <#if (lognode.@filename[0])?matches(regex)>
+                <#if (lognode.build[".//message[@priority='error']"]?size > 0)>
+                    <span class="errormessage">
+                        <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>                    
+                        <ul>
+                        <#list lognode.build[".//message[@priority='error']"] as message>
+                            ${message}<br/>
+                        </#list>
+                        </ul>
+                    </span>
+                <#else>
+                    <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+                </#if>
+            </#if>
+
+        </#list>
+    </#macro>
+    
+               
+    <#if (signalname?contains("RomsSignal"))>
+    <@create_section title="ROM images" type="data">
+        <@dumplog regex=".*roms.log"/>
+    </@create_section>
+    
+    <#elseif (signalname == 'dataPackagingSignal')>
+    <@create_section title="Data Package" type="data">
+        <@dumplog regex=".*dp.log"/>
+    </@create_section>
+    
+    <#elseif (signalname == 'fotaSignal')>
+    <@create_section title="FOTA" type="data">
+        <@dumplog regex=".*fota.log"/>
+    </@create_section>
+    
+    <#elseif (signalname == 'prepWorkAreaSignal')>
+    <@create_section title="Prep" type="data">
+        <@dumplog regex=".*ccm_get_input.log"/>
+    </@create_section>
+    
+    <#elseif (signalname == 'signalValidatePolicyInvalidOrMissing')>
+    <@create_section title="Policy files missing or invalid" type="data">
+        <@dumplog regex=".*validate_policy.xml"/>
+    </@create_section>
+    
+    <#elseif (signalname == 'signalValidatePolicyRules')>
+    <@create_section title="Policy Validation Rules" type="data">
+        <@dumplog regex=".*validate_policy.xml"/>
+    </@create_section>
+    
+    <#elseif (signalname == 'btSmokeTestNotifySignal')>
+    <@create_section title="Smoke test status for the images" type="data">
+        <@dumplog regex=".*_blacktusk.log.xml"/>
+    </@create_section>
+    
+    <#else>
+    <@create_section title="Build status" type="data">
+        <@dumplog regex=".*compile.log"/>
+    </@create_section>
+    </#if>
+    </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/email_default.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,88 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+      <span class="okmessage">${signaling['signal.name']} is finished.</span>
+    </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/email_new.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,146 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+    <!-- The title -->
+    <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+    </div>
+
+    <!-- section -->
+    <#macro create_section title type>
+        <div id="foldername">
+            <h5>${title}</h5>
+            <p class="maintext">
+                <!-- content span -->
+                <span class="${type}"><#nested></span>
+            </p>
+        </div>
+    </#macro>
+    <#macro dumplog regex>
+        <#list doc0.logSummary.log as lognode>
+
+            <#if (lognode.@filename[0])?matches(regex)>
+                <#if (lognode.build[".//message[@priority='error']"]?size > 0)>
+                    <span class="errormessage">
+                        <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>
+                            <ul>
+                            <#list lognode.build[".//message[@priority='error']"] as message>
+                                ${message}<br/>
+                            </#list>
+                            </ul>
+                        </#if>
+                    </span>
+                <#else>
+                    <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+            </#if>
+        </#list>
+    </#macro>
+<#if doc0?? >
+<#if (doc0.log?size > 0 ) >
+    <#list doc0.log as lognode>
+        <#if (lognode.build[".//message[@priority='error']"]?size > 0)>
+            <span class="errormessage">
+                <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>
+                <ul>
+                    <#list lognode.build[".//message[@priority='error']"] as message>
+                        ${message}<br/>
+                    </#list>
+                </ul>
+            </span>
+        <#else>
+            <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+        </#if>
+    </#list>
+<#elseif (doc0.logSummary?size > 0) >
+    <@create_section title="Build status" type="data">
+        <@dumplog regex=".*compile.log"/>
+    </@create_section>
+</#if>
+<#else>
+No data available.
+    <#if (signaling['signal.status'] == "false")>
+<span class="okmessage">Status: pass<span class="okmessage">
+    <#else>
+<span class="errormessage">Status: failed<span class="errormessage">
+    </#if>
+</body>
+</html>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/email_status.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,114 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+
+<#assign error_count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority where priority like \'ERROR\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+    <!-- section -->
+    <#macro create_section title type>
+           <div id="foldername">
+               <h5>${title}</h5>
+               <p class="maintext">
+                   <!-- content span -->
+                   <span class="${type}"><#nested></span>
+               </p>
+           </div>
+       </#macro>
+<#if (error_count > 0)>
+        <span class="errormessage">
+            ${logfile}...FAIL<br/>
+    <#list table_info['select * from metadata where priority_id in (select id from priority where priority like \'ERROR\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'] as recordentry >
+            <ul>
+            ${recordentry['data']}<br/>
+            </ul>
+    </#list>
+        </span>
+<#else>
+    <span class="okmessage">${logfile}...OK<br/></span>
+</#if>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/email_subject.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : email_subject.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+${ant["build.id"]}:${ant["env.COMPUTERNAME"]}: ${signalname} alert
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/email_warning.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,147 @@
+<#--
+============================================================================ 
+Name        : email.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+    <title>
+      Build result e-mail from ${ant["env.COMPUTERNAME"]}.
+    </title>
+    <style type="text/css">
+        body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+        h1{
+          font-size:14pt;
+          color:#000;
+          padding: 20px 15px;
+              margin:0;
+         }
+        h2{font-size:12pt;}
+        h5{
+          font-size:10pt;
+          background-color:#8495BA;
+          color:#fff;
+          heigth:20pt;
+          padding: 5px 15px;
+          border-left:2px solid #5A6FA0;
+          border-bottom:2px solid #5A6FA0;
+          border-top:2px solid #98A6C6;
+          border-right:2px solid #98A6C6;
+          margin:0;
+         }
+ 
+  
+        p {
+          font-size:10pt;
+          padding: 0em 1em 1em 1em;
+          margin: 0 1em 0.5em 1em;
+          border-right:1px solid #5A6FA0;
+          border-top:0;
+          border-bottom:1px solid #98A6C6;
+          border-left:1px solid #98A6C6;
+          background-color:#CDE4EB;
+          white-space:normal;
+        }
+ 
+        .data{color:#00F;}
+        .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+        .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
+ 
+        span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+        span.bold{font-weight:bold; display:block; padding: 1em 0;}
+        p.maintext{padding-top: 1em;}
+        p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+        p.distrib{font-weight:bold;}
+ 
+ 
+        a:link,a:visited{color:#00E;}
+        
+    </style>
+  </head>
+  <body>
+      <!-- The title -->
+      <div id="buildname">
+        <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
+      </div>
+
+    <!-- section -->
+    <#macro create_section title type>
+           <div id="foldername">
+               <h5>${title}</h5>
+               <p class="maintext">
+                   <!-- content span -->
+                   <span class="${type}"><#nested></span>
+               </p>
+           </div>
+       </#macro>
+    <#macro dumplog regex>
+        <#list doc0.logSummary.log as lognode>
+
+            <#if (lognode.@filename[0])?matches(regex)>
+                <#if (lognode.build[".//message[@priority='warning']"]?size > 0)>
+                    <span class="errormessage">
+                        <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>                    
+                        <ul>
+                        <#list lognode.build[".//message[@priority='warning']"] as message>
+                            ${message}<br/>
+                        </#list>
+                        </ul>
+                    </span>
+                <#else>
+                    <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+                </#if>
+            </#if>
+
+        </#list>
+    </#macro>
+<#if doc0?? >
+<#if (doc0.log?size > 0 ) >
+    <#list doc0.log as lognode>
+        <#if (lognode.build[".//message[@priority='warning']"]?size > 0)>
+            <span class="errormessage">
+                <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>                    
+                <ul>
+                <#list lognode.build[".//message[@priority='warning']"] as message>
+                    ${message}<br/>
+                </#list>
+                </ul>
+            </span>
+        <#else>
+            <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
+        </#if>
+    </#list>
+<#elseif (doc0.logSummary?size > 0) >
+    <@create_section title="Build status" type="data">
+        <@dumplog regex=".*compile.log"/>
+    </@create_section>
+</#if>
+<#else>
+No data available.
+    <#if (signaling['signal.status'] == "false")>
+<span class="okmessage">Status: pass<span class="okmessage">
+    <#else>
+<span class="errormessage">Status: failed<span class="errormessage">
+    </#if>
+</body>
+</html>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/scan2.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,124 @@
+<#--
+============================================================================ 
+Name        : bmd.macros.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<#macro add_severity_count severity, color, count>
+    <#if count &gt; 0>
+        <#if severity == 'error'>
+<td width="12%%" align="center" bgcolor="${color}">${count}</td>
+        <#else>
+<td align="center" bgcolor="${color}">${count}</td>
+        </#if>
+    <#else>
+    <td align="center">${count}</td>
+    </#if>
+</#macro>
+<#if (doc)??>
+    <#assign logfile = "${doc.sbsinfo.logfile.@name}" >
+    <#assign time = "${doc.sbsinfo.duration.@time}" >
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+<#-- overall summary -->
+<#assign component_table = table_info['select id, component from component where logpath_id in (select id from logfiles where path like \'%${logfile}%\')'] >
+<html>
+<head><title>${logfile}</title></head>
+<body>
+<h2>Overall</h2>
+<table border="1" cellpadding="0" cellspacing="0" width="100%%">
+<tr>
+    <th width="22%%">&nbsp;</th>
+    <th width="11%%">Time</th>
+    <th width="11%%">Errors</th>
+    <th width="11%%">Warnings</th>
+    <th width="11%%">Critical</th>
+    <th width="23%%">Migration Notes</th>
+    <th width="11%%">Info</th>
+</tr>
+<tr>
+<td width="22%%">Total</td>
+<td width="12%%" align="center">${time}</td>
+<#assign color_list={'error': 'FF0000', 'warning': 'FFF000', 'critical': 'FF7000', 'remark': '0000FF', 'info': 'FFFFFF'}>
+<#assign priority_ids = color_list?keys>
+<#list priority_ids as priority>
+    <@add_severity_count severity='${priority}' 
+        count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] color=color_list['${priority}'] />
+</#list>
+</tr>
+</table>
+
+<#-- Summary for each component -->
+
+<h1>${logfile}</h1>
+<h2>By Component</h2>
+    <table border="1" cellpadding="0" cellspacing="0" width="100%%">
+        <tr>
+            <th width="50%%">Component</th>
+            <th width="10%%">Errors</th>
+            <th width="10%%">Warnings</th>
+            <th width="10%%">Criticals</th>
+            <th width="10%%">Notes</th>
+            <th width="10%%">Info</th>
+        </tr>
+<#assign component_ids = component_table?keys>
+<#assign href_id = 0>
+<#list component_ids as component>
+<tr><td>${component_table['${component}']}</td>
+<#list priority_ids as priority>
+    <#assign count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority      where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\') and component_id = \'${component}\' '][0]['COUNT'] >
+    <#if count &gt; 0>
+        <td align="center" bgcolor="${color_list['${priority}']}"><a href="#section${href_id}">${count}</a></td>
+        <#assign href_id = href_id + 1>
+    <#else>
+        <td align="center">${count}</td>
+    </#if>
+</#list>
+</tr>
+</#list>
+</table>
+
+<#-- Individual components status -->
+
+<#assign component_ids = component_table?keys>
+<#assign href_id = 0>
+<#list component_ids as component>
+<#assign displayComponentHeader= 0 >
+<#list priority_ids as priority>
+<#assign displayPriorityHeader= 0 >
+<#assign count = table_info['select count(data) as COUNT from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\')'][0]['COUNT'] >
+<#if count &gt; 0>
+    <h3><a name="section${href_id}">${priority} for ${component_table['${component}']}</a></h3>
+    <#assign href_id = href_id + 1>
+    <table border="1" cellpadding="0" cellspacing="0" width="100%%">
+    <tr>
+        <th width="85%%">Text</th>
+        <th width="15%%">Line Number</th>
+    </tr>
+    <#list table_info['select * from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\')'] as recordentry >
+    <tr><td>${recordentry['data']}</td><td>${recordentry['line_number']}</td></tr>
+    </#list>
+    </table>
+</#if>
+</#list>
+</#list>
+</body>
+</html>
+</#if>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/sms_content.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : sms_content.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+${ant["build.id"]}:${ant["env.COMPUTERNAME"]}: ${signalname} alert
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/sms_content_new.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+<#--
+============================================================================ 
+Name        : sms_content.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+${ant["build.id"]}:${ant["env.COMPUTERNAME"]}: ${signaling["signal.name"]} alert
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/summary.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,150 @@
+<#--
+============================================================================ 
+Name        : summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+
+<#include "/@macro/logger/logger.ftl"/>
+
+
+
+<head>
+    <title>
+<#assign mykey=doc.logSummary.info.id>
+<#if (conv[mykey])?exists>
+${doc.logSummary.info.id}
+</#if>
+build summary</title>
+    <@helium_logger_html_head/>
+</head>
+<body>
+
+<!--
+    Processing the Helium log summary.
+-->
+<#macro logentry node>
+    <#assign conv={"error": "error", "warn": "warning"}>
+    <#assign mykey=node.@severity[0]>
+    <#if (conv[mykey])?exists>
+        <@helium_logger_print type="${conv[mykey]}">${node}</@helium_logger_print>
+    <#else>        
+        <@helium_logger_print type="">${node}</@helium_logger_print>
+    </#if>
+</#macro>
+
+<#macro logfile node>
+    <#assign helium_node_id = helium_node_id + 1>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
+        <#assign pnames=pp.newWritableHash()>
+        <#assign conv={"error": "error", "warn": "warning", "info": ""}>
+        <#list node.logentry as entry>
+            <#assign pname=entry.@severity[0]>
+            <#if (pnames[conv[pname]])?exists>                
+                <@pp.set hash=pnames key="${conv[pname]}" value=pnames[conv[pname]]+1/>
+            <#else>
+                <@pp.set hash=pnames key="${conv[pname]}" value=1/>
+            </#if>
+        </#list>
+        <#list pnames?keys?sort as key>
+            <@helium_message_box nodeid="${helium_node_id}" type="${key}" count=pnames[key] />
+        </#list>
+    </@helium_logger_node_head>    
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <#list node.logentry as entry>
+            <@logentry entry/>
+        </#list>
+    </@helium_logger_node_content>
+</#macro>
+
+<!--
+    Ant logger like.
+-->
+<#macro message node>
+    <#assign conv={"error": "error", "warn": "warning", "remark": "remark", "note": "note"}>
+    <#assign mykey=node.@priority[0]>
+    <#if (conv[mykey])?exists>
+        <@helium_logger_print type="${conv[mykey]}">${node}</@helium_logger_print>
+    <#else>        
+        <@helium_logger_print type="${mykey}">${node}</@helium_logger_print>
+    </#if>
+</#macro>
+
+<#macro antlognode node>    
+    <#assign helium_node_id = helium_node_id + 1>    
+    <#if node["@name"]?size == 1 >
+        <#assign title = node.@name>
+    <#else>
+        <#assign title = node.@filename>
+    </#if>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
+        <#assign pnames=pp.newWritableHash()>
+        <#list node[".//message"] as msg>
+            <#assign pname=msg.@priority[0]>
+            <#if (pnames[pname])?exists>
+                <@pp.set hash=pnames key="${pname}" value=pnames[pname]+1/>
+            <#else>
+                <@pp.set hash=pnames key="${pname}" value=1/>
+            </#if>
+        </#list>
+        <#list pnames?keys?sort as key>
+            <@helium_message_box nodeid="${helium_node_id}" type="${key}" count=pnames[key] />
+        </#list>
+    </@helium_logger_node_head>
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+    <#list node["./build/task|./build/message|./task|./message"] as child>
+        <#if child?node_name == "message"> 
+            <@message child/>
+        <#elseif child?node_name == "task">        
+            <@antlognode child/>
+        </#if>
+    </#list>
+    </@helium_logger_node_content>
+</#macro>
+
+
+<!-- Call the macros to render the log contents. -->
+<#assign mykey=doc.logSummary.info>
+<#if (conv[mykey])?exists>
+<@helium_logger_header title="${doc.logSummary.info.id} build"/>
+
+<@helium_logger_content title="Build overview">
+    Time started: ${doc.logSummary.info.startTime}<br/>
+    Build machine: ${doc.logSummary.info.machine}<br/>
+    Is published?: ${doc.logSummary.info.publish.status}<br/>
+    <#if doc.logSummary.info.publish.status?string == true?string>
+        Published location: ${doc.logSummary.info.publish.location}</br>
+    </#if>
+</@helium_logger_content>
+</#if>
+<@helium_logger_content title="Errors and warnings details">
+    <#list doc.logSummary["./logfile|./log"] as sublog>
+        <#if sublog?node_name == "logfile"> 
+            <@logfile sublog/>
+        <#elseif sublog?node_name == "log">
+            <@antlognode sublog/>
+        </#if>
+    </#list>
+</@helium_logger_content>
+</body>
+</html>    
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/summary_metadata.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,129 @@
+<#--
+============================================================================ 
+Name        : summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+
+<#include "/@macro/logger/logger.ftl"/>
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+
+<head>
+    <title>
+<#if loginfo?? >
+<#assign mykey=loginfo.info.id>
+<#if (conv[mykey])?exists>
+${loginfo.info.id}
+</#if>
+build summary</title>
+    <@helium_logger_html_head/>
+</head>
+</#if>
+<body>
+
+
+<!--
+    Processing the Helium log summary.
+-->
+<#macro logentry text, severity>
+    <#assign conv={"error": "error", "warning": "warning"}>
+    <#if (conv['${severity}'])?exists>
+        <@helium_logger_print type="${conv[\"${severity}\"]}">${text}</@helium_logger_print>
+    <#else>
+        <@helium_logger_print type="">${text}</@helium_logger_print>
+    </#if>
+</#macro>
+
+<#macro logfile_severity logname, priority, count, helium_node_id>
+    <@helium_message_box nodeid="${helium_node_id}" type="${priority}"  count="${count}"?number />
+</#macro>
+
+
+<#macro logfile_entry_detail recordentry, helium_node_id>
+    <#if recordentry?keys?size &gt; 0 >
+        <@logentry "${recordentry['data']}", "${priority_table[\"${recordentry['priority_id']}\"]}"?lower_case />
+    </#if>
+</#macro>
+
+<!-- Call the macros to render the log contents. -->
+<#assign mykey=loginfo>
+<#if (conv[mykey])?exists>
+<@helium_logger_header title="${loginfo.info.id} build"/>
+
+<@helium_logger_content title="Build overview">
+    Time started: ${loginfo.info.startTime}<br/>
+    Build machine: ${loginfo.info.machine}<br/>
+    Is published?: ${loginfo.info.publish.status}<br/>
+    <#if loginfo.info.publish.status?string == true?string>
+        Published location: ${loginfo.info.publish.location}</br>
+    </#if>
+</@helium_logger_content>
+</#if>
+
+<@helium_logger_content title="Errors and warnings details">
+<#assign priority_table = table_info['select * from priority'] >
+<#assign logpath_table = table_info['select * from logfiles'] >
+<#assign priority_ids = priority_table?keys>
+<#assign logpath_id = logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign component_table = table_info['select id, component from component where logPath_id=${logpath}'] >
+    <#assign component_ids = component_table?keys?sort >
+    <#assign helium_node_id = helium_node_id + 1>
+    <#-- -->
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${logpath_table['${logpath}']}">
+        <#list priority_ids as priority>
+            <@logfile_severity "${logpath_table['${logpath}']}", "${priority_table['${priority}']}"?lower_case, 
+                "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and priority_id = ${priority}'][0]['COUNT']}", 
+                "${helium_node_id}" />
+        </#list>
+    </@helium_logger_node_head>
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <#list component_ids as component_id>
+            <#assign helium_node_id = helium_node_id + 1>
+            <@helium_logger_node_head nodeid="${helium_node_id}" title="${component_table['${component_id}']}">
+                <#list priority_ids as priority>
+                    <#assign priority_text = "${priority_table['${priority}']}"?lower_case>
+                    <#assign priority_count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and priority_id = ${priority} and component_id = ${component_id}'][0]['COUNT']}" >
+                    <@logfile_severity "${component_table['${component_id}']}", "${priority_text}", 
+                            "${priority_count}", 
+                            "${helium_node_id}" />
+                </#list>
+            </@helium_logger_node_head>
+            <@helium_logger_node_content nodeid="${helium_node_id}">
+            <#list priority_ids as priority>
+                <#list table_info['select * from metadata where logpath_id = ${logpath} and priority_id = ${priority} and component_id = ${component_id}'] as recordentry >
+                    <#-- <#if sublog?node_name == "logfile"> --> 
+                        <@logfile_entry_detail recordentry, "${helium_node_id}" />
+                    <#-- <#elseif sublog?node_name == "log">
+                        <@antlognode sublog/>
+                    </#if> -->
+                </#list>
+            </#list>
+            </@helium_logger_node_content>
+        </#list>
+    </@helium_logger_node_content>
+</#list>
+</@helium_logger_content>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/macro/logger/expand3.js	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,71 @@
+function __ToggleNode( divNode )
+{
+  var cntNode = document.getElementById(divNode.id.replace(/Img(.+)/, 'Content$1'));
+  
+  if(!cntNode) return;
+  
+  if(cntNode.style.display == 'none')
+  {
+    cntNode.style.display = 'block';
+    divNode.style.background = divNode.style.background.replace(/open./, 'close.');
+  }
+  else
+  {
+    cntNode.style.display = 'none';
+    divNode.style.background = divNode.style.background.replace(/close./, 'open.');
+  }
+  
+  return cntNode;
+}
+
+function __UpdateNode( divNode, dsp )
+{
+	var cntNode = document.getElementById(divNode.id.replace(/Img(.+)/, 'Content$1'));
+	
+	if(!cntNode) return;
+	
+	cntNode.style.display = dsp;
+	if(dsp == 'block')
+		divNode.style.background = divNode.style.background.replace(/open./, 'close.');
+	else
+		divNode.style.background = divNode.style.background.replace(/close./, 'open.');
+	
+	return cntNode;
+}
+
+function __ToggleChilds( divNode )
+{
+	var cntNode = __ToggleNode(divNode);
+	if(!cntNode) return;
+	var childs  = cntNode.getElementsByTagName('div');
+	
+	for(var i = 0; i != childs.length; ++i)
+		if(/Img/.test(childs[i].id))
+			__ToggleChilds(childs[i]);
+}
+
+function __UpdateChilds( divNode, dsp )
+{
+	var cntNode = __UpdateNode(divNode, dsp);
+	if(!cntNode) return;
+	var childs  = cntNode.getElementsByTagName('span');
+	
+	for(var i = 0; i != childs.length; ++i)
+		if(/Img/.test(childs[i].id))
+			__UpdateChilds(childs[i], dsp);
+}
+
+function ToggleNode( id )
+{ __ToggleNode(document.getElementById(id)); }
+
+function ShowContent( id )
+{ __UpdateNode(document.getElementById(id), 'block'); }
+
+function HideContent( id )
+{ __UpdateNode(document.getElementById(id), 'none'); }
+
+function ShowChilds( id )
+{ __UpdateChilds(document.getElementById(id), 'block'); }
+
+function HideChilds( id )
+{ __UpdateChilds(document.getElementById(id), 'none'); }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/macro/logger/log3.css	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,97 @@
+/* Main components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+BODY { font-family: "Nokia Sans Regular", Tahoma; font-size: x-small; margin: 0em; padding: 0em; background: #EEEEFF; }
+A { color: #000000; text-decoration: none; }
+#mb, #s_mb { margin: 5px; padding: 0px; background: #DADAEE; border: 1px solid #2161B5; }
+.mc, .s_mc { margin: 3px; padding: 3px 2px; background: #FFFFFF; border: 1px solid #2161B5; }
+.mc h1, .s_mc h1 { padding-left: 5px; margin: 3px 0px; font-weight: bold; color: #2161B5; font-size: x-small; border-bottom: 1px solid #2161B5; }
+.s_tag { font-size: x-small; font-weight: bold; padding: 0px 5px 3px 5px; }
+.s_val { font-size: x-small }
+
+/* Header */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+#h_wrapper { }
+.h_elmt { color: #0036CC; padding: 5px; margin: 10px; }
+.h_title { font-family: "Nokia Large", "Tahoma"; font-size: xx-large; font-weight: bold; }
+.h_subtitle { font-size: x-small; font-weight: normal; }
+
+/* Footer */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+#f_wrapper { }
+.f_elmt { font-weight: normal; color: #0036CC; padding: 5px; margin: 10px 15px; border-top: solid 1px #0036CC; }
+.f_title { font-size: x-small; padding: 0px; margin: 0px; }
+.f_subtitle { font-size: xx-small; padding: 0px; margin: 0px; }
+
+/* Color cross images */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.cr_r, .cr_b, .cr_y { padding-left: 19px; padding-bottom: 2px; }
+.cr_r { background: url(../img/icons/delete_red.gif) no-repeat; }
+.cr_b { background: url(../img/icons/delete_blue.gif) no-repeat; }
+.cr_y { background: url(../img/icons/delete_yellow.gif) no-repeat; }
+
+/* Color check images */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.ch_g, .ch_b { padding-left: 19px; padding-bottom: 2px; }
+.ch_g { background: url(../img/icons/check_green.gif) no-repeat; }
+.ch_b { background: url(../img/icons/check_blue.gif) no-repeat; }
+
+/* Element icons */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.icn_dir, .icn_cpp, .icn_hpp, .icn_txt, .icn_inf, .icn_bin, .icn_xml, .icn_prj, .icn_mmp, .icn_iby, .icn_oby, .icn_spt, .icn_doc, .icn_xls, .icn_rss
+{ padding-left: 23px; padding-bottom: 2px; }
+.icn_dir { background: url(../img/icons/dir.gif) no-repeat; }
+.icn_cpp { background: url(../img/icons/cpp.gif) no-repeat; }
+.icn_hpp { background: url(../img/icons/hpp.gif) no-repeat; }
+.icn_txt { background: url(../img/icons/txt.gif) no-repeat; }
+.icn_inf { background: url(../img/icons/inf.gif) no-repeat; }
+.icn_bin { background: url(../img/icons/bin.gif) no-repeat; }
+.icn_xml { background: url(../img/icons/xml.gif) no-repeat; }
+.icn_prj { background: url(../img/icons/prj.gif) no-repeat; }
+.icn_mmp { background: url(../img/icons/mmp.gif) no-repeat; }
+.icn_iby { background: url(../img/icons/iby.gif) no-repeat; }
+.icn_oby { background: url(../img/icons/oby.gif) no-repeat; }
+.icn_spt { background: url(../img/icons/spt.gif) no-repeat; }
+.icn_doc { background: url(../img/icons/doc.gif) no-repeat; }
+.icn_xls { background: url(../img/icons/xls.gif) no-repeat; }
+.icn_rss { background: url(../img/icons/rss.gif) no-repeat; }
+
+/* Message counts */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.count_fatal_error, .count_error, .count_warning, .count_remark, .count_note, .count_default { text-align: center; padding: 0px 20px; width: 200px; }
+.gbl_count_fatal_error, .gbl_count_error, .gbl_count_warning, .gbl_count_remark, .gbl_count_note, .gbl_count_default, .count_critical, .gbl_count_critical , .count_info, .gbl_count_info{ text-align: center; padding: 0px 20px; margin: 0px 2px; }
+.count_fatal_error, .gbl_count_fatal_error { color: #EB320A; border: 1px solid #EB320A; background: #F5C2B9; }
+.count_error, .gbl_count_error { color: #EB320A; border: 1px solid #EB320A; background: #FFCC00; }
+.count_critical, .gbl_count_critical { color: #FF3200; border: 1px solid #FF3200; background: #FFF476; }
+.count_warning, .gbl_count_warning { color: #FFBA00; border: 1px solid #FFBA00; background: #FFF476; }
+.count_remark, .gbl_count_remark { color: #4EBE2C; border: 1px solid #4EBE2C; background: #EDEFFF; }
+.count_note, .gbl_count_note { color: #2161B5; border: 1px solid #2161B5; background: #EDEFFF; }
+.count_info, .gbl_count_info { color: #2161B5; border: 1px solid #2161B5; background: #EDEFFF; }
+.count_default, .gbl_count_default { color: #DADADA; border: 1px solid #DADADA; background: #FFFFFF; }
+
+/* Node components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.node_head { padding: 1px 0px 2px 0px; }
+.node_title { padding-left: 19px; }
+.node_info { float: right; margin-top: -18px; padding: 1px 0px; }
+.node_content { padding: 2px 0px 2px 3px; margin-bottom: 3px; border-top: 1px solid #EDEDED; border-bottom: 1px solid #EDEDED;border-left: 1px solid #EDEDED; }
+.node_action { font-size: xx-small; color: #999999; }
+
+/* C++ components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.code_sample { font-family: Anonymous, "Courier New"; font-size: x-small; padding: 3px 6px; border: 1px solid #BABABA; background: #EDEDED; }
+.code_kwd { color: #0000FF; }
+.code_smb { color: #AA11FF; }
+.code_pp  { color: #44AA11; }
+.code_cmt { color: #767676; }
+
+/* Error highlight */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.code_fatal_error { background-color: #F5C2B9; }
+.code_error { background-color: #FFCC00; }
+.code_critical { background-color: #FFDD00; }
+.code_warning { background-color: #FFF476; }
+
+/* Formatting components */
+/*-------------------------------------------------------------------------------------------------------------------------*/
+.separator { margin-top: 5px; }
+.t_wrapper { width: 100%; }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/macro/logger/logger.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,107 @@
+<#--
+============================================================================ 
+Name        : logger.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+
+<#macro helium_logger_html_head>
+    <style type="text/css">
+        <#include "log3.css"/>
+    </style>
+    <script type="text/javascript">
+        <#include "expand3.js"/>
+    </script>
+</#macro>
+
+
+<#global helium_node_id = 0>
+
+
+<#macro helium_logger_header title subtitle="">
+    <div id="h_wrapper">
+        <div class="h_elmt">
+              <div class="h_title">${title}</div>
+              <div class="h_subtitle">${subtitle}</div>
+        </div>
+      </div>
+</#macro>
+
+
+<!-- Renders a main body of content -->
+<#macro helium_logger_content title>
+    <#assign helium_node_id = helium_node_id + 1>
+    <div id="mb">
+        <div class="mc">
+            <h1>${title}</h1>                                   
+            <div class="node_head"></div>
+                <div id="Content${helium_node_id}">
+                    <div class="node_content">
+                        <#nested>
+                    </div>
+                </div>      
+            </div>      
+        </div>      
+    </div>
+</#macro>
+
+
+<#macro helium_logger_print type>
+    <#if type == "">
+        <code><#nested></code><br/>
+    <#else>
+        <code class="code_${type}"><#nested></code><br/>
+    </#if>
+</#macro>
+
+<#macro helium_message_box nodeid type count>
+    <#if (count > 0)>
+        <a href="javascript:ToggleNode('Img${nodeid}')">
+            <span class="node_${type}">
+                <span class="count_${type}">${count} ${type}s</span>
+            </span>
+        </a>
+    </#if>
+</#macro>
+
+<#macro helium_logger_node_head nodeid title>
+    <div class="node_head">                    
+        <a href="javascript:ToggleNode('Img${nodeid}')">
+            <span id="Img${nodeid}">
+                <span class="node_action">[X]</span><span class="node_title">${title}</span>
+            </span>
+        </a>
+        <a href="javascript:ShowChilds('Img${nodeid}')">
+                <span class="node_action">[Show All]</span>
+        </a>
+        <a href="javascript:HideChilds('Img${nodeid}')">
+                <span class="node_action">[Hide All]</span>
+        </a>        
+        <!-- error reporting managenent -->
+        <#nested>
+    </div>
+</#macro>
+
+
+<#macro helium_logger_node_content nodeid>
+    <div id="Content${nodeid}" style="display:none">
+        <div class="node_content">
+            <#nested>
+        </div>
+    </div>
+</#macro>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/preparation/modificationset.log.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+<#--
+============================================================================ 
+Name        : modificationset.log.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="${ant['build.log.dir']}/${ant['build.id']}_modificationset.xml">
+    <build>
+<#list doc["./modificationset/project"] as project>
+        <#assign status=""/>
+        <#if project.@new?lower_case == "true">
+            <#assign status="baseline updated"/>
+        </#if>
+        <task name="${project.@id} (${status})">
+            <task name="Tasks">
+            <#list project["./task"] as task>
+                <message priority="info"><![CDATA[${task.@id?html}: ${task.@description?html}]]></message>
+            </#list>
+            </task>
+            <task name="Objects">
+            <#list project["./object"] as task>
+                <message priority="info"><![CDATA[${task.@id?html}: ${task.@user?html}: ${task.@status?html}:${task.@description?html}]]></message>
+            </#list>
+            </task>
+            <task name="Errors">
+            <#list project["./error"] as task>
+                <message priority="error"><![CDATA[${task.@description?html}]]></message>
+            </#list>
+            </task>
+        </task>
+</#list>
+    </build>
+</log>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/echo.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,18 @@
+@echo off
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+echo %*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/echo.sh	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,17 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+echo $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/test_common.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_common.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_common" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml"/>
+        
+    <target name="test-text-config">
+        <hlm:configuration file="${helium.dir}/tests/data/ant_config_test.txt"/>
+        <au:assertPropertyEquals name="text.a" value="text.value.A"/>
+        <au:assertPropertyEquals name="text.b" value="text.value.B"/>
+        <au:assertPropertyEquals name="text.c" value="text.value.A"/>
+    </target>
+
+    
+    <target name="test-xml-config">
+        <hlm:configuration file="${helium.dir}/tests/data/ant_config_test.xml"/>
+        <au:assertPropertyEquals name="xml.c" value="C"/>
+        <au:assertPropertyEquals name="xml.d" value="D"/>
+    </target>
+    
+    
+    <target name="test-text-config-from-fileset">
+        <hlm:configuration>
+            <fileset file="../../../tests/data/ant_config_test.txt"/>
+        </hlm:configuration>
+        <au:assertPropertyEquals name="text.a" value="text.value.A"/>
+        <au:assertPropertyEquals name="text.b" value="text.value.B"/>
+    </target>
+    
+    
+    <target name="test-xml-config-from-fileset">
+        <hlm:configuration>
+            <fileset file="../../../tests/data/ant_config_test.xml"/>
+        </hlm:configuration>
+        <au:assertPropertyEquals name="xml.c" value="C"/>
+        <au:assertPropertyEquals name="xml.d" value="D"/>
+    </target>
+    
+    
+    <target name="test-password-log-filtering">
+        <property name="password" value="foobarbaz"/>
+        <if>
+            <available file="${build.output.dir}" type="dir"/>
+            <then>
+                <record name="${build.log}" action="start"/>
+                <echo>Before password filtering</echo>
+                <hlm:filterRecordStartMacro/>
+                <echo>Logging password: ${password}</echo>
+                <hlm:filterRecordStopMacro pattern="${password}"/>
+                <echo>After password filtering</echo>
+                <record name="${build.log}" action="stop"/>
+            </then>
+        </if>
+    </target>
+    
+    
+    <target name="test-record">
+        <echo file="${helium.dir}/record-test.txt">foo</echo>
+        <record name="${helium.dir}/record-test.txt" action="stop" append="true"/>
+        <loadfile srcFile="${helium.dir}/record-test.txt" property="record.test"/>
+        <au:assertPropertyEquals name="record.test" value="foo"/>
+        <delete file="${helium.dir}/record-test.txt"/>
+    </target>
+    
+    
+    <target name="test-python-task">
+        <hlm:python script="${helium.dir}/tests/data/PythonTest.py" outputProperty="correct_output" resultProperty="correct_result"/>
+        <au:assertPropertyEquals name="correct_output" value="test complete!"/>
+        <au:assertPropertyEquals name="correct_result" value="0"/>
+        <hlm:python script="PythonTest.py" resultProperty="no_file_result"/>     
+        <au:assertPropertyEquals name="no_file_result" value="2"/>
+    </target>
+    
+    
+    <target name="test-assert">
+        <assert>
+            <bool>
+                <isset property="foobar"/>    
+            </bool>
+        </assert>
+    </target>
+    
+    
+    <target name="test-hlm-assert">
+        <hlm:assert>
+            <isset property="foobar"/>
+        </hlm:assert>
+        <au:assertLogContains text="Warning: "/>        
+    </target>
+            
+    <target name="test-hlm-assertFileExists">
+        <hlm:assertFileExists file="missingFile.txt"/>
+        <au:assertLogContains text="Warning: "/>
+        <property name="hlm.enable.asserts" value="true"/>
+        <trycatch property="hlm-assertFileExists.thrown">
+            <try>
+                <hlm:assertFileExists file="missingFile.txt"/>
+            </try>
+        </trycatch>
+        <au:assertPropertySet name="hlm-assertFileExists.thrown"/>
+        <echo file="assert_test_tempFile.txt">Foobar</echo>
+        <hlm:assertFileExists file="assert_test_tempFile.txt"/>
+        <delete file="assert_test_tempFile.txt"/>
+    </target>
+    
+    
+    <target name="test-jepp">
+        <script language="jython" setbeans="false">
+print "It works!"
+print dir(project)
+print project.getName()
+import re
+print re.match(r"foo(?=bar)", r"foobar")
+
+import net.sf.antcontrib.logic
+runtarget = net.sf.antcontrib.logic.RunTargetTask()
+print runtarget
+runtarget.setProject(project)
+runtarget.setTarget('hello')
+runtarget.execute()
+
+#from java.lang import Class
+#tasks = project.getTaskDefinitions()
+#signal_macro_def = tasks.get('signal')
+#signal_macro = signal_macro_def.newInstance()
+#signal_macro.setDynamicAttribute('name', 'foobar')
+#signal_macro.setProject(project)
+#print signal_macro
+#print dir(signal_macro)
+#signal_macro = signal_macro.cast('MacroInstance')
+#signal_macro = project.createTask('org.apache.tools.ant.taskdefs.MacroInstance')
+#print dir(signal_macro)
+#signal_macro.execute()
+        </script>
+    </target>
+
+    
+    <target name="try-xmltask">
+        <xmltask dest="xmltask_test.xml">
+            <insert path="/"  >
+            <![CDATA[
+            <test/>
+            ]]>
+            </insert>
+        </xmltask>
+        <script language="jython" setbeans="false">
+result = ",".join([str(i) for i in range(10000)])
+project.setProperty("xml.test.list", str(result))
+        </script>
+        <echo>${xml.test.list}</echo>
+        <for param="number" list="${xml.test.list}">
+            <sequential>
+                <xmltask source="xmltask_test.xml"
+                         dest="xmltask_test.xml">
+                    <insert path="/test">
+                       <![CDATA[
+            <element>@{number}</element>
+            ]]>
+                   </insert>
+                </xmltask>
+            </sequential>
+        </for>
+    </target>
+    
+    
+    <!-- Tests the assertXmlEqual task. -->
+    <target name="test-assertXmlEqual">
+        <string id="control.xml" value="&lt;foo/&gt;"/>
+        <string id="test_good.xml" value="&lt;foo/&gt;"/>
+        <string id="test_bad.xml" value="&lt;foobar/&gt;"/>
+        <hlm:assertXmlEqual control="control.xml" test="test_good.xml" failonerror="false"/>
+        <trycatch property="hlm-assertXmlEqual.thrown">
+            <try>
+                <hlm:assertXmlEqual control="control.xml" test="test_bad.xml"/>
+            </try>
+        </trycatch>
+        <au:assertPropertySet name="hlm-assertXmlEqual.thrown"/>
+    </target>
+    
+    
+    <target name="test-prettyprintxml-filter">
+        <loadfile srcfile="${helium.dir}/tests/data/config_test.cfg.xml" property="xml.test.content">
+            <filterchain>
+                <tokenfilter>
+                    <filetokenizer/>
+                    <hlm:prettyprintxml/>
+                </tokenfilter>
+            </filterchain>
+        </loadfile>
+        <echo>Pretty-printed XML:
+            
+${xml.test.content}</echo>
+    </target>
+    
+    
+    <!--<target name="test-ccm-task">
+        <ccm/>
+    </target>-->
+    
+    <!-- Tests the touch functionality. -->
+    <target name="test-hlm-touch">
+        <hlm:touch>
+            <path>
+                <pathelement path="${helium.dir}/build"/>
+            </path>
+        </hlm:touch>
+    </target>
+    
+    <!-- Test parsemodel -->
+    <target name="test-parsemodel-description">
+        <hlm:parsemodel output="${helium.build.dir}/test_helium_data_model.xml_parsed" input="${helium.dir}/tests/data/data_model_validation_test.xml"/>            
+        <!-- Check if parsed file exist -->
+        <au:assertFileExists file="${helium.build.dir}/test_helium_data_model.xml_parsed" />
+        <xpathtest xmlfile="${helium.build.dir}/test_helium_data_model.xml_parsed">  
+            <namespace uri="" prefix=""/>
+            <!-- Check property description has been rendered as Media Wiki Syntax -->
+            <xpath expression="/heliumDataModel/property[description = '&lt;p&gt;Test property one.&lt;/p&gt;']"/>
+            <!-- Check group description has been rendered as Media Wiki Syntax -->
+            <xpath expression="/heliumDataModel/group[description = '&lt;p&gt;Group description test.&lt;/p&gt;']"/>
+            <!-- Check ** has been removed from property description -->
+            <xpath expression="/heliumDataModel/property[description = '&lt;p&gt;Test property Three.&lt;/p&gt;']"/>
+        </xpathtest>
+    </target>
+    
+    <!-- Test user flow graph creation -->
+    <target name="test-helium-user-graph">
+        <runtarget target="helium-user-graph"/>
+        <!--<au:assertFileExists file="${helium.dir}/build/doc/user-graph.html"/>-->
+        <au:assertFileExists file="${helium.dir}/build/doc/images/user-graph.dot.png"/>
+        <!--<sequential>
+            <au:assertTrue>
+                <isfileselected file="${helium.dir}/build/doc/user-graph.html">
+                    <contains text="area shape"/>
+                </isfileselected>
+            </au:assertTrue>
+        </sequential>-->
+    </target>
+    
+    
+    <target name="test-tempRecordMacro">
+        <delete file="${build.cache.log.dir}/test.log" failonerror="false"/>
+        <delete file="${build.cache.log.dir}/test.log.xml" failonerror="false"/>
+        <delete file="${build.cache.log.dir}/test.sqlite" failonerror="false"/>
+        <delete file="${metadata.dbfile}" failonerror="false"/>
+        <hlm:tempRecordStartMacro name="test.log" />
+        <echo>ERROR: an error</echo>
+        <echo>WARNING: a warning</echo>
+        <echo>INFO: some useless message</echo>
+        <hlm:tempRecordStopMacro name="test.log" database="${build.cache.log.dir}/test.sqlite"/>
+        <au:assertTrue>
+            <and>
+                <hlm:hasSeverity file="${build.cache.log.dir}/signals/test.log.status.xml" severity="error"/>
+                <hlm:hasSeverity file="${build.cache.log.dir}/signals/test.log.status.xml" severity="warning"/>
+                <hlm:hasSeverity file="${build.cache.log.dir}/signals/test.log.status.xml" severity="info"/>
+            </and>
+        </au:assertTrue>
+    </target> 
+
+    <target name="test-helium_project_path">
+        <delete file="${build.cache.log.dir}/project-compile.cmaker.html" failonerror="false"/>
+        <fmpp sourceFile="${helium.dir}/doc/src/api/project.html.ftl" outputFile="${build.cache.log.dir}/project-compile.cmaker.html">
+            <data expandProperties="yes">
+                ant: antProperties()
+                doc: xml(${helium.dir}/tests/data/test_database.xml)
+                data: xml(${helium.dir}/tests/data/data_model_validation_test.xml)
+            </data>            
+        </fmpp>
+        <au:assertFileExists file="${build.cache.log.dir}/project-compile.cmaker.html"/>
+        <sequential>
+            <au:assertTrue>
+                <isfileselected file="${build.cache.log.dir}/project-compile.cmaker.html">
+                    <contains text="Location"/>
+                </isfileselected>
+            </au:assertTrue>
+            <au:assertTrue>
+                <isfileselected file="${build.cache.log.dir}/project-compile.cmaker.html">
+                    <contains text="helium/tools/compile/cmaker.ant.xml"/>
+                </isfileselected>
+            </au:assertTrue>
+            <au:assertTrue>
+                <isfileselected file="${build.cache.log.dir}/project-compile.cmaker.html">
+                    <contains text="http://helium.nmp.nokia.com/trac/browser/helium/trunk/helium/tools/compile/cmaker.ant.xml"/>
+                </isfileselected>
+            </au:assertTrue>
+        </sequential>
+    </target>
+
+    <target name="test-sisfiles">
+        <tempfile destdir="${build.cache.dir}" property="sisfiles.tempconfig.file" suffix=".xml"/>
+        <tempfile destdir="${build.cache.dir}" property="sis.config.file.parsed" suffix=".xml"/>
+        <if>
+            <os family='windows'/>
+            <then>
+                <property name="echocmd" value="${helium.dir}/tools/common/test/echo.bat"/>
+            </then>
+            <else>
+                <property name="echocmd" value="echo"/>
+            </else>
+        </if>
+        <echoxml  file="${sisfiles.tempconfig.file}">
+            <build>
+                <config abstract="true">
+                    <set name="makesis.tool" value="${echocmd}"/>
+                    <set name="signsis.tool" value="${echocmd}"/>
+                    <set name="build.sisfiles.dir" value="${build.cache.dir}/sisfilestest"/>
+                    <set name="key" value=""/>
+                    <set name="cert" value=""/>
+                    <config>
+                        <set name="name" value=""/>
+                        <set name="path" value=""/>
+                    </config>
+                </config>
+            </build>
+        </echoxml>
+        <antcall target="sisfiles">
+            <param name="sis.config.file" value="${sisfiles.tempconfig.file}"/>
+            <param name="sis.config.file.parsed" value="${sis.config.file.parsed}"/>
+            <param name="build.sisfiles.dir" value="${build.cache.dir}/helium/temp_drive/output/sisfiles"/>
+            <param name="temp.build.dir" value="${build.cache.dir}/helium/temp_drive/output/temp_build_files"/>
+            <param name="build.drive" value="${build.cache.dir}/helium/temp_drive/"/>
+            <param name="build.cache.log.dir" value="${build.cache.dir}/helium/temp_drive/output/logs"/>
+            <param name="metadata.dbfile" value="${build.cache.dir}/helium/temp_drive/output/logs/${build.id}_metadata.sqlite"/>
+        </antcall>
+        <au:assertFileExists file="${build.cache.dir}/helium/temp_drive/output/temp_build_files/sis_build.ant.xml"/>
+        <delete file="${sisfiles.tempconfig.file}"/>
+        <delete file="${sis.config.file.parsed}"/>
+        <delete dir="${build.cache.dir}/helium/temp_drive"/>
+    </target>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/test_deconfigure_task.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_deconfigure_task.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_deconfigure_task" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml"/>
+
+
+    <target name="test-deconfigure-no-arguments-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:deconfigure/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-deconfigure-task-database-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - projectName password">
+            <hlm:deconfigure database="to1tobet"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-projectName-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password">
+            <hlm:deconfigure projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName">
+            <hlm:deconfigure password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-consider-branch-releases-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:deconfigure considerBranchReleases="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set considerBranchReleases to true" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-verbosity-set-to-quiet-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:deconfigure verbosity="0"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 0" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-verbosity-set-to-verbose-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:deconfigure verbosity="1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-verbosity-set-to-very-verbose-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:deconfigure verbosity="2"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 2" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-database-and-projectName-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - password">
+            <hlm:deconfigure database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-deconfigure-task-database-and-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - projectName">
+            <hlm:deconfigure database="to1tobet" password="test"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-deconfigure-task-projectName-and-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database">
+            <hlm:deconfigure projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-deconfigure-task-all-mandatory-arguments-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: Script execution failure.">
+            <hlm:deconfigure database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: Script execution failure.">
+            <hlm:deconfigure database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" considerBranchReleases="yes" verbosity="1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set considerBranchReleases to true" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+    </target>
+
+    <target name="test-deconfigure-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-and-verbosity-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose or 2 - very verbose">
+            <hlm:deconfigure database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" considerBranchReleases="no" verbosity="9"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set considerBranchReleases to false" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 9" level="debug"/>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/test_getvariablevalue.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_getvariablevalue.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_getvariablevalue" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml"/>
+        
+    
+    <target name="test-getvariablevalue">
+        <hlm:argSet id="test.variableSet">
+            <variable name="v1" value="the_value"/>
+        </hlm:argSet>
+        <hlm:getVariableValue name="v1" property="v1.value">
+            <hlm:argSet refid="test.variableSet"/>
+        </hlm:getVariableValue>
+        <au:assertTrue>
+            <equals arg1="${v1.value}" arg2="the_value"/>
+        </au:assertTrue>
+    </target>    
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/test_logging.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_logging.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_logging" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+    <property environment="env"/>
+    
+    <property name="helium.dir" location="../../.." />
+    <property name="build.drive" location="${env.TEMP}/helium/temp_drive"/>
+    <import file="../../../helium.ant.xml"/>
+    
+    
+    <target name="test-logrecord">
+        <hlm:logrecord name="logrecord_test.log" action="start" loglevel="verbose" emacsmode="true"/>
+        <echo>Some logrecord test output.</echo>
+        <hlm:logrecord name="logrecord_test.log" action="stop"/>
+        <delete file="logrecord_test.log"/>
+    </target>
+    
+    
+    <target name="test-logrecord-filtering">
+        <hlm:logrecord name="${env.TEMP}/logrecord_test.log" action="start" regexp="badtext"/>
+        <echo>Some sensitive test output badtext</echo>
+        <hlm:logrecord name="${env.TEMP}/logrecord_test.log" action="stop"/>
+        <loadfile srcfile="${env.TEMP}/logrecord_test.log" property="logrecord.test.file"/>
+        <au:assertTrue>
+            <contains string="${logrecord.test.file}" substring="Some sensitive test output ******"/>
+        </au:assertTrue>
+        <delete file="${env.TEMP}/logrecord_test.log"/>
+    </target>
+    
+    <target name="test-logrecord-filtering-regexp">
+        <hlm:logrecord name="${env.TEMP}/logrecord_regexp_test.log" action="start" regexp="bad(text"/>
+        <echo>Some sensitive test output. fubar and bad(text</echo>
+        <hlm:logrecord name="${env.TEMP}/logrecord_regexp_test.log" action="stop"/>
+        <loadfile srcfile="${env.TEMP}/logrecord_regexp_test.log" property="logrecord.test.regexp.file1"/>
+        <au:assertTrue>
+            <contains string="${logrecord.test.regexp.file1}" substring="Some sensitive test output. fubar and ********"/>
+        </au:assertTrue>
+        <delete file="${env.TEMP}/logrecord_regexp_test.log"/>
+        
+        <hlm:logrecord name="${env.TEMP}/logrecord_regexp_test.log" action="start" regexp="bad[text"/>
+        <echo>Some sensitive test output. fubar and bad[text</echo>
+        <hlm:logrecord name="${env.TEMP}/logrecord_regexp_test.log" action="stop"/>
+        <loadfile srcfile="${env.TEMP}/logrecord_regexp_test.log" property="logrecord.test.regexp.file2"/>
+        <au:assertTrue>
+            <contains string="${logrecord.test.regexp.file2}" substring="Some sensitive test output. fubar and ********"/>
+        </au:assertTrue>
+        <delete file="${env.TEMP}/logrecord_regexp_test.log"/>
+        
+        <hlm:logrecord name="${env.TEMP}/logrecord_regexp_test.log" action="start" regexp="(ba[dt]ex)t"/>
+        <echo>Some sensitive test output. fubar and (ba[dt]ex)t</echo>
+        <hlm:logrecord name="${env.TEMP}/logrecord_regexp_test.log" action="stop"/>
+        <loadfile srcfile="${env.TEMP}/logrecord_regexp_test.log" property="logrecord.test.regexp.file3"/>
+        <au:assertTrue>
+            <contains string="${logrecord.test.regexp.file3}" substring="Some sensitive test output. fubar and ********"/>
+        </au:assertTrue>
+        <delete file="${env.TEMP}/logrecord_regexp_test.log"/>
+        
+    </target>
+    
+    <!--<target name="test-logextract">
+        <hlm:logextract file="${helium.dir}/tests/data/logs/test_log.log"/>
+        <xmltask source="${helium.dir}/tests/data/logs/test_log.log2.xml">
+            <copy path="count(/log/build/message)" property="message.total"/>
+        </xmltask>
+        <assertPropertyEquals name="message.total" value="2"/>
+        <delete file="${helium.dir}/tests/data/logs/test_log.log2.xml"/>
+    </target>-->
+
+  
+    <target name="test-specificlogmacro-create">
+        <!--Record something-->
+        <hlm:startSpecificLogMacro name="${env.TEMP}/record_test.log"/>         
+        <echo>astalavista</echo>
+        <hlm:stopSpecificLogMacro name="${env.TEMP}/record_test.log"/>         
+        
+        <!-- Assert if the file doesn't exists-->
+        <au:assertFileExists file="${env.TEMP}/record_test.log"/>
+        
+        <!--Match the file content-->        
+        <loadfile property="file.message" srcFile="${env.TEMP}/record_test.log"/>               
+        <au:assertTrue message="Failed to match content!!">
+            <equals arg1="${file.message}" arg2="[echo] astalavista" trim="true"/>          
+        </au:assertTrue>        
+        <delete file="${env.TEMP}/record_test.log"/>        
+    </target>
+    
+    
+    <target name="test-specificlogmacro-backup">
+        <touch file="${env.TEMP}/backup_test.log"/>        
+        <echo file="${env.TEMP}/backup_test.log">childhood memory</echo>
+        <hlm:startSpecificLogMacro name="${env.TEMP}/backup_test.log" backup="true" />         
+        <echo>Now a days</echo>        
+        <hlm:stopSpecificLogMacro name="${env.TEMP}/backup_test.log"/>                                            
+        
+        <!--Match the backup file content-->        
+        <loadfile property="backup.message" srcFile="${backup.file.name}"/>        
+        <au:assertTrue message="Failed to match content!!">
+            <equals arg1="${backup.message}" arg2="childhood memory" trim="true"/>          
+        </au:assertTrue>
+        
+        <!--Match the current file content-->        
+        <loadfile property="current.message" srcFile="${env.TEMP}/backup_test.log"/>               
+        <au:assertTrue message="Failed to match content!!">
+            <equals arg1="${current.message}" arg2="[echo] Now a days" trim="true"/>          
+        </au:assertTrue>
+        
+        <delete file="${env.TEMP}/backup_test.log"/>
+        <delete file="${backup.file.name}"/>                
+        
+    </target>
+    <target name="test-log4j-log-file">                
+        <au:assertFileExists file="${log4j.cache.dir}/hlm_debug.log" />        
+        <au:assertFileDoesntExist file="hlm_debug.log" />
+    </target>
+    
+     <!-- Check the build-property-cache-file exists or not -->
+    <target name="test-build-property-cache-file-exists">
+        <antcall target="diamonds"/>
+        <au:assertFileExists file="${build.property.cache.file}" />
+    </target>
+    
+    <!-- Check the build-property-cache-file contents-->
+    <target name="test-build-property-cache-file-content">
+        <antcall target="diamonds"/>
+        <loadfile property="test.data" srcFile="${build.property.cache.file}"/>
+        <au:assertMatches string="${test.data}" pattern="diamonds.build.url" />
+    </target>
+    
+    
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/test_rebaseline_task.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_rebaseline_task.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_rebaseline_task" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env"/>
+    
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml"/>
+
+
+    <target name="test-rebaseline-no-arguments-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseline-task-database-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - projectName password">
+            <hlm:rebaseline database="to1tobet"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-projectName-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseline projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName">
+            <hlm:rebaseline password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-release-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline release="tony/test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set release to tony/test" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-baseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline baseline="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-version-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline version="RnD_2007wk49"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set version to RnD_2007wk49" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-releaseBaseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline releaseBaseline="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set releaseBaseline to true" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-leaveFolderswritable-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline leaveFolderswritable="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set leaveFolderswritable to true" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-disableTaskRebadging-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline disableTaskRebadging="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set disableTaskRebadging to true" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-rebadgeObjectVersions-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline rebadgeObjectVersions="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set rebadgeObjectVersions to true" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-baselineName-set-to-quiet-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline baselineName="shoephone-RnD_2007wk49_01project:co1train#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set baselineName to shoephone-RnD_2007wk49_01project:co1train#1" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-useBranchReleaseMethodology-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline useBranchReleaseMethodology="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set useBranchReleaseMethodology to true" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-createBaselineForRollingReleaseTag-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline createBaselineForRollingReleaseTag="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set createBaselineForRollingReleaseTag to true" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-verbosity-set-to-quiet-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline verbosity="0"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 0" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-verbosity-set-to-verbose-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+            <hlm:rebaseline verbosity="1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-database-and-projectName-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - password">
+            <hlm:rebaseline database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseline-task-database-and-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - projectName">
+            <hlm:rebaseline database="to1tobet" password="test"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseline-task-projectName-and-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database">
+            <hlm:rebaseline projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseline-task-all-mandatory-arguments-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: Script execution failure.">
+            <hlm:rebaseline database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: Script execution failure.">
+            <hlm:rebaseline database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+    </target>
+
+    <target name="test-rebaseline-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-and-verbosity-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose.">
+            <hlm:rebaseline database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="9"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
+        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 9" level="debug"/>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/testing.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : testing.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="internal.testing" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium"> 
+    <description>
+        Targets to test Helium itself.
+    </description>
+    <import file="${helium.dir}/build-jar.ant.xml"/>
+    
+    <fileset id="python.files" dir="${helium.dir}">
+        <include name="tools/**/*.py"/>
+        <include name="extensions/nokia/tools/**/*.py"/>
+        <exclude name="tools/startup/bootstrap/site.py"/>
+    </fileset>
+
+    <!-- Runs all the unit testing targets. -->
+    <target name="unittest" depends="ju-unittest,check,ant-unittest,py-unittest"/>
+    
+    <!-- Unit testing -->
+
+    <!-- Setup environment for Python unit tests -->
+    <target name="setup-py-unittest">
+        <!-- Autogenerate test data for ArchivePreBuilderTest based on ANT properties -->
+        <if>
+            <available file="${helium.dir}/tests/data/archive_test.cfg.xml"/>
+            <then>
+                <delete file="${helium.dir}/tests/data/archive_test.cfg.xml"/>
+            </then>
+        </if>
+        <copy file="${helium.dir}/tests/data/archive_test_input.cfg.xml" tofile="${helium.dir}/tests/data/archive_test.cfg.xml" overwrite="true">
+            <filterchain>
+                <expandproperties/>
+            </filterchain>
+        </copy>
+    </target>
+
+    <!-- Do Python tests. -->
+    <target name="do-py-unittest" depends="setup-py-unittest">
+        <property name="nose.args" value="nokiatest test"/>
+        <exec executable="python" failonerror="true">
+            <arg line="${python.tools}/coverage.py -x ${python.tools}/nosetests-script.py -v ${nose.args}"/>
+        </exec>
+    </target>
+    
+    <!-- Shortcut for Python unit tests. -->
+    <target name="pt" depends="do-py-unittest"/>
+    
+        
+    <!-- Create Python code coverage statistics. -->
+    <target name="py-unittest-coverage">
+        <mkdir dir="${helium.dir}/build/coverage"/>
+        <pathconvert pathsep=" " property="python.modules.coverage">
+            <fileset refid="python.files"/>
+        </pathconvert>
+        <exec executable="python" failonerror="true">
+            <arg line="${python.tools}/coverage.py -a -d ${helium.dir}/build/coverage ${python.modules.coverage}"/>
+        </exec>
+                        
+        <!-- backup the old line coverage report and create the new one -->
+        <mkdir dir="${helium.dir}/build/coverage/report"/>        
+        <if>
+            <available file="${helium.dir}/build/coverage/report/line_coverage.txt"/>
+            <then>
+                <copy file="${helium.dir}/build/coverage/report/line_coverage.txt" tofile="${helium.dir}/build/coverage/report/line_coverage_old.txt" overwrite="true"/>
+            </then>    
+        </if>        
+        <record name="${helium.dir}/build/coverage/report/line_coverage.txt" action="start"/>        
+        <exec executable="python" failonerror="true">
+            <arg line="${python.tools}/coverage.py -r ${python.modules.coverage}"/>
+        </exec>
+        <record name="${helium.dir}/build/coverage/report/line_coverage.txt" action="stop"/>
+        <replace file="${helium.dir}/build/coverage/report/line_coverage.txt">
+            <replacetoken><![CDATA[[exec]]]></replacetoken>
+            <replacevalue><![CDATA[]]></replacevalue>
+        </replace>
+        <hlm:python>
+for line in open(r'${helium.dir}/build/coverage/report/line_coverage.txt'):
+    if 'TOTAL' in line and '0%' in line:
+        raise Exception('Coverage at 0%')
+        </hlm:python>
+        <delete file="${helium.dir}/.coverage"/>
+    </target>
+    
+    
+    <!-- Run Python unit test cases. -->
+    <target name="py-unittest" depends="do-py-unittest,py-unittest-coverage"/>
+        
+    
+    <!-- Run Ant unit tests. -->
+    <target name="ant-unittest">
+        <mkdir dir="${helium.build.dir}/temp"/>
+        <au:antunit>
+            <fileset dir="${helium.dir}" includes="tools/**/test_*.ant.xml"/>
+            <fileset dir="${helium.dir}" includes="extensions/nokia/tools/**/test_*.ant.xml"/>
+            <au:plainlistener/>
+        </au:antunit>
+    </target>
+    
+    
+    <!-- Run JUnit unit tests. -->
+    <target name="ju-unittest" depends="build-java-src">
+        <!-- Source location for test class -->
+        <property name="src" location="tools/common/java/test" /> 
+        <!-- Source classes location -->
+        <property name="src.classes" location="tools/common/java/src" />
+        
+        <delete dir="${build.temp.dir}/junit_classes"/>
+        <mkdir dir="${build.temp.dir}/junit_classes" />
+                
+        <!-- Compile the test classes  -->
+        <javac srcdir="${src}" destdir="${build.temp.dir}/junit_classes" debug="true">    
+            <include name="**/*.java"/>
+            <classpath>                         
+                <pathelement path="${java.class.path}/"/>
+            </classpath>
+        </javac>
+        
+        <path id="build.classpath">
+            <pathelement location="${build.temp.dir}/class" />
+            <pathelement location="${build.temp.dir}/junit_classes" />
+        </path>
+        <emma enabled="true">
+            <instr instrpathref="build.classpath"  
+            destdir="${build.temp.dir}/emma/instrumented"  
+            metadatafile="${build.temp.dir}/metadata.emma"
+            merge="true">
+                <filter excludes="org.apache.log4j.*" />
+            </instr>
+        </emma>
+                                                    
+        <!-- Execute JUnit-->
+        <junit fork="yes" printsummary="yes" haltonfailure="no" showoutput="yes" >
+            <formatter type="brief" usefile="false"/>
+            <jvmarg value="-Demma.coverage.out.file=${build.temp.dir}/coverage.emma" />
+            <jvmarg value="-Demma.coverage.out.merge=false" />
+            <classpath>
+                <pathelement path="${build.temp.dir}/emma/instrumented"/>
+                <pathelement path="${java.class.path}/"/>
+            </classpath>    
+            <batchtest fork="yes" todir="${build.temp.dir}/junit_test">
+                <fileset dir="${src}">
+                    <include name="**/*Test*.java"/>
+                </fileset>
+            </batchtest>
+        </junit>
+        
+        <emma enabled="true" >
+            <report>
+                <infileset dir="${build.temp.dir}" includes="*.emma" />
+                <txt outfile="${build.temp.dir}/coverage.txt" />
+                <html outfile="${build.temp.dir}/coverage.html" />
+            </report>
+        </emma>
+        <loadfile property="message" srcFile="${build.temp.dir}/coverage.txt"/>
+        <echo message="${message}"/>
+    </target>
+    
+    
+    <!-- iMaker Helium feature unittesting. -->
+    <target name="imaker-unittest" depends="rombuild-export-features">
+        <property name="imaker.unittest.args" value="" />
+        <for param="unittest.filename">
+            <path>
+                <fileset dir="${build.drive}/epoc32/rom/config/unittest" casesensitive="yes">        
+                    <include name="**/test_*.mk"/>
+                </fileset>
+            </path>
+            <sequential>
+                <echo>Running @{unittest.filename}</echo>
+                <exec executable="${imaker.command}" dir="${build.drive}/">
+                    <arg line="${imaker.unittest.args}"/>
+                    <arg line="-f @{unittest.filename}"/>
+                    <arg value="unittest"/>
+                </exec>
+            </sequential>
+        </for>
+    </target>
+    
+    <!-- Validates XML files against suitable schema or DTDs. -->
+    <target name="validate-xml">
+        <!--<schemavalidate fullchecking="false" noNamespaceFile="tools/common/schema/ant.xsd">
+            <Schema namespace="ant.apache.org"
+                    file="tools/common/schema/ant.xsd" />
+            <schema namespace="http://www.nokia.com/helium"
+                    file="tools/common/schema/helium_ant.xsd" />
+            <fileset dir="tools">
+                <include name="**/build.xml"/>
+                <include name="**/*.ant.xml"/>
+                <exclude name="**/test_*.ant.xml"/>
+            </fileset>
+        </schemavalidate>-->
+        <schemavalidate noNamespaceFile="tools/common/schema/helium_data_model.xsd"
+                        file="${data.model.file}"/>
+        <!--<schemavalidate noNamespaceFile="tools/common/schema/helium_config.xsd">
+            <fileset dir="testconfig">
+                <include name="**/delivery.xml"/>
+                <include name="**/*.cfg.xml"/>
+                <exclude name="**/test_*.ant.xml"/>
+            </fileset>
+        </schemavalidate>-->
+    </target>
+    
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/ImageCreation.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,90 @@
+#============================================================================ 
+#Name        : ImageCreation.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+use warnings;
+#use strict;
+use IPC::Open2;
+use FileHandle;
+use File::Copy;
+use Cwd;
+use Getopt::Long;
+
+my($copyto,$MyTraces,$Drive,$product,$type);
+my $result = GetOptions(
+        "copyto=s"  => \$copyto,
+        "mytraces=s"  => \$Mytraces,
+        "Drive=s"=> \$Drive,
+        "product=s"=> \$product,
+        "type=s"=> \$type
+        );
+if((!$copyto) or (!$product) or (!$type))
+  {
+    &Usage;
+    }
+
+my $imagedes=$copyto;
+my $Traces="\\epoc32\\rombuild";
+my $pid;
+
+if($Drive)
+{
+	chdir "$Drive" or die "Cannot change Directory to $Drive\n";
+}
+
+chdir ("/epoc32/rom/") or die "Cannot Change Directory to /epoc32/rom/";
+
+if($Mytraces)
+	{
+		print "Removing $Traces \n";
+		print unlink "$Traces\\mytraces.txt";
+    `echo " " > $Traces\\mytraces.txt`;
+	}
+AGAIN:
+#system("del *$product* 2>&1");
+
+
+print system("perl BuildS60Rom.pl -product $product -type $type -b -dir $imagedes") or die "cannot open BuildS60Rom.pl";
+
+#system("move *$product*.* $copyto");
+system("move \\flash_temp\\*erase_userdisk.fpsx $copyto");
+if($Mytraces)
+  {
+    print copy ($Mytraces,"$Traces\\myTraces.txt");;
+    
+    $imagedes="$copyto\\udeb";
+    system ("mkdir $copyto");
+    $Mytraces=();
+    goto AGAIN;
+  }
+
+#system("7za a $copyto\\images.zip  $copyto\\*%USERNAME%*.*");
+
+sub Usage
+{
+  print "Usage:
+              imagecreation.pl -copyto <1> -MyTraces <2> -Drive <3> -product <4> -type <5>
+              
+                <1> Create images to specified directory [Mandatory]
+                <2> Location to Mytraces.txt or any other file to-be used as mytraces
+                <3> Drive where SDK is Istalled on which Image needs to be created
+                <4> Supported for particular release [Mandatory]
+                <5> [rnd|prd|subcon]  Set the image type [Mandatory]
+        ";
+        exit 0
+  }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/buildjob.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,105 @@
+#!perl -w
+
+#============================================================================ 
+#Name        : buildjpb.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+# ==============================================================================
+#  %name:          buildjob.pl %
+#  Part of:        Juno Build Tools
+#  Requires:       BuildJob.pm
+#
+#  %derived_by:    ferg %
+#  %version:	   3 %
+#  %date_modified: Wed May 04 14:44:22 2005 %
+#
+#  See POD text at the end of this file for usage details.
+# ==============================================================================
+
+use strict;
+use FindBin;
+use Getopt::Long;
+use Pod::Usage;
+use lib "$FindBin::Bin/../lib";
+use BuildJob;
+
+my $help = 0;
+my $data_source;
+my $log_file;
+my $num_clients;
+
+GetOptions('datasrc|d=s'    => \$data_source,
+	    'logfile|l=s'    => \$log_file,
+	    'numclients|n=s' => \$num_clients,
+	    'help'           => \$help) or pod2usage(2);
+pod2usage(2) unless $data_source;
+pod2usage({-verbose => 2 }) if $help;
+
+BuildJob::run($data_source, $log_file, $num_clients) or die("Error running build job.\n");
+
+__END__
+
+=head1 NAME
+
+BuildJob - Run BuildServer and BuildClients
+
+=head1 SYNOPSIS
+
+BuildJob.pl -d <data source> [-n <number of clients>] [-l <log file>] [-h]
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-h>
+
+Print a brief help message and exits.
+
+=item B<-d> <data source file name>
+
+Data Source (XML command file)
+
+=item B<-l> <log file name>
+
+Log file for output from commands run on the BuildClient. Defaults to
+"build.log".
+
+=item B<-n>
+
+Number of BuildClients to run.  Defaults to the number of processors
+on the system.
+
+=back
+
+=head1 DESCRIPTION
+
+This program runs a number of BuildClients and the BuildServer 
+with the specified data source and log file.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<BuildJob>
+
+BuildJob.pl is a wrapper which calls the BuildJob.pm module from the
+command line.
+
+=back
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/cmaker.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : cmaker.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile.cmaker" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        cMaker support.
+    </description>
+    
+    <property name="cmaker.component.dir" location="${build.drive}/tools/cmaker"/>
+    <property name="cmaker.config.dir" location="${build.drive}/config"/>
+    <property name="cmaker.pp.version" value=""/>
+    <property name="cmaker.s60.version" value=""/>
+    <property name="cmaker.log.label" value=""/>
+
+    <!--
+        The cmakerMacro enables the user to run cmaker commands directly from Ant.
+        To configure it just provide NCP and S60 version and the action you want to run.
+        Default action is WHAT.
+        
+        e.g
+        <pre>
+            <hlm:cmakerMacro ncp="53" s60="32" action="export"/>
+        </pre>
+    -->
+    <macrodef name="cmakerMacro" uri="http://www.nokia.com/helium">
+        <attribute name="ncp" default=""/>
+        <attribute name="s60" default=""/>
+        <attribute name="action" default="what"/>
+        <sequential>
+            <var name="temp.cmaker.arg1" value="NCP="/>
+            <var name="temp.cmaker.arg2" value="S60="/>
+            <if>
+                <not>
+                    <equals arg1="@{ncp}" arg2="" />
+                </not>
+                <then>
+                    <var name="temp.cmaker.arg1" value="NCP=@{ncp}"/>
+                </then>
+            </if>
+            <if>
+                <not>
+                    <equals arg1="@{s60}" arg2="" />
+                </not>
+                <then>
+                    <var name="temp.cmaker.arg2" value="S60=@{s60}"/>
+                </then>
+            </if>
+            <hlm:symbianLogHeaderMacro command="cmaker ${temp.cmaker.arg1} ${temp.cmaker.arg2} ACTION=@{action}"
+                    config="CMAKER_@{action}" dir="${cmaker.config.dir}"/>
+            <exec executable="${build.drive}/epoc32/tools/cmaker.cmd" dir="${cmaker.config.dir}">
+                <arg line="${temp.cmaker.arg1}" />
+                <arg line="${temp.cmaker.arg2}" />
+                <arg value="ACTION=@{action}" />
+            </exec>
+            <hlm:symbianLogFooterMacro/>
+        </sequential>
+    </macrodef>
+    
+    <!--  Installing CMaker. -->    
+    <target name="cmaker-install">
+        <hlm:recordStartMacro name="${build.id}_install.cmaker.log" emacsmode="true"/>
+        <exec executable="${build.drive}/epoc32/tools/make.exe" dir="${cmaker.component.dir}">
+            <arg line="install"/>
+        </exec>
+        <hlm:recordStopMacro name="${build.id}_install.cmaker.log"/>
+        <!-- Blocks packaging configuration generation. -->
+        <if>
+            <istrue value="${blocks.enabled}" />
+            <then>
+                <mkdir dir="${blocks.config.dir}" />
+                <exec executable="python">
+                    <arg value="-m"/>
+                    <arg value="packager.cli"/>
+                    <arg value="--epocroot=${build.drive}/" />
+                    <arg value="--config=${blocks.config.dir}" />
+                    <arg value="--datasource=cmaker" />
+                    <arg value="-Dwhatlog=${build.log.dir}/${build.id}_install.cmaker.log" />
+                    <arg value="-Dconfigdir=${cmaker.component.dir}" />
+                    <arg value="--updateData" />
+                </exec>
+            </then>
+        </if>
+    </target>
+    
+    <!-- CMaker export configuration. -->    
+    <target name="cmaker-export" depends="cmaker-install" if="enable.cmaker">
+        <hlm:recordStartMacro name="${build.id}${cmaker.log.label}.export.cmaker.log" emacsmode="true"/>
+        <hlm:cmakerMacro ncp="${cmaker.pp.version}"
+                      s60="${cmaker.s60.version}"
+                      action="export"/>
+        <hlm:recordStopMacro name="${build.id}${cmaker.log.label}.export.cmaker.log"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:abldmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}${cmaker.log.label}.export.cmaker.log" />
+                <metadatafilterset refid="filterset.compile" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+    <!-- CMaker cleanup exported configuration. -->
+    <target name="cmaker-clean" depends="cmaker-install" if="enable.cmaker">
+        <hlm:recordStartMacro name="${build.id}${cmaker.log.label}.clean.cmaker.log" emacsmode="true"/>
+        <hlm:cmakerMacro ncp="${cmaker.pp.version}"
+                      s60="${cmaker.s60.version}"
+                      action="clean"/>
+        <hlm:recordStopMacro name="${build.id}${cmaker.log.label}.clean.cmaker.log"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:abldmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}${cmaker.log.label}.clean.cmaker.log" />
+                <metadatafilterset refid="filterset.compile" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+    
+    <!-- CMaker list the final destination of what will be exported. -->
+    <target name="cmaker-what" depends="cmaker-install" if="enable.cmaker">
+        <hlm:recordStartMacro name="${build.id}${cmaker.log.label}.what.cmaker.log" emacsmode="true"/>
+        <hlm:cmakerMacro ncp="${cmaker.pp.version}"
+                      s60="${cmaker.s60.version}"
+                      action="what"/>
+        <hlm:recordStopMacro name="${build.id}${cmaker.log.label}.what.cmaker.log"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:abldmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}${cmaker.log.label}.what.cmaker.log" />
+                <metadatafilterset refid="filterset.compile" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+
+        <!-- Blocks packaging configuration generation. -->
+        <if>
+            <istrue value="${blocks.enabled}" />
+            <then>
+                <mkdir dir="${blocks.config.dir}" />
+                <exec executable="python">
+                    <arg value="-m"/>
+                    <arg value="packager.cli"/>
+                    <arg value="--epocroot=${build.drive}/" />
+                    <arg value="--config=${blocks.config.dir}" />
+                    <arg value="--datasource=cmaker" />
+                    <arg value="-Dwhatlog=${build.log.dir}/${build.id}${cmaker.log.label}.what.cmaker.log" />
+                    <arg value="-Dconfigdir=${cmaker.config.dir}" />
+                    <!--arg value="-Dname=${cmaker.log.label}"-->
+                    <arg value="--updateData" />
+                </exec>
+            </then>
+        </if>
+    </target>
+
+    <!-- CMaker list the source files what will be exported. -->
+    <target name="cmaker-whatdeps" depends="cmaker-install" if="enable.cmaker">
+        <hlm:recordStartMacro name="${build.id}${cmaker.log.label}.whatdeps.cmaker.log" emacsmode="true"/>
+        <hlm:cmakerMacro ncp="${cmaker.pp.version}"
+                      s60="${cmaker.s60.version}"
+                      action="what_deps"/>
+        <hlm:recordStopMacro name="${build.id}${cmaker.log.label}.whatdeps.cmaker.log"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:abldmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}${cmaker.log.label}.whatdeps.cmaker.log" />
+                <metadatafilterset refid="filterset.compile" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/compile.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,446 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name        : compile.ant.xml
+Part of     : Helium
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Targets related to compile stage. It includes cmaker,
+        ec, ebs, sbs, sbs-ec build system.
+    </description>
+
+    <!-- Property declaration -->
+    <property name="genxml.output.file.suffix" value="genxml" />
+    <property name="compile.sysdef.dtd.stub" location="${helium.dir}/tools/common/dtd/sysdef_dtd_1_4_0.xml" />
+    <property name="compile.signal.input" value="compileSignalInput" />
+    <property name="diamonds.compile.summary" location="${build.log.dir}/${build.id}_compile_diamonds.xml" />
+
+
+    <!-- including common compilation macros -->
+    <hlm:typedef file="${helium.dir}/tools/compile/compile.antlib.xml" uri="http://www.nokia.com/helium"/>
+    <import file="cmaker.ant.xml" />
+    <import file="ec/ec.ant.xml" />
+    <import file="ebs/ebs.ant.xml" />
+    <import file="sbs/sbs.ant.xml" />
+    <import file="sis.ant.xml" />
+    <import file="qt/qt.ant.xml" />
+
+    <!-- A few basic steps (directory creation) that are needed before starting compilation. -->
+    <target name="prebuild">
+        <!-- Needed for the emulator to work. -->
+        <mkdir dir="${build.drive}/epoc32/winscw/d"/>
+        <!-- Build from source workaround as Symbian release is not completely unzipped. -->
+        <mkdir dir="${build.drive}/epoc32/release/winscw/udeb/z/resource/fonts"/>
+        <mkdir dir="${build.drive}/epoc32/release/winscw/urel/z/resource/fonts"/>
+        <mkdir dir="${build.drive}/epoc32/include/osextensions"/>
+    </target>
+
+    <!-- Does all the necessary steps before starting the component build -->
+    <target name="precompile" depends="record-compile-start-time,create-canonical-sysdef-file,precompile-ec"/>
+
+    <!-- post operation for EC builds, submits the compile time and lists all the built components-->
+    <target name="postcompile" depends="postcompile-ec,render-build-duplicates" unless="env.HLM_SUBCON">
+        <antcall target="submit-compile-time"/>
+    </target>
+    
+    <!-- Pre-processes all System Definition input files.
+
+    Any Ant properties used in the files will be replaced by their values.
+    Also the Symbian System Definition files needs to have \src inserted
+    in front of the paths of the units.
+    -->
+    <target name="preprocess-sysdef-files">
+        <mkdir dir="${build.output.dir}/build/input"/>
+        <delete verbose="true">
+            <fileset dir="${build.output.dir}/build/input/" includes="**"/>
+        </delete>
+
+        <fail message="No sysdef files found">
+            <condition>
+                <resourcecount refid="system.definition.files" when="equal" count="0" />
+            </condition>
+        </fail>
+
+        <for param="file">
+            <resources refid="system.definition.files"/>
+            <sequential>
+                <copy todir="${build.output.dir}/build/input"  verbose="true">
+                    <fileset file="@{file}"/>
+                    <filterchain>
+                        <replaceregex pattern="bldFile=&quot;common" replace="bldFile=&quot;src\\\\common" flags="gi"/>
+                        <replaceregex pattern="mrp=&quot;common" replace="mrp=&quot;src\\\\common" flags="gi"/>
+                        <replaceregex pattern="bldFile=&quot;cedar" replace="bldFile=&quot;src\\\\cedar" flags="gi"/>
+                        <replaceregex pattern="mrp=&quot;cedar" replace="mrp=&quot;src\\\\cedar" flags="gi"/>
+                        <expandproperties/>
+                    </filterchain>
+                    <mapper>
+                        <scriptmapper language="beanshell">
+<![CDATA[
+import java.io.File;
+String counter = project.getProperty(".unique.counter");
+int count;
+if (counter == null){
+    count = 0;
+}else{
+    count = Integer.valueOf(counter) + 1;
+}
+project.setProperty(".unique.counter", ""+count);
+targetname = (String.format("%016d",count) + "_"+new File(source).getName());
+self.addMappedName(targetname);
+]]>
+                        </scriptmapper>
+                    </mapper>
+                </copy>
+            </sequential>
+        </for>
+    </target>
+
+
+    <!-- Merges all preprocessed System Definition files into one combined file. -->
+    <target name="create-canonical-sysdef-file" depends="preprocess-sysdef-files">
+        <pathconvert pathsep=" " property="system.definition.files.list">
+            <fileset dir="${build.output.dir}/build/input/" includes="*"/>
+            <chainedmapper>
+                <globmapper from="*" to="-x *" casesensitive="no"/>
+            </chainedmapper>
+        </pathconvert>
+        <hlm:compileGenxmlMergeMacro input="-x ${compile.sysdef.dtd.stub} ${system.definition.files.list}"
+                                    output="${canonical.sysdef.file}"/>
+    </target>
+
+    <!--
+      Supports a cleaning of binaries before starting compilation, based on a SysDef configuration.
+      <deprecated>Please consider using ido-prep-clean target.</deprecated>
+    -->
+    <target name="compile-clean" depends="create-canonical-sysdef-file"
+      if="sysdef.clean.configuration">
+        <antcall target="compile-configuration" inheritRefs="true">
+            <param name="sysdef.configuration" value="${sysdef.clean.configuration}"/>
+            <param name="compile.signal.input" value="compileCleanSignalInput"/>
+            <param name="compile.discard.result" value="true"/>
+        </antcall>
+    </target>
+
+
+    <!-- Creates a input file for EBS using Symbian genxml tool. -->
+    <target name="genxml">
+        <if>
+            <or>
+                <isset property="build.system.ebs"/>
+                <isset property="build.system.ebs-ant"/>
+            </or>
+            <then>
+                <hlm:compileGenxmlMacro input="-x ${canonical.sysdef.file}"
+                                        configuration="${sysdef.configuration}"
+                                        output="${genxml.output.file}"
+                                        log="${build.log.dir}/${build.id}.${sysdef.configuration}_${genxml.output.file.suffix}.log" />
+            </then>
+        </if>
+    </target>
+
+
+    <!-- Postprocess genxml generated file by prefixing all commands with echos.
+
+    Reads in the genxml generated command file (ready to be fed to EBS) and
+    replaces all the command strings in the Execute statements with strings
+    prefixed with echos.  For example, this target changes the following
+    Execute statement:
+    <pre>
+      '<Execute ID="123" CommandLine="bldmake bldfiles -k"/>
+
+    to:
+
+      '<Execute ID="123" CommandLine="echo bldmake bldfiles -k"/>
+    </pre>
+    Properties:
+
+      ebs.dry-run         When set, echo will be added to commands.
+      genxml.output.file  The XML file with commands to be executed (by EBS).
+
+    -->
+    <target name="postprocess-genxml" if="ebs.dry-run">
+      <!-- The 'echo' prefix will be added to the command even though it might
+    already exist there. This is due to a problem with a regular expression;
+    for some reason negative lookbehind assertion did not work due to syntax
+    not being correct (python expression with less-than character within a
+    python string within XML data; sounds messy and it was). -->
+        <hlm:python>
+import fileinput
+import re
+
+COMMANDLINE_RE = r'CommandLine="(.*?)"'
+ECHO_REPLACEMENT = r'CommandLine="echo \1"'
+
+for line in fileinput.input(["${genxml.output.file}"], inplace=True):
+    print re.sub(COMMANDLINE_RE, ECHO_REPLACEMENT, line).rstrip()
+        </hlm:python>
+    </target>
+
+
+    <!-- Takes a specific timestamp at the start of the compilation stage.
+
+    This is used at the end of compilation to log the compile time to the GTI
+    database.
+    -->
+    <target name="record-compile-start-time">
+        <preset.exec executable="perl" outputproperty="build.main.start.time">
+            <arg value="-e"/>
+            <arg value="print time"/>
+        </preset.exec>
+    </target>
+
+  <!-- Runs the Symbian scanlog and HTMLscanlog tools, as well as a Helium tool, for
+  scanning the compilation log. -->
+    <target name="compile-scanlog">
+        <if>
+            <!-- Only run is SBS is in use and sbs.hlm.scanlog is defined -->
+            <or>
+                <isset property="build.system.sbs"/>
+                <isset property="build.system.sbs-ec"/>
+            </or>
+            <then>
+                <if>
+                    <not>
+                        <isfalse value="${compile.discard.result}"/>
+                    </not>
+                    <then>
+                        <delete file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log.xml" failonerror="false"/>
+                    </then>
+                </if>
+            </then>
+            <else>
+                <exec executable="perl" dir="${build.drive}/" output="${build.log.dir}/${build.id}.${sysdef.configuration}_scan1.log" failonerror="${failonerror}">
+                    <arg value="${epocroot}epoc32/tools/scanlog.pl"/>
+                    <arg file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+                </exec>
+                <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg value="${epocroot}epoc32/tools/htmlscanlog.pl"/>
+                    <arg value="-v"/>
+                    <arg value="-v"/>
+                    <arg value="-l"/>
+                    <arg file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+                    <arg value="-o"/>
+                    <arg file="${build.log.dir}/${build.id}.${sysdef.configuration}_scan2.html"/>
+                </exec>
+                <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_scan2.html"/>
+                <if>
+                    <!--
+                      Only generate the log.xml if we want the results to be included in the final results
+                      or get them used by the signaling mechanism.
+                    -->
+                    <isfalse value="${compile.discard.result}"/>
+                    <then>
+                        <hlm:metadatarecord database="${metadata.dbfile}">
+                            <hlm:abldmetadatainput>
+                                <fileset casesensitive="false" file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+                                <metadatafilterset refid="filterset.compile" />
+                            </hlm:abldmetadatainput>
+                        </hlm:metadatarecord>
+                        <hlm:compileLogSignalMacro compile.summary.file="${build.id}.${sysdef.configuration}_compile.log" 
+                            error.limit="${build.errors.limit}" />
+                        <!-- Todo: metadata: insert assertions for metadata parsing here -->
+                    </then>
+                </if>
+            </else>
+        </if>
+    </target>
+
+  <!-- Compiles one System Definition configuration.
+
+  Certain properties must be defined to call this. It is intended to be called using
+  an antcall from within a loop.
+  -->
+    <target name="compile-configuration" depends="run-qmake,genxml,postprocess-genxml,compile-ebs,compile-genxml-ec,
+                        compile-ec-helium,compile-ebs-ant,compile-sbs,compile-scanlog"/>
+
+  <!-- Executes each of the System Definition configurations in turn. -->
+    <target name="do-compile-main">
+        <propertyregex property="sysdef.configurations.list" input="${sysdef.configurations.list}"
+                       regexp="\s*(\S+?)\s*,\s*(\S+?)\s*" replace="\1,\2" global="true" casesensitive="false"
+                       override="true" defaultValue="${sysdef.configurations.list}"/>
+
+        <for list="${sysdef.configurations.list}" delimiter="," param="sysdef.config">
+            <sequential>
+                <antcall target="compile-configuration" inheritRefs="true">
+                    <param name="sysdef.configuration" value="@{sysdef.config}"/>
+                    <param name="genxml.output.file" location="${temp.build.dir}/${build.id}.@{sysdef.config}_${genxml.output.file.suffix}.xml" />
+                </antcall>
+            </sequential>
+        </for>
+    </target>
+    <var name="build.errors.total" value="" unset="true"/>
+
+    <!-- Starts the actual compilation  phase of a build -->
+    <target name="compile-main" depends="precompile,do-compile-main,postcompile"/>
+
+    <!-- Macro to preprocess build information -->
+    <scriptdef name="diamondsSummaryMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output"/>
+    <![CDATA[
+from xml.sax.handler import ContentHandler
+from xml.sax import make_parser
+from xml.sax.saxutils import quoteattr
+
+class DiamondsSummary(ContentHandler):
+    def __init__(self):
+        ContentHandler.__init__(self)
+        self.scanLog = False
+        self.components = {}
+        self.component = None
+        self.level = 0
+        self.total = {'error':0, 'critical':0, 'warning':0}
+
+    def startElement(self, name, attrs):
+        if name == 'log' and attrs.get('filename', None) != None and attrs.get('filename', '').endswith('_compile.log'):
+            self.scanLog = True
+        elif self.scanLog and name == "task":
+            self.level += 1
+
+        if self.scanLog and name == "task" and self.level == 2 and attrs.get('name', None) != None:
+            self.component = attrs.get('name', None)
+            if self.component not in self.components:
+                self.components[self.component] = {'error':0, 'critical':0, 'warning':0}
+
+        if self.scanLog and name == "message" and attrs.get('priority', None) != None:
+            if attrs.get('priority') in self.total:
+                self.total[attrs.get('priority')] += 1
+
+        if self.scanLog and name == "message" and self.level > 1 and self.component != None and attrs.get('priority', None) != None:
+            if attrs.get('priority') in self.components[self.component]:
+                self.components[self.component][attrs.get('priority')] += 1
+
+    def endElement(self, name):
+        if name == 'log':
+            self.scanLog = False
+            self.level = 0
+            self.component = None
+        elif name == 'task':
+            self.level = self.level - 1
+
+
+parser = make_parser()
+diamondsSummary = DiamondsSummary()
+parser.setContentHandler(diamondsSummary)
+parser.parse(open(str(project.getProperty('build.summary.file'))))
+
+output = '<?xml version="1.0"?>\n<compile>\n'
+output += '<components>\n'
+for name in diamondsSummary.components:
+    xname = quoteattr(name)
+    output += '<component name=%s error="%d" critical="%d" warning="%d" />\n' % (xname, diamondsSummary.components[name]['error'], diamondsSummary.components[name]['critical'], diamondsSummary.components[name]['warning'])
+    #print name + " ==> %d" % diamondsSummary.components[name]['error']
+output += '</components>\n'
+output += '<total error="%d" critical="%d" warning="%d" />\n' % (diamondsSummary.total['error'], diamondsSummary.total['critical'], diamondsSummary.total['warning'])
+output += '</compile>\n'
+self.log(str("Writing %s" % str(attributes.get('output'))))
+f = open(str(attributes.get('output')), 'w+')
+f.write(output)
+    ]]></scriptdef>
+
+    <!-- Creates a .csv log of the sizes of all the binaries created in the build. -->
+    <target name="binary-sizes-log" if="binary.sizes.output">
+        <hlm:startSpecificLogMacro name="${build.log.dir}/${build.id}_binary_sizes.log"/>
+        <property name="binary.sizes.output.file" location="${build.log.dir}/${build.id}_flash_image_size_data.csv"/>
+        <pathconvert pathsep=";" property="build.logs.list">
+            <fileset dir="${build.log.dir}" includes="*_build.log" excludes="*ant_build.log;*_zipup_build.log"/>
+        </pathconvert>
+        <pathconvert pathsep=";" property="binary.sizes.rom.logs.list">
+            <fileset refid="binary.sizes.rom.logs"/>
+        </pathconvert>
+        <hlm:python>
+import logging
+
+import build.io
+import sysdef.api
+import sysdef.io
+
+#logging.basicConfig(level=logging.DEBUG)
+logging.basicConfig(level=logging.INFO)
+
+logging.info('Reading the System Sefinition information')
+sysDef = sysdef.api.SystemDefinition(r'${canonical.sysdef.file}')
+
+# Read in the output binaries of each unit
+logging.info('Reading the output binaries created by each unit.')
+build_logs = r'${build.logs.list}'.split(';')
+if len(build_logs) == 0:
+    raise Exception('List of build logs is empty!')
+logging.info("The list of log files:\n")
+logging.info("\n".join(build_logs))
+for logpath in build_logs:
+    binaries_reader = build.io.AbldLogWhatReader(logpath)
+    sysDef.merge_binaries(binaries_reader)
+
+# Read in the binary sizes listed in the ROM output logs
+logging.info('Reading the binary sizes of each binary from ROM logs.')
+rom_logs = r'${binary.sizes.rom.logs.list}'.split(';')
+if len(rom_logs) == 0:
+    raise Exception('List of ROM logs is empty!')
+logging.info("The list of log files:\n")
+logging.info("\n".join(rom_logs))
+for log in rom_logs:
+    binary_sizes_reader = build.io.RombuildLogBinarySizeReader(log)
+    sysDef.merge_binary_sizes(binary_sizes_reader)
+
+# Write out a .csv file containing
+size_writer = sysdef.io.FlashImageSizeWriter(r'${binary.sizes.output.file}')
+size_writer.write(sysDef, r'${sysdef.configurations.list}'.split(','))
+size_writer.close()
+        </hlm:python>
+        <hlm:assertFileExists file="${binary.sizes.output.file}"/>
+        <hlm:stopSpecificLogMacro name="${build.log.dir}/${build.id}_binary_sizes.log"/>
+    </target>
+
+
+    <!-- Run codescanner to perform analysis on source code.
+    Logs will be created under ${build.log.dir}/codescanner/
+    Property ${codescanner.path} needs to be set to indicate what code to analyse.
+    -->
+    <target name="codescanner">
+        <mkdir dir="${build.log.dir}"/>
+        <mkdir dir="${build.log.dir}/codescanner"/>
+        <hlm:codescanner dest="${build.log.dir}/codescanner" format="${codescanner.format}" configuration="${codescanner.config}" auto="${codescanner.log.unique}" >
+            <path refid="codescanner.path"/>
+        </hlm:codescanner>
+        <move todir="${build.log.dir}/codescanner" includeemptydirs="false">
+            <fileset dir="${build.log.dir}/codescanner" includes="*.*"/>
+            <mapper type="glob" from="*" to="${build.id}_*"/>
+        </move>
+    </target>
+
+
+    <!-- Updates the UAProf header.
+
+    TODO: Is this still needed? -->
+    <target name="update-uaprof-header">
+        <property name="uaprof.cenrep.file" value="${build.drive}/epoc32/data/Z/private/10202be9/101F8731.txt"/>
+        <copy file="${uaprof.cenrep.file}" tofile="${uaprof.cenrep.file}.original"/>
+        <replace file="${uaprof.cenrep.file}" token="@version@" value="${build.version}" encoding="UTF-16LE" summary="true"/>
+    </target>
+
+
+  <!-- Runs a number of postbuild steps that must be run after compilation is complete,
+  but before ROM images and zipping are started. -->
+    <target name="postbuild" depends="update-uaprof-header,sisfiles" unless="env.HLM_SUBCON">
+        <antcall target="security-checker"/>
+        <antcall target="dump-swicertstore"/>
+        <antcall target="check-stub-sis"/>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/compile.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,324 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name        : compile.antlib.xml
+Part of     : Helium
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib xmlns:hlm="http://www.nokia.com/helium">
+    <!-- This task transfer the log file into html format -->
+    <macrodef name="compileHtmlscanlogMacro" uri="http://www.nokia.com/helium">
+        <attribute name="input"/>
+        <attribute name="output"/>
+        <sequential>
+            <exec dir="${build.drive}/" executable="perl" failonerror="${failonerror}">
+                <arg value="${epocroot}epoc32/tools/htmlscanlog.pl"/>
+                <arg value="-v"/>
+                <arg value="-v"/>
+                <arg value="-l"/>
+                <arg file="@{input}"/>
+                <arg value="-o"/>
+                <arg file="@{output}"/>
+            </exec>
+            <hlm:assertFileExists file="@{output}"/>
+        </sequential>
+    </macrodef>
+
+    <macrodef name="calculateErrorsFromLog" uri="http://www.nokia.com/helium">
+        <attribute name="logfile"/>
+        <sequential>
+            <if>
+                <not>
+                    <isset property="skip.diamonds"/>
+                </not>
+                <then>
+                    <fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/faults_metadata.ftl"
+                                 outputfile="${build.log.dir}/compile-main.xml">
+                        <data expandProperties="yes">
+                            dbPath: ${metadata.dbfile}
+                            logpath: @{logfile} 
+                            ant: antProperties()
+                        </data>
+                    </fmpp>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <macrodef name="compileLogSignalMacro" uri="http://www.nokia.com/helium">
+        <attribute name="compile.summary.file"/>
+        <attribute name="error.limit"/>
+        <sequential>
+            <hlm:metadataCountSeverity severity="ERROR" log="@{compile.summary.file}" 
+                db="${metadata.dbfile}" 
+                property="build.errors.total"/>
+                
+            <echo>Errors after compile-main: ${build.errors.total}</echo>
+            <echo message="${build.errors.limit}" />
+            <echo message="@{error.limit}" />
+            <if>
+                <scriptcondition language="jython" value="false">
+errorsTotal = project.getProperty("build.errors.total")
+errorsLimit = project.getProperty("build.errors.limit")
+if int(errorsLimit) > -1:
+    if int(errorsTotal) > int(errorsLimit):
+        self.setValue(1)
+                </scriptcondition>
+                <then>
+                    <property name="compile.result" value="1"/>
+                </then>
+                <else>
+                    <property name="compile.result" value="0"/>
+                </else>
+            </if>
+            <echo message="compile result:${compile.result}" />
+            <hlm:signalMacro skip.count="true" result="${compile.result}" 
+                logfile="@{compile.summary.file}" 
+                signal.input="${compile.signal.input}" />
+        </sequential>
+    </macrodef>
+    
+    <!-- Macro to start the build using EBS. Parameters are generated xml file for EBS builds
+    the log output of the build and the number of threads for the build. -->
+    <macrodef name="compileEbsMacro" uri="http://www.nokia.com/helium">
+        <attribute name="input"/>
+        <attribute name="log"/>
+        <attribute name="threads" default="${number.of.threads}"/>
+        <sequential>
+            <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                <env key="EPOCROOT" value="${epocroot}"/>
+                <arg value="${helium.dir}/tools/compile/buildjob.pl"/>
+                <arg value="-d"/>
+                <arg value="@{input}"/>
+                <arg value="-l"/>
+                <arg value="@{log}"/>
+                <arg value="-n"/>
+                <arg value="${number.of.threads}"/>
+            </exec>
+            <hlm:assertFileExists file="@{log}"/>
+        </sequential>
+    </macrodef>
+
+    <!-- Macro to generate the xml file for EBS builds. Inputs are Merged xml file for the process,
+    configuration for which the EBS xml file is generated and the output xml file for the EBS builds and
+    the log output of the build. -->
+    <macrodef name="compileGenxmlMacro" uri="http://www.nokia.com/helium">
+        <attribute name="input"/>
+        <attribute name="configuration"/>
+        <attribute name="output"/>
+        <attribute name="log"/>
+        <sequential>
+            <preset.exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                <arg value="${epocroot}epoc32/tools/build/genxml.pl"/>
+                <arg value="-o"/>
+                <arg value="@{output}"/>
+                <arg value="-l"/>
+                <arg value="@{log}"/> <!-- ${build.log.dir}/${build.id}.@{configuration}_genxml.log -->
+                <arg value="-s"/>
+                <arg value="${epocroot}"/>
+                <arg value="-n"/>
+                <arg value="@{configuration}"/>
+                <arg line="@{input}"/>
+            </preset.exec>
+            <hlm:assertFileExists file="@{output}"/>
+            <hlm:assertFileExists file="@{log}"/>
+        </sequential>
+    </macrodef>
+
+    <!--
+        Merges all preprocessed System Definition files into one combined file
+        This macro also handles the copying of the sysdef DTDs on the root of
+        the build environment.
+    -->
+    <macrodef name="compileGenxmlMergeMacro" uri="http://www.nokia.com/helium">
+        <attribute name="input"/>
+        <attribute name="output"/>
+        <sequential>
+            <copy todir="${build.drive}/" verbose="true">
+                <fileset dir="${helium.dir}/tools/common/dtd" includes="*.dtd"/>
+            </copy>
+            <preset.exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}" output="${build.log.dir}/${build.id}.sysdef_GenxmlMerge.log">
+                <arg value="${epocroot}epoc32/tools/build/genxml.pl"/>
+                <arg value="-s"/>
+                <arg value="${epocroot}"/>
+                <arg value="-m"/>
+                <arg value="@{output}"/>              
+                <arg line="@{input}"/>
+            </preset.exec>
+            <if>
+                <not>
+                    <available file="@{output}"/>
+                </not>
+                <then>
+                    <!-- Todo: metadata: Make sure that logfilter is added to the filterset -->
+                    <hlm:metadatarecord database="${metadata.dbfile}">
+                        <hlm:textmetadatainput>
+                            <fileset casesensitive="false" file="${build.log.dir}/${build.id}.sysdef_GenxmlMerge.log" />
+                            <metadatafilterset>
+                                <metadatafilter priority="ERROR" regex="^ERROR:" description="genxml error" />
+                                <metadatafilter priority="ERROR" regex="^Context:" description="genxml context error" />
+                            </metadatafilterset>
+                            <metadatafilterset refid="filterset.genxml.merge" />
+                        </hlm:textmetadatainput>
+                    </hlm:metadatarecord>
+                    <hlm:generateBuildStatus file="${build.id}.sysdef_GenxmlMerge.log" />
+                    <hlm:signal name="canonicalSysDefFailSignal" result="1" >
+                        <signalNotifierInput>
+                            <signalInput refid="canonicalSysDefFailSignalInput" />
+                            <notifierInput file = "${build.signal.status.dir}/${build.id}.sysdef_GenxmlMerge.log.status.html" />
+                        </signalNotifierInput>
+                    </hlm:signal>
+                </then>
+            </if>
+
+            <hlm:assertFileExists file="@{output}"/>
+        </sequential>
+    </macrodef>
+
+    <!--
+      This macro uses genxml to filter a sysdef file.
+      -->
+    <macrodef name="compileGenxmlFilterMacro" uri="http://www.nokia.com/helium">
+        <attribute name="input"/>
+        <attribute name="output"/>
+        <attribute name="filter"/>
+        <sequential>
+            <preset.exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                <arg value="${epocroot}epoc32/tools/build/genxml.pl"/>
+                <arg value="-s"/>
+                <arg value="${epocroot}"/>
+                <arg value="-m"/>
+                <arg value="@{output}"/>
+                <arg value="-f"/>
+                <arg value="@{filter}"/>
+                <arg value="-l"/>
+                <arg line="@{output}.log"/>
+                <arg value="-x"/>
+                <arg value="@{input}"/>
+            </preset.exec>
+            <hlm:assertFileExists file="@{output}"/>
+        </sequential>
+    </macrodef>
+
+
+  <!--
+    Electric Cloud emake support.
+    e.g:
+    <pre>
+    <hlm:emakeMacro name="zip-ee" makefile="/foo.mk" log="${build.log.dir}/zip-ee.log" target="zip-all"/>
+    </pre>
+    Optionally to generate emake annotation file use/add attribute annodetail="basic,history,file,waiting".
+  -->
+    <scriptdef name="emakeMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="name"/>
+        <attribute name="log"/>
+        <attribute name="makefile"/>
+        <attribute name="target"/>
+        <attribute name="custom"/>
+        <attribute name="dir"/>
+        <attribute name="annodetail"/>
+        <attribute name="root"/> 
+        <attribute name="failonerror"/> 
+          self.setTaskName("emake");
+          // check attributes
+          if (attributes.get("name") == null)
+            throw new org.apache.tools.ant.BuildException("name attribute is not defined");
+          self.log("Name: " + attributes.get("name"));
+          if (attributes.get("makefile") == null)
+            throw new org.apache.tools.ant.BuildException("makefile attribute is not defined");
+          self.log("Makefile: " + attributes.get("makefile"));
+          String target = "all";
+          String custom = "";
+          if (attributes.get("target") != null)
+            target = attributes.get("target");
+          self.log("Target: " + target);
+          if (attributes.get("custom") != null)
+            custom = attributes.get("custom");
+          if (attributes.get("root") != null)
+            root = attributes.get("root");
+          else
+            root = "";
+          self.log("Custom: " + custom);
+
+      // Create and configure exec target
+          org.apache.tools.ant.taskdefs.ExecTask task = new org.apache.tools.ant.taskdefs.ExecTask();
+          task.setTaskName(self.getTaskName());
+          String emake = com.nokia.ant.util.Helper.getProperty(project, "ec.emake");          
+          task.setExecutable(emake);
+          if (attributes.get("failonerror") != null) {
+            task.setFailonerror(Boolean.parseBoolean(attributes.get("failonerror")));
+          } else {
+            task.setFailonerror(true);
+          }
+          String buildDrive = com.nokia.ant.util.Helper.getProperty(project, "build.drive");              
+          task.setDir(new java.io.File(buildDrive + "/"));
+          if (attributes.get("log") != null) {
+            self.log("Log: " + attributes.get("log"));
+            task.setOutput(new java.io.File(attributes.get("log")));
+          }
+          if (attributes.get("dir") != null) {
+            self.log("dir: " + attributes.get("dir"));
+            task.setDir(new java.io.File(attributes.get("dir")));
+          }
+          String buildId = com.nokia.ant.util.Helper.getProperty(project, "build.id");
+          task.createArg().setValue("--emake-build-label=" + buildId + "-" + attributes.get("name"));
+          String eclass = com.nokia.ant.util.Helper.getProperty(project, "ec.build.class");
+          task.createArg().setValue("--emake-class=" + eclass);
+          String eroot = com.nokia.ant.util.Helper.getProperty(project, "env.EMAKE_ROOT");          
+          String heliumDir = com.nokia.ant.util.Helper.getProperty(project, "helium.dir"); 
+          if (attributes.get("root") != null) {
+            self.log("--emake-root=" + eroot + ";" + heliumDir + ";" + root);
+          }         
+          task.createArg().setValue("--emake-root=" + eroot + ";" + heliumDir + ";" + root);
+          if (attributes.get("annodetail") != null) {
+            task.createArg().setValue("--emake-annodetail=" + attributes.get("annodetail"));            
+            task.createArg().setValue("--emake-annofile=" + com.nokia.ant.util.Helper.getProperty(project, "build.log.dir") + "/" + buildId + "-" + attributes.get("name") + ".anno.xml");
+          }
+          task.createArg().setLine(custom);
+          task.createArg().setLine("-f " + attributes.get("makefile"));
+          task.createArg().setLine(target);
+          // Execute.
+          task.execute();
+    </scriptdef>
+
+  <!-- Macro to build using Raptor.-->
+    <scriptdef name="sbsMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="config"/>
+        <attribute name="layers"/>
+        <attribute name="engine"/>
+        <attribute name="skipbuild"/>
+        <attribute name="singlejob"/>
+        <attribute name="layer-order"/>
+        <attribute name="command"/>
+        <attribute name="components"/>
+<![CDATA[
+import com.nokia.tools.sbs.SBSTool;
+SBSTool sbsTool = new SBSTool();
+sbsTool.execute(attributes,project);
+]]>
+    </scriptdef>
+
+    <scriptdef name="getSBSConfigMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="sbs.sysdef.file"/>
+<![CDATA[
+import com.nokia.config.SAXConfigParser;
+SAXConfigParser configParser = new SAXConfigParser(attributes.get("sbs.sysdef.file"));
+project.setProperty("sbs.configs",configParser.getConfigs());
+]]>
+    </scriptdef>
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/ebs/ebs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ebs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile.ebs" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        EBS compilation targets.
+    </description>
+    <!-- Find a free port to use for EBS client server communication. -->
+    <target name="find-freeport" >
+        <hlm:python outputproperty="ebs.port.number">  
+import ant
+import socket
+mySocket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
+mySocket.bind ( ( '127.0.0.1', 0 ) )
+host, port = mySocket.getsockname() 
+print port
+mySocket.close()
+        </hlm:python>
+        <echo> Using port number ${ebs.port.number}</echo>        
+        <hlm:assertPropertySet property="ebs.port.number" message="Property not defined: ebs.port.number" />                
+    </target> 
+
+    
+    <!-- Executes compilation of a System Definition configuration using Symbian EBS tools. -->
+    <target name="compile-ebs" if="build.system.ebs" depends="set-arm-version">    
+        <hlm:assertFileExists file="${genxml.output.file}"/>
+        <hlm:compileEbsMacro input="${genxml.output.file}" log="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+        <!-- calculate below only if metadata is enabled, error is calculated before the signal is being sent.-->
+        <hlm:calculateErrorsFromLog logfile="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+    </target>
+
+    
+    <!-- Executes compilation of a System Definition configuration using
+    Symbian EBS tools, driven directly from Ant. -->
+    <target name="compile-ebs-ant" if="build.system.ebs-ant" depends="set-arm-version,find-freeport">        
+        <script language="jython" setbeans="false">
+threads = project.getProperty("number.of.threads")
+client_list = ','.join([str(i) for i in range(1, int(threads) + 1)])
+project.setProperty("build.clients", client_list)
+        </script>
+        <hlm:assertPropertySet property="build.clients" message="Property not defined: build.clients" /> 
+        <parallel>
+            <for list="${build.clients}" param="client" parallel="true">
+                <sequential>
+                    <preset.exec executable="perl" dir="${build.drive}/">
+                        <arg value="epoc32/tools/build/buildclient.pl"/>
+                        <arg line="-d localhost:${ebs.port.number} -w 2 -c client_@{client} -e 1 "/>
+                    </preset.exec>
+                </sequential>
+            </for>
+            <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
+                <arg value="epoc32/tools/build/buildserver.pl"/>
+                <arg line="-d ${genxml.output.file} -p ${ebs.port.number} -l ${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+            </preset.exec>
+        </parallel>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/ec/ec.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,331 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ec.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile.ec" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        EC compilation targets.
+    </description>
+
+    <property name="ec.emake" value="emake"/>
+    <property name="ec.makefile.file" location="${build.drive}/Makefile"/>
+
+    <property name="ec.sysdef2make" location="${helium.dir}/tools/compile/ec/sysdef2make.pl"/>
+    
+    <property name="ec.historyfile" value="${build.drive}/emake.data"/>
+    <property name="ec.mem.limit" value="1000000000"/>
+    
+    <!-- This can be used to query cluster manager to find information about the build. Set
+    to default as all the clusture supports default class id.-->
+    <property name="ec.build.class" value="default"/>
+    
+
+    <!-- Converting cononical SDF into a Makefile. -->
+    <target name="compile-genxml-ec" if="build.system.ec-helium">
+        <!-- Using now the official script for GTI. -->
+        <exec executable="perl" dir="${build.drive}/" error="${build.log.dir}/${build.id}.${sysdef.configuration}.sysdef2make.log" failonerror="${failonerror}">
+            <arg line="${ec.sysdef2make} -n ${sysdef.configuration} -s ${env.EPOCROOT} -forcemake ((abld.*\-(w|what|c|check))|(abld.*resource)) ${canonical.sysdef.file}"/>
+        </exec>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}.${sysdef.configuration}.sysdef2make.log"/>
+                <metadatafilterset refid="filterset.genxml.ec" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}.${sysdef.configuration}.sysdef2make.log" />
+    </target>
+
+    <!-- Locate the dependancy files from a previous build so that only those files that have been changed need to be compiled -->
+    <scriptdef name="findHistoryFile" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="history.dir"/>
+        <attribute name="week.number"/>
+        <attribute name="branch.name"/>
+<![CDATA[
+import os
+from build.ec import history
+
+file_name = "-1"
+branch_nm = ""
+hfm = history.HistoryFileManager(attributes.get('history.dir'), attributes.get('week.number'), attributes.get('branch.name'))
+hfm.findHistoryFilePath()
+file_name = hfm.findFile()
+
+if (file_name is not None):
+    file_name = os.path.join(hfm.path, file_name)
+project.setProperty("ec.historyfile.previous", file_name)
+]]>
+    </scriptdef>
+
+
+    <!-- Find the previous history file based on nearest release.
+    week.number and branch.name property needs to be set by the product
+    xml configuration. ec.historyfile.previous holds the matching history file
+    for current builds week.number and branch.name.
+    -->    
+    <target name="find-previous-history-file" if="build.system.ec-helium">
+        <echo message="history.dir:${ec.history.dir}" />
+        <if>
+            <isset property="branch.name" />
+            <then>
+                <var name="ec.branch" value="${branch.name}" />
+            </then>
+            <else>
+                <var name="ec.branch" value="" />
+            </else>
+        </if>
+        <hlm:findHistoryFile history.dir="${ec.history.dir}" week.number="${week.number}" branch.name="${ec.branch}" />
+        <echo message="${week.number}" />
+        <echo message="history.file:${ec.historyfile.previous}" />
+        <if>
+            <not>
+                <equals arg1="${ec.historyfile.previous}" arg2="-1" />
+            </not>
+            <then>
+                <if>
+                    <available file="${ec.historyfile.previous}" />
+                    <then>
+                        <copy file="${ec.historyfile.previous}" tofile="${ec.historyfile}" overwrite="true" failonerror="false" />
+                        <hlm:assertFileExists file="${ec.historyfile}"/>
+                    </then>
+                </if>
+            </then>
+        </if>
+    </target>
+
+    <!-- Find the previous history file based on time stamps. This is used 
+    only when week.number and branch.name not set by product configuration.
+    ec.historyfile.previous holds the history file generated using previous 
+    build.
+    -->    
+    <target name="reuse-previous-ec-history" if="build.system.ec-helium">
+        <if>
+            <available file="${ec.history.dir}" />
+            <then>
+                <timestampselector property="ec.historyfile.previous">
+                    <path>
+                        <fileset dir="${ec.history.dir}">
+                            <include name="*.data"/>
+                        </fileset>
+                    </path>
+                </timestampselector>
+                <if>
+                    <available file="${ec.historyfile.previous}"/>
+                    <then>
+                        <copy file="${ec.historyfile.previous}" tofile="${ec.historyfile}" overwrite="true" failonerror="false" />
+                        <hlm:assertFileExists file="${ec.historyfile}"/>
+                    </then>
+                </if>
+            </then>
+        </if>
+    </target>
+    
+    <!-- EC prequisites before compile. Finds the previous history file either 
+    based on nearest release or timestamp. If there is no previous history file,
+    it switches back to single node. If build has to run in serial mode, then ec.mode
+    needs to be set to serial -->    
+    <target name="precompile-ec" if="build.system.ec-helium">
+        <if>
+            <equals arg1="${ec.mode}" arg2="serial" />
+            <then>
+                <echo message="Single Node Build : Mode Serial" />
+                <var name="ec.maxagents" value="1"/>
+                <var name="ec.history.option" value="create"/>
+            </then>
+            <else>
+                <property name="ec.maxagents" value="0"/>    
+                <property name="ec.history.option" value="merge"/>
+                <if>
+                    <isset property="week.number"/>
+                    <then>
+                        <antcall target="find-previous-history-file"/>
+                        <if>
+                            <not>
+                                <available file="${ec.historyfile}"/>
+                            </not>
+                            <then>
+                                <echo message="Switching to Single Node Build" />
+                                <var name="ec.maxagents" value="1"/>
+                                <var name="ec.history.option" value="create"/>
+                            </then>
+                        </if>
+                    </then>
+                    <else>
+                        <antcall target="reuse-previous-ec-history"/>
+                    </else>
+                </if>
+            </else>
+        </if>
+        <echo message="ec.mode:${ec.mode}" />
+        <echo message="ec.maxagents:${ec.maxagents}"/>
+        <echo message="ec.history.option:${ec.history.option}"/>
+    </target>
+
+    <!--
+    The findUpdateHFPathMacro is used to find the history update dir. 
+    -->
+    <scriptdef name="findUpdateHFPathMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="history.dir"/>
+        <attribute name="week.number"/>
+        <attribute name="branch.name"/>
+        <attribute name="property"/>
+<![CDATA[
+import os
+from build.ec import history
+hfm = history.HistoryFileManager(attributes.get('history.dir'), attributes.get('week.number'), attributes.get('branch.name'))
+file_path = hfm.findActualFilePath()
+project.setProperty(str(attributes.get('property')), str(file_path))
+]]>
+    </scriptdef>
+
+
+    <!-- EC post compile operation copy history file back to network drive -->    
+    <target name="postcompile-ec" if="build.system.ec-helium">
+        <if>
+            <and>
+                <isset property="week.number"/>
+                <available file="${ec.history.dir}"/>
+            </and>
+            <then>
+                <if>
+                    <isset property="branch.name"/>
+                    <then>
+                        <var name="ec.branch" value="${branch.name}"/>
+                    </then>
+                    <else>
+                        <var name="ec.branch" value=""/>
+                    </else>
+                </if>
+                <hlm:findUpdateHFPathMacro history.dir="${ec.history.dir}" week.number="${week.number}" branch.name="${ec.branch}" property="ec.history.update.dir"/>
+                <mkdir dir="${ec.history.update.dir}"/>
+                <if>
+                    <not>
+                        <available file="${ec.history.update.dir}/tmp" type="dir"/>
+                    </not>
+                    <then>
+                        <mkdir dir="${ec.history.update.dir}/tmp"/>
+                        <move file="${ec.history.update.dir}/${week.number}.data" todir="${ec.history.update.dir}/tmp" failonerror="false"/>
+                        <copy file="${ec.historyfile}" tofile="${ec.history.update.dir}/${week.number}.data" overwrite="true" failonerror="false" />
+                        <delete dir="${ec.history.update.dir}/tmp"/>
+                        <hlm:assertFileExists file="${ec.history.update.dir}/${week.number}.data"/>
+                    </then>
+                </if>
+            </then>
+            <else>
+                <if>
+                    <available file="${ec.history.dir}"/>
+                    <then>
+                        <copy file="${ec.historyfile}" tofile="${ec.history.dir}/${build.id}.data" overwrite="true" failonerror="false" />
+                        <hlm:assertFileExists file="${ec.history.dir}/${build.id}.data"/>
+                    </then>
+                </if>
+            </else>
+        </if>
+    </target>
+
+
+    <!-- Required Patches for symbian and java component build, before compiling EC-->    
+    <target name="compile-ec-patch" unless="skip.compile-ec-patch">
+        <echo>Patching....</echo>
+        <for list="\epoc32\tools\abld.pl,\src\cedar\generic\tools\e32toolp\bldmake\abld.pl"
+                param="file" trim="true">
+            <sequential>
+                <echo>Patching @{file}</echo>
+                <if>
+                    <available file="${build.drive}/@{file}"/>
+                    <then>
+                        <move file="${build.drive}\@{file}.ec_orig" tofile="${build.drive}\@{file}" overwrite="true" failonerror="false"/>
+                        <move file="${build.drive}\@{file}" tofile="${build.drive}\@{file}.ec_orig"/>
+                        <!-- perl -Wpe "s/\"make/\"\$ENV\{MAKE\}/" -->
+                        <exec executable="perl" dir="${build.drive}/" input="${build.drive}\@{file}.ec_orig"
+                                                output="${build.drive}\@{file}" failonerror="${failonerror}">
+                            <arg value="-Wpe"/>                         
+                            <arg value="s/\&quot;make/\&quot;\$ENV\{MAKE\}/"/>
+                        </exec>
+                    </then>
+                </if>
+            </sequential>
+        </for>
+    </target>
+
+    <!-- Unpatch symbian tool and java tool after compiling using EC-->    
+    <target name="compile-ec-unpatch" unless="skip.compile-ec-patch">
+        <echo>Rollback patches....</echo>
+        <move file="${build.drive}\epoc32\tools\abld.pl.ec_orig" tofile="${build.drive}\epoc32\tools\abld.pl" overwrite="true"/>
+    </target>
+
+    <!-- EC logs compatible to EBS. Still some of the EC errors are not compatible to 
+    EBS. 
+    1. If the component path in the sysdef is not valid, then in EBS the component is 
+    removed. In case of EC, the component is still built and there will be an error Make
+    No rule to make such directory.
+    2. If there is any error in building the component, the return value is compared in EBS
+    build and transfered to proper error message. The error will be there in EC, but it is not
+    transfered to proper error message. -->
+    <target name="compile-ec-logs">
+        <echo>Cleaning up the logs....</echo>
+        <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+            <arg line="${helium.dir}/tools/compile/ec/ec_whatcheck.pl"/>
+            <redirector input="${build.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"
+                output="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+        </exec>
+    </target>
+
+
+    <!-- Build the component using EC. This is the only target for EC builds.
+    It patches the necessary tools for EC builds, and call the emake with 
+    necessary arguments.-->
+    <target name="compile-ec-helium" if="build.system.ec-helium" depends="set-arm-version" >
+        <mkdir dir="${build.output.dir}/ec/history"/>
+        <antcall target="compile-ec-patch"/>
+        <if>
+            <isset property="env.EMAKE_DEBUG"/>
+            <then>
+                <var name="emake_debug_flag" value="${env.EMAKE_DEBUG}"/>
+            </then>
+            <else>
+                <property name="emake_debug_flag" value="g"/>
+            </else>
+        </if>
+        
+        <echo>emake debug flag: ${emake_debug_flag}</echo>
+
+        <echo>Building ${sysdef.configuration}....</echo>
+        <echo file="${build.log.dir}/${build.id}.${sysdef.configuration}_run_emake.bat" level="info">
+set
+${ec.emake} --emake-build-label=${build.id}.${sysdef.configuration} --emake-class=${ec.build.class} --emake-priority=normal --emake-maxagents=${ec.maxagents} --emake-job-limit=0 --emake-mem-limit=${ec.mem.limit} --emake-history=${ec.history.option} --emake-annodetail=basic,history,file,waiting --emake-annofile=${build.log.dir}\${build.id}.${sysdef.configuration}.emake.anno.xml --emake-historyfile=${ec.historyfile} --emake-debug=${emake_debug_flag} --emake-logfile=${build.log.dir}\${build.id}.${sysdef.configuration}.emake.g.dlog --emake-root=%EMAKE_ROOT%;${helium.dir} --emake-autodepend=1 -k -i -f ${build.drive}/${sysdef.configuration}.make LOGBUILDTIME=&quot;&quot; VERBOSE=&quot;&quot; SAVESPACE=&quot;&quot; ${sysdef.configuration}
+        </echo>
+
+        <exec executable="${build.log.dir}/${build.id}.${sysdef.configuration}_run_emake.bat"
+              dir="${build.drive}/" output="${build.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"
+              failonerror="${failonerror}">
+            <env key="SYMBIANBUILD_DEPENDENCYOFF" value="1" />
+        </exec>
+        
+        <antcall target="compile-ec-unpatch"/>
+        <antcall target="compile-ec-logs"/>
+
+        <!-- Testing everything happens correctly. -->
+        <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_run_emake.bat"/>
+        <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"/>
+        <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+        <hlm:calculateErrorsFromLog logfile="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/ec/ec_functions.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+# Some makefile helper functionality to simplify SDF to Makefile conversion.  
+#
+
+# Special reserved character (ASCII 31)
+ichar := 
+comma := ,
+exclamation := !
+empty :=
+space := $(empty) $(empty)
+squot := '\''
+
+getwords     = $(subst |, ,$(subst \|,$(ichar):,$(subst $(space),$(ichar)_,$1)))
+restoreelem  = $(strip $(subst $(ichar):,\|,$(subst $(ichar)_, ,$1)))
+getelem      = $(call restoreelem,$(word $1,$(call getwords,$2)))
+true         = $(if $(filter-out 0,$(subst 0,0 ,$1)),1)
+false        = $(if $(call true,$1),,1)
+not          = $(if $1,,$1)
+iif          = $(if $(call true,$1),$2,$3)
+equal        = $(if $(strip $(subst $(strip $1),,$2)$(subst $(strip $2),,$1)),,1)
+
+# helpers
+get_unit_name=$(call getelem,1,$(UNIT_$1))
+get_unit_path=$(call getelem,2,$(UNIT_$1))
+get_unit_filters=$(call getelem,3,$(UNIT_$1))
+
+
+# unit filtering
+is-negate-filter=$(if $(call equal,$1,$(subst $(exclamation),,$1)),,1)
+hasword=$(call equal,$1,$(filter $1,$2))
+hasnotword=$(if $(call hasword,$1,$2),,1)
+filter-in-unit=$(if $(strip $(foreach filter,$(call get_unit_filters,$1),$(if $(call is-negate-filter,$(filter)),$(call hasword,$(subst !,,$(filter)),$(FILTERS)),$(call hasnotword,$(filter),$(FILTERS))))),,1)
+filter-unitlist=$(foreach unit,$1,$(if $(call filter-in-unit,$(unit)),$(unit)))
+
+# helper to execute sequentially the targets rather than in parallel
+define serialize
+-@$(MAKE) -k $1
+
+endef
+
+# debug functionnality
+define echo-string
+@echo $1
+
+endef
+
+define show-filter-unitlist
+$(foreach unit,$1,$(call echo-string,$(call get_unit_name,$(unit)): $(call get_unit_filters,$(unit)): $(if $(call filter-in-unit,$(unit)),IN,OUT)))
+endef
+
+
+MAKEFILE_CMD_LINE:=$(foreach makefile,$(MAKEFILE_LIST), -f $(makefile))
+
+%/abld.bat : %/bld.inf
+	@echo === automatic == $*
+	@echo -- bldmake_bldfiles-v-k
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo Error 42 abld command issued when bldmake was not done first
+	@echo Error 42 This is a serious error in your build configuration and must be fixed.
+	@echo Error 42 In this build the error has been fixed automatically.
+	cd $* && bldmake bldfiles -v -k
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/ec/ec_whatcheck.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,143 @@
+#!perl -w
+#============================================================================ 
+#Name        : ec_whatcheck.pl 
+#Part of     : Helium 
+#
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+# 
+#==============================================================================
+
+#
+# ==============================================================================
+#  %name:          ec_whatcheck.pl %
+#  Part of:        EC Tools
+#
+#  %derived_by:    tuokinnu %
+#  %version:       ou1tools#6 %
+#  %date_modified: Thu Jan 08 16:58:24 2009 %
+#
+#  See POD text at the end of this file for usage details.
+# ==============================================================================
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+
+my $help = 0;
+my $man  = 0;
+GetOptions('man'    => \$man,
+           'help|?' => \$help)
+  or pod2usage(2);
+pod2usage(1) if $help;
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+my $in_check = 0;
+my $in_what  = 0;
+$| = 1;
+
+my %relcheck;
+while (<>)
+{
+    unless ($in_check || $in_what)
+    {
+        # remove The process tried to write to a nonexistent pipe. errors from the logs.
+        print "WARNING: " and print and next if /^(The process tried to write to a nonexistent pipe.)/;
+        # mark stalled jobs to errors e.g.: Command "cmd.exe /c call setup.pl" was not making progress so it was automatically aborted.
+        print "ERROR: " and print and next if /^(Command )/;
+        # mark error messages to the faulty make files
+        print "WARNING: " and print and next if /warning: overriding commands for target/;
+        print and next if (/^\*\*\*/);
+        print;
+
+        $in_check = /^-- (call )?abld(\.bat)? / && / -c(heck)? /;
+        $in_what  = /^-- (call )?abld(\.bat)? / && / -w(hat)? /;
+    }
+    else
+    {
+        if (/^\+\+ Finished/ || /^Options\s\(case-insensitive\)\s:/)
+        {
+            %relcheck = ();
+            $in_check = $in_what = 0;
+            redo;
+        }
+        # remove The process tried to write to a nonexistent pipe. errors from the logs.
+        print "WARNING: " and print and next if /^(The process tried to write to a nonexistent pipe.)/;
+        #next if /^(The process tried to write to a nonexistent pipe.)/;
+        # don't split make messages.
+        print and next if /^(make\[)/;
+        # transform current output to match symbian logs.
+        print "Chdir $1\n$_\n" and next if /^cd\s+(.+)&&\s+/;
+        print and next if /^(--|\+\+|Chdir|This project does not support|cd\s+)/;
+
+		# ignore current missing if they are make messages
+        print "$1\n" and next if /^MISSING:\s*([make].*)/;
+        # ignore current missing if they are not path
+        print "MISSING: $1\n" and next if /^MISSING:\s*([^\s\\].*)/;
+        print and next if /^(\\\+\+)/;
+        print and next if (/^\*\*\*/);
+        # don't split missing commands
+        print and next if /is not recognized as an internal or external command/;
+        print and next if /operable program or batch file./;
+        # don't split warning messages.
+        print "WARNING: " and print and next if /warning: overriding commands for target/;
+        print and next if /warning: ignoring old commands for target/; 
+        # pull apart by quoted strings or whole words, WS separated
+        while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go)
+        {
+            my $releasable = ($2 ? $2 : $3);
+            next if $relcheck{$releasable} || $releasable eq "MISSING:";
+            $relcheck{$releasable} = 1;
+            print("MISSING: $releasable\n") if $in_check && !-e $releasable;
+            print("$releasable\n") if $in_what;
+        }
+    }
+}
+
+__END__
+
+=head1 NAME
+
+ec_whatcheck - Reformat Electric Cloud output for "what" and "check" build phases
+
+=head1 SYNOPSIS
+
+perl ec_whatcheck.pl [-h] < <stdout log>
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exits.
+
+=item B<-man>
+
+Prints the manual page and exits.
+
+=back
+
+=head1 DESCRIPTION
+
+Parse the output and reformat it according to rules lifted from the
+Symbian build scripts.  If the output is from a "check" phase, check
+for the existence of the file and print "MISSING: <file>" just as the
+standard EBS output does.
+
+=head1 SEE ALSO
+
+L<xml2mak|scripts::xml2mak>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/ec/sysdef2make.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1195 @@
+# This file is part of Nokia EC Tools release
+#
+#============================================================================ 
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+# 
+#==============================================================================
+
+my $version=35;
+
+# 35 2008-09-26 jaakpaak:ou1tools#2679 Changed copyright symbol. Two days to go and I'm off to Atomia. Have fun.
+# 34 2008-09-23 jaakpaak:ou1tools#2677 Added command line options to revert to "make" instead of anything else for selected commands
+# 33 2008-09-19 jaakpaak:ou1tools#2673 Added copyright notice
+# 32 2008-09-11 jaakpaak:ou1tools#2661 Changed abld what and abld check targets to always use "make" in MAKE variable
+# 31 2008-09-03 jaakpaak:ou1tools#2627 Added creation of *-other-files.txt and *-other.zip
+# 30 2008-08-05 jaakpaak:ou1tools#2610 Add quoting of direct to file operator >
+# 29 2008-07-17 jaakpaak:ou1tools#2611 Get rid of symbian tool chain patching for emake
+# 28 2008-07-07 jaakpaak:ou1tools#2607 sysdef2make.pl to generate correct makefile independent of the location where the script is located
+# 27 2008-07-01 jaakpaak:ou1tools#2604 -n configuration option to sysdef2make to make it generate only configuration specific makefile
+# 26 2008-05-23 jaakpaak:ou1tools#2566 Improve output warnings and errors to be symbian compatible
+# 25 2008-03-26 jaakpaak:ou1tools#2531 Fix the output for log processor to be more compatible with EBS, increased quoting for special characters
+# 24 2008-03-13 jaakpaak:ou1tools#2522 Fix for last special instruction missing
+# 23 2008-03-07 jaakpaak:ou1tools#2516 Fix for buildLayer instructions which are executed twice
+# 22 2008-03-03 jaakpaak:ou1tools#2511 Targets for creating zip files from your workarea
+# 21 2008-02-29 jaakpaak:ou1tools#2510 Do not overwrite configuration-task targets targets with layer-task targets, printing of filters
+# 20 2008-02-28 jaakpaak:ou1tools#2495 Fix for specialInstruction dependencies and build time loggin dependencies
+# 19 2007-12-20 jaakpaak:ou1tools#2440 Fix for unitlists containing white spaces
+# 18 2007-12-17 jaakpaak:ou1tools#2432 Restructured variables, quoted echoing of command line
+# 17 2007-11-29 jaakpaak:ou1tools#2427 Fix to layer names containing white spaces, prefix also to specialInstructions
+# 16 2007-11-15 jaakpaak:ou1tools#2420 Fixed issue with multiple filters and empty unit lists
+# 15 2007-11-15 jaakpaak:ou1tools#2408 Added configuration-UNITS variable and optionless generic component rules
+# 14 2007-11-12 jaakpaak:ou1tools#2407 Added warning to layers not having any units
+# 13 2007-11-09 jaakpaak:ou1tools#2405 Fix to layers
+# 12 2007-10-31 jaakpaak:ou1tools#2402 Added -s option for path prefix and priorities
+# 11 2007-10-18 jaakpaak:ou1tools#2356 Fixed problems with filters and buildtime logging
+# 10 2007-10-18 jaakpaak:ou1tools#2356 Fixed dependency problems on EC, made everyting unit based (previously bld.inf based)
+# 09 2007-09-07 jaakpaak:ou1tools#2351 Added build time logging
+# 08 2007-09-01 jaakpaak:ou1tools#2340 Added error ignoring for selected commands and -v option
+# 07 2007-08-23 jaakpaak:ou1tools#2320 Submaked execution
+# 06 2007-08-15 jaakpaak:ou1tools#2311 Removed printing of empty unit lists, timestamp as perl script, makefiled unitlist/layernames
+# 05 2007-08-08 jaakpaak:ou1tools#2291 Added -filter option for user defined filters
+# 04 2007-08-07 jaakpaak:ou1tools#2290 Added tags for scanlog to specialInstructions also
+# 03 2007-07-04 jaakpaak:ou1tools#2275 htmlscanlog compatibility fixes
+# 02 2007-07-03 jaakpaak:ou1tools#2274 fixed specialInstructions handling
+# 01 2007-06-29 jaakpaak:ou1tools#2273 abldOption also valid for bldmake commands
+
+my $scriptDir=$0;
+# Strip the file from the path
+$scriptDir =~ s{[^\\\/]*$}{};
+
+use lib "$ENV{EPOCROOT}epoc32/tools/build/lib";
+use XML::DOM;
+
+my @userFilters = ();
+my @forceMakeCommands = ("abld.*\-(w|what|c|check)[^a-zA-Z0-9]");
+my $file = "";
+my $pathPrefix = "";
+
+my @userConfigurations = ();
+my @configurations = ();
+my $makefileName = "makefile";
+my $makefileOption = "";
+my $i=0;
+
+while ( $i < scalar (@ARGV) ) {
+	if ( $ARGV[$i] eq "-filter" ) {
+		push( @userFilters, $ARGV[$i+1] );
+		$i += 2;
+	} elsif ( $ARGV[$i] eq "-forcemake" ) {
+		push( @forceMakeCommands, $ARGV[$i+1] );
+		$i += 2;
+	} elsif ( $ARGV[$i] eq "-s" ) {
+		$pathPrefix = $ARGV[$i+1];
+		$i += 2;
+	} elsif ( $ARGV[$i] eq "-n" ) {
+		push( @configurations, $ARGV[$i+1] );
+		$i += 2;
+	} else {
+		$file = $ARGV[$i];
+		$i++;
+	}
+}
+my $otherCommandLineOptions;
+
+my $i=1;
+while ( $i < scalar(@forceMakeCommands) ) {
+    $otherCommandLineOptions.="-forcemake \"".quoteCommandForEcho($forceMakeCommands[$i])."\" ";
+    $i++;
+}
+
+
+if ( @configurations ) {
+    push(@userConfigurations,@configurations);
+    $makefileName = join("_",@configurations).".make";
+} 
+open(MAKEFILE,"> $makefileName");
+
+
+my $parser = XML::DOM::Parser->new();
+
+my $doc = $parser->parsefile($file);
+
+
+# Commands which' errors will be ignored 
+my %ignoreErrorCommands = ( "mkdir" => 1,
+                            "md" => 1,
+                            "del" => 1,
+                            "rmdir" => 1,
+                            "echo" => 1,
+                            "rem" => 1,
+                            "xcopy" => 1,
+                            "dir" => 1 );
+                            
+# Hash containing unitID's and bldFiles.
+# Keys are unitID's
+my %bldFiles;
+
+# Hash containing the units of each layer and unitlist
+# Key is the name of list, value is a list of unitId.s
+# The bldFile has to be obtained from unitIDs
+my %units;
+
+# Hash containing the actual abldTarget's of the command line. 
+# The key is the name of the target in System Definition xml
+my %targets;
+
+# Hash containing arrays of the real abldTarget's 
+# Key is the name defined in targetList in system definition xml
+my %targetLists;
+
+# Hash containing the default unitlists of each configuration
+# Key is the name of the configuration
+my %unitLists;
+
+# Hash containing contents of each specialInstruction
+# Key is the makefile target name of each specialInstruction
+# Value is the command line including cd part
+my %specialInstructions;
+
+# The bldfiles which are excluded from each configuration
+my %excludedUnits;
+
+# Hash containing the makefile targets for each task
+# Key is the task as a makefile target and values is a hash of buildlayer task
+my %buildLayerTasks;
+
+
+# So you cannot execute _any_ buildLayer command for _any_ unitList or layer
+# The combination must exist also in system definition xml
+
+# $unitId -> filterhash
+my %unitFilters;
+
+# List of all filters set in units
+my %filters;
+
+# Priorities of each unit
+# unitId -> priority
+my %unitPriorities;
+
+# Configuration makefile rules
+my %configurationTasks = ();
+
+my %optionNames;
+my %options;
+
+# Set verbose option on manually
+push( @{$options{abldOption}},"VERBOSE");
+push( @{$options{bldmakeOption}},"VERBOSE");
+$optionNames{"VERBOSE"} = "-v";
+
+# Loop through all the layers
+foreach my $layer ( $doc->getElementsByTagName('layer') ) {
+    my $layerName = $layer->getAttribute('name');
+
+    # Loop through all the units in the layer
+    foreach my $unit ( $layer->getElementsByTagName('unit') ) {
+        my $unitID = $unit->getAttribute('unitID');
+        my $bldFile = $unit->getAttribute('bldFile');
+        my $priority = $unit->getAttribute('priority');
+
+        # Set the filter status
+        $unitFilters{$unitID} = $unit->getAttribute('filter');
+
+        # Set filters to global hash
+        foreach my $word ( split(/,/,$unitFilters{$unitID}) ) {
+            $word =~ s{^!}{};
+            $filters{$word} = 1;
+        }
+        
+        if ( $pathPrefix &&
+             $bldFile !~ m{^\Q$pathPrefix\E}i ) {
+            $bldFile = $pathPrefix.$bldFile;
+        }
+        # Set bldFile to the unitID
+        $bldFiles{$unitID} = $bldFile ;
+
+        # Set the default priority
+        if ( ! $priority ) {
+            $priority = 1000;
+        }
+        
+        $unitPriorities{$unitID} = $priority;
+        
+        # Set the bldfile to the unitlist
+        my $i = scalar(@{$units{$layerName}});
+        while ( $i > 0 ) {
+            my $prevUnit = $units{$layerName}[$i-1];
+                
+            if ( $unitPriorities{$prevUnit} <= $unitPriorities{$unitID}  ) {
+                last;
+            } else {
+                $i--;
+            }           
+        }
+        # Insert init to slot $i
+        splice( @{$units{$layerName}},$i,0,$unitID);
+    }
+}
+
+# Loop through all unitLists
+foreach my $unitList ( $doc->getElementsByTagName('unitList') ) {
+	my $unitListName = $unitList->getAttribute('name');
+
+	# Loop through all unitRefs inside the unitLiss
+	foreach my $unitRef ( $unitList->getElementsByTagName('unitRef') ) {
+		my $unitID = $unitRef->getAttribute('unit');
+
+		# Set the bldfile to the unitlist
+		if ( $bldFiles{$unitID} ) {
+			
+			my $i = scalar(@{$units{$unitListName}});
+			while ( $i > 0 ) {
+				my $prevUnit = $units{$unitListName}[$i-1];
+				
+				if ( $unitPriorities{$prevUnit} <= $unitPriorities{$unitID}  ) {
+					last;
+				} else {
+					$i--;
+				}			
+			}
+            # Insert init to slot $i
+			splice( @{$units{$unitListName}},$i,0,$unitID);
+		} else {
+			print(STDERR "ERROR: unitList by the name \"".$unitListName."\" has unitRef to \"".$unitID."\" which is not defined.\n");
+		}
+	}
+}
+
+# Get targets from the whole SystemDefinition.xml
+foreach my $target ( $doc->getElementsByTagName('target') ) {
+	my $targetName = $target->getAttribute('name');
+	my $abldTarget = $target->getAttribute('abldTarget');
+
+	$targets{$targetName} = $abldTarget;
+}
+
+
+# Get targetLists
+foreach my $targetList ( $doc->getElementsByTagName('targetList') ) {
+	my $name = $targetList->getAttribute('name');
+	my $targetString = $targetList->getAttribute('target');
+
+	foreach my $target ( split( /\s+/, $targetString ) ) {
+		push( @{$targetLists{$name}}, $targets{$target} )
+	}
+}
+
+# Get options
+foreach my $option ( $doc->getElementsByTagName('option') ) 
+# Loop through all option elements
+{
+	my $attributes = $option->getAttributes();
+	my $i = 0;
+
+	my %attributeHash;
+	
+	while ( $i < $attributes->getLength() ) 
+	# go through all attributes
+	{
+		my $item = $attributes->item($i);
+		# Get name and value for each item in option attributes
+		my $name = $item->getName();
+		my $value = $item->getValue();
+		
+		# Insert attribute value into hash by key as name
+		$attributeHash{$name} = $value;
+		$i++;
+	}
+
+	foreach my $key ( keys(%attributeHash) ) 
+	# Go through generated attribute hash
+	{
+		if ( $key =~ m{.*Option} && $attributeHash{'enable'} =~ m{y}i ) 
+		# Attribute key is somethingOption and it is enabled
+		{
+			# Set options hash
+			$optionNames{$attributeHash{"name"}} = $attributeHash{$key};
+			
+			push( @{$options{$key}}, $attributeHash{"name"} );
+
+			# abldOptions become bldmakeOptions
+			# bldMake only supports -keepgoing and -verbose options
+			if ( $key eq "abldOption" && 
+				 ( $attributeHash{$key} =~ /^\s*-k/i ||
+				   $attributeHash{$key} =~ /^\s*-v/i )) {
+				push( @{$options{bldmakeOption}}, $attributeHash{"name"} );
+			}
+		}
+	}
+}
+
+
+my @xmlConfigurations = ();
+# This loop digs out unitlists, layers and tasks from each configuration
+foreach my $xmlConfiguration ( $doc->getElementsByTagName('configuration') ) {
+    my $configurationName = $xmlConfiguration->getAttribute('name');
+
+    # Store all configurations to a list
+    push( @xmlConfigurations, $configurationName );
+
+    # Check we are not using configuration name which overlaps with unit list name
+    foreach my $layer ( keys(%units)) {
+        if ( lc($layer) eq lc($configurationName) ) {
+            print(STDERR "ERROR: Configuration \"$configurationName\" is defined also as unitList/layer \"$layer\". Names MUST BE UNIQUE!\n");
+            last;
+        }
+    }
+    my $taskId=1;
+
+    # Get the filters of the configuration
+    my @configurationFilters = split( /,/, $xmlConfiguration->getAttribute('filter') );
+
+    # Add user specified filters to current configuration
+    push( @configurationFilters, @userFilters );
+
+    # Get the first child of the configuration
+    my $xmlElement = $xmlConfiguration->getFirstChild();
+
+    # This variable keeps track when specialInstruction changes 
+    # by storing the name of the current specialInstruction
+    my %currentSpecialInstruction=();
+
+    do { 
+        my $tagName = $xmlElement->getNodeName();
+
+        # Both unitListRef and layerRef end up to same place; unitLists hash
+        # From makefile point of view they have no difference what so ever
+        if ( $tagName eq "unitListRef" || 
+            $tagName eq "layerRef" ) {
+            my $unitList;
+
+            if ( $tagName eq "unitListRef" ) {
+                $unitList = $xmlElement->getAttribute('unitList'); 
+            } else {
+                $unitList = $xmlElement->getAttribute('layerName');
+            }
+
+            if ( scalar(@{$units{$unitList}}) == 0 ) {
+                print(STDERR "WARNING: unit list \"$unitList\" included to configuration \"$configurationName\" has no units.\n");
+            } else {
+                # Go through bldfiles and check their filters
+                foreach my $unit ( @{$units{$unitList}} ) {
+                    my $i = 0;
+                    my $exclude = check_filter( $unitFilters{$unit}, \@configurationFilters);
+                    
+                       
+                    if ( $exclude )
+                    # If there was an exclusion filter, exclude
+                    # If bldfile had filters set but include filter was not among them, exclude
+                    {
+                        push( @{$excludedUnits{$configurationName}}, $unit );
+                    }
+                }
+            }
+            # Add the new unitlist to current configuration
+            push( @{$unitLists{$configurationName}}, $unitList );
+        }
+
+        if ( $tagName eq "task" ) {
+            # The unitlists applied for the current task
+            my @taskUnitLists=();
+
+            # First get possible task specific unitListRefs
+            foreach my $xmlUnitListRef ( $xmlElement->getElementsByTagName('unitListRef') ) {
+                push( @taskUnitLists, $xmlUnitListRef->getAttribute('unitList') );
+            }
+
+            my $xmlTask = $xmlElement->getFirstChild();
+            do {
+                my $taskType = $xmlTask->getNodeName();
+
+                # For specialInstructions we only need the name
+                # This is because the content in specialInstructions is determined later
+                if ( $taskType eq "specialInstructions" ) {
+                    my $name = $xmlTask->getAttribute('name');
+
+                    if ( $name ne $currentSpecialInstruction{specialInstruction} ) 
+                    # The specialInstruction has just changed
+                    {
+                        if ( $currentSpecialInstruction{specialInstruction} ) 
+                        # but it's not the first one
+                        {
+                            # Store the previous special instruction
+                            my %configurationTask = %currentSpecialInstruction;
+                            push( @{$configurationTasks{$configurationName}}, \%configurationTask );
+
+                            # And clear up for next one
+                            %currentSpecialInstruction = ();
+                        }
+                        $currentSpecialInstruction{specialInstruction} = $name;
+                        $currentSpecialInstruction{taskId} = $taskId++;
+                    } 
+                     
+                    my $cwd = $xmlTask->getAttribute('cwd');
+                    my $command = quoteCommand($xmlTask->getAttribute('command'));
+
+                    if ( $cwd ne "." ) {
+                        $command = "cd ".$cwd." && ".$command." ";
+                    }
+
+                    if ( $ignoreErrorCommands{getExecutable($command)} ) 
+                    # Command is listed as "ignore error" command
+                    {
+                        $command = "-".$command;
+                    } 
+                    push( @{$currentSpecialInstruction{commands}}, $command );
+                } 
+
+                if ( $taskType eq "buildLayer" ) {
+                    if ( $currentSpecialInstruction{specialInstruction} ) 
+                    # Last task was a specialInstruction
+                    {
+                        # Store the previous special instruction
+                        my %configurationTask = %currentSpecialInstruction;
+                        push( @{$configurationTasks{$configurationName}}, \%configurationTask );
+                    }
+                    # And clear up for next one
+                    %currentSpecialInstruction = ();
+
+                    # Set command and targets
+                    my $targetList = $xmlTask->getAttribute('targetList');
+                    my @targets = @{$targetLists{$targetList}};
+                    my $command = $xmlTask->getAttribute('command');
+                    my $executable = getExecutable($command);
+
+                    my $option;
+                    # abldOption specified, append makefile variable to command
+                    # you can screw up what check and export by defining wrong options
+
+                    # We are ignoring the fact that abld export doesnt work with all possible
+                    # options. 
+                    # It is more important to relay the -keepgoing to abld export
+                    # than try to protect the environment from user who uses abldOption wrong
+                    if ( @{$options{$executable.'Option'}} &&
+                         $command !~ m{abld.*\-(w|what|c|check)\s}i ) {
+                        $option =" \$(".$executable."Option)";
+                    }
+
+                    if ( ! @targets ) {
+                        my %configurationTask;
+                        $configurationTask{executable} = $executable;
+                        $configurationTask{command} = quoteCommand($command);
+                        $configurationTask{option} = $option;
+
+                        if ( @taskUnitLists ) {
+                            $configurationTask{unitLists} = \@taskUnitLists;
+                        } else {
+                            if ( ! @{$unitLists{$configurationName}} ) {
+                                print(STDERR "Warning: buildLayer task \"".$command."\" in configuration \"".$configurationName."\" does not contain any units.\n");
+                            }
+                        }
+                        $configurationTask{taskId} = $taskId++;
+
+                        push( @{$configurationTasks{$configurationName}},\%configurationTask );
+
+                    } else {
+                        foreach my $target ( @targets ) {
+                            my %configurationTask;
+
+                            # Append the target to the command
+                            $configurationTask{executable} = $executable;
+                            $configurationTask{command} = quoteCommand($command);
+                            $configurationTask{option} = $option;
+                            $configurationTask{target} = $target;
+
+                            if ( @taskUnitLists ) {
+                                $configurationTask{unitLists} = \@taskUnitLists;
+                            } elsif ( ! @{$unitLists{$configurationName}} ) {
+                                print(STDERR "Warning: buildLayer task \"".$command."\" in configuration \"".$configurationName."\" does not contain any units.\n");
+                            }
+                            $configurationTask{taskId} = $taskId++;
+
+                            push( @{$configurationTasks{$configurationName}},\%configurationTask );
+                        }
+                    }
+                }
+            } while ( $xmlTask = $xmlTask->getNextSibling() ) ;
+        }
+    } while ( $xmlElement = $xmlElement->getNextSibling() ) ;
+
+    if ( $currentSpecialInstruction{specialInstruction} ) 
+    # Last task was a specialInstruction
+    {
+        # Store the previous special instruction
+        my %configurationTask = %currentSpecialInstruction;
+        push( @{$configurationTasks{$configurationName}}, \%configurationTask );
+    }
+    # And clear up for next one
+    %currentSpecialInstruction = ();
+}
+
+
+# If no configuration specified on command line, use all configurations collected from xml
+if ( ! @configurations ) {
+    push(@configurations,@xmlConfigurations);
+}
+
+# Print help
+
+print(MAKEFILE "\# Set the script directory\n");
+print(MAKEFILE "\# The directory is trailed with a space to\n");
+print(MAKEFILE "\# prevent continuing line side effects of trailing backslash\n");
+print(MAKEFILE "\# We need strip to remove the trailing space.\n");
+print(MAKEFILE "SCRIPTDIR:=$scriptDir \n\n");
+print(MAKEFILE "SCRIPTDIR:=\$(strip \$(SCRIPTDIR))\n\n");
+print(MAKEFILE "# Export MAKE variable in order to abld.pl to see it\n");
+print(MAKEFILE "export MAKE\n\n");
+
+print(MAKEFILE "SYSTEMDEFINITIONXML:=".$file."\n\n");
+
+if ( @userFilters ) {
+    print(MAKEFILE "FILTERS:=".join(" ",@userFilters)."\n\n");
+}
+
+if ( @userConfigurations )
+# User configuration was set on command line
+{
+    print(MAKEFILE "CONFIGURATION=$userConfigurations[0]\n\n");
+    print(MAKEFILE "export CONFIGURATION\n\n");
+    # Set the configuration as default target
+    print(MAKEFILE "\$(CONFIGURATION):\n\n");
+}
+
+# Print out options
+print(MAKEFILE "# Option names\n");
+
+foreach my $optionName ( keys(%optionNames) ) {
+	print(MAKEFILE "$optionName := ".$optionNames{$optionName}." \n");
+}
+print(MAKEFILE "\n");
+
+print(MAKEFILE "# command options\n");
+foreach my $cmdOption ( keys(%options)) {
+	print(MAKEFILE $cmdOption." := ");
+	foreach my $optionName ( @{$options{$cmdOption}} ) {
+		print(MAKEFILE "\$\($optionName\) ");
+	}
+	print(MAKEFILE "\n");
+}
+print(MAKEFILE "\n");
+
+if ( $makefileName ne "makefile" ) {
+    print(MAKEFILE "CURRENT_MAKEFILE:=$makefileName\n");
+}
+
+if ( $otherCommandLineOptions ) {
+    print(MAKEFILE "SYSDEF2MAKEFLAGS:=$otherCommandLineOptions\n\n");
+}
+
+print(MAKEFILE ".PHONY : help\n");
+print(MAKEFILE "help:\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo This is a makefile \$(CURRENT_MAKEFILE) created by sysdef2make.pl version $version with command line:\n");
+print(MAKEFILE "\t\@echo  perl \$(SCRIPTDIR)sysdef2make.pl \$(addprefix -filter ,\$(FILTERS)) \$(addprefix -n ,\$(CONFIGURATION)) \$(SYSDEF2MAKEFLAGS) \$(SYSTEMDEFINITIONXML)\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+if ( scalar(@userFilters) ) {
+	print(MAKEFILE "\t\@echo User defined filters added to all configurations: ".join(" ",@userFilters)."\n\n");
+}
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo To start up (hopefully) helpful web page, type:\n");
+print(MAKEFILE "\t\@echo  make \$(addprefix -f ,\$(CURRENT_MAKEFILE)) nethelp\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo To get a list of all the buildable configurations:\n");
+print(MAKEFILE "\t\@echo  make \$(addprefix -f ,\$(CURRENT_MAKEFILE)) configurations\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo To get a list of all the executable special instructions:\n");
+print(MAKEFILE "\t\@echo  make \$(addprefix -f ,\$(CURRENT_MAKEFILE)) specialInstructions\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo Any of the previous configurations or specialInstructions\n");
+print(MAKEFILE "\t\@echo can be executed as they are by adding the name after make.\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo To get a list of tasks executable for any component\n");
+print(MAKEFILE "\t\@echo  make \$(addprefix -f ,\$(CURRENT_MAKEFILE)) tasks\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo Components and tasks are combined with\n");
+print(MAKEFILE "\t\@echo  make \$(addprefix -f ,\$(CURRENT_MAKEFILE)) \[component\]-\[task\]\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo For instance:\n");
+print(MAKEFILE "\t\@echo  make s60\\yourcomponent\\group-task\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo Any amount of configurations, special instructions and\n");
+print(MAKEFILE "\t\@echo component-task combinations can be combined on one command line.\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo Instead of make you can use any gnu make compatible framework like emake.\n");
+print(MAKEFILE "\t\@cmd /c echo.\n");
+print(MAKEFILE "\t\@echo To get more information about the gnu make options google \"gnu make manual\"\n");
+print(MAKEFILE "\t\@echo or type \"make --help\"\n\n");
+
+print(MAKEFILE ".PHONY : nethelp\n\n");
+print(MAKEFILE "nethelp : \n");
+print(MAKEFILE "\tcmd /c \"start http://s60wiki/S60Wiki/Sysdef2make\"\n\n");
+
+print(MAKEFILE "# Printing out messsages\n");
+print(MAKEFILE ".PHONY : \%-print\n\n");
+print(MAKEFILE "\%-print : \n\t\@echo \$\*\n\n");
+
+print(MAKEFILE "\n");
+print(MAKEFILE "\%.html : \%.log\n");
+print(MAKEFILE "\t\@-del \$\@\n");
+print(MAKEFILE "\tperl -S htmlscanlog.pl -l \$\< -o \$\@ -v -v\n\n");
+
+print(MAKEFILE "define STARTTASK\n");
+print(MAKEFILE "\@echo === \$(CONFIGURATION) == \$\*\n");
+print(MAKEFILE "\t\@echo -- \$\(1\) \n");
+print(MAKEFILE "\t-\@perl -e \"print '++ Started at '.localtime().\\\"\\n\\\"\"\n");
+print(MAKEFILE "\t-\@perl -e \"use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\\\"\\n\\\";\"\n");
+print(MAKEFILE "endef\n\n");
+
+
+print(MAKEFILE "define ENDTASK\n");
+print(MAKEFILE "\t\-\@perl -e \"use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\\\"\\n\\\";\"\n");
+print(MAKEFILE "\t-\@perl -e \"print '++ Finished at '.localtime().\\\"\\n\\\"\"\n");
+print(MAKEFILE "endef\n\n");
+
+print(MAKEFILE "# Rule for starting up a configuration\n");
+print(MAKEFILE ".PHONY : timestart.txt\n\n");
+print(MAKEFILE "timestart.txt \:\n");
+print(MAKEFILE "\t\@echo ===-------------------------------------------------\n");
+print(MAKEFILE "\t\@echo === \$\(CONFIGURATION)\n");
+print(MAKEFILE "\t\@echo ===-------------------------------------------------\n");
+print(MAKEFILE "\t\@\-perl -e \"print '=== \$(CONFIGURATION) started '.localtime().\\\"\\n\\\"\"\n");
+print(MAKEFILE "\t\@\-perl -e \"print time\" \> \$\@\n");
+print(MAKEFILE "\n\n");
+
+print(MAKEFILE "define LOGBUILDTIME\n");
+print(MAKEFILE "\-\(echo \$(CONFIGURATION)\$(CONFIGURATIONSUFFIX) \& type \$\< \) \| perl \$(SCRIPTDIR)send_data.pl\n");
+print(MAKEFILE "endef\n\n");
+
+print(MAKEFILE "# Do not delete generated \*-files.txt files afterwards\n");
+print(MAKEFILE ".PRECIOUS : \%-files.txt\n\n");
+
+print(MAKEFILE "# ... unless there was an error generating \*-files.txt file, the delete it\n");
+print(MAKEFILE ".DELETE_ON_ERROR : \%-files.txt\n\n");
+
+
+print(MAKEFILE "\%-otherfiles.txt : %-files.txt\n");
+print(MAKEFILE "\tperl \$(SCRIPTDIR)filter-out.pl \$\< \$(filter-out \$\<,\$(wildcard \$(\*)\*-files.txt)) > \$\@\n");
+
+print(MAKEFILE "\%-files.txt  : \n");
+print(MAKEFILE "\tperl \$(SCRIPTDIR)find.pl \$\(subst \_,\/,\$\*\) \> \$\@\n\n");
+
+print(MAKEFILE "\%others.zip : \%-otherfiles.txt\n");
+print(MAKEFILE "\ttype \$\< \| zip \-\@ \$\@\n\n");
+
+print(MAKEFILE "\%.zip : \%-files.txt\n");
+print(MAKEFILE "\ttype \$\< \| zip \-\@ \$\@\n\n");
+
+
+
+print(MAKEFILE "# Creating cmd file for configuration using ebs tools\n");
+print(MAKEFILE "\%\-ebs.xml : \$(SYSTEMDEFINITIONXML)\n");
+print(MAKEFILE "\tperl \$(EPOCROOT)epoc32/tools/build/genxml.pl -o \$\@ -s \"\\\" -n \$\* -x \$\<\n");
+print(MAKEFILE "\n");
+
+print(MAKEFILE "\%.cmd : \%-ebs.xml\n");
+print(MAKEFILE "\tperl \$(SCRIPTDIR)getEbsCommands.pl -d \$\< \> \$\@\n");
+print(MAKEFILE "\n");
+
+print(MAKEFILE "# Automatic dependencies\n");
+print(MAKEFILE "\%\/abld.bat : \%\/bld.inf\n");
+print(MAKEFILE "\t\$(call STARTTASK,bldmake bldfiles -v -k)\n");
+print(MAKEFILE "\t\@echo Error 42 abld command issued when bldmake was not done first\n");
+print(MAKEFILE "\t\@echo Error 42 This is a serious error in your build configuration and must be fixed.\n");
+print(MAKEFILE "\t\@echo Error 42 In this build the error has been fixed automatically.\n");
+print(MAKEFILE "\tcd \$* && bldmake bldfiles -v -k\n");
+print(MAKEFILE "\t\$(ENDTASK)\n\n");
+print(MAKEFILE "\n");
+
+print(MAKEFILE "# If we are working on EC \"patched\" system\n");
+print(MAKEFILE "ifeq (\$(strip \$(MAKE)),emake)\n");
+print(MAKEFILE " \# We assume this to be Electric Cloud build\n");
+print(MAKEFILE " CONFIGURATIONSUFFIX=-ECBS\n");
+print(MAKEFILE "endif\n\n");
+	
+
+print(MAKEFILE "# Configurations\n");
+print(MAKEFILE "CONFIGURATIONS:=");
+foreach my $configurationName (sort(keys(%configurationTasks))) {
+	print(MAKEFILE " \\\n ".makefileTargetName($configurationName));
+}
+print(MAKEFILE "\n\n");
+
+
+
+print(MAKEFILE "# Printing out the configurations\n");
+print(MAKEFILE "configurations : \$(addsuffix -print,\$(CONFIGURATIONS))\n\n");
+
+# Filter current makefile out of this rule in order to avoid trying to regenerate current makefile
+# in situations where for one reason or another system definition xml file is not present.
+print(MAKEFILE "\$(filter-out \$(CURRENT_MAKEFILE),\$(addsuffix .make,\$(CONFIGURATIONS))) : \%.make : \$(SYSTEMDEFINITIONXML) ");
+
+# If this is the root level makefile, add this makefile to dependencies also
+# to avoid configuration specific sub makefiles and main level makefile 
+# incompatibilities for instance with filters.
+if ( $makefileName eq "makefile" ) {
+    print(MAKEFILE "makefile");
+}
+print(MAKEFILE "\n");
+print(MAKEFILE "\tperl \$(SCRIPTDIR)sysdef2make.pl \$(addprefix -filter ,\$(FILTERS)) -n \$\* \$(SYSDEF2MAKEFLAGS) \$\<\n\n");
+
+print(MAKEFILE "\$(filter-out \$(CONFIGURATION),\$(CONFIGURATIONS)) : \% : \%.make\n");
+print(MAKEFILE "\t\$(MAKE) -f \$\< \$\@\n\n");
+
+
+
+# Build up buildlayertasks
+foreach my $configurationName ( @configurations ) {
+    my $configurationTargetName = makefileTargetName( $configurationName );
+    foreach my $looptask ( @{$configurationTasks{$configurationName}} ) {
+        my %task = %{$looptask};
+        my $taskId = $task{taskId};
+        if ( ! $task{specialInstruction} ) {
+            my $command = makefileTargetName( $task{command} );
+            my $target = makefileTargetName( $task{target} );
+            $taskTargetName = makefileTargetName( $task{command},$task{target} );
+
+            # Add task to list of tasks
+            $buildLayerTasks{$taskTargetName} = $looptask;
+        }
+    }
+}
+
+
+# Process buildLayer tasks and derive commands which do not have options incorporated with them
+foreach my $taskTarget ( sort(keys(%buildLayerTasks)) ) {
+    my %task = %{$buildLayerTasks{$taskTarget}};
+    
+    my %newTask;
+    $newTask{command} = $task{command};
+
+    # Strip any " -XXX" from command
+    $newTask{command} =~ s{\s-[^\s]*}{}g;
+    
+    $newTask{target} = $task{target};
+
+    # Strip leading "-XXX" from target
+    $newTask{target} =~ s{^-[^\s]*}{}g;
+
+    # Strip any " -XXX" from target
+    $newTask{target} =~ s{\s-[^\s]*}{}g;
+    
+    my $newTaskTargetName = makefileTargetName( $newTask{command}, $newTask{target} );
+    if ( ! exists($buildLayerTasks{$newTaskTargetName}) ) {
+        $newTask{option} = $task{option};
+        $newTask{executable} = $task{executable};
+        $buildLayerTasks{$newTaskTargetName} = \%newTask;
+    }
+}
+
+
+
+# Here we determine the content for each special instruction
+my $i = 0;
+my @specialInstructionList = @{ $doc->getElementsByTagName('specialInstructions') };
+my @currentArray = ();
+my $name;
+while ( $i < scalar(@specialInstructionList) ) 
+# There are more specialInstructions
+{
+	# Set name and specialInstruction to list
+	my $specialInstruction = $specialInstructionList[$i];
+	$name = $specialInstruction->getAttribute('name');
+	my $command = quoteCommand($specialInstruction->getAttribute('command'));
+	my $cwd = $specialInstruction->getAttribute('cwd');
+
+	if ( $ignoreErrorCommands{getExecutable($command)} ) 
+	# Command is listed as "ignore error" command
+	{
+		$command = "-cd ".$cwd." && ".$command." ";
+	} else {
+		$command = "cd ".$cwd." && ".$command." ";
+	}
+
+	push( @currentArray, $command );
+	
+	# Get next element and advance list
+	my $prevSpecialInstruction = $specialInstruction;
+	$specialInstruction = $specialInstruction->getNextSibling();
+
+	if ( ! $specialInstruction ) 
+	# No next sibling. Get first child of parents next sibling
+	{
+		my $nextParent = $prevSpecialInstruction->getParentNode();
+		do {
+			$nextParent = $nextParent->getNextSibling();
+	 	} while ( $nextParent && $nextParent->getNodeName() =~ m{^\#.*} );
+ 
+		if ( $nextParent ) {
+			$specialInstruction = $nextParent->getFirstChild();
+		}
+	}
+	$i++;
+
+	if ( ! $specialInstruction ||
+           $specialInstruction->getNodeName() ne "specialInstructions" ||
+           $specialInstruction->getAttribute('name') ne $name )
+	# Element is not part of same specialInstruction group
+	{
+		checkRegisterSpecialInstruction( $name, @currentArray );
+		# reset tasks
+		@currentArray = ();
+		$name = ();
+	}
+}
+
+if ( $name && @currentArray ) {
+	checkRegisterSpecialInstruction( $name, @currentArray );
+}
+
+
+sub checkRegisterSpecialInstruction($@) {
+	my ($name,@currentArray) = @_;
+
+	if ( $specialInstructions{$name} ) 
+	# Same specialInstruction name has been registered
+	{ 
+		if ( scalar(@{$specialInstructions{$name}}) != scalar(@currentArray) ) 
+		# Different amount of tasks
+		{
+			print(STDERR "ERROR: specialInstruction $name is defined in several places but with different contents.\n");
+
+			if ( scalar(@currentArray) > scalar(@{$specialInstructions{$name}}) ) 
+			# The latter instance has more instances
+			{
+				# Use that one 
+				@{$specialInstructions{$name}} = @currentArray;
+			}
+		} else 
+		# Same amount of tasks
+		{
+			my @registeredTasks = @{$specialInstructions{$name}};
+			my $j=0;
+			while ( $j < scalar(@currentArray) && 
+					$currentArray[$j] eq $registeredTasks[$j] ) {
+				$j++;
+			}
+			if ( $currentArray[$j] ne $registeredTasks[$j] ) {
+				print(STDERR "ERROR: specialInstruction $name is defined several places but with different contents.\n");
+			}
+		}
+	} else 
+	# Not registered before, this is first time
+	{
+		push( @{$specialInstructions{$name}}, @currentArray );
+	}
+}
+
+
+# Print out component specific rules resulting from buildLayer tasks
+print(MAKEFILE "# buildLayer component (group/bld.inf) specific rules\n");
+foreach my $makefileTarget ( keys(%buildLayerTasks) ) {
+    my %task = %{$buildLayerTasks{$makefileTarget}};
+    my $cmdLine = $task{command}." ".$task{option}." ".$task{target};
+
+    # buildLayer tasks end up to pattern rules where pattern is the component directory
+    my $match=0;
+    foreach my $regexp (@forceMakeCommands) {
+        if ( $cmdLine =~ m{$regexp}i ) {
+            $match=1;
+            last;
+        }
+    }
+    if ( $match ) {
+        # Its command matching "force make on this command" regexp
+       
+        # Make variable must contain standard gnu make, nothing else
+        print(MAKEFILE "\%-".$makefileTarget.": MAKE=make\n");
+    }
+    if ( $task{executable} =~ /^abld/i ) {
+        print(MAKEFILE "\%-".$makefileTarget.": %/abld.bat\n");
+    } else {
+        print(MAKEFILE "\%-".$makefileTarget.": %/bld.inf\n");
+    }
+    print(MAKEFILE "\t\$(call STARTTASK,".quoteCommandSeparators($task{command}).")\n");
+    print(MAKEFILE "\t");
+    if ( $ignoreErrorCommands{$task{executable}} ) {
+        print(MAKEFILE "-");
+    }
+    print(MAKEFILE "cd \$* && $cmdLine\n");
+    print(MAKEFILE "\t\$(ENDTASK)\n\n");
+}
+
+
+# Print out the contents of specialInstructions
+print(MAKEFILE "# specialInstructions\n");
+foreach my $specialInstruction ( keys(%specialInstructions) ) {
+    my $simpleTarget = makefileTargetName($specialInstruction);
+    my $commands = join(" \n\t",@{$specialInstructions{$specialInstruction}});
+    
+    # buildLayer tasks end up to pattern rules where pattern is the component directory
+    my $match=0;
+    foreach my $regexp (@forceMakeCommands) {
+        if ( $commands =~ m{$regexp}i ) {
+            $match=1;
+            last;
+        }
+    }
+    if ( $match ) {
+        # Its command matching "force make on this command" regexp
+       
+        # Make variable must contain standard gnu make, nothing else
+        print(MAKEFILE $simpleTarget.": MAKE=make\n");
+    }
+    print(MAKEFILE "$simpleTarget:\n");
+    print(MAKEFILE "\t\$(call STARTTASK,\$\@)\n");
+    print(MAKEFILE "\t$commands \n");
+    print(MAKEFILE "\t\$(ENDTASK)\n\n");
+}
+
+# Print out the unitlists 
+# Note that this will print unitlists several times if they are in several configurations
+print(MAKEFILE "# Component lists based on contents of layers and unitlists\n");
+foreach my $configuration ( @userConfigurations ) {
+    foreach my $unitList ( @{$unitLists{$configuration}} ) {
+        print(MAKEFILE "\n\n");
+        print(MAKEFILE makefileTargetName($unitList)." := ");
+        foreach my $unit ( @{$units{$unitList}} ) {
+            print(MAKEFILE " \\\n ".$bldFiles{$unit});
+        }
+
+    }
+}
+print(MAKEFILE "\n\n");
+
+print(MAKEFILE "# Rules for layers and unitLists\n");
+foreach my $configuration ( @userConfigurations) {
+    foreach my $unitList ( @{$unitLists{$configuration}} ) {
+        # Check there's no matching configuration name
+        my $unitListTarget = makefileTargetName($unitList);
+        my $matchingLayer=0;
+        foreach my $configurationName ( keys(%unitLists) ) {
+            if ( makefileTargetName(lc($configurationName)) eq lc($unitListTarget) ) {
+                $matchingLayer = 1;
+                last;
+            }
+        }
+    
+        # Print unitlist-task rule only if it there is no matching configuration-task rule existing anywhere
+        if ( ! $matchingLayer ) {
+            foreach my $task ( keys(%buildLayerTasks) ) {
+                print(MAKEFILE "\n\n".makefileTargetName($unitList)."-$task : \$(addsuffix -$task , \$(filter-out \$(\$(CONFIGURATION)-EXCLUDE),\$(".makefileTargetName($unitList).")))");
+            }
+        }
+    }
+}
+print(MAKEFILE "\n\n");
+
+foreach my $configurationName ( @userConfigurations ) {
+    my $configurationTargetName = makefileTargetName( $configurationName );
+
+    print(MAKEFILE "$configurationTargetName-UNITS := ");
+    foreach my $unitList ( @{$unitLists{$configurationName}} ) {
+        print(MAKEFILE "\$(".makefileTargetName($unitList).") ");
+    }
+    print(MAKEFILE "\n\n");
+
+    my @excludedUnits = @{$excludedUnits{$configurationName}};
+    
+    print(MAKEFILE "# Excluded components in $configurationName\n");
+    print(MAKEFILE "$configurationTargetName-EXCLUDE := ");
+    foreach my $unit ( @excludedUnits ) {
+        print(MAKEFILE " \\\n".$bldFiles{$unit});
+    }
+    print(MAKEFILE "\n\n");
+
+    my %targetDependencies;
+    my %targetCommands;
+
+    push( @{$targetDependencies{$configurationTargetName}}, "timestart.txt" );    
+    foreach my $looptask ( @{$configurationTasks{$configurationName}} ) {
+        # Build up configuration depencencies list
+        my %task = %{$looptask};
+        my $taskId = $task{taskId};
+        if ( $task{specialInstruction} ) {
+            my $taskTargetName = makefileTargetName( $task{specialInstruction} );
+            my $target = "$configurationTargetName-$taskTargetName-$taskId";
+            push( @{$targetDependencies{$configurationTargetName}}, $target );
+            # TODO set the correct file name for the following
+            $cmdString = "\$(MAKE) \$(addprefix -f ,\$(CURRENT_MAKEFILE)) $taskTargetName";
+            push( @{$targetCommands{$target}}, $cmdString );
+
+        } else {
+            my $command = makefileTargetName( $task{command} );
+            my $target = makefileTargetName( $task{target} );
+            $taskTargetName = makefileTargetName( $task{command},$task{target} );
+
+            # Set unitlist or configuration as a prefix to task rule
+            if ( @{$task{unitLists}} ) 
+            # Task specific unitlist defined
+            {
+                $taskTargetName = "\$(addsuffix -".$taskTargetName.",".join(" ",@{$task{unitLists}}).")";
+            } else {
+                # Prefix the targetname to current dependencies
+                $taskTargetName = $configurationTargetName."-".$taskTargetName;
+            }
+            my $target = "$configurationTargetName-$taskTargetName-$taskId";
+            push( @{$targetDependencies{$configurationTargetName}}, $target );
+            # TODO set the correct file name for the following
+            $cmdString = "\$(MAKE) \$(addprefix -f ,\$(CURRENT_MAKEFILE)) $taskTargetName";
+            push( @{$targetCommands{$target}}, $cmdString );
+        }
+    }
+
+    print(MAKEFILE "$configurationTargetName: CONFIGURATION:=$configurationTargetName\n");
+    print(MAKEFILE "$configurationTargetName: ".join(" \\\n  ".(" " x length($configurationTargetName)), @{$targetDependencies{$configurationTargetName}})."\n");
+
+    print(MAKEFILE "\t\@\-perl -e \"print '=== \$(CONFIGURATION) finished '.localtime().\\\"\\n\\\"\"\n");
+    print(MAKEFILE "\t\$\(LOGBUILDTIME\)\n");
+    print(MAKEFILE "\t\@\-perl -e \"print time\" \> timestop.txt\n");
+    print(MAKEFILE "\n\n");
+
+    print(MAKEFILE "# Dependencies between individual tasks\n");
+
+    # Makefile target name for current task 
+    # buildLayer tasks: unitlist/configuration-command[-target]
+
+    my $i=1;
+    while ( $i < scalar( @{$targetDependencies{$configurationTargetName}} ) ) {
+        my $target = $targetDependencies{$configurationTargetName}[$i];
+        print(MAKEFILE "$target: ".$targetDependencies{$configurationTargetName}[$i-1]."\n");
+        print(MAKEFILE "\t".join(" \n\t",@{$targetCommands{$target}})."\n");
+        print(MAKEFILE "\n");
+        $i++;
+    }
+}   
+
+
+
+foreach my $configurationName ( @userConfigurations ) {
+    print(MAKEFILE getConfigurationTaskRules($configurationName) );
+}
+
+sub getConfigurationTaskRules($) {
+    my ($configurationName) = @_;
+	my $configurationTargetName = makefileTargetName( $configurationName );
+    my $output = "# configuration -> unitlists rules for $configurationName\n";
+
+	foreach my $task ( keys(%buildLayerTasks) ) {
+		$output.="$configurationTargetName-$task : \$(addsuffix -$task,\$(filter-out \$($configurationTargetName-EXCLUDE),\$($configurationTargetName-UNITS)))\n";
+		$output.="\n\n";
+	}
+	return($output);
+}
+
+
+
+
+print(MAKEFILE "# Printing out the tasks for layers unitlists and bld.inf\n");
+print(MAKEFILE "tasks : \$(foreach TASK,");
+foreach my $command (sort(keys(%buildLayerTasks))) {
+	print(MAKEFILE " \\\n  ".quoteCommandForEcho($command));
+}
+print(MAKEFILE ",-\$(TASK)-print)\n\n");
+
+print(MAKEFILE "# Printing out special instructions\n");
+print(MAKEFILE "specialInstructions:\n");
+foreach my $specialInstruction (sort(keys(%specialInstructions))) {
+	print(MAKEFILE "\t\@echo ".makefileTargetName($specialInstruction)."\n");
+}
+print(MAKEFILE "\n\n");
+
+
+
+print(MAKEFILE "# Printing out layers\n");
+print(MAKEFILE "layers:\n");
+foreach my $layer (sort(keys(%units))) {
+	print(MAKEFILE "\t\@echo $layer\n");
+}
+print(MAKEFILE "\n\n");
+
+print(MAKEFILE "# Printing out filters\n");
+print(MAKEFILE "filters:\n");
+foreach my $filter (keys(%filters)) {
+    print(MAKEFILE "\t\@echo $filter\n");
+}
+print(MAKEFILE "\n\n");
+
+close(MAKEFILE);
+
+# Creates a valid makefile target string from name,command and target
+sub makefileTargetName {
+	my @arguments=@_;
+
+	if ( ! @arguments ) {
+		return("");
+	}
+	my $result=shift(@arguments);
+	$result =~ s{[\s\.\%\&\|\;\"\<\>]}{_}g;
+	$result =~ s{\\}{/}g;
+	$result =~ s{_+}{_}g;
+
+
+	my $rest = makefileTargetName(@arguments);
+	if ( $rest ) {
+		$result.="-".$rest;
+	}
+
+	$result =~ s{_-}{-}g;
+	return $result;
+}
+
+sub quoteCommandSeparators($) {
+    my ($string) = @_;
+    $string =~ s{([\&\|\;\"])}{_}g;
+    return($string);
+}
+
+sub getExecutable($) {
+	my ($command) = @_;
+	$command =~ s{^\s*([^\s]+).*}{\1};
+	return $command;
+}
+
+# Add quoting for echoing commands which have command control characters in them
+sub quoteCommandForEcho($) {
+	my ($command) = @_;
+	$command =~ s{([\%\|\&\<\>])}{\^\1}g;
+	return $command;
+}
+
+# Add quoting for commands to make them print out in makefile
+sub quoteCommand($) {
+	my ($command) = @_;
+	$command =~ s{\$}{\$\$}g;
+	return $command;
+}
+
+# check_filter
+#
+# Inputs
+# $item_filter - filter specification (comma-separated list of words)
+# $configspec - configuration specification (reference to list of words)
+#
+# Outputs
+# $failed - filter item which did not agree with the configuration (if any)
+#           An empty string is returned if the configspec passed the filter
+#
+# Description
+# This function checks the configspec list of words against the words in the
+# filter. If a word is present in the filter, then it must also be present in
+# the configspec. If "!word" is present in the filter, then "word" must not
+# be present in the configspec.
+sub check_filter($$) {
+    my ($item_filter, $configspec) = @_;
+    my $failed = "";
+
+    foreach my $word (split /,/,$item_filter) {
+        if ($word =~ /^!/) {
+            # word must NOT be present in configuration filter list
+
+            my $notword = substr($word, 1);
+            if ( grep(/^$notword$/, @$configspec) ) {
+                $failed = $word;
+            }
+        } else {
+            # word must be present in configuration filter list
+            $failed = $word unless grep(/^$word$/, @$configspec);
+        }
+    }
+    return $failed;
+}
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/qt/qt.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,124 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name        : qt.ant.xml
+Part of     : Helium
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="qt" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Qt build support.
+    </description>
+    
+    <property name="qt.dir" location="${build.drive}/qt"/>
+    <property name="qt.configure.log.name" value="${build.id}_configure-qt.log"/>
+    <property name="qt.qmake.ant.template" location="${helium.dir}/tools/compile/qt/templates/run-qmake.ant.xml.ftl" />
+    <property name="qt.qmake.makefile.template" location="${helium.dir}/tools/compile/qt/templates/run-qmake.mk.ftl" />
+    <property name="qt.configure.args" value="-platform win32-mwc -xplatform symbian-abld -confirm-license"/>
+    <property name="qt.qmake.default.args" value="-platform symbian-abld -r"/>
+    
+    <!-- This target will run the configure tool under Qt (qt.dir) in order to create the
+        qmake tool and configure the Qt project for symbian building.
+        <deprecated>This target and its configuration are not maintained anymore, please consider building Qt using 
+         Symbian toolchain.</deprecated> 
+     -->
+    <target name="configure-qt">
+        <hlm:recordStartMacro name="${qt.configure.log.name}"/>
+        <exec dir="${qt.dir}" executable="${qt.dir}/configure.exe" failonerror="false">
+            <arg line="${qt.configure.args}"/>
+        </exec>
+        <hlm:recordStopMacro name="${qt.configure.log.name}"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${qt.configure.log.name}"/>
+                <metadatafilterset refid="filterset.qt.configure" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${qt.configure.log.name}" />
+    </target>
+
+    <!--
+        Executing qmake on all Qt components defined under the system definition file.
+        It must use schema v1.5.0+, and Qt unit must define a proFile attibute.   
+     -->
+    <target name="run-qmake" if="qmake.enabled">
+        <!-- Generating the build steps from the sysdef information -->
+        <hlm:generate-layers />
+        <if>
+            <or>
+                <equals arg1="${build.system}" arg2="ec-helium" />
+                <equals arg1="${build.system}" arg2="sbs-ec" />
+            </or>
+            <then>
+                <fmpp sourceFile="${qt.qmake.makefile.template}"
+                    outputFile="${temp.build.dir}/run-qmake-${sysdef.configuration}.mk">
+                    <data expandProperties="yes">
+                        data: xml(${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}.xml)
+                        ant: antProperties()
+                    </data>
+                </fmpp>
+                <hlm:assertFileExists file="${temp.build.dir}/run-qmake-${sysdef.configuration}.mk" />
+    
+                <!-- Running the qmake steps -->
+                <hlm:emakeMacro name="run-qmake-${sysdef.configuration}" makefile="${temp.build.dir}/run-qmake-${sysdef.configuration}.mk"
+                    target="all" dir="${build.drive}/" log="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log"
+                    annodetail="basic,history,file,waiting"
+                    failonerror="false" />
+                <hlm:assertFileExists file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
+            </then>
+            <else>
+                <fmpp sourceFile="${qt.qmake.ant.template}"
+                    outputFile="${temp.build.dir}/run-qmake-${sysdef.configuration}.ant.xml">
+                    <data expandProperties="yes">
+                        data: xml(${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}.xml)
+                        ant: antProperties()
+                    </data>
+                </fmpp>
+                <hlm:assertFileExists file="${temp.build.dir}/run-qmake-${sysdef.configuration}.ant.xml" />
+    
+                <!-- Running the qmake steps -->
+                <ant antfile="${temp.build.dir}/run-qmake-${sysdef.configuration}.ant.xml" dir="${build.drive}/"
+                    output="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log"/>
+                <hlm:assertFileExists file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
+            </else>
+        </if>
+        <copy file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" tofile="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt">
+            <filterchain>
+                <linecontainsregexp>
+                    <regexp pattern="Generating"/>
+                </linecontainsregexp>
+            </filterchain>
+        </copy>
+        <replaceregexp file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt" match="^\s*(?:\[exec\])?\s*Generating[^/\\]*." replace="" byline="true"/>
+        <hlm:assertFileExists file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
+                <metadatafilterset>
+                    <metadatafilter priority="error" regex="^Error processing project file:" description="qt error" />
+                    <metadatafilter priority="error" regex="^'.*' is not recognized as an internal or external command," description="qt error" />
+                    <metadatafilter priority="error" regex="^Result: [1-9][0-9]*" description="qt error" />
+                    <metadatafilter priority="warning" regex="^WARNING:" description="qt error" />
+                    <metadatafilter priority="info" regex="INFO:" description="qt error" />
+                </metadatafilterset>
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:signalMacro logfile="${build.id}_${sysdef.configuration}.qmake.log" 
+            signal.input="signalRunQMakeInput" />
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/qt/templates/run-qmake.ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+<#--
+============================================================================ 
+Name        : run-qmake.ant.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0"?>
+<project name="run-qmake-${ant['sysdef.configuration']}" default="all">
+
+    <target name="all">
+        <parallel threadCount="${r'$'}{number.of.threads}">
+    <#list data["//unit/@proFile/.."] as unit>
+            <sequential>
+                <echo>Running qmake for ${unit.@bldFile}/${unit.@proFile}</echo>
+                <if>
+                    <available file="${r'$'}{build.drive}/${unit.@bldFile}" type="dir"/>
+                    <then>
+                        <exec executable="cmd" dir="${r'$'}{build.drive}/${unit.@bldFile}" failonerror="false">
+                            <arg value="/C"/>
+                            <arg value="qmake"/>
+                            <arg value="-listgen"/>
+                            <#if unit.@qmakeArgs[0]??>
+                            <arg line="${unit.@qmakeArgs?xml}"/>
+                            <#else>
+                            <arg line="${ant['qt.qmake.default.args']?xml}"/>
+                            </#if>
+                            <arg value="${unit.@proFile?xml}"/>
+                        </exec>
+                    </then>
+                    <else>
+                       <echo message="ERROR: Directory ${r'$'}{build.drive}/${unit.@bldFile} doesn't exist."/>
+                    </else>
+                </if>
+            </sequential>
+    </#list>
+        </parallel>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/qt/templates/run-qmake.mk.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<#--
+============================================================================ 
+Name        : run-qmake.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+##########################################################################
+#
+# run-qmake-${ant['sysdef.configuration']}.mk
+#
+##########################################################################
+
+<#list data["//unit/@proFile/.."] as unit>
+##########################################################################
+/${unit.@bldFile}/bld.inf: /${unit.@bldFile}/${unit.@proFile}
+	@echo cd /${unit.@bldFile} ^&^& qmake -listgen <#if unit.@qmakeArgs[0]??>${unit.@qmakeArgs}<#else>${ant['qt.qmake.default.args']}</#if> ${unit.@proFile}
+	cd /${unit.@bldFile} && qmake -listgen <#if unit.@qmakeArgs[0]??>${unit.@qmakeArgs}<#else>${ant['qt.qmake.default.args']}</#if> ${unit.@proFile}
+
+all:: /${unit.@bldFile}/bld.inf
+
+
+</#list>
+
+##########################################################################
+
+all:: ; @echo All done 
+
+##########################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/sbs/sbs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sbs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile.sbs" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Executes compilation of a System Model of System Definition file using Symbian SBS (Raptor) tools. 
+
+    Should not be called directly but through compile-main by setting ${build.system.sbs} property.
+
+    Example:
+
+    hlm -Dsysdef.configurations.list=ALL -Dbuild.system=sbs compile-main
+    hlm "-Dsysdef.configurations.list=REALLYCLEAN,ALL" -Dbuild.system=sbs compile-main
+    </description>
+
+    <!-- Executes compilation  of a System Model of System Definition file using Symbian SBS (Raptor) tools. 
+
+    Should not be called directly but through compile-main by setting ${build.system.sbs} property.
+
+    Example: 
+
+    hlm -Dsysdef.configurations.list=ALL -Dbuild.system=sbs compile-main
+    hlm "-Dsysdef.configurations.list=REALLYCLEAN,ALL" -Dbuild.system=sbs compile-main
+
+    -->
+
+    <property name="skip.sbs.layer.generation" value="false" />
+    
+    <!-- This target filters the canonical system definition file compare to the "raptor_${sysdef.configuration}" filter. -->
+    <macrodef name="generate-layers" uri="http://www.nokia.com/helium">
+        <sequential>
+            <echo message="canno-file:${canonical.sysdef.file}" />
+            <echo message="raptor-filters:raptor_${sysdef.configuration}" />
+            <if>
+                <istrue value="${skip.sbs.layer.generation}" />
+                <then>
+                    <copy file="${canonical.sysdef.file}" tofile="${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}_temp.xml"/>
+                </then>
+                <else>
+                    <hlm:compileGenxmlFilterMacro input="${canonical.sysdef.file}" filter="raptor_${sysdef.configuration}"
+                        output="${build.output.dir}/build/canonical_system_definition_${sysdef.configuration}_temp.xml"/>
+                </else>
+            </if>
+            <copy file="${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}_temp.xml"
+                    tofile="${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}.xml">
+                <filterchain>
+                    <linecontainsregexp negate="true">
+                        <regexp pattern="^\s*$"/>
+                    </linecontainsregexp>
+                </filterchain>
+            </copy>
+            <delete file="${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}_temp.xml"/>
+        </sequential>
+    </macrodef>
+
+    <if>
+        <not>
+            <isset property="sbs.config"/>
+        </not>
+        <then>
+            <property name="sbs.config" value="armv5" />
+            <property name="sbs.tools.config" value="tools_rel" />
+        </then>
+    </if>
+
+    <import file="sbs.settings.ant.xml" />
+
+    <!-- SBS build with gmake as engine type. Default is using sbs macro, to use old implementation to
+    use using exec task, then sbs.using.exec needs to be set. -->
+    <target name="compile-sbs" description="This is the main build that gets built for ARMV5 and WINSCW platforms">
+        <if>
+            <or>
+                <equals arg1="${build.system}" arg2="sbs" />
+                <equals arg1="${build.system}" arg2="sbs-ec" />
+            </or>
+            <then>
+                <!-- Choosing the right command (either clean or normal command) and 
+                    the default command if no input is specified for sbs -->
+                <var name="sbs.cmd.reference" value="sbs" />
+                <var name="sbs.make.reference" value="${build.system}.make.options" />
+                <hlm:sbsMakeOptions id="sbs.internal.make.options" refid="${sbs.make.reference}" />
+                <if>
+                    <istrue value="${compile.cmd.clean}"/>
+                    <then>
+                        <var name="sbs.cmd.reference" value="${sbs.cmd.reference}.clean" />
+                    </then>
+                </if>
+                <if>
+                    <not>
+                        <isreference refid="${sbs.cmd.reference}.var"/>
+                    </not>
+                    <then>
+                        <var name="sbs.cmd.reference" value="${sbs.cmd.reference}.default" />
+                    </then>
+                </if>
+                <if>
+                    <not>
+                        <isreference refid="${sbs.make.reference}"/>
+                    </not>
+                    <then>
+                        <hlm:sbsMakeOptions id="sbs.internal.make.options" refid="${sbs.make.reference}.default" />
+                    </then>
+                </if>
+                <var name="sbs.cmd.reference" value="${sbs.cmd.reference}.var" />
+                <echo message="sbs build:${env.SBS_HOME}/python/plugins/filter_heliumlog.py" />
+
+                <!-- Generate the filtered layers -->
+                <hlm:generate-layers />
+
+                <!-- run arm license checking / setting arm version only for arm config --> 
+                <hlm:getVariableValue name="config" property="compilevalue.var">
+                    <hlm:argSet refid="${sbs.cmd.reference}" />
+                </hlm:getVariableValue>
+                <if>
+                    <not>
+                        <equals arg1="${compilevalue.var}" arg2="winscw"/>
+                    </not>
+                    <then>
+                        <runtarget target="set-arm-version"/>
+                    </then>
+                </if>
+
+                <!-- only temporary once config file option starts to work, then no 
+                need to copy the plugin file -->
+
+                <echo message="Copying helium filter plugin to sbs home" />
+                <copy file="${helium.dir}/tools/common/python/scripts/filter_metadatalog.py" todir="${env.SBS_HOME}/python/plugins/" failonerror="true" />
+                <copy file="${helium.dir}/tools/common/python/scripts/sbsscanlogmetadata.py" todir="${env.SBS_HOME}/python/plugins/" failonerror="true" />
+
+
+                <echo>Building with SBSv2</echo>
+                <echo message="build.drive:${build.drive}"/>
+                <echo message="build.log.dir:${build.log.dir}"/>
+                <echo message="sysdef.configuration:${sysdef.configuration}"/>
+                <echo message="canonical.sysdef.file:${canonical.sysdef.file}"/>
+                <echo message="env.SBS_HOME:${env.SBS_HOME}"/>
+                <!-- Implicit calls to tools configuration, for temporary once the sbs is working
+                    to execte all configuration at the same time, this could be removed. -->
+                <if>
+                    <istrue value="${sbs.implicit.tools.build}" />
+                    <then>
+                        <echo message="Implicit tools configuration build" />
+                        <hlm:sbsCompileMacro cmdreference = "sbs.implicit.tools.var" />
+                    </then>
+                </if>
+                <hlm:sbsCompileMacro cmdreference = "${sbs.cmd.reference}" />
+            </then>
+        </if>
+    </target>
+
+    <macrodef name="sbsCompileMacro" uri="http://www.nokia.com/helium">
+        <attribute name="cmdreference" />
+        <sequential>
+            <var name="sbs.log.file" value="" unset="true"/>
+            
+            <delete file="${build.log.dir}/${build.id}.${sysdef.configuration}_sbs_info.xml" failonerror="false"/>
+            <!-- sbs.log.file set by sbs tool execution, temporary -->
+            <hlm:toolMacro name="sbs">
+                <hlm:toolvarset refid="@{cmdreference}"/>
+            </hlm:toolMacro>
+            
+            <!-- update the resultes to database -->
+            <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_sbs_info.xml"/>
+            <echo message="Metadata enabled, storing build status in database" />
+            <echo message="sbs log file :${sbs.log.file}" />
+            <hlm:metadatarecord database="${metadata.dbfile}">
+                <hlm:sbsmetadatainput>
+                    <fileset casesensitive="false" file="${sbs.log.file}"/>
+                    <metadatafilterset refid="filterset.sbs" />
+                </hlm:sbsmetadatainput>
+            </hlm:metadatarecord>
+            <basename property="base.sbs.log.file" file="${sbs.log.file}" suffix=".log"/>
+            <echo message="base sbs log file :${base.sbs.log.file}" />
+            <fmpp sourceFile="${helium.dir}/tools/common/templates/log/scan2.html.ftl"
+                         outputfile="${sbs.log.file}.scan2.html">
+                <freemarkerLinks expandProperties="yes">
+                    macro: ${helium.dir}/tools/common/templates/macro
+                </freemarkerLinks>
+                <data expandProperties="yes">
+                    dbPath: ${metadata.dbfile}
+                    doc: xml(${build.log.dir}/${build.id}.${sysdef.configuration}_sbs_info.xml)
+                    ant: antProperties()
+                </data>
+            </fmpp>
+            <echo message="generating signal" />
+            <hlm:assertFileExists file="${sbs.log.file}.scan2.html"/>
+            <hlm:calculateErrorsFromLog logfile="${sbs.log.file}" />
+            <hlm:compileLogSignalMacro compile.summary.file="${base.sbs.log.file}" 
+                error.limit="${build.errors.limit}"/>
+            <!-- Blocks packaging configuration generation. -->
+            <if>
+                <istrue value="${blocks.enabled}" />
+                <then>
+                    <mkdir dir="${blocks.config.dir}" />
+                    <exec executable="python">
+                        <arg value="-m"/>
+                        <arg value="packager.cli"/>
+                        <arg value="--epocroot=${build.drive}/" />
+                        <arg value="--config=${blocks.config.dir}" />
+                        <arg value="--datasource=sbs" />
+                        <arg value="-Dsbslog=${sbs.log.file}" />
+                        <arg value="-Dsysdef=${canonical.sysdef.file}" />
+                        <arg value="-Dthreads=20" />
+                        <arg value="--updateData" />
+                    </exec>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <!-- Get the supported configuration(armv5, winscw) from system definition file.  This is 
+    temporary and will be moved to get values from carbon tool. -->
+    <target name="get-sbs-configs">
+        <hlm:getSBSConfigMacro sbs.sysdef.file="${canonical.sysdef.file}"/>
+        <echo message="configs:${sbs.configs}"/>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/sbs/sbs.settings.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sbs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile.sbs.settings" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        sbs default settings input.
+    </description>
+
+    <if>
+        <not>
+            <isset property="sbs.config"/>
+        </not>
+        <then>
+            <property name="sbs.config" value="armv5" />
+            <property name="sbs.tools.config" value="tools_rel" />
+        </then>
+    </if>
+
+    <hlm:argSet id="sbs.default.var">
+        <hlm:arg name="config" value="${sbs.config}" />
+        <hlm:arg name="enable-filter" value="true" />
+    </hlm:argSet>
+
+    <hlm:argSet id="sbs.clean.default.var">
+        <hlm:arg name="config" value="${sbs.config}" />
+        <hlm:arg name="command" value="REALLYCLEAN" />
+        <hlm:arg name="enable-filter" value="true" />
+    </hlm:argSet>
+
+    <hlm:sbsMakeOptions engine="emake" id="sbs-ec.make.options.default">
+        <hlm:makeOption name="--emake-emulation" value="gmake" />
+        <hlm:makeOption name="--emake-annodetail" value="basic,history,waiting" />
+        <hlm:makeOption name="--emake-class" value="${ec.build.class}"/>
+    </hlm:sbsMakeOptions>
+
+    <hlm:argSet id="sbs.implicit.tools.var">
+        <hlm:arg name="config" value="${sbs.tools.config}" />
+        <hlm:arg name="enable-filter" value="true" />
+    </hlm:argSet>
+
+    <hlm:sbsMakeOptions engine="gmake" id="sbs.make.options.default"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/sbs/test/test_sbs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_sbs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Used to test get variable and checking its value for SBS build config data.
+
+============================================================================
+-->
+<project name="test_sbs" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Used to test get variable and checking its value for SBS build config data.
+    </description>
+    <property environment="env" />
+    <property name="helium.dir" location="../../../.." />
+    <import file="../../../../helium.ant.xml" />
+    <property name="sbs.tools.config" value="tools_rel" />
+    
+    <!-- test the variable sbs.config set to armv5 and check it calls the set-arm-version-test
+    target so that I can check the code to do the get variable and read it works properly. -->
+    <target name="test-sbs-armv5">
+        <hlm:argSet id="sbs.config">
+            <hlm:arg name="config" value="armv5" />
+        </hlm:argSet>
+        <echo>message="config = ${sbs.config}"</echo>
+        <runtarget target="compile-sbs-test"/>
+    </target>
+
+    <!-- test the variable sbs.config set to winscw and check it does not call the set-arm-version-test
+    target so that I can check the code to do the get variable and read it works properly. -->
+    <target name="test-sbs-winscw">
+        <hlm:argSet id="sbs.config">
+            <hlm:arg name="config" value="winscw" />
+        </hlm:argSet>
+        <runtarget target="compile-sbs-test"/>
+    </target>
+
+    <!-- test the variable sbs.config set to armv5,winscw and check it calls the set-arm-version-test
+    target so that I can check the code to do the get variable and read it works properly. -->
+    <target name="test-sbs-both">
+        <hlm:argSet id="sbs.config">
+            <hlm:arg name="config" value="armv5,winscw" />
+        </hlm:argSet>
+        <runtarget target="compile-sbs-test"/>
+    </target>
+
+    <!-- test the variable sbs.config set to all valid values and that it behaves as above. -->
+    <target name="test-sbs-all">
+        <runtarget target="test-sbs-armv5"/>
+        <runtarget target="test-sbs-winscw"/>
+        <runtarget target="test-sbs-both"/>
+    </target>
+
+    <!-- call this to use the sbs.config value set in the build.xml file (if set). -->
+    <target name="test-sbs-build">
+        <runtarget target="compile-sbs-test"/>
+    </target>
+    
+    
+    <!-- test the variable sbs.config if set to anyhting other than winscw check it calls the set-arm-version-test
+    if set to winscw then it should not call set-arm-version-test. -->
+    <target name="compile-sbs-test" description="This is the main build that gets built for ARMV5 and WINSCW platforms">
+        <hlm:getVariableValue name="config" property="compilevalue.var">
+            <hlm:argSet refid="sbs.default.var" />
+        </hlm:getVariableValue>
+        <echo> stick in an extra line</echo>
+        <echo> message="sbs.config = ${sbs.config}"</echo>
+        <echo> message="compilevalue.var = ${compilevalue.var}"</echo>
+        <if>
+            <not>
+                <equals arg1="${compilevalue.var}" arg2="winscw"/>
+            </not>
+            <then>
+                <runtarget target="set-arm-version-test"/>
+                <echo>running set-arm-version-test</echo>
+            </then>
+        </if>
+        <echo>in the main body of target</echo>
+    </target>
+
+    <!-- just to confirm the if/then/else is working correctly -->
+    <target name="set-arm-version-test">
+        <echo>running set-arm-version-test yippee!!!!</echo>
+    </target>
+  
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/scanbuildlog.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,157 @@
+#!perl -w
+
+#============================================================================ 
+#Name        : scanbuildlog.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+# ==============================================================================
+#  %name:          scanbuildlog.pl %
+#  Part of:        juno_build
+#
+#  %version:	   1 %
+#  %date_modified: Mon Feb 06 17:21:13 2006 %
+#
+#  See POD text at the end of this file for usage details.
+# ==============================================================================
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use XML::Simple;
+use lib "$ENV{'BUILD_DRIVE'}\\epoc32\\tools";
+use Scanlog;
+use XML::Parser::Expat;
+
+my $help        = 0;
+my $man         = 0;
+my $unique      = 0;
+my $logfilename = '';
+
+GetOptions('unique' => \$unique,
+           'log=s'  => \$logfilename,
+           'man'    => \$man,
+           'help|?' => \$help)
+  or pod2usage(2);
+pod2usage(1) if $help;
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+$logfilename = shift unless $logfilename;
+my $logfile;
+
+if ($logfilename)
+{
+    open(LOGFILE, $logfilename) or die("Can't open '$logfilename': $!\n");
+    $logfile = \*LOGFILE;
+}
+else
+{
+    $logfile = \*STDIN;
+}
+
+#<!DOCTYPE logfile SYSTEM "logfile.dtd">
+#<?xml-stylesheet type="text/xsl" href="logfile.xsl"?>
+print <<EOT;
+<?xml version="1.0" encoding="ascii"?>
+EOT
+print("<logfile name=\"$logfilename\">\n");
+
+my %logentry  = ();
+my $phase     = '';
+my $component = '';
+my $parser = new XML::Parser::Expat;
+
+while (<$logfile>)
+{
+    chomp;
+    next if Scanlog::CheckForIgnore($_);
+
+    ($phase = $1) =~ s/\\/\\\\/ and next
+      if /^=== (.+) started ... ... .. (..):(..):(..)/;
+    $phase = $1 and next if /^=== (.+) started ... ... .. (..):(..):(..)/;
+    $component = $1 and next if $phase && /^=== $phase == (\S+)/;
+    if ($phase && /^=== $phase finished ... ... .. (..):(..):(..)/)
+    {
+        $component = '';
+        next;
+    }
+
+    my $logrec = {line    => $.,
+                  content => $parser->xml_escape($_)};
+
+    $logrec->{severity} = 'info'
+      if Scanlog::CheckForMigrationNotes($_)
+      or Scanlog::CheckForRemarks($_);
+
+      if ( Scanlog::CheckForErrors($_)
+      or Scanlog::CheckForNotBuilt($_)
+      or Scanlog::CheckForMissing($_) )
+    {
+        $logrec->{severity} = 'error';
+    }
+    $logrec->{severity} = 'warn' if Scanlog::CheckForWarnings($_);
+    next unless $logrec->{severity};
+
+    print XMLout($logrec, rootname => 'logentry', noescape => 0);
+}
+
+print("</logfile>\n");
+
+__END__
+
+=head1 NAME
+
+scanbuildlog - Scan EBS build log for errors and warnings
+
+=head1 SYNOPSIS
+
+perl scanbuildlog.pl [-h] | -l <log file>
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exits.
+
+=item B<-man>
+
+Prints the manual page and exits.
+
+=item B<-l>
+
+Specify the log file to parse.
+
+=back
+
+=head1 DESCRIPTION
+
+Prints out a summary of the errors, warnings and informational
+messages found in the log file in an XML format conforming to the
+following DTD:
+
+ <!ELEMENT logfile (logentry*)>
+ <!ELEMENT logentry (#PCDATA)>
+ <!ATTLIST logentry
+   severity (error|warn|info) #REQUIRED
+   line     CDATA             #REQUIRED
+   errfile  CDATA             #IMPLIED
+   errline  CDATA             #IMPLIED>
+
+=head1 SEE ALSO
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/sis.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : sis.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="compile.sis" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Create SIS files.</description>
+    
+    <!-- Preprocesses the SIS configuration file to insert Ant properties. -->
+    <target name="preprocess-sis-config" if="sis.config.file">
+        <property name="sis.config.file.parsed" location="${build.output.dir}/sis.cfg.xml.parsed" />
+        <copy file="${sis.config.file}" tofile="${sis.config.file.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties/>
+            </filterchain>
+        </copy>
+    </target>
+    
+    
+    <!-- Create SIS files. -->
+    <target name="sisfiles" depends="preprocess-sis-config" if="sis.config.file">
+        <hlm:tempRecordStartMacro name="${build.id}_sisfiles.log"/>        
+        <mkdir dir="${build.sisfiles.dir}" />
+        <hlm:python>
+import configuration
+import sis
+import os
+
+builder = configuration.NestedConfigurationBuilder(open(r'${sis.config.file.parsed}', 'r'))
+configSet = builder.getConfiguration()
+configs = configSet.getConfigurations()
+
+prebuilder = sis.SisPreBuilder(configSet)
+prebuilder.write(os.path.join(r'${temp.build.dir}', 'sis_build.ant.xml'))
+        </hlm:python>
+        <ant antfile="${temp.build.dir}/sis_build.ant.xml"/>
+        <hlm:tempRecordStopMacro name="${build.id}_sisfiles.log" filterref="filterset.sisfiles"/>
+        <hlm:metadatarecord xmlns:hlm="http://www.nokia.com/helium" database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.cache.log.dir}/${build.id}_sisfiles.log"/>
+                <metadatafilterset refid="filterset.sisfiles"/>
+            </hlm:textmetadatainput> 
+        </hlm:metadatarecord>
+    </target>
+
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/util/ini2sysdef.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,111 @@
+#============================================================================ 
+#Name        : ini2sysdef.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+import os
+import sys
+import shutil
+import string
+
+
+if __name__ == "__main__":
+    argc = len(sys.argv)
+    if argc >= 4 or argc < 2:
+        print 'Simple tool for one-time converting ini-files to SystemDefinitions'
+        print 'remeber to manually edit the outputs'
+        print 'usage:', sys.argv[0], 'infile [outfile] '
+        sys.exit(1)
+
+
+    filename = sys.argv[1]
+##    r"C:\USERS\work\systemdefinitionXML\spp_config\build\spp_convcom.ini"
+    if argc == 3:
+        filename2 =  sys.argv[2]
+    else:
+        filename2, ext = os.path.splitext(filename)
+        filename2 += ".xml"
+    print "outfilename is %s" % filename2
+
+    
+
+    ##r"C:\USERS\work\systemdefinitionXML\spp_config\build\spp_convcom.xml"
+    #filename = "logparse_rules.txt"
+
+    file = open (filename,"r")
+    global DATA
+    DATA = file.readlines()
+
+    try:
+        shutil.copyfile("spp_dtd.xml", filename2)
+    except:
+        pass
+    
+    outfile = open(filename2,"a")
+    component = ""
+    compname = ""
+    bld_path = ""
+    
+    outfile.write('<SystemDefinition name="spp_SystemModel" schema="1.4.0">\n')
+    outfile.write('  <systemModel>\n')
+    outfile.write('<layer name="%s">\n' % filename)
+    outfile.write('  <logicalset name="%s">\n'   % filename)
+
+
+    #print DATA
+    for line in DATA:
+        if '[' in line:
+            if not component == "":
+                #the first one
+                outfile.write('</component> \n')
+                outfile.write('</module> \n')
+            component = line.split('[')[1].split(']')[0]
+            print "we have component here : ",  component
+
+            outfile.write('<module name="%s"> \n' % component.strip())
+        if "name" in line:
+            compname = line.split('=')[1]
+#            print "we have  name here : ",  compname
+            outfile.write('<component name="%s"> \n' % compname.strip())
+        if "bld_path" in line:
+            bldpath = line.split('=')[1]
+            bldpath = bldpath.strip()
+            bldpath = bldpath.strip('\\')
+            bldpath = bldpath.replace('<', '')
+            bldpath = bldpath.replace('>', '')
+            
+            
+            
+#            print "we have path here : ",  bldpath
+            outfile.write('<unit unitID="%s_%s"  name="%s" bldFile="%s" mrp=""/> \n' % 
+                          (os.path.basename(filename), component.strip(), compname.strip(), bldpath.strip()))
+
+
+
+    print "finishing"
+    outfile.write('</component> \n')
+    outfile.write('</module> \n')
+    outfile.write('    </logicalset>\n')
+    outfile.write('    </layer>\n')
+    
+    outfile.write('  </systemModel>\n')
+    outfile.write('</SystemDefinition>\n')
+
+
+    
+    outfile.close()    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/util/txt2sysdef.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,92 @@
+#============================================================================ 
+#Name        : txt2sysdef.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+
+import os
+import os.path
+import sys
+import shutil
+import string
+
+
+if __name__ == "__main__":
+    argc = len(sys.argv)
+    if argc >= 4 or argc < 2:
+        print 'Simple tool for one-time converting txt-files to SystemDefinitions'
+        print 'remeber to manually edit the outputs'
+        print 'usage:', sys.argv[0], 'infile [outfile] '
+        sys.exit(1)
+
+
+    filename = sys.argv[1]
+
+    if argc == 3:
+        filename2 =  sys.argv[2]
+    else:
+        filename2, ext = os.path.splitext(filename)
+        filename2 += ".xml"
+    print "outfilename is %s" % filename2
+
+    
+
+
+    file = open (filename,"r")
+    global DATA
+    DATA = file.readlines()
+
+    try:
+        shutil.copyfile("dtd.xml", filename2)
+    except:
+        pass
+    
+    outfile = open(filename2,"a")
+    component = ""
+    compname = ""
+    bld_path = ""
+    
+    outfile.write('<SystemDefinition name="SystemModel" schema="1.4.0">\n')
+    outfile.write('  <systemModel>\n')
+    outfile.write('<layer name="%s">\n' % os.path.basename(filename))
+
+
+    #print DATA
+    for line in DATA:
+        # ignore outcommented lines in input 
+        if '#Components' in line:
+            continue
+        if 'Component' in line:
+            try:
+                # we are expecting lines "Component /path/to/named/group componentName"
+                component, bldpath, comname =  line.split()
+                print ("prosessing component %s \n" % comname.strip())
+                outfile.write('<unit unitID="%s_%s"  name="%s" bldFile="%s" mrp=""/> \n' % 
+                              (os.path.basename(filename), comname.strip(), comname.strip(), bldpath.strip()))
+            except:
+                print ("Problems with Line:\n %s\n" % line)
+
+
+    print "finishing"
+    outfile.write('</component> \n')
+    outfile.write('</module> \n')
+    outfile.write('    </layer>\n')
+    
+    outfile.write('  </systemModel>\n')
+    outfile.write('</SystemDefinition>\n')
+
+    outfile.close()    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/iad/iad.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : iad.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="iad">
+    
+    <!-- Target to generate IAD sis packages. -->
+    <target name="makeiadsis">
+        <echo message="Building IAD SIS packages"/>
+        <for delimiter="," param="sysdef.file">
+            <path>
+                <fileset refid="system.definition.files"/>
+            </path>
+            <sequential>
+                <exec executable="python" dir="${build.log.dir}" failonerror="true">
+                    <arg value="${helium.dir}/tools/iad/packageiad.py"/>
+                    <arg value="@{sysdef.file}"/>
+                    <arg value="${sysdef.configurations}"/>
+                    <arg value="${build.drive}"/>
+                </exec>
+            </sequential>
+        </for>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/iad/iadinfo.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1095 @@
+#============================================================================ 
+#Name        : iadinfo.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import optparse
+import sys, os
+import struct
+import zlib
+import pdb
+    
+PyASN1Availabe = True
+
+try :
+    from pyasn1.codec.der import decoder
+    from pyasn1.type import univ, base
+except :
+    PyASN1Availabe = False
+
+def _findItem(item, itemParent, index, objectIdentifier) :
+    if isinstance(item, base.AbstractSimpleAsn1Item) :
+        if item == objectIdentifier :
+            return itemParent[index + 1]
+    else:
+        for i in range(len(item)) :
+            found = _findItem(item[i], item, i, objectIdentifier)
+            if found: 
+                return found
+
+def findItem(decodedCert, objectIdentifier) :
+    return _findItem(decodedCert, None, 0, objectIdentifier)
+
+
+class CertificateOrganization :
+    def __init__(self) :
+        pass
+    
+    def parse(self, decodedCert) :
+        self.commonName = findItem(decodedCert, (2, 5, 4, 3))
+        self.countryCode = findItem(decodedCert, (2, 5, 4, 6))
+        self.locality = findItem(decodedCert, (2, 5, 4, 7))
+        self.state = findItem(decodedCert, (2, 5, 4, 8))
+        self.street = findItem(decodedCert, (2, 5, 4, 9))
+        self.organization = findItem(decodedCert, (2, 5, 4, 10))
+
+    def readableStr(self) :
+        buf = ""
+        if self.commonName :
+            buf += self.commonName.prettyPrint() + "\n"
+        if self.countryCode :
+            buf += self.countryCode.prettyPrint() + "\n"
+        if self.locality :
+            buf += self.locality.prettyPrint() + "\n"
+        if self.state :
+            buf += self.state.prettyPrint() + "\n"
+        if self.street :
+            buf += self.street.prettyPrint() + "\n"
+        if self.organization :
+            buf += self.organization.prettyPrint()
+        return buf
+
+class CertificateInfo :
+    def __init__(self) :
+        pass
+        
+    def parse(self, decodedCert) :
+        self.issuer = CertificateOrganization()
+        self.issuer.parse(decodedCert[0][3])
+        
+        self.signer = CertificateOrganization()
+        self.signer.parse(decodedCert[0][5])
+        
+    def readableStr(self) :
+        buf = "Signer:\n      " + "\n      ".join(self.signer.readableStr().split('\n')) + "\n"
+        buf += "Issuer:\n      " + "\n      ".join(self.issuer.readableStr().split('\n')) + "\n"
+        return buf
+            
+
+class SISFileHeader :
+    def __init__(self) :
+        self.uid1 = 0
+        self.uid2 = 0
+        self.uid3 = 0
+        self.uidChecksum = 0
+
+class SISField :
+    def __init__(self) :
+        self.type = 0
+        self.length = None
+        self.subFields = []
+        
+    def readFieldLength(self, fileReader) :
+        length = fileReader.readBytesAsUint(4)
+        if length & 0x80000000 > 0 :
+            length = length << 32
+            length |= fileReader.readBytesAsUint(4)
+        return length
+        
+    def findField(self, fieldType, startIndex=0) :
+        result = None
+        index = startIndex
+        
+        for field in self.subFields[startIndex:] :
+            if field.type == fieldType :
+                result = field
+                break
+            ++ index
+        return (result, index)
+        
+    def readableStr(self) :
+        return ""
+    
+    def traverse(self, handler, depth=0) :
+        handler.handleField(self, depth)
+        for field in self.subFields :
+            field.traverse(handler, depth + 1)
+        
+class SISUnsupportedField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fileReader.readPlainBytes(self.length)
+
+class SISStringField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.data = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        buf = fileReader.readPlainBytes(self.length)
+        self.data = u""
+        while len(buf) > 0 :
+            temp = buf[:2]
+            buf = buf[2:]
+            self.data += unichr(ord(temp[0]) | ord(temp[1]) << 8)
+        
+    def readableStr(self) :
+        return self.data
+        
+class SISArrayField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        type = fileReader.readBytesAsInt(4)
+        l = self.length - 4
+        while l > 0 :
+            field = SISFieldTypes[type]()
+            field.type = type
+            field.initFromFile(fileReader)
+            self.subFields.append(field)
+            
+            l -= field.length + 4 # field length + the length field
+            padding = fileReader.skipPadding()
+            l -= padding
+
+class SISCompressedField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.algorithm = None
+        self.uncompressedDataSize = None
+        self.data = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.algorithm = fileReader.readBytesAsUint(4)
+        self.uncompressedDataSize = fileReader.readBytesAsUint(8)
+        data = fileReader.readPlainBytes(self.length - 4 - 8)
+        if self.algorithm == 0 :
+            self.data = data
+        elif self.algorithm == 1 :
+            self.data = zlib.decompress(data)
+            
+class SISVersionField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.version = (- 1, - 1, - 1)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        major = fileReader.readBytesAsInt(4)
+        minor = fileReader.readBytesAsInt(4)
+        build = fileReader.readBytesAsInt(4)
+        self.version = (major, minor, build)
+        
+    def readableStr(self) :
+        return str(self.version)
+    
+class SISVersionRangeField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.fromVersion = None
+        self.toVersion = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.fromVersion = fieldParser.parseField(fileReader)
+        if self.length - fieldParser.lastReadBytes > 0  :
+            self.toVersion = fieldParser.parseField(fileReader)
+    
+class SISDateField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.year = None
+        self.month = None
+        self.day = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.year = fileReader.readBytesAsUint(2)
+        self.month = fileReader.readBytesAsUint(1)
+        self.day = fileReader.readBytesAsUint(1)
+    
+    def readableStr(self) :
+        return str(self.year) + "." + str(self.month) + "." + str(self.day)
+    
+class SISTimeField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.hours = None
+        self.minutes = None
+        self.seconds = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.hours = fileReader.readBytesAsUint(1)
+        self.minutes = fileReader.readBytesAsUint(1)
+        self.seconds = fileReader.readBytesAsUint(1)
+    
+    def readableStr(self) :
+        return str(self.hours) + ":" + str(self.minutes) + ":" + str(self.seconds)
+    
+class SISDateTimeField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.date = None
+        self.time = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.date = fieldParser.parseField(fileReader)
+        self.time = fieldParser.parseField(fileReader)
+    
+class SISUidField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.uid = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.uid = fileReader.readBytesAsUint(4)
+        
+    def readableStr(self) :
+        return hex(self.uid)
+    
+class SISLanguageField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.language = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.language = fileReader.readBytesAsUint(4)
+        
+    def readableStr(self) :
+        return str(self.language)
+    
+class SISContentsField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        field = fieldParser.parseField(fileReader)
+        while field :
+            if field.type == 3 : # compressed<conroller>
+                bufferReader = SISBufferReader(field.data)
+                field = fieldParser.parseField(bufferReader)
+            self.subFields.append(field)
+            field = fieldParser.parseField(fileReader)
+
+class SISControllerField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        bufferReader = SISBufferReader(fileReader.readPlainBytes(self.length))
+        field = fieldParser.parseField(bufferReader)
+        while field :
+            self.subFields.append(field)
+            field = fieldParser.parseField(bufferReader)
+
+class SISInfoField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.installType = None
+        self.installFlags = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # UID
+        self.subFields.append(fieldParser.parseField(fileReader)) # Vendor name unique
+        self.subFields.append(fieldParser.parseField(fileReader)) # names
+        self.subFields.append(fieldParser.parseField(fileReader)) # vendor names
+        self.subFields.append(fieldParser.parseField(fileReader)) # version
+        self.subFields.append(fieldParser.parseField(fileReader)) # creation time
+        self.installType = fileReader.readBytesAsUint(1)
+        self.installFlags = fileReader.readBytesAsUint(1) 
+            
+class SISSupportedLanguagesField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # languages
+        
+class SISSupportedOptionsField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # options
+            
+class SISPrerequisitiesField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # target devices
+        self.subFields.append(fieldParser.parseField(fileReader)) # dependencies
+        
+        
+class SISDependencyField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # UID
+        field = fieldParser.parseField(fileReader)
+        # Version range field is optional
+        if field.type == VersionRangeField :
+            self.subFields.append(field) # version range
+            self.subFields.append(fieldParser.parseField(fileReader)) # dependency names
+        else :
+            self.subFields.append(field) # dependency names
+    
+class SISPropertiesField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # properties
+    
+class SISPropertyField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.key = None
+        self.value = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.key = fileReader.readBytesAsInt(4)
+        self.value = fileReader.readBytesAsInt(4)
+    
+# There is a type for this field, but there is no definition of the field contents
+class SISSignaturesField(SISUnsupportedField) :
+    pass
+    
+class SISCertificateChainField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # certificate data
+    
+class SISLogoField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # logo file
+    
+class SISFileDescriptionField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.operation = None
+        self.operationOptions = None
+        self.compressedLength = None
+        self.uncompressedLength = None
+        self.fileIndex = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        
+        self.subFields.append(fieldParser.parseField(fileReader))
+        self.subFields.append(fieldParser.parseField(fileReader))
+        field = fieldParser.parseField(fileReader)
+        self.subFields.append(field)
+        if field.type == 41 : # read field was capabilities ==> there is one more field left
+            self.subFields.append(fieldParser.parseField(fileReader))
+        
+        self.operation = fileReader.readBytesAsUint(4)
+        self.operationOptions = fileReader.readBytesAsUint(4)
+        self.compressedLength = fileReader.readBytesAsUint(8)
+        self.uncompressedLength = fileReader.readBytesAsUint(8)
+        self.fileIndex = fileReader.readBytesAsUint(4)
+        
+    def readableStr(self) :
+        return "index: " + str(self.fileIndex)
+    
+class SISHashField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.algorithm = None
+
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.algorithm = fileReader.readBytesAsUint(4)
+        self.subFields.append(fieldParser.parseField(fileReader)) # logo file
+    
+class SISIfField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # expression
+        self.subFields.append(fieldParser.parseField(fileReader)) # install block
+        self.subFields.append(fieldParser.parseField(fileReader)) # else ifs
+
+class SISElseIfField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # expression
+        self.subFields.append(fieldParser.parseField(fileReader)) # install block
+    
+class SISInstallBlockField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.files = None
+        self.embeddedSISFiles = None
+        self.ifBlocks = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader))
+        self.subFields.append(fieldParser.parseField(fileReader))
+        self.subFields.append(fieldParser.parseField(fileReader))
+
+class SISExpressionField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.operator = None
+        self.integerValue = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.operator = fileReader.readBytesAsUint(4)
+        self.integerValue = fileReader.readBytesAsInt(4)
+        
+        if self.operator == 10 or self.operator == 13 :
+            self.subFields.append(fieldParser.parseField(fileReader))
+        if self.operator == 1 or self.operator == 2 or self.operator == 3 or self.operator == 4 or self.operator == 5 or self.operator == 6 or self.operator == 7 or self.operator == 8 or self.operator == 11 or self.operator == 12 :
+            self.subFields.append(fieldParser.parseField(fileReader))
+        if not (self.operator == 13 or self.operator == 14 or self.operator == 15 or self.operator == 16 or self.operator == 10) :
+            self.subFields.append(fieldParser.parseField(fileReader))
+        
+class SISDataField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # data units
+    
+class SISDataUnitField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # file data
+    
+class SISFileDataField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # raw file data
+    
+class SISSupportedOptionField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # names
+    
+class SISControllerChecksumField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.checksum = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.checksum = fileReader.readBytesAsUint(2)
+    
+class SISDataChecksumField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.checksum = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.checksum = fileReader.readBytesAsUint(2)
+    
+class SISSignatureField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # signature algorithm
+        self.subFields.append(fieldParser.parseField(fileReader)) # signature data
+    
+class SISBlobField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.data = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.data = fileReader.readPlainBytes(self.length)
+    
+class SISSignatureAlgorithmField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # algorithm identifier
+    
+class SISSignatureCertificateChainField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        fieldParser = SISFieldParser()
+        self.subFields.append(fieldParser.parseField(fileReader)) # signatures
+        self.subFields.append(fieldParser.parseField(fileReader)) # certificate chain
+    
+class SISDataIndexField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.dataIndex = None
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.dataIndex = fileReader.readBytesAsUint(4)
+
+class SISCapabilitiesField(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.capabilities = 0
+        self.readableCaps = []
+        
+    def initFromFile(self, fileReader) :
+        self.length = self.readFieldLength(fileReader)
+        self.capabilities = fileReader.readBytesAsUint(self.length)
+        
+        for i in range(20) :
+            if (self.capabilities >> i) & 0x01 :
+                self.readableCaps.append(CapabilityNames[i])
+                
+    def readableStr(self) :
+        return " ".join(self.readableCaps)
+    
+SISFieldTypes = { 
+    1 : SISStringField,
+    2 : SISArrayField,
+    3 : SISCompressedField,
+    4 : SISVersionField,
+    5 : SISVersionRangeField,
+    6 : SISDateField,
+    7 : SISTimeField,
+    8 : SISDateTimeField,
+    9 : SISUidField,
+    10 : SISUnsupportedField,
+    11 : SISLanguageField,
+    12 : SISContentsField,
+    13 : SISControllerField,
+    14 : SISInfoField,
+    15 : SISSupportedLanguagesField,
+    16 : SISSupportedOptionsField,
+    17 : SISPrerequisitiesField,
+    18 : SISDependencyField,
+    19 : SISPropertiesField,
+    20 : SISPropertyField,
+    21 : SISSignaturesField,
+    22 : SISCertificateChainField,
+    23 : SISLogoField,
+    24 : SISFileDescriptionField,
+    25 : SISHashField,
+    26 : SISIfField,
+    27 : SISElseIfField,
+    28 : SISInstallBlockField,
+    29 : SISExpressionField,
+    30 : SISDataField,
+    31 : SISDataUnitField,
+    32 : SISFileDataField,
+    33 : SISSupportedOptionField,
+    34 : SISControllerChecksumField,
+    35 : SISDataChecksumField,
+    36 : SISSignatureField,
+    37 : SISBlobField,
+    38 : SISSignatureAlgorithmField,
+    39 : SISSignatureCertificateChainField,
+    40 : SISDataIndexField,
+    41 : SISCapabilitiesField
+    }
+
+[StringField,
+ ArrayField,
+ CompressedField,
+ VersionField,
+ VersionRangeField,
+ DateField,
+ TimeField,
+ DateTimeField,
+ UidField,
+ UnusedField,
+ LanguageField,
+ ContentsField,
+ ControllerField,
+ InfoField,
+ SupportedLanguagesField,
+ SupportedOptionsField,
+ PrerequisitiesField,
+ DependencyField,
+ PropertiesField,
+ PropertyField,
+ SignaturesField,
+ CertificateChainField,
+ LogoField,
+ FileDescriptionField,
+ HashField,
+ IfField,
+ ElseIfField,
+ InstallBlockField,
+ ExpressionField,
+ DataField,
+ DataUnitField,
+ FileDataField,
+ SupportedOptionField,
+ ControllerChecksumField,
+ DataChecksumField,
+ SignatureField,
+ BlobField,
+ SignatureAlgorithmField,
+ SignatureCertificateChainField,
+ DataIndexField,
+ CapabilitiesField] = range(1, 42)
+     
+FieldNames = {
+ 0 : "ROOT",
+ StringField : "StringField",
+ ArrayField : "ArrayField",
+ CompressedField : "CompressedField",
+ VersionField : "VersionField",
+ VersionRangeField : "VersionRangeField",
+ DateField : "DateField",
+ TimeField : "TimeField",
+ DateTimeField : "DateTimeField",
+ UidField : "UidField",
+ UnusedField : "UnusedField",
+ LanguageField : "LanguageField",
+ ContentsField : "ContentsField",
+ ControllerField : "ControllerField",
+ InfoField : "InfoField",
+ SupportedLanguagesField : "SupportedLanguagesField",
+ SupportedOptionsField : "SupportedOptionsField",
+ PrerequisitiesField : "PrerequisitiesField",
+ DependencyField : "DependencyField",
+ PropertiesField : "PropertiesField",
+ PropertyField : "PropertyField",
+ SignaturesField : "SignaturesField",
+ CertificateChainField : "CertificateChainField",
+ LogoField : "LogoField",
+ FileDescriptionField : "FileDescriptionField",
+ HashField : "HashField",
+ IfField : "IfField",
+ ElseIfField : "ElseIfField",
+ InstallBlockField : "InstallBlockField",
+ ExpressionField : "ExpressionField",
+ DataField : "DataField",
+ DataUnitField : "DataUnitField",
+ FileDataField : "FileDataField",
+ SupportedOptionField : "SupportedOptionField",
+ ControllerChecksumField : "ControllerChecksumField",
+ DataChecksumField : "DataChecksumField",
+ SignatureField : "SignatureField",
+ BlobField : "BlobField",
+ SignatureAlgorithmField : "SignatureAlgorithmField",
+ SignatureCertificateChainField : "SignatureCertificateChainField",
+ DataIndexField : "DataIndexField",
+ CapabilitiesField : "CapabilitiesField"
+}
+     
+CapabilityNames = {
+    0 : "TCB",
+    1 : "CommDD",
+    2 : "PowerMgmt",
+    3 : "MultimediaDD",
+    4 : "ReadDeviceData",
+    5 : "WriteDeviceData",
+    6 : "DRM",
+    7 : "TrustedUI",
+    8 : "ProtServ",
+    9 : "DiskAdmin",
+    10 : "NetworkControl",
+    11 : "AllFiles",
+    12 : "SwEvent",
+    13 : "NetworkServices",
+    14 : "LocalServices",
+    15 : "ReadUserData",
+    16 : "WriteUserData",
+    17 : "Location",
+    18 : "SurroundingsDD",
+    19 : "UserEnvironment"
+    }
+
+InstallTypes = {
+    0: "SA",
+    1: "SP",
+    2: "PU",
+    3: "PA",
+    4: "PP"
+    }
+    
+class SISReader :
+    def __init__(self) :
+        self.bytesRead = 0
+        
+    def readUnsignedBytes(self, numBytes) :
+        buf = self.readPlainBytes(numBytes)
+        if len(buf) < numBytes :
+            return []
+            
+        format = ""
+        for i in range(numBytes) :
+            format += "B"
+        return struct.unpack(format, buf)
+    
+    def readSignedBytes(self, numBytes) :
+        buf = self.readPlainBytes(numBytes)
+        if len(buf) < numBytes :
+            return []
+            
+        format = ""
+        for i in range(numBytes) :
+            format += "b"
+        return struct.unpack(format, buf)
+        
+    def readBytesAsUint(self, numBytes) :
+        result = 0
+        bytes = self.readUnsignedBytes(numBytes)
+        if len(bytes) == numBytes :
+            for i in range(numBytes) :
+                result |= bytes[i] << (i * 8)
+        
+        return result
+        
+    def readBytesAsInt(self, numBytes) :
+        result = 0
+        bytes = self.readSignedBytes(numBytes)
+        if len(bytes) == numBytes :
+            for i in range(numBytes) :
+                result |= bytes[i] << (i * 8)
+        
+        return result
+        
+    def skipPadding(self) :
+        result = 0
+        if self.bytesRead % 4 != 0 :
+            paddingLength = 4 - self.bytesRead % 4
+            self.readPlainBytes(paddingLength)
+            result = paddingLength
+            
+        return result
+
+    def readPlainBytes(self, numBytes) :
+        pass
+
+class SISFileReader(SISReader) : 
+    def __init__(self, inStream) :
+        SISReader.__init__(self)
+        self.inStream = inStream
+        self.eof = False
+        self.bytesRead = 0
+
+    def readPlainBytes(self, numBytes) :
+        if self.eof :
+            return ""
+            
+        if numBytes == 0 :
+            return ""
+            
+        buf = ""
+        buf = self.inStream.read(numBytes)
+        if len(buf) < numBytes :
+            self.eof = True
+            return ""
+            
+        self.bytesRead += numBytes
+        
+        return buf
+
+    def isEof(self) :
+        return self.eof
+        
+class SISBufferReader(SISReader) :
+    def __init__(self, buffer) :
+        self.buffer = buffer
+        self.bytesRead = 0
+        
+    def readPlainBytes(self, numBytes) :
+        if self.isEof() :
+            return ""
+            
+        if numBytes == 0 :
+            return ""
+            
+        result = self.buffer[self.bytesRead:self.bytesRead + numBytes]
+            
+        self.bytesRead += numBytes
+        
+        return result
+            
+    def isEof(self) :
+        return self.bytesRead >= len(self.buffer)
+        
+class SISFieldParser :
+    def __init__(self) :
+        self.lastReadBytes = 0
+        
+    def parseField(self, fileReader) :
+        """Reads the next field from the fileReader stream and returns it"""
+        field = None
+        self.lastReadBytes = 0
+        type = fileReader.readBytesAsUint(4)
+        self.lastReadBytes += 4
+        if type != 0 :
+            field = SISFieldTypes[type]()
+            field.type = type
+            field.initFromFile(fileReader)
+            self.lastReadBytes += field.length + 4 # Field length + length field
+            self.lastReadBytes += fileReader.skipPadding()
+        return field
+
+class SISInfo(SISField) :
+    def __init__(self) :
+        SISField.__init__(self)
+        self.fin = None
+        self.fileHeader = SISFileHeader()
+        
+    def parse(self, filename) :
+        fin = open(filename, 'rb')
+        fileReader = SISFileReader(fin)
+        self.parseHeader(fileReader)
+        self.parseSISFields(fileReader)
+        
+    def parseHeader(self, fileReader) :
+        self.fileHeader.uid1 = fileReader.readBytesAsUint(4)
+        self.fileHeader.uid2 = fileReader.readBytesAsUint(4)
+        self.fileHeader.uid3 = fileReader.readBytesAsUint(4)
+        self.fileHeader.uidChecksum = fileReader.readBytesAsUint(4)
+        
+    def parseSISFields(self, fileReader) :
+        parser = SISFieldParser()
+        while not fileReader.isEof() :
+            self.subFields.append(parser.parseField(fileReader))
+
+class Handler :
+    def __init__(self) :
+        self.files = []
+        self.fileDatas = []
+        self.signatureCertificateChains = []
+        
+    def handleField(self, field, depth) :
+        if field.type == FileDescriptionField :
+            self.files.append(field)
+        elif field.type == FileDataField :
+            self.fileDatas.append(field)
+        elif field.type == SignatureCertificateChainField  :
+            self.signatureCertificateChains.append(field)
+
+    def execute(self, options) :
+        for f in self.files :
+            if options.info :
+                buf = "   " + f.findField(StringField)[0].readableStr()
+                caps = f.findField(CapabilitiesField)[0]
+                if caps :
+                    buf += " [" + " ".join(f.findField(CapabilitiesField)[0].readableCaps) + "]"
+                print buf
+            if options.extract :
+                parts = f.findField(StringField)[0].readableStr().split("\\")
+                if len(parts[len(parts) - 1]) > 0 :
+                    path = os.path.abspath(options.extract)
+                    path += os.sep + os.sep.join(parts[1: - 1])
+                    if not os.path.exists(path) :
+                        os.makedirs(path)
+                    newFile = file(path + os.sep + parts[len(parts) - 1], "wb")
+                    newFile.write(self.fileDatas[f.fileIndex].findField(CompressedField)[0].data)
+                    newFile.close()
+        for s in self.signatureCertificateChains :
+            if options.certificate:
+                buf = s.findField(CertificateChainField)[0].subFields[0].data
+                print "Certificate chain:"
+                i = 1
+                while len(buf) > 0 :
+                    print "   Certificate " + str(i) + ":"
+                    i += 1
+                    decoded = decoder.decode(buf)
+                    cer = CertificateInfo()
+                    cer.parse(decoded[0])
+                    readableStr = cer.readableStr()
+                    print "      " + "\n      ".join(readableStr.split('\n'))
+                    buf = decoded[1]
+            
+class ContentPrinter :
+    def __init__(self) :
+        pass
+        
+    def handleField(self, field, depth) :
+        buf = ""
+        for i in range(depth) :
+            buf += "  "
+        buf += FieldNames[field.type] + " "
+        if len(field.readableStr()) > 0 :
+            buf += field.readableStr()
+        print buf
+
+class IADHandler :
+    def __init__(self) :
+        self.packageVersion = (0, 0, 0)
+        self.packageUid = 0
+        self.vendorName = ""
+        self.packageNames = []
+        self.packageNamesFields = []
+        self.languages = []
+        self.platformDependencies = []
+        self.packageDependencies = []
+        self.installType = 0
+        self.installFlags = 0
+        
+    def handleDependency(self, field) :
+        dep = [0, - 1, - 1, - 1, - 1, - 1, - 1]
+        dep[0] = field.subFields[0].uid
+        if field.subFields[1] and field.subFields[1].type == VersionRangeField :
+            r = field.subFields[1]
+            if r.fromVersion != None :
+                dep[1] = r.fromVersion.version[0]
+                dep[2] = r.fromVersion.version[1]
+                dep[3] = r.fromVersion.version[2]
+            if r.toVersion != None :
+                dep[4] = r.toVersion.version[0]
+                dep[5] = r.toVersion.version[1]
+                dep[6] = r.toVersion.version[2]
+        return dep
+        
+    def handleField(self, field, depth) :
+        if field.type == InfoField :
+            self.packageVersion = field.subFields[4].version
+            self.packageVersionField = field.subFields[4]
+            self.packageUid = field.subFields[0].uid
+            self.packageUidField = field.subFields[0]
+            self.vendorName = field.subFields[1].data
+            self.vendorNameField = field.subFields[1]
+            self.installType = field.installType
+            self.installFlags = field.installFlags
+            for name in field.subFields[2].subFields :
+                self.packageNames.append(name.data)
+        elif field.type == LanguageField :
+            self.languages.append(field.language)
+        elif field.type == PrerequisitiesField :
+            for f in field.subFields[0].subFields :
+                dependency = self.handleDependency(f)
+                self.platformDependencies.append(dependency)
+            for f in field.subFields[1].subFields :
+                dependency = self.handleDependency(f)
+                self.packageDependencies.append(dependency)
+        
+    def getInfo (self, fileName) :
+        sisInfo = SISInfo()
+        sisInfo.parse(fileName)
+        handler = IADHandler()
+        sisInfo.traverse(handler)
+        info = "<sisinfo>\n" \
+             + "  <uid>" + hex(handler.packageUid) + "</uid>\n" \
+             + "  <vendor>" + handler.vendorName + "</vendor>\n" \
+             + "  <version>" \
+             + "<major>" + repr(handler.packageVersion[0]) + "</major>" \
+             + "<minor>" + repr(handler.packageVersion[1]) + "</minor>" \
+             + "<build>" + repr(handler.packageVersion[2]) + "</build>" \
+             + "</version>\n" \
+             + "  <type>" + InstallTypes[self.installType] + "</type>\n"
+        for num, name in enumerate(handler.packageNames) :
+            info += "  <name language='" + repr(handler.languages[num]) + "'>" + name + "</name>\n"
+        for language in handler.languages :
+            info += "  <language>" + repr(language) + "</language>\n"
+        for platDep in handler.platformDependencies :
+            info += "  <platform_dependency><uid>" + hex(platDep[0]) + "</uid>\n"
+            info += "    <from>" \
+                 + "<major>" + repr(platDep[1]) + "</major>" \
+                 + "<minor>" + repr(platDep[2]) + "</minor>"
+#           info += "<build>" + repr(platDep[3]) + "</build>"
+            info += "</from>\n    <to>" \
+                 + "<major>" + repr(platDep[4]) + "</major>" \
+                 + "<minor>" + repr(platDep[5]) + "</minor>"
+#           info += "<build>" + repr(platDep[6]) + "</build>"
+            info += "</to>\n" \
+             + "  </platform_dependency>\n"
+        for packageDep in handler.packageDependencies :
+            info += "  <package_dependency><uid>" + hex(packageDep[0]) + "</uid>\n"
+            info += "    <from>" \
+                 + "<major>" + repr(packageDep[1]) + "</major>" \
+                 + "<minor>" + repr(packageDep[2]) + "</minor>"
+#           info += "<build>" + repr(packageDep[3]) + "</build>"
+            info += "</from>\n    <to>" \
+                 + "<major>" + repr(packageDep[4]) + "</major>" \
+                 + "<minor>" + repr(packageDep[5]) + "</minor>"
+#           info += "<build>" + repr(packageDep[6]) + "</build>"
+            info += "</to>\n" \
+                 + "  </package_dependency>\n"
+        info += "</sisinfo>\n"
+        return info
+
+if __name__ == "__main__" :
+    handler = IADHandler()
+    print (handler.getInfo (sys.argv[1]))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/iad/packageiad.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,119 @@
+#============================================================================ 
+#Name        : packageiad.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import os
+import sys
+import xml.dom.minidom
+import iadinfo
+import zipfile
+import encodings.utf_8
+
+class IADPackager :
+
+    def __init__ (self) :
+        self.hasStub = False
+
+    def getBldDirs (self, layer, bldDirs) :
+        units = layer.getElementsByTagName ("unit")
+        for unit in units :
+            dir = unit.getAttribute ("bldFile").rstrip ('\\/')
+            i = dir.rfind ("\\")
+            if i == - 1 :
+                i = dir.rfind ("/")
+            bldDirs.append (dir[:i + 1])
+    
+    def getLayer (self, configuration, layers, bldDirs) :
+        layerRef = configuration.getElementsByTagName ("layerRef")[0].getAttribute ("layerName")
+        for layer in layers :
+            if layer.getAttribute ("name") == layerRef :
+                self.getBldDirs (layer, bldDirs)
+    
+    def createInfoFiles (self, sisInfo) :
+        depends = xml.dom.minidom.parse ("depends.xml")
+        info = xml.dom.minidom.parseString (sisInfo)
+        
+        infoFile = file ("sisinfo.xml", "w")
+        platDeps = info.getElementsByTagName("platform_dependency")
+        packageDeps = info.getElementsByTagName("package_dependency")
+        for packageDep in packageDeps :
+            p = depends.createElement ("package")
+            depends.childNodes[1].appendChild (p)
+            for child in packageDep.childNodes :
+                p.appendChild (child)
+        infoFile.write (info.toxml ())
+        infoFile.close()
+        depFile = file ("depends.xml", "w")
+        depFile.write (depends.toxml ())
+        depFile.close()
+    
+    def createSis (self, packageDir, packageName) :
+        sisReader = iadinfo.IADHandler()
+        os.chdir (packageDir)
+        sisPackage = packageName + ".sis"
+        stubPackage = packageName + "_stub.sis"
+        print "Creating", sisPackage
+        cmd = makesis + " package.pkg " + sisPackage
+        os.system (cmd)
+        self.createInfoFiles (sisReader.getInfo (sisPackage))
+        if os.path.exists(stubPackage) :
+            print "Creating stub SIS file", stubPackage
+            self.hasStub = True
+            cmd = makesis + " -s package.pkg " + stubPackage
+            os.system (cmd)
+        
+    def createPackage (self, topDir, packageName) :
+        print "Creating package", packageName
+        os.chdir (topDir)
+        zipFile = packageName + ".zip"
+        sisFile = packageName + '/' + packageName + ".sis"
+        infoFile = packageName + "/sisinfo.xml"
+        depFile = packageName + "/depends.xml"
+        zip = zipfile.ZipFile (zipFile, "w")
+        zip.write (sisFile, sisFile.encode ("utf-8"))
+        zip.write (infoFile, infoFile.encode ("utf-8"))
+        zip.write (depFile, depFile.encode ("utf-8"))
+        if self.hasStub :
+            stubFile = packageName + '/' + packageName + "_stub.sis"
+            zip.write (stubFile, stubFile.encode ("utf-8"))
+        zip.close()
+        
+    
+    def processSisDir (self, sisDir) :
+        for root, dirs, files in os.walk (sisDir):
+            for name in dirs :
+                self.createSis (os.path.join (root, name), name)
+                self.createPackage (root, name)
+
+makesis = sys.argv[3] + "\\epoc32\\tools\\makesis.exe"
+signsis = sys.argv[3] + "\\epoc32\\tools\\signsis.exe"
+
+sysdef = xml.dom.minidom.parse (sys.argv[1])
+configurations = sysdef.getElementsByTagName ("configuration")
+layers = sysdef.getElementsByTagName ("layer")
+bldDirs = []
+
+packager = IADPackager()
+
+for configuration in configurations :
+    if configuration.getAttribute ("name") == sys.argv[2] :
+        packager.getLayer (configuration, layers, bldDirs)
+ 
+
+for bldDir in bldDirs :
+    packager.processSisDir (sys.argv[3] + bldDir + "sis\\")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/integration/integration.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : integration.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="integration" xmlns:hlm="http://www.nokia.com/helium">
+
+    <!-- include overlay validation/merge tools -->    
+    <import file="validate_overlay/validate_overlay.ant.xml" />
+
+    <!-- Template build, this is usefull if you want to generate automatically files for many products quickly. -->
+    <import file="template-builder/template-builder.ant.xml" />
+
+    <import file="patching.ant.xml" />
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/integration/patching.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : patching.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="patching">
+    <description>Patching of S60 files.</description>
+    
+    <!--
+        Hack macro this macro enables to hack a file.
+        The macro check if the file needs to be patched if keyword regex doesn't match.
+        
+        Example:
+        <pre>
+        <hlm:hackMacro file="${build.drive}/epoc32/tools/variant/variant.cfg" keyword="ENABLE_ABIV2_MODE" regex="(.hrh$)" replace="\1\nENABLE_ABIV2_MODE"/>        
+        </pre>
+    -->
+    <macrodef name="hackMacro" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <attribute name="keyword"/>
+        <attribute name="regex"/>
+        <attribute name="replace"/>
+        <attribute name="encoding" default="utf-8"/>
+        <sequential>
+            <script language="jython" setbeans="false">
+                <![CDATA[
+import re
+import os
+import codecs
+import traceback
+keyword = r'@{keyword}'
+filename = r'@{file}'
+regex = r'@{regex}'
+replace = r'@{replace}'
+encoding = r'@{encoding}'
+if os.path.exists(filename):
+    try:
+        f = codecs.open(filename, 'r', encoding)
+        content = f.read()
+        f.close()
+        if re.search(keyword, content, re.M | re.DOTALL) == None:
+            self.log("Hacking %s" % filename)
+            content = re.compile(regex, re.M | re.DOTALL).sub(replace, content)
+            f = codecs.open(filename, 'w+', encoding)
+            f.write(content)
+            f.close()
+        else:
+            self.log(str("File %s matching keyword." % filename))
+    except Exception, e:
+        print traceback.format_exc()
+else:
+    self.log(str("Could not find the file %s." % filename))
+                ]]>
+            </script>            
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- Add new iby file includes to s60.iby 
+
+It uses a property [i]iby.include.list[/i] to list the iby-files (comma separated) that should be included in the s60.iby.
+
+Target first removes any existing includes to prevent duplicates. 
+Only problem with this one is that it does this by replacing the existing include with a line separator so the s60.iby will grow all the time.
+-->
+    <target name="modify-s60-iby">
+        <!-- Restore backup -->
+        <move file="${build.drive}/epoc32/rom/include/s60.iby.orig" tofile="${build.drive}/epoc32/rom/include/s60.iby" failonerror="false"/>
+        <!-- Create backup -->
+        <copy file="${build.drive}/epoc32/rom/include/s60.iby" tofile="${build.drive}/epoc32/rom/include/s60.iby.orig" failonerror="false"/>
+        <for list="${iby.include.list}" delimiter="," param="iby.name" >
+            <sequential>
+                <!-- First remove iby file include if it already exists to prevent duplicate includes -->
+                <replace file="${build.drive}/epoc32/rom/include/s60.iby" summary="true">
+                    <replacetoken>
+                        <![CDATA[#endif]]>
+                    </replacetoken>
+                    <replacevalue>
+                        <![CDATA[#include <@{iby.name}>
+#endif]]></replacevalue>
+                </replace>
+            </sequential>
+        </for>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/integration/template-builder/template-builder.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : template-builder.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="template-builder" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        This target provides support to replace properties from a text file
+        using values from the ROM image configuration. 
+    </description>
+
+    <!--
+        This target provides support to replace properties from a text file
+        using values from the ROM image configuration. 
+         <deprecated>ROM building implementation will change in future release of Helium.</deprecated>
+    -->
+    <target name="template-builder" depends="rombuild-prepare-input">        
+        <hlm:python>
+import configuration
+import integration.templatebuilder
+import os
+import logging
+            
+# Enabling info outputing.
+logging.basicConfig(level=logging.INFO)
+
+configBuilder = configuration.NestedConfigurationBuilder(open(r'${rombuild.config.file.parsed}', 'r'))
+configSet = configBuilder.getConfiguration()
+for product in r'${product.list}'.split(','):
+    builder = integration.templatebuilder.TemplateBuilder(configSet, product)
+    builder.build()    
+        </hlm:python>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/integration/validate_overlay/generate_vo_conf_ccmgetinput-new.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+#============================================================================ 
+#Name        : generate_vo_conf_ccmgetinput-new.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper to convert delivery.xml(new format) and prep.xml to VirtualBuildArea
+    configuration file.
+"""
+import vbaconf
+import sys    
+
+deliveryinput = sys.argv[1]
+prepinput = sys.argv[2]
+ofilename = None
+if len(sys.argv)==4:
+    ofilename = sys.argv[3]
+
+conv = vbaconf.ConfigConverterNewDelivery(deliveryinput, prepinput)
+doc = conv.generate_config()
+
+# Generating the output
+if ofilename != None:
+    file_object = open(ofilename, "w")
+    file_object.write(doc.toprettyxml())
+    file_object.close()
+print doc.toprettyxml()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/integration/validate_overlay/generate_vo_conf_ccmgetinput.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+#============================================================================ 
+#Name        : generate_vo_conf_ccmgetinput.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper to convert delivery.xml and prep.xml to VirtualBuildArea
+    configuration file.
+"""
+import vbaconf
+import sys    
+
+deliveryinput = sys.argv[1]
+prepinput = sys.argv[2]
+ofilename = None
+if len(sys.argv)==4:
+    ofilename = sys.argv[3]
+
+conv = vbaconf.ConfigConverter(deliveryinput, prepinput)
+doc = conv.generate_config()
+
+# Generating the output
+if ofilename != None:
+    file_object = open(ofilename, "w")
+    file_object.write(doc.toprettyxml())
+    file_object.close()
+print doc.toprettyxml()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/integration/validate_overlay/validate_overlay.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ivalidate_overlay.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="integration.validate-overlay" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Validation and merging of overlays to resolve conflicts.</description>
+
+    <!-- Validates the overlay and outputs a log file listing any files that need to be merged
+    because a more recent version is present in Synergy. -->
+    <target name="validate-overlay" depends="get-ccm-password,ccm-prepare-input,prep-prepare-input">
+        <fail unless="prep.config.file"/>
+        
+        <delete file="${build.cache.dir}\validate_overlay.html" failonerror="false"/>
+        <delete file="${build.cache.dir}\validate_overlay.xml" failonerror="false"/>
+        <delete file="${build.cache.dir}\validate_overlay.input.xml" failonerror="false"/>
+
+        <!-- Analysing and creating the Virtual Build area configuration -->
+        <preset.exec executable="python" dir="${build.cache.dir}">        
+            <arg file="${helium.dir}/tools/integration/validate_overlay/generate_vo_conf_${ccmgetinput}.py"/>
+            <arg line="${prep.delivery.conf.parsed}"/>
+            <arg line="${prep.config.file.parsed}"/>                         
+            <arg line="${build.cache.dir}/validate_overlay.input.xml"/>
+        </preset.exec>
+        
+        <hlm:python>
+import nokia.nokiaccm
+import sys
+import validateoverlay
+import ant
+import traceback
+session = None
+try:
+    database = ant.get_property(r'${ccm.database}')
+    username = ant.get_property(r'${ccm.user.login}')
+    password = ant.get_property(r'${ccm.user.password}')
+    engine = ant.get_property(r'${ccm.engine.host}')
+    dbpath = ant.get_property(r'${ccm.database.path}')
+    if database != None:
+        session = nokia.nokiaccm.open_session(username, password, database=database)
+    else:
+        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
+
+    objects = validateoverlay.get_additional_delivery_objects(session, ant.get_property(r'${prep.delivery.conf.parsed}'))
+    # overlay validation
+    #validate(session, inputfile, overlaydir, showBranchInfo, createtask=False, releasetag=None, extra_objects=[]):    
+    validateoverlay.validate(session, ant.get_property(r'${build.cache.dir}/validate_overlay.input.xml'), ant.get_property(r'${common.overlay.dir}'), True, False, None, objects, r'${build.cache.dir}\validate_overlay')
+    
+    session.close()
+except Exception, e:
+    print "ERROR: %s" % e
+    print traceback.format_exc()
+    session.close()
+    sys.exit(-1)
+sys.exit(0)
+        </hlm:python>
+        <preset.exec executable="cmd.exe">
+            <!--<arg line="/c ${env.TEMP}\validate_overlay.html"/>-->
+            <arg line="/c ${build.cache.dir}\validate_overlay.html"/>            
+        </preset.exec>        
+    </target>
+    
+    
+    <!-- Creates a task containing merged files. This must be manually reviewed and submitted. -->
+    <target name="merge-overlay" depends="get-ccm-password,ccm-prepare-input,prep-prepare-input">
+        <fail unless="prep.config.file"/>
+        
+        <delete file="${build.cache.dir}\validate_overlay.html" failonerror="false"/>        
+        <delete file="${build.cache.dir}\validate_overlay.xml" failonerror="false"/>        
+        <delete file="${build.cache.dir}\validate_overlay.input.xml" failonerror="false"/>        
+    
+        <!-- Analysing and creating the Virtual Build area configuration -->
+        <preset.exec executable="python" dir="${build.cache.dir}">        
+            <arg file="${helium.dir}/tools/integration/validate_overlay/generate_vo_conf_${ccmgetinput}.py"/>
+            <arg line="${prep.delivery.conf.parsed}"/>
+            <arg line="${prep.config.file.parsed}"/>                         
+            <arg line="${build.cache.dir}/validate_overlay.input.xml"/>                     
+        </preset.exec>
+        <hlm:python>
+import nokia.nokiaccm
+import sys
+import validateoverlay
+import ant
+import traceback
+session = None
+try:
+    database = ant.get_property(r'${ccm.database}')
+    username = ant.get_property(r'${ccm.user.login}')
+    password = ant.get_property(r'${ccm.user.password}')
+    engine = ant.get_property(r'${ccm.engine.host}')
+    dbpath = ant.get_property(r'${ccm.database.path}')
+    if database != None:
+        session = nokia.nokiaccm.open_session(username, password, database=database)
+    else:
+        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
+    objects = validateoverlay.get_additional_delivery_objects(session, ant.get_property(r'${prep.delivery.conf.parsed}'))
+    # overlay validation    
+    validateoverlay.validate(session, ant.get_property(r'${build.cache.dir}/validate_overlay.input.xml'), ant.get_property(r'${common.overlay.dir}'), True, True, 'mc/integration', objects, r'${build.cache.dir}\validate_overlay')    
+    
+    session.close()
+except Exception, e:
+    print "ERROR: %s" % e
+    print traceback.format_exc()
+    sys.exit(-1)
+sys.exit(0)
+        </hlm:python>
+        <preset.exec executable="cmd.exe">            
+            <arg line="/c ${build.cache.dir}\validate_overlay.html"/>            
+        </preset.exec>        
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/create_language_pack.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,121 @@
+#============================================================================ 
+#Name        : create_language_pack.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" MC Localisation Framework
+"""
+import configuration
+import localisation
+import bsf
+import codecs
+import sys
+import escapeddict
+
+class VariantIBYBuilder:
+    """  Create variant_xx.iby
+    """
+    
+    def __init__(self, name, config):
+        self._name = name
+        self._config = escapeddict.EscapedDict(config)
+    
+    def build(self):        
+        bsfs = bsf.read_all()
+        if not bsfs.has_key(self._name):
+            raise Exception("Product not defined, could not find %s.bsf" % self._name)
+        filename = "/epoc32/rom/%s/variant_%s.iby" % (bsfs[self._name].get_path(), self._config['languagepack.id'])
+        print "Generating %s" % filename
+        output = open(filename, "w+")
+        output.write("// DO NOT EDIT - FILE AUTOMATICALLY GENERATED\n")
+        output.write("// MC variant configuration tool (C) Nokia - 2007\n\n")
+        
+        output.write("#ifndef VARIANT_%s_IBY\n" % self._config['languagepack.id'])
+        output.write("#define VARIANT_%s_IBY\n" % self._config['languagepack.id'])
+        
+        for lid in str(self._config['languages']).split(' '):
+            if lid != '':
+                output.write("#include <locales_%s.iby>\n" % lid)
+            
+        output.write("#endif // VARIANT_%s_IBY\n" % self._config['languagepack.id'])
+        output.close()                
+        
+class LanguageTxtBuilder:
+    """  Creates product languages.productname.vid.txt
+    """
+
+    def __init__(self, name, config):
+        self._name = name
+        self._config = escapeddict.EscapedDict(config)
+    
+    def build(self):
+        filename = "/epoc32/data/z/Resource/BootData/languages.%s.%s.txt" % (self._name, self._config['languagepack.id'])
+        print "Generating %s" % filename
+        output = open( filename, "w+b")        
+        output.write(codecs.BOM_UTF16_LE)
+        default = self._config['default']
+        for lid in str(self._config['languages']).split(' '):
+            if lid != '':
+                line = "%s\n" % lid
+                if lid == default:
+                    line = "%s,d\n" % lid
+                output.write(line.encode("utf-16-le"))
+        output.close()
+
+class LangTxtBuilder:
+    """  Creates product lang.productname.vid.txt
+    """
+
+    def __init__(self, name, config):
+        self._name = name
+        self._config = escapeddict.EscapedDict(config)
+    
+    def build(self):        
+        filename = "/epoc32/data/Z/Resource/versions/lang.%s.%s.txt" % (self._name, self._config['languagepack.id'])
+        print "Generating %s" % filename
+        output = open(filename, "w+b")
+        output.write( codecs.BOM_UTF16_LE )
+        output.write(self._config['languagepack.id'].encode("utf-16-le"))
+        output.close()
+
+def main():
+    """ Main function create the whole language pack files.
+        variant_xx.iby
+        languages.pn.vid.iby
+        lang.pn.vid.iby
+    """
+    product = sys.argv[1]
+    configfile = sys.argv[2]
+    
+    
+    try:
+        builder = configuration.NestedConfigurationBuilder(open(configfile, 'r'))
+        config_set = builder.getConfiguration()
+    
+        for variant in config_set.getConfigurations(product):
+            if variant.type == "languagepack":
+                VariantIBYBuilder(product, variant).build()
+                LanguageTxtBuilder(product, variant).build()
+                LangTxtBuilder(product, variant).build()
+    except Exception, exc:
+        print "ERROR: %s" % exc
+        sys.exit(-1)
+    
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/create_variant_cenrep.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,75 @@
+#============================================================================ 
+#Name        : create_variant_cenrep.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" MC Localisation Framework
+    Generate cenrep for all declared variants
+"""
+import configuration
+import bsf
+import localisation
+import sys
+import os
+import shutil
+import re
+
+def main():
+    """ Main function, run customisation tools on all found variants.
+    """
+    if len(sys.argv)<3:
+        print("create_variant_cenrep.py productname configfile.xml type id")
+        sys.exit(-1)
+    
+    product = sys.argv[1]
+    configfile = sys.argv[2]
+    vtype = sys.argv[3]
+    vid = None
+    if len(sys.argv)>4:
+        vid = sys.argv[4]
+
+    try:
+        builder = configuration.NestedConfigurationBuilder(open(configfile, 'r'))
+        config_set = builder.getConfiguration()    
+    
+        bsfs = bsf.read_all()
+        if not bsfs.has_key(product):
+            raise Exception("Product not defined, could not find %s.bsf" % product)
+    
+        for variant in config_set.getConfigurations(product):
+            if variant.type != vtype:
+                continue
+            if vid != None and vid != variant["%s.id" % variant.type]:
+                continue
+            vpath = localisation.find_variant_path(variant, "%s.id" % variant.type)
+            if vpath is not None and os.path.exists(os.path.join(vpath, 'data')):
+                print "Generating Cenrep for %s variant %s in %s" % (variant.type, variant["%s.id" % variant.type], vpath)
+                os.system("perl \\tools\\cenrep_scripts\\CTCenrep.pl -p %s -output %s" % (os.path.basename(vpath), vpath))
+                # os.system("set VARIANTFOLDER=%s & \\s60\\tools\\CustomizationTool\\CustomizationTool.exe generate -%s -%s" % (os.path.dirname(vpath), os.path.splitdrive(os.getcwd())[0], os.path.basename(vpath)))
+                for filename in os.listdir(os.path.join(vpath, 'data')):
+                    result = re.match(r"(.+)_%s.iby" % variant["%s.id" % variant.type], filename)
+                    if result != None:                        
+                        shutil.copyfile(os.path.join(vpath, 'data', filename), os.path.join(vpath, "%s.iby" % result.groups(1)))
+            else:
+                print "Could not find %s variant %s variation path" % (variant.type, variant["%s.id" % variant.type])
+    except IOError, exc:
+        print "ERROR: %s" % exc
+        sys.exit(-1)
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/createlocales.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+#============================================================================ 
+#Name        : createlocales.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" This script generate the locales_xx.iby files. """
+import localisation
+import sys
+
+def main():
+    """ Main function. """
+    product = sys.argv[1]
+    lid = sys.argv[2]
+    extra_args = ""
+    if len(sys.argv)>4:
+        extra_args = " ".join(sys.argv[3:])
+    try:
+        extra_args = r'-include ..\include\oem\feature_settings.hrh -I. -I../../epoc32/rom/include ' + extra_args
+        localisation.create_locales_iby(product, lid, [], '', extra_args)
+    except Exception, exp:
+        print exp
+        sys.exit(-1)
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/deprecated.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,7 @@
+List of deprecated/unsupported scripts:
+ - get_languagepack_id.py (old process)
+ - generate_tutorial_content_conf.py (need a requirement for that)
+ - create_version.py (migrated it as an iMaker feature)
+ - createlocales.py make template should now use iMaker feature to generate the languagepack
+ - create_version.py make template should now use iMaker feature that handle version string generation
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/get_product_path.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+#============================================================================ 
+#Name        : get_product_path.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" return path for product from bsf data
+"""
+import bsf
+import sys
+
+def main():
+    """ Main
+    """
+    product = sys.argv[1]
+    
+    bsfs = bsf.read_all()
+    print bsfs[product].get_path()
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/get_product_platform.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+#============================================================================ 
+#Name        : get_product_platform.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" return path for product from bsf data
+"""
+import bsf
+import sys
+
+def main():
+    """ Main
+    """
+    product = sys.argv[1]
+    
+    bsfs = bsf.read_all()
+    parents = bsfs[product].get_path_as_array()
+    if len(parents) > 1:
+        print parents[1]
+        sys.exit(0) 
+    sys.exit(-1)
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/get_variant_dirs.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+#============================================================================ 
+#Name        : get_variant_dirs.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Script that return the  list of variant directory to include. """
+import configuration
+import bsf
+import localisation
+import codecs
+import sys
+import os
+import re
+import shutil
+
+def get_hierarchy(config):
+    """ return the variant hierarchy. """
+    result = [config]  
+    while (config.parent != None):
+        if (config.parent.parent != None):
+            result.append(config.parent)
+        config = config.parent
+    return result
+
+def clean_array(array):
+    """ Remove all None element from an array. """
+    result = []
+    for item in array:
+        if item != None:
+            result.append(item)
+    return result
+
+def main():
+    """ Main function. """
+    configfile = sys.argv[1]
+    product = sys.argv[2]
+    vid = sys.argv[3]
+    vtype = sys.argv[4]
+    vkey = sys.argv[5]
+    try:
+        builder = configuration.NestedConfigurationBuilder(open(configfile, 'r'))
+        config_set = builder.getConfiguration()
+    
+        bsfs = bsf.read_all()
+        if not bsfs.has_key(product):
+            raise Exception("Product not defined, could not find %s.bsf" % product)
+    
+        for variant in config_set.getConfigurations(product):
+            if not (variant.type == vtype):
+                continue
+            if not variant.has_key(vkey):
+                continue
+            if (vid != variant[vkey]):
+                continue
+            print " ".join(clean_array(map(lambda x:localisation.find_variant_path(x, "%s.id" % x.type), get_hierarchy(variant))))
+            sys.exit(0)
+           
+    except IOError, exc:
+        print "ERROR: %s" % exc
+        sys.exit(-1)
+    
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/getalllanguages.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#============================================================================ 
+#Name        : getalllanguages.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" print all available language for a specific variation 
+"""
+import localisation
+import sys
+print " ".join(localisation.get_languages_for_variation(sys.argv[1], sys.argv[2]))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/getallvariantion.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#============================================================================ 
+#Name        : getallvariantion.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" get all available variation
+"""
+import localisation
+import sys
+print ",".join(localisation.get_all_variations(sys.argv[1]))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/helps/generate_iby_32.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+# Configuration side
+#
+##
+# Defines the list of product variants we should generate the IBY for.
+# productname_IBYFILE must be defined
+# productname_TAG could be defined
+PRODUCT_VARIANTS?=
+##
+# Defines where to export the help delivery, could be empty if referencing from the
+# project location
+TARGET_PATH?=
+
+#
+# Internal implementation
+#
+define BUILDER
+@echo Generating $1 $(if $2,destination is $2) $(if $3,using tag $3)  $(if $4,excludes [$4])
+@echo -- Running python $(HELIUM_HOME)/tools/localisation/helps/generate_iby_32.py --output=$1 $(if $2,--rootdest=$2) $(if $3,--tag=$3) $(foreach exc,$4,--exclude=$(exc))
+python $(HELIUM_HOME)/tools/localisation/helps/generate_iby_32.py --output=$1 $(if $2,--rootdest=$2) $(if $3,--tag=$3) $(foreach exc,$4,--exclude=$(exc))
+
+endef
+
+BLD:
+	@echo Helium home: $(HELIUM_HOME)
+	$(if $(TARGET_PATH),perl -MExtUtils::Command -e mkpath $(TARGET_PATH))
+	$(if $(TARGET_PATH),xcopy  /E /R /Y /F ..\data $(TARGET_PATH))
+	$(foreach product,$(PRODUCT_VARIANTS),$(call BUILDER,$($(product)_IBYFILE),$(TARGET_PATH),$($(product)_TAG),$($(product)_EXCLUDES)))
+
+RELEASABLES:
+	@echo $(foreach product,$(PRODUCT_VARIANTS),$($(product)_IBYFILE))	
+
+SAVESPACE: BLD
+
+LIB: do_nothing
+MAKMAKE: do_nothing
+FINAL: do_nothing
+FREEZE: do_nothing
+RESOURCE: do_nothing
+
+
+do_nothing:
+	@echo Nothing to do
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/helps/generate_iby_32.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,180 @@
+#============================================================================ 
+#Name        : generate_iby_32.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Helper script to generate S60 3.2 help IBY.
+"""
+import os
+import sys
+import re
+import optparse
+import logging
+import pathaddition.match
+
+logging.basicConfig()
+logger = logging.getLogger('integration.help32')
+logger.setLevel(logging.INFO)
+
+# Adding hiddenness testing function.
+try:
+    import win32api
+    import win32con
+    USE_WIN32 = 1
+except:
+    USE_WIN32 = 0
+
+def is_hidden(filename):
+    """ Return True if a file is hidden, False otherwise. """
+    if USE_WIN32:
+        try:            
+            if bool(win32api.GetFileAttributes(filename) & win32con.FILE_ATTRIBUTE_HIDDEN):
+                return True
+        except Exception, e:
+            logger.error(e)    
+    else:
+        if filename[0] == '.':
+            return True
+    return False
+
+class Basket:
+    """
+        This class represents a basket which will contains the list of files
+        that will be added the the IBY.
+    """
+    def __init__(self, rootdir, tag='', excludes=None):
+        if excludes is None:
+            excludes = []
+        self.rootdir = rootdir
+        self.common = []
+        self.language = {}
+        self.tag = tag
+        self.excludes = excludes
+        self.content_scanner(rootdir)
+
+    def add_content(self, filename, language):
+        """ Add a file to the basket. """
+        if language == None:
+            self.common.append(filename)            
+        else:
+            if not self.language.has_key(language):
+                self.language[language] = []
+            self.language[language].append(filename)            
+
+    def content_scanner(self, rootdir, path="", language=None):
+        """ Parse the help delivery to get content. """
+        for name in os.listdir(rootdir):
+            abspath = os.path.abspath(os.path.join(rootdir, name))
+            # Skipping hidden file and folders.
+            if is_hidden(abspath):
+                continue
+            if name.startswith('.'):
+                continue
+            if os.path.isdir(abspath):
+                logger.debug("Analysing directory: %s" % abspath)
+                # only check language if it not yet found, found something that start with numbers
+                if  language == None and re.match(r'^\d+', name) != None:
+                    result = re.match(r'^(\d+)(?:%s)?$' % self.tag, name, re.I)
+                    if result != None:
+                        logger.debug("Language directory detected: %s" % name)
+                        self.content_scanner(abspath, os.path.join(path, name), result.group(1))                        
+                    else:
+                        logger.info("Prunning %s directory, because it doesn't match %s tag." % (name, self.tag))
+                elif language == None:
+                    logger.debug("Directory considered a languageless %s" % name)
+                    self.content_scanner(abspath, os.path.join(path, name))
+                
+                elif language != None:
+                    logger.debug("Adding directory %s to %s language" % (name, language))
+                    self.content_scanner(abspath, os.path.join(path, name), language)
+            else:
+                if not self.__is_excluded(os.path.join(path, name)):
+                    logger.debug("Adding file %s to %s language" % (name, language))
+                    self.add_content(os.path.join(path, name), language)
+                else:
+                    logger.info("Excluding file %s" % (os.path.join(path, name)))
+                    
+    
+    def __is_excluded(self, filename):
+        for exc in self.excludes:
+            if pathaddition.match.ant_match(filename, exc, False):
+                return True
+        return False
+
+    def generate_iby(self, ibyfilename, rootdest=None):
+        """ Generates the IBY that should be included by the rom image creation process. """
+        if rootdest == None:
+            rootdest = self.rootdir
+        out = open(ibyfilename, "w")
+        out.write("// Generated file please DO NOT MODIFY!\n")
+        out.write("#ifndef __PRODUCT_HELPS__\n")
+        out.write("#define __PRODUCT_HELPS__\n\n")        
+        out.write("\n//Common content.\n")
+        for filename in self.common:
+            out.write("data=%s RESOURCE_FILES_DIR\\%s\n" % (os.path.join(rootdest, filename), filename))
+        out.write("\n//Language specific content.\n")
+        for language in self.language.keys():
+            # support EE language
+            cond = ""
+            if language == "01":
+                cond = " || defined(__LOCALES_SC_IBY__)"
+                            
+            out.write("#if defined(__LOCALES_%s_IBY__)%s\n" % (language, cond))
+            regex = re.compile(r"^(.*[\\/])?%s%s([\\/])" % (language, self.tag), re.I)
+            for filename in self.language[language]:                
+                destfilename = regex.sub(r"\g<1>%s\g<2>" % language, filename, 1)                
+                out.write("data=%s RESOURCE_FILES_DIR\\%s\n" % (os.path.join(rootdest, filename), destfilename))
+            out.write("#endif // defined(__LOCALES_%s_IBY__)%s\n\n" % (language, cond))
+        out.write("#endif // __PRODUCT_HELPS__\n")
+
+def main():
+    """ Application entry point. """
+    parser = optparse.OptionParser()
+    parser.add_option("-o", "--output", dest="output",
+                      help="Output filename", metavar="OUTPUT")
+    parser.add_option("--rootdest", dest="rootdest",
+                     help="Root destintation directory", metavar="ROOTDEST")
+    parser.add_option("-t", "--tag", dest="tag",                      
+                      help="Tag", metavar="TAG")
+    parser.add_option("-e", "--exclude", dest="excludes", action="append",                      
+                      help="Exclude pattern", metavar="EXCLUDES")
+
+    options = parser.parse_args()[0]
+    logger.info("Setting output to '%s'" % options.output)
+    ibyfilename = options.output
+    
+    rootdest = None
+    if options.rootdest != None:
+        logger.info("Setting rootdest to '%s'" % options.rootdest)
+        rootdest = options.rootdest    
+    
+    tag = ''
+    if options.tag != None:
+        logger.info("Setting tag to '%s'" % options.tag)
+        tag = options.tag
+
+    excludes = []
+    if options.excludes != None:
+        excludes = options.excludes
+    logger.info("Exclude patterns: [%s]" % (", ".join(excludes)))
+
+    datadir = os.path.splitdrive(os.path.abspath("../data"))[1]
+    basket = Basket(datadir, tag, excludes=excludes)
+    basket.generate_iby(ibyfilename, rootdest)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/helps/template/bld.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Help related files are exported by this file.
+*
+*/
+
+
+PRJ_EXPORTS
+// Your exports!
+
+
+PRJ_MMPFILES
+
+// generation of the ibys
+gnumakefile generate_iby.mk
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/helps/template/generate_iby.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+# Include Helium helpers to support iby generation for helps
+PRODUCT_VARIANTS=PRODUCT PRODUCT_edge
+
+# PRODUCT config
+PRODUCT_IBYFILE=\epoc32\rom\config\PLATFORM\PRODUCT\help.iby 
+PRODUCT_TAG=_3g 
+
+# PRODUCT edge config
+PRODUCT_edge_IBYFILE=\epoc32\rom\config\PLATFORM\PRODUCT_edge\help.iby
+PRODUCT_edge_TAG=_2g
+
+# Includes tools part.
+include $(HELIUM_HOME)/tools/localisation/helps/generate_iby_32.mk
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/helps/template/readme.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,9 @@
+Helium IBY generator helper
+---------------------------
+
+This template is an example of how to integrate that helper into a product help delivery for 3.2 products.
+It relies on the following
+ * PRODUCT_VARIANTS variable defined as a list product variant for the help delivery. (e.g. PRODUCT and PRODUCT_edge)
+ * productname_IBYFILE defines where to generate the iby file for productname
+ * productname_TAG defines what type to use for this product variant type.
+ * HELIUM_HOME to be defined
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/localisation-32.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,486 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : localisation-32.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="localisation-32" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+      S60 3.2 localisation.
+    </description>
+
+    <!-- Should be overriden in team configuration! -->
+    <!--<property name="localisation.tool" value="localisation-s60-localise" />-->
+    <property name="localisation.tool" value="localise-resources" />
+    <property name="parse_abld_what.tool" location="${build.drive}\s60\tools\build_platforms\build\tools\parse_what_log.pl" />
+    <property name="ctool.dir" location="${build.drive}/s60/tools/toolsextensions/ConfigurationTool" />
+    <property name="ctool.western.conf" value="-master_conf s60 -impl \epoc32\rom\config\confml_data\s60 -confml \epoc32\rom\config\confml_data\s60" />
+    <property name="ctool.china.conf" value="-master_conf china -impl \epoc32\rom\config\confml_data\s60 -confml \epoc32\rom\config\confml_data\${ctool.region.china}" />
+    <property name="ctool.japan.conf" value="-master_conf japan -impl \epoc32\rom\config\confml_data\s60 -confml \epoc32\rom\config\confml_data\${ctool.region.japan}" />
+
+    <property name="localisation.buildfile" value="isis" />
+    <property name="s60.delta.config.prefix" value="S60_variant_"/>
+
+
+    <!--<property name="localisation.variation" value="western" />-->
+
+    <property name="localisation.language.file" location="${build.drive}/epoc32/tools/s60tools/languages.xml" />
+    <property name="localisation.s60locfiles.dir" location="${build.drive}/s60/misc/release/s60locfiles" />
+    <property name="localisation.makefile.target" value="variants" />
+    <property name="customer.makefile.target" value="customer_variants" />
+
+    
+    <!-- Additional input file per region -->
+    <property name="localisation.files.western" value="" />
+    <property name="localisation.files.china" value="" />
+    <property name="localisation.files.japan" value="" />
+    
+    <!-- ctool translation -->
+    <property name="ctool.region.china" value="apac"/>
+    
+    <!-- The createDeltaZipMacro enables to create regional variant like china and japan.
+    e.g:
+         <pre><hlm:createDeltaZipMacro variant="china" type="armv5" ctool="true"/></pre>
+    -->
+    <macrodef name="createDeltaZipMacro" uri="http://www.nokia.com/helium">
+        <attribute name="variant"/>
+        <attribute name="type" default=""/>
+        <attribute name="ctool" default="false"/>
+        <attribute name="force" default="false"/>
+        <sequential>
+            <mkdir dir="${build.log.dir}"/>
+            <if>
+                <and>
+                    <available file="${zips.loc.dir}/delta_@{variant}_package.zip" />
+                    <isfalse value="@{force}"/>
+                </and>                    
+                <then>
+                    <echo>Unzipping ${zips.loc.dir}/delta_@{variant}_package.zip</echo>
+                    <unzip src="${zips.loc.dir}/delta_@{variant}_package.zip" dest="${build.drive}/" overwrite="true" />
+                </then>
+                <else>
+                    <if>
+                        <equals arg1="@{type}" arg2=""/>
+                        <then>
+                            <var name="internal.variant.type" value="@{type}"/>
+                        </then>
+                        <else>
+                            <var name="internal.variant.type" value="_@{type}"/>
+                        </else>
+                    </if>
+                    <echo>Generating ${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml</echo>
+                    <hlm:compileGenxmlMacro input="-x ${canonical.sysdef.file}"
+                                          configuration="${s60.delta.config.prefix}@{variant}${internal.variant.type}"
+                                          output="${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml"
+                                          log="${build.log.dir}/${build.id}.variant_build_@{variant}${internal.variant.type}_genxml.log"/>
+
+                    <echo>Building ${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml</echo>
+                    <hlm:compileEbsMacro input="${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml" log="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log" />
+                    <hlm:compileHtmlscanlogMacro input="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log" output="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_scan2.html" />
+                    
+                    <if>
+                        <istrue value="@{ctool}"/>
+                        <then>
+                            <property name="ctool.region.@{variant}" value="@{variant}"/>
+                            <echo>Region ctool: ${ctool.region.@{variant}} (@{variant}).</echo>
+                            <preset.exec executable="cmd" dir="${ctool.dir}/" failonerror="true" output="${build.log.dir}/${build.id}.configtool_@{variant}_log.txt">
+                                <arg line="/c cli_build.cmd ${ctool.@{variant}.conf} -report ${build.log.dir}/${build.id}.configtool_@{variant}_delta.txt -ignore_errors"/>
+                            </preset.exec>
+                        </then>
+                    </if>
+                    <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
+                        <arg value="${parse_abld_what.tool}"/>
+                        <arg line="-i ${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_@{variant}_package -ex productvariant.hrh"/>
+                    </preset.exec>
+                    <if>
+                        <istrue value="@{ctool}"/>
+                        <then>
+                            <preset.exec executable="${build.drive}\epoc32\tools\zip.exe" dir="${build.drive}/" input="${build.log.dir}/${build.id}.configtool_@{variant}_delta.txt">
+                                <arg line="-r -u ${zips.loc.dir}/delta_@{variant}_package -@"/>
+                            </preset.exec>
+                        </then>
+                    </if>
+                    <var name="internal.variant.type" unset="true"/>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+
+
+    <!-- The createDeltaWesternZipMacro enables to create western regional variant
+    e.g: build western variation using the results from S60_postbuild config
+         and enabling configuration tool support.
+         <pre><hlm:createDeltaWesternZipMacro configs="S60_postbuild" ctool="true"/></pre>
+    -->
+    <macrodef name="createDeltaWesternZipMacro"  uri="http://www.nokia.com/helium">
+        <attribute name="configs"/>
+        <attribute name="ctool" default="false"/>
+        <sequential>
+            <mkdir dir="${zips.loc.dir}"/>
+            <for list="@{configs}" delimiter="," param="conf" >
+                <sequential>
+                    <if>
+                        <istrue value="@{ctool}"/>
+                        <then>
+                            <preset.exec executable="cmd" dir="${ctool.dir}/" failonerror="true" output="${build.log.dir}/${build.id}.configtool_western_log.txt">
+                                <arg line="/c cli_build.cmd ${ctool.western.conf} -report ${build.log.dir}/${build.id}.configtool_western_delta.txt -ignore_errors"/>
+                            </preset.exec>
+                        </then>
+                    </if>
+                    <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
+                        <arg value="${parse_abld_what.tool}"/>
+                        <arg line="-i ${build.log.dir}/${build.id}.@{conf}_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_western_package -ex productvariant.hrh"/>
+                    </preset.exec>
+                    <if>
+                        <istrue value="@{ctool}"/>
+                        <then>
+                            <preset.exec executable="${build.drive}\epoc32\tools\zip.exe" dir="${build.drive}/" input="${build.log.dir}/${build.id}.configtool_western_delta.txt">
+                                <arg line="-r -u ${zips.loc.dir}/delta_western_package -@"/>
+                            </preset.exec>
+                        </then>
+                    </if>
+                </sequential>
+            </for>
+        </sequential>
+    </macrodef>
+
+    <!--
+        Target to be run after the compile-main to zipup western variation.
+        <deprecated>Please consider using binary variation to solve that problem.</deprecated>
+    -->
+    <target name="localisation-postbuild-western">
+        <mkdir dir="${zips.loc.dir}"/>
+
+        <antcall target="compile-main">
+            <param name="sysdef.configurations.list" value="S60_bldmelast" />
+        </antcall>
+
+        <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
+            <arg value="${parse_abld_what.tool}"/>
+            <arg line="-i ${build.log.dir}/${build.id}.S60_bldmelast_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_western_package -ex productvariant.hrh"/>
+        </preset.exec>
+        <copy file="${build.drive}\epoc32\release\ARMV5\urel\elocl.dll" tofile="${build.drive}\epoc32\release\ARMV5\urel\elocl.01" />
+        <copy file="${build.drive}\epoc32\release\ARMV5\udeb\elocl.dll" tofile="${build.drive}\epoc32\release\ARMV5\udeb\elocl.01" />
+    </target>
+
+
+    <!--
+        This targe generate the language pack related files using informations from the XML configuration file.
+        The generated files are:
+            * languages.[product].[langid].txt
+            * lang.[product].[langid].txt
+            * /epoc32/rom/config/[platform]/.../[product]/variant_[langid].iby
+        <deprecated>This feature is now supported by iMaker, please update your  Makefile templates to migrate the language data from XML.</deprecated>
+    -->
+    <target name="localisation-create-languagepack" depends="rombuild-prepare-input">
+        <for list="${product.list}" delimiter="," param="product.name" >
+            <sequential>
+                <echo>Language Pack configuration for @{product.name}</echo>
+                <exec executable="python" dir="${build.drive}/" failonerror="${failonerror}">                    
+                    <arg line="${helium.dir}/tools/localisation/create_language_pack.py @{product.name} ${rombuild.config.file.parsed}"/>
+                </exec>        
+            </sequential>
+        </for>    
+    </target>
+
+    <!--
+        Developement target that generated the languages.mk using the information from
+        the languages.xml file provided by S60.
+        <deprecated>Those information will be generated throught Carbon.</deprecated>
+    -->
+    <target name="localisation-create-system-languages-mk">
+        <echo>Generating ${build.drive}/epoc32/rom/config/language/system_languages.mk</echo>
+        <mkdir dir="${build.drive}/epoc32/rom/config/language"/>
+        <hlm:python>
+""" Create a makefile that contains all languages.  """
+import localisation
+import sys
+import ant
+            
+languages = localisation.Languages(ant.get_property(r'${localisation.language.file}'))
+output = open(ant.get_property(r'${build.drive}')+r'\epoc32\rom\config\language\system_languages.mk', "w+")
+
+output.write("############################################\n")
+output.write("# DO NOT EDIT - File generated by Helium\n")
+output.write("############################################\n")
+output.write("system_languages\t\t\t\t=\\\n")
+lids = languages.get_language_ids()
+lids.sort()
+lids.reverse()
+while len(lids)>0:
+    lid = lids.pop()
+    endofline = "\\"
+    if (len(lids)==0):
+        endofline = ""
+    output.write ("%s\t\t\t\t%s %s" % (languages.get_name(lid), lid, endofline))
+    output.write("\n")
+output.close()
+    </hlm:python>
+    </target>
+
+    <!--
+        This target run the generation of cenrep variation on language pack and customer variants configuration folders.
+        <deprecated>S60 3.2 only for 3.2.3 use iMaker</deprecated>
+    -->
+    <target name="localisation-create-cenrep" depends="localisation-create-language-cenrep,localisation-create-customer-cenrep"/>
+
+    <!--
+        This target run the generation of cenrep variation on language pack configuration folders.
+        <deprecated>S60 3.2 only for 3.2.3 use iMaker</deprecated>
+    -->
+    <target name="localisation-create-language-cenrep" depends="rombuild-prepare-input">
+        <for list="${product.list}" delimiter="," param="product.name" >
+            <sequential>
+                <echo>Cenrep generation for @{product.name} languagepack</echo>
+                <exec executable="python" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg line="${helium.dir}/tools/localisation/create_variant_cenrep.py @{product.name} ${rombuild.config.file.parsed} languagepack"/>
+                </exec>
+            </sequential>
+        </for>
+    </target>
+
+    <!--
+        This target run the generation of cenrep variation on customer variants configuration folders.
+        <deprecated>S60 3.2 only for 3.2.3 use iMaker</deprecated>
+    -->
+    <target name="localisation-create-customer-cenrep" depends="rombuild-prepare-input">
+        <for list="${product.list}" delimiter="," param="product.name" >
+            <sequential>
+                <echo>Cenrep generation for @{product.name} customer variant</echo>
+                <exec executable="python" dir="${build.drive}/" failonerror="${failonerror}">                    
+                    <arg line="${helium.dir}/tools/localisation/create_variant_cenrep.py @{product.name} ${rombuild.config.file.parsed} customer"/>
+                </exec>        
+            </sequential>
+        </for>    
+    </target>
+    
+    <!-- Localisation configuration -->
+    <target name="localisation-create-config">
+        <record name="${build.log.dir}/${build.id}_localisation_config.log" action="start"/>
+        <antcall target="localisation-create-languagepack" />
+        <antcall target="localisation-create-cenrep" />
+        <copy file="${helium.dir}/tools/localisation/templates/rom/mc_variant_imaker.oby" todir="${build.drive}/epoc32/rom"/>
+        <record name="${build.log.dir}/${build.id}_localisation_config.log" action="stop"/>
+    </target>
+
+    <!-- Localise resources using either EC / EBS based on build system type-->
+    <target name="localise-resources">
+        <copy file="${helium.dir}/tools/localisation/localiser/isis_EClocaliser.pl" todir="${build.drive}/epoc32/tools"/>
+        <copy file="${helium.dir}/tools/localisation/localiser/ECLocaliser.pm" todir="${build.drive}/epoc32/tools"/>
+        <propertycopy name="localisation.files.region" from="localisation.files.${localisation.region}" />
+        <property name="isis_mktarget.list" value="${localisation.region}_${localisation.buildfile},${localisation.region}_${localisation.buildfile}_what,${localisation.region}_${localisation.buildfile}_check"/>
+        <if>
+            <equals arg1="${build.system}" arg2="ec-helium" />
+            <then>
+                <!-- localisation build for EC -->
+                <echo message="isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -b=${localisation.region}_${localisation.buildfile} --ecbuild -state=0 -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -h" />
+                <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg line="${build.drive}/epoc32/tools/isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -state=0 -b=${localisation.region}_${localisation.buildfile} --ecbuild -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -nolocal -k"/>
+                </exec>
+                <antcall target="localisation-emake"/>
+            </then>
+            <else>
+                <!-- localisation build for TBS -->
+                <echo message="isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -b=${localisation.region}_${localisation.buildfile} --noecbuild -state=0 -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -h" />
+                <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg line="${build.drive}/epoc32/tools/isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -state=0 -b=${localisation.region}_${localisation.buildfile} --noecbuild -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -nolocal -k"/>
+                </exec>
+                <antcall target="localisation-ebs"/>
+            </else>
+        </if>        
+        <!-- localisation build cleanup -->
+        <echo message="isis_EClocaliser.pl -b=${localisation.region}_${localisation.buildfile} -state=2 -dest=&quot;${zips.loc.dir}&quot; -h" />
+        <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+            <arg line="${build.drive}/epoc32/tools/isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -b=${build.log.dir}/${build.id}.${localisation.region}_${localisation.buildfile} -state=2 -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -nolocal -k"/>
+        </exec>
+    </target>
+
+
+    <!-- Localise resources using EBS-->
+    <target name="localisation-ebs" if="build.system.ebs" depends="set-arm-version" >
+        <for list="${isis_mktarget.list}" delimiter="," param="mktarget">
+            <sequential>
+                <antcall target="compile-ebs">
+                    <param name="sysdef.configuration" value="@{mktarget}"/>
+                    <param name="genxml.output.file" location="${build.drive}/@{mktarget}.xml"/>
+                </antcall>
+                <!-- <echo message="isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -b=${localisation.region}_${localisation.buildfile} -state=1 -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -h" />
+                <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg line="${build.drive}/epoc32/tools/isis_EClocaliser.pl -b=${localisation.region}_${localisation.buildfile} -state=1 -dest=&quot;${zips.loc.dir}&quot; -k"/>
+                </exec>
+                -->
+            </sequential>
+        </for>
+    </target>
+
+
+    <!-- Localise resources using EC-->
+    <target name="localisation-emake" if="build.system.ec-helium" depends="set-arm-version" >
+        <propertycopy name="localisation.files.region" from="localisation.files.${localisation.region}" />
+        <for list="${isis_mktarget.list}" delimiter="," param="mktarget">
+            <sequential>
+                <hlm:recordStartMacro name="@{mktarget}.log" emacsmode="true"/>
+                <hlm:emakeMacro name="localisation" makefile="${build.drive}/${localisation.region}_${localisation.buildfile}.make" target="@{mktarget}" dir="${build.drive}/" annodetail="basic,history,file,waiting"/>
+                <hlm:recordStopMacro name="@{mktarget}.log"/>
+            </sequential>
+        </for>
+    </target>
+
+
+    <!-- S60 localiser tool -->
+    <target name="localisation-s60-localiser">
+        <propertycopy name="localisation.files.region" from="localisation.files.${localisation.region}" />
+        <echo message="s60Localiser.pl ${localisation.files} ${localisation.files.region} -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot;" />
+        <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+            <arg line="${build.drive}/epoc32/tools/s60Localiser.pl ${localisation.files} ${localisation.files.region} -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot;"/>
+        </exec>    
+    </target>
+    
+    
+    <!-- Build localised content -->
+    <target name="localisation-build" depends="rombuild-prepare-input">
+        <record name="${build.log.dir}/${build.id}_localisation_build.log" action="start"/>
+        <copy file="${parse_abld_what.tool}" todir="${build.drive}/epoc32/tools/s60tools" failonerror="false"/>
+        <mkdir dir="${zips.loc.dir}"/>    
+        
+        <!-- get all variation available -->    
+        <exec executable="python" outputproperty="localisation.variation" dir="${build.drive}/" failonerror="${failonerror}">
+            <arg line="${helium.dir}/tools/localisation/getallvariantion.py ${localisation.language.file}"/> 
+        </exec>
+
+        <!-- get all variation available -->    
+        <echo>We will create zip variation for ${localisation.variation}</echo>
+        <for list="${localisation.variation}" delimiter="," param="variant">
+            <sequential>    
+                <hlm:createDeltaZipMacro variant="@{variant}" />
+                <!-- getting all languages to localise -->
+                <var name="localisation.languages" unset="true"/>
+                <exec executable="python" outputproperty="localisation.languages" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg line="${helium.dir}/tools/localisation/getalllanguages.py ${localisation.language.file} @{variant}"/> 
+                </exec>
+                
+                <echo>Localising ${localisation.languages}</echo>
+                <propertyregex property="localisation.log" input="${build.log.dir}/localisation_${localisation.languages}.html" regexp="\s+" replace="_" override="true"/>
+                <echo>Localising using ${localisation.tool}.</echo>
+                <antcall target="${localisation.tool}">
+                    <param name="localisation.region" value="@{variant}"/>
+                </antcall>
+                
+                <for list="${product.list}" delimiter="," param="product.name" >
+                    <sequential>
+                        <for list="${localisation.languages}" delimiter=" " param="lid" >
+                            <sequential>
+                                <exec executable="python" dir="${build.drive}/epoc32/rom" failonerror="${failonerror}">
+                                    <arg line="${helium.dir}/tools/localisation/createlocales.py @{product.name} @{lid} -include Override.oby"/> 
+                                </exec>
+                            </sequential>
+                        </for>
+                    </sequential>
+                </for>
+            </sequential>
+        </for>
+        <record name="${build.log.dir}/${build.id}_localisation_build.log" action="stop"/>
+    </target>
+    
+    
+    <!--
+        Target to rebuild locales 
+        This could be useful for incremental changes/test.
+    -->
+    <target name="localisation-create-locales"> 
+        <record name="${build.log.dir}/${build.id}_create_locales.log" action="start"/>
+        
+        <!-- get all variation available -->    
+        <exec executable="python" outputproperty="localisation.variation" dir="${build.drive}/" failonerror="${failonerror}">
+            <arg line="${helium.dir}/tools/localisation/getallvariantion.py ${localisation.language.file}"/> 
+        </exec>
+                
+        <!-- get all variation available -->    
+        <echo>We will create zip variation for ${localisation.variation}</echo>
+        <for list="${localisation.variation}" delimiter="," param="variant">
+            <sequential>
+                <hlm:createDeltaZipMacro variant="@{variant}" />
+                <!-- getting all languages to localise -->
+                <var name="localisation.languages" unset="true"/>
+                <exec executable="python" outputproperty="localisation.languages" dir="${build.drive}/" failonerror="${failonerror}">
+                    <arg line="${helium.dir}/tools/localisation/getalllanguages.py ${localisation.language.file} @{variant}"/> 
+                </exec>
+           
+                <for list="${product.list}" delimiter="," param="product.name" >
+                    <sequential>
+                        <for list="${localisation.languages}" delimiter=" " param="lid" >
+                            <sequential>
+                                <exec executable="python" dir="${build.drive}/epoc32/rom" failonerror="${failonerror}">
+                                    <arg line="${helium.dir}/tools/localisation/createlocales.py @{product.name} @{lid} -include Override.oby"/> 
+                                </exec>
+                            </sequential>
+                        </for>
+                    </sequential>
+                </for>
+            </sequential>
+        </for>
+        <record name="${build.log.dir}/${build.id}_create_locales.log" action="stop"/>
+    </target>    
+
+    
+    <!-- Creates localised rom images -->
+    <target name="localisation-roms" depends="rombuild-create-makefile,flash-config-file"> 
+        <!-- get product path -->
+        <record name="${build.log.dir}/${build.id}_localisation_roms.log" action="start"/>
+        <hlm:preECImakerMacro/>
+        <for list="${product.list}" delimiter="," param="product.name" >
+            <sequential>
+                <hlm:rombuildImakerMacro product="@{product.name}" target="${localisation.makefile.target}" />
+            </sequential>
+        </for>
+        <hlm:ecImakerMacro makefile.target="${localisation.makefile.target}" />
+        <record name="${build.log.dir}/${build.id}_localisation_roms.log" action="stop"/>
+        <hlm:logextract file="${build.log.dir}/${build.id}_localisation_roms.log"/>
+    </target>
+
+    
+    <!-- Creates customer rom images -->
+    <target name="customer-roms" depends="rombuild-create-makefile,flash-config-file"> 
+        <!-- get product path -->
+        <record name="${build.log.dir}/${build.id}_customer_roms.log" action="start"/>
+        <hlm:preECImakerMacro/>
+        <for list="${product.list}" delimiter="," param="product.name" >
+            <sequential>
+                <hlm:rombuildImakerMacro product="@{product.name}" target="${customer.makefile.target}" />
+            </sequential>
+        </for>
+        <hlm:ecImakerMacro makefile.target="${customer.makefile.target}" />
+        <record name="${build.log.dir}/${build.id}_customer_roms.log" action="stop"/>
+        <hlm:logextract file="${build.log.dir}/${build.id}_customer_roms.log"/>
+    </target>
+
+    
+    <!-- Runs localisation for product builds.
+    
+    Creates:
+    * Localisation configuration
+    * Build localised content
+    * Localised rom images
+    
+     -->
+    <target name="localisation" depends="localisation-create-config,precompile-ec,localisation-build,localisation-roms"> 
+        <antcall target="postcompile-ec"/>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/localisation-50.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : localisation-50.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="localisation-50">
+    <description>
+        S60 5.0+ localisation.
+    </description>
+
+    <!-- Main target for 5.0 build localisation process. -->
+    <target name="localisation-50-build" depends="localisation-switch-loc-generator,localisation-dtd"/> 
+   
+    <!-- 
+            This target launch the localisation of DTD files. 
+            This is handled by the DTDLocaliser.pl script from S60.  
+    --> 
+    <target name="localisation-dtd"> 
+        <exec dir="${build.drive}/" executable="perl.exe" failonerror="false"> 
+            <arg value="${build.drive}/epoc32/tools/DTDLocaliser.pl"/> 
+            <arg value="-l"/> 
+            <arg value="${build.log.dir}/${build.id}.dtd_localisation.log}"/> 
+        </exec> 
+    </target> 
+     
+     
+    <!-- 
+            This target launch the switch_loc_generator (for 5.0 build only). 
+    --> 
+    <target name="localisation-switch-loc-generator"> 
+        <exec dir="${build.drive}/" executable="perl.exe" failonerror="false"> 
+            <arg line="${build.drive}/epoc32/tools/switch_loc_generator.pl"/> 
+        </exec> 
+    </target> 
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/localisation.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : localisation.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="localisation">
+
+    <import file="localisation-50.ant.xml" />
+    <import file="localisation-32.ant.xml" />
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/localiser/ECLocaliser.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1957 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#------------------------------------------------------------------------------
+# Name   : Localiser.pm
+# Use    : Implementation of a new localisation process.
+
+#
+# Version History :
+#
+# v1.1.2 (30/01/2008) : Valliappan Ramanathan - ISIS
+#  - Updated to build with EC build
+
+#
+# v1.1.1 (04/08/2006) :
+#  - Update include management, now it uses cpp.
+#
+# v1.1.0 (12/05/2006) :
+#  - Corrected include parsing, remove that fact that file must start with \
+#  - Added locales_xx.iby creation
+#
+# v1.0.1 (12/05/2006) :
+#  - Corrected __MakeRlt function
+#
+# v1.0 (19/04/2006) :
+#  - First version of the script.
+#------------------------------------------------------------------------------
+
+## @ file
+#
+
+#------------------------------------------------------------------------------
+# Package __OUT
+#------------------------------------------------------------------------------
+package __OUT;
+use strict;
+
+my $outputer = "__OUT";
+
+sub SetLoggerPackage
+{
+	my ($p) = shift;
+	return unless($p);
+	$outputer = $p;
+}
+
+sub AUTOLOAD
+{
+	my ($method) = (our $AUTOLOAD);	
+	if ( $outputer eq "__OUT" )
+	{
+		$method =~ s/^__OUT:://;
+		if ($method =~ /print/i)
+		{
+			print ("@_");
+		}
+		elsif ($method =~ /die/i)
+		{
+			die (@_);
+		}
+		else
+		{
+			print (uc($method).": @_");
+		}
+	}
+	elsif ( defined ($outputer) and defined($method) )
+	{
+		print "@_\n" if ($method =~ /die/i);		
+		$method =~ s/^__OUT::/$outputer\::/;
+		no strict 'refs';
+		&$method( @_ );
+	}
+}
+
+1;
+
+## @class ZipUp
+#
+#
+#
+package ZipUp;
+use strict;
+use Archive::Zip;
+use File::Copy;
+
+sub new
+{
+	my ( $class, $filename ) = @_;
+	return undef unless ($filename);
+	
+	my $self = {
+		__filename => $filename,
+	};
+	
+	return bless $self, $class;
+}
+
+sub AddFile
+{
+	my ( $self, $filename ) = (shift,shift);
+	&__OUT::Print ("Adding '\\$filename'\n");	
+	my $cmd = "zip ".$self->{ __filename }." $filename\n";
+	&__OUT::Print (scalar(`$cmd`));
+}
+
+sub AddFilesFromList
+{
+	my ( $self, $listfilename ) = (shift,shift);
+	if ( -e $listfilename )
+	{
+		&__OUT::Print ("Adding files using '$listfilename'\n");		
+			my $cmd = "more $listfilename | zip -9 ".$self->{ __filename }." -@";
+		&__OUT::Print ( $cmd."\n" );
+		&__OUT::Print ( scalar( `$cmd` ) );
+	}		
+}
+1;
+
+
+## @class Finder
+#
+#
+#
+package Finder;
+
+sub new
+{
+	my ( $class, $regexp, $rootdir ) = @_;
+
+	my $self = {
+		__rootdir => $rootdir,
+		__regexp => $regexp,
+	};
+	
+	return bless $self, $class;
+}
+
+sub Find
+{
+	my ($self, $dir, $list) = @_;
+
+	my @fake;
+	$list = \@fake unless (defined ($list));
+	$dir = $self->{__rootdir} unless (defined($dir));
+	
+	opendir (DIR, $dir);
+	my @l = readdir(DIR);
+	closedir(DIR);
+	
+	foreach my $name (@l)
+	{
+		next if ($name =~ /^\.+$/);
+		my $filename = "$dir/$name";
+		
+		if ( -d $filename )
+		{
+			$self->Find($filename, $list);
+		}
+		elsif ( $filename =~ /$self->{__regexp}/i )
+		{			
+			push @$list, $filename;
+		}		
+	}
+
+	return $list;
+}
+
+1;
+
+
+## @class Localiser
+#
+#
+package Localiser;
+use strict;
+use File::Path;
+#use ISIS::GenBuildTools;
+use IPC::Open3;
+use File::Spec;  
+use File::Basename;
+
+my $DEFAULT_LOC_PATH = "\\s60\\S60LocFiles";
+use constant DEFAULT_XML_PATH => ".xml";
+use constant DEFAULT_WHATXML_PATH => "_what.xml";
+use constant DEFAULT_CHECKXML_PATH => "_check.xml";
+use constant DEFAULT_TPATH => "\\zips";
+
+
+use constant DEFAULT_MAKE_PATH => ".make";
+use constant DEFAULT_WHATMAKE_PATH => "whatMakefile";
+use constant DEFAULT_CHECKMAKE_PATH => "checkMakefile";
+
+sub new
+{
+	my $class = shift;
+	
+	my $configfiles = shift;
+	my $languagelist = shift;
+	my $includepath = shift;
+	my $bldfile = shift;
+	my $tpath = shift || DEFAULT_TPATH;
+	my @configuration;
+	my %platform;# = ("armv5");
+	my $self = {
+		__configfiles => $configfiles,
+		__includepath => $includepath,
+		__languagelist => $languagelist,
+		__configuration => \@configuration,
+		__platform	=> \%platform,
+		__tpath => $tpath,
+		__bldfile => $bldfile
+	};
+	return bless $self, $class;	
+}
+
+
+sub DefaultLocPath
+{
+	my ($k) = @_;
+	$DEFAULT_LOC_PATH = $k if (defined ($k));
+	return $DEFAULT_LOC_PATH;
+}
+
+sub Keepgoing
+{
+	my ($self, $k) = @_;
+	$self->{__keepgoing} = $k if (defined ($k));
+	return $self->{__keepgoing};
+}
+
+sub SetLoggerPackage
+{
+	my ($self, $outputer) = @_;
+	return unless($outputer);
+	&__OUT::SetLoggerPackage($outputer);
+}
+
+sub Initialise()
+{
+	my $self = shift;
+	my ($drive) = File::Spec->splitpath(File::Spec->rel2abs(File::Spec->curdir()));
+	foreach my $filename ( @{ $self->{__configfiles} } )
+	{
+		# adding path of the input file into the include path list
+		my $includepath = "";
+		$includepath .= "-I ".File::Spec->rel2abs(dirname($filename));
+		foreach my $path ( @{ $self->{__includepath} } )
+		{
+			$path = File::Spec->rel2abs($path);
+			$path = "$drive$path" if ($path =~ /^\\/);			
+			$includepath .= " -I $path";
+		}
+
+		# command line to execute
+		my $cmd = "cpp -nostdinc -u $includepath ".File::Spec->rel2abs($filename);
+		__OUT::Print( "$cmd\n");
+	
+		# parsing using cpp...
+		my $childpid = open3(\*WTRFH, \*RDRFH, \*ERRFH, $cmd);
+		close(WTRFH);
+
+		while (<RDRFH>)
+		{
+				if ( /^\s*<option (\w+)>/ )
+				{
+					my $option = lc($1);
+					$self->{ __platform }->{ $option } = $option; # if ($option =~ /^(armv5|winscw)$/i);
+				}
+				else
+				{
+					my $c = &__LocInfoData::CreateFromLine( $_ );
+					push ( @{ $self->{__configuration} }, $c ) if ($c);
+				}
+		}
+		close(RDRFH);	
+	
+		# Manage cpp errors
+		my $err = "";
+		while(<ERRFH>) { $err .= "$_\n";}
+		if (not ($err eq "")){ __OUT::Error ("$err"); }
+
+		# Closing cleanly....
+		close(ERRFH);
+		waitpid($childpid, 0);
+	}
+
+	
+	# if not platform add default one: armv5
+	unless (scalar (keys (%{$self->{ __platform }}) ))
+	{
+		__OUT::Warning("No platform specified, using default (ARMV5)");
+		$self->{ __platform }->{ 'armv5' } = 'armv5';
+	}
+}
+
+sub CheckConfig
+{
+	my $self = shift;
+	my $result = 1;
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		$result &&= $c->CheckBldInf();
+		$result &&= $c->CheckLocFiles();
+	}	
+	return $result;
+}
+
+sub PrepareLocalisation
+{
+	my $self = shift;
+	my $filename = shift;
+
+	my $zip = new ZipUp($filename);
+		
+	__OUT::Print ("Preparing each component\n");
+
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		$c->ZipUpLocFiles( $zip );
+	}
+
+	HandleEpoc32LocFiles( $self-> { __languagelist }, $zip );
+
+	my $time1;
+	my $time2;
+	
+	$time1 = time();
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		$c->GenerateStubLocFiles( $self-> { __languagelist } );
+		$c->ChangeMMPsAndMKs( $self-> { __languagelist }, $zip );
+		$c->TouchRSS();
+	}
+	$time2 = time();
+	my $time = $time2 - $time1;
+__OUT::Print ("time for loc file / mmp changes: $time\n");
+	
+}
+
+sub GenerateMakefiles
+{
+	my $self = shift;
+	my $time1;
+	my $time2;
+	$time1 = time();
+	__OUT::Print ("Generating Makefiles for EC\n");
+	$self->__GenerateECMakefile();
+	#$self->__GenerateWhatECMakefile();
+	#$self->__GenerateCheckECMakefile();
+	$time2 = time();
+	my $time = $time2 - $time1;
+__OUT::Print ("time for GenerateMakefiles: $time\n");
+	
+}
+
+sub GenerateXMLFiles
+{
+	my $self = shift;
+	__OUT::Print ("Generating XML for TBS\n");
+	$self->__GenerateTBSXML();
+	$self->__GenerateWhatTBSXML();
+	$self->__GenerateCheckTBSXML();
+}
+
+sub __GenerateTBSXML
+{
+	my $self = shift;
+	my $xmlfile = $self->{ __bldfile }."".DEFAULT_XML_PATH;
+	open (XML, ">$xmlfile") or __OUT::Die ("Cannot open '$xmlfile':$!");
+	print 	XML "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+	print 	XML "<Product Name=\"$xmlfile\">\n";
+	print 	XML "\t<Commands>\n";
+	my $id = 1;
+	my $stage = 1;
+		
+	print XML "\t\t<SetEnv Order = \"1\" Name = \"EPOCROOT\" Value = \"\\\"/>\n";
+	print XML "\t\t<SetEnv Order = \"2\" Name = \"PATH\" Value = \"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+
+	
+	# bldmake bldfiles
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		#<Execute CommandLine="call bldmake bldfiles -k" Component="\s60\icons" Cwd="\s60\icons\group" ID="2" Stage="1" />
+		print XML "		<Execute CommandLine=\"call bldmake bldfiles -k\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+	}
+	$stage++;
+
+	# abld makefile
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{
+		foreach my $c ( @{ $self->{__configuration} } )
+		{
+			foreach my $mmp ( @{$c->GetMMPs()} )
+			{
+					print XML "		<Execute CommandLine=\"call abld makefile $p ".$mmp." -k\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+			}
+		}
+		# Next platform
+		$stage++;
+	}
+
+	# abld resource
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{  			
+		foreach my $c ( @{ $self->{__configuration} } )
+		{
+			foreach my $mmp ( @{ $c->GetMMPs() } )
+			{ 		
+				if ( $c->GetMMPType($mmp) eq 'mmp')
+				{
+						print XML "		<Execute CommandLine=\"call abld resource $p ".$mmp." -k\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+				}
+			}
+		}
+		# Next platform
+		$stage++;
+	}
+	
+	#
+	# Mk are treated by languages
+	#
+	foreach my $lang ( @{ $self-> { __languagelist } } )
+	{  			
+		foreach my $p ( keys (%{ $self->{ __platform } }) )
+		{  			
+			foreach my $c ( @{ $self->{__configuration} } )
+			{
+				foreach my $mmp ( @{ $c->GetMMPs() } )
+				{
+					if ( $c->GetMMPType($mmp) eq 'mk')
+					{
+							print XML "		<Execute CommandLine=\"set LANGUAGE=$lang &amp;&amp; call abld resource $p ".$mmp." -k\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+					}
+				}
+			}
+			# Next platform...
+			$stage++;
+		}
+	}
+		
+
+	
+	print 	XML "	</Commands>\n";
+	print 	XML "</Product>\n";	
+	close(XML);
+}
+
+sub __GenerateWhatTBSXML
+{
+	my $self = shift;
+		my $xmlfile = $self->{ __bldfile }."".DEFAULT_WHATXML_PATH;
+	open (XML, ">$xmlfile") or __OUT::Die ("Cannot open '$xmlfile':$!");
+	print 	XML "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+	print 	XML "<Product Name=\"$xmlfile\">\n";
+	print 	XML "\t<Commands>\n";
+	my $id = 1;
+	my $stage = 1;
+		
+	print XML "\t\t<SetEnv Order = \"1\" Name = \"EPOCROOT\" Value = \"\\\"/>\n";
+	print XML "\t\t<SetEnv Order = \"2\" Name = \"PATH\" Value = \"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+	
+	# abld resource
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		foreach my $mmp ( @{$c->GetMMPs()} )
+		{
+			if ( $c->GetMMPType($mmp) eq 'mk')
+			{
+				foreach my $lang ( @{ $self-> { __languagelist } } )
+				{  			
+					foreach my $p ( keys (%{ $self->{ __platform } }) )
+					{  			
+						print XML "		<Execute CommandLine=\"set LANGUAGE=$lang &amp;&amp; call abld build $p ".$mmp." -w\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+					}
+				}
+			}
+			else
+			{
+				foreach my $p ( keys (%{ $self->{ __platform } }) )
+				{
+					print XML "		<Execute CommandLine=\"call abld build $p ".$mmp." -w\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+				}
+			}
+		}
+	}
+	$stage++;
+	print 	XML "	</Commands>\n";
+	print 	XML "</Product>\n";	
+	close(XML);
+}
+
+sub __GenerateCheckTBSXML
+{
+	my $self = shift;
+	my $xmlfile = $self->{ __bldfile }."".DEFAULT_CHECKXML_PATH;
+	open (XML, ">$xmlfile") or __OUT::Die ("Cannot open '$xmlfile':$!");
+	print 	XML "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+	print 	XML "<Product Name=\"$xmlfile\">\n";
+	print 	XML "\t<Commands>\n";
+	my $id = 1;
+	my $stage = 1;
+		
+	print XML "\t\t<SetEnv Order = \"1\" Name = \"EPOCROOT\" Value = \"\\\"/>\n";
+	print XML "\t\t<SetEnv Order = \"2\" Name = \"PATH\" Value = \"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+	
+	# abld resource
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		foreach my $mmp ( @{$c->GetMMPs()} )
+		{
+			if ( $c->GetMMPType($mmp) eq 'mk')
+			{
+				foreach my $lang ( @{ $self-> { __languagelist } } )
+				{  			
+					foreach my $p ( keys (%{ $self->{ __platform } }) )
+					{  			
+						print XML "		<Execute CommandLine=\"set LANGUAGE=$lang &amp;&amp; call abld build $p ".$mmp." -c\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+					}
+				}
+			}
+			else
+			{
+				foreach my $p ( keys ( %{ $self->{ __platform } } ) )
+				{
+					print XML "		<Execute CommandLine=\"call abld build $p ".$mmp." -c\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+				}
+			}
+		}
+	}
+	$stage++;
+	print 	XML "	</Commands>\n";
+	print 	XML "</Product>\n";	
+	close(XML);
+}
+
+
+
+sub HandleEpoc32LocFiles
+{
+	my ($langlist, $zip) = (shift, shift);
+
+	open (LST,">>\\cleanupfiles.lst");
+	foreach my $locfile (@{GetEpoc32LocFiles()})
+	{
+		$zip->AddFile($locfile);
+		print LST $locfile."\n";
+		__OUT::Print ("=== updating '$locfile' ===\n");
+		my ($path, $group, @mmps, @locfiles, @tlocfiles);
+		push(@locfiles, $locfile);
+		my $lid = new __LocInfoData($path, $group, \@mmps, \@locfiles, \@tlocfiles);
+		$lid = __LocInfoData::CreateFromLine(",,\"\",\"$locfile\"");
+		$lid->GenerateStubLocFile($locfile, $langlist);
+	}
+	close(LST);
+}
+
+sub GetEpoc32LocFiles
+{
+	my @array;
+	my (@locs) = `dir /s/b \\epoc32\\include\\*.loc`;
+	foreach my $loc (@locs)
+	{
+		if ($loc =~ /^[A-Z]:(.*)\\(.*?)$/i)
+		{
+			print "Found $loc ($1, $2).\n";
+			push(@array, $1."\\".$2);
+		}
+	}
+	return \@array;
+}
+
+sub __GenerateECMakefile
+{
+	my $self = shift;
+	my $makefile =$self->{ __bldfile }."".DEFAULT_MAKE_PATH;
+	open (XML, ">$makefile") or __OUT::Die ("Cannot open '$makefile':$!");
+	print XML "".$self->{ __bldfile }.":bldmake_bldfiles_all \\\n";
+	print XML "\t abld_makefile_all \\\n";
+	print XML "\t abld_resource_all \n\n";
+
+	print XML "".$self->{ __bldfile }."_what: what_all\n\n";
+	print XML "".$self->{ __bldfile }."_check: check_all\n\n";
+	
+	#print 	XML "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+	#print 	XML "<Product Name=\"$xmlfile\">\n";
+	#print 	XML "\t<Commands>\n";
+	my $id = 1;
+	my $stage = 1;
+	my %componentHash;
+	my $component="";
+	#print XML "\t\t<SetEnv Order = \"1\" Name = \"EPOCROOT\" Value = \"\\\"/>\n";
+	#print XML "\t\t<SetEnv Order = \"2\" Name = \"PATH\" Value = \"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+
+	
+	# bldmake bldfiles
+	#my $concatStages = "bldmake_bldfiles_all:";
+	#my $componontID = 1;
+
+	my $makeUnitList = "bldmake-UNITS:=";
+	
+
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		$component = $c->GetPath()."\\".$c->GetGroup();
+		if ( ! exists($componentHash{$component})){
+			$componentHash{$component} = $component;
+			#$concatStages .= "\t\\\n";
+				#<Execute CommandLine="call bldmake bldfiles -k" Component="\s60\icons" Cwd="\s60\icons\group" ID="2" Stage="1" />
+				#print XML "bldmake_bldfiles-$componontID:\n";
+				$makeUnitList .="\t\\\n\t".$c->GetPath()."\\".$c->GetGroup();
+				#print XML "		<Execute CommandLine=\"call bldmake bldfiles -k\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+			#$concatStages .= "\t bldmake_bldfiles-$componontID";
+			#$componontID++;
+		}
+	}
+	$makeUnitList .="\n\n";
+	print XML	$makeUnitList;
+	print XML "bldmake_bldfiles_all: \$(addsuffix -bldmake_bldfiles-k,\$(bldmake-UNITS))\n\n";
+	print XML "%-bldmake_bldfiles-k:\n";
+	print XML "\t\@echo ===-------------------------------------------------\n";
+	print XML "\t\@echo === bldmake \$*\n";
+	print XML "\tcd \$* && bldmake bldfiles -k\n";
+	print XML "\t\@echo ===-------------------------------------------------\n";
+
+	#$stage++;
+	print XML "\n\n";
+	#print XML "".$concatStages."\n\n";
+
+	#$concatStages = "abld_makefile_all: ";
+	#$componontID = 1;
+
+	$makeUnitList = "abld-UNITS:= \$(abld-mmp-UNITS) \$(abld-mk-UNITS)";
+
+	my $abldMMPUnitList = "abld-mmp-UNITS:=";
+	my $abldMKUnitList = "abld-mk-UNITS:=";
+	my $isAbldUnitAdded = 0;
+	# abld makefile
+	my $mmptype;
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{
+		foreach my $c ( @{ $self->{__configuration} } )
+		{
+			foreach my $mmp ( @{$c->GetMMPs()} )
+			{
+				#$concatStages .= "\t\\\n";
+				#print XML "abld_makefile-$componontID: bldmake_bldfiles_all \n";
+				#print XML "\t\@echo ===-------------------------------------------------\n";
+				#print XML "\t\@echo === abld_makefile\n";
+				#print XML "\t\@echo === ".$c->GetPath()."\\".$c->GetGroup()."\n";
+				#print XML "\t\@echo ===-------------------------------------------------\n";
+				#print XML "\t cd ".$c->GetPath()."\\".$c->GetGroup()." && abld makefile $p ".$mmp." -k \n\n";
+				$mmptype = $c->GetMMPType($mmp);
+				print "mmptype:...$mmptype\n";
+				print "getgroup:...".$c->GetGroup()."\n";
+				print "getpath:...".$c->GetPath()."\n";
+				print "mmp:...".$mmp."\n";
+				print "length of getgroup string:....".(length($c->GetGroup()))."\n";
+				my $strlength = length($c->GetGroup());
+				if($isAbldUnitAdded == 0){
+					if($mmptype eq 'mmp'){
+						if($strlength != 0){
+								$abldMMPUnitList .="\t\\\n\t".$c->GetPath()."\\".$c->GetGroup()."\\".$mmp;
+							}else {
+								$abldMMPUnitList .="\t\\\n\t".$c->GetPath()."\\".$mmp;
+							}
+					}else {
+						if($strlength != 0){
+								$abldMKUnitList .="\t\\\n\t".$c->GetPath()."\\".$c->GetGroup()."\\".$mmp;
+							}else {
+								$abldMKUnitList .="\t\\\n\t".$c->GetPath()."\\".$mmp;
+							}
+					}
+				}
+				#print XML "		<Execute CommandLine=\"call abld makefile $p ".$mmp." -k\" Component=\"".$c->GetPath()."\" Cwd=\"".$c->GetPath()."\\".$c->GetGroup()."\" ID=\"".$id++."\" Stage=\"$stage\" />\n";
+				#$concatStages .= "\t abld_makefile-$componontID";
+				#$componontID++;
+			}
+		}
+		$isAbldUnitAdded = 1;
+		# Next platform
+		$stage++;
+	}
+	$makeUnitList .="\n\n";
+	$abldMMPUnitList .="\n\n";
+	$abldMKUnitList .="\n\n";
+	print XML	$abldMMPUnitList;
+	print XML	$abldMKUnitList;
+	print XML	 $makeUnitList;
+	
+	my $abldDepRule = "abld_makefile_all: ";
+	
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{
+		print XML "abld_makefile_$p: \$(addsuffix -abld_makefile_$p-k,\$(abld-UNITS))\n\n";
+		print XML "%-abld_makefile_$p-k:bldmake_bldfiles_all\n";
+		print XML "\t\@echo ===-------------------------------------------------\n";
+		print XML "\t\@echo === abld makefile \$*\n";
+		print XML "\tcd \$(*D) && abld makefile $p \$(*F) -k\n";
+		print XML "\t\@echo ===-------------------------------------------------\n\n";
+		$abldDepRule.="\t\\\n\tabld_makefile_$p";
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+
+	print XML "\n\n";
+	
+	#print XML "".$concatStages."\n\n";
+	#$concatStages = "abld_resource_all:";
+	#$componontID = 1;
+
+	$abldDepRule = "abld_resource_mmp: ";
+	# abld resource
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{
+		print XML "abld_resource_mmp_$p: \$(addsuffix -abld_resource_mmp_$p-k,\$(abld-mmp-UNITS))\n\n";
+		print XML "%-abld_resource_mmp_$p-k:abld_makefile_all\n";
+		print XML "\t\@echo ===-------------------------------------------------\n";
+		print XML "\t\@echo === abld resource $p \$*\n";
+		print XML "\tcd \$(*D) && abld resource $p \$(*F) -k\n";
+		print XML "\t\@echo ===-------------------------------------------------\n\n";
+		$abldDepRule.="\t\\\n\tabld_resource_mmp_$p";
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+
+	print XML "\n\n";
+	
+	$abldDepRule = "abld_resource_mk: ";
+	foreach my $lang ( @{ $self-> { __languagelist } } )
+	{  			
+		foreach my $p ( keys (%{ $self->{ __platform } }) )
+		{
+			print XML "abld_resource_mk_".$p."_".$lang.": \$(addsuffix -abld_resource_mk_".$p."_".$lang."-k,\$(abld-mk-UNITS))\n\n";
+			print XML "%-abld_resource_mk_".$p."_".$lang."-k:abld_resource_mmp\n";
+			print XML "\t\@echo ===-------------------------------------------------\n";
+			print XML "\t\@echo === abld resource $p \$*\n";
+			print XML "\tSET LANGUAGE=".$lang." &&  cd \$(*D) && abld resource $p \$(*F) -k\n";
+			print XML "\t\@echo ===-------------------------------------------------\n\n";
+			$abldDepRule.="\t\\\n\tabld_resource_mk_".$p."_".$lang;
+		}
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+	print XML "\n\n";
+
+	print XML "abld_resource_all: abld_resource_mmp abld_resource_mk\n\n";
+
+	$abldDepRule = "abld_what_mmp: ";
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{
+		print XML "abld_what_mmp_$p: \$(addsuffix -abld_what_mmp_$p,\$(abld-mmp-UNITS))\n\n";
+		print XML "%-abld_what_mmp_$p:\n";
+		print XML "\t\@echo ===-------------------------------------------------\n";
+		print XML "\t\@echo === abld what $p \$*\n";
+		print XML "\tcd \$(*D) && abld build $p \$(*F) -w\n";
+		print XML "\t\@echo ===-------------------------------------------------\n\n";
+		$abldDepRule.="\t\\\n\tabld_what_mmp_$p";
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+
+		$abldDepRule = "abld_what_mk: ";
+	foreach my $lang ( @{ $self-> { __languagelist } } )
+	{  			
+		foreach my $p ( keys (%{ $self->{ __platform } }) )
+		{
+			print XML "abld_what_mk_".$p."_".$lang.": \$(addsuffix -abld_what_mk_".$p."_".$lang.",\$(abld-mk-UNITS))\n\n";
+			print XML "%-abld_what_mk_".$p."_".$lang." : abld_what_mmp\n";
+			print XML "\t\@echo ===-------------------------------------------------\n";
+			print XML "\t\@echo === abld what $p \$*\n";
+			print XML "\tSET LANGUAGE=".$lang." && cd \$(*D) && abld build $p \$(*F) -w\n";
+			print XML "\t\@echo ===-------------------------------------------------\n\n";
+			$abldDepRule.="\t\\\n\tabld_what_mk_".$p."_".$lang;
+		}
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+
+	print XML "what_all: abld_what_mmp abld_what_mk\n\n";
+
+	$abldDepRule = "abld_check_mmp: ";
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{
+		print XML "abld_check_mmp_$p: \$(addsuffix -abld_check_mmp_$p,\$(abld-mmp-UNITS))\n\n";
+		print XML "%-abld_check_mmp_$p:\n";
+		print XML "\t\@echo ===-------------------------------------------------\n";
+		print XML "\t\@echo === abld check $p \$*\n";
+		print XML "\tcd \$(*D) && abld build $p \$(*F) -c\n";
+		print XML "\t\@echo ===-------------------------------------------------\n\n";
+		$abldDepRule.="\t\\\n\tabld_check_mmp_$p";
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+
+	$abldDepRule = "abld_check_mk: ";
+	foreach my $lang ( @{ $self-> { __languagelist } } )
+	{  			
+		foreach my $p ( keys (%{ $self->{ __platform } }) )
+		{
+			print XML "abld_check_mk_".$p."_".$lang.": \$(addsuffix -abld_check_mk_".$p."_".$lang.",\$(abld-mk-UNITS))\n\n";
+			print XML "%-abld_check_mk_".$p."_".$lang." : abld_check_mmp\n";
+			print XML "\t\@echo ===-------------------------------------------------\n";
+			print XML "\t\@echo === abld check $p \$*\n";
+			print XML "\tSET LANGUAGE=".$lang." && cd \$(*D) && abld build $p \$(*F) -c\n";
+			print XML "\t\@echo ===-------------------------------------------------\n\n";
+			$abldDepRule.="\t\\\n\tabld_check_mk_".$p."_".$lang;
+		}
+	}
+	$abldDepRule.="\n\n";
+	print XML $abldDepRule;
+
+	print XML "check_all: abld_check_mmp abld_check_mk\n\n";
+	close(XML);
+}
+
+sub __GenerateWhatECMakefile
+{
+	my $self = shift;
+	my $makefile =$self->{ __bldfile }."_".DEFAULT_WHATMAKE_PATH;
+	open (XML, ">$makefile") or __OUT::Die ("Cannot open '$makefile':$!");
+	#print 	XML "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+	#print 	XML "<Product Name=\"$xmlfile\">\n";
+	#print 	XML "\t<Commands>\n";
+	my $id = 1;
+	my $stage = 1;
+
+	print XML "all: abld_resource_all \\\n";
+	print XML "\t abld_mk_all \n\n";
+
+
+	my $concatStages = "abld_resource_all:";
+	my $componontID = 1;
+	
+		
+	#print XML "\t\t<SetEnv Order = \"1\" Name = \"EPOCROOT\" Value = \"\\\"/>\n";
+	#print XML "\t\t<SetEnv Order = \"2\" Name = \"PATH\" Value = \"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+
+	# abld resource
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{  			
+		foreach my $c ( @{ $self->{__configuration} } )
+		{
+			foreach my $mmp ( @{ $c->GetMMPs() } )
+			{ 		
+				if ( $c->GetMMPType($mmp) eq 'mmp')
+				{
+				$concatStages .= "\t\\\n";
+				print XML "abld_resource-$componontID: \n";
+				print XML "\t cd ".$c->GetPath()."\\".$c->GetGroup()." && abld build $p ".$mmp." -w     \n\n";
+				$concatStages .= "\t abld_resource-$componontID";
+				$componontID++;
+				}
+			}
+		}
+		# Next platform
+		$stage++;
+	}
+		print XML "\n\n";
+		print XML "".$concatStages."\n\n";
+	
+
+	$concatStages = "abld_mk_all: ";
+	$componontID = 1;
+
+	#
+	# Mk are treated by languages
+	#
+	foreach my $lang ( @{ $self-> { __languagelist } } )
+	{  			
+		foreach my $p ( keys (%{ $self->{ __platform } }) )
+		{  			
+			foreach my $c ( @{ $self->{__configuration} } )
+			{
+				foreach my $mmp ( @{ $c->GetMMPs() } )
+				{
+					if ( $c->GetMMPType($mmp) eq 'mk')
+					{
+						$concatStages .= "\t\\\n";
+						if($componontID eq 1){
+							print XML "abld_mk-$componontID: abld_resource_all \n";
+						}else {
+							print XML "abld_mk-$componontID: abld_mk-".($componontID-1)." \n";
+						}
+						print XML "\t SET LANGUAGE=".$lang." && cd ".$c->GetPath()."\\".$c->GetGroup()." && abld build $p ".$mmp." -w\n\n";
+						$concatStages .= "\t abld_mk-$componontID";
+						$componontID++;
+					}
+				}
+			}
+			# Next platform...
+			$stage++;
+		}
+	}
+	print XML "\n";
+	print XML "".$concatStages."\n\n";
+	
+	#print 	XML "	</Commands>\n";
+	#print 	XML "</Product>\n";	
+	close(XML);
+}
+
+sub __GenerateCheckECMakefile
+{
+	my $self = shift;
+	my $makefile =$self->{ __bldfile }."_".DEFAULT_CHECKMAKE_PATH;
+	open (XML, ">$makefile") or __OUT::Die ("Cannot open '$makefile':$!");
+	#print 	XML "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+	#print 	XML "<Product Name=\"$xmlfile\">\n";
+	#print 	XML "\t<Commands>\n";
+	my $id = 1;
+	my $stage = 1;
+		
+	print XML "all: abld_resource_all \\\n";
+	print XML "\t abld_mk_all \n\n";
+
+
+	my $concatStages = "abld_resource_all:";
+	my $componontID = 1;
+	
+		
+	#print XML "\t\t<SetEnv Order = \"1\" Name = \"EPOCROOT\" Value = \"\\\"/>\n";
+	#print XML "\t\t<SetEnv Order = \"2\" Name = \"PATH\" Value = \"\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%\"/>\n";
+
+	# abld resource
+	foreach my $p ( keys (%{ $self->{ __platform } }) )
+	{  			
+		foreach my $c ( @{ $self->{__configuration} } )
+		{
+			foreach my $mmp ( @{ $c->GetMMPs() } )
+			{ 		
+				if ( $c->GetMMPType($mmp) eq 'mmp')
+				{
+				$concatStages .= "\t\\\n";
+				print XML "abld_resource-$componontID: \n";
+				print XML "\t\@echo ===-------------------------------------------------\n";
+				print XML "\t\@echo === abld_resource-$componontID\n";
+				print XML "\t\@echo === ".$c->GetPath()."\\".$c->GetGroup()."\n";
+				print XML "\t\@echo ===-------------------------------------------------\n";
+				print XML "\t cd ".$c->GetPath()."\\".$c->GetGroup()." && abld build $p ".$mmp." -c     \n\n";
+				$concatStages .= "\t abld_resource-$componontID";
+				$componontID++;
+				}
+			}
+		}
+		# Next platform
+		$stage++;
+	}
+		print XML "\n\n";
+		print XML "".$concatStages."\n\n";
+	
+
+	$concatStages = "abld_mk_all: ";
+	$componontID = 1;
+
+	#
+	# Mk are treated by languages
+	#
+	foreach my $lang ( @{ $self-> { __languagelist } } )
+	{  			
+		foreach my $p ( keys (%{ $self->{ __platform } }) )
+		{  			
+			foreach my $c ( @{ $self->{__configuration} } )
+			{
+				foreach my $mmp ( @{ $c->GetMMPs() } )
+				{
+					if ( $c->GetMMPType($mmp) eq 'mk')
+					{
+						$concatStages .= "\t\\\n";
+						if($componontID eq 1){
+							print XML "abld_mk-$componontID: abld_resource_all \n";
+						}else {
+							print XML "abld_mk-$componontID: abld_mk-".($componontID-1)." \n";
+						}
+						print XML "\t\@echo ===-------------------------------------------------\n";
+						print XML "\t\@echo === abld_mk-$componontID\n";
+						print XML "\t\@echo === ".$c->GetPath()."\\".$c->GetGroup()."\n";
+						print XML "\t\@echo ===-------------------------------------------------\n";
+						print XML "\t SET LANGUAGE=".$lang." && cd ".$c->GetPath()."\\".$c->GetGroup()." && abld build $p ".$mmp." -c\n\n";
+						$concatStages .= "\t abld_mk-$componontID";
+						$componontID++;
+					}
+				}
+			}
+			# Next platform...
+			$stage++;
+		}
+	}
+	print XML "\n";
+	print XML "".$concatStages."\n\n";
+	close(XML);
+}
+
+sub DeleteOriginalLocFiles{
+my $line;
+	if( -e "\\cleanupfiles.lst"){
+		open (LST,"<\\cleanupfiles.lst");
+		while ($line = <LST>)
+		{
+			chomp($line);
+				if( -e "$line.isis.orig"){
+					unlink ( "$line.isis.orig" ) or __OUT::Warning(" Failed to delete stubbed loc file $line.isis.orig --- \n");
+				}else {
+					if( -e "$line.orig"){
+						unlink ( "$line.orig" ) or __OUT::Warning(" Failed to delete stubbed mk file $line.orig --- \n");
+					}
+				}
+				if( -e "$line.isis.trace"){
+					unlink ( "$line.isis.trace" ) or __OUT::Warning(" Failed to delete stubbed loc file $line.isis.trace --- \n");
+				}
+				
+		}
+		close(LST);
+		unlink( "\\cleanupfiles.lst" ) or __OUT::Warning(" Failed to delete cleanupfiles.lst \n");
+	}
+}
+
+sub SaveGeneratedResources
+{
+	my $tpath = shift;
+	my $bldfile = shift;
+	my $time1;
+	my $time2;
+	
+	$time1 = time();
+	__SaveGeneratedResource($tpath, $bldfile);
+	$time2 = time();
+	__OUT::Print ("Total Time SaveGeneratedResources:" .($time2-$time1)."\n");
+}
+sub __SaveGeneratedResource
+{
+	my $tpath = shift;
+	my $bldfile = shift;
+	my %hlist;
+	
+	#
+	# Saving localised resources
+	#
+	__OUT::Print ("<b>Zipping generated resources</b>\n");
+	__OUT::Print ("<b>bldfile ---- $bldfile"."_what_compile.log"."</b>\n");
+	open (LOG, "$bldfile"."_what_compile.log") or __OUT::Die ("Cannot open"."$bldfile"."_what_compile.log:$!");		
+	foreach my $line ( <LOG> )
+	{
+		chomp ($line);
+		if ( $line =~ /^\\/ and $line =~ /\.r(\d+)$/i)
+		{
+			push @{ $hlist{$1} }, $line;
+		}
+	}
+	close (LOG);
+
+	#my $tpath = $self->{__tpath};
+	mkpath ( "$tpath\\LocPackages" ) unless ( -e "$tpath\\LocPackages" );
+	foreach my $lid ( sort keys %hlist )	
+	{
+		__OUT::Print ("<b>Zipping resources of language $lid</b>\n");	
+
+		unlink ("\\resourcelist_${lid}.lst") if ( -e "\\resourcelist_${lid}.lst" );
+		open (LST,">\\resourcelist_${lid}.lst");
+		foreach ( sort @{ $hlist{$lid} } )
+		{
+			print LST "$_\n";
+		}
+		close (LST);
+		my $zip = new ZipUp( "$tpath\\LocPackages\\package_${lid}.zip" );
+		$zip->AddFilesFromList ( "\\resourcelist_${lid}.lst" );
+	}
+}
+
+sub Cleanup
+{
+	my $self = shift;
+	my @ll = ("sc");
+	foreach my $c ( @{ $self->{__configuration} } )
+	{
+		#$c->RestoreOrigLocFiles();
+		#$c->ChangeMMPsAndMKs( \@ll );
+	}	
+}
+1;
+
+
+## @class LocaliseTBS
+# This is an internal class. It is a modelisation of the locinfo data line.
+#
+#
+package LocaliseTBS;
+use strict;
+use File::Path;
+use ISIS::GenBuildTools;
+use IPC::Open3;
+use File::Spec;  
+use File::Basename;
+
+use constant DEFAULT_XML_PATH => ".xml";
+use constant DEFAULT_WHATXML_PATH => "_what.xml";
+use constant DEFAULT_CHECKXML_PATH => "_check.xml";
+use constant DEFAULT_TPATH => "\\zips";
+
+sub Localise
+{
+	my $time1 = time();
+	my $bldfile = shift;
+	__OUT::Print ("Localisation starting - ".localtime()."\n");
+	__OUT::Print ("Localisation  $bldfile -\n");
+	GenBuildTools::BuildTBS( "$bldfile".DEFAULT_XML_PATH );
+	GenBuildTools::BuildTBS( "$bldfile".DEFAULT_WHATXML_PATH );	
+	GenBuildTools::BuildTBS( "$bldfile".DEFAULT_CHECKXML_PATH );	
+	__OUT::Print ("Localisation ending - ".localtime()."\n");
+	my $time2 = time();
+	__OUT::Print ("Total Time:" .($time2-$time1)."\n");
+}
+
+1;
+
+
+
+## @class __LocInfoData
+# This is an internal class. It is a modelisation of the locinfo data line.
+#
+#
+package __LocInfoData;
+use strict;
+use File::Copy;
+
+sub CreateFromLine
+{
+	my ( $line ) = shift;
+	
+	# managing comments and empty lines
+	return undef if ( $line =~ /^\s*((#|\/\/).*)*$/ );
+	my @atoms = split( /,/, $line );
+
+	if (scalar(@atoms)==3 or scalar(@atoms)==4 or scalar(@atoms)==5)
+	{
+			my @locfiles;
+			my @mmps;
+			#path,path_to_bld_inf,"list of mmp",["path/to.loc"[,"/path/to/delivery"]]
+			if ($atoms[2] =~ s/\"([^\"]*)\"/$1/)
+			{
+				@mmps = split(/\s+/, $atoms[2]);
+			}
+			else
+			{
+				__OUT::Die("Malformed3 input file at line: '$line'\n");
+			}
+			if (scalar(@atoms)>3)
+			{
+				if ($atoms[3] =~ s/\"([^\"]*)\"/$1/)
+				{
+					@locfiles = split(/\s+/, $atoms[3])
+				}
+				else
+				{
+					__OUT::Die("Malformed4 input file at line: '$line'\n");
+				}
+
+			}
+				
+			if (scalar(@atoms)==5)
+			{
+				if ($atoms[4] =~ s/\"([^\"]*)\"/$1/)
+				{
+					my @tlocfiles = split(/\s+/, $atoms[4]);
+					push @tlocfiles, &Localiser::DefaultLocPath();
+					return new __LocInfoData($atoms[0], $atoms[1], \@mmps, \@locfiles, \@tlocfiles);
+				}
+				else
+				{
+					__OUT::Die("Malformed5 input file at line: '$line'\n");
+				}
+			}
+			elsif (scalar(@atoms)==4)
+			{
+				my @tlocfiles;
+				push @tlocfiles, &Localiser::DefaultLocPath();
+				return new __LocInfoData($atoms[0], $atoms[1], \@mmps, \@locfiles, \@tlocfiles);
+			}
+			elsif (scalar(@atoms)==3)
+			{
+				my @tlocfiles;
+				push @tlocfiles, &Localiser::DefaultLocPath();
+				return new __LocInfoData($atoms[0], $atoms[1], \@mmps, \@locfiles, \@tlocfiles);
+			}
+		}
+	return undef;
+}
+
+sub new
+{
+	my $class = shift;
+	my ($path, $group, $mmps, $locfiles, $tlocfiles) = @_;
+	my $self = {
+			__path => $path,
+			__group => $group,
+			__mmps => $mmps,
+			__mmpstype => undef,
+			__locfiles => $locfiles,			
+			__tlocfiles => $tlocfiles			
+	};	
+	return bless $self, $class; 
+}
+
+
+sub GetPath
+{
+	my $self = shift;
+	return $self->{__path};
+}
+
+sub GetGroup
+{
+	my $self = shift;
+	return $self->{__group};
+}
+
+sub GetMMPs
+{
+	my $self = shift;
+	return $self->{__mmps};
+}
+
+sub GetMMPType
+{
+	my ($self, $mmp) = (shift, shift);
+	return $self->{__mmpstype}->{$mmp}->{type};
+}
+
+sub GetLocFiles
+{
+	my $self = shift;
+	return $self->{__locfiles};
+}
+
+sub GetTranslatedLocFiles
+{
+	my $self = shift;
+	return $self->{__tlocfiles};
+}
+
+sub CheckBldInf
+{
+	my $self = shift;
+	my $bldinf = $self->GetPath()."/".$self->GetGroup()."/bld.inf";
+	unless ( -e $bldinf )
+	{
+		__OUT::Error ("Cannot find bld.inf in '$bldinf' directory\n");
+		
+		return 0;
+	}
+	return 1;
+}
+
+sub CheckLocFiles
+{
+	my $self = shift;
+	my $result = 1;
+	
+	foreach ( @{ $self->{__locfiles} } )
+	{
+		my $loc = $self->GetPath()."/$_";
+				
+		unless ( -e $loc )
+		{
+			__OUT::Error ("Cannot find '$loc'\n");
+    }
+	}
+	return $result;
+}
+
+sub ZipUpLocFiles
+{
+	my ( $self, $zip ) = (shift, shift);
+	foreach ( @{ $self->{__locfiles} } )
+	{
+		my $loc = $self->GetPath()."/$_";
+		$zip->AddFile( $loc );
+	}	
+}
+
+
+sub GenerateStubLocFiles
+{
+	my ($self, $langlist) = (shift, shift);
+
+	open (LST,">>\\cleanupfiles.lst");
+	
+	foreach ( @{ $self->{__locfiles} } )
+	{
+		my $loc = $self->GetPath()."/$_";
+
+		print LST $loc."\n";
+
+		$self->GenerateStubLocFile( $loc, $langlist );
+	}	
+	close (LST);
+}
+
+sub RestoreOrigLocFiles
+{
+	my ($self, $langlist) = (shift, shift);
+	foreach ( @{ $self->{__locfiles} } )
+	{
+		
+		
+		my $loc = $self->GetPath()."/$_";
+		
+		if ( -e "$loc.isis.orig" )
+		{
+			unlink ( $loc ) or __OUT::Warning(" Failed to delete stubbed loc file $loc \n");
+			copy ( "$loc.isis.orig", $loc) or __OUT::Warning(" Failed to restore loc file from $loc.isis.orig to $loc \n");
+			unlink ( "$loc.isis.orig" ) or __OUT::Warning(" Failed to delete original backup loc file $loc \n");
+		}
+		
+		if ( -e "$loc.isis.trace" )
+		{
+			unlink ( "$loc.isis.trace" ) or __OUT::Warning(" Failed to delete $loc.isis.trace \n");
+			unlink ( "$loc" ) or __OUT::Warning(" Failed to delete original backup loc file $loc \n");
+		}
+		
+		
+	}	
+}
+
+sub GenerateStubLocFile
+{
+	my ($self, $locfile, $langlist) = (shift, shift, shift);
+	
+	my $sav = $locfile.".isis.orig";	
+	my $trace = $locfile.".isis.trace";
+	
+	__OUT::Print (" Backuping $locfile as $sav \n");
+	
+	if ( -e "$trace" )
+	{
+		unlink ( $trace ) or __OUT::Warning(" Failed to delete $trace \n");
+	}
+	
+	if ( -e "$sav" )
+	{
+		unlink ( $sav ) or __OUT::Warning(" Failed to delete stubbed loc file $sav \n");	
+	}
+	copy ($locfile, $sav) or __OUT::Error ("Cannot sav '$locfile'");
+	
+	unless ( -e "$locfile" )
+	{
+		open (TRACE, ">$trace") or __OUT::Error ("Cannot create trace file '$trace':$!");	
+		print TRACE "// File generated by Localiser.pm for tracing missing loc file - DO NOT EDIT!\n\n";	
+		close (TRACE);
+	}
+	
+	__OUT::Print ("=== Stubbing '$locfile' ===\n");
+	
+	open (LOC, ">$locfile") or __OUT::Die ("Cannot open/create '$locfile':$!");
+	print LOC "// File generated by Localiser.pm - DO NOT EDIT!\n\n";
+	
+	my $first = 1;
+	my $name = $locfile;
+	$name =~ /(\w+\.loc)$/;$name=$1;
+	foreach my $lid ( @$langlist )
+	{
+			if ($first)
+			{
+				$first = 0;
+				print LOC "#if defined(LANGUAGE_$lid)\n";				
+			}
+			else
+			{
+				print LOC "#elif defined(LANGUAGE_$lid)\n";				
+			}
+			my $f = $self->FindLocFor($name, $lid);
+			if ($f)
+			{
+				print LOC "\t#include \"".&__MakeRlt($locfile, $f)."\"\n";
+			}
+			else
+			{
+				__OUT::Warning ("no translation to $lid for $locfile\n");
+				print LOC "\t#warning no translation to $lid for $locfile\n";				
+				if ( -e "$sav" )
+				{
+					$sav =~ /(\w+\.loc.isis.orig)$/;
+					print LOC "\t#include \"$1\"\n";
+				}
+			}
+	}
+	if ( -e "$sav" )
+	{
+		print LOC "#else\n";
+		print LOC "// fallback to EE by default\n";
+		$sav =~ /(\w+\.loc.isis.orig)$/;
+		print LOC "#include \"$1\"\n";
+	}
+	print LOC "#endif\n";
+	print LOC "// END OF FILE\n";
+	close (LOC);
+}
+
+sub __MakeRlt
+{
+	my ($spath, $dpath) = @_;
+	#print "__MakeRlt($spath, $dpath)\n";
+	# only backslahes
+	$spath =~ s/\//\\/g;
+	$dpath =~ s/\//\\/g;
+	$spath =~ s/^.:\\/\\/;
+	$dpath =~ s/^.:\\/\\/;
+	# remove filename
+	$spath =~ s/(\\|\/)\w+\.loc$/$1/;
+	# remove transform abs to rel path
+	$spath =~ s/\\[^\\]+/..\\/g;
+	
+	# clean up
+	# no trailing, no double \\
+	$dpath =~ s/^\\+//;
+	$spath =~ s/\\+$//;
+	$dpath =~ s/\\\\/\\/g;
+	$spath =~ s/\\\\/\\/g;
+	return $spath."\\".$dpath;
+}
+
+sub FindLocFor
+{
+	my ($self, $locfile, $lid) = (shift, shift, shift);
+	
+	my $target = $locfile;
+	$target =~ s/\.loc$/_$lid.loc/i;
+
+	foreach my $dir ( @{ $self->GetTranslatedLocFiles() } )
+	{
+		opendir(DIR, "$dir/$lid");
+		my @files = readdir(DIR);
+		close (DIR);
+		
+		foreach my $f ( @files )
+		{
+			if ( $f =~ /^$target$/i )
+			{
+				return "$dir/$lid/$target";
+			}
+		}
+	}
+	return undef;
+}
+
+
+sub TouchRSS
+{
+	my $self = shift;
+	my $component = $self->GetPath();
+	$component =~ s/\//\\/g;	
+	foreach ( `dir /s/b $component\\*.rss 2>&1` )
+	{
+		chomp($_);
+		`attrib -r $_ 2>&1`;
+		`etouch $_ 2>&1`;
+	}
+}
+
+sub ChangeMMPsAndMKs
+{
+		my ($self, $langlist,$zip) = @_;
+		my $finder = new Finder( "\\.(mmp|mk)\$", $self->GetPath() );
+		my $dmmps = $finder->Find();
+		
+		foreach my $mmp ( @{ $self->{__mmps} } )
+		{
+				__OUT::Print ("=== $mmp changing Language to [".join(' ',@$langlist)."]\n");
+				my $dir = $self->GetPath()."/".$self->GetGroup();
+				
+				$self->{__mmpstype}->{$mmp}->{type} = 'notfound';
+				foreach my $f ( @$dmmps )
+				{
+					my $uf = $f;
+					$uf =~ s/\.(mmp|mk)$//i;
+					if ( $uf =~ m/$mmp$/i )
+					{
+						__OUT::Print ("  + Found '$mmp' match => '$f'\n");
+						$self->{__mmpstype}->{$mmp}->{path} = $f;
+						if ( $f =~ /^.*\.mmp$/i )
+						{
+							$zip->AddFile($f);
+							$self->{__mmpstype}->{$mmp}->{type} = 'mmp';
+							$self->__AlterLanguage( $langlist, "$f" );
+						}
+						elsif ( $f =~ /^.*\.mk$/i )
+						{
+							$zip->AddFile($f);
+							$self->{__mmpstype}->{$mmp}->{type} = 'mk';
+							$self->__PatchMakefile( $langlist, "$f" ) if ( $f =~ /^.*\.mk$/i );
+						}
+						__OUT::Print ("  - Path: ".$self->{__mmpstype}->{$mmp}->{path}."\n");
+						__OUT::Print ("  - Type: ".$self->{__mmpstype}->{$mmp}->{type}."\n");
+					}
+				}
+				if ( $self->{__mmpstype}->{$mmp}->{type} eq 'notfound' )
+				{
+					__OUT::Error("Cannot find an mmp or mk file for this configuration definition: '$mmp'\n");     			
+				}
+		}
+}
+
+sub __PatchMakefile
+{
+	my ( $self, $langlist, $mkfilepath  ) = @_;
+	print " - $mkfilepath\n";
+	
+	# Restoring if required.
+	if( -e $mkfilepath.'.orig' )
+	{
+		print "  restoring orig file";
+		unlink($mkfilepath);
+		move ( $mkfilepath.'.orig', $mkfilepath );				
+		return 1 if (((scalar(@$langlist))==1) and (@{$langlist}[0] =~ /\s*sc\s*/));
+	}
+	
+	# saving orig file to .orig
+	copy ($mkfilepath, $mkfilepath.'.orig') unless ( -e $mkfilepath.'.orig' );
+	
+	if ( open (MK, "$mkfilepath.orig") )
+	{
+		return 0 unless ( open (MKO, ">$mkfilepath") );
+		print MKO "# DO NOT EDIT FILE PATCHED BY ISIS LOCALISER\n";
+		foreach my $line ( <MK> )
+		{
+			if ($line =~ /^\s*LANGUAGE\s*=/i)
+			{				
+				print MKO "#ISISLOCALISERFIX $line";
+			}
+			elsif ( $line =~ /epocrc\.bat/i )
+			{
+				chomp($line);
+				print MKO "$line -DLANGUAGE_\$(LANGUAGE)\n";
+			}
+			else
+			{
+				print MKO $line;
+			}
+		}
+		close(MK);
+		close (MKO);
+		open (LST,">>\\cleanupfiles.lst");
+		print LST "$mkfilepath\n";
+		close(LST);
+		return 1;
+	}
+	return 0;
+}
+
+
+sub __AlterLanguage
+{
+	my ($self, $langlist, $file) = @_;
+	my ($type,$subst,$open_comment,$rss);
+	if ($file =~ /\.mmp$/i) {
+		$type="mmp";
+	}
+	elsif ($file =~ /\.mmpi$/i){
+		$type="mmp";
+	}
+	else {
+		print STDERR "Unknown file $file\n";
+		return;
+	}
+	print " - $file\n";
+	open(IN, $file);
+	my @lines=<IN>;
+	close (IN);
+	
+	foreach (@lines){
+			if (m!^\s*/\*!){
+					$open_comment=1;
+					if (m!\*/!) {
+							$open_comment=0;
+					}
+					next;
+			}
+			if (m!\*/!) {
+					$open_comment=0;
+					next;
+			}
+			next if ($open_comment);
+			next if (m!^\s*//!);
+			if ((/^\s*lang\s+\w+\s*/i) and ($type eq "mmp"))
+			{
+					$_ = "LANG\t".join(' ', @$langlist)."\n";
+					$subst=1;
+			}
+			if (/\.rss/i)
+			{
+					$rss=1;
+			}
+	}
+	if ($subst) {
+			__OUT::Print (scalar(`attrib -r $file`));
+			open (OUT,">$file") or __OUT::Die ("Cannot open $file for overwriting");
+			print OUT @lines;
+			close OUT;
+	}
+	elsif ($rss)
+	{
+			__OUT::Warning ("$file has no LANGUAGE or LANG definition in MMP,MK file\n");
+	}
+		
+}
+
+1;
+
+## @package HelpManagement
+#
+#
+package HelpManagement;
+use strict;
+use File::Copy;
+
+sub Copy
+{
+	my ($languages, $path, $tpath) = @_;
+	$tpath = $tpath || Localiser::DEFAULT_TPATH;
+	
+	my @help_destination_path=qw(\epoc32\data\z\resource\Help\ \epoc32\winscw\c\resource\Help\ );
+	my $locfiledir="\\S60\\S60Helps\\Data"; # Default path to locfiles (can be changed by $locfile_path option)
+
+	foreach my $lid (@$languages)
+	{  	
+		if (opendir (DIR,  $path."/$lid" ))
+		{
+			
+			my $zip = new ZipUp( File::Spec->catfile($tpath,"LocPackages","package_${lid}.zip" ) );
+
+			foreach my $file ( readdir(DIR))
+			{  			
+				if ($file =~ /(\w+\.h)lp$/i)
+				{
+					my $realname=lc($1).$lid;
+					foreach my $dpath (@help_destination_path)
+					{
+						__OUT::Print ("Exporting '$path/$lid/$file' to '$dpath\\$realname'\n");
+						copy ("$path/$lid/$file", "$dpath\\$realname");
+						$zip->AddFile( "$dpath\\$realname" );
+					}
+				}
+			}
+			closedir(DIR);
+		}
+	}
+}
+
+1;
+
+package DTDHandler;
+use strict;
+use File::Copy;
+use File::Path;
+use File::Find;     # for finding
+use File::Basename; # for fileparse
+
+my (@dtdfiles,@GeneratedFiles);
+#-----------------------------------------------------------------------------------------
+# DTDHandler::find_dtdfiles()
+#
+# Finds the input DTD files in supplied directory. This is call back function
+#
+# Parameters:
+#-----------------------------------------------------------------------------------------
+
+sub find_dtdfiles 
+{
+		my $dtd_name = $File::Find::name;
+		$dtd_name =~ s/\//\\/g;    #Change / marks to \
+		my($n, $d, $ext) = fileparse($dtd_name, '\..*');
+		if( $ext =~ /\.dtd/i)
+		{
+				push @dtdfiles, $dtd_name;
+		}
+}
+
+sub HandleDTD
+{
+		my ($locFilesPath,$dtdTarget) = (shift,shift);
+		$dtdTarget .= "package_dtd.zip";
+
+		my $dtd_path = "\\epoc32\\winscw\\c\\Nokia\\Installs\\MyThemes\\";
+		my %original_dtd;
+		@dtdfiles = ();
+		@GeneratedFiles = ();
+		
+		# get components that include DTD files
+		opendir(SDIR, ${dtd_path}) or __OUT::Die("can not read ${dtd_path}\n");
+		my @folders = grep !/^\.\.?$/ && -d (${dtd_path}.$_), readdir SDIR;
+		closedir(SDIR);
+
+		foreach my $dtd_folder(@folders) {
+			-d "${dtd_path}${dtd_folder}\\loc" || mkpath ("${dtd_path}${dtd_folder}\\loc",0,0x755);
+		}
+		
+		#search for in dtd input files in loc files directory
+		find( \&find_dtdfiles, "$locFilesPath" );
+		
+		#copy all dtd files to dtd handler input directory
+		foreach (@dtdfiles)
+		{
+			foreach my $dtd_folder (@folders) {
+				if ($_ =~ m/$dtd_folder/i) {
+					xcopy ($_,"${dtd_path}${dtd_folder}\\loc");
+				}
+			}
+		}
+
+		__OUT::Print("==== DTD generation  ====\n");
+		#create Dtd files
+		foreach my $dtd_folder (@folders) {
+			__OUT::Print(`\\epoc32\\RELEASE\\WINSCW\\UREL\\XnThemeInstallerCons.exe c:\\Nokia\\installs\\MyThemes\\${dtd_folder}\\loc\\ 2&>1`);
+			rmtree( "\\epoc32\\WINSCW\\C\\private\\10207254\\themes\\sources" );
+			# this kind of xcopy call MUST be replaced by a Perl command
+			__OUT::Print(`call xcopy \\epoc32\\WINSCW\\C\\private\\10207254\\themes\\* \\epoc32\\data\\z\\private\\10207254\\themes\\ \/E \/I \/Y \/R`);
+			__OUT::Print(`call xcopy \\epoc32\\WINSCW\\C\\private\\10207254\\themes\\* \\epoc32\\release\\winscw\\udeb\\z\\private\\10207254\\themes\\ \/E \/I \/Y \/R`);
+			__OUT::Print(`call xcopy \\epoc32\\WINSCW\\C\\private\\10207254\\themes\\* \\epoc32\\release\\winscw\\urel\\z\\private\\10207254\\themes\\ \/E \/I \/Y \/R`); 
+		}
+		
+		__OUT::Print("==== DTD Language packaging  ====\n");
+	
+		system ("zip -r -q ${dtdTarget} \\epoc32\\data\\z\\private\\10207254\\themes\\* \\epoc32\\release\\winscw\\udeb\\z\\private\\10207254\\themes\\* \\epoc32\\release\\winscw\\urel\\z\\private\\10207254\\themes\\*");
+
+		__OUT::Print("==== Done DTD  ====\n");
+}
+
+#-----------------------------------------------------------------------------------------
+# DTDHandler::CopyDTDFiles($lid, $s60locpath)
+#
+# Copy the DTD files
+#
+# Parameters:
+#-----------------------------------------------------------------------------------------
+sub CopyDTDFiles
+{
+		my ($language,$locFilesPath) =  (shift, shift);
+		my @list = ();
+		@dtdfiles = ();
+
+		#search for in dtd input files in loc files directory
+		find( \&find_dtdfiles, "$locFilesPath" );
+
+
+		my $file_found_flag = 0;
+		foreach my $file (@dtdfiles)
+		{
+				my($n, $d, $ext) = fileparse($file, '\..*');
+				
+				# find if file name without extention ends with language id.
+				if ($n =~ /\_$language$/i)
+				{
+						$file_found_flag = 1;
+						
+						#remove language id from the file name
+						$n =~ s/\_$language$//i;
+						
+						#copy dtd file to \epoc32\data\Z\private\101F4CD2\Content\<language> directory
+						my $dist = "\\epoc32\\data\\Z\\private\\101F4CD2\\Content\\$language\\$n$ext";
+						
+						__OUT::Print("Copy '$file' to '$dist'\n");
+						xcopy($file,$dist);
+						push (@list,$dist); 
+						
+						#copy dtd file to \epoc32\release\winscw\udeb\Z\private\101F4CD2\Content\<language> directory
+						$dist =~ s/data/RELEASE\\WINSCW\\UDEB/i;
+						__OUT::Print("Copy '$file' to '$dist'\n");
+						xcopy($file,$dist);
+						push (@list,$dist); 
+						
+						#copy dtd file to \epoc32\release\winscw\urel\Z\private\101F4CD2\Content\<language> directory
+						$dist =~ s/UDEB/UREL/i;
+						__OUT::Print("Copy '$file' to '$dist'\n");
+						xcopy($file,$dist);
+						push (@list,$dist); 
+				}
+		}
+		
+		__OUT::Print("Error: Dtd files for $language not found!!!") if (! $file_found_flag);
+		
+		return @list;
+}
+
+#-----------------------------------------------------------------------------------------
+# DTDHandler::xcopy()
+#
+# copies file from source path to destination path. 
+#
+# Parameters:
+#       Source file with path
+#       Destination file with path
+#-----------------------------------------------------------------------------------------
+
+sub xcopy
+{
+		my $source = shift;
+		my $dist = shift;
+		
+		# if distination file exist then clear read flag
+		if (-f $dist)
+		{
+				chmod ($dist , 0755);
+		}
+		else
+		{
+				my($n, $d, $ext) = fileparse($dist, '\..*');
+				# check weather distination directory exist or not. If directory doesn't exist then create it.
+				-d $d || mkpath($d, 0, 0x755);
+		}
+		
+		# copy source to distination
+		copy($source,$dist);
+}
+
+1;
+
+## @package Locales
+#
+#
+package Locales;
+use File::Spec;
+
+sub CreatesLocales
+{
+	my ($languages, $product, $flags, $ddir) = @_;
+	
+	$ddir = $ddir || Localiser::DEFAULT_TPATH;
+	
+	foreach my $lid (@$languages)
+	{
+		my $zip = new ZipUp( File::Spec->catfile($ddir,"LocPackages","package_${lid}.zip") );
+		$zip->AddFile( __GenerateLocalesIBY((defined($product))?"${product}_":'', $lid, $flags) );
+	}
+}
+
+use IPC::Open3;  
+sub __GenerateLocalesIBY($$$)
+{
+	my ($prefix, $langcode, $flags) = @_;
+	return if ($langcode =~ /sc/);
+	return if ($langcode !~ /\d+/);
+	
+	my $output = File::Spec->catfile("/epoc32/rom/include","${prefix}locales_$langcode.iby");
+	
+	__OUT::Print ("Generating $output...\n");
+	
+	open (OUT, ">$output");
+	print OUT "#ifndef __LOCALES_".$langcode."_IBY__\n";
+	print OUT "#define __LOCALES_".$langcode."_IBY__\n";
+	
+	
+	my $arg = "-I ..\\include\\oem -I .\\include -I.\\Variant ";
+	foreach (@$flags) { $arg .= " -D$_ "; }
+	
+
+	# use open3 to manage the error stream
+	chdir ("\\epoc32\\rom");
+	local (*WTRFH, *RDRFH, *ERRFH);
+	my $cmd = "cpp -nostdinc -u $arg  include\\locales_sc.iby -include .\\include\\header.iby";	
+	__OUT::Print ("Calling $cmd\n");
+	my $childpid = open3(\*WTRFH, \*RDRFH, \*ERRFH, $cmd);
+	close(WTRFH);
+	while(<RDRFH>)
+	{
+		if  (/^\s*data\s*=\s*MULTI_LINGUIFY/)
+		{
+			/MULTI_LINGUIFY\s*\(\s*(\S+)\s+(\S+)\s+(\S+)\s*\)/;
+			my $ext = $1;
+			my $w1 = $2;
+			my $w2 = $3;
+			if ( $ext=~ /^RSC$/i )
+			{
+				$ext =~ s/RSC/r$langcode/i;
+				print OUT "data=$w1.$ext $w2.$ext\n";
+			}
+			else
+			{
+				__OUT::Warning ("Cannot extract '$_'");
+			}
+		}
+		elsif (/\.rsc/i)
+		{
+			s/\.rsc/\.r$langcode/ogi;
+			print OUT $_;
+		}
+		elsif (/\.dbz/i)
+		{
+			s/\.dbz/\.d$langcode/ogi;
+			print OUT $_;
+		}
+		elsif (/\.hlp/i)
+		{
+			s/\.hlp/\.h$langcode/ogi;
+			print OUT $_;
+		}
+		elsif ( /\\elocl\.dll/i )
+		{			
+			s/elocl\.dll/elocl\.$langcode/ogi;
+			s/elocl\.loc/elocl\.$langcode/ogi;
+			print OUT $_;
+		}
+		#rename Content\01 to Content\xx (where xx is language id). This is for handlng DTD files
+		elsif (/Content\\01/)
+		{
+			s/Content\\01/Content\\$langcode/ogi;
+			print OUT $_;
+		}
+		#rename .o0001 to .0xx (where xx is language id). This is for handlng DTD files
+		elsif (/\.o0001/i)
+		{
+			my $line = $_;
+			my $lang = $langcode;
+			#round up language id to 4 digis
+			while (length($lang) < 4)
+			{
+				$lang = "0".$lang;
+			}
+
+			$line =~ s/\.o0001/\.o$lang/ogi;
+			print OUT $line;
+		}
+		elsif ( /^\s*(data|file)=/ )
+		{
+			__OUT::Warning ("This should not be included in resource.iby '$_'\nThis file should be included using an 'applicationnameVariant.iby' file.\n");
+		}
+	}
+	print OUT "#endif\n";
+	close(OUT);
+	# Closing cleanly....
+	close(RDRFH);	
+	
+	# Manage cpp errors
+	my $err = "";
+	while(<ERRFH>) { $err .= "$_\n";}
+	if (not ($err eq "")){ __OUT::Error ("$err"); }
+
+	# Closing cleanly....
+	close(ERRFH);
+	waitpid($childpid, 0);
+
+	chdir("\\");
+	return $output;
+}
+
+1;
+# End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/localiser/isis_EClocaliser.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,245 @@
+#!/usr/bin/perl -w
+
+#============================================================================ 
+#Name        : isis_EClocaliser.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+use strict;
+use FindBin;
+use lib "$FindBin::Bin/.";
+use POSIX qw(strftime);
+use ECLocaliser;
+use Getopt::Long;
+use ISIS::Logger2;
+
+# ISIS constants.
+use constant ISIS_VERSION 		=> '1.1.2';
+use constant ISIS_LAST_UPDATE => '03/11/2006';
+
+use constant ISIS_PREP_STATE    => 0;
+use constant ISIS_BUILD_STATE    => 1;
+use constant ISIS_CLEANUP_STATE    => 2;
+#------------------------------------------------------------------------------
+# Main script.
+#------------------------------------------------------------------------------
+
+
+my @locinfolist;
+my @locinfoincludedir;
+my $langs;
+my $help = 0;
+my $product = undef;
+my $dolocal = 1;
+my $keepgoing = 0;
+my $s60locfiles = undef;
+my $destdir = undef;
+my $logname = "isis_localiser.html";
+my @romflags;
+my $dtdsupport = 1;
+my $state = ISIS_PREP_STATE;
+my $ecBuild = 0;
+my $bldfileName = undef;
+
+# To get -D option working
+Getopt::Long::Configure ("pass_through");
+
+# Reading command line
+GetOptions( 'c=s' => \$langs,
+					  'i=s'=> \@locinfolist,
+					  'includepath=s' => \@locinfoincludedir,
+					  'h!' => \$help,
+					  'k' => \$keepgoing,
+					  'p=s' => \$product,
+					  'local!' => \$dolocal,
+					  's60locfiles=s'	=> \$s60locfiles,
+					  'dest=s'	=> \$destdir,
+					  'dtd!' => \$dtdsupport,
+					  'l=s' => \$logname,
+					  'state=i'=> \$state,
+					  'b=s' => \$bldfileName,
+					  'ecbuild!' => \$ecBuild) or &Usage();					  
+
+foreach(@ARGV)
+{
+	push @romflags, $1 if (/^-D(\S+)$/);
+}
+
+
+# Set S60LocFiles default location
+&Localiser::DefaultLocPath($s60locfiles);
+
+OUT2XML::SetXMLLogName( $logname );
+OUT2XML::SetXMLLogInterface("http://fawww.europe.nokia.com/isis/isis_interface");
+OUT2XML::SetXMLLogVerbose("on");
+OUT2XML::OpenXMLLog();
+OUT2XML::Header("ISIS Localiser");
+OUT2XML::OpenMainContent("Localisation");
+
+if($state == ISIS_PREP_STATE ){
+
+	my $time1 = time();
+
+	if (not defined($langs) or scalar (@locinfolist)==0)
+	{
+		&Usage();
+		exit 0;
+	}
+	
+	print "ecbuild......$ecBuild";
+
+	OUT2XML::OpenEvent ("Previous cleanup if any!\n");
+	Localiser::DeleteOriginalLocFiles();
+	OUT2XML::CloseEvent ();
+	
+	if ( -e "LocEE.zip" )
+	{
+		OUT2XML::OpenEvent ("Unzip EE!\n");
+		OUT2XML::Print (scalar(`unzip -o -d \\ LocEE.zip 2>&1`));
+		unlink ("LocEE.zip");
+		OUT2XML::CloseEvent ();
+	}
+
+	# Get the language list
+	my @languagelist = split(/\s+/, $langs);
+	
+	
+	my $localiser = new Localiser(\@locinfolist, \@languagelist, \@locinfoincludedir, $bldfileName, $destdir);
+	
+	# Set keepgoing option
+	$localiser->Keepgoing($keepgoing);
+	
+	$localiser->SetLoggerPackage( "OUT2XML" );
+	$localiser->Initialise();
+	
+	OUT2XML::OpenEvent ("Checking configuration\n");
+	unless ( $localiser->CheckConfig() )
+	{
+		OUT2XML::Error ("Config uncorrect!\n");
+		OUT2XML::Die ( 0 );
+	}
+	OUT2XML::CloseEvent ();
+	
+	
+	
+	if ($dtdsupport)
+	{
+		OUT2XML::OpenEvent ("Copy DTDs\n");
+		DTDHandler::HandleDTD(&Localiser::DefaultLocPath(),);
+		foreach my $lid (@languagelist)
+		{
+			DTDHandler::CopyDTDFiles($lid, &Localiser::DefaultLocPath());
+		}
+		OUT2XML::CloseEvent ();
+	}
+	
+	OUT2XML::OpenEvent ("Preparing localisation Build Area\n");
+	$localiser->PrepareLocalisation( "LocEE.zip");
+	OUT2XML::CloseEvent ();
+
+	OUT2XML::OpenEvent ("Generating build files\n");
+	if($ecBuild){
+		$localiser->GenerateMakefiles( );
+	}else {
+		$localiser->GenerateXMLFiles( );
+	}
+	my $time2 = time();
+
+	print ("Total Time 1 state:" .($time2-$time1)."\n");	
+}elsif($state == ISIS_BUILD_STATE){
+	
+	
+	OUT2XML::OpenEvent ("Building\n");
+	LocaliseTBS::Localise($bldfileName);
+	#$localiser->Localise();
+	OUT2XML::CloseEvent ();
+}elsif($state eq ISIS_CLEANUP_STATE){
+
+	my $time1 = time();
+	Localiser::SaveGeneratedResources($destdir,$bldfileName);
+	Localiser::DeleteOriginalLocFiles();
+	# Get the language list
+	my @languagelist = split(/\s+/, $langs);
+
+	if ($help)
+	{
+		OUT2XML::OpenEvent ("Coping helps!\n");
+			HelpManagement::Copy( \@languagelist, "\\s60\\S60Helps\\Data", $destdir);
+		OUT2XML::CloseEvent ();
+	}
+	
+	
+	if ($dolocal)
+	{
+		OUT2XML::OpenEvent ("Generating locales_xx.iby!\n");
+			Locales::CreatesLocales( \@languagelist, $product, \@romflags, $destdir );
+		OUT2XML::CloseEvent ();
+	}	
+	my $time2 = time();
+
+	print ("Total Time 3 state:" .($time2-$time1)."\n");
+
+	#OUT2XML::OpenEvent ("Cleaning up!\n");
+	#$localiser->Cleanup( );
+	#OUT2XML::CloseEvent ();
+	
+	OUT2XML::OpenEvent ("Unzip EE!\n");
+	OUT2XML::Print (scalar(`unzip -o -d \\ LocEE.zip 2>&1`));
+	unlink ("LocEE.zip");
+	OUT2XML::CloseEvent ();
+}
+
+
+
+#my $seconds = ($time2-$time1);
+#OUT2XML::OpenSummary("Localiser");
+#OUT2XML::SummaryElmt("Input list", join(' ',@locinfolist));
+#OUT2XML::SummaryElmt("Include path", join(' ',@locinfoincludedir));
+#OUT2XML::SummaryElmt("Language list", $langs);
+#OUT2XML::SummaryElmt("Custom destination directory", $destdir) if ($destdir);
+#OUT2XML::SummaryElmt("Total time", scalar(@languagelist). " language(s) built in ".strftime ("%H:%M:%S", localtime($seconds)));
+#OUT2XML::SummaryElmt("Time per language", $seconds/scalar(@languagelist). "s/language");
+#OUT2XML::CloseSummary();
+
+
+OUT2XML::CloseMainContent();
+OUT2XML::CloseXMLLog();
+
+#------------------------------------------------------------------------------
+# Script usage.
+#------------------------------------------------------------------------------
+sub Usage
+{
+	print " isis_localiser.pl - v".ISIS_VERSION." - ".ISIS_LAST_UPDATE."\n";
+	print " Usage : isis_localiser.pl [-c=\"01 02...\"] [-i=\\locinfo_xxx.txt]\n\n";
+  print " Main flags:\n";
+	print "    -c=\"01 02\"                       specify the language list of language to build.\n";
+	print "    -i=locinfo_xxx.txt                 specify a loc info file to use, can be use more that once.\n";
+	print "    -h                                 enable help management.\n";
+	print "    -k                                 keepgoing, do not leave if error.\n";
+	print "    -s60locfiles=\\s60\\s60locfiles    set a different default delivery.\n";
+	print "    -dest=\\path                       set default destination configuration (default /zips).\n";
+	print "    -nolocal                           do not create locales ibys.\n";
+	print "    -l=logname.html                    change the logger output to logname.html(isis_logger.html).\n";
+	print "\n Optional flags:\n";                 
+	print "    -p=product                         used to rename locales iby in product_locales_xx.iby.\n";
+	print "    -DFLAG                             used to parse locales iby.\n";
+	exit 0;
+}
+
+#------------------------------------------------------------------------------
+# End of file.
+#------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/localisation/templates/rom/mc_variant_imaker.oby	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+/*
+ *
+ * mc_variant_imaker.oby
+ *
+ * This file is an example. Product can update it accordingly to their needs.
+ *
+ */
+#ifndef VARIANT_IMAKER_IBY
+#define VARIANT_IMAKER_IBY
+
+#include <ncp_feature_consts.hrh>
+#define VARIANT_INCLUDE(prefix,suffix) <##concat3(prefix,VARIANTID,suffix)##>
+#define LP_INCLUDE(prefix,suffix) <##concat3(prefix,LPID,suffix)##>
+
+ROM_IMAGE[2] {
+#ifdef VARIANTID
+	#include LP_INCLUDE(variant_,.iby)
+#else
+	#include <locales_sc.iby>
+#endif
+}
+
+ROM_IMAGE[3] {
+#include <variation.iby>
+}
+
+#endif // VARIANT_IMAKER_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/metadata/metadata.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : metadata.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="metadata" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Metadata related ant macros and targets
+    </description>
+
+    <macrodef name="generateBuildStatus" uri="http://www.nokia.com/helium">
+        <attribute name="output-dir" default="${build.signal.status.dir}"/>
+        <attribute name="dbfile" default="${metadata.dbfile}" />
+        <attribute name="file" />
+        <sequential>
+            <mkdir dir="@{output-dir}" />
+            <fmpp sourceFile="${helium.dir}/tools/common/templates/log/build_status.xml.ftl"
+                         outputfile="@{output-dir}/@{file}.status.xml">
+                <freemarkerLinks expandProperties="yes">
+                    macro: ${helium.dir}/tools/common/templates/macro
+                </freemarkerLinks>
+                <data expandProperties="yes">
+                    dbPath: @{dbfile}
+                    logfile: @{file}
+                    ant: antProperties()
+                </data>
+            </fmpp>
+            <fmpp sourceFile="${build.status.email.template}"
+                         outputfile="@{output-dir}/@{file}.status.html">
+                <freemarkerLinks expandProperties="yes">
+                    macro: ${helium.dir}/tools/common/templates/macro
+                </freemarkerLinks>
+                <data expandProperties="yes">
+                    dbPath: @{dbfile}
+                    logfile: @{file}
+                    ant: antProperties()
+                </data>
+            </fmpp>
+        </sequential>
+    </macrodef>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : bom.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="preparation.bom" xmlns:hlm="http://www.nokia.com/helium">    
+    <description>
+    Creates a Bill-Of-Materials record based on the Synergy inputs.
+    </description>
+    
+    <property name="create.bom.workarea.root" value="."/> 
+    
+    <!-- The target create-bom creates a Bill-Of-Material based on the Synergy project 
+    The target can be run in the project's root directory or the directory can be given by
+    setting the property create.bom.workarea.root. The IDO builds are expected to set it to their 
+    projects work area directory. -->
+    <target name="create-bom" depends="get-ccm-password,old-bom-log,ccm-prepare-input,prep-prepare-input" if="prep.delivery.file">
+        <if>
+            <isset property="run.ccm"/>
+            <then>
+                <hlm:startSpecificLogMacro name="${build.log.dir}/${build.id}_bom.log" regexp="${ccm.user.password}"/>
+                <hlm:python>
+import os
+import build.model
+import configuration
+import nokia.nokiaccm
+import ccm.extra
+import ant
+import sys
+import traceback
+
+session = None
+try:
+    database = ant.get_property(r'${ccm.database}')
+    username = ant.get_property(r'${ccm.user.login}')
+    password = ant.get_property(r'${ccm.user.password}')
+    engine = ant.get_property(r'${ccm.engine.host}')
+    dbpath = ant.get_property(r'${ccm.database.path}')
+    waroot = ant.get_property(r'${create.bom.workarea.root}')
+    buildid = ant.get_property(r'${build.id}')
+    buildlogdir = ant.get_property(r'${build.log.dir}')
+    cache = None
+    if ant.get_property(r'${ccm.cache.xml}') is not None:
+        cache = str(ant.get_property(r'${ccm.cache.xml}'))
+    provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+        
+    configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
+    configSet = configBuilder.getConfiguration()
+    for config in configSet.getConfigurations():
+        waroot = config['dir']
+        print "Found wa for project %s" % waroot
+                    
+    if database != None:
+        session = provider.get(username, password, database=database)
+    else:
+        session = provider.get(username, password, engine, dbpath)
+        
+    ccmproject =  ccm.extra.get_toplevel_project(session, waroot)
+    
+    config_data = {'delivery': ant.get_property(r'${prep.delivery.conf.parsed}'), 'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'ccm.database': database, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
+    config = configuration.Configuration(config_data)
+    
+    bom = None
+    # let's only support the new spec model!
+    bom = build.model.BOM(config, ccmproject, username=username, password=password, provider=provider)
+    
+    xml_writer = build.model.BOMXMLWriter(bom)
+    xml_writer.write(r"%s/%s_bom.xml" % (buildlogdir, buildid))
+    
+    if os.path.exists(ant.get_property(r'${old.bom.log}')):
+        xml_delta_writer = build.model.BOMDeltaXMLWriter(bom, ant.get_property(r'${old.bom.log}'))
+        xml_delta_writer.write(buildlogdir + "/" + buildid + "_bom_delta.xml")
+        delta_bom_content_validity = xml_delta_writer.validate_delta_bom_contents(buildlogdir + "/" + buildid + "_bom_delta.xml", "%s/%s_bom.xml" % (buildlogdir, buildid), ant.get_property(r'${old.bom.log}'))
+        if((delta_bom_content_validity == False) and (ant.get_property(r'${hlm.enable.asserts}') is not None)):
+            print 'Bom delta contents are not matching'
+            raise Exception
+        elif((delta_bom_content_validity == True) or (delta_bom_content_validity == None)):
+            print 'Bom delta contents are matching.'
+        elif(delta_bom_content_validity == False):
+            print 'Bom delta contents are not matching.'
+    else:
+        print 'Old BOM log cannot be found, skipping BOM delta creation.'
+    bom.close()
+    session.close()
+except Exception, ex:
+    print 'Caught exception in BOM: ' + str(ex)
+    traceback.print_exc()
+                </hlm:python>
+            
+                <if>
+                    <available file="${build.log.dir}/${build.id}_bom.xml"/>
+                    <then>
+                        <echo>${build.log.dir}</echo>
+                        <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+                              outputRoot="${build.log.dir}" includes="bom.html.*,bom.txt.*" removeExtensions="ftl">
+                            <freemarkerLinks expandProperties="yes">
+                                macro: ${helium.dir}/tools/common/templates/macro
+                            </freemarkerLinks>
+                            <data expandProperties="yes">
+                                doc: xml(${build.log.dir}/${build.id}_bom.xml)                
+                            </data>
+                        </fmpp>
+                        
+                        <move file="${build.log.dir}/bom.html" tofile="${build.log.dir}/${build.id}_bom.html"/>
+                        <move file="${build.log.dir}/bom.txt" tofile="${build.log.dir}/${build.id}_bom.txt"/>
+        
+                        <!-- Transform bom data into the diamonds xml format: 
+                             * BOM folders are flattened into tasks.
+                             * Schema version is extracted from the appropriate FMPP template. -->
+                        <fmpp sourcefile="${helium.dir}/tools/common/templates/diamonds/diamonds_header.ftl" 
+                              outputfile="${build.temp.dir}/diamonds_header.xml" quiet="true"/>
+                        <loadfile srcfile="${build.temp.dir}/diamonds_header.xml" property="diamonds.schema.xml">
+                            <filterchain>
+                                <linecontains>
+                                    <contains value="schema"/>
+                                </linecontains>
+                            </filterchain>
+                        </loadfile>                
+                        <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/create-bom.xml">           
+                            <insert path="bom/content" xml="${diamonds.schema.xml}" position="before"/>
+                            <remove path="bom/content/project/folder/name"/>
+                            <remove path="bom/build"/>
+                            <rename path="bom" to="diamonds-build"/>
+                        </xmltask>                
+                        <delete file="${build.temp.dir}/diamonds_header.xml"/>
+                        <replace file="${build.log.dir}/create-bom.xml" token="&lt;folder&gt;" value="&lt;!-- &lt;folder&gt; --&gt;"/>
+                        <replace file="${build.log.dir}/create-bom.xml" token="&lt;/folder&gt;" value="&lt;!-- &lt;/folder&gt; --&gt;"/>
+                        <xmltask source="${build.log.dir}/create-bom.xml" dest="${build.log.dir}/create-bom.xml"
+                                 outputter="simple">
+                            <remove path="//comment()"/>
+                        </xmltask>
+                     
+                        <hlm:assertFileExists file="${build.log.dir}/create-bom.xml"/>
+                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.html"/>
+                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.txt"/>
+                    </then>
+                    <else>
+                        <echo>WARNING: ${build.log.dir}/${build.id}_bom.xml file not found.</echo>
+                    </else>
+                </if>
+                
+                <if>
+                    <isset property="old.bom.log.present"/>
+                    <then>
+                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.xml"/>
+                        <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+                              outputRoot="${build.log.dir}" includes="bom_delta.*" removeExtensions="ftl">
+                            <freemarkerLinks expandProperties="yes">
+                                macro: ${helium.dir}/tools/common/templates/macro
+                            </freemarkerLinks>
+                            <data expandProperties="yes">
+                                doc: xml(${build.log.dir}/${build.id}_bom_delta.xml)                
+                            </data>
+                        </fmpp>
+                                        
+                        <move file="${build.log.dir}/bom_delta.html" tofile="${build.log.dir}/${build.id}_bom_delta.html"/>
+                        <move file="${build.log.dir}/bom_delta.txt" tofile="${build.log.dir}/${build.id}_bom_delta.txt"/>
+                        
+                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.html"/>
+                    </then>
+                </if>
+                <hlm:stopSpecificLogMacro name="${build.log.dir}/${build.id}_bom.log"/>
+            </then>
+        </if>
+    </target>
+
+    <!-- Calculates the previous build number based on the current one. -->
+    <target name="previous-build-number" unless="previous.build.number">
+        <script language="jython" setbeans="false">
+import ant
+from com.nokia.ant.util import Helper
+buildnum = Helper.getProperty(project, "build.number")
+pbuildnum = ant.get_previous_build_number(buildnum)
+if pbuildnum != None:
+    project.setProperty("previous.build.number", pbuildnum)
+        </script>
+        <echo>Previous build number = ${previous.build.number}</echo>
+    </target>
+    
+    
+    <!-- Finds the path to the last usable XML BOM log for creating a BOM delta. --> 
+    <target name="old-bom-log" unless="old.bom.log" depends="previous-build-number">
+        <property name="bom.log" value="${publish.dir}/logs/${build.id}_bom.xml"/>
+        <script language="jython" setbeans="false">
+import re
+try:
+    buildnumber = project.getProperty("build.number")
+    pbuildnumber = project.getProperty("previous.build.number")
+    bomlog = project.getProperty("bom.log")
+    old_bom_log = re.sub(r'\.(%s)([\/_])' % buildnumber, r'.' + pbuildnumber + r'\2', bomlog)
+    project.setProperty("old.bom.log", old_bom_log)
+except ValueError:
+    # Do nothing - old BOM cannot be calulated
+    self.log("Old BOM cannot be found")
+        </script>
+        <echo>Previous BOM log: ${old.bom.log}</echo>
+        <available file="${old.bom.log}" property="old.bom.log.present"/>
+        <if>
+            <isset property="old.bom.log.present"/>
+            <then>
+                <hlm:assertFileExists file="${old.bom.log}"/>
+            </then>
+        </if>
+        <echo>Previous BOM log present: ${old.bom.log.present}</echo>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+<#--
+============================================================================ 
+Name        : bom.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+    <#include "/@macro/logger/logger.ftl" />
+    <head>
+        <title>Bill of Materials</title>
+        <@helium_logger_html_head/>
+    </head>
+    <body>
+
+
+<#macro printtype project title type>
+    <#assign helium_node_id = helium_node_id + 1>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
+        <@helium_message_box nodeid="${helium_node_id}" type="${type}" count=project?size/>
+    </@helium_logger_node_head>    
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <#list project as node>
+            <@helium_logger_print type="${type}">
+                ${node}
+            </@helium_logger_print>
+        </#list>
+    </@helium_logger_node_content>
+</#macro>
+
+<#macro printTasks project>
+    <#list project.task as node>
+    <@helium_logger_print type="task">
+      ${node.id}:${node.synopsis}
+    </@helium_logger_print>
+    </#list>
+</#macro>
+
+<#macro printTasksAndFolders project title>
+    <#assign helium_node_id = helium_node_id + 1>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
+        <@helium_message_box nodeid="${helium_node_id}" type="task" count=project["count(//task)"]/>
+    </@helium_logger_node_head> 
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <@printTasks project=project/>
+        <#list project.folder as node>           
+            <#assign helium_node_id = helium_node_id + 1>
+            <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.name}">
+                <@helium_message_box nodeid="${helium_node_id}" type="task" count=project.task?size/>
+            </@helium_logger_node_head>    
+            <@helium_logger_node_content nodeid="${helium_node_id}">
+                <@printTasks project=node/>
+            </@helium_logger_node_content>
+        </#list>          
+    </@helium_logger_node_content>
+</#macro>
+
+<#macro printproject project>
+    <#assign helium_node_id = helium_node_id + 1>
+    <@helium_logger_node_head nodeid="${helium_node_id}" title="${project.name}">
+        <@helium_message_box nodeid="${helium_node_id}" type="baseline" count=project.baseline?size/>
+        <@helium_message_box nodeid="${helium_node_id}" type="task" count=project["count(//task)"]/>
+        <@helium_message_box nodeid="${helium_node_id}" type="fix" count=project.fix?size/>
+    </@helium_logger_node_head>    
+    <@helium_logger_node_content nodeid="${helium_node_id}">
+        <@printtype project=project.baseline title="Baselines" type="baseline"/>
+        <@printTasksAndFolders project=project title="Tasks"/>
+        <@printtype project=project.fix title="Fix" type="fix"/>
+    </@helium_logger_node_content>
+</#macro>
+
+
+    
+    <@helium_logger_header title="${doc.bom.build} build"/>
+        
+    <@helium_logger_content title="Baseline and Task details">
+        <#list doc.bom.content.project as project>
+            <@printproject project=project />
+        </#list>
+    </@helium_logger_content>
+
+    <@helium_logger_content title="ICDs / ICFs">
+        <@printtype project=doc.bom.content.input.icds.icd.name title="ICDs / ICFs" type="icd"/>
+    </@helium_logger_content>
+    
+    </body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+<#--
+============================================================================ 
+Name        : bom.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+Bill Of Materials
+=================
+
+Build: ${doc.bom.build}
+
+<#list doc.bom.content.project as project>
+
+Project
+-------
+
+${project.name}
+
+Baselines
+`````````
+<#list project.baseline as baseline>
+${baseline}
+</#list>
+
+Tasks
+`````
+<#list project.task as task>
+${task.id}
+${task.synopsis}
+</#list>
+<#list project.folder as folder>
+<#list folder.task as task>
+${task.id}
+${task.synopsis}
+</#list>
+</#list>
+
+Folders
+```````
+<#list project.folder as folder>
+<#list folder.name as name>
+${name}
+</#list>    
+</#list>
+</#list>
+
+Symbian ICD/ICFs
+----------------
+
+<#list doc.bom.content.input.icds.icd as icd>
+${icd.name}
+</#list>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom_delta.html.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,147 @@
+<#--
+============================================================================ 
+Name        : bom_delta.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+<#assign delta = doc.bomDelta>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+      "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>BOM delta for  ${delta.buildTo}</title>
+        
+        <link rel ="stylesheet" type="text/css" href="stylesheet.css" title="style"/>
+        <style type="text/css">
+              body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+              h1{
+                font-size:14pt;
+                background-color:#3366ff;
+                color:#000;                
+                margin:0;                
+                color:#fff;
+                heigth:20pt;
+                padding: 5px 15px;
+                text-align: center
+                border-left:2px solid #5A6FA0;
+                border-bottom:2px solid #5A6FA0;
+                border-top:2px solid #98A6C6;
+                border-right:2px solid #98A6C6;
+                
+                
+               }
+              h2{font-size:12pt;}
+              h3{
+                font-size:14pt;
+                color:#00f;
+                padding: 20px 15px;
+                    margin:0;
+               }
+              h5{
+                font-size:10pt;
+                background-color:#8495BA;
+                color:#fff;
+                heigth:20pt;
+                padding: 5px 15px;
+                border-left:2px solid #5A6FA0;
+                border-bottom:2px solid #5A6FA0;
+                border-top:2px solid #98A6C6;
+                border-right:2px solid #98A6C6;
+                margin:0;
+               }
+       
+        
+              p {
+                font-size:10pt;
+                padding: 0em 1em 1em 1em;
+                margin: 0 1em 0.5em 1em;
+                border-right:1px solid #5A6FA0;
+                border-top:0;
+                border-bottom:1px solid #98A6C6;
+                border-left:1px solid #98A6C6;
+                background-color:#CDE4EB;
+                white-space:normal;
+              }
+       
+              .data{color:#00F;}
+              .added{color:#24A22D;font-weight:normal; display:block; margin-bottom: 0em;padding-top: 0em;}
+              .deleted{color:#F00;font-weight:normal; display:block; margin-bottom: 0em;padding-top: 0em;}
+       
+              span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+      
+              span.bold{font-weight:bold; display:block; padding: 1em 0;}
+              p.maintext{padding-top: 1em;}
+              p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+              p.distrib{font-weight:bold;}
+               
+              a:link,a:visited{color:#00E;}
+        </style>
+    </head>
+    <body>
+        <h1>BOM delta for  ${delta.buildTo}</h1>
+        <div id="buildname">
+                <h3>Build from ${delta.buildFrom} to ${delta.buildTo} </h3>
+          </div>
+      
+          <div id="foldername">
+                   <h5>Task added </h5>
+                   <p class="maintext">                   
+                   <span class="data">
+                   <#list delta.content.task as tasks>
+                   <#if tasks.@status == "added">
+                       <span class="added"> ${tasks}</span>
+                   </#if>
+                   </#list>
+                   </span>
+                   </p>
+             </div>
+             <div id="foldername">                   
+                   <h5>Task removed</h5>
+                   <p class="logfolder">
+                    <#list delta.content.task as tasks>
+                   <#if tasks.@status == "deleted">
+                       <span class="deleted"> ${tasks}</span>
+                   </#if>
+                   </#list>
+                   </p>
+                </div>   
+                <div id="foldername">
+                   <h5>Baseline added</h5>
+                   <p class="maintext">                   
+                   <#list delta.content.baseline as baselines>
+                   <#if baselines.@status == "added">
+                       <span class="added">${baselines}</span>
+                   </#if>
+                   </#list>
+                   </p>
+                </div>   
+                <div id="foldername">
+                   <h5>Baseline removed</h5>
+                   <p class="logfolder">                   
+                   <#list delta.content.baseline as baselines>
+                   <#if baselines.@status == "deleted">
+                       <span class="deleted"> ${baselines}</span>
+                   </#if>
+                   </#list>                   
+               </div>
+        
+    </body>
+</html>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom_delta.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,50 @@
+<#--
+============================================================================ 
+Name        : bom_delta.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+Bill Of Materials
+=================
+
+Build from: ${doc.bomDelta.buildFrom}
+Build to:   ${doc.bomDelta.buildTo}
+
+
+Baselines
+---------
+<#list doc.bomDelta.content.baseline as baseline>
+<#if baseline.@status == "added">
++ ${baseline}
+</#if>
+<#if baseline.@status == "deleted">
+- ${baseline}
+</#if>
+</#list>
+
+Tasks
+-----
+<#list doc.bomDelta.content.task as task>
+<#if task.@status == "added">
++ ${task}
+</#if>
+<#if task.@status == "deleted">
+- ${task}
+</#if>
+</#list>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/ci.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ci.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ci" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    CI related targets
+    </description>
+    
+    <!-- Delete all the folders based on configurations file inside dir-path, optional attribute pool-size's default value is 4 -->
+    <target name="delete-folders-from-list" if = "ci.cleanup.env.dir">
+        <exec osfamily="windows" executable="python" failonerror="true" outputproperty="delete.folders.drive">
+            <arg value="${helium.dir}/tools/common/python/scripts/searchnextdrive.py"/>               
+        </exec>
+        <hlm:deleteFoldersFromDirMacro dir-path="${ci.cleanup.env.dir}" delete-folders-drive="${delete.folders.drive}"/>
+    </target>
+
+    <!-- Delete all the folders based on configurations file inside dir-path, optional attribute pool-size's default value is 4 -->
+    <scriptdef name="deleteFoldersFromDirMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="dir-path" />
+        <attribute name="pool-size" />
+        <attribute name="delete-folders-drive" />
+import os
+import fileutils
+import threadpool
+import subprocess
+import sys
+
+dir_path = str(attributes.get('dir-path'))
+del_folder_drive = attributes.get('delete-folders-drive')
+pool_size = attributes.get('pool-size')
+if pool_size != None:
+    pool_size = str(pool_size)
+else:
+    pool_size = "4"
+delete_dirs = []
+found_inputs = []
+# Read config files
+self.log(str("Scanning %s." % dir_path))
+for path_ in os.listdir(dir_path):
+    self.log(str("Checking %s." % path_))
+    filename = os.path.join(dir_path, path_)
+    if (os.path.isfile(filename)):
+        found_inputs.append(filename)
+        file_ = open(filename)
+        for delete_dir in file_.readlines():
+            delete_dir = os.path.normpath(delete_dir.strip())
+            if (len(delete_dir) > 0) and  os.path.isdir(delete_dir):
+                delete_dirs.append(delete_dir)
+        file_.close()
+    
+# Delete all dirs based on config
+for dir_ in delete_dirs:
+    try:
+        if os.sep == '\\':
+            fileutils.subst(del_folder_drive, dir_)
+            self.log(str("substed for deleling folders"))
+            self.log(str("Removing %s\\" % del_folder_drive))
+            fileutils.rmtree("%s\\" % del_folder_drive)
+            fileutils.unsubst(del_folder_drive)
+            self.log(str("unsbusted substed for deleling folders"))
+        else:
+            self.log(str("Removing %s" % dir_))
+            fileutils.rmtree(dir_)
+    except Exception, e:
+        if os.sep == '\\':
+            fileutils.unsubst(del_folder_drive)
+            self.log(str("unsbusted for deleling folders"))
+        self.log(str("ERROR: %s" % e))
+
+# Delete all config files
+for path_ in found_inputs:
+    self.log(str("Deleting %s." % path_))
+    os.remove(path_)
+    </scriptdef>
+
+    <!-- Macro for the folders to be deleted in a file based on the folder creation time  
+    If the folders are created at the same time, then it will delete only one of them (this 
+    needs to be handled properly in the future releases if required)-->
+    <scriptdef name="BADeleteMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="outputdir"/>
+        <attribute name="rootdir"/>
+        <attribute name="no.ba.remain"/>
+        <![CDATA[
+import os
+import time
+ctime_dict = {}
+root_dir = str(attributes.get('rootdir'))
+output_dir = str(attributes.get('outputdir'))
+for dir_ in os.listdir(root_dir):
+    if (os.path.isdir(os.path.join(root_dir, dir_))):
+        dir_ctime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getctime(os.path.join(root_dir, dir_))))
+        ctime_dict[dir_ctime] = dir_
+ctime_list = ctime_dict.keys()
+ctime_list.sort()
+self.log(str("ctime_list: %s" % ctime_list))
+filename = time.strftime('%Y%m%d%H%M%S', time.localtime())
+filename = os.path.join(output_dir, filename + '_file_delete.txt')
+self.log(str("Creating %s" % filename))
+file_ = open(filename, 'w+')
+count = len(ctime_list)
+ba_to_leave = int(str(attributes.get('no.ba.remain')))
+self.log(str("Leaving %d build areas." % ba_to_leave)) 
+if (ba_to_leave > 0):
+    for ctime_entry in ctime_list:
+        print count
+        if (ba_to_leave >= count):
+            break
+        file_.write(os.path.join(root_dir, ctime_dict[ctime_entry]) + '\n')
+        count -= 1
+file_.close()
+        ]]>
+    </scriptdef>
+
+    <!-- This target flags the Build areas for deletion. So the cleanup build robot could remove them. -->
+    <target name="flag-ba-for-deletion" if = "ci.cleanup.env.dir">
+        <mkdir dir="${ci.cleanup.env.dir}"/>
+        <if>
+            <not>
+                <isset property="ci.min.ba.maintain"/>
+            </not>
+            <then>
+                <property name="ci.min.ba.maintain" value="2"/>
+            </then>
+        </if>
+        <hlm:BADeleteMacro outputdir="${ci.cleanup.env.dir}" rootdir="${prep.root.dir}" no.ba.remain="${ci.min.ba.maintain}"/>
+    </target>
+    
+    <!-- This task monitor the sessions available under the session file and update/create new ones if needed. -->
+    <scriptdef name="monitorCCMSession" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="delivery"/>
+        <attribute name="sessionfile"/>
+import ccm
+import nokia.nokiaccm
+import configuration
+import os
+import logging
+import traceback
+logging.basicConfig(level=logging.INFO)
+
+databases = []
+delivery = str(attributes.get('delivery'))
+sessionFile = str(attributes.get('sessionfile'))
+configBuilder = configuration.NestedConfigurationBuilder(open(delivery, 'r'))
+configSet = configBuilder.getConfiguration()
+for config in configSet.getConfigurations():
+    if config['database'] not in databases:
+        databases.append(config['database'])
+
+config = configuration.PropertiesConfiguration()
+if os.path.exists(sessionFile):
+    self.log(str("Opening the file %s..." % sessionFile))
+    config.load(open(sessionFile, 'r'))
+else:
+    self.log(str("File %s will be created..." % sessionFile))
+        
+for database in databases:
+    self.log(str("Checking %s..." % database))
+    update_session = True
+    if config.has_key(database):
+        sessionid = config[database]
+        # test if valid
+        self.log(str("Is session %s still valid?..." % sessionid))
+        if ccm.session_exists(sessionid, database=database):
+            self.log(str("Yes."))
+            update_session = False
+
+    if update_session:
+        try:
+            self.log(str("Opening a new session for %s..." % database))
+            session = nokia.nokiaccm.open_session(database=database)
+            session.close_on_exit = False        
+            config[database] = session.addr()
+        except Exception, exc:
+            traceback.print_exc()
+            raise exc
+    
+self.log(str("Updating the file %s..." % sessionFile))
+config.store(open(sessionFile, 'w+'))    
+    </scriptdef>
+
+    <!-- Task that generates an XML configuration of the work that will be done by ccm-get-input. -->
+    <macrodef name="findProjects" uri="http://www.nokia.com/helium">
+        <attribute name="delivery"/>
+        <attribute name="sessionfile"/>
+        <attribute name="output"/>
+        <sequential>
+            <hlm:python>
+import ccm
+import configuration
+import os
+import logging
+import amara
+
+logging.basicConfig(level=logging.INFO)
+
+delivery = str(r'@{delivery}')
+sessionFile = str(r'@{sessionfile}')
+outputFilename = str(r'@{output}')
+        
+sconfig = configuration.PropertiesConfiguration()
+
+print "Opening the file %s..." % sessionFile
+sconfig.load(open(sessionFile, 'r'))
+
+configBuilder = configuration.NestedConfigurationBuilder(open(delivery, 'r'))
+configSet = configBuilder.getConfiguration()
+projects = []        
+for config in configSet.getConfigurations():        
+    if config.type == "checkout" and not config.get_boolean('skip.ci', False): 
+        try:
+            sessionid = sconfig[config['database']]
+            session = ccm.Session(None, None, None, ccm_addr=sessionid, close_on_exit=False)
+            ccmproject = session.create(config.name)
+            wapath = os.path.join(config['dir'], ccmproject.name, ccmproject.name)
+            result = session.get_workarea_info(wapath)
+            print "Found wa for project %s." % result['project'].objectname
+            if config.has_key('ci.custom.query'):
+                projects.append({u'database': unicode(config['database']), u'action': u'checkout', u'name': unicode(result['project'].objectname), u'customQuery': unicode(config['ci.custom.query'])})
+            else: 
+                projects.append({u'database': unicode(config['database']), u'action': u'checkout', u'name': unicode(result['project'].objectname)})    
+        except ccm.CCMException, exc:
+            projects.append({u'database': unicode(config['database']), u'action': u'to_be_checkout', u'name': unicode(config.name)})
+    elif config.type == "snapshot" and not config.get_boolean('skip.ci', False):
+        sessionid = sconfig[config['database']]
+        session = ccm.Session(None, None, None, ccm_addr=sessionid, close_on_exit=False)
+        ccmproject = session.create(config.name)
+        versionfile = os.path.join(config['dir'], ccmproject.name, 'project.version')
+        if (os.path.exists(versionfile)):
+            stream = open(versionfile, "r")
+            projectname = stream.read().strip()
+            stream.close()
+            if (projectname != config.name):
+                if config.has_key('ci.custom.query'):
+                    projects.append({u'database': unicode(config['database']), u'action': u'snapshot_update', u'name': unicode(config.name), u'customQuery': unicode(config['ci.custom.query'])})
+                else:
+                    projects.append({u'database': unicode(config['database']), u'action': u'snapshot_update', u'name': unicode(config.name)})
+        else:
+            if config.has_key('ci.custom.query'):
+                projects.append({u'database': unicode(config['database']), u'action': u'snapshot', u'name': unicode(config.name), u'customQuery': unicode(config['ci.custom.query'])})
+            else:    
+                projects.append({u'database': unicode(config['database']), u'action': u'snapshot', u'name': unicode(config.name)})
+
+doc = amara.create_document()
+root = doc.xml_create_element(u"config")
+doc.xml_append(root)
+
+for project in projects:
+    p = doc.xml_create_element(u"project", attributes=project)
+    root.xml_append(p)
+        
+output = open(outputFilename, "w+")
+output.write(doc.xml())
+output.close()
+            </hlm:python>
+        </sequential>
+    </macrodef>
+
+    <!-- Validate input for the ci-monitor-ccm-session target -->
+    <target name="ci-monitor-ccm-session-validate" depends="ccm-prepare-input">
+        <if>
+            <and>
+                <available file="${prep.delivery.conf.parsed}"/>
+                <isset property="ci.session.file"/>                
+                <isset property="run.ccm"/>
+            </and>
+            <then>
+                <property name="do.ci-monitor-ccm-session" value="true"/>
+            </then>
+            <else>
+                <echo>Delivery file not available or 'ci.session.file' not defined or ccm.enabled not set to true.</echo>
+            </else>
+        </if>
+    </target>
+    
+    <!-- Validate input for the ci-prep-wa-create-list target. --> 
+    <target name="ci-prep-wa-create-list-validate" depends="ci-monitor-ccm-session-validate" if="do.ci-monitor-ccm-session">
+        <if>
+            <and>
+                <isset property="ci.project.config"/>             
+            </and>
+            <then>
+                <property name="do.ci-prep-wa-create-list" value="true"/>
+            </then>
+            <else>
+                <echo>'ci.project.config' not defined.</echo>
+            </else>
+        </if>
+    </target>
+
+    <!-- Bootstrapper target for Cruise Control. It generates a session file compatible with CCM task. -->
+    <target name="ci-monitor-ccm-session" depends="ci-monitor-ccm-session-validate" if="do.ci-monitor-ccm-session">
+        <hlm:monitorCCMSession delivery="${prep.delivery.conf.parsed}" sessionfile="${ci.session.file}"/>
+    </target>
+
+    <!-- Bootstrapper target for Cruise Control. This target output the future work that ccm-get-input will be doing. -->
+    <target name="ci-prep-wa-create-list" depends="ci-prep-wa-create-list-validate" if="do.ci-prep-wa-create-list">
+        <hlm:findProjects delivery="${prep.delivery.conf.parsed}" sessionfile="${ci.session.file}" output="${ci.project.config}"/>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/freedisk.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,131 @@
+#============================================================================ 
+#Name        : freedisk.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Checks free space on the disk before the build starts.
+
+The script is being called from the preparation.ant.xml file
+
+"""
+
+import getopt, sys
+
+
+help_string = """
+    -h or --help     : Displays help
+
+    -d or --drive    : Requires a drive letter to be checked.
+                     : E.g. -d C: (case insensitive; ':' is optional)
+                     
+    -s or --space    : Required space to compare with the drive for the free space"
+                     : E.g. -s 2658 (an integer value in MB)
+"""
+
+
+
+def print_space_report(drive, space_required):
+    """
+    compares the required space with current free space on the provided drive
+    """
+    try:
+        if sys.platform == "win32":
+            import win32file
+            free_bytes = win32file.GetDiskFreeSpaceEx(drive)[0]
+        else:
+            import os
+            import statvfs
+            # pylint: disable-msg=E1101
+            stats = os.statvfs(drive)
+            free_bytes = stats[statvfs.F_BSIZE] * stats[statvfs.F_BAVAIL]
+            
+    except Exception, e:
+        print "ERROR: Either specified drive doesn't exist or an unknown error"
+        print str(e)
+        print help_string
+        sys.exit(-2)
+
+    free_space = free_bytes / (1024 * 1024)
+
+
+    print "drive:", drive
+    print "Required Space:", space_required
+    print "Free Space:", free_space
+    
+    if space_required < free_space:
+        print "Enough free space"
+        sys.exit(0)
+    else:
+        print "Not enough free space, exiting"
+        sys.exit(-1)
+
+    
+def main():
+    """
+    Gets and parse options and verifies the option values
+    """
+    try:
+        opts = getopt.getopt(sys.argv[1:], "hs:d:", \
+                                   ["space=", "drive=", "help"])[0]
+    except getopt.GetoptError:
+        # print help information and exit:
+        print "ERROR: Couldn't parse the command line parameters."
+        print help_string
+        sys.exit(2)
+
+    drive = None
+    required_space = None
+
+    for opt, attr in opts:
+
+        if opt in ("-s", "--space"):
+            required_space = int(attr)
+            
+        if opt in ("-d", "--drive"):
+            drive = attr
+            
+        if opt in ("-h", "--help"):
+            print help_string
+            sys.exit()
+    
+    if required_space == None and drive == None:
+        print "ERROR: No parameters are defined"
+        print help_string
+        sys.exit (-3)
+
+    if required_space == None:
+        print "ERROR: Required Disk Space parameter is not defined to" \
+              "check space on the disk"
+        print help_string
+        sys.exit (-3)
+        
+    if drive == None:
+        print "ERROR: Drive parameter is missing"
+        print help_string
+        sys.exit (-3)
+    else:
+        if sys.platform == "win32":
+            if not ":" in drive:
+                drive = drive + ":"
+
+    print_space_report(drive, required_space)
+
+
+
+
+if __name__ == '__main__':
+    sys.exit(main())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/getenv.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1586 @@
+#============================================================================ 
+#Name        : getenv.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: Cleaned version.
+#============================================================================
+
+use strict;                 # strict naming rules
+use Cwd;                        # figuring out directories
+use Data::Dumper;       # debugging purposes
+use XML::Simple;        # for using xml parser
+use File::Copy;         # for copying files
+use SOAP::Lite;         # SOAP interface for s60build server
+use Getopt::Long;       # parameter handling
+Getopt::Long::Configure( "bundling_override","ignore_case_always" );
+# uncomment to get SOAP debug traces
+# use SOAP::Lite +trace => 'debug';
+
+# variables for commandline params
+my( $param_help,                    # print help
+        $param_server,              # manually select server
+        $param_release_path,    # where are the releases located in the server
+        $param_debug,                   # parameter for controlling extra debug prints
+        $param_latest,              # just grab the latest build (requires product name)
+        $param_keepgoing,           # continue even if dependency is missing
+        $param_print_only,      # do nothing but print system calls
+        $param_skipITD,             # do not extract internal, testsources and documentation
+        $param_emuenv,              # extract only emulator environment
+        $param_start_directly,# starts extracting directly without waiting user acceptance
+        $param_product,             # manually insert product name
+        $param_skip_deps,           # do not extract dependencies
+        $param_grace,                   # do not check for grace access
+        $param_no_soap,             # dont use soap connection
+        @param_exclude,             # exclude list
+        @param_include );           # include list
+
+# read commandline parameters
+my $result = GetOptions('help'          => \$param_help,                        # print help
+                                                'h'                 => \$param_help,                        # print help
+                                                'latest'        => \$param_latest,                  # just grab the latest build (requires product name)
+                                                'server=s'  => \$param_server,                  # manually select server
+                                                'path=s'        => \$param_release_path,        # extract this release directly
+                                                'verbose'       => \$param_debug,                       # verbose debug print
+                                                'k'                 => \$param_keepgoing,               # continue even if there is any problems
+                                                'p'                 => \$param_print_only,          # do nothing but print system calls
+                                                'skipitd'       => \$param_skipITD,                 # Deprecated: do not extract internal, testsources and documentation
+                                                'emu'               => \$param_emuenv,                  # Deprecated: extract only emulator environment
+                                                'start'         => \$param_start_directly,  # starts extracting directly without waiting user acceptance
+                                                'product=s' => \$param_product,                 # manually insert product name
+                                                'x=s'               => \@param_exclude,                 # filer list for excluding zips
+                                                'exclude=s' => \@param_exclude,                 # filer list for excluding zips
+                                                'i=s'               => \@param_include,                 # filer list for including zips
+                                                'include=s' => \@param_include,                 # filer list for including zips
+                                                'nodeps'        => \$param_skip_deps,               # do not extract dependencies
+                                                'grace'         => \$param_grace,                       # try to DL from GRACE
+                                                'nosoap'        => \$param_no_soap );               # dont try using SOAP for s60builds server
+
+# enums for error situations
+my $warning = 1;
+my $promptUser = 2;
+my $dependencyMissing = 3;
+my $cannotContinue = 4;
+
+# common global variables
+my $metaDataXml;                    # path to metadata file
+my $currentReleaseXml;      # path to currentRelease.xml if exists
+my $pathToReleaseFolder;    # path to server that has releases
+my $defaultServiceName;     # default name for service (s60rnd)
+my $pathToUnzip;                    # path to unzip tool
+my $tmpDlDir;                           # path to temp dir where we'll DL packages to
+my $tmpDir;                             # path to temp dir where we extract packages from
+my $returnValue;                    # holds the error codes coming from 7-zip
+my $graceServer;                    # path to local grace server if accessible
+my $logFile;                            # log file for troubleshooting
+my %packageHash;                    # hash containing zips to extract
+my @finalZipList;                   # contains final list of files to unzip
+my $getEnvVersion;              # version of this getenv script
+my $soapConnection;             # holding boolean value wheter we have connection s60builds server
+my $soapSessionID;              # holds the session ID received from SOAP server
+my $defaultPathToServer;    # default value for the server
+my $soapServiceURL = undef;
+
+# list of GRACE samba shares - must match to @graceNameList
+my @graceList = ();
+# must match to @graceList
+my @graceNameList = ();
+
+#these 2 lists need to match                    
+my @serviceList = ();
+my @serviceNameList = ();
+
+# default values
+$tmpDir = FixPaths( getcwd )."temp";
+$tmpDlDir = FixPaths( getcwd )."DlTemp";
+$defaultServiceName = undef;
+#$logFile = getcwd."/getenv.log";
+$pathToReleaseFolder = undef;
+$defaultPathToServer = undef;
+$pathToUnzip = "7za";
+$getEnvVersion = "2.4.0";
+
+# first open/create log file
+#open( LOGFILE, ">> $logFile" ) or handleError( "cant create log file: $!", $warning );
+eval {
+  open( LOGFILE, ">> getcwd.'/output/logs/getenv.log'" );
+}; 
+  if ($@) #if exception
+  {
+     open( LOGFILE, ">> getcwd.'/getenv.log'" ) ; 
+  }
+  
+print "S60 RnD environment getter v.$getEnvVersion\n\n";
+printLog( "getenv.pl version $getEnvVersion" );
+
+# The actual functionality
+if( $param_grace ) {
+# ToDo: find more clever way to figure out access
+    $graceServer = FindGraceServer( );
+}
+else {
+#   print "GRACE access is temporary disabled due to access problems\nEnable GRACE access by running getenv.pl -grace\n";
+}
+ValidateInputs( );
+printLog( "Following release we will extract: $metaDataXml" );
+PrintFinalWarning( );
+DownloadRelease( );
+# if we have SOAP connection we should end it
+if( $soapConnection ) {
+    my $sessionInfo = EndSoapConnection( );
+    print "\n\n".$sessionInfo->{'Info'}."\n\n" if( $sessionInfo->{'Info'} );
+}
+
+exit 0;
+
+
+sub ValidateInputs {
+    print_help( ) if ( $param_help );
+    
+    # try to get version info from s60builds SOAP server
+    my $versionInfoFromServer = GetSoapVersion( ) if( !$param_no_soap );
+    if( $versionInfoFromServer ) {
+        # we have access to SOAP server
+        printLog( "SOAP: access OK" );
+        $soapConnection = 1;
+        
+        # lets not start soap if prompt only is defined
+        $soapConnection = 0 if $param_print_only;
+        
+        printLog( "SOAP: latest OK version: ".$versionInfoFromServer->{'LatestOK'}->{'Version'} );
+        printLog( "SOAP: latest OK date: ".$versionInfoFromServer->{'LatestOK'}->{'Date'} );
+        printLog( "SOAP: latest version: ".$versionInfoFromServer->{'Latest'}->{'Version'} );
+        printLog( "SOAP: latest date: ".$versionInfoFromServer->{'Latest'}->{'Date'} );
+        
+        # compare version nmbrs and prompt user if outdated getenv
+        if( $getEnvVersion < $versionInfoFromServer->{'LatestOK'}->{'Version'} ) {
+            HandleError( "Your getenv is outdated and can not be usedanymore\nPlease get newer from the server.", $cannotContinue );
+        }       
+    }
+    else {
+        printLog( "SOAP: we dont have SOAP access" );
+        $soapConnection = 0;
+    }
+
+    if( @param_exclude and @param_include ) {
+        HandleError( "you cant specify include and exclude lists at the same time!", $cannotContinue );
+    }
+
+    # checking wheter we are in root of the substituted drive (if -start param is not specified)
+    if( ! $param_start_directly and
+            !   getcwd =~ /[a-zA-Z]:\// and
+                $param_keepgoing ) {
+        HandleError( "You should run getenv only in root of the substituted drive\nYou can use -k as keep going parameter if you think it is ok to proceed", $cannotContinue );
+    }
+
+    # ok we are in root. Is the drive empty?
+    my $xmlFile = 0;
+    my $driveEmpty = 1;
+    
+    opendir( ROOT, "/" ) or HandleError( "cant read root dir: $!", $warning );
+    my @filesFound = readdir( ROOT );
+    closedir( ROOT );
+    foreach my $file( @filesFound ) {
+        next if $file =~ /^\.[\.]?$/;
+        next if $file =~ /getenv/;
+        $xmlFile = 1 if $file =~ /.*metadata.*\.xml/;
+        $xmlFile = 1 if $file =~ /currentRelease\.xml/;
+        $driveEmpty = 0;
+    }
+    
+    printLog( "xml files: $xmlFile" );
+    printLog( "drive empty: $driveEmpty" );
+
+    # if drive is not empty and no xmls found ==> print warning (if -start param not specified)
+    if( ! $param_start_directly and ! $xmlFile and ! $driveEmpty ) {
+        HandleError( "The drive you are about to extract environment is not empty!\nHit CTRL-C to break now or <enter> to continue", $promptUser );
+    }
+
+    # if there is valid metadata.xml in root, params like path or latest doesn't make any sense
+    if( $xmlFile ) {
+        foreach my $file( @filesFound ) {
+            if( $file =~ /.*metadata(_(\d*))?.xml$/i ) {
+                print "metadata file found!\n";
+                if( ValidateXmlFile( getcwd.$file ) ) {
+                    $metaDataXml = getcwd.$file;
+                    last;
+                }
+            }
+        }
+    }
+
+    if( $metaDataXml ) {
+        if( $param_latest or $param_release_path ) {
+            print "It doesnt make sense to use 'path' or 'latest' parameter while having metadata.xml in root!\n\n";
+            print_help( );
+            exit 0;
+        }
+
+        # we should ask correct grace share if xmlfile !server !start       
+        if( !$param_server and ! $param_start_directly ) {
+            print "For your convenience it is recommended to use GRACE samba share close to you.\n";
+            # prompt user wheter he wants to use GRACE
+            my $networkAccessVerified = 0;
+            while( $networkAccessVerified eq 0 ) {
+                my $wantedServer = FixPaths( $graceList[ ReturnMenuIndex( "Please select share closest to you", @graceNameList ) ] );
+        
+                if( $wantedServer eq FixPaths( $graceList[0] ) ) {
+                    HandleError( "Please notice that access to $graceList[0] will be removed from wk50 onwards. Now would be perfect time to get yourself a GRACE access.", $promptUser );
+                }
+            
+                printLog( "selected: $wantedServer - accessing.." );
+                if( opendir( GRACETEST, $wantedServer ) ) {
+                    printLog( "connection tested OK" );
+                    $networkAccessVerified = 1;
+                    $pathToReleaseFolder = $wantedServer;
+                }
+                else {
+                    print "Unable to access $wantedServer\nPlease select another network share.\n";
+                }
+            }
+        }
+        
+        # in case we have metadata in \ and -start defined, look grace automatically
+        elsif( !$param_server and $param_start_directly ) {
+            $pathToReleaseFolder = FindGraceServer( );
+        }
+    }
+    
+    # ToDo: if there is not metadata.xml in root check if we have already env. Possibly update?
+    
+    # is 'path' parameter is used, find out (wheter there exists) valid metadata.xml
+    if( $param_release_path ) {
+        if( $param_latest or $param_product ) {
+            print "It doesnt make sense to use 'path' or 'latest' parameter while having metadata.xml in root!\n\n";
+            print_help( );
+            exit 0;
+        }
+        $metaDataXml = FixPaths( $param_release_path );
+        $metaDataXml .= SearchValidXml( $metaDataXml );
+        printLog( "setting metadata: $metaDataXml" );
+    }
+    
+    # handle server parameter
+    # simply just verify accessablility and fix path
+    if( $param_server ) {
+        $pathToReleaseFolder = FixPaths( $param_server );
+        opendir( OPENTEST, $pathToReleaseFolder ) or HandleError( "Unable to access given server path: $pathToReleaseFolder\n$!", $cannotContinue );
+        closedir( OPENTEST );
+    }
+    
+    # param_latest is used to just get latest release - requires product
+    if( $param_latest ) {
+        if( $param_product ) {
+            $param_product = FixPaths( $param_product );
+            
+            # once the network share is unavailable then tries to find grace share
+            $pathToReleaseFolder = FindGraceServer( );
+            
+            opendir( RELDIR, $pathToReleaseFolder.$defaultServiceName.$param_product ) or die "unable to open $pathToReleaseFolder$defaultServiceName$param_product\n$!";
+            # scan all xml files to @files_found
+# salmarko starts
+            my @files_found = grep { /^pf_|^S60_|^dfs_/i } readdir RELDIR;
+# salmarko ends
+            close RELDIR;
+
+            if( @files_found ) {
+                foreach( reverse sort ( @files_found ) ) {
+                    # we only want to get the last dir name..
+                    s/.*\///i;
+                    my $productToDl = $pathToReleaseFolder.$defaultServiceName.$param_product;
+                    $productToDl .= FixPaths( $_ );
+                    print "Searching metadata.xml files from $productToDl\n" if $param_debug;
+
+                    $metaDataXml = SearchValidXml( $productToDl ) ;
+                    if( $metaDataXml ) {
+                        $metaDataXml = $productToDl.$metaDataXml;
+                        printLog( "selected xml: $metaDataXml" );
+                        last;
+                    }
+                }
+            }
+            else {
+                HandleError( "cannot find releases from $pathToReleaseFolder$defaultServiceName$param_product", $cannotContinue );
+            }
+        }
+        else {
+            die "If you specify -latest parameter you have to define -product also!\n";
+        }
+    }
+    
+    # use wizard to find out what to DL
+    if( ! $metaDataXml ) {
+        printLog( "Not enought valid inputs provided - running wizard..." );
+        RunWizard( );
+    }
+    
+    # check wheter metadata and currentRelease adds up
+    if( -e FixPaths( getcwd )."currentRelease.xml") {
+        printLog( "CurrenRelease.xml exists. Checking wheter update is possible" );
+        
+        # compare service, product and release with xml files
+        my $CurrentRelXmlParser = new XML::Simple( );
+        my $currentReleaseData = $CurrentRelXmlParser->XMLin( FixPaths( getcwd )."currentRelease.xml" );
+        
+        my $xmlParser = new XML::Simple( );
+        my $xmlData = $xmlParser->XMLin( $metaDataXml );
+
+# salmarko starts
+        my $currentRelease = '';
+        my $newRelease = '';
+
+        if ( !defined $xmlData->{releaseDetails}->{dependsOf}->{service}->{name} ) { # no dependencies, lets compare current to new
+            # compare services
+            if( $currentReleaseData->{releaseDetails}->{releaseID}->{service}->{name} ne
+                    $xmlData->{releaseDetails}->{releaseID}->{service}->{name} ) {
+                HandleError( "Can not extract ".$xmlData->{releaseDetails}->{releaseID}->{service}->{name} .
+                " release on top of ".$currentReleaseData->{releaseDetails}->{releaseID}->{service}->{name}, $cannotContinue );
+            }
+            # compare products
+            if( $currentReleaseData->{releaseDetails}->{releaseID}->{product}->{name} ne
+                    $xmlData->{releaseDetails}->{releaseID}->{product}->{name} ) {
+                HandleError( "Can not extract ".$xmlData->{releaseDetails}->{releaseID}->{product}->{name} .
+                " release on top of ".$currentReleaseData->{releaseDetails}->{releaseID}->{product}->{name}, $cannotContinue );
+            }
+            printLog( "service and product matches.. checking release" );
+
+            $currentRelease = $currentReleaseData->{releaseDetails}->{releaseID}->{release}->{name};
+            $newRelease = $xmlData->{releaseDetails}->{releaseID}->{release}->{name};
+        }
+        else{
+            # compare services
+            if( $currentReleaseData->{releaseDetails}->{releaseID}->{service}->{name} ne
+                    $xmlData->{releaseDetails}->{dependsOf}->{service}->{name} ) {
+                HandleError( "Can not extract ".$xmlData->{releaseDetails}->{dependsOf}->{service}->{name} .
+                " release on top of ".$currentReleaseData->{releaseDetails}->{releaseID}->{service}->{name}, $cannotContinue );
+            }
+            # compare products
+            if( $currentReleaseData->{releaseDetails}->{releaseID}->{product}->{name} ne
+                    $xmlData->{releaseDetails}->{dependsOf}->{product}->{name} ) {
+                HandleError( "Can not extract ".$xmlData->{releaseDetails}->{dependsOf}->{product}->{name} .
+                " release on top of ".$currentReleaseData->{releaseDetails}->{releaseID}->{product}->{name}, $cannotContinue );
+            }
+            printLog( "service and product matches.. checking release" );
+            
+            # compare releases
+            $currentRelease = $currentReleaseData->{releaseDetails}->{releaseID}->{release}->{name};
+            $newRelease = $xmlData->{releaseDetails}->{dependsOf}->{release}->{name};
+
+            if ( $currentRelease =~ m/^(S60_\d_\d+_\d{6})/i or $currentRelease =~ m/^(pf_\d{4}_\d{6})/ ) {
+                $currentRelease = $1;
+            }
+            else {
+                HandleError( "Current release info unknown or missing: $currentRelease", $cannotContinue );
+            }
+
+            if ( $newRelease =~ m/^(S60_\d_\d+_\d{6})/i or $newRelease =~ m/^(pf_\d{4}_\d{6})/ ) {
+                $newRelease = $1;
+            }
+            else {
+                HandleError( "New release info unknown or missing: $newRelease", $cannotContinue );
+            }
+        }
+
+        printLog( "current release: $currentRelease" );
+        printLog( "release to extract: $newRelease" );
+# salmarko ends
+
+        if( $currentRelease ne $newRelease ) {
+            HandleError( "Can not extract $newRelease release on top of $currentRelease", $cannotContinue );
+        }
+        printLog( "release matches - update possible" );
+        
+        $currentRelease = FixPaths( getcwd )."currentRelease.xml";
+    }
+}
+
+
+# Make sure paths are as perl likes 'em
+# change '\' ==> '/' and make sure last char is /
+sub FixPaths {
+    my $tmpParam = shift;
+    $tmpParam =~ s/\\/\//g;
+    
+    if( substr( $tmpParam, -1 ) eq "/" ) {
+        return $tmpParam;
+    }
+    else {
+        return $tmpParam."/";
+    }
+}
+
+# Make sure paths are as windows likes 'em
+# change '/' ==> '\\' and make sure last char is \\
+sub UnFixPaths {
+    my $tmpParam = shift;
+    $tmpParam =~ s/\//\\/g;
+    
+    if( substr( $tmpParam, -1 ) eq "\\" ) {
+        return $tmpParam;
+    }
+    else {
+        return $tmpParam."\\";
+    }
+}
+
+# smarter handling of logging
+sub printLog {
+    foreach my $trace ( @_ ) {
+        if( $param_debug ) {
+            # we should print traces for STDOUT as well
+            my ($sec,$min,$hr) = localtime();
+        printf( "%02d:%02d:%02d: ", $hr, $min, $sec );
+            print $trace."\n";
+        }
+    
+        # we should print traces for log file
+        my ($sec,$min,$hr) = localtime();
+      printf LOGFILE ( "%02d:%02d:%02d: ", $hr, $min, $sec );
+        print LOGFILE $trace."\n";
+    }
+}
+
+sub HandleError {
+    my( $errorString, $errorType ) = @_;
+    printLog( "HandleError: $errorString, type: $errorType" );
+    
+    if( $errorType eq $warning ) {
+        print "\nWARNING: $errorString\n";
+    }
+    if( $errorType eq $promptUser ) {
+        print "\nWARNING: $errorString\n\n";
+        print "Press <enter> to continue..\n" if( ! $param_start_directly );
+        my $selection = <STDIN> if( ! $param_start_directly );
+    }
+    elsif( $errorType eq $dependencyMissing ) {
+        if( $param_keepgoing ) {
+            print "\nERROR: Required dependency missing: $errorString\n\n";
+        }
+        else {
+            die "ERROR: all the needed dependencies doesn't exist!\n$errorString\nIf you think it is ok to ignore this error you can use -k as keep-going parameter\nYou should report this to administrator of the server\n\ngetenv will now exit\n\n";
+        }
+    }
+    elsif( $errorType eq $cannotContinue ) {
+        if( $param_keepgoing ) {
+            print "\nWARNING: $errorString\n\n";
+        }
+        else {
+            die "\nERROR:\n============\n$errorString\ngetenv will now exit\nIf you think it is ok to ignore this error you can use -k as keep going parameter\n\n";
+        }
+    }
+}
+
+# checks wheter the xml file seems sane (has service, product and name set)
+sub ValidateXmlFile {
+    my $xmlFile = shift( @_ );
+    printLog( "Validating $xmlFile" );
+
+    # open the xml file and check wheter it is something we want
+    my $dependencyXmlParser = new XML::Simple( );
+    my $dependencyData = $dependencyXmlParser->XMLin( $xmlFile );
+    
+    # if releaseDetails->releaseID->service&product&release are found consider this as valid file
+    if( $dependencyData->{releaseDetails}->{releaseID}->{service}->{name} and
+            $dependencyData->{releaseDetails}->{releaseID}->{product}->{name} and
+            $dependencyData->{releaseDetails}->{releaseID}->{release}->{name} ) {
+        # return xml file with path
+        printLog( "xml file OK" );
+        return 1;
+    }
+    else {
+        printLog( "xml file doesn't seem to be sane!" );
+        return 0;
+    }
+}
+
+sub print_help {
+    print "
+usage
+=====
+getenv.pl [params]
+  getenv.pl             use no parameters to run small wizard
+  getenv.pl -h(elp)     print help
+  getenv.pl -k          keep going even when errors occurs
+  getenv.pl -p          do nothing, but print system calls
+  getenv.pl -emu        DEPRECATED - prefer filtering: get only emulator environment
+  getenv.pl -start      starts extracting without user confirmation (nice for scripts)
+  getenv.pl -nodeps     do not download dependencies for the release
+  getenv.pl -nosoap     dont try to use SOAP connection for s60builds server
+  getenv.pl -skipitd    DEPRECATED - prefer filtering: skips useless doc, internal, tsrc zips
+  getenv.pl -verbose    print debug traces
+  getenv.pl -Include    include only some types of packages (emu, src, tsrc)
+  getenv.pl -eXclude    exclude some types of packages (emu, src, tsrc)
+
+examples
+========
+  get latest PRODUCT release:
+      getenv.pl -latest -product PRODUCT
+  get s60 release from server \\\\SERVER\\LOCATION:
+      getenv.pl -server \\\\SERVER\\LOCATION
+  get s60 release located in \\\\SERVER\\LOCATION\\BUILDS\\PRODUCT\\RELEASE:
+      getenv.pl -path \\\\SERVER\\LOCATION\\BUILDS\\PRODUCT\\RELEASE
+  get s60 release pointed with -path and print verbose messages:
+      getenv.pl -path \\\\SERVER\\LOCATION\\BUILDS\\PRODUCT\\RELEASE -verbose
+
+Filtering
+=========
+  You can include or exclude certain types of packages to unzip.
+  For example you can unzip only emulator binaries with -include emu (or -i emu)
+  Or if you don't want test sources and documents use -exclude tsrc (or -x tsrc)
+  Possible filters are emu, src, tsrc and we can put plenty more into metadata.xml if needed
+  To get latest PRODUCT emulator environment use
+      getenv.pl -latest -product PRODUCT -i emu
+  To get only custom build without winscw binaries use
+      getenv.pl -path \\\\SERVER\\LOCATION\\BUILDS\\PRODUCT\\RELEASE -x emu
+";
+    exit 0;
+}
+
+    
+    
+    
+    
+# returns file name of correct xml file in given directory
+sub SearchValidXml {
+    my $searchDir = shift @_;
+    printLog( "finding valid xml files from: $searchDir" );
+
+    # validate xml files from selected directory
+    opendir( XMLDIR, $searchDir ) or die "can't open $searchDir: $!";
+    # scan all xml files to @xmlFiles
+    my @xmlFiles = grep /\.xml$/, readdir XMLDIR;
+    close XMLDIR;
+#   print Dumper( @xmlFiles );
+
+    # sort files in ascenting order (so latest comes first: _001
+    @xmlFiles = sort {$b cmp $a} (@xmlFiles);
+
+    foreach my $xmlCandidate ( @xmlFiles ) {
+        printLog( "xmlfile: $xmlCandidate" );
+        # open the xml file and check wheter it is something we want
+        my $xmlParser = new XML::Simple( );
+        my $releaseData = $xmlParser->XMLin( $searchDir."/".$xmlCandidate );
+        
+        # if releaseDetails->releaseID->service&product&release are found consider this as valid file
+        if( $releaseData->{releaseDetails}->{releaseID}->{service}->{name} and
+                $releaseData->{releaseDetails}->{releaseID}->{product}->{name} and
+                $releaseData->{releaseDetails}->{releaseID}->{release}->{name} ) {
+            # return xml file with path
+            return $xmlCandidate;
+        }
+    }
+    
+    # in case we came until here the xml file is not found
+    HandleError( "Valid release_metadata.xml file was not found from $searchDir", $cannotContinue );
+}
+
+sub RunWizard {
+    print "Server is heavily loaded and therefore also download times might be drawn out.\nFor your convenience it is recommended to use samba share close to you.\n";
+# salmarko starts
+    if( !$param_server ) {
+# salmarko ends
+        # prompt user wheter he wants to use GRACE
+        my $wantedServer;
+        my $networkAccessVerified = 0;
+        while( $networkAccessVerified eq 0 ) {
+            $wantedServer = FixPaths( $graceList[ ReturnMenuIndex( "Please select share closest to you", @graceNameList ) ] );
+            
+            if( $wantedServer eq FixPaths( $graceList[0] ) ) {
+                HandleError( "Please notice that access to $graceList[0] will be removed from wk50 onwards. Now would be perfect time to get yourself GRACE access.", $promptUser );
+            }
+        
+            printLog( "selected: $wantedServer - accessing.." );
+            if( opendir( GRACETEST, $wantedServer ) ) {
+                printLog( "connection tested OK" );
+                $networkAccessVerified = 1;
+                $pathToReleaseFolder = $wantedServer;
+            }
+            else {
+                print "Unable to access $wantedServer\nPlease select another network share.\n";
+            }
+        }
+        my $wantedService = $serviceList[ ReturnMenuIndex( "Please select GRACE Service.", @serviceNameList)];
+        printLog( "selected: $wantedServer.$wantedService - accessing.." );
+		local *GRACETEST2;
+        if( opendir( GRACETEST2, $wantedServer.$wantedService ) ) {
+            printLog( "serviceconnection tested OK" );
+            $defaultServiceName = $wantedService
+            }
+            else {
+            print "Unable to access $wantedServer.$wantedService\nPlease select another network share or service.\n";
+            }
+    }
+
+    # find & select correct product from the server
+    my @productFiles = FindAvailableProducts( );
+    if( ! @productFiles ) {
+        HandleError( "Server seem to be empty!\nPlease check the server path: $pathToReleaseFolder$defaultServiceName\n$!", $cannotContinue );
+    }
+    my $product = PrintSelectMenu( "Products found from server", @productFiles );
+    $product = FixPaths( $product );
+    printLog( "selected product: $product" );
+    
+    # find & select correct release from above selected path
+    my @releaseFiles = FindAvailableReleases( $product );
+    if( ! @releaseFiles ) {
+        HandleError( "Cant find any releases from: $pathToReleaseFolder$defaultServiceName.$product\n$!", $cannotContinue );
+    }
+    my $release = PrintSelectMenu( "Releases found from server", @releaseFiles );
+    $release = FixPaths( $release );
+    printLog( "selected release: $release" );
+    
+    # select correct xml file from selected release
+    $metaDataXml = SearchValidXml( $pathToReleaseFolder.$defaultServiceName.$product.$release );
+    $metaDataXml = $pathToReleaseFolder.$defaultServiceName.$product.$release.$metaDataXml;
+    printLog( "selected metadata: $metaDataXml" );
+}
+
+# check what products is there under servers release path
+sub FindAvailableProducts {
+    opendir( DIR, $pathToReleaseFolder.$defaultServiceName )
+        or HandleError( "Can't open directory: $pathToReleaseFolder$defaultServiceName\n$!", $cannotContinue );
+#change to match only for directories
+#   my @productFiles = grep { /s(eries_)?60_\d_\d/i } readdir (DIR);
+# salmarko starts
+    my @productFiles = grep /^pf_|^S60_|^DFS/i, readdir (DIR);
+# salmarko ends
+    printLog( @productFiles );
+    closedir( DIR );
+    
+    # return found releases sorted
+    return sort( @productFiles );
+}
+
+# print selection menus
+sub PrintSelectMenu {
+    my( $topic, @inputArray ) = @_;
+    
+    # print topic line
+    print "\n\n$topic:\n";
+    for( my $i = length( $topic ); $i>=0; $i-- ) {
+        print "=";
+    }
+    print "\n";
+    
+    # print actual selections
+    my $counter = 0;
+    foreach my $line( @inputArray ) {
+        $counter ++;
+        print "$counter:\t$line\n";
+    }
+
+    print "\n\nx:\texit\n";
+    print "\nselection: ";
+    my $selection = <STDIN>;
+    chop( $selection );
+    
+    exit 1 if( $selection eq 'x' );
+    
+    # check user input
+    while( ! $selection =~ /\d*/ and
+                    $selection > $counter )
+        {
+            if( $selection =~ /\d*/ ) {
+                print "Invalid selection. Please check value from the list above\n";
+            }
+            else {
+                print "Please insert numerical value from the list\n";
+            }
+            print "\nselection: ";
+            $selection = <STDIN>;
+            chop( $selection );
+            
+            exit 1 if( $selection eq 'x' );
+        }
+
+    # return array index
+    $selection--;
+    return( $inputArray[$selection] );
+}
+
+# print selection menus
+sub ReturnMenuIndex {
+    my( $topic, @inputArray ) = @_;
+    
+    # print topic line
+    print "\n\n$topic:\n";
+    for( my $i = length( $topic ); $i>=0; $i-- ) {
+        print "=";
+    }
+    print "\n";
+    
+    # print actual selections
+    my $counter = 0;
+    foreach my $line( @inputArray ) {
+        $counter ++;
+        print "$counter:\t$line\n";
+    }
+
+    print "\n\nx:\texit\n";
+    print "\nselection: ";
+    my $selection = <STDIN>;
+    chop( $selection );
+    
+    exit 1 if( $selection eq 'x' );
+    
+    # check user input
+    while( ! $selection =~ /\d*/ and
+                    $selection > $counter )
+        {
+            if( $selection =~ /\d*/ ) {
+                print "Invalid selection. Please check value from the list above\n";
+            }
+            else {
+                print "Please insert numerical value from the list\n";
+            }
+            print "\nselection: ";
+            $selection = <STDIN>;
+            chop( $selection );
+            
+            exit 1 if( $selection eq 'x' );
+        }
+
+    # return array index
+    $selection--;
+    return $selection;
+}
+
+# check what releases are there under selected product
+sub FindAvailableReleases {
+    my $selectedProduct = shift( @_ );
+    printLog( "searching available releases from $selectedProduct" );
+#   print $serverPath.$selectedProduct."\n";
+    opendir( DIR, $pathToReleaseFolder.$defaultServiceName .$selectedProduct ) or die "Can't open dir: $!\n";
+#   my @releaseFiles = grep { /S60_\d_\d.*/ } readdir (DIR);
+# salmarko starts
+    my @releaseFiles = grep /^pf_|^S60/i, readdir (DIR);
+# salmarko ends
+#   print Dumper( @releaseFiles );
+    closedir (DIR);
+#TODO: maybe we should also check wheter xml files exists in release
+    return sort {$b cmp $a} ( @releaseFiles );
+}
+
+# maybe we should print warning only 
+sub PrintFinalWarning {
+    if( ! $param_start_directly ) {
+        # we'll print warnings only if extracting on top of something else (aka not empty dir)
+#       print "About to start extracting\n$metaDataXml";
+#       print "\nHit ctrl-C now to abort, otherwise press enter to continue\n\n";
+#       my $selection = <STDIN>;
+        print scalar(localtime). ": start fetching environment\n";
+    }
+}
+
+# handles controlled downloading of the environment pointed by $metaDataXml
+sub DownloadRelease {
+    # open wanted metadata.xml file
+    my $xmlParser = new XML::Simple( );
+    my $data = $xmlParser->XMLin( $metaDataXml );
+    
+    # parse download directory based on given arguments and xml file to $releaseLocationInServer
+    my $releaseLocationInServer;
+    if( ! $param_release_path ) {
+        $releaseLocationInServer = ParseDownloadDir( $data );
+    }
+    else {
+        $releaseLocationInServer = $param_release_path;
+    }
+    
+    # read files from the xml to %packageHash
+    GeneratePackageHash( $data, $releaseLocationInServer );
+    printLog( "package hash generated" );
+    
+    # insert needed files to @finalZipList
+    SortFilesToFinalLists( );
+    printLog( "files sorted to final zip list" );
+    
+    # check if there is dependencies we need to extract as well
+    if( ! $param_skip_deps and
+            $data->{releaseDetails}->{dependsOf}->{service} ) {
+        # read from xml where can we get dependeny
+        my $dependsOfService = $data->{releaseDetails}->{dependsOf}->{service}->{name};
+        my $dependsOfProduct = $data->{releaseDetails}->{dependsOf}->{product}->{name};
+        my $dependsOfRelease = $data->{releaseDetails}->{dependsOf}->{release}->{name};
+    
+        printLog( "First dl: $dependsOfService $dependsOfProduct $dependsOfRelease" );
+        
+        # add dependency files to finalLists
+        AddDependencies( $dependsOfService, $dependsOfProduct, $dependsOfRelease );
+    }
+    
+    # we should check wheter there already exists old build (currentRelease.xml) and reduct the files
+    if( -e FixPaths( getcwd )."currentRelease.xml" ) {
+        # reduct old DL'd files (currentrelease.xml and it's dependencies)
+        # passing param '1' as for printing
+        RemoveThisXmlFromFinalList( FixPaths( getcwd )."currentRelease.xml", 1 );
+    }
+    if( VerifyFinalZipList( ) or $param_keepgoing ) {
+        # start SOAP session
+        if( $soapConnection ) {
+            my $soapSessionInfo = StartSoapSession( );
+            printLog( "SOAP: note ".$soapSessionInfo->{'HelloNote'} );
+            printLog( "SOAP: sessionid ".$soapSessionInfo->{'SessionID'} );
+            
+            print "\n".$soapSessionInfo->{'HelloNote'}."\n\n" if( $soapSessionInfo->{'HelloNote'} );
+            $soapSessionID = $soapSessionInfo->{'SessionID'};
+            printLog( "SOAP: soapSessionID set: $soapSessionID" );
+        }
+        
+        # extract the environment
+        GetEnv( );
+    }
+}
+
+# return download directory from the metadata.xml
+sub ParseDownloadDir {
+    my $data = shift( @_ );
+    my $releaseLocationInServer;
+    
+    # parse dl directory into $releaseDirectory
+    $releaseLocationInServer = $data->{releaseDetails}->{releaseID}->{service}->{name} . "/";
+    $releaseLocationInServer .= $data->{releaseDetails}->{releaseID}->{product}->{name} ."/";
+    $releaseLocationInServer .= $data->{releaseDetails}->{releaseID}->{release}->{name} ."/";
+	local *DEPTEST;
+    
+    # check if we can find this release from GRACE
+    if( $graceServer ) {
+        if( -e $graceServer.$releaseLocationInServer."grace.txt" ) {
+            printLog( "dl dir: $graceServer$releaseLocationInServer" );
+            return $graceServer.$releaseLocationInServer;
+        }
+        else {
+            printLog( "dl dir: $pathToReleaseFolder$releaseLocationInServer" );
+            return $pathToReleaseFolder.$releaseLocationInServer;
+        }
+    }
+    else {
+        # while call to remove dependency xmls is recursive, we dont know actual DL path
+
+        if( opendir( DEPTEST, $pathToReleaseFolder.$releaseLocationInServer ) ) {
+            return $pathToReleaseFolder.$releaseLocationInServer;
+        }
+        else {
+            return $defaultPathToServer.$releaseLocationInServer;
+        }
+    }
+}
+
+# generates %packageHash that contains data about needed files
+# param: xml data handle
+sub GeneratePackageHash {
+    my( $xmlDataHandle, $releaseInServer )  = @_;
+    my $finalState = 0;
+    printLog( "parse filenames to extract to packageHah" );
+        
+    # generate new hash of zips to DL for %packageHash
+    # foreach my $key( sort { $xmlDataHandle{a}->{'state'} <=> $xmlDataHandle{b}->{'state'} } %{$xmlDataHandle->{releaseFiles}->{'package'} } ){
+    foreach my $key( keys(%{$xmlDataHandle->{releaseFiles}->{package} } ) ) {
+        printLog( "adding $key to packageHash" );
+        ${packageHash}{$key}{path} = FixPaths( $releaseInServer );
+        ${packageHash}{$key}{type} = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'type'};
+        ${packageHash}{$key}{state} = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'state'};
+        ${packageHash}{$key}{extract} = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'extract'};
+        ${packageHash}{$key}{default} = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'default'};
+        
+        # added 31.7.2007 : check filters -attribute
+        if ($xmlDataHandle->{releaseFiles}->{package}->{$key}->{'filters'}){
+            ${packageHash}{$key}{s60filter} = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'filters'};
+        }
+        elsif ($xmlDataHandle->{releaseFiles}->{package}->{$key}->{'s60filter'}) {;
+            ${packageHash}{$key}{s60filter} = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'s60filter'};
+        }   
+
+        # find out what is the latest state
+        if( $finalState < $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'state'} ) {
+            $finalState = $xmlDataHandle->{releaseFiles}->{package}->{$key}->{'state'};
+        }
+    }
+    
+    # we should check wheter this xml has servicepacks
+    my $spName = $xmlDataHandle->{servicePacks}->{servicePack}->{name};
+    # always increase final state
+    $finalState ++;
+    if( $spName ) {
+        printLog( "spname: $spName" );
+        $finalState ++;
+        my $spFileName = $xmlDataHandle->{servicePacks}->{servicePack}->{file}->{name};
+        # if we get spFileName we should extract SP zip
+        if( $spFileName ) {
+            printLog( "spFileName: $spFileName" );
+            ${packageHash}{$spFileName}{path} = FixPaths( $releaseInServer );
+            ${packageHash}{$spFileName}{type} = "zip";
+            ${packageHash}{$spFileName}{state} = $finalState;
+            ${packageHash}{$spFileName}{extract} = "single";
+            ${packageHash}{$spFileName}{default} = "true";
+            $finalState ++;
+        }
+        # if there is servicePack->instructions we should read specianInstructions file
+        my $specialInstructions = $xmlDataHandle->{servicePacks}->{servicePack}->{instructions};
+        if( $specialInstructions ) {
+            printLog( "read special instructions" );
+        }
+    }
+    # this is needed due to SymSEE's obsolete xml library
+    # in case there is > 1 SP's in one XML file
+    else {
+        foreach( keys(%{$xmlDataHandle->{servicePacks}->{servicePack} } ) ) {
+#       foreach my $tmparray( $xmlDataHandle->{servicePacks}->{servicePack} ) {
+            printLog( "spname: $_" );
+            my $spFileName = $xmlDataHandle->{servicePacks}->{servicePack}->{$_}->{file}->{name};
+            printLog( "spFileName: $spFileName" );
+            ${packageHash}{$spFileName}{path} = FixPaths( $releaseInServer );
+            ${packageHash}{$spFileName}{type} = "zip";
+            ${packageHash}{$spFileName}{state} = $finalState;
+            ${packageHash}{$spFileName}{extract} = "single";
+            ${packageHash}{$spFileName}{default} = "true";
+            $finalState ++;
+        }
+    }
+}
+
+# inserts files on beginning of @finalZipList so they are readable in correct order when extracting (dependencies first)
+sub SortFilesToFinalLists {
+    foreach my $zips( sort { $packageHash{$b}->{'state'} <=> $packageHash{$a}->{'state'} } keys %packageHash ) {
+        if( $packageHash{$zips}->{'default'} eq 'true' ) {
+            my $tmpHash = $packageHash{$zips};
+            $tmpHash->{'filename'} = $zips;
+            unshift @finalZipList, $tmpHash;
+        }
+    }
+    %packageHash = 0;
+}
+
+sub AddDependencies {
+    # parameters contains info which release needs to be DL'd first
+    my( $dependsOfService, $dependsOfProduct, $dependsOfRelease ) = @_;
+    my $dependsOf = $dependsOfService ."/". $dependsOfProduct ."/". $dependsOfRelease ."/";
+    
+    # if we are here, dependecies really exists..
+#   print "the package has dependency: $dependsOf\n";
+#   print "so calling self with $serverPath and $dependsOf\n";
+
+    # first we'll have to find correct xml file
+    my $xmlPath;
+    # if we are DL'ing from custom path ==> first check relative path
+    if( $param_release_path ) {
+        # best guess is $param_release_path\..\..\..\$dependsOf even though it is not very common situation
+        my $dependencyPath = FixPaths( $param_release_path ) . "../../../" . FixPaths( $dependsOf );
+        if( -e $dependencyPath."release_metadata.xml" ) {
+            printLog( $dependencyPath ."release_metadata.xml exists - setting dependencyPath accordingly" );
+            $xmlPath = $dependencyPath;
+        }
+        # in case it is not in relative path we should try finding it from release server
+        elsif( -e $pathToReleaseFolder.$dependsOf."release_metadata.xml" ) {
+            printLog( $dependencyPath ."release_metadata.xml not not exist - setting dependencyPath accordingly" );
+            $xmlPath = $pathToReleaseFolder.$dependsOf;
+        }
+    }
+    # param_release_path not defined
+    else {
+        $xmlPath = $pathToReleaseFolder.$dependsOf;
+    }
+    printLog( "xmlpath: $xmlPath" );
+    
+    if (!-e $xmlPath && $param_keepgoing) {return;}
+    
+    my $dependecyXml = SearchValidXml( $xmlPath );
+    printLog( "xml candidate: $dependecyXml" );
+    # open the xml file and check wheter it is the one we want
+    my $dependencyXmlParser = new XML::Simple( );
+    my $dependencyData = $dependencyXmlParser->XMLin( $xmlPath.$dependecyXml );
+    
+    # read releaseDetails from xml candidate
+    my $tmpServiceName = $dependencyData->{releaseDetails}->{releaseID}->{service}->{name};
+    my $tmpProductName = $dependencyData->{releaseDetails}->{releaseID}->{product}->{name};
+    my $tmpReleaseName = $dependencyData->{releaseDetails}->{releaseID}->{release}->{name};
+    
+    
+    printLog( "tmpServiceName:   $tmpServiceName tmpProductName:   $tmpProductName tmpReleaseName:   $tmpReleaseName" );
+    printLog( "dependsOfService: $dependsOfService dependsOfProduct: $dependsOfProduct dependsOfRelease: $dependsOfRelease" );
+    
+    # compare xml candidate's data to dependency data
+    if( $tmpServiceName eq $dependsOfService and
+            $tmpProductName eq $dependsOfProduct and
+            $tmpReleaseName eq $dependsOfRelease ) {
+        printLog( "MATCH!" );
+        
+        my $dependencyLocationInServer;
+        
+        if(! $param_release_path ) {
+            $dependencyLocationInServer = ParseDownloadDir( $dependencyData );
+        }
+        else {
+            $dependencyLocationInServer = $xmlPath;
+        }
+        printLog( "So calling downloadRelease with serverpath: $dependencyLocationInServer, metadatafile: $dependsOf$dependecyXml" );
+        
+        # read files from dependency xml to %packageHash
+        GeneratePackageHash( $dependencyData, $dependencyLocationInServer );
+        printLog( "dependency package hash generated" );
+    
+        # insert needed files to @finalZipList
+        SortFilesToFinalLists( );
+        printLog( "dependency files sorted to final zip list" );
+        
+        # check if there is still dependencies we need to extract
+        if( $dependencyData->{releaseDetails}->{dependsOf}->{service} ) {
+            # read from xml where can we get dependeny
+            my $dependsOfService = $dependencyData->{releaseDetails}->{dependsOf}->{service}->{name};
+            my $dependsOfProduct = $dependencyData->{releaseDetails}->{dependsOf}->{product}->{name};
+            my $dependsOfRelease = $dependencyData->{releaseDetails}->{dependsOf}->{release}->{name};
+        
+            printLog( "First dl: $dependsOfService $dependsOfProduct $dependsOfRelease" );
+            
+            # add dependency files to finalLists
+            AddDependencies( $dependsOfService, $dependsOfProduct, $dependsOfRelease );
+        }
+    }
+    else {
+        HandleError( "Dependency release $xmlPath.$dependecyXml doesnt seem to match with actual downloadable", $cannotContinue );
+    }
+}
+
+sub RemoveThisXmlFromFinalList {
+    my( $xmlFileName, $printRemoving ) = @_;
+    
+    printLog( "Removing contents of $xmlFileName from finalziplist" );
+    
+    my $currentReleaseXmlParser = new XML::Simple( );
+    my $currentReleaseXmlHandle = $currentReleaseXmlParser->XMLin( $xmlFileName );
+    if( $printRemoving ) {
+        print $currentReleaseXmlHandle->{releaseDetails}->{releaseID}->{release}->{name};
+        print " exists already => extracting only delta\n\n";
+    }
+    
+    # generate packageHash for old release
+    my $location = ParseDownloadDir( $currentReleaseXmlHandle );
+    GeneratePackageHash( $currentReleaseXmlHandle, $location );
+    
+    # remove files from @finalZipList
+    ReductFilesFromFinalLists( );
+    
+    # remove already DL'd dependency zips
+    if( $currentReleaseXmlHandle->{releaseDetails}->{dependsOf}->{service} ) {
+        printLog( "already DL'd dependency needs to be removed as well:" );
+        
+        my $xmlToRemove;
+        
+        # parse $dependsOf from xml
+        my $dependsOfServiceToRemove = FixPaths( $currentReleaseXmlHandle->{releaseDetails}->{dependsOf}->{service}->{name} );
+        my $dependsOfProductToRemove = FixPaths( $currentReleaseXmlHandle->{releaseDetails}->{dependsOf}->{product}->{name} );
+        my $dependsOfReleaseToRemove = FixPaths( $currentReleaseXmlHandle->{releaseDetails}->{dependsOf}->{release}->{name} );
+        
+        my $dependsOf = $dependsOfServiceToRemove.$dependsOfProductToRemove.$dependsOfReleaseToRemove;
+		local *TMPTEST;
+        
+        # find out where the release came from
+        if( $param_release_path ) {
+            # best guess is $param_release_path\..\..\..\$dependsOf even though it is not very common situation
+            my $dependencyPath = FixPaths( $param_release_path ) . "../../../" . FixPaths( $dependsOf );
+            if( -e $dependencyPath."release_metadata.xml" ) {
+                printLog( $dependencyPath ."release_metadata.xml exists - setting pathTo ReleaseFolder accordingly" );
+                $xmlToRemove = $dependencyPath;
+            }
+            # in case it is not in relative path we should try finding it from release server
+            elsif( -e $pathToReleaseFolder.$dependsOf."release_metadata.xml" ) {
+                printLog( $dependencyPath ."release_metadata.xml not not exist - setting pathToReleaseFolder accordingly" );
+                $xmlToRemove = $pathToReleaseFolder.$dependsOf;
+            }
+        }
+        elsif( opendir( TMPTEST, $pathToReleaseFolder.$dependsOf ) ) {
+            $xmlToRemove = $pathToReleaseFolder.$dependsOf;
+        }
+        else {
+            $xmlToRemove = $defaultPathToServer.$dependsOf;
+        }
+
+        #my $xmlToRemove = $pathToReleaseFolder;
+        
+        $xmlToRemove .= SearchValidXml( $xmlToRemove );
+        printLog( "following xml needs to be removed also: $xmlToRemove" );
+        RemoveThisXmlFromFinalList( $xmlToRemove  );
+    }
+}
+
+sub ReductFilesFromFinalLists {
+    printLog( "reducting files from finalziplist" );
+    foreach my $zips( sort { $packageHash{$b}->{'state'} <=> $packageHash{$a}->{'state'} } keys %packageHash ) {
+        printLog( "matching $zips" );
+        if( $packageHash{$zips}->{'default'} eq 'true' ) {
+            my $tmpHash = $packageHash{$zips};
+#           $tmpHash->{'filename'} = $zips;
+#           unshift @finalZipList, $tmpHash;
+
+            # if $tmpHash->{'filename'} eq can be found from finalziplist -> pop
+            foreach my $finalZip( @finalZipList ) {
+# path contains ../../../ so wont match ==>
+#               if( $finalZip->{filename} eq $zips and
+#                       $finalZip->{path} eq %packageHash->{$zips}->{'path'} ) {
+                if( $finalZip->{filename} eq $zips ) {
+                            printLog( "removing $finalZip->{path} $finalZip->{filename} from dl list" );
+                            $finalZip->{default} = "false";
+                }
+            }
+        }
+    }
+    %packageHash = 0;
+}
+
+# verifying that files in @finalZipList really exists
+sub VerifyFinalZipList {
+    print "Verifying all the zips exists... ";
+
+    my $counter = 0;
+    
+    foreach my $file( @finalZipList ) {
+        my $tmpFileName = $file->{path}.$file->{filename};
+        printLog( "Checking $tmpFileName.." );
+        opendir( VERIFYDIR, $file->{path} ) or HandleError( $file->{path}, $dependencyMissing );
+        # scan all xml files to @xmlFiles
+        my @matchingFiles = grep /$file->{filename}/i, readdir VERIFYDIR;
+        
+        if( ! @matchingFiles ) {
+            HandleError( $file->{path}.$file->{filename}, $dependencyMissing );
+            
+            # if we are here there is missing file but keep_going defined
+            $file->{default} = "false";
+        }
+        closedir VERIFYDIR;
+        
+        $counter++;
+    }
+    
+    print "done\n";
+}
+
+
+sub GetEnv {
+    # first thing is to copy 7zip
+    if( ! $param_print_only ) {
+        `7za --help`;
+        HandleError( "couldnt copy 7zip! make sure you have it in your system path!", $warning ) if ($? != 0);
+        mkdir $tmpDir;
+        mkdir $tmpDlDir;
+    }
+
+    printLog( "final zip list:" );
+    printLog( Dumper( @finalZipList ) );
+
+    # symsee 3.3.0 contains obsolete archive::zip, so we'll have to use system calls
+    foreach my $file( @finalZipList ) {
+        $returnValue = 0;
+
+        # skip not mandatory files
+        next if( $file->{default} eq "false" );
+
+        # DEPRECATED parameters just for compatibility
+        # Filter out some not wanted zip files
+        # skip internal, testsources, docs
+        if( $param_skipITD ) {
+            print "skipitd is deprecated and unmaintained parameter that will be removed in the future!\nInstead you should use \"getenv -x tsrc\"";
+
+            printLog( "param skipITD used, checking wheter we have to skip: $file->{filename}" );
+            # skip if zip filename matches _internal.zip, _tsrc.zip, _doc.zip
+            next if $file->{filename} =~ /internal.zip/;
+            next if $file->{filename} =~ /tsrc.zip/;
+            next if $file->{filename} =~ /doc.zip/;
+        }
+        
+        # DEPRECATED parameters just for compatibility
+        # get only files needed for emulator and service packs
+        if( $param_emuenv ) {
+            print "emu is deprecated and unmaintained parameter that will be removed in the future!\nInstead you should use \"getenv -i emu\"";
+            my $skip = 1;
+            
+            printLog( "param emu used, checking wheter we have to skip: $file->{filename}" );
+            if( $file->{filename} =~ /winscw.zip/ or
+                    $file->{filename} =~ /epoc32.zip/ or
+                    $file->{filename} =~ /epoc32_tools.zip/ or
+                    $file->{state} == 10 ) {
+                $skip = 0;
+            }
+            next if $skip;
+        }
+        
+        my $skipByFilter = 0;
+        # exclude files that has s60filter matching with exclude array
+        if( @param_exclude ) {
+            foreach my $exclude( @param_exclude ) {
+                if( $exclude eq $file->{s60filter} ) {
+                    $skipByFilter = 1;
+                    last;
+                }
+            }
+        }
+        # include only files that has s60filter matching with include array
+        elsif( @param_include ) {
+            $skipByFilter = 1;
+            foreach my $include( @param_include ) {
+                if( $include eq $file->{s60filter} ) {
+                    $skipByFilter = 0;
+                    last;
+                }
+            }
+        }
+        next if $skipByFilter;
+
+        # let's do some forking
+        # parent process unzips from tmpdir and child DL's new package from network
+
+        # fork new process
+        my $pid = myFork();
+        if( $pid ) {
+            # parent process copies/unzips packages to tmpDlDir
+            printLog( "parent: extract packages to $tmpDlDir" );
+            printLog( "parent: Processing: $file->{filename}... " );
+            print "Processing: $file->{filename}... ";
+            
+            if( $file->{extract} eq 'single' ) {
+                # copy single zipped packages to $tmpDlDir
+                printLog( "parent: single zipped - copy to $tmpDlDir" );
+                if( ! $param_print_only ) {
+                    copy( $file->{path} . $file->{filename}, $tmpDlDir ) or
+                        HandleError( "cant copy file $file->{path}$file->{filename} to $tmpDlDir", $cannotContinue);
+                }
+            }
+            elsif( $file->{extract} eq 'double' ) {
+                # unzip double zipped zips to $tmpDlDir
+                # there shouldnt be much of these anymore
+                printLog( "parent: double zipped - unzip to $tmpDlDir" );
+                my $extrCmd = "7za x -y \"";
+                $extrCmd .= $file->{path} . $file->{filename};
+                $extrCmd .= "\" -o" . $tmpDlDir;
+                $extrCmd .= " > NUL";
+                print "system: $extrCmd\n" if( $param_print_only );
+                printLog( "parent: system: $extrCmd" );;
+                system( $extrCmd ) if( !$param_print_only );
+                if( $? ) {
+                    printLog( "Problem processing $file->{path} $file->{filename}: $?" );;
+                    $returnValue = $?;
+                    HandleZipError( $file->{path} . $file->{filename}, $? );
+                }
+            }
+            elsif( $file->{extract} eq 'save' ) {
+                # copy non-zipped files directly to environment ( getcwd )
+                print "pure copy\n" if( $param_print_only );
+                printLog( "parent: pure copy from: ".$file->{path}.$file->{filename}." to: ".getcwd.$file->{filename} );
+                copy( $file->{path}.$file->{filename}, getcwd.$file->{filename} ) if( ! $param_print_only );
+            }
+            else {
+                HandleError( "unregocnised filetype: $file", $warning );
+            }
+            
+            printLog( "parent: package in $tmpDlDir available.. waiting for child" );
+            waitpid($pid, 0);
+            printLog( "parent: finished" );
+        }
+        elsif( $pid == 0 ) {
+# TODO: we should test wheter there is zips in $tmpDir
+            printLog( "child: extract zips from $tmpDir to ".getcwd );
+            
+            # extract from temp to extractDir
+            UnzipFromTempToEnv( );
+            
+            printLog( "child: finished" );
+            exit( 0 );
+        }
+        else {
+            # fork failed
+            die "Cannot fork: $!\n";
+        }
+        
+        # this is after forking
+        # move files from tmpDlDir => tmpDir
+        my $somethingToCopy = 0;
+        opendir( DLTEMP, $tmpDlDir ) or HandleError( "cant read $tmpDlDir dir: $!", $warning );
+        my @filesFound = readdir( DLTEMP );
+        closedir( DLTEMP );
+        foreach my $file( @filesFound ) {
+            next if $file =~ /^\.[\.]?$/;
+            $somethingToCopy = 1;
+        }
+
+        if( $somethingToCopy ) {
+            printLog( "move everything from $tmpDlDir to $tmpDir > NUL" ); 
+            my $moveCmd = "move $tmpDlDir\\*.* $tmpDir > NUL";
+            printLog( "running moveCmd: $moveCmd" );
+            system( $moveCmd ) if( !$param_print_only );
+    #       move( "$tmpDlDir/*.*", "$tmpDir" ) or die( "move failed: $!" );
+        }
+        
+        if( $returnValue == 0 ) {
+            print "done\n";
+            printLog( "done" );
+        }
+        else {
+            print "done, but errors occured!\n";
+            printLog( "done, but errors occured" );
+        }
+    }
+    
+    # current forking mechanism is leaving last package(s) to $tmpDir
+    UnzipFromTempToEnv( );
+
+    if( -e FixPaths( getcwd )."currentRelease.xml" ) {
+        unlink( FixPaths( getcwd )."currentRelease.xml" ) if( ! $param_print_only );
+    }
+    # copy the xml into $extractDir\buildData from $serverPath.$serviceName.$metaDataFile
+    copy( $metaDataXml, FixPaths( getcwd )."currentRelease.xml" ) if( ! $param_print_only );
+    
+    # cover trails
+    unlink( "/7za.exe" ) if( ! $param_print_only );
+    if( ! $param_print_only ) {
+        printLog( "removing temp dir... " );
+        rmdir $tmpDir or HandleError( "Couldnt remove temp dir: $!", $warning );
+        rmdir $tmpDlDir or HandleError( "Couldnt remove temp dir: $!", $warning );
+        print scalar(localtime) . ": done fetching environment\n";
+        printLog( "done" );
+    }
+}
+
+sub UnzipFromTempToEnv {
+    # extract from temp to extractDir
+    printLog( "child: unzip from temp" );
+    my $finalUnzipCmd = "7za x -y \"".UnFixPaths( $tmpDir )."\\*.zip\" -o\"".UnFixPaths( getcwd )."\"";
+    $finalUnzipCmd .= " > NUL";
+    print "system: $finalUnzipCmd\n" if( $param_print_only );
+    printLog( "child: system: $finalUnzipCmd" );
+    system( $finalUnzipCmd ) if( !$param_print_only );
+#           if( $? ) {
+#               $returnValue = $?;
+#               HandleZipError( $file->{path} . $file->{filename}, $? );
+#           }
+    
+    # empty temp dir
+    printLog( "child: empty temp dir" );
+    $tmpDir =~ s/\//\\/g;
+    printLog( "child: unlink: $tmpDir" );
+
+    # dont handle errors - temp might be empty as well!
+    opendir( TEMPDIR, $tmpDir );
+    my @zipFiles = grep /zip/, readdir TEMPDIR;
+    foreach my $myfile( @zipFiles ) {
+        if( ! $param_print_only ) {
+            printLog( "child: unlink: $myfile" );
+            unlink( $tmpDir."/".$myfile );
+        }
+    }
+    closedir TEMPDIR;
+}
+
+# handles return values coming from 7zip
+#   0 No error 
+#   1 Warning (Non fatal error(s)). For example, some files were locked by other application during compressing. So they were not compressed. 
+#   2 Fatal error 
+#   7 Command line error 
+#   8 Not enough memory for operation 
+#   255 User stopped the process 
+sub HandleZipError {
+    my( $filename, $errorCode ) = @_;
+    
+    if( $errorCode == 1 ) {
+        # warning
+        printLog( "7zip reported warning during unzipping of $filename" );
+        print "Warning while unzipping $filename!\nSome files might be locked be other processes. It is possible that all the files werent extracted!\n";
+    }
+    elsif( $errorCode == 2 ) {
+        # fatal error
+        printLog( "possibly corrupted archive: $filename" );
+        print "Fatal error occured while extracting $filename!!\nPlease check you have enough disk space on ".getcwd."\n";
+        print "Otherwise you should report this problem for the build team. Please include ".getcwd."\\getenv.log to the mail.";
+    }
+    elsif( $errorCode == 7 ) {
+        # commandline error
+        printLog( "there is command line error while unzipping $filename" );
+        print "7-zip is reporting command line error when unzipping $filename.";
+        print "You should report this problem for the build team. Please include ".getcwd."\\getenv.log to the mail.";
+    }
+    elsif( $errorCode == 8 ) {
+        # not enough memory
+        printLog( "7zip reports not enough memory. Possibly disk full" );
+        print "Not enough memory to extract $filename!!\nPlease check you have enough disk space on ".getcwd.". Otherwise please try again\n";
+    }
+    elsif( $errorCode == 255 ) {
+        # user aborted
+        printLog( "User aborted extraction!!" );
+        print "User aborted extraction!\n$filename is not extracted completely and therefore your environment might not work as expected!";
+    }
+    else {
+        # unspecified error
+        printLog( "unspecified error: $errorCode while extracing: $filename\nPlease check you have enough free disk space" );
+    }
+}
+
+# return path to accessible GRACE samba share
+sub FindGraceServer {
+# added 27.2.2007 : skip seeking if server has given from commandline
+# salmarko starts
+    if (defined $param_server) {return FixPaths( $param_server );}
+# salmarko ends
+
+    print "\nseeking possible grace accesses. This might take a while.. ";
+
+        my @graceAccessArray;
+        foreach my $address( @graceList ) {
+            printLog( "accessing $address..." );
+            if( opendir( GRACETEST, $address ) ) {
+                push @graceAccessArray, $address;
+                printLog( " success\n" );
+                close GRACETEST;
+            }
+            else {
+                printLog( " fail" );
+            }
+        }
+
+    if( @graceAccessArray ) {
+        print "done\nSelected GRACE server: ", $graceAccessArray[0];
+        if( scalar( @graceAccessArray ) > 1 ) {
+            
+            # if start is defined && >1 grace shares available, we'll have to just guess correct share
+            if( $param_start_directly ) {
+                print( "More than one grace shares accessible\n" );
+                print Dumper( @graceAccessArray );
+                print "\nBecause -start parameter is provided we cant prompt user to select correct, lets pick first one from the list\n";
+                print "You should use -server parameter to define the server\n";
+                printLog( "-start defined and >1 grace shares accessible" );
+                printLog( @graceAccessArray );
+                printLog( "selecting first one: $graceAccessArray[0]" );
+                return FixPaths( $graceAccessArray[0] );
+            }
+            else {
+# salmarko starts
+                return FixPaths( PrintSelectMenu( "Select reasonable GRACE share", @graceAccessArray ) );
+# salmarko ends
+            }
+        }
+        else {
+# salmarko starts
+            return FixPaths( $graceAccessArray[0] );
+# salmarko ends
+        }
+    }
+    print "none found\n";
+    return 0;   
+}
+
+# return name of the release from metadata.xml
+sub ReturnReleaseName {
+    my $data = shift( @_ );
+    
+    my $tempXmlParser = new XML::Simple( );
+    my $tempXmlHandle = $tempXmlParser->XMLin( $data );
+    
+    # parse dl directory into $releaseDirectory
+    return $tempXmlHandle->{releaseDetails}->{releaseID}->{release}->{name};
+}
+
+# retrurn name of the product from metadata.xml
+sub ReturnProductName {
+    my $data = shift( @_ );
+    
+    my $tempXmlParser = new XML::Simple( );
+    my $tempXmlHandle = $tempXmlParser->XMLin( $data );
+    
+    # parse dl directory into $releaseDirectory
+    return $tempXmlHandle->{releaseDetails}->{releaseID}->{product}->{name};
+}
+
+sub GetSoapVersion {
+    printLog( "Trying to access SOAP server" );
+    
+    my $soapVersion = eval { SOAP::Lite
+                                                        ->uri('GetEnv')
+                                                        ->on_action(sub{ sprintf('%s/%s', @_ )})
+                                                        ->proxy($soapServiceURL)
+                                                        ->GetVersionInfo( )
+                                                        ->result } ;
+    
+    print Dumper( $soapVersion ) if( $param_debug );
+    
+    return $soapVersion;
+}
+
+sub StartSoapSession {
+    printLog( "fetching session start info from SOAP" );
+    my $netPath = FixPaths( $pathToReleaseFolder );
+    $netPath .= FixPaths( $defaultServiceName );
+    $netPath .= FixPaths( ReturnProductName( $metaDataXml ) );
+    $netPath .= FixPaths( ReturnReleaseName( $metaDataXml ) );
+#   $netPath .= $metaDataXml;
+    printLog( "about to fetch: $netPath" );
+    
+    return SOAP::Lite
+        ->uri('GetEnv')
+        ->on_action(sub{ sprintf('%s/%s', @_ )})
+        ->proxy($soapServiceURL)
+        ->StartGetEnv( SOAP::Data->name( BuildName=> ReturnReleaseName( $metaDataXml ) )
+                                            ->type('string')
+                                            ->uri('GetEnv'),
+                                        SOAP::Data->name( NetworkPath=> $netPath )
+                                            ->type('string')
+                                            ->uri('GetEnv'),
+                                        SOAP::Data->name( UserName=> $ENV{'USERNAME'} )
+                                            ->type('string')
+                                            ->uri('GetEnv'),
+                                        SOAP::Data->name( MachineName=> $ENV{'COMPUTERNAME'} )
+                                            ->type('string')
+                                            ->uri('GetEnv') )
+        ->result;
+}
+
+sub EndSoapConnection {
+    printLog( "SOAP: Finishing SOAP session: $soapSessionID" );
+    printLog( "SOAP: release downloaded: $metaDataXml" );
+
+    return SOAP::Lite
+        ->uri('GetEnv')
+        ->on_action(sub{ sprintf('%s/%s', @_ )})
+        ->proxy($soapServiceURL)
+        ->DoneGetEnv( SOAP::Data->name( ID=> $soapSessionID )
+                                        ->type('string')
+                                        ->uri('GetEnv'))
+        ->result;
+
+}
+
+
+sub FindTempDir {
+    # it'll speed up extraction if we put temp dir to separate disk
+    
+}
+
+# finds first param from second param(comma separated list)
+sub FindFromList {
+    my( $itemToFind, $list ) = @_;
+    my @itemList = split( /,/, $list );
+    foreach( @itemList ) {
+        return 1 if( $_ eq $itemToFind );
+    }
+    
+    return 0;
+}
+
+sub myFork()
+    {
+    sleep(1);  #let buffers flush
+    my $pid = fork();
+    if(!defined($pid))
+        {
+        die "fork error\n";
+        }
+    return $pid;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/ido-prep.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ido-prep.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ido-prep" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        IDO related targets.
+         * Build area preparation
+         * Codescanner integration
+         * Cenrep generation (old way)
+         * IBY export (old way)
+    </description>
+        
+    <property name="ado.mapping.file" location="${build.output.dir}/build/ado_mapping.ini"/>
+    <property name="ado.quality.mapping.file" location="${build.output.dir}/build/ado_quality_mapping.ini"/>
+    <property name="ido.romtree" location="${build.drive}${env.EPOCROOT}/epoc32/rom/include"  />
+    <property name="ido.cenrep.root" location="${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep/ido/src"  />
+    <property name="ido.cenrep.target" value="${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9"  />
+    <property name="ido.codescanner.output.dir" location="${build.output.dir}/${build.id}_codescanner"/>
+    
+    <!-- Internal target that generates the '''ado.mapping.file'''.
+     It is a INI file that contains ADO location as a key and target location as value.
+    -->
+    <target name="ido-create-ado-mapping">        
+        <mkdir dir="${build.output.dir}/build"/>
+        <mkdir dir="${temp.build.dir}"/>
+        <tempfile property="prep.dynamic.sysdef.config" suffix=".txt" deleteonexit="false" destdir="${temp.build.dir}"/>
+        <hlm:referenceToFileMacro refid="system.definition.files" output="${prep.dynamic.sysdef.config}"/>
+        <trycatch>
+            <try>
+                <pathconvert pathsep="," property="ado.quality.dirs.path">
+                    <dirset refid="ado.quality.dirs"/>
+                </pathconvert>
+            </try>
+        </trycatch>
+        <script language="jython" setbeans="false">
+import os
+import ant
+import shutil
+import fileutils
+import ido
+
+input = open(project.getProperty(r"prep.dynamic.sysdef.config"), 'r')
+output = open(project.getProperty(r"ado.mapping.file"), 'w')
+outputquality = open(project.getProperty(r"ado.quality.mapping.file"), 'w')
+components = {}
+for sysdef in input.readlines():
+    sysdef = sysdef.strip()
+    if len(sysdef) > 0:
+        print "Checking %s" % sysdef
+        os.path.dirname(sysdef)
+        location = ido.get_sysdef_location(sysdef)
+        if location != None:
+            sysdef = os.path.dirname(sysdef).replace('\\','/').replace(':','\\:')
+            component = os.path.normpath(os.path.join(project.getProperty(r"build.drive"), os.environ['EPOCROOT'], location)).replace('\\','/').replace(':','\\:')
+            print "%s=%s\n" % (sysdef, component)
+            output.write("%s=%s\n" % (sysdef, component))
+            
+            if project.getProperty("ado.quality.dirs.path") == None:
+                outputquality.write("%s=%s\n" % (sysdef, component))
+            else:
+                for dir in project.getProperty("ado.quality.dirs.path").split(','):
+                    if os.path.normpath(dir) == os.path.normpath(os.path.join(project.getProperty(r"build.drive"), os.environ['EPOCROOT'], location)):
+                        outputquality.write("%s=%s\n" % (sysdef, component))
+outputquality.close()
+output.close()
+input.close()        
+        </script>
+    </target>
+    
+    
+    <!-- Target that uses the information from the system.definition.files to prepare the IDO build area.
+        It relies on the fact that layer_real_source_path entity is declared in each ADO configuration.
+        
+        By default it deletes the previous content. If you want to backup what was previoulsy used please
+        defined '''ido.keep.old''' property.         
+        -->
+    <target name="ido-prep-copy" depends="ido-create-ado-mapping">
+        <mkdir dir="${temp.build.dir}"/>
+        <tempfile property="prep.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
+        
+        <!-- new implementation that only rely on Ant -->
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-ant-delete.xml.ftl"
+                     outputFile="${prep.dynamic.config}.clean.xml">
+            <data expandProperties="yes">
+                    inputfile: antProperty(ado.mapping.file)
+                    ant: antProperties()
+                        data: eval('
+                                java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                                java.util.Properties props = new java.util.Properties();
+                                props.load(pin);
+                                return props;
+                                ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${prep.dynamic.config}.clean.xml"/>
+        
+        <!-- new implementation that only rely on Ant -->
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-ant-copy.xml.ftl"
+            outputFile="${prep.dynamic.config}">
+            <data expandProperties="yes">
+                inputfile: antProperty(ado.mapping.file)
+                ant: antProperties()
+                    data: eval('
+                            java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                            java.util.Properties props = new java.util.Properties();
+                            props.load(pin);
+                            return props;
+                            ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${prep.dynamic.config}"/>
+    </target>
+    
+    
+    <!--
+    Run cleanup system definition configuration. The configuration name are
+    generated from the '''sysdef.configurations.list''' property, appending '_clean'
+    at the end of each configuration also reversing their build order.
+    if '''sysdef.clean.configurations.list''' is defined it overrides
+    the previous beharvious and is used to cleanup the environment.
+    -->
+    <target name ="ido-prep-clean">
+        <if>
+            <not>
+                <isset property="sysdef.clean.configurations.list"/>
+            </not>
+            <then>
+                <if>
+                    <isset property="sysdef.configurations.list"/>
+                    <then>
+                        <script language="jython" setbeans="false">
+rev_names = ""
+for sysdef in project.getProperty("sysdef.configurations.list").split(","):    
+    rev_names = sysdef + "_clean," + rev_names;
+project.setProperty("sysdef.clean.configurations.list", rev_names)
+                        </script>
+                    </then>
+                    <else>
+                        <fail message="You should either define sysdef.clean.configurations.list or sysdef.configurations.list."/>
+                    </else>
+                </if>
+            </then>
+        </if>
+        
+        <antcall target="compile-main">
+            <param name="sysdef.configurations.list" value="${sysdef.clean.configurations.list}"/>
+            <param name="compile.signal.input" value="compileCleanSignalInput"/>
+            <param name="compile.discard.result" value="true"/>
+            <param name="compile.cmd.clean" value="true"/>
+        </antcall>
+    </target>
+
+
+
+    <!--
+      Internal target that set an intermediate property to disable codescanner execution.
+    -->
+    <target name="ido-codescanner-skip">
+        <if>
+            <istrue value="${skip.codescanner}"/>
+            <then>
+                <property name="do.skip.codescanner" value="1"/>
+            </then>
+        </if>
+    </target>
+
+    <!--
+        This targets run the codescanner application on each discovered ADO.
+        The location of the output is defined byt '''ido.codescanner.output.dir''' property.
+        And the type is defined by '''ido.codescanner.output.type''' (default is HTML). 
+    -->
+    <target name="ido-codescanner" depends="ido-create-ado-mapping,ido-codescanner-skip" unless="do.skip.codescanner">
+        <!--hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/-->
+        <property name="ido.codescanner.output.type" value="html"/>
+        <script language="jython" setbeans="false">
+""" internal.codescanner.drive """
+import os
+import fileutils
+import configuration
+import pathaddition.relative
+
+config = configuration.PropertiesConfiguration(stream=open(str(project.getProperty("ado.quality.mapping.file")), 'r'))
+prefix = pathaddition.relative.commonprefix(config.keys())
+if not os.path.exists(prefix):
+    raise Exception("Could not find common prefix for the following paths:\n" + "\n".join(config.keys()))
+self.log(str('Substing %s' % prefix))
+drive = fileutils.get_next_free_drive()
+fileutils.subst(drive, prefix)
+project.setProperty('internal.codescanner.drive', drive)
+
+# creating the structure form subst drive.
+path = project.createDataType("path")
+for location in config.keys():
+    self.log(str("From %s" % location))
+    location = drive + os.sep + pathaddition.relative.abs2rel(location, prefix)
+    self.log(str("To %s" % location))
+    pe = path.createPathElement()
+    pe.setPath(location)
+project.addReference('substed.ado.src.path', path)
+        </script>
+        <hlm:codescanner dest="${ido.codescanner.output.dir}"
+            format="${ido.codescanner.output.type}"
+            configuration="${ido.codescanner.config}">
+            <path refid="substed.ado.src.path"/>
+        </hlm:codescanner>
+        <hlm:unsubst drive="${internal.codescanner.drive}"/>
+    </target>
+
+        <!-- CMT Tool target. Complexity tool measures. Supported options for cmt tool macro is
+        1. input - files to be measured
+        2. output - output xml file (file size is huge 68MB for JAVA IDO, if this needs to be send, need to consider
+        3. config - input config . 
+        -->
+    <target name="ido-cmt" depends="ido-create-ado-mapping" if="enable.cmt">
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-cmt-ant.xml.ftl"
+                          outputFile="${temp.build.dir}/ido-cmt.ant.xml">
+            <data expandProperties="yes">
+                        inputfile: antProperty(ado.quality.mapping.file)
+                        ant: antProperties()
+                            data: eval('
+                                    java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                                       java.util.Properties props = new java.util.Properties();
+                                    props.load(pin);
+                                    return props;
+                                    ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${temp.build.dir}/ido-cmt.ant.xml"/>
+    </target>
+
+
+    <!-- Internal target that generates a temporary file that allow the 
+    either export of iby or either key*.xls. The generated Ant build file
+    contains two targets with copy insturctions and generic set of fileset rules.     
+    -->
+    <target name="ido-create-copy-file" depends="ido-create-ado-mapping">
+        <tempfile property="copyfile.dynamic.config" suffix=".ant.xml" deleteonexit="false" destdir="${temp.build.dir}"/>
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-export.ant.xml.ftl"
+                      outputFile="${copyfile.dynamic.config}">
+            <data expandProperties="yes">
+                inputfile: antProperty(ado.mapping.file)
+                ant: antProperties()
+                data: eval('
+                            java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                               java.util.Properties props = new java.util.Properties();
+                            props.load(pin);
+                            return props;
+                            ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+    </target>
+
+    <!-- Do the export of the ibys from ADO work area level to epoc32 tree. -->    
+    <target name="ido-copy-iby" depends="ido-create-copy-file">
+        <ant antfile="${copyfile.dynamic.config}" target="ido-copy-iby"/>
+    </target>
+
+    <!-- Do the export of the Excel keys*.xls from ADO work area level to 
+    epoc32 tree.
+    -->
+    <target name="ido-copy-cenrep" depends="ido-create-copy-file">
+        <delete dir="${ido.cenrep.root}"/>
+        <mkdir dir="${ido.cenrep.root}"/>
+        <ant antfile="${copyfile.dynamic.config}" target="ido-copy-cenrep"/>
+    </target>
+
+    <!-- Generated cenrep from exported keys*.xls files. -->
+    <target name="ido-create-cenrep" depends="ido-copy-cenrep">
+        <delete dir="${ido.cenrep.root}/../data"/>
+        <mkdir dir="${ido.cenrep.root}/../data"/>
+        <exec executable="perl" dir="${ido.cenrep.root}" failonerror="true">
+            <arg value="${build.drive}/epoc32/tools/cenrep/generate_cenrep_inifile.pl"/>
+            <arg value="-r"/>
+            <arg value="${ido.cenrep.platform}"/>
+            <arg value="-d"/>
+            <arg value="${ido.cenrep.root}"/>
+            <arg value="-rd"/>
+            <arg value="${ido.cenrep.root}/../data"/>
+        </exec>
+        <!-- Copy generated files to target path -->
+        <copy todir="${ido.cenrep.target}" verbose="true" flatten="true" overwrite="true">
+            <fileset dir="${ido.cenrep.root}/../data">
+                <include name="*.txt"/>
+            </fileset>
+        </copy>    
+        
+    </target>
+
+    <!-- Gets the contents from GRACE / Dragonfly -->
+    <target name="ido-check-latest-release" depends="ido-check-latest-release-grace" unless="env.HLM_SUBCON">
+        <runtarget target="ido-check-latest-release-dragonfly"/>
+    </target>
+
+    <!-- Checks the contents from GRACE release. Mainly used by IDOs. But could be
+    extended to product builds.-->    
+    <target name="ido-check-latest-release-grace" unless="use.dragonfly">
+        <script language="jython" setbeans="false">
+import re
+import os
+import symrec
+import logging
+import traceback
+import ant
+            
+if not project.getProperty('s60.grace.server'):
+    raise Exception("Property 's60.grace.server' is not defined.")
+if not project.getProperty('s60.grace.service'):
+    raise Exception("Property 's60.grace.service' is not defined.")
+if not project.getProperty('s60.grace.product'):
+    raise Exception("Property 's60.grace.product' is not defined.")
+if not project.getProperty('s60.grace.release'):
+    raise Exception("Property 's60.grace.release' is not defined.")
+grace = project.getProperty('s60.grace.server')
+service = project.getProperty('s60.grace.service')
+product = project.getProperty('s60.grace.product')
+release = project.getProperty('s60.grace.release')
+revision = r'(_\d{3})?'
+if project.getProperty('s60.grace.revision') != None:
+    revision = project.getProperty('s60.grace.revision')
+
+# Get the cache filename.
+cachefilename = project.getProperty('s60.grace.cache')
+if cachefilename:
+    self.log(str("Using cache file: %s" % cachefilename))
+
+checkmd5 = False
+if project.getProperty('s60.grace.checkmd5') != None:
+    checkmd5 = str(project.getProperty('s60.grace.checkmd5')).lower()
+    checkmd5 = ((checkmd5 == "true") or (checkmd5 == "1") or (checkmd5 == "on"))
+            
+branch = os.path.join(grace, service, product)
+if not os.path.exists(branch):
+    raise Exception("Error occurred: Could not find directory %s" % branch)
+    
+result = []
+for rel in os.listdir(branch):
+    relpath = os.path.join(branch, rel)
+    self.log("Checking: %s" % str(relpath))
+    res = re.match(r"%s%s$" % (release, revision), rel, re.I)
+    if res != None:
+        self.log("Found: %s" % str(relpath))
+        result.append(relpath)
+result.sort(reverse=True)
+use_tickler = False
+tickler_validation = str(project.getProperty('s60.grace.usetickler')).lower()
+if tickler_validation != None:
+    use_tickler = ((tickler_validation == "true") or (tickler_validation == "1"))
+validresults = []
+for rel in result:
+    try:
+        metadata_filename = symrec.find_latest_metadata(str(rel))
+        if metadata_filename is not None and os.path.exists(metadata_filename):
+            self.log(str("Validating: %s" % metadata_filename))
+            if (use_tickler):
+                validator = symrec.ValidateTicklerReleaseMetadata(metadata_filename, cachefilename)
+            else:
+                validator = symrec.ValidateReleaseMetadataCached(metadata_filename, cachefilename)
+            if validator.is_valid(checkmd5):
+                self.log(str("%s is valid." % rel))
+                validresults.append(rel)
+                break
+            else:
+                self.log(str("%s is not a valid release." % rel))
+        elif metadata_filename is None:
+            self.log(str("Could not find the release metadata file under %s" % rel))
+    except Exception, e:
+        self.log(str("WARNING: %s: %s" % (rel , e)))
+        self.log(str("%s is not a valid release." % rel))
+        traceback.print_exc()
+
+result = validresults
+if len(result) == 0:
+    raise Exception("Error finding GRACE release.")
+print result[0]
+resultname = os.path.basename(result[0])
+vfile = os.path.join(project.getProperty('build.drive') + os.sep, 's60_version.txt')
+if (os.path.exists(vfile)):
+    self.log("Are we still up-to-date compare to %s" % str(vfile))
+    f = open(str(vfile), 'r')
+    version = f.readline()
+    self.log(str("'%s' == '%s'" % (version, resultname)))
+    project.setProperty('s60.getenv.path', str(result[0]))
+    project.setProperty('s60.getenv.release', str(resultname))
+    if version.strip() != resultname:
+        project.setProperty('s60.getenv.update', "1")
+    f.close()
+else:
+    self.log("Version file not found getting new environment...")
+    project.setProperty('s60.getenv.path', str(result[0]))
+    project.setProperty('s60.getenv.release', str(resultname))
+    project.setProperty('s60.getenv.update', "1")
+        </script>
+    </target>
+
+    <!-- Updates the build area from either GRACE / dragonfly server.-->
+    <target name="ido-update-build-area" depends="backup-subst-drives,ido-update-build-area-grace" unless="env.HLM_SUBCON">
+        <runtarget target="ido-update-build-area-dragonfly"/>
+    </target>
+
+    <!-- Creates the build area by getting the contents from GRACE release.-->    
+    <target name="ido-update-build-area-grace" if="s60.getenv.update" depends="ido-check-latest-release" unless="use.dragonfly">
+        <!-- We must update the build area so let's get rid of the old one. -->
+        <hlm:unsubst drive="${build.drive}" failonerror="false"/>
+        
+        <!-- Just get S60 for IDOs -->
+        <echo>Location of the new S60 release:${s60.getenv.path}</echo>
+        <tstamp>
+            <format property="getenv.tstamp" pattern="yyyyMMddHHmmss"/>
+        </tstamp>
+        <antcall target="init-drive">
+            <param name="prep.build.dir" location="${prep.root.dir}/${getenv.tstamp}_${s60.getenv.release}"/>            
+        </antcall>
+        <antcall target="preparation-getenv">
+            <param name="base_release.path" value="${s60.getenv.path}"/>
+        </antcall>
+        <antcall target="ido-prep-variant"/>
+
+        <if>
+            <not>
+                <hlm:hasSeverity severity="error" file="${build.cache.log.dir}/${build.id}_getenv.log.xml" />
+            </not>
+            <then>
+                <hlm:python>
+from path import path
+print "Writing version file...."
+vfile = path(r'${build.drive}'+"/").joinpath('s60_version.txt')
+f = open(str(vfile), 'w')
+f.write(path(r'${s60.getenv.path}').name)
+f.close()
+                </hlm:python>
+            </then>
+        </if>
+    </target>
+
+    <!-- Gets the Contents for particular variant, by unpacking the variant zip from the metadata file.-->
+    <target name="ido-prep-variant" if="ido.variant">
+        <script language="jython" setbeans="false">
+import re
+import os
+import symrec
+from com.nokia.ant.util import Helper
+rel_path = Helper.getProperty(project, 's60.getenv.path')
+metadata = symrec.find_latest_metadata(str(rel_path))
+self.log(str("Release metadata file: %s." % metadata))
+rel_metadata = symrec.ReleaseMetadata(metadata)
+variant_pkg = rel_metadata.getVariantPackage(project.getProperty('ido.variant'))
+project.setProperty('ido.variant.package', os.path.join(rel_path, variant_pkg))
+        </script>
+        <unzip src="${ido.variant.package}" dest="${build.drive}${env.EPOCROOT}"/>
+    </target>
+
+
+    <!-- This target will help CI tool to trigger a build by updating a 's60.getenv.trigger.location' file timestamp. -->
+    <target name="ido-latest-release-trigger" if="s60.getenv.update" depends="ido-check-latest-release">
+        <if>
+            <isset property="s60.getenv.trigger.location"/>
+            <then>
+                <echo>Touching the trigger.</echo>
+                <touch file="${s60.getenv.trigger.location}"/>
+            </then>
+            <else>
+                <echo>Property s60.getenv.trigger.location is not defined, trigger will not get updated.</echo>
+            </else>
+        </if>
+    </target>
+    
+    <!-- Convert keys of an ini file into a path structure.
+        e.g: <pre><hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/></pre>
+
+    Usage example:
+      <pre>
+        <target name="test-iniKeys2Path" depends="ido-create-ado-mapping">
+            <hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/>
+            <hlm:codescanner dest="${build.drive}/codescanner">
+                <path refid="ado.src.path"/>
+            </hlm:codescanner>
+        </target>
+        </pre>
+    -->
+    <scriptdef name="iniKeys2Path" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="ini"/>
+        <attribute name="pathid"/>
+        if (attributes.get("ini") == null)
+            throw new org.apache.tools.ant.BuildException("ini is not defined");
+        if (attributes.get("pathid") == null)
+            throw new org.apache.tools.ant.BuildException("pathid is not defined");
+        try {
+            java.io.FileInputStream pin = new java.io.FileInputStream(attributes.get("ini"));
+            java.util.Properties props = new java.util.Properties();
+            props.load(pin);
+            org.apache.tools.ant.types.Path path = project.createDataType("path");
+            for (java.util.Iterator i = props.stringPropertyNames().iterator(); i.hasNext() ; ) {
+                org.apache.tools.ant.types.Path.PathElement pe = (org.apache.tools.ant.types.Path.PathElement)path.createPathElement();
+                pe.setPath(i.next());
+            }
+            self.log("Creating reference: " + attributes.get("pathid"));
+            project.addReference(attributes.get("pathid"), path);
+        } catch (Exception e) {
+            throw new org.apache.tools.ant.BuildException(e);
+        }
+    </scriptdef>
+
+    <!-- Target to get the Substituted drives information-->
+    <target name="backup-subst-drives">
+        <exec dir="${cache.dir}" executable="subst.exe" osfamily="windows" output="${cache.dir}\hlmsubsteddrives.bat" failonerror="false"/>
+        <trycatch property="backup-subst-drives.exception">
+            <try>
+                <if>
+                    <available file="${cache.dir}/hlmsubsteddrives.bat" type="file"/>
+                    <then>
+                        <replaceregexp file="${cache.dir}\hlmsubsteddrives.bat" match="\\: => " replace=" " flags="g" byline="true"/>
+                        <replaceregexp file="${cache.dir}\hlmsubsteddrives.bat" match="\A" replace="subst.exe " byline="true"/>
+                        <replaceregexp file="${cache.dir}\hlmsubsteddrives.bat" match="UNC" replace="\\\\" byline="true"/>
+                    </then>
+                </if>
+            </try>
+            <catch>
+                <echo>${backup-subst-drives.exception}</echo>
+            </catch>
+        </trycatch>
+    </target>
+
+    <import file="ci.ant.xml"/>
+</project>
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/ivy/dependencies.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : dependencies.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="preparation.dependencies" xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Analysis of dependencies for build area preparation.</description>
+    
+    <!-- Clean the Ivy cache. This is important if Ivy file content is changed. -->
+    <target name="clean-ivy-cache">
+        <ivy:configure file="${tools.ivy.config.file}"/>
+        <ivy:cleancache/>
+    </target>
+    
+    
+    <!-- Check the tools environment to ensure all required tools are present. -->
+    <target name="check-tool-dependencies">
+        <hlm:createToolsTableMacro dir="${temp.build.dir}/build/doc/ivy" failonerror="true" 
+            configs="${build.type}" />
+    </target>
+    
+    
+    <!-- This is a test target for resolving the inputs for preparing the build area. -->
+    <target name="resolve-build-inputs">
+        <record name="f:\resolve.txt" action="start" loglevel="verbose"/>
+        <fmpp sourceRoot="${helium.dir}/tools/preparation/ivy/templates" outputRoot="${temp.build.dir}/ivy"
+              replaceExtension="xml.ftl, ivy.xml">
+            <data expandProperties="yes">
+                cfg: xml(${build_area.config.file})
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <ivy:configure file="${build_area.ivy.config.file}"/>
+        <ivy:resolve file="${temp.build.dir}/ivy/ivy_file.ivy.xml" haltonfailure="false"/>
+        <ivy:artifactreport tofile="${build.log.dir}/build_area_artifacts.xml"/>
+        <record name="f:\resolve.txt" action="stop"/>
+    </target>
+    
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/overlayLog_to_html.xslt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+    <xsl:template match="/commentLog">
+        <html>
+            <head>
+                <title>
+                    <xsl:text>Overlay branch summary</xsl:text>
+                </title>
+            </head>
+            <body>
+                <h2>
+                    <xsl:text>Overlay branch summary</xsl:text>
+                </h2>
+                <p/>
+                <xsl:text>Total number of overlay branches = </xsl:text>
+                <xsl:value-of select="count(branchInfo)"/>
+                <p/>
+                <xsl:apply-templates select="branchInfo"/>
+            </body>
+        </html>
+    </xsl:template>
+    <xsl:template match="branchInfo">
+        <b>
+            <xsl:text>File: </xsl:text>
+        </b>
+        <xsl:value-of select="@file"/>
+        <br/>
+        <b>
+            <xsl:text>Category: </xsl:text>
+        </b>
+        <xsl:value-of select="@category"/>
+        <br/>
+        <b>
+            <xsl:text>Error: </xsl:text>
+        </b>
+        <xsl:value-of select="@error"/>
+        <br/>
+        <b>
+            <xsl:text>Originator: </xsl:text>
+        </b>
+        <xsl:value-of select="@originator"/>
+        <br/>
+        <xsl:value-of select="text()"/>
+        <p/>
+        <p/>
+        <p/>
+    </xsl:template>
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/overlays.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : overlays.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="overlays" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Scans the overlay structure and creates  report.
+    </description>
+    <!-- Scans the overlay structure used in SAL projects. 
+         Creates report page from which build managers can 
+         easibly see the files that need to be merged. -->
+    <target name="scan-overlays">
+        <if>
+            <isreference refid="overlay.files" type="fileset"/>
+            <then>
+                <pathconvert refid="overlay.files" property="overlay.files.path"/>
+                <hlm:python>
+        
+import comments
+
+files = r'${overlay.files.path}'.split(';')
+
+# Create a comment parser that extracts branchInfo XML elements in comments
+parser = comments.CommentParser(files, 'branchInfo')
+doc = parser.scan()
+
+# Write the XML content to a log file
+logfile = open(r'${overlays.log.file}', 'w')
+doc.xml(logfile, indent=u"yes")
+logfile.close()
+        
+                </hlm:python>
+                <xslt in="${overlays.log.file}" out="${overlays.log.file}.html" style="${helium.dir}/tools/preparation/overlayLog_to_html.xslt"/>
+            </then>
+            <!-- Need to define an 'id' to match the refid in this file, for schema validation. -->
+            <else>
+                <!-- An XML element with an 'id' attribute is created to allow successful XML validation.
+                This serves no other purpose. -->
+                <property id="overlay.files" name="overlay.files.id" value="invalid" />
+                <echo>WARNING: 'overlay.files' reference not defined. Overlay scanning will not happen.</echo>
+            </else>
+        </if>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/password.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : password.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="password" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Password retrieval targets
+    </description>
+
+    <!-- Retrieve the ATS password from the .netrc file and store it into ats.password property. -->
+    <target name="ats-password">
+        <hlm:netrcPasswordMacro output-prop="ats.password" result-prop="ats.password.available" type="ats"/>
+    </target>
+    
+    <!-- Retrieve the ATS username from the .netrc file and store it into ats.username property. -->
+    <target name="ats-username">
+        <hlm:netrcUsernameMacro output-prop="ats.username" result-prop="ats.username.available" type="ats"/>
+    </target>
+
+    <!-- Retrieve the unix password from the .netrc file and store it into unix.password property. -->
+    <target name="unix-password">
+        <hlm:netrcPasswordMacro output-prop="unix.password" result-prop="unix.password.available" type="synergy"/>
+    </target>
+    
+    <!-- Retrieve the unix username from the .netrc file and store it into unix.username property. -->
+    <target name="unix-username">
+        <hlm:netrcUsernameMacro output-prop="unix.username" result-prop="unix.username.available" type="synergy"/>
+    </target>
+    
+    <!-- Ask for unix login using UI. -->
+    <target name="get-unix-password" depends="unix-username,unix-password">
+        <hlm:filterRecordStartMacro/>
+        <if>
+            <not>
+                <equals arg1="${unix.password.available}" arg2="0"/>
+            </not>
+            <then>
+                <property name="unix.username" value="${env.USERNAME}"/>
+                <antform title="User login information">
+                    <textProperty label="UNIX login:" property="unix.username"/>
+                    <textProperty label="UNIX password:" property="unix.password" password="true"/>
+                </antform>
+                <property name="unix.password.available" value="1"/>
+            </then>
+        </if>
+        <hlm:filterRecordStopMacro pattern="${unix.password}"/>
+    </target>
+    
+    <!-- Retrieve the GRACE password from the .netrc file and store it into release.grace.password property. -->
+    <target name="grace-password" if="release.grace">
+        <hlm:netrcPasswordMacro output-prop="release.grace.password" result-prop="grace.password.available" type="grace"/>
+    </target>
+    
+    <!-- Retrieve the NOE password from the .netrc file and store it into noe.password property. -->
+    <target name="noe-password">
+        <hlm:netrcPasswordMacro output-prop="noe.password" result-prop="noe.password.available" type="noe"/>
+        <if>
+            <not>
+                <isset property="noe.password"/>
+            </not>
+            <then>
+                <antform title="NOE login information">
+                    <label>Unable to read NOE password from h:\.netrc file.</label>
+                    <textProperty label="NOE password:" property="noe.password" password="true"/>
+                </antform>
+            </then>
+        </if>
+    </target>
+    
+    <!-- Retrieve the notes password from the .netrc file and store it into notes.password property. -->    
+    <target name="notes-password">
+        <hlm:netrcPasswordMacro output-prop="release.notes.password" result-prop="notes.password.available" type="notes"/>
+    </target>
+
+    <!-- Retrieve the ccm password from the .netrc file and store it into ccm.password property. 
+    Requires ccm.enabled tobe set to 'true' to work.-->
+    <target name="ccm-password">
+        <if>
+            <isset property="run.ccm"/>
+            <then>
+                <hlm:netrcPasswordMacro output-prop="ccm.password.rc" result-prop="ccm.password.available" type="synergy"/>
+            </then>
+        </if>
+    </target>
+    
+    <!-- Retrieve the ccm username from the .netrc file and store it into ccm.username property.
+    Requires ccm.enabled tobe set to 'true' to work. -->
+    <target name="ccm-username">
+        <if>
+            <isset property="run.ccm"/>
+            <then>
+                <hlm:netrcUsernameMacro output-prop="ccm.login.rc" result-prop="ccm.username.available" type="synergy"/>
+            </then>
+        </if>
+    </target>
+    
+    <!--
+        This target retreive user's login and password and tries to
+        open a synergy session. if it fails it leaves ant
+        it sets the following properties:
+         - ccm.user.login
+         - ccm.user.password
+        it requires ccm.database to be set to the wanted database and ccm.enabled to set to 'true'.
+    -->
+    <target name="get-ccm-password" depends="ccm-password,ccm-username" unless="ccm.user.password">
+        <if>
+            <isset property="run.ccm"/>
+            <then>
+                <hlm:filterRecordStartMacro/>
+                <if>
+                    <not>
+                        <and>
+                            <isset property="ccm.login.rc"/>
+                            <isset property="ccm.password.rc"/>
+                        </and>
+                    </not>
+                    <then>
+                        <if>              
+                            <isset property="ccm.login.popup.disable"/> 
+                            <then>
+                                <echo>Error: Unable to read synergy username and password from .netrc file.</echo>
+                                <property name="skip.password.validation" value="true"/>
+                            </then> 
+                            <else>
+                                <property name="ccm.user.login" value="${env.USERNAME}"/>
+                                <antform title="Synergy login information">
+                                    <label>Unable to read synergy username and password from h:\.netrc file.</label>
+                                    <textProperty label="ccm login:" property="ccm.user.login"/>
+                                    <textProperty label="ccm password:" property="ccm.user.password" password="true"/>
+                                </antform>
+                                <property name="ccm.password.available" value="1"/>
+                                <property name="unix.username" value="${env.USERNAME}"/>
+                                <property name="unix.password" value="${ccm.user.password}"/>
+                                <property name="unix.password.available" value="1"/>
+                            </else> 
+                        </if>
+                    </then>
+                    <else>
+                        <property name="ccm.user.login" value="${ccm.login.rc}"/>
+                        <property name="ccm.user.password" value="${ccm.password.rc}"/>
+                    </else>
+                </if>
+        
+                <antcall target="ccm-check"/>
+                <hlm:filterRecordStopMacro pattern="${ccm.user.password}"/>
+            </then>
+            <!--echo> ccm not enabled so not get password</echo-->
+        </if>
+    </target>
+    
+    <!-- check synergy is available needs ccm.enabled to be set to 'true' as well.-->
+    <target name="ccm-check" unless="skip.password.validation">
+        <if>
+            <isset property="run.ccm"/>
+            <then>
+                <hlm:ccmAvailableMacro resultproperty="ccm.session.created"/>
+                <echo>ccm.session.created = ${ccm.session.created}</echo>
+                <if>
+                    <equals arg1="${ccm.session.created}" arg2="-1"/>
+                    <then>
+                        <fail message="Unable to create CCM session."/>
+                    </then>
+                </if>
+                <if>
+                    <equals arg1="${ccm.session.created}" arg2="-2"/>
+                    <then>
+                        <fail message="Access Denied for user."/>
+                    </then>
+                </if>
+            </then>
+        </if>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/prep_build_area.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,623 @@
+#!perl -w
+
+#============================================================================ 
+#Name        : prep_build_area.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+use strict;
+use Getopt::Long;
+use File::Path;
+use File::Basename;
+use File::Spec;
+use File::Temp qw(tempfile);
+use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
+use FindBin;
+use XML::Twig;
+use FindBin;
+use lib "$FindBin::Bin/../common/packages";
+use Utils;
+
+
+sub process_build_sources;
+
+
+my $UNZIP = "unzip";
+
+
+my $destdir = '';
+my $zipdir = '';
+my $config = '';
+my $dryrun = 0;
+my $verbose = $ENV{'VERBOSE'};
+
+GetOptions( 'destdir=s'  => \$destdir,
+            'zipdir=s'   => \$zipdir,
+            'config=s'   => \$config,
+            'dry-run|n'  => \$dryrun) or pod2usage( 2 );
+
+my ( $dest_drive, undef, undef ) = File::Spec->splitpath( $destdir );
+my $twig = new XML::Twig();
+$twig->parsefile( $config );
+
+# Get the 'prepSpec' XML root element
+my $root = $twig->root();
+
+# Get the list of generic excluded paths from the XML config file
+my @excluded_paths;
+my @exclude_elements = $root->get_xpath( "config/exclude" );
+for my $exclude_element ( @exclude_elements )
+{
+    my $exclude_text = $exclude_element->att( 'name' );
+    push( @excluded_paths, $exclude_text );
+}
+
+my @sources;
+@sources = $root->get_xpath( "source" );
+
+# Always run just a check of the inputs
+my $validate_failed = 0;
+my $validate_only = 1;
+process_build_sources( $destdir, $zipdir, \@sources, $validate_only );
+
+# Then run the actual operations if a parameter was not set to do a dry run only
+if ( not $validate_failed )
+{
+    $validate_only = 0;
+    
+    process_build_sources( $destdir, $zipdir, \@sources, $validate_only );
+    # Delete the unzip directory in case one was created
+    print "Deleting the temp unzip directory: '$zipdir'\n";
+    rmtree( $zipdir, 1 );
+}
+exit $validate_failed;
+
+
+
+sub process_build_sources
+{
+    my ( $destdir, $zipdir, $sources, $validate_only ) = @_;
+    for my $source ( @{$sources} )
+    {
+        process_source( $destdir, $zipdir, $source, $validate_only );
+    }
+}
+
+
+
+# Process a single source element, which could define either a copy or an unzip
+# operation.
+sub process_source
+{
+    my ( $destdir, $zipdir, $source_element, $validate_only ) = @_;
+
+    my $source_label = $source_element->att( 'label' );
+    if ( $verbose )
+    {
+        print "Processing source with label: $source_label\n";
+    }
+
+    # Handle each of the copy or unzip operations for this source
+    my @operations = $source_element->get_xpath( "copy" );
+    my @unzip_operations = $source_element->get_xpath( "unzip" );
+    my @unzipicds_operations = $source_element->get_xpath( "unzipicds" );
+    my @nested_unzip_operations = $source_element->get_xpath( "nestedunzip" );
+    push( @operations, @unzip_operations, @unzipicds_operations, @nested_unzip_operations );
+    for my $operation ( @operations )
+    {
+        if ( is_valid( $operation ) )
+        {
+            # Construct the path for the zip to extract or the directory to copy
+            my $source = undef;
+            if ( $operation->gi() =~ /^(unzip|copy|nestedunzip)$/ )
+            {
+            	$source = File::Spec->canonpath( $source_element->att( 'basedir' ).'/'. $operation->att( 'name' ));
+            	$source = replace_env_vars( $source );
+
+            	if ( $verbose )
+            	{
+            	    print "Processing $source\n";
+            	}
+
+            	# Check if the source directory or zip exists, unless it contains globs
+            	if ( ( not -e $source ) && ( $source !~ /\*/ ) )
+            	{
+            	    if ( $source !~ /^$dest_drive/i )
+            	    {
+            	        print("ERROR: Can't locate input source: \"$source\"\n");
+            	        $validate_failed = 1;
+            	        next;
+            	    }
+            	    else
+            	    {
+            	        if ( $verbose )
+            	        {
+            	            print( "INFO: Input not ready: \"$source\"\n");
+            	        }
+            	    }
+            	}
+		}
+
+            if ( not $validate_only )
+            {
+                # Construct the destination directory, based on the provided default
+                # root destination and any additional subdirectory defined in the operation
+                my $dest = $destdir;
+                my $dest_sub_dir = $operation->att( 'dest' );
+                if ( $dest_sub_dir )
+                {
+                    $dest_sub_dir = replace_env_vars( $dest_sub_dir );
+
+                    # If the destination is an absolute path, then ignore the
+                    # default root destination.
+                    if ( $dest_sub_dir =~ /:/ )
+                    {
+                        $dest = $dest_sub_dir;
+                    }
+                    # Otherwise just add the subdirectory to root destination
+                    else
+                    {
+                        $dest .= $dest_sub_dir;
+                    }
+                }
+                $dest = replace_env_vars( $dest );
+
+                # See if operation is a copy or an unzip
+                my $operation_type = $operation->gi();
+                
+                unless( -e $dest )
+                {
+						    	mkpath( [$dest],1,0755 );
+						    }
+                
+                if ( $operation_type eq 'unzip' )
+                {                	  
+                    extract_source_zip( $source, $dest, $zipdir, $operation );
+                }
+                elsif ( $operation_type eq 'nestedunzip' )
+                {                	                	
+                	extract_source_nested( $source, $dest, $zipdir, $operation );
+                }
+                elsif ( $operation_type eq 'copy' )
+                {
+                    copy_source_files( $source, $dest, $operation );
+                }
+                elsif ( $operation_type eq 'unzipicds' )
+                {
+                	extract_source_icds( $source, $dest, $zipdir, $operation );
+                }
+            }
+        }
+    }
+}
+
+# Unzip icds
+sub CompareICDs
+{
+	my $aid = 0;
+	my $bid = 0;
+	$aid = $1 if ($a =~ /ic([d|f]\d+.*)\.zip$/i);
+	$bid = $1 if ($b =~ /ic([d|f]\d+.*)\.zip$/i);
+	return lc($aid) cmp lc($bid);
+}
+
+#
+# Syntax:
+#
+# + source
+#   + unzipicds
+#      location+
+#      include*
+#
+sub extract_source_icds
+{
+    my ( $sourcezip, $dest, $zipdir, $zip_element ) = @_;
+    my @location_elements = $zip_element->get_xpath( 'location' );
+
+    my @listoffiles;
+    foreach my $location_element ( @location_elements )
+		{
+		    my $dir = File::Spec->canonpath( $location_element->att('name') );
+			print "Scanning $dir\n";
+			unless ( -d "$dir" )
+			{
+				print ("WARNING: $dir doesn't not exits. Skipping\n");
+				next;
+			}
+
+			opendir DIR, $dir;
+			my @l = grep( { # Check the file ends in .zip
+			                /\.zip$/ &&
+			                # Check file is a plain file (not a directory)
+			                -f "$dir/$_" &&
+			                # Modify the file path to the full canonical one
+			                ($_=File::Spec->canonpath("$dir/$_")) } readdir(DIR) );
+
+            # See if any of the files are in the list of excluded files
+            my @exclude_elements = $location_element->get_xpath( 'exclude' );
+            if ( scalar( @exclude_elements ) > 0 )
+            {
+                my @excluded_files = map( $_->att('name'), @exclude_elements );
+                my $files_total = scalar( @l );
+                my $i = 0;
+                while( $i < $files_total )
+                {
+                    my $file = $l[$i];
+                    foreach my $excluded_file ( @excluded_files )
+                    {
+                        if ( $file =~ /$excluded_file/ )
+                        {
+                            print( "Removing excluded file '$file' from ICD/ICF list\n" );
+                            splice( @l, $i, 1 );
+                            $files_total--;
+                        }
+                    }
+                    $i++;
+                }
+            }
+			@listoffiles = (@listoffiles, @l);
+
+			closedir DIR;
+		}
+
+    my @include_elements = $zip_element->get_xpath( 'include' );
+    my $includes = '';
+		for my $include_element ( @include_elements )
+		{
+			if ( is_valid( $include_element ) )
+			{
+				my $include_text = $include_element->att( 'name' );
+				$includes .= "$include_text ";
+			}
+		}
+
+	foreach my $icd (sort CompareICDs @listoffiles)
+	{
+		if ( -e "$icd" )
+		{
+			print "Unzipping $icd\n";
+	    log_exec(  "$UNZIP -o -C $icd"
+           . " $includes"
+           . " -x " . join(" ", map({"*/" . $_} @excluded_paths ))
+           . " -d $dest");
+		}
+	}
+}
+
+
+# Copy (optionally) zip files and extract them
+sub extract_source_zip
+{
+    my ( $sourcezip, $dest, $zipdir, $zip_element ) = @_;
+
+    if ( $zipdir )
+    {
+        if ( not -d $zipdir )
+        {
+            print "Creating dir for caching zip files: $zipdir\n";
+            eval { mkpath( $zipdir ) };
+            if ( $@ )
+            {
+                print "Couldn't create $zipdir: $@";
+            }
+        }
+
+        my $destzip = File::Spec->canonpath($zipdir.'/'.basename( $sourcezip ));
+
+        my ( $lcl_size, $rmt_size ) = ( 0, 0 );
+        if ( -f $destzip )
+        {
+            $lcl_size = -s $destzip;
+        }
+        if ( -f $sourcezip )
+        {
+            $rmt_size = -s $sourcezip;
+        }
+        if ( $rmt_size != $lcl_size )
+        {
+            my $zipdir_to_copy = $zipdir;
+            $zipdir_to_copy =~ s/\//\\/g;
+            log_exec( "xcopy $sourcezip $zipdir_to_copy /H /R /Y /Q" );
+            die( "xcopy failed with exit code " . ($? >> 8)) if ($? >> 8);
+        }
+
+        # Set source zip to the cached copy on the local drive
+        $sourcezip = $destzip;
+    }
+
+    # See if there are any include patterns
+    my $includes = '';
+    my @include_elements = $zip_element->get_xpath( 'include' );
+    my @source_include_elements = $zip_element->get_xpath( '../include' );
+    push( @include_elements, @source_include_elements );
+    if ( scalar( @include_elements ) > 0 )
+    {
+        for my $include_element ( @include_elements )
+        {
+            if ( is_valid( $include_element ) )
+            {
+                my $include_text = $include_element->att( 'name' );
+                $includes .= "$include_text ";
+            }
+        }
+    }
+
+    log_exec(  "$UNZIP -o -C $sourcezip"
+               . " $includes"
+               . " -x " . join(" ", map({"*/" . $_} @excluded_paths ))
+               . " -d $dest");
+    rmtree( $zipdir, 1 );   
+}
+
+# Find all zip files and unzip those twice
+sub extract_source_nested
+{
+    my ( $sourcezip, $dest, $zipdir, $zip_element ) = @_;
+    my $nestedZipDir = $zipdir . '_nested';
+    if ( $nestedZipDir )
+    {
+        if ( not -d $nestedZipDir )
+        {
+            print "Creating dir for caching zip files: $nestedZipDir\n";
+            eval { mkpath( $nestedZipDir ) };
+            if ( $@ )
+            {
+                print "Couldn't create $nestedZipDir: $@";
+            }
+        }
+
+        my $destzip = File::Spec->canonpath($nestedZipDir.'/'.basename( $sourcezip ));
+
+        my ( $lcl_size, $rmt_size ) = ( 0, 0 );
+        if ( -f $destzip )
+        {
+            $lcl_size = -s $destzip;
+        }
+        if ( -f $sourcezip )
+        {
+            $rmt_size = -s $sourcezip;
+        }
+        if ( $rmt_size != $lcl_size )
+        {
+            my $zipdir_to_copy = $nestedZipDir;
+            $zipdir_to_copy =~ s/\//\\/g;     
+            log_exec(  "$UNZIP -o -C $sourcezip"                              
+               . " -d $zipdir_to_copy");            
+        }
+
+        # Set source zip to the cached copy on the local drive
+        $sourcezip = $nestedZipDir . "/" . "*.zip";
+    }   
+
+    log_exec(  "$UNZIP -o -C $sourcezip"
+               . " -d $dest");
+    rmtree( $nestedZipDir, 1 );    
+}
+
+
+
+# Copy the release files to a local directory
+sub copy_source_files
+{
+    my ( $source, $dest, $copy_element ) = @_;
+
+    # strip trailing slash - xcopy doesn't like it on source directories
+    $source =~ s/[\\\/]$//;
+
+    # See if the source input is a single file
+    if ( -f $source )
+    {
+        # See if the file should be excluded
+        if ( is_excluded( $source ) )
+        {
+            print("Rule \"$source\" => \"$dest\" excluded");
+            return;
+        }
+
+        # See if a tofile attribute is defined to specify a destination file.
+        # Here the $dest parameter is assumed to be just the base directory, as
+        # an operation should not have both dest and tofile attributes.
+        my $tofile = $copy_element->att( 'tofile' );
+        $tofile = replace_env_vars( $tofile );
+        if ( $tofile )
+        {
+            # If the destination is an absolute path, then ignore the
+            # default root destination.
+            if ( $tofile =~ /:/ )
+            {
+                $dest = $tofile;
+            }
+            # Otherwise just add the subdirectory to root destination
+            else
+            {
+                $dest .= $tofile;
+            }
+        }
+        else
+        {
+            # Create the destination file name, based on path and source filename
+            my ( $vol, $path, $file ) = File::Spec->splitpath( $source );
+            $dest = File::Spec->catpath( '', $dest, $file );
+        }
+
+        # See if the directory path needs to be created
+        my ( $vol, $path, undef ) = File::Spec->splitpath( $dest );
+        my $destpath = File::Spec->catpath( $vol, $path, '' );
+        # Remove any trailing slashes
+        $destpath =~ s/[\\\/]$//;
+        if ( not ( -e $destpath ) )
+        {
+            print "Creating dir for copying source files: $destpath\n";
+            eval { mkpath( $destpath ) };
+            if ( $@ )
+            {
+                print "Couldn't create $destpath: $@";
+            }
+        }
+
+        # Execute the copy
+        # Convert forward to backslashes
+        $dest =~ s/\//\\/g;
+        log_exec("copy $source $dest /Y");
+    }
+    # See if the input is a directory
+    elsif ( -d $source )
+    {
+        $dest =~ s/\//\\/g;
+        my $tempfile = write_exclude_file( $copy_element );
+        log_exec(
+                 "xcopy $source $dest /S /E /I /H /R /Y /F /EXCLUDE:$tempfile");
+        log_warn("xcopy did not find any files to copy") if ($? >> 8) == 1;
+        log_die("xcopy failed with exit code " . ($? >> 8)) if ($? >> 8) > 1;
+        unlink( $tempfile );
+    }
+}
+
+
+
+sub is_valid
+{
+    my ( $element ) = @_;
+    my $valid = 1;
+
+    # See if operation is conditional on a property
+    my $if_conditional = $element->att( 'if' );
+    my $unless_conditional = $element->att( 'unless' );
+    if ( $if_conditional )
+    {    	
+        # The operation is not processed if a conditional is present but
+        # it is not true.
+        if ( $if_conditional !~ /^true|yes|1$/i )
+        {
+            $valid = 0;
+        }
+    }
+    elsif ( $unless_conditional )
+    {
+        # The operation is not processed if a conditional is present but
+        # it is considered true.
+    	if ( $unless_conditional =~ /^true|yes|1$/i )
+        {
+            $valid = 0;
+        }
+    }
+    return $valid;
+}
+
+
+
+# Return true if the given file is excluded
+sub is_excluded
+{
+    my ( $file ) = @_;
+    my $exclude = 0;
+    $file =~ s/\\/\//g;
+    for my $exclude_file ( @excluded_paths )
+    {
+        if ( $file =~ /$exclude_file/ )
+        {
+            $exclude = 1;
+            last;
+        }
+    }
+    return $exclude;
+}
+
+
+
+# write an xcopy exclude file with excluded source paths
+sub write_exclude_file
+{
+    my ( $copy_element ) = @_;
+
+    # Create a tempfile containing files that are ignored
+    my ( $handle, $tempfile ) = tempfile();
+
+    my @exclude_elements = $copy_element->get_xpath( 'exclude' );
+    for my $exclude ( @exclude_elements )
+    {
+        if ( is_valid( $exclude ) )
+        {
+            my $exclude_path = $exclude->att( 'name' );
+            # Convert forward slashes to backward slashes for xcopy
+            $exclude_path =~ s/\//\\/g;
+            print( $handle "$exclude_path\n" );
+        }
+    }
+
+    print( $handle join( "\n", @excluded_paths ) );
+    close( $handle );
+    return $tempfile;
+}
+
+
+
+sub log_exec
+{
+    my $cmd = shift;
+    print "sys: \"$cmd\"\n";
+    my @output;
+    if ( not $dryrun )
+    {
+        @output = `$cmd 2>&1`;
+    }
+    print @output;
+    $? = 0;
+}
+
+
+
+__END__
+
+
+=head1 NAME
+
+prep_build_area.pl - Populates a build area from input source directories and
+zips.
+
+=head1 SYNOPSIS
+
+prep_build_area.pl -config=<XML config file> [-zipdir=\unzip] [-dry-run=<yes|no>]
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-config>
+
+The path to a XML configuration file that defines the source inputs to
+the build.
+
+=item B<-zipdir>
+
+A directory that can be used for copying zips into to cache locally before
+unzipping.
+
+=item B<-dry-run>
+
+If defined, this will cause just the inputs to be checked but no copying
+or unzipping will take place.
+
+=back
+
+=head1 DESCRIPTION
+
+This script prepares a build drive by copying directories and unzipping files
+into the drive, based on an XML configuration file that defines a number
+of source inputs. See the XML schema documentation for more details.
+
+=cut
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/preparation.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,604 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : preparation.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="preparation" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Preparation of a build area and other build initialization.</description>
+    
+    <!-- includes all necessary stuff -->
+    <property name="ccmgetinput" value="ccmgetinput" />
+
+    <import file="bom/bom.ant.xml" />
+    <import file="password.ant.xml" />
+    <import file="ido-prep.ant.xml" />
+    <import file="overlays.ant.xml" />
+    <import file="synergy/ccmgetinput.ant.xml" />
+    <import file="synergy/buildmanagement.ant.xml" />
+    <import file="ivy/dependencies.ant.xml"/>
+
+
+    <!--
+        Gets a release from GRACE.
+        TODO: Improve interface with customer configuration, getenv_options should be replaced by set of properties.
+    -->
+    <target name="preparation-getenv" if="base_release.path" depends="init-build-area">
+        <!-- Making sure we have nothing to pass -->
+        <property name="base_release.path" value=""/>
+        <property name="base_release.getenv_options" value=""/>
+        <!-- Using the cleaned version of getenv.pl -->
+        <property name="getenv.tool.location" location="${helium.dir}/tools/preparation/getenv.pl"/>
+        <hlm:tempRecordStartMacro name="${build.id}_getenv.log"/>        
+        <trycatch>
+            <try>
+                <if>
+                    <not>
+                        <equals arg1="${base_release.getenv_options}" arg2="" />
+                    </not>
+                    <then>
+                        <exec executable="perl" dir="${build.drive}/" failonerror="true">
+                            <arg value="${getenv.tool.location}"/>
+                            <arg value="-start"/>
+                            <arg value="-nosoap"/>            
+                            <arg value="-path"/>
+                            <arg value="${base_release.path}"/>
+                            <arg line="${base_release.getenv_options}"/>
+                        </exec>
+                    </then>
+                    <else>
+                        <exec executable="perl" dir="${build.drive}/" failonerror="true">
+                            <arg value="${getenv.tool.location}"/>
+                            <arg value="-start"/>
+                            <arg value="-nosoap"/>            
+                            <arg value="-path"/>
+                            <arg value="${base_release.path}"/>
+                        </exec>
+                    </else>
+                </if>
+            </try>
+            <catch>
+                <echo message="Error: getenv failed"/>
+            </catch>
+        </trycatch>
+        <hlm:tempRecordStopMacro name="${build.id}_getenv.log" filterref="filterset.getenv"/>
+    </target>
+
+        
+    <!-- Removes an older build area from a machine, based on a count of 
+    how many build areas to maintain at a time.
+    -->
+    <target name="delete-old-build-area" if="build.area.limit">
+        <dirset id="build.area.dirs" dir="${prep.root.dir}" includes="${build.name}*"/>
+        <if>
+            <resourcecount when="greater" count="${build.area.limit}">
+                <dirset refid="build.area.dirs"/>
+            </resourcecount>
+            <then>
+                <pathconvert property="build.area">
+                    <first count="1">
+                        <sort xmlns:rcmp="antlib:org.apache.tools.ant.types.resources.comparators">
+                            <rcmp:date/>
+                            <dirset refid="build.area.dirs"/>
+                        </sort>
+                    </first>
+                </pathconvert>
+                <echo>${build.area}</echo>
+                <shellscript shell="cmd.exe" tmpsuffix=".bat" dir="${prep.root.dir}">
+                    <arg value="/c"/>
+                    <arg value="call"/>
+                    rmdir /s/q ${build.area}
+                </shellscript>
+            </then>
+        </if>
+    </target>
+
+
+    <!-- Defines the start of a build from logging point of view. -->
+    <target name="log-build-start">
+        <tstamp>
+            <format property="log.build.start_time" pattern="yyyy-MM-dd'T'HH:mm:ss" />
+        </tstamp>
+        <!-- Used in ROM configuration files for version date. -->
+        <tstamp>
+            <format property="today" pattern="dd-MM-yyyy" />
+        </tstamp>
+    </target>
+
+
+ 
+     <!-- Prepares the Synergy configuration input for processing.
+     
+     This inserts Ant properties to the config file. --> 
+    <target name="ccm-prepare-input" if="prep.delivery.file">        
+        <property name="prep.delivery.conf.parsed" location="${build.cache.dir}/delivery.xml.parsed" />
+        <copy file="${prep.delivery.file}" tofile="${prep.delivery.conf.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties />
+            </filterchain>
+        </copy>
+    </target>
+    
+
+    <!-- Checks the build drive is available. -->
+    <target name="check-env-build-drive">
+        <available file="${build.drive}/" property="build.drive.available" />
+        <fail unless="build.drive.available" />
+    </target>
+
+    <!-- Macro to check enough disk space available or not. Notify build manager
+    in case of insufficient disk space. -->
+    <macrodef name="diskspaceMacro" uri="http://www.nokia.com/helium">
+        <attribute name="drive"/>
+        <attribute name="space"/>
+        <sequential>
+            <trycatch>
+                <try>
+                    <exec executable="python" failonerror="true">
+                        <arg value="${helium.dir}/tools/preparation/freedisk.py" />
+                        <arg value="--drive" />
+                        <arg value="@{drive}" />
+                        <arg value="--space" />
+                        <arg value="@{space}" />
+                    </exec>
+                </try>
+                <catch>
+                    <hlm:notifyMacro message="${env.COMPUTERNAME} has insufficient disk space on drive @{drive} for ${build.id}. Build will continue..."/>
+                </catch>
+            </trycatch>
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- Checks there is sufficient disk space on the local machine and on the network. -->
+    <target name="check-free-space">
+        <if>
+            <isset property="local.free.space"/>
+            <then>
+                <echo message="drive: ${build.drive}"/>
+                <echo message="Required Space: ${local.free.space}MB"/>
+                <if>
+                    <not>
+                        <hasfreespace partition="${build.drive}" needed="${local.free.space}M"/>
+                    </not>
+                    <then>
+                        <hlm:notifyMacro message="${env.COMPUTERNAME} has insufficient disk space on drive ${build.drive} for ${build.id}. Build will continue..."/>
+                    </then>
+                </if>
+            </then>
+        </if>
+        <if>
+            <isset property="network.free.space"/>
+            <then>
+                <hlm:diskspaceMacro drive="${network.drive}" space="${network.free.space}"/>
+            </then>
+        </if>
+    </target>
+
+
+    <!-- Checks that filedisk is on the machine.
+    
+    TODO: do we still need this if filedisk is in /external? Also should handle
+    tools dependencies in more structured way. 
+    -->
+    <target name="check-env-filedisk" depends="check-env-build-drive">
+        <available file="${env.SystemRoot}/system32/filedisk.exe" property="filedisk.available" />
+        <fail unless="filedisk.available" />
+    </target>
+
+
+    <!-- Gets the ARM compiler license text. -->
+    <target name="get-arm-license">
+        <exec executable="armcc.exe" outputproperty="arm.compiler.version.text" failonerror="${failonerror}">
+            <arg value="--vsn" />
+        </exec>
+        <echo message="ARM compiler version text: ${arm.compiler.version.text}" />
+    </target>
+
+
+    <!-- Checks if there was any error getting the ARM license information. -->
+    <target name="check-env-arm-license" depends="get-arm-license">
+        <!-- Fail if the compiler version string contains error text. -->
+        <fail message="Error with ARM compiler configuration.">
+            <condition>
+                <contains string="${arm.compiler.version.text}" substring="Error" />
+            </condition>
+        </fail>
+    </target>
+
+
+    <!-- Sets the ARM compiler version to a property so it can be set in the environment
+    during compilation. -->
+    <target name="set-arm-version" depends="check-env-arm-license" unless="not.using.rvct">
+        <loadresource property="arm.compiler.version">
+            <propertyresource name="arm.compiler.version.text"/>
+            <filterchain>
+                <linecontainsregexp>
+                    <regexp pattern="ARM/Thumb C/C\+\+ Compiler" />
+                </linecontainsregexp>
+            </filterchain>
+        </loadresource>
+        <echo message="ARM compiler version: ${arm.compiler.version}" />
+    </target>
+
+
+    <!-- Prepares the preparation configuration by inserting Ant properties. -->
+    <target name="prep-prepare-input" if="prep.config.file">
+        <property name="prep.config.file.parsed" location="${build.output.dir}/prep.xml.parsed" />
+        <copy file="${prep.config.file}" tofile="${prep.config.file.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties />
+            </filterchain>
+        </copy>
+    </target>
+
+
+    <!-- Checks that all the build area inputs are available. -->
+    <target name="check-env-prep" depends="prep-prepare-input">
+        <preset.exec executable="${env.PERL}" failonerror="true">
+            <arg value="${helium.dir}/tools/preparation/prep_build_area.pl" />
+            <arg value="-config" />
+            <arg value="${prep.config.file.parsed}" />
+            <arg value="-destdir" />
+            <arg value="${build.drive}${env.EPOCROOT}" />
+            <arg value="-dry-run" />
+            <arg value="yes" />
+        </preset.exec>
+    </target>
+
+
+    <!-- Generates a starting XML file for the build summary. -->
+    <target name="build-info" depends="log-build-start">
+        <dirname file="${build.summary.file}" property="build.summary.file.dir"/>
+        <mkdir dir="${build.summary.file.dir}"/>
+        <xmltask dest="${build.log.dir}/${build.id}_info.log.xml">
+            <insert path="/">
+                <![CDATA[
+            <info>
+                <id>${build.id}</id>
+                <number>${build.number}</number>
+                <startTime>${log.build.start_time}</startTime>
+                <machine>${env.COMPUTERNAME}</machine>
+                <publish>
+                    <status>${is.published}</status>
+                    <location>${publish.dir}</location>
+                </publish>
+            </info>
+                ]]>
+            </insert>
+        </xmltask>
+    </target>
+    
+    <propertyset id="password.list.ref">
+        <propertyref name="ccm.password.rc" />
+        <propertyref name="ccm.user.password" />
+        <propertyref name="release.grace.password" />
+        <propertyref name="unix.password" />
+        <propertyref name="release.notes.password" />
+        <propertyref name="nwiki.password" />
+        <propertyref name="noe.password" />
+        <propertyref name="ats3.password" />
+        <propertyref name="hydra.password" />
+    </propertyset>
+    
+    <!-- Logs the Ant property build environment. -->
+    <target name="log-build-env">
+        <echoproperties destfile="${build.log.dir}/${build.id}_ant_env.log">
+            <!-- Do not log passwords... -->
+            <propertyset negate="true">
+                <propertyset refid="password.list.ref"/>
+            </propertyset>
+        </echoproperties>
+    </target>
+    
+    
+    <!-- Create a free substed drive for running the build on.
+        
+    Helium can now subst/unsubst build drive automatically. If you don't define the property "build.drive" then helium will search the next available build drive and assign it to in "build.drive" property.
+    To unsubst the build drive after the build use property "unsubst.after.build=yes", the value "no" will let the drive still in subst.
+        
+    This target will: 
+    * Rename the prep directory if it exists and we don't have prep.build.dir.keep defined. 
+    * Create a new directory for prepping the build area.
+    * Subst that directory to the build drive.
+    -->
+    <target name="prep-drive">
+      
+      <!-- Just un-subst the drive if build.drive is predefined. -->
+        <propertyregex property="prep.build.dir.drive" input="${prep.build.dir}" regexp="^([^:]*:\\).*" select="\1" />
+        <fail message="${prep.build.dir.drive} could not be located">
+            <condition>
+                <and>
+                    <os family='windows'/>
+                    <not>
+                        <available file="${prep.build.dir.drive}"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
+        <if>
+            <and>
+                <not>
+                    <isset property="env.HLM_SUBCON"/>
+                </not>
+                <isset property="use.dragonfly"/>
+            </and>
+            <then>
+                <antcall target="dragonfly-prep-drive"/>
+            </then>
+            <else>
+                <if>
+                    <not>
+                        <isset property="build.drive.notdefined"/>
+                    </not>
+                    <then>
+                        <echo>Unsubsting any existing path substed to ${build.drive}.
+If this fails, it is because there was no substed drive.</echo>
+                        <hlm:unsubst drive="${build.drive}" failonerror="${failonerror}"/>
+                    </then>   
+                </if>    
+                <tstamp>
+                    <format property="old.prep.dir.timestamp" pattern="yyyyMMdd'_'HHmmss" />
+                </tstamp>
+                <if>
+                    <not>
+                        <isset property="prep.build.dir.keep"/>
+                    </not>
+                    <then>
+                        <script language="jython" setbeans="false">
+from java.io import *
+import time
+prep_build_dir_str = project.getProperty('prep.build.dir')
+prep_build_dir = File(prep_build_dir_str)
+print prep_build_dir
+if prep_build_dir.exists(): 
+    timestamp = time.strftime("%Y%m%d_%H%M%S", time.localtime(time.time()))
+    renamed_prep_build_dir = File('%s.%s' % (prep_build_dir_str, timestamp))
+    print renamed_prep_build_dir
+    result = prep_build_dir.renameTo(renamed_prep_build_dir)
+    if result:
+        print 'Dir rename successful.'
+    else:
+        print 'Dir rename failed!'
+
+        raise Exception('Could not rename prep dir')
+                        </script>
+                    </then>
+                </if>
+                <!-- Create a new directory for the build and subst it to a drive. -->
+                <mkdir dir="${prep.build.dir}" />
+                <exec osfamily="windows" executable="subst.exe" failonerror="false">
+                    <arg value="${build.drive}" />
+                    <arg value="${prep.build.dir}" />
+                </exec>
+                <antcall target="backup-subst-drives"/>
+            </else>
+        </if>
+    </target>
+
+    <!-- To initialization prep-drive-->
+    <target name="init-drive" depends="prep-drive"/>
+
+    <!-- To initialization substituted drive-->
+    <target name="restore-subst-drives">
+        <if>
+            <available file="${cache.dir}/hlmsubsteddrives.bat" type="file"/>
+            <then>
+                <exec dir="${cache.dir}" executable="${cache.dir}/hlmsubsteddrives.bat" osfamily="windows" failonerror="false"/>
+            </then>
+        </if>
+    </target>
+    
+     
+    <!-- Creates several initial directories in a new build area. -->
+    <target name="init-build-area" depends="check-env-build-drive">
+        <mkdir dir="${build.output.dir}" />
+        <mkdir dir="${build.log.dir}" />
+        <mkdir dir="${temp.build.dir}" />
+    </target>
+    
+    
+    <!-- Basic initialization for a build, including starting the main ant_build log.
+        It also copies the additional logs from the temp directory into the build area. -->
+    <target name="init" depends="get-ccm-password">
+        <runtarget target="build-number"/>
+        <runtarget target="init-build-area"/>
+        <runtarget target="start-ant-log"/>
+    </target>
+    
+    <!-- Starting the main ant_build log -->
+    <target name="start-ant-log" depends="build-info">
+        <record name="${build.log}" append="true" loglevel="info"/>
+        <echo>Start main Ant build log: ${build.log}</echo>
+    
+        <echo>Copying temp logs from ${build.cache.log.dir} into the build area.</echo>
+        <copy todir="${build.log.dir}" verbose="true" failonerror="false">
+            <fileset dir="${build.cache.log.dir}">
+                <include name="*.log"/>
+                <include name="*.xml"/>
+            </fileset>
+        </copy>
+    </target>
+    
+    <!-- This target exists as a trigger for initiating the Diamonds logger. If 
+          it is not included in the build sequence, the build will not be logged to 
+          Diamonds. Also  build.property.cache.file will be there contains all the diamonds related properties 
+    --> 
+    <target name="diamonds">
+        <mkdir dir="${build.log.dir}" />
+        <var name="diamonds.build.url"  value="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}"/>
+        <echoproperties destfile="${build.property.cache.file}">
+            <propertyset>
+                <propertyref prefix="diamonds.build.url"/>
+                <propertyref prefix="diamonds.host"/>
+                <propertyref prefix="diamonds.port"/>
+                <propertyref prefix="diamonds.build.id"/>
+            </propertyset>
+        </echoproperties>
+    </target>    
+   
+    <!-- The ido-clean-prep is to be run after compile-clean but before prep copy in order to move old sources away.
+    It uses the "ido.src.root" property.
+    If property "ido.keep.old" is defined, the old files are renamed to a timestamped directory  
+    if not defined the directory for the old  files is "${ido.src.root}.old"
+    <deprecated>IDO which have now implemented the new ADO sysdef structure should use ido-prep-clean.</deprecated>
+    -->
+    <target name="ido-clean-prep" if="ido.src.root" >
+        <if>
+            <isset property="ido.keep.old"/>
+            <then>
+                <tstamp>
+                    <format property="ido.clean.src.extension" pattern="yyyyMMdd'_'HHmmss" />
+                </tstamp>
+            </then>
+            <else>
+                <property name="ido.clean.src.extension" value="old" />
+            </else>
+        </if>
+        <move todir="${ido.src.root}.${ido.clean.src.extension}"  failonerror="false" >
+            <fileset dir="${ido.src.root}" />
+        </move>
+    </target>
+
+
+    <!-- Preps the build area by copying and unzipping all the inputs. -->
+    <target name="prep-copy" depends="prep-prepare-input">
+        <preset.exec executable="${env.PERL}" output="${build.log.dir}/${build.id}_buildarea_prep.log" failonerror="true">
+            <arg value="${helium.dir}/tools/preparation/prep_build_area.pl" />
+            <arg value="-config" />
+            <arg value="${prep.config.file.parsed}" />
+            <arg value="-destdir" />
+            <arg value="${build.drive}${env.EPOCROOT}" />
+            <arg value="-zipdir" />
+            <arg value="${build.drive}/unzip" />
+        </preset.exec>
+        <!-- Delete Symbian file to force S60 version to compile -->
+        <delete file="${build.drive}/epoc32/tools/j2me/hromize.exe" />
+        <!-- parsing the generated log -->
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_buildarea_prep.log" />
+                <metadatafilterset refid="filterset.buildarea.prep" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_buildarea_prep.log" />
+    </target>
+    
+    <condition property="run.ccm">
+        <and>
+            <not>
+                <equals arg1="${ccm.enabled}" arg2="false" casesensitive="true"/>
+            </not>
+            <isset property="ccm.enabled"/>
+        </and>
+    </condition>
+    
+    <!-- Wrapper target to call prep-work-area during the build.
+         log will get recorded under the log directory.
+         Property ccm.enabled has to be set to 'true' to enable that step!
+         prep-work-area-check-errors is also run so it emits a signal in case of errors.
+      -->
+    <target name="do-prep-work-area">
+        <runtarget target="prep-work-area"/>
+    </target>
+    <!-- <deprecated>Please use do-prep-work-area</deprecated> -->
+    <target name="do-ccm-get-input" depends="do-prep-work-area"/>
+    
+    
+    <!-- Wrapper target to call start-remote-builds during the build.
+         log will get recorded under the log directory.
+         Property remote.builds.enabled has to be defined to enable that step!
+      -->
+    <target name="do-start-remote-builds" if="remote.builds.enabled">
+        <runtarget target="start-remote-builds"/>
+    </target>
+    
+    
+    <!-- check-env-prep has to be called after getting the delivery else it doesn't works for the first build. -->
+    <target name="do-prep" depends="check-tool-dependencies,check-free-space,do-prep-work-area,
+                                    do-start-remote-builds,check-env-prep,diamonds,create-bom,log-build-env,prep-copy,
+                                    set-arm-version,scan-overlays" />
+    
+    <!-- Macro to notify user by email/sms -->
+    <macrodef name="notifyMacro" uri="http://www.nokia.com/helium">
+        <attribute name="message"/>
+        <sequential>
+            <runtarget target="lookup-email" />
+            <tstamp>
+                <format property="time.failure" pattern="yyyy-MM-dd_HH.mm.ss" />
+            </tstamp>
+            <preset.mail tolist="${email.from}" subject="${env.COMPUTERNAME} prep stage problem!" message="@{message}" />
+            <!-- Get the first part of email address to use with SMS gateway -->
+            <propertyregex property="email.from.name" input="${email.from}" regexp="(.*?)@" select="\1" />
+            <preset.mail tolist="${email.from.name}@${sms.server}" subject="" message="@{message}" />
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- Fails the build if prep did not succeed. -->
+    <target name="prep-fail">
+        <if>
+            <available file="${build.log}"/>
+            <then>
+                <record name="${build.log}" action="stop" append="true"/>
+            </then>
+        </if>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:antmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ant_build.log" />
+                <metadatafilterset refid="filterset.ant.output" />
+            </hlm:antmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_ant_build.log" />
+        <!-- Todo: metadata: insert assertions for metadata parsing here -->
+    </target>
+    
+    <!-- Set properties for track full build event. -->
+    <target name="set-fullbuild-properties">
+        <property name="log.target" value="yes"/>
+        <property name="call.cleanup" value="no"/>
+    </target>
+    
+    <!-- Top-level target for preparing the build area. -->
+    <target name="prep" depends="set-fullbuild-properties,init-drive,init">
+        <trycatch property="build.exception">
+            <try>
+                <runtarget target="do-prep" />
+            </try>
+            <catch>
+                <echo message="Build has failed during prep: ${build.exception}" />
+                <runtarget target="prep-fail" />
+                <fail />
+            </catch>
+        </trycatch>
+    </target>
+
+    
+    <!-- Can be used to unsubst the drive . -->
+    <target name="remove-drive">
+        <if>
+            <os family="windows"/>
+            <then>
+                <hlm:unsubst drive="${build.drive}"/>
+            </then>
+        </if>
+    </target>
+    
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/synergy/buildmanagement.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : buildmanagement.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="buildmanagement" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Runs the build manager Synergy operations.
+    </description>
+    <!-- Preprocesses the build management configuration file. -->
+    <target name="build-manager-prepare-input">
+        <property name="project.config.file.parsed" location="${build.cache.dir}/project_config.xml.parsed" />
+        <copy file="${project.config.file}" tofile="${project.config.file.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties />
+            </filterchain>
+        </copy>
+    </target>
+
+
+    <!-- Runs the build manager Synergy operations. -->
+    <target name="build-manager" depends="build-manager-prepare-input">
+        <record name="${build.log.dir}/${build.id}_build_manager.log" action="start" />
+        <echo>ccm.engine.host = ${ccm.engine.host}</echo>
+        <echo>ccm.database.path = ${ccm.database.path}</echo>
+        <hlm:python resultproperty="buildmanagement.result">
+import buildmanagement
+
+buildmanagement.buildmanager(r'${ccm.engine.host}', r'${ccm.database.path}', r'${project.config.file.parsed}', r'${project.spec.name}')
+        </hlm:python>
+        <record name="${build.log.dir}/${build.id}_build_manager.log" action="stop" />
+        <hlm:logextract file="${build.log.dir}/${build.id}_build_manager.log" />
+        <!-- <hlm:signal name="buildManagementSignal" result="${buildmanagement.result}"/> -->
+    </target>
+
+    <!-- This macro enables you to create a synergy session using information from your .netrc file. -->
+    <scriptdef name="createSessionMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="database" />
+        <attribute name="reference" />
+        <attribute name="cache" />
+import sys
+import heliumlogging
+import logging
+import ant
+logging.getLogger('').addHandler(ant.AntHandler(self))
+reference = attributes.get('reference')
+cache = attributes.get('cache')
+if reference == None:
+    raise Exception("reference attribute is not defined.")
+database = attributes.get('database')
+if database == None:
+    raise Exception("database attribute is not defined.")
+
+import nokia.nokiaccm
+import ccm.extra
+from com.nokia.ant.types.ccm import SessionSet
+import traceback
+        
+session = None
+if cache != None:
+    p = ccm.extra.CachedSessionProvider(cache=str(cache))
+    session = p.get(database=str(database))
+    p.close()
+else:
+    session = nokia.nokiaccm.open_session(database=str(database))
+    session.close_on_exit = False
+
+sessionset = SessionSet()
+asession = sessionset.createSession()
+asession.setAddr(str(session.addr()))
+project.addReference(str(reference), sessionset)
+    </scriptdef>
+
+    <!-- Target to test ccm-task. -->
+    <target name="try-ccm-task" if="run.ccm">
+        <hlm:ccm>
+            <hlm:update project="mc_4032_component_branches-mc_4031_0650" />
+        </hlm:ccm>
+    </target>
+
+    <!-- Target to test ccm-task. -->
+    <target name="try-ccm-task2" if="run.ccm">
+        <hlm:createSessionMacro database="to1tobet" reference="test.session" />
+        <hlm:ccm verbose="false">
+            <!-- Defining some session to use. -->
+            <hlm:sessionset refid="test.session" />
+
+
+            <!-- Do something ...-->
+            <hlm:addtask folder="tr1test1#2079">
+                <task name="tr1test1#5310" />
+            </hlm:addtask>
+            <!--<hlm:update project="mc_4032_component_branches-mc_4031_0650"/>-->
+            <hlm:snapshot project="helium-to1tobet#helium_3.0:project:vc1s60p1#1" dir="c:\test" fast="true" recursive="true" />
+            <hlm:close />
+        </hlm:ccm>
+    </target>
+    <!-- Target to test ccm-checkout. -->
+    <target name="try-ccm-task3" if="run.ccm">
+        <hlm:createSessionMacro database="tr1test1" reference="test.session" />
+        <hlm:ccm verbose="false">
+            <!-- Defining some session to use. -->
+            <hlm:sessionset refid="test.session" />
+            <hlm:checkout project="Hello_World-8.2:project:tr1test1#1" release="Hello_World/next" />
+            <hlm:close />
+        </hlm:ccm>
+    </target>
+
+    <!-- Target to test ccm-work_area. -->
+    <target name="try-ccm-task4" if="run.ccm">
+        <hlm:createSessionMacro database="tr1test1" reference="test.session" />
+        <hlm:ccm verbose="false">
+            <!-- Defining some session to use. -->
+            <hlm:sessionset refid="test.session" />
+            <hlm:workarea project="Hello_World-8.3:project:tr1test1#1" maintain="True" />
+            <hlm:close />
+        </hlm:ccm>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ccmgetinput.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ccmgetinput" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+      Retrieves content from Synergy
+    </description>
+
+    <hlm:logfilterset id="prepWorkArea.logextract.config">
+        <logfilter category="error" regex="^ERROR:" />
+        <logfilter category="warning" regex="^WARNING:" />
+        <logfilter category="info" regex="^INFO:" />
+    </hlm:logfilterset>
+
+    
+    <!-- This target uses an XML input file to retrieve content from Synergy.
+      -->
+    <target name="prep-work-area" depends="log-build-start" if="run.ccm">
+        <hlm:tempRecordStartMacro name="${build.id}_ccm_get_input.log" />
+        <runtarget target="get-ccm-password"/>
+        <runtarget target="ccm-prepare-input"/>
+        
+        <hlm:assertPropertySet property="prep.delivery.file" message="Property prep.delivery.file is not defined." />
+        <trycatch>
+            <try>
+                <hlm:python failonerror="true">
+import preparation
+import configuration
+import traceback
+import logging            
+import ant
+import sys
+import os.path
+
+# enabling logging
+logging.basicConfig(level=logging.INFO)
+
+builder = None           
+try:
+    configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
+    configSet = configBuilder.getConfiguration()
+    builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), ant.get_property(r'${ccm.user.password}'), cache=ant.get_property(r'${ccm.cache.xml}'))
+    builder.check()
+    builder.get_content()
+    builder.close()
+except Exception, e:
+    print "ERROR: error found during preparation phase:" 
+    for l in traceback.format_exc().splitlines(False):
+        print "ERROR: %s" % l         
+    print "ERROR: this is a critical error, build will fail now:"
+    for l in str(e).splitlines(False):
+        print "ERROR: %s" % l         
+    if builder != None:
+        builder.close()
+    sys.exit(-1)
+sys.exit(0)
+                </hlm:python>
+            </try>
+            <finally>
+                <hlm:tempRecordStopMacro name="${build.id}_ccm_get_input.log" filterref="filterset.prepWorkArea"/>
+                <hlm:assertFileExists file="${build.cache.log.dir}/${build.id}_ccm_get_input.log" />
+            </finally>
+        </trycatch>
+    </target>
+
+    <!--
+        This target uses an XML input file to retrieve content from Synergy.
+        <deprecated>Please use prep-work-area</deprecated>
+    -->
+    <target name="ccm-get-input" depends="prep-work-area" />
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/synergy/ccmtask.jep	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,201 @@
+""" Script to process Ant <ccm> task commands. """
+
+import ccm
+import ccm.extra
+import sys
+import logging
+import ant
+import string
+
+logging.basicConfig(level=logging.INFO)
+logging.getLogger("ccm").setLevel(logging.INFO)
+antlogger = ant.AntHandler(java_ccmtask)
+logger = logging.getLogger("ccm.ant")
+logger.addHandler(antlogger)
+
+session = None
+
+def execute_update(command):
+    java_ccmtask.log(str('Updating project: ' + command.getProject()))
+    project = session.create(command.getProject())
+    project.update()
+    
+def execute_synchronize(command):
+    if command.getProject() is not None:
+        java_ccmtask.log(str('Synchronizing project: ' + command.getProject()))
+        java_ccmtask.log(str("Recursive: %s" % command.getRecursive()))
+        project = session.create(command.getProject())
+        project.sync(command.getRecursive())    
+    else:
+        raise Exception("Error during synchronization. Project is not defined.")
+        
+
+def execute_reconcile(command):
+    java_ccmtask.log(str('Reconciling project: ' + command.getProject()))
+    project = session.create(command.getProject())
+    project.reconcile()
+
+def execute_snapshot(command):
+    java_ccmtask.log(str('Snapshot of project: ' + command.getProject() + ' to ' + command.getDir()))
+    project = session.create(command.getProject())
+    if command.getFast()== True:
+        ccm.extra.FastSnapshot(project, command.getDir())        
+    else:
+        project.snapshot(command.getDir(), command.getRecursive())
+
+def execute_changereleasetag(command):
+    java_ccmtask.log(str('Changing release tag for all tasks in the folder : ' + command.getFolder() + ' as ' + command.getReleaseTag()))
+    #Search all task from the folder    
+    folder = session.create("Folder " + str(command.getFolder()))
+    for task in folder.tasks:
+        if task.release != str(command.getReleaseTag()):
+            task.release = str(command.getReleaseTag())
+            
+def execute_checkout(command):
+    java_ccmtask.log(str('Checking out project: ' + command.getProject() + ' with release tag ' + command.getRelease()))
+    project = session.create(command.getProject())
+    if (command.getRelease()):
+        if command.getWa():
+            wa = command.getWa()
+        else:
+            wa = None
+        if command.getRecursive():
+            recursive = command.getRecursive()
+        else:
+            recursive = None
+        if command.getRelative():
+            relative = command.getRelative()
+        else:
+            relative = None
+        if command.getVersion():
+            version = command.getVersion()
+        else:
+            version = None
+        if command.getPurpose():
+            purpose = command.getPurpose()
+        else:
+            purpose = None
+        project.checkout(session.create(command.getRelease()), version, purpose, recursive)
+
+def execute_workarea(command):
+    java_ccmtask.log(str('Modifying work area for the project : ' + command.getProject()))
+    project = session.create(command.getProject())
+    if command.getMaintain():
+        maintain = command.getMaintain()
+    else:
+        maintain = None
+    if command.getRecursive():
+        recursive = command.getRecursive()
+    else:
+        recursive = None
+    if command.getRelative():
+        relative = command.getRelative()
+    else:
+        relative = None
+    if command.getPath():
+        path = command.getPath()
+    else:
+        path = None
+    if command.getPst():
+        pst = command.getPst()
+    else:
+        pst = None
+    if command.getWat():
+        wat = command.getWat()
+    else:
+        wat = None
+    project.work_area(maintain, recursive, relative, path, pst, wat)
+
+def execute_addtask(command):
+    if command.getFolder() != None:
+        tasks = []        
+        ccmfolder = session.create("Folder " + command.getFolder())
+        role = find_folder_information(command)
+        if role == "build_mgr":
+            java_ccmtask.log("Changing role to %s" % role)
+            session.role = "build_mgr"
+
+        folder = session.create("Folder %s" % str(command.getFolder()))
+        for task in folder.tasks:
+            folder.remove(task)
+        
+        java_ccmtask.log("Adding task to folder %s" % ccmfolder)
+        tasks.extend(map(lambda task: session.create("Task " + task.getName()), command.getTasks()))
+        for task in tasks:
+            ccmfolder.append(task)
+
+def find_folder_information(command):
+    cmdline = "folder -sh i " + command.getFolder()    
+    result = session.execute(cmdline)
+    result_array = str(result).split('\r')
+    for ldata in result_array :        
+        if ldata.find('Writable By:') > 0:
+            wb,wd = ldata.split(':',1)
+            if wd.lstrip() == "Build Manager":
+                return "build_mgr"
+            else:
+                return "developer"
+
+def execute_exists(command):
+    fpn = None
+    if command.getObject() != None:
+        fpn = command.getObject()
+    elif command.getFolder() != None:
+		fpn = "Folder " + command.getFolder()
+    elif command.getTask() != None:
+		fpn = "Task " + command.getTask()
+
+    if fpn == None:
+        raise Exception("You need to define either a 'task'/'folder'/'object' attribute.")
+    ccmo = session.create(fpn)
+    if ccmo.exists():
+        java_ccmtask.log("'%s' exists." % ccmo)
+    else:
+        raise Exception("Could not find '%s'." % ccmo)
+
+def execute_close(command):
+    global session
+    java_ccmtask.log(str("Closing session %s." % session))
+    session.close_on_exit = True
+    session.close()
+    session = None
+    
+def referenceToObject(obj):
+    if obj.isReference() == 1:
+        ref = project.getReference(str(obj.getRefid().getRefId()))
+        if ref == None:
+            raise Exception("Could not find reference '%s'" % str(obj.getRefid().getRefId()))
+        return ref
+    else:
+        return obj        
+        
+sessionIds = [] 
+for session_set in java_ccmtask.getSessionSets():
+    sessionIds.extend(map(lambda session: session.getAddr(), referenceToObject(session_set).getSessions()))
+
+print "Session list: ", sessionIds
+if len(sessionIds) > 0:
+    sessionid = sessionIds.pop()
+    session = ccm.Session(username=None, engine=None, dbpath=None, ccm_addr=sessionid, close_on_exit=False)
+else:
+   username = java_ccmtask.getUsername()
+   password = java_ccmtask.getPassword()
+   session = ccm.open_session(username=username, password=password)
+
+if java_ccmtask.getVerbose() == 1:
+    logging.getLogger("ccm").setLevel(logging.DEBUG)
+
+#print dir(sys.modules['__main__'] )
+ccm_commands = java_ccmtask.getCommands()
+for command in ccm_commands:
+    print "Running command '%s'" % command.getName()
+    method_name = 'execute_' + command.getName()
+    method = sys.modules['__main__'].__dict__[method_name]
+    try:
+        method(command)
+    except Exception, e:
+        import traceback
+        logger.error(traceback.print_exc(file=sys.stdout))
+        logger.error(e.result)
+        logger.error(e)
+        raise e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/test/test_ci.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_ci.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_ci" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env" />
+    <property name="publish.root.dir" value="${env.TEMP}" />
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml" />
+    <import file="../ci.ant.xml" />
+    <!-- Test for delete folders: Creates configuration and Folder structure then delete folders, config files and test existance of the folders -->
+    <target name="test-delete-folders-from-list">
+        <!-- Create configuration files which will contain the dir list to delete -->
+        <mkdir dir="${env.TEMP}\data\helium\del_config" />
+        <echo file="${env.TEMP}\data\helium\del_config\file1-1.txt">${env.TEMP}/data/helium/dir1${line.separator}</echo>
+        <echo file="${env.TEMP}\data\helium\del_config\file2-1.txt">${env.TEMP}/data/helium/dir2${line.separator}</echo>
+        <!-- Create dir structure based on config -->
+        <mkdir dir="${env.TEMP}\data\helium\dir1\dir1-1" />
+        <mkdir dir="${env.TEMP}\data\helium\dir1\dir1-2" />
+        <mkdir dir="${env.TEMP}\data\helium\dir2\dir2-1" />
+        <mkdir dir="${env.TEMP}\data\helium\dir2\dir2-2" />
+
+        <echo file="${env.TEMP}\data\helium\dir1\dir1-1\file1-1.txt">1-1</echo>
+        <echo file="${env.TEMP}\data\helium\dir1\dir1-2\file1-2.txt">1-2</echo>
+        <echo file="${env.TEMP}\data\helium\dir2\dir2-1\file2-1.txt">2-1</echo>
+        <echo file="${env.TEMP}\data\helium\dir2\dir2-2\file2-2.txt">2-2</echo>
+
+        <property name="ci.cleanup.env.dir" value="${env.TEMP}/data/helium/del_config" />
+        <runtarget target="delete-folders-from-list" />
+
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\dir1" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\dir2" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\dir1\dir1-1\file1-1.txt" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\dir1\dir1-2\file1-2.txt" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\dir2\dir2-1\file2-1.txt" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\dir2\dir2-2\file2-2.txt" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\del_config\file1-1.txt" />
+        <au:assertFileDoesntExist file="${env.TEMP}\data\helium\del_config\file2-1.txt" />
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/test/test_preparation.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_preparation.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_preparation" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env" />
+    <property name="publish.root.dir" value="${env.TEMP}" />
+    <property name="build.name" value="buildtest" />
+    <property name="major.version" value="0" />
+    <property name="minor.version" value="00" />
+    <property name="build.tag.ext" value="" />
+    <property name="build.tag.ext" value="" />
+
+    <property name="build.number" value="0" />
+    <property name="prep.root.dir" value="../../../build/test/preproot" />
+
+    <property name="helium.dir" location="../../.." />
+    <!--<import file="../../../helium.ant.xml"/>-->
+
+    <!-- in the normal run we should not have the same build.drive content in the second run -->
+    <property name="build.drive" value="Z:" />
+    <import file="../../../helium.ant.xml" />
+
+    <!-- Simple Synergy testing. -->
+    <target name="test-ccm">
+        <hlm:python>
+import ccm, gc
+import logging
+logging.basicConfig(level=logging.DEBUG)
+gc.set_debug(gc.DEBUG_STATS)
+session = ccm.open_session(database="fa1f5132")
+session = ccm.open_session(database="fa1f5132")
+session = ccm.open_session(database="fa1f5132")
+        </hlm:python>
+    </target>
+
+
+    <target name="-test-prep-drive">
+        <runtarget target="prep-drive" />
+        <echo file="${build.drive}/prepdrive-test.txt">foo</echo>
+        <au:assertFileExists file="${build.drive}/prepdrive-test.txt" />
+        <!-- sleep to be sure to get a new timestamp in the next run -->
+        <sleep seconds="1" />
+        <runtarget target="prep-drive" />
+        <au:assertFileDoesntExist file="${build.drive}/prepdrive-test.txt" />
+    </target>
+
+
+    <!-- checking the updated path -->
+    <target name="-test-update-file-path">
+        <runtarget target="prep-drive" />
+        <echo file="${build.drive}/newpath-test.txt">foo</echo>
+        <sleep seconds="1" />
+        <au:assertFileExists file="${helium.dir}/build/test/preproot/buildtest_0.00.0/newpath-test.txt" />
+        <delete file="${build.drive}/newpath-test.txt" />
+    </target>
+
+    <!-- we should keep the content of the build.drive -->
+    <target name="-test-prep-drive2">
+        <property name="prep.build.dir.keep" value="1" />
+        <runtarget target="prep-drive" />
+        <echo file="${build.drive}/prepdrive-test.txt">foo</echo>
+        <au:assertFileExists file="${build.drive}/prepdrive-test.txt" />
+        <runtarget target="prep-drive" />
+        <au:assertFileExists file="${build.drive}/prepdrive-test.txt" />
+        <delete file="${build.drive}/prepdrive-test.txt" />
+    </target>
+
+    <target name="test-prep-drive-invalid">
+        <if>
+            <os family='windows'/>
+            <then>
+                <exec osfamily="windows" executable="python" failonerror="true" outputproperty="testbuild.drive">
+                    <arg value="${helium.dir}/tools/common/python/scripts/searchnextdrive.py"/>               
+                </exec>
+                <au:expectfailure>
+                    <antcall target="prep-drive">
+                        <param name="prep.build.dir" value="${testbuild.drive}:\Build_${testbuild.drive}\viramana\ido_ba\ido_lodo_50_ivalo\20090723181916_pf_5250_200930"/>
+                        <param name="build.drive.notdefined" value="true"/>
+                    </antcall>
+                </au:expectfailure>
+            </then>
+        </if>
+    </target>
+    <target name="test-prep-drive-valid">
+        <if>
+            <os family='windows'/>
+            <then>
+                <tempfile property="prep.temp.build.dir" destDir="${env.TEMP}"/>
+                <mkdir dir="${prep.temp.build.dir}"/>
+                <antcall target="prep-drive">
+                    <param name="prep.build.dir" value="${prep.temp.build.dir}"/>
+                    <param name="build.drive.notdefined" value="true"/>
+                </antcall>
+                <au:assertFileExists file="${build.drive}"/>
+                <hlm:unsubst drive="${build.drive}"/>
+                <delete dir="${prep.temp.build.dir}"/>
+            </then>
+        </if>
+    </target>
+
+    <!--<import file="../../../helium.ant.xml"/>
+    
+     TODO: should these run on build.xml -->
+    <!--<target name="test-build-int-not-set">    
+        <runtarget target="get-build-number"/>
+        <assertFileExists file="${env.TEMP}/buildtest/builds/buildtest_0.00__build_int_db.txt"/>
+        <echo>${build.number}</echo>
+        <delete file="${env.TEMP}/buildtest/builds/buildtest_0.00__build_int_db.txt"/>
+    </target>
+    
+    <target name="test-build-int-exists">
+        <propertyfile file="${env.TEMP}/buildtest/builds/buildtest_0.00__build_int_db.txt" comment="build.int db">
+            <entry key="build.int" type="int" default="001" operation="+" pattern="000"/>
+        </propertyfile>    
+        <runtarget target="get-build-number"/>
+        <assertFileExists file="${env.TEMP}/buildtest/builds/buildtest_0.00__build_int_db.txt"/>
+        <echo>${build.number}</echo>
+        <delete file="${env.TEMP}/buildtest/builds/buildtest_0.00__build_int_db.txt"/>
+        <assertPropertyEquals name="build.number" value="002"/>
+    </target>-->
+
+
+    <!-- Change synergy release tag  -->
+    <target name="-test-ccm-release-tag-change">
+        <property name="teamlevel.ci.system" value="true" />
+        <property name="teamlevel.folder.number" value="to1tobet#90" />
+        <property name="ccm.database" value="to1tobet" />
+
+        <!-- Change releage tag as 'mc/TOWEC010' -->
+        <var name="programlevel.release.tag" value="mc/TOWEC010" />
+        <antcall target="change-release-tag" />
+
+        <!-- Change releage tag as 'mc/TOTEC010' -->
+        <var name="programlevel.release.tag" value="mc/TOTEC010" />
+        <antcall target="change-release-tag" />
+
+        <script language="jython" setbeans="false">
+import ccm
+
+curDb = project.getProperty('ccm.database')
+releaseTag = project.getProperty('programlevel.release.tag')
+task = "to1tobet#3656"
+session = ccm.open_session(database=curDb)
+cmdline = "task "+ task + " -sh release"
+result = session.execute(cmdline)
+searchStartStr = r"Task " + task + ": " + releaseTag
+strExists = str(result).find(searchStartStr)
+project.setProperty("r.tag", str(strExists))
+        </script>
+
+        <au:assertTrue>
+            <equals arg1="${r.tag}" arg2="0" />
+        </au:assertTrue>
+    </target>
+
+    <!-- Test for check the to get substituted drives -->
+    <target name="test-backup-subst-drives">
+        <antcall target="backup-subst-drives" />
+        <if>
+            <os family="windows"/>
+            <then>
+                <au:assertFileExists file="${cache.dir}\hlmsubsteddrives.bat" />
+            </then>
+        </if>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/test/test_synergy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_ci.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_synergy" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env" />
+    <property name="publish.root.dir" value="${env.TEMP}" />
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml" />
+
+    <target name="test-ccm-preparation-log-extraction">
+        <delete file="${env.TEMP}/temp.log" failonerror="false"/>
+        <delete file="${env.TEMP}/temp.sqlite" failonerror="false"/>
+        <echo file="${env.TEMP}/temp.log">
+   [python] INFO:ccm.extra:Using CachedSessionProvider.
+   [python] INFO:preparation.ccmgetinput:Get a session for databasexxx
+   [python] INFO:ccm:Database path set using the GSCM database.
+   [python] INFO:ccm:Database engine set using the GSCM database.
+   [python] INFO:ccm:Getting router address.
+   [python] INFO:ccm:Opening session.
+   [python] INFO:preparation.ccmgetinput:Checking 'MinibuildDomain-50_200832:project:tr1test1#1'...Ok
+   [python] INFO:preparation.ccmgetinput:Checking 'MinibuildDomain/next'...Ok
+   [python] INFO:preparation.ccmgetinput:Checking purpose 'Insulated Development'...Ok
+   [python] INFO:preparation.ccmgetinput:Try to switch user to role: developer
+   [python] INFO:preparation.ccmgetinput:=== Stage=checkout = MinibuildDomain-50_200832:project:tr1test1#1
+   [python] INFO:preparation.ccmgetinput:++ Started at 13:25:41
+   [python] INFO:preparation.ccmgetinput:Project found: 'MinibuildDomain-user:project:tr1test1#1'
+   [python] INFO:preparation.ccmgetinput:Switching user to role: developer
+   [python] INFO:preparation.ccmgetinput:Validating release
+   [python] INFO:preparation.ccmgetinput:Current release: 'MinibuildDomain:next:releasedef:1'
+   [python] INFO:preparation.ccmgetinput:Configuration release: 'MinibuildDomain:next:releasedef:1'
+   [python] INFO:preparation.ccmgetinput:Updating...
+   [python] INFO:preparation.ccmgetinput:Looking for new projects in the check out.
+   [python] INFO:preparation.ccmgetinput:       Task he1cfnet#19381: vpnclient: maittola: TSW Error: TLIN-7MFBL5, vpncleaner, mcl
+   [python] INFO:preparation.ccmgetinput:Synchronizing ...
+   [python] INFO:preparation.ccmgetinput:       Updating 'E:\Build_E\user\ido_wa\minibuild_ido\MinibuildDomain'.
+   [python] INFO:preparation.ccmgetinput:       Updating 'E:\Build_E\user\ido_wa\minibuild_ido\MinibuildDomain\MinibuildDomain'.
+   [python] INFO:preparation.ccmgetinput:       Work area update: 25% complete...
+   [python] INFO:preparation.ccmgetinput:       Work area update: 50% complete...
+   [python] INFO:preparation.ccmgetinput:       Updating 'E:\Build_E\user\ido_wa\minibuild_ido\MinibuildDomain\MinibuildDomain'.
+   [python] INFO:preparation.ccmgetinput:       Work area update: 75% complete...
+   [python] INFO:preparation.ccmgetinput:       Work area update: 100% complete...
+   [python] INFO:preparation.ccmgetinput:Synchronization summary:
+   [python] INFO:preparation.ccmgetinput:       0 Update(s) for project MinibuildDomain-user
+   [python] INFO:preparation.ccmgetinput:       0 Update(s) for project helloworldapi-user
+   [python] INFO:preparation.ccmgetinput:       0 Update(s) for project helloworldcons-user
+   [python] INFO:preparation.ccmgetinput:       0 Conflict(s) for project MinibuildDomain-user
+   [python] INFO:preparation.ccmgetinput:       0 Conflict(s) for project helloworldapi-user
+   [python] INFO:preparation.ccmgetinput:       0 Conflict(s) for project helloworldcons-user
+   [python] INFO:preparation.ccmgetinput:Synchronization complete.
+   [python] INFO:preparation.ccmgetinput:Project: MinibuildDomain-user
+   [python] INFO:preparation.ccmgetinput:
+   [python] INFO:preparation.ccmgetinput:         No conflicts detected.
+   [python] INFO:preparation.ccmgetinput:
+   [python] INFO:preparation.ccmgetinput:Project: helloworldapi-user
+   [python] INFO:preparation.ccmgetinput:
+   [python] INFO:preparation.ccmgetinput:         No conflicts detected.
+   [python] INFO:preparation.ccmgetinput:
+   [python] INFO:preparation.ccmgetinput:Project: helloworldcons-user
+   [python] INFO:preparation.ccmgetinput:
+   [python] WARNING:preparation.ccmgetinput:databasexxx#5298       Implicitly included
+   [python] WARNING:preparation.ccmgetinput:databasexxx#5304       Implicit task from explicit object
+   [python] INFO:preparation.ccmgetinput:Switching user to role: developer
+   [python] INFO:preparation.ccmgetinput:++ Finished at 13:25:53
+   [python] INFO:ccm.extra:Closing the CachedSessionProvider.
+   [python] INFO:ccm.extra:Cleaning up opened sessions.
+        </echo>
+        <hlm:metadatarecord database="${env.TEMP}/temp.sqlite">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${env.TEMP}/temp.log" />
+                <metadatafilterset refid="filterset.test.ccm" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus dbfile="${env.TEMP}/temp.sqlite" output-dir="${env.TEMP}/signals" file="temp.log" />
+        <au:assertTrue>
+            <and>
+                <not>
+                    <hlm:hasSeverity severity="error" file="${env.TEMP}/signals/temp.log.status.xml"/>
+                </not>
+                <hlm:hasSeverity severity="warning" file="${env.TEMP}/signals/temp.log.status.xml"/>
+            </and>
+        </au:assertTrue>
+    </target>
+   
+    <target name="test-ccm-check">
+        <trycatch property="ccm-check.thrown">
+            <try>
+                <antcall target="ccm-check"/>
+                <if>
+                    <equals arg1="${ccm.session.created}" arg2="-1"/>
+                    <then>
+                        <au:assertTrue/>
+                    </then>
+                    <else>
+                        <au:assertTrue/>
+                    </else>
+                </if>
+                <au:assertLogContains text="CachedSessionProvider"/>
+            </try>
+        </trycatch>
+    </target> 
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/evalid_multiple.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,48 @@
+#============================================================================ 
+#Name        : evalid_multiple.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+#BEGIN {
+#	push (@INC, "\\epoc32\\tools");
+#}
+
+use strict;
+use EvalidCompare;
+use Getopt::Long;
+
+my $inputfile;
+GetOptions( "f=s"=>\$inputfile) or die "/!\\ Error parsing command line.";
+
+my $time1 = time();
+open(IN,"<$inputfile") or die "/!\\ Can't open $inputfile";
+foreach my $file (<IN>)
+{
+	chomp($file);
+	if (-f $file)
+	{
+		my ($MD5, $type) = &EvalidCompare::GenerateSignature($file);
+		print $file." TYPE=".$type." MD5=".$MD5."\n";
+	}
+	else
+	{
+		print $file." not found\n";
+	}
+}
+close IN;
+
+my $time2 = time();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/evalidmd5.patch	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,11 @@
+--- oldevalidmd5.pm	Mon Mar 12 13:49:20 2007
++++ evalidmd5.pm	Fri Aug 10 10:29:34 2007
+@@ -223,7 +223,7 @@
+     open LIST, "$iListFile" or croak "Cannot open $iListFile\n";
+     while(<LIST>)
+     {
+-      my $iFileName = $iDir."/".$_;
++      chomp(my $iFileName = $iDir."/".$_);
+       if(-e $iFileName)
+       {
+         # The listed file exists add to the @iFileList
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/get_loc_files.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,54 @@
+#! usr/bin/perl 
+
+#============================================================================ 
+#Name        : get_loc_files.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+use strict;
+use File::Copy;
+use File::Find;
+use File::Path;
+use Cwd;
+
+my $basedir = $ARGV[0];
+my $locfiles = "locfiles";
+
+find(\&copy_file, $basedir);
+
+sub copy_file {
+		my $filesrc = $File::Find::name;
+		my $filedest = "output\\" . $_;
+		my @subdir = split(/\//, $File::Find::dir);
+	
+		#copy the discovered .loc file to destination
+		if ($_ =~ m/.*\.loc$/) {
+			my $src = $filesrc;
+			my $trg = $basedir . "/output/temp_build_files/locfiles/" . $subdir[-1] . "/" . $_;
+			my $trgdir = $basedir . "/output/temp_build_files/locfiles/" . $subdir[-1];
+
+			mkpath $trgdir;
+			
+			print "copying " . $src . " to " . $trg . "\n";
+			if (-e $trg) {
+				print "File already exists. Not copied!\n";
+			}
+			else
+			{
+				copy($src, $trg) or die "File cannot be copied.";
+			}
+		}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/internal-api/internal-api.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : internal-api.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="internal-api" xmlns:hlm="http://www.nokia.com/helium">
+    <description>List and zip up the included files for an IDO build.</description>
+
+    <property name="internal.api.output.prebuild" location="${build.output.dir}/${build.id}_prebuild.dat"/>
+    <property name="internal.api.output.postbuild" location="${build.output.dir}/${build.id}_postbuild.dat"/>
+    
+    <!-- Default configuration for internal API content scanning -->
+    <path id="internal.api.scanner">
+        <fileset dir="${build.drive}/" casesensitive="false">
+            <!-- ADO content -->
+            <include name="S60/mw/*/inc/**"/>
+            <include name="S60/app/*/inc/**"/>
+            <include name="S60/osext/*/inc/**"/>
+            <include name="S60/tools/*/inc/**"/>
+            
+            <!-- Subsystem level -->
+            <include name="S60/mw/*/*/inc/**"/>
+            <include name="S60/app/*/*/inc/**"/>
+            <include name="S60/osext/*/*/inc/**"/>
+            <include name="S60/tools/*/*/inc/**"/>
+        </fileset>
+    </path>
+
+    <!--
+        Dump internal.api.scanner content before a build starts.
+    -->
+    <target name="publish-prebuild-internal-api">
+        <hlm:path2file file="${internal.api.output.prebuild}">
+            <path refid="internal.api.scanner"/>
+        </hlm:path2file>        
+    </target>
+    
+    <!--
+        Dump internal.api.scanner content after a build has finished.
+    -->
+    <target name="publish-postbuild-internal-api">
+        <hlm:path2file file="${internal.api.output.postbuild}">
+            <path refid="internal.api.scanner"/>
+        </hlm:path2file>        
+    </target>
+
+    <!--
+        Run create_zips.pl to create internal api zip-files, which include those ADO/subsystem 
+        inc-dirs to which 1 or more headers were exported during the build time and prefix all 
+        the generated zip filenames with a build.id for consistency.
+    -->
+    <target name="publish-create-internal-api-zip">
+        <property name="internal.api.output.delta" location="${build.output.dir}/${build.id}_delta.dat"/>
+        <mkdir dir="${zips.build.dir}"/>
+        <hlm:path2file file="${internal.api.output.prebuild}" reference="internal.api.path.prebuild"/>
+        <hlm:path2file file="${internal.api.output.postbuild}" reference="internal.api.path.postbuild"/>
+        <hlm:path2file file="${internal.api.output.delta}">
+            <path>
+                <difference>
+                    <path refid="internal.api.path.postbuild"/>
+                    <path refid="internal.api.path.prebuild"/>
+                </difference>
+            </path>
+        </hlm:path2file>        
+        <copy file="${internal.api.output.delta}" tofile="${internal.api.output.delta}.parsed">
+            <filterchain>
+                <tokenfilter>
+                    <replaceregex pattern="^${build.drive}(/|\\)" replace="" flags="i"/>
+                </tokenfilter>
+            </filterchain>
+        </copy>
+        
+        <if>
+            <not>
+                <length file="${internal.api.output.delta}" length="0" />
+            </not>
+            <then>
+                <zip destfile="${zips.build.dir}/${build.id}_internal_headers.zip" basedir="${build.drive}/" includesfile="${internal.api.output.delta}.parsed"/>
+            </then>
+        </if>
+    </target>
+
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/nwiki.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : nwiki.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="publish.nwiki" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Publishing to the nwiki
+    </description>
+
+    <!-- Macro to create a nwiki page
+         Notes:
+             - whatever page name is passed will be translated to upper case
+    -->
+    <macrodef name="nwikiCreatePageMacro" uri="http://www.nokia.com/helium">
+        <attribute name="username" />
+        <attribute name="password" />
+        <attribute name="domain" />
+        <attribute name="location" />
+        <attribute name="nwiki-formatted-data" />
+        <attribute name="page-name" />
+        <sequential>
+            <hlm:python>
+import urllib
+import urllib2
+
+passman=urllib2.HTTPPasswordMgrWithDefaultRealm()
+
+passman.add_password(None, '@{domain}', '@{username}', '@{password}')
+
+auth_handler = urllib2.HTTPBasicAuthHandler(passman)
+
+opener = urllib2.build_opener(auth_handler)
+
+urllib2.install_opener(opener)
+
+values = {'text':r"""@{nwiki-formatted-data}""",
+          'formtemplate':'',
+          'topicparent':'',
+          'cmd':'',
+          'sig':'--+Main.@{username}',
+          'unlock':'on',
+          'action':'Save'}
+
+post_data = urllib.urlencode(values)
+
+uppercase_page_name = "@{page-name}".upper()
+
+req = urllib2.Request(url='http://@{domain}/save/@{location}/'+uppercase_page_name,
+                      data=post_data)
+                      
+                      
+print "Wiki Page Created at: http://@{domain}/@{location}/"+uppercase_page_name
+                      
+f = urllib2.urlopen(req)
+       </hlm:python>
+        </sequential>
+    </macrodef>
+
+    <!-- This target removes dots from the wiki page name because nwiki cannot handle dots in the name -->
+    <target name="remove-build-version-dots">
+        <propertyregex property="wiki.build.version" input="${build.version}" regexp="([.]*)\.([.]*)" replace="\1\2" casesensitive="false" global="true" />
+        <echo message="build.version = ${build.version}" />
+        <echo message="wiki.build.version = ${wiki.build.version}" />
+    </target>
+
+    <!-- Reads the BOM.txt and uploads it to the nwiki 
+         Notes:
+              - it can't handle dots in build.name
+              - it wraps the BOM.txt in "pre" tags for
+                the wiki to interpret the text verbatim
+              - nwiki.domain is typically nwiki.nokia.com
+              - location could be, MBPVancouver for example
+    -->
+    <target name="create-wiki-bom" depends="remove-build-version-dots,get-nwiki-username,get-nwiki-password" if="publish">
+        <loadfile property="temp-bom-data" srcfile="${build.log.dir}/${build.name}_${build.version}_BOM.txt" failonerror="false">
+        </loadfile>
+        <if>
+            <isset property="temp-bom-data" />
+            <then>
+                <hlm:nwikiCreatePageMacro username="${nwiki.username}" password="${nwiki.password}" domain="${nwiki.domain}" location="${nwiki.location}" nwiki-formatted-data="&lt;pre&gt;${temp-bom-data}&lt;/pre&gt;" page-name="${build.name}_${wiki.build.version}_BOM" />
+            </then>
+        </if>
+    </target>
+
+    <!-- Reads the BOM_delta.txt and uploads it to the nwiki 
+         Known quirks:
+              - it can't handle dots in build.name
+              - it wraps the BOM_delta.txt in "pre" tags for
+                the wiki to interpret the text verbatim
+              - nwiki.domain is typically nwiki.nokia.com
+              - location could be, MBPVancouver for example
+    -->
+    <target name="create-wiki-bom-delta" depends="remove-build-version-dots,get-nwiki-username,get-nwiki-password" if="publish">
+        <loadfile property="temp-bom-delta-data" srcfile="${build.log.dir}/${build.name}_${build.version}_BOM_delta.txt" failonerror="false">
+        </loadfile>
+
+        <if>
+            <isset property="temp-bom-delta-data" />
+            <then>
+                <hlm:nwikiCreatePageMacro username="${nwiki.username}" password="${nwiki.password}" domain="${nwiki.domain}" location="${nwiki.location}" nwiki-formatted-data="&lt;pre&gt;${temp-bom-delta-data}&lt;/pre&gt;" page-name="${build.name}_${wiki.build.version}_BOM_delta" />
+            </then>
+        </if>
+    </target>
+
+    <!-- Retrieve the NWiki password from the .netrc file and store it into nwiki.password property. -->
+    <target name="get-nwiki-password">
+        <hlm:netrcPasswordMacro output-prop="nwiki.password" result-prop="nwiki.password.available" type="nwiki" />
+    </target>
+
+    <!-- Retrieve the NWiki username from the .netrc file and store it into nwiki.username property. -->
+    <target name="get-nwiki-username">
+        <hlm:netrcUsernameMacro output-prop="nwiki.username" result-prop="nwiki.username.available" type="nwiki" />
+    </target>
+
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/publish.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,808 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : publish.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="publish" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Zipping, delta zipping and copying targets
+    </description>
+
+    <import file="subcon.ant.xml" />
+    <import file="internal-api/internal-api.ant.xml" />
+    <import file="nwiki.ant.xml" />
+    <import file="synergy.ant.xml" />
+    <import file="test/test2_publishing_to_diamonds.ant.xml" />
+
+    <property name="archive.max.number.of.threads" value="8" />
+    
+    <fileset id="publish.files" dir="${build.output.dir}">
+        <include name="logs/**/*" />
+        <exclude name="logs/**/*_ant_build.log" />
+        <include name="development_flash_images/**/*" />
+        <include name="release_flash_images/**/*" />
+        <include name="sisfiles/**/*" />
+        <include name="build_area/**/*" />
+        <include name="relnotes/**/*" />
+        <include name="test_results/**/*" />
+        <include name="utilities/**/*" />
+        <include name="images/**/*" />
+        <include name="variant_images/**/*" />
+        <include name="BaseForNightlyBuild.txt" />
+    </fileset>
+
+    <!-- above fileset divided into following 4 filesets-->
+    <fileset id="publish.files1" dir="${build.output.dir}">
+        <include name="logs/**/*" />
+        <exclude name="logs/**/*_ant_build.log" />
+    </fileset>
+    <fileset id="publish.files2" dir="${build.output.dir}">
+        <include name="development_flash_images/**/*" />
+    </fileset>
+    <fileset id="publish.files3" dir="${build.output.dir}">
+        <include name="sisfiles/**/*" />
+        <include name="build_area/**/*" />
+        <include name="relnotes/**/*" />
+        <include name="test_results/**/*" />
+        <include name="utilities/**/*" />
+        <include name="variant_images/**/*" />
+        <include name="images/**/*" />
+        <include name="BaseForNightlyBuild.txt" />
+    </fileset>
+    <fileset id="publish.files4" dir="${build.output.dir}">
+        <include name="release_flash_images/**/*" />
+    </fileset>
+
+    <!-- list of filesets -->
+    <property name="publish.fileset.ids" value="publish.files1,publish.files2,publish.files3,publish.files4" />
+
+    <fileset id="helium.files" dir="${helium.dir}">
+        <include name="*.bat" />
+        <include name="**/*.ant.xml" />
+        <include name="tools/common/**/*" />
+        <include name="tools/release/**/*" />
+    </fileset>
+
+    <!-- 
+        If publish property is set, copy the publish.files fileset to the publish.dir directory using 
+        number.of.threads parallel threads
+    -->
+    <macrodef name="publishMacro" uri="http://www.nokia.com/helium">
+        <sequential>
+            <if>
+                <isset property="publish" />
+                <then>
+                    <for list="${publish.fileset.ids}" param="fileset.id" parallel="true" threadCount='${number.of.threads}'>
+                        <sequential>
+                            <copy todir="${publish.dir}" preservelastmodified="true" failonerror="false">
+                                <fileset refid="@{fileset.id}" />
+                            </copy>
+                        </sequential>
+                    </for>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+
+    <!-- Creates the publish directory. Directory location is defined by property: ${publish.dir} -->
+    <target name="prep-publish" if="publish">
+        <mkdir dir="${publish.dir}" />
+    </target>
+
+
+    <!-- Parses the zip configuration file. Expands all the ant properties. -->
+    <target name="preprocess-zip-config">
+        <property name="zip.config.file.parsed" location="${temp.build.dir}/zip.cfg.xml.parsed" />
+        <copy file="${zip.config.file}" tofile="${zip.config.file.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties />
+            </filterchain>
+        </copy>
+    </target>
+
+
+    <!-- This macro merges all the generated metadata files together.
+   
+    It uses the archiving configuration to find the output archive directory.
+    The it merges all the <config.name>.metadata.xml files together.
+    e.g:
+    <pre>
+    <hlm:mergeMetadataMacro file="${zip.config.file.parsed}" config="${zips.@{type}.spec.name}"/>
+    </pre>
+    -->
+    <scriptdef name="mergeMetadataMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="file" />
+        <attribute name="config" />
+        <![CDATA[
+import configuration
+import symrec
+import os
+import traceback
+# Nicer name
+self.setTaskName("merge-metadata")
+
+def merge_filelist(merger, filelist):
+    for filename in filelist:
+        try:
+            self.log(str("Merging %s" % filename))
+            merger.merge(filename)
+            os.unlink(filename)
+        except Exception, exc:
+            self.log("Warning: %s" % exc)
+
+try:
+    builder = configuration.NestedConfigurationBuilder(open(str(attributes.get('file')), 'r'))
+    configSet = builder.getConfiguration()
+    configs = configSet.getConfigurations(str(attributes.get('config')))
+    
+    if len(configs) > 0:
+        filelist = []
+        for config in configs:
+            if config.get_boolean("grace.metadata", False):
+                metadata = os.path.join(config['archives.dir'], config['name']+ ".metadata.xml")
+                if os.path.exists(metadata):
+                    self.log(str("Found %s" % metadata))
+                    filelist.append(metadata)
+        
+        merger = None
+        metadata_main = os.path.join(configs[0]['archives.dir'], "release_metadata.xml")
+        if os.path.exists(metadata_main):
+            merger = symrec.MetadataMerger(metadata_main)
+            merge_filelist(merger, filelist)
+            self.log(str("Writing %s" % metadata_main))
+            merger.save()
+        elif len(filelist) > 0:
+            input = filelist.pop(0)
+            merger = symrec.MetadataMerger(input)
+            merge_filelist(merger, filelist)
+            self.log(str("Writing %s" % metadata_main))
+            merger.save(metadata_main)
+            os.unlink(input)
+except Exception, e:
+    self.log('ERROR: %s' % e)
+    traceback.print_exc()
+    # Let's propagate at the moment
+    raise e
+]]> 
+    </scriptdef>
+
+    <!-- This macro allows you to add or update one archive definition inside the release metadata files.
+    e.g.:
+    <pre>
+        <hlm:updateMetadataMacro file="<path>/release_metadata.xml" archive="<path>/archive.zip" />
+    </pre>
+     -->
+    <scriptdef name="updateMetadataMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="file" />
+        <attribute name="archive" />
+        <attribute name="filters" />
+        <![CDATA[
+import symrec
+import os
+import traceback
+import fileutils
+self.setTaskName("updateMetadataMacro")
+if attributes.get('file') is None:
+    raise Exception('file attribute is not defined.')
+if attributes.get('archive') is None:
+    raise Exception('archive attribute is not defined.')
+filters = None
+if attributes.get('filters') is not None:
+    filters = str(attributes.get('filters')).split(r',')
+
+try:
+    filename = str(attributes.get('file'))
+    archive = str(attributes.get('archive'))
+    if not os.path.exists(filename):
+        raise Exception("Could not find file: %s" % filename)
+    if not os.path.exists(archive):
+        raise Exception("Could not find file: %s" % archive)
+
+    self.log(str("Opening %s" % filename))
+    md = symrec.ReleaseMetadata(filename)
+    if os.path.basename(archive) not in md.keys():
+        self.log(str("Adding %s to metadata" % os.path.basename(archive)))
+        md.add_package(os.path.basename(archive), md5checksum=fileutils.getmd5(archive), size=os.path.getsize(archive), filters=filters)
+    else:
+        self.log(str("Updating %s to metadata" % os.path.basename(archive)))
+        result = md[os.path.basename(archive)]
+        result['md5checksum'] = unicode(fileutils.getmd5(archive))
+        result['size'] = unicode(os.path.getsize(archive))
+        if filters is not None:
+            result['filters'] = filters
+        md[os.path.basename(archive)] = result
+    md.save()
+except Exception, e:
+    self.log('ERROR: %s' % e)
+    traceback.print_exc()
+    # Let's propagate at the moment
+    raise e
+]]> 
+    </scriptdef>
+    
+    <!-- This macro update the metadata file generated by the config provided by file.
+    e.g:
+    <pre>
+    <hlm:updateMD5Macro file="${zip.config.file.parsed}" config="${zips.@{type}.spec.name}"/>
+    </pre>
+    -->
+    <scriptdef name="updateMD5Macro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="file" />
+        <attribute name="config" />
+        <![CDATA[
+import configuration
+import archive
+import os
+import symrec
+import traceback       
+
+self.setTaskName("update-md5")
+          
+# Reading the config from Ant
+try:
+    config_filename = str(attributes.get('file'))
+    spec_name = str(attributes.get('config'))
+    # Loading the config file.                        
+    builder = configuration.NestedConfigurationBuilder(open(config_filename, 'r'))
+    configSet = builder.getConfiguration()
+    configs = configSet.getConfigurations(spec_name)
+
+    if len(configs) > 0:
+        if os.path.exists(os.path.join(configs[0]['archives.dir'], "release_metadata.xml")):
+            md5update = symrec.MD5Updater(os.path.join(configs[0]['archives.dir'], "release_metadata.xml"))
+            md5update.update()
+            md5update.save()
+        else:
+            self.log(str('WARNING: Could not find %s.' % os.path.join(configs[0]['archives.dir'], "release_metadata.xml")))
+    else:
+        self.log('WARNING: No config.')
+except Exception, e:
+    self.log('ERROR: %s' % e)
+    traceback.print_exc()
+    # Let's propagate at the moment
+    raise e
+]]> 
+    </scriptdef>
+
+    <condition property="archive.using.ec">
+        <or>
+            <equals arg1="${build.system}" arg2="ec-helium" />
+            <equals arg1="${build.system}" arg2="sbs-ec" />
+        </or>
+    </condition>
+    
+    <!-- Zips files using a type and zip config file as args -->
+    <macrodef name="zipContentMacro" uri="http://www.nokia.com/helium">
+        <attribute name="type" />
+        <attribute name="file" />
+        <attribute name="ec" default="${archive.using.ec}"/>
+        <sequential>
+            <if>
+                <not>
+                    <isset property="zip.@{type}.log.file" />
+                </not>
+                <then>
+                    <property name="zip.@{type}.log.file" location="${build.log.dir}/${build.id}_@{type}_zip.log" />
+                </then>
+            </if>
+            <trycatch property="exception" reference="exception">
+                <try>
+                    <!-- Don't print 'compressing' on console -->
+                    <hlm:logtoconsole action="stop" />
+                    <!-- Stops writing on ...ant_build.log file-->
+                    <hlm:startSpecificLogMacro name="${zip.@{type}.log.file}" />
+            
+                    <property name="zip.config.file.parsed" location="${temp.build.dir}/zip.cfg.xml.parsed" />
+                    <copy file="@{file}" tofile="${zip.config.file.parsed}" overwrite="true">
+                        <filterchain>
+                            <expandproperties />
+                        </filterchain>
+                    </copy>
+                    <hlm:updateArchiveConfig configtype="${zips.@{type}.spec.name}" configfileparsed="${zip.config.file.parsed}" usingec="@{ec}" />
+                    <if>
+                        <istrue value="@{ec}" />
+                        <then>
+                            <echo>emake.root.to.append=${emake.root.to.append}</echo>
+                            <hlm:emakeMacro name="archive-full-@{type}" makefile="${build.drive}/ZIP_${zips.@{type}.spec.name}.make" target="all" dir="${build.drive}" annodetail="basic,history,file,waiting" root="${emake.root.to.append}" failonerror="false" />
+                        </then>
+                        <else>
+                            <if>
+                                <isgreaterthan arg1="${number.of.threads}" arg2="${archive.max.number.of.threads}"/>
+                                <then>
+                                    <ant antfile="${build.drive}/ZIP_${zips.@{type}.spec.name}.xml">
+                                        <property name="number.of.threads" value="${archive.max.number.of.threads}"/>
+                                    </ant>
+                                </then>
+                                <else>
+                                    <ant antfile="${build.drive}/ZIP_${zips.@{type}.spec.name}.xml" />
+                                </else>
+                            </if>
+                        </else>
+                    </if>
+                    <hlm:python>
+import archive
+import configuration
+
+builder = configuration.NestedConfigurationBuilder(open(r'${zip.config.file.parsed}', 'r'))
+configSet = builder.getConfiguration()
+configs = configSet.getConfigurations(r'${zips.@{type}.spec.name}')
+prebuilder = archive.ArchivePreBuilder(configuration.ConfigurationSet(configs), r'${zips.@{type}.spec.name}')
+prebuilder.cleanupSubstDrives()
+                    </hlm:python>
+                    <hlm:mergeMetadataMacro file="${zip.config.file.parsed}" config="${zips.@{type}.spec.name}" />
+                    <hlm:updateMD5Macro file="${zip.config.file.parsed}" config="${zips.@{type}.spec.name}" />
+                </try>
+                <catch>
+                    <!-- Printing and propagating the error -->
+                    <echo>ERROR: ${exception}</echo>
+                    <throw refid="exception"/>
+                </catch>
+                <finally>
+                    <!-- Todo: metadata: Convert to metadata structure -->
+                    <!-- Stops log back to main log. -->
+                    <hlm:stopSpecificLogMacro name="${zip.@{type}.log.file}" />
+                    <hlm:logtoconsole action="resume" />
+                </finally>
+            </trycatch>
+            <hlm:assertFileExists file="${zip.@{type}.log.file}" />
+            <copy file="${zip.@{type}.log.file}" tofile="${build.log.dir}/${build.id}_@{type}_archive.nopolicy.log" verbose="true">
+                <filterchain>
+                    <linecontainsregexp negate="true">
+                        <regexp pattern="POLICY_(ERROR|WARNING|INFO)" />
+                    </linecontainsregexp>
+                </filterchain>
+            </copy>
+            <hlm:metadatarecord database="${metadata.dbfile}">
+                <hlm:textmetadatainput>
+                    <fileset casesensitive="false" file="${build.log.dir}/${build.id}_@{type}_archive.nopolicy.log" />
+                    <metadatafilterset refid="filterset.archive.nopolicy" />
+                </hlm:textmetadatainput>
+            </hlm:metadatarecord>
+            <hlm:signalMacro logfile="${build.log.dir}/${build.id}_@{type}_archive.nopolicy.log" 
+                signal.input="archiveErrorSignalInput" />
+
+            <!-- Extracting policy errors from archiving. -->
+            <copy file="${zip.@{type}.log.file}" tofile="${build.log.dir}/${build.id}_@{type}_archive.policy.log" verbose="true">
+                <filterchain>
+                    <linecontainsregexp>
+                        <regexp pattern="POLICY_(ERROR|WARNING|INFO)" />
+                    </linecontainsregexp>
+                    <tokenfilter>
+                        <replaceregex pattern=".*(POLICY_(?:ERROR|WARNING|INFO))" replace="\1" flags="gi" />
+                    </tokenfilter>
+                </filterchain>
+            </copy>
+            <hlm:assertFileExists file="${build.log.dir}/${build.id}_@{type}_archive.policy.log" />
+            <hlm:metadatarecord database="${metadata.dbfile}">
+                <hlm:textmetadatainput>
+                    <fileset casesensitive="false" file="${build.log.dir}/${build.id}_@{type}_archive.policy.log" />
+                    <metadatafilterset refid="filterset.archive.policy" />
+                </hlm:textmetadatainput>
+            </hlm:metadatarecord>
+            <hlm:signalMacro logfile="${build.log.dir}/${build.id}_@{type}_archive.policy.log" 
+                signal.input="archivePolicyErrorSignalInput" />
+        </sequential>
+    </macrodef>
+    
+    <!--
+    1. To update the archive configuration file with substituted drives information for UNC paths (if any).
+    2. To create the .make file to zip the sources using EC.    
+    -->
+    <scriptdef name="updateArchiveConfig" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="configtype" />
+        <attribute name="configfileparsed" />
+        <attribute name="usingec" />
+        <![CDATA[
+import archive
+import configuration
+import logging
+import os
+
+config_parsed_filename = str(attributes.get('configfileparsed'))
+config_type = str(attributes.get('configtype'))
+is_it_ec = str(attributes.get('usingec'))
+                        
+builder = configuration.NestedConfigurationBuilder(open(config_parsed_filename, 'r'))
+configSet = builder.getConfiguration()
+configs = configSet.getConfigurations(config_type)
+
+outputtype = 'ant'
+outputext = '.xml'
+if is_it_ec == "true":
+    outputtype = 'make'
+    outputext = '.make'
+
+if len(configs) > 0:
+    prebuilder = archive.ArchivePreBuilder(configuration.ConfigurationSet(configs), config_type, outputtype)
+    if os.sep == '\\':
+        toAppendEmakeRoot = prebuilder.checkRootDirValue(builder, config_parsed_filename, project.getProperty('build.drive'), config_type)
+        if toAppendEmakeRoot is not None:
+            project.setProperty("emake.root.to.append", str(toAppendEmakeRoot))
+    prebuilder.writeTopLevel(os.path.join(project.getProperty('build.drive') + os.sep, 'ZIP_' + config_type + outputext), project.getProperty('temp.build.dir'), config_parsed_filename)       
+    
+else:
+    raise Exception('There are no archive configs to build. Looked for %s' % config_type)
+]]>
+    </scriptdef>
+    
+
+    <!-- Zips the Engineering English content. -->
+    <target name="zip-ee" unless="skip-zips">
+        <hlm:zipContentMacro type="ee" file="${zip.config.file}" />
+    </target>
+
+    <!-- Zips the subcon content. -->
+    <target name="zip-subcon" unless="skip-zips">
+        <hlm:zipContentMacro type="subcon" file="${zip.config.file}" />
+    </target>
+
+
+    <!-- Zips the subcon rom content. -->
+    <target name="zip-subcon-roms" unless="skip-zips">
+        <hlm:zipContentMacro type="subcon_roms" file="${zip.config.file}" />
+    </target>
+
+
+    <!-- Zips the localised content. -->
+    <target name="zip-localised" unless="skip-zips">
+        <hlm:zipContentMacro type="localised" file="${zip.config.file}" />
+    </target>
+
+
+    <!-- Zips the trace rom content -->
+    <target name="zip-trace-roms" unless="skip-zips">
+        <hlm:zipContentMacro type="trace_roms" file="${zip.config.file}" />
+    </target>
+
+
+    <!-- Zips the trace rom content -->
+    <target name="zip-uda-roms" unless="skip-zips">
+        <hlm:zipContentMacro type="uda_roms" file="${zip.config.file}" />
+    </target>
+
+
+    <!-- Zips .loc files into individual packages. -->
+    <target name="zip-loc-files">
+        <mkdir dir="${temp.loc.dir}" />
+        <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
+            <arg file="${helium.dir}/tools/publish/get_loc_files.pl" />
+            <arg value="${build.drive}" />
+        </exec>
+        <zip destfile="${loc.output.dir}/${loc.output.filename}" basedir="${temp.loc.dir}" />
+    </target>
+
+
+    <!-- Publishes the content defined by the filesets at the top of this project.
+    
+    The files are split into 4 filesets to parallelize the publish operation:
+    
+    * publish.files1
+    * publish.files2
+    * publish.files3
+    * publish.files4
+    
+    All content is copied to the location defined by publish.dir. Also verify the source and target content after publish.
+    -->
+    <target name="publish" depends="prep-publish" if="publish">
+        <hlm:publishMacro />
+        <resourcecount property="total.changes.in.fileset">
+            <fileset id="publish.files.location" dir="${build.output.dir}">
+                <exclude name="logs/**/*_ant_build.log" />
+                <exclude name="*" />
+                <exclude name="build/**/*" />
+                <exclude name="ec/**/*" />
+                <exclude name="temp_build_files/**/*" />
+                <exclude name="uda/**/*" />
+                <different targetdir="${publish.dir}" ignoreFileTimes="true" ignoreContents="yes" />
+            </fileset>
+        </resourcecount>
+        <if>
+            <not>
+                <equals arg1="${total.changes.in.fileset}" arg2="0" />
+            </not>
+            <then>
+                <echo message="ERROR: There are ${total.changes.in.fileset} changes in the publish directory. Uploading the changes again..." />
+                <hlm:publishMacro />
+            </then>
+        </if>
+    </target>
+
+
+    <!-- Basic publish target that publishes all important content. -->
+    <target name="publish-generic" depends="prep-publish,publish-tools" if="publish">
+        <hlm:publishMacro />
+    </target>
+
+
+    <!-- Publishes tools needed to run commands from a published build area. -->
+    <target name="publish-tools" depends="prep-publish" if="publish">
+        <echoproperties destfile="${publish.dir}/build_properties.txt">
+            <propertyset>
+                <propertyref name="publish.dir" />
+                <propertyref name="publish.release.dir" />
+            </propertyset>
+        </echoproperties>
+        <copy todir="${publish.dir}" preservelastmodified="true" failonerror="false">
+            <fileset refid="helium.files" />
+        </copy>
+        <copy todir="${publish.dir}" preservelastmodified="true" failonerror="false">
+            <fileset dir="${helium.dir}/tools/publish/publish_dir_files" includes="*" />
+        </copy>
+    </target>
+
+
+    <!-- The same as a basic publish. -->
+    <target name="publish-variants" depends="prep-publish" if="publish">
+        <hlm:publishMacro />
+    </target>
+
+
+    <!-- Notifies the lxr indexing engine that the build area is ready to be indexed. -->
+    <target name="lxr">
+        <copy todir="${lxr.publish.dir}" preservelastmodified="true" failonerror="false" flatten="true">
+            <fileset refid="publish.files" />
+        </copy>
+        <echo file="${lxr.publish.dir}\${build.id}_ready.txt" />
+    </target>
+
+
+    <!-- Mails the Diamonds XML data to the Diamonds server account. -->
+    <target name="mail-log-to-diamonds">
+        <runtarget target="lookup-email" />
+        <echo message="Sending XML log through email." />
+        <!--Ant mail task can not include xml as msg body. so do it in python-->
+        <!-- TODO - would this work by using a <message> subelement? -->
+        <hlm:python>
+import sys, smtplib, string
+            
+fromaddr = r'${email.from}'
+toaddrs  = r'${diamonds.mail}'
+smtpserver  = r'${email.smtp.server}'
+subject  = "[DIAMONDS_DATA] ${build.id}>>>${diamonds.host}>>>${diamonds.path}"
+file = open(r'${diamonds.log.file}', 'r')
+msg = file.read()
+body = string.join(("From: %s" %fromaddr, "To: %s" %toaddrs, "Subject: %s" %subject, "", msg), "\r\n")
+try:
+    server = smtplib.SMTP(smtpserver)
+    server.sendmail(fromaddr, toaddrs, body)
+    server.quit()
+    print "Mail sent to " , toaddrs
+except Exception:
+    print "SMTP server " + smtpserver + " unavailable!! Unable to send log to " , toaddrs
+    
+        </hlm:python>
+    </target>
+
+
+    <!-- Reports on the status of the build, through other targets. -->
+    <target name="report" depends="binary-sizes-log" unless="env.HLM_SUBCON">
+        <antcall target="rndsdk-create-api-descr-xml" />
+    </target>
+
+
+    <!-- Delta zips -->
+
+    <property name="delta.zip.location" value="${build.output.dir}/build_area/delta_zip" />
+    <property name="delta.zip.temp.location" value="${temp.build.dir}/delta_zip" />
+    <property name="delta.zip.file" value="${delta.zip.location}/${build.id}_delta_zip.zip" />
+    <property name="delta.zip.file.size" value="11000000" />
+    <!--default value of approx 11GB-->
+
+    <property name="delta.zip.delete.file" value="${delta.zip.location}/specialInstructions.xml" />
+    <property name="delta.ant.file" value="${delta.zip.temp.location}/delta_zip.ant.xml" />
+    <property name="md5.signature.file" value="${delta.zip.location}/${build.id}.md5" />
+    <property name="md5.split" value="100" />
+    <!-- old.md5.file needs to be specified by the user -->
+
+
+    <!-- Private: Patch evalid tool -->
+    <target name="patch-evalid">
+        <patch patchfile="${helium.dir}/tools/publish/evalidmd5.patch" originalfile="${build.drive}/epoc32/tools/evalidmd5.pm" />
+    </target>
+
+
+    <!-- Private: Revert evalid patch -->
+    <target name="unpatch-evalid">
+        <patch reverse="true" patchfile="${helium.dir}/tools/publish/evalidmd5.patch" originalfile="${build.drive}/epoc32/tools/evalidmd5.pm" />
+    </target>
+
+
+    <!-- Private: Copy extra tool for evalid -->
+    <target name="pre-build-md5" depends="patch-evalid">
+        <copy todir="${build.drive}\epoc32\tools" file="${helium.dir}/tools/publish/evalid_multiple.pl" />
+    </target>
+
+
+    <!-- Private: Revert patches -->
+    <target name="post-build-md5" depends="unpatch-evalid" />
+
+
+    <!-- Private: Generate a list of checksums for all files in the build area using EBS system -->
+    <target name="build-md5-ebs" depends="pre-build-md5">
+        <mkdir dir="${delta.zip.location}" />
+        <hlm:python failonerror="true">
+import os
+import delta_zip
+builder = delta_zip.MD5SignatureBuilderEBS("${build.drive}", r"${md5.split}", r"${delta.zip.temp.location}", r"${delta.exclude.commasep}", r"${delta.zip.temp.location}\list_files.txt")
+builder.build(r"${md5.signature.file}")       
+        </hlm:python>
+
+        <antcall target="post-build-md5" />
+    </target>
+
+    <!-- Private: Generate a list of checksums for all files in the build area using EC system -->
+    <target name="build-md5-ec" depends="pre-build-md5">
+        <mkdir dir="${delta.zip.location}" />
+        <echo>delta.zip.temp.location: ${delta.zip.temp.location}</echo>
+        <hlm:python failonerror="true">
+import os
+import delta_zip
+builder = delta_zip.MD5SignatureBuilderEC("${build.drive}", r"${md5.split}", r"${delta.zip.temp.location}", r"${delta.exclude.commasep}", "${ec.cluster.manager}", "${ec.build.class}", r"${delta.zip.temp.location}\list_files.txt")
+builder.build("${md5.signature.file}")       
+        </hlm:python>
+
+        <antcall target="post-build-md5" />
+    </target>
+
+
+    <!-- Generate a list of checksums for all files in the build area -->
+    <target name="build-md5">
+        <property name="delta.exclude.commasep" value="epoc32_save.zip,output/**/*,delta_zips/**/*,temp/**/*,epoc32/**/*.sym,epoc32/BUILD/**/*" />
+        <echo>build MD5 started</echo>
+        <if>
+            <isset property="build.system.ec-helium" />
+            <then>
+                <echo>build EC MD5</echo>
+                <antcall target="build-md5-ec" />
+            </then>
+            <else>
+                <echo>build EBS MD5</echo>
+                <antcall target="build-md5-ebs" />
+            </else>
+        </if>
+    </target>
+
+
+    <!-- Compare builds using md5 files and generate zips -->
+    <target name="generate-delta" if="old.md5.file.present">
+        <hlm:python>
+import delta_zip
+
+delta = delta_zip.DeltaZipBuilder(r'${build.drive}', r'${delta.zip.temp.location}', r'${old.md5.file}', r'${md5.signature.file}')
+delta.create_delta_zip(r'${delta.zip.file}', r'${delta.zip.delete.file}', r'${number.of.threads}', r'${delta.ant.file}')
+        </hlm:python>
+
+        <ant antfile="${delta.ant.file}" />
+
+        <hlm:python outputproperty="old.release.label">
+import ant
+import os
+md5file = os.path.basename(ant.get_property(r'${old.md5.file}'))
+print md5file.replace('.md5', '')
+        </hlm:python>
+
+        <move file="${delta.zip.delete.file}" todir="${delta.zip.temp.location}" />
+        <move file="${md5.signature.file}" todir="${delta.zip.temp.location}" />
+
+        <exec executable="C:\APPS\symrec\symrec" failonerror="${failonerror}">
+            <arg value="create" />
+            <arg value="-ser" />
+            <arg value="${release.grace.service}" />
+            <arg value="-pro" />
+            <arg value="${release.grace.product}" />
+            <arg value="-rel" />
+            <arg value="${release.label}" />
+            <arg value="-relroot" />
+            <arg value="${delta.zip.location}" />
+            <arg value="-dep" />
+            <arg value="${release.grace.service}/${release.grace.product}/${old.release.label}" />
+        </exec>
+
+        <move file="${delta.zip.temp.location}/specialInstructions.xml" tofile="${delta.zip.delete.file}" />
+        <move file="${delta.zip.temp.location}/${build.id}.md5" tofile="${md5.signature.file}" />
+
+    </target>
+
+
+    <!-- Set prop old.md5.file to md5 file from last build in publish dir -->
+    <target name="delta-use-last-build">
+        <property name="md5.current.build" value="${publish.dir}/build_area/delta_zip/${build.id}.md5" />
+        <hlm:python outputproperty="old.md5.file">
+import re
+import ant
+import os
+
+previousbuildnumber = 1
+buildnum = r"${build.number}"
+
+while(previousbuildnumber > 0 and previousbuildnumber != ''):
+    previousbuildnumber = ant.get_previous_build_number(buildnum)
+    
+    try:
+        md5lastbuild = re.sub(r'\.(${build.number})([\/_.])', r'.' + previousbuildnumber + r'\2', r'${md5.current.build}')
+        if os.path.exists(md5lastbuild):
+            print md5lastbuild
+            break
+    except ValueError:
+        print "Old MD5 cannot be found"
+    
+    buildnum = previousbuildnumber
+if not os.path.exists(md5lastbuild):
+    print "Old MD5 cannot be found"
+        </hlm:python>
+        <echo>old.md5.file: ${old.md5.file}</echo>
+        <available file="${old.md5.file}" property="old.md5.file.present" />
+        <echo>${old.md5.file.present}</echo>
+    </target>
+
+
+    <!-- Creates a delta from the prevous build to the current one -->
+    <target name="delta-zip" depends="delta-use-last-build,build-md5,generate-delta" description="Generate a delta between two build areas" />
+
+
+    <!-- Upload the delta and config into Grace -->
+    <target name="delta-zip-grace-upload">
+        <fileset id="grace.delta.zips.id" dir="${delta.zip.location}">
+            <include name="**/*.zip" />
+            <include name="**/*.xml" />
+        </fileset>
+
+        <antcall target="grace-upload">
+            <reference refid="grace.delta.zips.id" torefid="gracezips" />
+        </antcall>
+    </target>
+
+    <!-- Publishes the Ant build log.
+        
+    First the logging should be stopped, before the file is copied. Hence this target should be called
+    by the "final" target last.
+    -->
+    <target name="publish-build-log" depends="prep-publish" if="publish">
+        <record name="${build.log}" action="stop" append="true" />
+        <copy todir="${publish.dir}/logs" preservelastmodified="true" failonerror="false">
+            <fileset dir="${build.log.dir}" includes="${build.id}*_ant_build.log" />
+        </copy>
+    </target>
+
+
+    <!-- Does any wrap-up at the end of the build. This should be the last target for every top-level target. -->
+    <target name="final" depends="publish-build-log">
+    </target>
+    
+    <!-- This target will zip the WA depending on the ado mapping file -->
+    <target name="zip-wa" depends="ido-create-ado-mapping" if="zip.wa">
+        <tempfile property="zipwa.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/zip-ant-wa-copy.xml.ftl" outputFile="${zipwa.dynamic.config}">
+            <data expandProperties="yes">
+                inputfile: antProperty(ado.mapping.file)
+                ant: antProperties()
+                data: eval('
+                    java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                    java.util.Properties props = new java.util.Properties();
+                    props.load(pin);
+                    return props;
+                    ', {filename:get(inputfile)})
+                </data>
+        </fmpp>
+        <ant antfile="${zipwa.dynamic.config}"/>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/publish_dir_files/bld.bat	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,19 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+call mc_tools\mbuild\bld.bat %*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/publish_dir_files/build.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="published.root">
+
+    <property environment="env"/>
+    <property file="build_properties.txt"/>
+    <import file="helium/helium.ant.xml"/>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/subcon.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : subcon.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="publish.subcon" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Targets for subcon build.
+    </description>
+    
+    <!-- Verifies that the subcon zips allow subcon images to be built. -->
+    <target name="create-subcon-roms">
+        <!-- preparation.ant.xml <target name="prep-prepare-input"> 
+        This will generate the subcon.prep.xml.parsed file with the appropriate file locations
+        but with everything as it was in the original build (locations wise...)
+        -->
+        <property name="subcon.prep.config.file.parsed" location="${build.output.dir}/subcon.prep.xml.parsed" />
+        <copy file="${subcon.prep.config.file}" tofile="${subcon.prep.config.file.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties/>
+            </filterchain>
+        </copy>
+        <property name="subcon.prep.build.dir" value="${prep.root.dir}/subcon_${build.id}"/>
+
+        <antcall target="subcon-build">
+            <param name="build.drive" value="${subcon.build.drive}"/>
+            <param name="prep.config.file" value="${subcon.prep.config.file}"/>
+            <param name="prep.config.file.parsed" value="${subcon.prep.config.file.parsed}"/>
+            <param name="prep.build.dir" value="${subcon.prep.build.dir}"/>
+            <param name="build.log.dir" value="${subcon.build.drive}/output/logs"/>
+        </antcall>
+
+        <!-- CLEAR THE subcon.build.drive Drive -->
+        <hlm:unsubst drive="${subcon.build.drive}" failonerror="${failonerror}"/>
+    </target>
+
+    
+    <!-- Runs a mini build sequence for testing subcon zips. -->
+    <target name="subcon-build" depends="prep-drive,init-build-area,subcon-prep-copy,subcon-roms"/>
+   
+    
+    <!-- Prepares a build drive with subcon zip content.
+    
+    TODO: how to stop doing whole subcon stage if prep fails, but not kill the build?
+    -->
+    <target name="subcon-prep-copy" depends="prep-prepare-input">
+        <preset.exec executable="${env.PERL}" failonerror="${failonerror}"
+                     output="${build.log.dir}/${build.id}_subcon_buildarea_prep.log">
+            <arg value="${helium.dir}/tools/preparation/prep_build_area.pl" />
+            <arg value="-config" />
+            <arg value="${prep.config.file.parsed}" />
+            <arg value="-destdir" />
+            <arg value="${build.drive}${env.EPOCROOT}" />
+            <arg value="-zipdir" />
+            <arg value="${build.drive}/unzip" />
+        </preset.exec>
+        <!--Delete Symbian file to force S60 version to compile-->
+        <delete file="${build.drive}/epoc32/tools/j2me/hromize.exe" />
+    </target>
+
+    
+    <!-- Copies subcon ROMs back to the main build area. -->
+    <target name="copy-subcon-roms" depends="create-subcon-roms">
+        <copy todir="${build.output.dir}" preservelastmodified="true" failonerror="false">
+            <fileset dir="${subcon.prep.build.dir}\output" casesensitive="false">
+                <include name="**/*"/>
+            </fileset>
+        </copy>
+    </target>
+
+    
+    <!-- Verifies that subcon zips can be used to create subcon ROMs. -->
+    <target name="verify-subcon-zips" depends="create-subcon-roms,copy-subcon-roms,zip-subcon-roms"/>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/synergy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : synergy.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="publish.synergy" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Synergy publishing related targets
+    </description>
+
+    <!-- Validate all the inputs for the publish-tasks-to-folder target. -->
+    <target name="publish-tasks-to-folder-check" if="publish.ccm.folder">
+        <if>
+            <available file="${build.log.dir}/${build.id}_bom.xml" />
+            <then>
+                <property name="do.publish-tasks-to-folder" value="true" />
+            </then>
+        </if>
+    </target>
+
+    <!-- Copies all the task found in the BOM into defined folder. -->
+    <target name="publish-tasks-to-folder" depends="publish-tasks-to-folder-check" if="do.publish-tasks-to-folder">
+        <mkdir dir="${temp.build.dir}" />
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/task-publish.ant.xml.ftl" outputFile="${temp.build.dir}/task-publish.ant.xml">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${helium.dir}/tools/common/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                bom: xml(${build.log.dir}/${build.id}_bom.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <hlm:assertFileExists file="${temp.build.dir}/task-publish.ant.xml" />
+        <ant antfile="${temp.build.dir}/task-publish.ant.xml" dir="${build.drive}/" />
+    </target>
+
+    <!-- Change team level release tag to program level release tag -->
+    <target name="change-release-tag" if="teamlevel.ci.system">
+        <if>
+            <isset property="ccm.cache.xml" />
+            <then>
+                <hlm:createSessionMacro database="${ccm.database}" reference="releasetag.session" cache="${ccm.cache.xml}"/>
+            </then>
+            <else>
+                <hlm:createSessionMacro database="${ccm.database}" reference="releasetag.session" />
+            </else>
+        </if>
+        <hlm:ccm verbose="false">
+            <hlm:sessionset refid="releasetag.session" />
+            <hlm:changereleasetag folder="${teamlevel.folder.number}" releasetag="${programlevel.release.tag}" />
+        </hlm:ccm>
+        <if>
+            <not>
+                <isset property="ccm.cache.xml" />
+            </not>
+            <then>
+                <hlm:ccm verbose="false">
+                    <hlm:sessionset refid="releasetag.session" />
+                    <hlm:close />
+                </hlm:ccm>
+            </then>
+        </if>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/test/test2_publishing_to_diamonds.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_publishing_to_diamonds.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="xtest_publishing_to_diamonds" xmlns:hlm="http://www.nokia.com/helium">
+
+    <!-- Private: -->
+    <target name="xtest-diamonds" depends="setup-test-publishing-to-diamonds,diamonds,xtest-diamonds-validate-policy,xtest-diamonds-check-tool-dependencies"/>
+    
+    <!-- Private: -->
+    <target name="setup-test-publishing-to-diamonds">
+        <property name="build.family" value="helium_test"/>
+        <property name="email.from" value="none"/>
+        <delete dir="${build.log.dir}" failonerror="false"/>
+        <mkdir dir="${build.log.dir}"/>
+    </target>
+    <!--
+    <target name="test-default-buildsystem-set">             
+        <antcall target="diamonds-start-log">
+        </antcall>            
+        <xpathtest xmlfile="${build.log.dir}/${build.id}_diamonds-log-start.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/diamonds-build/build[build_system='ebs']"/> 
+        </xpathtest>
+    </target>
+
+    <target name="test-buildsystem-set">             
+        <antcall target="diamonds-start-log">
+            <param name="build.system" value="test"/>
+        </antcall>            
+        <xpathtest xmlfile="${build.log.dir}/${build.id}_diamonds-log-start.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/diamonds-build/build[build_system='test']"/> 
+        </xpathtest>
+    </target>
+--> 
+    
+    <!-- Private: -->
+    <target name="xtest-diamonds-check-tool-dependencies">
+        <antcall target="check-tool-dependencies">
+        </antcall>            
+        <xpathtest xmlfile="${build.log.dir}/check-tool-dependencies.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/diamonds-build/tools/tool[name='java']"/>
+            <xpath expression="/diamonds-build/tools/tool[name='ant']"/>
+            <xpath expression="/diamonds-build/tools/tool[name='python']"/>
+        </xpathtest>
+        <xpathtest xmlfile="${build.log.dir}/diamonds-start.log.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/diamonds-build/build[build_system='ebs']"/> 
+        </xpathtest>
+    </target> 
+    
+    <!-- Private: -->
+    <target name="xtest-diamonds-validate-policy">
+        <antcall target="render-validate-policy">
+        </antcall>            
+        <xpathtest xmlfile="${build.log.dir}/render-validate-policy.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/diamonds-build[schema &gt; 9]"/> 
+        </xpathtest>
+    </target> 
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/test/test_macro.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_macro.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_macro" xmlns:hlm="http://www.nokia.com/helium">
+    <property environment="env" />
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml" />
+    
+    <target name="test-update-metadata">
+        <mkdir dir="${helium.build.dir}/GRACE"/>
+        <copy todir="${helium.build.dir}/GRACE/">
+            <fileset dir="${helium.dir}/tests/data/symrec/GRACE" includes="service/product/release_1/*"/>
+        </copy>
+        <copy file="${helium.dir}/tests/data/symrec/GRACE/service/product/release_1/test1.zip" tofile="${helium.build.dir}/GRACE/service/product/release_1/test3.zip"/>
+        <hlm:updateMetadataMacro file="${helium.build.dir}/GRACE/service/product/release_1/release_metadata.xml" archive="${helium.build.dir}/GRACE/service/product/release_1/test3.zip" />
+        <xpathtest xmlfile="${helium.build.dir}/GRACE/service/product/release_1/release_metadata.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/releaseInformation/releaseFiles/package[@name='test3.zip']"/> 
+        </xpathtest>
+        <hlm:updateMetadataMacro file="${helium.build.dir}/GRACE/service/product/release_1/release_metadata.xml" archive="${helium.build.dir}/GRACE/service/product/release_1/test3.zip" 
+            filters="foo,bar"/>
+        <xpathtest xmlfile="${helium.build.dir}/GRACE/service/product/release_1/release_metadata.xml">  
+            <namespace uri="" prefix=""/>
+            <xpath expression="/releaseInformation/releaseFiles/package[@name='test3.zip']"/> 
+            <xpath expression="/releaseInformation/releaseFiles/package[@name='test3.zip' and @filters='foo,bar']"/> 
+        </xpathtest>
+        <delete dir="${helium.build.dir}/GRACE" />
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/conflict-checker.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : conflict-checker.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="quality.conflict-checker" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Analyse the content created from two different components.
+    </description>
+
+    <property name="build.duplicates.log" location="${build.log.dir}/${build.id}_build_duplicates.xml" />
+
+    <!--
+        This macro extract the list of files generated/exported several time from different component 
+        during the build . It uses the output of "abld -what" commands to extract the information.
+        The output is an XML file that can be transform to anything using XSLT of FMPP.
+        e.g:
+        <pre>
+        <hlm:checkBuildDuplicatesMacro output="${build.duplicates.log}">
+               <fileset dir="${build.log.dir}">
+                <include name="${build.id}.*_compile.log"/>
+                <include name="${build.id}.what.cmaker.log"/>
+                <exclude name="${build.id}.*_output_build.log"/>
+            </fileset>
+        </hlm:checkBuildDuplicatesMacro>
+        </pre>
+    -->
+    <scriptdef name="checkBuildDuplicatesMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output" />
+        <element name="fileset" type="fileset" />
+        <![CDATA[
+import integration.ant
+integration.ant.check_build_duplicates_task(project, self, attributes, elements)
+        ]]>
+    </scriptdef>
+
+    <!-- 
+       Check if the build duplicated needs to be run.
+    -->
+    <target name="check-build-duplicates">
+        <if>
+            <or>
+                <equals arg1="${build.system}" arg2="sbs" />
+                <equals arg1="${build.system}" arg2="sbs-ec" />
+            </or>
+            <then>
+                <property name="skip.build.duplicates" value="" />
+            </then>
+        </if>
+    </target>
+
+    <!-- Parse all the build log and extract files that are generated/exported
+        several times.
+    -->
+    <target name="integration-build-duplicates" depends="check-build-duplicates" unless="skip.build.duplicates">
+        <hlm:checkBuildDuplicatesMacro output="${build.duplicates.log}">
+            <fileset dir="${build.log.dir}">
+                <include name="${build.id}.*_compile.log" />
+                <include name="${build.id}.what.cmaker.log" />
+                <exclude name="${build.id}.*_output_build.log" />
+            </fileset>
+        </hlm:checkBuildDuplicatesMacro>
+    </target>
+
+    <!-- Render the build duplicates xml file into an HTML output. -->
+    <target name="render-build-duplicates" depends="integration-build-duplicates" unless="skip.build.duplicates">
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/build-duplicates.html.ftl" outputFile="${build.log.dir}/${build.id}_build-duplicates.html">
+            <freemarkerLinks expandProperties="yes">
+                            macro: ${helium.dir}/tools/common/templates/macro
+                        </freemarkerLinks>
+            <data expandProperties="yes">
+                            doc: xml(${build.duplicates.log})
+                            ant: antProperties()
+                        </data>
+        </fmpp>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/file-comparison/BCompare-config.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,5 @@
+load "%1" "%2"
+filter "*.oby"
+select all
+compare rules-based
+file-report layout:side-by-side options:display-mismatches,ignore-unimportant,line-numbers output-to:"%3.html" output-options:html-color
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/file-comparison/file-comparison.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : file-comparison.ant.xml
+Part of     : Helium
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="quality.file-comparison" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    File comparison integration using Beyond Compare.
+    </description>
+
+    <property name="file-comparison.bcomp_path" location="C:\APPS\bc\BComp.exe" />
+    <property name="file-comparison.bcomp_conf" location="${helium.dir}/tools/quality/file-comparison/BCompare-config.txt" />
+    <property name="file-comparison.output" location="${build.output.dir}/file_comparison" />
+    <property name="file-comparison.left_name" value="left" />
+    <property name="file-comparison.right_name" value="right" />
+    <property name="file-comparison.regexp.from" value="(.*)" />
+    <property name="file-comparison.regexp.to" value="\1" />
+
+    <!--
+        Target to run the file-comparison with Beyond Compare.
+        Compares two filesets: file-comparison.left_side and file-comparison.right_side.
+        It is also possible to use regexps to replace text in file names.
+    -->
+    <target name="file-comparison">
+        <trycatch property="file-comparison.exception">
+            <try>
+                <copy todir="${file-comparison.output}/${file-comparison.left_name}">
+                    <fileset refid="file-comparison.left_side" />
+                    <regexpmapper from="${file-comparison.regexp.from}" to="${file-comparison.regexp.to}" />
+                </copy>
+                <copy todir="${file-comparison.output}/${file-comparison.right_name}">
+                    <fileset refid="file-comparison.right_side" />
+                    <regexpmapper from="${file-comparison.regexp.from}" to="${file-comparison.regexp.to}" />
+                </copy>
+                <exec executable="${file-comparison.bcomp_path}">
+                    <arg value="@${file-comparison.bcomp_conf}" />
+                    <arg value="/closescript"/>
+                    <arg value="${file-comparison.output}/${file-comparison.left_name}" />
+                    <arg value="${file-comparison.output}/${file-comparison.right_name}" />
+                    <arg value="${file-comparison.output}/file_comparison_report" />
+                </exec>
+                <delete dir="${file-comparison.output}/${file-comparison.left_name}" />
+                <delete dir="${file-comparison.output}/${file-comparison.right_name}" />
+            </try>
+            <catch>
+                <echo>WARNING: Caught exception in file-comparison target: ${file-comparison.exception}</echo>
+            </catch>
+        </trycatch>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/internal-exports.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : internal-exports.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="quality.internal-exports" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Analyse the content generated under the source tree.
+    </description>
+
+    <!--
+        This macro generates an XML file that list the file generated outside epoc32 during the build.
+        It relies on the output of "abld -what" command.
+
+        e.g:
+          <pre>
+        <hlm:internalExportsMacro output="${build.log.dir}/${build.id}_internal_exports.xml">
+            <fileset dir="${build.log.dir}">
+                <include name="${build.id}.*_compile.log"/>
+                <exclude name="${build.id}.*_output_build.log"/>
+            </fileset>
+        </hlm:internalExportsMacro>
+        </pre>
+    -->
+    <scriptdef name="internalExportsMacro" language="jython" uri="http://www.nokia.com/helium">
+        <element name="fileset" type="fileset"/>
+        <attribute name="output"/>
+        <![CDATA[
+import integration.quality
+import os
+if attributes.get('output') == None:
+    raise Exception("'output' attribute is not defined.")
+self.log("Creating %s" % str(attributes.get('output')))
+output = open(str(attributes.get('output')), "w+")
+output.write("<?xml version=\"1.0\"?>\n<internalexports>\n")
+for eid in range(elements.get("fileset").size()):
+    ds = elements.get("fileset").get(int(eid)).getDirectoryScanner(project)
+    ds.scan()
+    for filename in ds.getIncludedFiles():
+        filename = os.path.join(str(ds.getBasedir()), str(filename))
+        parser = integration.quality.InternalExportParser(open(filename, 'r'))
+        parser.parse()
+        for component in parser.internalexports.keys():
+            output.write("    <component name=\"%s\">\n" % component)
+            output.write("".join(map(lambda x: "        <file name=\"%s\"/>\n" % x, parser.internalexports[component])))
+            output.write("    </component>\n")
+output.write("</internalexports>\n")
+output.close()
+        ]]>
+    </scriptdef>
+
+    <!--
+        This target generate an XML file that contains the list of file exported inside the
+        source tree. The files are sorted by components.
+    -->
+    <target name="integration-internal-exports">
+        <hlm:internalExportsMacro output="${build.log.dir}/${build.id}_internal_exports.xml">
+            <fileset dir="${build.log.dir}">
+                <include name="${build.id}.*_compile.log"/>
+                <exclude name="${build.id}.*_output_build.log"/>
+            </fileset>
+        </hlm:internalExportsMacro>
+    </target>
+
+    
+    <!-- Render the build duplicates xml file into an HTML output. -->
+    <target name="render-internal-exports" depends="integration-internal-exports">
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/internal-exports.html.ftl"
+              outputFile="${build.log.dir}/${build.id}_internal-exports.html">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${helium.dir}/tools/common/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                doc: xml(${build.log.dir}/${build.id}_internal_exports.xml)
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/mmp-to-target.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : mmp-to-target.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="quality.mmp-to-target" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Generate the list of targets from the project files.
+    </description>
+
+    <!--
+        Generates an output text file that list the generated target per mmp files.
+        The list of mmps is to provided throught a fileset.
+        
+        e.g.
+        <pre>
+        <hlm:mmpToTargetMacro output="targets_from_mmps.txt">
+            <fileset dir="${build.drive}/">
+                <include name="s60/**/*.mmp"/>
+                <include name="ncp_sw/**/*.mmp"/>
+                <include name="ppd_sw/**/*.mmp"/>
+                <include name="psw/**/*.mmp"/>
+                <exclude name="**/tsrc/**/*.mmp"/>
+            </fileset>
+        </hlm:mmpToTargetMacro>
+        </pre>
+    -->
+    <scriptdef name="mmpToTargetMacro" language="jython" uri="http://www.nokia.com/helium">
+        <element name="fileset" type="fileset"/>
+        <attribute name="output"/>
+        <![CDATA[
+import integration.quality
+import os
+import re
+if attributes.get('output') == None:
+    raise Exception("'output' attribute is not defined.")
+project.log("Creating %s" % str(attributes.get('output')))
+output = open(str(attributes.get('output')), "w+")
+match_target = re.compile("\s*TARGET\s+(.+)")
+for eid in range(elements.get("fileset").size()):
+    ds = elements.get("fileset").get(int(eid)).getDirectoryScanner(project)
+    ds.scan()
+    for filename in ds.getIncludedFiles():
+        filename = os.path.join(str(ds.getBasedir()), str(filename))
+        project.log("Analysing %s" % filename, 4)
+        input = open(filename, 'r')
+        for line in input.readlines():
+            m = match_target.match(line)
+            # do not match resource files.
+            if m != None and os.path.splitext(m.group(1))[1].lower() != ".rsc":            
+                output.write("%s : %s\n" % (os.path.splitdrive(filename)[1], m.group(1)))
+output.close()
+        ]]>
+    </scriptdef>
+
+
+    <!--
+        This target generates a text file which maps executable and they mmp source location.
+        
+        e.g:
+        \src\common\generic\wap-stack\wapstack\group\wapstkcli.mmp : wapstkcli.dll
+        \src\common\generic\wap-stack\wapstack\group\wapstksrv.mmp : wapstksrv.dll        
+    -->
+    <target name="integration-mmp-to-target">
+        <hlm:mmpToTargetMacro output="${build.log.dir}/${build.id}_targets_from_mmps.txt">
+            <fileset refid="mmp.to.target.config"/>
+        </hlm:mmpToTargetMacro>
+    </target>
+
+    <!-- Default configuration for the integration-mmp-to-target target. -->
+    <fileset dir="${build.drive}/" id="mmp.to.target.config">
+        <include name="s60/**/*.mmp"/>
+        <include name="ncp_sw/**/*.mmp"/>
+        <include name="ppd_sw/**/*.mmp"/>
+        <include name="psw/**/*.mmp"/>
+        <exclude name="**/tsrc/**/*.mmp"/>
+    </fileset>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/quality.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : quality.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="quality">
+    <import file="conflict-checker.ant.xml"/>
+    <import file="internal-exports.ant.xml"/>
+    <import file="mmp-to-target.ant.xml"/>
+    <import file="validate-policy.ant.xml"/>
+    <import file="file-comparison/file-comparison.ant.xml"/>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/validate-policy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : validate-policy.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="quality.validate-policy" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Policy file validation.
+    </description>
+
+    <property name="validate.policy.log" location="${build.log.dir}/${build.id}_validate-policy.summary.xml" />
+    <property name="validate.policy.log.xml" location="${build.log.dir}/${build.id}_validate-policy.log.xml" />
+    <property name="validate.policy.csv" location="${helium.dir}/tests/minibuilds/compile/distribution.policy.extended_for_sf.id_status.csv" />
+    <property name="validate.policy.ignoreroot" value="false" />
+    <property name="validate.policy.pattern" value="distribution.policy.s60,distribution.policy" />
+
+    <!-- Default path settings for policy validation. -->
+    <path id="reference.policy.path.list">
+        <pathelement path="${build.drive}/s60" />
+    </path>
+
+    <!--
+    This task scan the directory provided by the path element, and valitate the content of the 
+    Distribution.policy.S60 file using some default rules. IDs could also be validate using a CSV input file.
+    'ignoreroot' specifies to ignore the toplevel directory.
+    
+    e.g.
+    <pre>
+      <hlm:validatePolicyMacro output="${validate.policy.log}"
+          ids="${validate.policy.csv}"
+          ignoreroot="${validate.policy.ignoreroot}">
+          <path refid="reference.policy.path.list"/>
+      </hlm:validatePolicyMacro>
+    </pre>
+  -->
+    <scriptdef name="validatePolicyMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output" />
+        <attribute name="ignoreroot" />
+        <attribute name="ids" />
+        <attribute name="pattern" />
+        <element name="path" type="path" />
+        <![CDATA[
+import integration.quality
+import os
+ignoreroot = False
+if (attributes.get('ignoreroot') != None) and (str(attributes.get('ignoreroot')).lower() == "true"):
+    self.log("Ignoring root path.")
+    ignoreroot = True
+
+output = None
+if attributes.get('output') is not None:
+    self.log("Creating %s" % str(attributes.get('output')))
+    output = open(str(attributes.get('output')), "w+")
+    output.write("<?xml version=\"1.0\"?>\n<policyvalidation>\n")
+components_per_file = {}
+
+pattern = ['distribution.policy.s60']
+if attributes.get('pattern') != None:
+    pattern = str(attributes.get('pattern')).split(',')
+
+validator = integration.quality.PolicyValidator(pattern, ignoreroot=ignoreroot)
+
+if attributes.get('ids') is not None:
+    self.log("Loading policy ids from: %s" % str(attributes.get('ids')))
+    if not os.path.exists(str(attributes.get('ids'))):
+        self.log("ERROR: Could not find: %s" % str(attributes.get('ids')), project.MSG_ERR)
+    else:
+        for result in validator.load_policy_ids(str(attributes.get('ids'))):
+            self.log(str("%s: - %s - %s" % (result[0], result[1], result[2])), project.MSG_ERR)
+            if output is not None:
+                output.write("    <error type=\"%s\" message=\"%s\" value=\"%s\"/>\n" % (result[0], result[1], result[2]))
+
+for eid in range(elements.get("path").size()):
+    iterator = elements.get("path").get(int(eid)).iterator()
+    while iterator.hasNext():
+        path = str(iterator.next())
+        self.log("Scanning " + path)
+        for result in validator.validate(path):
+            self.log("%s: %s" % (result[0], result[1]), project.MSG_ERR)
+            if output is not None:
+                output.write("    <error type=\"%s\" message=\"%s\" value=\"%s\"/>\n" % (result[0], result[1], result[2]))
+    
+if output is not None:
+    output.write("</policyvalidation>\n")
+    output.close()
+    ]]>
+  </scriptdef>
+
+    <!--
+    Parse all the path defined by 'reference.policy.path.list' and check all policy files.
+    It generates an XML log defined by property 'validate.policy.log'.
+  -->
+    <target name="integration-validate-policy">
+        <mkdir dir="${build.log.dir}"/>
+        <hlm:validatePolicyMacro output="${validate.policy.log}" ids="${validate.policy.csv}" ignoreroot="${validate.policy.ignoreroot}" pattern="${validate.policy.pattern}">
+            <path refid="reference.policy.path.list" />
+        </hlm:validatePolicyMacro>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:policymetadatainput>
+                <fileset casesensitive="false" file="${validate.policy.log}/" />
+            </hlm:policymetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_validate_policy.log" />
+    </target>
+
+    <!--
+    Render the policy validation xml file ('validate.policy.log') into an text output.
+  -->
+    <target name="render-validate-policy" depends="integration-validate-policy">
+        <if>
+            <not>
+                <istrue value="${metadata.enable}" />
+            </not>
+            <then>
+                <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.ftl" outputFile="${build.log.dir}/${build.id}_validate-policy.log">
+                    <freemarkerLinks expandProperties="yes">
+                      macro: ${helium.dir}/tools/common/templates/macro
+                  </freemarkerLinks>
+                    <data expandProperties="yes">
+                      doc: xml(${validate.policy.log})
+                      ant: antProperties()
+                    </data>
+                </fmpp>
+                <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.xml.ftl" outputFile="${validate.policy.log.xml}">
+                    <freemarkerLinks expandProperties="yes">
+                      macro: ${helium.dir}/tools/common/templates/macro
+                  </freemarkerLinks>
+                    <data expandProperties="yes">
+                      doc: xml(${validate.policy.log})
+                      ant: antProperties()
+                    </data>
+                </fmpp>
+            </then>
+            <else>
+                <!-- Todo: check and if required convert as metadata template -->
+            </else>
+        </if>
+    </target>
+
+    <!-- Target that will apply regular IDO validation rules on Helium. -->
+    <target name="validate-helium-policy">
+        <hlm:validatePolicyMacro>
+            <path>
+                <pathelement path="${helium.dir}/" />
+            </path>
+        </hlm:validatePolicyMacro>
+    </target>
+
+    <!--
+      Internal target that set an intermediate property to disable policy validation execution.
+    -->
+    <target name="ido-validate-policy-skip">
+        <if>
+            <istrue value="${skip.policy-validation}"/>
+            <then>
+                <property name="do.skip.policy-validation" value="1"/>
+            </then>
+        </if>
+    </target>
+    
+    <!-- Policy validation target for IDO. Only detected ADO will get scanned. -->    
+    <target name="ido-validate-policy" depends="ido-create-ado-mapping,ido-validate-policy-skip" unless="do.skip.policy-validation">
+        <hlm:iniKeys2Path ini="${ado.quality.mapping.file}" pathid="reference.policy.path.list"/>
+        <runtarget target="render-validate-policy" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/release/release.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : release.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="release" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Release publising.
+    </description>
+
+    <fileset id="release.files" dir="${publish.dir}">
+        <include name="logs/**/*" />
+        <include name="development_flash_images/**/*" />
+        <include name="release_flash_images/**/*" />
+        <include name="sisfiles/**/*" />
+        <include name="build_area/**/*" />
+        <include name="test_results/**/*" />
+        <include name="utilities/**/*" />
+    </fileset>
+
+    <!-- Copies release.files fileset into publish.release.folder destination -->
+    <target name="release">
+        <mkdir dir="${publish.release.dir}" />
+        <copy todir="${publish.release.dir}" preservelastmodified="true" failonerror="false">
+            <fileset refid="release.files" />
+        </copy>
+    </target>
+
+    <!--
+        This target sets the '''do.robot.release''' property so it activates 
+        the '''ido-sources-to-s60-build-robot''' target.
+    -->
+    <target name="check-robot-release" if="s60.build.robot.path">
+        <script language="jython" setbeans="false">
+            <![CDATA[
+self.setTaskName("check-robot-release")
+
+import ido
+projects = []
+mconfigstr = project.getProperty('s60.build.robot.date')
+if mconfigstr != None:
+    for configstr in mconfigstr.split(';'):
+        config = map(lambda x: x.strip(), configstr.split(','))
+        try:
+            if ido.is_in_interval(int(config[0]), config[1], int(config[2]), config[3]):
+                self.log("It is release time!")
+                projects.append(config[4])
+                project.setProperty('do.robot.release', ",".join(projects))
+            else:
+                self.log("It is not release time!")
+        except Exception, e:
+            self.log("'%s' invalid configuration." % configstr)
+else:
+    self.log("'s60.build.robot.date' is not defined.")
+]]>
+        </script>
+    </target>
+
+    <!-- Sources are sent to the S60 build robot by all the IDOs. 
+    This target collects all the sources based on the System Definition file, 
+    zip them all and send to the specified location. There is only one but mandatory 
+    property to tell the location of the build server which is "s60.build.robot.path".
+    -->
+    <target name="ido-sources-to-s60-build-robot" if="do.robot.release" depends="ido-create-ado-mapping,check-robot-release,lookup-email">
+        <property name="ido.template.robot.ready" location="${helium.dir}/tools/common/templates/ido/ready.txt.ftl" />
+        <tempfile property="s60robot.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}" />
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-robot-zip.ant.xml.ftl" outputFile="${s60robot.dynamic.config}">
+            <data expandProperties="yes">
+                    inputfile: antProperty(ado.mapping.file)
+                    ant: antProperties()
+                    data: eval('
+                                            java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                                            java.util.Properties props = new java.util.Properties();
+                                            props.load(pin);
+                        return props;
+                            ', {filename: get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${s60robot.dynamic.config}" target="all" />
+        <fmpp sourceFile="${ido.template.robot.ready}" outputFile="${s60.build.robot.path}/ready.txt">
+            <data expandProperties="yes">
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/relnotes/getVariantConfiguration.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,76 @@
+#============================================================================ 
+#Name        : getVariantConfiguration.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+#---------------------------------------------------------------------------------------------------------------------------------------------
+# Name: getVariantConfiguration.py
+# Synopsis: Extract the product variant configuration
+#
+# Requirements:
+#        -Python 2.4
+#
+# History:
+#     Version: 1.0  23/5/2007
+#       First version
+#---------------------------------------------------------------------------------------------------------------------------------------------
+
+
+import localisation
+import configuration
+import codecs
+import sys
+import escapeddict
+
+class VariantInfo(object):
+    def __init__(self, variant, languagedb):
+        self.__variant = variant
+        self.__languagedb = languagedb
+    
+    def __str__(self):
+        output = "%s (%s)" % (self.__variant['description'], self.__variant['variant.id']) + ","
+        output += "%s (%s)" % (self.__languagedb.get_name(self.__variant['default']), self.__variant['default']) + ","
+        output += "\"%s\"" % ",".join(map(lambda x: "%s (%s)" % (self.__languagedb.get_name(x), x), self.__variant['languages']))
+        return output
+
+def main():
+    """ Main function create a csv file that defines the variant configuration.
+    """
+    product = sys.argv[1]
+    languagefie = sys.argv[2]
+    configfile = sys.argv[3]
+    outputfile = sys.argv[4]
+    
+    try:
+        languagedb = localisation.Languages(languagefie)
+        builder = configuration.NestedConfigurationBuilder(open(configfile, 'r'))
+        config_set = builder.getConfiguration()
+        outfile = open(outputfile, "w+")
+        outfile.write("Variant,Default language,Languages\n")
+        for variant in config_set.getConfigurations(product):
+            if variant.name == "languagepack":
+                v = VariantInfo(variant, languagedb)
+                outfile.write(str(v)+"\n")
+        outfile.close()
+    except Exception, exc:
+        print "ERROR: %s" % exc
+        sys.exit(-1)
+    
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/relnotes/icf2txt.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+#============================================================================ 
+#Name        : icf2txt.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import sys
+import amara
+
+def main():
+    if len(sys.argv) != 3:
+        print "Usage: icf2txt.py bom.xml out.txt"
+        sys.exit(1)
+
+    bomxmlFile = open(sys.argv[1], "r")
+    outFile = open(sys.argv[2], "w")
+    
+    bomxml = amara.parse(bomxmlFile)
+    
+    if hasattr(bomxml.bom.content.project, "icf"):
+        for icf in bomxml.bom.content.project.icf:
+            outFile.write(str(icf) + "\n")
+
+    outFile.close()
+    bomxmlFile.close()
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/relnotes/readHTML.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,142 @@
+#============================================================================ 
+#Name        : readHTML.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+# Name: readHTML.py
+# Synopsis: This script creates a CSV file from the Log File Summary (.html)
+
+import htmllib
+import sys
+import formatter
+import re
+
+class HTMLComponent(object):
+    """
+    Represents a component in the log file summary
+    """
+    def __init__(self):
+        self._name = ''
+        self._errorCount = 0
+        self._warningCount = 0
+        
+    def getCSV(self):
+        return self._name + ',' + str(self._errorCount) + ',' + str(self._warningCount)
+        
+    def __setName(self, n):
+        self._name = n
+    def __setErrorCount(self, n):
+        self._errorCount = n
+    def __setWarningCount(self, n):
+        self._warningCount = n
+        
+    name = property(None, __setName)    
+    errorCount = property(None, __setErrorCount)
+    warningCount = property(None, __setWarningCount)
+
+class LogHTMLParser(htmllib.HTMLParser):
+    """
+    Parse the scan2log HTML file into CSV
+    """
+    def __init__(self, verbose=0):
+        self.anchors = {}
+        f = formatter.NullFormatter()
+        htmllib.HTMLParser.__init__(self, f, verbose)
+        
+        self.state = -1 #represents column, 0 is first
+        self.printFlag = False
+        self.errorCount = 0
+        self.warningCount = 0
+        
+        self._components = []
+        self.component = None
+        
+    def __getComponents(self):
+        return self._components
+        
+    components = property(__getComponents)
+        
+    def handle_data(self, text):
+        text = text.strip()
+        
+        #ignore plain text links that appear eg. [9]
+        p = re.compile('\[[0-9]*\]')
+        if not text or p.match(text):
+            return
+      
+        #start of area to parse
+        if (text == 'Component'):
+            self.state = 0
+  
+        #end of area to parse
+        if (text == 'By Command'):
+            self.state = -1
+          
+        #reset column if we get lost
+        #if (self.state > 0 and not text.isdigit()):
+        #    self.state = 0
+        
+        if (self.state == 0):
+            self.component = HTMLComponent()
+            self.component.name = text
+        if (text.isdigit() and self.state == 2):
+            self.errorCount += int(text)
+            self.component.errorCount = text
+        if (text.isdigit() and self.state == 3):
+            self.warningCount += int(text)
+            self.component.warningCount = text
+            
+        #if there are more than/ equal 5 errors or 50 warnings we print this row
+        if (text.isdigit() and ((self.state == 2 and (int(text) >= 5)) or 
+          (self.state == 3 and (int(text) >= 50)))):
+            self.printFlag = True
+
+        if (self.state == 5):
+            if (self.printFlag):                
+                self.components.append(self.component)
+                
+            self.printFlag = False
+          
+        if (self.state >= 0):
+            self.state += 1
+            self.state %= 6
+        
+def main():    
+    if len(sys.argv) != 3:
+        print "Usage: readHTML.pl LogFile.html errors.csv"
+        sys.exit(1)
+    
+    parser = LogHTMLParser()
+    
+    inputFile = file( sys.argv[1], 'rb' )
+    outFile = file( sys.argv[2], 'w' )
+    
+    outFile.write("Component,Errors (more than 5),Warnings (more than 50)\n")
+
+    parser.feed(inputFile.read())
+
+    for c in parser.components:
+        outFile.write(c.getCSV() + "\n")
+    
+    outFile.write("Total," + str(parser.errorCount) + "," + str(parser.warningCount) + "\n")
+    
+    inputFile.close()
+    outFile.close()
+    parser.close()
+        
+if __name__ == '__main__' :
+    main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/relnotes/relnotes.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : relnotes.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="relnotes" default="release-notes" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Generates a release note by modifying a template (that you can edit yourself) with
+    values from the build and Synergy.
+    
+    * Modifies a RTF template with values from build
+    * Adds table of errors and warnings
+    * Generates list of baselines, projects and tasks used
+    </description>
+
+    <property name="releasenotes.output.dir" value="${build.output.dir}/relnotes"/>
+    <property name="releasenotes.logo" value="${relnotes.config.dir}/logo.png"/>
+    <property name="releasenotes.props" value="${relnotes.config.dir}/relnotes.properties"/>
+    <property name="releasenotes.temp.props" value="${temp.build.dir}/relnotes.properties"/>
+    <property name="releasenotes.temp.props2" value="${temp.build.dir}/relnotes2.properties"/>
+    <property name="releasenotes.template" value="${relnotes.config.dir}/template.rtf"/>
+    <property name="releasenotes.output" value="${releasenotes.output.dir}/${build.id}_relnotes.rtf"/>
+    <property name="releasenotes.temp.errors" value="${temp.build.dir}/errors.csv"/>
+    <property name="releasenotes.temp.output" value="${temp.build.dir}/tempDocument.rtf"/>
+    <property name="releasenotes.scan2log" value="${build.log.dir}/${build.id}.${product.family}_scan2.html"/>
+    
+    <import file="${relnotes.config.dir}/relnotes_properties.ant.xml" optional="true"/>
+    
+    <!-- Private: -->
+    <target name="release-notes-variant-configuration" depends="rombuild-prepare-input">
+        
+        <script language="jython" setbeans="false">
+tagnames = ""
+for product in project.getProperty("product.list").split(","):
+    tagnames += "Type%sVariantTableHere\n" %  product 
+project.setProperty("variant.product.tagnames", tagnames)
+        </script>
+        <replace file="${releasenotes.output}" token="TypeVariantTableHere" value="${variant.product.tagnames}" summary="true"/>
+        <for list="${product.list}" delimiter="," param="product.name" >
+            <sequential>            
+                <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
+                    <arg value="getVariantConfiguration.py"/>
+                    <arg value="@{product.name}"/>
+                    <arg value="${localisation.language.file}"/>
+                    <arg value="${rombuild.config.file.parsed}"/>
+                    <arg value="${temp.build.dir}/variant_@{product.name}.csv"/>
+                </exec>
+                <hlm:python>
+import ant
+import rtfutils
+rn = rtfutils.RTFUtils(ant.get_property(r'${releasenotes.output}'))
+rn.rtftable(ant.get_property(r'${temp.build.dir}/variant_@{product.name}.csv'), ant.get_property(r'${releasenotes.temp.output}'), ant.get_property(r'Type@{product.name}VariantTableHere'))
+                </hlm:python>
+  
+                <delete file="${releasenotes.output}"/>
+                <move file="${releasenotes.temp.output}" tofile="${releasenotes.output}"/>
+            </sequential>
+        </for>
+    </target>
+    
+    <!-- Private: Create error list in release notes -->
+    <target name="release-notes-error-summary">
+        <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
+            <arg value="readHTML.py"/>
+            <arg value="${releasenotes.scan2log}"/>
+            <arg value="${releasenotes.temp.errors}"/>
+        </exec>
+        <hlm:python>
+import ant
+import rtfutils
+rn = rtfutils.RTFUtils(ant.get_property(r'${releasenotes.output}'))
+rn.rtftable(ant.get_property(r'${releasenotes.temp.errors}'), ant.get_property(r'${releasenotes.temp.output}'), 'TypeErrorTableSummaryHere')
+        </hlm:python>
+        <delete file="${releasenotes.output}"/>
+        <move file="${releasenotes.temp.output}" tofile="${releasenotes.output}"/>
+    </target>
+    
+    <!-- Private: Add logo to release notes -->
+    <target name="release-notes-logo">
+        <hlm:python>
+import ant
+import rtfutils
+rn = rtfutils.RTFUtils(ant.get_property(r'${releasenotes.output}'))
+rn.rtfimage(ant.get_property(r'${releasenotes.logo}'), ant.get_property(r'${releasenotes.temp.output}'), 'AddProductImageHere')
+        </hlm:python>
+        <move file="${releasenotes.temp.output}" tofile="${releasenotes.output}"/>
+    </target>
+    
+    <!-- Private: Find project and baseline of what is running helium -->
+    <target name="release-notes-getcmprojectname">
+        <script language="jython" setbeans="false">
+import nokia.nokiaccm
+import ccm.extra
+import traceback
+import os
+import logging
+#logging.basicConfig(level=logging.DEBUG)
+session = None
+try:
+    database = project.getProperty('ccm.database')
+    username = project.getProperty('ccm.user.login')
+    password = project.getProperty('ccm.user.password')
+    engine = project.getProperty('ccm.engine.host')
+    dbpath = project.getProperty('ccm.database.path')     
+    waroot = project.getProperty('create.bom.workarea.root')
+    if database != None:
+        session = nokia.nokiaccm.open_session(username, password, database=database)
+    else:
+        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
+        
+    cmproject = ccm.extra.get_toplevel_project(session, waroot)
+    if cmproject == None:
+        print 'Error: ' + waroot + ' must be a synergy project and still be in database'
+    else:
+        project.setProperty("ccm.toplevel.project", str(cmproject))
+    session.close()
+except Exception, ex:
+    print 'Caught exception: ' + str(ex)
+    traceback.print_exc()
+        </script>
+        
+        <hlm:python outputproperty="ccm.toplevel.baseline">
+import nokia.nokiaccm
+import traceback
+import ant
+import logging
+logging.disable(logging.INFO)
+session = None
+try:
+    database = ant.get_property(r'${ccm.database}')
+    username = ant.get_property(r'${ccm.user.login}')
+    password = ant.get_property(r'${ccm.user.password}')
+    engine = ant.get_property(r'${ccm.engine.host}')
+    dbpath = ant.get_property(r'${ccm.database.path}')
+    if database != None:
+        session = nokia.nokiaccm.open_session(username, password, database=database)
+    else:
+        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
+        
+    cmproject = session.create(ant.get_property(r'${ccm.toplevel.project}'))
+    print cmproject.baseline
+    session.close()
+except Exception, ex:
+    print 'Caught exception: ' + str(ex)
+    traceback.print_exc()
+        </hlm:python>
+    </target>
+    
+    <!-- Private: 
+    Look at property 'project.startswith' and find complete CM name
+    Output property: '${project.startswith}.project'
+    -->
+    <target name="release-notes-getprojectname">
+        <hlm:python outputproperty="release.notes.temp">
+import amara
+import ant
+
+bomfile = open(r"${build.log.dir}/${build.id}_BOM.xml")
+bom = amara.parse(bomfile)
+
+for p in bom.bom.content.project:
+    if (str(p.name).startswith(ant.get_property(r'${project.startswith}'))):
+        print str(p.name)
+bomfile.close()
+        </hlm:python>
+        <script language="jython" setbeans="false">
+project.setProperty(project.getProperty('project.startswith') + '.project', project.getProperty('release.notes.temp'))
+        </script>
+        
+    </target>
+    
+    <!-- Private: Write projects, baselines and task list for MC and IBUSAL -->
+    <target name="release-notes-ccm" depends="get-ccm-password,release-notes-getcmprojectname,create-bom">
+        
+        <hlm:python>
+import amara
+import nokia.nokiaccm
+import ant
+
+class BOMToFile(object):
+    """
+    Read BOM and output in text
+    """
+    def __init__(self, session, project_name, project, output_dir):
+        self.project_name = project_name
+        self.project = project
+        self.output_dir = output_dir
+        self.session = session
+      
+    def writeprojects(self):
+        fileout = file(self.output_dir + '/' + self.project_name + '_projects.txt', 'w')
+        
+        i = 1
+        for project in self.project.baseline:
+            fileout.write(str(i) + ") " + str(project) + "\n")
+            
+            i += 1
+        fileout.close()
+        
+    def writebaselines(self):
+        fileout = file(self.output_dir + '/' + self.project_name + '_baselines.txt', 'w')    
+        
+        i = 1
+        for project in self.project.baseline:
+            fileout.write(str(i) + ") " + str(project) + "\n")
+            
+            cmproject = self.session.create(str(project))
+            
+            try:
+                baseline = str(cmproject.baseline).strip()
+                if baseline == "None":
+                    fileout.write(str(i) + ") " + str(project) + "\n")
+                else:
+                    fileout.write(str(i) + ") " + baseline + "\n")
+                i += 1
+            except Exception, ex:
+                print ex
+        fileout.close()
+            
+    def writetasks(self):
+        if self.project.xml_properties.has_key("task"):
+            fileout = file(self.output_dir + '/' + self.project_name + '_tasks.txt', 'w')
+            
+            i = 1
+            for task in self.project.task:
+                fileout.write(str(i) + ") Task " + str(task) + "\n")
+                i += 1
+            fileout.close()
+
+bomfile = open(r"${build.log.dir}/${build.id}_BOM.xml")
+bom = amara.parse(bomfile)
+database = ant.get_property(r'${ccm.database}')
+username = ant.get_property(r'${ccm.user.login}')
+password = ant.get_property(r'${ccm.user.password}')
+engine = ant.get_property(r'${ccm.engine.host}')
+dbpath = ant.get_property(r'${ccm.database.path}')
+if database != None:
+    session = nokia.nokiaccm.open_session(username, password, database=database)
+else:
+    session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
+
+for p in bom.bom.content.project:
+    if p.name == ant.get_property(r'${ccm.toplevel.project}'):
+        btof = BOMToFile(session, 'MC', p, ant.get_property(r'${releasenotes.output.dir}'))
+        
+        btof.writeprojects()
+        btof.writebaselines()
+            
+        btof.writetasks()
+            
+    if (str(p.name).startswith('IBUSAL')):
+        btof = BOMToFile(session, 'IBUSAL', p, ant.get_property(r'${releasenotes.output.dir}'))
+        
+        btof.writeprojects()
+            
+        btof.writetasks()
+            
+session.close()
+bomfile.close()
+
+        </hlm:python>
+    </target>
+    
+    <!-- Private: Read BOM and write ICF list -->
+    <target name="release-notes-icfs" depends="create-bom">
+        <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
+            <arg value="icf2txt.py"/>
+            <arg value="${build.log.dir}/${build.id}_BOM.xml"/>            
+            <arg value="${releasenotes.output.dir}/icdicf.txt"/>
+        </exec>
+    </target>
+    
+    <!-- Private: -->
+    <target name="release-notes-test" if="hlm.enable.asserts">
+        <hlm:python>
+import ccm
+#check for ccm session leaks
+assert (len(ccm.running_sessions()) == 0)
+        </hlm:python>
+    </target>
+        
+    <!-- 
+    Generates a product release note based on a template in config dir
+    -->
+    <target name="release-notes" description="Generates a product release note based off a template in config dir">        
+        <mkdir dir="${releasenotes.output.dir}"/>
+        
+        <copy file="${releasenotes.props}" tofile="${releasenotes.temp.props}">
+            <filterchain>
+                <expandproperties/>
+            </filterchain>
+        </copy>
+          
+        <hlm:python>
+import ant
+import rtfutils
+rn = rtfutils.RTFUtils(ant.get_property(r'${releasenotes.output}'))
+rn.rtfconvert(ant.get_property(r'${releasenotes.temp.props}'), ant.get_property(r'${releasenotes.temp.props2}'))
+        </hlm:python>
+        
+        <property file="${releasenotes.temp.props2}"/>                
+        <copy file="${releasenotes.template}" tofile="${releasenotes.output}" overwrite="true"/>
+
+        <antcall target="release-notes-logo" />
+        <antcall target="release-notes-error-summary" />
+        <antcall target="release-notes-variant-configuration" />
+            
+        <delete file="${releasenotes.temp.errors}"/>
+        <delete file="${releasenotes.temp.output}"/>
+        <delete file="${releasenotes.temp.props}"/>
+        <delete file="${releasenotes.temp.props2}"/>
+        
+        <antcall target="release-notes-ccm"/>
+        
+        <antcall target="release-notes-icfs"/>
+    
+        <antcall target="release-notes-replace"/>
+        
+        <antcall target="release-notes-test"/>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/dryrun_parser.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,216 @@
+#============================================================================ 
+#Name        : dryrun_parser.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" parse a python file in a given environment, and get out some results """
+import re
+import os
+import sys
+
+if __name__ == '__main__':
+    if len(sys.argv)<3:
+        print("dryrun requires input txt file and output make file and the target to run")
+        sys.exit(-1)
+
+    #input arguments    
+    input_file = sys.argv[1]
+    output_file = sys.argv[2]
+    make_target = sys.argv[3]
+    
+    
+    variation_commands = {}
+    regional_commands = []
+
+    #parse imaker output
+    fin = open(input_file, "r")
+    imaker_pattern = '^imaker'
+    foti_fota_pattern = ' fot[ia]'
+    core_pattern = 'core|rofs3|flash$'
+    workdir_pattern = 'WORKDIR='
+    regional_pattern = '^unzip'
+    regional_key = ""
+    new_regional_key = ""
+    regional_keys = []
+    temporary_list = []
+    unzip_commands = []
+    workdir_string = ""
+    
+    for line in fin:
+#       """ First look for unzip command. """
+        if(re.search(regional_pattern, line)):
+            temporary_list = line.split(' ')
+            unzip_commands.append(line)
+            new_regional_key = temporary_list[-1]
+            #print regional_key
+            if(not len(regional_key) == 0):
+#                """ Will be processing next region, so store the commands for this region."""
+                if(variation_commands.has_key(regional_key)):
+                    variation_commands[regional_key] = regional_commands
+                regional_key = new_regional_key
+                if(variation_commands.has_key(new_regional_key)):
+                    regional_commands = variation_commands[new_regional_key]
+                else:
+                    regional_commands = []
+                    variation_commands[new_regional_key] = regional_commands
+            else:
+                variation_commands[new_regional_key] = regional_commands
+                regional_key = new_regional_key
+        if(re.search(imaker_pattern, line)):
+            workdir_list = re.split(workdir_pattern, line)
+            if(len(workdir_list) > 1):
+                #print workdir_list
+                workdir_string = re.split("\"", workdir_list[1])[0]
+                #print "workdir_string"
+                #print workdir_string
+                if(not os.path.exists(workdir_string)):
+                    os.makedirs(workdir_string)
+            regional_commands.append(line)
+    fin.close()
+    variation_commands[regional_key] = regional_commands
+    
+#    """ Group the commands for the region and write the commands into a makefile."""
+    fin = open(output_file, "w")
+    all_string = "%s: foti_fota_all \\\n\tcore_rofs_image_all \\\n\trest_of_all" % make_target
+    core_rofs_all_string = "core_rofs_image_all:"
+    variation_image_all_string = "variation_all:"
+    variation_image_string = ""
+    core_rofs_string = ""
+    core_image_id = 0
+    e2flash_id = 0
+    e2flash_all_string = "#pragma runlocal\ne2flash_target_all:\n"
+    variation_image_id = 0
+    variation_e2f_id = 0
+    variation_id = 0
+    
+    foti_fota_all_string = "#pragma runlocal\nfoti_fota_all:"
+    foti_fota_all_string += "\n\t"+unzip_commands[variation_id]
+    rest_of_all_target_string = "rest_of_all:"
+    rest_of_target_string = ""
+    rest_of_target_id = 0
+
+    count = 0
+    dict_list = variation_commands.keys()
+    for key in dict_list:
+        print "before reverse key"
+        print key
+        print len(variation_commands.get(key))
+    
+    dict_list.reverse()
+
+    for key in dict_list:
+        print "key"
+        print key
+        print len(variation_commands.get(key))
+    #    for command in commands:
+    #        print command
+
+    unzip_var_string = ""
+    variation_image_all_string = ""
+    variation_dependency = "variation0"
+    for key in dict_list:
+        commands = variation_commands.get(key)
+        if(variation_id != 0):
+            unzip_var_string += "unzip_var%d:%s" % (variation_id, variation_dependency)
+            variation_dependency ="variation%d " % (variation_id)
+            unzip_var_string += "\n\t"+unzip_commands[variation_id]
+        all_string += "\\\n\tvariation%d " % variation_id
+        variation_image_all_string +="variation%d: " % variation_id
+        #print "no. of comands"
+        #print len(commands)
+        for command in commands:
+            #print variation_id
+            #print command
+            if(re.search(foti_fota_pattern, command)):
+                #print "foti command"
+                #print command
+                foti_fota_all_string += "\t"+command
+            elif(re.search('flash$',command)):
+                #print "flash command"
+                #print command
+                core_rofs_string += ("core_rofs_image%d:foti_fota_all" % (core_image_id))
+                temp_string = re.sub('flash$', 'core-image rofs2-image rofs3-image', command)
+                core_rofs_string += "\n\t"+temp_string+"\n"
+                temp_string = re.sub('flash$', 'core-e2flash rofs2-e2flash rofs3-e2flash', command)
+                e2flash_all_string += "\t"+temp_string
+                core_rofs_all_string += " \\\n\t core_rofs_image%d" % core_image_id
+                core_image_id += 1
+            elif(re.search('core$',command)):
+                #print "core command"
+                #print command
+                core_rofs_string += ("core_rofs_image%d:foti_fota_all" % (core_image_id))
+                temp_string = re.sub('core$', 'core-image', command)
+                core_rofs_string += "\n\t"+temp_string + "\n"
+                temp_string = re.sub('core$', 'core-e2flash', command)
+                e2flash_all_string += "\t"+temp_string
+                core_rofs_all_string += " \\\n\t core_rofs_image%d" % core_image_id
+                core_image_id += 1
+            elif(re.search('rofs3$', command)):
+                #print "rofs3 command"
+                #print command
+                core_rofs_string += ("core_rofs_image%d:foti_fota_all" % (core_image_id))
+                temp_string = re.sub('rofs3$', 'rofs3-image', command)
+                core_rofs_string += "\n\t"+temp_string + "\n"
+                temp_string = re.sub('rofs3$', 'rofs3-e2flash', command)
+                e2flash_all_string += "\t"+temp_string
+                core_rofs_all_string += " \\\n\t core_rofs_image%d" % core_image_id
+                core_image_id += 1
+            elif(re.search('rofs2$',command)):
+                #print "rofs2 command"
+                #print variation_id
+                #print command
+                if(variation_id == 0):
+                    variation_image_string += ("variation_image%d:rest_of_all")  %(variation_image_id)
+                else:
+                    variation_image_string += ("variation_image%d:unzip_var%d")  %(variation_image_id, variation_id)
+                temp_string = re.sub('rofs2$', 'rofs2-image', command)
+                variation_image_string += "\n\t"+temp_string+"\n"
+                temp_string = re.sub('rofs2$', 'rofs2-e2flash', command)
+                e2flash_all_string += "\t"+temp_string
+                variation_image_all_string += " \\\n\tvariation_image%d" % variation_image_id
+                variation_image_id += 1
+            else:
+                rest_of_target_string += ("\nrest_%d:core_rofs_image_all" % (rest_of_target_id))
+                rest_of_target_string += "\n\t"+command+"\n"
+                rest_of_all_target_string += " \\\n\t rest_%d" % rest_of_target_id
+                rest_of_target_id += 1
+        variation_id += 1
+        unzip_var_string += "\n\n"
+        variation_image_all_string += "\n\n"
+
+    all_string += "\\\n\te2flash_target_all\n\n"
+    #print core_rofs_all_string
+    core_rofs_all_string += "\n\n"
+    rest_of_all_target_string += "\n\n"
+    e2flash_all_string += "\n\n"
+    foti_fota_all_string += "\n\n"
+    core_rofs_string += "\n\n"
+    rest_of_target_string += "\n\n"
+    unzip_var_string += "\n\n"
+    variation_image_all_string += "\n\n"
+    e2flash_all_string += "\n\n"
+    fin.write(all_string)
+    fin.write(core_rofs_all_string)
+    fin.write(rest_of_all_target_string)
+    fin.write(unzip_var_string)
+    fin.write(variation_image_all_string)
+    fin.write(foti_fota_all_string)
+    fin.write(core_rofs_string)
+    fin.write(variation_image_string)
+    fin.write(rest_of_target_string)
+    fin.write(e2flash_all_string)
+    fin.close()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/example/rom_image_config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1506 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : rom_image_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+    <spec name="mc" abstract="true">
+        <set name="fota.version" value="${fota.a.build}"/>
+        <set name="ui.platform" value="mc5132"/>
+        <set name="zips.loc.dir" value="${zips.loc.dir}" />
+        <set name="languages.xml.location" value="${localisation.language.file}" />
+        <set name="variation.dir" value="${build.drive}\mc\mc_config\mc_5132_config\PRODUCT\variation" />
+        <set name="rombuild.config.file" value="${rombuild.config.file.parsed}" />
+        <set name="version.product.name" value="N00"/>
+        <set name="imaker.languagepack.automation" value="0"/>
+        <set name="enable.romsymbol" value="1"/>
+        <set name="today" value="$(TODAY)"/>
+        <set name="customer.id" value="00"/> <!-- customer id is 00 in case of EE. -->
+        <set name="customer.revision" value="00"/> <!-- customer revision is 00 in case of EE. -->
+        <set name="uda.revision" value="00"/> <!-- uda revision is 00 in case of EE. -->
+    
+        <set name="rommake.flags" value="-es60ibymacros -DXTI_TRACES -DNO_PLATSEC"/>
+        <set name="version.bandvariant" value="0"/>
+        <set name="version.pd.milestone" value="${major.version}"/>
+        <set name="version.pr" value="${pr}"/>
+        <set name="version.m.step" value="${m.step}"/>
+        <set name="version.bandvariant" value="0"/>
+        <set name="version.rimcycle" value="${minor.version}"/>
+
+        <set name="image.version.name" value="${version.pr}.${build.number}${fota.version}" />
+        <set name="rombuild.id" value="${rommake.product.type}_${image.version.name}"/>
+
+        <set name="rom.output.dir" value="${build.output.dir}"/>
+        <set name="image.type" value="prd,rnd"/>
+        <set name="customer.type" value="vanilla"/>
+        <set name="image.master.iby" value="\epoc32\rom\master.oby"/>
+        <set name="image.variant.iby" value="\epoc32\rom\mc_5132_variant_imaker.oby"/>
+        <set name="image.override.iby" value="\epoc32\rom\override.oby"/>
+        <set name="version.copyright" value="(C) Nokia"/>
+        <set name="build.drive" value="${build.drive}"/>
+        <set name="customer.image.version.name" value="${image.version.name}" />
+    
+        <!-- Should we build and include foti and fota apps images. -->
+        <set name="use.foti" value="1"/>
+        <set name="use.fota" value="1"/>
+        <set name="release.date" value="${fota.release.date}"/>
+
+        <set name="enable.mobile.crash.sender" value="1" />
+
+        <set name="bb5.product.info" value="69"/>
+        <set name="flash.size" value="2048"/>
+        <set name="mytraces.binaries" value="" />
+        <set name="use.platsecbin" value="1"/>
+
+        <!-- Template full outputdir  (used by iMaker for ROM generation) -->
+        <set name="flash.output.dir" value="${rom.output.dir}/development_flash_images/engineering_english/${image.type}"/>
+        <set name="core.output.dir" value="${rom.output.dir}/${core.image.path}"/>
+        <set name="languagepack.output.dir" value="${rom.output.dir}/${languagepack.image.path}"/>
+        <set name="customer.output.dir" value="${rom.output.dir}/${customer.image.path}"/>
+        <set name="uda.output.dir" value="${rom.output.dir}${uda.image.path}"/>
+        <set name="eraseuda.output.dir" value="${rom.output.dir}"/>
+        
+        <!-- Template relative paths  -->
+        <set name="core.image.path" value="release_flash_images/${image.type}/core" />
+        <set name="languagepack.image.path" value="release_flash_images/${image.type}/language/${languagepack.id}_${description}" />
+        <set name="customer.image.path" value="release_flash_images/${image.type}/customer/${customer.type}/${customer.id}_${description}" />
+        <set name="uda.image.path" value="release_flash_images/${image.type}/user_data/${image.type}/${uda.id}_${description}" />
+        <set name="flash.config.path" value="release_flash_images/${image.type}/customer/${customer.type}/${customer.id}_${description}" />
+
+        <!-- Template names  -->
+        <set name="flash.image.name" value="${rombuild.id}_${image.type}_${flash.id}"/>    
+        <set name="eraseuda.image.name" value="${rombuild.id}_${build.version}"/>    
+        <set name="core.image.name" value="${rombuild.id}_${image.type}"/>
+        <set name="languagepack.image.name" value="${rombuild.id}_${languagepack.id}_${image.type}"/>
+        <set name="customer.image.name" value="${rommake.product.type}_${customer.image.version.name}_${customer.id}.${customer.revision}_${image.type}"/>
+        <set name="uda.image.name" value="${rombuild.id}_${uda.id}.${uda.revision}_${image.type}"/>
+        <set name="flash.config.name" value="${languagepack.image.name}_${customer.image.version.name}.${customer.id}.${customer.revision}_${image.type}.config.xml"/>
+
+        <!-- Template publish paths (used for flash config files generation) -->
+        <set name="rom.publish.dir" value="${image.version.name}"/>
+        <set name="core.publish.dir" value="${rom.publish.dir}/${core.image.path}"/>
+        <set name="languagepack.publish.dir" value="${rom.publish.dir}/${languagepack.image.path}"/>
+        <set name="customer.publish.dir" value="${customer.image.version.name}/${customer.image.path}"/>
+        <set name="uda.publish.dir" value="${rom.publish.dir}${uda.image.path}"/>
+        <!-- To be commented in when publish.dir is publish directories are up to date in common.ant.xml
+        <set name="flash.config.publish.dir" value="${publish.root.dir}/${build.name}/releases/${rom.publish.dir}/${flash.config.path}"/> 
+            -->
+        <set name="flash.config.publish.dir" value="${build.output.dir}/${flash.config.path}"/> 
+
+        <!-- fwid generation -->
+        <set name="rofs1.fwid.id" value="core"/>
+        <set name="rofs2.fwid.id" value="language"/>
+        <set name="rofs3.fwid.id" value="customer"/>
+        <set name="rofs1.fwid.version" value="${version.product.type}_${core.version.info}"/>
+        <set name="rofs2.fwid.version" value="${rofs2.version.info}"/>
+        <set name="rofs3.fwid.version" value="${rofs3.version.info}"/>
+        <set name="fota.fwid" value="${rofs1.fwid.version}_${rofs2.fwid.version}_${rofs3.fwid.version}"/>
+
+        <!-- BB5 version info -->
+        <set name="image.type.version" value="$(if $(subst rnd,,$(TYPE)),,RD)$(if $(subst subcon,,$(TYPE)),,SC)" /> <!-- RD for rnd, SC for subcon, empty string otherwise -->
+        <set name="core.version.info" value="${image.version.name}${image.type.version}" />
+        <set name="rofs1.version.info" value="${core.version.info}"/>
+        <set name="rofs2.version.info" value="${image.version.name}.${languagepack.id}.${languagepack.revision}${image.type.version}"/>
+        <set name="rofs3.version.info" value="${customer.image.version.name}.${customer.id}.${customer.revision}${image.type.version}"/>
+
+        <!-- Core version string format-->
+        <set name="core.template" value="${core.version.info}\\n${today}\\n${version.product.type}"/>
+        <set name="languagepack.template" value="${rofs2.version.info}\\n${today}\\n${version.product.type}" />
+        <set name="variant.template" value="${languagepack.template}" /> <!-- Backward compatibility -->
+        <set name="customer.template" value="${rofs3.version.info}\\n${today}\\n${version.product.type}"/>
+        <set name="model.template" value="${version.copyright} ${version.product.name}"/>
+        <set name="uda.template" value="${pr}.${version.bandvariant}.${build.number}${fota.version}\\n${today}\\n${product.type}\\n${copyright} ${version.product.name} (${uda.id})"/>
+
+        <!-- default localisation settings -->
+        <set name="variation" value="western"/>
+        <set name="languagepack.revision" value="1"/>
+        <set name="customer.revision" value="1"/>
+        <set name="description" value=""/>
+
+        <!-- Do not build target in parallel by default -->
+        <set name="build.parallel" value="false" />
+
+        <!-- templates to generate the makefiles -->
+        <set name="output.makefile.filename" value="${rombuild.makefile.name}"/>
+        <set name="main.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\main.mk"/>
+        <set name="flash.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\flash.mk"/>
+        <set name="core.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\core.mk"/>
+        <set name="languagepack.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\languagepack.mk"/>
+        <set name="customer.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\customer.mk"/>
+        <set name="uda.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\uda.mk"/>
+        <set name="eraseuda.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\eraseuda.mk"/>
+        <set name="flash.config.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\template.config.xml"/>
+        <set name="flash.config.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\flash_config.mk"/>
+        <set name="makeupct_core.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\makeupct_core.mk"/>
+
+
+        <spec name="PRODUCT" abstract="true">
+    
+            <set name="config.name" value="PRODUCT"/>
+            <set name="version.bandvariant" value="0"/>
+
+            <set name="rommake.hwid" value="2048"/>
+            <set name="version.product.type" value="RM-235"/>
+            <set name="rommake.product.name" value="PRODUCT"/>
+            <set name="rommake.product.type" value="RM-235"/>
+
+            <spec name="ee_group" abstract="true">
+                <set name="image.type" value="rnd,prd"/>
+                <set name="variant.txt.path" value="\epoc32\data\z\resource\versions\langsw.${config.name}.txt"/>
+                <set name="image.type.version" value="EE$(if $(subst rnd,,$(TYPE)),,RD)" /> <!-- EE for Prd, EERD for R&D -->
+
+                <!-- GUI images -->
+                <spec name="ee_roms" abstract="true">
+                    <set name="build.parallel" value="true" />                  
+                    
+                    <spec name="ee_rnd" abstract="true">
+                        <set name="image.type" value="rnd"/>
+                        
+                        <spec type="flash">                            
+                            <set name="flash.id" value="ui" />
+                            <set name="use.foti" value="0"/>
+                            <set name="use.fota" value="0"/>                       
+                        </spec>                    
+                        
+                        <spec type="eraseuda"/>
+                    </spec>
+
+                    <spec name="ee_prd" abstract="true">
+                        <set name="image.type" value="prd"/>
+                        
+                        <spec type="flash">                            
+                            <set name="flash.id" value="ui" />
+                            <set name="use.foti" value="1"/>
+                            <set name="use.fota" value="1"/>                       
+                        </spec>                                        
+                        
+                        <spec type="eraseuda"/>
+                    </spec>
+                </spec>
+    
+                <spec name="subcon_roms" abstract="true">
+                    <set name="build.parallel" value="true" />
+                    <set name="image.type" value="subcon"/>
+                    
+                    <spec type="flash">
+                        <set name="flash.id" value="ui" />
+                    </spec>
+    
+                    <spec type="eraseuda"/>
+                </spec>
+    
+    
+                <spec name="traces" abstract="true">
+                    <set name="build.parallel" value="false" />
+                    <set name="flash.output.dir" value="${rom.output.dir}/${rommake.product.name}/${flash.id}_traces"/>    
+                        
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="wakeup_trace" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            estart.exe,
+                            ekern.exe,
+                            efile.exe,
+                            Starter.exe,
+                            StarterClient.dll,
+                            SysLangUtil.dll,
+                            SysStart.exe" />
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="telephony" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            ETELMM.DLL,
+                            ETELPCKT.DLL,
+                            ETELSAT.DLL,
+                            FLOGGER.DLL,
+                            flogsvr.exe,
+                            COMSDBGUTIL.DLL,
+                            COMSDBGSVR.DLL,
+                            COMSDBGSVR.EXE,
+                            COMSDBGSVR.LIB"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="audio" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            audiopolicyserver.dll,
+                            audiopolicyapimsgs.dll,
+                            audiopolicyclient.dll,
+                            MMFDevSound.dll,
+                            MmfAudioServerProxy.dll,
+                            MmfDevSoundProxy.dll,
+                            DevSoundEffectCI.dll,
+                            DevSoundCI.dll,
+                            MmRmProxy.dll,
+                            Aamm.dll,
+                            Lac.dll,
+                            AudioStream.dll,
+                            AudioServer.dll,
+                            AudioServerProxy.dll,
+                            AudioServerCommon.dll,
+                            EapGwc.dll,
+                            EAPControlModule.dll,
+                            RawGwc.dll,
+                            RawHwDevice.dll,
+                            DevSoundAdaptationLayer.dll,
+                            MmfDevSoundServer.dll,
+                            MuMdrcEqTune.dll,
+                            mumdrceqcoeff.dll,
+                            mumdrceqfirgeq.dll,
+                            mumdrceqgwc.dll,
+                            mumdrceqloud.dll,
+                            MuMdrcGwc.dll,
+                            NokiaDSY.DLL,
+                            MmRmServer.dll,
+                            Bal.dll,
+                            BalBuffers.dll,
+                            BalBufferManager.dll,
+                            Gwc.dll,
+                            DspMemMapper.dll,
+                            GatewayserverAVC.exe,
+                            GatewayserverclientAVC.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="videotelephony" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            euser.dll,
+                            CamServerCore.dll,
+                            CamServerCore.exe,
+                            DisplaySink.dll,
+                            VTImageConverter.dll,
+                            VTImageTransforms.dll,
+                            ECam.dll,
+                            ECamPluginSupport.dll,
+                            ECamAdvSettings.dll,
+                            PVOSCLBASE.DLL,
+                            PVOSCLERROR.DLL,
+                            PVOSCLMEMORY.DLL,
+                            PVOSCLUTIL.DLL,
+                            PVOSCLIO.DLL,
+                            PVMF.DLL,
+                            PVGENERALTOOLS.DLL,
+                            PV324M.DLL,
+                            PVVIDEOENCMDFNODE.DLL,
+                            PVM4VH263DEC.DLL,
+                            PVVIDEODECNODE.DLL,
+                            PVDEVSOUNDPLAY.DLL,
+                            PVDEVSOUNDREC.DLL,
+                            PVSYMBIANNODEADAPTERS.DLL,
+                            PVCAMSRCNODE.DLL,
+                            PVDISPSINKNODE.DLL,
+                            PVSYMBIANADAPTERS.DLL,
+                            PV2WAYENGINE.DLL,
+                            PV2WAYSYMBIANADAPTER.DLL,
+                            PvThreadMessaging.dll,
+                            PvLogger.dll,
+                            PVOSCLPROC.DLL,
+                            PVVIDEOPARSERNODE.DLL,
+                            Gatewayserver.exe,
+                            Gatewayserverclient.dll,
+                            VidRecMediaDevice.dll,
+                            VideoSource.dll,
+                            Videoteleng.dll,
+                            cscallctrl.dll,
+                            vtlogger.dll,
+                            videotelui.exe,
+                            videotelui.app,
+                            Phone.exe,
+                            PhoneEngine.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="mms" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            mmscli.dll,
+                            mmssrv.dll,
+                            mmstransport.dll,
+                            mmscodec.dll,
+                            mmsmessage.dll,
+                            mmsserversettings.dll,
+                            mmscodecclient.dll,
+                            mmsappadapter.dll,
+                            mmswatcher.dll,
+                            MmsPushHandler.dll,
+                            mmsgenutils.dll,
+                            mmssettings.dll,
+                            mmsui.dll,
+                            mmsdatautils.dll,
+                            mmsuiutils.dll,
+                            notui.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="sms" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            smseditor.exe,
+                            smsviewer.exe,
+                            smsstrict.dll,
+                            gsmu.dll,
+                            smsu.dll,
+                            smsprot.prt,
+                            wapprot.prt,
+                            msexe.exe,
+                            msgs.dll,
+                            watcher.exe,
+                            schsendexe.exe,
+                            schsend.dll,
+                            smum.dll,
+                            smcm.dll,
+                            smss.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="networking" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            tcpip6.PRT,
+                            genericnif.NIF,
+                            connmon.DLL,
+                            nifman.DLL,
+                            esock.DLL,
+                            esocksvr.DLL,
+                            eintsock.DLL,
+                            subconparams.DLL,
+                            eintsock_transport.DLL,
+                            ipcpr.DLL,
+                            shimcpr.DLL"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="tsy" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            phonetsy.tsy,
+                            commontsy.dll,
+                            nokiatsy.dll,
+                            simatktsy.dll,
+                            FLOGGER.DLL,
+                            flogsvr.exe,
+                            COMSDBGUTIL.DLL,
+                            COMSDBGSVR.DLL,
+                            COMSDBGSVR.EXE,
+                            COMSDBGSVR.LIB"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="email" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            MsgMailUtils.dll,
+                            MailPlainView.dll,
+                            MsgMailEditor.exe,
+                            MsgMailViewer.exe,
+                            AutoSend.exe,
+                            Imcm.dll,
+                            Imps.dll,
+                            Pops.dll,
+                            Imut.dll,
+                            Smts.dll,
+                            MailHtmlView.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="ibusal" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            dataport.csy,
+                            ftserverif.dll,
+                            ftserver.exe,
+                            ftdconnmonplugin.dll,
+                            ftdsysteminfoplugin.dll,
+                            ftdversioninfoplugin.dll,
+                            SAServer.EXE,
+                            SAServer.DLL,
+                            SAClient.DLL,
+                            SAIscService.DLL,
+                            AccessoryAdaptation.DLL,
+                            SAAccessoryService.DLL,
+                            StartupAdaptation.DLL,
+                            SAStartupService.DLL,
+                            SALanguageService.DLL,
+                            SASimUtilsService.DLL,
+                            SAAlarmService.DLL,
+                            SystemAdaptationExt.DLL,
+                            VibraAdaptation.DLL,
+                            LightsAdaptation.DLL,
+                            EmAdaptation.DLL,
+                            SAVibraService.DLL,
+                            SALightsService.DLL,
+                            SAEmService.DLL,
+                            ISA_KERNEL_IF.dll,
+                            IscIsiMultiplexer.ldd,
+                            Isimessage.dll,
+                            isimsg.dll,
+                            IscApi.dll,
+                            IscDriver.ldd,
+                            IscDriverExtension.ldd,
+                            IscMultiplexerBase.dll,
+                            IscDataTransmissionBase.dll,
+                            NokiaDSY.DLL,
+                            DosSrv.dll,
+                            DosServer.exe,
+                            DSClient.dll,
+                            CommonDSY.DLL,
+                            SIMATKTSY.dll,
+                            NOKIATSY.DLL,
+                            CUSTOMAPIEXT.DLL,
+                            COMMONTSY.DLL,
+                            PHONETSY.TSY"/>
+                    </spec>
+    
+                    <spec type="flash">
+                        <set name="flash.id" value="drm" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            RoapHandler.DLL"/>
+                    </spec>
+    
+                    <spec type="flash">
+                        <set name="flash.id" value="DVB-H" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            ECommerceMgrClient.dll,
+                            ECommerceManager.exe,
+                            ECRoapPlugin.dll,
+                            DVBHPDD.PDD,
+                            ESGMANAGER.EXE,
+                            IPDCDATABASEN.DLL,
+                            IPDCMANAGER.EXE,
+                            IPDCMGRCLIENT.DLL,
+                            RecManager.dll,
+                            DvrClient.dll,
+                            RbfClient.dll,
+                            RbfWrapper.dll,
+                            RbfServer.exe,
+                            DvbhMgr.exe,
+                            DvbhMgrClient.dll,
+                            IPDCLOGGER.DLL,
+                            MobileTv.exe,
+                            FCastManagerClient.dll,
+                            FCastManagerServer.exe,
+                            fcastserver.exe,
+                            fcastclient.dll,
+                            rightsserver.exe,
+                            ROAPHandler.dll,
+                            RNAVCONTROLLER.DLL"/>
+                    </spec>
+                </spec>
+            </spec>
+        
+            <!-- Language pack and Variant -->
+            <spec name="variants" abstract="true">
+                <set name="build.parallel" value="false" />        
+                <!-- core -->
+                <spec type="core">
+                    <set name="core.id" value="00" />
+                    <spec type="makeupct_core" />
+                </spec>-->
+         
+                <!-- western group -->
+                <spec name="western" abstract="true">
+                    <set name="build.parallel" value="true" />
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="01" />
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,03,05,04,13"/>
+                        <set name="description" value="EURO1"/>
+                        <set name="variation" value="western"/>
+                    </spec> 
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="02"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,03,14,05,18"/>
+                        <set name="description" value="EURO2"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="03"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,09,06,08,15,07"/>
+                        <set name="description" value="SCANDINAVIA"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="04"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,03,49,16,67,68"/>
+                        <set name="description" value="BALTIAN"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="05"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,03,93,16,78,42,17"/>
+                        <set name="description" value="RUSSIAN"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="06"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,25,26,03,27,17"/>
+                        <set name="description" value="EURO3"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="07"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,03,45,28,79,54"/>
+                        <set name="description" value="BALKANS"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="08"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,37"/>
+                        <set name="description" value="ARABIC1"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="09"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,57,37,16,78,04"/>
+                        <set name="description" value="HEBREW"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="10"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,13"/>
+                        <set name="description" value="AFRICA1"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="13"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,39"/>
+                        <set name="description" value="APAC2"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="16"/>
+                        <set name="default" value="161"/>
+                        <set name="languages" value="161,33"/>
+                        <set name="description" value="THAI"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="18"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,96"/>
+                        <set name="description" value="VIETNAM"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="19"/>
+                        <set name="default" value="10"/>
+                        <set name="languages" value="10,51,76,83"/>
+                        <set name="description" value="AMERICAS"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="21"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="04,44,401,402,01,03,13"/>
+                        <set name="description" value="SPAIN"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="22"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,37,50,94"/>
+                        <set name="description" value="ARABIC2"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="23"/>
+                        <set name="default" value="01"/>
+                        <set name="languages" value="01,02,18,03,05"/>
+                        <set name="description" value="AFRICA2"/>
+                    </spec>
+    
+                    <spec name="customer_variants" abstract="true">
+                        <set name="customer.revision" value="1"/>
+                        <set name="build.parallel" value="true"/>
+                        <spec name="vanilla_customer_variants" abstract="true">
+                            <spec type="customer">
+                                <set name="customer.id" value="51"/>
+                                <set name="description" value="GENERAL"/>
+                            </spec>
+                            <spec type="customer">
+                                <set name="customer.id" value="52"/>
+                                <set name="description" value="SPECIFIC"/>
+                                <set name="compatible.languagepack" value="01,02,03"/>
+                            </spec>
+                        </spec>
+                        
+                        <!-- Variant team customer variants HERE ! -->
+                        <spec name="vt_customer_variants" abstract="true">
+                            <set name="customer.type" value="operatorcountry"/>
+                            <spec type="customer">
+                                <!-- re-build variant -->
+                                <set name="customer.id" value="100"/>
+                                <set name="customer.revision" value="2"/>
+                                <set name="description" value=""/>
+                                <set name="compatible.languagepack" value="03"/>
+                            </spec>
+                            <spec type="customer">
+                                <!-- re-use previous variant -->
+                                <set name="customer.image.version.name" value="10.30${fota.version}"/>
+                                
+                                <set name="customer.id" value="101"/>
+                                <set name="description" value="OPERATOR_UK"/>
+                                <set name="compatible.languagepack" value="01"/>
+                                
+                            </spec>
+                        </spec>
+                        <!-- END Variant team customer variants ! -->
+                    </spec>
+                </spec>
+         
+                <!-- china group -->
+                <spec  name="china" abstract="true">
+                    <set name="build.parallel" value="true" />
+                    <set name="variation" value="china" />
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="11"/>
+                        <set name="default" value="29"/>
+                        <set name="languages" value="29,157"/>
+                        <set name="description" value="CHINESE_TAIWAN"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="12"/>
+                        <set name="default" value="159"/>
+                        <set name="languages" value="159,31,326,327"/>
+                        <set name="description" value="APAC1"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="15"/>
+                        <set name="default" value="158"/>
+                        <set name="languages" value="158,30,31"/>
+                        <set name="description" value="HONGKONG"/>
+                    </spec>
+                    <spec type="languagepack">
+                        <set name="languagepack.id" value="20"/>
+                        <set name="default" value="159"/>
+                        <set name="languages" value="159,31"/>
+                        <set name="description" value="CHINA_PRC"/>
+                    </spec>
+                </spec>
+            
+                <!-- japan group -->
+                <spec  name="japan" abstract="true">
+                    <set name="build.parallel" value="true" />
+                    <set name="variation" value="japan" />
+                    <spec  type="languagepack">
+                        <set name="languagepack.id" value="14"/>
+                        <set name="default" value="160"/>
+                        <set name="languages" value="160,32"/>
+                        <set name="description" value="JAPAN"/>
+                    </spec>
+                </spec>
+            </spec>
+        </spec>
+
+        <!--
+          PRODUCT edge configuration
+        -->
+        <spec name="PRODUCT_edge" abstract="true">
+            <set name="config.name" value="PRODUCT_edge"/>
+            <set name="version.bandvariant" value="1"/>
+            <set name="zips.loc.dir" value="${zips.loc.dir}" />
+            <set name="variation" value="western"/>
+            <set name="config.name" value="PRODUCT_edge"/>
+            <set name="rommake.product.name" value="PRODUCT_edge"/>
+            <set name="version.product.type" value="RM-236"/>
+            <set name="rommake.product.type" value="RM-236"/>
+      
+            <set name="rommake.hwid" value="2100"/>
+
+            <spec name="ee_group" abstract="true">
+                <set name="image.type" value="rnd,prd"/>
+                <set name="variant.txt.path" value="\epoc32\data\z\resource\versions\langsw.${config.name}.txt"/>
+                <set name="image.type.version" value="EE$(if $(subst rnd,,$(TYPE)),,RD)" /> <!-- EE for Prd, EERD for R&D -->
+                
+
+                <!-- GUI images -->
+                <spec name="ee_roms" abstract="true">
+                    <set name="build.parallel" value="true" />                  
+                    
+                    <spec name="ee_rnd" abstract="true">
+                        <set name="image.type" value="rnd"/>
+                        
+                        <spec type="flash">                            
+                            <set name="flash.id" value="ui" />
+                            <set name="use.foti" value="0"/>
+                            <set name="use.fota" value="0"/>                       
+                        </spec>                    
+                        
+                        <spec type="eraseuda"/>
+                    </spec>
+
+                    <spec name="ee_prd" abstract="true">
+                        <set name="image.type" value="prd"/>
+                        
+                        <spec type="flash">                            
+                            <set name="flash.id" value="ui" />
+                            <set name="use.foti" value="1"/>
+                            <set name="use.fota" value="1"/>                       
+                        </spec>                                        
+                        
+                        <spec type="eraseuda"/>
+                    </spec>
+                </spec>
+    
+                <spec name="subcon_roms" abstract="true">
+                    <set name="build.parallel" value="true" />
+                    <set name="image.type" value="subcon"/>
+                    
+                    <spec type="flash">
+                        <set name="flash.id" value="ui" />
+                    </spec>
+    
+                    <spec type="eraseuda"/>
+                </spec>
+    
+    
+                <spec name="traces" abstract="true">
+                    <set name="build.parallel" value="false" />
+                    <set name="flash.output.dir" value="${rom.output.dir}/${rommake.product.name}/${flash.id}_traces"/>    
+                        
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="wakeup_trace" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            estart.exe,
+                            ekern.exe,
+                            efile.exe,
+                            Starter.exe,
+                            StarterClient.dll,
+                            SysLangUtil.dll,
+                            SysStart.exe" />
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="telephony" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            ETELMM.DLL,
+                            ETELPCKT.DLL,
+                            ETELSAT.DLL,
+                            FLOGGER.DLL,
+                            flogsvr.exe,
+                            COMSDBGUTIL.DLL,
+                            COMSDBGSVR.DLL,
+                            COMSDBGSVR.EXE,
+                            COMSDBGSVR.LIB"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="audio" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            audiopolicyserver.dll,
+                            audiopolicyapimsgs.dll,
+                            audiopolicyclient.dll,
+                            MMFDevSound.dll,
+                            MmfAudioServerProxy.dll,
+                            MmfDevSoundProxy.dll,
+                            DevSoundEffectCI.dll,
+                            DevSoundCI.dll,
+                            MmRmProxy.dll,
+                            Aamm.dll,
+                            Lac.dll,
+                            AudioStream.dll,
+                            AudioServer.dll,
+                            AudioServerProxy.dll,
+                            AudioServerCommon.dll,
+                            EapGwc.dll,
+                            EAPControlModule.dll,
+                            RawGwc.dll,
+                            RawHwDevice.dll,
+                            DevSoundAdaptationLayer.dll,
+                            MmfDevSoundServer.dll,
+                            MuMdrcEqTune.dll,
+                            mumdrceqcoeff.dll,
+                            mumdrceqfirgeq.dll,
+                            mumdrceqgwc.dll,
+                            mumdrceqloud.dll,
+                            MuMdrcGwc.dll,
+                            NokiaDSY.DLL,
+                            MmRmServer.dll,
+                            Bal.dll,
+                            BalBuffers.dll,
+                            BalBufferManager.dll,
+                            Gwc.dll,
+                            DspMemMapper.dll,
+                            GatewayserverAVC.exe,
+                            GatewayserverclientAVC.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="videotelephony" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            euser.dll,
+                            CamServerCore.dll,
+                            CamServerCore.exe,
+                            DisplaySink.dll,
+                            VTImageConverter.dll,
+                            VTImageTransforms.dll,
+                            ECam.dll,
+                            ECamPluginSupport.dll,
+                            ECamAdvSettings.dll,
+                            PVOSCLBASE.DLL,
+                            PVOSCLERROR.DLL,
+                            PVOSCLMEMORY.DLL,
+                            PVOSCLUTIL.DLL,
+                            PVOSCLIO.DLL,
+                            PVMF.DLL,
+                            PVGENERALTOOLS.DLL,
+                            PV324M.DLL,
+                            PVVIDEOENCMDFNODE.DLL,
+                            PVM4VH263DEC.DLL,
+                            PVVIDEODECNODE.DLL,
+                            PVDEVSOUNDPLAY.DLL,
+                            PVDEVSOUNDREC.DLL,
+                            PVSYMBIANNODEADAPTERS.DLL,
+                            PVCAMSRCNODE.DLL,
+                            PVDISPSINKNODE.DLL,
+                            PVSYMBIANADAPTERS.DLL,
+                            PV2WAYENGINE.DLL,
+                            PV2WAYSYMBIANADAPTER.DLL,
+                            PvThreadMessaging.dll,
+                            PvLogger.dll,
+                            PVOSCLPROC.DLL,
+                            PVVIDEOPARSERNODE.DLL,
+                            Gatewayserver.exe,
+                            Gatewayserverclient.dll,
+                            VidRecMediaDevice.dll,
+                            VideoSource.dll,
+                            Videoteleng.dll,
+                            cscallctrl.dll,
+                            vtlogger.dll,
+                            videotelui.exe,
+                            videotelui.app,
+                            Phone.exe,
+                            PhoneEngine.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="mms" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            mmscli.dll,
+                            mmssrv.dll,
+                            mmstransport.dll,
+                            mmscodec.dll,
+                            mmsmessage.dll,
+                            mmsserversettings.dll,
+                            mmscodecclient.dll,
+                            mmsappadapter.dll,
+                            mmswatcher.dll,
+                            MmsPushHandler.dll,
+                            mmsgenutils.dll,
+                            mmssettings.dll,
+                            mmsui.dll,
+                            mmsdatautils.dll,
+                            mmsuiutils.dll,
+                            notui.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="sms" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            smseditor.exe,
+                            smsviewer.exe,
+                            smsstrict.dll,
+                            gsmu.dll,
+                            smsu.dll,
+                            smsprot.prt,
+                            wapprot.prt,
+                            msexe.exe,
+                            msgs.dll,
+                            watcher.exe,
+                            schsendexe.exe,
+                            schsend.dll,
+                            smum.dll,
+                            smcm.dll,
+                            smss.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="networking" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            tcpip6.PRT,
+                            genericnif.NIF,
+                            connmon.DLL,
+                            nifman.DLL,
+                            esock.DLL,
+                            esocksvr.DLL,
+                            eintsock.DLL,
+                            subconparams.DLL,
+                            eintsock_transport.DLL,
+                            ipcpr.DLL,
+                            shimcpr.DLL"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="tsy" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            phonetsy.tsy,
+                            commontsy.dll,
+                            nokiatsy.dll,
+                            simatktsy.dll,
+                            FLOGGER.DLL,
+                            flogsvr.exe,
+                            COMSDBGUTIL.DLL,
+                            COMSDBGSVR.DLL,
+                            COMSDBGSVR.EXE,
+                            COMSDBGSVR.LIB"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="email" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            MsgMailUtils.dll,
+                            MailPlainView.dll,
+                            MsgMailEditor.exe,
+                            MsgMailViewer.exe,
+                            AutoSend.exe,
+                            Imcm.dll,
+                            Imps.dll,
+                            Pops.dll,
+                            Imut.dll,
+                            Smts.dll,
+                            MailHtmlView.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="ibusal" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            dataport.csy,
+                            ftserverif.dll,
+                            ftserver.exe,
+                            ftdconnmonplugin.dll,
+                            ftdsysteminfoplugin.dll,
+                            ftdversioninfoplugin.dll,
+                            SAServer.EXE,
+                            SAServer.DLL,
+                            SAClient.DLL,
+                            SAIscService.DLL,
+                            AccessoryAdaptation.DLL,
+                            SAAccessoryService.DLL,
+                            StartupAdaptation.DLL,
+                            SAStartupService.DLL,
+                            SALanguageService.DLL,
+                            SASimUtilsService.DLL,
+                            SAAlarmService.DLL,
+                            SystemAdaptationExt.DLL,
+                            VibraAdaptation.DLL,
+                            LightsAdaptation.DLL,
+                            EmAdaptation.DLL,
+                            SAVibraService.DLL,
+                            SALightsService.DLL,
+                            SAEmService.DLL,
+                            ISA_KERNEL_IF.dll,
+                            IscIsiMultiplexer.ldd,
+                            Isimessage.dll,
+                            isimsg.dll,
+                            IscApi.dll,
+                            IscDriver.ldd,
+                            IscDriverExtension.ldd,
+                            IscMultiplexerBase.dll,
+                            IscDataTransmissionBase.dll,
+                            NokiaDSY.DLL,
+                            DosSrv.dll,
+                            DosServer.exe,
+                            DSClient.dll,
+                            CommonDSY.DLL,
+                            SIMATKTSY.dll,
+                            NOKIATSY.DLL,
+                            CUSTOMAPIEXT.DLL,
+                            COMMONTSY.DLL,
+                            PHONETSY.TSY"/>
+                    </spec>
+    
+                    <spec type="flash">
+                        <set name="flash.id" value="drm" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            RoapHandler.DLL"/>
+                    </spec>
+    
+                    <spec type="flash">
+                        <set name="flash.id" value="DVB-H" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            ECommerceMgrClient.dll,
+                            ECommerceManager.exe,
+                            ECRoapPlugin.dll,
+                            DVBHPDD.PDD,
+                            ESGMANAGER.EXE,
+                            IPDCDATABASEN.DLL,
+                            IPDCMANAGER.EXE,
+                            IPDCMGRCLIENT.DLL,
+                            RecManager.dll,
+                            DvrClient.dll,
+                            RbfClient.dll,
+                            RbfWrapper.dll,
+                            RbfServer.exe,
+                            DvbhMgr.exe,
+                            DvbhMgrClient.dll,
+                            IPDCLOGGER.DLL,
+                            MobileTv.exe,
+                            FCastManagerClient.dll,
+                            FCastManagerServer.exe,
+                            fcastserver.exe,
+                            fcastclient.dll,
+                            rightsserver.exe,
+                            ROAPHandler.dll,
+                            RNAVCONTROLLER.DLL"/>
+                    </spec>
+                </spec>
+            </spec>
+
+            <spec name="variants" abstract="true">
+                <set name="variation" value="china"/>
+                <set name="build.parallel" value="false" />      
+                <!-- core -->
+                <spec type="core">
+                    <set name="core.id" value="00" />
+                    <set name="image.type" value="rnd,prd"/>
+                    <spec type="makeupct_core" />
+                </spec>
+
+                <!-- customer -->
+                <spec  type="customer">
+                    <set name="customer.id" value="01"/>
+                    <set name="customer.revision" value="1"/>
+                    <set name="description" value="edge_customer_variant"/>
+                </spec>
+
+                <spec type="languagepack">
+                    <set name="languagepack.id" value="20"/>
+                    <set name="default" value="159"/>
+                    <set name="languages" value="159,31"/>
+                    <set name="description" value="CHINA"/>
+                </spec>
+            </spec>
+        </spec>
+  
+    
+        <!-- PRODUCT Americas/lta configuration -->
+        <spec name="PRODUCT_lta" abstract="true">
+            <set name="config.name" value="PRODUCT_lta"/>      
+            <set name="version.bandvariant" value="0"/>
+            <set name="zips.loc.dir" value="${zips.loc.dir}" />
+            <set name="variation" value="western"/>
+            <set name="config.name" value="PRODUCT_lta"/>
+            <set name="rommake.product.name" value="PRODUCT_lta"/>
+            <set name="version.product.type" value="RM-342"/>
+            <set name="rommake.product.type" value="RM-342"/>
+      
+            <set name="rommake.hwid" value="4200"/>
+            
+            <spec name="ee_group" abstract="true">
+            
+                <set name="build.parallel" value="true" />
+                <set name="image.type" value="rnd,prd"/>
+                <set name="variant.txt.path" value="\epoc32\data\z\resource\versions\langsw.${config.name}.txt"/>
+                <set name="image.type.version" value="EE$(if $(subst rnd,,$(TYPE)),,RD)" /> <!-- EE for Prd, EERD for R&D -->
+
+                <!-- GUI images -->
+                <spec name="ee_roms" abstract="true">
+                    <set name="build.parallel" value="true" />                  
+                    
+                    <spec name="ee_rnd" abstract="true">
+                        <set name="image.type" value="rnd"/>
+                        
+                        <spec type="flash">                            
+                            <set name="flash.id" value="ui" />
+                            <set name="use.foti" value="0"/>
+                            <set name="use.fota" value="0"/>                       
+                        </spec>                    
+                        
+                        <spec type="eraseuda"/>
+                    </spec>
+
+                    <spec name="ee_prd" abstract="true">
+                        <set name="image.type" value="prd"/>
+                        
+                        <spec type="flash">                            
+                            <set name="flash.id" value="ui" />
+                            <set name="use.foti" value="1"/>
+                            <set name="use.fota" value="1"/>                       
+                        </spec>                                        
+                        
+                        <spec type="eraseuda"/>
+                    </spec>
+                </spec>
+    
+                <spec name="subcon_roms" abstract="true">
+                    <set name="build.parallel" value="true" />
+                    <set name="image.type" value="subcon"/>
+                    
+                    <spec type="flash">
+                        <set name="flash.id" value="ui" />
+                    </spec>
+    
+                    <spec type="eraseuda"/>
+                </spec>
+        
+                <spec name="traces" abstract="true">
+                    <set name="build.parallel" value="false" />
+                    <set name="flash.output.dir" value="${rom.output.dir}/${rommake.product.name}/${flash.id}_traces"/>    
+                        
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="wakeup_trace" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            estart.exe,
+                            ekern.exe,
+                            efile.exe,
+                            Starter.exe,
+                            StarterClient.dll,
+                            SysLangUtil.dll,
+                            SysStart.exe" />
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="telephony" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            ETELMM.DLL,
+                            ETELPCKT.DLL,
+                            ETELSAT.DLL,
+                            FLOGGER.DLL,
+                            flogsvr.exe,
+                            COMSDBGUTIL.DLL,
+                            COMSDBGSVR.DLL,
+                            COMSDBGSVR.EXE,
+                            COMSDBGSVR.LIB"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="audio" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            audiopolicyserver.dll,
+                            audiopolicyapimsgs.dll,
+                            audiopolicyclient.dll,
+                            MMFDevSound.dll,
+                            MmfAudioServerProxy.dll,
+                            MmfDevSoundProxy.dll,
+                            DevSoundEffectCI.dll,
+                            DevSoundCI.dll,
+                            MmRmProxy.dll,
+                            Aamm.dll,
+                            Lac.dll,
+                            AudioStream.dll,
+                            AudioServer.dll,
+                            AudioServerProxy.dll,
+                            AudioServerCommon.dll,
+                            EapGwc.dll,
+                            EAPControlModule.dll,
+                            RawGwc.dll,
+                            RawHwDevice.dll,
+                            DevSoundAdaptationLayer.dll,
+                            MmfDevSoundServer.dll,
+                            MuMdrcEqTune.dll,
+                            mumdrceqcoeff.dll,
+                            mumdrceqfirgeq.dll,
+                            mumdrceqgwc.dll,
+                            mumdrceqloud.dll,
+                            MuMdrcGwc.dll,
+                            NokiaDSY.DLL,
+                            MmRmServer.dll,
+                            Bal.dll,
+                            BalBuffers.dll,
+                            BalBufferManager.dll,
+                            Gwc.dll,
+                            DspMemMapper.dll,
+                            GatewayserverAVC.exe,
+                            GatewayserverclientAVC.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="videotelephony" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            euser.dll,
+                            CamServerCore.dll,
+                            CamServerCore.exe,
+                            DisplaySink.dll,
+                            VTImageConverter.dll,
+                            VTImageTransforms.dll,
+                            ECam.dll,
+                            ECamPluginSupport.dll,
+                            ECamAdvSettings.dll,
+                            PVOSCLBASE.DLL,
+                            PVOSCLERROR.DLL,
+                            PVOSCLMEMORY.DLL,
+                            PVOSCLUTIL.DLL,
+                            PVOSCLIO.DLL,
+                            PVMF.DLL,
+                            PVGENERALTOOLS.DLL,
+                            PV324M.DLL,
+                            PVVIDEOENCMDFNODE.DLL,
+                            PVM4VH263DEC.DLL,
+                            PVVIDEODECNODE.DLL,
+                            PVDEVSOUNDPLAY.DLL,
+                            PVDEVSOUNDREC.DLL,
+                            PVSYMBIANNODEADAPTERS.DLL,
+                            PVCAMSRCNODE.DLL,
+                            PVDISPSINKNODE.DLL,
+                            PVSYMBIANADAPTERS.DLL,
+                            PV2WAYENGINE.DLL,
+                            PV2WAYSYMBIANADAPTER.DLL,
+                            PvThreadMessaging.dll,
+                            PvLogger.dll,
+                            PVOSCLPROC.DLL,
+                            PVVIDEOPARSERNODE.DLL,
+                            Gatewayserver.exe,
+                            Gatewayserverclient.dll,
+                            VidRecMediaDevice.dll,
+                            VideoSource.dll,
+                            Videoteleng.dll,
+                            cscallctrl.dll,
+                            vtlogger.dll,
+                            videotelui.exe,
+                            videotelui.app,
+                            Phone.exe,
+                            PhoneEngine.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="mms" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            mmscli.dll,
+                            mmssrv.dll,
+                            mmstransport.dll,
+                            mmscodec.dll,
+                            mmsmessage.dll,
+                            mmsserversettings.dll,
+                            mmscodecclient.dll,
+                            mmsappadapter.dll,
+                            mmswatcher.dll,
+                            MmsPushHandler.dll,
+                            mmsgenutils.dll,
+                            mmssettings.dll,
+                            mmsui.dll,
+                            mmsdatautils.dll,
+                            mmsuiutils.dll,
+                            notui.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="sms" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            smseditor.exe,
+                            smsviewer.exe,
+                            smsstrict.dll,
+                            gsmu.dll,
+                            smsu.dll,
+                            smsprot.prt,
+                            wapprot.prt,
+                            msexe.exe,
+                            msgs.dll,
+                            watcher.exe,
+                            schsendexe.exe,
+                            schsend.dll,
+                            smum.dll,
+                            smcm.dll,
+                            smss.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="networking" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            tcpip6.PRT,
+                            genericnif.NIF,
+                            connmon.DLL,
+                            nifman.DLL,
+                            esock.DLL,
+                            esocksvr.DLL,
+                            eintsock.DLL,
+                            subconparams.DLL,
+                            eintsock_transport.DLL,
+                            ipcpr.DLL,
+                            shimcpr.DLL"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="tsy" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            phonetsy.tsy,
+                            commontsy.dll,
+                            nokiatsy.dll,
+                            simatktsy.dll,
+                            FLOGGER.DLL,
+                            flogsvr.exe,
+                            COMSDBGUTIL.DLL,
+                            COMSDBGSVR.DLL,
+                            COMSDBGSVR.EXE,
+                            COMSDBGSVR.LIB"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="email" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            MsgMailUtils.dll,
+                            MailPlainView.dll,
+                            MsgMailEditor.exe,
+                            MsgMailViewer.exe,
+                            AutoSend.exe,
+                            Imcm.dll,
+                            Imps.dll,
+                            Pops.dll,
+                            Imut.dll,
+                            Smts.dll,
+                            MailHtmlView.dll"/>
+                    </spec>
+        
+                    <spec type="flash">
+                        <set name="flash.id" value="ibusal" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            dataport.csy,
+                            ftserverif.dll,
+                            ftserver.exe,
+                            ftdconnmonplugin.dll,
+                            ftdsysteminfoplugin.dll,
+                            ftdversioninfoplugin.dll,
+                            SAServer.EXE,
+                            SAServer.DLL,
+                            SAClient.DLL,
+                            SAIscService.DLL,
+                            AccessoryAdaptation.DLL,
+                            SAAccessoryService.DLL,
+                            StartupAdaptation.DLL,
+                            SAStartupService.DLL,
+                            SALanguageService.DLL,
+                            SASimUtilsService.DLL,
+                            SAAlarmService.DLL,
+                            SystemAdaptationExt.DLL,
+                            VibraAdaptation.DLL,
+                            LightsAdaptation.DLL,
+                            EmAdaptation.DLL,
+                            SAVibraService.DLL,
+                            SALightsService.DLL,
+                            SAEmService.DLL,
+                            ISA_KERNEL_IF.dll,
+                            IscIsiMultiplexer.ldd,
+                            Isimessage.dll,
+                            isimsg.dll,
+                            IscApi.dll,
+                            IscDriver.ldd,
+                            IscDriverExtension.ldd,
+                            IscMultiplexerBase.dll,
+                            IscDataTransmissionBase.dll,
+                            NokiaDSY.DLL,
+                            DosSrv.dll,
+                            DosServer.exe,
+                            DSClient.dll,
+                            CommonDSY.DLL,
+                            SIMATKTSY.dll,
+                            NOKIATSY.DLL,
+                            CUSTOMAPIEXT.DLL,
+                            COMMONTSY.DLL,
+                            PHONETSY.TSY"/>
+                    </spec>
+    
+                    <spec type="flash">
+                        <set name="flash.id" value="drm" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            RoapHandler.DLL"/>
+                    </spec>
+    
+                    <spec type="flash">
+                        <set name="flash.id" value="DVB-H" />
+                        <set name="image.type" value="rnd"/>
+                        <set name="mytraces.binaries" value="
+                            ECommerceMgrClient.dll,
+                            ECommerceManager.exe,
+                            ECRoapPlugin.dll,
+                            DVBHPDD.PDD,
+                            ESGMANAGER.EXE,
+                            IPDCDATABASEN.DLL,
+                            IPDCMANAGER.EXE,
+                            IPDCMGRCLIENT.DLL,
+                            RecManager.dll,
+                            DvrClient.dll,
+                            RbfClient.dll,
+                            RbfWrapper.dll,
+                            RbfServer.exe,
+                            DvbhMgr.exe,
+                            DvbhMgrClient.dll,
+                            IPDCLOGGER.DLL,
+                            MobileTv.exe,
+                            FCastManagerClient.dll,
+                            FCastManagerServer.exe,
+                            fcastserver.exe,
+                            fcastclient.dll,
+                            rightsserver.exe,
+                            ROAPHandler.dll,
+                            RNAVCONTROLLER.DLL"/>
+                    </spec>
+                </spec>
+            </spec>
+
+            <spec name="variants" abstract="true">
+                <set name="variation" value="western"/>
+                <set name="build.parallel" value="false" /> 
+                <!-- core -->
+                <spec type="core">
+                    <set name="core.id" value="00" />
+                    <set name="image.type" value="rnd,prd"/>
+                    <spec type="makeupct_core" />
+                </spec>
+
+                <!-- customer -->
+                <spec  type="customer">
+                    <set name="customer.id" value="01"/>
+                    <set name="description" value="lta_customer_variant"/>
+                    <set name="customer.revision" value="1"/>
+                </spec>
+
+                <spec type="languagepack">
+                    <set name="languagepack.id" value="19" />
+                    <set name="default" value="10"/>
+                    <set name="languages" value="10,51,76,83"/>
+                    <set name="description" value="AMERICAS"/>
+                </spec>
+            </spec>
+        </spec>    
+        
+        <spec type="uda_roms" abstract="true">
+            <spec type="uda">
+                <set name="uda.id" value="01"/>    
+                <set name="uda.content.dir" value="${build.drive}/mc/mc_config/.../uda_01"/>    
+            </spec>
+        </spec> 
+    </spec>
+</build>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_auto_traces.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# A step to generate udeb file list. e.g: my_tracefiles.txt
+# CORE_UDEBFILE_LIST is a space separated list of file to be loaded as udeb.
+# It automatically enable traces if any files are defined.
+CORE_UDEBFILE_LIST?=
+ifneq ("$(strip $(CORE_UDEBFILE_LIST))","")
+CORE_UDEBFILE=$(CORE_NAME)_my_tracefiles.txt
+
+CLEAN_CREATE_TRACE_FILE = del | $(CORE_UDEBFILE)
+BUILD_CREATE_TRACE_FILE = \
+  echo  | Generating trace file: $(CORE_UDEBFILE)\n | \
+  write | $(CORE_UDEBFILE) | $(foreach file,$(CORE_UDEBFILE_LIST),$(strip $(file))\n)
+
+CLEAN_AUTOTRACES += | $(CLEAN_CREATE_TRACE_FILE)
+BUILD_AUTOTRACES += | $(BUILD_CREATE_TRACE_FILE)
+
+## Integration to iMaker
+CLEAN_COREPRE += $(CLEAN_AUTOTRACES)
+BUILD_COREPRE += $(BUILD_AUTOTRACES)
+USE_UDEB=1
+endif
+###############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_config_builder.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#################################################################
+# Helium iMaker configuration builder.
+# This should ease the iMaker build configuration.
+# Each rom creation will be driven by one configuration file,
+# which will contains a predefine target call to perform the
+# rom build operation.
+# Configs could be either generated or manually created.
+# imaker -pPRODUCT -cncp51 -f helium_config_builder.mk build-roms
+#################################################################
+
+################################################################
+# File glober
+# $1: location
+# $2: perl regexp to match
+helium_glob=$(shell perl -e "use File::Find; use File::Spec; File::Find::find(\&wanted, $$ARGV[0]); sub wanted(){my $$name =$$File::Find::name; if ( $$name =~ /$$ARGV[1]/i ) {$$name =~ s/ /?/g; print $$name.' '; } }" $1 $2)
+
+
+################################################################
+# Config files location
+ROM_CONFIG_DIR=$(PRODUCT_DIR)/rom_configs
+ROM_CONFIGS=$(call helium_glob,$(ROM_CONFIG_DIR),.mk$$)
+
+
+# target to build one config
+%-build-rom:
+	@echo === Stage=$* == $*
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo Building imaker -f $* build-rom
+	-@imaker -f $* build-rom
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+# target to build all configs
+build-roms: $(foreach config,$(ROM_CONFIGS),$(config)-build-rom)
+
+
+################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_eval_variables.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Evaluate iMaker variables or expressions in a file
+TYPE=prd
+TEMPLATE=
+EVALUATED_FILE_NAME=$(TEMPLATE).parsed
+
+PERL_SCRIPT=open FILE, $$ARGV[0]; foreach (<FILE>) {s/\t/\\t/g; s/\n/\\n/g;print $$_;} close FILE;
+
+CLEAN_EVAL_VARIABLES = del | $(EVALUATED_FILE_NAME)
+BUILD_EVAL_VARIABLES = \
+	$(eval EVALUATED_STR=$(shell perl -e "$(PERL_SCRIPT)" $(TEMPLATE))) | \
+	write | $(EVALUATED_FILE_NAME) | $(EVALUATED_STR)
+###############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_features.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Helium specific features.
+###############################################################################
+
+include /epoc32/rom/config/helium_localisation.mk    
+include /epoc32/rom/config/helium_auto_traces.mk
+include /epoc32/rom/config/helium_sw_string.mk
+include /epoc32/rom/config/helium_helpers.mk
+include /epoc32/rom/config/helium_eval_variables.mk
+include /epoc32/rom/config/helium_uda.mk
+include /epoc32/rom/config/helium_makeUPCT_core.mk
+
+###############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_fwid.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+###############################################################################
+###############################################################################
+# FWID creation
+ENABLE_FWID?=0
+FWID_CORE_IBY=$(WORKNAME)_core_fwid.iby
+FWID_VARIANT_IBY=$(WORKNAME)_variant_fwid.iby
+FWID_FILE=$(WORKNAME)_fwid$(FWID_ROFSID).txt
+
+# A step to generate fwidX.txt
+CLEAN_CREATE_FWID_FILE = del | $(FWID_FILE)
+BUILD_CREATE_FWID_FILE = \
+  echo  | Generating file: $(FWID_FILE)\n | \
+  writeu | $(FWID_FILE) | id=$(FWID$(FWID_ROFSID)_ID)\nversion=$(FWID$(FWID_ROFSID)_VERSION)\n
+
+# fwid.iby creation 
+CLEAN_VARIANTFWIDIBY = del | $(FWID_VARIANT_IBY)
+BUILD_VARIANTFWIDIBY = \
+    echo  | Generating the $(FWID_VARIANT_IBY)\n | \
+  write | $(FWID_VARIANT_IBY) | // Generated iby for fwid inclusion\n\
+    \n\#ifndef __GENERATED_VARIANT_FWID_IBY__\
+  \n\#define __GENERATED_VARIANT_FWID_IBY__\n\
+  $(foreach FWID_ROFSID,2 3,\nROM_IMAGE[$(FWID_ROFSID)] data=$(FWID_FILE)   RESOURCE_FILES_DIR\versions\fwid$(FWID_ROFSID).txt)\
+  \n\n\#endif // __GENERATED_VARIANT_FWID_IBY__\n
+  
+CLEAN_COREFWIDIBY = del | $(FWID_CORE_IBY)
+BUILD_COREFWIDIBY = \
+    echo  | Generating the $(FWID_CORE_IBY)\n | \
+  write | $(FWID_CORE_IBY) | // Generated iby for fwid inclusion\n\
+    \n\#ifndef __GENERATED_CORE_FWID_IBY__\
+  \n\#define __GENERATED_CORE_FWID_IBY__\n\
+  $(foreach FWID_ROFSID,1,\nROM_IMAGE[$(FWID_ROFSID)] data=$(FWID_FILE) RESOURCE_FILES_DIR\versions\fwid$(FWID_ROFSID).txt)\
+  \n\n\#endif // __GENERATED_CORE_FWID_IBY__\n
+
+# creates the all fwid file need file - CORE
+CLEAN_CREATE_FWID_FILES=echo | Cleaning up fwids\n $(foreach FWID_ROFSID,$1,| $(CLEAN_CREATE_FWID_FILE))
+BUILD_CREATE_FWID_FILES=echo | Generating fwids\n $(foreach FWID_ROFSID,$1,| $(BUILD_CREATE_FWID_FILE))
+
+CLEAN_VARBLDPRE += $(call iif,$(ENABLE_FWID), | $(call CLEAN_CREATE_FWID_FILES,2 3) | $(CLEAN_VARIANTFWIDIBY),)
+BUILD_VARBLDPRE += $(call iif,$(ENABLE_FWID), | $(call BUILD_CREATE_FWID_FILES,2 3) | $(BUILD_VARIANTFWIDIBY),)
+CLEAN_COREBLDPRE += $(call iif,$(ENABLE_FWID), | $(call CLEAN_CREATE_FWID_FILES,1) | $(CLEAN_COREFWIDIBY),)
+BUILD_COREBLDPRE += $(call iif,$(ENABLE_FWID), | $(call BUILD_CREATE_FWID_FILES,1) | $(BUILD_COREFWIDIBY),)
+BLDROM_OPTPROD += $(call iif,$(ENABLE_FWID),$(FWID_CORE_IBY),)
+# pass this only to var creation could not configure option for variant and core separately
+BLDROM_VAROBY += $(call iif,$(and $(call iif,$(SOS_VARIANT),1,),$(call iif,$(ENABLE_FWID),1,)),$(FWID_VARIANT_IBY),)
+###############################################################################
+###############################################################################
+###############################################################################
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_helpers.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Helium additional helpers for iMaker.
+###############################################################################
+
+# helper to remove the drive letter on the absolute path.
+# e.g $(call removedrive,Z:\epoc32\tools) => \epoc32\tools
+removedrive=$(shell perl -e "$$v = '$(strip $(subst \,/,$1))'; $$v =~ s/^.:\//\//; print $$v;")
+
+# Get current drive letter
+getdrive=$(shell perl -e "use Cwd; $$v = getcwd();  if ($$v =~ /^(.:)/) {print $$1;}")
+# update drive letter in the path
+updatedrive=$(shell perl -e "$$v = '$(strip $(subst \,/,$1))'; $$v =~ s/^.:/$$ARGV[0]/; print $$v;" $(call getdrive))
+
+hasdrive=$(shell perl -e "if ($$v =~ /^.:/) {print qq(1);} else {print qq(0);}")
+# Only update the drive if it doesn't exist
+# e.g. $(call addmissingdrive,\epoc32\tools) => Z:\epoc32\tools
+#      $(call addmissingdrive,K:\epoc32\tools) => K:\epoc32\tools even if the current drive is Z
+addmissingdrive=$(call iif,$(call hasdrive,$1),$1,$(call updatedrive,$1))
+
+###############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_localisation.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+ifeq ($(RD_LOCALISATION),1)
+#include image_conf_language_definitions.mk
+endif
+define to_language_names
+$(foreach lid,$(subst $(comma), ,$1),$(LANGUAGE_$(lid)))
+endef
+###############################################################################
+
+###############################################################################
+# Variation helpers
+#
+###############################################################################
+match_re=$(shell perl -e "print "1" if (\"$1\" =~ /$2/i);")
+# find_variant_path(variantid, toplevel_variant_directory)
+find_variant_path=$(foreach path,$(wildcard $2/*_*),$(if $(call match_re,$(path),_$1$$),$(path)/data $(path)))
+# find_variants_path(variantid_list, toplevel_variant_directory)
+find_variants_path=$(foreach variantid,$1,$(call find_variant_path,$(variantid),$2))
+###############################################################################
+
+
+
+###############################################################################
+# Simple languagepack automation
+###############################################################################
+ifeq ($(HELIUM_LOCALISATION),1)
+LP_AUTOMATION_OVERRIDE_IBY=$(ROFS2_NAME)_override_lp_automation.iby
+HELIUM_LANGUAGES_TXT=$(ROFS2_NAME)_languages.txt
+HELIUM_LANG_TXT=$(ROFS2_NAME)_lang.txt
+
+# Generate the language files based on LANGUAGE_IDS, DEFAULT_LANGUAGE_ID and LANGID
+#
+CLEAN_HELIUM_LANGFILES = echo | Deleting $(HELIUM_LANG_TXT)\n | del | $(HELIUM_LANG_TXT) | echo | Deleting $(HELIUM_LANGUAGES_TXT)\n |  del | $(HELIUM_LANGUAGES_TXT)
+BUILD_HELIUM_LANGFILES = \
+  echo   | Generating the language files for Variant image creation\n | \
+  writeu | $(HELIUM_LANG_TXT) | $(LANGID) | \
+  writeu | $(HELIUM_LANGUAGES_TXT) | \
+    $(call sstrip,$(foreach lang,$(LANGUAGE_IDS), \
+      $(lang)$(call select,$(lang),$(DEFAULT_LANGUAGE_ID),$(comma)d)\n)) | \
+    $(if $(findstring $(DEFAULT_LANGUAGE_ID),$(LANGUAGE_IDS)),, \
+      echo | Error: Default_language=$(DEFAULT_LANGUAGE_ID) was not found in the list of variant languages=$(LANGUAGE_IDS)\n)
+
+
+CLEAN_HELIUM_CREATE_LP_AUTOMATION_OVERRIDE_IBY = echo | Deleting $(LP_AUTOMATION_OVERRIDE_IBY)\n | del | $(LP_AUTOMATION_OVERRIDE_IBY)
+BUILD_HELIUM_CREATE_LP_AUTOMATION_OVERRIDE_IBY = \
+	echo  | Generating the $(LP_AUTOMATION_OVERRIDE_IBY)\n | \
+	write | $(LP_AUTOMATION_OVERRIDE_IBY) | // Generated iby for lp automation\n\
+	\n\#ifndef __GENERATED_LP_AUTOMATION_OVERRIDE_VERSION_IBY__\
+	\n\#define __GENERATED_LP_AUTOMATION_OVERRIDE_VERSION_IBY__\n\
+	\nROM_IMAGE[2] {\
+	\ndata-override=$(HELIUM_LANGUAGES_TXT)	resource\Bootdata\languages.txt\
+	\ndata-override=$(HELIUM_LANG_TXT) 	resource\versions\lang.txt\
+	$(foreach lang,$(LANGUAGE_IDS),\n\#include <Locales_$(lang).iby>)\
+	\n}\
+	\n\n\#endif // __GENERATED_LP_AUTOMATION_OVERRIDE_VERSION_IBY__\n
+
+
+
+# iMaker hook integration.
+BLR.ROFS2.PRE += HELIUM_LANGFILES HELIUM_CREATE_LP_AUTOMATION_OVERRIDE_IBY
+ROFS2_OBY += $(call iif,$(USE_OVERRIDE),$(LP_AUTOMATION_OVERRIDE_IBY),)
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_makeUPCT_core.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,49 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#################################################################################
+# MakeUPCT .fota.conf files iMaker integration
+#################################################################################
+
+MAKEUPCT_PLATFORM=
+UPCT_SOS_ISASW=
+UPCT_RAMSIZE=
+UPCT_SECTORSIZE=
+UPCT_NUMBER_BACKUP_BUFFERS=
+UPCT_EXTRA_PARAMETERS=
+MAKEUPCT_PACKAGE_SIZE_MAX=
+MAKEUPCT_SW_RELEASE_VERSION=
+
+CLEAN_MAKEUPCT_CONF_CORE= echo | Deleting MakeUPCT $(WORKDIR)/$(NAME) config file\n\
+	| del | $(WORKDIR)/$(NAME) 
+BUILD_MAKEUPCT_CONF_CORE=echo | Creating MakeUPCT $(WORKDIR)/$(NAME) config file\n \
+	| write | $(WORKDIR)/$(NAME) | SW_PLATFORM :=$(MAKEUPCT_PLATFORM)\n\
+	$(if $(UPCT_SOS_ISASW),SW_MCUSW :=$(UPCT_SOS_ISASW)\n)\
+	$(if $(UPCT_RAMSIZE),SW_APE_RAMSIZE :=$(UPCT_RAMSIZE)\n)\
+	$(if $(UPCT_SECTORSIZE),SW_APE_SIZE_OF_BACKUP_BUFFER :=$(UPCT_SECTORSIZE)\n)\
+	$(if $(UPCT_NUMBER_BACKUP_BUFFERS),SW_APE_NUMBER_BACKUP_BUFFERS :=$(UPCT_NUMBER_BACKUP_BUFFERS)\n)\
+	$(if $(KEYCERT_INDEX),SW_APE_KEY_CERTIFICATE_INDEX :=$(KEYCERT_INDEX)\n)\
+	$(if $(UPCT_APE_RAM_SIZE),SW_APE_RAMSIZE :=$(UPCT_APE_RAM_SIZE)\n)\
+	$(if $(UPCT_CMT_RAM_SIZE),SW_CMT_RAMSIZE :=$(UPCT_CMT_RAM_SIZE)\n)\
+	$(if $(UPCT_APE_SECTOR_SIZE),SW_APE_SIZE_OF_BACKUP_BUFFER :=$(UPCT_APE_SECTOR_SIZE)\n)\
+	$(if $(UPCT_CMT_SECTOR_SIZE),SW_CMT_SIZE_OF_BACKUP_BUFFER :=$(UPCT_CMT_SECTOR_SIZE)\n)\
+	$(if $(UPCT_APE_PRODUCT_KEY_INDEX),SW_APE_KEY_CERTIFICATE_INDEX :=$(UPCT_APE_PRODUCT_KEY_INDEX)\n)\
+	$(if $(UPCT_CMT_PRODUCT_KEY_INDEX),SW_CMT_KEY_CERTIFICATE_INDEX :=$(UPCT_CMT_PRODUCT_KEY_INDEX)\n)\
+	$(if $(UPCT_APE_NUMBER_BACKUP_BUFFERS),SW_APE_NUMBER_BACKUP_BUFFERS :=$(UPCT_APE_NUMBER_BACKUP_BUFFERS)\n)\
+	$(if $(UPCT_CMT_NUMBER_BACKUP_BUFFERS),SW_CMT_NUMBER_BACKUP_BUFFERS :=$(UPCT_CMT_NUMBER_BACKUP_BUFFERS)\n)\
+	SW_UPCT_PARAMS :=$(if $(UPCT_EXTRA_PARAMETERS), $(UPCT_EXTRA_PARAMETERS))$(if $(UPCT_GENERATOR_VERSION),\ndebug_force_generator $(UPCT_GENERATOR_VERSION))\n\
+	SW_LIMIT_UPDATE_PACKAGE_SIZE :=$(MAKEUPCT_PACKAGE_SIZE_MAX)\n\
+	SW_RELEASE_VERSION :=$(MAKEUPCT_SW_RELEASE_VERSION)\n\
+	SW_TYPE_DESIGNATOR :=$(PRODUCT_TYPE)\n
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_sw_string.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,99 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+###############################################################################
+###############################################################################
+# SW version string handling
+ENABLE_SW_STRING?=0
+CORE_SW_VERSION_STRING=v 0.00.0\\\n$(TODAY)\\\nRM-XXX
+MODEL_SW_VERSION_STRING=N00
+LP_SW_VERSION_STRING=v 0.00.0 (00)\\\n$(TODAY)\\\nRM-XXX
+CUSTOMER_SW_VERSION_STRING=to be defined
+TODAY:=$(shell perl -e "use POSIX qw(strftime); print strftime(\"%%d-%%m-%%y\", localtime());")
+
+# Internal names
+CORE_OVERRIDE_SW_VERSION_IBY=$(CORE_NAME)_override_core_version.iby
+MODEL_OVERRIDE_SW_VERSION_IBY=$(CORE_NAME)_override_model_version.iby
+LP_OVERRIDE_SW_VERSION_IBY=$(ROFS2_NAME)_override_lp_version.iby
+CUSTOMER_OVERRIDE_SW_VERSION_IBY=$(ROFS3_NAME)_override_customer_version.iby
+CORE_SW_VERSION_FILE=$(CORE_NAME)_sw.txt
+MODEL_SW_VERSION_FILE=$(CORE_NAME)_model.txt
+LP_SW_VERSION_FILE=$(ROFS2_NAME)_langsw.txt
+CUSTOMER_SW_VERSION_FILE=$(ROFS3_NAME)_customersw.txt
+
+
+CLEAN_CREATE_SW_VERSION_FILE = echo | Deleting $($(1)_SW_VERSION_FILE)\n | del | $($(1)_SW_VERSION_FILE)
+BUILD_CREATE_SW_VERSION_FILE = \
+  echo  | Generating file: $($(1)_SW_VERSION_FILE)\n | \
+  writeu | $($(1)_SW_VERSION_FILE) | $(call quote,$($(1)_SW_VERSION_STRING))
+
+CLEAN_CREATE_CORE_OVERRIDE_SW_VERSION_IBY = echo | Deleting $(CORE_OVERRIDE_SW_VERSION_IBY)\n | del | $(CORE_OVERRIDE_SW_VERSION_IBY)
+BUILD_CREATE_CORE_OVERRIDE_SW_VERSION_IBY = \
+    echo  | Generating the $(CORE_OVERRIDE_SW_VERSION_IBY)\n | \
+    write | $(CORE_OVERRIDE_SW_VERSION_IBY) | // Generated iby for sw string inclusion\n\
+    \n\#ifndef __GENERATED_CORE_OVERRIDE_VERSION_IBY__\
+    \n\#define __GENERATED_CORE_OVERRIDE_VERSION_IBY__\n\
+    \ndata-override=$(CORE_SW_VERSION_FILE)     resource\versions\sw.txt\
+    \n\n\#endif // __GENERATED_CORE_OVERRIDE_VERSION_IBY__\n
+
+CLEAN_CREATE_MODEL_OVERRIDE_SW_VERSION_IBY = echo | Deleting $(MODEL_OVERRIDE_SW_VERSION_IBY)\n | del | $(MODEL_OVERRIDE_SW_VERSION_IBY)
+BUILD_CREATE_MODEL_OVERRIDE_SW_VERSION_IBY = \
+    echo  | Generating the $(MODEL_OVERRIDE_SW_VERSION_IBY)\n | \
+    write | $(MODEL_OVERRIDE_SW_VERSION_IBY) | // Generated iby for sw string inclusion\n\
+    \n\#ifndef __GENERATED_MODEL_OVERRIDE_VERSION_IBY__\
+    \n\#define __GENERATED_MODEL_OVERRIDE_VERSION_IBY__\n\
+    \ndata-override=$(MODEL_SW_VERSION_FILE)    resource\versions\model.txt\
+    \n\n\#endif // __GENERATED_MODEL_OVERRIDE_VERSION_IBY__\n
+
+CLEAN_CREATE_LP_OVERRIDE_SW_VERSION_IBY = echo | Deleting $(LP_OVERRIDE_SW_VERSION_IBY)\n | del | $(LP_OVERRIDE_SW_VERSION_IBY)
+BUILD_CREATE_LP_OVERRIDE_SW_VERSION_IBY = \
+    echo  | Generating the $(LP_OVERRIDE_SW_VERSION_IBY)\n | \
+    write | $(LP_OVERRIDE_SW_VERSION_IBY) | // Generated iby for sw string inclusion\n\
+    \n\#ifndef __GENERATED_LP_OVERRIDE_VERSION_IBY__\
+    \n\#define __GENERATED_LP_OVERRIDE_VERSION_IBY__\n\
+    \nROM_IMAGE[2] data-override=$(LP_SW_VERSION_FILE)      resource\versions\langsw.txt\
+    \n\n\#endif // __GENERATED_LP_OVERRIDE_VERSION_IBY__\n
+
+CLEAN_CREATE_CUSTOMER_OVERRIDE_SW_VERSION_IBY = echo | Deleting $(CUSTOMER_OVERRIDE_SW_VERSION_IBY)\n | del | $(CUSTOMER_OVERRIDE_SW_VERSION_IBY)
+BUILD_CREATE_CUSTOMER_OVERRIDE_SW_VERSION_IBY = \
+    echo  | Generating the $(CUSTOMER_OVERRIDE_SW_VERSION_IBY)\n | \
+    write | $(CUSTOMER_OVERRIDE_SW_VERSION_IBY) | // Generated iby for sw string inclusion\n\
+    \n\#ifndef __GENERATED_CUSTOMER_OVERRIDE_VERSION_IBY__\
+    \n\#define __GENERATED_CUSTOMER_OVERRIDE_VERSION_IBY__\n\
+    \nROM_IMAGE[3] data-override=$(CUSTOMER_SW_VERSION_FILE)    resource\versions\customersw.txt\
+    \n\n\#endif // __GENERATED_CUSTOMER_OVERRIDE_VERSION_IBY__\n
+
+CLEAN_CORESWSTING  = $(call iif,$(ENABLE_SW_STRING), $(foreach type,CORE MODEL, | $(call CLEAN_CREATE_SW_VERSION_FILE,$(type)) | $(CLEAN_CREATE_$(type)_OVERRIDE_SW_VERSION_IBY)),)
+BUILD_CORESWSTING  = $(call iif,$(ENABLE_SW_STRING), $(foreach type,CORE MODEL, | $(call BUILD_CREATE_SW_VERSION_FILE,$(type)) | $(BUILD_CREATE_$(type)_OVERRIDE_SW_VERSION_IBY)),)
+CLEAN_ROFS2SWSTING = $(call iif,$(ENABLE_SW_STRING), $(foreach type,LP, | $(call CLEAN_CREATE_SW_VERSION_FILE,$(type)) | $(CLEAN_CREATE_$(type)_OVERRIDE_SW_VERSION_IBY)),)
+BUILD_ROFS2SWSTING = $(call iif,$(ENABLE_SW_STRING), $(foreach type,LP, | $(call BUILD_CREATE_SW_VERSION_FILE,$(type)) | $(BUILD_CREATE_$(type)_OVERRIDE_SW_VERSION_IBY)),)
+CLEAN_ROFS3SWSTING = $(call iif,$(ENABLE_SW_STRING), $(foreach type,CUSTOMER, | $(call CLEAN_CREATE_SW_VERSION_FILE,$(type)) | $(CLEAN_CREATE_$(type)_OVERRIDE_SW_VERSION_IBY)),)
+BUILD_ROFS3SWSTING = $(call iif,$(ENABLE_SW_STRING), $(foreach type,CUSTOMER, | $(call BUILD_CREATE_SW_VERSION_FILE,$(type)) | $(BUILD_CREATE_$(type)_OVERRIDE_SW_VERSION_IBY)),)
+
+CLEAN_COREPRE += $(CLEAN_CORESWSTING)
+BUILD_COREPRE += $(BUILD_CORESWSTING)
+CLEAN_ROFS2PRE += $(CLEAN_ROFS2SWSTING)
+BUILD_ROFS2PRE += $(BUILD_ROFS2SWSTING)
+CLEAN_ROFS3PRE += $(CLEAN_ROFS3SWSTING)
+BUILD_ROFS3PRE += $(BUILD_ROFS3SWSTING)
+
+CORE_OBY += $(if $(filter-out 0,$(ENABLE_SW_STRING)),$(CORE_OVERRIDE_SW_VERSION_IBY) $(MODEL_OVERRIDE_SW_VERSION_IBY),)
+ROFS2_OBY += $(if $(filter-out 0,$(ENABLE_SW_STRING)),$(LP_OVERRIDE_SW_VERSION_IBY),)
+ROFS3_OBY += $(if $(filter-out 0,$(ENABLE_SW_STRING)),$(CUSTOMER_OVERRIDE_SW_VERSION_IBY),)
+###############################################################################
+###############################################################################
+###############################################################################
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_uda.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,77 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Helium additional support for UDA creation.
+###############################################################################
+# Customisable variables.
+HELIUM_UDA=0
+UDA_CONTENT_DIRS=
+UDA_CONTENT_SIS=
+UDA_EXCLUDE_FILE=$(UDA_CPDIR)/private/100059C9/excludelist.txt
+UDA_SW_STRING_FILE="$(UDA_CPDIR)/Resource/Versions/User Content Package_UDA.txt"
+UDA_SW_STRING=my version
+
+7ZIP_TOOL=$(call iif,$(USE_UNIX),7za,7za.exe)
+INTERPRETSIS_TOOL=/epoc32/tools/$(call iif,$(USE_UNIX),interpretsis,interpretsis.exe)
+INTERPRETSIS_HAL_CONFIG=
+
+###############################################################################
+# 
+helium_grab_content=$(shell perl -e "use File::Find; use File::Spec; File::Find::find(\&wanted, $$ARGV[0]); sub wanted(){my $$name = File::Spec->abs2rel($$File::Find::name, $$ARGV[0]); $$name =~ s/ /?/g; print $$name.' ';}" $1)
+helium_abs2rel=$(shell perl -e "use File::Spec; print File::Spec->abs2rel($$ARGV[0], $$ARGV[1]);" "$1" "$2")
+###############################################################################
+#
+ifeq ($(HELIUM_UDA),1)
+
+CLEAN_CREATE_UDA_DIR = echo | Deleting $(UDA_CPDIR)\n | del | $(UDA_CPDIR)
+BUILD_CREATE_UDA_DIR = echo | Creating $(UDA_CPDIR)\n | mkdir | $(UDA_CPDIR)
+
+CLEAN_UDA_GATHER_CONTENT = 
+BUILD_UDA_GATHER_CONTENT = $(foreach content,$(UDA_CONTENT_DIRS),\
+	| echo | Adding $(content)/*.zip\n | cmd | if exist $(content)/*.zip unzip -o $(content)/*.zip -d $(UDA_CPDIR)\
+	| echo | Adding $(content)/*.rar\n | cmd | if exist $(content)/*.rar $(7ZIP_TOOL) x -y -o$(UDA_CPDIR) $(content)/*.rar)
+
+###############################################################################
+# interpretsis integration
+CLEAN_UDA_GATHER_SIS_CONTENT = 
+BUILD_UDA_GATHER_SIS_CONTENT = $(foreach content,$(UDA_CONTENT_SIS), | echo | Adding $(content)\n | cmd | \
+ $(INTERPRETSIS_TOOL) -z / -c $(UDA_CPDIR) $(if $(INTERPRETSIS_HAL_CONFIG), -i $(INTERPRETSIS_HAL_CONFIG)) -s $(content))
+
+
+# using xcopy.
+#cmd | xcopy /E /R /F /Y $(subst /,\,$(content)) $(subst /,\,$(UDA_CPDIR)))
+
+###############################################################################
+#
+CLEAN_UDA_CREATE_EXCLUDE_FILE =
+BUILD_UDA_CREATE_EXCLUDE_FILE = echo | Creating $(UDA_EXCLUDE_FILE)\n \
+ 	| mkdir | $(dir $(UDA_EXCLUDE_FILE)) \
+ 	| write | $(UDA_EXCLUDE_FILE) | | \
+ 	| write | $(UDA_EXCLUDE_FILE) \
+ 	| $(call peval,use File::Find; my $$append= ""; File::Find::find(\&wanted, $(call pquote,$(UDA_CPDIR))); \
+ 	    return $$append; sub wanted(){$$append .= "C:\\\".File::Spec->abs2rel($$File::Find::name, $(call pquote,$(UDA_CPDIR)))."\n";})
+ 	  
+###############################################################################
+#
+CLEAN_UDA_CREATE_SW_STRING =
+BUILD_UDA_CREATE_SW_STRING = echo | Creating $(UDA_SW_STRING_FILE)\n \
+ | mkdir | $(dir "$(UDA_SW_STRING_FILE)") | writeu | $(UDA_SW_STRING_FILE) | $(call quote,$(UDA_SW_STRING))
+
+
+# Prepending Helium UDA specific functionalities
+SOS.UDA.STEPS := CREATE_UDA_DIR UDA_GATHER_SIS_CONTENT UDA_GATHER_CONTENT UDA_CREATE_SW_STRING UDA_CREATE_EXCLUDE_FILE $(SOS.UDA.STEPS)
+endif
+###############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/helium_upct.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,150 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#################################################################################
+# UPCT iMaker integration
+#################################################################################
+UPCT_OLD_CORE_FPSX=
+UPCT_NEW_CORE_FPSX=
+UPCT_OLD_ROFS2_FPSX=
+UPCT_NEW_ROFS2_FPSX=
+UPCT_OLD_ROFS3_FPSX=
+UPCT_NEW_ROFS3_FPSX=
+UPCT_NAME=$(UPDATE_PACKAGE_DIR)/$(NAME).swupd
+UPLOAD_XML=$(UPDATE_PACKAGE_DIR)/$(NAME).xml
+UPCT_CONF=$(WORKDIR_UNIX)/$(NAME)_upct_conf.txt
+UPCT_CONF_WIN=$(WORKDIR)/$(NAME)_upct_conf.txt
+UPCT_PACKINFO=$(WORKDIR_UNIX)/$(NAME)_updpack_info.txt
+UPCT_KEEPLOGS=1
+UPCT_TEMP_FOLDER=$(WORKDIR_UNIX)
+UPCT_TOOL_DIR=$(ITOOL_DIR)/upct_release
+UPCT_TOOL=$(UPCT_TOOL_DIR)/$(call iif,$(USE_UNIX),linux_upct.exe,upct.exe)
+UPCT_GENERATOR_DIR=$(UPCT_TOOL_DIR)/generator_tools
+UPCT_SIGNATURE_TYPE=$(if $(subst prd,,$(TYPE)),,production)$(if $(subst rnd,,$(TYPE)),,rnd)$(if $(subst subcon,,$(TYPE)),,rnd)
+SUBCON_SIGNATURE_FILE=
+E2F_SIGNCONF=-s saisec002 -p 6003
+MAKEUPCT_SIGNATURE_TYPE=$(if $(subst prd,,$(TYPE)),,prd_update_package_signing)$(if $(subst rnd,,$(TYPE)),,rnd)$(if $(subst subcon,,$(TYPE)),,rnd)
+
+#################################################################################
+CLEAN_CREATE_UPCT_CONF=echo | Deleting $(UPCT_CONF)\n\
+                            | del | $(UPCT_CONF_WIN)
+BUILD_CREATE_UPCT_CONF=echo | Creating $(UPCT_CONF_WIN)\n\
+	| mkdir | $(dir $(UPCT_CONF_WIN) )|\
+	| mkdir | $(dir $(UPCT_NAME) )|\
+	| write | $(UPCT_CONF_WIN) | ; Generated configuration for $(PRODUCT_NAME)\
+	\nnumber_of_asics $(UPCT_ASCIS)\
+	$(if $(UPCT_RAMSIZE),\nram_size $(UPCT_RAMSIZE))\
+	$(if $(UPCT_SECTORSIZE),\nsector_size $(UPCT_SECTORSIZE))\
+	$(if $(UPCT_BACKUPBLOCK),\nbackup_blocks $(UPCT_BACKUPBLOCK))\
+	$(if $(UPCT_CMT_RAM_SIZE),\ncmt_ram_size $(UPCT_CMT_RAM_SIZE))\
+	$(if $(UPCT_CMT_SECTOR_SIZE),\ncmt_sector_size $(UPCT_CMT_SECTOR_SIZE))\
+	$(if $(UPCT_CMT_BACKUP_BLOCKS),\ncmt_backup_blocks $(UPCT_CMT_BACKUP_BLOCKS))\
+	$(if $(UPCT_APE_RAM_SIZE),\nape_ram_size $(UPCT_APE_RAM_SIZE))\
+	$(if $(UPCT_APE_SECTOR_SIZE),\nape_sector_size $(UPCT_APE_SECTOR_SIZE))\
+	$(if $(UPCT_APE_BACKUP_BLOCKS),\nape_backup_blocks $(UPCT_APE_BACKUP_BLOCKS))\
+	$(if $(UPCT_CODESTART_MCUSW),\ncodestart_MCUSW $(UPCT_CODESTART_MCUSW))\
+	$(if $(UPCT_APE_PRODUCT_KEY_INDEX),\nape_product_key_index $(UPCT_APE_PRODUCT_KEY_INDEX))\
+	$(if $(UPCT_CMT_PRODUCT_KEY_INDEX),\ncmt_product_key_index $(UPCT_CMT_PRODUCT_KEY_INDEX))\
+	$(if $(UPCT_SOS_ISASW),\ncodestart_SOS*ISASW $(UPCT_SOS_ISASW))\
+	$(if $(KEYCERT_INDEX),\nproduct_key_index $(KEYCERT_INDEX))\
+	\n\nupdpack_signature $(UPCT_SIGNATURE_TYPE)\
+	\n$(if $(SUBCON_SIGNATURE_FILE),\subcontractor_private_keys_file $(SUBCON_SIGNATURE_FILE))\
+	\n$(if $(UPCT_OLD_CORE_FPSX),\nold_core_fpsx $(UPCT_OLD_CORE_FPSX))\
+	$(if $(UPCT_OLD_ROFS2_FPSX),\nold_variant_fpsx $(UPCT_OLD_ROFS2_FPSX))\
+	$(if $(UPCT_OLD_ROFS3_FPSX),\nold_op_variant_fpsx $(UPCT_OLD_ROFS3_FPSX))\
+	$(if $(UPCT_NEW_CORE_FPSX),\nnew_core_fpsx $(UPCT_NEW_CORE_FPSX))\
+	$(if $(UPCT_NEW_ROFS2_FPSX),\nnew_variant_fpsx $(UPCT_NEW_ROFS2_FPSX))\
+	$(if $(UPCT_NEW_ROFS3_FPSX),\nnew_op_variant_fpsx $(UPCT_NEW_ROFS3_FPSX))\
+	\n\nelf2flash $(E2F_TOOL)\
+	\nsign_parameters "$(E2F_SIGNCONF)" \
+	\ngenerator_tools_path $(UPCT_GENERATOR_DIR)\
+	\ntemporary_folder $(UPCT_TEMP_FOLDER)\
+	\nupdate_package $(UPCT_NAME)\
+	\n\nflag_leave_build_log_files $(UPCT_KEEPLOGS)\
+	$(if $(UPCT_PACKINFO),\nflag_dump_info $(UPCT_PACKINFO))\
+	$(if $(UPCT_GENERATOR_VERSION),\ndebug_force_generator $(UPCT_GENERATOR_VERSION))\
+	$(if $(UPCT_EXTRA_PARAMETERS),\n$(UPCT_EXTRA_PARAMETERS)) \
+	\n; End of configuration
+	
+BUILD_CREATE_FOX_UPLOAD=echo | Creating upolad XML $(UPLOAD_XML)\n\
+	| write | $(UPLOAD_XML) | ; 
+
+BUILD_CLEAN_FOX_UPLOAD=echo | Deleting $(UPLOAD_XML)\n\
+                            | del | $(UPLOAD_XML)
+
+CLEAN_CALL_UPCT=
+BUILD_CALL_UPCT=echo | Creating delta package\n\
+    | cmd | $(UPCT_TOOL) $(UPCT_CONF)
+    
+
+CLEAN_MAKEUPCT_FOTA_CNF= echo | Deleting MakeUPCT $(MAKEUPCT_FOTA_CNF_FILE) config file\n\
+	| del | $(MAKEUPCT_FOTA_CNF_FILE) 
+BUILD_MAKEUPCT_FOTA_CNF=echo | Creating MakeUPCT $(MAKEUPCT_FOTA_CNF_FILE) config file\n\
+	| write | $(MAKEUPCT_FOTA_CNF_FILE) | ; Generated configuration for $(PRODUCT_NAME)\n \
+	\nSW_PLATFORM :=$(MAKEUPCT_PLATFORM)  \
+	\nUSER_DEFINED_FLASH_DIR :=$(MAKEUPCT_BASE_DIR) \
+	\nUSER_DEFINED_NEW_SW_FLASH_DIR :=$(MAKEUPCT_BASE_DIR) \
+	\nACT_PRODUCT :=$(PRODUCT_NAME) \
+	\nALL_UPDATE_PACKAGES := old_sw_$(MAKEUPCT_OLD_SW_VERSION)_new_sw_$(MAKEUPCT_NEW_SW_VERSION)_type_designator_$(PRODUCT_TYPE) \
+	\nSW_TYPE :=$(TYPE) \
+	\nSIGNATURE_ID :=$(MAKEUPCT_SIGNATURE_TYPE) \
+	\nSTATTISTIC_REQUIRED :=NO \
+	\nVARIANTS :=all_variants \
+	\nLINUX_DIR :=$(UPCT_TEMP_FOLDER)/wa \
+	\nACT_MODEL :=$(MODEL_SW_VERSION_STRING) \
+	\nSYMBOL_FILE_USED :=YES \
+	\nUPCT_EXTRA_PARAMS := $(if $(UPCT_EXTRA_PARAMETERS), $(UPCT_EXTRA_PARAMETERS))  $(if $(UPCT_GENERATOR_VERSION),\ndebug_force_generator $(UPCT_GENERATOR_VERSION))\
+
+UPCT_STEPS = CREATE_UPCT_CONF CALL_UPCT
+#################################################################################
+
+#fota-delta: ;@$(call IMAKER,$(UPCT_STEPS))
+
+
+
+#################################################################################
+#################################################################################
+#################################################################################
+#################################################################################
+# UPCT configuration builder.
+#################################################################################
+
+
+UPCT_CONF_DIR=$(PRODUCT_DIR)/upct
+ALL_UPCT_CONFS=$(wildcard $(UPCT_CONF_DIR)/*.mk)
+
+%-create-upct-config:
+	@echo Building $*
+	-@imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f /epoc32/rom/config/helium_upct.mk -f $* step-CREATE_UPCT_CONF
+
+create-upct-configs: $(foreach config,$(ALL_UPCT_CONFS),$(config)-create-upct-config)
+
+#################################################################################
+# MakeUPCT configuration builder.
+#################################################################################
+
+MAKEUPCT_CONF_DIR=$(PRODUCT_DIR)/MakeUPCT
+ALL_MAKEUPCT_CONFS=$(wildcard $(MAKEUPCT_CONF_DIR)/*.mk)
+
+%-create-makeupct-config:
+	@echo Building $*
+	-@imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f /epoc32/rom/config/helium_upct.mk -f $* step-MAKEUPCT_FOTA_CNF
+
+create-makeupct-configs: $(foreach config,$(ALL_MAKEUPCT_CONFS),$(config)-create-makeupct-config)
+
+
+.PHONY: create-upct-configs %-create-upct-config create-makeupct-configs %-create-makeupct-config
+#################################################################################
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/unittest/test_helium_features.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+################################################
+# Unit-testing Helium Makefile functionalities.
+# + helium_features.mk
+#   + version string.
+################################################
+
+################################################
+# Helper target
+test_sw_version: TEST_IMAKER=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f /epoc32/rom/config/helium_features.mk
+test_sw_version:
+	$(TEST_IMAKER) step-CORESWSTING
+	$(TEST_IMAKER) step-ROFS2SWSTING
+	$(TEST_IMAKER) step-ROFS3SWSTING
+	
+	
+################################################
+# test_autotraces
+test_autotraces: TEST_IMAKER=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f /epoc32/rom/config/helium_features.mk
+test_autotraces: CORE_UDEBFILE_LIST=test.dll test2.exe
+test_autotraces:
+	$(TEST_IMAKER) step-AUTOTRACES
+
+################################################
+# test_COREPRE
+test_COREPRE:
+	@echo COREPRE ... $(if $(BUILD_COREPRE),ok,FAIL)
+
+################################################
+# Main target
+unittest: test_COREPRE test_sw_version test_autotraces
+
+
+################################################
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/features/unittest/test_helpers.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+################################################
+# Unit-testing Helium Makefile functionalities.
+################################################
+
+# Including Helium specific additional features.
+include helium_features.mk
+
+################################################
+# Helper target
+test_helpers:
+	@echo test_helpers
+	@echo foo$(call removedrive,Z:\output\logs)bar
+	@echo Remove drive from a path that contains a drive ... $(if $(subst /output/logs,,$(call removedrive,Z:\output\logs)),FAIL,ok)
+	@echo Remove drive from a path that does not contain a drive ... $(if $(subst /output/logs,,$(call removedrive,\output\logs)),FAIL,ok)
+	
+
+################################################
+# Main target
+unittest: test_helpers
+
+
+################################################
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/core.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Core template
+###############################################################################
+
+core${core.id}${image.type}: TYPE=${image.type}
+core${core.id}${image.type}: UI_PLATFORM=${ui.platform}
+core${core.id}${image.type}: USE_FOTI=$(and $(call iif,${use.foti},1,),$(call iif,$(subst rnd,,$(subst prd,,$(TYPE))),,1))
+core${core.id}${image.type}: USE_FOTA=$(and $(call iif,${use.fota},1,),$(call iif,$(subst rnd,,$(subst prd,,$(TYPE))),,1))
+core${core.id}${image.type}: PREBUILD_STEPS=$(call iif,$(USE_FOTI),foti,) $(call iif,$(USE_FOTA),fota,)
+core${core.id}${image.type}: NAME=${core.image.name}
+core${core.id}${image.type}: WORKDIR=$(call removedrive,${core.output.dir})
+core${core.id}${image.type}: CORE_UDEBFILE_LIST=$(subst $(comma), ,${mytraces.binaries})
+core${core.id}${image.type}: SOSCORE_VERSION=${core.version.info}
+core${core.id}${image.type}: SOSROFS1_VERSION=${rofs1.version.info}
+core${core.id}${image.type}: USE_VERGEN=1
+core${core.id}${image.type}: CORE_FWID=${rofs1.fwid.id}
+core${core.id}${image.type}: CORE_FWIDVER=${rofs1.fwid.version}
+core${core.id}${image.type}: ENABLE_SW_STRING=1
+core${core.id}${image.type}: CORE_SW_VERSION_STRING=${core.template}
+core${core.id}${image.type}: MODEL_SW_VERSION_STRING=${model.template}
+core${core.id}${image.type}: ENABLE_ROMSYMBOL=${enable.romsymbol}
+core${core.id}${image.type}: OPTION_LIST=TYPE HWID USE_FOTI USE_FOTA NAME WORKDIR CORE_UDEBFILE_LIST SOSCORE_VERSION SOSROFS1_VERSION USE_VERGEN CORE_FWID CORE_FWIDVER ENABLE_SW_STRING CORE_SW_VERSION_STRING MODEL_SW_VERSION_STRING
+core${core.id}${image.type}: unzip_western
+	@echo === Stage=core${core.id}${image.type} == core${core.id}${image.type}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo PRODUCT              : $(PRODUCT_NAME)
+	@echo TYPE                 : $(TYPE)
+	@echo NAME                 : $(NAME)
+	@echo WORKDIR              : $(WORKDIR)
+	@echo CORE_UDEBFILE_LIST   : $(CORE_UDEBFILE_LIST)
+	@echo BLDROM_OPTION        : $(BLDROM_OPTION)
+	@echo USE_FOTI             : $(USE_FOTI)
+	@echo USE_FOTA             : $(USE_FOTA)
+	@echo PREBUILD_STEPS       : $(PREBUILD_STEPS)
+	@echo SOSCORE_VERSION      : $(SOSCORE_VERSION)
+	@echo SOSROFS1_VERSION     : $(SOSROFS1_VERSION)	
+	@echo ENABLE_ROMSYMBOL     : $(ENABLE_ROMSYMBOL)
+	@echo ===========================================
+	-@$(if $(strip $(PREBUILD_STEPS)),@echo $(CALL_IMAKER_PLATFORM) $(PREBUILD_STEPS),)
+	-@$(if $(strip $(PREBUILD_STEPS)),$(CALL_IMAKER_PLATFORM) $(PREBUILD_STEPS),)
+	@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) core
+	-@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) core
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+
+$(call add_help,core${core.id}${image.type},t,Generates the core '${core.id}' (${image.type}))
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/customer.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Customer template
+###############################################################################
+
+customer${customer.id}${image.type}: CUSTOMERID=${customer.id}
+customer${customer.id}${image.type}: TYPE=${image.type}
+customer${customer.id}${image.type}: NAME=${customer.image.name}
+customer${customer.id}${image.type}: UI_PLATFORM=${ui.platform}
+customer${customer.id}${image.type}: WORKDIR=$(call removedrive,${customer.output.dir})
+customer${customer.id}${image.type}: VARIATION_DIRS=$(call find_variant_path,$(CUSTOMERID),$(call updatedrive,${variation.dir}))
+customer${customer.id}${image.type}: CUSTOM_VARIANT_OPT= -DCUSTOMERID=$(CUSTOMERID) $(foreach dir,$(VARIATION_DIRS),-I$(dir)) -DSECTION -DUSE_MULTIROFS ${rommake.flags}
+customer${customer.id}${image.type}: SOSROFS3_VERSION=${rofs3.version.info}
+customer${customer.id}${image.type}: USE_VERGEN=1
+customer${customer.id}${image.type}: ROFS3_FWID=${rofs3.fwid.id}
+customer${customer.id}${image.type}: ROFS3_FWIDVER=${rofs3.fwid.version}
+customer${customer.id}${image.type}: ENABLE_SW_STRING=1
+customer${customer.id}${image.type}: CUSTOMER_SW_VERSION=${customer.template}
+customer${customer.id}${image.type}: OPTION_LIST=TYPE NAME WORKDIR CUSTOM_VARIANT_OPT SOSROFS3_VERSION USE_VERGEN ROFS3_FWID ROFS3_FWIDVER ENABLE_SW_STRING CUSTOMER_SW_VERSION
+customer${customer.id}${image.type}: unzip_${variation}
+	@echo === Stage=customer${customer.id}${image.type} == customer${customer.id}${image.type}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo PRODUCT             : $(PRODUCT_NAME)
+	@echo TYPE                : $(TYPE)
+	@echo NAME                : $(NAME)
+	@echo WORKDIR             : $(WORKDIR)
+	@echo OVERRIDEOBY         : $(OVERRIDEOBY)
+	@echo CUSTOMERID          : $(CUSTOMERID)
+	@echo CUSTOM_VARIANT_OPT  : $(CUSTOM_VARIANT_OPT)
+	@echo SOSROFS3_VERSION    : $(SOSROFS3_VERSION)
+	@echo CUSTOMER_SW_VERSION : $(CUSTOMER_SW_VERSION)
+	@echo ===========================================
+	@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) rofs3
+	-@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) rofs3
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+$(call add_help,customer${customer.id}${image.type},t,Generates the customer variant '${customer.id}' (${image.type}))
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/eraseuda.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Erase UDA template
+###############################################################################
+
+eraseuda${image.type}: WORKDIR=$(call removedrive,${eraseuda.output.dir})
+eraseuda${image.type}: NAME=${eraseuda.image.name}
+eraseuda${image.type}: TYPE=${image.type}
+eraseuda${image.type}: UI_PLATFORM=${ui.platform}
+eraseuda${image.type}: OPTION_LIST=WORKDIR NAME TYPE
+eraseuda${image.type}:
+	@echo === Stage=mceraseuda == mceraseuda
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo PRODUCT : $(PRODUCT_NAME)
+	@echo WORKDIR : $(WORKDIR)
+	@echo NAME    : $(NAME)
+	@echo TYPE    : $(TYPE)
+	@echo ===========================================
+	@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) udaerase
+	-@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) udaerase
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+ 
+$(call add_help,eraseuda${image.type},t,Generates the uda erase (${image.type}))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/flash.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,85 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# Flash template
+###############################################################################
+
+flash${flash.id}${image.type}: TYPE=${image.type}
+flash${flash.id}${image.type}: HWID=${rommake.hwid}
+flash${flash.id}${image.type}: PLATSECBIN=${use.platsecbin}
+flash${flash.id}${image.type}: UI_PLATFORM=${ui.platform}
+flash${flash.id}${image.type}: USE_FOTI=$(and $(call iif,${use.foti},1,),$(call iif,$(subst rnd,,$(subst prd,,$(TYPE))),,1))
+flash${flash.id}${image.type}: USE_FOTA=$(and $(call iif,${use.fota},1,),$(call iif,$(subst rnd,,$(subst prd,,$(TYPE))),,1))
+flash${flash.id}${image.type}: PREBUILD_STEPS=$(call iif,$(USE_FOTI),foti,) $(call iif,$(USE_FOTA),fota,)
+flash${flash.id}${image.type}: CUSTOM_CORE_OBY=${image.master.iby}
+flash${flash.id}${image.type}: MOBILE_CRASH_SENDER=${enable.mobile.crash.sender}
+flash${flash.id}${image.type}: NAME=${flash.image.name}
+flash${flash.id}${image.type}: WORKDIR=$(call removedrive,${flash.output.dir})
+flash${flash.id}${image.type}: CORE_UDEBFILE_LIST=$(subst $(comma), ,${mytraces.binaries})
+flash${flash.id}${image.type}: CUSTOM_CORE_OPT=${rommake.flags}
+flash${flash.id}${image.type}: SOSCORE_VERSION=${core.version.info}
+flash${flash.id}${image.type}: SOSROFS1_VERSION=${rofs1.version.info}
+flash${flash.id}${image.type}: SOSROFS2_VERSION=${rofs2.version.info}
+flash${flash.id}${image.type}: SOSROFS3_VERSION=${rofs3.version.info}
+flash${flash.id}${image.type}: USE_VERGEN=1
+flash${flash.id}${image.type}: CORE_FWID=${rofs1.fwid.id}
+flash${flash.id}${image.type}: CORE_FWIDVER=${rofs1.fwid.version}
+flash${flash.id}${image.type}: ROFS2_FWID=${rofs2.fwid.id}
+flash${flash.id}${image.type}: ROFS2_FWIDVER=${rofs2.fwid.version}
+flash${flash.id}${image.type}: ROFS3_FWID=${rofs3.fwid.id}
+flash${flash.id}${image.type}: ROFS3_FWIDVER=${rofs3.fwid.version}
+flash${flash.id}${image.type}: ENABLE_SW_STRING=1
+flash${flash.id}${image.type}: CORE_SW_VERSION_STRING=${core.template}
+flash${flash.id}${image.type}: MODEL_SW_VERSION_STRING=${model.template}
+flash${flash.id}${image.type}: LP_SW_VERSION_STRING=${languagepack.template}
+flash${flash.id}${image.type}: CUSTOMER_SW_VERSION_STRING=${customer.template}
+flash${flash.id}${image.type}: USE_ROMSYMGEN=${enable.romsymbol}
+flash${flash.id}${image.type}: OPTION_LIST=TYPE HWID USE_FOTI USE_FOTA CUSTOM_CORE_OBY NAME WORKDIR CORE_UDEBFILE_LIST CUSTOM_CORE_OPT MOBILE_CRASH_SENDER SOSCORE_VERSION  SOSROFS1_VERSION SOSROFS2_VERSION SOSROFS3_VERSION CORE_FWID CORE_FWIDVER ROFS2_FWID ROFS2_FWIDVER ROFS3_FWID ROFS3_FWIDVER ENABLE_SW_STRING CORE_SW_VERSION_STRING MODEL_SW_VERSION_STRING LP_SW_VERSION_STRING CUSTOMER_SW_VERSION_STRING USE_ROMSYMGEN USE_VERGEN 
+flash${flash.id}${image.type}: unzip_western
+	@echo === Stage=flash${flash.id}${image.type} == flash${flash.id}${image.type}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo PRODUCT             : $(PRODUCT_NAME)
+	@echo TYPE                : $(TYPE)
+	@echo NAME                : $(NAME)
+	@echo USE_OVERRIDE        : $(USE_OVERRIDE)
+	@echo OVERRIDEOBY         : $(OVERRIDEOBY)
+	@echo CORE_OBY            : $(CORE_OBY)
+	@echo BLDROM_OPTION       : $(BLDROM_OPTION)
+	@echo MOBILE_CRASH_SENDER : $(MOBILE_CRASH_SENDER)
+	@echo WORKDIR             : $(WORKDIR)
+	@echo TRACES              : $(call iif,$(USE_UDEB),ON,OFF)
+	@echo UDEBFILE_LIST       : $(UDEBFILE_LIST)
+	@echo USE_FOTI            : $(call iif,$(USE_FOTI),ON,OFF)
+	@echo USE_FOTA            : $(call iif,$(USE_FOTA),ON,OFF)
+	@echo PREBUILD_STEPS      : $(PREBUILD_STEPS)
+	@echo SOSCORE_VERSION     : $(SOSCORE_VERSION)
+	@echo SOSROFS1_VERSION    : $(SOSROFS1_VERSION)	
+	@echo SOSROFS2_VERSION    : $(SOSROFS2_VERSION)
+	@echo SOSROFS3_VERSION    : $(SOSROFS3_VERSION)
+	@echo ENABLE_ROMSYMBOL    : $(ENABLE_ROMSYMBOL)
+	@echo ===========================================
+	-@$(if $(strip $(PREBUILD_STEPS)),@echo $(CALL_IMAKER_PLATFORM) $(PREBUILD_STEPS),)
+	-@$(if $(strip $(PREBUILD_STEPS)),$(CALL_IMAKER_PLATFORM) $(PREBUILD_STEPS),)
+	-@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash
+	-@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+
+
+$(call add_help,flash${flash.id}${image.type},t,Generates the flash '${flash.id}' (${image.type}))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/flash_config.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,10 @@
+#####################################################################
+# Flash config files templates
+#####################################################################
+
+flash_config${languagepack.id}${customer.id}${uda.id}${memorycard.id}${massmemory.id}${image.type}:TYPE=${image.type}
+flash_config${languagepack.id}${customer.id}${uda.id}${memorycard.id}${massmemory.id}${image.type}:TEMPLATE=${flash.config.publish.dir}/${flash.config.name}
+flash_config${languagepack.id}${customer.id}${uda.id}${memorycard.id}${massmemory.id}${image.type}:EVALUATED_FILE_NAME=$(TEMPLATE)
+flash_config${languagepack.id}${customer.id}${uda.id}${memorycard.id}${massmemory.id}${image.type}:
+	$(call IMAKER,EVAL_VARIABLES)
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/languagepack.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# languagepack template
+###############################################################################
+
+languagepack${languagepack.id}${image.type}: TYPE=${image.type}
+languagepack${languagepack.id}${image.type}: NAME=${languagepack.image.name}
+languagepack${languagepack.id}${image.type}: WORKDIR=$(call removedrive,${languagepack.output.dir})
+languagepack${languagepack.id}${image.type}: LPID=${languagepack.id}
+languagepack${languagepack.id}${image.type}: UI_PLATFORM=${ui.platform}
+languagepack${languagepack.id}${image.type}: VARIATION_DIRS=$(call find_variant_path,$(LPID),$(call updatedrive,${variation.dir}))
+languagepack${languagepack.id}${image.type}: CUSTOM_VARIANT_OPT=-DLPID=$(LPID)  $(foreach dir,$(VARIATION_DIRS),-I$(dir)) ${rommake.flags}
+languagepack${languagepack.id}${image.type}: SOSROFS2_VERSION=${rofs2.version.info}
+languagepack${languagepack.id}${image.type}: USE_VERGEN=1
+languagepack${languagepack.id}${image.type}: ROFS2_FWID=${rofs2.fwid.id}
+languagepack${languagepack.id}${image.type}: ROFS2_FWIDVER=${rofs2.fwid.version}
+languagepack${languagepack.id}${image.type}: ENABLE_SW_STRING=1
+languagepack${languagepack.id}${image.type}: LP_SW_VERSION_STRING=${languagepack.template}
+languagepack${languagepack.id}${image.type}: RD_LOCALISATION=0
+languagepack${languagepack.id}${image.type}: HELIUM_LOCALISATION=${enable.helium.lpa}
+languagepack${languagepack.id}${image.type}: DEFAULT_LANGUAGE_ID=$(strip ${default})
+languagepack${languagepack.id}${image.type}: LANGUAGE_IDS=$(subst $(comma), ,$(strip ${languages}))
+languagepack${languagepack.id}${image.type}: OPTION_LIST=TYPE NAME WORKDIR CUSTOM_VARIANT_OPT SOSROFS2_VERSION USE_VERGEN ROFS2_FWID ROFS2_FWIDVER RD_LOCALISATION HELIUM_LOCALISATION DEFAULT_LANGUAGE_ID LANGUAGE_IDS ENABLE_SW_STRING LP_SW_VERSION_STRING
+languagepack${languagepack.id}${image.type}: unzip_${variation}
+	@echo === Stage=languagepack${languagepack.id}${image.type} == languagepack${languagepack.id}${image.type}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo PRODUCT              : $(PRODUCT_NAME)
+	@echo TYPE                 : $(TYPE)
+	@echo NAME                 : $(NAME)
+	@echo LPID                 : $(LPID)
+	@echo CUSTOM_VARIANT_OPT   : $(CUSTOM_VARIANT_OPT)	
+	@echo WORKDIR              : $(WORKDIR)
+	@echo SOSROFS2_VERSION     : $(SOSROFS2_VERSION)
+	@echo LP_SW_VERSION_STRING : $(LP_SW_VERSION_STRING)
+	@echo ===========================================
+	@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) rofs2
+	-@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) rofs2
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+
+$(call add_help,languagepack${languagepack.id}${image.type},t,Generates the languagepack '${languagepack.id}' (${image.type}))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/main.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# iMaker templates
+###############################################################################
+
+# defining helium in the build area if not set by the environment
+HELIUM_HOME?=\mc\helium
+
+# using winimage from helium delivery.
+WINIMAGE_TOOL:=$(if $(strip ${winimage.tool}),${winimage.tool},$(WINIMAGE_TOOL))
+
+CALL_IMAKER_PLATFORM=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f $(E32ROMCFG)/helium_features.mk
+CALL_IMAKER=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) $(if $(UI_PLATFORM),-u$(UI_PLATFORM)) -f $(E32ROMCFG)/helium_features.mk
+CALL_TARGET=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f $(E32ROMCFG)/$(COREPLAT_NAME)/$(PRODUCT_NAME)/${output.makefile.filename}
+
+transfer_option=$(foreach option,$1,$(if $($(option)),"$(option)=$($(option))",))
+
+
+#
+# Variation handling
+#
+LOCALISATION_SWITCH_REGION=1
+unzip_%:
+	@echo $(call iif,$(LOCALISATION_SWITCH_REGION),Unzipping variation $*...,Region is not switched to $*!)
+	$(call iif,$(LOCALISATION_SWITCH_REGION),-@unzip -o -qq -d $(subst \,/,$(EPOCROOT)) /output/build_area/localised/delta_$*_package.zip,)
+
+
+include /epoc32/rom/config/helium_features.mk
+###############################################################################
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/makeupct_core.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+include $(E32ROMCFG)/$(COREPLAT_NAME)/fota_config.mk
+
+makeupctcore${core.id}${image.type}: TYPE=${image.type}
+makeupctcore${core.id}${image.type}: NAME=${core.image.name}.core.fota.conf
+makeupctcore${core.id}${image.type}: WORKDIR=$(call removedrive,${core.output.dir})
+makeupctcore${core.id}${image.type}: MAKEUPCT_PACKAGE_SIZE_MAX=15000000
+makeupctcore${core.id}${image.type}: MAKEUPCT_SW_RELEASE_VERSION=${core.version.info}
+makeupctcore${core.id}${image.type}: OPTION_LIST=TYPE NAME WORKDIR MAKEUPCT_PACKAGE_SIZE_MAX MAKEUPCT_SW_RELEASE_VERSION MAKEUPCT_PLATFORM UPCT_NUMBER_BACKUP_BUFFERS UPCT_SOS_ISASW UPCT_RAMSIZE UPCT_SECTORSIZE UPCT_ASCIS KEYCERT_INDEX UPCT_EXTRA_PARAMETERS MAKEUPCT_PACKAGE_SIZE_MAX MAKEUPCT_SW_RELEASE_VERSION PRODUCT_TYPE UPCT_CMT_RAM_SIZE UPCT_CMT_SECTOR_SIZE UPCT_CMT_BACKUP_BLOCKS UPCT_APE_RAM_SIZE UPCT_APE_SECTOR_SIZE UPCT_APE_BACKUP_BLOCKS UPCT_CODESTART_MCUSW UPCT_APE_PRODUCT_KEY_INDEX UPCT_CMT_PRODUCT_KEY_INDEX
+
+makeupctcore${core.id}${image.type}:
+	@echo === Stage=makeupctcore${core.id}${image.type} == makeupctcore${core.id}${image.type}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo TYPE: $(TYPE)
+	@echo NAME: $(NAME)
+	@echo WORKDIR: $(WORKDIR)
+	@echo MAKEUPCT_SW_RELEASE_VERSION: $(MAKEUPCT_SW_RELEASE_VERSION)
+	@echo ===========================================
+	@echo $(CALL_IMAKER_PLATFORM) $(call transfer_option,$(OPTION_LIST)) step-MAKEUPCT_CONF_CORE
+	-@$(CALL_IMAKER_PLATFORM) $(call transfer_option,$(OPTION_LIST)) step-MAKEUPCT_CONF_CORE
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+	
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/template.config.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : template.config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<flash_config>
+    <image_set>
+        <product>${rommake.product.name}</product>
+        <type_designator>${version.product.type}</type_designator>
+        <image_type>${image.type}</image_type>
+        <sw_version>${core.version.info}</sw_version>
+        <image type="core" path="${core.image.path}" name="${core.image.name}.core.fpsx" />
+        <image type="language" id="${languagepack.id}" path="${languagepack.image.path}" name="${languagepack.image.name}.language.fpsx" />
+        <image type="customer" id="${customer.id}" path="${customer.image.path}" name="${customer.image.name}.customer.fpsx" build="${customer.image.version.name}"/>
+        <image type="uda" id="${uda.id}" path="${uda.image.path}" name="${uda.image.name}.uda.fpsx"/>
+        <image type="massmemory" id="${massmemory.id}" path="${massmemory.image.path}" name="${massmemory.image.name}.massmemory.fpsx"/>
+        <image type="memorycard" id="${memorycard.id}" path="${memorycard.image.path}" name="${memorycard.image.name}.memorycard.fpsx"/>
+        <fwid>${fota.fwid}</fwid>
+        <description>Vanilla ${description}</description>
+        <date>${release.date}</date>
+    </image_set>
+</flash_config>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/uda.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# UDA template (Not tested yet!)
+###############################################################################
+
+uda${uda.id}: WORKDIR=$(call removedrive,${uda.output.dir})
+uda${uda.id}: NAME=${uda.image.name}
+uda${uda.id}: UDA_DIR=$(call removedrive,${uda.content.dir})
+uda${uda.id}: UI_PLATFORM=${ui.platform}
+uda${uda.id}: OPTION_LIST=WORKDIR NAME UDA_DIR
+uda${uda.id}:
+	@echo === Stage=uda${uda.id} == uda${uda.id}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo UDA_CONTENTDIR: $(UDA_CONTENTDIR)
+	@echo WORKNAME: $(WORKNAME)
+	@echo ===========================================
+	@echo $(CALL_IMAKER_PLATFORM) $(call transfer_option,$(OPTION_LIST)) uda
+	-@$(CALL_IMAKER_PLATFORM) $(call transfer_option,$(OPTION_LIST)) uda
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+	
+$(call add_help,uda${uda.id},t,Generates the UDA '${uda.id}')
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/generic_templates/vt_uda.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+###############################################################################
+# UDA template
+###############################################################################
+
+uda${uda.id}: WORKDIR=$(call removedrive,${uda.output.dir})
+uda${uda.id}: NAME=${uda.image.name}
+uda${uda.id}: HELIUM_UDA=1
+uda${uda.id}: UDA_CONTENT_DIRS=$(foreach content,$(subst $(comma), ,${uda.content.subdirs}),$(call removedrive,${uda.content.dir}/$(content)))
+uda${uda.id}: UDA_CONTENT_SIS=$(foreach content,$(subst $(comma), ,${uda.content.sis}),$(call removedrive,$(content)))
+uda${uda.id}: UDA_SW_STRING=${uda.template}
+uda${uda.id}: INTERPRETSIS_TOOL=${interpretsis.tool}
+uda${uda.id}: INTERPRETSIS_HAL_CONFIG=${interpretsis.hal.config}
+uda${uda.id}: OPTION_LIST=WORKDIR NAME HELIUM_UDA UDA_CONTENT_DIRS UDA_SW_STRING UDA_CONTENT_SIS WINIMAGE_TOOL INTERPRETSIS_TOOL INTERPRETSIS_HAL_CONFIG
+uda${uda.id}:
+	@echo === Stage=uda${uda.id} == uda${uda.id}
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"
+	@echo =========== Configuration =================
+	@echo UDA_CONTENTDIR: $(UDA_CONTENTDIR)
+	@echo WORKNAME: $(WORKNAME)
+	@echo ===========================================
+	@echo $(CALL_IMAKER_PLATFORM) $(call transfer_option,$(OPTION_LIST)) uda
+	-@$(CALL_IMAKER_PLATFORM) $(call transfer_option,$(OPTION_LIST)) uda
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/imaker.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : imaker.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="rombuild.imaker" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        ROM image creation using iMaker (future implementation).
+    </description>
+
+    <!-- Defining the default rom image creation templates. -->
+    <property name="imaker.fmpp.makefile" location="${helium.dir}/tools/common/templates/imaker/build_imaker_roms_signing.mk.ftl"/>
+    <property name="imaker.fmpp.ant" location="${helium.dir}/tools/common/templates/imaker/build_imaker_roms.ant.xml.ftl"/>
+    
+    
+    <!-- The iMaker task. -->
+    <macrodef name="imaker" uri="http://www.nokia.com/helium">
+        <element name="config"/>
+        <attribute name="engine" default="ebs"/>
+        <attribute name="name" default=""/>
+        <attribute name="signal" default="true"/>
+        <sequential>
+            <hlm:tempRecordStartMacro name="${build.id}@{name}.roms.log"/>
+            <hlm:imaker2tdd property="internal.imaker.tdd" dir="${build.drive}/">
+                <config/>
+            </hlm:imaker2tdd>
+            <echo>
+Generated TDD:
+${internal.imaker.tdd}
+            </echo>
+            <mkdir dir="${build.log.dir}"/>
+            <if>
+                <matches pattern="ec(-helium)?" string="@{engine}"/>
+                <then>
+                    <fmpp sourceFile="${imaker.fmpp.makefile}"
+                        outputFile="${temp.build.dir}/build_imaker_roms@{name}.mk">
+                        <data expandProperties="yes">
+                            data: ${internal.imaker.tdd}
+                            ant: antProperties()
+                        </data>
+                    </fmpp>
+                    <exec executable="${ec.emake}" dir="${build.drive}/">
+                        <arg value="--emake-build-label=${build.id}@{name}-ROMS"/>
+                        <arg value="--emake-class=${ec.build.class}"/>
+                        <arg value="--emake-annofile=${build.log.dir}\${build.id}@{name}.ROMS.emake.anno.xml"/>
+                        <arg value="--emake-autodepend=1"/>
+                        <arg value="--emake-annodetail=basic,history,file,waiting"/>                            
+                        <arg line="-f ${temp.build.dir}/build_imaker_roms@{name}.mk all"/>
+                    </exec>
+                </then>
+                <else>
+                    <fmpp sourceFile="${imaker.fmpp.ant}"
+                        outputFile="${temp.build.dir}/build_imaker_roms@{name}.ant.xml">
+                        <data expandProperties="yes">
+                            data: ${internal.imaker.tdd}
+                            ant: antProperties()
+                        </data>
+                    </fmpp>
+                    <ant antfile="${temp.build.dir}/build_imaker_roms@{name}.ant.xml" target="all" />
+                </else>
+            </if>
+            
+            <hlm:tempRecordStopMacro name="${build.id}@{name}.roms.log" filterref="filterset.imaker"/>
+            <!-- Todo: metadata: insert assertions for metadata parsing here -->
+            <if>
+                <istrue value="@{signal}"/>
+                <then>
+                    <hlm:signalMacro logfile="${build.log.dir}/${build.id}@{name}.roms.log" 
+                        signal.input="rombuildSignalInput" />
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <!--
+        This task implements the transformation of iMaker introspection into a TDD for FMPP.
+        Syntax will be like:
+        <pre>
+        <hlm:imaker2tdd property="internal.imaker.tdd">
+            <imakerconfigurationset>
+                <imakerconfiguration>
+                    <makefileset>
+                        <include name="**/PRODUCT/*ui.mk"/>
+                    </makefileset>
+                    <categoryset>
+                        <include name="build"/>
+                        <include name="release"/>
+                        <include name="test"/>
+                    </categoryset>
+                </imakerconfiguration>
+            </imakerconfigurationset>
+        </hlm:imaker2tdd>                 
+        </pre>
+    -->
+    
+    <scriptdef name="imaker2tdd" language="jython" uri="http://www.nokia.com/helium">
+        <element name="imakerconfigurationset" classname="com.nokia.ant.types.imaker.ConfigurationSet"/>
+        <attribute name="property"/>
+        <attribute name="file"/>
+        <attribute name="dir"/>
+        <![CDATA[
+import imaker
+import traceback
+import ant
+import logging
+logging.getLogger('imaker.api').addHandler(ant.AntHandler(self))
+try:
+    imaker.ant_task_configuration(project, self, elements, attributes)
+except Exception, e:
+    traceback.print_exc()
+    # Propagate the exception
+    raise e
+]]>
+    </scriptdef>
+
+    <!--
+       This task merges all files mentioned in the fileset and output them in filename output file. 
+    -->
+    <scriptdef name="mergeConfigXML" language="beanshell"  uri="http://www.nokia.com/helium">
+        <element name="fileset" type="fileset"/>
+        <attribute name="filename"/>
+<![CDATA[
+import java.io.File;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.Document;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+Document document = DocumentHelper.createDocument();
+Element root = document.addElement("build");
+Element rootConfig = root.addElement( "config" );
+rootConfig.addAttribute("abstract", "true");
+rootConfig.addAttribute("name", "ee-roms");
+
+filesets = elements.get("fileset");
+for (i = 0; i < filesets.size(); ++i) {
+        ds = filesets.get(i).getDirectoryScanner(project);
+        ds.scan();
+        String[] files = ds.getIncludedFiles();
+        for (j = 0; j < files.length ; ++j) {
+           romconf = new File(ds.getBasedir(), files[j]);
+           self.log("Adding " + romconf + ".");
+           SAXReader reader = new SAXReader();
+           Document document = reader.read(romconf);
+           Node node = document.selectSingleNode("//build/config");
+           rootConfig.add(node.detach());
+        }
+}
+// lets write to a file
+OutputFormat format = OutputFormat.createPrettyPrint();
+XMLWriter writer = new XMLWriter(new FileWriter(attributes.get("filename")), format);
+writer.write( document );
+writer.close();
+]]>
+    </scriptdef>
+    
+    <!--
+       This target is an helper to recompose the rom image configuration using the output of iMaker.
+    -->
+    <target name="imaker-merge-rom-xml">
+        <mkdir dir="${temp.build.dir}"/>
+        <property name="rombuild.config.file.parsed" location="${build.output.dir}/rom_config.xml.parsed" />
+        <hlm:mergeConfigXML filename="${rombuild.config.file.parsed}">
+            <fileset dir="${release.images.dir}" includes="**/*.iconfig.xml"/>    
+        </hlm:mergeConfigXML>
+    </target>
+
+    <!-- Future official target for building roms using iMaker.
+         To configure that target you have to define an imakerconfigurationset type identified by
+         'imaker.rom.config'.
+    -->
+    <target name="build-roms" depends="rombuild-imaker-create-buildinfo">
+        <property name="imaker.engine" value="${build.system}" />
+        <property name="imaker.rom.name" value=""/>
+        <hlm:imaker engine="${imaker.engine}" name="${imaker.rom.name}">
+            <config>
+                <imakerconfigurationset refid="imaker.rom.config"/>
+            </config>
+        </hlm:imaker>
+        <if>
+            <istrue value="${blocks.enabled}" />
+            <then>
+                <mkdir dir="${blocks.config.dir}" />
+                <exec executable="python">
+                    <arg value="-m"/>
+                    <arg value="packager.cli"/>
+                    <arg value="--epocroot=${build.drive}/" />
+                    <arg value="--config=${blocks.config.dir}" />
+                    <arg value="--datasource=imaker-romdir" />
+                    <arg value="-Dname=roms" />
+                    <arg value="-Dversion=1" />
+                    <arg value="-Ddir=${release.images.dir}" />
+                    <arg value="--updateData" />
+                </exec>
+            </then>
+        </if>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/rombuild.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,489 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : rombuild.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="rombuild" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        ROM image creation using iMaker.
+        Flash config file generation.
+    </description>
+    <import file="./trace_images/tracebuild.ant.xml" />
+    <import file="imaker.ant.xml" />
+
+    <!-- should be overriden - default configuration -->
+    <!-- <property name="rombuild.makefile.name" value="mc_imaker_conf.mk" /> -->
+    <property name="imaker.command" location="${build.drive}\epoc32\tools\imaker.cmd" />
+    <property name="ee.makefile.target" value="ee_roms" />
+    <property name="subcon.makefile.target" value="subcon_roms" />
+    <property name="trace.makefile.target" value="trace_roms" />
+    <property name="ee_roms.log.file" value="${build.log.dir}/${build.id}_ee_roms.log" />
+    <property name="trace.log.file" value="${build.log.dir}/${build.id}_trace_roms.log" />
+    <property name="subcon.log.file" value="${build.log.dir}/${build.id}_subcon_roms.log" />
+
+    <!-- Properties for image-creation target which is being used by IDOs -->
+    <property name="image_creation.copyto" value="${build.output.dir}/images" />
+    <property name="image_creation.drive" value="${build.drive}" />
+    <!-- Property for variant-image-creation -->
+    <property name="variant.image.targetpath" value="${build.output.dir}/variant_images" />
+
+    <!-- That macro runs iMaker using product the configuration generated by Helium. -->
+    <macrodef name="rombuildImakerMacro" uri="http://www.nokia.com/helium">
+        <attribute name="product" />
+        <attribute name="target" />
+        <sequential>
+            <var name="rom.product.path" unset="true" />
+            <if>
+                <istrue value="${rombuild.using.var}" />
+                <then>
+                    <script language="jython" setbeans="false">
+                        <![CDATA[
+import imaker
+import os
+if project.getProperty('build.drive') == None :
+    raise Exception("'build.drive' property is not defined")
+os.chdir(project.getProperty('build.drive') + os.sep)
+project.setProperty('rom.product.path', imaker.get_product_dir(r'@{product}'))
+                        ]]>
+                    </script>
+                </then>
+                <else>
+                    <exec executable="python" outputproperty="rom.product.path" dir="${build.drive}/" failonerror="${failonerror}">
+                        <arg line="${helium.dir}/tools/localisation/get_product_path.py @{product}" />
+                    </exec>
+                    <exec executable="python" outputproperty="rom.product.platform" dir="${build.drive}/" failonerror="${failonerror}">
+                        <arg line="${helium.dir}/tools/localisation/get_product_platform.py @{product}" />
+                    </exec>
+                </else>
+            </if>
+            <if>
+                <and>
+                    <equals arg1="${build.system}" arg2="ec-helium" />
+                    <isset property="rom.dryrun" />
+                </and>
+                <then>
+                    <echo message="target to run @{target}-dryrun" />
+                    <exec executable="${imaker.command}" dir="${build.drive}/" output="${build.drive}/dryrun_out.txt" append="true" failonerror="${failonerror}">
+                        <arg line="-p@{product} -f /epoc32/rom/${rom.product.path}/${rombuild.makefile.name}" />
+                        <arg value="@{target}-dryrun" />
+                    </exec>
+                </then>
+                <else>
+                    <if>
+                        <istrue value="${rombuild.using.var}" />
+                        <then>
+                            <exec executable="${imaker.command}" dir="${build.drive}/" failonerror="${failonerror}">
+                                <arg line="-p@{product} -f /epoc32/rom/${rom.product.path}/${rombuild.makefile.name}" />
+                                <arg value="@{target}" />
+                            </exec>
+                        </then>
+                        <else>
+                            <exec executable="${imaker.command}" dir="${build.drive}/" failonerror="${failonerror}">
+                                <arg line="-p@{product} -c${rom.product.platform} -f /epoc32/rom/${rom.product.path}/${rombuild.makefile.name}" />
+                                <arg value="@{target}" />
+                            </exec>
+                        </else>
+                    </if>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+
+
+    <!-- Create engineering english image using ImageCreation.pl. -->
+    <target name="image-creation" if="image_creation.copyto">
+        <tstamp>
+            <format property="image.archive.date" pattern="ddmmyy'_'HHmmss" />
+        </tstamp>
+
+        <move todir="${build.drive}/archives/images/${image.archive.date}" failonerror="false">
+            <fileset dir="${build.output.dir}/images/" />
+        </move>
+        <mkdir dir="${build.output.dir}/images" />
+        <exec executable="perl" dir="${build.drive}/" failonerror="true">
+            <arg value="${helium.dir}/tools/compile/ImageCreation.pl" />
+            <arg value="-copyto" />
+            <arg value="${image_creation.copyto}" />
+            <arg value="-MyTraces" />
+            <arg value="${image_creation.MyTraces}" />
+            <arg value="-Drive" />
+            <arg value="${image_creation.drive}" />
+            <arg value="-product" />
+            <arg value="${image_creation.product}" />
+            <arg value="-type" />
+            <arg value="${image_creation.type}" />
+        </exec>
+    </target>
+
+    <!-- Create variant image using Creator.pl tools.
+    -->
+    <target name="variant-image-creation" if="variant.image.hw">
+        <tstamp>
+            <format property="image.archive.date" pattern="ddmmyy'_'HHmmss" />
+        </tstamp>
+
+        <move todir="${build.drive}/archives/variant_images/${image.archive.date}" failonerror="false">
+            <fileset dir="${build.output.dir}/variant_images/" />
+        </move>
+        <mkdir dir="${build.output.dir}/variant_images" />
+        <exec executable="perl" dir="${build.drive}/" failonerror="true">
+            <arg value="${build.drive}/Creator.pl" />
+            <arg value="-hw" />
+            <arg value="${variant.image.hw}" />
+            <arg value="-lang" />
+            <arg value="${variant.image.lang}" />
+            <arg value="-core" />
+            <arg value="${variant.image.core}" />
+            <arg value="-variant" />
+            <arg value="${variant.image.variantcode}" />
+            <arg value="-type" />
+            <arg value="${variant.image.type}" />
+            <arg value="-sw" />
+            <arg value="${variant.image.sw}" />
+            <arg value="-targetpath" />
+            <arg value="${variant.image.targetpath}" />
+        </exec>
+    </target>
+
+    <!-- This targets call the image-creation target to be reexecuted in a build.
+        <deprecated>Should be done diferrently, e.g use imaker in new </deprecated>
+    -->
+    <target name="rerun-image-creation">
+        <runtarget target="image-creation" />
+    </target>
+
+    <!-- This targets call the variant-image-creation target to be reexecuted in a build.
+        <deprecated>Should be done diferrently, e.g use imaker in new </deprecated>
+    -->
+    <target name="rerun-variant-image-creation">
+        <runtarget target="variant-image-creation" />
+    </target>
+
+    <!-- Preparing rom image configuration expanding properties, flattening the xinclude stucture
+             and finally expanding properties again. 
+    -->
+    <target name="rombuild-prepare-input" depends="init-build-area">
+        <property name="rombuild.config.file.parsed" location="${build.output.dir}/rom_config.xml.parsed" />
+        <copy file="${rombuild.config.file}" tofile="${rombuild.config.file.parsed}.x1" overwrite="true">
+            <filterchain>
+                <expandproperties />
+                <tokenfilter>
+                    <replacestring from="http://www.w3.org/2003/XInclude" to="http://www.w3.org/2001/XInclude" />
+                </tokenfilter>
+            </filterchain>
+        </copy>
+        <!--<xcluder in="${rombuild.config.file.parsed}.x1" out="${rombuild.config.file.parsed}.xinclude" />-->
+        <xinclude file="${rombuild.config.file.parsed}.x1" tofile="${rombuild.config.file.parsed}.xinclude" />
+        <xmltask source="${rombuild.config.file.parsed}.xinclude" dest="${rombuild.config.file.parsed}.x2">
+            <attr path="//*" attr="xml:base" remove="true" />
+        </xmltask>
+        <copy file="${rombuild.config.file.parsed}.x2" tofile="${rombuild.config.file.parsed}" overwrite="true">
+            <filterchain>
+                <expandproperties />
+            </filterchain>
+        </copy>
+    </target>
+
+
+    <!-- Creates ee-images
+     -->
+    <target name="ee-roms" depends="rombuild-create-makefile" unless="no.ncp">
+        <hlm:startSpecificLogMacro name="${ee_roms.log.file}" />
+        <hlm:preECImakerMacro />
+        <for list="${product.list}" delimiter="," param="product.name">
+            <sequential>
+                <hlm:rombuildImakerMacro product="@{product.name}" target="${ee.makefile.target}" />
+            </sequential>
+        </for>
+        <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
+        <hlm:stopSpecificLogMacro name="${ee_roms.log.file}" />
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${ee_roms.log.file}" />
+                <metadatafilterset refid="filterset.ee.roms" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_ee_roms.log" />
+        <!-- Todo: metadata: assertions for metadata parsing here -->
+        <hlm:publishMacro />
+    </target>
+
+
+    <!-- Creates subcon certified rom images with imaker tool -->
+    <target name="subcon-roms" depends="rombuild-create-makefile" unless="no.ncp">
+        <hlm:startSpecificLogMacro name="${subcon.log.file}" />
+        <mkdir dir="${subcon.build.drive}/output/development_flash_images/engineering_english/${product.name}/subcon" />
+        <hlm:preECImakerMacro />
+        <for list="${product.list}" delimiter="," param="product.name">
+            <sequential>
+                <hlm:rombuildImakerMacro product="@{product.name}" target="${subcon.makefile.target}" />
+            </sequential>
+        </for>
+        <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
+        <hlm:stopSpecificLogMacro name="${subcon.log.file}" />
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file= "${subcon.log.file}"/>
+                <metadatafilterset refid="filterset.subcon.roms" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_subcon_roms.log" />
+        <!-- Todo: metadata: insert assertions for metadata parsing here -->
+        <hlm:publishMacro />
+    </target>
+
+    <!-- Private: Internal target to export iMaker Helium additions. -->
+    <target name="rombuild-export-features">
+        <copy todir="${build.drive}/epoc32/rom/config" overwrite="true">
+            <fileset dir="${helium.dir}/tools/rombuild/features" casesensitive="false">
+                <include name="*.mk" />
+                <include name="unittest/*.mk" />
+            </fileset>
+        </copy>
+    </target>
+
+    <!-- iMaker related targets -->
+    <target name="rombuild-create-makefile" depends="rombuild-export-features,rombuild-prepare-input">
+        <!-- Just generate the makefile for all the product available in product list. -->
+        <hlm:python>
+import os
+
+import configuration
+import rom
+
+os.chdir(r'${build.drive}/')
+configBuilder = configuration.NestedConfigurationBuilder(open(r'${rombuild.config.file.parsed}', 'r'))
+configSet = configBuilder.getConfiguration()
+for product in r'${product.list}'.split(','):
+    builder = rom.IMakerRomBuilder(configSet, product, (r'${rombuild.using.var}'.lower() == "true"))
+    builder.build()
+        </hlm:python>
+    </target>
+
+
+
+
+    <!-- Creates trace rom images -->
+    <target name="trace-roms" depends="rombuild-create-makefile" unless="no.ncp">
+        <hlm:startSpecificLogMacro name="${trace.log.file}" />
+        <hlm:preECImakerMacro />
+        <for list="${product.list}" delimiter="," param="product.name">
+            <sequential>
+                <hlm:rombuildImakerMacro product="@{product.name}" target="${trace.makefile.target}" />
+            </sequential>
+        </for>
+        <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
+        <hlm:stopSpecificLogMacro name="${trace.log.file}" />
+        <!-- Todo: Make sure that logfilter is added to the filterset -->
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${trace.log.file}" />
+                <metadatafilterset refid="filterset.trace.rom" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_trace_roms.log" />
+        <!-- Todo: metadata: insert assertions for metadata parsing here -->
+        <hlm:publishMacro />
+    </target>
+
+    <!-- Single product configuration support
+        <deprecated>Please consider using new iMaker integration.</deprecated>
+    -->
+    <target name="ee-roms-product" depends="rombuild-create-makefile" unless="no.ncp">
+        <sequential>
+            <hlm:preECImakerMacro />
+            <hlm:rombuildImakerMacro product="${product.name}" target="${ee.makefile.target}" />
+            <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
+        </sequential>
+    </target>
+
+    <!-- Used for parallel rom image creation using dry run approach -->
+    <macrodef name="preECImakerMacro" uri="http://www.nokia.com/helium">
+        <sequential>
+            <delete file="${build.drive}/dryrun_out.txt" failonerror="false" />
+        </sequential>
+    </macrodef>
+
+    <!-- Target to run imaker in parallel rom image creation for S60 3.2 based products -->
+    <macrodef name="ecImakerMacro" uri="http://www.nokia.com/helium">
+        <attribute name="makefile.target" />
+        <sequential>
+            <if>
+                <and>
+                    <equals arg1="${build.system}" arg2="ec-helium" />
+                    <isset property="rom.dryrun" />
+                </and>
+                <then>
+                    <exec executable="python" dir="${build.drive}/" failonerror="${failonerror}">
+                        <arg line="${helium.dir}/tools/rombuild/dryrun_parser.py ${build.drive}/dryrun_out.txt ${build.drive}/@{makefile.target}.make @{makefile.target}" />
+                    </exec>
+                    <antcall target="compile-ec-helium">
+                        <param name="skip.compile-ec-patch" value="yes" />
+                        <param name="sysdef.configuration" value="@{makefile.target}" />
+                        <param name="ec.makefile.file" location="${build.drive}/@{makefile.target}.make" />
+                    </antcall>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <!--Private: Internal iMaker macro. -->
+    <macrodef name="internalImakerMacro" uri="http://www.nokia.com/helium">
+        <attribute name="product" />
+        <attribute name="target" />
+        <attribute name="makefile" default="" />
+        <attribute name="cmd" default="" />
+        <sequential>
+            <var name="rom.product.path" unset="true" />
+            <script language="jython" setbeans="false">
+                <![CDATA[
+import imaker
+import os
+os.chdir(project.getProperty('build.drive') + os.sep)
+project.setProperty('rom.product.path', imaker.get_product_dir(r'@{product}'))
+              ]]>
+            </script>
+            <if>
+                <equals arg1="@{makefile}" arg2="" />
+                <then>
+                    <var name="var.makefile" value="" />
+                </then>
+                <else>
+                    <var name="var.makefile" value="-f ${rom.product.path}/@{makefile}" />
+                </else>
+            </if>
+            <exec executable="${imaker.command}" dir="${build.drive}" failonerror="${failonerror}">
+                <arg line="-p@{product} @{cmd}" />
+                <arg line="${var.makefile}" />
+                <arg line="@{cmd}" />
+                <arg value="@{target}" />
+            </exec>
+        </sequential>
+    </macrodef>
+
+    <!-- Timestamp used in flash config file generation -->
+    <tstamp>
+        <format property="fota.release.date" pattern="dd-MM-yy" />
+    </tstamp>
+
+    <!-- Create flash configration files -->
+    <target name="flash-config-file" if="flash.config.enabled">
+        <runtarget target="rombuild-prepare-input" />
+        <runtarget target="rombuild-create-makefile" />
+
+        <property name="flash.config.makefile.target" value="flash_config" />
+        <property name="flash.config.makefile.name" value="mc_flash_config.mk" />
+        <hlm:python>
+import configuration
+import flash_config
+import os
+os.chdir(r'${build.drive}/')
+configBuilder = configuration.NestedConfigurationBuilder(open(r'${rombuild.config.file.parsed}', 'r'))
+configSet = configBuilder.getConfiguration()
+for product in r'${product.list}'.split(','):
+    writer = flash_config.FlashConfigurationWriter(configSet, product)
+    writer.write()
+    </hlm:python>
+        <for list="${product.list}" delimiter="," param="product.name">
+            <sequential>
+                <hlm:internalImakerMacro product="@{product.name}" target="${flash.config.makefile.target}" makefile="${flash.config.makefile.name}" />
+            </sequential>
+        </for>
+    </target>
+
+    <!-- The target ido-iby-copy copies the iby files from ido.src.root to ido.romtree
+        Two properties that define from where the files are copied from and whre to. Defauls are 
+        for "ido.src.tree" default value is "${build.drive}${ido.src.root}"  
+        for "ido.romtree" default value is "${build.drive}${env.EPOCROOT}/epoc32/rom/include"  .
+         The IDO should define the ido.src.root and ido.romtree to override the defauls  
+         <deprecated>IDO must now move to the new sysdef structure and use ido-copy-iby.</deprecated>
+    -->
+    <target name="ido-iby-copy">
+        <property name="ido.src.tree" value="${build.drive}${ido.src.root}" />
+        <property name="ido.romtree" value="${build.drive}${env.EPOCROOT}/epoc32/rom/include" />
+        <echo>New files</echo>
+        <!-- the files are in rom folder -->
+        <copy todir="${ido.romtree}" verbose="true" flatten="true">
+            <fileset dir="${ido.src.tree}">
+                <exclude name="**/internal/**" />
+                <exclude name="**/tsrc/**" />
+                <include name="**/rom/*.iby" />
+            </fileset>
+        </copy>
+        <echo>Old files</echo>
+
+        <copy todir="${ido.romtree}" verbose="true" flatten="true" overwrite="true">
+            <fileset dir="${ido.src.tree}">
+                <exclude name="**/internal/**" />
+                <exclude name="**/tsrc/**" />
+                <include name="**/rom/*.iby" />
+            </fileset>
+        </copy>
+    </target>
+
+
+    <!-- Two properties that define from where the files are copied and what platform is used.
+         The IDO should define the ido.src.root and ido.cenrep.platform 
+         The properties ido.cenrep.root and ido.cenrep.target mey be overriden by the user.
+         <deprecated>IDO must now move to the new sysdef structure and use ido-create-cenrep.</deprecated>
+     -->
+    <target name="ido-cenrep" if="ido.cenrep.platform">
+        <property name="ido.src.tree" value="${build.drive}${ido.src.root}" />
+        <property name="ido.cenrep.root" value="${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep" />
+        <property name="ido.cenrep.target" value="${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9" />
+        <echo>Generating cenrep files</echo>
+
+        <copy todir="${ido.cenrep.root}" verbose="true" flatten="true">
+            <fileset dir="${ido.src.tree}">
+                <include name="**/cenrep/keys_*.xls" />
+            </fileset>
+        </copy>
+
+        <!-- in cenrep dir execut 'generate_cenrep_inifile.pl -r %s -d .' % platform -->
+        <exec executable="perl" dir="${ido.cenrep.root}" failonerror="true">
+            <arg value="${ido.cenrep.root}/generate_cenrep_inifile.pl" />
+            <arg value="-r" />
+            <arg value="${ido.cenrep.platform}" />
+            <arg value="-d" />
+            <arg value="." />
+        </exec>
+        <!-- Copy generated files to target path -->
+        <copy todir="${ido.cenrep.target}" verbose="true" flatten="true">
+            <fileset dir="${ido.cenrep.root}">
+                <include name="????????.txt" />
+            </fileset>
+        </copy>
+
+    </target>
+
+    <!--
+        Implement a solution to create build information for imaker.
+    -->
+    <target name="rombuild-imaker-create-buildinfo">
+        <property name="rombuild.buildinfo.template" location="${helium.dir}/tools/common/templates/imaker/image_conf_buildinfo.mk.ftl" />
+        <property name="rombuild.buildinfo.output" location="${build.drive}${env.EPOCROOT}epoc32/rom/config/image_conf_buildinfo.mk" />
+        <fmpp sourceFile="${rombuild.buildinfo.template}" outputFile="${rombuild.buildinfo.output}">
+            <data expandProperties="yes">
+                ant: antProperties()
+            </data>
+        </fmpp>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/trace_images/mytraces_general.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,197 @@
+commondsy.dll
+dataport.csy
+genericnif.nif
+nokiadsy.dll
+customapiext.dll
+dnd.exe
+nifman.dll
+umtsapi.dll
+tcpip6.prt
+ssl.dll
+securesocket.dll
+tlsprovider.dll
+swtlstokentypeplugin.dll
+esock.dll
+c32.dll
+c32start.exe
+csd.agt
+netcon.dll
+inhook6.dll
+insock.dll
+ipsec6.prt
+ipsecpolparser.dll
+ipsecpolapi.dll
+ipsecpol.exe
+lib_pfkey.dll
+ipseccrypto.prt
+agentdialog.dll
+ppp.nif
+guqos.prt
+qos.prt
+qoslib.dll
+pfqoslib.dll
+mce.exe
+mcelogeng.dll
+mcesettings.dll
+imumutils.dll
+imum.dll
+mailinit.exe
+msgnotifiers.dll
+muiu.dll
+msgeditorappui.dll
+msgeditormodel.dll
+msgeditorview.dll
+msgerrorwatcher.dll
+msgmaileditor.exe
+msgmailviewer.exe
+msgmailutils.dll
+mailplainview.dll
+imcm.dll
+imut.dll
+pops.dll
+smts.dll
+autosend.exe
+imps.dll
+impseng.dll
+impsutils.dll
+impsdatautils.dll
+impsclient.dll
+impsexe.exe
+impsconnectionmanager.dll
+impsdatachannel.dll
+impsipcirwatcher.dll
+impspushhandler.dll
+impsmessage.dll
+imlauncher.exe
+imclient.dll
+wvservicesettingsui.dll
+pengaoplugin.dll
+impsconnectionui.dll
+mmsconninit.dll
+mmscli.dll
+mmssrv.dll
+mmstransport.dll
+mmscodec.dll
+mmsmessage.dll
+mmsserversettings.dll
+mmscodecclient.dll
+mmsappadapter.dll
+mmswatcher.dll
+mmspushhandler.dll
+mmsgenutils.dll
+http.dll
+tfcorefilters.dll
+httptransporthandler.dll
+httpsecuresocket.dll
+httpmessage.dll
+httpclientcodec.dll
+httpclient.dll
+watcher.exe
+wappushutils.dll
+pushapphandler.dll
+pushsecurity.dll
+pushwatcher.dll
+pushmsgentry.dll
+smcm.dll
+smss.dll
+gsmu.dll
+smsu.dll
+smsprot.prt
+wapprot.prt
+msgs.dll
+msexe.exe
+smseditor.exe
+smsstrict.dll
+smsviewer.exe
+smte.dll
+smum.dll
+wimclient.dll
+swimreader.dll
+scard.dll
+wimserver.exe
+wimutil.dll
+wimplugin.dll
+pengserver2.exe
+pengstorserv.exe
+pengclient2.dll
+pengplgclient2.dll
+pengstorman2.dll
+pengcoreutilslib2.dll
+pengtraadap2.dll
+pengparser2.dll
+pengattrlib2.dll
+penglistlib2.dll
+pengmanager2.dll
+pengopenpresence.dll
+usbcc.dll
+eusbc.ldd
+usbext.dll
+usbclasschangeui.exe
+usbman.dll
+usbsvr.exe
+usbclasscontroller.dll
+usbuinotif.dll
+usbwatcher.exe
+acmclasscontroller.dll
+whcmclasscontroller.dll
+msclasscontroller.dll
+obexclasscontroller.dll
+fmutils.dll
+fmbt.fmp
+fmgsmgprs.fmp
+fmirda.fmp
+fmusb.fmp
+faxmodemclient.dll
+faxmodem.exe
+sconcsc.dll
+sconftp.dll
+sconftpplugin.dll
+sconconmlhandler.dll
+sconpcconnserver.exe
+sconpcconnclient.dll
+sconpcconnplugin.dll
+sconpcd.dll
+srcs.exe
+srcsclient.dll
+srcsbt.dll
+srcsirda.dll
+srcsusb.dll
+srcsutil.dll
+hci.dll
+btpm.dll
+bluetooth.dll
+bluetoothav.dll
+bt.prt
+btcomm.csy
+btdevice.dll
+btmanclient.dll
+btmanserver.exe
+btextnotifiers.dll
+sdpserver.exe
+sdpdatabase.dll
+sdpagent.dll
+gavdp.dll
+remconbeareravrcp.dll
+remconavrcpstatusconverter.dll
+avc.dll
+avctpplugins.dll
+avctpservices.dll
+btaac.dll
+btathandler.dll
+btatpipe.dll
+bteng.dll
+btnotif.dll
+btnotifwrapper.dll
+btnotifappserver.exe
+btsap.dll
+btsapexe.exe
+btsendingservice.dll
+btsrvclient.dll
+btserver.exe
+btserviceutils.dll
+btui.exe
+starter.exe
+starterclient.dll
+syslangutil.dll
+startup.exe
+genericnif.nif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/trace_images/mytraces_phone.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,30 @@
+SIM.TSY
+NOKIATSY.DLL
+SIMATKTSY.DLL
+SIMTSY.CPM
+COMMONTSY.DLL
+PHONETSY.TSY
+Phone.exe
+PhoneAppEngine.dll
+PhoneEngine.dll
+PhoneServer.exe
+SATSERVER.EXE
+SATCLIENT.DLL
+SATUI.exe
+SmsU.dll
+SmsProt.prt
+GsmU.dll
+WapProt.prt
+smcm.dll
+smss.dll
+smum.dll
+MSGS.dll
+MSexe.exe
+SatEngine.dll
+starter.exe
+starterclient.dll
+syslangutil.dll
+startup.exe
+cuicalllog.exe
+cuiphoneengine.dll
+cuiphone.exe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/trace_images/trace_image_creator.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,533 @@
+#============================================================================ 
+#Name        : trace_image_creator.pl 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description: 
+#============================================================================
+
+#######################
+# Creates trace images 
+#######################
+
+#use strict;
+use Getopt::Long;
+use File::Copy;
+
+my ($phone,$k,$sos,$production,$backup,$dir_value,$create_core,$myvariant,$merge,$tracetype,$variant,$command,$name102,$product,$platform,$hid);
+my (@cores,$image_path,$backup_core_zip,$drive);
+
+my ($test,$cmd,$RetVal,$ORIGINAL_FILENAME);
+my ($script_path);
+
+# If $test=0, files are not backed up in ReplaceStringInFile(). If $test=1, files are backed up in ReplaceStringInFile().
+$test=1;
+# Setting default value for tracetype (All)
+$tracetype = "all";
+
+#location of this script and other related files
+$script_path = $ENV['HELIUM_HOME']."/tools/rombuild/trace_images";
+
+################## BEGIN ##################
+
+GetOptions(
+    "tracetype=s", => \$tracetype,
+    "norestore" => \$norestore,
+    "restore" => \$restore,
+    "platform=s" => \$platform,
+    "product=s" => \$product,
+    "variant=s" => \$variant,
+    "drive=s" => \$drive
+    );
+	
+## Option info
+print"\n=== Variant(s)           : ",uc($variant);
+print"\n=== Tracetype            : ",uc($tracetype);
+
+if ($norestore)
+{
+	print "\n\n=== Environment will not be restored after image creation\n";
+}
+
+if ($restore)
+{
+    restore_environment();
+}
+	
+check();
+
+create_images();
+
+
+
+
+############### SUBROUTINES ###############
+
+sub show_error
+{
+    print"\n\n\n   ***********  T R A C E  I M A G E  C R E A T O R  H E L P **********\n";
+
+	print"    \n		Creates trace images\n";
+
+    print"    \n   ***********  O P T I O N S   D E S C R I P T I O N *****************\n";
+    print  "  \n[-p]   Mandatory Parameter   Specifies Product. PRODUCT";
+    print    "\n[-platform]                  Specifies Platform. PLATFORM";
+    print    "\n[-v]   Mandatory Parameter   Specifies variant. flashuirnd";
+    print    "\n[-t]   Mandatory Parameter   Specifies which trace images are created";
+    print    "\n                             all     = create all trace images ";
+    print    "\n                             general = create general trace image";
+    print    "\n                             phone   = create phone trace image";
+    print    "\n[-d]   Mandatory Parameter   Specifies output drive";
+    print  "\n\n(-n)   Optional Parameter    Does not restore the environment after";
+    print    "\n                             trace image creation";
+    print  "  \n(-r)   Optional Parameter    Does an environment restore only";
+
+    print"\n\n\n   ******************************* U S A G E ********************************\n";
+    print    "\n  Trace_image_creator.pl -product PRODUCT -tracetype all -drive q: -variant flashuirnd";
+    print    "\n  Trace_image_creator.pl -p PRODUCT -t all -d q: -v flashuirnd \n";
+    exit();
+}
+
+
+sub check
+{
+    if (! defined $variant)
+    {
+        print STDERR "\n\n **** Variant is not defined! ****\n\n";
+        show_error(); 
+    } 
+}
+
+
+sub create_images
+{
+    print "\n\n--- Backing up myTraces.txt";
+    system ("copy /y \\epoc32\\rombuild\\myTraces.txt $script_path\\myTraces.txt.orig");
+    
+    print "create images...\n";
+    
+    $command = "";
+    
+    #set traces
+    if (($tracetype eq "all") or ($tracetype eq "general"))
+    {
+        system ("title Creating general trace image");
+        system ("copy /y $script_path\\myTraces_general.txt \\epoc32\\rombuild\\myTraces.txt");        
+        
+        #create images
+        $command = "imaker -c$platform -p$product -k -f /epoc32/rom/config/$platform/$product/mc_imaker.mk $variant USE_UDEB=1 WORKDIR=$drive\\output\\development_flash_images\\traces\\general";
+        print "\n $command \n";
+        system ($command);
+    }
+
+    if (($tracetype eq "all") or ($tracetype eq "phone"))
+    {    
+        system ("title Preparing environment for phone traces");
+        PrepareBuildEnv();
+        BuildFiles();        
+
+        system ("title Creating phone trace image");
+		system ("copy /y $script_path\\myTraces_phone.txt \\epoc32\\rombuild\\myTraces.txt");        
+		
+		#create images
+		$command = "imaker -c$platform -p$product -k -f /epoc32/rom/config/$platform/$product/mc_imaker.mk USE_UDEB=1 WORKDIR=$drive\\output\\development_flash_images\\traces\\phone $variant";
+        system ($command);
+    }
+    
+    if ($restore)
+    {
+        restore_environment();
+    }
+}
+
+sub restore_environment
+{
+	if (-e "\\phone_trace_backup.zip")
+	{
+		print"\n\n=== Restoring environment after phone traces";
+		chdir "\\";
+		system ('unzip -q -o \phone_trace_backup.zip');
+		system ('del /q \phone_trace_backup.zip');
+	}
+	elsif (-e "$script_path\\myTraces.txt.orig")
+	{
+		print"\n\n=== Restoring myTraces.txt";
+		system ("move /y $script_path\\myTraces.txt.orig \\epoc32\\rombuild\\myTraces.txt");
+	}
+	else
+	{
+		print STDERR "\n\n=== Can not restore, nothing to restore!\n\n";
+		show_error();
+	}
+	exit();
+}
+
+sub PrepareBuildEnv
+{
+    # S60 Phone Engine Traces
+    # =======================
+    #
+    #define __PHENG_DEBUG_INFO__
+    #define __PHENG_DEBUG_ENABLE_ALL_AREAS__
+    #define __PHENG_PRINT_DEBUG_INFO__    
+    #
+    
+    $test=1;
+    $ORIGINAL_FILENAME='\s60\app\telephony\s60cstelephonyengines\Phoneengine\Inc\EngineBase\KPhEngConfigure.h';
+    $OLD='//#define __PHENG_DEBUG_INFO__';
+    $NEW='#define __PHENG_DEBUG_INFO__';
+    ReplaceStringInFile();
+    
+    $test=0;
+    $OLD='//#define __PHENG_DEBUG_ENABLE_ALL_AREAS__';
+    $NEW='#define __PHENG_DEBUG_ENABLE_ALL_AREAS__';
+    ReplaceStringInFile();
+
+    $OLD='//#define __PHENG_PRINT_DEBUG_INFO__';
+    $NEW='#define __PHENG_PRINT_DEBUG_INFO__';
+    ReplaceStringInFile();
+    
+    $test=1;    
+    
+    # Phone App Engine Traces
+    # =======================
+    #
+    #define _PHAPE_DEBUG_INFO_
+    #
+    
+    $ORIGINAL_FILENAME='\s60\app\telephony\cstelephonyuis\PhoneAppEngine\inc\Common\KPhApEConfigure.h';
+    $OLD='//#define _PHAPE_DEBUG_INFO_';
+    $NEW='#define _PHAPE_DEBUG_INFO_';
+    ReplaceStringInFile();
+    
+    # Changing TSY logging from FLogger to RDEBUG
+    # ===========================================
+    #
+    #define TF_LOGGING_METHOD  2
+    #
+    
+    #Change logging for UDEB build
+    $ORIGINAL_FILENAME='\s60\osext\telephonyservices\telsrv_dom\common_tsy_service_api\inc\tflogger.h';
+    $OLD='#define TF_LOGGING_METHOD  1';
+    $NEW='#define TF_LOGGING_METHOD  2';
+    ReplaceStringInFile();
+    
+    #Change logging for UREL build
+    $test=0;
+    $OLD='#define TF_LOGGING_METHOD  0';
+    $NEW='#define TF_LOGGING_METHOD  2';
+    ReplaceStringInFile();
+    
+    $test=1;
+
+    # Changing SAT logging from FLogger to RDEBUG
+    # ===========================================
+    #
+    #define LOGGING_ENABLED
+    #
+
+    $ORIGINAL_FILENAME='\s60\app\telephony\satui\satapp\SATShellControllerInc\tflogger.h';
+    $OLD='//#define LOGGING_ENABLED';
+    $NEW='#define LOGGING_ENABLED';
+    ReplaceStringInFile();    
+    
+    $ORIGINAL_FILENAME='\s60\app\telephony\satui\satapp\SATUIInc\tflogger.h';
+    $OLD='//#define LOGGING_ENABLED';
+    $NEW='#define LOGGING_ENABLED';
+    ReplaceStringInFile();        
+
+    $ORIGINAL_FILENAME='\s60\app\telephony\satui\satplugin\aisatplugininc\tflogger.h';
+    $OLD='//#define LOGGING_ENABLED';
+    $NEW='#define LOGGING_ENABLED';
+    ReplaceStringInFile();        
+    
+    # Enabling debugging in SATServer
+    # ===============================
+    #
+    #define ENABLE_SAT_LOGGING
+    #MACRO ENABLE_SAT_LOGGING
+    #
+
+    $ORIGINAL_FILENAME='\s60\app\telephony\satengine\SatServer\inc\SatMacroes.h';
+    $OLD='// #define ENABLE_SAT_LOGGING';
+    $NEW='#define ENABLE_SAT_LOGGING';
+    ReplaceStringInFile();            
+    
+    $test=0;
+    $OLD='// MACRO ENABLE_SAT_LOGGING';
+    $NEW='MACRO ENABLE_SAT_LOGGING';
+    ReplaceStringInFile();         
+    
+    $test=1;
+    
+    # CBS logs
+    # ========
+    #
+    #define CBS_LOGGING_METHOD  2
+    #
+
+    $ORIGINAL_FILENAME='\s60\app\telephony\cbsengine\CbsServer\ServerInc\CbsLogger.h';
+    $OLD='#define CBS_LOGGING_METHOD  0';    
+    $NEW='#define CBS_LOGGING_METHOD  2';
+    ReplaceStringInFile();       
+
+    $test=0;
+    $OLD='#define CBS_LOGGING_METHOD  1';    
+    $NEW='#define CBS_LOGGING_METHOD  2';
+    ReplaceStringInFile();              
+    
+    $test=1;
+}    
+
+sub ReplaceStringInFile
+{
+    if ( $test ) 
+    {
+        system("zip \\phone_trace_backup.zip $ORIGINAL_FILENAME");
+    }
+  
+    open (SYMBOL_FILE, "<$ORIGINAL_FILENAME") || die $ORIGINAL_FILENAME," not found\n";
+    open (NF, ">>$ORIGINAL_FILENAME.new")|| die $ORIGINAL_FILENAME," not found\n";
+
+    while ($line = <SYMBOL_FILE>)
+    {
+        $line =~ s/$OLD/$NEW/;
+        print NF $line;
+    };
+  
+    close SYMBOL_FILE;
+    close NF;
+  
+    $cmd = "move $ORIGINAL_FILENAME $ORIGINAL_FILENAME.bak";
+    system($cmd);
+    $cmd = "move $ORIGINAL_FILENAME.new $ORIGINAL_FILENAME";
+    system($cmd);
+}
+
+sub AddLine
+{
+    open (SYMBOL_FILE, "<$ORIGINAL_FILENAME") || die $ORIGINAL_FILENAME," not found\n";
+    open (NF, ">>$ORIGINAL_FILENAME.new")|| die $ORIGINAL_FILENAME," not found\n";
+    
+    while ($line = <SYMBOL_FILE>)
+    {
+        #print $line;
+        #$line =~ s/$OLD/$NEW/;
+        print NF $line;
+    };
+    print NF "\n";
+    print NF $LINE_TO_ADD;
+    close SYMBOL_FILE;
+    close NF;
+    
+    $cmd = "move $ORIGINAL_FILENAME $ORIGINAL_FILENAME.bak";
+    system($cmd);
+    $cmd = "move $ORIGINAL_FILENAME.new $ORIGINAL_FILENAME";
+    system($cmd);
+}
+
+sub SearchStringInFile
+{
+    open (SYMBOL_FILE, "<$ORIGINAL_FILENAME") || die $ORIGINAL_FILENAME," not found\n";
+
+    while ($line = <SYMBOL_FILE>)
+    {
+        $SetVar = $line =~ /$LINE_TO_ADD/;
+        if ($SetVar eq 1)
+        {
+            return $SetVar;
+        }
+    };
+
+    close SYMBOL_FILE;
+    return 0;
+}
+
+sub BuildFiles
+{
+    #export tflogger.h
+    print "\n\n --- Exporting flogger.h --- \n";
+    chdir '\s60\osext\telephonyservices\telsrv_dom\common_tsy_service_api\group';
+    system('bldmake bldfiles');
+    system('abld export');
+    
+    #Building PhoneEngine
+    print "\n\n --- Backing up PhoneEngine...\n";
+    chdir '\s60\app\telephony\s60cstelephonyengines\Phoneengine\Group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building PhoneEngine...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+
+    #Building PhoneAppEngine
+    print "\n\n --- Backing up PhoneAppEngine...\n";
+    chdir '\s60\app\telephony\cstelephonyuis\PhoneAppEngine\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building PhoneAppEngine...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+   
+    #Building PhoneServer
+    print "\n\n --- Backing up PhoneServer...\n";
+    chdir '\s60\app\telephony\phoneclientserverengine\Group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building PhoneServer...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+
+    #Building Phone
+    print "\n\n --- Backing up Phone...\n";
+    chdir '\s60\app\telephony\cstelephonyuis\phone\Group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building Phone...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+
+    #Building edge variant of phone	
+	print "\n\n --- Backing up Phone, Edge...\n";
+	chdir '\psw\s60_32_psw\bin_var\edge_var\group\phone';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building Phone...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+	
+    #Building CustomApiExt
+    print "\n\n --- Backing up CustomApiExt...\n";         
+    chdir '\ncp_sw\corecom\CASW_Adaptation\NokiaTSY\CustomAPIExt\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building CustomApiExt...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+	
+    #Building CommonTSY
+    #Building CustomAPI
+    #Building phonetsy
+    print "\n\n --- Backing up CommonTSY...\n";
+    chdir '\psw\s60_32_psw\bin_var\commontsy_var\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building CommonTSY...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+	
+    #Building NokiaTSY
+    print "\n\n --- Backing up NokiaTSY...\n";
+    chdir 'ncp_sw\corecom\CASW_Adaptation\NokiaTSY\NokiaTSY\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building NokiaTSY...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+
+    #Building SimAtkTSY
+    print "\n\n --- Backing up SIM_ATK_TSY...\n";
+    chdir '\ncp_sw\corecom\CASW_Adaptation\SIM_ATK_TSY\SimAtkTSY\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building SIM_ATK_TSY...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+    
+    #Building SatServer
+    print "\n\n --- Backing up SATServer...\n";
+    chdir '\s60\app\telephony\satengine\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building SATServer...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');
+
+    #Building SatUI
+    print "\n\n --- Backing up SatUI...\n";
+    chdir '\s60\app\telephony\satui\group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building SatUI...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');    
+
+    #Building CBS server    
+    print "\n\n --- Backing up CBS server...\n";
+    chdir '\s60\app\telephony\cbsengine\CbsServer\Group';
+    system('bldmake bldfiles');
+    system('abld build -w armv5 udeb | zip -@ -q \phone_trace_backup.zip');
+    print "\n --- Building CBS server...\n";
+    system('abld reallyclean armv5 udeb');
+    system('bldmake bldfiles');
+    system('abld build armv5 udeb');        
+}
+
+sub replacestring 
+{
+    my ($targetfile, $fromstring, $tostring) = @_;
+    if ($targetfile ne "" && $fromstring ne "" && $tostring ne "") 
+    {
+        open(IN, "<$targetfile");
+        open(OUT, ">$targetfile\__TEMP");
+        @lines = <IN>;
+        foreach $line (@lines) 
+        {
+            $line =~ s/$fromstring/$tostring/g;
+            print OUT $line;
+        }
+        close IN; close OUT;
+        move("$targetfile\__TEMP", "$targetfile") or warn "Can't replace file contents!\n";
+        if (!-f "$targetfile\__TEMP") 
+        {
+            print "Replacement of ", $targetfile, " ok.\n";	
+        }
+    }
+}
+
+sub run_cmd 
+{
+    my $cmd = shift; my $output = "";
+    open CMD, "$cmd |";
+    while (<CMD>) 
+    {
+        $output .= $_;
+        print $_;
+    }
+    close CMD;
+    return $output;
+}
+
+sub RestoreBuildEnvironment
+{
+    print "\n\nRestoring the build environment.\n";
+    foreach $k (@files)
+    {
+        print "Restoring $k file...\n";
+        $FILENAME=$k;
+        $cmd = "move $FILENAME.orig $FILENAME";
+        system($cmd);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/rombuild/trace_images/tracebuild.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : tracebuild.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="tracebuild">
+    <description>
+    Creates trace images for one product.
+    </description>
+    <!-- rudimentary trace image creation. Creates trace images for one product
+    tracebuild.tracetype specifies type of trace to create (phone, general, all)
+    tracebuild.product specifies product for which to create traces
+    tracebuild.variant specifies imaker target to use for trace creation
+    Current implementation is very Nokia specific, this will be replaced in the near future -->
+    <target name="build-traces">
+        <exec executable="perl" dir="${build.drive}/" failonerror="true">
+            <arg value="${helium.dir}/tools/rombuild/trace_images/trace_image_creator.pl"/>
+            <arg value="-t=${tracebuild.tracetype}"/>
+            <arg value="-platform=${tracebuild.platform}"/>            
+            <arg value="-product=${tracebuild.product}"/>            
+            <arg value="-v=${tracebuild.variant}"/>
+            <arg value="-d=${build.drive}"/>
+        </exec>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/antserver/antserver.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antserver.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="startup.antserver" default="server">
+    <description>Running a remote server to handle backup build requests.</description>
+    
+    <!-- Starts an Ant server for handling a remote build invocation. -->
+    <target name="server">
+        <antserver/>
+    </target>
+
+
+    <!-- Untars a work area from the network cache directory. -->
+    <target name="untar-work-area">
+        <delete dir="${ccm.base.dir}"/>
+        <echo message="Untarring ${work.area.cache.file}"/>
+        <shellscript shell="cmd.exe" tmpsuffix=".bat" dir="${ccm.home.dir}">
+            <arg value="/c"/>
+            <arg value="call"/>
+            gzip --decompress &lt;${work.area.cache.file} | tar --extract
+        </shellscript>
+        <echo message="${work.area.cache.file} untarred."/>
+    </target>
+
+
+    <!-- Runs a remote build. -->
+    <target name="run-build">
+        <exec executable="${bld-bat-dir}\${bld-bat-file}" dir="${bld-bat-dir}" failonerror="${failonerror}">
+            <arg line="${args}"/>
+        </exec>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/antserver/remote.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : remote.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="startup.remote">
+    <description>Local actions to setup remote builds.</description>
+    
+    <!-- Tars a complete work area to distribute to other machines. -->
+    <target name="tar-work-area">
+        <tstamp>
+            <format property="workarea.timestamp" pattern="yyyyMMdd_HHmmss"/>
+        </tstamp>
+        <echo message="In 10s the \${minor.version} directory will be tarred from the ${ccm.home.dir} directory into ${ccm.home.dir}\WorkArea_${env.COMPUTERNAME}_${workarea.timestamp}.tgz. Press Ctrl-C to stop."/>
+        <sleep seconds="10"/>
+        <shellscript shell="cmd.exe" tmpsuffix=".bat" dir="${ccm.home.dir}">
+            <arg value="/c"/>
+            <arg value="call"/>
+            tar --create ${minor.version} | gzip  >${ccm.home.dir}\WorkArea_${env.COMPUTERNAME}_${workarea.timestamp}.tgz
+        </shellscript>
+    </target>
+
+
+    <!-- Uploads a tarball to a network location. -->
+    <target name="upload-work-area" depends="tar-work-area">
+        <copy file="${ccm.home.dir}\WorkArea_${env.COMPUTERNAME}_${workarea.timestamp}.tgz" todir="${work.area.temp.dir}"/>
+        <property name="work.area.cache.file" value="${work.area.temp.dir}\WorkArea_${env.COMPUTERNAME}_${workarea.timestamp}.tgz"/>
+    </target>
+
+
+    <!-- Generates an Ant file containing commands to execute to run remote builds. -->
+    <target name="gen-remote-tasks">
+        <xslt in="${remote.builds.config.file}" out="${build.cache.dir}/${build.id}_remote_builds.ant.xml" style="${helium.dir}/tools/startup/antserver/remote_builds_to_ant_script.xslt" force="true"/>
+    </target>
+
+
+    <!-- Distributes a work area to remote machines. -->
+    <target name="distribute-work-area" depends="upload-work-area,gen-remote-tasks">
+        <ant antfile="${build.cache.dir}/${build.id}_remote_builds.ant.xml" target="do-distribute-work-area"/>
+    </target>
+    
+    
+    <!-- Checks that a remote machine has an Ant server running. -->
+    <target name="check-server">
+        <property name="machine" value="localhost"/>
+        <remoteant machine="${machine}">
+            <runtarget target="config"/>
+        </remoteant>
+    </target>
+
+
+    <!-- Starts the remote builds defined in the remote build configuration file. -->
+    <target name="start-remote-builds" depends="gen-remote-tasks">        
+        <ant antfile="${build.cache.dir}/${build.id}_remote_builds.ant.xml" target="do-start-remote-builds"/>
+        <!-- Sleep is needed to give enough time for the remote build operation to get sent. -->
+        <sleep seconds="5"/>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/antserver/remote_builds_to_ant_script.xslt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+    <xsl:template match="/BuildProcessDefinition/remoteBuilds">
+        <project>
+            <target>
+                <xsl:attribute name="name">do-distribute-work-area</xsl:attribute>
+                <parallel>
+                    <xsl:apply-templates select="build" mode="workarea"/>
+                </parallel>
+            </target>
+            <target>
+                <xsl:attribute name="name">do-start-remote-builds</xsl:attribute>
+                <parallel>
+                    <daemons>
+                        <xsl:apply-templates select="build" mode="remotebuilds"/>
+                    </daemons>
+                </parallel>
+            </target>
+        </project>
+    </xsl:template>
+    <xsl:template match="build" mode="workarea">
+        <remoteant>
+            <xsl:attribute name="machine"><xsl:value-of select="@machine"/></xsl:attribute>
+            <runtarget>
+                <xsl:attribute name="target">untar-work-area</xsl:attribute>
+                <property>
+                    <xsl:attribute name="name">ccm.home.dir</xsl:attribute>
+                    <xsl:attribute name="value"><xsl:value-of select="@ccmhomedir"/></xsl:attribute>
+                </property>
+                <property>
+                    <xsl:attribute name="name">ccm.base.dir</xsl:attribute>
+                    <xsl:attribute name="value"><xsl:value-of select="@basedir"/></xsl:attribute>
+                </property>
+                <property>
+                    <xsl:attribute name="name">work.area.cache.file</xsl:attribute>
+                    <xsl:attribute name="value">${work.area.cache.file}</xsl:attribute>
+                </property>
+            </runtarget>
+        </remoteant>
+    </xsl:template>
+    <xsl:template match="build" mode="remotebuilds">
+        <remoteant>
+            <xsl:attribute name="machine"><xsl:value-of select="@machine"/></xsl:attribute>
+            <runtarget>
+                <xsl:attribute name="target">run-build</xsl:attribute>
+                <property>
+                    <xsl:attribute name="name">bld-bat-file</xsl:attribute>
+                    <xsl:attribute name="value"><xsl:value-of select="@executable"/></xsl:attribute>
+                </property>
+                <property>
+                    <xsl:attribute name="name">bld-bat-dir</xsl:attribute>
+                    <xsl:attribute name="value"><xsl:value-of select="@dir"/></xsl:attribute>
+                </property>
+                <property>
+                    <xsl:attribute name="name">args</xsl:attribute>
+                    <xsl:attribute name="value"><xsl:value-of select="@args"/></xsl:attribute>
+                </property>
+            </runtarget>
+        </remoteant>
+    </xsl:template>
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/antserver/templates/remote_builds.conf.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : remote_builds.conf.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<BuildProcessDefinition>
+    <remoteBuilds>
+        <build machine="vcbldsrv12" ccmhomedir="${ccm.home.dir}" basedir="${ccm.base.dir}" executable="bld.bat" dir="${mc_4031_build.dir}\PRODUCT" args="product-build -Dbuild.number=${build.number}"/>
+    </remoteBuilds>
+</BuildProcessDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/bootstrap/bootstrap.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : bootstrap.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="startup.bootstrap" default="install-dependencies" xmlns:ivy="antlib:org.apache.ivy.ant">
+    <description>
+    Download libraries to bootstrap helium
+    </description>
+
+    <property name="build.type" value="subcon" />
+    <property name="tools.ivy.config.file" location="${helium.dir}/config/ivy/tools_ivy_settings.xml" />
+
+    <!-- Set proxy using Nokia settings by default -->
+    <target name="proxy" unless="proxy.disabled">
+        <property name="proxy.host" value="172.16.42.137" />
+        <property name="proxy.port" value="8080" />
+        <setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}" />
+    </target>
+
+    <property name="ivy.filename" value="ivy-2.0.0-beta2.jar" />
+    <property name="ivy.file" value="${helium.dir}/external/antlibs/${ivy.filename}" />
+    <available file="${ivy.file}" property="ivy.file.present" />
+
+    <!-- Download ivy jar -->
+    <target name="get-ivy" unless="ivy.file.present" depends="proxy">
+        <mkdir dir="${helium.dir}/external/antlibs" />
+        <get src="http://mirrors.ibiblio.org/pub/mirrors/maven2/org/apache/ivy/ivy/2.0.0-beta2/${ivy.filename}" dest="${ivy.file}" />
+    </target>
+
+    <!-- Install CruiseControl if not already installed -->
+    <target name="install-cruisecontrol">
+        <if>
+            <not>
+                <available file="${helium.dir}/external/CruiseControl/real_cruisecontrol.bat" />
+            </not>
+            <then>
+                <antcall target="install-dependencies">
+                    <param name="build.type" value="ido_install" />
+                </antcall>
+            </then>
+        </if>
+    </target>
+
+    <!-- Clean CruiseControl installation -->
+    <target name="clean-cruisecontrol">
+        <delete includeemptydirs="true">
+            <fileset dir="${helium.dir}/external/CruiseControl">
+                <exclude name="cruisecontrol.bat" />
+                <exclude name="distribution.policy.S60" />
+            </fileset>
+        </delete>
+    </target>
+
+
+    <!-- Set libs for bootstrap -->
+    <target name="set-libs">
+        <path id="lib.path">
+            <fileset dir="${helium.dir}/external/antlibs" includes="**/*.jar" />
+        </path>
+
+        <!-- External tasks. -->
+        <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="lib.path" />
+    </target>
+
+    <!-- Clean the Ivy cache. This is important if Ivy file content is changed. -->
+    <target name="clean-ivy-cache" depends="set-libs">
+        <ivy:configure file="${tools.ivy.config.file}" />
+        <ivy:cleancache />
+    </target>
+
+    <!-- Private: unzip jars -->
+    <target name="unzip-jar">
+        <unzip src="${artifact.file}" dest="${helium.dir}/external/antlibs" />
+    </target>
+    <!-- Private: unzip eggs -->
+    <target name="unzip-egg">
+        <unzip src="${artifact.file}" dest="${helium.dir}/external/python/lib/2.5" />
+    </target>
+    <!-- Private: ungzip eggs -->
+    <target name="gunzip-egg">
+        <gunzip src="${artifact.file}" dest="${artifact.file}.tar" />
+        <untar src="${artifact.file}.tar" dest="${helium.dir}/external/python/lib/2.5" />
+    </target>
+    <!-- Private: unbzip egg -->
+    <target name="bunzip-egg">
+        <bunzip2 src="${artifact.file}" dest="${artifact.file}.tar" />
+        <untar src="${artifact.file}.tar" dest="${helium.dir}/external/python/lib/2.5" />
+    </target>
+
+    <!-- Install libraries main target -->
+    <target name="install-dependencies" depends="proxy,set-libs">
+        <ivy:configure file="${tools.ivy.config.file}" />
+        <ivy:resolve file="${helium.dir}/config/ivy/ivy.xml" conf="${build.type}" haltonfailure="false" />
+
+        <ivy:retrieve pattern="${helium.dir}/external/antlibs/[artifact]-[revision].[ext]" type="jar" />
+        <ivy:retrieve pattern="${helium.dir}/external/python/lib/2.5/[artifact]-[revision].[ext]" type="egg" />
+        <ivy:retrieve pattern="${helium.dir}/external/sources/[artifact]-[revision].[ext]" type="zip" />
+
+        <delete>
+            <fileset dir="${helium.dir}/external/antlibs" includes="ant-optional*.jar" />
+            <fileset dir="${helium.dir}/external/antlibs" includes="ant-1.5.jar" />
+        </delete>
+
+        <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="lib.path" />
+
+        <if>
+            <not>
+                <available file="${helium.dir}/external/python/lib/2.5/easy-install.pth" />
+            </not>
+            <then>
+                <copy file="${helium.dir}/tools/startup/bootstrap/easy-install.pth" todir="${helium.dir}/external/python/lib/2.5" />
+                <copy file="${helium.dir}/tools/startup/bootstrap/site.py" todir="${helium.dir}/external/python/lib/2.5" />
+            </then>
+        </if>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/bootstrap/easy-install.pth	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+import sys; sys.__plen = len(sys.path)
+./4Suite_XML-1.0.egg
+./Amara-1.0.egg
+./Distutils-1.0.2
+./docutils-1.0.egg
+./epydoc-1.0.egg
+./Jinja-1.0.egg
+./logilab-common-0.32.0
+./lxml-1.0.egg
+./mocker-0.10.1
+./nose-1.0.egg
+./path-2.2
+./psyco-1.6
+./Pygments-1.0.egg
+./pylint-0.14.0
+./PyRTF-0.45
+./PyXML-1.0.egg
+./setuptools-1.0.egg
+./simplejson-1.0.egg
+./Sphinx-1.0.egg
+./ZSI-1.0.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/startup/bootstrap/site.py	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,413 @@
+#============================================================================ 
+#Name        : site.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/ats/ats.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ats.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="_testing.ats" xmlns:hlm="http://www.nokia.com/helium">
+    <var name="drop.file.counter" value="0" />
+    <description>
+        ATS testing targets.
+    </description>
+    <!-- -->
+    <fileset id="reference.ats.flash.images" dir="${release.images.dir}">
+        <include name="**/${build.id}*.core.fpsx" />
+        <include name="**/${build.id}*.rofs2.fpsx" />
+        <include name="**/${build.id}*.rofs3.fpsx" />
+        <include name="**/*rnd.C00" />
+        <include name="**/*rnd.V01" />
+        <include name="**/*.fpsx" />
+        <include name="**/*_rnd.fpsx" />
+    </fileset>
+    <property environment="env" />
+    <property name="ats.flashfiles.minlimit" value="2" />
+
+    <fileset id="reference.ats.sis.images" dir="${ats.sis.images.dir}">
+        <include name="**/*.sis" />
+    </fileset>
+    <property name="ats.sisfiles.minlimit" value="1" />
+
+    <!-- 
+    The target creates ATSDrop.zip file which also includes test.xml file; and sends the drop to ATS. 
+    The layer definition, in system definition file, for tsrc directory should look like:
+    <pre>
+    <layer name="name_test_layer">
+    
+        <module name="module_name">
+        
+            <unit id="unit_id" name="unti_name" bldFile="path_of_tsrc_folder_to_be_built" filter=""/>
+            
+        </module>
+        
+    </layer>
+    </pre>
+    -->
+
+    <target name="ats-test" if="enabled.ats">
+        <hlm:filterRecordStartMacro/>
+        <runtarget target="copy-mon-sym" />
+        <runtarget target="ats-create-drop" />
+        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_ats.log" append="false"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ats.log" />
+                <metadatafilterset refid="filterset.ats" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_ats.log" />
+    </target>
+
+    <!-- The target creates the ATS3drop.zip file including test.xml for ATS ASTE tests. This target is executable.-->
+
+    <target name="ats-aste" if="enabled.aste">
+        <hlm:filterRecordStartMacro/>
+        <runtarget target="do-ats-aste" />
+        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_ats.log" append="false"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ats.log" />
+                <metadatafilterset refid="filterset.aste" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_ats.log" />
+    </target>
+
+    <!-- The target creates the MATTI_drop.zip file including test.xml for MATTI tests. This target is executable.-->
+    <target name="matti-test" if="enabled.matti">
+        <hlm:filterRecordStartMacro/>
+        <runtarget target="do-ats-matti" />
+        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_matti.log" append="false"/>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_matti.log" />
+                <metadatafilterset refid="filterset.matti" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_matti.log" />
+    </target>
+
+
+    <!-- Sends drop file to ATS/ASTE. Please see `ats-test` for description. -->
+    <target name="do-ats-test" depends="ats-username, ats-password" unless="skip.ats.sending">
+        <!-- Make the drop file visible to ATS3. -->
+        <mkdir dir="${ats.drop.location}" />
+        <copy file="${ats.drop.file}" tofile="${ats.drop.location.file}" />
+        <!-- Notify ATS3 about the drop. -->
+        <exec executable="cscript" dir="${build.drive}/" failonerror="false">
+            <env key="ats3.username" value="${ats.username}" />
+            <env key="ats3.password" value="${ats.password}" />
+            <env key="ats3.host" value="${ats.server}" />
+            <env key="ats3.pathToDrop" value="${ats.drop.location.file}"/>
+            <arg value="${helium.dir}/tools/testing/ats/${ats.wsh.testrun.file}" />
+        </exec>
+    </target>
+
+
+
+    <!-- The target is dependent on "ats-test", should not be called independently. The target fetches flash files location -->
+    <target name="ats-set-flash-image-path">
+        <pathconvert pathsep="," property="ats.flash.images">
+            <fileset refid="reference.ats.flash.images"/>
+        </pathconvert>
+    </target>
+
+    <!-- The target is dependent on "ats-test", should not be called independently. The target fetches flash files location -->
+    <target name="ats-set-sis-flash-image-path">
+        <pathconvert pathsep="," property="ats.sis.images">
+            <fileset refid="reference.ats.sis.images"/>
+        </pathconvert>
+    </target>
+
+    <!-- Sets values common for ATS, this is a dependent target and shouldn't be used as an individual target -->
+    <target name="ats-common">
+        <property name="ats.config.file" value="" />
+        <property name="ats.product.hwid" value="" />
+        <property name="ats.test.timeout" value="60" />
+        <property name="ats.report.location" value="${publish.dir}/${publish.subdir}" />
+        <var name="ats.drop.file" value="${build.output.dir}/ats/ATSDrop${drop.file.counter}.zip" />
+        <if>
+            <isset property="diamonds.build.url" />
+            <then>
+                <property name="internal.ats.diamonds.arg" value="--diamonds-build-url=http://${diamonds.host}${diamonds.build.id}" />
+            </then>
+            <else>
+                <property name="internal.ats.diamonds.arg" value="" />
+            </else>
+        </if>
+    </target>
+
+    <!-- Sets default values for the ATS (STIF and EUnit), this is a dependent target and shouldn't be used as an individual target -->
+    <target name="ats-set-defaults-stifeunit" depends="ats-common,lookup-email">
+        <!-- Default values for the properties -->
+        <property name="ats.email.list" value="${email.from}" />
+        <property name="tsrc.data.dir" value="data" />
+        <property name="ats.plan.name" value="plan" />
+        <property name="ats.testrun.name" value="${build.id}_${ats.product.name}" />
+        <property name="ats.ctc.host" value="" />
+        <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs">
+            <equals arg1="${ats.script.type}" arg2="import" />
+        </condition>
+        <!-- if test run file is not explicitly mentioned, default is RunX-->
+        <property name="ats.wsh.testrun.file" value="wshTestRunX.vbs" />
+        <var name="ats.drop.file" value="ATS3Drop${drop.file.counter}.zip" />
+        <property name="ats.target.platform" value="armv5 urel" />
+        <property name="ats.trace.enabled" value="False" />
+        <property name="ats.ctc.enabled" value="False" />
+        <property name="ats.multiset.enabled" value="False" />
+        <property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
+        <property name="ats.obey.pkgfiles.rule" value="False" />
+    </target>
+
+    <!-- Sets default values for the ASTE, this is a dependent target and shouldn't be used as an individual target -->
+    <target name="ats-set-defaults-aste" depends="ats-common">
+        <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs">
+            <equals arg1="${ats.script.type}" arg2="import" />
+        </condition>
+        <!-- if test run file is not explicitly mentioned, default is RunX-->
+        <property name="ats.wsh.testrun.file" value="wshTestRunX.vbs" />
+        <property name="ats.aste.test.type" value="smoke" />
+        <property name="ats.aste.testasset.caseids" value="100,101,102,103,105,106,107,108,109,110,111,112,113,114,115" />
+        <property name="ats.aste.software.version" value="${build.id}" />
+        <property name="ats.aste.language" value="English" />
+        <property name="ats.aste.software.release" value="${build.name}" />
+        <property name="ats.aste.plan.name" value="plan" />
+        <property name="ats.aste.testrun.name" value="${build.id}_${ats.product.name}_${major.version}.${minor.version}" />
+        <property name="ats.aste.email.list" value="" />
+    </target>
+
+    <!-- This macro fetches the tsrc paths from system definition file (layers.sysdef.xml), layer defintion should look like
+    <pre>
+    <layer name="name_test_layer">
+        <module name="module_name">
+            <unit id="unit_id" name="unti_name" bldFile="path_of_tsrc_folder_to_be_built" filter="" />
+        </module>
+    </layer>
+    </pre>
+    -->
+    <scriptdef name="getModuleTsrcMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="property" />
+        <attribute name="prefix"/>
+        
+import os
+import re
+import sysdef.api
+import pathaddition.match
+import traceback
+## using create-canonical-sysdef-file target, it works and gets tsrc paths
+
+if project.getProperty('canonical.sysdef.file') == None :
+    raise Exception("'canonical.sysdef.file' property is not defined")
+
+try:
+    sdf = sysdef.api.SystemDefinition(str(project.getProperty('canonical.sysdef.file')))
+    
+    modules = {}
+    paths_list = []
+    for la in sdf.layers:
+        if re.match(r".*_test_layer$", la):
+            try:
+                if re.search(r"\b%s\b" % la, project.getProperty('exclude.test.layers')):
+                    continue
+            except TypeError, exp:
+                pass
+
+            layer = sdf.layers[la]
+            for mod in layer.modules:
+                if mod.name not in modules:
+                    modules[mod.name] = []
+                for unit in mod.units:
+                    include_unit = True
+                    if project.getProperty('ido.build.filter') != None:
+                        if project.getProperty('ido.build.filter') != "":
+                            include_unit = False
+                            if hasattr(unit, 'filters'):
+                                if len(unit.filters) > 0:
+                                    for filter in unit.filters:
+                                        if re.search(r"\b%s\b" % filter, project.getProperty('ido.build.filter')):
+                                            include_unit = True
+                                        else:
+                                            include_unit = False
+                                elif len(unit.filters) == 0:
+                                    include_unit = True
+                            else:
+                                include_unit = False
+                        else:
+                            include_unit = False
+                            if hasattr(unit, 'filters'):                            
+                                if len(unit.filters) == 0:
+                                    include_unit = True
+                    if include_unit:
+                        #if pathaddition.match.ant_match(unit.path, "**/tsrc/**", False):
+                        modules[mod.name].append(os.path.join(project.getProperty('build.drive') + os.sep, unit.path))
+                        #else:
+                        #    project.log('tcrc not found in ' + str(unit.path))
+
+            #substituting paths in the modules dictionary from path list using keys
+            for name in modules.keys():
+                if not modules[name] == []:
+                    project.setProperty(str("%s.%s" % (attributes.get('prefix'), name)), str(" ".join(modules[name])))
+                else:
+                    del modules[name]
+
+            project.setProperty(str(attributes.get('property')), str(",".join(modules.keys())))
+            
+except Exception, e:
+    traceback.print_exc()
+    project.log("ERROR: could not generate tsrc path list. %s" % e)
+    </scriptdef>
+
+    <!-- The target is dependent on "ats-test", should not be called individually. The target creates the ATS3drop.zip file including test:xml file -->
+    <target name="ats-create-drop" depends="create-canonical-sysdef-file, ats-set-flash-image-path">
+        <var name="ats.drop.location.file" value="${ats.drop.location}/ATS3Drop${drop.file.counter}.zip" />
+        <mkdir dir="${build.output.dir}/ats" />
+        <hlm:getModuleTsrcMacro property="module.list" prefix="module.tsrc" />
+        <if>
+            <scriptcondition language="beanshell">
+                <![CDATA[
+                    String value = project.getProperty("module.list");
+                    if (value != null) {
+                        String[] out = value.split(",");
+                        if ((out == null) || (out.length == 0) || ((out.length == 1) && (out[0].length()==0))) {
+                                    self.setValue(true);
+                            } else {
+                                    self.setValue(false);
+                            }
+                        } else {
+                            self.log("Error: module.list not defined.");
+                                self.setValue(true);
+                        }
+                            ]]>
+            </scriptcondition>
+            <then>
+                <echo message="Error: No test modules found!" />
+            </then>
+            <elseif>
+                <scriptcondition language="beanshell">
+                    <![CDATA[
+                        String flashfiles = project.getProperty("ats.flash.images");
+                        String value = project.getProperty("ats.flashfiles.minlimit");
+                        if (flashfiles != null && value != null) {
+                            int cond = Integer.valueOf(value).intValue();
+                            String[] out = flashfiles.split(",");
+                            if (out.length < cond ) {
+                                self.setValue(true);
+                            } else {
+                                self.setValue(false);
+                            }
+                        } else {
+                            self.log("Error: flashfiles not defined.");
+                            self.setValue(true);
+                        }
+                            ]]>
+                </scriptcondition>
+                <then>
+                    <echo message="Error: Not enough flash files!" />
+                </then>
+            </elseif>
+            <else>
+                <for list="${module.list}" delimiter="," param="module">
+                    <sequential>
+                        <runtarget target="ats-set-defaults-stifeunit" />
+                        <var name="ats.drop.file" value="${build.output.dir}/ats/ATS3Drop${drop.file.counter}.zip" />
+                        <echo>${ats.drop.file}</echo>
+                        <exec executable="python">
+                            <arg value="${helium.dir}/tools/common/python/lib/ats3/__init__.py" />
+                            <arg value="--device-type=${ats.product.name}" />
+                            <arg value="--device-hwid=${ats.product.hwid}" />
+                            <arg value="${internal.ats.diamonds.arg}" />
+                            <arg value="--drop-file=${ats.drop.file}" />
+                            <arg value="--report-email=${ats.email.list}" />
+                            <arg value="--plan-name=${ats.plan.name}" />
+                            <arg value="--testrun-name=${ats.testrun.name}_@{module}" />
+                            <arg value="--flash-images=${ats.flash.images}" />
+                            <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
+                            <arg value="--target-platform=${ats.target.platform}" />
+                            <arg value="--data-dir=${tsrc.data.dir}" />
+                            <arg value="--test-timeout=${ats.test.timeout}" />
+                            <arg value="--build-drive=${build.drive}" />
+                            <arg value="--trace-enabled=${ats.trace.enabled}" />
+                            <arg value="--ctc-enabled=${ats.ctc.enabled}" />
+                            <arg value="--multiset-enabled=${ats.multiset.enabled}" />
+                            <arg value="--file-store=${ats.report.location}" />
+                            <arg value="--eunitexerunner-flags=${eunitexerunner.flags}" />
+                            <arg value="--ats-network-drive=${ats.ctc.host}#${ats.drop.file}" />
+                            <arg value="--monsym-files=${ats.ctc.monsyms}" />
+                            <arg value="--config=${ats.config.file}" />
+                            <arg value="--obey-pkgfiles=${ats.obey.pkgfiles.rule}" />
+                            <arg value="--verbose" />
+                            <arg line="${module.tsrc.@{module}}" />
+                        </exec>
+                        <runtarget target="do-ats-test" />
+                        <math result="drop.file.counter" operand1="1" operation="+" operand2="${drop.file.counter}" datatype="int" />
+                    </sequential>
+                </for>
+            </else>
+        </if>
+    </target>
+
+
+    <!-- Please see ats-aste for description.-->
+    <target name="do-ats-aste" depends="ats-set-flash-image-path, ats-set-defaults-aste" if="enabled.aste">
+
+        <mkdir dir="${build.output.dir}/ats" />
+        <if>
+            <scriptcondition language="beanshell">
+                <![CDATA[
+                String flashfiles = project.getProperty("ats.flash.images");
+                String value = project.getProperty("ats.flashfiles.minlimit");
+                if (flashfiles != null && value != null) {
+                    int cond = Integer.valueOf(value).intValue();
+                    String[] out = flashfiles.split(",");
+                    if (out.length < cond ) {
+                        self.setValue(true);
+                    } else {
+                            self.setValue(false);
+                    }
+                } else {
+                    self.log("Error: flashfiles not defined.");
+                    self.setValue(true);
+                }
+                    ]]>
+            </scriptcondition>
+            <then>
+                <echo message="Error: Not enough flash files!" />
+            </then>
+            <else>
+                <exec executable="python">
+                    <arg value="${helium.dir}/tools/common/python/lib/ats3/aste.py" />
+                    <arg value="--report-email=${ats.aste.email.list}" />
+                    <arg value="--device-type=${ats.product.name}" />
+                    <arg value="--flash-images=${ats.flash.images}" />
+                    <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
+                    <arg value="--plan-name=${ats.aste.plan.name}" />
+                    <arg value="--testrun-name=${ats.aste.testrun.name}" />
+                    <arg value="--device-hwid=${ats.product.hwid}" />
+                    <arg value="--test-timeout=${ats.test.timeout}" />
+                    <arg value="--build-drive=${build.drive}" />
+                    <arg value="${internal.ats.diamonds.arg}" />
+                    <arg value="--drop-file=${ats.drop.file}" />
+                    <arg value="--test-type=${ats.aste.test.type}" />
+                    <arg value="--testasset-location=${ats.aste.testasset.location}" />
+                    <arg value="--testasset-caseids=${ats.aste.testasset.caseids}" />
+                    <arg value="--software-version=${ats.aste.software.version}" />
+                    <arg value="--device-language=${ats.aste.language}" />
+                    <arg value="--software-release=${ats.aste.software.release}" />
+                    <arg value="--verbose" />
+                </exec>
+                <runtarget target="do-ats-test" />
+            </else>
+        </if>
+    </target>
+
+    <!--
+        This target search the mon.sym files using unit information from the canonical sysdef file.
+        Then it copies the discovered files under the ftp server defined by ats.ctc.host.
+        The target url is: ftp ://[server]/ctc_helium/[diamonds_id]/mon_syms/[id]/mon.sym 
+    -->
+    <target name="copy-mon-sym" if="ats.ctc.enabled">
+        <fmpp sourceFile="${helium.dir}/tools/testing/ats/templates/monsym-file-list.txt.ftl"
+            outputFile="${temp.build.dir}/monsym-file-list.txt">
+            <data expandProperties="yes">
+                data: xml(${canonical.sysdef.file})
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <hlm:path2file reference="mon.sym.list" file="${temp.build.dir}/monsym-file-list.txt" />
+        <script language="jython">
+import os
+import ctc
+
+if not project.getProperty('ats.ctc.host'):
+    raise Exception('ats.ctc.host property is not defined.')
+if not project.getProperty('diamonds.build.id'):
+    raise Exception('diamonds.build.id property is not defined.')
+
+server = project.getProperty('ats.ctc.host')
+diamondsid = os.path.basename(os.path.dirname(project.getProperty('diamonds.build.id')))
+path = project.getReference('mon.sym.list')
+if not path:
+    raise Exception('mon.sym.list reference has not been set')
+
+uploader = ctc.MonSymFTPUploader(server, path.list(), diamondsid)
+monsyms = uploader.upload()
+            
+# Using ; to separate the path because the target script is running on windows
+project.setNewProperty('ats.ctc.monsyms', ';'.join([ "//%s/%s" % (server, x) for x in monsyms]))
+        </script>
+        <echo>ats.ctc.monsyms: ${ats.ctc.monsyms}</echo>
+    </target>
+
+    <!-- a dependant target please do not call directly use matti-test,
+    target calls the MATTI script that creates the MATTI_drop.zip file and runs the tests
+    listed in test.rb.  ats-set-flash-image-path and ats-set-sis-flash-image-path look for lists of files-->
+    <target name="do-ats-matti" depends="ats-set-flash-image-path, ats-set-sis-flash-image-path" >
+        <runtarget target="ats-set-defaults-stifeunit" />
+        <!--need to set theseup for use by do-ats-test target-->
+        <mkdir dir="${build.output.dir}/ats" />
+        <var name="ats.drop.location" value="${build.output.dir}/ats" />
+        <var name="ats.drop.file" value="${build.output.dir}/ats/ATS3Drop.zip" />
+        <var name="ats.drop.location.file" value="${ats.drop.file}" />
+        <if>
+            <!-- get the list of .fpsx files (and others) in the defined folder
+             to pass as a list to the python script-->
+            <scriptcondition language="beanshell">
+                <![CDATA[
+                    String flashfiles = project.getProperty("ats.flash.images");
+                    String value = project.getProperty("ats.flashfiles.minlimit");
+                    if (flashfiles != null && value != null) {
+                        int cond = Integer.valueOf(value).intValue();
+                        String[] out = flashfiles.split(",");
+                        if (out.length < cond ) {
+                            self.setValue(true);
+                        } else {
+                            self.setValue(false);
+                        }
+                    } else {
+                        self.log("Error: flashfiles not defined.");
+                        self.setValue(true);
+                    }
+                        ]]>
+            </scriptcondition>
+            <then>
+                <echo message="Error: Not enough flash files!" />
+            </then>
+            <else>
+                <if>
+                    <!-- get the list of .sis files in the defined folder to pass as a list to the python script-->
+                    <scriptcondition language="beanshell">
+                        <![CDATA[
+                            String sisfiles = project.getProperty("ats.sis.images");
+                            String value = project.getProperty("ats.sisfiles.minlimit");
+                            if (sisfiles != null && value != null) {
+                                int cond = Integer.valueOf(value).intValue();
+                                String[] out = sisfiles.split(",");
+                                if (out.length < cond ) {
+                                    self.setValue(true);
+                                } else {
+                                    self.setValue(false);
+                                }
+                            } else {
+                                self.log("Error: sisfiles not defined.");
+                                self.setValue(true);
+                            }
+                                ]]>
+                    </scriptcondition>
+                    <then>
+                        <echo message="Error: Not enough sis files!" />
+                    </then>
+                    <else>
+                        <!-- execute the MattiDrops.py script with parameters-->
+                        <exec executable="python" resultproperty="script.response">
+                            <arg value="${helium.dir}/tools/common/python/lib/ats3/matti/MattiDrops.py" />
+                            <arg value="--build-drive=${build.drive}" />
+                            <arg value="--matti-scripts=${matti.scripts}" />
+                            <arg value="--flash-images=${ats.flash.images}" />
+                            <arg value="--harness=STIF" />
+                            <arg value="--file-store=${ats.output.dir}" />
+                            <arg value="--testrun-name=${ats.testrun.name}" />
+                            <arg value="--device-type=${ats.product.name}" />
+                            <arg value="--device-hwid=${ats.product.hwid}" />
+                            <arg value="--diamonds-build-url=${internal.ats.diamonds.arg}" />
+                            <arg value="--drop-file=${ats.drop.file}" />
+                            <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
+                            <arg value="--plan-name=${ats.plan.name}" />
+                            <arg value="--sis-files=${ats.sis.images}" />
+                            <arg value="--template-loc=${template.file}" />
+                        </exec>
+                        <if> 
+                            <not>
+                                <!-- if the response is not 0 then need to create the skip.ats.sending
+                                 flag so that do-ats-test is not run-->
+                                <equals arg1="${script.response}" arg2="0" />
+                            </not>
+                            <then>
+                                <property name="skip.ats.sending" value="1" />
+                            </then>
+                        </if>
+                        <runtarget target="do-ats-test" />
+                    </else>
+                </if>    
+            </else>
+        </if>    
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+<#--
+============================================================================ 
+Name        : monsym-file-list.txt.ftl
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#list data["//unit"] as unit>
+${ant['build.drive']}${unit.@bldFile}/mon.sym
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/ats/wshTestRunImport.vbs	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,149 @@
+'
+' WScript that will invoke the test run execute functionality at ATS3 web server without installing any ATS3
+' specific programs on the local PC.
+'
+' Copies the test run zip into ATS3 server over HTTP before starting the test run
+'
+' Usage cscript wshRunX.vbs <username> <password> <server hostname> <path to testDrop.zip>
+'
+
+' Get the command line arguments
+set args = WScript.Arguments
+
+' Check that all arguments have been specified
+Set objShell = WScript.CreateObject("WScript.Shell")
+Set env = objShell.Environment("Process")
+checkEnvVars(env)
+
+' Invoke the web application and write the result to stdOut
+WScript.StdOut.Write doTestRunX(env("ats3.username"), env("ats3.password"), env("ats3.host"), env("ats3.pathToDrop"), URLEncode( env("ats3.schedule") ))
+
+' Quit the script
+Wscript.Quit
+
+Function checkEnvVars(env)
+	if env("ats3.username") = "" then
+		WScript.Echo "Environment variable ats3.username not specified"
+		WScript.Quit 1
+	elseif env("ats3.password") = "" then
+		WScript.Echo "Environment variable ats3.password not specified"
+		WScript.Quit 1
+	elseif env("ats3.host") = "" then
+		WScript.Echo "Environment variable ats3.host not specified"
+		WScript.Quit 1		
+	elseif env("ats3.pathToDrop") = "" then
+		WScript.Echo "Environment variable ats3.pathToDrop not specified"
+		WScript.Quit 1	
+	end if
+End Function
+
+' Invoke the ATS3 web application in given host with the specified username, password and file path
+Function doTestRunX(uname, password, hostName, pathToDrop, schedule)
+    On Error Resume Next
+    
+	'If the given hostname contain port, use it otherwise use the default 8080
+        if(InStr(1, hostName, ":", VBTEXTCOMPARE) = 0) then
+        	hostName = hostName & ":8080"
+        end if        
+
+	Set objxmlHTTP = CreateObject("MSXML2.ServerXMLHTTP.3.0")
+	objxmlHTTP.setTimeouts 0,60000,3600000,3600000
+	
+	Call objxmlHTTP.open("POST", "http://" & hostName & "/ats3/XTestRunExecute.do?username=" & uname & "&password=" & password & "&schedule=" & schedule, False)
+	objxmlHTTP.setRequestHeader "Content-Type", "multipart/form-data; boundary=AaB03x"
+		
+	Set BinaryStream = CreateObject("ADODB.Stream")
+	BinaryStream.Type = 1
+	BinaryStream.Open
+	BinaryStream.LoadFromFile pathToDrop
+	If Err.Number <> 0 Then
+		WScript.Echo "Error loading file: " + pathToDrop
+    	WScript.Quit 1
+	End if
+	
+	objxmlHTTP.Send BuildFormData(BinaryStream.Read,"AaB03x","testDrop.zip","testDrop")
+	If Err.Number <> 0 Then
+		WScript.Echo "Error sending data to server: " + hostName
+    	WScript.Quit 1
+	End if	
+	
+    BinaryStream.Close
+
+    if objxmlHTTP.status = 200 then
+    	doTestRunX = objxmlHTTP.ResponseText
+    else
+        WScript.Echo "Error importing test run: " + objxmlHTTP.ResponseText
+    	WScript.Quit 1
+	end if
+End Function
+
+Function BuildFormData(FileContents, Boundary, FileName, FieldName)
+  Dim FormData, Pre, Po
+  Const ContentType = "application/upload"
+  
+  'The two parts around file contents In the multipart-form data.
+  Pre = "--" + Boundary + vbCrLf + mpFields(FieldName, FileName, ContentType)
+  Po = vbCrLf + "--" + Boundary + "--" + vbCrLf
+  
+  'Build form data using recordset binary field
+  Const adLongVarBinary = 205
+  Dim RS: Set RS = CreateObject("ADODB.Recordset")
+  RS.Fields.Append "b", adLongVarBinary, Len(Pre) + LenB(FileContents) + Len(Po)
+  RS.Open
+  RS.AddNew
+    Dim LenData
+    'Convert Pre string value To a binary data
+    LenData = Len(Pre)
+    RS("b").AppendChunk (StringToMB(Pre) & ChrB(0))
+    Pre = RS("b").GetChunk(LenData)
+    RS("b") = ""
+    
+    'Convert Po string value To a binary data
+    LenData = Len(Po)
+    RS("b").AppendChunk (StringToMB(Po) & ChrB(0))
+    Po = RS("b").GetChunk(LenData)
+    RS("b") = ""
+    
+    'Join Pre + FileContents + Po binary data
+    RS("b").AppendChunk (Pre)
+    RS("b").AppendChunk (FileContents)
+    RS("b").AppendChunk (Po)
+  RS.Update
+  FormData = RS("b")
+  RS.Close
+  BuildFormData = FormData
+End Function
+
+Function mpFields(FieldName, FileName, ContentType)
+  Dim MPTemplate 'template For multipart header
+  MPTemplate = "Content-Disposition: form-data; name=""{field}"";" + _
+   " filename=""{file}""" + vbCrLf + _
+   "Content-Type: {ct}" + vbCrLf + vbCrLf
+  Dim Out
+  Out = Replace(MPTemplate, "{field}", FieldName)
+  Out = Replace(Out, "{file}", FileName)
+  mpFields = Replace(Out, "{ct}", ContentType)
+End Function
+
+Function StringToMB(S)
+  Dim I, B
+  For I = 1 To Len(S)
+    B = B & ChrB(Asc(Mid(S, I, 1)))
+  Next
+  StringToMB = B
+End Function
+
+Function URLEncode(data)
+	data = replace(data,"\","/")
+	data = replace(data,"$","%24")
+	data = replace(data,"&","%26")
+	data = replace(data,"+","%2B")
+	data = replace(data,",","%2C")
+	data = replace(data,"/","%2F")
+	data = replace(data,":","%3A")
+	data = replace(data,";","%3B")
+	data = replace(data,"=","%3D")
+	data = replace(data,"?","%3F")
+	data = replace(data,"@","%40")
+	URLEncode = data
+End Function
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/ats/wshTestRunX.vbs	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,78 @@
+'
+' WScript that will invoke the test run execute functionality at ATS3 web server without installing any ATS3
+' specific programs on the local PC.
+'
+' Password must be given in encrypted format and the path to test drop must be in URLEncoded
+'
+' Usage cscript wshRunX.vbs <username> <password> <server hostname> <path to testDrop.zip>
+'
+
+' Get the command line arguments
+set args = WScript.Arguments
+
+' Check that all arguments have been specified
+Set objShell = WScript.CreateObject("WScript.Shell")
+Set env = objShell.Environment("Process")
+checkEnvVars(env)
+
+' Invoke the web application and write the result to stdOut
+WScript.StdOut.Write doTestRunX(env("ats3.username"), env("ats3.password"), env("ats3.host"), URLEncode( env("ats3.pathToDrop") ), URLEncode( env("ats3.schedule") ))
+
+' Quit the script
+Wscript.Quit
+
+Function checkEnvVars(env)
+	if env("ats3.username") = "" then
+		WScript.Echo "Environment variable ats3.username not specified"
+		WScript.Quit 1
+	elseif env("ats3.password") = "" then
+		WScript.Echo "Environment variable ats3.password not specified"
+		WScript.Quit 1
+	elseif env("ats3.host") = "" then
+		WScript.Echo "Environment variable ats3.host not specified"
+		WScript.Quit 1		
+	elseif env("ats3.pathToDrop") = "" then
+		WScript.Echo "Environment variable ats3.pathToDrop not specified"
+		WScript.Quit 1	
+	end if
+End Function
+
+' Invoke the ATS3 web application in given host with the specified username, password and file path
+Function doTestRunX(uname, password, hostName, pathToDrop, schedule)
+    On Error Resume Next
+    
+	'If the given hostname contain port, use it otherwise use the default 8080
+        if(InStr(1, hostName, ":", VBTEXTCOMPARE) = 0) then
+        	hostName = hostName & ":8080"
+        end if    
+    
+	Set objxmlHTTP = CreateObject("Microsoft.XMLHTTP")
+	Call objxmlHTTP.open("GET", "http://" & hostName & "/ats3/XTestRunExecute.do?username=" & uname & "&password=" & password & "&testrunpath=" & pathToDrop & "&schedule=" & schedule, False)
+	objxmlHTTP.Send()
+	If Err.Number <> 0 Then
+		WScript.Echo "Error sending data to server: " + hostName
+    	WScript.Quit 1
+	End if		
+
+    if objxmlHTTP.status = 200 then
+    	doTestRunX = objxmlHTTP.ResponseText
+    else
+        WScript.Echo "Error importing test run: " + objxmlHTTP.ResponseText
+    	WScript.Quit 1
+	end if
+End Function
+
+Function URLEncode(data)
+	data = replace(data,"\","/")
+	data = replace(data,"$","%24")
+	data = replace(data,"&","%26")
+	data = replace(data,"+","%2B")
+	data = replace(data,",","%2C")
+	data = replace(data,"/","%2F")
+	data = replace(data,":","%3A")
+	data = replace(data,";","%3B")
+	data = replace(data,"=","%3D")
+	data = replace(data,"?","%3F")
+	data = replace(data,"@","%40")
+	URLEncode = data
+End Function
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/eunit/eunit.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : eunit.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="_testing.eunit">
+    <description>
+        Testing using EUnit. (For WINSCW)
+    </description>
+
+    <!-- Unzip test package to build drive. -->
+    <target name="prepare-eunit" if="enabled.ats">
+        <unzip src="${eunit.prepare.zip}" dest="${build.drive}/" />
+    </target>
+
+    <!-- Runs eunittests for Java code -->
+    <target name="eunittest" depends="prepare-eunit">
+        <for list="${eunit.dlls}" delimiter="," param="eunit.dll">
+            <sequential>
+                <exec executable="${build.drive}/epoc32/release/winscw/udeb/EUnitExeRunner.exe" dir="${build.drive}/epoc32/release/winscw/udeb" failonerror="${failonerror}">
+                    <arg line="@{eunit.dll}" />
+                </exec>
+            </sequential>
+        </for>
+        <copy file="${build.drive}\epoc32\winscw\c\shared\Eunit\logs\Eunit_Log.xml" tofile="${build.log.dir}\${build.id}_Eunit_Log.xml" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/mobilecrash/mobilecrash.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : mobilecrash.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="_testing.mobilecrash" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Supporting the MobileCrash crash analysis tool.
+    </description>
+
+
+    <!--
+    Prepare Engineer English files for analysis with the selge tool.
+    * Creates the output folders.
+    * Zips up all the mapfiles as input to \output\development_flash_images\engineering_english\.
+    * Parses the .log files to extract the checksum (which is used as ROM ID), and stores in a temporary file(ee_symbols.txt).
+    * Map the checksum to the appropriate Mapfiles.zip in ee_mapfiles.txt.
+
+    The check-env-mobilecrash-prep task ensures that there are some log files to parse, i.e. it is worth running the mobilecrash preparation.
+    -->
+    <target name="mobilecrash-prep-ee">
+        <mkdir dir="${build.output.dir}/build" />
+        <mkdir dir="${build.drive}${ee.rom.output.dir}" />
+        <zip basedir="${build.drive}\\epoc32\release\armv5\urel" includes="*.map" destfile="${build.drive}${ee.rom.output.dir}/Mapfiles.zip" />
+        <propertyregex input="${publish.dir}" property="proj.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <propertyregex input="${ee.rom.output.dir}" property="rom.network.dir" regexp="\\output" replace="" global="true" />
+        <propertyregex input="${rom.network.dir}" property="rom.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <for param="file">
+            <path>
+                <fileset dir="${build.drive}${ee.rom.output.dir}" includes="**/*.rom.log" />
+            </path>
+            <sequential>
+                <!-- write the checksum along with the location of the corresponding .symbol file -->
+                <propertyregex override="true" property="symbol.file.location" input="@{file}" regexp="\w:\\output(\\[^\.]*\\[^\\]+\.rom)\.log" replace="${proj.dir}\1\.symbol" />
+                <echo message="${symbol.file.location}" />
+                <propertyregex override="true" input="${symbol.file.location}" property="parsed.symbol.file.location" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+                <concat destfile="${build.output.dir}/build/ee_symbols.txt" append="yes">
+                    <fileset file="@{file}" />
+                    <filterchain>
+                        <tokenfilter>
+                            <containsregex pattern="Checksum word:" flags="i" />
+                            <replaceregex pattern="Checksum word:\s*(\w*)" replace="\1=${parsed.symbol.file.location}" flags="gi" />
+                        </tokenfilter>
+                    </filterchain>
+                </concat>
+                <!-- write the checksum with the corresponding mapfile zip location -->
+                <concat destfile="${build.output.dir}/build/ee_mapfiles.txt" append="yes">
+                    <fileset file="@{file}" />
+                    <filterchain>
+                        <tokenfilter>
+                            <containsregex pattern="Checksum word:" flags="i" />
+                            <replaceregex pattern="Checksum word:\s*(\w*)" replace="\1=${proj.dir}\\${rom.dir}\\\\Mapfiles.zip" flags="gi" />
+                        </tokenfilter>
+                    </filterchain>
+                </concat>
+            </sequential>
+        </for>
+    </target>
+    <!--
+    Prepare files for analysis with the selge tool.
+    * Creates the output folders.
+    * Zips up all the mapfiles as input to \output\release_flash_images\.
+    * Parses the .log files to extract the checksum (which is used as ROM ID), and stores in a temporary file(core_symbols.txt).
+    * Map the checksum to the appropriate Mapfiles.zip in core_mapfiles.txt.
+
+    
+    -->
+    <target name="mobilecrash-prep-loc">
+        <mkdir dir="${build.output.dir}/build" />
+        <mkdir dir="${build.drive}${core.rom.output.dir}" />
+        <zip basedir="${build.drive}\\epoc32\release\armv5\urel" includes="*.map" destfile="${build.drive}${core.rom.output.dir}/Mapfiles.zip" />
+        <propertyregex input="${publish.dir}" property="proj.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <propertyregex input="${core.rom.output.dir}" property="core.rom.network.dir" regexp="\\output" replace="" global="true" />
+        <propertyregex input="${core.rom.network.dir}" property="core.rom.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <for param="file">
+            <path>
+                <fileset dir="${build.drive}${core.rom.output.dir}" includes="**/*.rom.log" />
+            </path>
+            <sequential>
+                <!-- write the checksum along with the location of the corresponding .symbol file -->
+                <propertyregex override="true" property="symbol.file.location" input="@{file}" regexp="\w:\\output(\\[^\.]*\\[^\\]+\.rom)\.log" replace="${proj.dir}\1\.symbol" />
+                <echo message="${symbol.file.location}" />
+                <propertyregex override="true" input="${symbol.file.location}" property="parsed.symbol.file.location" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+                <concat destfile="${build.output.dir}/build/core_symbols.txt" append="yes">
+                    <fileset file="@{file}" />
+                    <filterchain>
+                        <tokenfilter>
+                            <containsregex pattern="Checksum word:" flags="i" />
+                            <replaceregex pattern="Checksum word:\s*(\w*)" replace="\1=${parsed.symbol.file.location}" flags="gi" />
+                        </tokenfilter>
+                    </filterchain>
+                </concat>
+                <!-- write the checksum with the corresponding mapfile zip location -->
+                <concat destfile="${build.output.dir}/build/core_mapfiles.txt" append="yes">
+                    <fileset file="@{file}" />
+                    <filterchain>
+                        <tokenfilter>
+                            <containsregex pattern="Checksum word:" flags="i" />
+                            <replaceregex pattern="Checksum word:\s*(\w*)" replace="\1=${proj.dir}\\${core.rom.dir}\\\\Mapfiles.zip" flags="gi" />
+                        </tokenfilter>
+                    </filterchain>
+                </concat>
+            </sequential>
+        </for>
+    </target>
+    <!--
+    * Load rom IDs, core rom IDs and their mapfiles from the text file mobilecrash-prep-ee and mobilecrash-prep-loc
+    * Copies a template selge.ini file to flashfiles sub-directory, replacing tokens with suitable content based on list of ROM IDs.
+    -->
+    <target name="mobilecrash-final">
+        <propertyregex input="${ee.rom.output.dir}" property="ee.rom.network.dir" regexp="\\output" replace="" global="true" />
+        <propertyregex input="${core.rom.output.dir}" property="core.rom.network.dir" regexp="\\output" replace="" global="true" />
+        <propertyregex input="${publish.dir}" property="proj.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <propertyregex input="${ee.rom.network.dir}" property="ee.rom.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <propertyregex input="${core.rom.network.dir}" property="core.rom.dir" regexp="\\" replace="\\\\\\\\\\\\\\\\" global="true" />
+        <loadfile property="ee.symbol.files" srcFile="${build.output.dir}/build/ee_symbols.txt" failonerror="false" />
+        <loadfile property="ee.mapfiles" srcFile="${build.output.dir}/build/ee_mapfiles.txt" failonerror="false" />
+        <loadfile property="loc.symbol.files" srcFile="${build.output.dir}/build/core_symbols.txt" failonerror="false" />
+        <loadfile property="loc.mapfiles" srcFile="${build.output.dir}/build/core_mapfiles.txt" failonerror="false" />
+        <copy file="${helium.dir}/tools/mobilecrash/selge.ini" todir="${build.drive}${core.rom.output.dir}" overwrite="true" failonerror="false">
+            <filterchain>
+                <replacetokens>
+                    <token key="ROMIDS" value="${ee.symbol.files}${loc.symbol.files}" />
+                    <token key="MAPFILES" value="${ee.mapfiles}${loc.mapfiles}" />
+                </replacetokens>
+            </filterchain>
+        </copy>
+    </target>
+
+    <!--
+    Publish EE MobileCrash selge.ini
+    -->
+    <target name="publish-mobilecrash" if="publish">
+        <copy file="${build.drive}${core.rom.output.dir}/selge.ini" tofile="${selge.ini.network.dir}\\${build.id}_selge.ini" overwrite="true" failonerror="false" />
+    </target>
+
+
+
+    <!--
+    Prepare files for analysis with the selge tool.
+
+    * Zips up all the mapfiles as input to selge.
+    * Parses the .symbol files to extract the checksum (which is used as ROM ID), and stores in a temporary file.
+    * Copies a template selge.ini file to flashfiles sub-directory, replacing tokens with suitable content based on list of ROM IDs.
+
+    The check-env-mobilecrash-prep task ensures that there are some log files to parse, i.e. it is worth running the mobilecrash preparation.
+    <target name="mobilecrash-prep" depends="check-env-mobilecrash-prep" if="variant.flashfiles.available" description="Creates the files needed for analysing MobileCrash logs from Auto SMS">
+        <mkdir dir="${build.output.dir}/development_rom_images/variants/${product.name}_prd/CoreImage"/>
+        <zip basedir="${build.drive}/epoc32/release/armv5/urel" includes="*.map" destfile="${build.output.dir}/development_rom_images/variants/${product.name}_prd/CoreImage/Mapfiles.zip"/>
+        <propertyregex input="${publish.dir}" property="proj.dir" regexp="\\" replace="\\\\" global="true"/>
+        <concat destfile="${build.dir}/romids.txt" append="yes">
+            <fileset dir="${build.output.dir}/development_rom_images/variants/${product.name}_prd/CoreImage" includes="*_rom.log"/>
+            <filterchain>
+                <tokenfilter>
+                    <containsregex pattern="Checksum word:" flags="i"/>
+                    <replaceregex pattern="Checksum word:\s*(\w*)" replace="\1=${proj.dir}\\flashfiles\\variants\\${product.name}_prd\\CoreImage" flags="gi"/>
+                </tokenfilter>
+            </filterchain>
+        </concat>
+        <concat destfile="${build.dir}/romids.txt" append="yes">
+            <fileset dir="${build.output.dir}/development_rom_images/variants/${product.name}_rnd/CoreImage/internal" includes="*_rom.log"/>
+            <filterchain>
+                <tokenfilter>
+                    <containsregex pattern="Checksum word:" flags="i"/>
+                    <replaceregex pattern="Checksum word:\s*(\w*)" replace="\1=${proj.dir}\\flashfiles\\variants\\${product.name}_rnd\\CoreImage\\internal" flags="gi"/>
+                </tokenfilter>
+            </filterchain>
+        </concat>
+        <loadfile property="romids" srcFile="${build.dir}/romids.txt" failonerror="false"/>
+        <loadfile property="mapfiles" srcFile="${build.dir}/romids.txt" failonerror="false">
+            <filterchain>
+                <tokenfilter>
+                    <replaceregex pattern="prd" replace="rnd" flags="gi"/>
+                    <replaceregex pattern="^([^=]*).*" replace="\1=${proj.dir}\\flashfiles\\variants\\${product.name}_prd\\CoreImage\\Mapfiles.zip" flags="gi"/>
+                </tokenfilter>
+            </filterchain>
+        </loadfile>
+        <copy file="${env.dir}/selge.ini" todir="${build.output.dir}/development_rom_images/variants/${product.name}_prd/CoreImage" overwrite="true" failonerror="false">
+            <filterchain>
+                <replacetokens>
+                    <token key="ROMIDS" value="${romids}"/>
+                    <token key="MAPFILES" value="${mapfiles}"/>
+                </replacetokens>
+            </filterchain>
+        </copy>
+        <copy file="${build.output.dir}/development_rom_images/variants/${product.name}_prd/CoreImage/selge.ini" tofile="${env.SELGE_INI_NETWORK_DIR}/${build.id}_selge.ini" overwrite="true" failonerror="false"/>
+    </target>
+    <target name="publish-mobilecrash" if="publish" description="Publish EE MobileCrash selge.ini">
+        <copy file="${build.drive}${core.rom.output.dir}/selge.ini" tofile="${selge.ini.network.dir}\\${build.id}_selge.ini" overwrite="true" failonerror="false"/>
+    </target>
+     -->
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/mobilecrash/selge.ini	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,6 @@
+[ROMID]
+@ROMIDS@
+
+[MAPFILES]
+@MAPFILES@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/testing/testing.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : testing.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="testing">
+
+    <!-- ATS testing -->
+    <import file="ats/ats.ant.xml" />
+
+    <!-- EUnit testing -->
+    <import file="eunit/eunit.ant.xml" />
+
+    <import file="mobilecrash/mobilecrash.ant.xml" />
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/uda/uda.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : uda.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="uda" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        UDA image creation.
+    </description>
+    <property name="uda.makefile.target" value="uda_roms" />
+
+
+    <!-- Creates uda rom images according to configuration -->
+    <target name="uda-roms" depends="rombuild-create-makefile">
+        <!-- get product path -->
+        <record name="${build.log.dir}/${build.id}_uda.log" action="start" />
+        <for list="${product.list}" delimiter="," param="product.name">
+            <sequential>
+                <hlm:rombuildImakerMacro product="@{product.name}" target="${uda.makefile.target}" />
+            </sequential>
+        </for>
+        <record name="${build.log.dir}/${build.id}_uda.log" action="stop" />
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_uda.log" />
+                <metadatafilterset refid="filterset.uda.roms" />
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_uda.log" />
+        <!-- Todo: metadata: insert assertions for metadata parsing here -->
+    </target>
+
+    <!-- Toplevel target for UDA image creation process.
+       <deprecated>Please move to iMaker.</deprecated>
+     -->
+    <target name="uda" depends="uda-roms" />
+
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/bin/gpl.licence.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Binary file imgtools/imaker/bin/mingw_make.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/group/bld.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: iMaker Buildrom plugins exports
+*
+*/
+
+
+PRJ_EXPORTS
+
+../plugincommon.pm                              +/tools/ //
+../hide.pm                                      +/tools/ //
+../localise.pm                                  +/tools/ //
+../localise_all_resources.pm                    +/tools/ //
+../obyparse.pm                                  +/tools/ //
+../override.pm                                  +/tools/ //
+
+// END OF BLD.INF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/hide.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,144 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Buildrom plugin for hiding entire iby files.
+# Adds a HIDEALL keyword to hide content.
+#
+
+
+
+##############################################################################
+#
+# Syntax: HIDEALLBEGIN
+#         ..
+#         HIDEALLEND
+#
+# Example:
+# HIDEALLBEGIN
+# #include <browserui.iby>
+# #include <BrowserResources.iby>
+# HIDEALLEND
+# hides all target files in browserui.iby
+#
+##############################################################################
+
+
+package hide;
+use strict;
+use plugincommon;
+
+BEGIN
+  {
+  use Exporter ();
+  our ( $VERSION, @ISA, @EXPORT );
+  # set the version for version checking
+  $VERSION     = 1.00;
+
+  @ISA         = qw( Exporter );
+  @EXPORT      = qw(&hide_info
+                    &do_hide_extension
+                    &is_hideallbegin
+                    &is_hideallend );
+  }
+
+my %hide_infostruct =
+  (
+  name => "hide",
+  invocation => "InvocationPoint2.5",
+  single => "hide::do_hide_extension"
+  );
+
+my $line;
+my @newobydata;
+my %languages;
+my $defaultLang;
+my $verbose=0;
+my $errors=0;
+
+sub hide_info
+  {
+  return \%hide_infostruct;
+  }
+
+sub do_hide_extension
+{
+  print "Running plugin hide.pm\n";
+  my $obydata = shift;
+  my $depth = 0;
+  my $inhide = 0;
+  undef @newobydata;
+  foreach $line (@{$obydata})
+  {
+    if ($line =~ /^\s*REM/i)
+    {
+      # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
+      push @newobydata, $line;
+      next;
+    }
+    if (is_hideallbegin($line))
+    {
+      push @newobydata, "REM handled $line";
+      $inhide = 1;
+      print "DoHide inhide\n" if $verbose;
+      next;
+    }
+    if (is_hideallend($line))
+    {
+      print "DoHide inhide end!\n" if $verbose;
+      $inhide = 0;
+      push @newobydata, "REM handled $line";
+      next;
+    }
+    # inhide, hide all target files and data entries
+    if ($inhide)
+    {
+      if (is_entry($line))
+      {
+        my $target = get_target_from_entry($line);
+        print "DoHide target $target!\n" if $verbose;
+        push @newobydata, "hide=$target\n";
+        next;
+      }
+    }
+    # Default case
+    push @newobydata, $line;
+  }
+  @{$obydata} = @newobydata;
+  print "========================== End DoHideExtension =======================\n" if $verbose;
+  #Stop image creation in error case
+  #exit(1) if ($errors);
+
+}
+
+sub is_hideallbegin
+{
+  my $entry = shift;
+  if ($entry=~/^\s*HIDEALLBEGIN\s*$/i)
+  {
+    return 1;
+  }
+  return 0;
+}
+
+sub is_hideallend
+{
+  my $entry = shift;
+  if ($entry=~/^\s*HIDEALLEND\s*$/i)
+  {
+    return 1;
+  }
+  return 0;
+}
+
+1;  # Return a true value from the file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/localise.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,354 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Adds a LOCALISE macro that enables configuration of localised files.
+# The localised language selection is done with a ADD_LANGUAGE macro.
+#
+
+
+
+###############################################################################
+#
+# Syntax: LOCALISE
+#   type=LOCALISE(source, target[, languages])
+#   source => the source file. The section that needs to be localised should be marked with ??.
+#   target => the target file. The section that needs to be localised should be marked with ??.
+#   languages => a space delimited list of language codes
+#
+# Syntax: ADD_LANGUAGE
+#   ADD_LANGUAGE lang
+#
+# Example:
+# Add languages
+# ADD_LANGUAGE 01
+# ADD_LANGUAGE 02
+# ADD_LANGUAGE 03
+#
+# Use Case 1:
+# Localises a App resoure file.
+#   data=LOCALISE(APP_RESOURCE_DIR\App.r??, RESOURCE_DIR\app.r??)
+# Output:
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#
+# Use Case 2:
+# Localise all resource files under a section
+# ADD_LANGUAGE 01
+# ADD_LANGUAGE 02
+# ADD_LANGUAGE 03
+#
+# LOCALISE_ALL_RESOURCES_BEGIN
+# // All resource files will be localised
+# data=APP_RESOURCE_DIR\App.rsc RESOURCE_DIR\app.rsc
+# data=APP_RESOURCE_DIR\App2.rsc RESOURCE_DIR\app2.rsc
+# LOCALISE_ALL_RESOURCES_END
+# Output:
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#
+###############################################################################
+
+
+package localise;
+use strict;
+use localise_all_resources;
+
+BEGIN
+  {
+  use Exporter ();
+  our ( $VERSION, @ISA, @EXPORT );
+  # set the version for version checking
+  $VERSION     = 1.00;
+
+  @ISA         = qw( Exporter );
+  @EXPORT      = qw( &localise_info
+                     &do_localise_extension
+                     &convert_lang
+                     &trim
+                     &is_addlanguage_entry
+                     &get_lang_from_addlanguage_entry
+                     &is_localise_entry
+                     &get_type_from_localise_entry
+                     &get_source_from_localise_entry
+                     &get_target_from_localise_entry
+                     &get_langs_from_localise_entry
+                     &parse_component_langs
+                     &expand_localise_macro
+                     &is_language_in_component_langs
+                      );
+  }
+
+my %localise_infostruct =
+  (
+  name => "localise",
+  invocation => "InvocationPoint1",
+  single => "localise::do_localise_extension"
+  );
+
+my $line;
+my @newobydata;
+my %languages;
+my $verbose=0;
+my $errors=0;
+my $localise_all_resource=0;
+
+sub localise_info
+  {
+  return \%localise_infostruct;
+  }
+
+# Entry point for the plugi
+sub do_localise_extension
+{
+  print "========================== Begin do_localise_extension =======================\n" if $verbose;
+  my $obydata = shift;
+  do_localise_all_resources_extension(\@{$obydata});
+
+
+  undef @newobydata;
+  foreach $line (@{$obydata})
+  {
+    # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
+    if ($line =~ /^\s*REM/i)
+    {
+      push @newobydata, $line;
+      next;
+    }
+    # ADD_LANGUAGE xx
+    if (is_addlanguage_entry($line))
+    {
+      my $code = get_lang_from_addlanguage_entry($line);
+      if ($code !~ /^\w\w+$/)
+      {
+        print "ERROR: bad default language code $code";
+        #$errors++;
+        next;
+      }
+      else
+      {
+        print "adding language $code\n" if $verbose;
+        $languages{$code} = 1;
+        push @newobydata, "REM handled $line";
+        next;
+      }
+    }
+    # LOCALISE macro
+    if (is_localise_entry($line))
+    {
+      my @newdata = expand_localise_macro($line,\%languages);
+      push @newobydata, @newdata;
+      next;
+    }
+    # Default case
+    push @newobydata, $line;
+  }
+  @{$obydata} = @newobydata;
+  print "========================== End do_localise_extension =======================\n" if $verbose;
+  #Stop image creation in error case
+  #exit(1) if ($errors);
+}
+
+sub expand_localise_macro
+{
+  my $data         = $_[0];
+  my %theLanguages = %{ $_[1] };
+  my @localised = ();
+  print "LOCALISE $data\n" if $verbose;
+
+  my $type   = get_type_from_localise_entry($data);
+  my $source = get_source_from_localise_entry($data);
+  my $target = get_target_from_localise_entry($data);
+  my %componentLangs = get_langs_from_localise_entry($data);
+
+  my @languages = sort keys %theLanguages;
+  foreach my $lang (@languages)
+  {
+    print "Language ".$lang."\n" if $verbose;
+    my $sourcedata = convert_lang($source,$lang);
+    my $targetdata = convert_lang($target,$lang);
+
+    # Check does the component have overriding configurations
+    # The component specific setting can define the component to ignore localisation
+    if ( !is_language_in_component_langs($lang,\%componentLangs) )
+    {
+      #Component specific configuration overrides the global lang definitions
+      print "WARNING: Component specific configuration removes this resource $source\n"  if $verbose;
+      next;
+    }
+
+    my $data = "$type=$sourcedata $targetdata\n";
+    print "lang data $data\n" if $verbose;
+    #push the data to the new structure
+    push @localised, $data;
+  }
+  return @localised;
+}
+
+sub is_language_in_component_langs($$)
+{
+  my $lang           = $_[0];
+  my %componentLangs = %{ $_[1] };
+  #Check whether the component langs is empty
+  if ( (keys %componentLangs) > 0)
+  {
+    if (exists $componentLangs{ $lang })
+    {
+      return $componentLangs{ $lang };
+    }
+    else
+    {
+      return 0;
+    }
+  }
+  else
+  {
+    return 1;
+  }
+
+}
+# trim(string)
+# Removes spaces from both ends of the string.
+# Returns a trimmed string.
+sub trim($)
+{
+  my $string = shift;
+  $string =~ s/^\s+//;
+  $string =~ s/\s+$//;
+  return $string;
+}
+
+# convert_lang(string)
+# convert the string ?? part to the lang specific
+sub convert_lang($$)
+{
+  my $res = shift;
+  my $lang= shift;
+  my $count = ($res =~ tr/%//);
+  #create array with count amount of time of lang
+  my @data = ();
+  for (my $i=0; $i<$count; $i++) {
+    push(@data, $lang);
+  }
+  my $output = sprintf($res,@data);
+  return $output;
+}
+# match ADD_LANGUAGE 01
+sub is_addlanguage_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*ADD_LANGUAGE\s+(\S+)\s*/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+#
+sub get_lang_from_addlanguage_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*ADD_LANGUAGE\s+(\S+)/i )
+  {
+    return $1;
+  }
+  return "";
+}
+
+# match data=LOCALISE(foobar.rsc, resource/foobar.rsc)
+sub is_localise_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*\S+\s*=\s*LOCALISE(\s*(\S+),\s*(\S+))/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+# get the type from an iby entry
+sub get_type_from_localise_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=/i )
+  {
+    return $1;
+  }
+  return "";
+}
+# get the source file from an iby entry
+sub get_source_from_localise_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*LOCALISE\(\s*([^, ]+)\s*,/i )
+  {
+    return $2;
+  }
+  return "";
+}
+# get the target file from an iby entry
+sub get_target_from_localise_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*LOCALISE\(\s*([^, ]+)\s*,\s*([^, ]+)(,|\))/i )
+  {
+    return $3;
+  }
+  return "";
+}
+# get the target file from an iby entry
+sub get_langs_from_localise_entry($)
+{
+  my $entry = shift;
+  my %emptyhash;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*LOCALISE\(\s*([^, ]+)\s*,\s*([^, ]+)\s*,\s*(.*?)\)/i )
+  {
+    if ($4)
+    {
+      return parse_component_langs($4);
+    }
+  }
+  return %emptyhash;
+}
+sub parse_component_langs($)
+{
+  my $langs = shift;
+  my %cLangs;
+  foreach my $item (split(/ /,$langs))
+  {
+  print "lang item $item\n" if $verbose;
+  if ($item =~ /^(\w\w+)$/)
+    {
+    print "include component specific language $1\n" if $verbose;
+    $cLangs{$1} = 1;
+    }
+  elsif ($item =~ /^!(\w\w+)$/)
+    {
+    print "exclude component specific language $1\n" if $verbose;
+    $cLangs{$1} = 0;
+    }
+  else
+    {
+    print "ERROR: bad default language code in $item localise macro $langs\n";
+    $errors++;
+    next;
+    }
+  }
+  return %cLangs;
+}
+
+
+1;  # Return a true value from the file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/localise_all_resources.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,477 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Adds a LOCALISE macro that enables configuration of localised files.
+# The localised language selection is done with a ADD_LANGUAGE macro.
+#
+
+
+
+###############################################################################
+#
+# Syntax: LOCALISE
+#   type=LOCALISE(source, target[, languages])
+#   source => the source file. The section that needs to be localised should be marked with ??.
+#   target => the target file. The section that needs to be localised should be marked with ??.
+#   languages => a space delimited list of language codes
+#
+# Syntax: ADD_LANGUAGE
+#   ADD_LANGUAGE lang
+#
+# Example:
+# Add languages
+# ADD_LANGUAGE 01
+# ADD_LANGUAGE 02
+# ADD_LANGUAGE 03
+#
+# Use Case 1:
+# Localises a App resoure file.
+#   data=LOCALISE(APP_RESOURCE_DIR\App.r??, RESOURCE_DIR\app.r??)
+# Output:
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#
+# Use Case 2:
+# Localise all resource files under a section
+# ADD_LANGUAGE 01
+# ADD_LANGUAGE 02
+# ADD_LANGUAGE 03
+#
+# LOCALISE_ALL_RESOURCES_BEGIN
+# // All resource files will be localised
+# data=APP_RESOURCE_DIR\App.rsc RESOURCE_DIR\app.rsc
+# data=APP_RESOURCE_DIR\App2.rsc RESOURCE_DIR\app2.rsc
+# LOCALISE_ALL_RESOURCES_END
+# Output:
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#
+###############################################################################
+
+#
+# Version 4
+# Path corrections to widget support.
+#
+# Version 3
+# Support for Idle widgets.
+#
+# Version 2
+# Localises also *.hlp to *.h%s.
+#
+# Version 1
+# Initial version.
+
+
+package localise_all_resources;
+use strict;
+
+BEGIN
+  {
+  use Exporter ();
+  our ( $VERSION, @ISA, @EXPORT );
+  # set the version for version checking
+  $VERSION     = 1.00;
+
+  @ISA         = qw( Exporter );
+  @EXPORT      = qw( &localise_all_resources_info
+                     &do_localise_all_resources_extension
+                     &is_localise_all_resources_begin
+                     &is_localise_all_resources_end
+                     &is_resource_entry
+                     &is_help_entry_xhtml
+                     &is_help_entry_hlp
+                     &is_dtd_entry
+                     &is_active_idle_entry
+                     &is_elocl_entry
+                     &get_type_from_entry
+                     &get_source_from_entry
+                     &get_target_from_entry
+                     &create_localise_entry_from_resource
+                     &create_localise_entry_from_help
+                     &create_localise_entry_from_dtd
+                     &create_localise_entry_from_active_idle
+                     &create_localise_entry_from_elocl
+                      );
+  }
+
+my %localise_all_resources_infostruct =
+  (
+  name => "localise_all_resources",
+  invocation => "InvocationPoint1",
+  single => "localise_all_resources::do_localise_all_resources_extension"
+  );
+
+my $line;
+my @newobydata;
+my %languages;
+my $verbose=0;
+my $errors=0;
+my $localise_all_resource=0;
+
+sub localise_all_resources_info
+  {
+  return \%localise_all_resources_infostruct;
+  }
+
+# Entry point for the plugi
+sub do_localise_all_resources_extension
+{
+  print "========================== Begin localise_all_resources =======================\n" if $verbose;
+  my $obydata = shift;
+
+  undef @newobydata;
+  foreach $line (@{$obydata})
+  {
+    # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
+    if ($line =~ /^\s*REM/i)
+    {
+      push @newobydata, $line;
+      next;
+    }
+    # LOCALISE_ALL_RESOURCES_BEGIN
+    if (is_localise_all_resources_begin($line))
+    {
+      $localise_all_resource = 1;
+      push @newobydata, "REM handled $line";
+      next;
+    }
+    # LOCALISE_ALL_RESOURCES_END
+    if (is_localise_all_resources_end($line))
+    {
+      $localise_all_resource = 0;
+      push @newobydata, "REM handled $line";
+      next;
+    }
+    if ( $localise_all_resource )
+    {
+      # localise all rsc files inside the localise_all_resources section
+      # resource files .rsc
+      if ( is_resource_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localise_entry_from_resource($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # help files .hlp
+      if ( is_help_entry_hlp($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localise_entry_from_help_hlp($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # localise the .dtd files that have \\01\\ in their source target path
+      if ( is_dtd_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localisable_path($line);
+        $line = create_localise_entry_from_dtd($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # localise the active idle .o0001 files
+      if ( is_active_idle_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localisable_path($line);
+        $line = create_localise_entry_from_active_idle($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # localise the elocl file
+      if ( is_elocl_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localise_entry_from_elocl($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+
+    }
+    # Default case
+    push @newobydata, $line;
+  }
+  @{$obydata} = @newobydata;
+  print "========================== End localise_all_resources =======================\n" if $verbose;
+  #Stop image creation in error case
+  #exit(1) if ($errors);
+}
+
+# trim(string)
+# Removes spaces from both ends of the string.
+# Returns a trimmed string.
+sub trim($)
+{
+  my $string = shift;
+  $string =~ s/^\s+//;
+  $string =~ s/\s+$//;
+  return $string;
+}
+
+# match LOCALISE_ALL_RESOURCE_BEGIN
+sub is_localise_all_resources_begin($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*LOCALISE_ALL_RESOURCES_BEGIN\s*$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# match LOCALISE_ALL_RESOURCE_END
+sub is_localise_all_resources_end($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*LOCALISE_ALL_RESOURCES_END\s*$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+#
+# match data=foobar.rsc resource/foobar.rsc
+sub is_resource_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\.rsc[\"|\']?$/i &&
+      $target =~ m/\.rsc[\"|\']?$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+# match
+sub is_help_entry_xhtml($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\\01\\/i &&
+      $target =~ m/\\01\\/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# match data=foobar.hlp resource/foobar.hlp
+sub is_help_entry_hlp($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\.hlp[\"|\']?$/i &&
+      $target =~ m/\.hlp[\"|\']?$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+# match data=DATAZ_\\resource\\xhtml\\01\\0x01000000\\contents.zip  RESOURCE_FILES_DIR\\xhtml\\01\\0x01000000\\contents.zip
+sub is_dtd_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if (($source =~ m/\\01\\.*\.dtd/i &&
+      $target =~ m/\\01\\.*\.dtd/i ) ||
+    ($source =~ m/\\00\\.*\.dtd/i &&
+      $target =~ m/\\00\\.*\.dtd/i ))
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+# match data=DATAZ_\\resource\\xhtml\\01\\0x01000000\\contents.zip  RESOURCE_FILES_DIR\\xhtml\\01\\0x01000000\\contents.zip
+sub is_active_idle_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if (($source =~ m/\.o0001/i &&
+        $target =~ m/\.o0001/i ) ||
+     ($source =~ m/\.o0000/i &&
+        $target =~ m/\.o0000/i ))
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+#
+sub is_elocl_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/elocl\.dll/i &&
+      $target =~ m/elocl\.loc/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# get the type from an iby entry
+sub get_type_from_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*(\S+)\s+(\S+)\s*/i )
+  {
+    return $1;
+  }
+  return "";
+}
+# get the source file from an iby entry
+sub get_source_from_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*(\S+)\s+(\S+)\s*/i )
+  {
+    return $2;
+  }
+  return "";
+}
+# get the target file from an iby entry
+sub get_target_from_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*(\S+)\s+(\S+)\s*/i )
+  {
+    return $3;
+  }
+  return "";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_resource($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the .rsc to .r%02d
+  $source =~ s/\.rsc/\.r%s/i;
+  $target =~ s/\.rsc/\.r%s/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_help($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\01\\ to \\%02d\\
+  $source =~ s/\\01\\/\\%02d\\/i;
+  $target =~ s/\\01\\/\\%02d\\/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from help entry hlp
+sub create_localise_entry_from_help_hlp($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the .hlp to .h%02d
+  $source =~ s/\.hlp/\.h%s/i;
+  $target =~ s/\.hlp/\.h%s/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_dtd($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\01\\ to \\%02d\\
+#  $source =~ s/\\01\\/\\%02d\\/i;
+#  $target =~ s/\\01\\/\\%02d\\/i;
+#  $source =~ s/\\00\\/\\%02d\\/i;
+#  $target =~ s/\\00\\/\\%02d\\/i;
+#  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_active_idle($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\0001\\ to \\%04d\\
+  $source =~ s/o0001/o%04d/i;
+  $target =~ s/o0001/o%04d/i;
+  $source =~ s/o0000/o%04d/i;
+  $target =~ s/o0000/o%04d/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+sub create_localise_entry_from_elocl($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\0001\\ to \\%04d\\
+  $source =~ s/\.dll/\.%02d/i;
+  $target =~ s/\.loc/\.%02d/i;
+  #print "create_localise_entry_from_resource: $source $target\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localisable path from /00/ or /01/ paths
+sub create_localisable_path($)
+{
+  my $entry = shift;
+
+  $entry =~ s/\\01\\/\\%02d\\/ig;
+  $entry =~ s/\\00\\/\\%02d\\/ig;
+
+  #print "create_localise_entry_from_resource: $source\n";
+  return $entry;
+}
+1;  # Return a true value from the file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/obyparse.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,191 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Split core image components to ROM/ROFS1.
+# Make UREL <-> UDEB conversions.
+#
+
+
+
+package obyparse;
+
+use strict;
+use warnings;
+use plugincommon;
+
+BEGIN
+{
+    use Exporter();
+    our($VERSION, @ISA, @EXPORT);
+    $VERSION = 1.00;
+    @ISA     = qw(Exporter);
+    @EXPORT  = qw(&obyparse_info &obyparse_init &obyparse_process);
+}
+
+my $conf = "";
+
+sub obyparse_info()
+{
+    return({
+        name       => "obyparse",
+        invocation => "InvocationPoint2",
+        initialize => "obyparse::obyparse_init",
+        single     => "obyparse::obyparse_process"});
+}
+
+sub obyparse_init($)
+{
+    plugin_init("obyparse.pm", $conf = shift());
+}
+
+sub obyparse_readconffile($$$$$);
+
+
+sub obyparse_process($)
+{
+    plugin_start("obyparse.pm", $conf);
+
+    my $obydata = shift();
+    my %targets = ();
+    my %patchdata = ();
+    my ($romfiles, $rofs1files, $udebfiles, $urelfiles) = (undef, undef, "", "");
+    my $fname = "";
+
+    foreach (@$obydata)
+    {
+        next if (my $parse = parse_obyline($_)) < 0;
+
+        if (($parse == 1) && ($gKeyword =~ FILEBITMAPSPECKEYWORD)) {
+            ($fname = lc($gTarget)) =~ /^(?:.*\\)?(.+?)$/;
+            my $tname = $1;
+            $targets{$fname} = $targets{$tname} = [$gLnum - 1, !$gRomid && ($gKeyword =~ ROFSBITMAPFILESPECKEYWORD)];
+            next;
+        }
+
+        next if !/^\s*OBYPARSE_(ROM|ROFS1|UDEB|UREL)\s+(.+?)\s*$/i;
+
+        (my $rule, $fname) = (uc($1), $2);
+        my $files = ($rule eq "ROM" ? \$romfiles : ($rule eq "ROFS1" ? \$rofs1files :
+            ($rule eq "UDEB" ? \$udebfiles : \$urelfiles)));
+        $$files = "" if !defined($$files);
+        dprint(2, "#$gLnum: `$gLine'");
+
+        if ($fname ne "*") {
+            my $basedir = "";
+            ($basedir, $fname) = ($1, $2) if $fname =~ /^(.*[\/\\])(.+?)$/;
+            dprint(3, "Found " . obyparse_readconffile($basedir, $fname, $rule, $files, 0) . " entries");
+        }
+        else {
+            $$files = ".*";
+            dprint(3, "Move/change all possible components to $rule");
+        }
+        $_ = "$gHandlestr $_";
+    }
+
+    $romfiles   = qr/^($romfiles)$/i   if defined($romfiles);
+    $rofs1files = qr/^($rofs1files)$/i if defined($rofs1files);
+    ($udebfiles, $urelfiles) = (qr/^($udebfiles)$/i, qr/^($urelfiles)$/i);
+
+    ($gLnum, $gRomid) = (0, 0);
+    my ($rofs1cnt, $udebcnt, $urelcnt, $offset, @torofs1) = (0, 0, 0, 0, ());
+
+    foreach (@$obydata)
+    {
+        my $parse = parse_obyline($_);
+        $offset++ if $gRomid < 2;
+        next if $parse != 1;
+
+        if ($gKeyword =~ /^patchdata$/i) {
+            $gSource =~ /^(.+?)(?:@.+)?$/;
+            $fname = lc($1);
+            $patchdata{$fname} = $targets{$fname}[0] if !exists($patchdata{$fname});
+        }
+        else {
+            $gTarget =~ /^(?:.*\\)?(.+?)$/;
+            $fname = $1;
+            if ($fname =~ $urelfiles && s/(?<=[\/\\])udeb(?=[\/\\])/urel/i) {
+                $urelcnt++;
+                dprint(2, "Changed to UREL: `$_'");
+            }
+            elsif ($fname =~ $udebfiles && s/(?<=[\/\\])urel(?=[\/\\])/udeb/i) {
+                $udebcnt++;
+                dprint(2, "Changed to UDEB: `$_'");
+            }
+        }
+
+        next if $gRomid || !defined($romfiles) && !defined($rofs1files);
+
+        if (($gKeyword =~ ROFSBITMAPFILESPECKEYWORD) ||
+            ($gKeyword =~ /^patchdata$/i) && exists($targets{$fname}) && $targets{$fname}[1]) {
+        }
+        elsif ($gKeyword =~ /^(?:alias|rename)/i && exists($targets{lc($gSource)}) && $targets{lc($gSource)}[1]) {
+            $gSource =~ /^(?:.*\\)?(.+?)$/;
+            $fname = $1;
+        }
+        else {
+            next;
+        }
+        if (defined($rofs1files) && ($fname =~ $rofs1files) || defined($romfiles) && ($fname !~ $romfiles)) {
+            $rofs1cnt++;
+            push(@torofs1, $_);
+            $_ = "$gHandlestr =>ROFS1 $_";
+        }
+    }
+
+    dprint(3, "Moved $rofs1cnt entries to ROFS1")    if $rofs1cnt;
+    dprint(3, "Changed $udebcnt components to UDEB") if $udebcnt;
+    dprint(3, "Changed $urelcnt components to UREL") if $urelcnt;
+
+    dprint(2, "Found " . keys(%patchdata) . " ROM-patched components:") if %patchdata;
+    foreach (sort({$a <=> $b} values(%patchdata))) {
+        ${$obydata}[$_] =~ /^(?:$gHandlestr =>ROFS1 )?(.+)$/;
+        parse_keyline($1);
+        dprint(2, "`$gSource'");
+    }
+
+    splice(@$obydata, $offset, 0, @torofs1) if @torofs1;
+
+    plugin_end();
+}
+
+
+sub obyparse_readconffile($$$$$)
+{
+    my ($basedir, $file, $type, $files, $indent) = @_;
+    $file = $basedir . $file;
+    my $filecnt = 0;
+
+    dprint(3, "Reading $type files") if $type;
+    dprint(3, ("." x $indent) . "`$file'");
+
+    open(FILE, $file) or die("ERROR: Can't open `$file'\n");
+
+    foreach my $line (<FILE>) {
+        if ($line =~ /^\s*#include\s+(.+?)\s*$/i) {
+            $filecnt += obyparse_readconffile($basedir, $1, "", $files, $indent + 2);
+            next;
+        }
+        next if ($line =~ /^\s*$/) || ($line =~ /^\s*(?:#|\/\/|REM\s)/i);
+        $filecnt++;
+        (my $fname = $line) =~ s/^\s+|\s+$//g;
+        $fname =~ s/(.)/{'*' => '.*', '?' => '.', '[' => '[', ']' => ']'}->{$1} || "\Q$1\E"/ge;
+        $$files .= ($$files eq "" ? "" : "|") . $fname;
+    }
+    close(FILE);
+    return($filecnt);
+}
+
+1;
+
+__END__ # OF OBYPARSE.PM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/override.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,208 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Enabler for overriding file and data entries from platform iby files.
+#
+
+
+
+##############################################################################
+#
+# Example 1: Replace an existing file with a different source files
+# This replaces the original line with the override line.
+# NOTE! One must define the ROM_IMAGE section for the overrides correctly.
+#
+# Some platform.iby
+# data=file.txt         sys\bin\file.txt // In ROM_IMAGE[3]
+#
+# product.iby
+# ROM_IMAGE[3] data-override=file_product.txt        sys\bin\file.txt
+#
+# output
+# data=file_product.txt         sys\bin\file.txt
+#
+# Example 2: Remove an existing file from a platform iby
+# This deletes the original line from the iby structure.
+#
+# Some platform.iby
+# data=file.txt         sys\bin\file.txt // In ROM_IMAGE[3]
+#
+# product.iby
+# ROM_IMAGE[3] {
+# data-override=empty   sys\bin\file.txt
+# }
+# output
+# REM OVERRIDE data=file_product.txt    sys\bin\file.txt
+#
+##############################################################################
+
+
+
+package override;
+
+use strict;
+use warnings;
+use plugincommon;
+
+                                 # OVERRIDE TARGET FOUND  OVERRIDE TARGET NOT FOUND
+use constant REPLACE_ADD  => 0;  # Replace with override  Add override
+use constant REPLACE_SKIP => 1;  # Replace with override  Do nothing
+use constant REPLACE_WARN => 2;  # Replace with override  Do nothing but warn
+use constant SKIP_ADD     => 3;  # Do nothing             Add override
+
+BEGIN
+{
+    use Exporter();
+    our ($VERSION, @ISA, @EXPORT);
+    $VERSION = 1.00;
+    @ISA     = qw(Exporter);
+    @EXPORT  = qw(&override_info &override_init &override_process);
+}
+
+my $conf = "";
+
+sub override_info
+{
+    return({
+        name       => "override",
+        invocation => "InvocationPoint2",
+        initialize => "override::override_init",
+        single     => "override::override_process"});
+}
+
+sub override_init
+{
+    plugin_init("override.pm", $conf = shift());
+}
+
+sub override_process
+{
+    plugin_start("override.pm", $conf);
+
+    my $obydata    = shift();
+    my %targets    = ();
+    my @overrides  = ();
+    my @oconfstack = (REPLACE_WARN);
+    my @romelemcnt = (0, 0, 0, 0, 0, 0, 0, 0);
+
+    # Go through all the tmp6.oby (InvocationPoint2) lines and store
+    # normal targets' data to %targets and override targets' data to @overrides
+
+    dprint(2, "Finding overrides...");
+
+    foreach (@{$obydata})
+    {
+        my $parse = parse_obyline($_);
+
+        if ($parse == 2) {
+            # REM ROM_IMAGE[id]
+            dprint(2, "#$gLnum: `$gLine'");
+        }
+        elsif (/^\s*OVERRIDE_(?:(END)|(REPLACE\/ADD)|(REPLACE\/SKIP)|(REPLACE\/WARN)|SKIP\/ADD)\s*$/i) {
+            # Override configuration keyword
+            if (defined($1)) {
+                # OVERRIDE_END
+                pop(@oconfstack);
+            } else {
+                # OVERRIDE_REPLACE/ADD|REPLACE/SKIP|REPLACE/WARN|SKIP/ADD
+                push(@oconfstack, defined($2) ? REPLACE_ADD : (defined($3) ? REPLACE_SKIP : (defined($4) ? REPLACE_WARN : SKIP_ADD)));
+            }
+            dprint(2, "#$gLnum: `$gLine'");
+            $_ = "$gHandlestr $gLine";
+        }
+        elsif ($parse == 1 && $gKeyword =~ /-override/i) {
+            # Override entry
+            dprint(2, "#$gLnum: `$gLine'");
+            push(@overrides, [$gLnum - 1, $gRomid, $oconfstack[$#oconfstack]]);
+        }
+        elsif ($parse == 1 && $gKeyword =~ FILESPECKEYWORD) {
+            # Normal file specification entry
+            $targets{lc("$gTarget/$gRomid")} = $gLnum - 1;
+            $romelemcnt[$gRomid]++;
+        }
+    }
+
+    # Loop through all overrides and handle them
+    dprint(3, @overrides ? "Handling overrides..." : "No override entries found");
+
+    foreach (@overrides)
+    {
+        my ($lnum, $romid, $type) = @{$_};
+        parse_keyline(${$obydata}[$lnum], 1);
+        dprint(2, "Handling    : `$gLine' ($romid, " . ("REPLACE/ADD", "REPLACE/SKIP", "REPLACE/WARN", "SKIP/ADD")[$type] . ")");
+        ${$obydata}[$lnum] = "$gHandlestr $gLine";
+        (my $target = $gTarget) =~ s/^"(.*)"$/$1/;
+
+        if (exists($targets{lc("$target/$romid")})) {
+            # Override target found
+
+            my ($line, $keyword, $source, $attrib) = ($gLine, $gKeyword, $gSource, $gAttrib);
+            parse_keyline(${$obydata}[$lnum = $targets{lc("$target/$romid")}], 1);
+            dprint(2, "Target      : `$gLine' ($romid, #" . ($lnum + 1) . ")");
+
+            if ($type == SKIP_ADD) {
+                dprint(2, "Do nothing  : Target found and override type SKIP");
+            }
+            elsif ($source =~ /^"?empty"?$/i) {
+                # Empty keyword -> comment line out
+                ${$obydata}[$lnum] = "$gHandlestr $gLine";
+                dprint(1, "Remove ROM_IMAGE[$romid] `$gLine' due to `$line'");
+                dprint(2, "Replace with: `${$obydata}[$lnum]' (Override source EMPTY)");
+            }
+            else {
+                # Replace existing line with new line
+                $keyword =~ s/-override//i;
+                $attrib = ($attrib eq "" ? $gAttrib : ($attrib =~ /^\s*empty$/i ? "" : $attrib));
+                $line = ${$obydata}[$lnum] = "$keyword=$source  $gTarget$attrib\n";
+                dprint(1, "Replace ROM_IMAGE[$romid] `$gLine' with `$line'");
+                dprint(2, "Replace with: `$line'");
+            }
+        }
+        else {
+            # Override target not found
+
+            if (!$romelemcnt[$romid] && $type != REPLACE_ADD && $type != SKIP_ADD) {
+                # Ignore override non-XXX/ADD targets on empty ROM_IMAGE sections
+                dprint(2, "Do nothing  : Target not found, override target's ROM_IMAGE[$romid] section is empty");
+                next;
+            }
+            # Check if override target exists in different ROM section
+            my $warn = "";
+            foreach my $tromid (0 .. 7) {
+                $warn = "Override target `$target' found from ROM_IMAGE[$tromid] while override is for ROM_IMAGE[$romid]", last
+                    if exists($targets{lc("$target/$tromid")});
+            }
+            if ($type == REPLACE_SKIP) {
+                dprint(2, "Do nothing  : Target not found " . ($warn ? "from ROM_IMAGE[$romid] " : "") . "and override type SKIP");
+            }
+            elsif ($type == REPLACE_WARN) {
+                dprint(-3, $warn ? "$warn, ignoring `$target'" : "Ignoring override target `$target', target not found");
+                dprint(2, "Do nothing  : Target not found and override type WARN");
+            }
+            else {
+                # OVERRIDE_XXX/ADD
+                (my $line = $gLine) =~ s/^(\S+?)-override/$1/i;
+                ${$obydata}[$lnum] = $line;
+                dprint(-3, $warn) if $warn;
+                dprint(1, "Add ROM_IMAGE[$romid] `$line' from `$gLine'");
+                dprint(2, "Add new     : `$line' (Target not found, override type ADD)");
+            }
+        }
+    }
+    plugin_end();
+}
+
+1;
+
+__END__ # OF OVERRIDE.PM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/plugincommon.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,168 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Common buildrom plugin methods, for parsing Symbian IBY entries etc.
+#
+
+
+
+package plugincommon;
+
+use strict;
+use warnings;
+
+use constant FILESPECSTATEMENT => qr/^\s*(\S+?)\s*[=\s]\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))(\s+.+?)?\s*$/;
+
+use constant FILESPECKEYWORD =>
+    qr/^(?:data|file|primary|secondary|variant|device|extension|dll|filecompress|fileuncompress)/i;
+
+use constant FILEBITMAPSPECKEYWORD =>
+    qr/^(?:data|file|primary|secondary|variant|device|extension|dll|filecompress|fileuncompress|BITMAP|AUTO-BITMAP|COMPRESSED-BITMAP)/i;
+
+use constant ROFSFILESPECKEYWORD => qr/^(?:data|file|filecompress|fileuncompress)/i;
+
+use constant ROFSBITMAPFILESPECKEYWORD => qr/^(?:data|file|filecompress|fileuncompress|BITMAP|AUTO-BITMAP|COMPRESSED-BITMAP)/i;
+
+
+BEGIN
+{
+    use Exporter();
+    our ($VERSION, @ISA, @EXPORT);
+    $VERSION = 1.00;
+    @ISA     = qw(Exporter);
+    @EXPORT  = qw(
+        FILESPECSTATEMENT FILESPECKEYWORD FILEBITMAPSPECKEYWORD ROFSFILESPECKEYWORD ROFSBITMAPFILESPECKEYWORD
+        &dprint &plugin_init &plugin_start &plugin_end &parse_keyline &parse_obyline
+        &is_entry &get_type_from_entry &get_source_from_entry &get_target_from_entry
+        $gPluginname $gLogfile $gDebug $gHandlestr
+        $gLine $gLnum $gRomid $gKeyword $gSource $gTarget $gAttrib);
+    $| = 1;
+}
+
+our ($gPluginname, $gLogfile, $gDebug, $gHandlestr) = ("", "", "", 0);
+our ($gLine, $gLnum, $gRomid, $gKeyword, $gSource, $gTarget, $gAttrib) = ("", 0, 0, "", "", "", "");
+my  $duration = 0;
+
+sub dprint($$)
+{
+    my ($log, $str) = @_;
+    $str =~ s/\n//g;
+    $str = ($log < 0 ? "Warning: " : "") . "$str\n";
+    $log = abs($log);
+    print($str) if (($log == 1) && !$gDebug) || (($log == 2) && $gDebug) || ($log > 2);
+    print(LOG $str) if $gLogfile && ($log > 1);
+}
+
+sub plugin_init($$;$)
+{
+    ($gPluginname, $gDebug, my $start) = @_;
+    $gDebug = "" if !defined($gDebug);
+    $gDebug =~ s/^(?:(.*?);|(.*))//;
+    $gLogfile = (defined($1) ? $1 : $2);
+    my $warn = "";
+    (open(LOG, ">>$gLogfile") or
+        ($warn = "Can't write to `$gLogfile'.", $gLogfile = "")) if $gLogfile;
+    dprint(3, "$gPluginname: " . ($start ? "-" x (77 - length($gPluginname)) :
+        "Initializing; logfile = `$gLogfile', debug = " . ($gDebug ? 1 : 0)));
+    dprint(-3, $warn) if $warn;
+    close(LOG) if !$start;
+}
+
+sub plugin_start($$)
+{
+    $duration = time();
+    plugin_init(shift(), shift(), 1);
+    ($gHandlestr, $gLnum, $gRomid) = ("REM handled $gPluginname:", 0, 0);
+}
+
+sub plugin_end()
+{
+    my $msg = "$gPluginname: Duration: " . (time() - $duration) . " seconds ";
+    dprint(3, $msg . "-" x (79 - length($msg)));
+    close(LOG);
+}
+
+sub get_keyline($)
+{
+    my $quote = shift();
+    ($gKeyword, $gSource, $gTarget, $gAttrib) =
+        ($1, defined($2) ? ($quote ? "\"$2\"" : $2) : $3, defined($4) ? ($quote ? "\"$4\"" : $4) : $5, defined($6) ? $6 : "");
+}
+
+sub parse_keyline($;$)
+{
+    ($gLine = shift()) =~ s/^\s+|\s+$//g;
+    get_keyline(shift()), return(1) if $gLine =~ FILESPECSTATEMENT;
+    return(0);
+}
+
+sub parse_obyline($;$)
+{
+    ($gLine = shift()) =~ s/^\s+|\s+$//g;
+    $gLnum++;
+    $gRomid = $1, return(2) if $gLine =~ /^REM\s+ROM_IMAGE\[(\d+)\]/i;
+    return(-1) if $gLine eq "" || $gLine =~ /^(?:#|REM\s)/i;
+    return(parse_keyline($gLine, shift()));
+}
+
+
+###############################################################################
+#
+
+sub is_entry
+{
+  my $entry = shift;
+  if ($entry =~ /\s*(\S+)\s*=\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))/i)
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# get the type from an iby entry
+sub get_type_from_entry($)
+{
+  my $entry = shift;
+  if ($entry =~ /\s*(\S+)\s*=\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))/i)
+  {
+    return $1;
+  }
+  return "";
+}
+
+# get the source file from an iby entry
+sub get_source_from_entry($)
+{
+  my $entry = shift;
+  if ($entry =~ /\s*(\S+)\s*=\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))/i)
+  {
+    return defined($2) ? "\"$2\"" : $3;
+  }
+  return "";
+}
+
+# get the target file from an iby entry
+sub get_target_from_entry($)
+{
+  my $entry = shift;
+  if ($entry =~ /\s*(\S+)\s*=\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))/i)
+  {
+    return defined($4) ? "\"$4\"" : $5;
+  }
+  return "";
+}
+
+1;
+
+__END__ # OF PLUGINCOMMON.PM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_image_conf_buildinfo.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example version of image_conf_buildinfo.mk. If this file exists in build area,
+# it is read by iMaker and used for version info generation.
+#
+
+
+BUILD_YEAR   = $(YEAR)
+BUILD_WEEK   = $(WEEK)
+BUILD_NUMBER = 01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_image_conf_naming.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example version of image_conf_naming.mk.
+# If this file exists in build area, it is read by iMaker and can be used for
+# image naming, setting directories and version info generation.
+#
+
+
+ROFS2_DIR  = $(WORKDIR)/$(TYPE)/langpack/$(LANGPACK_NAME)
+ROFS2_NAME = $(PRODUCT_TYPE).$(BUILD_NUMBER)_$(LANGPACK_ID)_$(TYPE)
+
+LANGPACK_SWVERINFO = $(CORE_VERSION).$(LANGPACK_ID)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) $(PRODUCT_MANUFACT)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_image_conf_platform.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,73 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example version of a platform-specific configuration makefile,
+# common to many products.
+#
+
+
+COREPLAT_NAME    =
+COREPLAT_VERSION =
+S60_VERSION      = 5.0
+SOS_VERSION      = 9.4
+PLATFORM_NAME    = platform
+
+USE_PAGING     = 0
+USE_ROMFILE    = 0
+USE_SYMGEN     = 0
+USE_UDEB       = 0
+USE_VARIANTBLD = 0
+USE_VERGEN     = 1
+
+# CORE
+# imaker -f /epoc32/rom/config/platform/product/image_conf_product.mk core
+#
+COREPLAT_OPT = $(BLDROM_OPT) -D_EABI=$(ARM_VERSION)\
+  $(if $(PRODUCT_MSTNAME),-D$(call ucase,$(PRODUCT_MSTNAME))) -D$(call ucase,$(PRODUCT_NAME)) $(PRODUCT_OPT)
+
+#CORE_OBYGEN =\
+#  geniby | $(CORE_PREFIX)_core_collected.oby |\
+#    $(E32ROMINC)/core/app $(E32ROMINC)/core/mw $(E32ROMINC)/core/osext\
+#    $(call select,$(TYPE),prd,,$(E32ROMINC)/core/tools) | *.iby | \#include "%3" | end
+#
+#CORE_OBY = $(E32ROM)/master.oby $(CORE_PREFIX)_core_collected.oby <symbianos.iby> <variant/patchdata.iby>
+
+CORE_OBY = $(E32ROM)/master.oby
+CORE_OPT = $(COREPLAT_OPT) -es60ibymacros -DSECTION
+
+# Workaround to fix Rombuild errors:
+# "ERROR: incorrect format for time keyword..." and "The size of the ROM has not been supplied."
+CORE_OPT += --DROMMEGS=80 --DROMDATE=$(CORE_TIME)
+
+
+# ROFS2
+# imaker -f /epoc32/rom/config/platform/product/image_conf_product.mk langpack_01
+#
+ROFS2_OBYGEN =\
+  geniby | $(ROFS2_PREFIX)_rofs2_customer_collected.oby | $(E32ROMINC)/customer/* | *.iby | \#include "%3" | end |\
+  geniby | $(ROFS2_PREFIX)_rofs2_language_collected.oby | $(E32ROMINC)/language/* |\
+    __header__ | LOCALISE_ALL_RESOURCES_BEGIN | *.iby | \#include "%3" | __footer__ | LOCALISE_ALL_RESOURCES_END | end
+
+ROFS2_OBY = <Variant.oby> $(ROFS2_PREFIX)_rofs2_language_collected.oby $(ROFS2_PREFIX)_rofs2_customer_collected.oby
+ROFS2_OPT = $(COREPLAT_OPT) -es60ibymacros -elocalise -DLOCALES_SC_IBY -D__LOCALES_SC_IBY__
+
+
+# ROFS3
+# imaker -f /epoc32/rom/config/platform/product/image_conf_product.mk custvariant_XX
+#
+ROFS3_OBYGEN =\
+  geniby | $(ROFS3_PREFIX)_rofs3_collected.oby | $(E32ROMINC)/customervariant/* | *.iby | \#include "%3" | end
+
+ROFS3_OBY = $(ROFS3_PREFIX)_rofs3_collected.oby
+ROFS3_OPT = $(COREPLAT_OPT) -es60ibymacros
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_image_conf_product.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example version of a product-specific configuration makefile.
+# Calling: imaker -f /epoc32/rom/config/platform/product/image_conf_product.mk ...
+#
+
+
+# Include platform-level configuration
+include $(CONFIGROOT)/platform/image_conf_platform.mk
+
+PRODUCT_NAME  = product
+PRODUCT_TYPE  = product_type
+PRODUCT_MODEL = product_model
+
+# Definitions and options for Buildrom tool
+PRODUCT_OPT =
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_imaker_extension.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example version of imaker_extension.mk.
+# To extend/change default configuration set in imaker.mk.
+#
+
+
+###############################################################################
+#
+
+ifndef __IMAKER_EXTENSION_MK__
+__IMAKER_EXTENSION_MK__ := 1
+
+# This part is run from imaker.mk BEFORE user makefiles are read
+
+PRODUCT_MANUFACT = manufacturer
+
+
+###############################################################################
+
+else
+ifeq ($(__IMAKER_EXTENSION_MK__),1)
+__IMAKER_EXTENSION_MK__ := 2
+
+# This part is run from imaker.mk AFTER user makefiles are read
+
+endif
+endif # __IMAKER_EXTENSION_MK__
+
+# END OF IMAKER_EXTENSION.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_language_variant.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example language_variant.mk for langpack_01 EURO1.
+#
+
+
+LANGPACK_LANGS       = English French German Italian Portuguese Spanish
+LANGPACK_DEFAULTLANG = English
+
+# Language codes can be used as well
+#
+#LANGPACK_LANGS       = 01 02 03 05 13 04
+#LANGPACK_DEFAULTLANG = 01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/example_system_languages.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,79 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example system_languages.mk.
+#
+
+
+# Language Name                                   Code          Region
+
+define LANGUAGE_SYSLANGS
+Arabic                                            37            Western
+Basque                                            401           Western
+Bulgarian                                         42            Western
+Catalan                                           44            Western
+Croatian                                          45            Western
+Czech                                             25            Western
+Danish                                            07            Western
+Dutch                                             18            Western
+English                                           01            Western
+English_American                                  10            Western
+English_APAC                                      129           China
+English_Hongkong                                  158           China
+English_Japanese                                  160           Japan
+English_PrcChina                                  159           China
+English_Taiwan                                    157           China
+English_Thai                                      161           Western
+Estonian                                          49            Western
+Farsi                                             50            Western
+Finnish                                           09            Western
+French                                            02            Western
+French_American                                   51            Western
+Galician                                          402           Western
+German                                            03            Western
+Greek                                             54            Western
+Hebrew                                            57            Western
+Hindi                                             58            Western
+Hongkong                                          30            China
+Hungarian                                         17            Western
+Icelandic                                         15            Western
+Indonesian                                        59
+Indonesian_APAC                                   327           China
+Italian                                           05            Western
+Japanese                                          32            Japan
+Latvian                                           67            Western
+Lithuanian                                        68            Western
+Malay                                             70
+Malay_APAC                                        326           China
+Norwegian                                         08            Western
+Polish                                            27            Western
+Portuguese                                        13            Western
+Portuguese_American                               76            Western
+PrcChina                                          31            China
+Romanian                                          78            Western
+Russian                                           16            Western
+Serbian                                           79            Western
+Slovak                                            26            Western
+Slovenian                                         28            Western
+Spanish                                           04            Western
+Spanish_American                                  83            Western
+Swedish                                           06            Western
+Tagalog                                           39            Western
+Taiwan                                            29            China
+Thai                                              33            Western
+Turkish                                           14            Western
+Ukrainian                                         93            Western
+Urdu                                              94            Western
+Vietnamese                                        96            Western
+endef # LANGUAGE_SYSLANGS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/config/group/bld.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* iMaker example configuration exports.
+*
+*/
+
+
+PRJ_EXPORTS
+
+../example_imaker_extension.mk                          +/tools/rom/imaker/imaker_extension.mk
+
+//../example_image_conf_buildinfo.mk                      +/rom/config/image_conf_buildinfo.mk
+//../example_image_conf_naming.mk                         +/rom/config/image_conf_naming.mk
+../example_system_languages.mk                          +/rom/config/system_languages.mk
+
+../example_image_conf_platform.mk                       +/rom/config/platform/image_conf_platform.mk
+../example_image_conf_product.mk                        +/rom/config/platform/product/image_conf_product.mk
+../example_language_variant.mk                          +/rom/config/platform/product/language/langpack_01/language_variant.mk
+
+// END OF BLD.INF
Binary file imgtools/imaker/doc/iMaker_User_Guide.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/group/bld.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: iMaker exports
+*
+*/
+
+
+PRJ_EXPORTS
+
+../src/imaker.cmd                                       +/tools/ //
+../src/imaker.mk                                        +/tools/rom/imaker/ //
+../src/imaker.pl                                        +/tools/rom/imaker/ //
+../src/imaker.pm                                        +/tools/rom/imaker/ //
+../src/imaker_public.mk                                 +/tools/rom/imaker/ //
+../src/imaker_version.mk                                +/tools/rom/imaker/ //
+
+../src/imaker_core.mk                                   +/tools/rom/imaker/ //
+../src/imaker_help.mk                                   +/tools/rom/imaker/ //
+../src/imaker_image.mk                                  +/tools/rom/imaker/ //
+../src/imaker_minienv.mk                                +/tools/rom/imaker/ //
+../src/imaker_odp.mk                                    +/tools/rom/imaker/ //
+../src/imaker_rofs2.mk                                  +/tools/rom/imaker/ //
+../src/imaker_rofs3.mk                                  +/tools/rom/imaker/ //
+../src/imaker_rofs4.mk                                  +/tools/rom/imaker/ //
+../src/imaker_tools.mk                                  +/tools/rom/imaker/ //
+../src/imaker_uda.mk                                    +/tools/rom/imaker/ //
+../src/imaker_variant.mk                                +/tools/rom/imaker/ //
+
+// GNU make port to mingw32 (http://www.mingw.org/)
+../bin/mingw_make.exe                                   +/tools/rom/imaker/ //
+
+// Buildrom plugins
+#include "../buildrom_plugins/group/bld.inf"
+
+// END OF BLD.INF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker.cmd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,41 @@
+@echo off
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Symbian Foundation License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: iMaker wrapper for Windows
+rem
+
+
+setlocal
+set MAKE=
+set IMAKER_CMDARG=%*
+if "%EPOCROOT%"==""         set EPOCROOT=\
+if "%CONFIGROOT%"==""       set CONFIGROOT=%EPOCROOT%epoc32\rom\config
+if "%ITOOL_DIR%"==""        set ITOOL_DIR=%EPOCROOT%epoc32\tools\rom
+if "%IMAKER_DIR%"==""       set IMAKER_DIR=%ITOOL_DIR%\imaker
+if "%IMAKER_MAKE%"==""      set IMAKER_MAKE=%IMAKER_DIR%\mingw_make.exe
+if "%IMAKER_MAKESHELL%"=="" set IMAKER_MAKESHELL=%COMSPEC%
+if "%IMAKER_MAKESHELL%"=="" set IMAKER_MAKESHELL=cmd.exe
+if "%IMAKER_CYGWIN%"==""    set IMAKER_CYGWIN=0
+if "%PERL%"==""             set PERL=perl
+call %PERL% -x %IMAKER_DIR%\imaker.pl
+set IMAKER_ERROR=%errorlevel%
+if %IMAKER_ERROR% geq 1 (
+    call %PERL% -v >nul 2>&1
+    if errorlevel 1 echo Perl is not properly installed! Environment variable PERL can be used to set the Perl exe.
+)
+if 0%IMAKER_EXITSHELL% equ 0 exit /b %IMAKER_ERROR%
+exit %IMAKER_ERROR%
+endlocal
+
+:: END OF IMAKER.CMD
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,359 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: Default iMaker configuration
+#
+
+
+
+#
+# http://www.gnu.org/software/make/manual/make.html
+#
+
+ifndef __IMAKER_MK__
+__IMAKER_MK__ := 1
+
+# Special reserved characters (ASCII 30 and 31)
+ichar := 
+pchar := 
+
+comma    := ,
+,        := ,
+empty    :=
+space    := $(empty) #
+$(space) := $(space)
+squot    := '\''
+'        := '\''
+\t       := $(empty)	# Tabulator!
+
+# Newline
+define \n
+
+
+endef
+
+DEFINE := define
+
+[A-Z]   := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z #
+[a-z]   := a b c d e f g h i j k l m n o p q r s t u v w x y z #
+[0-9]   := 0 1 2 3 4 5 6 7 8 9 #
+[spcl]  := ! " \# $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ #
+charset := $([A-Z])$([a-z])$([0-9])$([spcl])
+
+not         = $(if $(strip $1),,1)
+true        = $(if $(filter-out 0,$(subst 0,0 ,$1)),1)
+false       = $(if $(call true,$1),,1)
+iif         = $(if $(call true,$1),$2,$3)
+defined     = $(filter-out undef%,$(origin $1))
+equal       = $(if $(strip $(subst $(strip $1),,$2)$(subst $(strip $2),,$1)),,1)
+select      = $(if $(call equal,$(call lcase,$1),$(call lcase,$2)),$3,$4)
+everynth    = $(strip $(eval __i_enth :=)$(call _everynth,$1,$(call restwords,$2,$3))$(__i_enth))
+_everynth   = $(if $2,$(eval __i_enth += $(word 1,$2))$(call _everynth,$1,$(call restwords,$1,$(call restwords,$2))))
+def2str     = $(if $(or $(call false,$2),$(findstring $(\n),$1)),$(subst $(\t),\t,$(subst $(\n),\n,$(call quote,$1))),$1)
+cleandef    = $(subst $(ichar)_, ,$(filter-out /*%*/,$(subst /*, /*,$(subst */,*/ ,$(subst $( ),$(ichar)_,$1)))))
+getwords    = $(subst |, ,$(subst \|,$(ichar):,$(subst $( ),$(ichar)_,$1)))
+restoreelem = $(strip $(subst $(ichar):,\|,$(subst $(ichar)_, ,$1)))
+getelem     = $(call restoreelem,$(word $1,$(call getwords,$2)))
+lcase       = $(call tr,$([A-Z]),$([a-z]),$1)
+ucase       = $(call tr,$([a-z]),$([A-Z]),$1)
+pathconv    = $(call iif,$(USE_UNIX),$(subst \,/,$1),$(subst /,\,$1))
+reverse     = $(if $1,$(call reverse,$(call restwords,$1)) $(word 1,$1))
+firstwords  = $(if $2,$(wordlist 1,$(words $(wordlist $1,$(words $2),$2)),$2),$(wordlist 1,$(words $(wordlist 2,$(words $1),$1)),$1))
+restwords   = $(if $2,$(wordlist $1,$(words $2),$2),$(wordlist 2,$(words $1),$1))
+restelems   = $(call restoreelem,$(subst $( ),|,$(call restwords,$1,$(call getwords,$2))))
+substm      = $(eval __i_str := $3)$(strip $(foreach w,$1,$(eval __i_str := $(subst $w,$2,$(__i_str)))))$(__i_str)
+substs      = $(subst $(ichar)\,$2,$(subst $1,$2,$(subst $2,$(ichar)\,$3)))
+quote       = $(call substs,\t,\\\t,$(call substs,\n,\\\n,$1))
+quoteval    = $(subst \#,\\\#,$(subst $$,$$$$,$1))
+sstrip      = $(subst $( ),,$(strip $1))
+
+strlen = $(call _str2chars,$1)$(words $(__i_str))
+substr = $(call _str2chars,$3)$(subst $(ichar), ,$(subst $( ),,$(wordlist $1,$(if $2,$2,$(words $(__i_str))),$(__i_str))))
+_str2chars = $(strip\
+  $(eval __i_str := $(subst $( ),$(ichar),$1))\
+  $(foreach c,$(charset)$(ichar),$(eval __i_str := $(subst $c,$c ,$(__i_str)))))
+
+tr =\
+  $(strip $(eval __i_tr := $3)\
+  $(foreach c,\
+    $(join $(addsuffix :,$1),$2),\
+    $(eval __i_tr := $(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$(__i_tr))))$(__i_tr))
+
+pquote      = q$(pchar)$1$(pchar)
+peval       = @PEVAL{$(call substs,|,\|,$1)}LAVEP@
+phex        = $(call peval,sprintf(q(%0$(if $2,$2,8)X),$(subst 0x0x,0x,$1)))
+pabs2rel    = $(call peval,GetRelFname($(call pquote,$1$), $(call pquote,$2)))
+pfilesize   = $(call peval,-s $(call pquote,$1) || 0)
+prepeat     = $(call peval,$(call pquote,$2) x ($1))
+pstr2xml    = $(call peval,Str2Xml($(call pquote,$1)))
+pmatch      = $(call peval,$(call pquote,$1) =~ m$(pchar)$2$(pchar)m $(if $3,$3,&& $$1 || q(???)))
+pgrep       = $(call peval,\
+  $(eval __i_notfound := $(call pquote,$(if $4,$4,???)))\
+  open(F, $(call pquote,$1)) or return($(__i_notfound));\
+  $$_ = $(if $2,Uni2Ascii)(join(q(), <F>));\
+  $$_ = Quote($(if $3,m$(pchar)$3$(pchar)m ? $$1 : $(__i_notfound),$$_));\
+  s/\n/\\\n/g; s/\t/\\\t/g;\
+  close(F); return($$_))
+
+getlastdir = $(foreach file,$1,$(notdir $(patsubst %/,%,$(file))))
+upddrive   = $(if $2,$2,$(EPOCDRIVE))$(if $(filter %:,$(call substr,1,2,$1)),$(call substr,3,,$1),$1)
+dir2inc    = $(foreach dir,$1,-I$(call upddrive,$(dir)))
+findfile   = $(foreach file,$1,$(eval __i_ffile := $(call _findfile,$(addsuffix /$(file),$2)))$(if $(__i_ffile),$(__i_ffile),$(file)))
+_findfile  = $(if $1,$(eval __i_ffile := $(wildcard $(word 1,$1)))$(if $(__i_ffile),$(__i_ffile),$(call _findfile,$(call restwords,$1))))
+
+filterwcard = $(shell $(PERL) -Xe '\
+  (my $$re = q$(ichar)$1$(ichar)) =~ s/(.)/{q(*)=>q(.*),q(?)=>q(.),q([)=>q([),q(])=>q(])}->{$$1} || qq(\Q$$1\E)/ge;\
+    print(map(qq( $$_), sort({lc($$a) cmp lc($$b)} grep(/^$$re$$/, split(/\s+/, q$(ichar)$2$(ichar))))))')
+
+cppdef2var =\
+  $(if $(wildcard $1),\
+    $(eval __i_def2var := $(shell $(PERL) -Xe '\
+      print(join(q(|), map(/^\s*\#define\s+(\S+)\s*(.*?)\s*$$/ ? qq($$1?=) . ($$2 eq q() ? 1 : $$2) : (),\
+        sort({lc($$a) cmp lc($$b)} qx$(pchar)$(CPP) -nostdinc -undef -dM $(call dir2inc,$2) $(call upddrive,$1)$(pchar)))))'))\
+    $(foreach assign,$(call getwords,$(__i_def2var)),$(eval $(call restoreelem,$(assign)))),\
+  $(eval include $1))
+
+mac2cppdef = $(foreach def,$1,$(if\
+  $(filter -D% --D%,$(def)),$(eval __i_def := $(subst =, ,$(patsubst $(if $(filter --D%,$(def)),-)-D%,%,$(def))))\
+    $(\n)$(if $(filter -D%,$(def)),\#undef  $(word 1,$(__i_def))$(\n)\#define,define ) $(word 1,$(__i_def)) $(word 2,$(__i_def)),\
+  $(if $(filter -U%,$(def)),$(\n)\#undef $(patsubst -U%,%,$(def)))))
+
+EPOCDRIVE   := $(eval EPOCDRIVE := $(call substr,1,2,$(CURDIR)))$(if $(filter %:,$(EPOCDRIVE)),$(EPOCDRIVE))
+EPOC32      := $(patsubst %/,%,$(subst \,/,$(EPOCROOT)))/epoc32
+E32ROM      := $(EPOC32)/rom
+E32ROMCFG   := $(E32ROM)/config
+E32ROMINC   := $(E32ROM)/include
+E32ROMBLD   := $(EPOC32)/rombuild
+E32INC      := $(EPOC32)/include
+E32INCCFG   := $(E32INC)/config
+E32TOOLS    := $(EPOC32)/tools
+E32GCCBIN   := $(EPOC32)/gcc/bin
+
+ITOOL_DIR   ?= $(E32TOOLS)/rom
+ITOOL_PATH  :=
+IMAKER_DIR  ?= $(ITOOL_DIR)/imaker
+IMAKER_TOOL := $(IMAKER_DIR)/imaker.pl
+
+CPP       ?= $(if $(wildcard $(E32TOOLS)/scpp.exe),$(E32TOOLS)/scpp.exe,cpp)
+PERL      ?= perl
+PYTHON    ?= python
+USE_UNIX  := $(if $(findstring cmd.exe,$(call lcase,$(SHELL)))$(findstring mingw,$(call lcase,$(MAKE))),0,1)
+NULL      := $(call iif,$(USE_UNIX),/dev/null,nul)
+DONOTHING := $(call iif,$(USE_UNIX),\#,rem)
+
+YEAR  := $(call substr,1,4,$(TIMESTAMP))
+YEAR2 := $(call substr,3,4,$(TIMESTAMP))
+MONTH := $(call substr,5,6,$(TIMESTAMP))
+DAY   := $(call substr,7,8,$(TIMESTAMP))
+WEEK  := $(call substr,15,,$(TIMESTAMP))
+
+CURDIR := $(call substr,$(call select,$(call substr,1,2,$(CURDIR)),$(EPOCDRIVE),3,1),,$(CURDIR))
+CURDIR := $(CURDIR:/=/.)
+USER   := $(or $(USERNAME),$(shell $(PERL) -Xe 'print(getlogin())'))
+
+MAKECMDGOALS ?= $(.DEFAULT_GOAL)
+TARGET        = $(word 1,$(MAKECMDGOALS))
+TARGETNAME    = $(word 1,$(subst -, ,$(TARGET)))
+TARGETID      = $(subst $( ),_,$(call restwords,$(subst _, ,$(TARGETNAME))))
+TARGETEXT     = $(findstring -,$(TARGET))$(subst $( ),-,$(call restwords,$(subst -, ,$(TARGET))))
+
+CLEAN     = 1
+BUILD     = 1
+KEEPGOING = 0
+KEEPTEMP  = 0
+PRINTCMD  = 0
+SKIPPRE   = 0
+SKIPBLD   = 0
+SKIPPOST  = 0
+VERBOSE   = 1
+
+CONFIGROOT ?= $(E32ROMCFG)
+
+LABEL      =
+NAME       = $(PRODUCT_NAME)$(LABEL)
+WORKDIR    = $(if $(PRODUCT_NAME),$(E32ROMBLD)/$(PRODUCT_NAME),$(CURDIR))
+WORKPREFIX = $(WORKDIR)/$(NAME)
+WORKNAME   = $(WORKPREFIX)
+
+CLEAN_WORKAREA  = del | $(WORKDIR)/* | deldir | $(WORKDIR)/*
+ALL.CLEAN.STEPS = $(ALL.IMAGE.STEPS) WORKAREA
+
+
+###############################################################################
+#
+
+CMDFILE = $(WORKPREFIX)$(if $(notdir $(WORKPREFIX)),_)$(call substm,* : ?,@,$(TARGET)).icmd
+#LOGFILE = $(if $(IMAGE_TYPE),$($(IMAGE_TYPE)_PREFIX)_$(call lcase,$(IMAGE_TYPE))_imaker,$(WORKDIR)/log/$(basename $(notdir $(CMDFILE)))).log
+export LOGFILE ?= $(WORKDIR)/log/$(basename $(notdir $(CMDFILE))).log
+
+BUILD_EMPTY = echo-q | Empty target, nothing to build.
+
+CLEAN_IMAKERPRE = $(CLEAN_IMAKEREVAL) | del | "$(CMDFILE)" "$(IMAKER_VARXML)"
+BUILD_IMAKERPRE =\
+  $(call testnewapi,$(strip $(API_TEST))) |\
+  $(if $(filter help% print-%,$(MAKECMDGOALS)),,$(if $(and $(IMAKER_VARXML),$(IMAKER_VARLIST)),\
+    write | $(IMAKER_VARXML) | $(call def2str,$(IMAKER_XMLINFO))))
+
+IMAKER_VARXML  = $(if $(IMAGE_TYPE),$($(IMAGE_TYPE)_PREFIX)_$(TARGET)_config.xml)
+IMAKER_VARLIST = NAME WORKDIR
+
+define IMAKER_XMLINFO
+  <?xml version="1.0" encoding="utf-8"?>
+  <build>
+  \    <config type="$(MAKECMDGOALS)">
+  $(foreach var,$(IMAKER_VARLIST),
+  \        <set name="$(var)" value="$(call pstr2xml,$($(var)))"/>)
+  \    </config>
+  </build>
+endef
+
+BUILD_PRINTVAR = $(call peval,DPrint(1,\
+  $(foreach var1,$(subst $(,), ,$(subst print-,,$(filter print-%,$(MAKECMDGOALS)))),\
+    $(foreach var2,$(call filterwcard,$(var1),$(filter-out BUILD_PRINTVAR,$(filter $(word 1,$(call substm,* ? [, ,$(var1)))%,$(.VARIABLES)))),\
+      $(call pquote,$(var2) = `$(call def2str,$($(var2)))$').qq(\n),))); return(q()))
+
+IMAKER_EVAL = $(strip\
+  $(foreach file,$(call getwords,$(value MKFILE_LIST)),$(eval __i_file := $(call restoreelem,$(file)))$(eval -include $(__i_file)))\
+  $(foreach file,$(call getwords,$(value CPPFILE_LIST)),$(eval __i_file := $(call restoreelem,$(file)))$(call cppdef2var,$(__i_file),$(FEATVAR_IDIR)))\
+  $(LANGUAGE_EVAL)\
+  $(eval ITOOL_PATH := $(if $(ITOOL_PATH),$(ITOOL_PATH)$(,))$(ITOOL_DIR)$(,))\
+  $(eval ITOOL_PATH := $(ITOOL_PATH)$(call iif,$(USE_IINTPRSIS),$(USE_IINTPRSIS)$(,))$(call iif,$(USE_IREADIMG),$(USE_IREADIMG)$(,))$(call iif,$(USE_IROMBLD),$(USE_IROMBLD)$(,)))\
+  $(eval ITOOL_PATH := $(call pathconv,$(subst $(,),$(call iif,$(USE_UNIX),:,;),$(ITOOL_PATH)$(call upddrive,$(E32TOOLS))$(,)$(call upddrive,$(E32GCCBIN)))))\
+  $(eval PATH := $(ITOOL_PATH)$(call iif,$(USE_UNIX),:,;)$(PATH)))
+
+IMAKER_CMDARG  := $(value IMAKER_CMDARG)
+IMAKER_MAKECMD := $(value IMAKER_MAKECMD)
+IMAKER_PERLCMD :=
+IMAKER_SUBMAKE :=
+
+define IMAKER
+  $(if $(and $(filter-out help-config,$(filter help-% print-%,$(MAKECMDGOALS))),$(IMAKER_PERLCMD)),-$(DONOTHING),
+    $(if $(IMAKER_PERLCMD),,$(IMAKER_EVAL))
+    $(eval __i_steps := $1)
+    $(if $(findstring |,$(__i_steps)),
+      $(eval IMAKER_PERLCMD := -)
+      $(foreach target,$(call getwords,$(__i_steps)),$(if $(call restoreelem,$(target)),
+        $(eval IMAKER_SUBMAKE += $(words $(IMAKER_SUBMAKE) x))
+        $(subst $(MAKECMDGOALS) |,,$(IMAKER_MAKECMD) |)IMAKER_SUBMAKE="$(IMAKER_SUBMAKE)" $(call restoreelem,$(target)) $(call restwords,$(MAKECMDGOALS))$(\n))),
+      $(eval __i_steps := $(if $(strip $(__i_steps)),$(foreach step,$(__i_steps),\
+        $(eval __i_step := $(word 1,$(subst :, ,$(step))))$(eval __i_attrib := $(word 2,$(subst :, ,$(step))))\
+        $(if $(call defined,STEPS_$(__i_step)),\
+          $(foreach step2,$(STEPS_$(__i_step)),$(if $(__i_attrib),$(word 1,$(subst :, ,$(step2))):$(__i_attrib),$(step2))),\
+          $(step))),EMPTY:b))
+      $(eval __i_steps := IMAKERPRE:cbk$(call sstrip,$(foreach step,$(__i_steps),\
+        $(eval __i_step := $(word 1,$(subst :, ,$(step))))$(eval __i_attrib := $(word 2,$(subst :, ,$(step))))\
+        -$(__i_step):$(or $(findstring c,$(__i_attrib)),$(call iif,$(CLEAN),c))$(or $(findstring b,$(__i_attrib)),$(call iif,$(BUILD),b))\
+        $(or $(findstring k,$(__i_attrib)),$(call iif,$(KEEPGOING),k)))))
+      $(eval IMAKER_STEPS := $(__i_steps))
+      $(eval __i_steps :=\
+        $(if $(filter print-%,$(MAKECMDGOALS)),IMAKERPRE:cbk-PRINTVAR:b,\
+          $(if $(filter-out help-config,$(filter help-%,$(MAKECMDGOALS))),IMAKERPRE:cbk-HELPDYNAMIC:b-HELP:b,$(__i_steps))))
+      $(eval IMAKER_PERLCMD := $(PERL) -x $(IMAKER_TOOL)\
+        --cmdfile "$(CMDFILE)"\
+        $(if $(LOGFILE),--logfile "$(if $(word 2,$(IMAKER_SUBMAKE))$(IMAKER_PERLCMD)$(MAKE_RESTARTS),>>$(LOGFILE:>>%=%),$(LOGFILE))")\
+        $(call iif,$(PRINTCMD),--printcmd)\
+        --step "$(__i_steps)"\
+        $(if $(VERBOSE),--verbose "$(call select,$(VERBOSE),debug,127,$(VERBOSE))")\
+        $(if $(WORKDIR),--workdir "$(WORKDIR)"))
+      -$(PERL) -Xe '$(if $(wildcard $(WORKDIR)),,use File::Path; eval { mkpath(q$(ichar)$(WORKDIR)$(ichar)) };)\
+        open(ICMD, q$(ichar)>$(CMDFILE)$(ichar));\
+        $(eval __i_submake := $(words $(IMAKER_SUBMAKE)))\
+        print(ICMD $(foreach var,IMAKER_VERSION IMAKER_CMDARG IMAKER_MAKECMD IMAKER_PERLCMD $(if $(IMAKER_SUBMAKE),IMAKER_SUBMAKE|__i_submake)\
+          IMAKER_EXITSHELL SHELL MAKE MAKEFLAGS MAKECMDGOALS $$@|@ MAKELEVEL MAKE_RESTARTS MAKEFILE_LIST .INCLUDE_DIRS FEATVAR_IDIR CPPFILE_LIST\
+          EPOCROOT ITOOL_DIR IMAKER_DIR ITOOL_PATH PATH,\
+          sprintf(qq(\# %-17s),q($(word 1,$(subst |, ,$(var))))).q$(ichar)= `$($(or $(word 2,$(subst |, ,$(var))),$(var)))$'$(ichar).qq(\n),));\
+        close(ICMD)'
+      $(foreach step,$(subst -, ,$(__i_steps)),\
+        $(eval __i_step := $(word 1,$(subst :, ,$(step))))$(eval __i_attrib := $(subst $(__i_step),,$(step)))\
+        $(eval __i_clean := $(findstring c,$(__i_attrib)))$(eval __i_build := $(findstring b,$(__i_attrib)))\
+        -$(PERL) -Xe 'open(ICMD, q$(ichar)>>$(CMDFILE)$(ichar));\
+          print(ICMD qq(\n)\
+            $(if $(eval __i_imgtype := $(IMAGE_TYPE))$(__i_imgtype),,\
+              $(eval IMAGE_TYPE += $(foreach type,CORE ROFS2 ROFS3 ROFS4 ROFS5 ROFS6 UDA,$(findstring $(type),$(step))))\
+              $(eval IMAGE_TYPE := $(word 1,$(IMAGE_TYPE))))\
+            $(if $(__i_clean),.q$(ichar)CLEAN_$(__i_step)=$(CLEAN_$(__i_step))$(ichar).qq(\n))\
+            $(if $(__i_build),.q$(ichar)BUILD_$(__i_step)=$(BUILD_$(__i_step))$(ichar).qq(\n)));\
+            $(eval IMAGE_TYPE := $(__i_imgtype))\
+          close(ICMD)'$(\n))
+      $(IMAKER_PERLCMD)
+      $(eval IMAKER_CMDARG :=))
+  )
+endef
+
+
+###############################################################################
+# Test if old variables are in use
+
+define API_TEST
+#  OLD_VARIABLE1     NEW_VARIABLE1
+#  OLD_VARIABLEn     NEW_VARIABLEn
+
+  CUSTVARIANT_MKNAME  VARIANT_MKNAME
+  CUSTVARIANT_CONFML  VARIANT_CONFML
+  CUSTVARIANT_CONFCP  VARIANT_CONFCP
+endef
+
+testnewapi = $(if $1,\
+  $(if $(call defined,$(word 1,$1)),\
+    warning | 1 | ***************************************\n |\
+    warning | 1 | Old-style variable found: $(word 1,$1) ($(origin $(word 1,$1)))\n |\
+    warning | 1 | Instead$(,) start using $(word 2,$1)\n |)\
+  $(call testnewapi,$(call restwords,3,$1)))
+
+
+###############################################################################
+# Targets
+
+.PHONY: version clean
+
+.SECONDEXPANSION:
+version: ;@$(DONOTHING)
+
+clean: CLEAN     = 1
+clean: BUILD     = 0
+clean: KEEPGOING = 1
+clean: LOGFILE   =
+clean:\
+  ;@$(call IMAKER,$$(ALL.CLEAN.STEPS))
+
+print-%: ;@$(call IMAKER)
+
+step-% : ;@$(call IMAKER,$(subst -, ,$*))
+
+#==============================================================================
+
+include $(addprefix $(IMAKER_DIR)/imaker_,$(addsuffix .mk,help image minienv public tools version))
+
+-include $(IMAKER_DIR)/imaker_extension.mk
+
+
+###############################################################################
+#
+
+else
+ifeq ($(__IMAKER_MK__),1)
+__IMAKER_MK__ := 2
+
+-include $(IMAKER_DIR)/imaker_extension.mk
+
+
+###############################################################################
+#
+
+else
+$(error Do not include imaker.mk, it is handled by iMaker!)
+endif
+
+endif # __IMAKER_MK__
+
+# END OF IMAKER.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker.pl	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,167 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker main Perl script
+#
+
+
+
+#
+$(error >>>MAKECMDGOALS=$(MAKECMDGOALS)<<<)
+#
+#!perl
+
+use strict;
+use warnings;
+use Getopt::Long qw(:config pass_through no_auto_abbrev);
+
+my $error = "";
+my $perlver;
+my $start;
+
+BEGIN {
+    ($start, $perlver) = (time(), sprintf("%vd", $^V));
+    select(STDERR); $|++;
+    select(STDOUT); $|++;
+    if (!@ARGV) {
+        warn("Warning: iMaker is running under Cygwin!\n")
+            if (!$ENV{IMAKER_CYGWIN} && $^O =~ /cygwin/i);
+        warn("Warning: iMaker uses Perl version $perlver! Recommended versions are 5.6.1 and 5.8.8.\n")
+            if ($perlver !~ /^5\.(6\.1|8\.8)$/);
+    }
+    unshift(@INC, defined($ENV{IMAKER_DIR}) ? $ENV{IMAKER_DIR} : ($0 =~ /^(.*)[\/\\]/ ? $1 : "."));
+}
+
+use imaker;
+
+
+###############################################################################
+# Main program
+
+{
+    if (!@ARGV) {
+        $ENV{CONFIGROOT} = imaker::GetAbsDirname($ENV{CONFIGROOT});
+        $ENV{ITOOL_DIR}  = imaker::GetAbsDirname($ENV{ITOOL_DIR}, 0, 1);
+        $ENV{IMAKER_DIR} = imaker::GetAbsDirname($ENV{IMAKER_DIR}, 0, 1);
+        $ENV{PATH} = join(";", grep(!/[\\\/]cygwin[\\\/]/i, split(/;+/, $ENV{PATH})))
+            if $imaker::gWinOS && !$ENV{IMAKER_CYGWIN};
+
+        my ($version, $verfile) = ("", "$ENV{IMAKER_DIR}/imaker_version.mk");
+        open(FILE, "<$verfile") and map { $version = $1 if /^\s*IMAKER_VERSION\s*[+:?]?=\s*(.*?)\s*$/ } <FILE>;
+        close(FILE);
+        $version and print("$version\n") or
+            warn("Can't read iMaker version from `$verfile'.\n");
+
+        my $cmdarg  = " " . imaker::HandleCmdArg($ENV{IMAKER_CMDARG}) . " ";
+        my $makecmd = "$ENV{IMAKER_MAKE} -R --no-print-directory" .
+            ($ENV{IMAKER_MAKESHELL} ? " SHELL=\"$ENV{IMAKER_MAKESHELL}\"" : "");
+        my $cmdout  = qx($makecmd -f $0 $cmdarg 2>&1);
+        my $targets = ($cmdout =~ />>>MAKECMDGOALS=(.*?)<<</ ? $1 : undef);
+
+        die("Can't run `$ENV{IMAKER_MAKE}' properly:\n$cmdout") if !defined($targets);
+        map { $cmdarg =~ s/\s+\Q$_\E\s+/ / } split(/\s+/, $targets);
+
+        my $tmptarg = $targets = " $targets";
+        my $hptarg  = 0;
+        while ($tmptarg =~ /(\s+(help-\S+))/g) {
+            $hptarg = $1, $targets =~ s/\Q$hptarg\E(.*)$/ $1$hptarg/ if $2 ne "help-config";
+        }
+        $hptarg = $1, $targets =~ s/\Q$hptarg\E(.*)$/ $1$hptarg/ while $tmptarg =~ /(\s+print-\S+)/g;
+        $targets =~ s/^\s+|\s+(?=\s)|\s$//g;
+
+        my $mainmk = "-f $ENV{IMAKER_DIR}/imaker.mk";
+        $makecmd .= " -I " . imaker::GetAbsDirname($ENV{CONFIGROOT}, 0, 1) . " $mainmk";
+
+        foreach my $target ($hptarg || $targets eq "" ? $targets : split(/\s/, $targets)) {
+            ($cmdarg, $target) = imaker::Menu($makecmd, $mainmk, $cmdarg) if $target eq "menu";
+            system($ENV{IMAKER_MAKECMD} = "$makecmd TIMESTAMP=" . imaker::GetTimestamp() . " $cmdarg $mainmk $target")
+                if $target ne "menu";
+            $error = ($? >> 8) if ($? >> 8);
+        }
+
+#        imaker::DPrint(1, "\nTotal duration: " . imaker::Sec2Min(time() - $start) . "\n");
+        exit($error || 0);
+    }
+
+    #==========================================================================
+
+    my ($opt_cmdfile, $opt_incdir, $opt_logfile, $opt_printcmd, $opt_step, $opt_verbose, $opt_workdir) =
+       ( "",           "",          "",           0,             "",        1,            ".");
+    Getopt::Long::GetOptions(
+        "cmdfile=s" => \$opt_cmdfile,
+        "incdir=s"  => \$opt_incdir,
+        "logfile=s" => \$opt_logfile,
+        "printcmd"  => \$opt_printcmd,
+        "step=s"    => \$opt_step,
+        "verbose=s" => \$opt_verbose,
+        "workdir=s" => \$opt_workdir,
+        "<>"        => sub { $error .= ($error ? ", `@_'" : "Unknown imaker.pl option: `@_'") });
+
+    if ($opt_incdir) {
+        my $bsf = ($opt_incdir =~ s/:bsf$//);
+        print(map("$_\n", imaker::GetFeatvarIncdir($opt_incdir, $bsf)));
+        exit;
+    }
+
+    $opt_verbose = imaker::SetVerbose($opt_verbose);
+
+    imaker::DPrint(2, "=" x 79 . "\nTIME: " . localtime() . ", USER: " . getlogin() .
+        ", HOST: " . ($ENV{HOSTNAME} || $ENV{COMPUTERNAME} || "?") . "\n$^X (v$perlver-$^O)\n");
+
+    imaker::SetLogfile($opt_logfile);
+    die("$error.\n") if $error;
+
+    foreach (split(/-+/, $opt_step)) {
+        $error .= ($error ? ", `$_'" : "Unknown imaker.pl step: `$_'")
+            if (!/^\w+:?([cbk\d]+)?$/i) || $1 && ($1 =~ /c.*c|b.*b|k.*k|\d[^\d]+\d/i);
+    }
+    die("$error.\n") if $error;
+
+    imaker::SetWorkdir($opt_workdir);
+    imaker::ReadICmdFile($opt_cmdfile);
+
+    my (@step, @stepdur) = (split(/-+/, lc($opt_step)), ());
+    my ($durstr, $maxslen, $maxdlen) = ("", 6, 8);
+
+    foreach my $stepnum (0 .. $#step) {
+        $step[$stepnum] =~ /^(\w+):?([cbk\d]+)?$/;
+        my $step = uc($1);
+        $_ = (defined($2) ? $2 : "");
+        my @dur = imaker::MakeStep($step, /c/, /b/, /k/, /(\d+)/ ? $1 : $opt_verbose, $opt_printcmd);
+        imaker::SetVerbose($opt_verbose);
+        my ($cmddur, $stepdur) = (0, pop(@dur));
+        $durstr = imaker::Sec2Min($stepdur);
+        if (@dur) {
+            $durstr .= " (";
+            foreach my $dur (@dur) {
+                $cmddur += $dur;
+                $durstr .= imaker::Sec2Min($dur) . " + ";
+            }
+            $durstr .= imaker::Sec2Min($stepdur - $cmddur) . ")";
+        }
+        $step = sprintf("%" . length(@step."") . "s", $stepnum + 1) . ". $step";
+        push(@stepdur, $step, $durstr);
+        $maxslen = imaker::Max($maxslen, length($step));
+        $maxdlen = imaker::Max($maxdlen, length($durstr));
+    }
+
+    imaker::DPrint(2, "=" x 79 . "\n");
+    @stepdur = ("Step", "Duration", "=" x $maxslen, "=" x $maxdlen, @stepdur,
+        "-" x $maxslen, "-" x $maxdlen, "Total", imaker::Sec2Min(time() - $start));
+    imaker::DPrint(2, sprintf("%-${maxslen}s %-${maxdlen}s ", shift(@stepdur), shift(@stepdur)) . "\n")
+        while(@stepdur);
+
+    imaker::CloseLog();
+}
+
+__END__ # OF IMAKER.PL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker.pm	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,1462 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker common Perl routines
+#
+
+
+
+use subs qw(CORE::GLOBAL::die);
+
+package imaker;
+
+use strict;
+use warnings;
+use Archive::Zip qw(:ERROR_CODES);
+use Archive::Zip::Tree;
+use Cwd;
+use Digest::MD5 qw(md5_hex);
+use File::Basename;
+use File::Copy;
+use File::Find;
+use File::Path;
+use File::Spec;
+use POSIX qw(strftime);
+use Time::Local;
+use XML::Simple;
+
+sub Max(@);
+sub Min(@);
+sub Quote($);
+sub Unquote($);
+sub Byte2Str($@);
+sub Str2Byte($);
+sub Str2Xml($);
+sub Ascii2Uni($);
+sub Uni2Ascii($);
+sub GetTimestamp();
+sub Sec2Min($);
+sub Wcard2Restr($);
+sub Wcard2Regex($);
+sub DPrint($@);
+sub Echo($$$);
+sub PathConv($;$$);
+sub ParseFiles($);
+sub GlobFiles($);
+sub GetBasename($);
+sub GetDirname($);
+sub GetAbsDirname($;$$);
+sub GetAbsFname($;$$);
+sub GetRelFname($;$$$);
+sub GetWriteFname($);
+sub GetFreeDrive();
+sub Search($$$$$\@\$);
+sub Find($$$$$\$);
+sub ChangeDir($);
+sub DeleteDir($;$);
+sub FindDir($$$$);
+sub MakeDir($);
+sub MakeChangeDir($);
+sub SetWorkdir($);
+sub OpenFile(*$$;$);
+sub Test($);
+sub CutFile($$$$$);
+sub Copy($$;$);
+sub DeleteFile($;$);
+sub FindFile($$$$);
+sub HeadFile($$$);
+sub TailFile($$$);
+sub TypeFile($;$);
+sub WriteFile($$$;$);
+sub UnzipFile($$);
+sub Zip($$$$@);
+sub Move($$);
+sub Touch($$);
+sub SetLogfile($);
+sub WidgetUnzip($$$);
+sub RunSystemCmd($$;$);
+sub ParseSystemCmd($$$);
+sub GenExclfile($$$$$);
+sub GenIbyfile($$$@);
+sub GenMakefile($$$$$);
+sub AddImageHeader($$$$$);
+sub Sleep($);
+sub FindSOSFiles($$$$$);
+sub CheckTool(@);
+sub GetIPar();
+sub PeekICmd($);
+sub GetICmd();
+sub EndICmd();
+sub RunICmd();
+sub RunIExtCmd($);
+sub GetFeatvarIncdir($;$);
+sub SetVerbose($);
+sub ReadICmdFile($);
+sub CloseLog();
+sub MakeStep($$$$$$);
+sub HandleCmdArg($);
+sub HandleExtCmdArg($);
+sub MenuRuncmd($);
+sub Menu($$$);
+
+use constant READBUFSIZE => 2097152;  # 2 MB
+
+our $STARTSTR = '>>>[START]=========8<==========8<==========8<==========8<==========8<==========';
+our $ENDSTR   = '==========>8==========>8==========>8==========>8==========>8===========[END]<<<';
+
+our $gBuflog     = 1;
+our $gCmdcnt     = 0;
+our @gCmdoutbuf  = ();
+our $gEpoc32;
+our @gFindresult = ();
+our $gError      = 0;
+our @gIcmd       = ();
+our $gImakerext  = 0;
+our $gKeepgoing  = 0;
+our @gLogbuf     = ();
+our $gLogfile    = "";
+our $gMakestep   = "";
+our $gOutfilter  = "";
+our $gParamcnt   = 0;
+our $gPrintcmd   = 0;
+our @gStepDur    = ();
+our %gStepIcmd   = ();
+our $gVerbose    = 1;
+our $gWarn       = 0;
+our $gWinOS      = ($^O =~ /win/i);
+our $gWorkdir    = "";
+our $gWorkdrive  = (Cwd::cwd() =~ /^([a-z]:)/i ? $1 : "");
+our @iVar        = ();  # General purpose variable to be used from $(call peval,...)
+
+BEGIN {
+    ($gEpoc32 = "$ENV{EPOCROOT}epoc32") =~ tr/\\/\//;
+    push(@INC, "$gEpoc32/tools");
+    eval { require featurevariantparser };
+}
+
+
+###############################################################################
+#
+
+sub Max(@)
+{
+    my $max = (shift() || 0);
+    map { $max = $_ if $_ > $max } @_;
+    return($max);
+}
+
+sub Min(@)
+{
+    my $min = (shift() || 0);
+    map { $min = $_ if $_ < $min } @_;
+    return($min);
+}
+
+sub Quote($)
+{
+    local $_ = shift();
+    return("") if !defined();
+    s/\\( |n|t)/\\\\$1/g;
+    return($_);
+}
+
+sub Unquote($)
+{
+    local $_ = shift();
+    return("") if !defined();
+    s/(?<!\\)(?<=\\n)\s+(\\n)?//g;
+    s/(?<!\\)\s+(?=\\n)//g;
+    s/(?<!\\)\\ / /g;
+    s/(?<!\\)\\n/\n/g;
+    s/(?<!\\)\\t/\t/g;
+    s/\\\\( |n|t)/\\$1/g;
+    s/\x00//g;
+    return($_);
+}
+
+sub Byte2Str($@)
+{
+    my ($base, @byte) = @_;
+    return(join("", map(($_ % 16 ? "" : sprintf("%04X:", $base + $_)) . sprintf(" %02X", $byte[$_]) .
+        (!(($_ + 1) % 16) || ($_ == (@byte - 1)) ? "\n" : ""), (0 .. (@byte - 1)))));
+}
+
+sub Str2Byte($)
+{
+    my ($str, $ind, @byte) = (shift(), 0, ());
+    $str =~ s/,$/, /;
+    map {
+        $ind++;
+        s/^\s+|\s+$//g;
+        if (/^\d+$/ && $_ < 256) {
+            push(@byte, $_);
+        } elsif (/^0x[0-9A-F]+$/i && hex() < 256) {
+            push(@byte, hex());
+        } else {
+            die("Invalid $ind. byte: `$_'.\n");
+            return;
+        }
+    } split(/,/, $str);
+    return(@byte);
+}
+
+sub Str2Xml($)
+{
+    my $str = shift();
+    $str =~ s/(.)/{'"'=>'&quot;', '&'=>'&amp;', "'"=>'&apos;', '<'=>'&lt;', '>'=>'&gt;'}->{$1} || $1/ge;
+    return($str);
+}
+
+sub Ascii2Uni($)
+{
+    (local $_ = shift()) =~ s/(?<!\r)\n/\r\n/g;  # Use CR+LF newlines
+    s/(.)/$1\x00/gs;
+    return("\xFF\xFE$_");
+}
+
+sub Uni2Ascii($)
+{
+    (local $_ = shift()) =~ s/(.)\x00/$1/gs;
+    s/\r\n/\n/g;
+    return(substr($_, 2));
+}
+
+sub GetTimestamp()
+{
+    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = localtime();
+    return(sprintf("%04d%02d%02d%02d%02d%02d%02d",
+        $year + 1900, $mon + 1, $mday, $hour, $min, $sec, int(($yday + 1) / 7) + 1));
+}
+
+sub Sec2Min($)
+{
+    my $sec = shift();
+    return(sprintf("%02d:%02d", $sec / 60, $sec % 60));
+}
+
+sub Wcard2Restr($)
+{
+    (my $wcard = shift()) =~ s/(.)/{"*"=>".*", "?"=>"."}->{$1} || "\Q$1\E"/ge;
+    return($wcard);
+}
+
+sub Wcard2Regex($)
+{
+    my $restr = Wcard2Restr(shift());
+    return(qr/$restr/i);
+}
+
+
+###############################################################################
+#
+
+sub DPrint($@)
+{
+    my ($verbose, @outlist) = @_;
+    map { tr/\x00\x1F/#/ } @outlist;
+    print(@outlist) if !$verbose || ($verbose & $gVerbose);
+    push(@gLogbuf, @outlist) if ($verbose < 32) || ($verbose & $gVerbose);
+    return if $gBuflog && !$gLogfile;
+    print(LOG @gLogbuf) if $gBuflog;
+    @gLogbuf = ();
+}
+
+sub Echo($$$)
+{
+    return if $gPrintcmd;
+    my ($verbose, $str) = (shift(), shift());
+    DPrint($verbose, shift() ? "$str\n" : Unquote($str));
+}
+
+
+###############################################################################
+#
+
+# Overload die
+*CORE::GLOBAL::die = sub {
+    $gError = 1;
+    return if PeekICmd("iferror");
+    CORE::die(@_) if !$gKeepgoing;
+    warn(@_);
+};
+
+# Handler for __DIE__ signal
+$SIG{__DIE__} = sub {
+    select(STDERR);
+    DPrint(0, "*** Error: " . ($gMakestep ? "($gMakestep): " : "") . $_[0]);
+    select(STDOUT);
+    exit(1);
+};
+
+# Handler for __WARN__ signal
+$SIG{__WARN__} = sub {
+    select(STDERR);
+    my $msg = ($gMakestep ? "($gMakestep): " : "") . $_[0];
+    if ($gError) { DPrint(0, "*** Error: $msg") }
+    else { DPrint(127, "Warning: $msg") }
+    select(STDOUT);
+    $gError = $gWarn = 0;
+};
+
+
+###############################################################################
+# File operations
+
+sub PathConv($;$$)
+{
+    my $path = shift();
+    if (shift()) { $path =~ tr-\/-\\- }
+    else { $path =~ tr-\\-\/- }
+    if (shift()) { $path =~ s/^(?![a-z]:)/$gWorkdrive/i }
+    else { $path =~ s/^$gWorkdrive//i }
+    $path =~ s/^([a-z]:)/\u$1/;
+    return($path);
+}
+
+sub ParseFiles($)
+{
+    my ($file, @files) = (shift(), ());
+    push(@files, defined($1) ? $1 : (defined($2) ? $2 : ())) while $file =~ /""|"+(.+?)"+|((\\\s|\S)+)/g;
+    return(@files);
+}
+
+sub GlobFiles($)
+{
+    return(@gFindresult) if (my $file = shift()) =~ /^__find__$/i;
+    return(map(/[\*\?]/ ? glob(/\s/ ? "\"$_\"" : $_) : $_, ParseFiles($file)));
+}
+
+sub GetBasename($)
+{
+    return((File::Basename::fileparse(shift()))[0]);
+}
+
+sub GetDirname($)
+{
+    (my $dir = shift()) =~ s/^>>?(?!>)//;
+    return((File::Basename::fileparse($dir))[1]);
+}
+
+sub GetAbsDirname($;$$)
+{
+    (my $dir = shift()) =~ s/^>>?(?!>)//;
+    my $absdir = "";
+    eval { local $SIG{__DIE__}; $absdir = Cwd::abs_path($dir) };
+    return(PathConv($absdir || File::Spec->rel2abs($dir,
+        $dir !~ /^$gWorkdrive/i && $dir =~ /^([a-z]:)/i ? "$1/" : ""), shift(), shift()));
+}
+
+sub GetAbsFname($;$$)
+{
+    my $file = shift();
+    return($file) if $file eq "" || $file =~ /STD(IN|OUT|ERR)$/;
+    my $append = ($file =~ s/^>>(?!>)// ? ">>" : "");
+    return($append . PathConv(File::Spec->catpath("", GetAbsDirname(GetDirname($file)), GetBasename($file)), shift(), shift()));
+}
+
+sub GetRelFname($;$$$)
+{
+    my ($file, $base) = (shift(), shift());
+    my $append = ($file =~ s/^>>(?!>)// ? ">>" : "");
+    return($append . PathConv(File::Spec->abs2rel($file, GetAbsDirname(defined($base) && ($base ne "") ? $base : ".")), shift(), shift()));
+}
+
+sub GetWriteFname($)
+{
+    (my $file = shift()) =~ s/^>?/>/;
+    return($file);
+}
+
+sub GetFreeDrive()
+{
+    for my $drive ("F", "A".."E", "G".."Z") {
+        return("$drive:") if
+            !system("subst $drive: . >nul") and !system("subst $drive: /d >nul");
+    }
+    die("No free drive letter available.\n");
+}
+
+sub Search($$$$$\@\$)
+{
+    my ($dir, $inclre, $exclre, $subdir, $finddir, $files, $total) = @_;
+    my @dir = ();
+
+    map {
+        my $isfile = -f();
+        my $isdir  = !$isfile && -d();
+        if ($finddir ? $isdir : $isfile) {
+            ++$$total;
+            my $fname = File::Basename::basename($_);
+            push(@$files, $_) if ($fname =~ /$inclre/ && $fname !~ /$exclre/);
+        }
+        push(@dir, $_) if $isdir && $subdir;
+    } sort({lc($a) cmp lc($b)} ($dir =~ /\s/ ? <"$dir/*"> : <$dir/*>));
+
+    map { Search($_, $inclre, $exclre, 1, $finddir, @$files, $$total) } @dir;
+}
+
+sub Find($$$$$\$)
+{
+    my ($dir, $inclpat, $exclpat, $subdir, $finddir, $total) = @_;
+    ($dir, $$total) = (GetAbsDirname($dir), 0);
+    my ($inclre, $exclre, @files) = ("", "", ());
+    if ($inclpat =~ /^\//) {
+        $inclre = eval("qr$inclpat");
+        $inclpat = "";
+    } else {
+        $inclre = join("|", map(Wcard2Restr($_), split(/\s+/, $inclpat)));
+        $inclre = qr/^($inclre)$/i;
+    }
+    if ($exclpat =~ /^\//) {
+        $exclre = eval("qr$exclpat");
+        $exclpat = "";
+    } else {
+        $exclre = join("|", map(Wcard2Restr($_), split(/\s+/, $exclpat)));
+        $exclre = qr/^($exclre)$/i;
+    }
+    DPrint(16, "Find" . ($finddir ? "Dir" : "File") . ": Directory `$dir'" . ($subdir ? " and subdirectories" : "") .
+        ", pattern `" . ($inclpat ne "" ? "$inclpat' $inclre" : "$inclre'") .
+        ($exclre eq qr/^()$/i ? "" : " excluding `" . ($exclpat ne "" ? "$exclpat' $exclre" : "$exclre'")));
+    Search($dir, $inclre, $exclre, $subdir, $finddir, @files, $$total);
+    DPrint(16, ", found " . @files . "/$$total " . ($finddir ? "directories\n" : "files\n"));
+    return(@files);
+}
+
+sub ChangeDir($)
+{
+    if ((my $dir = GetAbsDirname(shift())) ne GetAbsDirname(".")) {
+        DPrint(16, "ChangeDir: `$dir'\n");
+        chdir($dir) or die("Can't change to directory `$dir'.\n");
+    }
+}
+
+sub DeleteDir($;$)
+{
+    return if !-d(my $dir = GetAbsDirname(shift()));
+    DPrint(16, "DeleteDir: `$dir'\n");
+    for my $sec (0, 2, 5) {
+        warn("Can't delete directory `$dir', retrying in $sec seconds...\n"), sleep($sec) if $sec;
+        eval { local $SIG{__DIE__}; local $SIG{__WARN__} = sub{}; File::Path::rmtree($dir) };
+        return if !-d($dir);
+    }
+    $dir = "Can't delete directory `$dir'.\n";
+    shift() ? warn($dir) : die($dir);
+}
+
+sub FindDir($$$$)
+{
+    my ($dir, $inclpat, $exclpat, $opt) = @_;
+    @gFindresult = () if (($opt = (defined($opt) ? $opt : "")) !~ /a/);
+    push(@gFindresult, Find($dir, $inclpat, $exclpat, $opt =~ /r/, 1, local $_));
+}
+
+sub MakeDir($)
+{
+    my $dir = GetAbsDirname(shift());
+    return if -d($dir);
+    eval { local $SIG{__DIE__}; File::Path::mkpath($dir) };
+    if (-d($dir)) {
+        DPrint(16, "MakeDir: `" . GetAbsDirname($dir) ."'\n");
+    } else {
+        DPrint(16, "MakeDir: `$dir'\n");
+        die("Can't create directory `$dir'.\n");
+    }
+}
+
+sub MakeChangeDir($)
+{
+    MakeDir(my $dir = shift());
+    ChangeDir($dir);
+}
+
+sub SetWorkdir($)
+{
+    MakeChangeDir(shift());
+    $gWorkdrive = (Cwd::cwd() =~ /^([a-z]:)/i ? $1 : "");
+    $gWorkdir   = GetAbsDirname(".");
+}
+
+sub OpenFile(*$$;$)
+{
+    my ($fhandle, $file, $binmode, $print) = @_;
+    MakeDir(GetDirname($file)) if $file =~ /^>/;
+    DPrint(16, defined($print) ? $print : ($file =~ /^>/ ? "Write" : "Read") . "File: `$file'\n");
+    return(open($fhandle, $file)) if !$binmode;
+    return(open($fhandle, $file) and binmode($fhandle));
+}
+
+sub Test($)
+{
+    if (-d(my $file = shift())) {
+        DPrint(16, "TestDir: `" . GetAbsDirname($file) . "'\n");
+    } elsif (-f($file)) {
+        DPrint(16, "TestFile: `" . GetAbsFname($file) . "'\n");
+    } else {
+        DPrint(16, "Test: `$file'\n");
+        die("File or directory `$file' doesn't exist.\n");
+    }
+}
+
+sub CutFile($$$$$)
+{
+    my ($msg, $src, $dest, $head, $len) = @_;
+    my ($buf, $srctmp) = (undef, "$src.CUT");
+
+    OpenFile(*INFILE, $src, 1, $msg) or
+        die("Can't read file `$src'.\n"), return;
+
+    my $out = GetWriteFname($head ? $dest : $srctmp);
+    OpenFile(*OUTFILE, $out, 1) or die("Can't write to `$out'.\n"), return;
+    while ($len > 0) {
+        read(INFILE, $buf, $len < READBUFSIZE ? $len : READBUFSIZE);
+        print(OUTFILE $buf);
+        $len -= READBUFSIZE;
+    }
+    close(OUTFILE);
+
+    $out = GetWriteFname($head ? $srctmp : $dest);
+    OpenFile(*OUTFILE, $out, 1) or die("Can't write to `$out'.\n"), return;
+    print(OUTFILE $buf) while read(INFILE, $buf, READBUFSIZE);
+    close(OUTFILE);
+    close(INFILE);
+    Move($srctmp, $src);
+}
+
+sub Copy($$;$)
+{
+    my ($src, $dest, $dir) = @_;
+    my $append = ($dest =~ /^>>[^>]/);
+    $dir  = defined($dir) && $dir || !$append && -d($src);
+    $src  = ($dir ? GetAbsDirname($src)  : GetAbsFname($src));
+    $dest = ($dir ? GetAbsDirname($dest) : GetAbsFname($dest));
+    if ($append) {
+        my $buf;
+        OpenFile(*INFILE, $src, 1, "AppendFile: `$src' => `$dest'\n") or die("Can't read file `$src'.\n"), return;
+        OpenFile(*OUTFILE, $dest, 1, "") or die("Can't write to `$dest'.\n"), return;
+        print(OUTFILE $buf) while read(INFILE, $buf, READBUFSIZE);
+        return if close(INFILE) && close(OUTFILE);
+    }
+    elsif (!$dir) {
+        DPrint(16, "CopyFile: `$src' => `$dest'\n");
+        warn("CopyFile: Destination file `$dest' already exists\n") if -f($dest);
+        File::Copy::copy($src, $dest) and return;
+    } else {
+        DPrint(16, "CopyDir: `$src' => `$dest'\n");
+#        warn("CopyDir: Destination directory `$dest' already exists\n") if -d($dest);
+        !RunSystemCmd('xcopy "' . PathConv($src, 1) . '" "' . PathConv("$dest/" . GetBasename($src), 1) . '" /e /i /y /z', "") and return;
+    }
+    die("Can't copy `$src' to `$dest'.\n");
+}
+
+sub DeleteFile($;$)
+{
+    return if !-f(my $file = GetAbsFname(shift()));
+    DPrint(16, "DeleteFile: `$file'\n");
+    for my $sec (0, 1, 2) {
+        warn("Can't delete file `$file', retrying in $sec second(s)...\n"), sleep($sec) if $sec;
+        unlink($file);
+        return if !-f($file);
+    }
+    $file = "Can't delete file `$file'.\n";
+    shift() ? warn($file) : die($file);
+}
+
+sub FindFile($$$$)
+{
+    my ($dir, $inclpat, $exclpat, $opt) = @_;
+    @gFindresult = () if (($opt = (defined($opt) ? $opt : "")) !~ /a/);
+    push(@gFindresult, Find($dir, $inclpat, $exclpat, $opt =~ /r/, 0, local $_));
+}
+
+sub HeadFile($$$)
+{
+    my ($src, $dest, $len) = (GetAbsFname(shift()), GetAbsFname(shift()), shift());
+    $len = hex($len) if $len =~ /^0x/;
+    CutFile("HeadFile: Cut first $len bytes from `$src' => `$dest'\n", $src, $dest, 1, $len);
+}
+
+sub TailFile($$$)
+{
+    my ($src, $dest, $len) = (GetAbsFname(shift()), GetAbsFname(shift()), shift());
+    $len = hex($len) if $len =~ /^0x/;
+    CutFile("TailFile: Cut last $len bytes from `$src' => `$dest'\n", $src, $dest, 0, (-s($src) ? -s($src) : 0) - $len);
+}
+
+sub TypeFile($;$)
+{
+    my ($file, $str, $mode) = (GetAbsFname(shift()), "", shift() || "");
+    OpenFile(*FILE, $file, $mode, "TypeFile: `$file'" .
+        ($gOutfilter && ($mode ne "b") ? ", filter: `/$gOutfilter/i'" : "") . "\n") or
+            die("Can't read file `$file'.\n"), return;
+    DPrint(8, "$STARTSTR\n");
+    read(FILE, $str, -s($file));
+    if ($mode eq "b") {
+        DPrint(1, Byte2Str(0, map(ord(), split(//, $str))));
+    } else {
+        $str = Uni2Ascii($str) if $mode eq "u";
+        DPrint(1, map("$_\n", grep(!$gOutfilter || /$gOutfilter/i, split(/\n/, $str))));
+        $gOutfilter = "";
+    }
+    DPrint(8, "$ENDSTR\n");
+    close(FILE);
+}
+
+sub WriteFile($$$;$)
+{
+    my ($file, $str, $mode) = (GetAbsFname(shift()), shift(), shift() || "");
+    OpenFile(*FILE, GetWriteFname($file), $mode) or
+        die("Can't write to `$file'.\n"), return;
+    if ($mode eq "b") {
+        my @byte = Str2Byte($str);
+        DPrint(64, Byte2Str($file =~ s/^>>(?!>)// ? -s($file) : 0, @byte));
+        print(FILE map(chr(), @byte));
+    } else {
+        $str = Unquote($str) if !shift();
+        $str = Ascii2Uni($str) if $mode eq "u";
+        print(FILE $str);
+    }
+    close(FILE);
+}
+
+sub UnzipFile($$)
+{
+    my ($zipfile, $dir) = (GetAbsFname(shift()), GetAbsDirname(shift()));
+    DPrint(16, "UnzipFile: `$zipfile'");
+    Archive::Zip::setErrorHandler(sub{});
+    my ($error, $zip) = (0, Archive::Zip->new());
+    if ($zip->read($zipfile) != AZ_OK) {
+        DPrint(16, " to directory `$dir'\n");
+        die("Can't read zip archive `$zipfile'.\n");
+        return;
+    }
+    my @files = map($_->fileName(), grep(!$_->isDirectory(), $zip->members()));
+    DPrint(16, ", " . @files . " files to directory `$dir'\n");
+    foreach my $file (@files) {
+        DPrint(16, "ExtractFile: `$dir/$file'");
+        eval { local $SIG{__DIE__}; $error = ($zip->extractMember($file, "$dir/$file") != AZ_OK) };
+        DPrint(16, $error ? " Failed\n" : "\n");
+        die("Can't extract file `$file' to directory `$dir'.\n") if $error;
+        $error = 0;
+    }
+}
+
+sub Zip($$$$@)
+{
+    my ($zipfile, $dir, $opt, $prefix) = (GetAbsFname(shift()), shift(), shift(), shift());
+
+    $opt = (defined($opt) ? ", options: `$opt'" : "");
+    $prefix = GetAbsDirname($prefix) if $prefix ne "";
+    my %files = ();
+    map {
+        my $key = lc();
+        $files{$key} = $_ if !exists($files{$key});
+    } ($dir ? map(GetAbsDirname($_), grep(-d(), @_)) : map(GetAbsFname($_), grep(-f(), @_)));
+
+    DPrint(16, ($dir ? "ZipDir: `$zipfile'$opt, " . keys(%files) . " directories" :
+        "ZipFile: `$zipfile'$opt, " . keys(%files) . " files") . ($prefix ? ", prefix: $prefix\n" : "\n"));
+
+    Archive::Zip::setErrorHandler(sub{});
+    my ($error, $zip) = (0, Archive::Zip->new());
+    $zip->zipfileComment("iMaker-created zip archive `$zipfile'$opt.");
+
+    foreach my $file (sort({lc($a) cmp lc($b)} values(%files))) {
+        my $newfile = $file;
+        if ($opt !~ /j/) {
+            $newfile =~ s/^.*?\/+/$prefix\// if $prefix ne "";
+        } else {
+            $newfile = ($dir ? "" : GetBasename($file)) if ($prefix eq "") || ($newfile !~ s/^$prefix//);
+        }
+        DPrint(16, "Add" . ($dir ? "Dir" : "File") . ": `$file'" . ($file ne $newfile ? " => `$newfile'" : "")) if $opt !~ /q/;
+        eval {
+            local $SIG{__DIE__}; local $SIG{__WARN__} = sub{ $gWarn = 1 };
+            $error = ($dir ? $zip->addTree($file, $newfile) != AZ_OK :
+                !$zip->addFile($file, $newfile)) || $gWarn;
+        };
+        DPrint(16, $error ? " Failed\n" : "\n") if $opt !~ /q/;
+        warn("Can't add " . ($dir ? "directory tree" : "file") . "`$file' to zip archive `$zipfile'.\n") if $error;
+        $error = 0;
+    }
+    ($zip->writeToFileNamed($zipfile) == AZ_OK) or
+        die("Can't create zip archive `$zipfile'.\n");
+}
+
+sub Move($$)
+{
+    my ($src, $dest) = @_;
+    my $dir = -d($src);
+    $src = ($dir ? GetAbsDirname($src) : GetAbsFname($src));
+    MakeDir(GetDirname($dest));
+    $dest = ($dir ? GetAbsDirname($dest) : GetAbsFname($dest));
+    DPrint(16, "Move" . ($dir ? "Dir" : "File") . ": `$src' => `$dest'\n");
+    File::Copy::move($src, $dest) or
+        die("Can't move `$src' to `$dest'.\n");
+}
+
+sub Touch($$)
+{
+    my ($file, $time) = (shift(), shift() =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/ ?
+        Time::Local::timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900) : time);
+    my $dir = -d($file);
+    $file = ($dir ? GetAbsDirname($file) : GetAbsFname($file));
+    DPrint(16, "Touch" . ($dir ? "Dir" : "File") . ": `$file': " .
+        POSIX::strftime("%Y-%m-%d,%H:%M:%S", localtime($time)) . "\n");
+    utime($time, $time, $file) or
+        die("Can't touch " . ($dir ? "directory" : "file") . " `$file'.\n");
+}
+
+sub SetLogfile($)
+{
+    $gBuflog = 0, return if !(my $file = GetAbsFname(shift()));
+    CloseLog();
+    OpenFile(*LOG, GetWriteFname($file), 0) or
+        warn("Can't log to file `$file'.\n"), return;
+    $gLogfile = $file;
+}
+
+
+###############################################################################
+#
+
+sub WidgetUnzip($$$)
+{
+    my ($wgzfile, $outdir, $plist) = (GetAbsFname(shift()), GetAbsDirname(shift()), shift());
+
+    my $tmpdir = "$outdir/wgz_unzip_temp";
+    DeleteDir($tmpdir);
+    UnzipFile($wgzfile, $tmpdir);
+
+    for my $dir (Find($tmpdir, "*", "", 0, 1, local $_)) {
+        my $xml = undef;
+        eval { local $SIG{__DIE__}; local $SIG{__WARN__} = sub{}; $xml = XMLin("$dir/$plist") };
+        die("Can't find/parse XML file `$dir/$plist'.\n"), next if !defined($xml);
+        my $id = "";
+        for my $ind (0 .. @{$xml->{dict}{key}} - 1) {
+            $id = $xml->{dict}{string}[$ind], last if $xml->{dict}{key}[$ind] =~ /^\s*Identifier\s*$/i;
+        }
+        die("Can't find Identifier from XML file `$dir/$plist'.\n"), next if $id eq "";
+        Move($dir, "$outdir/$id/" . GetBasename($dir));
+    }
+    DeleteDir($tmpdir);
+}
+
+
+###############################################################################
+#
+
+sub RunSystemCmd($$;$)
+{
+    my ($cmd, $file, $ignorerr) = @_;
+    DPrint(1, "$cmd\n"), return if $gPrintcmd;
+    my $null = ($file =~ /^null$/i);
+    $file = ($null ? "" : GetAbsFname($file));
+    @gCmdoutbuf = ();
+    DPrint(4, "RunSystemCmd(" . GetAbsDirname(".") . "): `$cmd'" .
+        ($file ? ", redirect to: `$file'" : ($null ? ", redirect to null" : "")) .
+        ($gOutfilter ? ", filter: `/$gOutfilter/i'" : "") . "\n");
+    OpenFile(*FILE, GetWriteFname($file), 0) or
+        (die("Can't write to `$file'.\n"), $file = "") if $file;
+    my $dur = time();
+    open(CMD, "$cmd 2>&1 |");
+    DPrint(8, "$STARTSTR\n");
+    while (my $line = <CMD>) {
+        chomp($line);
+        push(@gCmdoutbuf, $line);
+        DPrint(8, "$line\n") if !$null && (!$gOutfilter || ($line =~ /$gOutfilter/i));
+        print(FILE "$line\n") if $file;
+    }
+    close(CMD);
+    close(FILE) if $file;
+    push(@gStepDur, $dur = time() - $dur);
+    $gOutfilter = "";
+    my $error = ($? >> 8) && !$ignorerr && !$null;
+    print(map("$_\n", @gCmdoutbuf)) if $error && $gVerbose && !($gVerbose & 8);
+    $dur = Sec2Min($dur);
+    DPrint(8, substr($ENDSTR, 0, -16) . $dur . substr($ENDSTR, length($dur) - 16) . "\n");
+    die("Command `$cmd' failed (" . ($? >> 8). ").\n") if $error;
+}
+
+
+###############################################################################
+#
+
+sub ParseSystemCmd($$$)
+{
+    return if $gPrintcmd;
+    my ($title, $regex, $file) = @_;
+    $regex = ($regex =~ /^\// ? eval("qr$regex") : Wcard2Regex($regex));
+    return if !(my @parse = grep(/$regex/, @gCmdoutbuf));
+    if (!$file) {
+        Echo(1, $title, 0);
+        DPrint(1, map(sprintf("%" . length(@parse) . "s", $_) . ") $parse[$_ - 1]\n", 1 .. @parse));
+        return;
+    }
+    OpenFile(*FILE, GetWriteFname($file = $title), 0) or
+        die("Can't write to `$file'.\n"), return;
+    print(FILE join("\n", @parse));
+    close(FILE);
+}
+
+
+###############################################################################
+#
+
+sub GenExclfile($$$$$)
+{
+    return if $gPrintcmd;
+
+    my ($exclfile, $base, $prefix, $addfiles) = (shift(), shift(), shift(), shift());
+    my ($file, $rmfiles, %files) = ("", "", ());
+
+    WriteFile($exclfile, "", "");
+    $base = GetAbsDirname($base);
+
+    foreach $file (ParseFiles(shift())) {
+        $file =~ tr/\\/\//;
+        $file =~ s/^\///;
+        $file =~ s/\/$/\/\*/;
+        $rmfiles .= ($rmfiles eq "" ? "" : "|") . Wcard2Restr($file);
+    }
+    $rmfiles = qr/^(?:$rmfiles)$/i;
+
+    foreach $file (ParseFiles($addfiles)) {
+        $file =~ tr/\\/\//;
+        $file =~ /^\/?(?:(.*)\/)?(.+?)$/;
+        (my $dir, $file) = ($base . (defined($1) ? "/$1" : ""), $2);
+        map {
+            $files{$_} = 1 if ($_ = GetRelFname($_, $base)) !~ $rmfiles;
+        } ($file =~ /[\*\?]/ ? Find($dir, $file, "", 1, 0, local $_) : "$dir/$file");
+    }
+
+    map {
+        $files{"$_/"} = 1 while (s/^(.*)\/.*?$/$1/) && !exists($files{"$_/"});
+    } keys(%files);
+    $files{""} = 1;
+
+    WriteFile($exclfile, join("", map(($_ = "$prefix$_\n") =~ tr/\//\\/ ? $_ : $_, sort({lc($a) cmp lc($b)} keys(%files)))), "u", 1);
+}
+
+sub GenIbyfile($$$@)
+{
+    return if $gPrintcmd;
+
+    my ($ibyfile, $srcdir, $subdir) = (GetAbsFname(shift()), shift(), shift());
+    my ($header, $footer, $body, %files) = ("", "", "", ());
+
+    foreach my $dir (split(/\s+/, $srcdir)) {
+        $dir = GetAbsDirname($dir);
+        my ($found, $total, $lines) = (0, 0, "");
+        my @param = @_;
+        while (@param) {
+            my ($filepat, $format, @lines) = (shift(@param), shift(@param), ());
+            $header = $format, next if $filepat =~ /^__header__$/i;
+            $footer = $format, next if $filepat =~ /^__footer__$/i;
+            foreach my $src (Find($dir, $filepat, "", $subdir, 0, $total)) {
+                next if $files{$src};
+                $files{$src} = 1;
+                (my $line = $format) =~ s/%1/$src/g;
+                $line =~ s/%2/GetRelFname($src, $dir, 1)/ge;
+                $line =~ s/%3/GetRelFname($src, GetDirname($ibyfile))/ge;
+                push(@lines, $line);
+            }
+            $found += @lines;
+            $lines .= "//\n// Format: `$format', " . @lines . " files: `$filepat'\n" .
+                (@lines ? "//\n" . join("\n", @lines) . "\n" : "");
+        }
+        $body .= "\n// Collected files $found/$total from directory `$dir'" .
+            ($subdir ? " and subdirectories" : "") . "\n$lines";
+    }
+
+    my $append = ($ibyfile =~ s/^>>(?!>)// && -f($ibyfile) && ">>" || "");
+    (my $fname = "__" . uc(GetBasename($ibyfile)) . "__") =~ s/\W/_/g;
+    my @previby = ();
+
+    if ($append) {
+        OpenFile(*FILE, $ibyfile, 0) or die("Can't read file `$ibyfile'.\n"), return;
+        @previby = <FILE>;
+        close(FILE);
+        $previby[0] =~ s/(, collected )(\d+)( files)$/$1.($2 + keys(%files)).$3/e;
+        $previby[@previby - 1] = "";
+    }
+
+    OpenFile(*FILE, GetWriteFname($ibyfile), 0) or
+        die("Can't write to `$ibyfile'.\n"), return;
+    print(FILE @previby, ($append ? "// Appended" : "// Generated") . " `$append$ibyfile', " .
+        "collected " . keys(%files) . " files\n" .
+        ($append ? "" : "\n#ifndef $fname\n#define $fname\n") .
+        ($header ? Unquote("\\n$header\\n") : "") . $body . ($footer ? Unquote("\\n$footer\\n") : "") .
+        "\n#endif // $fname\n");
+    close(FILE);
+}
+
+
+###############################################################################
+#
+
+sub GenMakefile($$$$$)
+{
+    return if $gPrintcmd;
+    my ($hdrfile, $mkfile, $filter, $prepros, $assignop) =
+        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), shift(), shift());
+    ChangeDir(GetDirname($hdrfile));
+    RunSystemCmd("$prepros " . GetBasename($hdrfile), "");
+    my $maxdef = Max(map(/^\s*\#define\s+($filter)/ && length($1), @gCmdoutbuf));
+    WriteFile($mkfile, join('\n',
+        map(/^\s*\#define\s+($filter)\s*(.*?)\s*$/ ? sprintf("%-${maxdef}s $assignop %s", $1, $2 eq "" ? 1 : $2) : (), sort(@gCmdoutbuf))) . '\n', "");
+}
+
+
+###############################################################################
+#
+
+sub AddImageHeader($$$$$)
+{
+    return if $gPrintcmd;
+    my ($file, $hdrfile, $hdrstr, $hdrsize, $align) =
+        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), shift(), shift());
+
+    $hdrstr =~ s/\/\*.*?\*\///g;
+    $hdrstr =~ s/,\s*$//;
+    WriteFile($hdrfile, $hdrstr, "b");
+    die("Invalid image header size: " . sprintf("0x%X", -s($hdrfile)) . " (!=$hdrsize).\n"), return
+        if -s($hdrfile) ne hex($hdrsize);
+
+    $align = Max(hex($align), hex($hdrsize)) - hex($hdrsize);
+    WriteFile(">>$hdrfile", ("0," x ($align - 1)) . "0", "b") if $align;
+    Copy($file, ">>$hdrfile") if $file ne "";
+}
+
+
+###############################################################################
+#
+
+sub Sleep($)
+{
+    sleep(shift()) if !$gPrintcmd;
+}
+
+
+###############################################################################
+#
+
+sub FindSOSFiles($$$$$)
+{
+    my ($dirs, $tmpoby, $imgoby, $pluglog, $opt) = @_;
+    my ($file, %files) = ("", ());
+    local $_;
+
+    foreach my $dir (GlobFiles($dirs)) {
+        $dir = GetAbsDirname($dir);
+
+        foreach $file (Find($dir, $tmpoby, "", 1, 0, $_)) {
+            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
+            (my $dir = GetDirname($file) . "/") =~ s/\/+$/\//;
+            while (<FILE>) {
+                next if !/^#\s+\d+\s+"(.+?)"/;
+                $_ = $1;
+                $file = GetAbsFname(/^(?:[a-z]:)?[\/\\]/i ? $_ : "$dir$_");
+                $files{lc($file)} = $file if !exists($files{lc($file)});
+            }
+            close(FILE);
+        }
+
+        foreach $file (Find($dir, $imgoby, "", 1, 0, $_)) {
+            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
+            while (<FILE>) {
+                next if !/^\s*(?:bootbinary|data|device|dll|extension|file|primary|secondary|variant)\S*?\s*[=\s]\s*(?:"(.+?)"|(\S+))/i;
+                $file = GetAbsFname(defined($1) ? $1 : $2);
+                $files{lc($file)} = $file if !exists($files{lc($file)});
+                next if ($file !~ s/\.[0-9a-f]{32}\./\./i);
+                $file .= ".vmap";
+                $files{lc($file)} = $file if !exists($files{lc($file)});
+            }
+            close(FILE);
+        }
+
+        my ($plugfile, $patched) = (0, 0);
+        foreach $file (Find($dir, $pluglog, "", 1, 0, $_)) {
+            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
+            while (<FILE>) {
+                $plugfile = 1, next if /^Reading (ROM|ROFS1|UDEB|UREL) files$/;
+                $plugfile = 0, next if ($plugfile && /^Found \d+ entries$/);
+                if ($plugfile) {
+                    next if !/`(.+)'$/;
+                    $file = GetAbsFname($1);
+                    $files{lc($file)} = $file if !exists($files{lc($file)});
+                    next;
+                }
+                $patched = $1, next if /^Found (\d+) ROM-patched components:$/;
+                next if (!$patched || !/^`(.+)'$/);
+                $patched--;
+                $file = GetAbsFname($1) . ".map";
+                $files{lc($file)} = $file, next if -f($file);
+                $file =~ s/(\..*?\.map)$/\.\*$1/;
+                foreach (glob($file =~ /\s/ ? "\"$file\"" : $file)) {
+                    ($file = lc()) =~ s/\.map$//;
+                    $files{lc()} = $_, last if exists($files{$file});
+                }
+            }
+            close(FILE);
+        }
+
+        $dir .= "/" if $dir !~ /\/$/;
+        foreach $file (keys(%files)) {
+            delete($files{$file}) if ($file =~ /^$dir/i);
+        }
+    }
+
+    @gFindresult = () if (!defined($opt) || $opt !~ /a/);
+    push(@gFindresult, values(%files));
+}
+
+
+###############################################################################
+#
+
+sub CheckTool(@)
+{
+    return if $gPrintcmd;
+    my ($maxtlen, $maxvlen, @tools) = (4, 9, ());
+    while (@_) {
+        my ($tool, $vquery, $getver, $version, $md5sum) = (shift(), shift(), shift(), " -", " ?");
+        if (length($vquery) > 1) {
+            RunSystemCmd($vquery, "null");
+            $version = (join("\n", @gCmdoutbuf) =~ eval($getver =~ /^\// ? "qr$getver" : "qr/$getver/ims") ?
+                (defined($1) && defined($2) && "`$1 $2'" || defined($1) && "`$1'" || " ?") : " ?");
+        }
+        OpenFile(*FILE, $tool, 1) and $md5sum = "`" . md5_hex(<FILE>) . "'";
+        close(FILE);
+        $maxtlen = Max($maxtlen, length($tool));
+        $maxvlen = Max($maxvlen, length($version));
+        push(@tools, "`$tool'", $version, $md5sum);
+    }
+    $maxtlen += 2;
+    @_ = (" Tool", " Version", " MD5 Checksum", "-" x $maxtlen, "-" x $maxvlen, "-" x 34, @tools);
+    DPrint(1, sprintf("%-${maxtlen}s %-${maxvlen}s ", shift(), shift()) . shift() . "\n") while(@_);
+}
+
+
+###############################################################################
+#
+
+sub GetIPar()
+{
+    local $_ = shift(@gIcmd);
+    $_ = "<UNDEFINED>" if (my $empty = !defined());
+
+    while (/\@PEVAL{.*}LAVEP\@/) {
+        my $start = rindex($_, '@PEVAL{', my $end = index($_, '}LAVEP@') + 7);
+        my ($expr, $eval, $evalerr) = (substr($_, $start + 7, $end - $start - 14), undef, "");
+        eval {
+            local ($_, $SIG{__DIE__});
+            local $SIG{__WARN__} = sub{} if $gPrintcmd;
+            $eval = eval($expr);
+            ($evalerr = $@) =~ s/^(.+?) at .*/$1/s;
+        };
+#        DPrint(64, "GetIPar: Evaluate `$expr' = `" . (defined($eval) ? $eval : "") . "'\n");
+        if (!defined($eval)) {
+            $eval = "";
+            warn("GetIPar: Evaluation `$expr' failed: $evalerr.\n") if !$gPrintcmd;
+        }
+        substr($_, $start, $end - $start) = $eval;
+    }
+    DPrint(32, "iPar: $gParamcnt. `$_'\n") if $gParamcnt;
+    $gParamcnt++;
+    return($empty ? undef : $_);
+}
+
+sub PeekICmd($)
+{
+    return(defined($gIcmd[0]) && $gIcmd[0] =~ /^$_[0]$/i);
+}
+
+sub GetICmd()
+{
+    $gParamcnt = 0;
+    my $cmd = GetIPar();
+    DPrint(32, "iCmd: " . ++$gCmdcnt . ". `$cmd'\n") if defined($cmd) && $cmd ne "";
+    return($cmd);
+}
+
+sub EndICmd()
+{
+    GetICmd(), return(1) if !defined($gIcmd[0]) || PeekICmd("end");
+    return(0);
+}
+
+sub RunICmd()
+{
+    my ($cmd, $file, $iferror) = ("", "", 0);
+    while (defined($cmd = GetICmd())) {
+        next if $cmd eq "";
+        local $_ = lc($cmd);
+        if (/^(error|warning)$/) {
+            my ($errwarn, $msg) = (GetIPar(), Unquote(GetIPar()));
+            die($msg)  if $errwarn && /e/;
+            warn($msg) if $errwarn && /w/;
+        }
+        elsif (/^echo(\d+)?(-q)?$/) {
+            my ($verbose, $quote) = (defined($1) && ($1 < 128) ? $1 : 1, defined($2));
+            Echo($verbose, GetIPar(), $quote);
+        }
+        elsif (/^filter$/) {
+            $gOutfilter = GetIPar();
+        }
+        elsif (/^cmd(tee)?$/) {
+            $file = $1;
+            RunSystemCmd(GetIPar(), $file ? GetIPar() : "");
+        }
+        elsif (/^parse(f)?$/) {
+            $file = $1;
+            ParseSystemCmd(GetIPar(), GetIPar(), $file);
+        }
+        elsif (/^(cd|copy(dir)?|del(dir)?|find(dir)?(-[ar]+)?|headb|logfile|mkcd|mkdir|move|tailb|test|touch|type[bu]?|unzip|workdir|write[bu]?(-q)?|zip(dir)?(-[jq]+)?)$/) {
+            my @files = GlobFiles(GetIPar());
+            my $par1 = GetIPar() if /^(?:copy|find|head|move|tail|touch|(un)?zip|write)/;
+            my $par2 = GetIPar() if /^(?:find|head|tail|zip)/;
+            next if $gPrintcmd;
+            foreach $file (@files) {
+                ChangeDir($file)                           if /^cd/;
+                DeleteDir($file)                           if /deldir/;
+                FindDir($file, $par1, $par2, $1)           if /finddir(-[ar]+)?/;
+                MakeDir($file)                             if /mkdir/;
+                MakeChangeDir($file)                       if /mkcd/;
+                SetWorkdir($file)                          if /workdir/;
+                Zip($file, 1, $1, $par2, GlobFiles($par1)) if /zipdir(-[jq]+)?/;
+                DeleteFile($file)                          if /del/;
+                FindFile($file, $par1, $par2, $1)          if /find(-[ar]+)?$/;
+                HeadFile($file, $par1, $par2)              if /headb/;
+                SetLogfile($file)                          if /logfile/;
+                TailFile($file, $par1, $par2)              if /tailb/;
+                TypeFile($file, $1)                        if /type(b|u)?/;
+                UnzipFile($file, $par1)                    if /unzip/;
+                WriteFile($file, $par1, $1, $2)            if /write(b|u)?(-q)?/;
+                Zip($file, 0, $1, $par2, GlobFiles($par1)) if /^zip(-[jq]+)?$/;
+                Copy($file, $par1, $1)                     if /copy(dir)?/;
+                Move($file, $par1)                         if /move/;
+                Test($file)                                if /test/;
+                Touch($file, $par1)                        if /touch/;
+            }
+        }
+        elsif (/^genexclst$/) {
+            GenExclfile(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
+        }
+        elsif (/^geniby(-r)?$/) {
+            my ($sub, $iby, $dir, @par) = ($1, GetIPar(), GetIPar(), ());
+            push(@par, GetIPar(), GetIPar()) while !EndICmd();
+            GenIbyfile($iby, $dir, $sub, @par);
+        }
+        elsif (/^genmk$/) {
+            GenMakefile(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
+        }
+        elsif (/^iferror$/) {
+            $iferror++;
+            $gError = 0, next if $gError;
+            while (defined($gIcmd[0])) {
+                GetICmd(), last if PeekICmd("endif") && !--$iferror;
+                $iferror++ if shift(@gIcmd) =~ /^iferror$/i;
+            }
+        }
+        elsif (/^endif$/ && $iferror--) {
+        }
+        elsif (/^imghdr$/) {
+            AddImageHeader(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
+        }
+        elsif (/^pause$/) {
+            DPrint(0, "Press Enter to continue...\n");
+            getc();
+        }
+        elsif (/^sleep$/) {
+            Sleep(GetIPar());
+        }
+        elsif (/^sosfind(-a)?$/) {
+            my $opt = $1;
+            FindSOSFiles(GetIPar(), GetIPar(), GetIPar(), GetIPar(), $opt);
+        }
+        elsif (/^toolchk$/) {
+            my @tools = ();
+            push(@tools, GetIPar(), GetIPar(), GetIPar()) while !EndICmd();
+            CheckTool(@tools);
+        }
+        elsif (/^wgunzip$/) {
+            ($file, my $dir, my $fname) = (GetIPar(), GetIPar(), GetIPar());
+            map { WidgetUnzip($_, $dir, $fname) } GlobFiles($file);
+        }
+        elsif (!$gImakerext || !RunIExtCmd($_)) {
+            die("Unknown iMaker command `$cmd'.\n");
+        }
+    }
+}
+
+
+###############################################################################
+#
+
+sub GetFeatvarIncdir($;$)
+{
+    my ($varname, $nbv) = @_;
+    my %featvar = ();
+    my @incdir  = ("Invalid SBV feature variant");
+    my $valid   = 0;
+    local $_;
+
+    open(OLDERR, ">&STDERR");
+    open(STDERR, $gWinOS ? ">nul" : ">/dev/null");
+    select(STDERR);
+    eval {
+        local $SIG{__DIE__};
+        %featvar = featurevariantparser->GetVariant($varname);
+        $valid = $featvar{VALID};
+    };
+    close(STDERR);
+    open(STDERR, ">&OLDERR");
+    close(OLDERR);
+    select(STDOUT);
+
+    return(grep(tr/\\/\// || 1, @{$featvar{ROM_INCLUDES}})) if $valid;
+    return(@incdir) if !$nbv;
+
+    # N*kia Binary Variation
+    foreach my $file (<$gEpoc32/tools/*.bsf>) {
+        (my $varname = lc($file)) =~ s/^.*\/(.+?)\.bsf$/$1/;
+        open(FILE, $file);
+        while (my $line = <FILE>) {
+            $featvar{$varname}{CUSTOMIZES} = lc($1) if $line =~ /^\s*CUSTOMIZES\s+(\S+)\s*$/i;
+            $featvar{$varname}{VARIANT} = (uc($1) || 1) if $line =~ /^\s*(VIRTUAL)?VARIANT\s*$/i;
+        }
+        close(FILE);
+    }
+    $varname = lc($varname);
+    my @variant = ();
+    while ($featvar{$varname}{VARIANT}) {
+        unshift(@variant, $varname) if $featvar{$varname}{VARIANT} ne "VIRTUAL";
+        $varname = $featvar{$varname}{CUSTOMIZES};
+    }
+    while (@variant) {
+        map { push(@incdir, join("/", $_, @variant)) } ("$gEpoc32/rom", "$gEpoc32/include");
+        pop(@variant);
+    }
+    return(@incdir);
+}
+
+
+###############################################################################
+#
+
+sub SetVerbose($)
+{
+    my $verbose = shift();
+    return($gVerbose = int($1)) if ($verbose =~ /^(\d+)$/) && ($1 < 128);
+    $gVerbose = 1;
+    warn("Verbose level `$verbose' is not integer between 0 - 127\n");
+    return(1);
+}
+
+sub ReadICmdFile($)
+{
+    my ($file, $steps) = (GetAbsFname(shift()), "");
+    OpenFile(*FILE, $file, 0) or
+        die("Can't read iMaker command file `$file'.\n"), return;
+    while (<FILE>) {
+        DPrint(2, $_), next if /^\s*#/;
+        next if !/^\s*(\S+?)\s*=(.*)$/;
+        $gStepIcmd{my $step = $1} = (my $icmd = $2);
+        $steps .= ($steps ? ", " : "") . $step . ($icmd =~ /^\s*$/ ? " (empty)" : "");
+    }
+    close(FILE);
+    DPrint(2, "Steps: $steps\n");
+}
+
+sub CloseLog()
+{
+    close(LOG) if $gLogfile;
+    $gLogfile = "";
+}
+
+sub MakeStep($$$$$$)
+{
+    (my $step, my $clean, my $build, $gKeepgoing, my $verbose, $gPrintcmd) = @_;
+    (my $dur, @gStepDur) = (time(), ());
+
+    SetVerbose($verbose);
+    ChangeDir($gWorkdir);
+
+    $gMakestep = "S:$step,C:" . ($clean ? 1 : 0) . ",B:" . ($build ? 1 : 0) .
+        ",K:" . ($gKeepgoing ? 1 : 0) . ",V:$gVerbose";
+    DPrint(2, "=" x 79 . "\nENTER: `$gMakestep'\n");
+    map {
+        if (defined($gStepIcmd{$_})) {
+            DPrint(64, "$_ = `$gStepIcmd{$_}'\n");
+            $gStepIcmd{$_} =~ s/(?<!(\\|\s))\|/ \|/g;  # ???
+            @gIcmd = map((s/^\s+|(?<!\\)\s+$//g, s/\\\|/\|/g) ? $_ : $_, split(/(?<!\\)\|/, "$gStepIcmd{$_} "));
+            RunICmd();
+        } else {
+            warn("Step `$_' is undefined.\n");
+        }
+    } ($clean ? "CLEAN_$step" : (), $build ? "BUILD_$step" : ());
+
+    DPrint(2, "EXIT: `$gMakestep', duration: " . Sec2Min($dur = time() - $dur) . "\n");
+    return((@gStepDur, $dur));
+}
+
+
+###############################################################################
+#
+
+sub HandleCmdArg($)
+{
+    my $arg = (defined($_[0]) ? $_[0] : "");
+    return($gImakerext ? HandleExtCmdArg($arg) : $arg);
+}
+
+
+###############################################################################
+#
+
+sub MenuRuncmd($)
+{
+    ($ENV{IMAKER_MAKECMD}, my @menubuf) = (shift(), ());
+    map {
+        chomp();
+        push(@menubuf, $_);
+    } qx($ENV{IMAKER_MAKECMD});
+    return(@menubuf);
+}
+
+sub Menu($$$)
+{
+    my ($makecmd, $mainmk, $cmdarg) = @_;
+    my $quietopt = 'LOGFILE= PRINTCMD=0 VERBOSE=1 WORKDIR=$(CURDIR)';
+    my ($prodind, $prodmk, @product) = (0, "", ());
+    my ($targind, $target, $targcols, $targrows, @target)  = (0, "", 4, 0, ());
+    my ($vartype, $varudeb, $varsym) = ("", 0, 0);
+    my $cfgfile = "./imaker_menu.cfg";
+
+    $cmdarg =~ s/^\s+|\s+$//g;
+    $cmdarg = " $cmdarg" if $cmdarg ne "";
+    open(FILE, "<$cfgfile") and
+        (($prodind, $targind, $vartype, $varudeb, $varsym) = map(chomp() ? $_ : $_, <FILE>)) and close(FILE);
+
+    while (1) {
+        system($gWinOS ? "cls" : "clear");
+
+        print("\nPRODUCTS\n--------\n");
+        #
+        if (!@product) {
+            map {
+                push(@product, [ucfirst($1), $_]) if /image_conf_(.+?)\./;
+            } MenuRuncmd("$makecmd $mainmk $quietopt help-config");
+        }
+        $prodmk = ($prodind ? " -f $product[$prodind - 1][1]" : "");
+        my $maxlen = Max(map(length(@$_[0]), @product));
+        map {
+            printf(" %" . (length(@product)) . "s) %-${maxlen}s  %s\n", $_ + 1, $product[$_][0], $product[$_][1]);
+        } (0 .. $#product);
+        print(" NO PRODUCTS FOUND!\n") if !@product;
+
+        print("\nTARGETS\n-------\n");
+        #
+        if (!@target) {
+            @target = MenuRuncmd("$makecmd$prodmk $mainmk $quietopt help-target-*-list");
+            $targrows = int($#target / $targcols + 1);
+            my $maxind = 0;
+            map {
+                if (!($_ % $targrows)) {
+                    $maxind = length(Min($_ + $targrows, $#target + 1)) + 1;
+                    $maxlen = Max(map(length(), @target[$_ .. Min($_ + $targrows - 1, $#target)]));
+                }
+                $target[$_] = sprintf("%${maxind}s) %-${maxlen}s", "t" . ($_ + 1), $target[$_]);
+            } (0 .. $#target);
+        }
+        ($target = ($targind ? $target[$targind - 1] : "")) =~ s/^.+?(\S+)\s*$/$1/;
+        foreach my $row (1 .. $targrows) {
+            foreach my $col (1 .. $targcols) {
+                my $ind = ($col - 1) * $targrows + $row - 1;
+                print(($ind < @target ? " $target[$ind]" : "") . ($col != $targcols ? " " : "\n"));
+            }
+        }
+        print(" NO TARGETS FOUND!\n") if !@target;
+
+        print("\nCONFIGURATION\n-------------\n");
+        #
+        if (!$vartype) {
+            ($vartype, $varudeb, $varsym) = map(/^\S+\s+=\s+`(.*)'$/ ? $1 : (),
+                MenuRuncmd("$makecmd$prodmk $mainmk $quietopt TIMESTAMP=" . GetTimestamp() .
+                    " $target print-TYPE,USE_UDEB,USE_SYMGEN"));
+            $varudeb =~ s/0//g;
+            $varsym  =~ s/0//g;
+        }
+        print(
+          " Product: " . ($prodind ? $product[$prodind - 1][0] : "NOT SELECTED!") . "\n" .
+          " Target : " . ($targind ? $target : "NOT SELECTED!") . "\n" .
+          " Type   : " . ucfirst($vartype) . "\n" .
+          " Tracing: " . ($varudeb ? ($varudeb =~ /full/i ? "Full debug" : "Enabled") : "Disabled") . "\n" .
+          " Symbols: " . ($varsym ? "Created\n" : "Not created\n"));
+
+        print("\nOPTIONS\n-------\n");
+        #
+        print(
+          " t) Toggle between rnd/prd/subcon\n" .
+          " u) Toggle between urel/udeb/udeb full\n" .
+          " s) Toggle symbol creation on/off\n" .
+          " r) Reset configuration\n" .
+          " h) Print usage information\n" .
+          " x) Exit\n\n" .
+          "Hit Enter to run: imaker$prodmk$cmdarg TYPE=$vartype USE_UDEB=$varudeb USE_SYMGEN=$varsym $target\n");
+
+        print("\nSelection: ");
+        #
+        (my $input = <STDIN>) =~ s/^\s*(.*?)\s*$/\L$1\E/;
+
+        if ($input =~ /^(\d+)$/ && ($1 > 0) && ($1 <= @product) && ($1 != $prodind)) {
+            $prodind = $1;
+            ($targind, @target) = (0, ());
+        }
+        elsif ($input =~ /^t(\d+)$/ && ($1 > 0) && ($1 <= @target) && ($1 != $targind)) {
+            $targind = $1;
+        }
+        elsif ($input eq "t") {
+            $vartype = ($vartype =~ /rnd/i ? "prd" : ($vartype =~ /prd/i ? "subcon" : "rnd"));
+        }
+        elsif ($input eq "u") {
+            $varudeb = (!$varudeb ? 1 : ($varudeb !~ /full/i ? "full" : 0));
+        }
+        elsif ($input eq "s") {
+            $varsym = !$varsym;
+        }
+        elsif ($input eq "r") {
+            ($prodind, @product) = (0, ());
+            ($targind, @target)  = (0, ());
+            ($vartype, $varudeb, $varsym) = ("", 0, 0);
+        }
+        elsif ($input eq "h") {
+            print("\nTODO: Help");
+            sleep(2);
+        }
+        elsif ($input =~ /^(x|)$/) {
+            open(FILE, ">$cfgfile") and
+                print(FILE map("$_\n", ($prodind, $targind, $vartype, $varudeb, $varsym))) and close(FILE);
+            return($input eq "x" ? ("", "menu") :
+                ("$prodmk$cmdarg TYPE=$vartype USE_UDEB=$varudeb USE_SYMGEN=$varsym", $target));
+        }
+    }
+}
+
+
+###############################################################################
+#
+
+die($@) if !defined($gImakerext = do("imaker_extension.pm")) && $@;
+
+1;
+
+__END__ # OF IMAKER.PM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_core.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,266 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker Core image configuration
+#
+
+
+
+###############################################################################
+#   ___ ___  ___ ___
+#  / __/ _ \| _ \ __|
+# | (_| (_) |   / _|
+#  \___\___/|_|_\___|
+#
+
+USE_NOROMHDR = 0
+
+CORE_TITLE       = Core (ROM$(call iif,$(USE_ROFS1), & ROFS1))
+CORE_DIR         = $(WORKDIR)/core
+CORE_NAME        = $(NAME)
+CORE_PREFIX      = $(CORE_DIR)/$(CORE_NAME)
+CORE_IDIR        =
+CORE_HBY         =
+CORE_OBY         =
+CORE_OPT         =
+CORE_MSTOBY      = $(CORE_PREFIX)_core_master.oby
+CORE_HEADER      =
+CORE_INLINE      =
+CORE_TIME        = $(DAY)/$(MONTH)/$(YEAR)
+
+CORE_OBYGEN      =
+
+CORE_VERIBY      = $(CORE_PREFIX)_core_version.iby
+CORE_ROMVER      = 0.01(0)
+CORE_VERSION     = V $(subst .,,$(COREPLAT_VERSION)).$(subst .,,$(S60_VERSION)).$(BUILD_YEAR).$(BUILD_WEEK).$(BUILD_NUMBER)$(if $(TYPE), $(call ucase,$(TYPE)))
+CORE_SWVERFILE   = $(CORE_PREFIX)_core_sw.txt
+CORE_SWVERINFO   = $(CORE_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n$(PRODUCT_TYPE)\\\n(c) $(PRODUCT_MANUFACT)
+CORE_MODELFILE   = $(CORE_PREFIX)_core_model.txt
+CORE_MODELINFO   = S60
+CORE_IMEISVFILE  = $(CORE_PREFIX)_core_imeisv.txt
+CORE_IMEISVINFO  = 00
+CORE_PLATFILE    = $(CORE_PREFIX)_core_platform.txt
+CORE_PLATINFO    = SymbianOSMajorVersion=$(word 1,$(subst ., ,$(SOS_VERSION)))\nSymbianOSMinorVersion=$(word 2,$(subst ., ,$(SOS_VERSION)))\n
+CORE_PRODFILE    = $(CORE_PREFIX)_core_product.txt
+CORE_PRODINFO    = Manufacturer=$(PRODUCT_MANUFACT)\nModel=$(PRODUCT_MODEL)\nProduct=$(PRODUCT_TYPE)\nRevision=$(PRODUCT_REVISION)
+CORE_FWIDFILE    = $(CORE_PREFIX)_core_fwid.txt
+CORE_FWID        = core
+CORE_FWIDVER     = $(CORE_VERSION) $(PRODUCT_TYPE)
+CORE_FWIDINFO    = id=$(CORE_FWID)\nversion=$(CORE_FWIDVER)\n
+
+CORE_PLUGINLOG   = $(CORE_PREFIX)_core_bldromplugin.log
+CORE_NDPROMFILE  = $(E32ROMBLD)/romfiles.txt
+CORE_ODPROMFILE  = $(E32ROMBLD)/odpromfiles.txt
+CORE_CDPROMFILE  = $(E32ROMBLD)/odpcoderomfiles.txt
+CORE_ROMFILE     = $(call iif,$(USE_PAGING),$(if $(filter 1,$(USE_PAGEDCODE)),$(CORE_CDPROMFILE),$(CORE_ODPROMFILE)),$(CORE_NDPROMFILE))
+CORE_NDPROFSFILE = $(E32ROMBLD)/rofsfiles.txt
+CORE_ODPROFSFILE = $(E32ROMBLD)/odprofsfiles.txt
+CORE_CDPROFSFILE = $(E32ROMBLD)/odpcoderofsfiles.txt
+CORE_ROFSFILE    = $(call iif,$(USE_PAGING),$(if $(filter 1,$(USE_PAGEDCODE)),$(CORE_CDPROFSFILE),$(CORE_ODPROFSFILE)),$(CORE_NDPROFSFILE))
+CORE_PAGEFILE    = $(ODP_PAGEFILE)
+CORE_UDEBFILE    = $(TRACE_UDEBFILE)
+
+CORE_ICHKLOG     = $(CORE_PREFIX)_core_imgcheck.log
+CORE_ICHKOPT     = $(IMGCHK_OPT)
+CORE_ICHKIMG     = $(ROM_IMG) $(call iif,$(USE_ROFS1),$(ROFS1_IMG))
+
+CORE_I2FDIR      = $(CORE_DIR)/img2file
+
+#==============================================================================
+
+ROM_BUILDOPT   = $(call iif,$(USE_NOROMHDR),-no-header)
+ROM_CHECKSUM   = 0x12345678
+ROM_IMGHDRSIZE = 256
+ROM_HEADER     =
+ROM_FOOTER     =
+
+ROM_IMG        = $(CORE_PREFIX).rom.img
+ROM_INC        = $(CORE_PREFIX).rom.inc
+ROM_LOG        = $(CORE_PREFIX).rom.log
+ROM_OUTOBY     = $(CORE_PREFIX).rom.oby
+ROM_SYM        = $(CORE_PREFIX).rom.symbol
+
+ROFS1_HEADER   =
+ROFS1_IMG      = $(CORE_PREFIX).rofs1.img
+ROFS1_LOG      = $(CORE_PREFIX).rofs1.log
+ROFS1_OUTOBY   = $(CORE_PREFIX).rofs1.oby
+ROFS1_SYM      = $(CORE_PREFIX).rofs1.symbol
+
+#==============================================================================
+
+define CORE_MSTOBYINFO
+  $(BLDROM_HDRINFO)
+
+  $(BLDROM_PLUGINFO)
+
+  // Core header
+  //
+  $(CORE_HDRINFO)
+
+  // Core ROM
+  //
+  ROM_IMAGE[0] {
+    $(ROM_HDRINFO)
+    $(BLR.CORE.OBY)
+    $(CORE_INLINE)
+    $(ROM_FOOTERINFO)
+  }
+  $(call iif,$(USE_ROFS1),
+
+    // Core ROFS1
+    //
+    ROM_IMAGE 1 rofs1 non-xip size=$(ROFS_MAXSIZE)
+
+    ROM_IMAGE[1] {
+      $(ROFS1_HDRINFO)
+      // Content to be moved from ROM to ROFS1
+    }
+  )
+endef
+
+define CORE_HDRINFO
+  $(DEFINE) _IMAGE_WORKDIR $(CORE_DIR)
+  $(call mac2cppdef,$(BLR.CORE.OPT))
+  $(BLR.CORE.HBY)
+  $(CORE_HEADER)
+  $(if $(filter 1,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
+endef
+
+define ROM_HDRINFO
+  $(ODP_ROMINFO)
+  $(ROM_HEADER)
+endef
+
+define ROM_FOOTERINFO
+  $(if $(ROM_BUILDOPT),ROMBUILD_OPTION $(ROM_BUILDOPT))
+  romname $(notdir $(ROM_IMG))
+  $(if $(CORE_TIME),time=$(CORE_TIME))
+  $(if $(ROM_CHECKSUM),romchecksum=$(ROM_CHECKSUM))
+  $(ROM_FOOTER)
+endef
+
+define ROFS1_HDRINFO
+  $(call ODP_CODEINFO,1)
+  $(ROFS1_HEADER)
+  $(if $(CORE_TIME),time=$(CORE_TIME))
+endef
+
+define CORE_VERIBYINFO
+  // Generated `$(CORE_VERIBY)$' for Core image creation
+  $(if $(CORE_ROMVER),
+
+    version=$(CORE_ROMVER))
+
+  OVERRIDE_REPLACE/ADD
+  data-override=$(CORE_SWVERFILE)  RESOURCE_FILES_DIR\versions\sw.txt
+  data-override=$(CORE_MODELFILE)  RESOURCE_FILES_DIR\versions\model.txt
+  data-override=$(CORE_IMEISVFILE)  RESOURCE_FILES_DIR\versions\imeisv.txt
+  data-override=$(CORE_PLATFILE)  RESOURCE_FILES_DIR\versions\platform.txt
+  data-override=$(CORE_PRODFILE)  RESOURCE_FILES_DIR\versions\product.txt
+  $(call iif,$(USE_FOTA),
+    data-override=$(CORE_FWIDFILE)  RESOURCE_FILES_DIR\versions\fwid1.txt)
+  OVERRIDE_END
+endef
+
+#==============================================================================
+
+CLEAN_COREFILE =\
+  del | "$(CORE_MSTOBY)" "$(CORE_VERIBY)" "$(CORE_SWVERFILE)" "$(CORE_MODELFILE)"\
+    "$(CORE_IMEISVFILE)" "$(CORE_PLATFILE)" "$(CORE_PRODFILE)" "$(CORE_FWIDFILE)" |\
+  del | $(call getgenfiles,$(CORE_OBYGEN))
+
+BUILD_COREFILE =\
+  echo-q | Generating file(s) for Core image creation |\
+  write  | $(CORE_MSTOBY) | $(call def2str,$(CORE_MSTOBYINFO)) |\
+  $(call iif,$(USE_ROFS1),$(call iif,$(USE_VERGEN),\
+    write  | $(CORE_VERIBY)     | $(call def2str,$(CORE_VERIBYINFO)) |\
+    writeu | $(CORE_SWVERFILE)  | $(CORE_SWVERINFO)  |\
+    writeu | $(CORE_MODELFILE)  | $(CORE_MODELINFO)  |\
+    writeu | $(CORE_IMEISVFILE) | $(CORE_IMEISVINFO) |\
+    writeu | $(CORE_PLATFILE)   | $(CORE_PLATINFO)   |\
+    writeu | $(CORE_PRODFILE)   | $(CORE_PRODINFO)   |\
+    writeu | $(CORE_FWIDFILE)   | $(CORE_FWIDINFO)   |))\
+  $(CORE_OBYGEN)
+
+
+###############################################################################
+# Core pre-build step
+
+CLEAN_COREPRE = $(if $(filter 1,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT) |) $(CLEAN_COREFILE)
+BUILD_COREPRE =\
+  $(if $(filter 1,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |)\
+  mkcd | $(CORE_DIR) |\
+  $(BUILD_COREFILE)
+
+#==============================================================================
+# Core build step
+
+BLR.CORE.IDIR  = $(call dir2inc,$(CORE_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.CORE.HBY   = $(call includeiby,<data_caging_paths_for_iby.hrh> $(CORE_HBY))
+BLR.CORE.OBY   = $(call includeiby,$(CORE_OBY) $(if $(filter 1,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(BLDROBY) $(call iif,$(USE_ROFS1),$(call iif,$(USE_VERGEN),$(CORE_VERIBY))))
+BLR.CORE.OPT   = $(CORE_OPT) $(if $(filter 1,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(notdir $(CORE_NAME).img) $(BLDROPT)
+BLR.CORE.POST  =\
+  move | $(CORE_PREFIX).log | $(ROM_LOG) |\
+  move | $(CORE_PREFIX).oby | $(ROM_OUTOBY) |\
+  test | $(ROM_IMG) | $(call iif,$(USE_PAGEDROM),test | $(ROM_INC) |)\
+  $(call iif,$(USE_ROFS1),test | $(ROFS1_IMG))
+
+CLEAN_CORE = $(CLEAN_BLDROM)
+BUILD_CORE = $(BUILD_BLDROM)
+
+#==============================================================================
+# Core post-build step
+
+CLEAN_COREPOST = $(CLEAN_IMGCHK) | $(CLEAN_CORESYM)
+BUILD_COREPOST =\
+  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
+  $(call iif,$(USE_SYMGEN),$(BUILD_CORESYM))
+
+CLEAN_CORESYM = del | "$(ROM_SYM)" "$(ROFS1_SYM)"
+BUILD_CORESYM =\
+  echo-q | Creating $(CORE_TITLE) symbol file(s) |\
+  cmd    | $(MAKSYM_TOOL) $(call pathconv,$(ROM_LOG) $(ROM_SYM)) |\
+  $(call iif,$(USE_ROFS1),cmd | $(MAKSYMROFS_TOOL) $(call pathconv,$(ROFS1_LOG) $(ROFS1_SYM)))
+
+#==============================================================================
+
+SOS.CORE.STEPS = $(call iif,$(SKIPPRE),,COREPRE) $(call iif,$(SKIPBLD),,CORE) $(call iif,$(SKIPPOST),,COREPOST)
+ALL.CORE.STEPS = $(SOS.CORE.STEPS)
+
+
+###############################################################################
+# Targets
+
+.PHONY: core core-all core-image core-pre core-check core-symbol core-i2file
+
+core core-% rom-% rofs1-%: IMAGE_TYPE = CORE
+core-all     : USE_SYMGEN = 1
+
+core core-all: ;@$(call IMAKER,$$(ALL.CORE.STEPS))
+core-image   : ;@$(call IMAKER,$$(SOS.CORE.STEPS))
+
+core-pre     : ;@$(call IMAKER,COREPRE)
+core-check   : ;@$(call IMAKER,IMGCHK)
+core-symbol  : ;@$(call IMAKER,CORESYM)
+
+core-i2file  : ;@$(call IMAKER,COREI2F)
+
+core-trace-% : LABEL         = _trace_$*
+core-trace-% : USE_UDEB      = 1
+core-trace-% : CORE_UDEBFILE = $(call findfile,$(TRACE_PREFIX)$*$(TRACE_SUFFIX),$(TRACE_IDIR))
+core-trace-% :\
+  ;@$(if $(wildcard $(CORE_UDEBFILE)),,$(error Can't make target `$@', file `$(CORE_UDEBFILE)' not found))\
+    $(call IMAKER,$$(ALL.CORE.STEPS))
+
+
+# END OF IMAKER_CORE.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_help.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,261 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker help configuration
+#
+
+
+
+# Add help for a target or variable
+# add_help(name,type,values,desc)
+# @param name   - The name of the item for which the help is added
+# @param type   - The type of the item; t (target) or v (variable)
+# @param values - The possible values for the item, only for variables
+# @param desc   - Descrition of the item
+
+add_help =\
+  $(if $(filter help%,$(MAKECMDGOALS)),\
+    $(eval __i_type  := $(call select,$(call substr,1,1,$(strip $2)),t,t,v))\
+    $(eval __i_isvar := $(call equal,$(__i_type),v))\
+    $(foreach name,$1,\
+      $(eval HELP.$(name).TYPE := $(__i_type))\
+      $(if $(__i_isvar),$(eval HELP.$(name).VALUES = $3))\
+      $(eval HELP.$(name).DESC = $(strip $(eval __i_desc := $(if $(__i_isvar),$4,$3))\
+        $(foreach p,$(if $(__i_isvar),,4) 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20,\
+          $(if $(call defined,$p),$(eval __i_desc := $(__i_desc)$(,)$($p)))))$(__i_desc))))
+
+get_helpitems =\
+  $(strip $(eval __i_list := $(filter HELP.%.TYPE,$(.VARIABLES)))\
+  $(foreach var,$(__i_list),$(call select,$($(var)),$1,$(patsubst HELP.%.TYPE,%,$(var)))))
+
+#==============================================================================
+
+.PHONY: help help-config help-target help-variable
+
+.DEFAULT_GOAL := help
+
+help:: ;@$(call IMAKER,HELPUSAGE:b)
+
+help-config: ;@$(call IMAKER,HELPCFG:b)
+
+help-target help-variable: $$@-* ;
+
+help-target-%-list help-target-%-wiki help-target-% \
+help-variable-%-list help-variable-%-value help-variable-%-all help-variable-%-wiki help-variable-% \
+help-%-list help-%:\
+  ;@$(call IMAKER)
+
+# Help usage info
+define HELP_USAGE
+
+  Print help data on documented iMaker API items; targets and variables.
+  Wildcards *, ? and [] can be used with % patterns.
+
+  help                  : Print this message.
+  help-%                : $(HELP.help-%.DESC)
+  help-%-list           : $(HELP.help-%-list.DESC)
+
+  help-target           : $(HELP.help-target.DESC)
+  help-target-%         : $(HELP.help-target-%.DESC)
+  help-target-%-wiki    : $(HELP.help-target-%-wiki.DESC)
+  help-target-%-list    : $(HELP.help-target-%-list.DESC)
+
+  help-variable         : $(HELP.help-variable.DESC)
+  help-variable-%       : $(HELP.help-variable-%.DESC)
+  help-variable-%-all   : $(HELP.help-variable-%-all.DESC)
+  help-variable-%-wiki  : $(HELP.help-variable-%-wiki.DESC)
+  help-variable-%-list  : $(HELP.help-variable-%-list.DESC)
+  help-variable-%-value : $(HELP.help-variable-%-value.DESC)
+
+  help-config           : $(HELP.help-config.DESC)
+
+  menu                  : Run interactive menu.
+  version               : Print the iMaker version number.
+endef
+
+BUILD_HELPUSAGE = echo | $(call def2str,$(HELP_USAGE))\n
+
+BUILD_HELPDYNAMIC =\
+  $(foreach file,$(call reverse,$(wildcard $(addsuffix /$(TRACE_PREFIX)*$(TRACE_SUFFIX),$(TRACE_IDIR)))),\
+    $(call add_help,core-trace-$(patsubst $(TRACE_PREFIX)%$(TRACE_SUFFIX),%,$(notdir $(file))),t,Core image with traces for $(file).))\
+  $(call add_help,$(call getlastdir,$(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*/)),t,Language variant target.)\
+  $(call add_help,$(call getlastdir,$(wildcard $(CUSTVARIANT_ROOT)/$(CUSTVARIANT_PREFIX)*/)),t,Customer variant target.)\
+  $(eval include $(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*/$(LANGPACK_MKNAME)))\
+  $(eval include $(wildcard $(CUSTVARIANT_ROOT)/$(CUSTVARIANT_PREFIX)*/$(VARIANT_MKNAME)))
+
+BUILD_HELP =\
+  $(eval __i_var := $(filter help-%,$(MAKECMDGOALS)))\
+  $(if $(filter help-target help-variable,$(__i_var)),$(eval __i_var := $(__i_var)-*))\
+  $(eval __i_helpgoal := $(__i_var))\
+  $(foreach prefix,help target variable,$(eval __i_var := $(patsubst $(prefix)-%,%,$(__i_var))))\
+  $(foreach suffix,all list value wiki,$(eval __i_var := $(patsubst %-$(suffix),%,$(__i_var))))\
+  $(eval __i_list := $(if $(findstring help-target-$(__i_var),$(__i_helpgoal)),$(call get_helpitems,t),\
+    $(if $(findstring help-variable-$(__i_var),$(__i_helpgoal)),$(call get_helpitems,v),$(call get_helpitems,t) $(call get_helpitems,v))))\
+  $(eval __i_value := $(filter %-$(__i_var)-all %-$(__i_var)-value,$(__i_helpgoal)))\
+  $(eval __i_desc := $(filter-out %-$(__i_var)-list %-$(__i_var)-value,$(__i_helpgoal)))\
+  $(eval __i_wiki := $(if $(filter %-$(__i_var)-wiki,$(__i_helpgoal)),\ * ))\
+  $(call peval,\
+    my @var = ($(foreach var,$(foreach var2,$(subst $(,), ,$(__i_var)),$(call filterwcard,$(var2),$(__i_list))),{\
+      n=>$(call pquote,$(var))\
+      $(eval __i_isvar := $(call equal,$(HELP.$(var).TYPE),v))\
+      $(if $(__i_value),$(if $(__i_isvar),$(,)v=>$(call pquote,$(call def2str,$($(var))))))\
+      $(,)t=>q($(HELP.$(var).TYPE))\
+      $(if $(__i_desc),\
+        $(,)d=>$(call pquote,$(HELP.$(var).DESC))\
+        $(if $(__i_isvar),$(,)V=>$(call pquote,$(HELP.$(var).VALUES)))) }$(,)));\
+    imaker:DPrint(1, map($(if $(__i_desc),$(if $(__i_wiki),,q(-) x 40 . qq(\n) .))\
+      qq($(if $(__i_wiki),== $$_->{n} ==,$$_->{n}))\
+      $(if $(__i_value),. ($$_->{t} eq q(v) ? qq( = `$$_->{v}$') : q())) . qq(\n)\
+      $(if $(__i_desc),.\
+        qq($(__i_wiki)Type       : ) . ($$_->{t} eq q(t) ? qq(Target\n) : qq(Variable\n)) .\
+        qq($(__i_wiki)Description: $$_->{d}\n) .\
+        ($$_->{t} eq q(v) ? qq($(__i_wiki)Values     : $$_->{V}\n) : q())), @var));\
+    return(q()))
+
+BUILD_HELPCFG =\
+  echo | Finding available configuration file(s):\n\
+    $(call get_cfglist,$(CONFIGROOT),image_conf_.*\.mk,2)\n
+
+get_cfglist =\
+  $(call peval,\
+    use File::Find;\
+    my ($$dir, @conf) = (GetAbsDirname($(call pquote,$1)), ());\
+    find(sub {\
+      push(@conf, $$File::Find::name) if\
+        /$2$$/s && (($$File::Find::name =~ tr/\///) > (($$dir =~ tr/\///) + $3));\
+    }, $$dir);\
+    return(join(q(\n), map(Quote($$_), sort({lc($$a) cmp lc($$b)} @conf)))))
+
+
+###############################################################################
+# Helps
+
+$(call add_help,CONFIGROOT,v,(string),Define the default configuration root directory.)
+$(call add_help,USE_OVERRIDE,v,([0|1]),Define whether the override.pm Buildrom.pl plugin is used.)
+$(call add_help,USE_PAGING,v,((0|rom|code[:[(1|2|3)]+]?)),Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code).)
+$(call add_help,USE_ROFS,v,([[dummy|]0..6][,[dummy|]0..6]*),Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3).)
+$(call add_help,USE_ROMFILE,v,([0|1]),Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1.)
+$(call add_help,USE_SYMGEN,v,([0|1]),Generate the rom symbol file. 0=Do not generate, 1=Generate)
+$(call add_help,USE_UDEB,v,([0|1|full]),Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel.)
+$(call add_help,USE_VERGEN,v,([0|1]),Use iMaker version info generation)
+$(call add_help,KEEPTEMP,v,([0|1]),Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby)
+$(call add_help,LABEL,v,(string),A label to the NAME of the image)
+$(call add_help,NAME,v,(string),The name of the image)
+$(call add_help,TYPE,v,(rnd|prd|subcon),Defines the image type.)
+$(call add_help,WORKDIR,v,(string),The working directory for the image creation)
+$(call add_help,PRODUCT_NAME,v,(string),Name of the product)
+$(call add_help,PRODUCT_MODEL,v,(string),The model of the product)
+$(call add_help,PRODUCT_REVISION,v,(string),The revision of the product.)
+$(call add_help,BLDROM_OPT,v,(string),The default buildrom.pl options)
+$(call add_help,BLDROPT,v,(string),For passing extra parameters (from command line) to the buildrom.pl)
+$(call add_help,BLDROBY,v,(string),For passing extra oby files (from command line) to the buildrom.pl)
+$(call add_help,SOS_VERSION,v,([0-9]+.[0-9]+),Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN))
+$(call add_help,COREPLAT_NAME,v,(string),Name of the core platform)
+$(call add_help,CORE_DIR,v,(string),The working directory, when creating core image)
+$(call add_help,CORE_NAME,v,(string),The name of the core image)
+$(call add_help,CORE_OBY,v,(string),The oby file(s) included to the core image creation)
+$(call add_help,CORE_OPT,v,(string),The core specific buildrom options)
+$(call add_help,CORE_MSTOBY,v,(string),The generated master oby file name, which includes the CORE_OBY files)
+$(call add_help,CORE_TIME,v,(string),The time defined to the core image)
+$(call add_help,CORE_VERIBY,v,(string),The name of the generated core *version.iby, which included version files and info)
+$(call add_help,CORE_ROMVER,v,(string),The rom version parameter passed to the version.iby)
+$(call add_help,CORE_VERSION,v,(string),The version of the core. Used in sw.txt generation.)
+$(call add_help,CORE_SWVERFILE,v,(string),The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file.)
+$(call add_help,CORE_SWVERINFO,v,(string),The content string for the sw.txt file.)
+$(call add_help,CORE_MODELFILE,v,(string),The (generated) _core_model.txt file name.)
+$(call add_help,CORE_MODELINFO,v,(string),The content string for the model.txt file.)
+$(call add_help,CORE_IMEISVFILE,v,(string),The (generated) _core_imeisv.txt file name.)
+$(call add_help,CORE_IMEISVINFO,v,(string),The content string for the imeisv.txt file.)
+$(call add_help,CORE_PLATFILE,v,(string),The (generated) _core_platform.txt file name.)
+$(call add_help,CORE_PLATINFO,v,(string),The content string for the platform.txt file.)
+$(call add_help,CORE_PRODFILE,v,(string),The (generated) _core_product.txt file name.)
+$(call add_help,CORE_PLATINFO,v,(string),The content string for the product.txt file.)
+$(call add_help,CORE_FWIDFILE,v,(string),The (generated) _core_fwid.txt file name.)
+$(call add_help,CORE_PLATINFO,v,(string),The content string for the fwid.txt file.)
+$(call add_help,CORE_NDPROMFILE,v,(string),The name of the core Non Demand Paging rom file.)
+$(call add_help,CORE_ODPROMFILE,v,(string),The name of the core On Demand Paging rom file (Rom paging).)
+$(call add_help,CORE_CDPROMFILE,v,(string),The name of the core Code Demand Paging rom file (Code paging).)
+$(call add_help,CORE_ROFSFILE,v,(string),The name of the core rofs file.)
+$(call add_help,CORE_UDEBFILE,v,(string),The name of the core udeb file. See USE_UDEB.)
+$(call add_help,ROFS2_DIR,v,(string),The working directory, when creating the rofs2 image)
+$(call add_help,ROFS2_NAME,v,(string),The name of the rofs2 image)
+$(call add_help,ROFS2_OBY,v,(string),The oby file(s) included to the rofs2 image creation)
+$(call add_help,ROFS2_OPT,v,(string),The rofs2 specific buildrom options)
+$(call add_help,ROFS2_MSTOBY,v,(string),The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters)
+$(call add_help,ROFS2_HEADER,v,(string),This variable can contain a header section for the rofs2 master oby.)
+$(call add_help,ROFS2_FOOTER,v,(string),This variable can contain a footer section for the rofs2 master oby.)
+$(call add_help,ROFS2_TIME,v,(string),The time defined to the rofs2 image.)
+$(call add_help,ROFS2_VERIBY,v,(string),The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters.)
+$(call add_help,ROFS2_ROMVER,v,(string),The rofs2 ROM version string)
+$(call add_help,ROFS2_FWIDFILE,v,(string),The (generated) _rofs2_fwid.txt file name.)
+$(call add_help,ROFS2_FWIDINFO,v,(string),The content string for the fwid2.txt file.)
+$(call add_help,ROFS3_DIR,v,(string),The working directory, when creating the rofs3 image)
+$(call add_help,ROFS3_NAME,v,(string),The name of the rofs3 image)
+$(call add_help,ROFS3_OBY,v,(string),The oby file(s) included to the rofs3 image creation)
+$(call add_help,ROFS3_OPT,v,(string),The rofs3 specific buildrom options)
+$(call add_help,ROFS3_MSTOBY,v,(string),The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.)
+$(call add_help,ROFS3_HEADER,v,(string),This variable can contain a header section for the rofs3 master oby.)
+$(call add_help,ROFS3_FOOTER,v,(string),This variable can contain a footer section for the rofs3 master oby.)
+$(call add_help,ROFS3_TIME,v,(string),The time defined to the rofs3 image.)
+$(call add_help,ROFS3_VERIBY,v,(string),The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.)
+$(call add_help,ROFS3_ROMVER,v,(string),The rofs3 ROM version string)
+$(call add_help,ROFS3_CUSTSWFILE,v,(string),The (generated) source file name for customersw.txt.)
+$(call add_help,ROFS3_CUSTSWINFO,v,(string),The content string for the customersw.txt.)
+$(call add_help,ROFS3_FWIDFILE,v,(string),The (generated) _rofs3_fwid.txt file name.)
+$(call add_help,ROFS3_FWIDINFO,v,(string),The content string for the fwid3.txt file.)
+$(call add_help,VARIANT_DIR,v,(string),Configure the directory where to included the customer variant content. By default all content under $(VARIANT_CPDIR) is included to the image as it exists in the folder.)
+$(call add_help,VARIANT_CONFML,v,(string),Configure what is the ConfigurationTool input confml file, when configuration tool is ran.)
+$(call add_help,VARIANT_CONFCP,v,(string),Configure which ConfigurationTool generated configurations dirs are copied to output.)
+
+# Targets
+$(call add_help,version,t,Print the version information)
+$(call add_help,clean,t,Clean all target files.)
+$(call add_help,core,t,Create the core image (ROM,ROFS1))
+$(call add_help,rofs2,t,Create the rofs2 image)
+$(call add_help,rofs3,t,Create the rofs3 image)
+$(call add_help,variant,t,Create the variant image (rofs2,rofs3))
+$(call add_help,uda,t,Create the User Data area (uda) image.)
+$(call add_help,image,t,Create only the image file(s) (*.img))
+$(call add_help,core-image,t,Create the core image files (rom.img, rofs1.img))
+$(call add_help,rofs2-image,t,Create the rofs2 image file (rofs2.img))
+$(call add_help,rofs3-image,t,Create the rofs3 image file (rofs3.img))
+$(call add_help,variant-image,t,Create the variant image files (rofs3.img,rofs3.img))
+$(call add_help,uda-image,t,Create the User Data area (uda) image.)
+$(call add_help,toolinfo,t,Print info about the tool)
+$(call add_help,romsymbol,t,Create the rom symbol file)
+$(call add_help,all,t,Create all image sections and symbol files.)
+$(call add_help,flash-all,t,Create all image sections and symbol files.)
+$(call add_help,flash,t,Create all image sections files. Not any symbol files.)
+$(call add_help,f2image,t,Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH))
+$(call add_help,step-%,t,\
+Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME.\
+Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands.)
+$(call add_help,print-%,t,Print the value of the given variable to the screen.)
+
+$(call add_help,help,t,Print help on help targets.)
+$(call add_help,help-%,t,Print help on help items matching the pattern.)
+$(call add_help,help-%-list,t,Print a list of help items matching the pattern.)
+$(call add_help,help-target,t,Print help on all targets (same as help-target-*).)
+$(call add_help,help-target-%,t,Print help on targets matching the pattern.)
+$(call add_help,help-target-%-wiki,t,Print wiki-formatted help on targets matching the pattern.)
+$(call add_help,help-target-%-list,t,Print a list of targets matching the pattern.)
+$(call add_help,help-variable,t,Print help on all variables (same as help-variable-*).)
+$(call add_help,help-variable-%,t,Print help on variables matching the pattern.)
+$(call add_help,help-variable-%-all,t,Print full help on variables matching the pattern.)
+$(call add_help,help-variable-%-wiki,t,Print wiki-formatted help on variables matching the pattern.)
+$(call add_help,help-variable-%-list,t,Print a list of variables matching the pattern.)
+$(call add_help,help-variable-%-value,t,Print a list of variables with values matching the pattern.)
+$(call add_help,help-config,t,Print a list of available configurations in the current working environment.)
+
+
+# END OF IMAKER_HELP.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_image.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,201 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: Default iMaker image configuration
+#
+
+
+
+USE_FEATVAR    = $(call select,$(word 1,$(getsbvrominc)),invalid,0,1)
+USE_FOTA       = 0
+USE_IMGCHK     = 0
+USE_IINTPRSIS  = 0
+USE_IREADIMG   = 0
+USE_IROMBLD    = 0
+USE_OVERRIDE   = 1
+USE_ROFS       = 1,2,3
+USE_ROFSFILE   = $(call iif,$(USE_PAGING),1,0)
+USE_ROMFILE    = 1
+USE_SYMGEN     = 0
+USE_UDEB       = 0
+USE_VERGEN     = 0
+
+$(foreach rofs,1 2 3 4 5 6,\
+  $(eval USE_ROFS$(rofs) = $$(if $$(findstring $(rofs),$$(filter-out :%,$$(subst :, :,$$(subst $$(,), ,$$(USE_ROFS))))),1,0)))
+
+#==============================================================================
+
+TYPE = rnd
+
+BUILD_INFOMK = image_conf_buildinfo.mk
+BUILD_NAMEMK = image_conf_naming.mk
+BUILD_YEAR   = $(YEAR)
+BUILD_WEEK   = $(WEEK)
+BUILD_NUMBER = xx
+
+COREPLAT_NAME    =
+COREPLAT_DIR     = $(CONFIGROOT)/$(COREPLAT_NAME)
+COREPLAT_VERSION =
+PLATFORM_NAME    = $(subst .,,$(COREPLAT_VERSION)$(S60_VERSION))
+PLATFORM_DIR     = $(CONFIGROOT)/$(PLATFORM_NAME)
+PRODUCT_MSTNAME  =
+PRODUCT_NAME     =
+PRODUCT_MANUFACT = Nokia
+PRODUCT_MODEL    = N00
+PRODUCT_TYPE     =
+PRODUCT_REVISION = 01
+PRODUCT_DIR      = $(PLATFORM_DIR)/$(if $(PRODUCT_MSTNAME),$(PRODUCT_MSTNAME)/)$(PRODUCT_NAME)
+
+FEATURE_VARIANT = $(PRODUCT_NAME)
+FEATVAR_IDIR    = $(call getrominc)
+
+LABEL      =
+NAME       = $(PRODUCT_NAME)$(LABEL)
+WORKDIR    = $(if $(PRODUCT_NAME),$(E32ROMBLD)/$(PRODUCT_NAME),$(CURDIR))
+WORKPREFIX = $(WORKDIR)/$(NAME)
+WORKNAME   = $(WORKPREFIX)
+
+IMAGE_HBY  = <data_caging_paths_for_iby.hrh> <Variant\Header.iby>
+IMAGE_TYPE =
+
+TRACE_IDIR     = $(addsuffix /traces,$(FEATVAR_IDIR))
+TRACE_PREFIX   =
+TRACE_SUFFIX   = _trace.txt
+TRACE_UDEBFILE = $(E32ROMBLD)/mytraces.txt
+
+OVERRIDE_CONF = OVERRIDE_REPLACE/WARN #OVERRIDE_REPLACE/ADD, OVERRIDE_REPLACE/SKIP, OVERRIDE_SKIP/ADD
+
+GENIBY_FILEPAT = *.dll *.exe *.agt *.csy *.fsy *.tsy *.drv *.nif *.pgn *.prt
+
+ARM_VERSION = ARMV5
+SOS_VERSION = #9.3, 9.4, 9.5
+S60_VERSION = #3.2, 5.0
+
+ROFS_MAXSIZE = 0x10000000
+
+CPPFILE_LIST =
+MKFILE_LIST  = $(call findfile,$(BUILD_INFOMK) $(BUILD_NAMEMK) $(LANGPACK_SYSLANGMK),$(FEATVAR_IDIR)) | $(VARIANT_MK)
+
+
+###############################################################################
+#
+
+SOS.IMAGE.STEPS =\
+  $(filter-out %POST,$(SOS.CORE.STEPS) $(SOS.VARIANT.STEPS))\
+  $(filter %POST,$(SOS.CORE.STEPS) $(SOS.VARIANT.STEPS))
+
+ALL.IMAGE.STEPS = $(SOS.IMAGE.STEPS)
+
+CLEAN_WORKAREA  = del | $(WORKDIR)/* | deldir | $(WORKDIR)/*
+ALL.CLEAN.STEPS = $(ALL.IMAGE.STEPS) WORKAREA
+
+
+###############################################################################
+# Internal macros and definitions
+
+getrominc = $(if $(call true,$(USE_FEATVAR)),$(getsbvrominc),$(CONFIGROOT) $(E32ROM))
+
+getsbvrominc =\
+  $(if $(call equal,$(__i_featvar),$(FEATURE_VARIANT)),,$(eval __i_featvar := $(FEATURE_VARIANT))\
+    $(eval __i_getrominc := $(shell $(PERL) -x $(IMAKER_TOOL) --incdir $(__i_featvar))))$(__i_getrominc)
+
+includeiby = $(call peval,\
+  my @files = ();\
+  while ($(call pquote,$1) =~ /(?:([1-6]):)?(?:<(.+?)>|"+(.+?)"+|(\S+))/g) {\
+    my $$rom = (defined($$1) ? $$1 : q());\
+    push(@files, ($$rom ? q(ROM_IMAGE[).$$rom.q(] {\\\n) : q()) . q(\#include ).\
+      (defined($$2) ? qq(<$$2>) : q(").GetRelFname(defined($$3) ? $$3 : $$4, $(call pquote,$2)).q(")) . ($$rom ? q(\\\n}) : q()))\
+  }\
+  return(join(q(\\\n), @files)))
+
+define BLDROM_HDRINFO
+  // Generated master oby for $($(IMAGE_TYPE)_TITLE) image creation
+  //
+  // Filename: $($(IMAGE_TYPE)_MSTOBY)
+  // Work dir: $(call peval,GetAbsDirname(q(.)))
+  // Command : $(BLDROM_CMD)
+endef
+
+define BLDROM_PLUGINFO
+  // Buildrom plugins
+  //
+  $(call iif,$(USE_OVERRIDE),
+    externaltool=override:$($(IMAGE_TYPE)_PLUGINLOG);$(if $(filter debug 127,$(VERBOSE)),debug,0)
+    $(OVERRIDE_CONF))
+  externaltool=obyparse:$($(IMAGE_TYPE)_PLUGINLOG);$(if $(filter debug 127,$(VERBOSE)),debug,0)
+  $(call iif,$(call select,$(IMAGE_TYPE),CORE,$(USE_ROFS1)),
+    $(call iif,$(USE_ROMFILE),
+      OBYPARSE_ROM $(CORE_ROMFILE))
+    $(call iif,$(USE_ROFSFILE),
+      OBYPARSE_ROFS1 $(CORE_ROFSFILE))
+  )
+  $(call iif,$(USE_UDEB),
+    OBYPARSE_UDEB $(call select,$(USE_UDEB),full,*,$($(IMAGE_TYPE)_UDEBFILE)))
+endef
+
+getgenfiles = $(if $1,\
+  $(eval __i_cmd := $(filter geniby% write%,$(call lcase,$(call getelem,1,$1))))\
+  $(if $(__i_cmd),"$(call getelem,2,$1)")\
+  $(call getgenfiles,$(call restelems,$(if $(filter geniby%,$(__i_cmd)),7,$(if $(filter write%,$(__i_cmd)),4,2)),$1)))
+
+# TEMPORARY
+_buildoby = $(if $1,\
+  $(eval __i_elem1 := $(call getelem,1,$1))\
+  $(if $(filter geniby%,$(call lcase,$(__i_elem1))),$1,\
+    geniby | $(__i_elem1) | $(call getelem,2,$1) | $(call getelem,3,$1) | \#include "%3" | end |\
+    $(call _buildoby,$(call restelems,4,$1))))
+# TEMPORARY
+
+#==============================================================================
+
+BLDROM_CMD = $(BLDROM_TOOL) $(filter-out --D% -U%,$(BLR.$(IMAGE_TYPE).OPT)) $(BLR.$(IMAGE_TYPE).IDIR) $($(IMAGE_TYPE)_MSTOBY)
+
+CLEAN_BLDROM =\
+  del | "$($(IMAGE_TYPE)_PREFIX).*" "$($(IMAGE_TYPE)_DIR)/tmp?.oby" "$($(IMAGE_TYPE)_DIR)/ecom*.s??" "$($(IMAGE_TYPE)_PLUGINLOG)" |\
+  $(BLR.$(IMAGE_TYPE).CLEAN)
+
+BUILD_BLDROM =\
+  $(if $(BLR.$(IMAGE_TYPE).BUILD),$(BLR.$(IMAGE_TYPE).BUILD),\
+    echo-q | Creating $($(IMAGE_TYPE)_TITLE) SOS image |\
+    cd     | $($(IMAGE_TYPE)_DIR) |\
+    cmd    | $(strip $(BLDROM_CMD)) | $(BLDROM_PARSE) |\
+    copy   | tmp1.oby | $($(IMAGE_TYPE)_PREFIX).tmp1.oby |\
+    $(call iif,$(KEEPTEMP),,del | "tmp?.oby" "$($(IMAGE_TYPE)_PREFIX).dummy*" |)\
+    $(BLR.$(IMAGE_TYPE).POST))
+
+CLEAN_MAKSYMROFS = del | $($(IMAGE_TYPE)_SYM)
+BUILD_MAKSYMROFS =\
+  echo-q | Creating $($(IMAGE_TYPE)_TITLE) symbol file |\
+  cmd    | $(MAKSYMROFS_TOOL) $(call pathconv,$($(IMAGE_TYPE)_LOG) $($(IMAGE_TYPE)_SYM))
+
+
+###############################################################################
+# Targets
+
+.PHONY:\
+  all flash flash-all image image-all\
+  i2file
+
+all flash-all image-all: USE_SYMGEN = 1
+all flash flash-all    : ;@$(call IMAKER,$$(ALL.IMAGE.STEPS))
+
+image image-all: ;@$(call IMAKER,$$(SOS.IMAGE.STEPS))
+
+i2file: ;@$(call IMAKER,$(call ucase,$@))
+
+#==============================================================================
+
+include $(addprefix $(IMAKER_DIR)/imaker_,$(addsuffix .mk,core odp rofs2 rofs3 rofs4 uda variant))
+
+
+# END OF IMAKER_IMAGE.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_minienv.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: Default iMaker minienv configuration
+#
+
+
+
+###############################################################################
+#  __  __ _      _ ___
+# |  \/  (_)_ _ (_) __|_ ___ __
+# | |\/| | | ' \| | _|| ' \ V /
+# |_|  |_|_|_||_|_|___|_||_\_/
+#
+
+MINIENV_ZIP     = $(WORKPREFIX)_minienv.zip
+MINIENV_EXCLBIN = *.axf *.bin *.cmt *.fpsx *.hex *.out *.pmd *.ppu *.zip
+MINIENV_INCLBIN = *.axf *.bin *.fpsx *.hex *.out
+MINIENV_SOSDIR  = $(WORKDIR)
+
+CLEAN_MINIENV = del | $(MINIENV_ZIP)
+BUILD_MINIENV =\
+  echo-q | Creating minimal flash image creation environment $(MINIENV_ZIP) |\
+  $(MINIENV_TOOL) | $(MINIENV_CONF) |\
+  zip-q  | $(MINIENV_ZIP) | __find__ |
+
+MINIENV_IMAKER =\
+  find   | $(E32TOOLS)   | imaker.cmd localise.pm localise_all_resources.pm obyparse.pm override.pm plugincommon.pm | |\
+  find-a | $(IMAKER_DIR) | * |
+
+MINIENV_TOOL =\
+  $(MINIENV_IMAKER) |\
+  find-a | $(ITOOL_DIR) | * | |\
+  find-a | $(E32TOOLS) |\
+    cli.cmd s60ibymacros.pm\
+    armutl.pm bpabiutl.pm buildrom.* checksource.pm configpaging.pm datadriveimage.pm e32plat.pm\
+    e32variant.pm externaltools.pm featurevariantmap.pm featurevariantparser.pm genutl.pm maksym.*\
+    maksymrofs.* modload.pm pathutl.pm rofsbuild.exe rombuild.exe spitool.* uidcrc.exe winutl.pm\
+    *.bsf | gcc*.bsf |\
+  find-a  | $(E32TOOLS)/variant | * | |\
+  find-ar | $(E32GCCBIN)        | * | |\
+  find-ar | $(CONFT_TOOLDIR)    | * |
+
+MINIENV_CONF =\
+  find-a    | $(E32INC)              | *.hrh | |\
+  find-ar   | $(E32INCCFG)           | * | |\
+  find-ar   | $(E32INC)/oem          | * | |\
+  find-ar   | $(E32INC)/variant      | * | |\
+  find-a    | $(E32ROM)              | * | |\
+  find-ar   | $(E32ROMCFG)           | * | $(MINIENV_EXCLBIN) |\
+  find-ar   | $(E32ROM)/configpaging | * | |\
+  find-ar   | $(E32ROMINC)           | * | |\
+  find-ar   | $(E32ROM)/variant      | * | |\
+  find-ar   | $(OST_DICTDIR)         | $(OST_DICTPAT) | |\
+  find-ar   | $(EPOC32)/data/Z/resource/plugins | * | |\
+  find-a    | $(COREPLAT_DIR) | $(MINIENV_INCLBIN) | |\
+  find-ar   | $(PRODUCT_DIR)  | $(MINIENV_INCLBIN) | |\
+  sosfind-a | $(MINIENV_SOSDIR) | *.tmp1.oby | *.rom.oby *.rofs?.oby | *_bldromplugin.log
+
+
+###############################################################################
+# Targets
+
+.PHONY:\
+  minienv
+
+minienv: ;@$(call IMAKER,$(call ucase,$@))
+
+
+# END OF IMAKER_MINIENV.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_odp.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker On-Demand Paging configuration
+#
+
+
+
+USE_PAGING = 0
+
+USE_PAGEDROM  = $(if $(filter rom code code:%,$(call lcase,$(USE_PAGING))),1,0)
+USE_PAGEDCODE = $(call _getcodedp)
+
+ODP_CONFDIR  = $(E32ROM)/configpaging
+ODP_PAGEFILE = configpaging.cfg
+ODP_CODECOMP = bytepair
+
+#             Min    Max    Young/Old   NAND page read  NAND page read
+#             live   live   page ratio  delay           CPU overhead
+#             pages  pages              (microseconds)  (microseconds)
+ODP_ROMCONF = 1024   2048     3           0               0
+
+# Section for Rombuild phase on all Demand Paging builds
+#
+define ODP_ROMINFO
+  $(call iif,$(USE_PAGEDROM),
+    #define PAGED_ROM
+    ROMBUILD_OPTION -geninc
+    demandpagingconfig $(strip $(ODP_ROMCONF))
+    pagingoverride defaultpaged
+    pagedrom
+    compress
+  )
+  $(if $(filter 1,$(USE_PAGEDCODE)),
+    #define PAGED_CODE
+    pagingpolicy defaultpaged
+  )
+  $(if $(CORE_PAGEFILE),$(call iif,$(USE_PAGEDROM)$(filter 1,$(USE_PAGEDCODE)),
+    externaltool=configpaging:$(CORE_PAGEFILE))
+  )
+endef
+
+# Section for Rofsbuild phase on Code DP enabled builds
+#
+define ODP_CODEINFO
+  $(if $(filter $1,$(USE_PAGEDCODE)),
+    #define PAGED_CODE
+    $(if $(ROFS$1_PAGEFILE),
+      externaltool=configpaging:$(ROFS$1_PAGEFILE))
+    pagingoverride defaultpaged
+  )
+endef
+
+
+###############################################################################
+# Internal stuff
+
+_getcodedp = $(or $(strip\
+  $(if $(filter code code:,$(eval __i_paging := $(call lcase,$(call sstrip,$(USE_PAGING))))$(__i_paging)),\
+    $(foreach rofs,1 2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),$(rofs))),\
+    $(if $(filter code:%,$(__i_paging)),\
+      $(foreach rofs,1 2 3 4 5 6,$(findstring $(rofs),$(__i_paging)))))),0)
+
+
+# END OF IMAKER_ODP.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_public.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,56 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker public interface
+#
+
+
+
+#==============================================================================
+# Product variant variables
+
+FEATVARIANT_CONFML = $(wildcard $(PRODUCT_DIR)/$(FEATURE_VARIANT).confml)
+
+PRODVARIANT_DIR    = $(PRODUCT_DIR)
+PRODVARIANT_CONFML = $(or $(FEATVARIANT_CONFML),$(PRODUCT_DIR)/$(PRODUCT_NAME).confml)
+PRODVARIANT_CONFCP =\
+  $(PLATFORM_NAME) $(PRODUCT_MSTNAME) $(PRODUCT_NAME)\
+  $(if $(FEATVARIANT_CONFML),$(call select,$(PRODUCT_NAME),$(FEATURE_VARIANT),,$(FEATURE_VARIANT)))
+
+#==============================================================================
+# Customer variant variables
+# Root for customer variant (custvariant) package settings
+
+CUSTVARIANT_ROOT   = $(PRODUCT_DIR)/customer
+CUSTVARIANT_PREFIX = custvariant_
+CUSTVARIANT_NAME   =
+CUSTVARIANT_ID     =
+CUSTVARIANT_DIR    = $(CUSTVARIANT_ROOT)/$(CUSTVARIANT_NAME)
+CUSTVARIANT_COMPLP =
+
+#==============================================================================
+# The Target specific override settings
+
+$(CUSTVARIANT_PREFIX)%: CUSTVARIANT_NAME = $(TARGETNAME)
+$(CUSTVARIANT_PREFIX)%: CUSTVARIANT_ID   = $(TARGETID)
+$(CUSTVARIANT_PREFIX)%: VARIANT_DIR      = $(CUSTVARIANT_DIR)
+$(CUSTVARIANT_PREFIX)%: variantrofs3_$(TARGETID)$(TARGETEXT) ;
+
+#==============================================================================
+# Helps
+
+$(call add_help,PRODVARIANT_DIR,v,(string),Overrides the VARIANT_DIR for product variant, see the instructions of VARIANT_CONFCP for details.)
+$(call add_help,PRODVARIANT_CONFML,v,(string),Overrides the VARIANT_CONFML for product variant, see the instructions of VARIANT_CONFML for details.)
+$(call add_help,PRODVARIANT_CONFCP,v,(string),Overrides the VARIANT_CONFCP for product variant, see the instructions of VARIANT_CONFCP for details.)
+$(call add_help,CUSTVARIANT_DIR,v,(string),Overrides the VARIANT_DIR for customer variant, see the instructions of VARIANT_CONFCP for details.)
+$(call add_help,CUSTVARIANT_COMPLP,v,(string),Compatible language variant.)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_rofs2.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,356 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker ROFS2 image configuration
+#
+
+
+
+###############################################################################
+#  ___  ___  ___ ___   ___
+# | _ \/ _ \| __/ __| |_  )
+# |   / (_) | _|\__ \  / /
+# |_|_\\___/|_| |___/ /___|
+#
+
+USE_NEWLOCLZTN  = $(if $(filter 5%,$(S60_VERSION)),1,0)
+
+ROFS2_TITLE     = ROFS2
+ROFS2_DIR       = $(WORKDIR)/rofs2
+ROFS2_NAME      = $(NAME)
+ROFS2_PREFIX    = $(ROFS2_DIR)/$(ROFS2_NAME)
+ROFS2_IDIR      =
+ROFS2_HBY       =
+ROFS2_OBY       =
+ROFS2_OPT       =
+ROFS2_MSTOBY    = $(ROFS2_PREFIX)_rofs2_master.oby
+ROFS2_HEADER    =
+ROFS2_INLINE    =
+ROFS2_FOOTER    =
+ROFS2_TIME      = $(DAY)/$(MONTH)/$(YEAR)
+
+ROFS2_OBYGEN    =
+
+ROFS2_VERIBY    = $(ROFS2_PREFIX)_rofs2_version.iby
+ROFS2_ROMVER    = 0.01(0)
+ROFS2_VERSION   = $(CORE_VERSION)
+ROFS2_FWIDFILE  = $(ROFS2_PREFIX)_rofs2_fwid.txt
+ROFS2_FWID      = language
+ROFS2_FWIDVER   = $(LANGPACK_ID)
+ROFS2_FWIDINFO  = id=$(ROFS2_FWID)\nversion=$(ROFS2_FWIDVER)\n
+
+ROFS2_IMG       = $(ROFS2_PREFIX).rofs2.img
+ROFS2_LOG       = $(ROFS2_PREFIX).rofs2.log
+ROFS2_OUTOBY    = $(ROFS2_PREFIX).rofs2.oby
+ROFS2_SYM       = $(ROFS2_PREFIX).rofs2.symbol
+
+ROFS2_PLUGINLOG = $(ROFS2_PREFIX)_rofs2_bldromplugin.log
+ROFS2_PAGEFILE  = $(ODP_PAGEFILE)
+ROFS2_UDEBFILE  = $(TRACE_UDEBFILE)
+
+ROFS2_ICHKLOG   = $(ROFS2_PREFIX)_rofs2_imgcheck.log
+ROFS2_ICHKOPT   = $(IMGCHK_OPT)
+ROFS2_ICHKIMG   = $(ROFS2_IMG) $(CORE_ICHKIMG)
+
+ROFS2_I2FDIR    = $(ROFS2_DIR)/img2file
+
+#==============================================================================
+
+define ROFS2_MSTOBYINFO
+  $(BLDROM_HDRINFO)
+
+  ROM_IMAGE 0        non-xip size=0x00000000
+  ROM_IMAGE 1 dummy1 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 2  rofs2 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 3 dummy3 non-xip size=$(ROFS_MAXSIZE)
+
+  $(BLDROM_PLUGINFO)
+
+  // ROFS2 header
+  //
+  $(ROFS2_HDRINFO)
+
+  ROM_IMAGE[2] {
+    $(call ODP_CODEINFO,2)
+    $(BLR.ROFS2.OBY)
+    $(ROFS2_INLINE)
+    $(ROFS2_FOOTERINFO)
+  }
+endef
+
+define ROFS2_HDRINFO
+  $(DEFINE) _IMAGE_WORKDIR $(ROFS2_DIR)
+  $(call mac2cppdef,$(BLR.ROFS2.OPT))
+  $(call iif,$(USE_NEWLOCLZTN),
+    $(foreach lang,$(call getlangbyid,$(LANGPACK_LANGS)),
+      #define __LOCALES_$(lang)_IBY__)
+    $(foreach lang,$(call getlangbyid,$(LANGPACK_LANGS)),
+      ADD_LANGUAGE $(lang))
+  )
+  $(BLR.ROFS2.HBY)
+  $(ROFS2_HEADER)
+  $(if $(filter 2,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
+endef
+
+define ROFS2_FOOTERINFO
+  $(if $(ROFS2_TIME),time=$(ROFS2_TIME))
+  $(ROFS2_FOOTER)
+endef
+
+define ROFS2_VERIBYINFO
+  // Generated `$(ROFS2_VERIBY)$' for ROFS2 image creation
+  $(if $(ROFS2_ROMVER),
+
+    version=$(ROFS2_ROMVER))
+
+  OVERRIDE_REPLACE/ADD
+  $(call iif,$(USE_NEWLOCLZTN),
+    data-override=$(LANGPACK_LANGFILE)  RESOURCE_FILES_DIR\Bootdata\languages.txt
+    data-override=$(LANGPACK_IDFILE)  RESOURCE_FILES_DIR\versions\lang.txt
+    data-override=$(LANGPACK_SWVERFILE)  RESOURCE_FILES_DIR\versions\langsw.txt
+  )
+  $(call iif,$(USE_FOTA),
+    data-override=$(ROFS2_FWIDFILE)  RESOURCE_FILES_DIR\versions\fwid2.txt)
+  OVERRIDE_END
+endef
+
+#==============================================================================
+
+CLEAN_ROFS2FILE =\
+  del | "$(ROFS2_MSTOBY)" "$(ROFS2_VERIBY)" "$(ROFS2_FWIDFILE)" |\
+  $(CLEAN_LANGFILE) |\
+  del | $(call getgenfiles,$(call _buildoby,$(ROFS2_OBYGEN)))
+
+BUILD_ROFS2FILE =\
+  echo-q | Generating file(s) for ROFS2 image creation |\
+  write  | $(ROFS2_MSTOBY) | $(call def2str,$(ROFS2_MSTOBYINFO)) |\
+  $(call iif,$(USE_VERGEN),\
+    write  | $(ROFS2_VERIBY)   | $(call def2str,$(ROFS2_VERIBYINFO)) |\
+    writeu | $(ROFS2_FWIDFILE) | $(ROFS2_FWIDINFO) |)\
+  $(call iif,$(USE_NEWLOCLZTN),$(BUILD_LANGFILE)) |\
+  $(call _buildoby,$(ROFS2_OBYGEN))
+
+
+###############################################################################
+#
+
+LANGPACK_SYSLANGMK     = system_languages.mk
+
+LANGPACK_ROOT          = $(PRODUCT_DIR)/language
+LANGPACK_PREFIX        = langpack_
+LANGPACK_MKNAME        = language_variant.mk
+LANGPACK_NAME          =
+LANGPACK_DIR           = $(LANGPACK_ROOT)/$(LANGPACK_NAME)
+LANGPACK_CONFML        = $(or $(wildcard $(LANGPACK_DIR)/$(CONFT_CFGNAME).confml),$(PRODVARIANT_CONFML))
+LANGPACK_CONFCP        = $(PRODVARIANT_CONFCP) $(if $(wildcard $(LANGPACK_DIR)/$(CONFT_CFGNAME).confml),$(CONFT_CFGNAME))
+
+LANGPACK_IDFILE        = $(ROFS2_PREFIX)_rofs2_lang.txt
+LANGPACK_ID            = 01
+LANGPACK_LANGFILE      = $(ROFS2_PREFIX)_rofs2_languages.txt
+LANGPACK_LANGS         = English
+LANGPACK_DEFAULTLANG   = $(word 1,$(LANGPACK_LANGS))
+LANGPACK_DEFAULTREGION = Western
+LANGPACK_SWVERFILE     = $(ROFS2_PREFIX)_rofs2_langsw.txt
+LANGPACK_SWVERINFO     = $(CORE_SWVERINFO)
+LANGPACK_INFOFILE      = $(ROFS2_PREFIX)_rofs2_$(LANGPACK_NAME)_info.txt
+
+LANGPACK_LANGNAMES     = $(call getlangname,$(LANGPACK_LANGS))
+LANGPACK_LANGIDS       = $(call getlangid,$(LANGPACK_LANGS))
+LANGPACK_DEFLANGNAME   = $(call getlangname,$(LANGPACK_DEFAULTLANG))
+LANGPACK_DEFLANGID     = $(call getlangid,$(LANGPACK_DEFAULTLANG))
+LANGPACK_REGION        = $(call getlangregion,$(LANGPACK_DEFAULTLANG))
+
+#==============================================================================
+
+CLEAN_LANGFILE = del | "$(LANGPACK_LANGFILE)" "$(LANGPACK_IDFILE)" "$(LANGPACK_SWVERFILE)" "$(LANGPACK_INFOFILE)"
+BUILD_LANGFILE =\
+  echo-q | Generating language files for Language Package image creation |\
+  $(if $(strip $(LANGUAGE_SYSLANGS)),,\
+    error | 1 | No system languages defined\n |)\
+  $(if $(strip $(LANGPACK_LANGS)),,\
+    error | 1 | No languages defined in the language pack\n |)\
+  $(call select,$(words $(LANGPACK_LANGS)),$(words $(LANGPACK_LANGIDS)),,\
+    error | 1 | Not all languages of the language pack defined in the system languages\n |)\
+  $(call select,$(words $(LANGPACK_LANGS)),$(words $(call getlangbyid,$(LANGPACK_LANGS))),,\
+    error | 1 | Duplicate language defined in the language pack\n |)\
+  $(if $(strip $(LANGPACK_DEFAULTLANG)),,\
+    error | 1 | No default language defined\n |)\
+  $(if $(word 2,$(LANGPACK_DEFAULTLANG)),\
+    error | 1 | More than one default language defined\n |)\
+  $(if $(filter $(call lcase,$(LANGPACK_DEFAULTLANG)),$(call lcase,$(LANGPACK_LANGS))),,\
+    error | 1 | Default language not defined in the language pack languages\n |)\
+  $(if $(word 2,$(sort $(call getlangregion,$(LANGPACK_LANGS)))),\
+    error | 1 | Not all languages of the language pack belong to the same region\n |)\
+  \
+  writeu | $(LANGPACK_LANGFILE)  | $(LANGPACK_LANGINFO) |\
+  writeu | $(LANGPACK_IDFILE)    | $(LANGPACK_ID) |\
+  writeu | $(LANGPACK_SWVERFILE) | $(LANGPACK_SWVERINFO) |\
+  $(if $(LANGPACK_NAME),\
+    write | $(LANGPACK_INFOFILE) | $(call def2str,$(LANGPACK_INFO)))
+
+LANGPACK_LANGINFO =\
+  $(foreach lang,$(LANGPACK_LANGIDS),\
+    $(lang)$(call select,$(lang),$(LANGPACK_DEFLANGID),$(,)d)\n)
+
+define LANGPACK_INFO
+  Generated `$(LANGPACK_INFOFILE)$' for documenting the language selections
+
+  Name         : $(LANGPACK_NAME)
+  Default Lang.: $(LANGPACK_DEFLANGNAME) ($(LANGPACK_DEFLANGID))
+  Languages    : $(LANGPACK_LANGNAMES)
+  Language IDs : $(LANGPACK_LANGIDS)
+  Region       : $(LANGPACK_REGION)
+endef
+
+
+###############################################################################
+# ROFS2 pre
+
+CLEAN_ROFS2PRE = $(if $(filter 2,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT) |) $(CLEAN_ROFS2FILE)
+BUILD_ROFS2PRE =\
+  $(if $(filter 2,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |)\
+  mkcd | $(ROFS2_DIR) |\
+  $(BUILD_ROFS2FILE)
+
+#==============================================================================
+# ROFS2 build
+
+BLR.ROFS2.IDIR = $(call dir2inc,$(ROFS2_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.ROFS2.HBY  = $(call includeiby,$(IMAGE_HBY) $(ROFS2_HBY))
+BLR.ROFS2.OBY  = $(call includeiby,$(ROFS2_OBY) $(if $(filter 2,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(call iif,$(USE_VERGEN),$(ROFS2_VERIBY)))
+BLR.ROFS2.OPT  = $(ROFS2_OPT) $(if $(filter 2,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(notdir $(ROFS2_NAME).img) $(BLDROPT)
+BLR.ROFS2.POST = $(call iif,$(KEEPTEMP),,del | $(ROFS2_PREFIX).???)
+
+CLEAN_ROFS2 = $(CLEAN_BLDROM)
+BUILD_ROFS2 = $(BUILD_BLDROM)
+
+#==============================================================================
+# ROFS2 post
+
+CLEAN_ROFS2POST = $(CLEAN_IMGCHK) | $(CLEAN_MAKSYMROFS)
+BUILD_ROFS2POST =\
+  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
+  $(call iif,$(USE_SYMGEN),$(BUILD_MAKSYMROFS))
+
+#==============================================================================
+
+SOS.ROFS2.STEPS = $(call iif,$(USE_ROFS2),$(call iif,$(SKIPPRE),,ROFS2PRE) $(call iif,$(SKIPBLD),,ROFS2) $(call iif,$(SKIPPOST),,ROFS2POST))
+ALL.ROFS2.STEPS = $(SOS.ROFS2.STEPS)
+
+
+###############################################################################
+# Targets
+
+.PHONY: rofs2 rofs2-all rofs2-image rofs2-pre rofs2-check rofs2-symbol rofs2-i2file
+
+rofs2 rofs2-%  : IMAGE_TYPE = ROFS2
+rofs2-all      : USE_SYMGEN = 1
+
+rofs2 rofs2-all: ;@$(call IMAKER,$$(ALL.ROFS2.STEPS))
+rofs2-image    : ;@$(call IMAKER,$$(SOS.ROFS2.STEPS))
+
+rofs2-pre      : ;@$(call IMAKER,ROFS2PRE)
+rofs2-check    : ;@$(call IMAKER,IMGCHK)
+rofs2-symbol   : ;@$(call IMAKER,MAKSYMROFS)
+
+rofs2-i2file   : USE_ROFS = 2
+rofs2-i2file   : ;@$(call IMAKER,VARIANTI2F)
+
+# langpack_%
+$(LANGPACK_PREFIX)%: LANGPACK_NAME  = $(TARGETNAME)
+$(LANGPACK_PREFIX)%: LANGPACK_ID    = $(TARGETID)
+$(LANGPACK_PREFIX)%: VARIANT_DIR    = $(LANGPACK_DIR)
+$(LANGPACK_PREFIX)%: VARIANT_MKNAME = $(LANGPACK_MKNAME)
+$(LANGPACK_PREFIX)%: VARIANT_CONFML = $(LANGPACK_CONFML)
+$(LANGPACK_PREFIX)%: VARIANT_CONFCP = $(LANGPACK_CONFCP)
+$(LANGPACK_PREFIX)%: variantrofs2_$(TARGETID)$(TARGETEXT) ;
+
+# langpack_all langpack_china langpack_japan langpack_western
+.PHONY: $(addprefix $(LANGPACK_PREFIX),all china japan western)
+
+$(addprefix $(LANGPACK_PREFIX),all china japan western):\
+  ;@$(call IMAKER,$$(addsuffix |,$$(call getlpacksbyregion,$(LANGPACK_ID))))
+
+#==============================================================================
+# Helps
+
+$(call add_help,LANGPACK_DIR,v,(string),Overrides the VARIANT_DIR for language pack, see the instructions of VARIANT_CONFCP for details.)
+$(call add_help,LANGPACK_CONFML,v,(string),Overrides the VARIANT_CONFML for language pack, see the instructions of VARIANT_CONFML for details.)
+$(call add_help,LANGPACK_CONFCP,v,(string),Overrides the VARIANT_CONFCP for language pack, see the instructions of VARIANT_CONFCP for details.)
+$(call add_help,LANGPACK_LANGS,v,(string),Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt))
+$(call add_help,LANGPACK_DEFAULTLANG,v,(string),Default language is the language where the device will boot to (SIM language overrides this selection))
+$(call add_help,LANGPACK_ID,v,(string),Language id used in the lang.txt generation)
+
+$(call add_help,$(LANGPACK_PREFIX)all,t,Create all language packages.)
+$(call add_help,$(LANGPACK_PREFIX)china,t,Create language packages that belong to China region.)
+$(call add_help,$(LANGPACK_PREFIX)japan,t,Create language packages that belong to Japan region.)
+$(call add_help,$(LANGPACK_PREFIX)western,t,Create language packages that belong to Western region.)
+
+
+###############################################################################
+# Functions
+
+# Convert a list of language names and/or ids to numeric codes (ids) based on the system language mapping, e.g. English => 01, etc.
+getlangid   = $(call _getlang,$1,$(LANGUAGE_ID-NAME),2)
+# Sorted by language ids and duplicates removed
+getlangbyid = $(call _getlang,$1,$(LANGUAGE_ID-NAME),2,1)
+
+# Language ids/names to language names, e.g. 01 => English, etc.
+getlangname  = $(call _getlang,$1,$(LANGUAGE_ID-NAME),3)
+getlnamebyid = $(call _getlang,$1,$(LANGUAGE_ID-NAME),3,1)
+
+# Language ids/names to language regions, e.g. 01/English => Western, etc.
+getlangregion  = $(call _getlang,$1,$(LANGUAGE_ID-REGION),2)
+getlregionbyid = $(call _getlang,$1,$(LANGUAGE_ID-REGION),2,1)
+
+# Get all language pack targets that belong to a given region
+getlpacksbyregion = $(strip\
+  $(foreach file,$(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*/$(LANGPACK_MKNAME)),\
+    $(eval include $(file))\
+    $(if $(call select,$1,all,1)$(call select,$1,$(LANGPACK_REGION),1),\
+      $(notdir $(patsubst %/,%,$(dir $(file)))))))
+
+
+###############################################################################
+# Internal stuff
+
+LANGUAGE_EVAL =\
+  $(eval -include $(call findfile,$(LANGPACK_SYSLANGMK),$(FEATVAR_IDIR)))\
+  $(eval LANGUAGE_ID-NAME :=)$(eval LANGUAGE_ID-REGION :=)\
+  $(call _evallangdata,$(subst $(\n), | ,$(LANGUAGE_SYSLANGS)))
+
+_evallangdata = $(if $1,\
+  $(eval __i_ldata := $(call getelem,1,$1))\
+  $(if $(eval __i_lid := $(word 2,$(__i_ldata)))$(__i_lid),\
+    $(eval __i_lidx   := $(call _getlangid,$(__i_lid)))\
+    $(eval __i_region := $(or $(word 3,$(__i_ldata)),$(LANGPACK_DEFAULTREGION)))\
+    $(eval LANGUAGE_ID-NAME   += $(__i_lidx)|$(__i_lid)|$(word 1,$(__i_ldata))|$(call lcase,$(word 1,$(__i_ldata))))\
+    $(eval LANGUAGE_ID-REGION += $(__i_lidx)|$(__i_region)|$(call lcase,$(__i_region))))\
+  $(call _evallangdata,$(if $(__i_ldata),$(call restwords,3,$(call restwords,$(words $(__i_ldata)),$1)),$(call restwords,$1))))
+
+_getlang = $(strip\
+  $(eval __i_lids :=)\
+  $(foreach id,$1,\
+    $(eval __i_lidx := $(call _getlangid,$(id)))\
+    $(eval __i_lids += $(if $(filter $(__i_lidx)|%,$(LANGUAGE_ID-NAME)),$(__i_lidx),\
+      $(word 1,$(subst |, ,$(filter %|$(call lcase,$(id)),$(LANGUAGE_ID-NAME)))))))\
+  $(foreach lid,$(if $4,$(sort $(__i_lids)),$(__i_lids)),\
+    $(word $3,$(subst |, ,$(filter $(lid)|%,$2)))))
+
+_getlangid =\
+  $(if $(filter 0%,$1),$(call _getlangid,$(call substr,2,,$1)),\
+    $(eval __i_len := $(call strlen,$1))$(eval __i_prefix := 0)\
+    $(call sstrip,$(foreach len,6 5 4 3 2 1,$(if $(filter $(len),$(__i_len)),$(eval __i_prefix :=))$(__i_prefix)))$1)
+
+
+# END OF IMAKER_ROFS2.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_rofs3.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,188 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker ROFS3 image configuration
+#
+
+
+
+###############################################################################
+#  ___  ___  ___ ___   ____
+# | _ \/ _ \| __/ __| |__ /
+# |   / (_) | _|\__ \  |_ \
+# |_|_\\___/|_| |___/ |___/
+#
+
+ROFS3_TITLE      = ROFS3
+ROFS3_DIR        = $(WORKDIR)/rofs3
+ROFS3_NAME       = $(NAME)
+ROFS3_PREFIX     = $(ROFS3_DIR)/$(ROFS3_NAME)
+ROFS3_IDIR       =
+ROFS3_HBY        =
+ROFS3_OBY        =
+ROFS3_OPT        =
+ROFS3_MSTOBY     = $(ROFS3_PREFIX)_rofs3_master.oby
+ROFS3_HEADER     =
+ROFS3_INLINE     =
+ROFS3_FOOTER     =
+ROFS3_TIME       = $(DAY)/$(MONTH)/$(YEAR)
+
+ROFS3_OBYGEN     = #geniby | $(ROFS3_PREFIX)_rofs3_collected.oby | $(E32ROMINC)/customervariant/* | *.iby | \#include "%3" | end
+
+ROFS3_VERIBY     = $(ROFS3_PREFIX)_rofs3_version.iby
+ROFS3_ROMVER     = 0.01(0)
+ROFS3_VERSION    = $(CORE_VERSION)
+ROFS3_CUSTSWFILE = $(ROFS3_PREFIX)_rofs3_customersw.txt
+ROFS3_CUSTSWINFO = $(ROFS3_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)
+ROFS3_FWIDFILE   = $(ROFS3_PREFIX)_rofs3_fwid.txt
+ROFS3_FWID       = customer
+ROFS3_FWIDVER    = $(ROFS3_VERSION) Customer
+ROFS3_FWIDINFO   = id=$(ROFS3_FWID)\nversion=$(ROFS3_FWIDVER)\n
+
+ROFS3_IMG        = $(ROFS3_PREFIX).rofs3.img
+ROFS3_LOG        = $(ROFS3_PREFIX).rofs3.log
+ROFS3_OUTOBY     = $(ROFS3_PREFIX).rofs3.oby
+ROFS3_SYM        = $(ROFS3_PREFIX).rofs3.symbol
+
+ROFS3_PLUGINLOG  = $(ROFS3_PREFIX)_rofs3_bldromplugin.log
+ROFS3_PAGEFILE   = $(ODP_PAGEFILE)
+ROFS3_UDEBFILE   = $(TRACE_UDEBFILE)
+
+ROFS3_ICHKLOG    = $(ROFS3_PREFIX)_rofs3_imgcheck.log
+ROFS3_ICHKOPT    = $(IMGCHK_OPT)
+ROFS3_ICHKIMG    = $(ROFS3_IMG) $(ROFS2_ICHKIMG)
+
+ROFS3_I2FDIR     = $(ROFS3_DIR)/img2file
+
+#==============================================================================
+
+define ROFS3_MSTOBYINFO
+  $(BLDROM_HDRINFO)
+
+  ROM_IMAGE 0        non-xip size=0x00000000
+  ROM_IMAGE 1 dummy1 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 2 dummy2 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 3  rofs3 non-xip size=$(ROFS_MAXSIZE)
+
+  $(BLDROM_PLUGINFO)
+
+  // ROFS3 header
+  //
+  $(ROFS3_HDRINFO)
+
+  ROM_IMAGE[3] {
+    $(call ODP_CODEINFO,3)
+    $(BLR.ROFS3.OBY)
+    $(ROFS3_INLINE)
+    $(ROFS3_FOOTERINFO)
+  }
+endef
+
+define ROFS3_HDRINFO
+  $(DEFINE) _IMAGE_WORKDIR $(ROFS3_DIR)
+  $(call mac2cppdef,$(BLR.ROFS3.OPT))
+  $(BLR.ROFS3.HBY)
+  $(ROFS3_HEADER)
+  $(if $(filter 3,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
+endef
+
+define ROFS3_FOOTERINFO
+  $(if $(ROFS3_TIME),time=$(ROFS3_TIME))
+  $(ROFS3_FOOTER)
+endef
+
+define ROFS3_VERIBYINFO
+  // Generated `$(ROFS3_VERIBY)$' for ROFS3 image creation
+  $(if $(ROFS3_ROMVER),
+
+    version=$(ROFS3_ROMVER))
+
+  OVERRIDE_REPLACE/ADD
+  $(if $(ROFS3_CUSTSWINFO),
+    data-override=$(ROFS3_CUSTSWFILE)  RESOURCE_FILES_DIR\versions\customersw.txt)
+  $(call iif,$(USE_FOTA),
+    data-override=$(ROFS3_FWIDFILE)  RESOURCE_FILES_DIR\versions\fwid3.txt)
+  OVERRIDE_END
+endef
+
+#==============================================================================
+
+CLEAN_ROFS3FILE =\
+  del | "$(ROFS3_MSTOBY)" "$(ROFS3_VERIBY)" "$(ROFS3_CUSTSWFILE)" "$(ROFS3_FWIDFILE)" |\
+  del | $(call getgenfiles,$(ROFS3_OBYGEN))
+
+BUILD_ROFS3FILE =\
+  echo-q | Generating file(s) for ROFS3 image creation |\
+  write  | $(ROFS3_MSTOBY) | $(call def2str,$(ROFS3_MSTOBYINFO)) |\
+  $(call iif,$(USE_VERGEN),\
+    write  | $(ROFS3_VERIBY)     | $(call def2str,$(ROFS3_VERIBYINFO)) |\
+    writeu | $(ROFS3_CUSTSWFILE) | $(ROFS3_CUSTSWINFO) |\
+    writeu | $(ROFS3_FWIDFILE)   | $(ROFS3_FWIDINFO) |)\
+  $(ROFS3_OBYGEN)
+
+
+###############################################################################
+# ROFS3 pre
+
+CLEAN_ROFS3PRE = $(if $(filter 3,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT) |) $(CLEAN_ROFS3FILE)
+BUILD_ROFS3PRE =\
+  $(if $(filter 3,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |)\
+  mkcd | $(ROFS3_DIR) |\
+  $(BUILD_ROFS3FILE)
+
+#==============================================================================
+# ROFS3 build
+
+BLR.ROFS3.IDIR = $(call dir2inc,$(ROFS3_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.ROFS3.HBY  = $(call includeiby,$(IMAGE_HBY) $(ROFS3_HBY))
+BLR.ROFS3.OBY  = $(call includeiby,$(ROFS3_OBY) $(if $(filter 3,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(call iif,$(USE_VERGEN),$(ROFS3_VERIBY)))
+BLR.ROFS3.OPT  = $(ROFS3_OPT) $(if $(filter 3,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(notdir $(ROFS3_NAME).img) $(BLDROPT)
+BLR.ROFS3.POST = $(call iif,$(KEEPTEMP),,del | $(ROFS3_PREFIX).???)
+
+CLEAN_ROFS3 = $(CLEAN_BLDROM)
+BUILD_ROFS3 = $(BUILD_BLDROM)
+
+#==============================================================================
+# ROFS3 post
+
+CLEAN_ROFS3POST = $(CLEAN_IMGCHK) | $(CLEAN_MAKSYMROFS)
+BUILD_ROFS3POST =\
+  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
+  $(call iif,$(USE_SYMGEN),$(BUILD_MAKSYMROFS))
+
+#==============================================================================
+
+SOS.ROFS3.STEPS = $(call iif,$(USE_ROFS3),$(call iif,$(SKIPPRE),,ROFS3PRE) $(call iif,$(SKIPBLD),,ROFS3) $(call iif,$(SKIPPOST),,ROFS3POST))
+ALL.ROFS3.STEPS = $(SOS.ROFS3.STEPS)
+
+
+###############################################################################
+# Targets
+
+.PHONY: rofs3 rofs3-all rofs3-image rofs3-pre rofs3-check rofs3-symbol rofs3-i2file
+
+rofs3 rofs3-%  : IMAGE_TYPE = ROFS3
+rofs3-all      : USE_SYMGEN = 1
+
+rofs3 rofs3-all: ;@$(call IMAKER,$$(ALL.ROFS3.STEPS))
+rofs3-image    : ;@$(call IMAKER,$$(SOS.ROFS3.STEPS))
+
+rofs3-pre      : ;@$(call IMAKER,ROFS3PRE)
+rofs3-check    : ;@$(call IMAKER,IMGCHK)
+rofs3-symbol   : ;@$(call IMAKER,MAKSYMROFS)
+
+rofs3-i2file   : USE_ROFS = 3
+rofs3-i2file   : ;@$(call IMAKER,VARIANTI2F)
+
+
+# END OF IMAKER_ROFS3.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_rofs4.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,163 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker ROFS4 image configuration
+#
+
+
+
+###############################################################################
+#  ___  ___  ___ ___   _ _
+# | _ \/ _ \| __/ __| | | |
+# |   / (_) | _|\__ \ |_  _|
+# |_|_\\___/|_| |___/   |_|
+#
+
+ROFS4_TITLE      = ROFS4
+ROFS4_DIR        = $(WORKDIR)/rofs4
+ROFS4_NAME       = $(NAME)
+ROFS4_PREFIX     = $(ROFS4_DIR)/$(ROFS4_NAME)
+ROFS4_IDIR       =
+ROFS4_HBY        =
+ROFS4_OBY        =
+ROFS4_OPT        =
+ROFS4_MSTOBY     = $(ROFS4_PREFIX)_rofs4_master.oby
+ROFS4_HEADER     =
+ROFS4_INLINE     =
+ROFS4_FOOTER     =
+ROFS4_TIME       = $(DAY)/$(MONTH)/$(YEAR)
+
+ROFS4_OBYGEN     =
+
+ROFS4_VERSION    = $(CORE_VERSION)
+
+ROFS4_IMG        = $(ROFS4_PREFIX).rofs4.img
+ROFS4_LOG        = $(ROFS4_PREFIX).rofs4.log
+ROFS4_OUTOBY     = $(ROFS4_PREFIX).rofs4.oby
+ROFS4_SYM        = $(ROFS4_PREFIX).rofs4.symbol
+
+ROFS4_PLUGINLOG  = $(ROFS4_PREFIX)_rofs4_bldromplugin.log
+ROFS4_PAGEFILE   = $(ODP_PAGEFILE)
+ROFS4_UDEBFILE   = $(TRACE_UDEBFILE)
+
+ROFS4_ICHKLOG    = $(ROFS4_PREFIX)_rofs4_imgcheck.log
+ROFS4_ICHKOPT    = $(IMGCHK_OPT)
+ROFS4_ICHKIMG    = $(ROFS4_IMG) $(ROFS2_ICHKIMG)
+
+ROFS4_I2FDIR     = $(ROFS4_DIR)/img2file
+
+#==============================================================================
+
+define ROFS4_MSTOBYINFO
+  $(BLDROM_HDRINFO)
+
+  ROM_IMAGE 0        non-xip size=0x00000000
+  ROM_IMAGE 1 dummy1 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 2 dummy2 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 3 dummy3 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 4  rofs4 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 5 dummy5 non-xip size=$(ROFS_MAXSIZE)
+  ROM_IMAGE 6 dummy6 non-xip size=$(ROFS_MAXSIZE)
+
+  $(BLDROM_PLUGINFO)
+
+  // ROFS4 header
+  //
+  $(ROFS4_HDRINFO)
+
+  ROM_IMAGE[4] {
+    $(call ODP_CODEINFO,4)
+    $(BLR.ROFS4.OBY)
+    $(ROFS4_INLINE)
+    $(ROFS4_FOOTERINFO)
+  }
+endef
+
+define ROFS4_HDRINFO
+  $(DEFINE) _IMAGE_WORKDIR $(ROFS4_DIR)
+  $(call mac2cppdef,$(BLR.ROFS4.OPT))
+  $(BLR.ROFS4.HBY)
+  $(ROFS4_HEADER)
+endef
+
+define ROFS4_FOOTERINFO
+  $(if $(ROFS4_TIME),time=$(ROFS4_TIME))
+  $(ROFS4_FOOTER)
+endef
+
+#==============================================================================
+
+CLEAN_ROFS4FILE =\
+  del | "$(ROFS4_MSTOBY)" |\
+  del | $(call getgenfiles,$(ROFS4_OBYGEN))
+
+BUILD_ROFS4FILE =\
+  echo-q | Generating file(s) for $(ROFS4_TITLE) image creation |\
+  write  | $(ROFS4_MSTOBY) | $(call def2str,$(ROFS4_MSTOBYINFO)) |\
+  $(ROFS4_OBYGEN)
+
+
+###############################################################################
+# ROFS4 pre
+
+CLEAN_ROFS4PRE = $(CLEAN_ROFS4FILE)
+BUILD_ROFS4PRE =\
+  mkcd | $(ROFS4_DIR) |\
+  $(BUILD_ROFS4FILE)
+
+#==============================================================================
+# ROFS4 build
+
+BLR.ROFS4.IDIR = $(call dir2inc,$(ROFS4_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.ROFS4.HBY  = $(call includeiby,$(IMAGE_HBY) $(ROFS4_HBY))
+BLR.ROFS4.OBY  = $(call includeiby,$(ROFS4_OBY))
+BLR.ROFS4.OPT  = $(ROFS4_OPT) $(if $(filter 4,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(ROFS4_NAME).img $(BLDROPT)
+BLR.ROFS4.POST = $(call iif,$(KEEPTEMP),,del | $(ROFS4_PREFIX).???)
+
+CLEAN_ROFS4 = $(CLEAN_BLDROM)
+BUILD_ROFS4 = $(BUILD_BLDROM)
+
+#==============================================================================
+# ROFS4 post
+
+CLEAN_ROFS4POST = $(CLEAN_IMGCHK) | $(CLEAN_MAKSYMROFS)
+BUILD_ROFS4POST =\
+  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
+  $(call iif,$(USE_SYMGEN),$(BUILD_MAKSYMROFS))
+
+#==============================================================================
+
+SOS.ROFS4.STEPS = $(call iif,$(USE_ROFS4),$(call iif,$(SKIPPRE),,ROFS4PRE) $(call iif,$(SKIPBLD),,ROFS4) $(call iif,$(SKIPPOST),,ROFS4POST))
+ALL.ROFS4.STEPS = $(SOS.ROFS4.STEPS)
+
+
+###############################################################################
+# Targets
+
+.PHONY: rofs4 rofs4-all rofs4-image rofs4-pre rofs4-check rofs4-symbol rofs4-i2file
+
+rofs4 rofs4-%  : IMAGE_TYPE = ROFS4
+rofs4-all      : USE_SYMGEN = 1
+
+rofs4 rofs4-all: ;@$(call IMAKER,$$(ALL.ROFS4.STEPS))
+rofs4-image    : ;@$(call IMAKER,$$(SOS.ROFS4.STEPS))
+
+rofs4-pre      : ;@$(call IMAKER,ROFS4PRE)
+rofs4-check    : ;@$(call IMAKER,IMGCHK)
+rofs4-symbol   : ;@$(call IMAKER,MAKSYMROFS)
+
+rofs4-i2file   : USE_ROFS = 4
+rofs4-i2file   : ;@$(call IMAKER,VARIANTI2F)
+
+
+# END OF IMAKER_ROFS4.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_tools.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,291 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker external tools configuration
+#
+
+
+
+###############################################################################
+# External tools
+
+BLDROM_TOOL     = buildrom
+ROMBLD_TOOL     = rombuild
+ROFSBLD_TOOL    = rofsbuild
+MAKSYM_TOOL     = maksym
+MAKSYMROFS_TOOL = maksymrofs
+IMGCHK_TOOL     = imgcheck
+INTPRSIS_TOOL   = interpretsis
+READIMG_TOOL    = readimage
+
+UNZIP_TOOL      = unzip
+ZIP_TOOL        = zip
+7ZIP_TOOL       = 7za
+FILEDISK_TOOL   = filedisk
+WINIMAGE_TOOL   = "c:/program files/winimage/winimage.exe"
+
+#==============================================================================
+
+BLDROM_OPT =\
+  -loglevel1 $(call iif,$(KEEPTEMP),-p) -v -nosymbols\
+  $(call iif,$(USE_FEATVAR),-DFEATUREVARIANT=$(FEATURE_VARIANT))\
+  $(if $(IMAGE_TYPE),-D_IMAGE_TYPE_$(IMAGE_TYPE)) $(if $(TYPE),-D_IMAGE_TYPE_$(call ucase,$(TYPE)))
+
+BLDROM_PARSE =\
+  parse | \nMissing file(s):\n | Missing file: |\
+  parse | \nWarning(s):\n      | /WARNING:\|WARN:/i |\
+  parse | \nError(s):\n        | /ERROR:\|ERR :/i   |\
+  parse | \nCan$'t locate:\n | Can$'t locate | parse | \ncouldn$'t be located:\n | couldn$'t be located
+
+#* Writing tmp7.oby - result of problem-suppression phase
+#Can't open \epoc32\release\ARMV5\urel\apgrfx.dll.map
+#Unrecognised option -NO-HEADER0
+
+# For passing extra paramters (from command line)
+BLDROPT =
+BLDROBY =
+
+
+###############################################################################
+# S60 Configuration Tool CLI
+
+CONFT_TOOL    = cli.cmd
+CONFT_TOOLDIR = $(or $(wildcard /s60/tools/toolsextensions/ConfigurationTool),/ext/tools/toolsextensions/ConfigurationTool)
+
+CONFT_DIR     = $(WORKDIR)/ct
+CONFT_TMPDIR  = $(CONFT_DIR)/_temp
+CONFT_CFGNAME = variant
+CONFT_CONFML  = $(call iif,$(USE_VARIANTBLD),$(VARIANT_CONFML),$(WORKDIR)/$(CONFT_CFGNAME).confml)
+CONFT_IMPL    = $(CONFIGROOT)/confml_data/s60;$(CONFIGROOT)/confml_data/customsw
+CONFT_IBYML   = $(CONFT_TOOLDIR)/ibyml
+CONFT_OUTDIR  = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OUTDIR),$(CONFT_DIR)/cenrep)
+CONFT_CRLOG   = $(call iif,$(USE_VARIANTBLD),$(VARIANT_PREFIX)_,$(CONFT_DIR))cenrep.log
+CONFT_ECLCONF = -configuration $(CONFT_TMPDIR) -data $(CONFT_TMPDIR)
+CONFT_CONF    = $(CONFT_ECLCONF)\
+  -master $(CONFT_CONFML) -impl $(CONFT_IMPL) $(if $(CONFT_IBYML),-ibyml $(CONFT_IBYML)) -output $(CONFT_DIR)\
+  -report $(CONFT_CRLOG) -ignore_errors
+CONFT_CONFCP  = $(call iif,$(USE_VARIANTBLD),$(VARIANT_CONFCP),$(CONFT_CFGNAME))
+
+CONFT_CMD     = $(CONFT_TOOL) $(CONFT_CONF)
+CONFT_PARSE   = parse | \nWarnings, errors and problems:\n | /warning:\|error:\|problem/i
+
+CLEAN_CENREP =\
+  del    | $(CONFT_CRLOG) |\
+  deldir | "$(CONFT_DIR)" "$(CONFT_TMPDIR)" $(call iif,$(USE_VARIANTBLD),,"$(CONFT_OUTDIR)")
+
+BUILD_CENREP =\
+  echo-q | Calling S60 Configuration Tool |\
+  mkcd   | $(CONFT_DIR) |\
+  deldir | $(CONFT_TMPDIR) |\
+  cmd    | $(CONFT_CMD) | $(CONFT_PARSE) |\
+  $(foreach dir,$(CONFT_CONFCP),\
+    finddir | $(CONFT_DIR)/$(dir) | * | |\
+    copy    | __find__ | $(CONFT_OUTDIR) |)\
+  $(call iif,$(KEEPTEMP),,deldir | $(CONFT_TMPDIR))
+
+
+###############################################################################
+# Interpretsis
+
+SISINST_DIR    = $(WORKDIR)/sisinst
+SISINST_SISDIR = $(call iif,$(USE_VARIANTBLD),$(VARIANT_SISDIR))
+SISINST_OUTDIR = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OUTDIR),$(SISINST_DIR)/output)
+#SISINST_ZDIR   = $(SISINST_DIR)/z_drive
+SISINST_ZDIR   = $(EPOC32)/data/Z
+
+SISINST_HALINI = $(wildcard $(PRODUCT_DIR)/interpretsis.ini)
+SISINST_CONF   = -w info -z $(SISINST_ZDIR) $(if $(SISINST_HALINI),-i $(SISINST_HALINI)) -c $(SISINST_OUTDIR) -s $(SISINST_SISDIR)
+SISINST_CMD    = $(INTPRSIS_TOOL) $(SISINST_CONF)
+SISINST_PARSE  =\
+  parse | \nWarning(s):\n | /^WARN:/ |\
+  parse | \nError(s):\n   | /^ERR :/
+
+#CLEAN_SISINSTPRE = deldir | $(SISINST_ZDIR)
+#BUILD_SISINSTPRE =\
+#  mkdir | $(SISINST_ZDIR) |\
+#  $(foreach img,$(ROM_IMG) $(foreach rofs,1 2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),$(ROFS$(rofs)_IMG))),\
+#    cmd | $(READIMG_TOOL) -z $(SISINST_ZDIR) $(img) |)
+
+CLEAN_SISINST = deldir | "$(SISINST_DIR)" $(call iif,$(USE_VARIANTBLD),,"$(SISINST_OUTDIR)")
+BUILD_SISINST =\
+  echo-q | Installing SIS |\
+  mkdir  | $(SISINST_OUTDIR) |\
+  cmd    | $(SISINST_CMD) | $(SISINST_PARSE)
+
+
+###############################################################################
+# Operator Cache Tool
+
+OPC_TOOL     = $(ITOOL_DIR)/opcache_tool.py
+OPC_CONF     = -u $(OPC_URL) -e $(OPC_EXPDATE) -m $(OPC_MMAPFILE) -i $(OPC_RAWDIR) -o $(OPC_OUTDIR)/$(OPC_CACHEDIR)
+OPC_CMD      = $(PYTHON) $(OPC_TOOL) $(OPC_CONF)
+OPC_DIR      = $(WORKDIR)/opcache
+OPC_RAWDIR   = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OPCDIR))
+OPC_OUTDIR   = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OUTDIR),$(OPC_DIR)/output)
+OPC_CACHEDIR = cache
+OPC_MMAPFILE = $(OPC_DIR)/mimemap.dat
+
+OPC_URL      = http://www.someoperator.com/Cache_OpCache
+OPC_EXPDATE  = 3
+
+define OPC_MIMEMAP
+  .bmp:   image/bmp
+  .css:   text/css
+  .gif:   image/gif
+  .htm:   text/html
+  .html:  text/html
+  .ico:   image/x-icon
+  .jpeg:  image/jpeg
+  .jpg:   image/jpeg
+  .js:    text/javascript
+  .mid:   audio/mid
+  .midi:  audio/midi
+  .png:   image/png
+  .tif:   image/tiff
+  .tiff:  image/tiff
+  .wbmp:  image/vnd.wap.wbmp
+  .wml:   text/vnd.wap.wml
+  .wmlc:  application/vnd.wap.wmlc
+  .xhtml: application/xhtml+xml
+endef
+
+CLEAN_OPCACHE = del | $(OPC_MMAPFILE) | deldir | "$(OPC_DIR)" $(call iif,$(USE_VARIANTBLD),,"$(OPC_OUTDIR)")
+BUILD_OPCACHE =\
+  echo-q | Creating Operator Cache content |\
+  write  | $(OPC_MMAPFILE) |\
+    $(call def2str,\# Generated `$(OPC_MMAPFILE)$' for Operator Cache content creation$(\n)$(\n)$(OPC_MIMEMAP)) |\
+  test   | $(OPC_RAWDIR)/* |\
+  mkdir  | $(OPC_OUTDIR)/$(OPC_CACHEDIR) |\
+  cmd    | $(OPC_CMD)
+
+
+###############################################################################
+# Widget Pre-installation
+
+WIDGET_WGZIP   = $(WORKDIR)/*.wgz
+WIDGET_WGZDIR  = $(EPOC32)/release/winscw/udeb/z/data/WidgetBURTemp
+WIDGET_WGZIBY  = $(E32ROMINC)/widgetbackupfiles.iby
+WIDGET_WGZPXML = Info.plist
+
+CLEAN_WGZPREINST = del | $(WIDGET_WGZIBY) | deldir | $(WIDGET_WGZDIR)
+BUILD_WGZPREINST =\
+  echo-q   | Widget Pre-installation |\
+  echo-q   | Unzip $(WIDGET_WGZIP) file(s) to $(WIDGET_WGZDIR), generating $(WIDGET_WGZIBY) |\
+  wgunzip  | $(WIDGET_WGZIP) | $(WIDGET_WGZDIR) | $(WIDGET_WGZPXML) |\
+  geniby-r | $(WIDGET_WGZIBY) | $(WIDGET_WGZDIR) | * | data="%1" "data/WidgetBURTemp/%2" | end
+
+
+###############################################################################
+# Image Checker
+
+IMGCHK_LOG = $($(IMAGE_TYPE)_ICHKLOG)
+IMGCHK_OPT = --verbose --dep
+IMGCHK_CMD = $(IMGCHK_TOOL) $($(IMAGE_TYPE)_ICHKOPT) $($(IMAGE_TYPE)_ICHKIMG)
+
+define IMGCHK_HDRINFO
+  # Image Check log for $($(IMAGE_TYPE)_TITLE) SOS image
+  #
+  # Filename: $(IMGCHK_LOG)
+  # Command : $(IMGCHK_CMD)
+endef
+
+CLEAN_IMGCHK = del | "$(basename $(IMGCHK_LOG)).*" "imgcheck.log"
+BUILD_IMGCHK =\
+  echo-q | Checking $($(IMAGE_TYPE)_TITLE) SOS image file(s) |\
+  cd     | $($(IMAGE_TYPE)_DIR) |\
+  write  | $(IMGCHK_LOG) | $(call def2str,$(IMGCHK_HDRINFO))\n |\
+  cmdtee | $(IMGCHK_CMD) | >>$(IMGCHK_LOG) |\
+  del    | imgcheck.log
+
+
+###############################################################################
+# CheckDependency
+
+CHKDEP_TOOL     = CheckDependency.pl
+CHKDEP_CONFXML  = $(E32ROMBLD)/iad/iad_rofs_config.xml
+CHKDEP_ROFSFILE = $(E32ROMBLD)/IAD_rofsfiles.txt
+CHKDEP_OPT      = -i $(CHKDEP_CONFXML) -o $(CHKDEP_ROFSFILE)
+CHKDEP_CMD      = $(PERL) -S $(CHKDEP_TOOL) $(CHKDEP_OPT)
+
+CLEAN_CHKDEP = del | $(CHKDEP_ROFSFILE)
+BUILD_CHKDEP =\
+  echo-q | Running CheckDependency tool |\
+  cmd    | $(CHKDEP_CMD)
+
+
+###############################################################################
+# Image to files; extract files from .img using Readimage tool
+
+I2FILE_DIR = $(WORKDIR)/img2file
+
+CLEAN_COREI2F = deldir | $(CORE_I2FDIR)
+BUILD_COREI2F = $(call _buildi2file,CORE,$(CORE_I2FDIR),$(ROM_IMG) $(call iif,$(USE_ROFS1),$(ROFS1_IMG)))
+
+CLEAN_VARIANTI2F = $(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),deldir | $(ROFS$(rofs)_I2FDIR) |))
+BUILD_VARIANTI2F =\
+  $(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),\
+    $(call _buildi2file,ROFS$(rofs),$(ROFS$(rofs)_I2FDIR),$(ROFS$(rofs)_IMG))))
+
+CLEAN_I2FILE = deldir | $(I2FILE_DIR) | $(CLEAN_COREI2F) | $(CLEAN_VARIANTI2F)
+BUILD_I2FILE =\
+  $(BUILD_COREI2F) | $(BUILD_VARIANTI2F) |\
+  copy | $(CORE_I2FDIR)/* | $(I2FILE_DIR) |\
+  $(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),copy | $(ROFS$(rofs)_I2FDIR)/* | $(I2FILE_DIR) |))
+
+_buildi2file =\
+  echo-q | Extracting files from $($1_TITLE) SOS image to $2 |\
+  mkcd   | $2 |\
+  $(foreach img,$3,\
+    cmd | $(READIMG_TOOL) -s $(img)   |\
+    cmd | $(READIMG_TOOL) -z . $(img) |)
+
+
+###############################################################################
+# Tool info
+
+define TOOL_INFO
+  $(MAKE)          | $(MAKE) -v   | GNU Make (\S+).+(built for \S+) |
+  $(PERL)          | $(PERL) -v   | perl, v(.+?)$$ |
+  $(CPP)           | $(CPP) -v -h | CPP version (.+?)$$ |
+  $(call _grepversion,$(E32TOOLS)/imaker.cmd) |
+  $(call _grepversion,$(IMAKER_TOOL)) |
+  $(call _grepversion,$(IMAKER_DIR)/imaker.pm) |
+  $(if $(wildcard $(IMAKER_DIR)/imaker_extension.pm),$(call _grepversion,$(IMAKER_DIR)/imaker_extension.pm) |)
+  $(call _grepversion,$(IMAKER_DIR)/imaker.mk) |
+  $(call _grepversion,$(IMAKER_DIR)/imaker_public.mk) |
+  $(if $(wildcard $(IMAKER_DIR)/imaker_extension.mk),$(call _grepversion,$(IMAKER_DIR)/imaker_extension.mk) |)
+  $(ROMBLD_TOOL)   | $(ROMBLD_TOOL)         | ROMBUILD.+? V(.+?)\s*$$  |
+  $(ROFSBLD_TOOL)  | $(ROFSBLD_TOOL)        | ROFSBUILD.+? V(.+?)\s*$$ |
+  $(IMGCHK_TOOL)   | $(IMGCHK_TOOL) -h      | IMGCHECK.+? V(.+?)\s*$$  |
+  $(INTPRSIS_TOOL) | $(INTPRSIS_TOOL) -h    | INTERPRETSIS\s+Version\s+(.+?)\s*$$ |
+  $(READIMG_TOOL)  | $(READIMG_TOOL)        | Readimage.+? V(.+?)\s*$$ |
+  $(CONFT_TOOL)    | $(CONFT_TOOL) -version | ^.+?\n(.+?)\n(.+?)\n
+endef
+
+BUILD_TOOLINFO = echo-q | | toolchk | $(strip $(TOOL_INFO)) | end
+
+#==============================================================================
+
+_grepversion = $1 | $(PERL) -ne "print, exit if /%version:\s*\S+\s*%/" < $1 | %version:\s*(\S+)\s*%
+
+
+###############################################################################
+# Targets
+
+.PHONY: checkdep opcache sisinst toolinfo wgzpreinst
+
+chkdep opcache sisinst toolinfo wgzpreinst:\
+  ;@$(call IMAKER,$(call ucase,$@))
+
+
+# END OF IMAKER_TOOLS.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_uda.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,227 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker User Data image configuration
+#
+
+
+
+###############################################################################
+#  _   _ ___   _
+# | | | |   \ /_\
+# | |_| | |) / _ \
+#  \___/|___/_/ \_\
+#
+
+USE_FILEDISK = 0
+USE_SOSUDA   = 0
+USE_UDAFGEN  = 0
+
+UDA_TITLE       = UDA
+UDA_DIR         = $(WORKDIR)/uda
+UDA_NAME        = $(NAME)
+UDA_PREFIX      = $(UDA_DIR)/$(UDA_NAME)
+UDA_IDIR        =
+UDA_HBY         =
+UDA_OBY         =
+UDA_OPT         = $(BLDROM_OPT) -D_EABI=$(ARM_VERSION)
+UDA_MSTOBY      = $(UDA_PREFIX)_uda_master.oby
+UDA_HEADER      =
+UDA_INLINE      =
+UDA_FOOTER      =
+UDA_TIME        = $(DAY)/$(MONTH)/$(YEAR)
+
+UDA_CPDIR       =
+UDA_ZIP         =
+UDA_DATADIR     = $(UDA_DIR)/datadrive
+UDA_SISCONFFILE = $(UDA_PREFIX)_uda_sisconf.txt
+UDA_SISCONF     =\
+  -d $(UDA_DRIVE): -c $(UDA_DATADIR) $(if $(SISINST_SISDIR),-s $(SISINST_SISDIR))\
+  -z $(SISINST_ZDIR) $(if $(SISINST_HALINI),-i $(SISINST_HALINI)) -w info
+
+UDA_VERSION     = $(CORE_VERSION)
+UDA_SWVERFILE   = "$(UDA_DATADIR)/Resource/Versions/User Content Package_UDA.txt"
+UDA_SWVERINFO   = $(UDA_VERSION)
+UDA_EXCLFILE    = $(UDA_DATADIR)/private/100059C9/excludelist.txt
+UDA_TOUCH       = $(call iif,$(USE_SOSUDA),,$(YEAR)$(MONTH)$(DAY)000000)
+
+UDA_IMG         = $(UDA_PREFIX).uda.img
+UDA_LOG         = $(UDA_PREFIX).uda.log
+UDA_OUTOBY      = $(UDA_PREFIX).uda.oby
+UDA_EMPTYIMG    = $(UDA_PREFIX).udaempty.img
+
+UDA_PLUGINLOG   = $(UDA_PREFIX)_uda_bldromplugin.log
+UDA_UDEBFILE    = $(TRACE_UDEBFILE)
+
+UDA_DRIVE       = C
+UDA_FATTYPE     = fat16
+UDA_FATSIZE     = 20480
+
+define UDA_EXCLADD
+*
+endef
+
+define UDA_EXCLRM
+endef
+
+#==============================================================================
+
+UDA_FDISKCONF = /mount 0
+UDA_FDISKCMD  =\
+  $(FILEDISK_TOOL) $(UDA_FDISKCONF) $(call peval,GetAbsFname($(call pquote,$(UDA_IMG)),1,1)) $(call peval,$$iVar[0] = GetFreeDrive()) |\
+  copy  | $(UDA_DATADIR)/* | $(call peval,$$iVar[0])/ |\
+  cmd   | $(FILEDISK_TOOL) /status $(call peval,$$iVar[0]) |\
+  sleep | 1 |\
+  cmd   | $(FILEDISK_TOOL) /umount $(call peval,$$iVar[0])
+
+UDA_WINIMGCMD = $(WINIMAGE_TOOL) $(call pathconv,$(UDA_IMG)) /i $(call pathconv,$(UDA_DATADIR)) /h /q
+
+UDA_CMD       = $(call iif,$(USE_FILEDISK),$(UDA_FDISKCMD),$(UDA_WINIMGCMD))
+UDA_EMPTYCMD  =
+
+#==============================================================================
+
+define UDA_MSTOBYINFO
+  $(BLDROM_HDRINFO)
+
+  ROM_IMAGE  0 non-xip size=0x00000000
+
+  DATA_IMAGE 0 $(basename $(UDA_IMG)) size=$(call peval,$(UDA_FATSIZE) * 1024) $(UDA_FATTYPE)
+
+  // UDA header
+  //
+  $(UDA_HDRINFO)
+
+  DATA_IMAGE[0] {
+    $(BLR.UDA.OBY)
+    $(UDA_INLINE)
+    $(UDA_FOOTERINFO)
+  }
+endef
+
+define UDA_HDRINFO
+  $(DEFINE) _IMAGE_WORKDIR $(UDA_DIR)
+  $(call mac2cppdef,$(BLR.UDA.OPT))
+  $(BLR.UDA.HBY)
+  $(UDA_HEADER)
+  $(if $(filter u U,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
+endef
+
+define UDA_FOOTERINFO
+  $(if $(UDA_TIME),time=$(UDA_TIME))
+  $(UDA_FOOTER)
+endef
+
+#==============================================================================
+
+CLEAN_UDAFILE =\
+  del | "$(UDA_MSTOBY)" "$(UDA_SISCONFFILE)" "$(UDA_SWVERFILE)" "$(UDA_EXCLFILE)"
+
+BUILD_UDAFILE =\
+  echo-q | Generating file(s) for UDA image creation |\
+  $(call iif,$(USE_SOSUDA),\
+    write  | $(UDA_MSTOBY) | $(call def2str,$(UDA_MSTOBYINFO)) |\
+    write  | $(UDA_SISCONFFILE) | $(call quote,$(UDA_SISCONF)) |)\
+  $(call iif,$(USE_UDAFGEN),\
+    $(if $(UDA_SWVERINFO),\
+      writeu | $(UDA_SWVERFILE) | $(UDA_SWVERINFO) |)\
+    $(if $(UDA_EXCLFILE),\
+      genexclst | $(UDA_EXCLFILE) | $(UDA_DATADIR) | $(UDA_DRIVE):/ |\
+        "$(subst $(\n)," ",$(UDA_EXCLADD))" | "$(subst $(\n)," ",$(UDA_EXCLRM))")\
+  )
+
+
+###############################################################################
+# UDA pre
+
+CLEAN_UDAPRE = $(if $(filter u U,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT),deldir | $(UDA_DATADIR)) | $(CLEAN_UDAFILE)
+
+BUILD_UDAPRE =\
+  echo-q | Preparing UDA image creation |\
+  $(if $(filter u U,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |,\
+    mkdir | $(UDA_DATADIR) |\
+    $(if $(UDA_ZIP),\
+      $(eval __i_zip := $(foreach zip,$(UDA_ZIP),$(zip)$(if $(filter %.zip,$(call lcase,$(zip))),,/*.zip)))\
+      echo-q | Extracting `$(__i_zip)$' to `$(UDA_DATADIR)$' |\
+      unzip  | $(__i_zip) | $(UDA_DATADIR) |)\
+    $(if $(UDA_CPDIR),\
+      copy | $(UDA_CPDIR)/* | $(UDA_DATADIR) |))\
+  mkcd | $(UDA_DIR) |\
+  $(BUILD_UDAFILE) |\
+  $(call iif,$(USE_FILEDISK),\
+    cmd | attrib -r -a -s -h $(call pathconv,$(UDA_DATADIR)) /s /d |)\
+  $(if $(UDA_TOUCH),\
+    finddir-r | $(UDA_DATADIR) | * | |\
+    find-ar   | $(UDA_DATADIR) | * | |\
+    touch     | __find__ | $(UDA_TOUCH))
+
+#==============================================================================
+# UDA build
+
+BLR.UDA.IDIR   = $(call dir2inc,$(UDA_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.UDA.HBY    = $(call includeiby,$(IMAGE_HBY) $(UDA_HBY))
+BLR.UDA.OBY    = $(call includeiby,$(UDA_OBY) $(if $(filter u U,$(USE_VARIANTBLD)),$(VARIANT_OBY)))
+BLR.UDA.OPT    = $(UDA_OPT) -p -retainfolder -pfile=$(UDA_SISCONFFILE) -o$(UDA_NAME).dummy0.img $(BLDROPT)
+BLR.UDA.POST   =\
+  move | $(UDA_OUTOBY).log | $(UDA_LOG)
+
+BLR.UDA.CLEAN  = del | "$(UDA_EMPTYIMG)" "$(UDA_IMG)"
+BLR.UDA.BUILD  =\
+  $(call iif,$(USE_SOSUDA),,\
+    echo-q | Creating $(UDA_TITLE) SOS image |\
+    $(if $(UDA_EMPTYCMD),\
+      cmd  | $(UDA_EMPTYCMD) |\
+      move | $(UDA_EMPTYIMG) | $(UDA_IMG) |)\
+    cmd | $(UDA_CMD))
+
+CLEAN_UDA = $(CLEAN_BLDROM)
+BUILD_UDA = $(BUILD_BLDROM)
+
+# UDA Empty
+#
+CLEAN_UDAEMPTY = del | $(UDA_EMPTYIMG)
+BUILD_UDAEMPTY =\
+  echo-q | Creating empty UDA FAT image |\
+  mkdir  | $(UDA_DIR) |\
+  cmd    | $(UDA_EMPTYCMD)
+
+#==============================================================================
+# UDA post
+
+#==============================================================================
+
+SOS.UDA.STEPS      = $(call iif,$(SKIPPRE),,UDAPRE) UDA $(SOS.UDAEMPTY.STEPS)
+SOS.UDAEMPTY.STEPS = UDAEMPTY
+
+ALL.UDA.STEPS      = $(SOS.UDA.STEPS)
+ALL.UDAEMPTY.STEPS = $(SOS.UDAEMPTY.STEPS)
+
+#==============================================================================
+
+.PHONY: uda uda-image uda-pre uda-empty uda-empty-image variantuda
+
+uda uda-%: IMAGE_TYPE = UDA
+
+uda      : ;@$(call IMAKER,$$(ALL.UDA.STEPS))
+uda-image: ;@$(call IMAKER,$$(SOS.UDA.STEPS))
+uda-pre  : ;@$(call IMAKER,UDAPRE)
+
+uda-empty:       ;@$(call IMAKER,$$(ALL.UDAEMPTY.STEPS))
+uda-empty-image: ;@$(call IMAKER,$$(SOS.UDAEMPTY.STEPS))
+
+variantuda variantuda%: USE_CUSTVARIANTBLD = 1
+variantuda variantuda%: USE_VARIANTBLD     = u
+variantuda variantuda%: uda$(TARGETEXT) ;
+
+
+# END OF IMAKER_UDA.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_variant.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,131 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker Variant image configuration
+#
+
+
+
+###############################################################################
+# __   __        _          _     ___      _ _    _
+# \ \ / /_ _ _ _(_)__ _ _ _| |_  | _ )_  _(_) |__| |
+#  \ V / _` | '_| / _` | ' \  _| | _ \ || | | / _` |
+#   \_/\__,_|_| |_\__,_|_||_\__| |___/\_,_|_|_\__,_|
+#
+
+USE_VARIANTBLD = 0
+
+VARIANT_NAME     = $(TARGETNAME)
+VARIANT_ID       = $(TARGETID)
+VARIANT_DIR      = $(call iif,$(USE_CUSTVARIANTBLD),,$(PRODVARIANT_DIR))
+VARIANT_OUTDIR   = $(if $(filter u U,$(USE_VARIANTBLD)),$(UDA_DATADIR),$($(IMAGE_TYPE)_DIR)/variant)
+VARIANT_MKNAME   = variant.mk
+VARIANT_MK       = $(if $(VARIANT_DIR),$(wildcard $(VARIANT_DIR)/$(VARIANT_MKNAME)))
+
+VARIANT_PREFIX   = $($(IMAGE_TYPE)_PREFIX)_$(call lcase,$(IMAGE_TYPE))
+VARIANT_HBY      = $(VARIANT_PREFIX)_customervariant.hby
+VARIANT_HEADER   = $(if $(VARIANT_INCDIR),$(call includeiby,$(VARIANT_HBY)))
+VARIANT_OBY      = $(VARIANT_PREFIX)_customervariant.oby
+VARIANT_OVERRIDE = $(if $(filter 1 2,$(USE_VARIANTBLD)),1,0)
+VARIANT_OBYDATA  = data$(call iif,$(VARIANT_OVERRIDE),-override)="%1"  "%2"
+
+VARIANT_CONFML   = $(call iif,$(USE_CUSTVARIANTBLD),$(wildcard $(VARIANT_DIR)/$(CONFT_CFGNAME).confml),$(PRODVARIANT_CONFML))
+VARIANT_CONFCP   = $(call iif,$(USE_CUSTVARIANTBLD),$(if $(VARIANT_CONFML),$(CONFT_CFGNAME)),$(PRODVARIANT_CONFCP))
+VARIANT_CPDIR    = $(wildcard $(VARIANT_DIR)/content)
+VARIANT_INCDIR   = $(wildcard $(VARIANT_DIR)/include)
+VARIANT_SISDIR   = $(wildcard $(VARIANT_DIR)/sis)
+VARIANT_OPCDIR   = $(wildcard $(VARIANT_DIR)/opcache)
+VARIANT_ZIPDIR   = $(wildcard $(VARIANT_DIR)/zip)
+
+#==============================================================================
+
+CLEAN_CUSTVARIANT =\
+  del | "$(VARIANT_HBY)" "$(VARIANT_OBY)" | deldir | $(VARIANT_OUTDIR) |\
+  $(if $(VARIANT_CONFML),$(CLEAN_CENREP)  |)\
+  $(if $(VARIANT_SISDIR),$(CLEAN_SISINST) |)\
+  $(if $(VARIANT_OPCDIR),$(CLEAN_OPCACHE) |)
+
+BUILD_CUSTVARIANT =\
+  echo-q | Variant target             USE_VARIANTBLD = $(call iif,$(USE_VARIANTBLD),`$(USE_VARIANTBLD)$',-) |\
+  echo-q | Variant directory          VARIANT_DIR    = $(or $(filter -,$(VARIANT_DIR)),$(if $(VARIANT_DIR),`$(VARIANT_DIR)$',-)) |\
+  echo-q | Variant config makefile    VARIANT_MK     = $(if $(VARIANT_MK),`$(VARIANT_MK)$',-) |\
+  echo-q | Variant include directory  VARIANT_INCDIR = $(if $(VARIANT_INCDIR),`$(VARIANT_INCDIR)$',-) |\
+  echo-q | Variant confml file        VARIANT_CONFML = $(if $(VARIANT_CONFML),`$(VARIANT_CONFML)$',-) |\
+  echo-q | Variant CenRep configs     VARIANT_CONFCP = $(if $(VARIANT_CONFCP),`$(VARIANT_CONFCP)$',-) |\
+  echo-q | Variant SIS directory      VARIANT_SISDIR = $(if $(VARIANT_SISDIR),`$(VARIANT_SISDIR)$',-) |\
+  echo-q | Variant operator cache dir VARIANT_OPCDIR = $(if $(VARIANT_OPCDIR),`$(VARIANT_OPCDIR)$',-) |\
+  echo-q | Variant zip content dir    VARIANT_ZIPDIR = $(if $(VARIANT_ZIPDIR),`$(VARIANT_ZIPDIR)$',-) |\
+  echo-q | Variant copy content dir   VARIANT_CPDIR  = $(if $(VARIANT_CPDIR),`$(VARIANT_CPDIR)$',-)   |\
+  echo-q | Variant output directory   VARIANT_OUTDIR = $(if $(VARIANT_OUTDIR),`$(VARIANT_OUTDIR)$',-) |\
+  $(if $(VARIANT_DIR),,\
+    error | 1 | Variable VARIANT_DIR is not set while making target $@!\n |)\
+  $(if $(word 2,$(USE_VARIANTBLD))$(filter-out 0 1 2 3 4 5 6 u U,$(USE_VARIANTBLD)),\
+    error | 1 | Variable USE_VARIANTBLD is incorrectly defined. Possible values are 1 - 3 (6) and u.\n |)\
+  mkdir  | $(VARIANT_OUTDIR) |\
+  $(if $(VARIANT_INCDIR),\
+    echo-q | Generating oby(s) for Variant image creation |\
+    geniby | $(VARIANT_HBY) | $(VARIANT_INCDIR) | *.hrh | \#include "%3" | end |\
+    geniby | $(VARIANT_OBY) | $(VARIANT_INCDIR) | *.iby | \#include "%3" | end |)\
+  $(if $(wildcard $(VARIANT_CONFML)),\
+    $(BUILD_CENREP) |)\
+  $(if $(VARIANT_SISDIR),\
+    $(call iif,$(USE_SOSUDA),\
+      geniby-r | >>$(VARIANT_OBY) | $(VARIANT_SISDIR) | *.sis* | sisfile="%1" | end,\
+      $(BUILD_SISINST)) |)\
+  $(if $(VARIANT_OPCDIR),\
+    $(BUILD_OPCACHE) |)\
+  $(if $(VARIANT_ZIPDIR),$(if $(wildcard $(VARIANT_ZIPDIR)/*),\
+    echo-q | Extracting zip content directory |\
+    cmd    | $(7ZIP_TOOL) x -y $(VARIANT_ZIPDIR)/* -o$(VARIANT_OUTDIR) |))\
+  $(if $(VARIANT_CPDIR),\
+    echo-q | Copying copy content directory |\
+    copy   | $(VARIANT_CPDIR)/* | $(VARIANT_OUTDIR) |)\
+  $(if $(filter u U,$(USE_VARIANTBLD)),,\
+    geniby-r | >>$(VARIANT_OBY) | $(VARIANT_OUTDIR) | * | $(VARIANT_OBYDATA) | end |)\
+  write | >>$(VARIANT_OBY) | |
+
+#==============================================================================
+
+variantrofs%: USE_CUSTVARIANTBLD = 1
+
+$(foreach rofs,2 3 4 5 6,\
+  $(eval .PHONY: variantrofs$(rofs))\
+  $(eval variantrofs$(rofs) variantrofs$(rofs)%: USE_VARIANTBLD = $(rofs))\
+  $(eval variantrofs$(rofs) variantrofs$(rofs)%: rofs$(rofs)$(TARGETEXT) ;)\
+)
+
+$(call add_help,variantrofs2,t,Create an image from a variant with rofs2. Be sure to define the VARIANT_DIR.)
+$(call add_help,variantrofs3,t,Create an image from a customer variant folder. Be sure to define the VARIANT_DIR.)
+$(call add_help,variantuda,t,Create an image from a variant userdata folder. Be sure to define the VARIANT_DIR.)
+
+#==============================================================================
+
+SOS.VARIANT.STEPS = $(foreach rofs,2 3 4 5 6,$(SOS.ROFS$(rofs).STEPS))
+ALL.VARIANT.STEPS = $(SOS.VARIANT.STEPS)
+
+#==============================================================================
+# Targets
+
+.PHONY: variant variant-image variant-symbol variant-i2file
+
+variant: ;@$(call IMAKER,$$(ALL.VARIANT.STEPS))
+
+variant-image: ;@$(call IMAKER,$$(SOS.VARIANT.STEPS))
+
+variant-symbol:\
+  ;@$(call IMAKER,$(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),ROFS$(rofs)SYM)))
+
+variant-i2file: ;@$(call IMAKER,VARIANTI2F)
+
+
+# END OF IMAKER_VARIANT.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_version.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker version string
+#
+
+IMAKER_VERSION = iMaker 09.06.01, 05-Feb-2009.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/bin/gpl.licence.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Binary file srctools/cmaker/bin/mingw_make.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/cmaker_readme.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,145 @@
+*********************************************************************************************************************************
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* cmaker makefile installation.
+* cMaker - a Make-based configuration export tool 
+
+Setting up environment to use this version of cmaker
+====================================================
+
+- Extract env
+- Merge the makefiles from config_maker\config to the root config project
+
+Usage of cmaker
+===============
+
+At the root of the config folder, type:
+
+cmaker [target] [ACTION=<action>] [NCP=[ncp number][,ncp number]*] [S60=[s60 number][,s60 number]*] [PPD=[ppd number][,ppd number]*] 
+
+action: actions are found from \epoc32\rom\cmaker\functions.ml
+ * export = copy the given target from source
+ * clean = delete the target
+ * what = print the target
+ * what_deps = print source target
+ 
+Default ACTION is export. 
+
+The cmaker can be called without any parameters, in which case the makefile in the current folder is included first 
+and the first target defined in that makefile is executed.
+
+Example usage:
+--------------
+
+1) Export all NCP53 configs 
+>cd \config\
+>cmaker ncp53_all NCP=53
+or 
+>cd \config\ncp_config\ncp5.3_config
+>cmaker
+
+2) 'What' list of all NCP53 and 5332 and dependent config exports 	
+>cd \config\
+>cmaker NCP=53 S60=32 ACTION=what
+
+3) What_deps list of all NCP53 and 5332 config exports
+>cd \config\
+>cmaker NCP=53 S60=32 ACTION=what_deps
+
+4) Clean all NCP71 and PPD5332 config exports
+>cd \config\
+>cmaker NCP=53 S60=32 ACTION=clean
+
+
+=== Configuring cmaker ===
+
+=== Project makefile ===
+Example project makefile that defines ncp52_config as a project target. The intention here is that the CM Synergy project name is always a target in cmaker, which can be exported. The other defined targets are there to define dependencies.
+{{{
+# NCP5.2 config level configuration makefile
+
+
+#Define this platform as default if nothing is defined
+ifeq (,$(NCP))
+NCP += 52
+$(warning Ncp platform not defined (E.g. NCP=53)! Using $(NCP))
+endif
+
+ifeq (52,$(findstring 52,$(NCP)))
+MAKEFILE = /config/ncp_config/ncp5.2_config/makefile
+	
+# Place the first target as the default target which is executed from this level
+ncp52_all    :: ncp52_config
+ncp52_config ::
+ncp52_config :: ncp_config
+ncp_all      :: ncp52_all
+	       
+include include_template.mk
+	
+endif
+}}}
+
+=== export.mk ===
+Example folder exporting makefile. The export.mk defines source and target (files|folder) as make variables (e.g. DATAFILES in the example). Then the example uses a add-files macro to add DATAFILES as targets for the system (e.g. $(call addfiles, $(DATAFILES), ncp52_config-data) in the example). This makes every target file in DATAFILES a make target, and defines a dependency from ncp_config-data to each target file. So if you run ncp_config-data target you would actually run every target file defined in DATAFILES.
+
+{{{
+# NCP5.2 config's actual configuration export makefile
+
+MAKEFILE = 	/config/ncp_config/ncp5.2_config/config/export.mk
+$(call push,MAKEFILE_STACK,$(MAKEFILE))
+
+SECENVDIR = 	/ncp_sw/corecom/sec_env/bin_NCP_5_1/
+	
+DATAFILES =	$(MAKEFILEDIR)data/base_directory.mke       /epoc32/include/oem/                  \
+            $(MAKEFILEDIR)data/HWRMLightsPolicy.ini     /epoc32/data/Z/private/101f7a02/      \
+            $(MAKEFILEDIR)data/tcpip_52.ini             /epoc32/data/z/private/101F7989/esock/
+			                                                                                        		
+INCFILES =	$(MAKEFILEDIR)inc/*.hrh                   /epoc32/include/oem/	          \
+		        $(MAKEFILEDIR)inc/*.hrh                   /epoc32/include/config/ncp52/   \
+		        $(MAKEFILEDIR)inc/adaptation_conf.h       /epoc32/include/internal/               		
+		                                                                                                		
+ROMFILES =	$(MAKEFILEDIR)rom/config/base_romfiles.txt 		/epoc32/rombuild/ 					\
+		$(MAKEFILEDIR)rom/config/rapido.ini 			/epoc32/rombuild/ 					\
+		$(MAKEFILEDIR)rom/config/x_conf_rapido_ncp52.txt 	/epoc32/rom/config/ncp52/ 				\
+		$(MAKEFILEDIR)rom/config/*.axf 				/epoc32/rom/config/ncp52/ 				\
+		$(MAKEFILEDIR)rom/config/*.mk 				/epoc32/rom/config/ncp52/ 				\
+		$(MAKEFILEDIR)rom/variant/*.* 				/epoc32/rom/config/ncp52/ 				\
+		$(MAKEFILEDIR)rom/include/*.* 				/epoc32/rom/config/ncp52/ 				\
+		$(MAKEFILEDIR)rom/include/*.* 				/epoc32/rom/include/ 					\
+		$(SECENVDIR)pa_cmt_NCP_5_1.bin				/epoc32/rom/config/ncp52/ 				\
+		$(SECENVDIR)ppa_cmt_NCP_5_1.bin				/epoc32/rom/config/ncp52/
+			
+TOOLFILES =	$(MAKEFILEDIR)tools/*.* 				/epoc32/tools/ 						\
+		$(MAKEFILEDIR)tools/rom/image.txt 			/epoc32/tools/rom/
+	
+ncp52_config-data :: 
+	
+$(call addfiles, $(DATAFILES), ncp52_config-data)
+		
+ncp52_config-inc :: 
+	
+$(call addfiles, $(INCFILES), ncp52_config-inc)
+	
+ncp52_config-rom :: 
+	
+$(call addfiles, $(ROMFILES), ncp52_config-rom)
+	
+ncp52_config-tools :: 
+	
+$(call addfiles, $(TOOLFILES), ncp52_config-tools)
+
+ncp52_config :: ncp52_config-data ncp52_config-inc ncp52_config-rom ncp52_config-tools
+
+$(call popout,MAKEFILE_STACK)
+}}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/cmaker_version.txt	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,24 @@
+*********************************************************************************************************************************
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Version 1.0.1 
+* - Changed all source files to use Symbian foundation specific headers.
+* - Fixed a minor bug. 
+* - Updated the mingw_make.exe to same version as in iMaker (3.81-3). Added gpl.licence.txt
+* - Added cmaker_version.txt and cmaker_readme.txt
+*
+* Version 1.0.0 
+* - First version of cmaker
+
+cmaker - The config maker, version 1.0.1, 04-Feb-2009, svn@844.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/group/bld.inf	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* cmaker exports to epoc32/tools.
+*/
+
+
+PRJ_EXPORTS                         
+
+..\src\cmaker.cmd         \epoc32\tools\ //                         
+..\src\env.mk             \epoc32\tools\cmaker\ //                     
+..\src\functions.mk       \epoc32\tools\cmaker\ //                    
+..\src\settings.mk        \epoc32\tools\cmaker\ //                    
+..\src\tools.mk           \epoc32\tools\cmaker\ //                    
+..\src\utils.mk           \epoc32\tools\cmaker\ //
+     
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/makefile	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,70 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# cmaker makefile installation.
+#
+
+# Set perl executable if it is not set by the environment. 
+PERL ?= perl
+INSTALLDIR    = $(subst \,/,$(EPOCROOT))epoc32/tools
+INSTALLDIRSRC = $(INSTALLDIR)/cmaker
+INSTALLDIRBIN = $(INSTALLDIR)/rom
+SRCFILES = $(wildcard src/*.mk)
+TRGFILES = $(patsubst src/%.mk,$(INSTALLDIRSRC)/%.mk,$(SRCFILES))
+
+.PHONY: install clean
+
+install: $(TRGFILES) $(INSTALLDIRBIN)/mingw_make.exe $(INSTALLDIR)/cmaker.cmd ; @
+
+src/cmaker.cmd: $(INSTALLDIR)
+$(INSTALLDIR)/cmaker.cmd : src/cmaker.cmd
+	$(call copy,$<,$@)
+
+src/*.mk: $(INSTALLDIRSRC)
+$(INSTALLDIRSRC)/%.mk: src/%.mk
+	$(call copy,$<,$@)
+ 
+bin/mingw_make.exe :$(INSTALLDIRBIN)
+$(INSTALLDIRBIN)/mingw_make.exe: bin/mingw_make.exe
+	$(call copy,$<,$@)
+
+$(INSTALLDIR):
+	$(call makedir,$@)
+
+$(INSTALLDIRSRC):
+	$(call makedir,$@)
+
+$(INSTALLDIRBIN):
+	$(call makedir,$@)
+
+clean:
+	$(call remove,$(INSTALLDIRSRC))
+	$(call remove,$(INSTALLDIR)/cmaker.cmd)
+
+############################################################################################	
+# Create some perl specific operations to make the install operation platform independent
+define makedir
+  $(PERL) -e 'use File::Path; mkpath(q($1))'
+
+endef
+
+define copy
+  $(PERL) -e 'use File::Copy; copy(q($1),q($2))'
+
+endef
+
+define remove
+  $(PERL) -e 'use File::Remove qw(remove); remove \1,q($1)'
+
+endef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/cmaker.cmd	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+@echo off
+REM 
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+REM All rights reserved.
+REM This component and the accompanying materials are made available
+REM under the terms of the License "Symbian Foundation License v1.0"
+REM which accompanies this distribution, and is available
+REM at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+REM 
+REM Initial Contributors:
+REM Nokia Corporation - initial contribution.
+REM 
+REM Contributors:
+REM 
+REM Description:
+REM cmaker windows batch file.
+REM 
+
+
+setlocal
+set MAKEFILES=/epoc32/tools/cmaker/tools.mk
+if "%PERL%"==""             set PERL=perl
+if "%CMAKER_DIR%"==""       set CMAKER_DIR=%~dp0
+set CMAKER_MAKECMD=/epoc32/tools/rom/mingw_make.exe -R --no-print-directory -I /epoc32/tools/cmaker %*
+
+REM The script call itself with perl
+%PERL% -x -S %~f0
+endlocal
+exit /b %errorlevel%
+
+#!perl
+my $begin=time();
+system($ENV{CMAKER_MAKECMD});
+my $end=time();
+print "Duration: ".($end-$begin)." seconds\n";
+
+__END__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/env.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# environent specific variable settings
+#
+
+CPP         ?= cpp
+PERL        ?= perl
+BPLATWIN    := $(call iif,$(findstring cmd.exe,$(call lcase,$(SHELL))),1,$(findstring mingw,$(call lcase,$(MAKE))))
+EXCLCYGWIN  := $(BPLATWIN)
+NULL        := $(call iif,$(BPLATWIN),nul,/dev/null)
+DONOTHING   := @$(call iif,$(BPLATWIN),rem,\#)
+
+# Set shell; cmd.exe for Windows, otherwise use /bin/sh
+SHELL       := $(call iif,$(BPLATWIN),cmd.exe,/bin/sh)
+COPY	    := copy
+ERASE	    := del
+PRINT	    := @echo
+SHELL       := cmd.exe
+RMDIR       := rmdir /S /Q
+
+# returns the filename specific to this environment 
+# Replaces / \\ if needed :)
+define getFile
+  $(subst /,\\,$1)
+endef
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/functions.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Actions that can be executed
+#
+
+# default action 
+ACTION=export
+
+ifeq ($(ACTION),what)
+  PHONY_ACT = 1
+  FUNCTION  = $(PRINT) "$@" 
+endif
+ifeq ($(ACTION),what_deps)
+  PHONY_ACT = 1
+  FUNCTION  = $(PRINT) "$<" "$@" 
+endif
+ifeq ($(ACTION),export)
+  FUNCTION = $(COPY) "$<" "$@"
+endif
+ifeq ($(ACTION),clean)
+  PHONY_ACT = 1
+  FUNCTION = $(ERASE) "$@"
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/include_template.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,66 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# The file defines a include template for cmaker project makefiles.
+# Includes automatically 
+#   - config/export.mk
+#   - anysubdir/makefile
+#   - ../makefile
+# However the template is built so that it will include subdir makefiles only from current 
+# level downwards and upwards. 
+# I.e. The included childs will not inlcude its parent, which would create an infinite include loop.
+#
+
+ifeq ($(DEBUG_INCLUDES),1)
+  $(warning Entering include_template.mk for $(MAKEFILE))
+endif
+
+# Each makefile is pushed to a MAKFILE_STACK so that we know in which 
+# makefile we are in. I.e. The last one is the current! 
+# The current makefile is of course popped out in the end of the makefile
+$(call push,MAKEFILE_STACK,$(MAKEFILE))
+
+# Define the childs to be included if we are at the top most makefile
+# I.e. the first makefile
+ifeq ($(call length,MAKEFILE_STACK),1)
+  INCLUDE_CHILD = 1
+  INCLUDE_PARENT = 0
+endif
+
+include $(wildcard $(MAKEFILEDIR)config/export.mk)
+
+# include the child configuration file 
+ifeq ($(INCLUDE_CHILD),1)
+  ifeq ($(DEBUG_INCLUDES),1)
+    $(warning including childs $(MAKEFILEDIR))
+  endif  
+  include $(wildcard $(MAKEFILEDIR)*/makefile)
+endif
+
+# Define the parents to be included if we are at the top most makefile
+# I.e. the first makefile
+ifeq ($(call length,MAKEFILE_STACK),1)
+  INCLUDE_CHILD = 0
+  INCLUDE_PARENT = 1
+endif
+
+# include the parent configuration file 
+ifeq ($(INCLUDE_PARENT),1)
+  ifeq ($(DEBUG_INCLUDES),1)
+    $(warning including parents $(MAKEFILEDIR))
+  endif  
+  include $(wildcard $(MAKEFILEDIR)../makefile)
+endif
+
+$(call popout,MAKEFILE_STACK)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/settings.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# 
+#
+
+TIMESTAMP   ?= $(shell $(PERL) -e 'use POSIX "strftime"; print(strftime("%Y%m%d%H%M%S", localtime))')
+
+E32ROM      := $(EPOC32)/rom
+E32ROMCFG   := $(E32ROM)/config
+E32ROMBLD   := $(EPOC32)/rombuild
+VERBOSE     := 1
+
+SPP_TOOLS   = \TOOLS
+CENREP_TOOLS=$(SPP_TOOLS)\cenrep_scripts
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/tools.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,36 @@
+ifneq ($(TOOLS_INCLUDE),done)
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Actions that can be executed
+#
+TOOLS_INCLUDE=done
+
+test_makefiles:
+	$(foreach makefile,$(MAKEFILE_LIST),\
+		$(call println,$(makefile)))
+
+
+
+EPOC32      := $(subst \,/,$(EPOCROOT))epoc32
+E32TOOLS    := $(EPOC32)/tools
+E32MAKEFILES:= $(EPOC32)/tools/cmaker
+
+
+include $(E32MAKEFILES)/utils.mk
+include $(E32MAKEFILES)/env.mk
+include $(E32MAKEFILES)/settings.mk
+include $(E32MAKEFILES)/functions.mk
+
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/cmaker/src/utils.mk	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,199 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# cmaker utils, stack functions (push,pop,popout,peek,length).
+# print function to echo data on several lines.
+#
+
+ichar := 
+pchar := 
+
+comma := ,
+space :=
+space +=
+squot := '\''
+
+[A-Z] := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z #
+[a-z] := a b c d e f g h i j k l m n o p q r s t u v w x y z #
+[0-9] := 0 1 2 3 4 5 6 7 8 9 #
+
+charset := $([A-Z])$([a-z])$([0-9])! " \# $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
+
+# substr(startIndex, endIndex,text)
+substr = \
+  $(strip $(eval __i_str := $(subst $(space),$(ichar),$3)) \
+  $(foreach c,$(charset) $(ichar),$(eval __i_str := $(subst $c,$c ,$(__i_str)))) \
+  )$(subst $(ichar), ,$(subst $(space),,$(wordlist $1,$2,$(__i_str))))
+
+
+tr = \
+  $(strip $(eval __i_tr := $3)    \
+  $(foreach c,                    \
+    $(join $(addsuffix :,$1),$2), \
+    $(eval __i_tr := $(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$(__i_tr))))$(__i_tr))
+
+lcase       = $(call tr,$([A-Z]),$([a-z]),$1)
+ucase       = $(call tr,$([a-z]),$([A-Z]),$1)
+
+
+# Remove Cygwin from PATH if EXCLCYGWIN is true
+PATH        := $(shell $(PERL) -e 'print(q—$(EXCLCYGWIN)— ? join(";",grep(!/\\cygwin\\/i,split(/;+/,$$ENV{PATH}))) : $$ENV{PATH})')
+
+# remove_trail(dir)
+# remove the trailing backslash
+define remove_trail
+$(patsubst %/,%,$(patsubst %\,%,$1))
+endef
+
+MAKEFILEDIR = $(dir $(call peek,MAKEFILE_STACK))
+
+#Global variable for all export directories
+EXPORTDIRECTORIES ?= 
+
+#println(line)
+# function to print one line of data inside other defines
+# param line the data line
+define println
+	@echo $1
+
+endef
+
+define pop2
+  $(word 1,$(1)) $(word 2,$(1))
+endef
+
+# tail(n, list)
+#
+# param n is the starting word
+# param list is the input data list
+# returns the tail from list starting from word n
+define tail
+  $(wordlist $1,$(words $2),$2)
+endef
+
+# Adds the directory to the global export directories 
+# list if it is not already existing in it
+define add_export_dir
+  $(if $(filter $1,$(EXPORTDIRECTORIES)),,\
+    $(eval EXPORTDIRECTORIES+=$1)\
+    $(eval $1 : ; @$(PERL) -e 'use File::Path; mkpath(q($$@))'))
+endef
+
+# addeval(list)
+#
+# Adds the items from the list as dependencies 
+# List format from to from to ..
+# param list is the input data list
+define addeval
+  $(if $(strip $1),\
+    $(if $(PHONY_ACT),$(eval .PHONY : $(word 2,$1)))\
+    $(eval $(word 1,$1) : $(call getdir, $(dir $(word 2,$1))))\
+    $(eval $(word 2,$1) : $(word 1,$1) ; $$(FUNCTION))\
+    $(eval $2 :: $(word 2,$1))\
+    $(call add_export_dir,$(call getdir,$(dir $(word 2,$1))))\
+    $(call addeval, $(call tail,3,$1),$2))
+endef
+
+# getdir(dir)
+# returns a directory entry in lower case without trailing slash
+define getdir
+$(call remove_trail,$(strip $(call lcase,$1)))
+endef
+#$(call remove_trail,
+
+# expand a single source target definition
+# param source(s), the source file or files (wildcard)
+# param target target file or folder
+# E.g. 1. src/*.h /epoc32/config/
+#      2. src/aa.h /epoc32/config/bb.h
+define expand_wilds
+  $(if $(notdir $2),$(if $(filter-out 0 1,$(words $(wildcard $1))),$(error a file target must have a single source file, in $2,$1)) )\
+  $(if $(notdir $2),$(eval TARGET=$$2),$(eval TARGET=$$2$$(notdir $$(source))))\
+  $(foreach source,$(wildcard $1),$(source)  $(TARGET)) 
+endef
+
+# expand_all_wilds(inputlist, concatlist)
+#
+# expands all wildcard entries from the input list and appends them 
+# to the concatlist
+# param intputlist is the input data list (from/*.* to from to ..)
+# param concatlist is the list where the expanded data is appended
+# returns a full concatenated list
+define expand_all_wilds
+  $(if $(strip $1),\
+    $(call expand_all_wilds,\
+      $(call tail,3,$1),\
+      $2 $(call expand_wilds,$(word 1,$1),$(word 2,$1))\
+    ),$2\
+  )
+endef
+
+# addfiles(inputlist, dependant_target)
+#
+# adds the export targets and dependancies 
+# param intputlist is the input data list (from/*.* to from to ..)
+# param dependant_target is the target which will have a dependency to these dynamic targets
+define addfiles
+  $(call addeval,$(subst /,\,$(call expand_all_wilds,$1,)),$2)
+endef
+
+
+# push(list, value)
+#
+# adds the value to the given list
+# param intput list where the data is appended
+# param value that is added
+define push
+  $(if $(findstring $2,$($1)),$(error ERROR: Item $2 already exists in the list!!!))\
+  $(eval $1 += $2)
+endef
+
+# pop(list)
+#
+# pops out the value from the given list
+# param list where the data is popped out
+# returns the value from the list
+define pop
+$(strip $(eval value=$(lastword $($1)))\
+$(eval $1:=$(filter-out $(value),$($1)))\
+$(value))
+endef
+
+# popout(list)
+#
+# pops out the last item from the given list
+# param list where the data is popped out
+# returns nothing
+define popout
+$(eval value=$(lastword $($1)))\
+$(eval $1:=$(filter-out $(value),$($1)))
+endef
+
+# peek(list)
+#
+# peek the last element from the list without popping it out
+# param list which is peaked
+# returns the value of the last element of the list
+define peek
+$(lastword $($1))
+endef
+
+# length(list)
+#
+# returns the lenght of the stack
+# param list which is length is queried
+# returns the lenght as integer value 
+define length
+$(words $($1))
+endef